diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index 6d9b2edf82ab3cfc2263b824bef33a63065a8212..0b214eeaead76ae163b827aa3f037113fd17733c 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -624,7 +624,14 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
       for (k=0; k <num_enbs ; k++) {
 	if (strcmp(ENBSParams[ENB_ACTIVE_ENBS_IDX].strlistptr[k], *(ENBParamList.paramarray[i][ENB_ENB_NAME_IDX].strptr) )== 0) {
 	  char enbpath[MAX_OPTNAME_SIZE + 8];
-
+	  sprintf(enbpath,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k);
+
+          paramdef_t PLMNParams[] = PLMNPARAMS_DESC;
+          paramlist_def_t PLMNParamList = {ENB_CONFIG_STRING_PLMN_LIST, NULL, 0};
+          /* map parameter checking array instances to parameter definition array instances */
+          checkedparam_t config_check_PLMNParams [] = PLMNPARAMS_CHECK;
+          for (int I = 0; I < sizeof(PLMNParams) / sizeof(paramdef_t); ++I)
+            PLMNParams[I].chkPptr = &(config_check_PLMNParams[I]);
 	  
 	  RRC_CONFIGURATION_REQ (msg_p).cell_identity = enb_id;
 	  
@@ -641,18 +648,36 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
 		
 		enb_properties_loc.properties[enb_properties_loc_index]->eNB_name         = strdup(enb_name);
 	  */
-	  RRC_CONFIGURATION_REQ (msg_p).tac              = (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_TRACKING_AREA_CODE_IDX].strptr) );
-	  RRC_CONFIGURATION_REQ (msg_p).mcc              = (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_MOBILE_COUNTRY_CODE_IDX].strptr) );
-	  RRC_CONFIGURATION_REQ (msg_p).mnc              = (uint16_t)atoi( *(ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX].strptr) );
-	  RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length = strlen(*(ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
-	  AssertFatal((RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length == 2) ||
-		      (RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length == 3),
-		      "BAD MNC DIGIT LENGTH %d",
-		      RRC_CONFIGURATION_REQ (msg_p).mnc_digit_length);
+          RRC_CONFIGURATION_REQ(msg_p).tac = *ENBParamList.paramarray[i][ENB_TRACKING_AREA_CODE_IDX].uptr;
+          AssertFatal(!ENBParamList.paramarray[i][ENB_MOBILE_COUNTRY_CODE_IDX_OLD].strptr
+                      && !ENBParamList.paramarray[i][ENB_MOBILE_NETWORK_CODE_IDX_OLD].strptr,
+                      "It seems that you use an old configuration file. Please change the existing\n"
+                      "    tracking_area_code  =  \"1\";\n"
+                      "    mobile_country_code =  \"208\";\n"
+                      "    mobile_network_code =  \"93\";\n"
+                      "to\n"
+                      "    tracking_area_code  =  1; // no string!!\n"
+                      "    plmn_list = ( { mcc = 208; mnc = 93; mnc_length = 2; } )\n");
+
+          config_getlist(&PLMNParamList, PLMNParams, sizeof(PLMNParams)/sizeof(paramdef_t), enbpath);
+
+          if (PLMNParamList.numelt < 1 || PLMNParamList.numelt > 6)
+            AssertFatal(0, "The number of PLMN IDs must be in [1,6], but is %d\n",
+                        PLMNParamList.numelt);
+          RRC_CONFIGURATION_REQ(msg_p).num_plmn = PLMNParamList.numelt;
+
+          for (int l = 0; l < PLMNParamList.numelt; ++l) {
+            RRC_CONFIGURATION_REQ(msg_p).mcc[l] = *PLMNParamList.paramarray[l][ENB_MOBILE_COUNTRY_CODE_IDX].uptr;
+            RRC_CONFIGURATION_REQ(msg_p).mnc[l] = *PLMNParamList.paramarray[l][ENB_MOBILE_NETWORK_CODE_IDX].uptr;
+            RRC_CONFIGURATION_REQ(msg_p).mnc_digit_length[l] = *PLMNParamList.paramarray[l][ENB_MNC_DIGIT_LENGTH].u8ptr;
+            AssertFatal(RRC_CONFIGURATION_REQ(msg_p).mnc_digit_length[l] == 3
+                        || RRC_CONFIGURATION_REQ(msg_p).mnc[l] < 100,
+                        "MNC %d cannot be encoded in two digits as requested (change mnc_digit_length to 3)\n",
+                        RRC_CONFIGURATION_REQ(msg_p).mnc[l]);
+          }
 	  
 	
 	  // Parse optional physical parameters
-	  sprintf(enbpath,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k),
 	  config_getlist( &CCsParamList,NULL,0,enbpath); 
 	  
 	  LOG_I(RRC,"num component carriers %d \n",CCsParamList.numelt);  
@@ -2246,12 +2271,21 @@ int RCconfig_S1(MessageDef *msg_p, uint32_t i) {
 	// search if in active list
 	for (j=0; j < ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt; j++) {
 	  if (strcmp(ENBSParams[ENB_ACTIVE_ENBS_IDX].strlistptr[j], *(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr)) == 0) {
+            paramdef_t PLMNParams[] = PLMNPARAMS_DESC;
+            paramlist_def_t PLMNParamList = {ENB_CONFIG_STRING_PLMN_LIST, NULL, 0};
+            /* map parameter checking array instances to parameter definition array instances */
+            checkedparam_t config_check_PLMNParams [] = PLMNPARAMS_CHECK;
+            for (int I = 0; I < sizeof(PLMNParams) / sizeof(paramdef_t); ++I)
+              PLMNParams[I].chkPptr = &(config_check_PLMNParams[I]);
+
              paramdef_t S1Params[]  = S1PARAMS_DESC;
              paramlist_def_t S1ParamList = {ENB_CONFIG_STRING_MME_IP_ADDRESS,NULL,0};
 
              paramdef_t SCTPParams[]  = SCTPPARAMS_DESC;
              paramdef_t NETParams[]  =  NETPARAMS_DESC;
-             char aprefix[MAX_OPTNAME_SIZE*2 + 8];
+
+            char aprefix[MAX_OPTNAME_SIZE*2 + 8];
+	    sprintf(aprefix,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k);
 	    
 	    S1AP_REGISTER_ENB_REQ (msg_p).eNB_id = enb_id;
 	    
@@ -2266,17 +2300,35 @@ int RCconfig_S1(MessageDef *msg_p, uint32_t i) {
 	    }
 	    
 	    S1AP_REGISTER_ENB_REQ (msg_p).eNB_name         = strdup(*(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr));
-	    S1AP_REGISTER_ENB_REQ (msg_p).tac              = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_TRACKING_AREA_CODE_IDX].strptr));
-	    S1AP_REGISTER_ENB_REQ (msg_p).mcc              = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_COUNTRY_CODE_IDX].strptr));
-	    S1AP_REGISTER_ENB_REQ (msg_p).mnc              = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
-	    S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length = strlen(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
-	    S1AP_REGISTER_ENB_REQ (msg_p).default_drx      = 0;
-	    AssertFatal((S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 2) ||
-			(S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 3),
-			"BAD MNC DIGIT LENGTH %d",
-			S1AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length);
+            S1AP_REGISTER_ENB_REQ(msg_p).tac               = *ENBParamList.paramarray[k][ENB_TRACKING_AREA_CODE_IDX].uptr;
+
+            AssertFatal(!ENBParamList.paramarray[k][ENB_MOBILE_COUNTRY_CODE_IDX_OLD].strptr
+                        && !ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX_OLD].strptr,
+                        "It seems that you use an old configuration file. Please change the existing\n"
+                        "    tracking_area_code  =  \"1\";\n"
+                        "    mobile_country_code =  \"208\";\n"
+                        "    mobile_network_code =  \"93\";\n"
+                        "to\n"
+                        "    tracking_area_code  =  1; // no string!!\n"
+                        "    plmn_list = ( { mcc = 208; mnc = 93; mnc_length = 2; } )\n");
+
+            config_getlist(&PLMNParamList, PLMNParams, sizeof(PLMNParams)/sizeof(paramdef_t), aprefix);
+            if (PLMNParamList.numelt < 1 || PLMNParamList.numelt > 6)
+              AssertFatal(0, "The number of PLMN IDs must be in [1,6], but is %d\n",
+                          PLMNParamList.numelt);
+
+            S1AP_REGISTER_ENB_REQ(msg_p).num_plmn = PLMNParamList.numelt;
+            for (int l = 0; l < PLMNParamList.numelt; ++l) {
+              S1AP_REGISTER_ENB_REQ(msg_p).mcc[l] = *PLMNParamList.paramarray[l][ENB_MOBILE_COUNTRY_CODE_IDX].uptr;
+              S1AP_REGISTER_ENB_REQ(msg_p).mnc[l] = *PLMNParamList.paramarray[l][ENB_MOBILE_NETWORK_CODE_IDX].uptr;
+              S1AP_REGISTER_ENB_REQ(msg_p).mnc_digit_length[l] = *PLMNParamList.paramarray[l][ENB_MNC_DIGIT_LENGTH].u8ptr;
+              AssertFatal(S1AP_REGISTER_ENB_REQ(msg_p).mnc_digit_length[l] == 3
+                          || S1AP_REGISTER_ENB_REQ(msg_p).mnc[l] < 100,
+                          "MNC %d cannot be encoded in two digits as requested (change mnc_digit_length to 3)\n",
+                          S1AP_REGISTER_ENB_REQ(msg_p).mnc[l]);
+            }
+            S1AP_REGISTER_ENB_REQ(msg_p).default_drx = 0;
 	    
