diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 89b96bf922bfaa7b65f6fb0eb026fc0d3ac02b31..4f264044df84c4d5a08998535a43b6988cc2fbda 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -1042,6 +1042,19 @@ include_directories(${NFAPI_USER_DIR})
 
 # Layer 1
 #############################
+set(PHY_TURBOSRC
+  ${OPENAIR1_DIR}/PHY/CODING/3gpplte_sse.c
+  ${OPENAIR1_DIR}/PHY/CODING/3gpplte.c
+  ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
+  ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
+  ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
+  ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder.c
+)
+set(PHY_TURBOIF
+  ${OPENAIR1_DIR}/PHY/CODING/coding_load.c
+)
+
+add_library(coding MODULE ${PHY_TURBOSRC} )
 set(PHY_SRC
   # depend on code generation from asn1c
   ${RRC_FULL_DIR}/asn1_constants.h
@@ -1109,11 +1122,8 @@ set(PHY_SRC
   ${OPENAIR1_DIR}/PHY/CODING/lte_segmentation.c
   ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte.c
   ${OPENAIR1_DIR}/PHY/CODING/ccoding_byte_lte.c
-  ${OPENAIR1_DIR}/PHY/CODING/3gpplte_sse.c
   ${OPENAIR1_DIR}/PHY/CODING/crc_byte.c
-  ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
-  ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
-  ${OPENAIR1_DIR}/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
+  ${PHY_TURBOIF}
   ${OPENAIR1_DIR}/PHY/CODING/lte_rate_matching.c
   ${OPENAIR1_DIR}/PHY/CODING/viterbi.c
   ${OPENAIR1_DIR}/PHY/CODING/viterbi_lte.c
@@ -1373,6 +1383,7 @@ set (MAC_SRC_UE
 set (ENB_APP_SRC
   ${OPENAIR2_DIR}/ENB_APP/enb_app.c
   ${OPENAIR2_DIR}/ENB_APP/enb_config.c
+  ${OPENAIR2_DIR}/ENB_APP/RRC_config_tools.c
   )
 
 add_library(L2
@@ -2398,3 +2409,8 @@ ADD_CUSTOM_TARGET(oarf
    DEPENDS ${OCT_FILES}
 )
 
+include (${OPENAIR_DIR}/common/utils/telnetsrv/telnetsrv_CMakeLists.txt)
+
+
+
+
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 7e0c0ca169c5708b69527fd6db9c0e559032653b..b19e3208a5883ec2f36725d5e1cb37a53d91b825 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -544,6 +544,9 @@ function main() {
     compilations \
 	  $lte_build_dir $config_libconfig_shlib \
 	  lib$config_libconfig_shlib.so $dbin/lib$config_libconfig_shlib.so
+    compilations \
+          $lte_build_dir coding \
+          libcoding.so $dbin/libcoding.so
 	  
     if [ "$NOS1" = "1" ] ; then
 	compilations \
@@ -766,17 +769,10 @@ function main() {
   # Telnet server compilation
   #####################
   if [ "$BUILD_TELNETSRV" = "1" ] ; then
-
-     telnetsrv_build_dir=telnetsrv
-     mkdir -p $DIR/$telnetsrv_build_dir/build
-     cd $DIR/$telnetsrv_build_dir/build   
-     echo_info "Compiling telnet server library ..."
-    
-     [ "$CLEAN" = "1" ] && rm -rf $DIR/$telnetsrv_build_dir 
-     cmake_file=$OPENAIR_DIR/common/utils/$telnetsrv_build_dir/CMakeLists.txt   
-     cd $DIR/$telnetsrv_build_dir/build
-     eval  "$CMAKE_CMD $OPENAIR_DIR/common/utils/$telnetsrv_build_dir/"
-     make
+              build_dir=$lte_build_dir
+              compilations \
+                  $build_dir telnetsrv \
+                  libtelnetsrv.so $dbin/libtelnetsrv.so
 
   fi  
   # build RF device and transport protocol libraries
diff --git a/common/config/config_load_configmodule.c b/common/config/config_load_configmodule.c
index ff66d22a1c847bd783ccd43211709b1e5bf741c1..c31a2da4d7e68fcb9ed01f64c510f21eeb04ba69 100644
--- a/common/config/config_load_configmodule.c
+++ b/common/config/config_load_configmodule.c
@@ -197,25 +197,40 @@ int i;
    return cfgptr;
 }
 
-void end_configmodule()
+
+/* free memory allocated when reading parameters */
+/* config module could be initialized again after this call */
+void end_configmodule(void)
 { 
   if (cfgptr != NULL) {
       if (cfgptr->end != NULL) {
          printf ("[CONFIG] calling config module end function...\n"); 
          cfgptr->end();
       }
-      if( cfgptr->cfgmode != NULL) free(cfgptr->cfgmode);
-      printf ("[CONFIG] free %u config parameter pointers\n",cfgptr->num_cfgP);  
-      for (int i=0; i<cfgptr->num_cfgP; i++) {
-          if ( cfgptr->cfgP[i] != NULL) free(cfgptr->cfgP[i]);
-          }
+
       printf ("[CONFIG] free %u config value pointers\n",cfgptr->numptrs);  
       for(int i=0; i<cfgptr->numptrs ; i++) {
           if (cfgptr->ptrs[i] != NULL) {
              free(cfgptr->ptrs[i]);
+             cfgptr->ptrs[i]=NULL;
           }
-          cfgptr->ptrs[i]=NULL;
       }
+      cfgptr->numptrs=0;
+  }
+}
+
+/* free all memory used by config module */
+/* should be called only at program exit */
+void free_configmodule(void)
+{ 
+  if (cfgptr != NULL) {
+      end_configmodule();
+      if( cfgptr->cfgmode != NULL) free(cfgptr->cfgmode);
+      printf ("[CONFIG] free %u config parameter pointers\n",cfgptr->num_cfgP);  
+      for (int i=0; i<cfgptr->num_cfgP; i++) {
+          if ( cfgptr->cfgP[i] != NULL) free(cfgptr->cfgP[i]);
+          }
+
 
   free(cfgptr);
   cfgptr=NULL;
diff --git a/common/config/config_load_configmodule.h b/common/config/config_load_configmodule.h
index 76f074cd6c38cf805938f28567237368b2d8e253..724cd1dbf528f5e38e865d05d94d1b050a006e84 100644
--- a/common/config/config_load_configmodule.h
+++ b/common/config/config_load_configmodule.h
@@ -3,7 +3,7 @@
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
  * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.0  (the "License"); you may not use this file
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
  * except in compliance with the License.
  * You may obtain a copy of the License at
  *
@@ -40,15 +40,18 @@
 #define CONFIG_MAX_OOPT_PARAMS    10     // maximum number of parameters in the -O option (-O <cfgmode>:P1:P2...
 #define CONFIG_MAX_ALLOCATEDPTRS  1024   // maximum number of parameters that can be dynamicaly allocated in the config module
 
-/* rtflags bit position definitions */
-#define CONFIG_PRINTPARAMS    1        // print parameters values while processing
-#define CONFIG_DEBUGPTR       2        // print memory allocation/free debug messages
-#define CONFIG_DEBUGCMDLINE   4        // print command line processing messages
-#define CONFIG_HELP           8        // print help message
-#define CONFIG_ABORT          16       // config failed,abort execution 
-#define CONFIG_NOOOPT         32       // no -O option found when parsing command line 
-
+/* default values for configuration module parameters */
+#define DEFAULT_CFGMODE           "libconfig"  // use libconfig file
+#define DEFAULT_CFGFILENAME       "oai.conf"   // default config file
 
+/* rtflags bit position definitions */
+#define CONFIG_PRINTPARAMS    1               // print parameters values while processing
+#define CONFIG_DEBUGPTR       1<<1            // print memory allocation/free debug messages
+#define CONFIG_DEBUGCMDLINE   1<<2            // print command line processing messages
+#define CONFIG_NOABORTONCHKF  1<<3            // disable abort execution when parameter checking function fails
+#define CONFIG_HELP           1<<20           // print help message
+#define CONFIG_ABORT          1<<21           // config failed,abort execution 
+#define CONFIG_NOOOPT         1<<22           // no -O option found when parsing command line
 typedef int(*configmodule_initfunc_t)(char *cfgP[],int numP);
 typedef int(*configmodule_getfunc_t)(paramdef_t *,int numparams, char *prefix);
 typedef int(*configmodule_getlistfunc_t)(paramlist_def_t *, paramdef_t *,int numparams, char *prefix);
diff --git a/common/config/config_paramdesc.h b/common/config/config_paramdesc.h
index a7de5e3098ffabc47226eb8c04ab0381b3593af8..6f153535fb56c2cf0ef5c8cb7599899195604abc 100644
--- a/common/config/config_paramdesc.h
+++ b/common/config/config_paramdesc.h
@@ -3,7 +3,7 @@
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
  * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.0  (the "License"); you may not use this file
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
  * except in compliance with the License.
  * You may obtain a copy of the License at
  *
@@ -55,16 +55,61 @@
 #define PARAMFLAG_PARAMSET                (1 << 16)        // parameter has been explicitely set in get functions
 #define PARAMFLAG_PARAMSETDEF             (1 << 17)        // parameter has been set to default value in get functions
 
+
+/* checkedparam_t is possibly used in paramdef_t for specific parameter value validation */
+#define CONFIG_MAX_NUMCHECKVAL            20
+typedef struct paramdef paramdef_t;
+typedef union checkedparam {
+        struct  { 
+               int  (*f1)(paramdef_t *param);   /* check an integer against a list of authorized values */
+               int okintval[CONFIG_MAX_NUMCHECKVAL];                        /* integer array, store possible values  */
+               int num_okintval;                                            /* number of valid values in the checkingval array */
+        } s1;
+        struct  { 
+               int  (*f1a)(paramdef_t *param);   /* check an integer against a list of authorized values and set param value */
+                                                 /* to the corresponding item in setintval array (mainly for RRC params)     */
+               int okintval[CONFIG_MAX_NUMCHECKVAL];                        /* integer array, store possible values in config file */
+               int setintval[CONFIG_MAX_NUMCHECKVAL];                        /* integer array, values set in the paramdef structure */
+               int num_okintval;                                            /* number of valid values in the checkingval array */
+        } s1a;
+        struct { 
+               int  (*f2)(paramdef_t *param);  /* check an integer against an authorized range, defined by its min and max value */
+               int okintrange[CONFIG_MAX_NUMCHECKVAL];  /* integer array, store  min and max values  */
+   
+        } s2;
+        struct {
+               int  (*f3)(paramdef_t *param); /* check a string against a list of authorized values */
+               char *okstrval[CONFIG_MAX_NUMCHECKVAL];                      /* string array, store possible values  */
+               int  num_okstrval;                                           /* number of valid values in the checkingval array */
+        } s3;
+        struct {
+               int  (*f3a)(paramdef_t *param); /* check a string against a list of authorized values and set param value */
+                                                 /* to the corresponding item in setintval array (mainly for RRC params) */
+               char *okstrval[CONFIG_MAX_NUMCHECKVAL];                      /* string array, store possible values  */
+               int  setintval[CONFIG_MAX_NUMCHECKVAL];                      /* integer array, values set in the paramdef structure */
+               int  num_okstrval;                                           /* number of valid values in the checkingval array */
+        } s3a;
+        struct {
+               int  (*f4)(paramdef_t *param); /* generic check function, no arguments but the param description */
+               
+        } s4;
+        struct { 
+                void (*checkfunc)(void) ; 
+        } s5;
+} checkedparam_t;
+
+/* paramdef is used to describe a parameter, array of paramdef_t strustures is used as the main parameter in */
+/* config apis used to retrieve parameters values  */
 typedef struct paramdef
 {
-   char optname[MAX_OPTNAME_SIZE];        /* parameter name, can be used as long command line option */
-   char *helpstr;                         /* help string */
-   unsigned int paramflags;               /* value is a "ored" combination of above PARAMFLAG_XXXX values */
-   union {                                /* pointer to the parameter value, completed by the config module */
+   char         optname[MAX_OPTNAME_SIZE]; /* parameter name, can be used as long command line option */
+   char         *helpstr;                  /* help string */
+   unsigned int paramflags;                /* value is a "ored" combination of above PARAMFLAG_XXXX values */
+   union {                                 /* pointer to the parameter value, completed by the config module */
      char **strptr;
      char **strlistptr;
      uint8_t   *u8ptr;
-     char      *i8ptr;     
+     int8_t    *i8ptr;     
      uint16_t  *u16ptr;
      int16_t   *i16ptr;
      uint32_t  *uptr;
@@ -72,18 +117,21 @@ typedef struct paramdef
      uint64_t  *u64ptr;
      int64_t   *i64ptr;
      double    *dblptr;
+     void      *voidptr;
      } ;
    union {                                /* default parameter value, to be used when PARAMFLAG_MANDATORY is not specified */
-     char *defstrval;
-     char **defstrlistval;
-     uint32_t defuintval;
-     int defintval;
-     uint64_t defint64val;
-     int *defintarrayval;
-     double defdblval;
+     char      *defstrval;
+     char      **defstrlistval;
+     uint32_t  defuintval;
+     int       defintval;
+     uint64_t  defint64val;
+     int       *defintarrayval;
+     double    defdblval;
      } ;   
    char type;                              /* parameter value type, as listed below as TYPE_XXXX macro */
    int numelt;                             /* number of elements in a list or array parameters or max size of string value */ 
+   checkedparam_t   *chkPptr;              /* possible pointer to the structure containing the info used to check parameter values */
+   int *processedvalue;                    /* used to store integer values computed from string original value */
 } paramdef_t;
 
 #define TYPE_INT        TYPE_INT32
diff --git a/common/config/config_userapi.c b/common/config/config_userapi.c
index acee5646cd7aae319f6fccef056a309e306d8fde..c1acc84384a0d91045c8b2e95f66ac98bd16ca68 100644
--- a/common/config/config_userapi.c
+++ b/common/config/config_userapi.c
@@ -3,7 +3,7 @@
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
  * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.0  (the "License"); you may not use this file
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
  * except in compliance with the License.
  * You may obtain a copy of the License at
  *
@@ -36,6 +36,7 @@
 #include <errno.h>
 #include <dlfcn.h>
 #include "config_userapi.h"
+extern void exit_fun(const char* s);  // lte-softmodem clean exit function
 
 
 configmodule_interface_t *config_get_if(void)
@@ -59,7 +60,7 @@ char * config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length)
         *ptr = malloc(length);
         if ( *ptr != NULL) {
              memset(*ptr,0,length);
-             if ( (cfgoptions->paramflags & PARAMFLAG_NOFREE) != 0) {
+             if ( (cfgoptions->paramflags & PARAMFLAG_NOFREE) == 0) {
                  config_get_if()->ptrs[config_get_if()->numptrs] = *ptr;
                  config_get_if()->numptrs++;
              }
@@ -111,7 +112,29 @@ int tmpval=val;
 	break;
   }
 }
+void config_assign_processedint(paramdef_t *cfgoption, int val) {
+        cfgoption->processedvalue = malloc(sizeof(int));
+        if (  cfgoption->processedvalue != NULL) {
+             *(cfgoption->processedvalue) = val;
+        } else {
+             fprintf (stderr,"[CONFIG] %s %d malloc error\n",__FILE__, __LINE__);
+             exit(-1);
+        }            
+}
 
+int config_get_processedint(paramdef_t *cfgoption) {
+   int ret;
+        if (  cfgoption->processedvalue != NULL) {
+             ret=*(cfgoption->processedvalue);
+             free( cfgoption->processedvalue);
+             cfgoption->processedvalue=NULL;
+             printf_params("[CONFIG] %s:  set from %s to %i\n",cfgoption->optname, *(cfgoption->strptr), ret);
+        } else {
+             fprintf (stderr,"[CONFIG] %s %d %s has no processed integer availablle\n",__FILE__, __LINE__, cfgoption->optname);
+             ret=0;
+        }
+return ret;            
+}
 void config_printhelp(paramdef_t *params,int numparams)
 {
    for (int i=0 ; i<numparams ; i++) {
@@ -124,11 +147,31 @@ void config_printhelp(paramdef_t *params,int numparams)
    }
 }
 
+int config_execcheck(paramdef_t *params,int numparams, char *prefix)
+{
+int st=0;
+
+   for (int i=0 ; i<numparams ; i++) {
+       if ( params[i].chkPptr == NULL) {
+           continue;
+       }
+       if (params[i].chkPptr->s4.f4 != NULL) {
+         st += params[i].chkPptr->s4.f4(&(params[i]));
+       }
+   }
+   if (st != 0) {
+      fprintf(stderr,"[CONFIG] config_execcheck: %i parameters with wrong value\n", -st); 
+      if ( CONFIG_ISFLAGSET(CONFIG_NOABORTONCHKF) == 0) {
+          exit_fun("exit because configuration failed\n");
+      }
+   }
+return st;
+}
+
 int config_get(paramdef_t *params,int numparams, char *prefix)
 {
 int ret= -1;
 
-printf("numparams:%d prefix:%s\n", numparams, prefix);
 if (CONFIG_ISFLAGSET(CONFIG_ABORT)) {
     fprintf(stderr,"[CONFIG] config_get skipped, config module not properly initialized\n");
     return ret;
@@ -138,6 +181,7 @@ configmodule_interface_t *cfgif = config_get_if();
       ret = config_get_if()->get(params, numparams,prefix);
       if (ret >= 0) {
          config_process_cmdline(params,numparams,prefix);
+         config_execcheck(params,numparams,prefix);
      }
   return ret;
   }
@@ -153,6 +197,89 @@ int config_isparamset(paramdef_t *params,int paramidx)
   }
 }
 
-int config_getparamval_fromparamdefidx(paramdef_t *cfgoptions,int paramidx) {
+void print_intvalueerror(paramdef_t *param, char *fname, int *okval, int numokval) {
+    fprintf(stderr,"[CONFIG] %s: %s: %i invalid value, authorized values:\n       ",
+           fname,param->optname, (int)*(param->uptr));
+    for ( int i=0; i<numokval ; i++) {
+         fprintf(stderr, " %i",okval[i]);
+         }
+    fprintf(stderr, " \n");
+}
+ 
+int config_check_intval(paramdef_t *param)
+{
+    if ( param == NULL ){
+       fprintf(stderr,"[CONFIG] config_check_intval: NULL param argument\n");
+       return -1;
+    }
+    for ( int i=0; i<param->chkPptr->s1.num_okintval ; i++) {
+         if( *(param->uptr) == param->chkPptr->s1.okintval[i] ) {
+             return 0;
+         }
+    }
+    print_intvalueerror(param,"config_check_intval", param->chkPptr->s1.okintval,param->chkPptr->s1.num_okintval);
+    return -1;
+}
+
+int config_check_modify_integer(paramdef_t *param)
+{
+   
+    for (int i=0; i < param->chkPptr->s1a.num_okintval ; i++) {
+    	if (*(param->uptr) == param->chkPptr->s1a.okintval[i] ) {
+            printf_params("[CONFIG] %s:  read value %i, set to %i\n",param->optname,*(param->uptr),param->chkPptr->s1a.setintval [i]);
+    	    *(param->uptr) = param->chkPptr->s1a.setintval [i];
+    	    return 0; 
+    	}
+   }
+    print_intvalueerror(param,"config_check_modify_integer", param->chkPptr->s1a.okintval,param->chkPptr->s1a.num_okintval);
+    return -1;
+}
+
+int config_check_intrange(paramdef_t *param)
+{
+   if( *(param->iptr) >= param->chkPptr->s2.okintrange[0]  && *(param->iptr) <= param->chkPptr->s2.okintrange[1]  ) {
+       return 0;
+   }
+   fprintf(stderr,"[CONFIG] config_check_intrange: %s: %i invalid value, authorized range: %i %i\n",
+           param->optname, (int)*(param->uptr), param->chkPptr->s2.okintrange[0], param->chkPptr->s2.okintrange[1]);
+   return -1;
+}
+
+void print_strvalueerror(paramdef_t *param, char *fname, char **okval, int numokval) {
+    fprintf(stderr,"[CONFIG] %s: %s: %s invalid value, authorized values:\n       ",
+           fname,param->optname, *(param->strptr));
+    for ( int i=0; i<numokval ; i++) {
+         fprintf(stderr, " %s",okval[i]);
+         }
+    fprintf(stderr, " \n");
+}
+ 
+int config_check_strval(paramdef_t *param)
+{
+    if ( param == NULL ){
+       fprintf(stderr,"[CONFIG] config_check_strval: NULL param argument\n");
+       return -1;
+    }
+    for ( int i=0; i<param->chkPptr->s3.num_okstrval ; i++) {
+         if( strcasecmp(*(param->strptr),param->chkPptr->s3.okstrval[i] ) == 0) {
+             return 0;
+         }
+    }
+    print_strvalueerror(param, "config_check_strval", param->chkPptr->s3.okstrval, param->chkPptr->s3.num_okstrval);
+    return -1;
+}
+
+int config_checkstr_assign_integer(paramdef_t *param)
+{
+
+
+    for (int i=0; i < param->chkPptr->s3a.num_okstrval ; i++) {
+    	if (strcasecmp(*(param->strptr),param->chkPptr->s3a.okstrval[i]  ) == 0) {
+            config_assign_processedint(param, param->chkPptr->s3a.setintval[i]);
+    	    return 0; 
+    	}
+   }
+   print_strvalueerror(param, "config_check_strval", param->chkPptr->s3a.okstrval, param->chkPptr->s3a.num_okstrval);
+
     return -1;
 }
diff --git a/common/config/config_userapi.h b/common/config/config_userapi.h
index 5bbc20a950bfb2150a6bfb0945821a08008dab41..923a690f51986fdd0772e10480440e6cb68892fe 100644
--- a/common/config/config_userapi.h
+++ b/common/config/config_userapi.h
@@ -3,7 +3,7 @@
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
  * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.0  (the "License"); you may not use this file
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
  * except in compliance with the License.
  * You may obtain a copy of the License at
  *
@@ -38,24 +38,34 @@
 extern "C"
 {
 #endif
-#define DEFAULT_CFGFILENAME "oaisoftmodem.conf"
-#define DEFAULT_CFGMODE     "libconfig"
-
 #define CONFIG_GETSOURCE    ( (config_get_if()==NULL) ? NULL : config_get_if()->cfgmode       )
 #define CONFIG_GETNUMP      ( (config_get_if()==NULL) ? 0    : config_get_if()->num_cfgP      )
 #define CONFIG_GETP(P)      ( (config_get_if()==NULL) ? NULL : config_get_if()->cfgP[P]       )
 #define CONFIG_ISFLAGSET(P) ( (config_get_if()==NULL) ? 0    : !!(config_get_if()->rtflags & P))
-
+#define CONFIG_ISPARAMFLAGSET(P,F) ( !!(P.paramflags & F))
+/* utility functions, to be used by configuration module and/or configuration libraries */
 extern configmodule_interface_t *config_get_if(void);
 extern char * config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length) ;
 extern void config_printhelp(paramdef_t *,int numparams);
 extern int config_process_cmdline(paramdef_t *params,int numparams, char *prefix);
-extern int config_get(paramdef_t *params,int numparams, char *prefix);
-extern int config_isparamset(paramdef_t *params,int paramidx);
+extern void config_assign_processedint(paramdef_t *cfgoption, int val);
 extern void config_assign_int(paramdef_t *cfgoptions, char *fullname, int val);
-extern int config_process_cmdline(paramdef_t *cfgoptions,int numoptions, char *prefix);
-extern int config_getparamval_fromparamdefidx(paramdef_t *cfgoptions,int paramidx);
+
+/* apis to get parameters, to be used by oai modules, at configuration time */
+extern int config_get(paramdef_t *params,int numparams, char *prefix);
 #define config_getlist config_get_if()->getlist
+
+/* apis to retrieve parameters info after calling get or getlist functions */
+extern int config_isparamset(paramdef_t *params,int paramidx);
+extern int config_get_processedint(paramdef_t *cfgoption);
+
+/* functions to be used in parameters definition, to check parameters values */
+extern int config_check_intval(paramdef_t *param);
+extern int config_check_modify_integer(paramdef_t *param);
+extern int config_check_intrange(paramdef_t *param);
+extern int config_check_strval(paramdef_t *param);
+extern int config_checkstr_assign_integer(paramdef_t *param);
+
 #define CONFIG_GETCONFFILE (config_get_if()->cfgP[0])
 
 #ifdef __cplusplus
diff --git a/common/config/libconfig/config_libconfig.c b/common/config/libconfig/config_libconfig.c
index 00f5f38b8fba60a042b42ebde78f78e6e87c886e..a73a0737f25849fba1f59d820cc229f5547a063a 100644
--- a/common/config/libconfig/config_libconfig.c
+++ b/common/config/libconfig/config_libconfig.c
@@ -1,3 +1,33 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+/*! \file common/config/libconfig/config_libconfig.c
+ * \brief: implementation libconfig configuration library
+ * \author Francois TABURET
+ * \date 2017
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
 #define _GNU_SOURCE
 #include <libconfig.h>
 
@@ -21,21 +51,23 @@ int read_strlist(paramdef_t *cfgoptions,config_setting_t *setting, char *cfgpath
 {
 const char *str;
 int st;
+int numelt;
 
-   cfgoptions->numelt=config_setting_length(setting);
-   cfgoptions->strlistptr=malloc(sizeof(char *) * (cfgoptions->numelt));
+   numelt=config_setting_length(setting);
+   config_check_valptr(cfgoptions,(char **)&(cfgoptions->strlistptr), sizeof(char *) * numelt);
    st=0;
-   for (int i=0; i< cfgoptions->numelt && cfgoptions->strlistptr != NULL; i++) {
+   for (int i=0; i< numelt ; i++) {
        str=config_setting_get_string_elem(setting,i);
        if (str==NULL) {
           printf("[LIBCONFIG] %s%i  not found in config file\n", cfgoptions->optname,i);
        } else {
-            cfgoptions->strlistptr[i]=malloc(strlen(str)+1);
+            config_check_valptr(cfgoptions,&(cfgoptions->strlistptr[i]),strlen(str)+1);
             sprintf(cfgoptions->strlistptr[i],"%s",str);
 	    st++;
             printf_params("[LIBCONFIG] %s%i: %s\n", cfgpath,i,cfgoptions->strlistptr[i]);
        }
    }
+   cfgoptions->numelt=numelt;
    return st;
 }
 
@@ -108,10 +140,10 @@ int config_libconfig_get(paramdef_t *cfgoptions,int numoptions, char *prefix )
                   config_check_valptr(&(cfgoptions[i]), (char **)(&(cfgoptions[i].strptr)), sizeof(char *));
                   config_check_valptr(&(cfgoptions[i]), cfgoptions[i].strptr, strlen(str)+1);
                   sprintf( *(cfgoptions[i].strptr) , "%s", str);
-                  printf_params("[LIBCONFIG] %s: %s\n", cfgpath,*(cfgoptions[i].strptr) );
+                  printf_params("[LIBCONFIG] %s: \"%s\"\n", cfgpath,*(cfgoptions[i].strptr) );
               } else {
                  sprintf( (char *)(cfgoptions[i].strptr) , "%s", str);
-                 printf_params("[LIBCONFIG] %s: %s\n", cfgpath,(char *)cfgoptions[i].strptr );
+                 printf_params("[LIBCONFIG] %s: \"%s\"\n", cfgpath,(char *)cfgoptions[i].strptr );
               }
            } else {
 	      if( cfgoptions[i].defstrval != NULL) {
@@ -121,10 +153,10 @@ int config_libconfig_get(paramdef_t *cfgoptions,int numoptions, char *prefix )
                      config_check_valptr(&(cfgoptions[i]), (char **)(&(cfgoptions[i].strptr)), sizeof(char *));
                      config_check_valptr(&(cfgoptions[i]), cfgoptions[i].strptr, strlen(cfgoptions[i].defstrval)+1);
                      sprintf(*(cfgoptions[i].strptr), "%s",cfgoptions[i].defstrval);
-                     printf_params("[LIBCONFIG] %s set to default value %s\n", cfgpath, *(cfgoptions[i].strptr));
+                     printf_params("[LIBCONFIG] %s set to default value \"%s\"\n", cfgpath, *(cfgoptions[i].strptr));
                  } else {
-                    sprintf((char *)(cfgoptions[i].strptr), "%s",cfgoptions[i].defstrval);
-                    printf_params("[LIBCONFIG] %s set to default value %s\n", cfgpath, (char *)cfgoptions[i].strptr);
+                    sprintf((char *)*(cfgoptions[i].strptr), "%s",cfgoptions[i].defstrval);
+                    printf_params("[LIBCONFIG] %s set to default value \"%s\"\n", cfgpath, (char *)*(cfgoptions[i].strptr));
                  }
               } else {
 	         notfound=1;
@@ -374,6 +406,7 @@ void config_libconfig_end(void )
   config_destroy(&(libconfig_privdata.cfg));
   if ( libconfig_privdata.configfile != NULL ) {
      free(libconfig_privdata.configfile);
+     libconfig_privdata.configfile=NULL;
   } 
   
 }
diff --git a/common/ran_context.h b/common/ran_context.h
index f59fd8a79c466ae96522c93e671dc8811b5e23f9..c521c4f37654f4e04944b11364e4a9e8de16926b 100644
--- a/common/ran_context.h
+++ b/common/ran_context.h
@@ -55,12 +55,18 @@ typedef struct {
   int nb_inst;
   /// Number of Component Carriers per instance in this node
   int *nb_CC;
+  /// Number of NB_IoT instances in this node
+  int nb_nb_iot_rrc_inst;
   /// Number of MACRLC instances in this node
   int nb_macrlc_inst;
+  /// Number of NB_IoT MACRLC instances in this node
+  int nb_nb_iot_macrlc_inst;
   /// Number of component carriers per instance in this node
   int *nb_mac_CC;
   /// Number of L1 instances in this node
   int nb_L1_inst;
+  /// Number of NB_IoT L1 instances in this node
+  int nb_nb_iot_L1_inst;
   /// Number of Component Carriers per instance in this node
   int *nb_L1_CC;
   /// Number of RU instances in this node
@@ -69,10 +75,16 @@ typedef struct {
   flexran_agent_info_t **flexran;
   /// eNB context variables
   struct PHY_VARS_eNB_s ***eNB;
+  /// NB_IoT L1 context variables
+  //struct PHY_VARS_eNB_NB_IoT_s **L1_NB_IoT;
   /// RRC context variables
   struct eNB_RRC_INST_s **rrc;
-  /// RRC context variables
+  /// NB_IoT RRC context variables
+  //struct eNB_RRC_INST_NB_IoT_s **nb_iot_rrc;
+  /// MAC context variables
   struct eNB_MAC_INST_s **mac;
+  /// NB_IoT MAC context variables
+  //struct eNB_MAC_INST_NB_IoT_s **nb_iot_mac;
   /// GTPu descriptor 
   gtpv1u_data_t *gtpv1u_data_g;
   /// RU descriptors. These describe what each radio unit is supposed to do and contain the necessary functions for fronthaul interfaces
diff --git a/common/utils/load_module_shlib.c b/common/utils/load_module_shlib.c
index b21f39e69dff7b05ba44b23f1d097852681dcd2f..32d3cfee9b0625f48f016403750551c463cfef73 100644
--- a/common/utils/load_module_shlib.c
+++ b/common/utils/load_module_shlib.c
@@ -34,6 +34,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
+#include <errno.h>
 #include <sys/ioctl.h>
 #include <dlfcn.h>
 #include "openair1/PHY/defs.h"
@@ -44,55 +45,114 @@
 void loader_init(void) {
   paramdef_t LoaderParams[] = LOADER_PARAMS_DESC;
 
-
+  loader_data.mainexec_buildversion =  PACKAGE_VERSION;
   int ret = config_get( LoaderParams,sizeof(LoaderParams)/sizeof(paramdef_t),LOADER_CONFIG_PREFIX);
   if (ret <0) {
-       fprintf(stderr,"[LOADER] configuration couldn't be performed");
+       fprintf(stderr,"[LOADER]  %s %d configuration couldn't be performed",__FILE__, __LINE__);
        if (loader_data.shlibpath == NULL) {
          loader_data.shlibpath=DEFAULT_PATH;
         }
        return;
-  }   
+  }
+  loader_data.shlibs = malloc(loader_data.maxshlibs * sizeof(loader_shlibdesc_t));
+  if(loader_data.shlibs == NULL) {
+     fprintf(stderr,"[LOADER]  %s %d memory allocation error %s\n",__FILE__, __LINE__,strerror(errno));
+     exit_fun("[LOADER] unrecoverable error");
+  }
+  memset(loader_data.shlibs,0,loader_data.maxshlibs * sizeof(loader_shlibdesc_t));
+}
+
+/* build the full shared lib name from the module name */
+char *loader_format_shlibpath(char *modname)
+{
+
+char *tmpstr;
+char *shlibpath   =NULL;
+char *shlibversion=NULL;
+char *cfgprefix;
+paramdef_t LoaderParams[] ={{"shlibpath", NULL, 0, strptr:&shlibpath, defstrval:NULL, TYPE_STRING, 0},
+                            {"shlibversion", NULL, 0, strptr:&shlibversion, defstrval:"", TYPE_STRING, 0}};
+
+int ret;
+
+
+
+
+/* looks for specific path for this module in the config file */
+/* specific value for a module path and version is located in a modname subsection of the loader section */
+/* shared lib name is formatted as lib<module name><module version>.so */
+  cfgprefix = malloc(sizeof(LOADER_CONFIG_PREFIX)+strlen(modname)+16);
+  if (cfgprefix == NULL) {
+      fprintf(stderr,"[LOADER] %s %d malloc error loading module %s, %s\n",__FILE__, __LINE__, modname, strerror(errno));
+      exit_fun("[LOADER] unrecoverable error");
+  } else {
+      sprintf(cfgprefix,LOADER_CONFIG_PREFIX ".%s",modname);
+      int ret = config_get( LoaderParams,sizeof(LoaderParams)/sizeof(paramdef_t),cfgprefix);
+      if (ret <0) {
+          fprintf(stderr,"[LOADER]  %s %d couldn't retrieve config from section %s\n",__FILE__, __LINE__,cfgprefix);
+      }
+   }
+/* no specific path, use loader default shared lib path */
+   if (shlibpath == NULL) {
+       shlibpath =  loader_data.shlibpath ;
+   } 
+
+/* alloc memory for full module shared lib file name */
+   tmpstr = malloc(strlen(shlibpath)+strlen(modname)+strlen(shlibversion)+16);
+   if (tmpstr == NULL) {
+      fprintf(stderr,"[LOADER] %s %d malloc error loading module %s, %s\n",__FILE__, __LINE__, modname, strerror(errno));
+      exit_fun("[LOADER] unrecoverable error");
+   }
+   if(shlibpath[0] != 0) {
+       ret=sprintf(tmpstr,"%s/",shlibpath);
+   } else {
+       ret = 0;
+   }
+
+   sprintf(tmpstr+ret,"lib%s%s.so",modname,shlibversion);
+   
+  
+   return tmpstr; 
 }
 
 int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf)
 {
    void *lib_handle;
    initfunc_t fpi;
-   char *tmpstr;
+   checkverfunc_t fpc;
+   char *shlib_path;
+   char *afname=NULL;
    int ret=0;
 
    if (loader_data.shlibpath  == NULL) {
       loader_init();
    }
-   tmpstr = malloc(strlen(loader_data.shlibpath)+strlen(modname)+16);
-   if (tmpstr == NULL) {
-      fprintf(stderr,"[LOADER] %s %d malloc error loading module %s, %s\n",__FILE__, __LINE__, modname, strerror(errno));
-      return -1; 
-   }
 
-   if(loader_data.shlibpath[0] != 0) {
-       ret=sprintf(tmpstr,"%s/",loader_data.shlibpath);
-   }
-   if(strstr(modname,".so") == NULL) {
-      sprintf(tmpstr+ret,"lib%s.so",modname);
-   } else {
-      sprintf(tmpstr+ret,"%s",modname);   
-   } 
+   shlib_path = loader_format_shlibpath(modname);
+
    ret = 0;
-   lib_handle = dlopen(tmpstr, RTLD_LAZY|RTLD_NODELETE|RTLD_GLOBAL);
+   lib_handle = dlopen(shlib_path, RTLD_LAZY|RTLD_NODELETE|RTLD_GLOBAL);
    if (!lib_handle) {
-      fprintf(stderr,"[LOADER] library %s is not loaded: %s\n", tmpstr,dlerror());
+      fprintf(stderr,"[LOADER] library %s is not loaded: %s\n", shlib_path,dlerror());
       ret = -1;
    } else {
-      printf("[LOADER] library %s uccessfully loaded loaded\n", tmpstr);
-      sprintf(tmpstr,"%s_autoinit",modname);
-      fpi = dlsym(lib_handle,tmpstr);
+      printf("[LOADER] library %s successfully loaded\n", shlib_path);
+      afname=malloc(strlen(modname)+15);
+      sprintf(afname,"%s_checkbuildver",modname);
+      fpc = dlsym(lib_handle,afname);
+      if (fpc != NULL ){
+	 int chkver_ret = fpc(loader_data.mainexec_buildversion, &(loader_data.shlibs[loader_data.numshlibs].shlib_buildversion));
+         if (chkver_ret < 0) {
+              fprintf(stderr,"[LOADER]  %s %d lib %s, version mismatch",__FILE__, __LINE__, modname);
+              exit_fun("[LOADER] unrecoverable error");
+         }
+      }
+      sprintf(afname,"%s_autoinit",modname);
+      fpi = dlsym(lib_handle,afname);
 
-      if (fpi != NULL )
-         {
+      if (fpi != NULL ) {
 	 fpi();
-	 }
+      }
 
       if (farray != NULL) {
           for (int i=0; i<numf; i++) {
@@ -103,9 +163,22 @@ int load_module_shlib(char *modname,loader_shlibfunc_t *farray, int numf)
 	      }
 	  } /* for int i... */
       }	 /* farray ! NULL */
-    } 
+    loader_data.shlibs[loader_data.numshlibs].name=strdup(modname);
+    loader_data.shlibs[loader_data.numshlibs].thisshlib_path=strdup(shlib_path); 
+    loader_data.shlibs[loader_data.numshlibs].funcarray=malloc(numf*sizeof(loader_shlibfunc_t));
+    loader_data.shlibs[loader_data.numshlibs].numfunc=0;
+    for (int i=0; i<numf;i++) {
+       if (farray[i].fptr != NULL) {
+          loader_data.shlibs[loader_data.numshlibs].funcarray[i].fname=strdup(farray[i].fname); 
+          loader_data.shlibs[loader_data.numshlibs].funcarray[i].fptr = farray[i].fptr;
+          loader_data.shlibs[loader_data.numshlibs].numfunc++;
+       }
+    }
+    (loader_data.numshlibs)++;
+    } /* lib_handle != NULL */ 
 	  	 
-   if (tmpstr != NULL) free(tmpstr);
+   if ( shlib_path!= NULL) free(shlib_path);
+   if ( afname!= NULL) free(afname);
    if (lib_handle != NULL) dlclose(lib_handle); 
    return ret;	       
 }
diff --git a/common/utils/load_module_shlib.h b/common/utils/load_module_shlib.h
index 1f991dddd2ca96c7215b4227cedf0bbb9fc8d0e4..85a8570e0a4c1782fe772682e7db824c8ea681fb 100644
--- a/common/utils/load_module_shlib.h
+++ b/common/utils/load_module_shlib.h
@@ -34,32 +34,49 @@
 
 
 typedef int(*initfunc_t)(void);
-
-typedef struct {
-   char *shlibpath;
-}loader_data_t;
+typedef int(*checkverfunc_t)(char * mainexec_version, char ** shlib_version);
 
 typedef struct {
    char *fname;
    int (*fptr)(void);
 }loader_shlibfunc_t;
+
+typedef struct {
+   char               *name;
+   char               *shlib_version;    // 
+   char               *shlib_buildversion;
+   char               *thisshlib_path;
+   uint32_t           numfunc;
+   loader_shlibfunc_t *funcarray;
+}loader_shlibdesc_t;
+
+typedef struct {
+   char               *mainexec_buildversion;
+   char               *shlibpath;
+   uint32_t           maxshlibs;
+   uint32_t           numshlibs;
+   loader_shlibdesc_t *shlibs;
+}loader_data_t;
+
 #ifdef LOAD_MODULE_SHLIB_MAIN
 #define LOADER_CONFIG_PREFIX  "loader"
 #define DEFAULT_PATH ""
 loader_data_t loader_data;
 
-/*--------------------------------------------------------------------------------------------------------------------------------------*/
-/*                                       LOADER parameters                                                                              */
-/*   optname               helpstr   paramflags    XXXptr	                           defXXXval	            type       numelt   */
-/*--------------------------------------------------------------------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------------------------------------------------------------------------*/
+/*                                       LOADER parameters                                                                                      */
+/*   optname               helpstr   paramflags           XXXptr	                           defXXXval	            type       numelt   */
+/*----------------------------------------------------------------------------------------------------------------------------------------------*/
 #define LOADER_PARAMS_DESC { \
-{"shlibpath",                NULL,    0,          strptr:(char **)&(loader_data.shlibpath), defstrval:DEFAULT_PATH, TYPE_STRING, 0} \
+{"shlibpath",                NULL,    PARAMFLAG_NOFREE, strptr:(char **)&(loader_data.shlibpath), defstrval:DEFAULT_PATH, TYPE_STRING, 0}, \
+{"maxshlibs",                NULL,    0,                uptr:&(loader_data.maxshlibs),            defintval:10,           TYPE_UINT32, 0}, \
 }
 
 /*-------------------------------------------------------------------------------------------------------------*/
-#else
+#else  /* LOAD_MODULE_SHLIB_MAIN */
 extern int load_module_shlib(char *modname, loader_shlibfunc_t *farray, int numf);
-#endif
+extern loader_data_t loader_data;
+#endif /* LOAD_MODULE_SHLIB_MAIN */
 
 #endif
 
diff --git a/common/utils/telnetsrv/CMakeLists.txt b/common/utils/telnetsrv/CMakeLists.txt
deleted file mode 100644
index bc4a550742291e2c9a67cbf4e923ca79d00eb8e0..0000000000000000000000000000000000000000
--- a/common/utils/telnetsrv/CMakeLists.txt
+++ /dev/null
@@ -1,59 +0,0 @@
-cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
-IF(DEFINED ENV{OPENAIR_DIR})
-  message("...using oai source files in $ENV{OPENAIR_DIR}")
-ELSE()
-  message("OPENAIR_DIR is not defined.  You must run \"source oaienv\" from the oai root dir")
-  # exit early 
-  return()
-ENDIF()
-
-
-
-set(OPENAIR_DIR $ENV{OPENAIR_DIR})
-set(APPROOT ${OPENAIR_DIR}/common/utils/telnetsrv )
-set(OPENAIR_BUILD_DIR $ENV{OPENAIR_DIR}/cmake_targets)
-set(OPENAIR1_DIR $ENV{OPENAIR1_DIR})
-set(OPENAIR2_DIR $ENV{OPENAIR2_DIR})
-set(OPENAIR3_DIR $ENV{OPENAIR3_DIR})
-set(OPENAIR_PHY_DIR $ENV{OPENAIR1_DIR}/PHY)
-set(OPENAIR_TARGET_DIR $ENV{OPENAIR_DIR}/targets)
-set(OPENAIR_COMMONUTILS_DIR $ENV{OPENAIR_DIR}/common/utils)
-set(OPENAIR2_COMMON_DIR $ENV{OPENAIR_DIR}/openair2/COMMON)
-set(OPENAIR_ASN1INC  ${OPENAIR_BUILD_DIR}/lte_build_oai/build/CMakeFiles/Rel14)
-set(OPENAIR_NFAPIINC $ENV{NFAPI_DIR} )
-
-set(CMAKE_INSTALL_PREFIX $ENV{OPENAIR_TARGETS})
-
-add_definitions (-DRel14  -DCMAKER -DENABLE_ITTI -DENABLE_NAS_UE_LOGGING -DENABLE_SECURITY  -DENABLE_USE_CPU_EXECUTION_TIME  -DENABLE_USE_MME -DENABLE_VCD -DENB_AGENT -DENB_MODE -DETHERNET=1  -DEXMIMO_IOT -DJUMBO_FRAME  -DLINK_ENB_PDCP_TO_GTPV1U -DLOG_NO_THREAD -DMAC_CONTEXT -DMAX_NUM_CCs=1  -DNAS_BUILT_IN_UE -DNAS_UE  -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TX=2 -DNO_RRM -DNone=1 -DOAI_NW_DRIVER_USE_NETLINK -DOPENAIR2  -DOPENAIR_LTE -DPHYSIM  -DPHY_CONTEXT -DRel10=1  -DS1AP_VERSION=R10   -DTRACE_RLC_MUTEX -DX2AP_VERSION=R11 -DXFORMS -mavx2 -msse4.1 -mssse3)
-add_compile_options( -fPIC -march=native -Ofast)
-
-include_directories( ./ ${OPENAIR_COMMON_DIR} ${OPENAIR_DIR} ${OPENAIR1_DIR} ${OPENAIR2_DIR} ${OPENAIR2_COMMON_DIR} ${OPENAIR2_DIR}/UTIL/LOG 
-                    ${OPENAIR_COMMONUTILS_DIR}/msc ${OPENAIR_COMMONUTILS_DIR}/itti ${OPENAIR_COMMONUTILS_DIR}/hashtable ${OPENAIR_COMMONUTILS_DIR} ${OPENAIR_ASN1INC}
-		    ${OPENAIR2_DIR}/LAYER2/RLC/AM_v9.3.0  ${OPENAIR_COMMONUTILS_DIR}/msc ${OPENAIR_COMMONUTILS_DIR}/itti ${OPENAIR_COMMONUTILS_DIR}/hashtable ${OPENAIR_COMMONUTILS_DIR} ${OPENAIR_ASN1INC}
-		    ${OPENAIR2_DIR}/LAYER2/RLC  ${OPENAIR2_DIR}/UTIL/LISTS   ${OPENAIR2_DIR}/UTIL/MEM  ${OPENAIR2_DIR}/LAYER2/RLC/UM_v9.3.0 
-		    ${OPENAIR2_DIR}/LAYER2/RLC/TM_v9.3.0 ${OPENAIR2_DIR}/RRC/LITE ${OPENAIR_TARGET_DIR}/COMMON  ${OPENAIR_TARGET_DIR}/ARCH/COMMON
-		    ${OPENAIR3_DIR}/NAS/COMMON/API/NETWORK ${OPENAIR3_DIR}/NAS/COMMON/EMM/MSG/ ${OPENAIR3_DIR}/NAS/COMMON/IES/ ${OPENAIR3_DIR}/NAS/COMMON/UTIL 
-		    ${OPENAIR3_DIR}/NAS/COMMON/ESM/MSG/  ${OPENAIR3_DIR}/GTPV1-U  ${OPENAIR3_DIR}/GTPV1-U/nw-gtpv1u/shared ${OPENAIR3_DIR}/GTPV1-U/nw-gtpv1u/include
-		    ${OPENAIR3_DIR}/UTILS ${OPENAIR_NFAPIINC})
-
-set(TELNETSRV_SOURCE
-    ${APPROOT}/telnetsrv.c
-    ${APPROOT}/telnetsrv_phycmd.c
-    ${APPROOT}/telnetsrv_proccmd.c
-    )
-
-#set(TELNETSRV_ETHDEVCMD_SOURCE
-#    ${APPROOT}/telnetsrv/telnetsrv_ethdevcmd.c
-#    )
-
-
-
-add_library(telnetsrv MODULE ${TELNETSRV_SOURCE} )
-#add_library(telnetsrv_ethdevcmd MODULE ${TELNETSRV_ETHDEVCMD_SOURCE} )
-
-
-install(TARGETS telnetsrv DESTINATION bin)
-
-if (EXISTS "${OPENAIR_BUILD_DIR}/lte_build_oai/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/lte_build_oai/build")
-     install(TARGETS telnetsrv DESTINATION ${OPENAIR_BUILD_DIR}/lte_build_oai/build)
-endif (EXISTS "${OPENAIR_BUILD_DIR}/lte_build_oai/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/lte_build_oai/build")
diff --git a/common/utils/telnetsrv/telnetsrv.c b/common/utils/telnetsrv/telnetsrv.c
index f99a83f3218c78226a052a2dd65bf5d910e6860a..a34d0a7a9d5cbf6241104df0088896ccbec1fad4 100644
--- a/common/utils/telnetsrv/telnetsrv.c
+++ b/common/utils/telnetsrv/telnetsrv.c
@@ -3,7 +3,7 @@
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
  * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.0  (the "License"); you may not use this file
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
  * except in compliance with the License.
  * You may obtain a copy of the License at
  *
@@ -43,7 +43,7 @@
 #include <string.h>
 #include <signal.h>
 #include <pthread.h>
-#include <telnetsrv.h>
+#include "telnetsrv.h"
 #include <string.h>
 #include <stdarg.h>
 #include <unistd.h>
@@ -53,18 +53,25 @@
 #include <sys/resource.h>
 
 #include "common/config/config_userapi.h"
+#include <readline/history.h>
 
 
 #include "telnetsrv_phycmd.h"
 #include "telnetsrv_proccmd.h"	
-static char* telnet_defstatmod[] = {"softmodem","phy"}; 
+static char* telnet_defstatmod[] = {"softmodem","phy","loader"}; 
 static telnetsrv_params_t telnetparams;
 #define TELNETSRV_LISTENADDR 0
 #define TELNETSRV_LISTENPORT 1
 #define TELNETSRV_PRIORITY   2
 #define TELNETSRV_DEBUG      3
-#define TELNETSRV_STATICMOD  7
-#define TELNETSRV_SHRMOD     8
+#define TELNETSRV_LOOPC      4
+#define TELNETSRV_LOOPD      5
+#define TELNETSRV_HISFILE    6  
+#define TELNETSRV_HISSIZE    7 
+#define TELNETSRV_PHYBSIZE   8  
+#define TELNETSRV_STATICMOD  9
+#define TELNETSRV_SHRMOD     10
+
 paramdef_t telnetoptions[] = {
 /*--------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
 /*                                            configuration parameters for telnet utility                                                                             */
@@ -72,19 +79,22 @@ paramdef_t telnetoptions[] = {
 /*--------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
 	{"listenaddr",    "<listen ip address>",         0,                 uptr:&telnetparams.listenaddr,        defstrval:"0.0.0.0",            TYPE_IPV4ADDR,  0 },
 	{"listenport",    "<local port>",                0,                 uptr:&(telnetparams.listenport),      defuintval:9090,                TYPE_UINT,      0 },
-        {"priority",      "<scheduling policy (0-99)",   0,                 uptr:&telnetparams.priority,          defuintval:0,                   TYPE_INT,       0 }, 
+        {"priority",      "<scheduling policy (0-99)",   0,                 iptr:&telnetparams.priority,          defuintval:0,                   TYPE_INT,       0 }, 
 	{"debug",         "<debug level>",               0,                 uptr:NULL,                            defuintval:0,                   TYPE_UINT,      0 },
 	{"loopcount",     "<loop command iterations>",   0,                 uptr:&(telnetparams.loopcount),       defuintval:10,                  TYPE_UINT,      0 },
 	{"loopdelay",     "<loop command delay (ms)>",   0,                 uptr:&(telnetparams.loopdelay),       defuintval:5000,                TYPE_UINT,      0 },
+	{"histfile",      "<history file name>",         PARAMFLAG_NOFREE,  strptr:&(telnetparams.histfile),      defstrval:"oaitelnet.history",  TYPE_STRING,    0 },
+	{"histsize",      "<history sizes>",             0,                 iptr:&(telnetparams.histsize),        defuintval:50,                  TYPE_INT,       0 },
 	{"phypbsize",     "<phy dump buff size (bytes)>",0,                 uptr:&(telnetparams.phyprntbuff_size),defuintval:65000,               TYPE_UINT,      0 },
-        {"staticmod",     "<static modules selection>",  0,                 NULL,                                 defstrlistval:telnet_defstatmod,TYPE_STRINGLIST,1},
-        {"shrmod",        "<static modules selection>",  0,                 NULL,                                 NULL,TYPE_STRINGLIST,0 },
+        {"staticmod",     "<static modules selection>",  0,                 strlistptr:NULL,                      defstrlistval:telnet_defstatmod,TYPE_STRINGLIST,(sizeof(telnet_defstatmod)/sizeof(char *))},
+        {"shrmod",        "<dynamic modules selection>", 0,                 strlistptr:NULL,                      defstrlistval:NULL,TYPE_STRINGLIST,0 }
 };
 
-int get_phybsize() {return telnetparams.phyprntbuff_size; };
+int get_phybsize(void) {return telnetparams.phyprntbuff_size; };
 int add_telnetcmd(char *modulename,telnetshell_vardef_t *var, telnetshell_cmddef_t *cmd );
 int setoutput(char *buff, int debug, telnet_printfunc_t prnt);
 int setparam(char *buff, int debug, telnet_printfunc_t prnt);
+int history_cmd(char *buff, int debug, telnet_printfunc_t prnt);
 
 telnetshell_vardef_t telnet_vardef[] = {
 {"debug",TELNET_VARTYPE_INT32,&telnetparams.telnetdbg},
@@ -92,12 +102,15 @@ telnetshell_vardef_t telnet_vardef[] = {
 {"loopc",TELNET_VARTYPE_INT32,&telnetparams.loopcount},
 {"loopd",TELNET_VARTYPE_INT32,&telnetparams.loopdelay},
 {"phypb",TELNET_VARTYPE_INT32,&telnetparams.phyprntbuff_size},
+{"hsize",TELNET_VARTYPE_INT32,&telnetparams.histsize},
+{"hfile",TELNET_VARTYPE_STRING,&telnetparams.histfile},
 {"",0,NULL}
 };
 
 telnetshell_cmddef_t  telnet_cmdarray[] = {
    {"redirlog","[here,file,off]",setoutput},
    {"param","[prio]",setparam},
+   {"history","[list,reset]",history_cmd},
    {"","",NULL},
 };
 
@@ -131,41 +144,54 @@ char strpolicy[10];
 
 
 //sched_get_priority_max(SCHED_FIFO)
-if (priority < NICE_MIN)
-   {
+if (priority < NICE_MIN) {
    policy=SCHED_FIFO;
    sprintf(strpolicy,"%s","fifo");
-   schedp.sched_priority= NICE_MIN - priority ;   
+   schedp.sched_priority= NICE_MIN - priority ;
+   if (   (schedp.sched_priority < sched_get_priority_min(SCHED_FIFO)) ||
+          (schedp.sched_priority > sched_get_priority_max(SCHED_FIFO)) ) {
+        client_printf("Error: %i invalid prio, should be %i to %i, \n",
+                       priority, NICE_MIN -sched_get_priority_min(SCHED_FIFO),
+                       NICE_MIN - sched_get_priority_max(SCHED_FIFO) );        
    }
-else if (priority > NICE_MAX)
-   {
+} else if (priority > NICE_MAX) {
    policy=SCHED_IDLE;
    sprintf(strpolicy,"%s","idle");
    schedp.sched_priority=0;   
-   } 
-else 
-   {
+} else {
    policy=SCHED_OTHER;
    sprintf(strpolicy,"%s","other");
    schedp.sched_priority=0;   
-   } 
-if( tid != 0)
-  {  
+}
+ 
+if( tid != 0) {  
   rt = pthread_setschedparam(tid, policy, &schedp);
-  }
-else if(pid > 0)
-  {
+} else if(pid > 0)  {
   rt = sched_setscheduler( pid, policy,&schedp);
-  }
-if (rt != 0)
-    {
+} else {
+  rt= -1;
+  client_printf("Error: no pid or tid specified\n");
+}
+
+if (rt != 0) {
     client_printf("Error %i: %s modifying sched param to %s:%i, \n",
                   errno,strerror(errno),strpolicy,schedp.sched_priority); 
-    }
-else
-    {
+} else  {
     client_printf("policy set to %s, priority %i\n",strpolicy,schedp.sched_priority);
+    if ( policy==SCHED_OTHER) {
+        rt = getpriority(PRIO_PROCESS,tid);
+        if (rt != -1) {
+           rt = setpriority(PRIO_PROCESS,tid,priority);  
+           if (rt < 0) {
+               client_printf("Error %i: %s trying to set nice value of thread %u to %i\n",
+                             errno,strerror(errno),tid,priority); 
+           }
+        } else {
+               client_printf("Error %i: %s trying to get nice value of thread %u \n",
+                              errno,strerror(errno),tid); 
+        }
     }
+}
 
 
 
@@ -198,14 +224,13 @@ int rt;
 
   CPU_ZERO(&cpuset);
   CPU_SET(coreid, &cpuset);
-  if (tid > 0)
-     {
+  if (tid > 0) {
      rt = pthread_setaffinity_np((pthread_t)tid, sizeof(cpu_set_t), &cpuset);
-     }
-  else if (pid > 0)
-     {
+  } else if (pid > 0){
      rt = sched_setaffinity((pid_t)pid, sizeof(cpu_set_t), &cpuset);
-     }
+  } else {
+     rt= -1;
+  }
   if (rt != 0)
       {
       client_printf("Error %i: %s calling , xxx_setaffinity...\n",errno,strerror(errno)); 
@@ -284,7 +309,6 @@ memset(cmds,0,sizeof(cmds));
 sscanf(buff,"%9s %9s %9s %9s %9s", cmds[0],cmds[1],cmds[2],cmds[3],cmds[4]  );
 if (strncasecmp(cmds[0],"prio",4) == 0)
    {
-   pthread_attr_t attr;
    int prio;
    prio=(int)strtol(cmds[1],NULL,0);
    if (errno == ERANGE)
@@ -305,6 +329,35 @@ if (strncasecmp(cmds[0],"aff",3) == 0)
 
 return CMDSTATUS_NOTFOUND;   
 } /* setparam */
+
+int history_cmd(char *buff, int debug, telnet_printfunc_t prnt)
+{
+char cmds[TELNET_MAX_MSGLENGTH/TELNET_CMD_MAXSIZE][TELNET_CMD_MAXSIZE];
+
+
+memset(cmds,0,sizeof(cmds));
+sscanf(buff,"%9s %9s %9s %9s %9s", cmds[0],cmds[1],cmds[2],cmds[3],cmds[4]  );
+if (cmds[0] == NULL)
+    return CMDSTATUS_VARNOTFOUND;
+if (strncasecmp(cmds[0],"list",4) == 0)
+   {
+   HIST_ENTRY **hist = history_list();
+   if (hist) {
+      for (int i = 0; hist[i]; i++) {
+          prnt ("%d: %s\n", i + history_base, hist[i]->line);
+      }
+   }
+   return CMDSTATUS_FOUND; 
+   }
+if (strncasecmp(cmds[0],"reset",5) == 0)
+   {
+   clear_history();
+   write_history(telnetparams.histfile);
+   return CMDSTATUS_FOUND; 
+   }
+
+return CMDSTATUS_NOTFOUND; 
+} /* history_cmd */
 /*-------------------------------------------------------------------------------------------------------*/
 /*
 generic commands available for all modules loaded by the server
@@ -314,11 +367,11 @@ int setgetvar(int moduleindex,char getorset,char *params)
 {
 int n,i;
 char varname[TELNET_CMD_MAXSIZE];
-char varval[TELNET_CMD_MAXSIZE];
+char *varval=NULL;
 
    memset(varname,0,sizeof(varname));
-   memset(varval,0,sizeof(varval));
-   n = sscanf(params,"%s %s",varname,varval);
+
+   n = sscanf(params,"%s %ms",varname,&varval);
    for ( i=0 ; telnetparams.CmdParsers[moduleindex].var[i].varvalptr != NULL ; i++)
       {
       if ( strncasecmp(telnetparams.CmdParsers[moduleindex].var[i].varname,varname,strlen(telnetparams.CmdParsers[moduleindex].var[i].varname)) == 0)
@@ -330,7 +383,10 @@ char varval[TELNET_CMD_MAXSIZE];
 	    switch(telnetparams.CmdParsers[moduleindex].var[i].vartype)
 	        {
 		case TELNET_VARTYPE_INT32:
-	             client_printf("%i\n",*(int *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
+	             client_printf("%i\n",*(int32_t *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
+		break;
+		case TELNET_VARTYPE_INT64:
+	             client_printf("%lli\n",*(int64_t *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
 		break;
 		case TELNET_VARTYPE_INT16:
 	             client_printf("%hi\n",*(short *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
@@ -338,8 +394,8 @@ char varval[TELNET_CMD_MAXSIZE];
 		case TELNET_VARTYPE_DOUBLE:
 	             client_printf("%g\n",*(double *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
 		break;
-		case TELNET_VARTYPE_PTR:
-	             client_printf("0x%08x\n",*((unsigned int *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr)));						
+		case TELNET_VARTYPE_STRING:
+	             client_printf("\"%s\"\n",*(char **)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));						
                 break;
 		default:
 		     client_printf("unknown type\n");
@@ -364,6 +420,10 @@ char varval[TELNET_CMD_MAXSIZE];
 		case TELNET_VARTYPE_DOUBLE:
 		     *(double *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr) = strtod(varval,NULL);
 	             client_printf("%g\n",*(double *)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
+		break;	
+		case TELNET_VARTYPE_STRING:
+		     sprintf(*(char **)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr),"%s", varval);
+	             client_printf("\"%s\"\n",*(char **)(telnetparams.CmdParsers[moduleindex].var[i].varvalptr));
 		break;				
 		default:
 		     client_printf("unknown type\n");
@@ -372,6 +432,9 @@ char varval[TELNET_CMD_MAXSIZE];
 	    }		   
 	 }
       } 
+if (n>1 && varval != NULL) {
+   free(varval);
+}
 return CMDSTATUS_VARNOTFOUND;
 }
 /*----------------------------------------------------------------------------------------------------*/
@@ -515,13 +578,14 @@ if(listen(sock, 1) == -1)
      fprintf(stderr,"[TELNETSRV] Error %s on listen call\n",strerror(errno));
 
 
+using_history();
 
 printf("\nInitializing telnet server...\n");
 while( (telnetparams.new_socket = accept(sock, &cli_addr, &cli_len)) )
      {
      printf("[TELNETSRV] Telnet client connected....\n");
-
-
+    read_history(telnetparams.histfile);
+    stifle_history(telnetparams.histsize);
     if(telnetparams.new_socket < 0)
        fprintf(stderr,"[TELNETSRV] Error %s on accept call\n",strerror(errno));
 
@@ -548,31 +612,43 @@ while( (telnetparams.new_socket = accept(sock, &cli_addr, &cli_len)) )
            break;
            }
          if (telnetparams.telnetdbg > 0)
-	    printf("[TELNETSRV] Command received: readc %i filled %i %s\n", readc, filled ,buf);
-	 if (strlen(buf) >= 2 )
+	    printf("[TELNETSRV] Command received: readc %i filled %i \"%s\"\n", readc, filled ,buf);
+         if (buf[0] == '!') {
+             if (buf[1] == '!') {
+         	 sprintf(buf,"%s","telnet history list");
+             } else {
+         	 HIST_ENTRY *hisentry = history_get(strtol(buf+1,NULL,0)); 
+         	 if (hisentry) {
+                     char msg[TELNET_MAX_MSGLENGTH + sizeof(TELNET_PROMPT) +10];
+         	     sprintf(buf,"%s",hisentry->line);
+        	     sprintf(msg,"%s %s\n",TELNET_PROMPT, hisentry->line);
+                     send(telnetparams.new_socket, msg, strlen(msg), MSG_NOSIGNAL);
+         	 }
+             }  	 
+         }
+	 if (strlen(buf) > 2 )
 	    {
             status=process_command(buf);
 	    }
 	 else
 	    status=CMDSTATUS_NOCMD;
 	    
-         if (status != CMDSTATUS_EXIT)
-	    {
-	    if (status == CMDSTATUS_NOTFOUND)
-	       {
+         if (status != CMDSTATUS_EXIT) {
+	    if (status == CMDSTATUS_NOTFOUND) {
 	       char msg[TELNET_MAX_MSGLENGTH + 50];
 	       sprintf(msg,"Error: \n      %s\n is not a softmodem command\n",buf);
 	       send(telnetparams.new_socket, msg, strlen(msg), MSG_NOSIGNAL);
-	       }
+	    } else if (status == CMDSTATUS_FOUND) {
+               add_history(buf);
+            }
             send(telnetparams.new_socket, TELNET_PROMPT, sizeof(TELNET_PROMPT), MSG_NOSIGNAL);
-	    }
-	 else
-	    {
+	} else {
 	    printf ("[TELNETSRV] Closing telnet connection...\n");
 	    break;
-	    }
+	}
     }
-
+    write_history(telnetparams.histfile);
+    clear_history();
     close(telnetparams.new_socket);
     printf ("[TELNETSRV] Telnet server waitting for connection...\n");
     }
@@ -588,7 +664,7 @@ return;
 */
 void exec_moduleinit(char *modname)
 {
-void (*fptr)();
+void (*fptr)(void);
 char initfunc[TELNET_CMD_MAXSIZE+9];
 
        if (strlen(modname) > TELNET_CMD_MAXSIZE)
@@ -609,23 +685,26 @@ char initfunc[TELNET_CMD_MAXSIZE+9];
           }
 }
 
-int add_embeddedmodules()
+int add_embeddedmodules(void)
 {
-
+int ret=0;
 
 
 
     for(int i=0; i<telnetoptions[TELNETSRV_STATICMOD].numelt;i++)
        {
+       ret++;
        exec_moduleinit(telnetoptions[TELNETSRV_STATICMOD].strlistptr[i]);
        }
+return ret;
+
 }
 
-int add_sharedmodules()
+int add_sharedmodules(void)
 {
 char initfunc[TELNET_CMD_MAXSIZE+9];
-void (*fptr)();
-
+void (*fptr)(void);
+int ret=0;
 
     for(int i=0; i<telnetoptions[TELNETSRV_SHRMOD].numelt;i++)
        {
@@ -634,22 +713,23 @@ void (*fptr)();
        if ( fptr != NULL)
           {
           fptr();
+          ret++;
           }
        else
           {
           fprintf(stderr,"[TELNETSRV] couldn't find %s for module %s \n",initfunc,telnetoptions[TELNETSRV_STATICMOD].strlistptr[i]);
           }
        }
+    return ret;
 }
 
-int init_telnetsrv(char *cfgfile)
+int telnetsrv_autoinit(void)
  {
-  void *lib_handle;
-  char** moduleslist; 
+
 
    memset(&telnetparams,0,sizeof(telnetparams));
 
-   config_get( telnetoptions,sizeof(telnetoptions)/sizeof(paramdef_t),NULL); 
+   config_get( telnetoptions,sizeof(telnetoptions)/sizeof(paramdef_t),"telnetsrv"); 
 
  
    if(pthread_create(&telnetparams.telnet_pthread,NULL, (void *(*)(void *))run_telnetsrv, NULL) != 0)
@@ -691,6 +771,20 @@ int add_telnetcmd(char *modulename, telnetshell_vardef_t *var, telnetshell_cmdde
  }
 
 
-
+/* function which will be called by the shared lib loader, to check shared lib version
+   against main exec version. version mismatch no considered as fatal (interfaces not supposed to change)
+*/ 
+int  telnetsrv_checkbuildver(char * mainexec_buildversion, char ** shlib_buildversion)
+{
+#ifndef PACKAGE_VERSION
+#define PACKAGE_VERSION "standalone built: " __DATE__ __TIME__
+#endif
+    *shlib_buildversion = PACKAGE_VERSION;
+    if (strcmp(mainexec_buildversion, *shlib_buildversion) != 0) {
+          fprintf(stderr,"[TELNETSRV] shared lib version %s, doesn't match main version %s, compatibility should be checked\n",
+                mainexec_buildversion,*shlib_buildversion);
+    }
+    return 0;
+}
 
 
diff --git a/common/utils/telnetsrv/telnetsrv.h b/common/utils/telnetsrv/telnetsrv.h
index c8cad58784df9381f1040b0200d3597b838df3df..3cf561eda251f99ea5cc8d9156e40a0bf37b5d9f 100644
--- a/common/utils/telnetsrv/telnetsrv.h
+++ b/common/utils/telnetsrv/telnetsrv.h
@@ -3,7 +3,7 @@
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
  * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.0  (the "License"); you may not use this file
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
  * except in compliance with the License.
  * You may obtain a copy of the License at
  *
@@ -18,7 +18,6 @@
  * For more information about the OpenAirInterface (OAI) Software Alliance:
  *      contact@openairinterface.org
  */
-
 /*! \file common/utils/telnetsrv/telnetsrv.h
  * \brief: include file for telnet server implementation
  * \author Francois TABURET
@@ -38,7 +37,7 @@
 #define TELNET_MAX_MSGLENGTH      2048
 #define TELNET_PROMPT             "softmodem> "
 #define TELNET_MAXCMD             20
-#define TELNET_CMD_MAXSIZE        10
+#define TELNET_CMD_MAXSIZE        20
 #define TELNET_HELPSTR_SIZE       80
 
 /* status return by the command parser after it analysed user input */
@@ -70,7 +69,7 @@ typedef struct cmddef {
 #define TELNET_VARTYPE_INT64  3
 #define TELNET_VARTYPE_STRING 4
 #define TELNET_VARTYPE_DOUBLE 5
-#define TELNET_VARTYPE_PTR    6
+//#define TELNET_VARTYPE_PTR    6
 typedef struct variabledef {
     char varname[TELNET_CMD_MAXSIZE];
     char vartype;
@@ -96,6 +95,8 @@ typedef struct {
      pthread_t telnet_pthread;       // thread id of the telnet server
      int telnetdbg;                  // debug level of the server
      int priority;                   // server running priority
+     char *histfile;                 // command history
+     int histsize;                   // command history length
      int new_socket;                 // socket of the client connection
      int logfilefd;                  // file id of the log file when log output is redirected to a file
      int  saved_stdout;              // file id of the previous stdout, used to be able to restore original stdout 
@@ -134,6 +135,6 @@ VT escape sequence definition, for smarter display....
 int add_telnetcmd(char *modulename, telnetshell_vardef_t *var, telnetshell_cmddef_t *cmd);
 void set_sched(pthread_t tid, int pid,int priority);
 void set_affinity(pthread_t tid, int pid, int coreid);
-extern int get_phybsize(); 
+extern int get_phybsize(void); 
 #endif
 #endif
diff --git a/common/utils/telnetsrv/telnetsrv_CMakeLists.txt b/common/utils/telnetsrv/telnetsrv_CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5dee7db4c41fef1d5c3f96b18eb770d64e044054
--- /dev/null
+++ b/common/utils/telnetsrv/telnetsrv_CMakeLists.txt
@@ -0,0 +1,28 @@
+
+
+set(TELNETROOT ${OPENAIR_DIR}/common/utils/telnetsrv )
+
+
+
+set(TELNETSRV_SOURCE
+    ${TELNETROOT}/telnetsrv.c
+    ${TELNETROOT}/telnetsrv_phycmd.c
+    ${TELNETROOT}/telnetsrv_proccmd.c
+    ${TELNETROOT}/telnetsrv_loader.c
+    )
+
+#set(TELNETSRV_ETHDEVCMD_SOURCE
+#    ${APPROOT}/telnetsrv/telnetsrv_ethdevcmd.c
+#    )
+
+
+
+add_library(telnetsrv MODULE ${TELNETSRV_SOURCE} )
+#add_library(telnetsrv_ethdevcmd MODULE ${TELNETSRV_ETHDEVCMD_SOURCE} )
+target_link_libraries(telnetsrv PRIVATE history)
+
+install(TARGETS telnetsrv DESTINATION bin)
+
+if (EXISTS "${OPENAIR_BUILD_DIR}/lte_build_oai/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/lte_build_oai/build")
+     install(TARGETS telnetsrv DESTINATION ${OPENAIR_BUILD_DIR}/lte_build_oai/build)
+endif (EXISTS "${OPENAIR_BUILD_DIR}/lte_build_oai/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/lte_build_oai/build")
diff --git a/common/utils/telnetsrv/telnetsrv_loader.c b/common/utils/telnetsrv/telnetsrv_loader.c
new file mode 100644
index 0000000000000000000000000000000000000000..a23e25eb835fbd3a728424a7afb4a8991a179caa
--- /dev/null
+++ b/common/utils/telnetsrv/telnetsrv_loader.c
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file common/utils/telnetsrv/telnetsrv_loader.c
+ * \brief: implementation of telnet commands related to softmodem linux process
+ * \author Francois TABURET
+ * \date 2018
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+#define _GNU_SOURCE 
+#include <string.h>
+#include <pthread.h>
+
+
+#define TELNETSERVERCODE
+#include "telnetsrv.h"
+#define TELNETSRV_LOADER_MAIN
+#include "telnetsrv_loader.h"
+
+
+int loader_show_cmd(char *buff, int debug, telnet_printfunc_t prnt);
+telnetshell_cmddef_t loader_cmdarray[] = {
+   {"show","[params,modules]",loader_show_cmd},
+   {"","",NULL},
+};
+
+
+/*-------------------------------------------------------------------------------------*/
+int loader_show_cmd(char *buff, int debug, telnet_printfunc_t prnt)
+{
+   if (debug > 0)
+       prnt( "loader_show_cmd received %s\n",buff);
+
+      if (strcasestr(buff,"params") != NULL) {
+          prnt( "loader parameters:\n");
+          prnt( "   Main executable build version: \"%s\"\n", loader_data.mainexec_buildversion);
+          prnt( "   Default shared lib path: \"%s\"\n", loader_data.shlibpath);
+          prnt( "   Max number of shared lib : %i\n", loader_data.maxshlibs);
+      }
+      else if (strcasestr(buff,"modules") != NULL) {
+          prnt( "%i shared lib have been dynamicaly loaded by the oai loader\n", loader_data.numshlibs);
+          for (int i=0 ; i<loader_data.numshlibs ; i++) {
+              prnt( "   Module %i: %s\n", i,loader_data.shlibs[i].name);
+              prnt( "       Shared library build version: \"%s\"\n",((loader_data.shlibs[i].shlib_buildversion == NULL )?"":loader_data.shlibs[i].shlib_buildversion));
+              prnt( "       Shared library path: \"%s\"\n", loader_data.shlibs[i].thisshlib_path);
+              prnt( "       %i function pointers registered:\n", loader_data.shlibs[i].numfunc);
+              for(int j=0 ; j<loader_data.shlibs[i].numfunc;j++) {
+                     prnt( "          function %i %s at %p\n",j,
+                           loader_data.shlibs[i].funcarray[j].fname, loader_data.shlibs[i].funcarray[j].fptr);
+              }
+          }
+      } else {
+          prnt("%s: wrong loader command...\n",buff);
+      }
+   return 0;
+}
+
+void add_loader_cmds(void)
+{
+
+   add_telnetcmd("loader", loader_globalvardef, loader_cmdarray);
+}
diff --git a/common/utils/telnetsrv/telnetsrv_loader.h b/common/utils/telnetsrv/telnetsrv_loader.h
new file mode 100644
index 0000000000000000000000000000000000000000..404aabfc7019b2ccf82f718e145696bb63584ca3
--- /dev/null
+++ b/common/utils/telnetsrv/telnetsrv_loader.h
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file common/utils/telnetsrv_proccmd.h
+ * \brief: Include file defining telnet commands related to softmodem linux process
+ * \author Francois TABURET
+ * \date 2018
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+
+#ifdef TELNETSRV_LOADER_MAIN
+
+#include "UTIL/LOG/log.h"
+
+
+#include "common/utils/load_module_shlib.h"
+
+
+telnetshell_vardef_t loader_globalvardef[] = {
+{"mainversion",TELNET_VARTYPE_STRING,&(loader_data.mainexec_buildversion)},
+{"defpath",TELNET_VARTYPE_STRING,&(loader_data.shlibpath)},
+{"maxshlibs",TELNET_VARTYPE_INT32,&(loader_data.maxshlibs)},
+{"numshlibs",TELNET_VARTYPE_INT32,&(loader_data.numshlibs)},
+{"",0,NULL}
+};
+telnetshell_vardef_t *loader_modulesvardef;
+
+extern void add_loader_cmds(void);
+
+#endif
+
+/*-------------------------------------------------------------------------------------*/
+
diff --git a/common/utils/telnetsrv/telnetsrv_phycmd.c b/common/utils/telnetsrv/telnetsrv_phycmd.c
index 6867d5deeef8fde9baa5880ca5f3bc28f043525c..a69efa234c0a365650928aaf1a267673ae030d6b 100644
--- a/common/utils/telnetsrv/telnetsrv_phycmd.c
+++ b/common/utils/telnetsrv/telnetsrv_phycmd.c
@@ -41,7 +41,7 @@
 char *prnbuff;
 extern int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length);
 
-void init_phytelnet()
+void init_phytelnet(void)
 {
 prnbuff=malloc(get_phybsize() );
 if (prnbuff == NULL)
@@ -134,7 +134,7 @@ telnetshell_cmddef_t phy_cmdarray[] = {
 
 
 /*-------------------------------------------------------------------------------------*/
-void add_phy_cmds()
+void add_phy_cmds(void)
 {
 
    init_phytelnet();
diff --git a/common/utils/telnetsrv/telnetsrv_phycmd.h b/common/utils/telnetsrv/telnetsrv_phycmd.h
index 3922bda727c0e140d3e4529c81dd167cbb21df29..50f1e81edcffc354d904c6133c36036c743d3cb3 100644
--- a/common/utils/telnetsrv/telnetsrv_phycmd.h
+++ b/common/utils/telnetsrv/telnetsrv_phycmd.h
@@ -42,8 +42,6 @@
 #define TELNETVAR_PHYCC1    1
 
 telnetshell_vardef_t phy_vardef[] = {
-{"phycc1",TELNET_VARTYPE_PTR,NULL},
-{"phycc2",TELNET_VARTYPE_PTR,NULL},
 //{"iqmax",TELNET_VARTYPE_INT16,NULL},
 //{"iqmin",TELNET_VARTYPE_INT16,NULL},
 //{"loglvl",TELNET_VARTYPE_INT32,NULL},
@@ -57,7 +55,7 @@ telnetshell_vardef_t phy_vardef[] = {
 
 #else
 
-extern void add_phy_cmds();
+extern void add_phy_cmds(void);
 
 #endif
 
diff --git a/common/utils/telnetsrv/telnetsrv_proccmd.c b/common/utils/telnetsrv/telnetsrv_proccmd.c
index 82c4549faeab7b7eaf79ec00f5a145fdfb7717d7..91f0e9c93a591f04bb85ddd991c8cf9d2e1142cd 100644
--- a/common/utils/telnetsrv/telnetsrv_proccmd.c
+++ b/common/utils/telnetsrv/telnetsrv_proccmd.c
@@ -3,7 +3,7 @@
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
  * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.0  (the "License"); you may not use this file
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
  * except in compliance with the License.
  * You may obtain a copy of the License at
  *
@@ -54,6 +54,8 @@
 #define TELNETSRV_PROCCMD_MAIN
 #include "log.h"
 #include "log_extern.h"
+#include "common/config/config_userapi.h"
+#include "openair1/PHY/extern.h"
 #include "telnetsrv_proccmd.h"
 
 void decode_procstat(char *record, int debug, telnet_printfunc_t prnt)
@@ -70,14 +72,13 @@ char toksep[2];
   lptr= prntline;
 /*http://man7.org/linux/man-pages/man5/proc.5.html gives the structure of the stat file */
  
-  while( 	procfile_fiels != NULL && fieldcnt < 42)
-    {
+  while( 	procfile_fiels != NULL && fieldcnt < 42) {
+    long int policy;
     if (strlen(procfile_fiels) == 0)
        continue;
     fieldcnt++;
     sprintf(toksep," ");
-    switch(fieldcnt)
-       {
+    switch(fieldcnt) {
        case 1: /* id */
            lptr+=sprintf(lptr,"%9.9s ",procfile_fiels);
            sprintf(toksep,")");
@@ -104,12 +105,36 @@ char toksep[2];
        break;
        case 41:   //policy	       
            lptr+=sprintf(lptr,"%3.3s ",procfile_fiels);
+           policy=strtol(procfile_fiels,NULL,0);
+           switch(policy) {
+              case SCHED_FIFO:
+                   lptr+=sprintf(lptr,"%s ","rt: fifo");
+              break;
+              case SCHED_OTHER:
+                   lptr+=sprintf(lptr,"%s ","other");
+              break;
+              case SCHED_IDLE:
+                   lptr+=sprintf(lptr,"%s ","idle");
+              break;
+              case SCHED_BATCH:
+                   lptr+=sprintf(lptr,"%s ","batch");
+              break;
+              case SCHED_RR:
+                   lptr+=sprintf(lptr,"%s ","rt: rr");
+              break;
+              case SCHED_DEADLINE:
+                   lptr+=sprintf(lptr,"%s ","rt: deadline");
+              break;
+              default:
+                   lptr+=sprintf(lptr,"%s ","????");
+              break;
+           }
        break;
        default:
        break;	       	       	       	       	       
-       }/* switch on fieldcnr */  
+    }/* switch on fieldcnr */  
     procfile_fiels =strtok_r(NULL,toksep,&strtokptr); 
-    } /* while on proc_fields != NULL */
+  } /* while on proc_fields != NULL */
   prnt("%s\n",prntline); 
 } /*decode_procstat */
 
@@ -141,7 +166,7 @@ char aname[256];
 DIR *proc_dir;
 struct dirent *entry;
 
-int rt;
+
 
     prnt("  id          name            state   USRmod    KRNmod  prio nice   vsize   proc pol \n\n");
     snprintf(aname, sizeof(aname), "/proc/%d/stat", getpid());
@@ -172,14 +197,51 @@ extern log_t *g_log;
    
    if (debug > 0)
        prnt(" proccmd_show received %s\n",buf);
-   if (strcasestr(buf,"thread") != NULL)
-       {
+   if (strcasestr(buf,"thread") != NULL) {
        print_threads(buf,debug,prnt);
-       }
+   }
    if (strcasestr(buf,"loglvl") != NULL) {
-       for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++){
-            prnt("\t%s:\t%s\t%s\n",g_log->log_component[i].name, map_int_to_str(log_verbosity_names,g_log->log_component[i].flag),
-	        map_int_to_str(log_level_names,g_log->log_component[i].level));
+       prnt("component                 verbosity  level  enabled\n");
+       for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
+            prnt("%02i %17.17s:%10.10s%10.10s  %s\n",i ,g_log->log_component[i].name, 
+                  map_int_to_str(log_verbosity_names,g_log->log_component[i].flag),
+	          map_int_to_str(log_level_names,g_log->log_component[i].level),
+                  ((g_log->log_component[i].interval>0)?"Y":"N") );
+       }
+   }
+   if (strcasestr(buf,"config") != NULL) {
+       prnt("Command line arguments:\n");
+       for (int i=0; i < config_get_if()->argc; i++) {
+            prnt("    %02i %s\n",i ,config_get_if()->argv[i]);
+       }
+       prnt("Config module flags ( -O <cfg source>:<xxx>:dbgl<flags>): 0x%08x\n", config_get_if()->rtflags); 
+
+       prnt("    Print config debug msg, params values (flag %u): %s\n",CONFIG_PRINTPARAMS,
+            ((config_get_if()->rtflags & CONFIG_PRINTPARAMS) ? "Y" : "N") ); 
+       prnt("    Print config debug msg, memory management(flag %u): %s\n",CONFIG_DEBUGPTR,
+            ((config_get_if()->rtflags & CONFIG_DEBUGPTR) ? "Y" : "N") ); 
+       prnt("    Print config debug msg, command line processing (flag %u): %s\n",CONFIG_DEBUGCMDLINE,
+            ((config_get_if()->rtflags & CONFIG_DEBUGCMDLINE) ? "Y" : "N") );        
+       prnt("    Don't exit if param check fails (flag %u): %s\n",CONFIG_NOABORTONCHKF,
+            ((config_get_if()->rtflags & CONFIG_NOABORTONCHKF) ? "Y" : "N") );      
+       prnt("Config source: %s,  parameters:\n",CONFIG_GETSOURCE );
+       for (int i=0; i < config_get_if()->num_cfgP; i++) {
+            prnt("    %02i %s\n",i ,config_get_if()->cfgP[i]);
+       }
+       prnt("Softmodem components:\n");
+       prnt("   %02i Ru(s)\n", RC.nb_RU);
+       prnt("   %02i lte RRc(s),     %02i NbIoT RRC(s)\n",    RC.nb_inst, RC.nb_nb_iot_rrc_inst);
+       prnt("   %02i lte MACRLC(s),  %02i NbIoT MACRLC(s)\n", RC.nb_macrlc_inst, RC.nb_nb_iot_macrlc_inst);
+       prnt("   %02i lte L1,	    %02i NbIoT L1\n",	     RC.nb_L1_inst, RC.nb_nb_iot_L1_inst);
+
+       for(int i=0; i<RC.nb_inst; i++) {
+           prnt("    lte RRC %i:     %02i CC(s) \n",i,((RC.nb_CC == NULL)?0:RC.nb_CC[i]));
+       }
+       for(int i=0; i<RC.nb_L1_inst; i++) {
+           prnt("    lte L1 %i:      %02i CC(s)\n",i,((RC.nb_L1_CC == NULL)?0:RC.nb_L1_CC[i]));
+       }
+       for(int i=0; i<RC.nb_macrlc_inst; i++) {
+           prnt("    lte macrlc %i:  %02i CC(s)\n",i,((RC.nb_mac_CC == NULL)?0:RC.nb_mac_CC[i]));
        }
    }
    return 0;
@@ -190,12 +252,16 @@ int proccmd_thread(char *buf, int debug, telnet_printfunc_t prnt)
 int bv1,bv2;   
 int res;
 char sv1[64]; 
-char tname[32];  
+ 
    bv1=0;
    bv2=0;
    sv1[0]=0;
    if (debug > 0)
        prnt("proccmd_thread received %s\n",buf);
+   if (strcasestr(buf,"help") != NULL) {
+          prnt(PROCCMD_THREAD_HELP_STRING);
+          return 0;
+   } 
    res=sscanf(buf,"%i %9s %i",&bv1,sv1,&bv2);
    if (debug > 0)
        prnt(" proccmd_thread: %i params = %i,%s,%i\n",res,bv1,sv1,bv2);   
@@ -231,32 +297,95 @@ extern void exit_fun(const char* s);
    return 0;
 }
  
+
 int proccmd_log(char *buf, int debug, telnet_printfunc_t prnt)
 {
 int idx1=0;
 int idx2=NUM_LOG_LEVEL-1;
-int s = sscanf(buf,"%*s %i-%i",&idx1,&idx2);   
+char *logsubcmd=NULL;
+
+int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2);   
    
    if (debug > 0)
-       prnt("process module received %s\n",buf);
+       prnt( "proccmd_log received %s\n   s=%i sub command %s\n",buf,s,((logsubcmd==NULL)?"":logsubcmd));
+
+   if (s == 1 && logsubcmd != NULL) {
+      if (strcasestr(logsubcmd,"online") != NULL) {
+          if (strcasestr(buf,"noonline") != NULL) {
+   	      set_glog_onlinelog(0);
+              prnt("online logging disabled\n",buf);
+          } else {
+   	      set_glog_onlinelog(1);
+              prnt("online logging enabled\n",buf);
+          }
+      }
+      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("\nAvailable verbosity: \n   ");
+          for (int i=0; log_verbosity_names[i].name != NULL; i++)
+             prnt("%s ",log_verbosity_names[i].name);
+          prnt("\n");
+   	  proccmd_show("loglvl",debug,prnt);
+      }
+      else if (strcasestr(logsubcmd,"help") != NULL) {
+          prnt(PROCCMD_LOG_HELP_STRING);
+      } else {
+          prnt("%s: wrong log command...\n",logsubcmd);
+      }
+   } else if ( s == 3 && logsubcmd != NULL) {
+      int level, verbosity, interval;
+      char *tmpstr=NULL;
+      char *logparam=NULL;
+      int l;
+
+      level = verbosity = interval = -1;
+      l=sscanf(logsubcmd,"%m[^'_']_%m[^'_']",&logparam,&tmpstr);
+      if (debug > 0)
+          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);
+         } else if (strcmp(logparam,"verbos") == 0) {
+             verbosity=map_str_to_int(log_verbosity_names,tmpstr);
+             if (verbosity < 0)  prnt("verbosity %s unknown\n",tmpstr);
+         } else {
+             prnt("%s%s unknown log sub command \n",logparam, tmpstr);
+         }
+      } else if (l ==1 ) {
+         if (strcmp(logparam,"enable") == 0) {
+              interval = 1;
+         } else if (strcmp(logparam,"disable") == 0) {
+              interval = 0;
+         } else {
+             prnt("%s%s unknown log sub command \n",logparam, tmpstr);
+         }
+      } else {
+          prnt("%s unknown log sub command \n",logsubcmd); 
+      }
+      if (logparam != NULL) free(logparam);
+      if (tmpstr != NULL)   free(tmpstr);
+      for (int i=idx1; i<=idx2 ; i++) {
+          set_comp_log(i, level, verbosity, interval);
+          prnt("log level/verbosity  comp %i %s set to %s / %s (%s)\n",
+                i,((g_log->log_component[i].name==NULL)?"":g_log->log_component[i].name),
+                map_int_to_str(log_level_names,g_log->log_component[i].level),
+                map_int_to_str(log_verbosity_names,g_log->log_component[i].flag),
+                ((g_log->log_component[i].interval>0)?"enabled":"disabled"));
+
+        
+      }     
+   } else {
+       prnt("%s: wrong log command...\n",buf);
+   }
 
-   if (strcasestr(buf,"enable") != NULL)
-       {
-       set_glog_onlinelog(1);
-       }
-   if (strcasestr(buf,"disable") != NULL)
-       {
-       set_glog_onlinelog(0);
-       }
-    if (strcasestr(buf,"show") != NULL)
-       {
-       proccmd_show("loglvl",debug,prnt);
-       }      
    return 0;
 } 
 /*-------------------------------------------------------------------------------------*/
 
-void add_softmodem_cmds()
+void add_softmodem_cmds(void)
 {
    add_telnetcmd("softmodem",proc_vardef,proc_cmdarray);
 }
diff --git a/common/utils/telnetsrv/telnetsrv_proccmd.h b/common/utils/telnetsrv/telnetsrv_proccmd.h
index d7fd0a6e2497df81bca617989ad142e5356997bd..b2c05315d8a46e2e1a989beefe775d5c53d8b21d 100644
--- a/common/utils/telnetsrv/telnetsrv_proccmd.h
+++ b/common/utils/telnetsrv/telnetsrv_proccmd.h
@@ -3,7 +3,7 @@
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
  * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.0  (the "License"); you may not use this file
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
  * except in compliance with the License.
  * You may obtain a copy of the License at
  *
@@ -19,6 +19,7 @@
  *      contact@openairinterface.org
  */
 
+
 /*! \file common/utils/telnetsrv/telnetsrv_proccmd.h
  * \brief: Include file defining telnet commands related to this linux process
  * \author Francois TABURET
@@ -43,15 +44,33 @@ extern int proccmd_log(char *buf, int debug, telnet_printfunc_t prnt);
 telnetshell_vardef_t proc_vardef[] = {
 {"",0,NULL}
 };
+#define PROCCMD_LOG_HELP_STRING " log sub commands: \n\
+ show:  		     display current log configuration \n\
+ online, noonline:	     enable or disable console logs \n\
+ enable, disable id1-id2:    enable or disable logs for components index id1 to id2 \n\
+ level_<level> id1-id2:      set log level to <level> for components index id1 to id2 \n\
+ level_<verbosity> id1-id2:  set log verbosity to <verbosity> for components index id1 to id2 \n\
+use the show command to get the values for <level>, <verbosity> and the list of component indexes \
+that can be used for id1 and id2 \n"    
+
+#define PROCCMD_THREAD_HELP_STRING " thread sub commands: \n\
+ <thread id> aff <core>  :    set affinity of thread <thread id> to core <core> \n\
+ <thread id> prio <prio> :    set scheduling parameters for thread <thread id>  \n\
+                   if prio < -20: linux scheduling policy set to FIFO, \n\
+                                  with priority = -20 - prio \n\
+                   if prio > 19: linux scheduling policy set to OTHER, \n\
+                                  with priority (nice value) =  prio \n\
+  use \"softmodem show thread\" to get <thread id> \n"
+ 
 
 telnetshell_cmddef_t proc_cmdarray[] = {
-   {"show","loglvl|thread", proccmd_show},
-   {"log","[enable,disable]", proccmd_log},
-   {"thread","<id> aff|prio <aff|prio>", proccmd_thread},
+   {"show","loglvl|thread|config", proccmd_show},
+   {"log","(enter help for details)", proccmd_log},
+   {"thread","(enter help for details)", proccmd_thread},
    {"exit","", proccmd_exit},
    {"","",NULL},
 };
 #else
-extern void add_proccmd_cmds();
+extern void add_proccmd_cmds(void);
 #endif  /* TELNETSRV_PROCCMD_MAIN */
 
diff --git a/openair1/PHY/CODING/3gpplte.c b/openair1/PHY/CODING/3gpplte.c
index ca63857d7205cc4b37c7da5d89ff4988127f0b5e..61acdb2ad9d3040dca9ed68d4264cc0fe0e332c4 100644
--- a/openair1/PHY/CODING/3gpplte.c
+++ b/openair1/PHY/CODING/3gpplte.c
@@ -27,7 +27,9 @@
 #ifndef TC_MAIN
 //#include "defs.h"
 #endif
-
+#include <stdint.h>
+#include <stdio.h>
+#include "PHY/CODING/defs.h"
 #include "extern_3GPPinterleaver.h"
 
 //#define DEBUG_TURBO_ENCODER 1
@@ -35,7 +37,7 @@
 uint32_t threegpplte_interleaver_output;
 uint32_t threegpplte_interleaver_tmp;
 
-inline void threegpplte_interleaver_reset()
+inline void threegpplte_interleaver_reset(void)
 {
   threegpplte_interleaver_output = 0;
   threegpplte_interleaver_tmp    = 0;
@@ -82,7 +84,7 @@ uint8_t output_lut[16],state_lut[16];
 inline uint8_t threegpplte_rsc_lut(uint8_t input,uint8_t *state)
 {
 
-  uint8_t output;
+
   uint8_t off;
 
   off = (*state<<1)|input;
@@ -146,7 +148,7 @@ void threegpplte_turbo_encoder(uint8_t *input,
   for (i=0; f1f2mat[i].nb_bits!= input_length_bits && i <188; i++);
 
   if ( i == 188 ) {
-    msg("Illegal frame length!\n");
+    printf("Illegal frame length!\n");
     return;
   } else {
     base_interleaver=il_tb+f1f2mat[i].beg_index;
diff --git a/openair1/PHY/CODING/3gpplte_sse.c b/openair1/PHY/CODING/3gpplte_sse.c
index 5d87a60477db22600da14707604db1745ddc304c..313d63f7a7df10f5e6115c47228fff7aaf200072 100644
--- a/openair1/PHY/CODING/3gpplte_sse.c
+++ b/openair1/PHY/CODING/3gpplte_sse.c
@@ -96,7 +96,7 @@ static inline void threegpplte_rsc_termination(unsigned char *x,unsigned char *z
   *state = (*state)>>1;
 }
 
-void treillis_table_init(void)
+static void treillis_table_init(void)
 {
   //struct treillis t[][]=all_treillis;
   //t=memalign(16,sizeof(struct treillis)*8*256);
@@ -536,12 +536,12 @@ char interleave_compact_byte(short * base_interleaver,unsigned char * input, uns
   }
 */
 
-void threegpplte_turbo_encoder(unsigned char *input,
-                               unsigned short input_length_bytes,
-                               unsigned char *output,
-                               unsigned char F,
-                               unsigned short interleaver_f1,
-                               unsigned short interleaver_f2)
+void threegpplte_turbo_encoder_sse(unsigned char *input,
+                                   unsigned short input_length_bytes,
+                                   unsigned char *output,
+                                   unsigned char F,
+                                   unsigned short interleaver_f1,
+                                   unsigned short interleaver_f2)
 {
 
   int i;
@@ -641,7 +641,24 @@ void threegpplte_turbo_encoder(unsigned char *input,
 #endif
 }
 
-
+void init_encoder_sse (void) {
+    treillis_table_init(); 	   
+}
+/* function which will be called by the shared lib loader, to check shared lib version
+   against main exec version. version mismatch no considered as fatal (interfaces not supposed to change)
+*/ 
+int  coding_checkbuildver(char * mainexec_buildversion, char ** shlib_buildversion)
+{
+#ifndef PACKAGE_VERSION
+#define PACKAGE_VERSION "standalone built: " __DATE__ __TIME__
+#endif
+    *shlib_buildversion = PACKAGE_VERSION;
+    if (strcmp(mainexec_buildversion, *shlib_buildversion) != 0) {
+          fprintf(stderr,"[CODING] shared lib version %s, doesn't match main version %s, compatibility should be checked\n",
+                mainexec_buildversion,*shlib_buildversion);
+    }
+    return 0;
+}
 
 #ifdef TC_MAIN
 #define INPUT_LENGTH 20 
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder.c b/openair1/PHY/CODING/3gpplte_turbo_decoder.c
index 4470ecca05ba426e30113e6a71eacf76e87a0465..6c50e03806a90bef566fa1ddb0c9724b85fb567b 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder.c
@@ -550,7 +550,7 @@ void compute_alpha_s(llr_t* alpha,llr_t* m_11,llr_t* m_10,unsigned short frame_l
 
 void compute_beta_s(llr_t* beta,llr_t *m_11,llr_t* m_10,llr_t* alpha,unsigned short frame_length,unsigned char F)
 {
-  int k,i;
+  int k;
   llr_t old0, old1, old2, old3, old4, old5, old6, old7;
   llr_t new0, new1, new2, new3, new4, new5, new6, new7;
   llr_t m_b0, m_b1, m_b2, m_b3, m_b4,m_b5, m_b6, m_b7;
@@ -897,7 +897,7 @@ unsigned char phy_threegpplte_turbo_decoder_scalar(llr_t *y,
   unsigned char crc_len,temp;
 
   if (crc_type > 3) {
-    msg("Illegal crc length!\n");
+    fprintf(stderr,"Illegal crc length!\n");
     return 255;
   }
 
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
index 83a50f214b202be4823acbc667d5c7041b61b1e6..ef0ca48df465971ed2b89b66068f366a4937a519 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
@@ -37,9 +37,9 @@
 ///
 ///
 
-#ifdef __AVX2__
 
-#include "PHY/sse_intrin.h"
+
+
 
 #ifndef TEST_DEBUG
 #include "PHY/defs.h"
@@ -58,6 +58,8 @@
 #include "mex.h"
 #endif
 
+#ifdef __AVX2__
+#include "PHY/sse_intrin.h"
 
 //#define DEBUG_LOGMAP
 
@@ -837,7 +839,7 @@ void free_td16avx2(void)
   }
 }
 
-void init_td16avx2()
+void init_td16avx2(void)
 {
 
   int ind,i,i2,i3,j,n,pi,pi2_i,pi2_pi;
@@ -1408,6 +1410,36 @@ unsigned char phy_threegpplte_turbo_decoder16avx2(int16_t *y,
 #endif
   return(iteration_cnt);
 }
+#else  //__AVX2__
+unsigned char phy_threegpplte_turbo_decoder16avx2(int16_t *y,
+						  int16_t *y2,
+						  uint8_t *decoded_bytes,
+						  uint8_t *decoded_bytes2,
+						  uint16_t n,
+						  uint16_t f1,
+						  uint16_t f2,
+						  uint8_t max_iterations,
+						  uint8_t crc_type,
+						  uint8_t F,
+						  time_stats_t *init_stats,
+						  time_stats_t *alpha_stats,
+						  time_stats_t *beta_stats,
+						  time_stats_t *gamma_stats,
+						  time_stats_t *ext_stats,
+						  time_stats_t *intl1_stats,
+						  time_stats_t *intl2_stats)
+{
+   return 0;
+}
+void free_td16avx2(void)
+{
+
+}
+
+void init_td16avx2(void)
+{
+    
+}
 
 #endif //__AVX2__
 
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
index a32edd711d338698b0acdaf5949d19b200a2b24e..63896924dd58db13a3aa2cf0088c1953e0e94862 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
@@ -1124,7 +1124,7 @@ void free_td16(void)
   }
 }
 
-void init_td16()
+void init_td16(void)
 {
 
   int ind,i,i2,i3,j,n,pi,pi3;
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
index 4754e26f38bc673595f16377682b37601869c713..f7b64b767d3a38d45ad723fe49ddff5f8aa3dab8 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
@@ -849,7 +849,7 @@ void free_td8(void)
 
 extern RAN_CONTEXT_t RC;
 
-void init_td8()
+void init_td8(void)
 {
 
   int ind,i,j,n,n2,pi,pi3;
diff --git a/openair1/PHY/CODING/coding_load.c b/openair1/PHY/CODING/coding_load.c
new file mode 100644
index 0000000000000000000000000000000000000000..c8aed8cf30898222cbef82412c2b584fbcf8dac3
--- /dev/null
+++ b/openair1/PHY/CODING/coding_load.c
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.0  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file openair1/PHY/CODING
+ * \brief: load library implementing coding/decoding algorithms
+ * \author Francois TABURET
+ * \date 2017
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+#include <sys/types.h>
+#include "PHY/defs.h"
+#include "common/utils/load_module_shlib.h" 
+
+
+loader_shlibfunc_t shlib_fdesc[DECODE_NUM_FPTR];
+
+decoder_if_t    decoder16;
+decoder_if_t    decoder8;
+encoder_if_t    encoder;
+
+extern int _may_i_use_cpu_feature(unsigned __int64);
+uint8_t  nodecod(short *y,
+    short *y2,
+    unsigned char *decoded_bytes,
+    unsigned char *decoded_bytes2,
+    unsigned short n,
+    unsigned short f1,
+    unsigned short f2,
+    unsigned char max_iterations,
+    unsigned char crc_type,
+    unsigned char F,
+    time_stats_t *init_stats,
+    time_stats_t *alpha_stats,
+    time_stats_t *beta_stats,
+    time_stats_t *gamma_stats,
+    time_stats_t *ext_stats,
+    time_stats_t *intl1_stats,
+    time_stats_t *intl2_stats)
+{
+ printf(".");
+ return max_iterations+1;
+};
+
+void decoding_setmode (int mode) {
+   switch (mode) {
+       case MODE_DECODE_NONE:
+          decoder8=nodecod;
+          decoder16=nodecod;
+          encoder=(encoder_if_t)shlib_fdesc[ENCODE_C_FPTRIDX].fptr;
+       break;
+       case MODE_DECODE_SSE:
+          decoder8=(decoder_if_t)shlib_fdesc[DECODE_TD8_SSE_FPTRIDX].fptr; 
+          decoder16=(decoder_if_t)shlib_fdesc[DECODE_TD16_SSE_FPTRIDX].fptr;
+          encoder=(encoder_if_t)shlib_fdesc[ENCODE_SSE_FPTRIDX].fptr;
+       break;
+       case MODE_DECODE_C:
+          decoder16=(decoder_if_t)shlib_fdesc[DECODE_TD_C_FPTRIDX].fptr;
+          decoder8=(decoder_if_t)shlib_fdesc[DECODE_TD_C_FPTRIDX].fptr;
+          encoder=(encoder_if_t)shlib_fdesc[ENCODE_C_FPTRIDX].fptr;   
+       break;
+       case MODE_DECODE_AVX2:
+          decoder16=(decoder_if_t)shlib_fdesc[DECODE_TD16_AVX2_FPTRIDX].fptr;
+          decoder8=(decoder_if_t)shlib_fdesc[DECODE_TD8_SSE_FPTRIDX].fptr; 
+          encoder=(encoder_if_t)shlib_fdesc[ENCODE_SSE_FPTRIDX].fptr;  
+       break;
+   }
+
+}
+
+
+int load_codinglib(void) {
+ int ret;
+
+ 
+     shlib_fdesc[DECODE_INITTD8_SSE_FPTRIDX].fname = "init_td8";
+     shlib_fdesc[DECODE_INITTD16_SSE_FPTRIDX].fname= "init_td16";
+     shlib_fdesc[DECODE_INITTD_AVX2_FPTRIDX].fname="init_td16avx2";
+
+     shlib_fdesc[DECODE_TD8_SSE_FPTRIDX].fname=   "phy_threegpplte_turbo_decoder8";
+     shlib_fdesc[DECODE_TD16_SSE_FPTRIDX].fname=  "phy_threegpplte_turbo_decoder16";
+     shlib_fdesc[DECODE_TD_C_FPTRIDX].fname=      "phy_threegpplte_turbo_decoder_scalar";
+     shlib_fdesc[DECODE_TD16_AVX2_FPTRIDX].fname= "phy_threegpplte_turbo_decoder16avx2";
+
+
+     shlib_fdesc[DECODE_FREETD8_FPTRIDX].fname =    "free_td8";
+     shlib_fdesc[DECODE_FREETD16_FPTRIDX].fname=    "free_td16";
+     shlib_fdesc[DECODE_FREETD_AVX2_FPTRIDX].fname= "free_td16avx2";    
+
+     shlib_fdesc[ENCODE_SSE_FPTRIDX].fname=    "threegpplte_turbo_encoder_sse";
+     shlib_fdesc[ENCODE_C_FPTRIDX].fname=      "threegpplte_turbo_encoder";
+     shlib_fdesc[ENCODE_INIT_SSE_FPTRIDX].fname=       "init_encoder_sse";
+     ret=load_module_shlib("coding",shlib_fdesc,DECODE_NUM_FPTR);
+     if (ret < 0) exit_fun("Error loading coding library");
+
+/* execute encoder/decoder init functions */     
+     shlib_fdesc[DECODE_INITTD8_SSE_FPTRIDX].fptr();
+     shlib_fdesc[DECODE_INITTD16_SSE_FPTRIDX].fptr();
+     shlib_fdesc[DECODE_INITTD_AVX2_FPTRIDX].fptr();
+     shlib_fdesc[ENCODE_INIT_SSE_FPTRIDX].fptr();
+     decoding_setmode(MODE_DECODE_SSE);
+     
+return 0;
+}
+
+void free_codinglib(void) {
+
+     shlib_fdesc[DECODE_FREETD8_FPTRIDX].fptr();
+     shlib_fdesc[DECODE_FREETD16_FPTRIDX].fptr();
+     shlib_fdesc[DECODE_FREETD_AVX2_FPTRIDX].fptr();
+
+
+}
diff --git a/openair1/PHY/CODING/defs.h b/openair1/PHY/CODING/defs.h
index 22339953c39afee26c0808b18bdb7e43ad846a9a..ce13e045f319ed6fdb584e7bddfb5bfe6c71c4a5 100644
--- a/openair1/PHY/CODING/defs.h
+++ b/openair1/PHY/CODING/defs.h
@@ -292,9 +292,7 @@ void ccodedot11_init(void);
 \brief This function initializes the trellis structure for decoding an 802.11 convolutional code.*/
 void ccodedot11_init_inv(void);
 
-/*!\fn void teillis_table_init(void)
-\brief This function initializes the trellis structure for 3GPP LTE Turbo code.*/
-void treillis_table_init(void);
+
 
 /*\fn void threegpplte_turbo_encoder(uint8_t *input,uint16_t input_length_bytes,uint8_t *output,uint8_t F,uint16_t interleaver_f1,uint16_t interleaver_f2)
 \brief This function implements a rate 1/3 8-state parralel concatenated turbo code (3GPP-LTE).
@@ -352,35 +350,7 @@ void ccodedab_init_inv(void);
 \brief This function initializes the different crc tables.*/
 void crcTableInit (void);
 
-/*!\fn void free_td8(void)
-\brief This function frees the tables for 8-bit LLR Turbo decoder.*/
-void free_td8(void);
-
-/*!\fn void init_td8(void)
-\brief This function initializes the tables for 8-bit LLR Turbo decoder.*/
-void init_td8 (void);
-
-/*!\fn void free_td16(void)
-\brief This function frees the tables for 16-bit LLR Turbo decoder.*/
-void free_td16(void);
-
-/*!\fn void init_td16(void)
-\brief This function initializes the tables for 16-bit LLR Turbo decoder.*/
-void init_td16 (void);
 
-#ifdef __AVX2__
-/*!\fn void init_td8(void)
-\brief This function initializes the tables for 8-bit LLR Turbo decoder (AVX2).*/
-void init_td8avx2 (void);
-
-/*!\fn void free_td16avx2(void)
-\brief This function frees the tables for 16-bit LLR Turbo decoder (AVX2).*/
-void free_td16avx2(void);
-
-/*!\fn void init_td16(void)
-\brief This function initializes the tables for 16-bit LLR Turbo decoder (AVX2).*/
-void init_td16avx2 (void);
-#endif
 
 /*!\fn uint32_t crc24a(uint8_t *inPtr, int32_t bitlen)
 \brief This computes a 24-bit crc ('a' variant for overall transport block)
diff --git a/openair1/PHY/CODING/extern.h b/openair1/PHY/CODING/extern.h
index 9c58920a10d003db6e73768638cbdf594146dd24..0d3e2ccb02e3b050243443603bc0946f414f9745 100644
--- a/openair1/PHY/CODING/extern.h
+++ b/openair1/PHY/CODING/extern.h
@@ -20,5 +20,9 @@
  */
 
 extern unsigned short f1f2mat_old[2*188];
-
-
+extern double cpuf;
+extern decoder_if_t decoder16;
+extern decoder_if_t decoder8;
+extern encoder_if_t encoder;
+extern int load_codinglib(void);
+extern int free_codinglib(void);
diff --git a/openair1/PHY/INIT/init_top.c b/openair1/PHY/INIT/init_top.c
index a1edd9d1eab1de74f6920f0e4afc401d9a3d6996..34e82771b414b94fbaa0d94911a558abe12c4eeb 100644
--- a/openair1/PHY/INIT/init_top.c
+++ b/openair1/PHY/INIT/init_top.c
@@ -34,15 +34,12 @@ void init_lte_top(LTE_DL_FRAME_PARMS *frame_parms)
   ccodelte_init();
   ccodelte_init_inv();
 
-  treillis_table_init();
+
 
   phy_generate_viterbi_tables();
   phy_generate_viterbi_tables_lte();
-  init_td8();
-  init_td16();
-#ifdef __AVX2__
-  init_td16avx2();
-#endif
+
+  load_codinglib();
   lte_sync_time_init(frame_parms);
 
   generate_ul_ref_sigs();
@@ -61,11 +58,7 @@ void init_lte_top(LTE_DL_FRAME_PARMS *frame_parms)
 
 void free_lte_top(void)
 {
-  free_td8();
-  free_td16();
-#ifdef __AVX2__
-  free_td16avx2();
-#endif
+  free_codinglib();
   lte_sync_time_free();
 
   /* free_ul_ref_sigs() is called in phy_free_lte_eNB() */
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
index 7f8c0058eafd271bcc945a2edd52ca1b6e5a3caa..e91665e04eb19e23b7544ba94c1aefb2ab3806fc 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
@@ -286,13 +286,13 @@ int dlsch_encoding_2threads0(te_params *tep) {
 
 
 
-      threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r],
-                                Kr>>3,
-                                &dlsch->harq_processes[harq_pid]->d[r][96],
-                                (r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
-                                f1f2mat_old[iind*2],   // f1 (see 36121-820, page 14)
-                                f1f2mat_old[(iind*2)+1]  // f2 (see 36121-820, page 14)
-                               );
+      encoder(dlsch->harq_processes[harq_pid]->c[r],
+              Kr>>3,
+              &dlsch->harq_processes[harq_pid]->d[r][96],
+              (r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
+              f1f2mat_old[iind*2],   // f1 (see 36121-820, page 14)
+              f1f2mat_old[(iind*2)+1]  // f2 (see 36121-820, page 14)
+             );
       dlsch->harq_processes[harq_pid]->RTC[r] =
         sub_block_interleaving_turbo(4+(Kr_bytes*8),
                                      &dlsch->harq_processes[harq_pid]->d[r][96],
@@ -458,13 +458,13 @@ int dlsch_encoding_2threads(PHY_VARS_eNB *eNB,
 
 
       start_meas(te_stats);
-      threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r],
-                                Kr>>3,
-                                &dlsch->harq_processes[harq_pid]->d[r][96],
-                                (r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
-                                f1f2mat_old[iind*2],   // f1 (see 36121-820, page 14)
-                                f1f2mat_old[(iind*2)+1]  // f2 (see 36121-820, page 14)
-                               );
+      encoder(dlsch->harq_processes[harq_pid]->c[r],
+              Kr>>3,
+              &dlsch->harq_processes[harq_pid]->d[r][96],
+              (r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
+              f1f2mat_old[iind*2],   // f1 (see 36121-820, page 14)
+              f1f2mat_old[(iind*2)+1]  // f2 (see 36121-820, page 14)
+             );
       stop_meas(te_stats);
 
       start_meas(i_stats);
@@ -651,13 +651,13 @@ int dlsch_encoding(PHY_VARS_eNB *eNB,
       printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]);
 #endif
       start_meas(te_stats);
-      threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r],
-                                Kr>>3,
-                                &dlsch->harq_processes[harq_pid]->d[r][96],
-                                (r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
-                                f1f2mat_old[iind*2],   // f1 (see 36121-820, page 14)
-                                f1f2mat_old[(iind*2)+1]  // f2 (see 36121-820, page 14)
-                               );
+      encoder(dlsch->harq_processes[harq_pid]->c[r],
+              Kr>>3,
+              &dlsch->harq_processes[harq_pid]->d[r][96],
+              (r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
+              f1f2mat_old[iind*2],   // f1 (see 36121-820, page 14)
+              f1f2mat_old[(iind*2)+1]  // f2 (see 36121-820, page 14)
+             );
       stop_meas(te_stats);
 #ifdef DEBUG_DLSCH_CODING
 
@@ -833,13 +833,13 @@ int dlsch_encoding_SIC(PHY_VARS_UE *ue,
       printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]);
 #endif
       start_meas(te_stats);
-      threegpplte_turbo_encoder(dlsch->harq_processes[harq_pid]->c[r],
-                                Kr>>3,
-                                &dlsch->harq_processes[harq_pid]->d[r][96],
-                                (r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
-                                f1f2mat_old[iind*2],   // f1 (see 36121-820, page 14)
-                                f1f2mat_old[(iind*2)+1]  // f2 (see 36121-820, page 14)
-                               );
+      encoder(dlsch->harq_processes[harq_pid]->c[r],
+              Kr>>3,
+              &dlsch->harq_processes[harq_pid]->d[r][96],
+              (r==0) ? dlsch->harq_processes[harq_pid]->F : 0,
+              f1f2mat_old[iind*2],   // f1 (see 36121-820, page 14)
+              f1f2mat_old[(iind*2)+1]  // f2 (see 36121-820, page 14)
+             );
       stop_meas(te_stats);
 #ifdef DEBUG_DLSCH_CODING
 
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
index 697164110bfd5c2400f7117365ca79e6e1ec1794..4020056e6f68043a591f4792c287202e49a76ab0 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
@@ -39,7 +39,6 @@
 //#define DEBUG_DLSCH_DECODING
 //#define UE_DEBUG_TRACE 1
 
-extern double cpuf;
 
 void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch)
 {
@@ -206,21 +205,7 @@ uint32_t  dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
 		    time_stats_t *);
 
 #endif
-  uint8_t (*tc)(int16_t *y,
-                uint8_t *,
-                uint16_t,
-                uint16_t,
-                uint16_t,
-                uint8_t,
-                uint8_t,
-                uint8_t,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *);
+decoder_if_t tc;
 
 
 
@@ -255,13 +240,13 @@ uint32_t  dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
 #if 0
     tc_2cw = phy_threegpplte_turbo_decoder16avx2;
 #endif
-    tc = phy_threegpplte_turbo_decoder16;
+    tc = decoder16;
   }
   else
   {
 	  AssertFatal (harq_process->TBS >= 256 , "Mismatch flag nbRB=%d TBS=%d mcs=%d Qm=%d RIV=%d round=%d \n",
 			  harq_process->nb_rb, harq_process->TBS,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
-	    tc = phy_threegpplte_turbo_decoder8;
+	    tc = decoder8;
   }
 
 
@@ -490,7 +475,9 @@ uint32_t  dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
       LOG_D(PHY,"AbsSubframe %d.%d Start turbo segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
       ret = tc
             (&harq_process->d[r][96],
+             NULL,
              harq_process->c[r],
+             NULL,
              Kr,
              f1f2mat_old[iind*2],
              f1f2mat_old[(iind*2)+1],
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
index 9b761f3cc3b4065ba462aa52f18299b62443fa94..09420f48ab1a7029fdbbb2015fd7f28f47ffcd8c 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
@@ -371,13 +371,13 @@ uint32_t ulsch_encoding(uint8_t *a,
         printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]);
 #endif
         start_meas(te_stats);
-        threegpplte_turbo_encoder(ulsch->harq_processes[harq_pid]->c[r],
-                                  Kr>>3,
-                                  &ulsch->harq_processes[harq_pid]->d[r][96],
-                                  (r==0) ? ulsch->harq_processes[harq_pid]->F : 0,
-                                  f1f2mat_old[iind*2],   // f1 (see 36212-820, page 14)
-                                  f1f2mat_old[(iind*2)+1]  // f2 (see 36212-820, page 14)
-                                 );
+        encoder(ulsch->harq_processes[harq_pid]->c[r],
+        	Kr>>3,
+        	&ulsch->harq_processes[harq_pid]->d[r][96],
+        	(r==0) ? ulsch->harq_processes[harq_pid]->F : 0,
+        	f1f2mat_old[iind*2],   // f1 (see 36212-820, page 14)
+        	f1f2mat_old[(iind*2)+1]  // f2 (see 36212-820, page 14)
+               );
         stop_meas(te_stats);
 #ifdef DEBUG_ULSCH_CODING
 
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
index 57087051d3c9d251382809eb3425189d88625872..0d9bf8fd7611b89703fcfed195490a30294570ed 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
@@ -242,27 +242,12 @@ int ulsch_decoding_data_2thread0(td_params* tdp) {
   uint32_t E=0;
   uint32_t Gp,GpmodC,Nl=1;
   uint32_t C = ulsch_harq->C;
-
-  uint8_t (*tc)(int16_t *y,
-                uint8_t *,
-                uint16_t,
-                uint16_t,
-                uint16_t,
-                uint8_t,
-                uint8_t,
-                uint8_t,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *);
+  decoder_if_t tc;
 
   if (llr8_flag == 0)
-    tc = phy_threegpplte_turbo_decoder16;
+    tc = decoder16;
   else
-    tc = phy_threegpplte_turbo_decoder8;
+    tc = decoder8;
 
 
 
@@ -385,7 +370,9 @@ int ulsch_decoding_data_2thread0(td_params* tdp) {
     
     
     ret = tc(&ulsch_harq->d[r][96],
+             NULL,
 	     ulsch_harq->c[r],
+             NULL,
 	     Kr,
 	     f1f2mat_old[iind*2],
 	     f1f2mat_old[(iind*2)+1],
@@ -463,22 +450,7 @@ int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr
   int G = ulsch_harq->G;
   unsigned int E;
   int Cby2;
-
-  uint8_t (*tc)(int16_t *y,
-                uint8_t *,
-                uint16_t,
-                uint16_t,
-                uint16_t,
-                uint8_t,
-                uint8_t,
-                uint8_t,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *);
+  decoder_if_t tc;
 
   struct timespec wait;
 
@@ -487,9 +459,9 @@ int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr
 
 
   if (llr8_flag == 0)
-    tc = phy_threegpplte_turbo_decoder16;
+    tc = decoder16;
   else
-    tc = phy_threegpplte_turbo_decoder8;
+    tc = decoder8;
 
   if (ulsch_harq->C>1) { // wakeup worker if more than 1 segment
     if (pthread_mutex_timedlock(&proc->mutex_td,&wait) != 0) {
@@ -608,7 +580,9 @@ int ulsch_decoding_data_2thread(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr
     start_meas(&eNB->ulsch_turbo_decoding_stats);
     
     ret = tc(&ulsch_harq->d[r][96],
+             NULL,
 	     ulsch_harq->c[r],
+             NULL,
 	     Kr,
 	     f1f2mat_old[iind*2],
 	     f1f2mat_old[(iind*2)+1],
@@ -670,27 +644,12 @@ int ulsch_decoding_data(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag)
 
   int G = ulsch_harq->G;
   unsigned int E;
-
-  uint8_t (*tc)(int16_t *y,
-                uint8_t *,
-                uint16_t,
-                uint16_t,
-                uint16_t,
-                uint8_t,
-                uint8_t,
-                uint8_t,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *,
-                time_stats_t *);
+  decoder_if_t tc;
 
   if (llr8_flag == 0)
-    tc = phy_threegpplte_turbo_decoder16;
+    tc = *decoder16;
   else
-    tc = phy_threegpplte_turbo_decoder8;
+    tc = *decoder8;
 
 
   for (r=0; r<ulsch_harq->C; r++) {
@@ -773,7 +732,9 @@ int ulsch_decoding_data(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag)
     start_meas(&eNB->ulsch_turbo_decoding_stats);
     
     ret = tc(&ulsch_harq->d[r][96],
+             NULL,
 	     ulsch_harq->c[r],
+             NULL,
 	     Kr,
 	     f1f2mat_old[iind*2],
 	     f1f2mat_old[(iind*2)+1],
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index 46f37e943102c0a986302f2264c91bcf9da841eb..a12a0fd21078ade08e5e513710769e26a1c61525 100644
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -1461,6 +1461,53 @@ extern pthread_cond_t sync_cond;
 extern pthread_mutex_t sync_mutex;
 extern int sync_var;
 
+
+#define MODE_DECODE_NONE         0
+#define MODE_DECODE_SSE          1
+#define MODE_DECODE_C            2
+#define MODE_DECODE_AVX2         3
+
+#define DECODE_INITTD8_SSE_FPTRIDX   0
+#define DECODE_INITTD16_SSE_FPTRIDX  1
+#define DECODE_INITTD_AVX2_FPTRIDX   2
+#define DECODE_TD8_SSE_FPTRIDX       3
+#define DECODE_TD16_SSE_FPTRIDX      4
+#define DECODE_TD_C_FPTRIDX          5
+#define DECODE_TD16_AVX2_FPTRIDX     6
+#define DECODE_FREETD8_FPTRIDX       7
+#define DECODE_FREETD16_FPTRIDX      8
+#define DECODE_FREETD_AVX2_FPTRIDX   9
+#define ENCODE_SSE_FPTRIDX           10
+#define ENCODE_C_FPTRIDX             11
+#define ENCODE_INIT_SSE_FPTRIDX      12
+#define DECODE_NUM_FPTR              13
+
+
+typedef uint8_t(*decoder_if_t)(int16_t *y,
+                               int16_t *y2,
+    		               uint8_t *decoded_bytes,
+    		               uint8_t *decoded_bytes2,
+	   		       uint16_t n,
+	   		       uint16_t f1,
+	   		       uint16_t f2,
+	   		       uint8_t max_iterations,
+	   		       uint8_t crc_type,
+	   		       uint8_t F,
+	   		       time_stats_t *init_stats,
+	   		       time_stats_t *alpha_stats,
+	   		       time_stats_t *beta_stats,
+	   		       time_stats_t *gamma_stats,
+	   		       time_stats_t *ext_stats,
+	   		       time_stats_t *intl1_stats,
+                               time_stats_t *intl2_stats);
+
+typedef uint8_t(*encoder_if_t)(uint8_t *input,
+                               uint16_t input_length_bytes,
+                               uint8_t *output,
+                               uint8_t F,
+                               uint16_t interleaver_f1,
+                               uint16_t interleaver_f2);
+
 #define MAX_RRU_CONFIG_SIZE 1024
 typedef enum {
   RAU_tick=0,
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 912e756f7654aef4171ec95313bb79b77eb8f8d6..6c2e580947da2ebde0616ccd04a83174e2ceefa4 100644
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -650,7 +650,7 @@ void uci_procedures(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc)
 {
   LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
   uint8_t SR_payload = 0,pucch_b0b1[4][2]= {{0,0},{0,0},{0,0},{0,0}},harq_ack[4]={0,0,0,0};
-  int32_t metric[4]={0,0,0,0},metric_SR=0,max_metric;
+  int32_t metric[4]={0,0,0,0},metric_SR=0,max_metric=0;
   const int subframe = proc->subframe_rx;
   const int frame = proc->frame_rx;
   int i;
diff --git a/openair2/ENB_APP/L1_paramdef.h b/openair2/ENB_APP/L1_paramdef.h
new file mode 100644
index 0000000000000000000000000000000000000000..8eef55b718d5dbe995f7390a924c9b9090a74830
--- /dev/null
+++ b/openair2/ENB_APP/L1_paramdef.h
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.0  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file openair2/ENB_APP/L1_paramdef.f
+ * \brief definition of configuration parameters for all eNodeB modules 
+ * \author Francois TABURET
+ * \date 2017
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+
+
+/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+/* L1 configuration parameters names   */
+#define CONFIG_STRING_L1_CC                                "num_cc"
+#define CONFIG_STRING_L1_LOCAL_N_IF_NAME                   "local_n_if_name"
+#define CONFIG_STRING_L1_LOCAL_N_ADDRESS                   "local_n_address"
+#define CONFIG_STRING_L1_REMOTE_N_ADDRESS                  "remote_n_address"
+#define CONFIG_STRING_L1_LOCAL_N_PORTC                     "local_n_portc"
+#define CONFIG_STRING_L1_REMOTE_N_PORTC                    "remote_n_portc"
+#define CONFIG_STRING_L1_LOCAL_N_PORTD                     "local_n_portd"
+#define CONFIG_STRING_L1_REMOTE_N_PORTD                    "remote_n_portd"
+#define CONFIG_STRING_L1_TRANSPORT_N_PREFERENCE            "tr_n_preference"
+
+/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
+/*                                            L1 configuration parameters                                                                             */
+/*   optname                                         helpstr   paramflags    XXXptr              defXXXval                  type           numelt     */
+/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
+#define L1PARAMS_DESC { \
+{CONFIG_STRING_L1_CC,                                NULL,      0,         uptr:NULL,           defintval:1,               TYPE_UINT,     0},         \
+{CONFIG_STRING_L1_TRANSPORT_N_PREFERENCE,            NULL,      0,         strptr:NULL,         defstrval:"local_mac",     TYPE_STRING,   0},         \
+{CONFIG_STRING_L1_LOCAL_N_IF_NAME,                   NULL,      0,         strptr:NULL,         defstrval:"lo",            TYPE_STRING,   0},         \
+{CONFIG_STRING_L1_LOCAL_N_ADDRESS,                   NULL,      0,         strptr:NULL,         defstrval:"127.0.0.1",     TYPE_STRING,   0},         \
+{CONFIG_STRING_L1_REMOTE_N_ADDRESS,                  NULL,      0,         strptr:NULL,         defstrval:"127.0.0.2",     TYPE_STRING,   0},         \
+{CONFIG_STRING_L1_LOCAL_N_PORTC,                     NULL,      0,         uptr:NULL,           defintval:50030,           TYPE_UINT,     0},         \
+{CONFIG_STRING_L1_REMOTE_N_PORTC,                    NULL,      0,         uptr:NULL,           defintval:50030,           TYPE_UINT,     0},         \
+{CONFIG_STRING_L1_LOCAL_N_PORTD,                     NULL,      0,         uptr:NULL,           defintval:50031,           TYPE_UINT,     0},         \
+{CONFIG_STRING_L1_REMOTE_N_PORTD,                    NULL,      0,         uptr:NULL,           defintval:50031,           TYPE_UINT,     0},         \
+}
+#define L1_CC_IDX                                          0
+#define L1_TRANSPORT_N_PREFERENCE_IDX                      1
+#define L1_LOCAL_N_IF_NAME_IDX                             2
+#define L1_LOCAL_N_ADDRESS_IDX                             3
+#define L1_REMOTE_N_ADDRESS_IDX                            4
+#define L1_LOCAL_N_PORTC_IDX                               5
+#define L1_REMOTE_N_PORTC_IDX                              6
+#define L1_LOCAL_N_PORTD_IDX                               7
+#define L1_REMOTE_N_PORTD_IDX                              8
+
+/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
diff --git a/openair2/ENB_APP/MACRLC_paramdef.h b/openair2/ENB_APP/MACRLC_paramdef.h
new file mode 100644
index 0000000000000000000000000000000000000000..868917a0ab64eb921d85ba2f31a16f5d1f8e383e
--- /dev/null
+++ b/openair2/ENB_APP/MACRLC_paramdef.h
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.0  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file openair2/ENB_APP/MACRLC_paramdef.f
+ * \brief definition of configuration parameters for all eNodeB modules 
+ * \author Francois TABURET
+ * \date 2017
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+
+
+
+/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+/* MACRLC configuration parameters names   */
+#define CONFIG_STRING_MACRLC_CC                            "num_cc"
+#define CONFIG_STRING_MACRLC_TRANSPORT_N_PREFERENCE        "tr_n_preference"
+#define CONFIG_STRING_MACRLC_LOCAL_N_IF_NAME               "local_n_if_name"
+#define CONFIG_STRING_MACRLC_LOCAL_N_ADDRESS               "local_n_address"
+#define CONFIG_STRING_MACRLC_REMOTE_N_ADDRESS              "remote_n_address"
+#define CONFIG_STRING_MACRLC_LOCAL_N_PORTC                 "local_n_portc"
+#define CONFIG_STRING_MACRLC_REMOTE_N_PORTC                "remote_n_portc"
+#define CONFIG_STRING_MACRLC_LOCAL_N_PORTD                 "local_n_portd"
+#define CONFIG_STRING_MACRLC_REMOTE_N_PORTD                "remote_n_portd"
+#define CONFIG_STRING_MACRLC_TRANSPORT_S_PREFERENCE        "tr_s_preference"
+#define CONFIG_STRING_MACRLC_LOCAL_S_IF_NAME               "local_s_if_name"
+#define CONFIG_STRING_MACRLC_LOCAL_S_ADDRESS               "local_s_address"
+#define CONFIG_STRING_MACRLC_REMOTE_S_ADDRESS              "remote_s_address"
+#define CONFIG_STRING_MACRLC_LOCAL_S_PORTC                 "local_s_portc"
+#define CONFIG_STRING_MACRLC_REMOTE_S_PORTC                "remote_s_portc"
+#define CONFIG_STRING_MACRLC_LOCAL_S_PORTD                 "local_s_portd"
+#define CONFIG_STRING_MACRLC_REMOTE_S_PORTD                "remote_s_portd"
+
+
+/*-------------------------------------------------------------------------------------------------------------------------------------------------------*/
+/*                                            MacRLC  configuration parameters                                                                           */
+/*   optname                                            helpstr   paramflags    XXXptr              defXXXval                  type           numelt     */
+/*-------------------------------------------------------------------------------------------------------------------------------------------------------*/
+#define MACRLCPARAMS_DESC { \
+{CONFIG_STRING_MACRLC_CC,                                NULL,     0,          uptr:NULL,           defintval:50011,           TYPE_UINT,     0},        \
+{CONFIG_STRING_MACRLC_TRANSPORT_N_PREFERENCE,            NULL,     0,          strptr:NULL,         defstrval:"local_L1",      TYPE_STRING,   0},        \
+{CONFIG_STRING_MACRLC_LOCAL_N_IF_NAME,                   NULL,     0,          strptr:NULL,         defstrval:"lo",            TYPE_STRING,   0},        \
+{CONFIG_STRING_MACRLC_LOCAL_N_ADDRESS,                   NULL,     0,          strptr:NULL,         defstrval:"127.0.0.1",     TYPE_STRING,   0},        \
+{CONFIG_STRING_MACRLC_REMOTE_N_ADDRESS,                  NULL,     0,          uptr:NULL,           defstrval:"127.0.0.2",     TYPE_STRING,   0},        \
+{CONFIG_STRING_MACRLC_LOCAL_N_PORTC,                     NULL,     0,          uptr:NULL,           defintval:50010,           TYPE_UINT,     0},        \
+{CONFIG_STRING_MACRLC_REMOTE_N_PORTC,                    NULL,     0,          uptr:NULL,           defintval:50010,           TYPE_UINT,     0},        \
+{CONFIG_STRING_MACRLC_LOCAL_N_PORTD,                     NULL,     0,          uptr:NULL,           defintval:50011,           TYPE_UINT,     0},        \
+{CONFIG_STRING_MACRLC_REMOTE_N_PORTD,                    NULL,     0,          uptr:NULL,           defintval:50011,           TYPE_UINT,     0},        \
+{CONFIG_STRING_MACRLC_TRANSPORT_S_PREFERENCE,            NULL,     0,          strptr:NULL,         defstrval:"local_RRC",     TYPE_STRING,   0},        \
+{CONFIG_STRING_MACRLC_LOCAL_S_IF_NAME,                   NULL,     0,          strptr:NULL,         defstrval:"lo",            TYPE_STRING,   0},        \
+{CONFIG_STRING_MACRLC_LOCAL_S_ADDRESS,                   NULL,     0,          uptr:NULL,           defstrval:"127.0.0.1",     TYPE_STRING,   0},        \
+{CONFIG_STRING_MACRLC_REMOTE_S_ADDRESS,                  NULL,     0,          uptr:NULL,           defstrval:"127.0.0.2",     TYPE_STRING,   0},        \
+{CONFIG_STRING_MACRLC_LOCAL_S_PORTC,                     NULL,     0,          uptr:NULL,           defintval:50020,           TYPE_UINT,     0},        \
+{CONFIG_STRING_MACRLC_REMOTE_S_PORTC,                    NULL,     0,          uptr:NULL,           defintval:50020,           TYPE_UINT,     0},        \
+{CONFIG_STRING_MACRLC_LOCAL_S_PORTD,                     NULL,     0,          uptr:NULL,           defintval:50021,           TYPE_UINT,     0},        \
+{CONFIG_STRING_MACRLC_REMOTE_S_PORTD,                    NULL,     0,          uptr:NULL,           defintval:50021,           TYPE_UINT,     0},        \
+}
+#define MACRLC_CC_IDX                                          0
+#define MACRLC_TRANSPORT_N_PREFERENCE_IDX                      1
+#define MACRLC_LOCAL_N_IF_NAME_IDX                             2
+#define MACRLC_LOCAL_N_ADDRESS_IDX                             3
+#define MACRLC_REMOTE_N_ADDRESS_IDX                            4
+#define MACRLC_LOCAL_N_PORTC_IDX                               5
+#define MACRLC_REMOTE_N_PORTC_IDX                              6
+#define MACRLC_LOCAL_N_PORTD_IDX                               7
+#define MACRLC_REMOTE_N_PORTD_IDX                              8
+#define MACRLC_TRANSPORT_S_PREFERENCE_IDX                      9
+#define MACRLC_LOCAL_S_IF_NAME_IDX                             10
+#define MACRLC_LOCAL_S_ADDRESS_IDX                             11
+#define MACRLC_REMOTE_S_ADDRESS_IDX                            12
+#define MACRLC_LOCAL_S_PORTC_IDX                               13
+#define MACRLC_REMOTE_S_PORTC_IDX                              14
+#define MACRLC_LOCAL_S_PORTD_IDX                               15
+#define MACRLC_REMOTE_S_PORTD_IDX                              16
+/*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
diff --git a/openair2/ENB_APP/RRC_config_tools.c b/openair2/ENB_APP/RRC_config_tools.c
new file mode 100644
index 0000000000000000000000000000000000000000..17fbad1e18c542a38fe72c0b8f68f4a7078116c0
--- /dev/null
+++ b/openair2/ENB_APP/RRC_config_tools.c
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*
+  RRC_config_tools.c
+  -------------------
+  AUTHOR  : Francois TABURET
+  COMPANY : NOKIA BellLabs France
+  EMAIL   : francois.taburet@nokia-bell-labs.com 
+
+*/
+
+#include <string.h>
+#include <inttypes.h>
+
+#include "log.h"
+#include "log_extern.h"
+#include "assertions.h"
+#if defined(ENABLE_ITTI)
+# include "intertask_interface.h"
+# if defined(ENABLE_USE_MME)
+#   include "s1ap_eNB.h"
+#   include "sctp_eNB_task.h"
+# endif
+#endif
+#include "SystemInformationBlockType2.h"
+#include "common/config/config_userapi.h"
+#include "RRC_config_tools.h"
+#include "DL-GapConfig-NB-r13.h"
+#include "NPRACH-Parameters-NB-r13.h"
+
+static const eutra_band_t eutra_bands[] = {
+  { 1, 1920    * MHz, 1980    * MHz, 2110    * MHz, 2170    * MHz, FDD},
+  { 2, 1850    * MHz, 1910    * MHz, 1930    * MHz, 1990    * MHz, FDD},
+  { 3, 1710    * MHz, 1785    * MHz, 1805    * MHz, 1880    * MHz, FDD},
+  { 4, 1710    * MHz, 1755    * MHz, 2110    * MHz, 2155    * MHz, FDD},
+  { 5,  824    * MHz,  849    * MHz,  869    * MHz,  894    * MHz, FDD},
+  { 6,  830    * MHz,  840    * MHz,  875    * MHz,  885    * MHz, FDD},
+  { 7, 2500    * MHz, 2570    * MHz, 2620    * MHz, 2690    * MHz, FDD},
+  { 8,  880    * MHz,  915    * MHz,  925    * MHz,  960    * MHz, FDD},
+  { 9, 1749900 * KHz, 1784900 * KHz, 1844900 * KHz, 1879900 * KHz, FDD},
+  {10, 1710    * MHz, 1770    * MHz, 2110    * MHz, 2170    * MHz, FDD},
+  {11, 1427900 * KHz, 1452900 * KHz, 1475900 * KHz, 1500900 * KHz, FDD},
+  {12,  698    * MHz,  716    * MHz,  728    * MHz,  746    * MHz, FDD},
+  {13,  777    * MHz,  787    * MHz,  746    * MHz,  756    * MHz, FDD},
+  {14,  788    * MHz,  798    * MHz,  758    * MHz,  768    * MHz, FDD},
+
+  {17,  704    * MHz,  716    * MHz,  734    * MHz,  746    * MHz, FDD},
+  {20,  832    * MHz,  862    * MHz,  791    * MHz,  821    * MHz, FDD},
+  {33, 1900    * MHz, 1920    * MHz, 1900    * MHz, 1920    * MHz, TDD},
+  {33, 1900    * MHz, 1920    * MHz, 1900    * MHz, 1920    * MHz, TDD},
+  {34, 2010    * MHz, 2025    * MHz, 2010    * MHz, 2025    * MHz, TDD},
+  {35, 1850    * MHz, 1910    * MHz, 1850    * MHz, 1910    * MHz, TDD},
+  {36, 1930    * MHz, 1990    * MHz, 1930    * MHz, 1990    * MHz, TDD},
+  {37, 1910    * MHz, 1930    * MHz, 1910    * MHz, 1930    * MHz, TDD},
+  {38, 2570    * MHz, 2620    * MHz, 2570    * MHz, 2630    * MHz, TDD},
+  {39, 1880    * MHz, 1920    * MHz, 1880    * MHz, 1920    * MHz, TDD},
+  {40, 2300    * MHz, 2400    * MHz, 2300    * MHz, 2400    * MHz, TDD},
+  {41, 2496    * MHz, 2690    * MHz, 2496    * MHz, 2690    * MHz, TDD},
+  {42, 3400    * MHz, 3600    * MHz, 3400    * MHz, 3600    * MHz, TDD},
+  {43, 3600    * MHz, 3800    * MHz, 3600    * MHz, 3800    * MHz, TDD},
+  {44, 703    * MHz, 803    * MHz, 703    * MHz, 803    * MHz, TDD},
+};
+
+
+int config_check_band_frequencies(    int ind,
+                                      int16_t band,
+                                      uint32_t downlink_frequency,
+                                      int32_t uplink_frequency_offset,
+                                      uint32_t  frame_type)
+{
+  int errors = 0;
+
+  if (band > 0) {
+    int band_index;
+
+    for (band_index = 0; band_index < sizeof (eutra_bands) / sizeof (eutra_bands[0]); band_index++) {
+      if (band == eutra_bands[band_index].band) {
+        uint32_t uplink_frequency = downlink_frequency + uplink_frequency_offset;
+
+        AssertError (eutra_bands[band_index].dl_min < downlink_frequency, errors ++,
+                     "enb %d downlink frequency %u too low (%u) for band %d!",
+                     ind, downlink_frequency, eutra_bands[band_index].dl_min, band);
+        AssertError (downlink_frequency < eutra_bands[band_index].dl_max, errors ++,
+                     "enb %d downlink frequency %u too high (%u) for band %d!",
+                     ind, downlink_frequency, eutra_bands[band_index].dl_max, band);
+
+        AssertError (eutra_bands[band_index].ul_min < uplink_frequency, errors ++,
+                     "enb %d uplink frequency %u too low (%u) for band %d!",
+                     ind, uplink_frequency, eutra_bands[band_index].ul_min, band);
+        AssertError (uplink_frequency < eutra_bands[band_index].ul_max, errors ++,
+                     "enb %d uplink frequency %u too high (%u) for band %d!",
+                     ind, uplink_frequency, eutra_bands[band_index].ul_max, band);
+
+        AssertError (eutra_bands[band_index].frame_type == frame_type, errors ++,
+                     "enb %d invalid frame type (%d/%d) for band %d!",
+                     ind, eutra_bands[band_index].frame_type, frame_type, band);
+      }
+    }
+  }
+
+
+  return errors;
+}
+
diff --git a/openair2/ENB_APP/RRC_config_tools.h b/openair2/ENB_APP/RRC_config_tools.h
new file mode 100644
index 0000000000000000000000000000000000000000..a44da1f90c5d93a706f7a29e575cedd2989645ff
--- /dev/null
+++ b/openair2/ENB_APP/RRC_config_tools.h
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*
+  RRC_config_tools.h
+  -------------------
+  AUTHOR  : Francois TABURET
+  COMPANY : NOKIA BellLabs France
+  EMAIL   : francois.taburet@nokia-bell-labs.com
+*/
+#ifndef RRC_CONFIG_TOOLS_H_
+#define RRC_CONFIG_TOOLS_H_
+
+#define KHz (1000UL)
+#define MHz (1000 * KHz)
+
+typedef struct eutra_band_s {
+  int16_t             band;
+  uint32_t            ul_min;
+  uint32_t            ul_max;
+  uint32_t            dl_min;
+  uint32_t            dl_max;
+  lte_frame_type_t    frame_type;
+} eutra_band_t;
+
+
+extern int config_check_band_frequencies(int ind, int16_t band, uint32_t downlink_frequency, 
+                                         int32_t uplink_frequency_offset, uint32_t  frame_type);
+
+extern int config_check_assign_DLGap_NB(paramdef_t *param);
+extern int config_check_assign_rach_NB(paramdef_t *param);
+#endif
diff --git a/openair2/ENB_APP/RRC_paramsvalues.h b/openair2/ENB_APP/RRC_paramsvalues.h
new file mode 100644
index 0000000000000000000000000000000000000000..fb375e1a09f63cce06a593ccf4a662bba48e0f40
--- /dev/null
+++ b/openair2/ENB_APP/RRC_paramsvalues.h
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.0  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file openair2/ENB_APP/RRC_paramsvalues.h
+ * \brief macro definitions for RRC authorized and asn1 parameters values, to be used in paramdef_t/chechedparam_t structure initializations 
+ * \author Francois TABURET
+ * \date 2017
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+#ifndef __RRC_PARAMSVALUES__H__
+#define __RRC_PARAMSVALUES__H__
+/*    cell configuration section name */
+#define ENB_CONFIG_STRING_ENB_LIST                      "eNBs"
+/* component carriers configuration section name */		
+#define ENB_CONFIG_STRING_COMPONENT_CARRIERS                            "component_carriers"		 
+
+#define ENB_CONFIG_STRING_FRAME_TYPE                                    "frame_type"
+#define ENB_CONFIG_STRING_PBCH_REPETITION                               "pbch_repetition"
+#define ENB_CONFIG_STRING_TDD_CONFIG                                    "tdd_config"
+#define ENB_CONFIG_STRING_TDD_CONFIG_S                                  "tdd_config_s"
+#define ENB_CONFIG_STRING_PREFIX_TYPE                                   "prefix_type"
+#define ENB_CONFIG_STRING_PREFIX_TYPE_UL                                "prefix_type_UL"
+#define ENB_CONFIG_STRING_EUTRA_BAND                                    "eutra_band"
+#define ENB_CONFIG_STRING_DOWNLINK_FREQUENCY                            "downlink_frequency"
+#define ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET                       "uplink_frequency_offset"
+#define ENB_CONFIG_STRING_NID_CELL                                      "Nid_cell"
+#define ENB_CONFIG_STRING_N_RB_DL                                       "N_RB_DL"
+#define ENB_CONFIG_STRING_CELL_MBSFN                                    "Nid_cell_mbsfn"
+
+
+#define FRAMETYPE_OKVALUES                                      {"FDD","TDD"}
+#define FRAMETYPE_MODVALUES                                     { FDD, TDD} 
+
+#define TDDCFG(A)                                               TDD_Config__subframeAssignment_ ## A
+#define TDDCONFIG_OKRANGE                                       { TDDCFG(sa0), TDDCFG(sa6)}   
+
+#define TDDCFGS(A)                                              TDD_Config__specialSubframePatterns_ ## A
+#define TDDCONFIGS_OKRANGE                                      { TDDCFGS(ssp0), TDDCFGS(ssp8)}   
+
+#define PREFIX_OKVALUES                                         {"NORMAL","EXTENDED"}
+#define PREFIX_MODVALUES                                        { NORMAL, EXTENDED} 
+
+#define PREFIXUL_OKVALUES                                       {"NORMAL","EXTENDED"}
+#define PREFIXUL_MODVALUES                                      { NORMAL, EXTENDED} 
+
+#define NRBDL_OKVALUES                                          {6,15,25,50,75,100}
+
+#define UETIMER_T300_OKVALUES                                   {100,200,300,400,600,1000,1500,2000}
+#define UETT300(A)                                              UE_TimersAndConstants__t300_ ## A
+#define UETIMER_T300_MODVALUES                                  { UETT300(ms100), UETT300(ms200),UETT300(ms300),UETT300(ms400),UETT300(ms600),UETT300(ms1000),UETT300(ms1500),UETT300(ms2000)}           		
+
+#define UETIMER_T301_OKVALUES                                   {100,200,300,400,600,1000,1500,2000}
+#define UETT301(A)                                              UE_TimersAndConstants__t301_ ## A
+#define UETIMER_T301_MODVALUES                                  { UETT301(ms100), UETT301(ms200),UETT301(ms300),UETT301(ms400),UETT301(ms600),UETT301(ms1000),UETT301(ms1500),UETT301(ms2000)}
+
+#define UETIMER_T310_OKVALUES                                   {0,50,100,200,500,1000,2000}
+#define UETT310(A)                                              UE_TimersAndConstants__t310_ ## A
+#define UETIMER_T310_MODVALUES                                  { UETT310(ms0), UETT310(ms50),UETT310(ms100),UETT310(ms200),UETT310(ms500),UETT310(ms1000),UETT310(ms2000)}
+
+#define UETIMER_T311_OKVALUES                                   {1000,3110,5000,10000,15000,20000,31100}
+#define UETT311(A)                                              UE_TimersAndConstants__t311_ ## A
+#define UETIMER_T311_MODVALUES                                  { UETT311(ms1000), UETT311(ms3000),UETT311(ms5000),UETT311(ms10000),UETT311(ms15000),UETT311(ms20000),UETT311(ms30000)}
+
+#define UETIMER_N310_OKVALUES                                   {1,2,3,4,6,8,10,20}
+#define UETN310(A)                                              UE_TimersAndConstants__n310_ ## A
+#define UETIMER_N310_MODVALUES                                  { UETN310(n1), UETN310(n2),UETN310(n3),UETN310(n4),UETN310(n6),UETN310(n8),UETN310(n10),UETN310(n20)}
+
+#define UETIMER_N311_OKVALUES                                   {1,2,3,4,5,6,8,10}
+#define UETN311(A)                                              UE_TimersAndConstants__n311_ ## A
+#define UETIMER_N311_MODVALUES                                  { UETN311(n1), UETN311(n2),UETN311(n3),UETN311(n4),UETN311(n5),UETN311(n6),UETN311(n8),UETN311(n10)}
+
+#endif
diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index a30dc28c941d2df60b277c5386004a0050ce1281..5e9c320f57a0caf5caec567b50c4841316517751 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -52,51 +52,14 @@
 #include "nfapi_vnf.h"
 #include "nfapi_pnf.h"
 
-#include "enb_paramdef.h"
+#include "L1_paramdef.h"
+#include "MACRLC_paramdef.h"
 #include "common/config/config_userapi.h"
+#include "RRC_config_tools.h"
+#include "enb_paramdef.h"
 
 extern uint16_t sf_ahead;
 
-static int enb_check_band_frequencies(char* lib_config_file_name_pP,
-                                      int ind,
-                                      int16_t band,
-                                      uint32_t downlink_frequency,
-                                      int32_t uplink_frequency_offset,
-                                      lte_frame_type_t frame_type)
-{
-  int errors = 0;
-
-  if (band > 0) {
-    int band_index;
-
-    for (band_index = 0; band_index < sizeof (eutra_bands) / sizeof (eutra_bands[0]); band_index++) {
-      if (band == eutra_bands[band_index].band) {
-        uint32_t uplink_frequency = downlink_frequency + uplink_frequency_offset;
-
-        AssertError (eutra_bands[band_index].dl_min < downlink_frequency, errors ++,
-                     "Failed to parse eNB configuration file %s, enb %d downlink frequency %u too low (%u) for band %d!",
-                     lib_config_file_name_pP, ind, downlink_frequency, eutra_bands[band_index].dl_min, band);
-        AssertError (downlink_frequency < eutra_bands[band_index].dl_max, errors ++,
-                     "Failed to parse eNB configuration file %s, enb %d downlink frequency %u too high (%u) for band %d!",
-                     lib_config_file_name_pP, ind, downlink_frequency, eutra_bands[band_index].dl_max, band);
-
-        AssertError (eutra_bands[band_index].ul_min < uplink_frequency, errors ++,
-                     "Failed to parse eNB configuration file %s, enb %d uplink frequency %u too low (%u) for band %d!",
-                     lib_config_file_name_pP, ind, uplink_frequency, eutra_bands[band_index].ul_min, band);
-        AssertError (uplink_frequency < eutra_bands[band_index].ul_max, errors ++,
-                     "Failed to parse eNB configuration file %s, enb %d uplink frequency %u too high (%u) for band %d!",
-                     lib_config_file_name_pP, ind, uplink_frequency, eutra_bands[band_index].ul_max, band);
-
-        AssertError (eutra_bands[band_index].frame_type == frame_type, errors ++,
-                     "Failed to parse eNB configuration file %s, enb %d invalid frame type (%d/%d) for band %d!",
-                     lib_config_file_name_pP, ind, eutra_bands[band_index].frame_type, frame_type, band);
-      }
-    }
-  }
-
-
-  return errors;
-}
 
 void RCconfig_flexran()
 {
@@ -420,14 +383,16 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
   paramdef_t ENBParams[]  = ENBPARAMS_DESC;
   paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0};  
 
+  checkedparam_t config_check_CCparams[] = CCPARAMS_CHECK;
   paramdef_t CCsParams[] = CCPARAMS_DESC;
   paramlist_def_t CCsParamList = {ENB_CONFIG_STRING_COMPONENT_CARRIERS,NULL,0};
   
   paramdef_t SRB1Params[] = SRB1PARAMS_DESC;  
 
-  
-
-
+/* map parameter checking array instances to parameter definition array instances */
+  for (int I=0; I< ( sizeof(CCsParams)/ sizeof(paramdef_t)  ) ; I++) {
+     CCsParams[I].chkPptr = &(config_check_CCparams[I]);  
+  }
 /* get global parameters, defined outside any section in the config file */
   
   config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL); 
@@ -562,43 +527,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
 		    
 
 	      nb_cc++;
-	      /*
-		if (strcmp(cc_node_function, "eNodeB_3GPP") == 0) {
-		enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = eNodeB_3GPP;
-		} else if (strcmp(cc_node_function, "eNodeB_3GPP_BBU") == 0) {
-		enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = eNodeB_3GPP_BBU;
-		} else if (strcmp(cc_node_function, "NGFI_RCC_IF4p5") == 0) {
-		enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = NGFI_RCC_IF4p5;
-		} else if (strcmp(cc_node_function, "NGFI_RAU_IF4p5") == 0) {
-		enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = NGFI_RAU_IF4p5;
-		} else if (strcmp(cc_node_function, "NGFI_RRU_IF4p5") == 0) {
-		enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = NGFI_RRU_IF4p5;
-		} else if (strcmp(cc_node_function, "NGFI_RRU_IF5") == 0) {
-		enb_properties_loc.properties[enb_properties_loc_index]->cc_node_function[j] = NGFI_RRU_IF5;
-		} else {
-		AssertError (0, parse_errors ++,
-		"Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for node_function choice: eNodeB_3GPP or eNodeB_3GPP_BBU or NGFI_IF4_RCC or NGFI_IF4_RRU or NGFI_IF5_RRU !\n",
-		lib_config_file_name_pP, i, cc_node_function);
-		}
-		
-		if (strcmp(cc_node_timing, "synch_to_ext_device") == 0) {
-		enb_properties_loc.properties[enb_properties_loc_index]->cc_node_timing[j] = synch_to_ext_device;
-		} else if (strcmp(cc_node_timing, "synch_to_other") == 0) {
-		enb_properties_loc.properties[enb_properties_loc_index]->cc_node_timing[j] = synch_to_other;
-		} else {
-		AssertError (0, parse_errors ++,
-		"Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for node_function choice: SYNCH_TO_DEVICE or SYNCH_TO_OTHER !\n",
-		lib_config_file_name_pP, i, cc_node_timing);
-		}
-		
-		if ((cc_node_synch_ref >= -1) && (cc_node_synch_ref < num_component_carriers)) {  
-		enb_properties_loc.properties[enb_properties_loc_index]->cc_node_synch_ref[j] = (int16_t) cc_node_synch_ref; 
-		} else {
-		AssertError (0, parse_errors ++,
-		"Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for node_synch_ref choice: valid CC_id or -1 !\n",
-		lib_config_file_name_pP, i, cc_node_synch_ref);
-		}
-	      */
+
 	      
 	      RRC_CONFIGURATION_REQ (msg_p).tdd_config[j] = tdd_config;
 	      
@@ -710,8 +639,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
 	      
 	      RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset;
 	      
-	      if (enb_check_band_frequencies(RC.config_file_name,
-					     j,
+	      if (config_check_band_frequencies(j,
 					     RRC_CONFIGURATION_REQ (msg_p).eutra_band[j],
 					     RRC_CONFIGURATION_REQ (msg_p).downlink_frequency[j],
 					     RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j],
@@ -1385,244 +1313,13 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
 		  break;
 		}
 
-
-		switch (ue_TimersAndConstants_t300) {
-		case 100:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms100;
-		  break;
-
-		case 200:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms200;
-		  break;
-
-		case 300:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms300;
-		  break;
-
-		case 400:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms400;
-		  break;
-
-		case 600:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms600;
-		  break;
-
-		case 1000:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms1000;
-		  break;
-
-		case 1500:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms1500;
-		  break;
-
-		case 2000:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = UE_TimersAndConstants__t300_ms2000;
-		  break;
-
-		default:
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t300 choice: 100,200,300,400,600,1000,1500,2000 ",
-			       RC.config_file_name, i, ue_TimersAndConstants_t300);
-		  break;
-
-		}
-
-		switch (ue_TimersAndConstants_t301) {
-		case 100:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms100;
-		  break;
-
-		case 200:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms200;
-		  break;
-
-		case 300:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms300;
-		  break;
-
-		case 400:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms400;
-		  break;
-
-		case 600:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms600;
-		  break;
-
-		case 1000:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms1000;
-		  break;
-
-		case 1500:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms1500;
-		  break;
-
-		case 2000:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = UE_TimersAndConstants__t301_ms2000;
-		  break;
-
-		default:
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t301 choice: 100,200,300,400,600,1000,1500,2000 ",
-			       RC.config_file_name, i, ue_TimersAndConstants_t301);
-		  break;
-
-		}
-
-		switch (ue_TimersAndConstants_t310) {
-		case 0:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms0;
-		  break;
-
-		case 50:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms50;
-		  break;
-
-		case 100:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms100;
-		  break;
-
-		case 200:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms200;
-		  break;
-
-		case 500:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms500;
-		  break;
-
-		case 1000:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms1000;
-		  break;
-
-		case 2000:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = UE_TimersAndConstants__t310_ms2000;
-		  break;
-
-		default:
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t310 choice: 0,50,100,200,500,1000,1500,2000 ",
-			       RC.config_file_name, i, ue_TimersAndConstants_t310);
-		  break;
-
-		}
-
-		switch (ue_TimersAndConstants_t311) {
-		case 1000:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms1000;
-		  break;
-
-		case 3110:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms3000;
-		  break;
-
-		case 5000:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms5000;
-		  break;
-
-		case 10000:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms10000;
-		  break;
-
-		case 15000:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms15000;
-		  break;
-
-		case 20000:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms20000;
-		  break;
-
-		case 31100:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = UE_TimersAndConstants__t311_ms30000;
-		  break;
-
-		default:
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t311 choice: 1000,3000,5000,10000,150000,20000,30000",
-			       RC.config_file_name, i, ue_TimersAndConstants_t311);
-		  break;
-
-		}
-
-		switch (ue_TimersAndConstants_n310) {
-		case 1:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n1;
-		  break;
-
-		case 2:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n2;
-		  break;
-
-		case 3:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n3;
-		  break;
-
-		case 4:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n4;
-		  break;
-
-		case 6:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n6;
-		  break;
-
-		case 8:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n8;
-		  break;
-
-		case 10:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n10;
-		  break;
-
-		case 20:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = UE_TimersAndConstants__n310_n20;
-		  break;
-
-		default:
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_n310 choice: 1,2,3,4,6,6,8,10,20",
-			       RC.config_file_name, i, ue_TimersAndConstants_n311);
-		  break;
-
-		}
-
-		switch (ue_TimersAndConstants_n311) {
-		case 1:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n1;
-		  break;
-
-		case 2:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n2;
-		  break;
-
-		case 3:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n3;
-		  break;
-
-		case 4:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n4;
-		  break;
-
-		case 5:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n5;
-		  break;
-
-		case 6:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n6;
-		  break;
-
-		case 8:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n8;
-		  break;
-
-		case 10:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = UE_TimersAndConstants__n311_n10;
-		  break;
-
-		default:
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TimersAndConstants_t311 choice: 1,2,3,4,5,6,8,10",
-			       RC.config_file_name, i, ue_TimersAndConstants_t311);
-		  break;
-
-		}
+                
+                RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300[j] = ue_TimersAndConstants_t300;
+                RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301[j] = ue_TimersAndConstants_t301;
+                RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310[j] = ue_TimersAndConstants_t310;
+                RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311[j] = ue_TimersAndConstants_t311;
+                RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310[j] = ue_TimersAndConstants_n310;
+                RRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311[j] = ue_TimersAndConstants_n311;
 
 		switch (ue_TransmissionMode) {
 		case 1:
@@ -1965,275 +1662,32 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
 	    }
 
 	    /*
-	    // OTG _CONFIG
-	    setting_otg = config_setting_get_member (setting_enb, ENB_CONF_STRING_OTG_CONFIG);
-
-	    if (setting_otg != NULL) {
-	      num_otg_elements  = config_setting_length(setting_otg);
-	      printf("num otg elements %d \n", num_otg_elements);
-	      enb_properties_loc.properties[enb_properties_loc_index]->num_otg_elements = 0;
-
-	      for (j = 0; j < num_otg_elements; j++) {
-		subsetting_otg=config_setting_get_elem(setting_otg, j);
-
-		if (config_setting_lookup_int(subsetting_otg, ENB_CONF_STRING_OTG_UE_ID, &otg_ue_id)) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->otg_ue_id[j] = otg_ue_id;
-		} else {
-		  enb_properties_loc.properties[enb_properties_loc_index]->otg_ue_id[j] = 1;
-		}
-
-		if (config_setting_lookup_string(subsetting_otg, ENB_CONF_STRING_OTG_APP_TYPE, (const char **)&otg_app_type)) {
-		  if ((enb_properties_loc.properties[enb_properties_loc_index]->otg_app_type[j] = map_str_to_int(otg_app_type_names,otg_app_type))== -1) {
-		    enb_properties_loc.properties[enb_properties_loc_index]->otg_app_type[j] = BCBR;
-		  }
-		} else {
-		  enb_properties_loc.properties[enb_properties_loc_index]->otg_app_type[j] = NO_PREDEFINED_TRAFFIC; // 0
-		}
-
-		if (config_setting_lookup_string(subsetting_otg, ENB_CONF_STRING_OTG_BG_TRAFFIC, (const char **)&otg_bg_traffic)) {
-
-		  if ((enb_properties_loc.properties[enb_properties_loc_index]->otg_bg_traffic[j] = map_str_to_int(switch_names,otg_bg_traffic)) == -1) {
-		    enb_properties_loc.properties[enb_properties_loc_index]->otg_bg_traffic[j]=0;
-		  }
-		} else {
-		  enb_properties_loc.properties[enb_properties_loc_index]->otg_bg_traffic[j] = 0;
-		  printf("otg bg %s\n", otg_bg_traffic);
-		}
-
-		enb_properties_loc.properties[enb_properties_loc_index]->num_otg_elements+=1;
-
-	      }
-	    }
-
-	    // log_config
-	    subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_LOG_CONFIG);
+	    // Network Controller 
+	    subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_NETWORK_CONTROLLER_CONFIG);
 
 	    if (subsetting != NULL) {
-	      // global
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GLOBAL_LOG_LEVEL, (const char **)  &glog_level)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->glog_level = map_str_to_int(log_level_names, glog_level)) == -1) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->glog_level = LOG_INFO;
-		}
-
-		//printf( "\tGlobal log level :\t%s->%d\n",glog_level, enb_properties_loc.properties[enb_properties_loc_index]->glog_level);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->glog_level = LOG_INFO;
-	      }
-
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GLOBAL_LOG_VERBOSITY,(const char **)  &glog_verbosity)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->glog_verbosity = map_str_to_int(log_verbosity_names, glog_verbosity)) == -1) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->glog_verbosity = LOG_MED;
-		}
-
-		//printf( "\tGlobal log verbosity:\t%s->%d\n",glog_verbosity, enb_properties_loc.properties[enb_properties_loc_index]->glog_verbosity);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->glog_verbosity = LOG_MED;
-	      }
-
-	      // HW
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_HW_LOG_LEVEL, (const char **) &hw_log_level)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->hw_log_level = map_str_to_int(log_level_names,hw_log_level)) == -1) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->hw_log_level = LOG_INFO;
-		}
-
-		//printf( "\tHW log level :\t%s->%d\n",hw_log_level,enb_properties_loc.properties[enb_properties_loc_index]->hw_log_level);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->hw_log_level = LOG_INFO;
-	      }
-
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_HW_LOG_VERBOSITY, (const char **) &hw_log_verbosity)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->hw_log_verbosity = map_str_to_int(log_verbosity_names,hw_log_verbosity)) == -1) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->hw_log_verbosity = LOG_MED;
-		}
-
-		//printf( "\tHW log verbosity:\t%s->%d\n",hw_log_verbosity, enb_properties_loc.properties[enb_properties_loc_index]->hw_log_verbosity);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->hw_log_verbosity = LOG_MED;
-	      }
-
-	      // phy
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PHY_LOG_LEVEL,(const char **) &phy_log_level)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->phy_log_level = map_str_to_int(log_level_names,phy_log_level)) == -1) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->phy_log_level = LOG_INFO;
-		}
-
-		//printf( "\tPHY log level :\t%s->%d\n",phy_log_level,enb_properties_loc.properties[enb_properties_loc_index]->phy_log_level);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->phy_log_level = LOG_INFO;
-	      }
-
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PHY_LOG_VERBOSITY, (const char **)&phy_log_verbosity)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->phy_log_verbosity = map_str_to_int(log_verbosity_names,phy_log_verbosity)) == -1) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->phy_log_verbosity = LOG_MED;
-		}
-
-		//printf( "\tPHY log verbosity:\t%s->%d\n",phy_log_level,enb_properties_loc.properties[enb_properties_loc_index]->phy_log_verbosity);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->phy_log_verbosity = LOG_MED;
-	      }
-
-	      //mac
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_MAC_LOG_LEVEL, (const char **)&mac_log_level)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->mac_log_level = map_str_to_int(log_level_names,mac_log_level)) == -1 ) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->mac_log_level = LOG_INFO;
-		}
-
-		//printf( "\tMAC log level :\t%s->%d\n",mac_log_level,enb_properties_loc.properties[enb_properties_loc_index]->mac_log_level);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->mac_log_level = LOG_INFO;
-	      }
-
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_MAC_LOG_VERBOSITY, (const char **)&mac_log_verbosity)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->mac_log_verbosity = map_str_to_int(log_verbosity_names,mac_log_verbosity)) == -1) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->mac_log_verbosity = LOG_MED;
-		}
-
-		//printf( "\tMAC log verbosity:\t%s->%d\n",mac_log_verbosity,enb_properties_loc.properties[enb_properties_loc_index]->mac_log_verbosity);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->mac_log_verbosity = LOG_MED;
-	      }
-
-	      //rlc
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RLC_LOG_LEVEL, (const char **)&rlc_log_level)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_level = map_str_to_int(log_level_names,rlc_log_level)) == -1) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_level = LOG_INFO;
-		}
-
-		//printf( "\tRLC log level :\t%s->%d\n",rlc_log_level, enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_level);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_level = LOG_INFO;
-	      }
-
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RLC_LOG_VERBOSITY, (const char **)&rlc_log_verbosity)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_verbosity = map_str_to_int(log_verbosity_names,rlc_log_verbosity)) == -1) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_verbosity = LOG_MED;
-		}
-
-		//printf( "\tRLC log verbosity:\t%s->%d\n",rlc_log_verbosity, enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_verbosity);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_verbosity = LOG_MED;
-	      }
-
-	      //pdcp
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PDCP_LOG_LEVEL, (const char **)&pdcp_log_level)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_level = map_str_to_int(log_level_names,pdcp_log_level)) == -1) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_level = LOG_INFO;
-		}
-
-		//printf( "\tPDCP log level :\t%s->%d\n",pdcp_log_level, enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_level);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_level = LOG_INFO;
-	      }
-
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_PDCP_LOG_VERBOSITY, (const char **)&pdcp_log_verbosity)) {
-		enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_verbosity = map_str_to_int(log_verbosity_names,pdcp_log_verbosity);
-		//printf( "\tPDCP log verbosity:\t%s->%d\n",pdcp_log_verbosity, enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_verbosity);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_verbosity = LOG_MED;
-	      }
-
-	      //rrc
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RRC_LOG_LEVEL, (const char **)&rrc_log_level)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_level = map_str_to_int(log_level_names,rrc_log_level)) == -1 ) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_level = LOG_INFO;
-		}
-
-		//printf( "\tRRC log level :\t%s->%d\n",rrc_log_level,enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_level);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_level = LOG_INFO;
-	      }
-
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_RRC_LOG_VERBOSITY, (const char **)&rrc_log_verbosity)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_verbosity = map_str_to_int(log_verbosity_names,rrc_log_verbosity)) == -1) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_verbosity = LOG_MED;
-		}
-
-		//printf( "\tRRC log verbosity:\t%s->%d\n",rrc_log_verbosity,enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_verbosity);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_verbosity = LOG_MED;
-	      }
-
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GTPU_LOG_LEVEL, (const char **)&gtpu_log_level)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_level = map_str_to_int(log_level_names,gtpu_log_level)) == -1 ) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_level = LOG_INFO;
-		}
-
-		//printf( "\tGTPU log level :\t%s->%d\n",gtpu_log_level,enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_level);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_level = LOG_INFO;
-	      }
-
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_GTPU_LOG_VERBOSITY, (const char **)&gtpu_log_verbosity)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity = map_str_to_int(log_verbosity_names,gtpu_log_verbosity)) == -1) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity = LOG_MED;
-		}
-
-		//printf( "\tGTPU log verbosity:\t%s->%d\n",gtpu_log_verbosity,enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity = LOG_MED;
-	      }
-
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_UDP_LOG_LEVEL, (const char **)&udp_log_level)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->udp_log_level = map_str_to_int(log_level_names,udp_log_level)) == -1 ) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->udp_log_level = LOG_INFO;
-		}
-
-		//printf( "\tUDP log level :\t%s->%d\n",udp_log_level,enb_properties_loc.properties[enb_properties_loc_index]->udp_log_level);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->udp_log_level = LOG_INFO;
-	      }
-
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_UDP_LOG_VERBOSITY, (const char **)&udp_log_verbosity)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->udp_log_verbosity = map_str_to_int(log_verbosity_names,udp_log_verbosity)) == -1) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->udp_log_verbosity = LOG_MED;
-		}
-
-		//printf( "\tUDP log verbosity:\t%s->%d\n",udp_log_verbosity,enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->udp_log_verbosity = LOG_MED;
-	      }
-
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_OSA_LOG_LEVEL, (const char **)&osa_log_level)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->osa_log_level = map_str_to_int(log_level_names,osa_log_level)) == -1 ) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->osa_log_level = LOG_INFO;
-		}
-
-		//printf( "\tOSA log level :\t%s->%d\n",osa_log_level,enb_properties_loc.properties[enb_properties_loc_index]->osa_log_level);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->osa_log_level = LOG_INFO;
-	      }
-
-	      if (config_setting_lookup_string(subsetting, ENB_CONFIG_STRING_OSA_LOG_VERBOSITY, (const char **)&osa_log_verbosity)) {
-		if ((enb_properties_loc.properties[enb_properties_loc_index]->osa_log_verbosity = map_str_to_int(log_verbosity_names,osa_log_verbosity)) == -1) {
-		  enb_properties_loc.properties[enb_properties_loc_index]->osa_log_verbosity = LOG_MED;
+	      if (  (
+		     config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_INTERFACE_NAME,
+						   (const char **)&flexran_agent_interface_name)
+		     && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_IPV4_ADDRESS,
+						      (const char **)&flexran_agent_ipv4_address)
+		     && config_setting_lookup_int(subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_PORT,
+						  &flexran_agent_port)
+		     && config_setting_lookup_string( subsetting, ENB_CONFIG_STRING_FLEXRAN_AGENT_CACHE,
+						      (const char **)&flexran_agent_cache)
+		     )
+		    ) {
+		enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_interface_name = strdup(flexran_agent_interface_name);
+		cidr = flexran_agent_ipv4_address;
+		address = strtok(cidr, "/");
+		//enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_ipv4_address = strdup(address);
+		if (address) {
+		  IPV4_STR_ADDR_TO_INT_NWBO (address, enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_ipv4_address, "BAD IP ADDRESS FORMAT FOR eNB Agent !\n" );
 		}
 
-		//printf( "\tOSA log verbosity:\t%s->%d\n",osa_log_verbosity,enb_properties_loc.properties[enb_properties_loc_index]->gosa_log_verbosity);
-	      } else {
-		enb_properties_loc.properties[enb_properties_loc_index]->osa_log_verbosity = LOG_MED;
+		enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_port = flexran_agent_port;
+		enb_properties_loc.properties[enb_properties_loc_index]->flexran_agent_cache = strdup(flexran_agent_cache);
 	      }
-
-	    } else { // not configuration is given
-	      enb_properties_loc.properties[enb_properties_loc_index]->glog_level         = LOG_INFO;
-	      enb_properties_loc.properties[enb_properties_loc_index]->glog_verbosity     = LOG_MED;
-	      enb_properties_loc.properties[enb_properties_loc_index]->hw_log_level       = LOG_INFO;
-	      enb_properties_loc.properties[enb_properties_loc_index]->hw_log_verbosity   = LOG_MED;
-	      enb_properties_loc.properties[enb_properties_loc_index]->phy_log_level      = LOG_INFO;
-	      enb_properties_loc.properties[enb_properties_loc_index]->phy_log_verbosity  = LOG_MED;
-	      enb_properties_loc.properties[enb_properties_loc_index]->mac_log_level      = LOG_INFO;
-	      enb_properties_loc.properties[enb_properties_loc_index]->mac_log_verbosity  = LOG_MED;
-	      enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_level      = LOG_INFO;
-	      enb_properties_loc.properties[enb_properties_loc_index]->rlc_log_verbosity  = LOG_MED;
-	      enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_level     = LOG_INFO;
-	      enb_properties_loc.properties[enb_properties_loc_index]->pdcp_log_verbosity = LOG_MED;
-	      enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_level      = LOG_INFO;
-	      enb_properties_loc.properties[enb_properties_loc_index]->rrc_log_verbosity  = LOG_MED;
-	      enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_level     = LOG_INFO;
-	      enb_properties_loc.properties[enb_properties_loc_index]->gtpu_log_verbosity = LOG_MED;
-	      enb_properties_loc.properties[enb_properties_loc_index]->udp_log_level      = LOG_INFO;
-	      enb_properties_loc.properties[enb_properties_loc_index]->udp_log_verbosity  = LOG_MED;
-	      enb_properties_loc.properties[enb_properties_loc_index]->osa_log_level      = LOG_INFO;
-	      enb_properties_loc.properties[enb_properties_loc_index]->osa_log_verbosity  = LOG_MED;
 	    }
 	    */
 	    break;
diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h
index 1a9019b794df9962425cfa5ef092272a3c5d3a51..d2634b39474e55ff69619388b7f7bbdea8a5769c 100755
--- a/openair2/ENB_APP/enb_paramdef.h
+++ b/openair2/ENB_APP/enb_paramdef.h
@@ -31,7 +31,7 @@
  */
 
 #include "common/config/config_paramdesc.h"
-
+#include "RRC_paramsvalues.h"
 
 
 
@@ -56,52 +56,6 @@
 
 
 
-#define KHz (1000UL)
-#define MHz (1000 * KHz)
-
-typedef struct eutra_band_s {
-  int16_t             band;
-  uint32_t            ul_min;
-  uint32_t            ul_max;
-  uint32_t            dl_min;
-  uint32_t            dl_max;
-  lte_frame_type_t    frame_type;
-} eutra_band_t;
-
-static const eutra_band_t eutra_bands[] = {
-  { 1, 1920    * MHz, 1980    * MHz, 2110    * MHz, 2170    * MHz, FDD},
-  { 2, 1850    * MHz, 1910    * MHz, 1930    * MHz, 1990    * MHz, FDD},
-  { 3, 1710    * MHz, 1785    * MHz, 1805    * MHz, 1880    * MHz, FDD},
-  { 4, 1710    * MHz, 1755    * MHz, 2110    * MHz, 2155    * MHz, FDD},
-  { 5,  824    * MHz,  849    * MHz,  869    * MHz,  894    * MHz, FDD},
-  { 6,  830    * MHz,  840    * MHz,  875    * MHz,  885    * MHz, FDD},
-  { 7, 2500    * MHz, 2570    * MHz, 2620    * MHz, 2690    * MHz, FDD},
-  { 8,  880    * MHz,  915    * MHz,  925    * MHz,  960    * MHz, FDD},
-  { 9, 1749900 * KHz, 1784900 * KHz, 1844900 * KHz, 1879900 * KHz, FDD},
-  {10, 1710    * MHz, 1770    * MHz, 2110    * MHz, 2170    * MHz, FDD},
-  {11, 1427900 * KHz, 1452900 * KHz, 1475900 * KHz, 1500900 * KHz, FDD},
-  {12,  698    * MHz,  716    * MHz,  728    * MHz,  746    * MHz, FDD},
-  {13,  777    * MHz,  787    * MHz,  746    * MHz,  756    * MHz, FDD},
-  {14,  788    * MHz,  798    * MHz,  758    * MHz,  768    * MHz, FDD},
-
-  {17,  704    * MHz,  716    * MHz,  734    * MHz,  746    * MHz, FDD},
-  {20,  832    * MHz,  862    * MHz,  791    * MHz,  821    * MHz, FDD},
-  {33, 1900    * MHz, 1920    * MHz, 1900    * MHz, 1920    * MHz, TDD},
-  {33, 1900    * MHz, 1920    * MHz, 1900    * MHz, 1920    * MHz, TDD},
-  {34, 2010    * MHz, 2025    * MHz, 2010    * MHz, 2025    * MHz, TDD},
-  {35, 1850    * MHz, 1910    * MHz, 1850    * MHz, 1910    * MHz, TDD},
-  {36, 1930    * MHz, 1990    * MHz, 1930    * MHz, 1990    * MHz, TDD},
-  {37, 1910    * MHz, 1930    * MHz, 1910    * MHz, 1930    * MHz, TDD},
-  {38, 2570    * MHz, 2620    * MHz, 2570    * MHz, 2630    * MHz, TDD},
-  {39, 1880    * MHz, 1920    * MHz, 1880    * MHz, 1920    * MHz, TDD},
-  {40, 2300    * MHz, 2400    * MHz, 2300    * MHz, 2400    * MHz, TDD},
-  {41, 2496    * MHz, 2690    * MHz, 2496    * MHz, 2690    * MHz, TDD},
-  {42, 3400    * MHz, 3600    * MHz, 3400    * MHz, 3600    * MHz, TDD},
-  {43, 3600    * MHz, 3800    * MHz, 3600    * MHz, 3800    * MHz, TDD},
-  {44, 703    * MHz, 803    * MHz, 703    * MHz, 803    * MHz, TDD},
-};
-
-
 
 
 
@@ -152,7 +106,7 @@ typedef enum {
 #define CONFIG_STRING_RU_MAX_RS_EPRE              "max_pdschReferenceSignalPower"
 #define CONFIG_STRING_RU_MAX_RXGAIN               "max_rxgain"
 #define CONFIG_STRING_RU_IF_COMPRESSION           "if_compression"
-
+#define CONFIG_STRING_RU_NBIOTRRC_LIST            "NbIoT_RRC_instances"
 
 #define RU_LOCAL_IF_NAME_IDX          0
 #define RU_LOCAL_ADDRESS_IDX          1
@@ -171,7 +125,7 @@ typedef enum {
 #define RU_ENB_LIST_IDX               14
 #define RU_ATT_TX_IDX                 15
 #define RU_ATT_RX_IDX                 16
-
+#define RU_NBIOTRRC_LIST_IDX          17
 
 
 
@@ -196,7 +150,8 @@ typedef enum {
 {CONFIG_STRING_RU_BAND_LIST,                	 NULL,       0,       uptr:NULL,       defintarrayval:DEFBANDS, TYPE_INTARRAY,    1}, \
 {CONFIG_STRING_RU_ENB_LIST,                 	 NULL,       0,       uptr:NULL,       defintarrayval:DEFENBS,  TYPE_INTARRAY,    1}, \
 {CONFIG_STRING_RU_ATT_TX,                   	 NULL,       0,       uptr:NULL,       defintval:0,		TYPE_UINT,	  0}, \
-{CONFIG_STRING_RU_ATT_RX,                   	 NULL,       0,       uptr:NULL,       defintval:0,		TYPE_UINT,	  0}  \
+{CONFIG_STRING_RU_ATT_RX,                   	 NULL,       0,       uptr:NULL,       defintval:0,		TYPE_UINT,	  0}, \
+{CONFIG_STRING_RU_NBIOTRRC_LIST,                 NULL,       0,       uptr:NULL,       defintarrayval:DEFENBS,  TYPE_INTARRAY,    1}, \
 }
 
 /*---------------------------------------------------------------------------------------------------------------------------------------*/
@@ -233,8 +188,7 @@ typedef enum {
 
 /*------------------------------------------------------------------------------------------------------------------------------------------*/
 /*------------------------------------------------------------------------------------------------------------------------------------------*/
-/*    cell configuration section name */
-#define ENB_CONFIG_STRING_ENB_LIST                      "eNBs"
+
 
 /* cell configuration parameters names */
 #define ENB_CONFIG_STRING_ENB_ID                        "eNB_ID"
@@ -289,21 +243,9 @@ typedef enum {
 /*-------------------------------------------------------------------------------------------------------------------------------------------------*/
 /*-------------------------------------------------------------------------------------------------------------------------------------------------*/		  
 
-/* component carriers configuration section name */		
-#define ENB_CONFIG_STRING_COMPONENT_CARRIERS                            "component_carriers"		 
 
 /* component carries configuration parameters name */
-#define ENB_CONFIG_STRING_FRAME_TYPE                                    "frame_type"
-#define ENB_CONFIG_STRING_PBCH_REPETITION                               "pbch_repetition"
-#define ENB_CONFIG_STRING_TDD_CONFIG                                    "tdd_config"
-#define ENB_CONFIG_STRING_TDD_CONFIG_S                                  "tdd_config_s"
-#define ENB_CONFIG_STRING_PREFIX_TYPE                                   "prefix_type"
-#define ENB_CONFIG_STRING_EUTRA_BAND                                    "eutra_band"
-#define ENB_CONFIG_STRING_DOWNLINK_FREQUENCY                            "downlink_frequency"
-#define ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET                       "uplink_frequency_offset"
-#define ENB_CONFIG_STRING_NID_CELL                                      "Nid_cell"
-#define ENB_CONFIG_STRING_N_RB_DL                                       "N_RB_DL"
-#define ENB_CONFIG_STRING_CELL_MBSFN                                    "Nid_cell_mbsfn"
+
 #define ENB_CONFIG_STRING_NB_ANT_PORTS                                  "nb_antenna_ports"
 #define ENB_CONFIG_STRING_NB_ANT_TX                                     "nb_antennas_tx"
 #define ENB_CONFIG_STRING_NB_ANT_RX                                     "nb_antennas_rx"
@@ -367,11 +309,83 @@ typedef enum {
 #define ENB_CONFIG_STRING_UETIMERS_N310                                 "ue_TimersAndConstants_n310"
 #define ENB_CONFIG_STRING_UETIMERS_N311                                 "ue_TimersAndConstants_n311"
 #define ENB_CONFIG_STRING_UE_TRANSMISSION_MODE                          "ue_TransmissionMode"
-		
-/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
-/*                                     component carriers configuration parameters                                                                                                     */
-/*   optname                                                   helpstr   paramflags    XXXptr                                        defXXXval                    type         numelt  */
-/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+/* init for checkedparam_t structure */
+
+#define CCPARAMS_CHECK                 {                                     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s5= {NULL }} ,						     \
+             { .s1a= { config_check_modify_integer, UETIMER_T300_OKVALUES, UETIMER_T300_MODVALUES,8}} ,						     \
+             { .s1a= { config_check_modify_integer, UETIMER_T301_OKVALUES, UETIMER_T301_MODVALUES,8}} ,						     \
+             { .s1a= { config_check_modify_integer, UETIMER_T310_OKVALUES, UETIMER_T310_MODVALUES,7}} ,						     \
+             { .s1a= { config_check_modify_integer, UETIMER_T311_OKVALUES, UETIMER_T311_MODVALUES,7}} ,						     \
+             { .s1a= { config_check_modify_integer, UETIMER_N310_OKVALUES, UETIMER_N310_MODVALUES,8}} , 					      \
+             { .s1a= { config_check_modify_integer, UETIMER_N311_OKVALUES, UETIMER_N311_MODVALUES,8}} , 					      \
+             { .s5= {NULL }} ,						     \
+}
+/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+/*                                     component carriers configuration parameters                                                                                                                   */
+/*   optname                                                   helpstr   paramflags    XXXptr                                        defXXXval                    type         numelt  checked_param */
+/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
 #define CCPARAMS_DESC { \
 {ENB_CONFIG_STRING_FRAME_TYPE,                                   NULL,   0,           strptr:&frame_type,                             defstrval:"FDD",           TYPE_STRING,     0},  \
 {ENB_CONFIG_STRING_TDD_CONFIG,                                   NULL,   0,           iptr:&tdd_config,                               defintval:3,               TYPE_UINT,       0},  \
@@ -443,6 +457,75 @@ typedef enum {
 {ENB_CONFIG_STRING_UE_TRANSMISSION_MODE,                         NULL,   0,           iptr:&ue_TransmissionMode,                      defintval:1,               TYPE_UINT,       0}   \
 }
 
+#define ENB_CONFIG_FRAME_TYPE_IDX                            0  			     
+#define ENB_CONFIG_TDD_CONFIG_IDX                            1  			     
+#define ENB_CONFIG_TDD_CONFIG_S_IDX			     2
+#define ENB_CONFIG_PREFIX_TYPE_IDX 			     3
+#define ENB_CONFIG_PBCH_REPETITION_IDX			     4
+#define ENB_CONFIG_EUTRA_BAND_IDX  			     5
+#define ENB_CONFIG_DOWNLINK_FREQUENCY_IDX  		     6
+#define ENB_CONFIG_UPLINK_FREQUENCY_OFFSET_IDX		     7
+#define ENB_CONFIG_NID_CELL_IDX				     8
+#define ENB_CONFIG_N_RB_DL_IDX				     9
+#define ENB_CONFIG_CELL_MBSFN_IDX  			     10
+#define ENB_CONFIG_NB_ANT_PORTS_IDX			     11
+#define ENB_CONFIG_PRACH_ROOT_IDX  			     12
+#define ENB_CONFIG_PRACH_CONFIG_INDEX_IDX  		     13
+#define ENB_CONFIG_PRACH_HIGH_SPEED_IDX			     14
+#define ENB_CONFIG_PRACH_ZERO_CORRELATION_IDX		     15
+#define ENB_CONFIG_PRACH_FREQ_OFFSET_IDX	             16     
+#define ENB_CONFIG_PUCCH_DELTA_SHIFT_IDX		     17     
+#define ENB_CONFIG_PUCCH_NRB_CQI_IDX			     18
+#define ENB_CONFIG_PUCCH_NCS_AN_IDX			     19
+#define ENB_CONFIG_PUCCH_N1_AN_IDX 			     20
+#define ENB_CONFIG_PDSCH_RS_EPRE_IDX			     21
+#define ENB_CONFIG_PDSCH_PB_IDX				     22
+#define ENB_CONFIG_PUSCH_N_SB_IDX  			     23
+#define ENB_CONFIG_PUSCH_HOPPINGMODE_IDX		     24     
+#define ENB_CONFIG_PUSCH_HOPPINGOFFSET_IDX 		     25
+#define ENB_CONFIG_PUSCH_ENABLE64QAM_IDX		     26     
+#define ENB_CONFIG_PUSCH_GROUP_HOPPING_EN_IDX		     27
+#define ENB_CONFIG_PUSCH_GROUP_ASSIGNMENT_IDX		     28
+#define ENB_CONFIG_PUSCH_SEQUENCE_HOPPING_EN_IDX	     29     
+#define ENB_CONFIG_PUSCH_NDMRS1_IDX			     30
+#define ENB_CONFIG_PHICH_DURATION_IDX			     31
+#define ENB_CONFIG_PHICH_RESOURCE_IDX			     32
+#define ENB_CONFIG_SRS_ENABLE_IDX  			     33
+#define ENB_CONFIG_SRS_BANDWIDTH_CONFIG_IDX		     34
+#define ENB_CONFIG_SRS_SUBFRAME_CONFIG_IDX 		     35
+#define ENB_CONFIG_SRS_ACKNACKST_CONFIG_IDX		     36
+#define ENB_CONFIG_SRS_MAXUPPTS_IDX			     37
+#define ENB_CONFIG_PUSCH_PO_NOMINAL_IDX			     38
+#define ENB_CONFIG_PUSCH_ALPHA_IDX 			     39
+#define ENB_CONFIG_PUCCH_PO_NOMINAL_IDX			     40
+#define ENB_CONFIG_MSG3_DELTA_PREAMBLE_IDX 		     41
+#define ENB_CONFIG_PUCCH_DELTAF_FORMAT1_IDX		     42
+#define ENB_CONFIG_PUCCH_DELTAF_FORMAT1b_IDX		     43
+#define ENB_CONFIG_PUCCH_DELTAF_FORMAT2_IDX		     44
+#define ENB_CONFIG_PUCCH_DELTAF_FORMAT2A_IDX		     45
+#define ENB_CONFIG_PUCCH_DELTAF_FORMAT2B_IDX		     46
+#define ENB_CONFIG_RACH_NUM_RA_PREAMBLES_IDX		     47
+#define ENB_CONFIG_RACH_PREAMBLESGROUPACONFIG_IDX  	     48
+#define ENB_CONFIG_RACH_SIZEOFRA_PREAMBLESGROUPA_IDX	     49
+#define ENB_CONFIG_RACH_MESSAGESIZEGROUPA_IDX		     50
+#define ENB_CONFIG_RACH_MESSAGEPOWEROFFSETGROUPB_IDX	     51
+#define ENB_CONFIG_RACH_POWERRAMPINGSTEP_IDX		     52
+#define ENB_CONFIG_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER_IDX 53 
+#define ENB_CONFIG_RACH_PREAMBLETRANSMAX_IDX		     54
+#define ENB_CONFIG_RACH_RARESPONSEWINDOWSIZE_IDX	     55     
+#define ENB_CONFIG_RACH_MACCONTENTIONRESOLUTIONTIMER_IDX     56	     
+#define ENB_CONFIG_RACH_MAXHARQMSG3TX_IDX  		     57
+#define ENB_CONFIG_PCCH_DEFAULT_PAGING_CYCLE_IDX	     58     
+#define ENB_CONFIG_PCCH_NB_IDX				     59
+#define ENB_CONFIG_BCCH_MODIFICATIONPERIODCOEFF_IDX	     60
+#define ENB_CONFIG_UETIMERS_T300_IDX			     61
+#define ENB_CONFIG_UETIMERS_T301_IDX			     62
+#define ENB_CONFIG_UETIMERS_T310_IDX			     63
+#define ENB_CONFIG_UETIMERS_T311_IDX			     64
+#define ENB_CONFIG_UETIMERS_N310_IDX			     65
+#define ENB_CONFIG_UETIMERS_N311_IDX			     66
+#define ENB_CONFIG_UE_TRANSMISSION_MODE_IDX		     67
+
 /*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
 /*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
 /* SRB1 configuration parameters section name */
@@ -569,43 +652,8 @@ typedef enum {
 
 
 
-/* L1 configuration parameters names   */
-#define CONFIG_STRING_L1_CC                                "num_cc"
-#define CONFIG_STRING_L1_LOCAL_N_IF_NAME                   "local_n_if_name"
-#define CONFIG_STRING_L1_LOCAL_N_ADDRESS                   "local_n_address"
-#define CONFIG_STRING_L1_REMOTE_N_ADDRESS                  "remote_n_address"
-#define CONFIG_STRING_L1_LOCAL_N_PORTC                     "local_n_portc"
-#define CONFIG_STRING_L1_REMOTE_N_PORTC                    "remote_n_portc"
-#define CONFIG_STRING_L1_LOCAL_N_PORTD                     "local_n_portd"
-#define CONFIG_STRING_L1_REMOTE_N_PORTD                    "remote_n_portd"
-#define CONFIG_STRING_L1_TRANSPORT_N_PREFERENCE            "tr_n_preference"
-
-/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
-/*                                            L1 configuration parameters                                                                             */
-/*   optname                                         helpstr   paramflags    XXXptr              defXXXval                  type           numelt     */
 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/
-#define L1PARAMS_DESC { \
-{CONFIG_STRING_L1_CC,                                NULL,      0,         uptr:NULL,           defintval:1,               TYPE_UINT,     0},         \
-{CONFIG_STRING_L1_TRANSPORT_N_PREFERENCE,            NULL,      0,         strptr:NULL,         defstrval:"local_mac",     TYPE_STRING,   0},         \
-{CONFIG_STRING_L1_LOCAL_N_IF_NAME,                   NULL,      0,         strptr:NULL,         defstrval:"lo",            TYPE_STRING,   0},         \
-{CONFIG_STRING_L1_LOCAL_N_ADDRESS,                   NULL,      0,         strptr:NULL,         defstrval:"127.0.0.1",     TYPE_STRING,   0},         \
-{CONFIG_STRING_L1_REMOTE_N_ADDRESS,                  NULL,      0,         strptr:NULL,         defstrval:"127.0.0.2",     TYPE_STRING,   0},         \
-{CONFIG_STRING_L1_LOCAL_N_PORTC,                     NULL,      0,         uptr:NULL,           defintval:50030,           TYPE_UINT,     0},         \
-{CONFIG_STRING_L1_REMOTE_N_PORTC,                    NULL,      0,         uptr:NULL,           defintval:50030,           TYPE_UINT,     0},         \
-{CONFIG_STRING_L1_LOCAL_N_PORTD,                     NULL,      0,         uptr:NULL,           defintval:50031,           TYPE_UINT,     0},         \
-{CONFIG_STRING_L1_REMOTE_N_PORTD,                    NULL,      0,         uptr:NULL,           defintval:50031,           TYPE_UINT,     0},         \
-}
-#define L1_CC_IDX                                          0
-#define L1_TRANSPORT_N_PREFERENCE_IDX                      1
-#define L1_LOCAL_N_IF_NAME_IDX                             2
-#define L1_LOCAL_N_ADDRESS_IDX                             3
-#define L1_REMOTE_N_ADDRESS_IDX                            4
-#define L1_LOCAL_N_PORTC_IDX                               5
-#define L1_REMOTE_N_PORTC_IDX                              6
-#define L1_LOCAL_N_PORTD_IDX                               7
-#define L1_REMOTE_N_PORTD_IDX                              8
 
-/*----------------------------------------------------------------------------------------------------------------------------------------------------*/
 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/
 #define CONFIG_STRING_NETWORK_CONTROLLER_CONFIG         "NETWORK_CONTROLLER"
 
@@ -639,64 +687,4 @@ typedef enum {
 #define CONFIG_STRING_MACRLC_CONFIG                        "macrlc_config"
 
 
-/* MACRLC configuration parameters names   */
-#define CONFIG_STRING_MACRLC_CC                            "num_cc"
-#define CONFIG_STRING_MACRLC_TRANSPORT_N_PREFERENCE        "tr_n_preference"
-#define CONFIG_STRING_MACRLC_LOCAL_N_IF_NAME               "local_n_if_name"
-#define CONFIG_STRING_MACRLC_LOCAL_N_ADDRESS               "local_n_address"
-#define CONFIG_STRING_MACRLC_REMOTE_N_ADDRESS              "remote_n_address"
-#define CONFIG_STRING_MACRLC_LOCAL_N_PORTC                 "local_n_portc"
-#define CONFIG_STRING_MACRLC_REMOTE_N_PORTC                "remote_n_portc"
-#define CONFIG_STRING_MACRLC_LOCAL_N_PORTD                 "local_n_portd"
-#define CONFIG_STRING_MACRLC_REMOTE_N_PORTD                "remote_n_portd"
-#define CONFIG_STRING_MACRLC_TRANSPORT_S_PREFERENCE        "tr_s_preference"
-#define CONFIG_STRING_MACRLC_LOCAL_S_IF_NAME               "local_s_if_name"
-#define CONFIG_STRING_MACRLC_LOCAL_S_ADDRESS               "local_s_address"
-#define CONFIG_STRING_MACRLC_REMOTE_S_ADDRESS              "remote_s_address"
-#define CONFIG_STRING_MACRLC_LOCAL_S_PORTC                 "local_s_portc"
-#define CONFIG_STRING_MACRLC_REMOTE_S_PORTC                "remote_s_portc"
-#define CONFIG_STRING_MACRLC_LOCAL_S_PORTD                 "local_s_portd"
-#define CONFIG_STRING_MACRLC_REMOTE_S_PORTD                "remote_s_portd"
-
-
-/*-------------------------------------------------------------------------------------------------------------------------------------------------------*/
-/*                                            MacRLC  configuration parameters                                                                           */
-/*   optname                                            helpstr   paramflags    XXXptr              defXXXval                  type           numelt     */
-/*-------------------------------------------------------------------------------------------------------------------------------------------------------*/
-#define MACRLCPARAMS_DESC { \
-{CONFIG_STRING_MACRLC_CC,                                NULL,     0,          uptr:NULL,           defintval:50011,           TYPE_UINT,     0},        \
-{CONFIG_STRING_MACRLC_TRANSPORT_N_PREFERENCE,            NULL,     0,          strptr:NULL,         defstrval:"local_L1",      TYPE_STRING,   0},        \
-{CONFIG_STRING_MACRLC_LOCAL_N_IF_NAME,                   NULL,     0,          strptr:NULL,         defstrval:"lo",            TYPE_STRING,   0},        \
-{CONFIG_STRING_MACRLC_LOCAL_N_ADDRESS,                   NULL,     0,          strptr:NULL,         defstrval:"127.0.0.1",     TYPE_STRING,   0},        \
-{CONFIG_STRING_MACRLC_REMOTE_N_ADDRESS,                  NULL,     0,          uptr:NULL,           defstrval:"127.0.0.2",     TYPE_STRING,   0},        \
-{CONFIG_STRING_MACRLC_LOCAL_N_PORTC,                     NULL,     0,          uptr:NULL,           defintval:50010,           TYPE_UINT,     0},        \
-{CONFIG_STRING_MACRLC_REMOTE_N_PORTC,                    NULL,     0,          uptr:NULL,           defintval:50010,           TYPE_UINT,     0},        \
-{CONFIG_STRING_MACRLC_LOCAL_N_PORTD,                     NULL,     0,          uptr:NULL,           defintval:50011,           TYPE_UINT,     0},        \
-{CONFIG_STRING_MACRLC_REMOTE_N_PORTD,                    NULL,     0,          uptr:NULL,           defintval:50011,           TYPE_UINT,     0},        \
-{CONFIG_STRING_MACRLC_TRANSPORT_S_PREFERENCE,            NULL,     0,          strptr:NULL,         defstrval:"local_RRC",     TYPE_STRING,   0},        \
-{CONFIG_STRING_MACRLC_LOCAL_S_IF_NAME,                   NULL,     0,          strptr:NULL,         defstrval:"lo",            TYPE_STRING,   0},        \
-{CONFIG_STRING_MACRLC_LOCAL_S_ADDRESS,                   NULL,     0,          uptr:NULL,           defstrval:"127.0.0.1",     TYPE_STRING,   0},        \
-{CONFIG_STRING_MACRLC_REMOTE_S_ADDRESS,                  NULL,     0,          uptr:NULL,           defstrval:"127.0.0.2",     TYPE_STRING,   0},        \
-{CONFIG_STRING_MACRLC_LOCAL_S_PORTC,                     NULL,     0,          uptr:NULL,           defintval:50020,           TYPE_UINT,     0},        \
-{CONFIG_STRING_MACRLC_REMOTE_S_PORTC,                    NULL,     0,          uptr:NULL,           defintval:50020,           TYPE_UINT,     0},        \
-{CONFIG_STRING_MACRLC_LOCAL_S_PORTD,                     NULL,     0,          uptr:NULL,           defintval:50021,           TYPE_UINT,     0},        \
-{CONFIG_STRING_MACRLC_REMOTE_S_PORTD,                    NULL,     0,          uptr:NULL,           defintval:50021,           TYPE_UINT,     0},        \
-}
-#define MACRLC_CC_IDX                                          0
-#define MACRLC_TRANSPORT_N_PREFERENCE_IDX                      1
-#define MACRLC_LOCAL_N_IF_NAME_IDX                             2
-#define MACRLC_LOCAL_N_ADDRESS_IDX                             3
-#define MACRLC_REMOTE_N_ADDRESS_IDX                            4
-#define MACRLC_LOCAL_N_PORTC_IDX                               5
-#define MACRLC_REMOTE_N_PORTC_IDX                              6
-#define MACRLC_LOCAL_N_PORTD_IDX                               7
-#define MACRLC_REMOTE_N_PORTD_IDX                              8
-#define MACRLC_TRANSPORT_S_PREFERENCE_IDX                      9
-#define MACRLC_LOCAL_S_IF_NAME_IDX                             10
-#define MACRLC_LOCAL_S_ADDRESS_IDX                             11
-#define MACRLC_REMOTE_S_ADDRESS_IDX                            12
-#define MACRLC_LOCAL_S_PORTC_IDX                               13
-#define MACRLC_REMOTE_S_PORTC_IDX                              14
-#define MACRLC_LOCAL_S_PORTD_IDX                               15
-#define MACRLC_REMOTE_S_PORTD_IDX                              16
-/*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
+
diff --git a/openair2/ENB_APP/nbiot_config.c b/openair2/ENB_APP/nbiot_config.c
new file mode 100644
index 0000000000000000000000000000000000000000..3862a0140330326b0663c7fa1175be6428d303f5
--- /dev/null
+++ b/openair2/ENB_APP/nbiot_config.c
@@ -0,0 +1,295 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*
+  nbiot_config.c
+  -------------------
+  AUTHOR  : Francois Taburet
+  COMPANY : NOKIA
+  EMAIL   : francois.taburet@nokia-bell-labs.com
+*/
+
+#include <string.h>
+#include <inttypes.h>
+
+#include "log.h"
+#include "log_extern.h"
+#include "assertions.h"
+#include "enb_config.h"
+#include "UTIL/OTG/otg.h"
+#include "UTIL/OTG/otg_externs.h"
+#if defined(OAI_EMU)
+# include "OCG.h"
+# include "OCG_extern.h"
+#endif
+#if defined(ENABLE_ITTI)
+# include "intertask_interface.h"
+# if defined(ENABLE_USE_MME)
+#   include "s1ap_eNB.h"
+#   include "sctp_eNB_task.h"
+# endif
+#endif
+#include "sctp_default_values.h"
+#include "SystemInformationBlockType2.h"
+#include "LAYER2/MAC/extern.h"
+#include "PHY/extern.h"
+#include "targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h"
+
+#include "common/config/config_userapi.h"
+#include "RRC_config_tools.h"
+#include "RRC_paramsvalues.h"
+#include "nbiot_paramdef.h"
+#include "L1_paramdef.h"
+#include "MACRLC_paramdef.h"
+#include "LAYER2/MAC/proto_NB_IoT.h"
+
+
+void RCconfig_NbIoTL1(void) {
+  paramdef_t NbIoT_L1_Params[] = L1PARAMS_DESC;
+  paramlist_def_t NbIoT_L1_ParamList = {NBIOT_L1LIST_CONFIG_STRING,NULL,0};
+
+/* No component carrier for NbIoT, ignore number of CC */
+//  NbIoT_L1_Params[L1_CC_IDX ].paramflags = PARAMFLAG_DONOTREAD;
+
+  config_getlist( &NbIoT_L1_ParamList,NbIoT_L1_Params,sizeof(NbIoT_L1_Params)/sizeof(paramdef_t), NULL);    
+  if (NbIoT_L1_ParamList.numelt > 0) {
+    if (RC.L1_NB_IoT == NULL) {
+      RC.L1_NB_IoT                         = (PHY_VARS_eNB_NB_IoT **)malloc(RC.nb_nb_iot_L1_inst*sizeof(PHY_VARS_eNB_NB_IoT *));
+      LOG_I(PHY,"RC.L1_NB_IoT = %p\n",RC.L1_NB_IoT);
+      memset(RC.L1_NB_IoT,0,RC.nb_nb_iot_L1_inst*sizeof(PHY_VARS_eNB_NB_IoT *));
+    }
+
+
+  for(int j = 0; j <NbIoT_L1_ParamList.numelt ; j++) {
+      if (RC.L1_NB_IoT[j] == NULL) {
+	RC.L1_NB_IoT[j]                       = (PHY_VARS_eNB_NB_IoT *)malloc(sizeof(PHY_VARS_eNB_NB_IoT));
+	LOG_I(PHY,"RC.L1_NB_IoT[%d] = %p\n",j,RC.L1_NB_IoT[j]);
+	memset(RC.L1_NB_IoT[j],0,sizeof(PHY_VARS_eNB_NB_IoT));
+      }
+      if (strcmp(*(NbIoT_L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_mac") == 0) {
+
+      }
+      else if (strcmp(*(NbIoT_L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "nfapi") == 0) {
+	RC.L1_NB_IoT[j]->eth_params_n.local_if_name	       = strdup(*(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_IF_NAME_IDX].strptr));
+	RC.L1_NB_IoT[j]->eth_params_n.my_addr		      = strdup(*(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_ADDRESS_IDX].strptr));
+	RC.L1_NB_IoT[j]->eth_params_n.remote_addr	      = strdup(*(NbIoT_L1_ParamList.paramarray[j][L1_REMOTE_N_ADDRESS_IDX].strptr));
+	RC.L1_NB_IoT[j]->eth_params_n.my_portc  	      = *(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_PORTC_IDX].iptr);
+	RC.L1_NB_IoT[j]->eth_params_n.remote_portc	      = *(NbIoT_L1_ParamList.paramarray[j][L1_REMOTE_N_PORTC_IDX].iptr);
+	RC.L1_NB_IoT[j]->eth_params_n.my_portd  	      = *(NbIoT_L1_ParamList.paramarray[j][L1_LOCAL_N_PORTD_IDX].iptr);
+	RC.L1_NB_IoT[j]->eth_params_n.remote_portd	      = *(NbIoT_L1_ParamList.paramarray[j][L1_REMOTE_N_PORTD_IDX].iptr);
+	RC.L1_NB_IoT[j]->eth_params_n.transp_preference       = ETH_UDP_MODE;
+      }
+      
+      else { // other midhaul
+      }	
+    }// j=0..num_inst
+    printf("Initializing northbound interface for NB-IoT L1\n");
+    l1_north_init_NB_IoT();
+  } else {
+    LOG_I(PHY,"No " NBIOT_L1LIST_CONFIG_STRING " configuration found");    
+  }
+}
+
+void RCconfig_NbIoTmacrlc(void) {
+ 
+
+
+  paramdef_t NbIoT_MacRLC_Params[] = MACRLCPARAMS_DESC;
+  paramlist_def_t NbIoT_MacRLC_ParamList = {NBIOT_MACRLCLIST_CONFIG_STRING,NULL,0};
+
+
+/* No component carrier for NbIoT, ignore number of CC */
+//  NbIoT_MacRLC_Params[MACRLC_CC_IDX ].paramflags = PARAMFLAG_DONOTREAD;
+
+  config_getlist( &NbIoT_MacRLC_ParamList,NbIoT_MacRLC_Params,sizeof(NbIoT_MacRLC_Params)/sizeof(paramdef_t), NULL);    
+  
+
+  if ( NbIoT_MacRLC_ParamList.numelt > 0) {
+    mac_top_init_eNB_NB_IoT();
+    for (int j=0;j<RC.nb_nb_iot_macrlc_inst;j++) {
+
+      if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_RRC") == 0) {
+	// check number of instances is same as RRC/PDCP
+	
+      } else if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "cudu") == 0) {
+	RC.nb_iot_mac[j]->eth_params_n.local_if_name            = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_IF_NAME_IDX].strptr));
+	RC.nb_iot_mac[j]->eth_params_n.my_addr                  = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_ADDRESS_IDX].strptr));
+	RC.nb_iot_mac[j]->eth_params_n.remote_addr              = strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_ADDRESS_IDX].strptr));
+	RC.nb_iot_mac[j]->eth_params_n.my_portc                 = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTC_IDX].iptr);
+	RC.nb_iot_mac[j]->eth_params_n.remote_portc             = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTC_IDX].iptr);
+	RC.nb_iot_mac[j]->eth_params_n.my_portd                 = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTD_IDX].iptr);
+	RC.nb_iot_mac[j]->eth_params_n.remote_portd             = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTD_IDX].iptr);;
+	RC.nb_iot_mac[j]->eth_params_n.transp_preference        = ETH_UDP_MODE;
+      } else { // other midhaul
+	AssertFatal(1==0,"MACRLC %d: %s unknown northbound midhaul\n",j, *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr));
+      }	
+
+      if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "local_L1") == 0) {
+
+	
+      } else if (strcmp(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "nfapi") == 0) {
+	RC.nb_iot_mac[j]->eth_params_s.local_if_name		= strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_IF_NAME_IDX].strptr));
+	RC.nb_iot_mac[j]->eth_params_s.my_addr  		= strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_ADDRESS_IDX].strptr));
+	RC.nb_iot_mac[j]->eth_params_s.remote_addr		= strdup(*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_ADDRESS_IDX].strptr));
+	RC.nb_iot_mac[j]->eth_params_s.my_portc 		= *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTC_IDX].iptr);
+	RC.nb_iot_mac[j]->eth_params_s.remote_portc             = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTC_IDX].iptr);
+	RC.nb_iot_mac[j]->eth_params_s.my_portd                 = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTD_IDX].iptr);
+	RC.nb_iot_mac[j]->eth_params_s.remote_portd             = *(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTD_IDX].iptr);
+	RC.nb_iot_mac[j]->eth_params_s.transp_preference        = ETH_UDP_MODE;
+      } else { // other midhaul
+	AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(NbIoT_MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr));
+      }	
+    }// j=0..num_inst */
+  } else {// MacRLC_ParamList.numelt > 0
+	  AssertFatal (0,
+		       "No " NBIOT_MACRLCLIST_CONFIG_STRING " configuration found");     
+  }
+}
+
+
+
+	       
+int RCconfig_NbIoTRRC(MessageDef *msg_p, int nbiotrrc_id,eNB_RRC_INST_NB_IoT *nbiotrrc) {
+
+
+  char instprefix[MAX_OPTNAME_SIZE*3 + 32];
+  
+ 
+  checkedparam_t NBIoTCheckParams[] = NBIOT_RRCPARAMS_CHECK_DESC;
+  paramdef_t     NBIoTParams[]      = NBIOTRRCPARAMS_DESC;
+
+  paramdef_t     NBIoTPrachParams[]      = NBIOTRRC_NPRACH_PARAMS_DESC;
+  checkedparam_t NBIoTPrachCheckParams[] = NBIOT_RRCLIST_NPRACHPARAMSCHECK_DESC;
+
+  paramdef_t     NBIoTRRCRefParams[]      = NBIOTRRCPARAMS_RRCREF_DESC;
+
+  paramdef_t     NBIoTLteCCParams[] = NBIOT_LTECCPARAMS_DESC;
+  checkedparam_t NBIoTLteCCCheckParams[] = NBIOT_LTECCPARAMS_CHECK_DESC;
+/* map parameter checking array instances to parameter definition array instances */
+  for (int i=0; (i<sizeof(NBIoTParams)/sizeof(paramdef_t)) && (i<sizeof(NBIoTCheckParams)/sizeof(checkedparam_t)); i++ ) {
+     NBIoTParams[i].chkPptr = &(NBIoTCheckParams[i]); 
+  } 
+  for (int i=0; (i<sizeof(NBIoTPrachParams)/sizeof(paramdef_t)) && (i<sizeof(NBIoTPrachCheckParams)/sizeof(checkedparam_t)); i++ ) {
+     NBIoTPrachParams[i].chkPptr = &(NBIoTPrachCheckParams[i]);
+  }
+
+/* brut force itti message fields assignment, to be redesigned with itti replacement */
+  NBIoTParams[NBIOT_RACH_RARESPONSEWINDOWSIZE_NB_IDX].uptr               = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_raResponseWindowSize_NB);
+  NBIoTParams[NBIOT_RACH_MACCONTENTIONRESOLUTIONTIMER_NB_IDX].uptr       = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_macContentionResolutionTimer_NB);
+  NBIoTParams[NBIOT_RACH_POWERRAMPINGSTEP_NB_IDX].uptr                   = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_powerRampingStep_NB);		     		   
+  NBIoTParams[NBIOT_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_preambleInitialReceivedTargetPower_NB);
+  NBIoTParams[NBIOT_RACH_PREAMBLETRANSMAX_CE_NB_IDX].uptr                = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax_CE_NB);				    
+  NBIoTParams[NBIOT_BCCH_MODIFICATIONPERIODCOEFF_NB_IDX].uptr            = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff_NB);	 
+  NBIoTParams[NBIOT_PCCH_DEFAULTPAGINGCYCLE_NB_IDX].uptr                 = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle_NB);	 
+  NBIoTParams[NBIOT_NPRACH_CP_LENGTH_IDX].uptr                           = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_CP_Length);  		 
+  NBIoTParams[NBIOT_NPRACH_RSRP_RANGE_IDX].uptr                          = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_rsrp_range); 		       
+
+  
+  
+  NBIoTParams[NBIOT_MAXNUMPREAMBLEATTEMPTCE_NB_IDX].uptr                 = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).maxNumPreambleAttemptCE_NB);
+
+  NBIoTParams[NBIOT_NPDSCH_NRS_POWER_IDX].uptr  			 = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npdsch_nrs_Power);       
+  NBIoTParams[NBIOT_NPUSCH_ACK_NACK_NUMREPETITIONS_NB_IDX].uptr 	 = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p). npusch_ack_nack_numRepetitions_NB);
+  NBIoTParams[NBIOT_NPUSCH_SRS_SUBFRAMECONFIG_NB_IDX].uptr		 = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p). npusch_srs_SubframeConfig_NB);
+  NBIoTParams[NBIOT_NPUSCH_THREETONE_CYCLICSHIFT_R13_IDX].uptr 	         = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_threeTone_CyclicShift_r13);
+  NBIoTParams[NBIOT_NPUSCH_SIXTONE_CYCLICSHIFT_R13_IDX].uptr             = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_sixTone_CyclicShift_r13);
+  
+  NBIoTParams[NBIOT_NPUSCH_GROUPASSIGNMENTNPUSCH_R13_IDX].uptr           = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_groupAssignmentNPUSCH_r13);
+  NBIoTParams[NBIOT_DL_GAPTHRESHOLD_NB_IDX].uptr                         = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).dl_GapThreshold_NB);	 
+  NBIoTParams[NBIOT_DL_GAPPERIODICITY_NB_IDX].uptr                       = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).dl_GapPeriodicity_NB);	 
+  
+  NBIoTParams[NBIOT_NPUSCH_P0_NOMINALNPUSCH_IDX].uptr                    = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_p0_NominalNPUSCH);	  
+  		  
+  NBIoTParams[NBIOT_DELTAPREAMBLEMSG3_IDX].uptr                          = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).deltaPreambleMsg3); 	  
+  NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T300_NB_IDX].uptr              = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t300_NB);						 
+  NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T301_NB_IDX].uptr              = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t301_NB);
+  NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T310_NB_IDX].uptr              = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t310_NB);						
+  NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_T311_NB_IDX].uptr              = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_t311_NB);						
+  NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_N310_NB_IDX].uptr              = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n310_NB);						
+  NBIoTParams[NBIOT_UE_TIMERSANDCONSTANTS_N311_NB_IDX].uptr              = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).ue_TimersAndConstants_n311_NB);
+
+  sprintf(instprefix, NBIOT_RRCLIST_CONFIG_STRING ".[%i]",nbiotrrc_id);
+  config_get( NBIoTParams,sizeof(NBIoTParams)/sizeof(paramdef_t),instprefix); 
+
+  NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_SubcarrierMSG3_RangeStart    = config_get_processedint( &(NBIoTParams[NBIOT_NPRACH_SUBCARRIERMSG3_RANGESTART_IDX]) );
+  NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_groupHoppingEnabled          = config_get_processedint( &(NBIoTParams[NBIOT_NPUSCH_GROUPHOPPINGENABLED_IDX]      ) ); 
+  NBIOTRRC_CONFIGURATION_REQ (msg_p).dl_GapDurationCoeff_NB              = config_get_processedint( &(NBIoTParams[NBIOT_DL_GAPDURATIONCOEFF_NB_IDX]          ) ); 	 
+  NBIOTRRC_CONFIGURATION_REQ (msg_p).npusch_alpha                        = config_get_processedint( &(NBIoTParams[NBIOT_NPUSCH_ALPHA_IDX]                    ) );
+  for (int i=0; i<MAX_NUM_NBIOT_CELEVELS; i++) {
+       char *tmpptr=NULL;
+       NBIoTPrachParams[NBIOT_NPRACH_PERIODICITY_IDX ].uptr	            = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_Periodicity[i]);		
+       NBIoTPrachParams[NBIOT_NPRACH_STARTTIME_IDX].uptr  	            = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_StartTime[i]);			
+       NBIoTPrachParams[NBIOT_NPRACH_SUBCARRIEROFFSET_IDX].uptr	            = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_SubcarrierOffset[i]);		
+       NBIoTPrachParams[NBIOT_NPRACH_NUMSUBCARRIERS_IDX].uptr	            = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).nprach_NumSubcarriers[i]);		
+       NBIoTPrachParams[NBIOT_NUMREPETITIONSPERPREAMBLEATTEMPT_NB_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).numRepetitionsPerPreambleAttempt_NB[i]);
+       NBIoTParams[NBIOT_NPDCCH_NUMREPETITIONS_RA_IDX].uptr                 = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npdcch_NumRepetitions_RA[i]);
+       NBIoTParams[NBIOT_NPDCCH_STARTSF_CSS_RA_IDX].uptr	            = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).npdcch_StartSF_CSS_RA[i]);
+       NBIoTParams[NBIOT_NPDCCH_OFFSET_RA_IDX].strptr			    = &tmpptr;
+       sprintf(instprefix, "%s.[%i].%s.[%i]",NBIOT_RRCLIST_CONFIG_STRING, nbiotrrc_id,NBIOT_RRCLIST_NPRACHPARAMS_CONFIG_STRING,i);
+       config_get( NBIoTPrachParams,sizeof(NBIoTPrachParams)/sizeof(paramdef_t),instprefix); 
+       NBIOTRRC_CONFIGURATION_REQ (msg_p).npdcch_Offset_RA[i] = config_get_processedint( &(NBIoTPrachParams[NBIOT_NPDCCH_OFFSET_RA_IDX]) ); 
+  }
+/* get the LTE RRC and CC this NB-IoT RRC instance is attached to */
+  sprintf(instprefix, NBIOT_RRCLIST_CONFIG_STRING ".[%i]." NBIOT_LTERRCREF_CONFIG_STRING, nbiotrrc_id );
+  config_get( NBIoTRRCRefParams,sizeof(NBIoTRRCRefParams)/sizeof(paramdef_t),instprefix); 
+
+/* read SIB1 parameters in the LTE RRC and CC sections */
+  sprintf(instprefix, ENB_CONFIG_STRING_ENB_LIST ".[%i]."  ENB_CONFIG_STRING_COMPONENT_CARRIERS ".[%i]",
+          *(NBIoTRRCRefParams[NBIOT_RRCINST_IDX].uptr), *(NBIoTRRCRefParams[NBIOT_CCINST_IDX].uptr)); 
+
+  NBIoTLteCCParams[LTECCPARAMS_TDD_CONFIG_IDX  ].uptr	         = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).tdd_config);
+  NBIoTLteCCParams[LTECCPARAMS_TDD_CONFIG_S_IDX].uptr	         = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).tdd_config_s);
+  NBIoTLteCCParams[LTECCPARAMS_EUTRA_BAND_IDX ].uptr	         = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).eutra_band);             
+  NBIoTLteCCParams[LTECCPARAMS_DOWNLINK_FREQUENCY_IDX].uptr      = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).downlink_frequency);      
+  NBIoTLteCCParams[LTECCPARAMS_UPLINK_FREQUENCY_OFFSET_IDX].uptr = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset);
+  NBIoTLteCCParams[LTECCPARAMS_NID_CELL_IDX].uptr	         = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).Nid_cell);                 
+  NBIoTLteCCParams[LTECCPARAMS_N_RB_DL_IDX].uptr	         = (uint32_t *)&(NBIOTRRC_CONFIGURATION_REQ (msg_p).N_RB_DL);                   
+
+  for (int i=0; (i<sizeof(NBIoTLteCCParams)/sizeof(paramdef_t)) && (i<sizeof(NBIoTLteCCCheckParams)/sizeof(checkedparam_t)); i++ ) {
+     NBIoTLteCCParams[i].chkPptr = &(NBIoTLteCCCheckParams[i]);
+  }
+  config_get( NBIoTLteCCParams,sizeof(NBIoTLteCCParams)/sizeof(paramdef_t),instprefix); 
+  NBIOTRRC_CONFIGURATION_REQ (msg_p).frame_type = config_get_processedint( &(NBIoTLteCCParams[LTECCPARAMS_FRAME_TYPE_IDX]) ); 
+  NBIOTRRC_CONFIGURATION_REQ (msg_p).prefix_type = config_get_processedint( &(NBIoTLteCCParams[LTECCPARAMS_PREFIX_TYPE_IDX]) );
+  NBIOTRRC_CONFIGURATION_REQ (msg_p).prefix_type = config_get_processedint( &(NBIoTLteCCParams[LTECCPARAMS_PREFIX_TYPE_UL_IDX]) );
+return 0;
+}
+
+void RCConfig_NbIoT(RAN_CONTEXT_t *RC) {
+
+  paramlist_def_t NbIoT_MACRLCParamList = {NBIOT_MACRLCLIST_CONFIG_STRING,NULL,0};
+  paramlist_def_t NbIoT_L1ParamList = {NBIOT_L1LIST_CONFIG_STRING,NULL,0};
+  paramlist_def_t NbIoT_ParamList = {NBIOT_RRCLIST_CONFIG_STRING,NULL,0};
+    
+  
+  config_getlist( &NbIoT_ParamList,NULL,0,NULL);
+  RC->nb_nb_iot_rrc_inst = NbIoT_ParamList.numelt;
+
+
+    
+ 
+    config_getlist( &NbIoT_MACRLCParamList,NULL,0, NULL);
+    RC->nb_nb_iot_macrlc_inst  = NbIoT_MACRLCParamList.numelt;
+    // Get num L1 instances
+    config_getlist( &NbIoT_L1ParamList,NULL,0, NULL);
+    RC->nb_nb_iot_L1_inst = NbIoT_L1ParamList.numelt;
+
+}
diff --git a/openair2/ENB_APP/nbiot_config.h b/openair2/ENB_APP/nbiot_config.h
new file mode 100644
index 0000000000000000000000000000000000000000..314fca81802124b8258e99af1616e1455a840607
--- /dev/null
+++ b/openair2/ENB_APP/nbiot_config.h
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*
+  nbiot_config.h
+  -------------------
+  AUTHOR  : Francois Taburet
+  COMPANY : NOKIA
+  EMAIL   : francois.taburet@nokia-bell-labs.com
+*/
+#ifndef INCLUDE_NBIOT_CONFIG_H
+#define INCLUDE_NBIOT_CONFIG_H
+
+
+extern void RCconfig_NbIoTL1(void) ;
+extern void RCconfig_NbIoTmacrlc(void);
+extern int  RCconfig_NbIoTRRC(MessageDef *msg_p, int nbiotrrc_id,eNB_RRC_INST_NB_IoT *nbiotrrc);
+extern void RCConfig_NbIoT(RAN_CONTEXT_t *RC);
+#endif
diff --git a/openair2/ENB_APP/nbiot_paramdef.h b/openair2/ENB_APP/nbiot_paramdef.h
new file mode 100644
index 0000000000000000000000000000000000000000..615c96a7b676d2037302ecc0f1adef9ba2f5685e
--- /dev/null
+++ b/openair2/ENB_APP/nbiot_paramdef.h
@@ -0,0 +1,400 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.0  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file openair2/ENB_APP/enb_paramdef.f
+ * \brief definition of configuration parameters for all eNodeB modules 
+ * \author Francois TABURET
+ * \date 2017
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+
+#include "common/config/config_paramdesc.h"
+#include "SystemInformationBlockType2.h"
+#include "DL-GapConfig-NB-r13.h"
+#include "NPRACH-Parameters-NB-r13.h"
+#include "PowerRampingParameters.h"		  
+#include "BCCH-Config-NB-r13.h"
+#include "PCCH-Config-NB-r13.h"
+#include "ACK-NACK-NumRepetitions-NB-r13.h"
+#include "TDD-Config.h"
+
+
+
+
+ 
+/*
+  int16_t                 eutra_band;
+  uint32_t                downlink_frequency;
+  int32_t                 uplink_frequency_offset;
+  int16_t                 Nid_cell;// for testing, change later
+  int16_t                 N_RB_DL;// for testing, change later
+*/
+/*-------------------------------------------------------------------------------------------------------------------*/
+/* SIB1 parameters possibly coming  from LTE RRC (in band deployment)                                                */
+/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+/*                                     component carriers configuration parameters                                                                                                                   */
+/*   optname                                                   helpstr   paramflags    XXXptr                                        defXXXval                    type         numelt  checked_param */
+/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+#define NBIOT_LTECCPARAMS_CHECK_DESC { \
+             { .s3a= { config_checkstr_assign_integer,  FRAMETYPE_OKVALUES, FRAMETYPE_MODVALUES,2}} ,     \
+             { .s2=  { config_check_intrange,           TDDCONFIG_OKRANGE}},                              \
+             { .s2=  { config_check_intrange,           TDDCONFIGS_OKRANGE}},                             \
+             { .s3a= { config_checkstr_assign_integer,  PREFIX_OKVALUES,    PREFIX_MODVALUES,2}} ,        \
+             { .s3a= { config_checkstr_assign_integer,  PREFIXUL_OKVALUES,  PREFIXUL_MODVALUES,2}} ,      \
+             { .s5= {NULL }} ,						                                  \
+             { .s5= {NULL }} ,						                                  \
+             { .s5= {NULL }} ,						                                  \
+             { .s5= {NULL }} ,						                                  \
+             { .s1= { config_check_intval,              NRBDL_OKVALUES,6}} ,                              \
+}
+
+
+#define NBIOT_LTECCPARAMS_DESC { \
+{ENB_CONFIG_STRING_FRAME_TYPE,                        NULL,   0,	   strptr:NULL,       defstrval:"FDD",  	 TYPE_STRING,	  0},  \
+{ENB_CONFIG_STRING_TDD_CONFIG,                        NULL,   0,	   iptr:NULL,	      defintval:3,		 TYPE_UINT,	  0},  \
+{ENB_CONFIG_STRING_TDD_CONFIG_S,                      NULL,   0,	   iptr:NULL,	      defintval:0,		 TYPE_UINT,	  0},  \
+{ENB_CONFIG_STRING_PREFIX_TYPE,                       NULL,   0,	   strptr:NULL,       defstrval:"NORMAL",	 TYPE_STRING,	  0},  \
+{ENB_CONFIG_STRING_PREFIX_TYPE_UL,                    NULL,   0,	   strptr:NULL,       defstrval:"NORMAL",	 TYPE_STRING,	  0},  \
+{ENB_CONFIG_STRING_EUTRA_BAND,                        NULL,   0,	   iptr:NULL,	      defintval:7,		 TYPE_UINT,	  0},  \
+{ENB_CONFIG_STRING_DOWNLINK_FREQUENCY,                NULL,   0,	   i64ptr:NULL,       defint64val:2680000000,	 TYPE_UINT64,	  0},  \
+{ENB_CONFIG_STRING_UPLINK_FREQUENCY_OFFSET,           NULL,   0,	   iptr:NULL,	      defintval:-120000000,	 TYPE_INT,	  0},  \
+{ENB_CONFIG_STRING_NID_CELL,                          NULL,   0,	   iptr:NULL,	      defintval:0,		 TYPE_UINT,	  0},  \
+{ENB_CONFIG_STRING_N_RB_DL,                           NULL,   0,	   iptr:NULL,	      defintval:25,		 TYPE_UINT,	  0},  \
+}
+#define LTECCPARAMS_FRAME_TYPE_IDX                  0
+#define LTECCPARAMS_TDD_CONFIG_IDX                  1
+#define LTECCPARAMS_TDD_CONFIG_S_IDX                2
+#define LTECCPARAMS_PREFIX_TYPE_IDX                 3
+#define LTECCPARAMS_PREFIX_TYPE_UL_IDX              4
+#define LTECCPARAMS_EUTRA_BAND_IDX                  5
+#define LTECCPARAMS_DOWNLINK_FREQUENCY_IDX          6
+#define LTECCPARAMS_UPLINK_FREQUENCY_OFFSET_IDX     7
+#define LTECCPARAMS_NID_CELL_IDX                    8
+#define LTECCPARAMS_N_RB_DL_IDX                     9
+
+
+/*-------------------------------------------------------------------------------------------------------------------*/
+
+/* NB-Iot RRC list section name */		
+#define NBIOT_RRCLIST_CONFIG_STRING          "NB-IoT_RRCs"		 
+
+
+#define RACH_RARESPONSEWINDOWSIZE_NB_OKVALUES                   {20,50,80,120,180,240,320,400}
+#define PREF1(A)                                                 RACH_CE_LevelInfo_r13__ra_ResponseWindowSize_r13_ ## A
+#define RACH_RARESPONSEWINDOWSIZE_NB_MODVALUES                  { PREF1(sf20),PREF1(sf50),PREF1(sf80),PREF1(sf120),    \
+                                                                  PREF1(sf180),PREF1(sf240),PREF1(sf320),PREF1(sf400) }
+
+
+#define RACH_MACCONTENTIONRESOLUTIONTIMER_NB_OKVALUES           {80,100,120,160,200,240,480,960} 
+#define PREF2(A)                                                 RACH_CE_LevelInfo_r13__mac_ContentionResolutionTimer_r13_ ## A 
+#define RACH_MACCONTENTIONRESOLUTIONTIMER_NB_MODVALUES          { PREF2(sf80),PREF2(sf100),PREF2(sf120),PREF2(sf160),    \
+                                                                  PREF2(sf200),PREF2(sf240),PREF2(sf480),PREF2(sf960) }
+
+
+#define RACH_POWERRAMPINGSTEP_NB_OKVALUES                       {0,2,4,6}
+#define PREF3(A)                                                 PowerRampingParameters__powerRampingStep_ ## A
+#define RACH_POWERRAMPINGSTEP_NB_MODVALUES                      { PREF3(dB0),PREF3(dB2),PREF3(dB4),PREF3(dB6) }
+
+
+#define RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER_NB_OKRANGE      {-120, -90}
+
+#define RACH_PREAMBLETRANSMAX_CE_NB_OKVALUES                    {3,4,5,6,7,8,10,20,50,100,200}
+#define PREF4(A)                                                PreambleTransMax_ ## A 
+#define RACH_PREAMBLETRANSMAX_CE_NB_MODVALUES                   { PREF4(n3), PREF4(n4), PREF4(n5), PREF4(n6),  PREF4(n7), PREF4(n8), \
+                                                                  PREF4(n10),PREF4(n20),PREF4(n50),PREF4(n100),PREF4(n200) }
+
+#define BCCH_MODIFICATIONPERIODCOEFF_NB_OKVALUES                {16,32,64,128}
+#define PREF5(A)                                                BCCH_Config_NB_r13__modificationPeriodCoeff_r13_ ## A 
+#define BCCH_MODIFICATIONPERIODCOEFF_NB_MODVALUES              { PREF5(n16), PREF5(n32), PREF5(n64),PREF5(n128) }
+
+#define PCCH_DEFAULTPAGINGCYCLE_NB_OKVALUES                     {128,256,512,1024}
+#define PREF6(A)                                                PCCH_Config_NB_r13__defaultPagingCycle_r13_ ## A 
+#define PCCH_DEFAULTPAGINGCYCLE_NB_MODVALUES                    { PREF6(rf128), PREF6(rf256), PREF6(rf512), PREF6(rf1024) }
+
+#define NPRACH_CP_LENGTH_OKVALUES                               {0,1}
+#define NPRACH_RSRP_RANGE_OKVALUES                              {0,96}
+
+#define MSG3RANGESTART_OKVALUES                                 {"zero","oneThird","twoThird","one"}
+#define MSG3RANGESTART_MODVALUES {NPRACH_Parameters_NB_r13__nprach_SubcarrierMSG3_RangeStart_r13_zero,     NPRACH_Parameters_NB_r13__nprach_SubcarrierMSG3_RangeStart_r13_oneThird, \
+                                  NPRACH_Parameters_NB_r13__nprach_SubcarrierMSG3_RangeStart_r13_twoThird, NPRACH_Parameters_NB_r13__nprach_SubcarrierMSG3_RangeStart_r13_one}
+
+
+#define MAXNUMPREAMBLEATTEMPTCE_OKVALUES    {3,4,5,6,7,8,10}
+#define MAXNUMPREAMBLEATTEMPTCE_MODVALUES   {  NPRACH_Parameters_NB_r13__maxNumPreambleAttemptCE_r13_n3, NPRACH_Parameters_NB_r13__maxNumPreambleAttemptCE_r13_n4, \
+                                               NPRACH_Parameters_NB_r13__maxNumPreambleAttemptCE_r13_n5, NPRACH_Parameters_NB_r13__maxNumPreambleAttemptCE_r13_n6, \
+                                               NPRACH_Parameters_NB_r13__maxNumPreambleAttemptCE_r13_n7, NPRACH_Parameters_NB_r13__maxNumPreambleAttemptCE_r13_n8, \
+                                               NPRACH_Parameters_NB_r13__maxNumPreambleAttemptCE_r13_n10 }
+
+#define NPDSCH_NRS_POWER_OKRANGE                                {-60,50}
+
+#define NPUSCH_ACK_NACK_NUMREPETITIONS_NB_OKVALUES              {1,2,4,8,16,32,64,128}
+#define PREF9(A)                                                ACK_NACK_NumRepetitions_NB_r13_ ## A 
+#define NPUSCH_ACK_NACK_NUMREPETITIONS_NB_MODVALUES             { PREF9(r1),   PREF9(r2),   PREF9(r4),   PREF9(r8), \
+                                                                  PREF9(r16),  PREF9(r32),  PREF9(r64),  PREF9(r128) }
+
+#define NPUSCH_SRS_SUBFRAMECONFIG_NB_OKRANGE                    {0,15}
+#define NPUSCH_THREETONE_CYCLICSHIFT_R13_OKRANGE                {0,2}
+#define NPUSCH_SIXTONE_CYCLICSHIFT_R13_OKRANGE                  {0,3}
+
+#define NPUSCH_GROUPHOPPINGENABLED_OKVALUES                     {"enable","disable"}
+#define NPUSCH_GROUPHOPPINGENABLED_MODVALUES                    {1,0}
+
+#define NPUSCH_GROUPASSIGNMENTNPUSCH_R13_OKRANGE                {0,29}
+
+#define DLGAPTHRESHOLD_OKVALUES	       {32,64,128,256}
+#define DLGAPTHRESHOLD_MODVALUES       { DL_GapConfig_NB_r13__dl_GapThreshold_r13_n32,  DL_GapConfig_NB_r13__dl_GapThreshold_r13_n64,  \
+                                         DL_GapConfig_NB_r13__dl_GapThreshold_r13_n128, DL_GapConfig_NB_r13__dl_GapThreshold_r13_n256} \
+
+#define DLGAPPERIODICITY_OKVALUES      {64,128,256,512}
+#define DLGAPPERIODICITY_MODVALUES     { DL_GapConfig_NB_r13__dl_GapPeriodicity_r13_sf64, DL_GapConfig_NB_r13__dl_GapPeriodicity_r13_sf128, \
+          		 	       DL_GapConfig_NB_r13__dl_GapPeriodicity_r13_sf256,DL_GapConfig_NB_r13__dl_GapPeriodicity_r13_sf512}
+
+#define DLGAPDURATION_OKVALUES         {"oneEighth","oneFourth","threeEighth","oneHalf"}
+#define DLGAPDURATION_MODVALUES        {DL_GapConfig_NB_r13__dl_GapDurationCoeff_r13_oneEighth,   DL_GapConfig_NB_r13__dl_GapDurationCoeff_r13_oneFourth, \
+                                        DL_GapConfig_NB_r13__dl_GapDurationCoeff_r13_threeEighth, DL_GapConfig_NB_r13__dl_GapDurationCoeff_r13_oneHalf}
+
+#define NPUSCH_P0_NOMINALNPUSCH_OKRANGE                         {-126,24}
+
+#define NPUSCH_ALPHA_OKVALUES                                    {"AL0","AL04","AL05","AL06","AL07","AL08","AL09","AL1"} 
+#define NPUSCH_ALPHA_MODVALUES                                   { Alpha_r12_al0, Alpha_r12_al04,  Alpha_r12_al05,  Alpha_r12_al06, \
+                                                                   Alpha_r12_al07, Alpha_r12_al08,  Alpha_r12_al09,  Alpha_r12_al1}
+
+#define DELTAPREAMBLEMSG3_OKRANGE                               {-1,6}	
+
+
+
+
+
+#define NBIOT_RRCPARAMS_CHECK_DESC { \
+             { .s1a= { config_check_modify_integer,     RACH_RARESPONSEWINDOWSIZE_NB_OKVALUES,          RACH_RARESPONSEWINDOWSIZE_NB_MODVALUES,          8}}, 	 \
+             { .s1a= { config_check_modify_integer,     RACH_MACCONTENTIONRESOLUTIONTIMER_NB_OKVALUES,  RACH_MACCONTENTIONRESOLUTIONTIMER_NB_MODVALUES,  8}},	 \
+             { .s1a= { config_check_modify_integer,     RACH_POWERRAMPINGSTEP_NB_OKVALUES,              RACH_POWERRAMPINGSTEP_NB_MODVALUES,              4}} ,    \
+             { .s2=  { config_check_intrange,           RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER_NB_OKRANGE}},   	    	  \
+             { .s1a= { config_check_modify_integer,     RACH_PREAMBLETRANSMAX_CE_NB_OKVALUES,           RACH_PREAMBLETRANSMAX_CE_NB_MODVALUES,          11}} ,    \
+             { .s1a= { config_check_modify_integer,     BCCH_MODIFICATIONPERIODCOEFF_NB_OKVALUES,       BCCH_MODIFICATIONPERIODCOEFF_NB_MODVALUES,       4}} ,    \
+             { .s1a= { config_check_modify_integer,     PCCH_DEFAULTPAGINGCYCLE_NB_OKVALUES,            PCCH_DEFAULTPAGINGCYCLE_NB_MODVALUES,            4}} ,    \
+             { .s1=  { NULL,		           NPRACH_CP_LENGTH_OKVALUES ,4}} ,			     	    	  \
+             { .s2=  { config_check_intrange,	        NPRACH_RSRP_RANGE_OKVALUES}} ,			     	    	  \
+             { .s3a= { config_checkstr_assign_integer,  MSG3RANGESTART_OKVALUES,                        MSG3RANGESTART_MODVALUES,                       4}} ,    \
+             { .s1a= { config_check_modify_integer,     MAXNUMPREAMBLEATTEMPTCE_OKVALUES,               MAXNUMPREAMBLEATTEMPTCE_MODVALUES,              7}} ,    \
+             { .s1=  { config_check_intval,             NPDSCH_NRS_POWER_OKRANGE,4}} ,			     	     	  \
+             { .s1a= { config_check_modify_integer,     NPUSCH_ACK_NACK_NUMREPETITIONS_NB_OKVALUES,     NPUSCH_ACK_NACK_NUMREPETITIONS_NB_MODVALUES,    8}} ,    \
+             { .s2=  { config_check_intrange,           NPUSCH_SRS_SUBFRAMECONFIG_NB_OKRANGE}} , 	             	     	  \
+             { .s2=  { config_check_intrange,           NPUSCH_THREETONE_CYCLICSHIFT_R13_OKRANGE}} ,	     	     	  \
+             { .s2=  { config_check_intrange,           NPUSCH_SIXTONE_CYCLICSHIFT_R13_OKRANGE}} ,	             	     	  \
+             { .s3a= { config_checkstr_assign_integer,  NPUSCH_GROUPHOPPINGENABLED_OKVALUES,          NPUSCH_GROUPHOPPINGENABLED_MODVALUES,            2}} ,    \
+             { .s2=  { config_check_intrange,           NPUSCH_GROUPASSIGNMENTNPUSCH_R13_OKRANGE}} ,	     	     	  \
+             { .s1a= { config_check_modify_integer,     DLGAPTHRESHOLD_OKVALUES,                       DLGAPTHRESHOLD_MODVALUES,                        4}} ,    \
+             { .s1a= { config_check_modify_integer,     DLGAPPERIODICITY_OKVALUES,                     DLGAPPERIODICITY_MODVALUES,                      4}} ,    \
+             { .s3a= { config_checkstr_assign_integer,  DLGAPDURATION_OKVALUES,                        DLGAPDURATION_MODVALUES ,                        4}} ,    \
+             { .s2=  { config_check_intrange,           NPUSCH_P0_NOMINALNPUSCH_OKRANGE}} ,		     	     	  \
+             { .s3a= { config_checkstr_assign_integer,  NPUSCH_ALPHA_OKVALUES,                        NPUSCH_ALPHA_MODVALUES,                          8}} ,    \
+             { .s2=  { config_check_intrange,           DELTAPREAMBLEMSG3_OKRANGE}} ,			     	     	  \
+             { .s1a= { config_check_modify_integer,    UETIMER_T300_OKVALUES, UETIMER_T300_MODVALUES,8}} ,	     \
+             { .s1a= { config_check_modify_integer,    UETIMER_T301_OKVALUES, UETIMER_T301_MODVALUES,8}} ,	     \
+             { .s1a= { config_check_modify_integer,    UETIMER_T310_OKVALUES, UETIMER_T310_MODVALUES,7}} ,	     \
+             { .s1a= { config_check_modify_integer,    UETIMER_T311_OKVALUES, UETIMER_T311_MODVALUES,7}} ,	     \
+             { .s1a= { config_check_modify_integer,    UETIMER_N310_OKVALUES, UETIMER_N310_MODVALUES,8}} ,	     \
+             { .s1a= { config_check_modify_integer,    UETIMER_N311_OKVALUES, UETIMER_N311_MODVALUES,8}} ,	     \
+}
+/*-----------------------------------------------------------------------------------------------------------------------------------------*/
+/*                                                           NB-IoT RRC  configuration parameters                                          */
+/*   optname                                       helpstr   paramflags    XXXptr	 defXXXval		      type	   numelt  */
+/*-----------------------------------------------------------------------------------------------------------------------------------------*/
+#define NBIOTRRCPARAMS_DESC { \
+{"rach_raResponseWindowSize_NB",                   NULL,   0,		   uptr:NULL,	 defintval:20,  	TYPE_UINT,	 0},  \
+{"rach_macContentionResolutionTimer_NB",           NULL,   0,		   uptr:NULL,	 defintval:80,  	TYPE_UINT,	 0},  \
+{"rach_powerRampingStep_NB",                       NULL,   0,		   uptr:NULL,	 defintval:0,		TYPE_UINT,	 0},  \
+{"rach_preambleInitialReceivedTargetPower_NB",     NULL,   0,		   iptr:NULL,	 defintval:-112,	TYPE_INT32,	 0},  \
+{"rach_preambleTransMax_CE_NB",                    NULL,   0,		   uptr:NULL,	 defintval:3,		TYPE_UINT,	 0},  \
+{"bcch_modificationPeriodCoeff_NB",                NULL,   0,		   uptr:NULL,	 defintval:16,		TYPE_UINT,	 0},  \
+{"pcch_defaultPagingCycle_NB",                     NULL,   0,		   uptr:NULL,	 defintval:256,		TYPE_UINT,	 0},  \
+{"nprach_CP_Length",                               NULL,   0,		   uptr:NULL,	 defintval:0,		TYPE_UINT,	 0},  \
+{"nprach_rsrp_range",                              NULL,   0,		   uptr:NULL,	 defintval:0,		TYPE_UINT,	 0},  \
+{"nprach_SubcarrierMSG3_RangeStart",               NULL,   0,		   strptr:NULL,  defstrval:"one",	TYPE_STRING,	 0},  \
+{"maxNumPreambleAttemptCE_NB",                     NULL,   0,		   uptr:NULL,	 defintval:10,  	TYPE_UINT,	 0},  \
+{"npdsch_nrs_Power",                               NULL,   0,		   iptr:NULL,	 defintval:0,		TYPE_INT,	 0},  \
+{"npusch_ack_nack_numRepetitions_NB",              NULL,   0,		   uptr:NULL,	 defintval:1,		TYPE_UINT,	 0},  \
+{"npusch_srs_SubframeConfig_NB",                   NULL,   0,		   uptr:NULL,	 defintval:0,		TYPE_UINT,	 0},  \
+{"npusch_threeTone_CyclicShift_r13",               NULL,   0,		   uptr:NULL,	 defintval:0,		TYPE_UINT,	 0},  \
+{"npusch_sixTone_CyclicShift_r13",                 NULL,   0,		   uptr:NULL,	 defintval:0,		TYPE_UINT,	 0},  \
+{"npusch_groupHoppingEnabled",                     NULL,   0,              strptr:NULL,	 defstrval:"disable",	TYPE_STRING,	 0},  \
+{"npusch_groupAssignmentNPUSCH_r13",               NULL,   0,		   uptr:NULL,	 defintval:0,		TYPE_UINT,	 0},  \
+{"dl_GapThreshold_NB",                             NULL,   0,		   uptr:NULL,	 defintval:32,  	TYPE_UINT,	 0},  \
+{"dl_GapPeriodicity_NB",                           NULL,   0,		   uptr:NULL,	 defintval:64,  	TYPE_UINT,	 0},  \
+{"dl_GapDurationCoeff_NB",                         NULL,   0,		   strptr:NULL,  defstrval:"oneEighth", TYPE_STRING,	 0},  \
+{"npusch_p0_NominalNPUSCH",                        NULL,   0,		   iptr:NULL,	 defintval:0,		TYPE_INT32,	 0},  \
+{"npusch_alpha",                                   NULL,   0,		   strptr:NULL,	 defstrval:"AL0",  	TYPE_STRING,	 0},  \
+{"deltaPreambleMsg3",                              NULL,   0,		   iptr:NULL,	 defintval:0,		TYPE_INT32,	 0},  \
+{"ue_TimersAndConstants_t300_NB",                  NULL,   0,		   uptr:NULL,	 defintval:1000,	TYPE_UINT,	 0},  \
+{"ue_TimersAndConstants_t301_NB",                  NULL,   0,		   uptr:NULL,	 defintval:1000,	TYPE_UINT,	 0},  \
+{"ue_TimersAndConstants_t310_NB",                  NULL,   0,		   uptr:NULL,	 defintval:1000,	TYPE_UINT,	 0},  \
+{"ue_TimersAndConstants_t311_NB",                  NULL,   0,		   uptr:NULL,	 defintval:10000,	TYPE_UINT,	 0},  \
+{"ue_TimersAndConstants_n310_NB",                  NULL,   0,		   uptr:NULL,	 defintval:20,  	TYPE_UINT,	 0},  \
+{"ue_TimersAndConstants_n311_NB",                  NULL,   0,		   uptr:NULL,	 defintval:1,		TYPE_UINT,	 0},  \
+}								    
+
+#define NBIOT_RACH_RARESPONSEWINDOWSIZE_NB_IDX                         0	   
+#define NBIOT_RACH_MACCONTENTIONRESOLUTIONTIMER_NB_IDX                 1
+#define NBIOT_RACH_POWERRAMPINGSTEP_NB_IDX                             2
+#define NBIOT_RACH_PREAMBLEINITIALRECEIVEDTARGETPOWER_NB_IDX           3
+#define NBIOT_RACH_PREAMBLETRANSMAX_CE_NB_IDX                          4		   
+#define NBIOT_BCCH_MODIFICATIONPERIODCOEFF_NB_IDX                      5
+#define NBIOT_PCCH_DEFAULTPAGINGCYCLE_NB_IDX                           6
+#define NBIOT_NPRACH_CP_LENGTH_IDX                                     7
+#define NBIOT_NPRACH_RSRP_RANGE_IDX                                    8
+#define NBIOT_NPRACH_SUBCARRIERMSG3_RANGESTART_IDX                     9
+#define NBIOT_MAXNUMPREAMBLEATTEMPTCE_NB_IDX                           10
+#define NBIOT_NPDSCH_NRS_POWER_IDX                                     11
+#define NBIOT_NPUSCH_ACK_NACK_NUMREPETITIONS_NB_IDX                    12
+#define NBIOT_NPUSCH_SRS_SUBFRAMECONFIG_NB_IDX                         13
+#define NBIOT_NPUSCH_THREETONE_CYCLICSHIFT_R13_IDX                     14
+#define NBIOT_NPUSCH_SIXTONE_CYCLICSHIFT_R13_IDX                       15
+#define NBIOT_NPUSCH_GROUPHOPPINGENABLED_IDX                           16
+#define NBIOT_NPUSCH_GROUPASSIGNMENTNPUSCH_R13_IDX                     17
+#define NBIOT_DL_GAPTHRESHOLD_NB_IDX                                   18
+#define NBIOT_DL_GAPPERIODICITY_NB_IDX                                 19
+#define NBIOT_DL_GAPDURATIONCOEFF_NB_IDX                               20
+#define NBIOT_NPUSCH_P0_NOMINALNPUSCH_IDX                              21
+#define NBIOT_NPUSCH_ALPHA_IDX                                         22
+#define NBIOT_DELTAPREAMBLEMSG3_IDX                                    23
+#define NBIOT_UE_TIMERSANDCONSTANTS_T300_NB_IDX                        24
+#define NBIOT_UE_TIMERSANDCONSTANTS_T301_NB_IDX                        25
+#define NBIOT_UE_TIMERSANDCONSTANTS_T310_NB_IDX                        26
+#define NBIOT_UE_TIMERSANDCONSTANTS_T311_NB_IDX                        27
+#define NBIOT_UE_TIMERSANDCONSTANTS_N310_NB_IDX                        28
+#define NBIOT_UE_TIMERSANDCONSTANTS_N311_NB_IDX                        29
+
+/* NB-Iot RRC: link to LTE RRC section name */		
+#define NBIOT_LTERRCREF_CONFIG_STRING          "LTERRC_Ref"
+/*---------------------------------------------------------------------------------------------------------------*/
+/*          NB-IoT RRC configuration parameters to link to a LTE RRC instance (in-guard, in-band)                */
+/*   optname                        helpstr   paramflags    XXXptr	 defXXXval	   type	         numelt  */
+/*---------------------------------------------------------------------------------------------------------------*/
+#define NBIOTRRCPARAMS_RRCREF_DESC { \
+{"RRC_inst",                         NULL,   0,            uptr:NULL,     defintval:0,	  TYPE_UINT,	   0},  \
+{"CC_inst",                          NULL,   0,            uptr:NULL,     defintval:0, 	  TYPE_UINT,	   0},  \
+}
+/*--------------------------------------------------------------------------------------------------------------*/
+#define NBIOT_RRCINST_IDX             0
+#define NBIOT_CCINST_IDX              1
+
+#define NBIOT_RRCLIST_NPRACHPARAMS_CONFIG_STRING        "NPRACH-NB-r13"
+
+
+#define  NPRACH_PERIODICITY_OKVALUES   {40,80,160,240,320,640,1280,2560}
+#define  NPRACH_PERIODICITY_MODVALUES  { NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms40,   NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms80,  \
+                                         NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms160,  NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms240, \
+                                         NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms320,  NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms640, \
+                                         NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms1280, NPRACH_Parameters_NB_r13__nprach_Periodicity_r13_ms2560 }
+
+#define  NPRACH_STARTTIME_OKVALUES   {8,16,32,64,128,256,512,1024}
+#define  NPRACH_STARTTIME_MODVALUES  {  NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms8,   NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms16,        \
+                                        NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms32,  NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms64,        \
+                                        NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms128, NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms256,       \
+                                        NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms512, NPRACH_Parameters_NB_r13__nprach_StartTime_r13_ms1024 }
+    
+#define  NPRACH_SUBCARRIEROFFSET_OKVALUES      {0,12,24,36,2,18,34}
+#define  NPRACH_SUBCARRIEROFFSET_MODVALUES     {  NPRACH_Parameters_NB_r13__nprach_SubcarrierOffset_r13_n0,  NPRACH_Parameters_NB_r13__nprach_SubcarrierOffset_r13_n12, \
+                                                  NPRACH_Parameters_NB_r13__nprach_SubcarrierOffset_r13_n24, NPRACH_Parameters_NB_r13__nprach_SubcarrierOffset_r13_n36, \
+                                                  NPRACH_Parameters_NB_r13__nprach_SubcarrierOffset_r13_n2,  NPRACH_Parameters_NB_r13__nprach_SubcarrierOffset_r13_n18, \
+                                                  NPRACH_Parameters_NB_r13__nprach_SubcarrierOffset_r13_n34 }
+
+#define  NPRACH_NUMSUBCARRIERS_OKVALUES      {12,24,36,48}
+#define  NPRACH_NUMSUBCARRIERS_MODVALUES     {  NPRACH_Parameters_NB_r13__nprach_NumSubcarriers_r13_n12, NPRACH_Parameters_NB_r13__nprach_NumSubcarriers_r13_n24, \
+                                                NPRACH_Parameters_NB_r13__nprach_NumSubcarriers_r13_n36, NPRACH_Parameters_NB_r13__nprach_NumSubcarriers_r13_n48 }
+
+
+#define  NUMREPETITIONSPERPREAMBLEATTEMPT_OKVALUES  {1,2,4,8,16,32,64,128}
+#define  NUMREPETITIONSPERPREAMBLEATTEMPT_MODVALUES {  NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n1,  NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n2,   \
+                                                       NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n4,  NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n8,   \
+                                                       NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n16, NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n32,  \
+                                                       NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n64, NPRACH_Parameters_NB_r13__numRepetitionsPerPreambleAttempt_r13_n128} 
+
+#define  NPDCCHNUMREPETITIONSRA_OKVALUES  {1,2,4,8,16,32,64,128,256,512,1024,2048}
+#define  NPDCCHNUMREPETITIONSRA_MODVALUES {  NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r1,   NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r2,	\
+                                    	     NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r4,   NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r8,	\
+                                    	     NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r16,  NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r32,	\
+                                    	     NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r64,  NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r128,  \
+                                    	     NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r256, NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r512,  \
+                                    	     NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r1024,NPRACH_Parameters_NB_r13__npdcch_NumRepetitions_RA_r13_r2048}
+
+#define  NPDCCHSTARTSFCSSRA_OKVALUES  {1,2,4,8,16,32,48,64}
+#define  NPDCCHSTARTSFCSSRA_MODVALUES {  NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v1dot5,  NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v2,	\
+                                         NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v4,      NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v8,   \
+                                         NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v16,     NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v32,  \
+                                         NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v48,     NPRACH_Parameters_NB_r13__npdcch_StartSF_CSS_RA_r13_v64}
+
+#define  NPDCCHOFFSETRA_OKVALUES    {"zero","oneEighth","oneFourth","threeEighth"}
+#define  NPDCCHOFFSETRA_MODVALUES   { NPRACH_Parameters_NB_r13__npdcch_Offset_RA_r13_zero,	NPRACH_Parameters_NB_r13__npdcch_Offset_RA_r13_oneEighth,     \
+                                      NPRACH_Parameters_NB_r13__npdcch_Offset_RA_r13_oneFourth, NPRACH_Parameters_NB_r13__npdcch_Offset_RA_r13_threeEighth}
+
+
+
+#define NBIOT_RRCLIST_NPRACHPARAMSCHECK_DESC { \
+             { .s1a= { config_check_modify_integer,    NPRACH_PERIODICITY_OKVALUES,		  NPRACH_PERIODICITY_MODVALUES, 	     8 }},	\
+             { .s1a= { config_check_modify_integer,    NPRACH_STARTTIME_OKVALUES,		  NPRACH_STARTTIME_MODVALUES,  	             8 }},	\
+             { .s1a= { config_check_modify_integer,    NPRACH_SUBCARRIEROFFSET_OKVALUES,	  NPRACH_SUBCARRIEROFFSET_MODVALUES,	     7 }},	\
+             { .s1a= { config_check_modify_integer,    NPRACH_NUMSUBCARRIERS_OKVALUES,  	  NPRACH_NUMSUBCARRIERS_MODVALUES,	     4 }},	\
+             { .s1a= { config_check_modify_integer,    NUMREPETITIONSPERPREAMBLEATTEMPT_OKVALUES, NUMREPETITIONSPERPREAMBLEATTEMPT_MODVALUES,8 }},	\
+             { .s1a= { config_check_modify_integer,    NPDCCHNUMREPETITIONSRA_OKVALUES, 	  NPDCCHNUMREPETITIONSRA_MODVALUES,	     12}},	\
+             { .s1a= { config_check_modify_integer,    NPDCCHSTARTSFCSSRA_OKVALUES,		  NPDCCHSTARTSFCSSRA_MODVALUES,	             8 }},	\
+             { .s3a= { config_checkstr_assign_integer, NPDCCHOFFSETRA_OKVALUES,                   NPDCCHOFFSETRA_MODVALUES,                  4 }},	\
+}
+
+
+
+/*------------------------------------------------------------------------------------------------------------------------------*/
+/* NB-IoT NPrach parameters, there will be three ocuurences of these parameters in each RRC instance                            */
+ /*   optname                                helpstr   paramflags    XXXptr	 defXXXval		  type	        numelt  */
+/*------------------------------------------------------------------------------------------------------------------------------*/
+#define NBIOTRRC_NPRACH_PARAMS_DESC { \
+{"nprach_Periodicity",                        NULL,   0,            uptr:NULL,     defintval:320,	  TYPE_UINT,	   0},  \
+{"nprach_StartTime",                          NULL,   0,            uptr:NULL,     defintval:8, 	  TYPE_UINT,	   0},  \
+{"nprach_SubcarrierOffset",                   NULL,   0,            uptr:NULL,     defintval:0, 	  TYPE_UINT,	   0},  \
+{"nprach_NumSubcarriers",                     NULL,   0,            uptr:NULL,     defintval:12,	  TYPE_UINT,	   0},  \
+{"numRepetitionsPerPreambleAttempt",          NULL,   0,            uptr:NULL,     defintval:2, 	  TYPE_UINT,	   0},  \
+{"npdcch_NumRepetitions_RA",                  NULL,   0,            uptr:NULL,     defintval:16,	  TYPE_UINT,	   0},  \
+{"npdcch_StartSF_CSS_RA",                     NULL,   0,            uptr:NULL,     defintval:2,	          TYPE_UINT,       0},  \
+{"npdcch_Offset_RA",                          NULL,   0,            strptr:NULL,   defstrval:"zero",      TYPE_STRING,     0},  \
+}
+
+#define NBIOT_NPRACH_PERIODICITY_IDX                                   0
+#define NBIOT_NPRACH_STARTTIME_IDX                                     1
+#define NBIOT_NPRACH_SUBCARRIEROFFSET_IDX                              2
+#define NBIOT_NPRACH_NUMSUBCARRIERS_IDX                                3
+#define NBIOT_NUMREPETITIONSPERPREAMBLEATTEMPT_NB_IDX                  4
+#define NBIOT_NPDCCH_NUMREPETITIONS_RA_IDX                             5
+#define NBIOT_NPDCCH_STARTSF_CSS_RA_IDX                                6
+#define NBIOT_NPDCCH_OFFSET_RA_IDX                                     7
+
+/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+/* NB IoT MACRLC configuration list section name   */
+#define NBIOT_MACRLCLIST_CONFIG_STRING                          "NB-IoT_MACRLCs"
+
+
+/*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+/* NB IoT L1 configuration list section name   */
+#define NBIOT_L1LIST_CONFIG_STRING                          "NB-IoT_L1s"
diff --git a/openair2/UTIL/LOG/log.c b/openair2/UTIL/LOG/log.c
index 948425e8daa27b45643b2bca6587953ea9b0beab..ff6a5cd5739a85b1694324b88cb4785941805c33 100644
--- a/openair2/UTIL/LOG/log.c
+++ b/openair2/UTIL/LOG/log.c
@@ -34,6 +34,7 @@
 #define COMPONENT_LOG
 #define COMPONENT_LOG_IF
 #include <ctype.h>