-	    sprintf(aprefix,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k);
             config_getlist( &S1ParamList,S1Params,sizeof(S1Params)/sizeof(paramdef_t),aprefix); 
 	    
 	    S1AP_REGISTER_ENB_REQ (msg_p).nb_mme = 0;
diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h
index 04edea1493b955f5840e7da84ead7099168bfc2b..fc02acf9e592e38cbdf0c3921a4bfbf029d86165 100755
--- a/openair2/ENB_APP/enb_paramdef.h
+++ b/openair2/ENB_APP/enb_paramdef.h
@@ -185,8 +185,8 @@ typedef enum {
 #define ENB_CONFIG_STRING_CELL_TYPE                     "cell_type"
 #define ENB_CONFIG_STRING_ENB_NAME                      "eNB_name"
 #define ENB_CONFIG_STRING_TRACKING_AREA_CODE            "tracking_area_code"
-#define ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE           "mobile_country_code"
-#define ENB_CONFIG_STRING_MOBILE_NETWORK_CODE           "mobile_network_code"
+#define ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE_OLD       "mobile_country_code"
+#define ENB_CONFIG_STRING_MOBILE_NETWORK_CODE_OLD       "mobile_network_code"
 #define ENB_CONFIG_STRING_TRANSPORT_S_PREFERENCE        "tr_s_preference"
 #define ENB_CONFIG_STRING_LOCAL_S_IF_NAME               "local_s_if_name"
 #define ENB_CONFIG_STRING_LOCAL_S_ADDRESS               "local_s_address"
@@ -204,9 +204,9 @@ typedef enum {
 {ENB_CONFIG_STRING_ENB_ID,                       NULL,   0,            uptr:NULL,   defintval:0,                 TYPE_UINT,      0},  \
 {ENB_CONFIG_STRING_CELL_TYPE,                    NULL,   0,            strptr:NULL, defstrval:"CELL_MACRO_ENB",  TYPE_STRING,    0},  \
 {ENB_CONFIG_STRING_ENB_NAME,                     NULL,   0,            strptr:NULL, defstrval:"OAIeNodeB",       TYPE_STRING,    0},  \
-{ENB_CONFIG_STRING_TRACKING_AREA_CODE,           NULL,   0,            strptr:NULL, defstrval:"0",               TYPE_STRING,    0},  \
-{ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE,          NULL,   0,            strptr:NULL, defstrval:"0",               TYPE_STRING,    0},  \
-{ENB_CONFIG_STRING_MOBILE_NETWORK_CODE,          NULL,   0,            strptr:NULL, defstrval:"0",               TYPE_STRING,    0},  \
+{ENB_CONFIG_STRING_TRACKING_AREA_CODE,           NULL,   0,            uptr:NULL,   defuintval:0,                TYPE_UINT,      0},  \
+{ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE_OLD,      NULL,   0,            strptr:NULL, defstrval:NULL,              TYPE_STRING,    0},  \
+{ENB_CONFIG_STRING_MOBILE_NETWORK_CODE_OLD,      NULL,   0,            strptr:NULL, defstrval:NULL,              TYPE_STRING,    0},  \
 {ENB_CONFIG_STRING_TRANSPORT_S_PREFERENCE,       NULL,   0,            strptr:NULL, defstrval:"local_mac",       TYPE_STRING,    0},  \
 {ENB_CONFIG_STRING_LOCAL_S_IF_NAME,              NULL,   0,            strptr:NULL, defstrval:"lo",              TYPE_STRING,    0},  \
 {ENB_CONFIG_STRING_LOCAL_S_ADDRESS,              NULL,   0,            strptr:NULL, defstrval:"127.0.0.1",       TYPE_STRING,    0},  \
@@ -220,8 +220,8 @@ typedef enum {
 #define ENB_CELL_TYPE_IDX               1
 #define ENB_ENB_NAME_IDX                2
 #define ENB_TRACKING_AREA_CODE_IDX      3
-#define ENB_MOBILE_COUNTRY_CODE_IDX     4
-#define ENB_MOBILE_NETWORK_CODE_IDX     5
+#define ENB_MOBILE_COUNTRY_CODE_IDX_OLD 4
+#define ENB_MOBILE_NETWORK_CODE_IDX_OLD 5
 #define ENB_TRANSPORT_S_PREFERENCE_IDX  6
 #define ENB_LOCAL_S_IF_NAME_IDX         7
 #define ENB_LOCAL_S_ADDRESS_IDX         8
@@ -230,9 +230,56 @@ typedef enum {
 #define ENB_REMOTE_S_PORTC_IDX          11
 #define ENB_LOCAL_S_PORTD_IDX           12
 #define ENB_REMOTE_S_PORTD_IDX          13
+
+#define TRACKING_AREA_CODE_OKRANGE {0x0001,0xFFFD}
+#define ENBPARAMS_CHECK {                                         \
+  { .s5 = { NULL } },                                             \
+  { .s5 = { NULL } },                                             \
+  { .s5 = { NULL } },                                             \
+  { .s2 = { config_check_intrange, TRACKING_AREA_CODE_OKRANGE } },\
+  { .s5 = { NULL } },                                             \
+  { .s5 = { NULL } },                                             \
+  { .s5 = { NULL } },                                             \
+  { .s5 = { NULL } },                                             \
+  { .s5 = { NULL } },                                             \
+  { .s5 = { NULL } },                                             \
+  { .s5 = { NULL } },                                             \
+  { .s5 = { NULL } },                                             \
+  { .s5 = { NULL } },                                             \
+  { .s5 = { NULL } },                                             \
+}
+
 /*-------------------------------------------------------------------------------------------------------------------------------------------------*/
 /*-------------------------------------------------------------------------------------------------------------------------------------------------*/		  
 
+/* PLMN ID configuration */
+
+#define ENB_CONFIG_STRING_PLMN_LIST                     "plmn_list"
+
+#define ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE           "mcc"
+#define ENB_CONFIG_STRING_MOBILE_NETWORK_CODE           "mnc"
+#define ENB_CONFIG_STRING_MNC_DIGIT_LENGTH              "mnc_length"
+
+#define ENB_MOBILE_COUNTRY_CODE_IDX     0
+#define ENB_MOBILE_NETWORK_CODE_IDX     1
+#define ENB_MNC_DIGIT_LENGTH            2
+
+#define PLMNPARAMS_DESC {                                                                  \
+/*   optname                              helpstr               paramflags XXXptr     def val          type    numelt */ \
+  {ENB_CONFIG_STRING_MOBILE_COUNTRY_CODE, "mobile country code",        0, uptr:NULL, defuintval:1000, TYPE_UINT, 0},    \
+  {ENB_CONFIG_STRING_MOBILE_NETWORK_CODE, "mobile network code",        0, uptr:NULL, defuintval:1000, TYPE_UINT, 0},    \
+  {ENB_CONFIG_STRING_MNC_DIGIT_LENGTH,    "length of the MNC (2 or 3)", 0, uptr:NULL, defuintval:0,    TYPE_UINT, 0},    \
+}
+
+#define MCC_MNC_OKRANGES           {0,999}
+#define MNC_DIGIT_LENGTH_OKVALUES  {2,3}
+
+#define PLMNPARAMS_CHECK {                                           \
+  { .s2 = { config_check_intrange, MCC_MNC_OKRANGES } },             \
+  { .s2 = { config_check_intrange, MCC_MNC_OKRANGES } },             \
+  { .s1 = { config_check_intval,   MNC_DIGIT_LENGTH_OKVALUES, 2 } }, \
+}
+
 
 /* component carries configuration parameters name */