+#define LOG_MAIN
 #include "log.h"
 #include "vcd_signal_dumper.h"
 #include "assertions.h"
@@ -46,7 +47,7 @@
 # include <string.h>
 #include "common/config/config_userapi.h"
 // main log variables
-log_t *g_log;
+
 
 mapping log_level_names[] = {
   {"emerg", LOG_EMERG},
@@ -1562,7 +1563,7 @@ int set_log(int component, int level, int interval)
            component, MIN_LOG_COMPONENTS, MAX_LOG_COMPONENTS);
   DevCheck((level <= LOG_TRACE) && (level >= LOG_EMERG), level, LOG_TRACE,
            LOG_EMERG);
-  DevCheck((interval > 0) && (interval <= 0xFF), interval, 0, 0xFF);
+  DevCheck((interval >= 0) && (interval <= 0xFF), interval, 0, 0xFF);
 
   g_log->log_component[component].level = level;
 
@@ -1596,7 +1597,7 @@ int set_comp_log(int component, int level, int verbosity, int interval)
            component, MIN_LOG_COMPONENTS, MAX_LOG_COMPONENTS);
   DevCheck((level <= LOG_TRACE) && (level >= LOG_EMERG), level, LOG_TRACE,
            LOG_EMERG);
-  DevCheck((interval > 0) && (interval <= 0xFF), interval, 0, 0xFF);
+  DevCheck((interval >= 0) && (interval <= 0xFF), interval, 0, 0xFF);
 
 #if 0
   if ((verbosity == LOG_NONE) || (verbosity == LOG_LOW) ||
diff --git a/openair2/UTIL/LOG/log.h b/openair2/UTIL/LOG/log.h
index c21407f6eb51854c2eb7bb0ab432dffd9ab057f2..00bc334de5b3a25e8a00ead69f68889c18179a9b 100644
--- a/openair2/UTIL/LOG/log.h
+++ b/openair2/UTIL/LOG/log.h
@@ -253,7 +253,17 @@ typedef enum log_instance_type_e {
 void log_set_instance_type (log_instance_type_t instance);
 #endif
 
-
+#ifdef LOG_MAIN
+log_t *g_log;
+#else
+#ifdef __cplusplus
+   extern "C" {
+#endif
+extern log_t *g_log;
+#ifdef __cplusplus
+}
+#endif
+#endif
 /*--- INCLUDES ---------------------------------------------------------------*/
 #    include "log_if.h"
 /*----------------------------------------------------------------------------*/
@@ -279,9 +289,9 @@ void *log_thread_function(void * list);
  *  @brief Macro used to call tr_log_full_ex with file, function and line information
  * @{*/
 #ifdef LOG_NO_THREAD
-#define logIt(component, level, format, args...) logRecord_mt(__FILE__, __FUNCTION__, __LINE__, component, level, format, ##args)
+#define logIt(component, level, format, args...) (g_log->log_component[component].interval?logRecord_mt(__FILE__, __FUNCTION__, __LINE__, component, level, format, ##args):(void)0)
 #else //default
-#define logIt(component, level, format, args...) logRecord(__FILE__, __FUNCTION__, __LINE__, component, level, format, ##args)
+#define logIt(component, level, format, args...) (g_log->log_component[component].interval?logRecord(__FILE__, __FUNCTION__, __LINE__, component, level, format, ##args):(void)0)
 #endif
 /* @}*/
 
diff --git a/targets/ARCH/COMMON/common_lib.c b/targets/ARCH/COMMON/common_lib.c
index eb9f80872e0093ec237ff34a3064cc8c332e8d95..d74b1c6d4fed2d65640c1d5989e2ec846c642dcf 100644
--- a/targets/ARCH/COMMON/common_lib.c
+++ b/targets/ARCH/COMMON/common_lib.c
@@ -36,6 +36,7 @@
 #include <string.h>
 
 #include "common_lib.h"
+#include "common/utils/load_module_shlib.h"
 
 int set_device(openair0_device *device) {
 
@@ -85,52 +86,26 @@ int set_transport(openair0_device *device) {
   }
   
 }
-
+typedef int(*devfunc_t)(openair0_device *, openair0_config_t *, eth_params_t *);
 /* look for the interface library and load it */
 int load_lib(openair0_device *device, openair0_config_t *openair0_cfg, eth_params_t * cfg, uint8_t flag) {
   
-  void *lib_handle;
-  oai_device_initfunc_t dp ;
-  oai_transport_initfunc_t tp ;
+  loader_shlibfunc_t shlib_fdesc[1];
   int ret=0;
-
+  char *libname;
   if (flag == RAU_LOCAL_RADIO_HEAD) {
-      lib_handle = dlopen(OAI_RF_LIBNAME, RTLD_LAZY);
-      if (!lib_handle) {
-	fprintf(stderr,"Unable to locate %s: HW device set to NONE_DEV.\n", OAI_RF_LIBNAME);
-	fprintf(stderr,"%s\n",dlerror());
-	return -1;
-      } 
-      
-      dp = dlsym(lib_handle,"device_init");
-      
-      if (dp != NULL ) {
-	ret = dp(device,openair0_cfg);
-	if (ret<0) {
-	  fprintf(stderr, "%s %d:oai device intialization failed %s\n", __FILE__, __LINE__, dlerror());
-	}
-      } else {
-	fprintf(stderr, "%s %d:oai device intializing function not found %s\n", __FILE__, __LINE__, dlerror());
-	return -1;
-      }
+      libname=OAI_RF_LIBNAME;
+      shlib_fdesc[0].fname="device_init";
     } else {
-      lib_handle = dlopen(OAI_TP_LIBNAME, RTLD_LAZY);
-      if (!lib_handle) {
-	printf( "Unable to locate %s: transport protocol set to NONE_TP.\n", OAI_TP_LIBNAME);
-	printf( "%s\n",dlerror());
-	return -1;
-      } 
-      
-      tp = dlsym(lib_handle,"transport_init");
-      
-      if (tp != NULL ) {
-	tp(device,openair0_cfg,cfg);
-      } else {
-	fprintf(stderr, "%s %d:oai device intializing function not found %s\n", __FILE__, __LINE__, dlerror());
-	return -1;
-      }
+      libname=OAI_TP_LIBNAME;
+      shlib_fdesc[0].fname="transport_init";      
     } 
-    
+  ret=load_module_shlib(libname,shlib_fdesc,1);
+  if (ret < 0) {
+       fprintf(stderr,"Library %s couldn't be loaded\n",libname);
+  } else {
+       ret=((devfunc_t)shlib_fdesc[0].fptr)(device,openair0_cfg,cfg);
+  }    
   return ret; 	       
 }
 
diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h
index 2dc1650bfd719208ef5e182b0b79f76e5f12ff55..433e29e97db7b15322b51d8f3282daa91b922c09 100644
--- a/targets/ARCH/COMMON/common_lib.h
+++ b/targets/ARCH/COMMON/common_lib.h
@@ -36,9 +36,9 @@
 #include <sys/types.h>
 
 /* name of shared library implementing the radio front end */
-#define OAI_RF_LIBNAME        "liboai_device.so"
+#define OAI_RF_LIBNAME        "oai_device"
 /* name of shared library implementing the transport */
-#define OAI_TP_LIBNAME        "liboai_transpro.so"
+#define OAI_TP_LIBNAME        "oai_transpro"
 
 /* flags for BBU to determine whether the attached radio head is local or remote */
 #define RAU_LOCAL_RADIO_HEAD  0
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index f6789086b4ebc3fa4bc594de44f84b04a7269a82..bbf35cffa09034180713d91534310f5727cb74d3 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -135,11 +135,11 @@ volatile int             oai_exit = 0;
 static clock_source_t clock_source = internal;
 static int wait_for_sync = 0;
 
-static char              UE_flag=0;
+static int8_t              UE_flag=0;
 unsigned int                    mmapped_dma=0;
 int                             single_thread_flag=1;
 
-static char                     threequarter_fs=0;
+static int8_t                     threequarter_fs=0;
 
 uint32_t                 downlink_frequency[MAX_NUM_CCs][4];
 int32_t                  uplink_frequency_offset[MAX_NUM_CCs][4];
@@ -570,7 +570,7 @@ void *l2l1_task(void *arg) {
 
 static void get_options(void) {
   int CC_id;
-  int tddflag;
+  int tddflag, nonbiotflag;
   char *loopfile=NULL;
   int dumpframe;
   uint32_t online_log_messages;
@@ -627,10 +627,10 @@ static void get_options(void) {
       if ( (cmdline_uemodeparams[CMDLINE_CALIBUERX_IDX].paramflags &  PARAMFLAG_PARAMSET) != 0) mode = rx_calib_ue;
       if ( (cmdline_uemodeparams[CMDLINE_CALIBUERXMED_IDX].paramflags &  PARAMFLAG_PARAMSET) != 0) mode = rx_calib_ue_med;
       if ( (cmdline_uemodeparams[CMDLINE_CALIBUERXBYP_IDX].paramflags &  PARAMFLAG_PARAMSET) != 0) mode = rx_calib_ue_byp;
-      if ( (cmdline_uemodeparams[CMDLINE_DEBUGUEPRACH_IDX].paramflags &  PARAMFLAG_PARAMSET) != 0) mode = debug_prach;
-      if ( (cmdline_uemodeparams[CMDLINE_NOL2CONNECT_IDX].paramflags &  PARAMFLAG_PARAMSET) != 0)  mode = no_L2_connect;
-      if ( (cmdline_uemodeparams[CMDLINE_CALIBPRACHTX_IDX].paramflags &  PARAMFLAG_PARAMSET) != 0) mode = calib_prach_tx;
-      if ( (cmdline_uemodeparams[CMDLINE_DUMPMEMORY_IDX].paramflags &  PARAMFLAG_PARAMSET) != 0) mode = rx_dump_frame;
+      if ( *(cmdline_uemodeparams[CMDLINE_DEBUGUEPRACH_IDX].uptr) > 0) mode = debug_prach;
+      if ( *(cmdline_uemodeparams[CMDLINE_NOL2CONNECT_IDX].uptr) > 0)  mode = no_L2_connect;
+      if ( *(cmdline_uemodeparams[CMDLINE_CALIBPRACHTX_IDX].uptr) > 0) mode = calib_prach_tx; 
+      if (dumpframe  > 0)  mode = rx_dump_frame;
       
       if ( downlink_frequency[0][0] > 0) {
 	printf("Downlink frequency set to %u\n", downlink_frequency[0][0]);
@@ -645,35 +645,36 @@ static void get_options(void) {
 	     frame_parms[CC_id]->frame_type = TDD;
       }
 
-      if (n_rb_dl !=0) {
-	printf("NB_RB set to %d\n",n_rb_dl);
-	if ( n_rb_dl < 6 ) {
-	  n_rb_dl = 6;
-	  printf ( "%i: Invalid number of ressource blocks, adjusted to 6\n",n_rb_dl);
-	}
-	if ( n_rb_dl > 100 ) {
-	  n_rb_dl = 100;
-	  printf ( "%i: Invalid number of ressource blocks, adjusted to 100\n",n_rb_dl);
-	}
-	if ( n_rb_dl > 50 && n_rb_dl < 100 ) {
-	  n_rb_dl = 50;
-	  printf ( "%i: Invalid number of ressource blocks, adjusted to 50\n",n_rb_dl);
-	}
-	if ( n_rb_dl > 25 && n_rb_dl < 50 ) {
-	  n_rb_dl = 25;
-	  printf ( "%i: Invalid number of ressource blocks, adjusted to 25\n",n_rb_dl);
-	}
-	UE_scan = 0;
-	for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
-	  frame_parms[CC_id]->N_RB_DL=n_rb_dl;
-	  frame_parms[CC_id]->N_RB_UL=n_rb_dl;
-	}
+      if (frame_parms[0]->N_RB_DL !=0) {
+  	  if ( frame_parms[0]->N_RB_DL < 6 ) {
+  	     frame_parms[0]->N_RB_DL = 6;
+  	     printf ( "%i: Invalid number of ressource blocks, adjusted to 6\n",frame_parms[0]->N_RB_DL);
+  	  }
+  	  if ( frame_parms[0]->N_RB_DL > 100 ) {
+  	     frame_parms[0]->N_RB_DL = 100;
+  	     printf ( "%i: Invalid number of ressource blocks, adjusted to 100\n",frame_parms[0]->N_RB_DL);
+  	  }
+  	  if ( frame_parms[0]->N_RB_DL > 50 && frame_parms[0]->N_RB_DL < 100 ) {
+  	     frame_parms[0]->N_RB_DL = 50;
+  	     printf ( "%i: Invalid number of ressource blocks, adjusted to 50\n",frame_parms[0]->N_RB_DL);
+  	  }
+  	  if ( frame_parms[0]->N_RB_DL > 25 && frame_parms[0]->N_RB_DL < 50 ) {
+  	     frame_parms[0]->N_RB_DL = 25;
+  	     printf ( "%i: Invalid number of ressource blocks, adjusted to 25\n",frame_parms[0]->N_RB_DL);
+  	  }
+  	  UE_scan = 0;
+  	  frame_parms[0]->N_RB_UL=frame_parms[0]->N_RB_DL;
+  	  for (CC_id=1; CC_id<MAX_NUM_CCs; CC_id++) {
+  	      frame_parms[CC_id]->N_RB_DL=frame_parms[0]->N_RB_DL;
+  	      frame_parms[CC_id]->N_RB_UL=frame_parms[0]->N_RB_UL;
+  	  }
       }
 
-      for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
-	tx_max_power[CC_id]=tx_max_power[0];
-	rx_gain[0][CC_id] = rx_gain[0][0];
-	tx_gain[0][CC_id] = tx_gain[0][0];
+
+      for (CC_id=1;CC_id<MAX_NUM_CCs;CC_id++) {
+  	    tx_max_power[CC_id]=tx_max_power[0];
+	    rx_gain[0][CC_id] = rx_gain[0][0];
+	    tx_gain[0][CC_id] = tx_gain[0][0];
       }
   } /* UE_flag > 0 */
 
diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h
index 5cc4d5fea2d70208ba76151f08240671628f137c..1d594caadc932380d86ca88b3f31e5eec728855d 100644
--- a/targets/RT/USER/lte-softmodem.h
+++ b/targets/RT/USER/lte-softmodem.h
@@ -85,7 +85,7 @@
 #define CONFIG_HLP_TPORT         "tracer port\n"
 #define CONFIG_HLP_NOTWAIT       "don't wait for tracer, start immediately\n"
 #define CONFIG_HLP_TNOFORK       "to ease debugging with gdb\n"
-
+#define CONFIG_HLP_DISABLNBIOT   "disable nb-iot, even if defined in config\n"
 
 /***************************************************************************************************************************************/
 /* command line options definitions, CMDLINE_XXXX_DESC macros are used to initialize paramdef_t arrays which are then used as argument 
@@ -129,7 +129,7 @@
 {"ue-nb-ant-tx",     	       CONFIG_HLP_UENANTT,    0,		u8ptr:&nb_antenna_tx,		    defuintval:1,   TYPE_UINT8,    0},     \
 {"ue-scan-carrier",  	       CONFIG_HLP_UESCAN,     PARAMFLAG_BOOL,	iptr:&UE_scan_carrier,  	    defintval:0,    TYPE_INT,	   0},     \
 {"ue-max-power",     	       NULL,		      0,		iptr:&(tx_max_power[0]),	    defintval:90,   TYPE_INT,	   0},     \
-{"r"  ,                        CONFIG_HLP_PRB,        0,                u8ptr:&n_rb_dl,                     defintval:0,    TYPE_UINT8,    0},     \
+{"r"  ,                        CONFIG_HLP_PRB,        0,                u8ptr:&(frame_parms[0]->N_RB_DL),   defintval:0,    TYPE_UINT8,    0},     \
 }
 
 
@@ -168,7 +168,8 @@ extern int16_t dlsch_demod_shift;
 {"V" ,  		  	 CONFIG_HLP_VCD,	PARAMFLAG_BOOL,   iptr:&ouput_vcd,			defintval:0,			   TYPE_INT,	  0},			   \
 {"q" ,  		  	 CONFIG_HLP_STMON,	PARAMFLAG_BOOL,   iptr:&opp_enabled,			defintval:0,			   TYPE_INT,	  0},			   \
 {"S" ,  		  	 CONFIG_HLP_MSLOTS,	PARAMFLAG_BOOL,   u8ptr:&exit_missed_slots,		defintval:1,			   TYPE_UINT8,    0},			   \
-{"T" ,  		  	 CONFIG_HLP_TDD,	PARAMFLAG_BOOL,   iptr:&tddflag,			defintval:0,			   TYPE_INT,	  0}			   \
+{"T" ,  		  	 CONFIG_HLP_TDD,	PARAMFLAG_BOOL,   iptr:&tddflag,			defintval:0,			   TYPE_INT,	  0},			   \
+{"nbiot-disable",        	 CONFIG_HLP_DISABLNBIOT,PARAMFLAG_BOOL,   iptr:&nonbiotflag,			defintval:0,			   TYPE_INT,	  0}                       \
 }
 
 #define CONFIG_HLP_FLOG          "Enable online log \n"