diff --git a/ci-scripts/Jenkinsfile-tmp-ran b/ci-scripts/Jenkinsfile-tmp-ran
index 4db4ec0b2de51b0bb294f99e9b93589b34fc26c0..1277e0d4839c431f08fabe18fb328e822e1736d7 100644
--- a/ci-scripts/Jenkinsfile-tmp-ran
+++ b/ci-scripts/Jenkinsfile-tmp-ran
@@ -31,6 +31,9 @@ def testXMLFile = params.pythonTestXmlFile
 // Name of the test stage
 def testStageName = params.pipelineTestStageName
 
+// Name of the phone resource
+def ciSmartPhoneResource = params.smartphonesResource
+
 // Terminate Status
 def termUE = 0
 def termENB = 1
@@ -70,6 +73,7 @@ pipeline {
         string(name: 'pythonTestXmlFile', defaultValue: 'enb_usrpB210_band7_50PRB.xml', description: 'Location of the Test XML to be run')
         string(name: 'pipelineTestStageName', defaultValue: 'Test COTS-UE - OAI eNB - LTEBOX EPC', description: 'Naming of the Test Stage')
         booleanParam(name: 'pipelineZipsConsoleLog', defaultValue: 'True', description: 'If true, the pipeline script retrieves the job console log, zips it and archives it as artifact')
+        string(name: 'smartphonesResource', defaultValue: 'CI-Bench-1-Phones', description: 'Lockeable Resource to prevent multiple jobs to run simultaneously with the same resource')
 
         //eNB parameters
         string(name: 'eNB_IPAddress', defaultValue: '192.168.XX.XX', description: 'IP Address of eNB')
@@ -112,6 +116,9 @@ pipeline {
                         testStageName = 'Template Test Stage'
                     }
 
+                    if (params.smartphonesResource == null) {
+                        allParametersPresent = false
+                    }
                     if (params.eNB_IPAddress == null) {
                         allParametersPresent = false
                     }
@@ -178,6 +185,7 @@ pipeline {
             steps {
                 script {
                     dir ('ci-scripts') {
+                      lock (ciSmartPhoneResource) {
                         try {
                             echo "\u2705 \u001B[32m${testStageName}\u001B[0m"
                             withCredentials([
@@ -190,6 +198,7 @@ pipeline {
                         } catch (Exception e) {
                             currentBuild.result = 'FAILURE'
                         }
+                      }
                     }
                 }
             }
diff --git a/ci-scripts/checkCodingFormattingRules.sh b/ci-scripts/checkCodingFormattingRules.sh
index a18fc67c75cddcbbf4fbdc97e6297ddf85a84a07..61cbf1256016054c62276550bb7986b4ebcdf17c 100755
--- a/ci-scripts/checkCodingFormattingRules.sh
+++ b/ci-scripts/checkCodingFormattingRules.sh
@@ -120,21 +120,34 @@ echo "Source Branch is    : $SOURCE_BRANCH"
 echo "Target Branch is    : $TARGET_BRANCH"
 echo "Merged Commit is    : $MERGE_COMMMIT"
 echo "Target Init   is    : $TARGET_INIT_COMMIT"
+echo ""
+echo " ----------------------------------------------------------"
+echo ""
 
 # Retrieve the list of modified files since the latest develop commit
 MODIFIED_FILES=`git log $TARGET_INIT_COMMIT..$MERGE_COMMMIT --oneline --name-status | egrep "^M|^A" | sed -e "s@^M\t*@@" -e "s@^A\t*@@" | sort | uniq`
 NB_TO_FORMAT=0
+if [ -f oai_rules_result_list.txt ]
+then
+    rm -f oai_rules_result_list.txt
+fi
 for FULLFILE in $MODIFIED_FILES
 do
-    echo $FULLFILE
     filename=$(basename -- "$FULLFILE")
     EXT="${filename##*.}"
     if [ $EXT = "c" ] || [ $EXT = "h" ] || [ $EXT = "cpp" ] || [ $EXT = "hpp" ]
     then
         TO_FORMAT=`astyle --dry-run --options=ci-scripts/astyle-options.txt $FULLFILE | grep -c Formatted `
         NB_TO_FORMAT=$((NB_TO_FORMAT + TO_FORMAT))
+        if [ $TO_FORMAT -ne 0 ]
+        then
+            echo $FULLFILE
+            echo $FULLFILE >> ./oai_rules_result_list.txt
+        fi
     fi
 done
+echo ""
+echo " ----------------------------------------------------------"
 echo "Nb Files that do NOT follow OAI rules: $NB_TO_FORMAT"
 echo $NB_TO_FORMAT > ./oai_rules_result.txt
 
diff --git a/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf
index 37656de75527716462e60a62de7cf0cf32c2cbaa..3d79fd09863ece7498e6233d960515f96dd484c8 100644
--- a/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/enb.band7.tm1.100PRB.usrpb210.conf
@@ -228,6 +228,15 @@ RUs = (
     }
 );  
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
 NETWORK_CONTROLLER :
 {
     FLEXRAN_ENABLED        = "no";
diff --git a/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf
index 01c1ca1428c5025cb37221914f84079403dfcc06..b4c20ba644513bfca3387ce63f2efc4cae237226 100644
--- a/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf
@@ -228,6 +228,15 @@ RUs = (
     }
 );  
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
 NETWORK_CONTROLLER :
 {
     FLEXRAN_ENABLED        = "no";
diff --git a/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf
index eb5822cb22fcb6f98a48cd3a1fbf406869e1be80..a6ac1f8c140cfcad9883d7190715aa915ec651df 100644
--- a/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/enb.band7.tm1.50PRB.usrpb210.conf
@@ -228,6 +228,15 @@ RUs = (
     }
 );  
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
 NETWORK_CONTROLLER :
 {
     FLEXRAN_ENABLED        = "no";
diff --git a/ci-scripts/conf_files/lte-basic-sim.conf b/ci-scripts/conf_files/lte-fdd-basic-sim.conf
similarity index 97%
rename from ci-scripts/conf_files/lte-basic-sim.conf
rename to ci-scripts/conf_files/lte-fdd-basic-sim.conf
index f0fab0bdcba24e59c043441a1b321c13825db24f..0b02e8f871738ae1c45cde192c1c82b20b5cf17e 100644
--- a/ci-scripts/conf_files/lte-basic-sim.conf
+++ b/ci-scripts/conf_files/lte-fdd-basic-sim.conf
@@ -229,6 +229,15 @@ RUs = (
     }
 );  
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_SINGLE_THREAD";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
 NETWORK_CONTROLLER :
 {
     FLEXRAN_ENABLED        = "no";
diff --git a/ci-scripts/conf_files/lte-tdd-basic-sim.conf b/ci-scripts/conf_files/lte-tdd-basic-sim.conf
new file mode 100644
index 0000000000000000000000000000000000000000..fe9b8a3601fd7acce516b43cf21d310730226c15
--- /dev/null
+++ b/ci-scripts/conf_files/lte-tdd-basic-sim.conf
@@ -0,0 +1,229 @@
+Active_eNBs = ( "eNB_Eurecom_LTEBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+eNBs =
+(
+ {
+    ////////// Identification parameters:
+    eNB_ID    =  0xe00;
+
+    cell_type =  "CELL_MACRO_ENB";
+
+    eNB_name  =  "eNB_Eurecom_LTEBox";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  "1";
+
+    mobile_country_code =  "208";
+    mobile_network_code =  "93";
+
+       ////////// Physical parameters:
+
+    component_carriers = (
+      {
+        node_function                                         = "eNodeB_3GPP";
+        node_timing                                           = "synch_to_ext_device";
+        node_synch_ref                                        = 0;
+        frame_type					      = "TDD";
+        tdd_config 					      = 1;
+        tdd_config_s            			      = 0;
+        prefix_type             			      = "NORMAL";
+        eutra_band              			      = 40;
+        downlink_frequency      			      = 2350000000L;
+        uplink_frequency_offset 			      = 0;
+        Nid_cell					      = 0;
+        N_RB_DL                 			      = 25;
+        Nid_cell_mbsfn          			      = 0;
+        nb_antenna_ports          			      = 1;
+        nb_antennas_tx          			      = 1;
+        nb_antennas_rx          			      = 1;
+        tx_gain                                            = 90;
+        rx_gain                                            = 125;
+        prach_root              			      = 0;
+        prach_config_index      			      = 0;
+        prach_high_speed        			      = "DISABLE";
+        prach_zero_correlation  			      = 1;
+        prach_freq_offset       			      = 2;
+        pucch_delta_shift       			      = 1;
+        pucch_nRB_CQI           			      = 1;
+        pucch_nCS_AN            			      = 0;
+        pucch_n1_AN             			      = 0;
+        pdsch_referenceSignalPower 			      =-27;
+        pdsch_p_b                  			      = 0;
+        pusch_n_SB                 			      = 1;
+        pusch_enable64QAM          			      = "DISABLE";
+        pusch_hoppingMode                                  = "interSubFrame";
+        pusch_hoppingOffset                                = 0;
+        pusch_groupHoppingEnabled  			      = "ENABLE";
+        pusch_groupAssignment      			      = 0;
+        pusch_sequenceHoppingEnabled		   	      = "DISABLE";
+        pusch_nDMRS1                                       = 1;
+        phich_duration                                     = "NORMAL";
+        phich_resource                                     = "ONESIXTH";
+        srs_enable                                         = "DISABLE";
+      /*  srs_BandwidthConfig                                =;
+        srs_SubframeConfig                                 =;
+        srs_ackNackST                                      =;
+        srs_MaxUpPts                                       =;*/
+
+        pusch_p0_Nominal                                   = -96;
+        pusch_alpha                                        = "AL1";
+        pucch_p0_Nominal                                   = -106;
+        msg3_delta_Preamble                                = 6;
+        pucch_deltaF_Format1                               = "deltaF2";
+        pucch_deltaF_Format1b                              = "deltaF3";
+        pucch_deltaF_Format2                               = "deltaF0";
+        pucch_deltaF_Format2a                              = "deltaF0";
+        pucch_deltaF_Format2b		    	      = "deltaF0";
+
+        rach_numberOfRA_Preambles                          = 64;
+        rach_preamblesGroupAConfig                         = "DISABLE";
+      /*
+        rach_sizeOfRA_PreamblesGroupA                      = ;
+        rach_messageSizeGroupA                             = ;
+        rach_messagePowerOffsetGroupB                      = ;
+      */
+        rach_powerRampingStep                              = 4;
+        rach_preambleInitialReceivedTargetPower            = -108;
+        rach_preambleTransMax                              = 10;
+        rach_raResponseWindowSize                          = 10;
+        rach_macContentionResolutionTimer                  = 48;
+        rach_maxHARQ_Msg3Tx                                = 4;
+
+        pcch_default_PagingCycle                           = 128;
+        pcch_nB                                            = "oneT";
+        bcch_modificationPeriodCoeff			      = 2;
+        ue_TimersAndConstants_t300			      = 1000;
+        ue_TimersAndConstants_t301			      = 1000;
+        ue_TimersAndConstants_t310			      = 1000;
+        ue_TimersAndConstants_t311			      = 10000;
+        ue_TimersAndConstants_n310			      = 20;
+        ue_TimersAndConstants_n311			      = 1;
+
+	ue_TransmissionMode				      = 1;
+      }
+    );
+
+
+    srb1_parameters :
+    {
+        # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
+        timer_poll_retransmit    = 80;
+
+        # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
+        timer_reordering         = 35;
+
+        # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
+        timer_status_prohibit    = 0;
+
+        # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
+        poll_pdu                 =  4;
+
+        # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
+        poll_byte                =  99999;
+
+        # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
+        max_retx_threshold       =  4;
+    }
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+    ////////// MME parameters:
+    mme_ip_address      = ( { ipv4       = "CI_MME_IP_ADDR";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+    NETWORK_INTERFACES :
+    {
+        ENB_INTERFACE_NAME_FOR_S1_MME            = "eth0";
+        ENB_IPV4_ADDRESS_FOR_S1_MME              = "CI_ENB_IP_ADDR";
+
+        ENB_INTERFACE_NAME_FOR_S1U               = "eth0";
+        ENB_IPV4_ADDRESS_FOR_S1U                 = "CI_ENB_IP_ADDR";
+        ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
+
+        ENB_IPV4_ADDRESS_FOR_X2C                 = "CI_ENB_IP_ADDR";
+        ENB_PORT_FOR_X2C                         = 36422; # Spec 36422
+    };
+
+    log_config :
+    {
+      global_log_level                      ="debug";
+      global_log_verbosity                  ="medium";
+      hw_log_level                          ="info";
+      hw_log_verbosity                      ="medium";
+      phy_log_level                         ="info";
+      phy_log_verbosity                     ="medium";
+      mac_log_level                         ="info";
+      mac_log_verbosity                     ="high";
+      rlc_log_level                         ="info";
+      rlc_log_verbosity                     ="medium";
+      pdcp_log_level                        ="info";
+      pdcp_log_verbosity                    ="medium";
+      rrc_log_level                         ="info";
+      rrc_log_verbosity                     ="medium";
+   };
+
+  }
+);
+MACRLCs = (
+	{
+        num_cc = 1;
+        tr_s_preference = "local_L1";
+        tr_n_preference = "local_RRC";
+        scheduler_mode = "fairRR";
+        puSch10xSnr     =  200;
+        puCch10xSnr     =  200;
+        }  
+);
+
+L1s = (
+    	{
+	num_cc = 1;
+	tr_n_preference = "local_mac";
+        }  
+);
+
+RUs = (
+    {		  
+       local_rf       = "yes"
+         nb_tx          = 1
+         nb_rx          = 1
+         att_tx         = 0
+         att_rx         = 0;
+         bands          = [38];
+         max_pdschReferenceSignalPower = -27;
+         max_rxgain                    = 125;
+         eNB_instances  = [0];
+
+    }
+);  
+
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_SINGLE_THREAD";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
+NETWORK_CONTROLLER :
+{
+    FLEXRAN_ENABLED        = "no";
+    FLEXRAN_INTERFACE_NAME = "lo";
+    FLEXRAN_IPV4_ADDRESS   = "127.0.0.1";
+    FLEXRAN_PORT           = 2210;
+    FLEXRAN_CACHE          = "/mnt/oai_agent_cache";
+    FLEXRAN_AWAIT_RECONF   = "no";
+};
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index f210fd451823fd2abccb5fdbae61348a68476c74..589f389850cee23e06f5e7027c24d2cbdf1e3590 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -90,38 +90,50 @@ class SSHConnection():
 		self.htmlUEConnected = 0
 
 	def open(self, ipaddress, username, password):
-		self.ssh = pexpect.spawn('ssh', [username + '@' + ipaddress], timeout = 5)
-		self.sshresponse = self.ssh.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', 'Last login', pexpect.EOF, pexpect.TIMEOUT])
-		if self.sshresponse == 0:
-			self.ssh.sendline('yes')
-			self.ssh.expect('password:')
-			self.ssh.sendline(password)
-			self.sshresponse = self.ssh.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT])
-			if self.sshresponse == 0:
-				pass
-			else:
-				logging.debug('self.sshresponse = ' + str(self.sshresponse))
-				sys.exit('SSH Connection Failed')
-		elif self.sshresponse == 1:
-			self.ssh.sendline(password)
-			self.sshresponse = self.ssh.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT])
+		count = 0
+		connect_status = False
+		while count < 4:
+			self.ssh = pexpect.spawn('ssh', [username + '@' + ipaddress], timeout = 5)
+			self.sshresponse = self.ssh.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', 'Last login', pexpect.EOF, pexpect.TIMEOUT])
 			if self.sshresponse == 0:
-				pass
+				self.ssh.sendline('yes')
+				self.ssh.expect('password:')
+				self.ssh.sendline(password)
+				self.sshresponse = self.ssh.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT])
+				if self.sshresponse == 0:
+					count = 10
+					connect_status = True
+				else:
+					logging.debug('self.sshresponse = ' + str(self.sshresponse))
+			elif self.sshresponse == 1:
+				self.ssh.sendline(password)
+				self.sshresponse = self.ssh.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT])
+				if self.sshresponse == 0:
+					count = 10
+					connect_status = True
+				else:
+					logging.debug('self.sshresponse = ' + str(self.sshresponse))
+			elif self.sshresponse == 2:
+				# Checking if we are really on the remote client defined by its IP address
+				self.command('stdbuf -o0 ifconfig | egrep --color=never "inet addr:"', '\$', 5)
+				result = re.search(str(ipaddress), str(self.ssh.before))
+				if result is None:
+					self.close()
+				else:
+					count = 10
+					connect_status = True
 			else:
+				# debug output
+				logging.debug(str(self.ssh.before))
 				logging.debug('self.sshresponse = ' + str(self.sshresponse))
-				sys.exit('SSH Connection Failed')
-		elif self.sshresponse == 2:
-			# Checking if we are really on the remote client defined by its IP address
-			self.command('stdbuf -o0 ifconfig | egrep --color=never "inet addr:"', '\$', 5)
-			result = re.search(str(ipaddress), str(self.ssh.before))
-			if result is None:
-				sys.exit('SSH Connection Failed: TIMEOUT !!!')
+			# adding a tempo when failure
+			if not connect_status:
+				time.sleep(1)
+			count += 1
+		if connect_status:
 			pass
 		else:
-			# debug output
-			logging.debug(str(self.ssh.before))
-			logging.debug('self.sshresponse = ' + str(self.sshresponse))
-			sys.exit('SSH Connection Failed!!!')
+			sys.exit('SSH Connection Failed')
 
 	def command(self, commandline, expectedline, timeout):
 		logging.debug(commandline)
diff --git a/ci-scripts/reportBuildLocally.sh b/ci-scripts/reportBuildLocally.sh
index 609af5f166b05e2343bc7d7fcb8f5e7d977586a2..ea2cc5e44f606f06e088bd8c977bc99443e835af 100755
--- a/ci-scripts/reportBuildLocally.sh
+++ b/ci-scripts/reportBuildLocally.sh
@@ -260,7 +260,7 @@ function sca_summary_table_footer {
     echo "      </tr>" >> ./build_results.html
     echo "   </table>" >> ./build_results.html
     echo "   <p>Full details in zipped artifact (cppcheck/cppcheck.xml) </p>" >> ./build_results.html
-    echo "   <p>Graphical Interface tool : <code>cppcheck-gui -l cppcheck/cppcheck.xml</code> </p>" >> ./build_results.html
+    echo "   <p style=\"margin-left: 30px\">Graphical Interface tool : <strong><code>cppcheck-gui -l cppcheck/cppcheck.xml</code></strong></p>" >> ./build_results.html
 }
 
 jb_checker=0
@@ -490,12 +490,20 @@ then
     then 
         if [ $PU_TRIG -eq 1 ]; then echo "        <td bgcolor = \"green\">All files in repository follow OAI rules. </td>" >> ./build_results.html; fi
         if [ $MR_TRIG -eq 1 ]; then echo "        <td bgcolor = \"green\">All modified files in Merge-Request follow OAI rules.</td>" >> ./build_results.html; fi
+        echo "      </tr>" >> ./build_results.html
+        echo "   </table>" >> ./build_results.html
     else
         if [ $PU_TRIG -eq 1 ]; then echo "        <td bgcolor = \"orange\">$NB_FILES files in repository DO NOT follow OAI rules. </td>" >> ./build_results.html; fi
         if [ $MR_TRIG -eq 1 ]; then echo "        <td bgcolor = \"orange\">$NB_FILES modified files in Merge-Request DO NOT follow OAI rules.</td>" >> ./build_results.html; fi
+        echo "      </tr>" >> ./build_results.html
+        if [ -f ./oai_rules_result_list.txt ]
+        then
+            awk '{print "      <tr><td></td><td>"$1"</td></tr>"}' ./oai_rules_result_list.txt >> ./build_results.html
+        fi
+        echo "   </table>" >> ./build_results.html
+        echo "   <p>Please apply the following command to this(ese) file(s): </p>" >> ./build_results.html
+        echo "   <p style=\"margin-left: 30px\"><strong><code>astyle --options=ci-scripts/astyle-options.txt filename(s)</code></strong></p>" >> ./build_results.html
     fi
-    echo "      </tr>" >> ./build_results.html
-    echo "   </table>" >> ./build_results.html
 fi
 
 echo "   <h2>Ubuntu 16.04 LTS -- Summary</h2>" >> ./build_results.html
diff --git a/ci-scripts/reportTestLocally.sh b/ci-scripts/reportTestLocally.sh
index 569b62bc3d13341c61e04018a5a54d0589ade05d..24e32559587330b9041a2abd1dde2aafaf800000 100755
--- a/ci-scripts/reportTestLocally.sh
+++ b/ci-scripts/reportTestLocally.sh
@@ -317,188 +317,192 @@ then
     echo "        <th>Statistics</th>" >> ./test_simulator_results.html
     echo "      </tr>" >> ./test_simulator_results.html
 
+    TRANS_MODES=("fdd" "tdd")
     BW_CASES=(05 10 20)
-    for BW in ${BW_CASES[@]}
+    for TMODE in ${TRANS_MODES[@]}
     do
-        ENB_LOG=$ARCHIVES_LOC/enb_${BW}MHz.log
-        UE_LOG=`echo $ENB_LOG | sed -e "s#enb#ue#"`
-        if [ -f $ENB_LOG ] && [ -f $UE_LOG ]
-        then
-            NAME_ENB=`echo $ENB_LOG | sed -e "s#$ARCHIVES_LOC/##"`
-            NAME_UE=`echo $UE_LOG | sed -e "s#$ARCHIVES_LOC/##"`
-            echo "      <tr>" >> ./test_simulator_results.html
-            echo "        <td>$NAME_ENB --- $NAME_UE</td>" >> ./test_simulator_results.html
-            echo "        <td>N/A</td>" >> ./test_simulator_results.html
-            NB_ENB_GOT_SYNC=`egrep -c "got sync" $ENB_LOG`
-            NB_UE_GOT_SYNC=`egrep -c "got sync" $UE_LOG`
-            NB_ENB_SYNCED_WITH_UE=`egrep -c "got UE capabilities for UE" $ENB_LOG`
-            if [ $NB_ENB_GOT_SYNC -eq 1 ] && [ $NB_UE_GOT_SYNC -eq 2 ] && [ $NB_ENB_SYNCED_WITH_UE -eq 1 ]
-            then
-                echo "        <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
-            else
-                echo "        <td bgcolor = \"red\" >OK</td>" >> ./test_simulator_results.html
-            fi
-            echo "        <td><pre>" >> ./test_simulator_results.html
-            if [ $NB_ENB_GOT_SYNC -eq 1 ]
-            then
-                echo "<font color = \"blue\">- eNB --> got sync</font>" >> ./test_simulator_results.html
-            else
-                echo "<font color = \"red\"><b>- eNB NEVER got sync</b></font>" >> ./test_simulator_results.html
-            fi
-            if [ $NB_UE_GOT_SYNC -eq 2 ]
-            then
-                echo "<font color = \"blue\">- UE --> got sync</font>" >> ./test_simulator_results.html
-            else
-                echo "<font color = \"red\"><b>- UE NEVER got sync</b></font>" >> ./test_simulator_results.html
-            fi
-            if [ $NB_ENB_SYNCED_WITH_UE -eq 1 ]
-            then
-                echo "<font color = \"blue\">- UE attached to eNB</font>" >> ./test_simulator_results.html
-            else
-                echo "<font color = \"red\"><b>- UE NEVER attached to eNB</b></font>" >> ./test_simulator_results.html
-            fi
-            NB_SEGFAULT_ENB=`egrep -i -c "Segmentation Fault" $ENB_LOG`
-            if [ $NB_SEGFAULT_ENB -ne 0 ]
-            then
-                echo "<font color = \"red\"><b>- eNB --> Segmentation Fault</b></font>" >> ./test_simulator_results.html
-            fi
-            NB_SEGFAULT_UE=`egrep -i -c "Segmentation Fault" $UE_LOG`
-            if [ $NB_SEGFAULT_UE -ne 0 ]
-            then
-                echo "<font color = \"red\"><b>- UE --> Segmentation Fault</b></font>" >> ./test_simulator_results.html
-            fi
-            NB_ASSERTION_ENB=`egrep -i -c "Assertion" $ENB_LOG`
-            if [ $NB_ASSERTION_ENB -ne 0 ]
-            then
-                echo "<font color = \"red\"><b>- eNB --> Assertion</b></font>" >> ./test_simulator_results.html
-                awk 'BEGIN{assertion=10}{if(assertion < 3){print "    " $0; assertion++};if ($0 ~/Assertion/){print "    " $0;assertion=1}}END{}' $ENB_LOG >> ./test_simulator_results.html
-            fi
-            NB_ASSERTION_UE=`egrep -i -c "Assertion" $UE_LOG`
-            if [ $NB_ASSERTION_UE -ne 0 ]
-            then
-                echo "<font color = \"red\"><b>- eNB --> Assertion</b></font>" >> ./test_simulator_results.html
-                awk 'BEGIN{assertion=10}{if(assertion < 3){print "    " $0; assertion++};if ($0 ~/Assertion/){print "    " $0;assertion=1}}END{}' $UE_LOG >> ./test_simulator_results.html
-            fi
-            echo "        </pre></td>" >> ./test_simulator_results.html
-            echo "      </tr>" >> ./test_simulator_results.html
-        fi
-        PING_CASE=$ARCHIVES_LOC/${BW}MHz_ping_ue.txt
-        if [ -f $PING_CASE ]
-        then
-            echo "      <tr>" >> ./test_simulator_results.html
-            NAME=`echo $PING_CASE | sed -e "s#$ARCHIVES_LOC/##"`
-            echo "        <td>$NAME</td>" >> ./test_simulator_results.html
-            CMD=`egrep "COMMAND IS" $PING_CASE | sed -e "s#COMMAND IS: ##"`
-            echo "        <td>$CMD</td>" >> ./test_simulator_results.html
-            FILE_COMPLETE=`egrep -c "ping statistics" $PING_CASE`
-            if [ $FILE_COMPLETE -eq 0 ]
+        for BW in ${BW_CASES[@]}
+        do
+            ENB_LOG=$ARCHIVES_LOC/${TMODE}_${BW}MHz_enb.log
+            UE_LOG=`echo $ENB_LOG | sed -e "s#enb#ue#"`
+            if [ -f $ENB_LOG ] && [ -f $UE_LOG ]
             then
-                echo "        <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
+                NAME_ENB=`echo $ENB_LOG | sed -e "s#$ARCHIVES_LOC/##"`
+                NAME_UE=`echo $UE_LOG | sed -e "s#$ARCHIVES_LOC/##"`
+                echo "      <tr>" >> ./test_simulator_results.html
+                echo "        <td>$NAME_ENB --- $NAME_UE</td>" >> ./test_simulator_results.html
                 echo "        <td>N/A</td>" >> ./test_simulator_results.html
-            else
-                NB_TR_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s# packets transmitted.*##"`
-                NB_RC_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*packets transmitted, ##" -e "s# received,.*##"`
-                if [ $NB_TR_PACKETS -eq $NB_RC_PACKETS ]
+                NB_ENB_GOT_SYNC=`egrep -c "got sync" $ENB_LOG`
+                NB_UE_GOT_SYNC=`egrep -c "got sync" $UE_LOG`
+                NB_ENB_SYNCED_WITH_UE=`egrep -c "got UE capabilities for UE" $ENB_LOG`
+                if [ $NB_ENB_GOT_SYNC -eq 1 ] && [ $NB_UE_GOT_SYNC -eq 2 ] && [ $NB_ENB_SYNCED_WITH_UE -eq 1 ]
                 then
                     echo "        <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
                 else
-                    echo "        <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
+                    echo "        <td bgcolor = \"red\" >OK</td>" >> ./test_simulator_results.html
                 fi
-                echo "        <td>" >> ./test_simulator_results.html
-                echo "            <pre>" >> ./test_simulator_results.html
-                STATS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*received, ##" -e "s#, time.*##" -e "s# packet loss##"`
-                echo "Packet Loss : $STATS" >> ./test_simulator_results.html
-                RTTMIN=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[1] " " $5}'`
-                echo "RTT Minimal : $RTTMIN" >> ./test_simulator_results.html
-                RTTAVG=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[2] " " $5}'`
-                echo "RTT Average : $RTTAVG" >> ./test_simulator_results.html
-                RTTMAX=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[3] " " $5}'`
-                echo "RTT Maximal : $RTTMAX" >> ./test_simulator_results.html
-                echo "            </pre>" >> ./test_simulator_results.html
-                echo "        </td>" >> ./test_simulator_results.html
-            fi
-            echo "      </tr>" >> ./test_simulator_results.html
-        fi
-
-        if [ -f $ARCHIVES_LOC/${BW}*iperf*dl*client*txt ]
-        then
-            IPERF_TESTS=`ls $ARCHIVES_LOC/${BW}*iperf*client*txt`
-        else
-            echo "There are no iperf files"
-            IPERF_TESTS=""
-        fi
-        for IPERF_CASE in $IPERF_TESTS
-        do
-            echo "      <tr>" >> ./test_simulator_results.html
-            NAME=`echo $IPERF_CASE | sed -e "s#$ARCHIVES_LOC/##"`
-            echo "        <td>$NAME</td>" >> ./test_simulator_results.html
-            CMD=`egrep "COMMAND IS" $IPERF_CASE | sed -e "s#COMMAND IS: ##"`
-            echo "        <td>$CMD</td>" >> ./test_simulator_results.html
-            REQ_BITRATE=`echo $CMD | sed -e "s#^.*-b ##" -e "s#-i 1.*##"`
-            if [[ $REQ_BITRATE =~ .*K.* ]]
-            then
-                REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#K##"`
-                FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000.0" | bc -l`
-            fi
-            if [[ $REQ_BITRATE =~ .*M.* ]]
-            then
-                REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#M##"`
-                FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000.0" | bc -l`
+                echo "        <td><pre>" >> ./test_simulator_results.html
+                if [ $NB_ENB_GOT_SYNC -eq 1 ]
+                then
+                    echo "<font color = \"blue\">- eNB --> got sync</font>" >> ./test_simulator_results.html
+                else
+                    echo "<font color = \"red\"><b>- eNB NEVER got sync</b></font>" >> ./test_simulator_results.html
+                fi
+                if [ $NB_UE_GOT_SYNC -eq 2 ]
+                then
+                    echo "<font color = \"blue\">- UE --> got sync</font>" >> ./test_simulator_results.html
+                else
+                    echo "<font color = \"red\"><b>- UE NEVER got sync</b></font>" >> ./test_simulator_results.html
+                fi
+                if [ $NB_ENB_SYNCED_WITH_UE -eq 1 ]
+                then
+                    echo "<font color = \"blue\">- UE attached to eNB</font>" >> ./test_simulator_results.html
+                else
+                    echo "<font color = \"red\"><b>- UE NEVER attached to eNB</b></font>" >> ./test_simulator_results.html
+                fi
+                NB_SEGFAULT_ENB=`egrep -i -c "Segmentation Fault" $ENB_LOG`
+                if [ $NB_SEGFAULT_ENB -ne 0 ]
+                then
+                    echo "<font color = \"red\"><b>- eNB --> Segmentation Fault</b></font>" >> ./test_simulator_results.html
+                fi
+                NB_SEGFAULT_UE=`egrep -i -c "Segmentation Fault" $UE_LOG`
+                if [ $NB_SEGFAULT_UE -ne 0 ]
+                then
+                    echo "<font color = \"red\"><b>- UE --> Segmentation Fault</b></font>" >> ./test_simulator_results.html
+                fi
+                NB_ASSERTION_ENB=`egrep -i -c "Assertion" $ENB_LOG`
+                if [ $NB_ASSERTION_ENB -ne 0 ]
+                then
+                    echo "<font color = \"red\"><b>- eNB --> Assertion</b></font>" >> ./test_simulator_results.html
+                    awk 'BEGIN{assertion=10}{if(assertion < 3){print "    " $0; assertion++};if ($0 ~/Assertion/){print "    " $0;assertion=1}}END{}' $ENB_LOG >> ./test_simulator_results.html
+                fi
+                NB_ASSERTION_UE=`egrep -i -c "Assertion" $UE_LOG`
+                if [ $NB_ASSERTION_UE -ne 0 ]
+                then
+                    echo "<font color = \"red\"><b>- eNB --> Assertion</b></font>" >> ./test_simulator_results.html
+                    awk 'BEGIN{assertion=10}{if(assertion < 3){print "    " $0; assertion++};if ($0 ~/Assertion/){print "    " $0;assertion=1}}END{}' $UE_LOG >> ./test_simulator_results.html
+                fi
+                echo "        </pre></td>" >> ./test_simulator_results.html
+                echo "      </tr>" >> ./test_simulator_results.html
             fi
-            if [[ $REQ_BITRATE =~ .*G.* ]]
+            PING_CASE=$ARCHIVES_LOC/${TMODE}_${BW}MHz_ping_ue.txt
+            if [ -f $PING_CASE ]
             then
-                REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#G##"`
-                FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000000.0" | bc -l`
+                echo "      <tr>" >> ./test_simulator_results.html
+                NAME=`echo $PING_CASE | sed -e "s#$ARCHIVES_LOC/##"`
+                echo "        <td>$NAME</td>" >> ./test_simulator_results.html
+                CMD=`egrep "COMMAND IS" $PING_CASE | sed -e "s#COMMAND IS: ##"`
+                echo "        <td>$CMD</td>" >> ./test_simulator_results.html
+                FILE_COMPLETE=`egrep -c "ping statistics" $PING_CASE`
+                if [ $FILE_COMPLETE -eq 0 ]
+                then
+                    echo "        <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
+                    echo "        <td>N/A</td>" >> ./test_simulator_results.html
+                else
+                    NB_TR_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s# packets transmitted.*##"`
+                    NB_RC_PACKETS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*packets transmitted, ##" -e "s# received,.*##"`
+                    if [ $NB_TR_PACKETS -eq $NB_RC_PACKETS ]
+                    then
+                        echo "        <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
+                    else
+                        echo "        <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
+                    fi
+                    echo "        <td>" >> ./test_simulator_results.html
+                    echo "            <pre>" >> ./test_simulator_results.html
+                    STATS=`egrep "packets transmitted" $PING_CASE | sed -e "s#^.*received, ##" -e "s#, time.*##" -e "s# packet loss##"`
+                    echo "Packet Loss : $STATS" >> ./test_simulator_results.html
+                    RTTMIN=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[1] " " $5}'`
+                    echo "RTT Minimal : $RTTMIN" >> ./test_simulator_results.html
+                    RTTAVG=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[2] " " $5}'`
+                    echo "RTT Average : $RTTAVG" >> ./test_simulator_results.html
+                    RTTMAX=`egrep "rtt min" $PING_CASE | awk '{split($4,a,"/"); print a[3] " " $5}'`
+                    echo "RTT Maximal : $RTTMAX" >> ./test_simulator_results.html
+                    echo "            </pre>" >> ./test_simulator_results.html
+                    echo "        </td>" >> ./test_simulator_results.html
+                fi
+                echo "      </tr>" >> ./test_simulator_results.html
             fi
-            FILE_COMPLETE=`egrep -c "Server Report" $IPERF_CASE`
-            if [ $FILE_COMPLETE -eq 0 ]
+    
+            if [ -f $ARCHIVES_LOC/${TMODE}_${BW}*iperf*dl*client*txt ]
             then
-                echo "        <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
-                SERVER_FILE=`echo $IPERF_CASE | sed -e "s#client#server#"`
-                FLOAT_EFF_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; printf "%.0f", br}'`
-                EFFECTIVE_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; if(br>1000000){printf "%.2f MBits/sec", br/1000000}}'`
-                PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'`
-                JITTER=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*/sec *##" -e "s# *ms.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{jitter=s/n; printf "%.3f ms", jitter}'`
-                PACKETLOSS_NOSIGN=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*(##" -e "s#%.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{per=s/n; printf "%.1f", per}'`
-                PACKETLOSS=`echo "${PACKETLOSS_NOSIGN}%"`
+                IPERF_TESTS=`ls $ARCHIVES_LOC/${TMODE}_${BW}*iperf*client*txt`
             else
-                EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
-                if [[ $EFFECTIVE_BITRATE =~ .*Kbits/sec.* ]]
+                echo "There are no iperf files"
+                IPERF_TESTS=""
+            fi
+            for IPERF_CASE in $IPERF_TESTS
+            do
+                echo "      <tr>" >> ./test_simulator_results.html
+                NAME=`echo $IPERF_CASE | sed -e "s#$ARCHIVES_LOC/##"`
+                echo "        <td>$NAME</td>" >> ./test_simulator_results.html
+                CMD=`egrep "COMMAND IS" $IPERF_CASE | sed -e "s#COMMAND IS: ##"`
+                echo "        <td>$CMD</td>" >> ./test_simulator_results.html
+                REQ_BITRATE=`echo $CMD | sed -e "s#^.*-b ##" -e "s#-i 1.*##"`
+                if [[ $REQ_BITRATE =~ .*K.* ]]
                 then
-                    EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Kbits/sec.*##"`
-                    FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000" | bc -l`
+                    REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#K##"`
+                    FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000.0" | bc -l`
                 fi
-                if [[ $EFFECTIVE_BITRATE =~ .*Mbits/sec.* ]]
+                if [[ $REQ_BITRATE =~ .*M.* ]]
                 then
-                    EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Mbits/sec.*##"`
-                    FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000" | bc -l`
+                    REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#M##"`
+                    FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000.0" | bc -l`
                 fi
-                if [[ $EFFECTIVE_BITRATE =~ .*Gbits/sec.* ]]
+                if [[ $REQ_BITRATE =~ .*G.* ]]
                 then
-                    EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Gbits/sec.*##"`
-                    FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000000" | bc -l`
+                    REQ_BITRATE=`echo $REQ_BITRATE | sed -e "s#G##"`
+                    FLOAT_REQ_BITRATE=`echo "$REQ_BITRATE * 1000000000.0" | bc -l`
                 fi
-                PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'`
-                PERF_INT=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.0f", $0}'`
-                if [[ $PERF_INT -lt 90 ]]
+                FILE_COMPLETE=`egrep -c "Server Report" $IPERF_CASE`
+                if [ $FILE_COMPLETE -eq 0 ]
                 then
                     echo "        <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
+                    SERVER_FILE=`echo $IPERF_CASE | sed -e "s#client#server#"`
+                    FLOAT_EFF_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; printf "%.0f", br}'`
+                    EFFECTIVE_BITRATE=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*Bytes *##" -e "s#sec *.*#sec#" | awk 'BEGIN{s=0;n=0}{n++;if ($2 ~/Mbits/){a = $1 * 1000000};if ($2 ~/Kbits/){a = $1 * 1000};s=s+a}END{br=s/n; if(br>1000000){printf "%.2f MBits/sec", br/1000000}}'`
+                    PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'`
+                    JITTER=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*/sec *##" -e "s# *ms.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{jitter=s/n; printf "%.3f ms", jitter}'`
+                    PACKETLOSS_NOSIGN=`grep --color=never sec $SERVER_FILE | sed -e "s#^.*(##" -e "s#%.*##" | awk 'BEGIN{s=0;n=0}{n++;s+=$1}END{per=s/n; printf "%.1f", per}'`
+                    PACKETLOSS=`echo "${PACKETLOSS_NOSIGN}%"`
                 else
-                    echo "        <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
+                    EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
+                    if [[ $EFFECTIVE_BITRATE =~ .*Kbits/sec.* ]]
+                    then
+                        EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Kbits/sec.*##"`
+                        FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000" | bc -l`
+                    fi
+                    if [[ $EFFECTIVE_BITRATE =~ .*Mbits/sec.* ]]
+                    then
+                        EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Mbits/sec.*##"`
+                        FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000" | bc -l`
+                    fi
+                    if [[ $EFFECTIVE_BITRATE =~ .*Gbits/sec.* ]]
+                    then
+                        EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Gbits/sec.*##"`
+                        FLOAT_EFF_BITRATE=`echo "$EFFECTIVE_BITRATE * 1000000000" | bc -l`
+                    fi
+                    PERF=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.2f", $0}'`
+                    PERF_INT=`echo "100 * $FLOAT_EFF_BITRATE / $FLOAT_REQ_BITRATE" | bc -l | awk '{printf "%.0f", $0}'`
+                    if [[ $PERF_INT -lt 90 ]]
+                    then
+                        echo "        <td bgcolor = \"red\" >KO</td>" >> ./test_simulator_results.html
+                    else
+                        echo "        <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
+                    fi
+                    EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
+                    JITTER=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*Mbits/sec *##" -e "s#ms.*#ms#"`
+                    PACKETLOSS=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*(##" -e "s#).*##"`
                 fi
-                EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
-                JITTER=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*Mbits/sec *##" -e "s#ms.*#ms#"`
-                PACKETLOSS=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*(##" -e "s#).*##"`
-            fi
-            echo "        <td>" >> ./test_simulator_results.html
-            echo "            <pre>" >> ./test_simulator_results.html
-            echo "Bitrate      : $EFFECTIVE_BITRATE" >> ./test_simulator_results.html
-            echo "Bitrate Perf : $PERF %" >> ./test_simulator_results.html
-            echo "Jitter       : $JITTER" >> ./test_simulator_results.html
-            echo "Packet Loss  : $PACKETLOSS" >> ./test_simulator_results.html
-            echo "            </pre>" >> ./test_simulator_results.html
-            echo "        </td>" >> ./test_simulator_results.html
-            echo "      </tr>" >> ./test_simulator_results.html
+                echo "        <td>" >> ./test_simulator_results.html
+                echo "            <pre>" >> ./test_simulator_results.html
+                echo "Bitrate      : $EFFECTIVE_BITRATE" >> ./test_simulator_results.html
+                echo "Bitrate Perf : $PERF %" >> ./test_simulator_results.html
+                echo "Jitter       : $JITTER" >> ./test_simulator_results.html
+                echo "Packet Loss  : $PACKETLOSS" >> ./test_simulator_results.html
+                echo "            </pre>" >> ./test_simulator_results.html
+                echo "        </td>" >> ./test_simulator_results.html
+                echo "      </tr>" >> ./test_simulator_results.html
+            done
         done
     done
 
diff --git a/ci-scripts/runTestOnVM.sh b/ci-scripts/runTestOnVM.sh
index ea536b749af825669bc0bd74c9b9693e9ae7cd49..d74d6e2eabcfcde2e43d63feafc625c6f922db61 100755
--- a/ci-scripts/runTestOnVM.sh
+++ b/ci-scripts/runTestOnVM.sh
@@ -75,6 +75,7 @@ function start_basic_sim_enb {
     local LOC_EPC_IP_ADDR=$3
     local LOC_LOG_FILE=$4
     local LOC_NB_RBS=$5
+    local LOC_CONF_FILE=$6
     echo "cd /home/ubuntu/tmp" > $1
     echo "echo \"sudo apt-get --yes --quiet install daemon \"" >> $1
     echo "sudo apt-get --yes install daemon >> /home/ubuntu/tmp/cmake_targets/log/daemon-install.txt 2>&1" >> $1
@@ -83,13 +84,13 @@ function start_basic_sim_enb {
     echo "echo \"source oaienv\"" >> $1
     echo "source oaienv" >> $1
     echo "cd ci-scripts/conf_files/" >> $1
-    echo "cp lte-basic-sim.conf ci-lte-basic-sim.conf" >> $1
-    echo "sed -i -e 's#N_RB_DL.*=.*;#N_RB_DL                                         = $LOC_NB_RBS;#' -e 's#CI_MME_IP_ADDR#$LOC_EPC_IP_ADDR#' -e 's#CI_ENB_IP_ADDR#$LOC_VM_IP_ADDR#' ci-lte-basic-sim.conf" >> $1
-    echo "echo \"grep N_RB_DL ci-lte-basic-sim.conf\"" >> $1
-    echo "grep N_RB_DL ci-lte-basic-sim.conf | sed -e 's#N_RB_DL.*=#N_RB_DL =#'" >> $1
+    echo "cp $LOC_CONF_FILE ci-$LOC_CONF_FILE" >> $1
+    echo "sed -i -e 's#N_RB_DL.*=.*;#N_RB_DL                                         = $LOC_NB_RBS;#' -e 's#CI_MME_IP_ADDR#$LOC_EPC_IP_ADDR#' -e 's#CI_ENB_IP_ADDR#$LOC_VM_IP_ADDR#' ci-$LOC_CONF_FILE" >> $1
+    echo "echo \"grep N_RB_DL ci-$LOC_CONF_FILE\"" >> $1
+    echo "grep N_RB_DL ci-$LOC_CONF_FILE | sed -e 's#N_RB_DL.*=#N_RB_DL =#'" >> $1
     echo "echo \"cd /home/ubuntu/tmp/cmake_targets/basic_simulator/enb/\"" >> $1
     echo "cd /home/ubuntu/tmp/cmake_targets/basic_simulator/enb/" >> $1
-    echo "echo \"ulimit -c unlimited && ./lte-softmodem -O /home/ubuntu/tmp/ci-scripts/conf_files/ci-lte-basic-sim.conf\" > ./my-lte-softmodem-run.sh " >> $1
+    echo "echo \"ulimit -c unlimited && ./lte-softmodem -O /home/ubuntu/tmp/ci-scripts/conf_files/ci-$LOC_CONF_FILE\" > ./my-lte-softmodem-run.sh " >> $1
     echo "chmod 775 ./my-lte-softmodem-run.sh" >> $1
     echo "cat ./my-lte-softmodem-run.sh" >> $1
     echo "sudo -E daemon --inherit --unsafe --name=enb_daemon --chdir=/home/ubuntu/tmp/cmake_targets/basic_simulator/enb -o /home/ubuntu/tmp/cmake_targets/log/$LOC_LOG_FILE ./my-lte-softmodem-run.sh" >> $1
@@ -102,9 +103,10 @@ function start_basic_sim_enb {
 function start_basic_sim_ue {
     local LOC_UE_LOG_FILE=$3
     local LOC_NB_RBS=$4
+    local LOC_FREQUENCY=$5
     echo "echo \"cd /home/ubuntu/tmp/cmake_targets/basic_simulator/ue\"" > $1
     echo "cd /home/ubuntu/tmp/cmake_targets/basic_simulator/ue" > $1
-    echo "echo \"./lte-uesoftmodem -C 2680000000 -r $LOC_NB_RBS --ue-rxgain 140\" > ./my-lte-uesoftmodem-run.sh" >> $1
+    echo "echo \"./lte-uesoftmodem -C ${LOC_FREQUENCY}000000 -r $LOC_NB_RBS --ue-rxgain 140\" > ./my-lte-uesoftmodem-run.sh" >> $1
     echo "chmod 775 ./my-lte-uesoftmodem-run.sh" >> $1
     echo "cat ./my-lte-uesoftmodem-run.sh" >> $1
     echo "sudo -E daemon --inherit --unsafe --name=ue_daemon --chdir=/home/ubuntu/tmp/cmake_targets/basic_simulator/ue -o /home/ubuntu/tmp/cmake_targets/log/$LOC_UE_LOG_FILE ./my-lte-uesoftmodem-run.sh" >> $1
@@ -270,7 +272,6 @@ function recover_core_dump {
         local TC=`echo $3 | sed -e "s#^.*enb_##" -e "s#Hz.*#Hz#"`
         echo "Segmentation fault detected on enb -> recovering core dump"
         echo "cd /home/ubuntu/tmp/cmake_targets/basic_simulator/enb" > $1
-        echo "cp /home/ubuntu/tmp/ci-scripts/conf_files/ci-lte-basic-sim.conf ." >> $1
         echo "sync" >> $1
         echo "sudo tar -cjhf basic-simulator-enb-core-${TC}.bz2 core lte-softmodem *.so ci-lte-basic-sim.conf my-lte-softmodem-run.sh" >> $1
         echo "sudo rm core" >> $1
@@ -694,16 +695,16 @@ then
     fi
 
     echo "############################################################"
-    echo "Starting the eNB at 5MHz"
+    echo "Starting the eNB in FDD-5MHz mode"
     echo "############################################################"
-    CURRENT_ENB_LOG_FILE=enb_05MHz.log
-    start_basic_sim_enb $VM_CMDS $VM_IP_ADDR $EPC_VM_IP_ADDR $CURRENT_ENB_LOG_FILE 25
+    CURRENT_ENB_LOG_FILE=fdd_05MHz_enb.log
+    start_basic_sim_enb $VM_CMDS $VM_IP_ADDR $EPC_VM_IP_ADDR $CURRENT_ENB_LOG_FILE 25 lte-fdd-basic-sim.conf
 
     echo "############################################################"
-    echo "Starting the UE at 5MHz"
+    echo "Starting the UE in FDD-5MHz mode"
     echo "############################################################"
-    CURRENT_UE_LOG_FILE=ue_05MHz.log
-    start_basic_sim_ue $VM_CMDS $VM_IP_ADDR $CURRENT_UE_LOG_FILE 25
+    CURRENT_UE_LOG_FILE=fdd_05MHz_ue.log
+    start_basic_sim_ue $VM_CMDS $VM_IP_ADDR $CURRENT_UE_LOG_FILE 25 2680
     if [ $UE_SYNC -eq 0 ]
     then
         echo "Problem w/ eNB and UE not syncing"
@@ -719,14 +720,15 @@ then
     echo "############################################################"
     echo "Pinging the UE"
     echo "############################################################"
-    ping_ue_ip_addr $EPC_VM_CMDS $EPC_VM_IP_ADDR $UE_IP_ADDR 05MHz_ping_ue.txt
-    scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/05MHz_ping_ue.txt $ARCHIVES_LOC
-    check_ping_result $ARCHIVES_LOC/05MHz_ping_ue.txt 20
+    PING_LOG_FILE=fdd_05MHz_ping_ue.txt
+    ping_ue_ip_addr $EPC_VM_CMDS $EPC_VM_IP_ADDR $UE_IP_ADDR $PING_LOG_FILE
+    scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/$PING_LOG_FILE $ARCHIVES_LOC
+    check_ping_result $ARCHIVES_LOC/$PING_LOG_FILE 20
 
     echo "############################################################"
     echo "Iperf DL"
     echo "############################################################"
-    CURR_IPERF_LOG_BASE=05MHz_iperf_dl
+    CURR_IPERF_LOG_BASE=fdd_05MHz_iperf_dl
     iperf_dl $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 15 $CURR_IPERF_LOG_BASE
     scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC
     scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
@@ -735,7 +737,7 @@ then
     echo "############################################################"
     echo "Iperf UL"
     echo "############################################################"
-    CURR_IPERF_LOG_BASE=05MHz_iperf_ul
+    CURR_IPERF_LOG_BASE=fdd_05MHz_iperf_ul
     iperf_ul $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 2 $CURR_IPERF_LOG_BASE
     scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
     scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC
@@ -750,16 +752,16 @@ then
     recover_core_dump $VM_CMDS $VM_IP_ADDR $ARCHIVES_LOC/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
 
     echo "############################################################"
-    echo "Starting the eNB at 10MHz"
+    echo "Starting the eNB in FDD-10MHz mode"
     echo "############################################################"
-    CURRENT_ENB_LOG_FILE=enb_10MHz.log
-    start_basic_sim_enb $VM_CMDS $VM_IP_ADDR $EPC_VM_IP_ADDR $CURRENT_ENB_LOG_FILE 50
+    CURRENT_ENB_LOG_FILE=fdd_10MHz_enb.log
+    start_basic_sim_enb $VM_CMDS $VM_IP_ADDR $EPC_VM_IP_ADDR $CURRENT_ENB_LOG_FILE 50 lte-fdd-basic-sim.conf
 
     echo "############################################################"
-    echo "Starting the UE at 10MHz"
+    echo "Starting the UE in FDD-10MHz mode"
     echo "############################################################"
-    CURRENT_UE_LOG_FILE=ue_10MHz.log
-    start_basic_sim_ue $VM_CMDS $VM_IP_ADDR $CURRENT_UE_LOG_FILE 50
+    CURRENT_UE_LOG_FILE=fdd_10MHz_ue.log
+    start_basic_sim_ue $VM_CMDS $VM_IP_ADDR $CURRENT_UE_LOG_FILE 50 2680
     if [ $UE_SYNC -eq 0 ]
     then
         echo "Problem w/ eNB and UE not syncing"
@@ -775,14 +777,15 @@ then
     echo "############################################################"
     echo "Pinging the UE"
     echo "############################################################"
-    ping_ue_ip_addr $EPC_VM_CMDS $EPC_VM_IP_ADDR $UE_IP_ADDR 10MHz_ping_ue.txt
-    scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/10MHz_ping_ue.txt $ARCHIVES_LOC
-    check_ping_result $ARCHIVES_LOC/10MHz_ping_ue.txt 20
+    PING_LOG_FILE=fdd_10MHz_ping_ue.txt
+    ping_ue_ip_addr $EPC_VM_CMDS $EPC_VM_IP_ADDR $UE_IP_ADDR $PING_LOG_FILE
+    scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/$PING_LOG_FILE $ARCHIVES_LOC
+    check_ping_result $ARCHIVES_LOC/$PING_LOG_FILE 20
 
     echo "############################################################"
     echo "Iperf DL"
     echo "############################################################"
-    CURR_IPERF_LOG_BASE=10MHz_iperf_dl
+    CURR_IPERF_LOG_BASE=fdd_10MHz_iperf_dl
     iperf_dl $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 15 $CURR_IPERF_LOG_BASE
     scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC
     scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
@@ -791,7 +794,7 @@ then
     echo "############################################################"
     echo "Iperf UL"
     echo "############################################################"
-    CURR_IPERF_LOG_BASE=10MHz_iperf_ul
+    CURR_IPERF_LOG_BASE=fdd_10MHz_iperf_ul
     iperf_ul $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 2 $CURR_IPERF_LOG_BASE
     scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
     scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC
@@ -806,16 +809,16 @@ then
     recover_core_dump $VM_CMDS $VM_IP_ADDR $ARCHIVES_LOC/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
 
     echo "############################################################"
-    echo "Starting the eNB at 20MHz"
+    echo "Starting the eNB in FDD-20MHz mode"
     echo "############################################################"
-    CURRENT_ENB_LOG_FILE=enb_20MHz.log
-    start_basic_sim_enb $VM_CMDS $VM_IP_ADDR $EPC_VM_IP_ADDR $CURRENT_ENB_LOG_FILE 100
+    CURRENT_ENB_LOG_FILE=fdd_20MHz_enb.log
+    start_basic_sim_enb $VM_CMDS $VM_IP_ADDR $EPC_VM_IP_ADDR $CURRENT_ENB_LOG_FILE 100 lte-fdd-basic-sim.conf
 
     echo "############################################################"
-    echo "Starting the UE at 20MHz"
+    echo "Starting the UE in FDD-20MHz mode"
     echo "############################################################"
-    CURRENT_UE_LOG_FILE=ue_20MHz.log
-    start_basic_sim_ue $VM_CMDS $VM_IP_ADDR $CURRENT_UE_LOG_FILE 100
+    CURRENT_UE_LOG_FILE=fdd_20MHz_ue.log
+    start_basic_sim_ue $VM_CMDS $VM_IP_ADDR $CURRENT_UE_LOG_FILE 100 2680
     if [ $UE_SYNC -eq 0 ]
     then
         echo "Problem w/ eNB and UE not syncing"
@@ -831,27 +834,154 @@ then
     echo "############################################################"
     echo "Pinging the UE"
     echo "############################################################"
-    ping_ue_ip_addr $EPC_VM_CMDS $EPC_VM_IP_ADDR $UE_IP_ADDR 20MHz_ping_ue.txt
-    scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/20MHz_ping_ue.txt $ARCHIVES_LOC
-    check_ping_result $ARCHIVES_LOC/20MHz_ping_ue.txt 20
+    PING_LOG_FILE=fdd_20MHz_ping_ue.txt
+    ping_ue_ip_addr $EPC_VM_CMDS $EPC_VM_IP_ADDR $UE_IP_ADDR $PING_LOG_FILE
+    scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/$PING_LOG_FILE $ARCHIVES_LOC
+    check_ping_result $ARCHIVES_LOC/$PING_LOG_FILE 20
 
     echo "############################################################"
     echo "Iperf DL"
     echo "############################################################"
-    CURR_IPERF_LOG_BASE=20MHz_iperf_dl
+    CURR_IPERF_LOG_BASE=fdd_20MHz_iperf_dl
     iperf_dl $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 15 $CURR_IPERF_LOG_BASE
     scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC
     scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
     check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 15
 
     echo "############################################################"
-    echo "Iperf UL"
+    echo "Terminate enb/ue simulators"
+    echo "############################################################"
+    terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
+    scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+    scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+    recover_core_dump $VM_CMDS $VM_IP_ADDR $ARCHIVES_LOC/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+
+    echo "############################################################"
+    echo "Starting the eNB in TDD-5MHz mode"
+    echo "############################################################"
+    CURRENT_ENB_LOG_FILE=tdd_05MHz_enb.log
+    start_basic_sim_enb $VM_CMDS $VM_IP_ADDR $EPC_VM_IP_ADDR $CURRENT_ENB_LOG_FILE 25 lte-tdd-basic-sim.conf
+
+    echo "############################################################"
+    echo "Starting the UE in TDD-5MHz mode"
+    echo "############################################################"
+    CURRENT_UE_LOG_FILE=tdd_05MHz_ue.log
+    start_basic_sim_ue $VM_CMDS $VM_IP_ADDR $CURRENT_UE_LOG_FILE 25 2350
+    if [ $UE_SYNC -eq 0 ]
+    then
+        echo "Problem w/ eNB and UE not syncing"
+        terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
+        scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+        scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+        recover_core_dump $VM_CMDS $VM_IP_ADDR $ARCHIVES_LOC/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+        terminate_ltebox_epc $EPC_VM_CMDS $EPC_VM_IP_ADDR
+        exit -1
+    fi
+    get_ue_ip_addr $VM_CMDS $VM_IP_ADDR
+
     echo "############################################################"
-#    CURR_IPERF_LOG_BASE=20MHz_iperf_ul
-#    iperf_ul $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 1 $CURR_IPERF_LOG_BASE
-#    scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
-#    scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC
-#    check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 1
+    echo "Pinging the UE"
+    echo "############################################################"
+    PING_LOG_FILE=tdd_05MHz_ping_ue.txt
+    ping_ue_ip_addr $EPC_VM_CMDS $EPC_VM_IP_ADDR $UE_IP_ADDR $PING_LOG_FILE
+    scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/$PING_LOG_FILE $ARCHIVES_LOC
+    check_ping_result $ARCHIVES_LOC/$PING_LOG_FILE 20
+
+    echo "############################################################"
+    echo "Terminate enb/ue simulators"
+    echo "############################################################"
+    terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
+    scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+    scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+    recover_core_dump $VM_CMDS $VM_IP_ADDR $ARCHIVES_LOC/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+
+    echo "############################################################"
+    echo "Starting the eNB in TDD-10MHz mode"
+    echo "############################################################"
+    CURRENT_ENB_LOG_FILE=tdd_10MHz_enb.log
+    start_basic_sim_enb $VM_CMDS $VM_IP_ADDR $EPC_VM_IP_ADDR $CURRENT_ENB_LOG_FILE 50 lte-tdd-basic-sim.conf
+
+    echo "############################################################"
+    echo "Starting the UE in TDD-10MHz mode"
+    echo "############################################################"
+    CURRENT_UE_LOG_FILE=tdd_10MHz_ue.log
+    start_basic_sim_ue $VM_CMDS $VM_IP_ADDR $CURRENT_UE_LOG_FILE 50 2350
+    if [ $UE_SYNC -eq 0 ]
+    then
+        echo "Problem w/ eNB and UE not syncing"
+        terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
+        scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+        scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+        recover_core_dump $VM_CMDS $VM_IP_ADDR $ARCHIVES_LOC/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+        terminate_ltebox_epc $EPC_VM_CMDS $EPC_VM_IP_ADDR
+        exit -1
+    fi
+    get_ue_ip_addr $VM_CMDS $VM_IP_ADDR
+
+    echo "############################################################"
+    echo "Pinging the UE"
+    echo "############################################################"
+    PING_LOG_FILE=tdd_10MHz_ping_ue.txt
+    ping_ue_ip_addr $EPC_VM_CMDS $EPC_VM_IP_ADDR $UE_IP_ADDR $PING_LOG_FILE
+    scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/$PING_LOG_FILE $ARCHIVES_LOC
+    check_ping_result $ARCHIVES_LOC/$PING_LOG_FILE 20
+
+    echo "############################################################"
+    echo "Iperf DL"
+    echo "############################################################"
+    CURR_IPERF_LOG_BASE=tdd_10MHz_iperf_dl
+    iperf_dl $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 6 $CURR_IPERF_LOG_BASE
+    scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC
+    scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
+    check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 6
+
+    echo "############################################################"
+    echo "Terminate enb/ue simulators"
+    echo "############################################################"
+    terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
+    scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+    scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+    recover_core_dump $VM_CMDS $VM_IP_ADDR $ARCHIVES_LOC/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+
+    echo "############################################################"
+    echo "Starting the eNB in TDD-20MHz mode"
+    echo "############################################################"
+    CURRENT_ENB_LOG_FILE=tdd_20MHz_enb.log
+    start_basic_sim_enb $VM_CMDS $VM_IP_ADDR $EPC_VM_IP_ADDR $CURRENT_ENB_LOG_FILE 100 lte-tdd-basic-sim.conf
+
+    echo "############################################################"
+    echo "Starting the UE in TDD-20MHz mode"
+    echo "############################################################"
+    CURRENT_UE_LOG_FILE=tdd_20MHz_ue.log
+    start_basic_sim_ue $VM_CMDS $VM_IP_ADDR $CURRENT_UE_LOG_FILE 100 2350
+    if [ $UE_SYNC -eq 0 ]
+    then
+        echo "Problem w/ eNB and UE not syncing"
+        terminate_enb_ue_basic_sim $VM_CMDS $VM_IP_ADDR
+        scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+        scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/$CURRENT_UE_LOG_FILE $ARCHIVES_LOC
+        recover_core_dump $VM_CMDS $VM_IP_ADDR $ARCHIVES_LOC/$CURRENT_ENB_LOG_FILE $ARCHIVES_LOC
+        terminate_ltebox_epc $EPC_VM_CMDS $EPC_VM_IP_ADDR
+        exit -1
+    fi
+    get_ue_ip_addr $VM_CMDS $VM_IP_ADDR
+
+    echo "############################################################"
+    echo "Pinging the UE"
+    echo "############################################################"
+    PING_LOG_FILE=tdd_20MHz_ping_ue.txt
+    ping_ue_ip_addr $EPC_VM_CMDS $EPC_VM_IP_ADDR $UE_IP_ADDR $PING_LOG_FILE
+    scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/$PING_LOG_FILE $ARCHIVES_LOC
+    check_ping_result $ARCHIVES_LOC/$PING_LOG_FILE 20
+
+    echo "############################################################"
+    echo "Iperf DL"
+    echo "############################################################"
+    CURR_IPERF_LOG_BASE=tdd_20MHz_iperf_dl
+    iperf_dl $VM_CMDS $VM_IP_ADDR $EPC_VM_CMDS $EPC_VM_IP_ADDR 6 $CURR_IPERF_LOG_BASE
+    scp -o StrictHostKeyChecking=no ubuntu@$EPC_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC
+    scp -o StrictHostKeyChecking=no ubuntu@$VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/log/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
+    check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE 6
 
     echo "############################################################"
     echo "Terminate enb/ue simulators"
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 51db2c60bf508e846738d953c5cfdd3d8e1d91ec..23d96afc545720b140473a29088dcd0c49f4834e 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -474,12 +474,12 @@ include_directories ("${X2AP_DIR}")
 
 add_library(X2AP_ENB
   ${X2AP_DIR}/x2ap_eNB.c
- # ${X2AP_DIR}/x2ap_eNB_decoder.c
- # ${X2AP_DIR}/x2ap_eNB_encoder.c
+  ${X2AP_DIR}/x2ap_eNB_decoder.c
+  ${X2AP_DIR}/x2ap_eNB_encoder.c
   ${X2AP_DIR}/x2ap_eNB_handler.c
- # ${X2AP_DIR}/x2ap_eNB_itti_messaging.c
+  ${X2AP_DIR}/x2ap_eNB_itti_messaging.c
   ${X2AP_DIR}/x2ap_eNB_management_procedures.c
- # ${X2AP_DIR}/x2ap_eNB_generate_messages.c
+  ${X2AP_DIR}/x2ap_eNB_generate_messages.c
  )
 
 # Hardware dependant options
diff --git a/common/utils/msc/msc.h b/common/utils/msc/msc.h
index 78eb6cdb080665290f80474328110f79a1d61f28..e8a8a4a0e82d7f65f9b9fcd80b54ddc79cff2759 100644
--- a/common/utils/msc/msc.h
+++ b/common/utils/msc/msc.h
@@ -63,6 +63,8 @@ typedef enum {
     MSC_S6A_MME,
     MSC_HSS,
     MAX_MSC_PROTOS,
+    MSC_X2AP_SRC_ENB,
+    MSC_X2AP_TARGET_ENB,
 } msc_proto_t;
 
 
diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp
index 931eb40c0fc04a1798d51cc40ec207837e5688d0..5b8d1a430e02cef93126e71a61f69ae7e6513d94 100644
--- a/common/utils/ocp_itti/intertask_interface.cpp
+++ b/common/utils/ocp_itti/intertask_interface.cpp
@@ -115,11 +115,15 @@ extern "C" {
     task_list_t *t=&tasks[destination_task_id];
     pthread_mutex_lock (&t->queue_cond_lock);
     int ret=itti_send_msg_to_task_locked(destination_task_id, instance, message);
-    pthread_mutex_unlock (&t->queue_cond_lock);
 
-    while ( t->message_queue.size()>0 && t->admin.func != NULL )
+    while ( t->message_queue.size()>0 && t->admin.func != NULL ) {
+      if (t->message_queue.size()>1)
+	LOG_W(TMR,"queue in no thread mode is %ld\n", t->message_queue.size());
+      pthread_mutex_unlock (&t->queue_cond_lock);
       t->admin.func(NULL);
-
+      pthread_mutex_lock (&t->queue_cond_lock);
+    } 
+    pthread_mutex_unlock (&t->queue_cond_lock);
     return ret;
   }
 
@@ -193,6 +197,8 @@ extern "C" {
       pthread_mutex_unlock(&t->queue_cond_lock);
       LOG_D(TMR,"enter blocking wait for %s\n", itti_get_task_name(task_id));
       t->nb_events = epoll_wait(t->epoll_fd,t->events,t->nb_fd_epoll, epoll_timeout);
+      if ( t->nb_events  < 0 && (errno == EINTR || errno == EAGAIN ) )
+	pthread_mutex_lock(&t->queue_cond_lock);
     } while (t->nb_events  < 0 && (errno == EINTR || errno == EAGAIN ) );
 
     AssertFatal (t->nb_events >=0,
@@ -278,6 +284,18 @@ extern "C" {
                   "Thread creation for task %d failed!\n", task_id);
     pthread_setname_np( t->thread, itti_get_task_name(task_id) );
     LOG_I(TMR,"Created Posix thread %s\n",  itti_get_task_name(task_id) );
+#if 1 // BMC test RT prio
+    {
+      int policy;
+      struct sched_param sparam;
+      memset(&sparam, 0, sizeof(sparam));
+      sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-10;
+      policy = SCHED_FIFO ; 
+      if (pthread_setschedparam(t->thread, policy, &sparam) != 0) {
+	LOG_E(TMR,"task %s : Failed to set pthread priority\n",  itti_get_task_name(task_id) );
+      }
+    }
+#endif    
     return 0;
   }
 
diff --git a/common/utils/ocp_itti/intertask_interface.h b/common/utils/ocp_itti/intertask_interface.h
index 7d07724cc14be3c0b3aee2f2f23de62318a7e799..227e9b0b3e702040f97a1477f50dd133b31209c3 100644
--- a/common/utils/ocp_itti/intertask_interface.h
+++ b/common/utils/ocp_itti/intertask_interface.h
@@ -233,6 +233,11 @@ typedef struct IttiMsgText_s {
 #include <openair3/S1AP/s1ap_eNB.h>
 //#include <proto.h>
 
+#include <openair3/GTPV1-U/gtpv1u_eNB_task.h>
+void *rrc_enb_process_itti_msg(void *);
+#include <openair3/SCTP/sctp_eNB_task.h>
+#include <openair3/S1AP/s1ap_eNB.h>
+
 /*
   static const char *const messages_definition_xml = {
   #include <messages_xml.h>
diff --git a/openair1/PHY/INIT/lte_param_init.c b/openair1/PHY/INIT/lte_param_init.c
index 0830058a8fb4bda41bb692a4e29b9aa460fb7104..dd8c2e54dba3f4229fae2c3eb9f1e24076364c33 100644
--- a/openair1/PHY/INIT/lte_param_init.c
+++ b/openair1/PHY/INIT/lte_param_init.c
@@ -169,6 +169,13 @@ void lte_param_init(PHY_VARS_eNB **eNBp,
   }
   else ru->N_TA_offset=0;
 
+#if BASIC_SIMULATOR
+  /* this is required for the basic simulator in TDD mode
+   * TODO: find a proper cleaner solution
+   */
+  UE->N_TA_offset = 0;
+#endif
+
   printf("Done lte_param_init\n");
 
 
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
index ccdc4f25b0dec650cc40c03d6ca50c79b075c4d6..30c106b16bdabfff7d1671588a94c24eb6519e38 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
@@ -57,8 +57,8 @@
 		     uint64_t runtime,
 		     uint64_t deadline,
 		     uint64_t period);*/
+extern WORKER_CONF_t get_thread_worker_conf(void);
 
-extern int codingw;
 
 void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch)
 {
@@ -615,8 +615,10 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
 		}
 	}
 
-    if(C >= 8 && get_nprocs()>=16 && codingw)//one main three worker
+    if(get_thread_worker_conf() == WORKER_ENABLE)
     {
+      if(C >= 8)//one main three worker
+      {
         encoding_return =
 		dlsch_encoding_2threads(eNB,
 				   a,
@@ -632,9 +634,9 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
                    te_wakeup_stats1,
                    i_stats,
                    3);
-    }
-    else if(C >= 6 && get_nprocs()>=8 && codingw)//one main two worker
-    {
+      }
+      else if(C >= 6)//one main two worker
+      {
         encoding_return =
 		dlsch_encoding_2threads(eNB,
 				   a,
@@ -650,9 +652,9 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
                    te_wakeup_stats1,
                    i_stats,
                    2);
-    }
-    else if(C >= 4 && get_nprocs()>=4 && codingw)//one main one worker
-    {
+      }
+      else if(C >= 4)//one main one worker
+      {
         encoding_return =
 		dlsch_encoding_2threads(eNB,
 				   a,
@@ -668,9 +670,23 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
                    te_wakeup_stats1,
                    i_stats,
                    1);
+      }
+      else
+      {
+		encoding_return =
+		dlsch_encoding(eNB,
+				   a,
+                   num_pdcch_symbols,
+                   dlsch,
+                   frame,
+                   subframe,
+                   rm_stats,
+                   te_stats,
+                   i_stats);
+      }
     }
-	else
-	{
+    else
+    {
 		encoding_return =
 		dlsch_encoding(eNB,
 				   a,
@@ -681,7 +697,7 @@ int dlsch_encoding_all(PHY_VARS_eNB *eNB,
                    rm_stats,
                    te_stats,
                    i_stats);
-	}
+    }
 	return encoding_return;
 }
 
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
index 851bcfff5a88582da16401f394b45c106529b45c..046e456916a104bf5afc892142a9317807ac4e80 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
@@ -45,7 +45,7 @@
 #include "targets/RT/USER/rt_wrapper.h"
 #include "transport_proto.h"
 
-extern int codingw;
+extern WORKER_CONF_t get_thread_worker_conf(void);
 
 void free_eNB_ulsch(LTE_eNB_ULSCH_t *ulsch)
 {
@@ -723,7 +723,7 @@ int ulsch_decoding_data(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag)
 int ulsch_decoding_data_all(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,int llr8_flag) 
 {
   int ret = 0;
-  /*if(codingw)
+  /*if(get_thread_worker_conf() == WORKER_ENABLE)
   {
     ret = ulsch_decoding_data_2thread(eNB,UE_id,harq_pid,llr8_flag);
   }
diff --git a/openair1/PHY/defs_common.h b/openair1/PHY/defs_common.h
index 03d83472f8b8c81a46ada530cf664c6e701a7990..9a735b038fedd588a06afe665824d02f68d47da0 100644
--- a/openair1/PHY/defs_common.h
+++ b/openair1/PHY/defs_common.h
@@ -862,7 +862,22 @@ typedef enum {
   RESYNCH=4
 } UE_MODE_t;
 
+/// Threading Parameter
+typedef enum {
+  PARALLEL_SINGLE_THREAD    =0,
+  PARALLEL_RU_L1_SPLIT      =1,
+  PARALLEL_RU_L1_TRX_SPLIT  =2
+}PARALLEL_CONF_t;
 
+typedef enum {
+  WORKER_DISABLE            =0,
+  WORKER_ENABLE             =1
+}WORKER_CONF_t;
+
+typedef struct THREAD_STRUCT_s {
+  PARALLEL_CONF_t  parallel_conf;
+  WORKER_CONF_t    worker_conf;
+} THREAD_STRUCT;
 
 typedef enum {SF_DL, SF_UL, SF_S} lte_subframe_t;
 
diff --git a/openair1/PHY/defs_eNB.h b/openair1/PHY/defs_eNB.h
index c58fffe0ef2ebe8fa890dbac762dcd4e9bb2a56f..f23485cad84e732ec2459da1ec7c005052b6b74e 100644
--- a/openair1/PHY/defs_eNB.h
+++ b/openair1/PHY/defs_eNB.h
@@ -270,7 +270,6 @@ typedef enum {
   REMOTE_IF4p5    =3,
   REMOTE_IF1pp    =4,
   MAX_RU_IF_TYPES =5
-  //EMULATE_RF      =6
 } RU_if_south_t;
 
 typedef struct RU_t_s{
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index a03ce34bcae135d452b54c53a7e5dbb79bf39049..3583c0f25eae1246f0f86760b79734700313067b 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -82,7 +82,30 @@ double t_rx_min = 1000000000; /*!< \brief initial min process time for rx */
 int n_tx_dropped = 0; /*!< \brief initial max process time for tx */
 int n_rx_dropped = 0; /*!< \brief initial max process time for rx */
 
-int codingw = 0;
+char *parallel_config = NULL;
+char *worker_config = NULL;
+static THREAD_STRUCT thread_struct;
+void set_parallel_conf(char *parallel_conf)
+{
+  if(strcmp(parallel_conf,"PARALLEL_SINGLE_THREAD")==0)           thread_struct.parallel_conf = PARALLEL_SINGLE_THREAD;
+  else if(strcmp(parallel_conf,"PARALLEL_RU_L1_SPLIT")==0)        thread_struct.parallel_conf = PARALLEL_RU_L1_SPLIT;
+  else if(strcmp(parallel_conf,"PARALLEL_RU_L1_TRX_SPLIT")==0)    thread_struct.parallel_conf = PARALLEL_RU_L1_TRX_SPLIT;
+  printf("[CONFIG] parallel conf is set to %d\n",thread_struct.parallel_conf);
+} 
+void set_worker_conf(char *worker_conf)
+{
+  if(strcmp(worker_conf,"WORKER_DISABLE")==0)                     thread_struct.worker_conf = WORKER_DISABLE;
+  else if(strcmp(worker_conf,"WORKER_ENABLE")==0)                 thread_struct.worker_conf = WORKER_ENABLE;
+  printf("[CONFIG] worker conf is set to %d\n",thread_struct.worker_conf);
+} 
+PARALLEL_CONF_t get_thread_parallel_conf(void)
+{
+  return thread_struct.parallel_conf;
+} 
+WORKER_CONF_t get_thread_worker_conf(void)
+{
+  return thread_struct.worker_conf;
+} 
 
 int emulate_rf = 0;
 
@@ -1041,6 +1064,8 @@ int main(int argc, char **argv)
       break;
     }
   }
+  set_parallel_conf("PARALLEL_RU_L1_TRX_SPLIT");
+  set_worker_conf("WORKER_ENABLE");
 
   if (transmission_mode>1) pa=dBm3;
   printf("dlsim: tmode %d, pa %d\n",transmission_mode,pa);
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c
index e1a57cf898ac181fe68acaf2e08d1926bdf88faf..8c09da1daf9e3c77cb54e9535fc27f07b6f944a6 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim.c
@@ -121,7 +121,30 @@ nfapi_tx_request_pdu_t tx_pdu_list[MAX_NUM_TX_REQUEST_PDU];
 nfapi_tx_request_t TX_req;
 Sched_Rsp_t sched_resp;
 
-int codingw = 0;
+char *parallel_config = NULL;
+char *worker_config = NULL;
+static THREAD_STRUCT thread_struct;
+void set_parallel_conf(char *parallel_conf)
+{
+  if(strcmp(parallel_conf,"PARALLEL_SINGLE_THREAD")==0)           thread_struct.parallel_conf = PARALLEL_SINGLE_THREAD;
+  else if(strcmp(parallel_conf,"PARALLEL_RU_L1_SPLIT")==0)        thread_struct.parallel_conf = PARALLEL_RU_L1_SPLIT;
+  else if(strcmp(parallel_conf,"PARALLEL_RU_L1_TRX_SPLIT")==0)    thread_struct.parallel_conf = PARALLEL_RU_L1_TRX_SPLIT;
+  printf("[CONFIG] parallel conf is set to %d\n",thread_struct.parallel_conf);
+} 
+void set_worker_conf(char *worker_conf)
+{
+  if(strcmp(worker_conf,"WORKER_DISABLE")==0)                     thread_struct.worker_conf = WORKER_DISABLE;
+  else if(strcmp(worker_conf,"WORKER_ENABLE")==0)                 thread_struct.worker_conf = WORKER_ENABLE;
+  printf("[CONFIG] worker conf is set to %d\n",thread_struct.worker_conf);
+} 
+PARALLEL_CONF_t get_thread_parallel_conf(void)
+{
+  return thread_struct.parallel_conf;
+} 
+WORKER_CONF_t get_thread_worker_conf(void)
+{
+  return thread_struct.worker_conf;
+} 
 
 void
 fill_nfapi_ulsch_config_request(nfapi_ul_config_request_pdu_t *ul_config_pdu,
@@ -699,7 +722,8 @@ int main(int argc, char **argv) {
     if (verbose)
       printf("%s\n",ptr->helpstr);
   }
-
+  set_parallel_conf("PARALLEL_RU_L1_TRX_SPLIT");
+  set_worker_conf("WORKER_ENABLE");
   RC.nb_L1_inst = 1;
   RC.nb_RU = 1;
   lte_param_init(&eNB,&UE,&ru,
diff --git a/openair2/COMMON/gtpv1_u_messages_def.h b/openair2/COMMON/gtpv1_u_messages_def.h
index 9cc41a70eaa3d456a512cf475f7dcfc828c80431..27723eec15937c7ce204bc4f4e6e9190b7505bfb 100644
--- a/openair2/COMMON/gtpv1_u_messages_def.h
+++ b/openair2/COMMON/gtpv1_u_messages_def.h
@@ -25,3 +25,4 @@ MESSAGE_DEF(GTPV1U_ENB_DELETE_TUNNEL_REQ,   MESSAGE_PRIORITY_MED, gtpv1u_enb_del
 MESSAGE_DEF(GTPV1U_ENB_DELETE_TUNNEL_RESP,  MESSAGE_PRIORITY_MED, gtpv1u_enb_delete_tunnel_resp_t, Gtpv1uDeleteTunnelResp)
 MESSAGE_DEF(GTPV1U_ENB_TUNNEL_DATA_IND,     MESSAGE_PRIORITY_MED, gtpv1u_enb_tunnel_data_ind_t,    Gtpv1uTunnelDataInd)
 MESSAGE_DEF(GTPV1U_ENB_TUNNEL_DATA_REQ,     MESSAGE_PRIORITY_MED, gtpv1u_enb_tunnel_data_req_t,    Gtpv1uTunnelDataReq)
+MESSAGE_DEF(GTPV1U_ENB_S1_REQ,        MESSAGE_PRIORITY_MED, Gtpv1uS1Req,    gtpv1uS1Req)
diff --git a/openair2/COMMON/gtpv1_u_messages_types.h b/openair2/COMMON/gtpv1_u_messages_types.h
index 4d09062beb7b8dde6b29ed16fe7634eaacee2f1a..0118a78f6d9f43652414f7c298351c14018d1d96 100644
--- a/openair2/COMMON/gtpv1_u_messages_types.h
+++ b/openair2/COMMON/gtpv1_u_messages_types.h
@@ -33,6 +33,7 @@
 #define GTPV1U_ENB_DELETE_TUNNEL_RESP(mSGpTR) (mSGpTR)->ittiMsg.Gtpv1uDeleteTunnelResp
 #define GTPV1U_ENB_TUNNEL_DATA_IND(mSGpTR)    (mSGpTR)->ittiMsg.Gtpv1uTunnelDataInd
 #define GTPV1U_ENB_TUNNEL_DATA_REQ(mSGpTR)    (mSGpTR)->ittiMsg.Gtpv1uTunnelDataReq
+#define GTPV1U_ENB_S1_REQ(mSGpTR)    (mSGpTR)->ittiMsg.gtpv1uS1Req
 
 #define GTPV1U_ALL_TUNNELS_TEID (teid_t)0xFFFFFFFF
 
@@ -98,4 +99,8 @@ typedef struct gtpv1u_enb_tunnel_data_req_s {
   rb_id_t                rab_id;
 } gtpv1u_enb_tunnel_data_req_t;
 
+typedef struct {
+  in_addr_t             enb_ip_address_for_S1u_S12_S4_up;
+  tcp_udp_port_t        enb_port_for_S1u_S12_S4_up;
+} Gtpv1uS1Req;
 #endif /* GTPV1_U_MESSAGES_TYPES_H_ */
diff --git a/openair2/COMMON/x2ap_messages_types.h b/openair2/COMMON/x2ap_messages_types.h
index 6c4031b981df42869d76abbe210bb88289a27115..c74a826ff84685c88ea9a36b6226ccbf58eee166 100644
--- a/openair2/COMMON/x2ap_messages_types.h
+++ b/openair2/COMMON/x2ap_messages_types.h
@@ -63,17 +63,21 @@ typedef struct x2ap_register_enb_req_s {
   uint8_t  mnc_digit_length;
 
   /*
-   * EARFCN
+   * CC Params
    */
-  uint16_t fdd_uL_EARFCN;
-  uint16_t fdd_dL_EARFCN;
-  uint16_t tdd_EARFCN;
-
-
-  uint16_t fdd_uL_Transmission_Bandwidth;
-  uint16_t fdd_dL_Transmission_Bandwidth;
-  uint16_t tdd_Transmission_Bandwidth;
-
+  int16_t                 eutra_band[MAX_NUM_CCs];
+  uint32_t                downlink_frequency[MAX_NUM_CCs];
+  int32_t                 uplink_frequency_offset[MAX_NUM_CCs];
+  uint32_t                Nid_cell[MAX_NUM_CCs];
+  int16_t                 N_RB_DL[MAX_NUM_CCs];
+  lte_frame_type_t        frame_type[MAX_NUM_CCs];
+  uint32_t                fdd_earfcn_DL[MAX_NUM_CCs];
+  uint32_t                fdd_earfcn_UL[MAX_NUM_CCs];
+  int                     num_cc;
+
+  /* To be considered for TDD */
+  //uint16_t tdd_EARFCN;
+  //uint16_t tdd_Transmission_Bandwidth;
 
   /* The local eNB IP address to bind */
   net_ip_address_t enb_x2_ip_address;
diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index 6d9b2edf82ab3cfc2263b824bef33a63065a8212..2506a0a9dca71261a67156ec4bcec93ec5b648e6 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -36,13 +36,13 @@
 #include "UTIL/OTG/otg.h"
 #include "UTIL/OTG/otg_externs.h"
 #if defined(ENABLE_ITTI)
-# include "intertask_interface.h"
-# if defined(ENABLE_USE_MME) 
-#   include "s1ap_eNB.h"
-#   include "sctp_eNB_task.h"
-# else
-#  define EPC_MODE_ENABLED 0
-# endif 
+  #include "intertask_interface.h"
+  #if defined(ENABLE_USE_MME)
+    #include "s1ap_eNB.h"
+    #include "sctp_eNB_task.h"
+  #else
+    #define EPC_MODE_ENABLED 0
+  #endif
 #endif
 #include "sctp_default_values.h"
 #include "SystemInformationBlockType2.h"
@@ -61,105 +61,104 @@
 #include "enb_paramdef.h"
 
 extern uint16_t sf_ahead;
-
-void RCconfig_flexran()
-{
+extern void set_parallel_conf(char* parallel_conf);
+extern void set_worker_conf(char* worker_conf);
+extern PARALLEL_CONF_t get_thread_parallel_conf(void);
+extern WORKER_CONF_t   get_thread_worker_conf(void);
+extern uint32_t to_earfcn_DL(int eutra_bandP, uint32_t dl_CarrierFreq, uint32_t bw);
+extern uint32_t to_earfcn_UL(int eutra_bandP, uint32_t ul_CarrierFreq, uint32_t bw);
+
+void RCconfig_flexran() {
   uint16_t i;
   uint16_t num_enbs;
   char aprefix[MAX_OPTNAME_SIZE*2 + 8];
   /* this will possibly truncate the cell id (RRC assumes int32_t).
-   * Both Nid_cell and enb_id are signed in RRC case, but we use unsigned for
-   * the bitshifting to work properly */
+     Both Nid_cell and enb_id are signed in RRC case, but we use unsigned for
+     the bitshifting to work properly */
   int32_t Nid_cell = 0;
   uint16_t Nid_cell_tr = 0;
   uint32_t enb_id = 0;
-
   /*
-   * the only reason for all these variables is, that they are "hard-encoded"
-   * into the CCPARAMS_DESC macro and we need it for the Nid_cell variable ...
-   */
+     the only reason for all these variables is, that they are "hard-encoded"
+     into the CCPARAMS_DESC macro and we need it for the Nid_cell variable ...
+  */
   char *frame_type, *prefix_type, *pbch_repetition, *prach_high_speed,
-    *pusch_hoppingMode, *pusch_enable64QAM, *pusch_groupHoppingEnabled,
-    *pusch_sequenceHoppingEnabled, *phich_duration, *phich_resource,
-    *srs_enable, *srs_ackNackST, *srs_MaxUpPts, *pusch_alpha,
-    *pucch_deltaF_Format1, *pucch_deltaF_Format1b, *pucch_deltaF_Format2,
-    *pucch_deltaF_Format2a, *pucch_deltaF_Format2b,
-    *rach_preamblesGroupAConfig, *rach_messagePowerOffsetGroupB, *pcch_nB;
+       *pusch_hoppingMode, *pusch_enable64QAM, *pusch_groupHoppingEnabled,
+       *pusch_sequenceHoppingEnabled, *phich_duration, *phich_resource,
+       *srs_enable, *srs_ackNackST, *srs_MaxUpPts, *pusch_alpha,
+       *pucch_deltaF_Format1, *pucch_deltaF_Format1b, *pucch_deltaF_Format2,
+       *pucch_deltaF_Format2a, *pucch_deltaF_Format2b,
+       *rach_preamblesGroupAConfig, *rach_messagePowerOffsetGroupB, *pcch_nB;
   long long int     downlink_frequency;
   int32_t tdd_config, tdd_config_s, eutra_band, uplink_frequency_offset,
-    Nid_cell_mbsfn, N_RB_DL, nb_antenna_ports, prach_root, prach_config_index,
-    prach_zero_correlation, prach_freq_offset, pucch_delta_shift,
-    pucch_nRB_CQI, pucch_nCS_AN, pucch_n1_AN, pdsch_referenceSignalPower,
-    pdsch_p_b, pusch_n_SB, pusch_hoppingOffset, pusch_groupAssignment,
-    pusch_nDMRS1, srs_BandwidthConfig, srs_SubframeConfig, pusch_p0_Nominal,
-    pucch_p0_Nominal, msg3_delta_Preamble, rach_numberOfRA_Preambles,
-    rach_sizeOfRA_PreamblesGroupA, rach_messageSizeGroupA,
-    rach_powerRampingStep, rach_preambleInitialReceivedTargetPower,
-    rach_preambleTransMax, rach_raResponseWindowSize,
-    rach_macContentionResolutionTimer, rach_maxHARQ_Msg3Tx,
-    pcch_defaultPagingCycle, bcch_modificationPeriodCoeff,
-    ue_TimersAndConstants_t300, ue_TimersAndConstants_t301,
-    ue_TimersAndConstants_t310, ue_TimersAndConstants_t311,
-    ue_TimersAndConstants_n310, ue_TimersAndConstants_n311,
-    ue_TransmissionMode, ue_multiple_max;
-
-  const char*       rxPool_sc_CP_Len;
-  const char*       rxPool_sc_Period;
-  const char*       rxPool_data_CP_Len;
+          Nid_cell_mbsfn, N_RB_DL, nb_antenna_ports, prach_root, prach_config_index,
+          prach_zero_correlation, prach_freq_offset, pucch_delta_shift,
+          pucch_nRB_CQI, pucch_nCS_AN, pucch_n1_AN, pdsch_referenceSignalPower,
+          pdsch_p_b, pusch_n_SB, pusch_hoppingOffset, pusch_groupAssignment,
+          pusch_nDMRS1, srs_BandwidthConfig, srs_SubframeConfig, pusch_p0_Nominal,
+          pucch_p0_Nominal, msg3_delta_Preamble, rach_numberOfRA_Preambles,
+          rach_sizeOfRA_PreamblesGroupA, rach_messageSizeGroupA,
+          rach_powerRampingStep, rach_preambleInitialReceivedTargetPower,
+          rach_preambleTransMax, rach_raResponseWindowSize,
+          rach_macContentionResolutionTimer, rach_maxHARQ_Msg3Tx,
+          pcch_defaultPagingCycle, bcch_modificationPeriodCoeff,
+          ue_TimersAndConstants_t300, ue_TimersAndConstants_t301,
+          ue_TimersAndConstants_t310, ue_TimersAndConstants_t311,
+          ue_TimersAndConstants_n310, ue_TimersAndConstants_n311,
+          ue_TransmissionMode, ue_multiple_max;
+  const char       *rxPool_sc_CP_Len;
+  const char       *rxPool_sc_Period;
+  const char       *rxPool_data_CP_Len;
   libconfig_int     rxPool_ResourceConfig_prb_Num;
   libconfig_int     rxPool_ResourceConfig_prb_Start;
   libconfig_int     rxPool_ResourceConfig_prb_End;
-  const char*       rxPool_ResourceConfig_offsetIndicator_present;
+  const char       *rxPool_ResourceConfig_offsetIndicator_present;
   libconfig_int     rxPool_ResourceConfig_offsetIndicator_choice;
-  const char*       rxPool_ResourceConfig_subframeBitmap_present;
-  char*             rxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
+  const char       *rxPool_ResourceConfig_subframeBitmap_present;
+  char             *rxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
   libconfig_int     rxPool_ResourceConfig_subframeBitmap_choice_bs_size;
   libconfig_int     rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
-
   //SIB19
   //for discRxPool
-  const char*       discRxPool_cp_Len;
-  const char*       discRxPool_discPeriod;
+  const char       *discRxPool_cp_Len;
+  const char       *discRxPool_discPeriod;
   libconfig_int     discRxPool_numRetx;
   libconfig_int     discRxPool_numRepetition;
   libconfig_int     discRxPool_ResourceConfig_prb_Num;
   libconfig_int     discRxPool_ResourceConfig_prb_Start;
   libconfig_int     discRxPool_ResourceConfig_prb_End;
-  const char*       discRxPool_ResourceConfig_offsetIndicator_present;
+  const char       *discRxPool_ResourceConfig_offsetIndicator_present;
   libconfig_int     discRxPool_ResourceConfig_offsetIndicator_choice;
-  const char*       discRxPool_ResourceConfig_subframeBitmap_present;
-  char*             discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
+  const char       *discRxPool_ResourceConfig_subframeBitmap_present;
+  char             *discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
   libconfig_int     discRxPool_ResourceConfig_subframeBitmap_choice_bs_size;
   libconfig_int     discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
-
   //for discRxPoolPS
-  const char*       discRxPoolPS_cp_Len;
-  const char*       discRxPoolPS_discPeriod;
+  const char       *discRxPoolPS_cp_Len;
+  const char       *discRxPoolPS_discPeriod;
   libconfig_int     discRxPoolPS_numRetx;
   libconfig_int     discRxPoolPS_numRepetition;
   libconfig_int     discRxPoolPS_ResourceConfig_prb_Num;
   libconfig_int     discRxPoolPS_ResourceConfig_prb_Start;
   libconfig_int     discRxPoolPS_ResourceConfig_prb_End;
-  const char*       discRxPoolPS_ResourceConfig_offsetIndicator_present;
+  const char       *discRxPoolPS_ResourceConfig_offsetIndicator_present;
   libconfig_int     discRxPoolPS_ResourceConfig_offsetIndicator_choice;
-  const char*       discRxPoolPS_ResourceConfig_subframeBitmap_present;
-  char*             discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf;
+  const char       *discRxPoolPS_ResourceConfig_subframeBitmap_present;
+  char             *discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf;
   libconfig_int     discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size;
   libconfig_int     discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
-
   /* get number of eNBs */
   paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
   config_get(ENBSParams, sizeof(ENBSParams)/sizeof(paramdef_t), NULL);
   num_enbs = ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt;
-
   /* for eNB ID */
   paramdef_t ENBParams[]  = ENBPARAMS_DESC;
   paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST, NULL, 0};
-
   /* for Nid_cell */
   checkedparam_t config_check_CCparams[] = CCPARAMS_CHECK;
   paramdef_t CCsParams[] = CCPARAMS_DESC;
   paramlist_def_t CCsParamList = {ENB_CONFIG_STRING_COMPONENT_CARRIERS, NULL, 0};
+
   /* 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]);
@@ -169,11 +168,11 @@ void RCconfig_flexran()
   config_get(flexranParams, sizeof(flexranParams)/sizeof(paramdef_t), CONFIG_STRING_NETWORK_CONTROLLER_CONFIG);
 
   if (!RC.flexran) {
-    RC.flexran = calloc(num_enbs, sizeof(flexran_agent_info_t*));
+    RC.flexran = calloc(num_enbs, sizeof(flexran_agent_info_t *));
     AssertFatal(RC.flexran,
                 "can't ALLOCATE %zu Bytes for %d flexran agent info with size %zu\n",
-                num_enbs * sizeof(flexran_agent_info_t*),
-                num_enbs, sizeof(flexran_agent_info_t*));
+                num_enbs * sizeof(flexran_agent_info_t *),
+                num_enbs, sizeof(flexran_agent_info_t *));
   }
 
   for (i = 0; i < num_enbs; i++) {
@@ -183,31 +182,34 @@ void RCconfig_flexran()
                 sizeof(flexran_agent_info_t), i + 1, num_enbs);
     /* if config says "yes", enable Agent, in all other cases it's like "no" */
     RC.flexran[i]->enabled          = strcasecmp(*(flexranParams[FLEXRAN_ENABLED].strptr), "yes") == 0;
+
     /* if not enabled, simply skip the rest, it is not needed anyway */
     if (!RC.flexran[i]->enabled)
       continue;
+
     RC.flexran[i]->interface_name   = strdup(*(flexranParams[FLEXRAN_INTERFACE_NAME_IDX].strptr));
     //inet_ntop(AF_INET, &(enb_properties->properties[mod_id]->flexran_agent_ipv4_address), in_ip, INET_ADDRSTRLEN);
     RC.flexran[i]->remote_ipv4_addr = strdup(*(flexranParams[FLEXRAN_IPV4_ADDRESS_IDX].strptr));
     RC.flexran[i]->remote_port      = *(flexranParams[FLEXRAN_PORT_IDX].uptr);
     RC.flexran[i]->cache_name       = strdup(*(flexranParams[FLEXRAN_CACHE_IDX].strptr));
     RC.flexran[i]->node_ctrl_state  = strcasecmp(*(flexranParams[FLEXRAN_AWAIT_RECONF_IDX].strptr), "yes") == 0 ? ENB_WAIT : ENB_NORMAL_OPERATION;
-
     config_getlist(&ENBParamList, ENBParams, sizeof(ENBParams)/sizeof(paramdef_t),NULL);
+
     /* eNB ID from configuration, as read in by RCconfig_RRC() */
     if (!ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr) {
       // Calculate a default eNB ID
       if (EPC_MODE_ENABLED)
-         enb_id = i + (s1ap_generate_eNB_id () & 0xFFFF8);
+        enb_id = i + (s1ap_generate_eNB_id () & 0xFFFF8);
       else
-         enb_id = i;
+        enb_id = i;
     } else {
-        enb_id = *(ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr);
+      enb_id = *(ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr);
     }
 
     /* cell ID */
     sprintf(aprefix, "%s.[%i]", ENB_CONFIG_STRING_ENB_LIST, i);
     config_getlist(&CCsParamList, NULL, 0, aprefix);
+
     if (CCsParamList.numelt > 0) {
       sprintf(aprefix, "%s.[%i].%s.[%i]", ENB_CONFIG_STRING_ENB_LIST, i, ENB_CONFIG_STRING_COMPONENT_CARRIERS, 0);
       config_get(CCsParams, sizeof(CCsParams)/sizeof(paramdef_t), aprefix);
@@ -216,13 +218,12 @@ void RCconfig_flexran()
 
     RC.flexran[i]->mod_id   = i;
     RC.flexran[i]->agent_id = (((uint64_t)i) << 48) | (((uint64_t)enb_id) << 16) | ((uint64_t)Nid_cell_tr);
-
     /* assume for the moment the monolithic case, i.e. agent can provide
-     * information for all layers */
+       information for all layers */
     RC.flexran[i]->capability_mask = FLEXRAN_CAP_LOPHY | FLEXRAN_CAP_HIPHY
-                                   | FLEXRAN_CAP_LOMAC | FLEXRAN_CAP_HIMAC
-                                   | FLEXRAN_CAP_RLC   | FLEXRAN_CAP_PDCP
-                                   | FLEXRAN_CAP_SDAP  | FLEXRAN_CAP_RRC;
+                                     | FLEXRAN_CAP_LOMAC | FLEXRAN_CAP_HIMAC
+                                     | FLEXRAN_CAP_RLC   | FLEXRAN_CAP_PDCP
+                                     | FLEXRAN_CAP_SDAP  | FLEXRAN_CAP_RRC;
   }
 }
 
@@ -232,29 +233,29 @@ void RCconfig_L1(void) {
   paramdef_t L1_Params[] = L1PARAMS_DESC;
   paramlist_def_t L1_ParamList = {CONFIG_STRING_L1_LIST,NULL,0};
 
-
   if (RC.eNB == NULL) {
-    RC.eNB                       = (PHY_VARS_eNB ***)malloc((1+NUMBER_OF_eNB_MAX)*sizeof(PHY_VARS_eNB**));
+    RC.eNB                       = (PHY_VARS_eNB ***)malloc((1+NUMBER_OF_eNB_MAX)*sizeof(PHY_VARS_eNB **));
     LOG_I(PHY,"RC.eNB = %p\n",RC.eNB);
-    memset(RC.eNB,0,(1+NUMBER_OF_eNB_MAX)*sizeof(PHY_VARS_eNB**));
+    memset(RC.eNB,0,(1+NUMBER_OF_eNB_MAX)*sizeof(PHY_VARS_eNB **));
     RC.nb_L1_CC = malloc((1+RC.nb_L1_inst)*sizeof(int));
   }
 
   config_getlist( &L1_ParamList,L1_Params,sizeof(L1_Params)/sizeof(paramdef_t), NULL);
+
   if (L1_ParamList.numelt > 0) {
     for (j = 0; j < RC.nb_L1_inst; j++) {
       RC.nb_L1_CC[j] = *(L1_ParamList.paramarray[j][L1_CC_IDX].uptr);
 
       if (RC.eNB[j] == NULL) {
-	RC.eNB[j]                       = (PHY_VARS_eNB **)malloc((1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB*));
-	LOG_I(PHY,"RC.eNB[%d] = %p\n",j,RC.eNB[j]);
-	memset(RC.eNB[j],0,(1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB*));
+        RC.eNB[j]                       = (PHY_VARS_eNB **)malloc((1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB *));
+        LOG_I(PHY,"RC.eNB[%d] = %p\n",j,RC.eNB[j]);
+        memset(RC.eNB[j],0,(1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB *));
       }
 
-      for (i=0;i<RC.nb_L1_CC[j];i++) {
+      for (i=0; i<RC.nb_L1_CC[j]; i++) {
         if (RC.eNB[j][i] == NULL) {
           RC.eNB[j][i] = (PHY_VARS_eNB *)malloc(sizeof(PHY_VARS_eNB));
-          memset((void*)RC.eNB[j][i],0,sizeof(PHY_VARS_eNB));
+          memset((void *)RC.eNB[j][i],0,sizeof(PHY_VARS_eNB));
           LOG_I(PHY,"RC.eNB[%d][%d] = %p\n",j,i,RC.eNB[j][i]);
           RC.eNB[j][i]->Mod_id  = j;
           RC.eNB[j][i]->CC_id   = i;
@@ -262,63 +263,50 @@ void RCconfig_L1(void) {
       }
 
       if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_mac") == 0) {
-
         sf_ahead = 4; // Need 4 subframe gap between RX and TX
-      }
-      else if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "nfapi") == 0) {
+      } else if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "nfapi") == 0) {
         RC.eNB[j][0]->eth_params_n.local_if_name            = strdup(*(L1_ParamList.paramarray[j][L1_LOCAL_N_IF_NAME_IDX].strptr));
-	RC.eNB[j][0]->eth_params_n.my_addr                  = strdup(*(L1_ParamList.paramarray[j][L1_LOCAL_N_ADDRESS_IDX].strptr));
-	RC.eNB[j][0]->eth_params_n.remote_addr              = strdup(*(L1_ParamList.paramarray[j][L1_REMOTE_N_ADDRESS_IDX].strptr));
-	RC.eNB[j][0]->eth_params_n.my_portc                 = *(L1_ParamList.paramarray[j][L1_LOCAL_N_PORTC_IDX].iptr);
-	RC.eNB[j][0]->eth_params_n.remote_portc             = *(L1_ParamList.paramarray[j][L1_REMOTE_N_PORTC_IDX].iptr);
-	RC.eNB[j][0]->eth_params_n.my_portd                 = *(L1_ParamList.paramarray[j][L1_LOCAL_N_PORTD_IDX].iptr);
-	RC.eNB[j][0]->eth_params_n.remote_portd             = *(L1_ParamList.paramarray[j][L1_REMOTE_N_PORTD_IDX].iptr);
-	RC.eNB[j][0]->eth_params_n.transp_preference        = ETH_UDP_MODE;
-
+        RC.eNB[j][0]->eth_params_n.my_addr                  = strdup(*(L1_ParamList.paramarray[j][L1_LOCAL_N_ADDRESS_IDX].strptr));
+        RC.eNB[j][0]->eth_params_n.remote_addr              = strdup(*(L1_ParamList.paramarray[j][L1_REMOTE_N_ADDRESS_IDX].strptr));
+        RC.eNB[j][0]->eth_params_n.my_portc                 = *(L1_ParamList.paramarray[j][L1_LOCAL_N_PORTC_IDX].iptr);
+        RC.eNB[j][0]->eth_params_n.remote_portc             = *(L1_ParamList.paramarray[j][L1_REMOTE_N_PORTC_IDX].iptr);
+        RC.eNB[j][0]->eth_params_n.my_portd                 = *(L1_ParamList.paramarray[j][L1_LOCAL_N_PORTD_IDX].iptr);
+        RC.eNB[j][0]->eth_params_n.remote_portd             = *(L1_ParamList.paramarray[j][L1_REMOTE_N_PORTD_IDX].iptr);
+        RC.eNB[j][0]->eth_params_n.transp_preference        = ETH_UDP_MODE;
         sf_ahead = 2; // Cannot cope with 4 subframes betweem RX and TX - set it to 2
-
         RC.nb_macrlc_inst = 1;  // This is used by mac_top_init_eNB()
-
         // This is used by init_eNB_afterRU()
         RC.nb_CC = (int *)malloc((1+RC.nb_inst)*sizeof(int));
         RC.nb_CC[0]=1;
-
         RC.nb_inst =1; // DJP - feptx_prec uses num_eNB but phy_init_RU uses nb_inst
-
         LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_inst=1 this is because phy_init_RU() uses that to index and not RC.num_eNB - why the 2 similar variables?\n", __FUNCTION__);
         LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_CC[0]=%d for init_eNB_afterRU()\n", __FUNCTION__, RC.nb_CC[0]);
         LOG_I(PHY,"%s() NFAPI PNF mode - RC.nb_macrlc_inst:%d because used by mac_top_init_eNB()\n", __FUNCTION__, RC.nb_macrlc_inst);
-
         //mac_top_init_eNB();
-
         configure_nfapi_pnf(RC.eNB[j][0]->eth_params_n.remote_addr, RC.eNB[j][0]->eth_params_n.remote_portc, RC.eNB[j][0]->eth_params_n.my_addr, RC.eNB[j][0]->eth_params_n.my_portd, RC.eNB[j][0]->eth_params_n     .remote_portd);
+      } else { // other midhaul
       }
-      else { // other midhaul
-      }	
     }// j=0..num_inst
+
     printf("Initializing northbound interface for L1\n");
     l1_north_init_eNB();
   } else {
-    LOG_I(PHY,"No " CONFIG_STRING_L1_LIST " configuration found");    
-
+    LOG_I(PHY,"No " CONFIG_STRING_L1_LIST " configuration found");
     // DJP need to create some structures for VNF
-
     j = 0;
-
     RC.nb_L1_CC = malloc((1+RC.nb_L1_inst)*sizeof(int)); // DJP - 1 lot then???
-
     RC.nb_L1_CC[j]=1; // DJP - hmmm
 
     if (RC.eNB[j] == NULL) {
-      RC.eNB[j]                       = (PHY_VARS_eNB **)malloc((1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB**));
+      RC.eNB[j]                       = (PHY_VARS_eNB **)malloc((1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB **));
       LOG_I(PHY,"RC.eNB[%d] = %p\n",j,RC.eNB[j]);
-      memset(RC.eNB[j],0,(1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB***));
+      memset(RC.eNB[j],0,(1+MAX_NUM_CCs)*sizeof(PHY_VARS_eNB ***));
     }
 
-    for (i=0;i<RC.nb_L1_CC[j];i++) {
+    for (i=0; i<RC.nb_L1_CC[j]; i++) {
       if (RC.eNB[j][i] == NULL) {
         RC.eNB[j][i] = (PHY_VARS_eNB *)malloc(sizeof(PHY_VARS_eNB));
-        memset((void*)RC.eNB[j][i],0,sizeof(PHY_VARS_eNB));
+        memset((void *)RC.eNB[j][i],0,sizeof(PHY_VARS_eNB));
         LOG_I(PHY,"RC.eNB[%d][%d] = %p\n",j,i,RC.eNB[j][i]);
         RC.eNB[j][i]->Mod_id  = j;
         RC.eNB[j][i]->CC_id   = i;
@@ -329,20 +317,16 @@ void RCconfig_L1(void) {
 
 void RCconfig_macrlc() {
   int               j;
-
-
   paramdef_t MacRLC_Params[] = MACRLCPARAMS_DESC;
   paramlist_def_t MacRLC_ParamList = {CONFIG_STRING_MACRLC_LIST,NULL,0};
+  config_getlist( &MacRLC_ParamList,MacRLC_Params,sizeof(MacRLC_Params)/sizeof(paramdef_t), NULL);
 
-  config_getlist( &MacRLC_ParamList,MacRLC_Params,sizeof(MacRLC_Params)/sizeof(paramdef_t), NULL);    
-  
   if ( MacRLC_ParamList.numelt > 0) {
+    RC.nb_macrlc_inst=MacRLC_ParamList.numelt;
+    mac_top_init_eNB();
+    RC.nb_mac_CC = (int *)malloc(RC.nb_macrlc_inst*sizeof(int));
 
-    RC.nb_macrlc_inst=MacRLC_ParamList.numelt; 
-    mac_top_init_eNB();   
-    RC.nb_mac_CC = (int*)malloc(RC.nb_macrlc_inst*sizeof(int));
-
-    for (j=0;j<RC.nb_macrlc_inst;j++) {
+    for (j=0; j<RC.nb_macrlc_inst; j++) {
       RC.mac[j]->puSch10xSnr = *(MacRLC_ParamList.paramarray[j][MACRLC_PUSCH10xSNR_IDX ].iptr);
       RC.mac[j]->puCch10xSnr = *(MacRLC_ParamList.paramarray[j][MACRLC_PUCCH10xSNR_IDX ].iptr);
       RC.nb_mac_CC[j] = *(MacRLC_ParamList.paramarray[j][MACRLC_CC_IDX].iptr);
@@ -350,75 +334,65 @@ void RCconfig_macrlc() {
       //printf("PHY_TEST = %d,%d\n", RC.mac[j]->phy_test, j);
 
       if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_RRC") == 0) {
-	// check number of instances is same as RRC/PDCP
-	
+        // check number of instances is same as RRC/PDCP
       } else if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr), "cudu") == 0) {
-	RC.mac[j]->eth_params_n.local_if_name            = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_IF_NAME_IDX].strptr));
-	RC.mac[j]->eth_params_n.my_addr                  = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_ADDRESS_IDX].strptr));
-	RC.mac[j]->eth_params_n.remote_addr              = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_ADDRESS_IDX].strptr));
-	RC.mac[j]->eth_params_n.my_portc                 = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTC_IDX].iptr);
-	RC.mac[j]->eth_params_n.remote_portc             = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTC_IDX].iptr);
-	RC.mac[j]->eth_params_n.my_portd                 = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTD_IDX].iptr);
-	RC.mac[j]->eth_params_n.remote_portd             = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTD_IDX].iptr);;
-	RC.mac[j]->eth_params_n.transp_preference        = ETH_UDP_MODE;
+        RC.mac[j]->eth_params_n.local_if_name            = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_IF_NAME_IDX].strptr));
+        RC.mac[j]->eth_params_n.my_addr                  = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_ADDRESS_IDX].strptr));
+        RC.mac[j]->eth_params_n.remote_addr              = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_ADDRESS_IDX].strptr));
+        RC.mac[j]->eth_params_n.my_portc                 = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTC_IDX].iptr);
+        RC.mac[j]->eth_params_n.remote_portc             = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTC_IDX].iptr);
+        RC.mac[j]->eth_params_n.my_portd                 = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_N_PORTD_IDX].iptr);
+        RC.mac[j]->eth_params_n.remote_portd             = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_N_PORTD_IDX].iptr);;
+        RC.mac[j]->eth_params_n.transp_preference        = ETH_UDP_MODE;
       } else { // other midhaul
-	AssertFatal(1==0,"MACRLC %d: %s unknown northbound midhaul\n",j, *(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr));
-      }	
+        AssertFatal(1==0,"MACRLC %d: %s unknown northbound midhaul\n",j, *(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_N_PREFERENCE_IDX].strptr));
+      }
 
       if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "local_L1") == 0) {
-
-	
       } else if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr), "nfapi") == 0) {
-	RC.mac[j]->eth_params_s.local_if_name            = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_IF_NAME_IDX].strptr));
-	RC.mac[j]->eth_params_s.my_addr                  = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_ADDRESS_IDX].strptr));
-	RC.mac[j]->eth_params_s.remote_addr              = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_ADDRESS_IDX].strptr));
-	RC.mac[j]->eth_params_s.my_portc                 = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTC_IDX].iptr);
-	RC.mac[j]->eth_params_s.remote_portc             = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTC_IDX].iptr);
-	RC.mac[j]->eth_params_s.my_portd                 = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTD_IDX].iptr);
-	RC.mac[j]->eth_params_s.remote_portd             = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTD_IDX].iptr);
-	RC.mac[j]->eth_params_s.transp_preference        = ETH_UDP_MODE;
-
+        RC.mac[j]->eth_params_s.local_if_name            = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_IF_NAME_IDX].strptr));
+        RC.mac[j]->eth_params_s.my_addr                  = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_ADDRESS_IDX].strptr));
+        RC.mac[j]->eth_params_s.remote_addr              = strdup(*(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_ADDRESS_IDX].strptr));
+        RC.mac[j]->eth_params_s.my_portc                 = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTC_IDX].iptr);
+        RC.mac[j]->eth_params_s.remote_portc             = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTC_IDX].iptr);
+        RC.mac[j]->eth_params_s.my_portd                 = *(MacRLC_ParamList.paramarray[j][MACRLC_LOCAL_S_PORTD_IDX].iptr);
+        RC.mac[j]->eth_params_s.remote_portd             = *(MacRLC_ParamList.paramarray[j][MACRLC_REMOTE_S_PORTD_IDX].iptr);
+        RC.mac[j]->eth_params_s.transp_preference        = ETH_UDP_MODE;
         sf_ahead = 2; // Cannot cope with 4 subframes betweem RX and TX - set it to 2
-
         printf("**************** vnf_port:%d\n", RC.mac[j]->eth_params_s.my_portc);
         configure_nfapi_vnf(RC.mac[j]->eth_params_s.my_addr, RC.mac[j]->eth_params_s.my_portc);
         printf("**************** RETURNED FROM configure_nfapi_vnf() vnf_port:%d\n", RC.mac[j]->eth_params_s.my_portc);
       } else { // other midhaul
-	AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr));
+        AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr));
       }
-      if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr), "default") == 0){
-      	global_scheduler_mode=SCHED_MODE_DEFAULT;
-      	printf("sched mode = default %d [%s]\n",global_scheduler_mode,*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr));
-      }else if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr), "fairRR") == 0){
-      	global_scheduler_mode=SCHED_MODE_FAIR_RR;
-      	printf("sched mode = fairRR %d [%s]\n",global_scheduler_mode,*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr));
-      }else{
-      	global_scheduler_mode=SCHED_MODE_DEFAULT;
-      	printf("sched mode = default %d [%s]\n",global_scheduler_mode,*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr));
+
+      if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr), "default") == 0) {
+        global_scheduler_mode=SCHED_MODE_DEFAULT;
+        printf("sched mode = default %d [%s]\n",global_scheduler_mode,*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr));
+      } else if (strcmp(*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr), "fairRR") == 0) {
+        global_scheduler_mode=SCHED_MODE_FAIR_RR;
+        printf("sched mode = fairRR %d [%s]\n",global_scheduler_mode,*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr));
+      } else {
+        global_scheduler_mode=SCHED_MODE_DEFAULT;
+        printf("sched mode = default %d [%s]\n",global_scheduler_mode,*(MacRLC_ParamList.paramarray[j][MACRLC_SCHED_MODE_IDX].strptr));
       }
     }// j=0..num_inst
   } else {// MacRLC_ParamList.numelt > 0
-	  AssertFatal (0,
-		       "No " CONFIG_STRING_MACRLC_LIST " configuration found");     
+    AssertFatal (0,
+                 "No " CONFIG_STRING_MACRLC_LIST " configuration found");
   }
 }
-	       
-int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
 
+int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
   int               num_enbs                      = 0;
- 
   int               j,k                           = 0;
   int32_t     enb_id                        = 0;
   int               nb_cc                         = 0;
-
-
-  char*       frame_type                    = NULL;
+  char       *frame_type                    = NULL;
   int32_t     tdd_config                    = 0;
   int32_t     tdd_config_s                  = 0;
-
-  char*       prefix_type                   = NULL;
-  char*       pbch_repetition               = NULL;
-  
+  char       *prefix_type                   = NULL;
+  char       *pbch_repetition               = NULL;
   int32_t     eutra_band                    = 0;
   long long int     downlink_frequency            = 0;
   int32_t     uplink_frequency_offset       = 0;
@@ -426,51 +400,50 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
   int32_t     Nid_cell_mbsfn                = 0;
   int32_t     N_RB_DL                       = 0;
   int32_t     nb_antenna_ports              = 0;
-
   int32_t     prach_root                    = 0;
   int32_t     prach_config_index            = 0;
-  char*            prach_high_speed         = NULL;
+  char            *prach_high_speed         = NULL;
   int32_t     prach_zero_correlation        = 0;
   int32_t     prach_freq_offset             = 0;
   int32_t     pucch_delta_shift             = 0;
   int32_t     pucch_nRB_CQI                 = 0;
   int32_t     pucch_nCS_AN                  = 0;
-//#if (RRC_VERSION >= MAKE_VERSION(10, 0, 0))
+  //#if (RRC_VERSION >= MAKE_VERSION(10, 0, 0))
   int32_t     pucch_n1_AN                   = 0;
-//#endif
+  //#endif
   int32_t     pdsch_referenceSignalPower    = 0;
   int32_t     pdsch_p_b                     = 0;
   int32_t     pusch_n_SB                    = 0;
-  char *      pusch_hoppingMode             = NULL;
+  char       *pusch_hoppingMode             = NULL;
   int32_t     pusch_hoppingOffset           = 0;
-  char*          pusch_enable64QAM          = NULL;
-  char*          pusch_groupHoppingEnabled  = NULL;
+  char          *pusch_enable64QAM          = NULL;
+  char          *pusch_groupHoppingEnabled  = NULL;
   int32_t     pusch_groupAssignment         = 0;
-  char*          pusch_sequenceHoppingEnabled = NULL;
+  char          *pusch_sequenceHoppingEnabled = NULL;
   int32_t     pusch_nDMRS1                  = 0;
-  char*       phich_duration                = NULL;
-  char*       phich_resource                = NULL;
-  char*       srs_enable                    = NULL;
+  char       *phich_duration                = NULL;
+  char       *phich_resource                = NULL;
+  char       *srs_enable                    = NULL;
   int32_t     srs_BandwidthConfig           = 0;
   int32_t     srs_SubframeConfig            = 0;
-  char*       srs_ackNackST                 = NULL;
-  char*       srs_MaxUpPts                  = NULL;
+  char       *srs_ackNackST                 = NULL;
+  char       *srs_MaxUpPts                  = NULL;
   int32_t     pusch_p0_Nominal              = 0;
-  char*       pusch_alpha                   = NULL;
+  char       *pusch_alpha                   = NULL;
   int32_t     pucch_p0_Nominal              = 0;
   int32_t     msg3_delta_Preamble           = 0;
   //int32_t     ul_CyclicPrefixLength         = 0;
-  char*       pucch_deltaF_Format1          = NULL;
+  char       *pucch_deltaF_Format1          = NULL;
   //const char*       pucch_deltaF_Format1a         = NULL;
-  char*       pucch_deltaF_Format1b         = NULL;
-  char*       pucch_deltaF_Format2          = NULL;
-  char*       pucch_deltaF_Format2a         = NULL;
-  char*       pucch_deltaF_Format2b         = NULL;
+  char       *pucch_deltaF_Format1b         = NULL;
+  char       *pucch_deltaF_Format2          = NULL;
+  char       *pucch_deltaF_Format2a         = NULL;
+  char       *pucch_deltaF_Format2b         = NULL;
   int32_t     rach_numberOfRA_Preambles     = 0;
-  char*       rach_preamblesGroupAConfig    = NULL;
+  char       *rach_preamblesGroupAConfig    = NULL;
   int32_t     rach_sizeOfRA_PreamblesGroupA = 0;
   int32_t     rach_messageSizeGroupA        = 0;
-  char*       rach_messagePowerOffsetGroupB = NULL;
+  char       *rach_messagePowerOffsetGroupB = NULL;
   int32_t     rach_powerRampingStep         = 0;
   int32_t     rach_preambleInitialReceivedTargetPower    = 0;
   int32_t     rach_preambleTransMax         = 0;
@@ -478,7 +451,7 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
   int32_t     rach_macContentionResolutionTimer = 0;
   int32_t     rach_maxHARQ_Msg3Tx           = 0;
   int32_t     pcch_defaultPagingCycle       = 0;
-  char*       pcch_nB                       = NULL;
+  char       *pcch_nB                       = NULL;
   int32_t     bcch_modificationPeriodCoeff  = 0;
   int32_t     ue_TimersAndConstants_t300    = 0;
   int32_t     ue_TimersAndConstants_t301    = 0;
@@ -487,1866 +460,1811 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
   int32_t     ue_TimersAndConstants_n310    = 0;
   int32_t     ue_TimersAndConstants_n311    = 0;
   int32_t     ue_TransmissionMode           = 0;
-
   int32_t     ue_multiple_max               = 0;
-
   //TTN - for D2D
   //SIB18
-  const char*       rxPool_sc_CP_Len                                        = NULL;
-  const char*       rxPool_sc_Period                                        = NULL;
-  const char*       rxPool_data_CP_Len                                      = NULL;
+  const char       *rxPool_sc_CP_Len                                        = NULL;
+  const char       *rxPool_sc_Period                                        = NULL;
+  const char       *rxPool_data_CP_Len                                      = NULL;
   libconfig_int     rxPool_ResourceConfig_prb_Num                           = 0;
   libconfig_int     rxPool_ResourceConfig_prb_Start                         = 0;
   libconfig_int     rxPool_ResourceConfig_prb_End                           = 0;
-  const char*       rxPool_ResourceConfig_offsetIndicator_present           = NULL;
+  const char       *rxPool_ResourceConfig_offsetIndicator_present           = NULL;
   libconfig_int     rxPool_ResourceConfig_offsetIndicator_choice            = 0;
-  const char*       rxPool_ResourceConfig_subframeBitmap_present            = NULL;
-  char*             rxPool_ResourceConfig_subframeBitmap_choice_bs_buf      = NULL;
+  const char       *rxPool_ResourceConfig_subframeBitmap_present            = NULL;
+  char             *rxPool_ResourceConfig_subframeBitmap_choice_bs_buf      = NULL;
   libconfig_int     rxPool_ResourceConfig_subframeBitmap_choice_bs_size     = 0;
   libconfig_int     rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused     = 0;
   //SIB19
   //For discRxPool
-  const char*       discRxPool_cp_Len                                              = NULL;
-  const char*       discRxPool_discPeriod                                          = NULL;
+  const char       *discRxPool_cp_Len                                              = NULL;
+  const char       *discRxPool_discPeriod                                          = NULL;
   libconfig_int     discRxPool_numRetx                                             = 0;
   libconfig_int     discRxPool_numRepetition                                       = 0;
-
   libconfig_int     discRxPool_ResourceConfig_prb_Num                              = 0;
   libconfig_int     discRxPool_ResourceConfig_prb_Start                            = 0;
   libconfig_int     discRxPool_ResourceConfig_prb_End                              = 0;
-  const char*       discRxPool_ResourceConfig_offsetIndicator_present              = NULL;
+  const char       *discRxPool_ResourceConfig_offsetIndicator_present              = NULL;
   libconfig_int     discRxPool_ResourceConfig_offsetIndicator_choice               = 0;
-  const char*       discRxPool_ResourceConfig_subframeBitmap_present               = NULL;
-  char*             discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf         = NULL;
+  const char       *discRxPool_ResourceConfig_subframeBitmap_present               = NULL;
+  char             *discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf         = NULL;
   libconfig_int     discRxPool_ResourceConfig_subframeBitmap_choice_bs_size        = 0;
   libconfig_int     discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
   //For discRxPoolPS
-  const char*       discRxPoolPS_cp_Len                                              = NULL;
-  const char*       discRxPoolPS_discPeriod                                          = NULL;
+  const char       *discRxPoolPS_cp_Len                                              = NULL;
+  const char       *discRxPoolPS_discPeriod                                          = NULL;
   libconfig_int     discRxPoolPS_numRetx                                             = 0;
   libconfig_int     discRxPoolPS_numRepetition                                       = 0;
-
   libconfig_int     discRxPoolPS_ResourceConfig_prb_Num                              = 0;
   libconfig_int     discRxPoolPS_ResourceConfig_prb_Start                            = 0;
   libconfig_int     discRxPoolPS_ResourceConfig_prb_End                              = 0;
-  const char*       discRxPoolPS_ResourceConfig_offsetIndicator_present              = NULL;
+  const char       *discRxPoolPS_ResourceConfig_offsetIndicator_present              = NULL;
   libconfig_int     discRxPoolPS_ResourceConfig_offsetIndicator_choice               = 0;
-  const char*       discRxPoolPS_ResourceConfig_subframeBitmap_present               = NULL;
-  char*             discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf         = NULL;
+  const char       *discRxPoolPS_ResourceConfig_subframeBitmap_present               = NULL;
+  char             *discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf         = NULL;
   libconfig_int     discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size        = 0;
   libconfig_int     discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
-
   int32_t     srb1_timer_poll_retransmit    = 0;
   int32_t     srb1_timer_reordering         = 0;
   int32_t     srb1_timer_status_prohibit    = 0;
   int32_t     srb1_poll_pdu                 = 0;
   int32_t     srb1_poll_byte                = 0;
   int32_t     srb1_max_retx_threshold       = 0;
-
   int32_t     my_int;
-  
-  // for no gcc warnings 
+  // for no gcc warnings
   (void)my_int;
   paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
-  
   paramdef_t ENBParams[]  = ENBPARAMS_DESC;
-  paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0};  
-
+  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;  
+  paramdef_t SRB1Params[] = SRB1PARAMS_DESC;
 
-/* map parameter checking array instances to parameter definition array instances */
+  /* 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]);  
+    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); 
 
+  /* get global parameters, defined outside any section in the config file */
+  config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
   num_enbs = ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt;
   AssertFatal (i<num_enbs,
-   	       "Failed to parse config file no %ith element in %s \n",i, ENB_CONFIG_STRING_ACTIVE_ENBS);
-  
+               "Failed to parse config file no %ith element in %s \n",i, ENB_CONFIG_STRING_ACTIVE_ENBS);
 
-  
   if (num_enbs>0) {
     // Output a list of all eNBs.
-    config_getlist( &ENBParamList,ENBParams,sizeof(ENBParams)/sizeof(paramdef_t),NULL); 
-    
-    
-      
-      
-      if (ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr == NULL) {
-	// Calculate a default eNB ID
-        if (EPC_MODE_ENABLED) {
-  	  uint32_t hash;
-  	  
-  	  hash = s1ap_generate_eNB_id ();
-  	  enb_id = i + (hash & 0xFFFF8);
-  	  } else {
-  	  enb_id = i;
-        }
+    config_getlist( &ENBParamList,ENBParams,sizeof(ENBParams)/sizeof(paramdef_t),NULL);
+
+    if (ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr == NULL) {
+      // Calculate a default eNB ID
+      if (EPC_MODE_ENABLED) {
+        uint32_t hash;
+        hash = s1ap_generate_eNB_id ();
+        enb_id = i + (hash & 0xFFFF8);
       } else {
-          enb_id = *(ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr);
+        enb_id = i;
       }
+    } else {
+      enb_id = *(ENBParamList.paramarray[i][ENB_ENB_ID_IDX].uptr);
+    }
 
-      
-      printf("RRC %d: Southbound Transport %s\n",i,*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr));
-	    
-      if (strcmp(*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr), "local_mac") == 0) {
+    printf("RRC %d: Southbound Transport %s\n",i,*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr));
+
+    if (strcmp(*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr), "local_mac") == 0) {
+    } else if (strcmp(*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr), "cudu") == 0) {
+      rrc->eth_params_s.local_if_name            = strdup(*(ENBParamList.paramarray[i][ENB_LOCAL_S_IF_NAME_IDX].strptr));
+      rrc->eth_params_s.my_addr                  = strdup(*(ENBParamList.paramarray[i][ENB_LOCAL_S_ADDRESS_IDX].strptr));
+      rrc->eth_params_s.remote_addr              = strdup(*(ENBParamList.paramarray[i][ENB_REMOTE_S_ADDRESS_IDX].strptr));
+      rrc->eth_params_s.my_portc                 = *(ENBParamList.paramarray[i][ENB_LOCAL_S_PORTC_IDX].uptr);
+      rrc->eth_params_s.remote_portc             = *(ENBParamList.paramarray[i][ENB_REMOTE_S_PORTC_IDX].uptr);
+      rrc->eth_params_s.my_portd                 = *(ENBParamList.paramarray[i][ENB_LOCAL_S_PORTD_IDX].uptr);
+      rrc->eth_params_s.remote_portd             = *(ENBParamList.paramarray[i][ENB_REMOTE_S_PORTD_IDX].uptr);
+      rrc->eth_params_s.transp_preference        = ETH_UDP_MODE;
+    } else { // other midhaul
+    }
 
+    // search if in active list
+
+    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];
+        RRC_CONFIGURATION_REQ (msg_p).cell_identity = enb_id;
+        /*
+          if (strcmp(*(ENBParamList.paramarray[i][ENB_CELL_TYPE_IDX].strptr), "CELL_MACRO_ENB") == 0) {
+          enb_properties_loc.properties[enb_properties_loc_index]->cell_type = CELL_MACRO_ENB;
+          } else  if (strcmp(cell_type, "CELL_HOME_ENB") == 0) {
+          enb_properties_loc.properties[enb_properties_loc_index]->cell_type = CELL_HOME_ENB;
+          } else {
+          AssertFatal (0,
+          "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n",
+          lib_config_file_name_pP, i, cell_type);
+          }
+
+          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);
+        // 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);
+
+        if ( CCsParamList.numelt> 0) {
+          char ccspath[MAX_OPTNAME_SIZE*2 + 16];
+
+          for (j = 0; j < CCsParamList.numelt ; j++) {
+            sprintf(ccspath,"%s.%s.[%i]",enbpath,ENB_CONFIG_STRING_COMPONENT_CARRIERS,j);
+            LOG_I(RRC, "enb_config::RCconfig_RRC() parameter number: %d, total number of parameters: %zd, ccspath: %s \n \n", j, sizeof(CCsParams)/sizeof(paramdef_t), ccspath);
+            config_get( CCsParams,sizeof(CCsParams)/sizeof(paramdef_t),ccspath);
+            //printf("Component carrier %d\n",component_carrier);
+            nb_cc++;
+            RRC_CONFIGURATION_REQ (msg_p).tdd_config[j] = tdd_config;
+            AssertFatal (tdd_config <= TDD_Config__subframeAssignment_sa6,
+                         "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!",
+                         RC.config_file_name, i, tdd_config, TDD_Config__subframeAssignment_sa6);
+            RRC_CONFIGURATION_REQ (msg_p).tdd_config_s[j] = tdd_config_s;
+            AssertFatal (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8,
+                         "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %d (should be 0-%d)!",
+                         RC.config_file_name, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8);
+
+            if (!prefix_type)
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d define %s: NORMAL,EXTENDED!\n",
+                           RC.config_file_name, i, ENB_CONFIG_STRING_PREFIX_TYPE);
+            else if (strcmp(prefix_type, "NORMAL") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = NORMAL;
+            } else  if (strcmp(prefix_type, "EXTENDED") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = EXTENDED;
+            } else {
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n",
+                           RC.config_file_name, i, prefix_type);
+            }
 
-      }
-      else if (strcmp(*(ENBParamList.paramarray[i][ENB_TRANSPORT_S_PREFERENCE_IDX].strptr), "cudu") == 0) {
-	rrc->eth_params_s.local_if_name            = strdup(*(ENBParamList.paramarray[i][ENB_LOCAL_S_IF_NAME_IDX].strptr));
-	rrc->eth_params_s.my_addr                  = strdup(*(ENBParamList.paramarray[i][ENB_LOCAL_S_ADDRESS_IDX].strptr));
-	rrc->eth_params_s.remote_addr              = strdup(*(ENBParamList.paramarray[i][ENB_REMOTE_S_ADDRESS_IDX].strptr));
-	rrc->eth_params_s.my_portc                 = *(ENBParamList.paramarray[i][ENB_LOCAL_S_PORTC_IDX].uptr);
-	rrc->eth_params_s.remote_portc             = *(ENBParamList.paramarray[i][ENB_REMOTE_S_PORTC_IDX].uptr);
-	rrc->eth_params_s.my_portd                 = *(ENBParamList.paramarray[i][ENB_LOCAL_S_PORTD_IDX].uptr);
-	rrc->eth_params_s.remote_portd             = *(ENBParamList.paramarray[i][ENB_REMOTE_S_PORTD_IDX].uptr);
-	rrc->eth_params_s.transp_preference        = ETH_UDP_MODE;
-      }
-      
-      else { // other midhaul
-      }	      
-
-      // search if in active list
-
-     
-   
-   
- 
-
-      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];
-
-	  
-	  RRC_CONFIGURATION_REQ (msg_p).cell_identity = enb_id;
-	  
-	  /*    
-		if (strcmp(*(ENBParamList.paramarray[i][ENB_CELL_TYPE_IDX].strptr), "CELL_MACRO_ENB") == 0) {
-		enb_properties_loc.properties[enb_properties_loc_index]->cell_type = CELL_MACRO_ENB;
-		} else  if (strcmp(cell_type, "CELL_HOME_ENB") == 0) {
-		enb_properties_loc.properties[enb_properties_loc_index]->cell_type = CELL_HOME_ENB;
-		} else {
-		AssertFatal (0,
-		"Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n",
-		lib_config_file_name_pP, i, cell_type);
-		}
-		
-		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);
-	  
-	
-	  // 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);  
-	  if ( CCsParamList.numelt> 0) {
-	    char ccspath[MAX_OPTNAME_SIZE*2 + 16];
-	    
-	    for (j = 0; j < CCsParamList.numelt ;j++) { 
-
-	      sprintf(ccspath,"%s.%s.[%i]",enbpath,ENB_CONFIG_STRING_COMPONENT_CARRIERS,j);
-	      LOG_I(RRC, "enb_config::RCconfig_RRC() parameter number: %d, total number of parameters: %zd, ccspath: %s \n \n", j, sizeof(CCsParams)/sizeof(paramdef_t), ccspath);
-	      config_get( CCsParams,sizeof(CCsParams)/sizeof(paramdef_t),ccspath);	      
-
-
-	      //printf("Component carrier %d\n",component_carrier);	     
-
-		    
-
-	      nb_cc++;
-
-	      
-	      RRC_CONFIGURATION_REQ (msg_p).tdd_config[j] = tdd_config;
-	      
-	      AssertFatal (tdd_config <= TDD_Config__subframeAssignment_sa6,
-			   "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!",
-			   RC.config_file_name, i, tdd_config, TDD_Config__subframeAssignment_sa6);
-	      
-	      RRC_CONFIGURATION_REQ (msg_p).tdd_config_s[j] = tdd_config_s;
-	      AssertFatal (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8,
-			   "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %d (should be 0-%d)!",
-			   RC.config_file_name, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8);
-	      
-	      if (!prefix_type)
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d define %s: NORMAL,EXTENDED!\n",
-			     RC.config_file_name, i, ENB_CONFIG_STRING_PREFIX_TYPE);
-	      else if (strcmp(prefix_type, "NORMAL") == 0) {
-		RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = NORMAL;
-	      } else  if (strcmp(prefix_type, "EXTENDED") == 0) {
-		RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = EXTENDED;
-	      } else {
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n",
-			     RC.config_file_name, i, prefix_type);
-	      }
 #if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
-	      if (!pbch_repetition)
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d define %s: TRUE,FALSE!\n",
-			     RC.config_file_name, i, ENB_CONFIG_STRING_PBCH_REPETITION);
-	      else if (strcmp(pbch_repetition, "TRUE") == 0) {
-		RRC_CONFIGURATION_REQ (msg_p).pbch_repetition[j] = 1;
-	      } else  if (strcmp(pbch_repetition, "FALSE") == 0) {
-		RRC_CONFIGURATION_REQ (msg_p).pbch_repetition[j] = 0;
-	      } else {
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pbch_repetition choice: TRUE or FALSE !\n",
-			     RC.config_file_name, i, pbch_repetition);
-	      }
-#endif
-              
-	      RRC_CONFIGURATION_REQ (msg_p).eutra_band[j] = eutra_band;
-	      RRC_CONFIGURATION_REQ (msg_p).downlink_frequency[j] = (uint32_t) downlink_frequency;
-	      RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset;
-	      RRC_CONFIGURATION_REQ (msg_p).Nid_cell[j]= Nid_cell;
-	      
-	      if (Nid_cell>503) {
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for Nid_cell choice: 0...503 !\n",
-			     RC.config_file_name, i, Nid_cell);
-	      }
-	      
-	      RRC_CONFIGURATION_REQ (msg_p).N_RB_DL[j]= N_RB_DL;
-	      
-	      if ((N_RB_DL!=6) && (N_RB_DL!=15) && (N_RB_DL!=25) && (N_RB_DL!=50) && (N_RB_DL!=75) && (N_RB_DL!=100)) {
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for N_RB_DL choice: 6,15,25,50,75,100 !\n",
-			     RC.config_file_name, i, N_RB_DL);
-	      }
-	      
-	      if (strcmp(frame_type, "FDD") == 0) {
-		RRC_CONFIGURATION_REQ (msg_p).frame_type[j] = FDD;
-	      } else  if (strcmp(frame_type, "TDD") == 0) {
-		RRC_CONFIGURATION_REQ (msg_p).frame_type[j] = TDD;
-	      } else {
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for frame_type choice: FDD or TDD !\n",
-			     RC.config_file_name, i, frame_type);
-	      }
-	      
-	      
-	      RRC_CONFIGURATION_REQ (msg_p).tdd_config[j] = tdd_config;
-	      AssertFatal (tdd_config <= TDD_Config__subframeAssignment_sa6,
-			   "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!",
-			   RC.config_file_name, i, tdd_config, TDD_Config__subframeAssignment_sa6);
-	      
-	      
-	      RRC_CONFIGURATION_REQ (msg_p).tdd_config_s[j] = tdd_config_s;
-	      AssertFatal (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8,
-			   "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %d (should be 0-%d)!",
-			   RC.config_file_name, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8);
-	      
-	      
-	      
-	      if (!prefix_type)
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d define %s: NORMAL,EXTENDED!\n",
-			     RC.config_file_name, i, ENB_CONFIG_STRING_PREFIX_TYPE);
-	      else if (strcmp(prefix_type, "NORMAL") == 0) {
-		RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = NORMAL;
-	      } else  if (strcmp(prefix_type, "EXTENDED") == 0) {
-		RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = EXTENDED;
-	      } else {
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n",
-			     RC.config_file_name, i, prefix_type);
-	      }
-	      
-	      
-	      
-	      RRC_CONFIGURATION_REQ (msg_p).eutra_band[j] = eutra_band;
-	      // printf( "\teutra band:\t%d\n",RRC_CONFIGURATION_REQ (msg_p).eutra_band);
-	      
-	      
-	      
-	      RRC_CONFIGURATION_REQ (msg_p).downlink_frequency[j] = (uint32_t) downlink_frequency;
-	      //printf( "\tdownlink freq:\t%u\n",RRC_CONFIGURATION_REQ (msg_p).downlink_frequency);
-	      
-	      
-	      RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset;
-	      
-	      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],
-					     RRC_CONFIGURATION_REQ (msg_p).frame_type[j])) {
-		AssertFatal(0, "error calling enb_check_band_frequencies\n");
-	      }
-	      
-	      if ((nb_antenna_ports <1) || (nb_antenna_ports > 2))
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for nb_antenna_ports choice: 1..2 !\n",
-			     RC.config_file_name, i, nb_antenna_ports);
-	      
-	      RRC_CONFIGURATION_REQ (msg_p).nb_antenna_ports[j] = nb_antenna_ports;
-	      
-	      
-	      RRC_CONFIGURATION_REQ (msg_p).prach_root[j] =  prach_root;
-	      
-	      if ((prach_root <0) || (prach_root > 1023))
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_root choice: 0..1023 !\n",
-			     RC.config_file_name, i, prach_root);
-	      
-	      RRC_CONFIGURATION_REQ (msg_p).prach_config_index[j] = prach_config_index;
-	      
-	      if ((prach_config_index <0) || (prach_config_index > 63))
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_config_index choice: 0..1023 !\n",
-			     RC.config_file_name, i, prach_config_index);
-	      
-	      if (!prach_high_speed)
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
-			     RC.config_file_name, i, ENB_CONFIG_STRING_PRACH_HIGH_SPEED);
-	      else if (strcmp(prach_high_speed, "ENABLE") == 0) {
-		RRC_CONFIGURATION_REQ (msg_p).prach_high_speed[j] = TRUE;
-	      } else if (strcmp(prach_high_speed, "DISABLE") == 0) {
-		RRC_CONFIGURATION_REQ (msg_p).prach_high_speed[j] = FALSE;
-	      } else
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prach_config choice: ENABLE,DISABLE !\n",
-			     RC.config_file_name, i, prach_high_speed);
-	      
-	      RRC_CONFIGURATION_REQ (msg_p).prach_zero_correlation[j] =prach_zero_correlation;
-	      
-	      if ((prach_zero_correlation <0) || (prach_zero_correlation > 15))
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_zero_correlation choice: 0..15!\n",
-			     RC.config_file_name, i, prach_zero_correlation);
-	      
-	      RRC_CONFIGURATION_REQ (msg_p).prach_freq_offset[j] = prach_freq_offset;
-	      if ((prach_freq_offset <0) || (prach_freq_offset > 94))
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_freq_offset choice: 0..94!\n",
-			     RC.config_file_name, i, prach_freq_offset);
-	      
-	      RRC_CONFIGURATION_REQ (msg_p).pucch_delta_shift[j] = pucch_delta_shift-1;
-	      
-	      if ((pucch_delta_shift <1) || (pucch_delta_shift > 3))
-		AssertFatal (0,
-			     "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_delta_shift choice: 1..3!\n",
-			     RC.config_file_name, i, pucch_delta_shift);
-	      
-		RRC_CONFIGURATION_REQ (msg_p).pucch_nRB_CQI[j] = pucch_nRB_CQI;
-
-		if ((pucch_nRB_CQI <0) || (pucch_nRB_CQI > 98))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nRB_CQI choice: 0..98!\n",
-			       RC.config_file_name, i, pucch_nRB_CQI);
-
-		RRC_CONFIGURATION_REQ (msg_p).pucch_nCS_AN[j] = pucch_nCS_AN;
-
-		if ((pucch_nCS_AN <0) || (pucch_nCS_AN > 7))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nCS_AN choice: 0..7!\n",
-			       RC.config_file_name, i, pucch_nCS_AN);
-
-//#if (RRC_VERSION < MAKE_VERSION(10, 0, 0))
-		RRC_CONFIGURATION_REQ (msg_p).pucch_n1_AN[j] = pucch_n1_AN;
-
-		if ((pucch_n1_AN <0) || (pucch_n1_AN > 2047))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_n1_AN choice: 0..2047!\n",
-			       RC.config_file_name, i, pucch_n1_AN);
-
-//#endif
-		RRC_CONFIGURATION_REQ (msg_p).pdsch_referenceSignalPower[j] = pdsch_referenceSignalPower;
-
-		if ((pdsch_referenceSignalPower <-60) || (pdsch_referenceSignalPower > 50))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_referenceSignalPower choice:-60..50!\n",
-			       RC.config_file_name, i, pdsch_referenceSignalPower);
-
-		RRC_CONFIGURATION_REQ (msg_p).pdsch_p_b[j] = pdsch_p_b;
-
-		if ((pdsch_p_b <0) || (pdsch_p_b > 3))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_p_b choice: 0..3!\n",
-			       RC.config_file_name, i, pdsch_p_b);
-
-		RRC_CONFIGURATION_REQ (msg_p).pusch_n_SB[j] = pusch_n_SB;
-
-		if ((pusch_n_SB <1) || (pusch_n_SB > 4))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_n_SB choice: 1..4!\n",
-			       RC.config_file_name, i, pusch_n_SB);
-
-		if (!pusch_hoppingMode)
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d define %s: interSubframe,intraAndInterSubframe!\n",
-			       RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_HOPPINGMODE);
-		else if (strcmp(pusch_hoppingMode,"interSubFrame")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_hoppingMode[j] = PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_interSubFrame;
-		}  else if (strcmp(pusch_hoppingMode,"intraAndInterSubFrame")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_hoppingMode[j] = PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_intraAndInterSubFrame;
-		} else
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_hoppingMode choice: interSubframe,intraAndInterSubframe!\n",
-			       RC.config_file_name, i, pusch_hoppingMode);
-
-		RRC_CONFIGURATION_REQ (msg_p).pusch_hoppingOffset[j] = pusch_hoppingOffset;
-
-		if ((pusch_hoppingOffset<0) || (pusch_hoppingOffset>98))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_hoppingOffset choice: 0..98!\n",
-			       RC.config_file_name, i, pusch_hoppingMode);
-
-		if (!pusch_enable64QAM)
-		  AssertFatal (0, 
-			       "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
-			       RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_ENABLE64QAM);
-		else if (strcmp(pusch_enable64QAM, "ENABLE") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_enable64QAM[j] = TRUE;
-		}  else if (strcmp(pusch_enable64QAM, "DISABLE") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_enable64QAM[j] = FALSE;
-		} else
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_enable64QAM choice: ENABLE,DISABLE!\n",
-			       RC.config_file_name, i, pusch_enable64QAM);
-
-		if (!pusch_groupHoppingEnabled)
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
-			       RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN);
-		else if (strcmp(pusch_groupHoppingEnabled, "ENABLE") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_groupHoppingEnabled[j] = TRUE;
-		}  else if (strcmp(pusch_groupHoppingEnabled, "DISABLE") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_groupHoppingEnabled[j] = FALSE;
-		} else
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_groupHoppingEnabled choice: ENABLE,DISABLE!\n",
-			       RC.config_file_name, i, pusch_groupHoppingEnabled);
-
-
-		RRC_CONFIGURATION_REQ (msg_p).pusch_groupAssignment[j] = pusch_groupAssignment;
-
-		if ((pusch_groupAssignment<0)||(pusch_groupAssignment>29))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_groupAssignment choice: 0..29!\n",
-			       RC.config_file_name, i, pusch_groupAssignment);
-
-		if (!pusch_sequenceHoppingEnabled)
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
-			       RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN);
-		else if (strcmp(pusch_sequenceHoppingEnabled, "ENABLE") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_sequenceHoppingEnabled[j] = TRUE;
-		}  else if (strcmp(pusch_sequenceHoppingEnabled, "DISABLE") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_sequenceHoppingEnabled[j] = FALSE;
-		} else
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_sequenceHoppingEnabled choice: ENABLE,DISABLE!\n",
-			       RC.config_file_name, i, pusch_sequenceHoppingEnabled);
-
-		RRC_CONFIGURATION_REQ (msg_p).pusch_nDMRS1[j] = pusch_nDMRS1;  //cyclic_shift in RRC!
-
-		if ((pusch_nDMRS1 <0) || (pusch_nDMRS1>7))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_nDMRS1 choice: 0..7!\n",
-			       RC.config_file_name, i, pusch_nDMRS1);
-
-		if (strcmp(phich_duration,"NORMAL")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = PHICH_Config__phich_Duration_normal;
-		} else if (strcmp(phich_duration,"EXTENDED")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = PHICH_Config__phich_Duration_extended;
-		} else
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_duration choice: NORMAL,EXTENDED!\n",
-			       RC.config_file_name, i, phich_duration);
-
-		if (strcmp(phich_resource,"ONESIXTH")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_oneSixth ;
-		} else if (strcmp(phich_resource,"HALF")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_half;
-		} else if (strcmp(phich_resource,"ONE")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_one;
-		} else if (strcmp(phich_resource,"TWO")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_two;
-		} else
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_resource choice: ONESIXTH,HALF,ONE,TWO!\n",
-			       RC.config_file_name, i, phich_resource);
-
-		printf("phich.resource %ld (%s), phich.duration %ld (%s)\n",
-		       RRC_CONFIGURATION_REQ (msg_p).phich_resource[j],phich_resource,
-		       RRC_CONFIGURATION_REQ (msg_p).phich_duration[j],phich_duration);
-
-		if (strcmp(srs_enable, "ENABLE") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] = TRUE;
-		} else if (strcmp(srs_enable, "DISABLE") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] = FALSE;
-		} else
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n",
-			       RC.config_file_name, i, srs_enable);
-
-		if (RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] == TRUE) {
-
-		  RRC_CONFIGURATION_REQ (msg_p).srs_BandwidthConfig[j] = srs_BandwidthConfig;
-
-		  if ((srs_BandwidthConfig < 0) || (srs_BandwidthConfig >7))
-		    AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value %d for srs_BandwidthConfig choice: 0...7\n",
-				 RC.config_file_name, i, srs_BandwidthConfig);
-
-		  RRC_CONFIGURATION_REQ (msg_p).srs_SubframeConfig[j] = srs_SubframeConfig;
-
-		  if ((srs_SubframeConfig<0) || (srs_SubframeConfig>15))
-		    AssertFatal (0,
-				 "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for srs_SubframeConfig choice: 0..15 !\n",
-				 RC.config_file_name, i, srs_SubframeConfig);
-
-		  if (strcmp(srs_ackNackST, "ENABLE") == 0) {
-		    RRC_CONFIGURATION_REQ (msg_p).srs_ackNackST[j] = TRUE;
-		  } else if (strcmp(srs_ackNackST, "DISABLE") == 0) {
-		    RRC_CONFIGURATION_REQ (msg_p).srs_ackNackST[j] = FALSE;
-		  } else
-		    AssertFatal (0,
-				 "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n",
-				 RC.config_file_name, i, srs_ackNackST);
-
-		  if (strcmp(srs_MaxUpPts, "ENABLE") == 0) {
-		    RRC_CONFIGURATION_REQ (msg_p).srs_MaxUpPts[j] = TRUE;
-		  } else if (strcmp(srs_MaxUpPts, "DISABLE") == 0) {
-		    RRC_CONFIGURATION_REQ (msg_p).srs_MaxUpPts[j] = FALSE;
-		  } else
-		    AssertFatal (0,
-				 "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_MaxUpPts choice: ENABLE,DISABLE !\n",
-				 RC.config_file_name, i, srs_MaxUpPts);
-		}
-
-		RRC_CONFIGURATION_REQ (msg_p).pusch_p0_Nominal[j] = pusch_p0_Nominal;
-
-		if ((pusch_p0_Nominal<-126) || (pusch_p0_Nominal>24))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_p0_Nominal choice: -126..24 !\n",
-			       RC.config_file_name, i, pusch_p0_Nominal);
 
-#if (RRC_VERSION <= MAKE_VERSION(12, 0, 0))
-		if (strcmp(pusch_alpha,"AL0")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al0;
-		} else if (strcmp(pusch_alpha,"AL04")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al04;
-		} else if (strcmp(pusch_alpha,"AL05")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al05;
-		} else if (strcmp(pusch_alpha,"AL06")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al06;
-		} else if (strcmp(pusch_alpha,"AL07")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al07;
-		} else if (strcmp(pusch_alpha,"AL08")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al08;
-		} else if (strcmp(pusch_alpha,"AL09")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al09;
-		} else if (strcmp(pusch_alpha,"AL1")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al1;
-		} 
-#endif
+            if (!pbch_repetition)
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d define %s: TRUE,FALSE!\n",
+                           RC.config_file_name, i, ENB_CONFIG_STRING_PBCH_REPETITION);
+            else if (strcmp(pbch_repetition, "TRUE") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pbch_repetition[j] = 1;
+            } else  if (strcmp(pbch_repetition, "FALSE") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pbch_repetition[j] = 0;
+            } else {
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pbch_repetition choice: TRUE or FALSE !\n",
+                           RC.config_file_name, i, pbch_repetition);
+            }
 
-#if (RRC_VERSION >= MAKE_VERSION(12, 0, 0))
-		if (strcmp(pusch_alpha,"AL0")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al0;
-		} else if (strcmp(pusch_alpha,"AL04")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al04;
-		} else if (strcmp(pusch_alpha,"AL05")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al05;
-		} else if (strcmp(pusch_alpha,"AL06")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al06;
-		} else if (strcmp(pusch_alpha,"AL07")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al07;
-		} else if (strcmp(pusch_alpha,"AL08")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al08;
-		} else if (strcmp(pusch_alpha,"AL09")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al09;
-		} else if (strcmp(pusch_alpha,"AL1")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al1;
-		} 
 #endif
-		else
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_Alpha choice: AL0,AL04,AL05,AL06,AL07,AL08,AL09,AL1!\n",
-			       RC.config_file_name, i, pusch_alpha);
-
-		RRC_CONFIGURATION_REQ (msg_p).pucch_p0_Nominal[j] = pucch_p0_Nominal;
-
-		if ((pucch_p0_Nominal<-127) || (pucch_p0_Nominal>-96))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_p0_Nominal choice: -127..-96 !\n",
-			       RC.config_file_name, i, pucch_p0_Nominal);
-
-		RRC_CONFIGURATION_REQ (msg_p).msg3_delta_Preamble[j] = msg3_delta_Preamble;
-
-		if ((msg3_delta_Preamble<-1) || (msg3_delta_Preamble>6))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for msg3_delta_Preamble choice: -1..6 !\n",
-			       RC.config_file_name, i, msg3_delta_Preamble);
-
-
-		if (strcmp(pucch_deltaF_Format1,"deltaF_2")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF_2;
-		} else if (strcmp(pucch_deltaF_Format1,"deltaF0")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF0;
-		} else if (strcmp(pucch_deltaF_Format1,"deltaF2")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF2;
-		} else
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1 choice: deltaF_2,dltaF0,deltaF2!\n",
-			       RC.config_file_name, i, pucch_deltaF_Format1);
-
-		if (strcmp(pucch_deltaF_Format1b,"deltaF1")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF1;
-		} else if (strcmp(pucch_deltaF_Format1b,"deltaF3")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF3;
-		} else if (strcmp(pucch_deltaF_Format1b,"deltaF5")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF5;
-		} else
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1b choice: deltaF1,dltaF3,deltaF5!\n",
-			       RC.config_file_name, i, pucch_deltaF_Format1b);
-
-
-		if (strcmp(pucch_deltaF_Format2,"deltaF_2")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF_2;
-		} else if (strcmp(pucch_deltaF_Format2,"deltaF0")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF0;
-		} else if (strcmp(pucch_deltaF_Format2,"deltaF1")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF1;
-		} else if (strcmp(pucch_deltaF_Format2,"deltaF2")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF2;
-		} else
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2 choice: deltaF_2,dltaF0,deltaF1,deltaF2!\n",
-			       RC.config_file_name, i, pucch_deltaF_Format2);
-
-		if (strcmp(pucch_deltaF_Format2a,"deltaF_2")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF_2;
-		} else if (strcmp(pucch_deltaF_Format2a,"deltaF0")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF0;
-		} else if (strcmp(pucch_deltaF_Format2a,"deltaF2")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF2;
-		} else
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2a choice: deltaF_2,dltaF0,deltaF2!\n",
-			       RC.config_file_name, i, pucch_deltaF_Format2a);
-
-		if (strcmp(pucch_deltaF_Format2b,"deltaF_2")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF_2;
-		} else if (strcmp(pucch_deltaF_Format2b,"deltaF0")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF0;
-		} else if (strcmp(pucch_deltaF_Format2b,"deltaF2")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF2;
-		} else
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2b choice: deltaF_2,dltaF0,deltaF2!\n",
-			       RC.config_file_name, i, pucch_deltaF_Format2b);
-
-
-
-
-		RRC_CONFIGURATION_REQ (msg_p).rach_numberOfRA_Preambles[j] = (rach_numberOfRA_Preambles/4)-1;
-
-		if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>64) || ((rach_numberOfRA_Preambles&3)!=0))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_numberOfRA_Preambles choice: 4,8,12,...,64!\n",
-			       RC.config_file_name, i, rach_numberOfRA_Preambles);
-
-		if (strcmp(rach_preamblesGroupAConfig, "ENABLE") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preamblesGroupAConfig[j] = TRUE;
-
-
-		  RRC_CONFIGURATION_REQ (msg_p).rach_sizeOfRA_PreamblesGroupA[j] = (rach_sizeOfRA_PreamblesGroupA/4)-1;
-
-		  if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>60) || ((rach_numberOfRA_Preambles&3)!=0))
-		    AssertFatal (0,
-				 "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_sizeOfRA_PreamblesGroupA choice: 4,8,12,...,60!\n",
-				 RC.config_file_name, i, rach_sizeOfRA_PreamblesGroupA);
-
-
-		  switch (rach_messageSizeGroupA) {
-		  case 56:
-		    RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b56;
-		    break;
-
-		  case 144:
-		    RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b144;
-		    break;
-
-		  case 208:
-		    RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b208;
-		    break;
-
-		  case 256:
-		    RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b256;
-		    break;
-
-		  default:
-		    AssertFatal (0,
-				 "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_messageSizeGroupA choice: 56,144,208,256!\n",
-				 RC.config_file_name, i, rach_messageSizeGroupA);
-		    break;
-		  }
-
-		  if (strcmp(rach_messagePowerOffsetGroupB,"minusinfinity")==0) {
-		    RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_minusinfinity;
-		  }
-
-		  else if (strcmp(rach_messagePowerOffsetGroupB,"dB0")==0) {
-		    RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB0;
-		  }
-
-		  else if (strcmp(rach_messagePowerOffsetGroupB,"dB5")==0) {
-		    RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB5;
-		  }
-
-		  else if (strcmp(rach_messagePowerOffsetGroupB,"dB8")==0) {
-		    RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB8;
-		  }
+            RRC_CONFIGURATION_REQ (msg_p).eutra_band[j] = eutra_band;
+            RRC_CONFIGURATION_REQ (msg_p).downlink_frequency[j] = (uint32_t) downlink_frequency;
+            RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset;
+            RRC_CONFIGURATION_REQ (msg_p).Nid_cell[j]= Nid_cell;
 
-		  else if (strcmp(rach_messagePowerOffsetGroupB,"dB10")==0) {
-		    RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB10;
-		  }
-
-		  else if (strcmp(rach_messagePowerOffsetGroupB,"dB12")==0) {
-		    RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB12;
-		  }
+            if (Nid_cell>503) {
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for Nid_cell choice: 0...503 !\n",
+                           RC.config_file_name, i, Nid_cell);
+            }
 
-		  else if (strcmp(rach_messagePowerOffsetGroupB,"dB15")==0) {
-		    RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB15;
-		  }
+            RRC_CONFIGURATION_REQ (msg_p).N_RB_DL[j]= N_RB_DL;
 
-		  else if (strcmp(rach_messagePowerOffsetGroupB,"dB18")==0) {
-		    RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB18;
-		  } else
-		    AssertFatal (0,
-				 "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_messagePowerOffsetGroupB choice: minusinfinity,dB0,dB5,dB8,dB10,dB12,dB15,dB18!\n",
-				 RC.config_file_name, i, rach_messagePowerOffsetGroupB);
+            if ((N_RB_DL!=6) && (N_RB_DL!=15) && (N_RB_DL!=25) && (N_RB_DL!=50) && (N_RB_DL!=75) && (N_RB_DL!=100)) {
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for N_RB_DL choice: 6,15,25,50,75,100 !\n",
+                           RC.config_file_name, i, N_RB_DL);
+            }
 
-		} else if (strcmp(rach_preamblesGroupAConfig, "DISABLE") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preamblesGroupAConfig[j] = FALSE;
-		} else
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_preamblesGroupAConfig choice: ENABLE,DISABLE !\n",
-			       RC.config_file_name, i, rach_preamblesGroupAConfig);
+            if (strcmp(frame_type, "FDD") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).frame_type[j] = FDD;
+            } else  if (strcmp(frame_type, "TDD") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).frame_type[j] = TDD;
+            } else {
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for frame_type choice: FDD or TDD !\n",
+                           RC.config_file_name, i, frame_type);
+            }
 
-		RRC_CONFIGURATION_REQ (msg_p).rach_preambleInitialReceivedTargetPower[j] = (rach_preambleInitialReceivedTargetPower+120)/2;
+            RRC_CONFIGURATION_REQ (msg_p).tdd_config[j] = tdd_config;
+            AssertFatal (tdd_config <= TDD_Config__subframeAssignment_sa6,
+                         "Failed to parse eNB configuration file %s, enb %d illegal tdd_config %d (should be 0-%d)!",
+                         RC.config_file_name, i, tdd_config, TDD_Config__subframeAssignment_sa6);
+            RRC_CONFIGURATION_REQ (msg_p).tdd_config_s[j] = tdd_config_s;
+            AssertFatal (tdd_config_s <= TDD_Config__specialSubframePatterns_ssp8,
+                         "Failed to parse eNB configuration file %s, enb %d illegal tdd_config_s %d (should be 0-%d)!",
+                         RC.config_file_name, i, tdd_config_s, TDD_Config__specialSubframePatterns_ssp8);
 
-		if ((rach_preambleInitialReceivedTargetPower<-120) || (rach_preambleInitialReceivedTargetPower>-90) || ((rach_preambleInitialReceivedTargetPower&1)!=0))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleInitialReceivedTargetPower choice: -120,-118,...,-90 !\n",
-			       RC.config_file_name, i, rach_preambleInitialReceivedTargetPower);
+            if (!prefix_type)
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d define %s: NORMAL,EXTENDED!\n",
+                           RC.config_file_name, i, ENB_CONFIG_STRING_PREFIX_TYPE);
+            else if (strcmp(prefix_type, "NORMAL") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = NORMAL;
+            } else  if (strcmp(prefix_type, "EXTENDED") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).prefix_type[j] = EXTENDED;
+            } else {
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prefix_type choice: NORMAL or EXTENDED !\n",
+                           RC.config_file_name, i, prefix_type);
+            }
 
+            RRC_CONFIGURATION_REQ (msg_p).eutra_band[j] = eutra_band;
+            // printf( "\teutra band:\t%d\n",RRC_CONFIGURATION_REQ (msg_p).eutra_band);
+            RRC_CONFIGURATION_REQ (msg_p).downlink_frequency[j] = (uint32_t) downlink_frequency;
+            //printf( "\tdownlink freq:\t%u\n",RRC_CONFIGURATION_REQ (msg_p).downlink_frequency);
+            RRC_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[j] = (unsigned int) uplink_frequency_offset;
+
+            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],
+                                              RRC_CONFIGURATION_REQ (msg_p).frame_type[j])) {
+              AssertFatal(0, "error calling enb_check_band_frequencies\n");
+            }
 
-		RRC_CONFIGURATION_REQ (msg_p).rach_powerRampingStep[j] = rach_powerRampingStep/2;
+            if ((nb_antenna_ports <1) || (nb_antenna_ports > 2))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for nb_antenna_ports choice: 1..2 !\n",
+                           RC.config_file_name, i, nb_antenna_ports);
 
-		if ((rach_powerRampingStep<0) || (rach_powerRampingStep>6) || ((rach_powerRampingStep&1)!=0))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_powerRampingStep choice: 0,2,4,6 !\n",
-			       RC.config_file_name, i, rach_powerRampingStep);
+            RRC_CONFIGURATION_REQ (msg_p).nb_antenna_ports[j] = nb_antenna_ports;
+            RRC_CONFIGURATION_REQ (msg_p).prach_root[j] =  prach_root;
 
+            if ((prach_root <0) || (prach_root > 1023))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_root choice: 0..1023 !\n",
+                           RC.config_file_name, i, prach_root);
 
+            RRC_CONFIGURATION_REQ (msg_p).prach_config_index[j] = prach_config_index;
 
-		switch (rach_preambleTransMax) {
-#if (RRC_VERSION < MAKE_VERSION(14, 0, 0))
-		case 3:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n3;
-		  break;
+            if ((prach_config_index <0) || (prach_config_index > 63))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_config_index choice: 0..1023 !\n",
+                           RC.config_file_name, i, prach_config_index);
 
-		case 4:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n4;
-		  break;
+            if (!prach_high_speed)
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
+                           RC.config_file_name, i, ENB_CONFIG_STRING_PRACH_HIGH_SPEED);
+            else if (strcmp(prach_high_speed, "ENABLE") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).prach_high_speed[j] = TRUE;
+            } else if (strcmp(prach_high_speed, "DISABLE") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).prach_high_speed[j] = FALSE;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for prach_config choice: ENABLE,DISABLE !\n",
+                           RC.config_file_name, i, prach_high_speed);
 
-		case 5:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n5;
-		  break;
+            RRC_CONFIGURATION_REQ (msg_p).prach_zero_correlation[j] =prach_zero_correlation;
 
-		case 6:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n6;
-		  break;
+            if ((prach_zero_correlation <0) || (prach_zero_correlation > 15))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_zero_correlation choice: 0..15!\n",
+                           RC.config_file_name, i, prach_zero_correlation);
 
-		case 7:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n7;
-		  break;
+            RRC_CONFIGURATION_REQ (msg_p).prach_freq_offset[j] = prach_freq_offset;
 
-		case 8:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n8;
-		  break;
+            if ((prach_freq_offset <0) || (prach_freq_offset > 94))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for prach_freq_offset choice: 0..94!\n",
+                           RC.config_file_name, i, prach_freq_offset);
 
-		case 10:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n10;
-		  break;
+            RRC_CONFIGURATION_REQ (msg_p).pucch_delta_shift[j] = pucch_delta_shift-1;
 
-		case 20:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n20;
-		  break;
+            if ((pucch_delta_shift <1) || (pucch_delta_shift > 3))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_delta_shift choice: 1..3!\n",
+                           RC.config_file_name, i, pucch_delta_shift);
 
-		case 50:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n50;
-		  break;
+            RRC_CONFIGURATION_REQ (msg_p).pucch_nRB_CQI[j] = pucch_nRB_CQI;
 
-		case 100:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n100;
-		  break;
+            if ((pucch_nRB_CQI <0) || (pucch_nRB_CQI > 98))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nRB_CQI choice: 0..98!\n",
+                           RC.config_file_name, i, pucch_nRB_CQI);
 
-		case 200:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n200;
-		  break;
+            RRC_CONFIGURATION_REQ (msg_p).pucch_nCS_AN[j] = pucch_nCS_AN;
 
-#else
+            if ((pucch_nCS_AN <0) || (pucch_nCS_AN > 7))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_nCS_AN choice: 0..7!\n",
+                           RC.config_file_name, i, pucch_nCS_AN);
 
-		case 3:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n3;
-		  break;
+            //#if (RRC_VERSION < MAKE_VERSION(10, 0, 0))
+            RRC_CONFIGURATION_REQ (msg_p).pucch_n1_AN[j] = pucch_n1_AN;
 
-		case 4:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n4;
-		  break;
+            if ((pucch_n1_AN <0) || (pucch_n1_AN > 2047))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_n1_AN choice: 0..2047!\n",
+                           RC.config_file_name, i, pucch_n1_AN);
 
-		case 5:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n5;
-		  break;
+            //#endif
+            RRC_CONFIGURATION_REQ (msg_p).pdsch_referenceSignalPower[j] = pdsch_referenceSignalPower;
 
-		case 6:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n6;
-		  break;
+            if ((pdsch_referenceSignalPower <-60) || (pdsch_referenceSignalPower > 50))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_referenceSignalPower choice:-60..50!\n",
+                           RC.config_file_name, i, pdsch_referenceSignalPower);
 
-		case 7:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n7;
-		  break;
+            RRC_CONFIGURATION_REQ (msg_p).pdsch_p_b[j] = pdsch_p_b;
 
-		case 8:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n8;
-		  break;
+            if ((pdsch_p_b <0) || (pdsch_p_b > 3))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pdsch_p_b choice: 0..3!\n",
+                           RC.config_file_name, i, pdsch_p_b);
 
-		case 10:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n10;
-		  break;
+            RRC_CONFIGURATION_REQ (msg_p).pusch_n_SB[j] = pusch_n_SB;
 
-		case 20:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n20;
-		  break;
+            if ((pusch_n_SB <1) || (pusch_n_SB > 4))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_n_SB choice: 1..4!\n",
+                           RC.config_file_name, i, pusch_n_SB);
 
-		case 50:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n50;
-		  break;
+            if (!pusch_hoppingMode)
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d define %s: interSubframe,intraAndInterSubframe!\n",
+                           RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_HOPPINGMODE);
+            else if (strcmp(pusch_hoppingMode,"interSubFrame")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_hoppingMode[j] = PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_interSubFrame;
+            }  else if (strcmp(pusch_hoppingMode,"intraAndInterSubFrame")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_hoppingMode[j] = PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_intraAndInterSubFrame;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_hoppingMode choice: interSubframe,intraAndInterSubframe!\n",
+                           RC.config_file_name, i, pusch_hoppingMode);
 
-		case 100:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n100;
-		  break;
+            RRC_CONFIGURATION_REQ (msg_p).pusch_hoppingOffset[j] = pusch_hoppingOffset;
 
-		case 200:
-		  RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n200;
-		  break;
-#endif
+            if ((pusch_hoppingOffset<0) || (pusch_hoppingOffset>98))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_hoppingOffset choice: 0..98!\n",
+                           RC.config_file_name, i, pusch_hoppingMode);
 
-		default:
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleTransMax choice: 3,4,5,6,7,8,10,20,50,100,200!\n",
-			       RC.config_file_name, i, rach_preambleTransMax);
-		  break;
-		}
-
-		RRC_CONFIGURATION_REQ (msg_p).rach_raResponseWindowSize[j] =  (rach_raResponseWindowSize==10)?7:rach_raResponseWindowSize-2;
-
-		if ((rach_raResponseWindowSize<0)||(rach_raResponseWindowSize==9)||(rach_raResponseWindowSize>10))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_raResponseWindowSize choice: 2,3,4,5,6,7,8,10!\n",
-			       RC.config_file_name, i, rach_preambleTransMax);
-
-
-		RRC_CONFIGURATION_REQ (msg_p).rach_macContentionResolutionTimer[j] = (rach_macContentionResolutionTimer/8)-1;
-
-		if ((rach_macContentionResolutionTimer<8) || (rach_macContentionResolutionTimer>64) || ((rach_macContentionResolutionTimer&7)!=0))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_macContentionResolutionTimer choice: 8,16,...,56,64!\n",
-			       RC.config_file_name, i, rach_preambleTransMax);
-
-		RRC_CONFIGURATION_REQ (msg_p).rach_maxHARQ_Msg3Tx[j] = rach_maxHARQ_Msg3Tx;
-
-		if ((rach_maxHARQ_Msg3Tx<0) || (rach_maxHARQ_Msg3Tx>8))
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_maxHARQ_Msg3Tx choice: 1..8!\n",
-			       RC.config_file_name, i, rach_preambleTransMax);
-
-
-		switch (pcch_defaultPagingCycle) {
-		case 32:
-		  RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf32;
-		  break;
-
-		case 64:
-		  RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf64;
-		  break;
-
-		case 128:
-		  RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf128;
-		  break;
-
-		case 256:
-		  RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf256;
-		  break;
-
-		default:
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pcch_defaultPagingCycle choice: 32,64,128,256!\n",
-			       RC.config_file_name, i, pcch_defaultPagingCycle);
-		  break;
-		}
-
-		if (strcmp(pcch_nB, "fourT") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_fourT;
-		} else if (strcmp(pcch_nB, "twoT") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_twoT;
-		} else if (strcmp(pcch_nB, "oneT") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneT;
-		} else if (strcmp(pcch_nB, "halfT") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_halfT;
-		} else if (strcmp(pcch_nB, "quarterT") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_quarterT;
-		} else if (strcmp(pcch_nB, "oneEighthT") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneEighthT;
-		} else if (strcmp(pcch_nB, "oneSixteenthT") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneSixteenthT;
-		} else if (strcmp(pcch_nB, "oneThirtySecondT") == 0) {
-		  RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneThirtySecondT;
-		} else
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pcch_nB choice: fourT,twoT,oneT,halfT,quarterT,oneighthT,oneSixteenthT,oneThirtySecondT !\n",
-			       RC.config_file_name, i, pcch_defaultPagingCycle);
-
-
-
-		switch (bcch_modificationPeriodCoeff) {
-		case 2:
-		  RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n2;
-		  break;
-
-		case 4:
-		  RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n4;
-		  break;
-
-		case 8:
-		  RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n8;
-		  break;
-
-		case 16:
-		  RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n16;
-		  break;
-
-		default:
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for bcch_modificationPeriodCoeff choice: 2,4,8,16",
-			       RC.config_file_name, i, bcch_modificationPeriodCoeff);
-
-		  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:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm1;
-		  break;
-		case 2:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm2;
-		  break;
-		case 3:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm3;
-		  break;
-		case 4:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm4;
-		  break;
-		case 5:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm5;
-		  break;
-		case 6:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm6;
-		  break;
-		case 7:
-		  RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm7;
-		  break;
-		default:
-		  AssertFatal (0,
-			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TransmissionMode choice: 1,2,3,4,5,6,7",
-			       RC.config_file_name, i, ue_TransmissionMode);
-		  break;
-		}
-
-        RRC_CONFIGURATION_REQ (msg_p).ue_multiple_max[j] = ue_multiple_max;
-
-        switch (N_RB_DL) {
-        case 25:
-          if ((ue_multiple_max < 1) || (ue_multiple_max > 4))
-            AssertFatal (0,
-                     "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_multiple_max choice: 1..4!\n",
-                     RC.config_file_name, i, ue_multiple_max);
-          break;
-        case 50:
-          if ((ue_multiple_max < 1) || (ue_multiple_max > 8))
-            AssertFatal (0,
-                     "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_multiple_max choice: 1..8!\n",
-                     RC.config_file_name, i, ue_multiple_max);
-          break;
-        case 100:
-          if ((ue_multiple_max < 1) || (ue_multiple_max > 16))
-            AssertFatal (0,
-                     "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_multiple_max choice: 1..16!\n",
-                     RC.config_file_name, i, ue_multiple_max);
-          break;
-        default:
-          AssertFatal (0,
-                   "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for N_RB_DL choice: 25,50,100 !\n",
-                   RC.config_file_name, i, N_RB_DL);
-          break;
-        }
+            if (!pusch_enable64QAM)
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
+                           RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_ENABLE64QAM);
+            else if (strcmp(pusch_enable64QAM, "ENABLE") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_enable64QAM[j] = TRUE;
+            }  else if (strcmp(pusch_enable64QAM, "DISABLE") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_enable64QAM[j] = FALSE;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_enable64QAM choice: ENABLE,DISABLE!\n",
+                           RC.config_file_name, i, pusch_enable64QAM);
 
-		//TTN - for D2D
-		//SIB18
-		if (strcmp(rxPool_sc_CP_Len,"normal")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_CP_Len[j] = SL_CP_Len_r12_normal;
-		} else if (strcmp(rxPool_sc_CP_Len,"extended")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_CP_Len[j] = SL_CP_Len_r12_extended;
-		} else
-		   AssertFatal (0,
-		         "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_sc_CP_Len choice: normal,extended!\n",
-		         RC.config_file_name, i, rxPool_sc_CP_Len);
-
-		if (strcmp(rxPool_sc_Period,"sf40")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf40;
-		} else if (strcmp(rxPool_sc_Period,"sf60")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf60;
-		} else if (strcmp(rxPool_sc_Period,"sf70")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf70;
-		} else if (strcmp(rxPool_sc_Period,"sf80")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf80;
-		} else if (strcmp(rxPool_sc_Period,"sf120")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf120;
-		} else if (strcmp(rxPool_sc_Period,"sf140")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf140;
-		} else if (strcmp(rxPool_sc_Period,"sf160")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf160;
-		} else if (strcmp(rxPool_sc_Period,"sf240")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf240;
-		} else if (strcmp(rxPool_sc_Period,"sf280")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf280;
-		} else if (strcmp(rxPool_sc_Period,"sf320")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf320;
-		} else if (strcmp(rxPool_sc_Period,"spare6")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare6;
-		} else if (strcmp(rxPool_sc_Period,"spare5")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare5;
-		} else if (strcmp(rxPool_sc_Period,"spare4")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare4;
-		} else if (strcmp(rxPool_sc_Period,"spare3")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare3;
-		} else if (strcmp(rxPool_sc_Period,"spare2")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare2;
-		} else if (strcmp(rxPool_sc_Period,"spare")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare;
-		} else
-		   AssertFatal (0,
-		         "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_sc_Period choice: sf40,sf60,sf70,sf80,sf120,sf140,sf160,sf240,sf280,sf320,spare6,spare5,spare4,spare3,spare2,spare!\n",
-		         RC.config_file_name, i, rxPool_sc_Period);
-
-		if (strcmp(rxPool_data_CP_Len,"normal")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_data_CP_Len[j] = SL_CP_Len_r12_normal;
-		} else if (strcmp(rxPool_data_CP_Len,"extended")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_data_CP_Len[j] = SL_CP_Len_r12_extended;
-		} else
-		   AssertFatal (0,
-		         "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_data_CP_Len choice: normal,extended!\n",
-		         RC.config_file_name, i, rxPool_data_CP_Len);
-
-		RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_prb_Num[j] = rxPool_ResourceConfig_prb_Num;
-		RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_prb_Start[j] = rxPool_ResourceConfig_prb_Start;
-		RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_prb_End[j] = rxPool_ResourceConfig_prb_End;
-
-		if (strcmp(rxPool_ResourceConfig_offsetIndicator_present,"prNothing")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_NOTHING;
-		} else if (strcmp(rxPool_ResourceConfig_offsetIndicator_present,"prSmall")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_small_r12;
-		} else if (strcmp(rxPool_ResourceConfig_offsetIndicator_present,"prLarge")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_large_r12;
-		} else
-		   AssertFatal (0,
-		         "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_ResourceConfig_offsetIndicator_present choice: prNothing,prSmal,prLarge!\n",
-		         RC.config_file_name, i, rxPool_ResourceConfig_offsetIndicator_present);
-
-		RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_choice[j] = rxPool_ResourceConfig_offsetIndicator_choice;
-
-		if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prNothing")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_NOTHING;
-		} else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs4")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs4_r12;
-		} else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs8")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs8_r12;
-		} else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs12")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs12_r12;
-		} else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs16")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs16_r12;
-		} else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs30")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs30_r12;
-		} else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs40")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs40_r12;
-		} else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs42")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs42_r12;
-		} else
-		   AssertFatal (0,
-		         "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_ResourceConfig_subframeBitmap_present choice: prNothing,prBs4,prBs8,prBs12,prBs16,prBs30,prBs40,prBs42!\n",
-		         RC.config_file_name, i, rxPool_ResourceConfig_subframeBitmap_present);
-
-		RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_choice_bs_buf[j] = rxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
-		RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_choice_bs_size[j] = rxPool_ResourceConfig_subframeBitmap_choice_bs_size;
-		RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused[j] = rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
-
-		//SIB19 - for discRxPool
-		if (strcmp(discRxPool_cp_Len,"normal")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_cp_Len[j] = SL_CP_Len_r12_normal;
-		} else if (strcmp(discRxPool_cp_Len,"extended")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_cp_Len[j] = SL_CP_Len_r12_extended;
-		} else
-		   AssertFatal (0,
-		         "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_cp_Len choice: normal,extended!\n",
-		         RC.config_file_name, i, discRxPool_cp_Len);
-
-
-		if (strcmp(discRxPool_discPeriod,"rf32")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf32;
-		} else if (strcmp(discRxPool_discPeriod,"rf64")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf64;
-		} else if (strcmp(discRxPool_discPeriod,"rf128")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf128;
-		} else if (strcmp(discRxPool_discPeriod,"rf256")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf256;
-		} else if (strcmp(discRxPool_discPeriod,"rf512")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf512;
-		} else if (strcmp(discRxPool_discPeriod,"rf1024")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf1024;
-		} else if (strcmp(discRxPool_discPeriod,"rf16")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf16_v1310;
-		} else if (strcmp(discRxPool_discPeriod,"spare")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_spare;
-		} else
-		   AssertFatal (0,
-		         "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_discPeriod choice: rf32,rf64,rf128,rf512,rf1024,rf16,spare!\n",
-		         RC.config_file_name, i, discRxPool_discPeriod);
-
-
-
-		RRC_CONFIGURATION_REQ (msg_p).discRxPool_numRetx[j] = discRxPool_numRetx;
-		RRC_CONFIGURATION_REQ (msg_p).discRxPool_numRepetition[j] = discRxPool_numRepetition;
-
-
-		RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_prb_Num[j] = discRxPool_ResourceConfig_prb_Num;
-		RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_prb_Start[j] = discRxPool_ResourceConfig_prb_Start;
-		RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_prb_End[j] = discRxPool_ResourceConfig_prb_End;
-
-		if (strcmp(discRxPool_ResourceConfig_offsetIndicator_present,"prNothing")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_NOTHING;
-		} else if (strcmp(discRxPool_ResourceConfig_offsetIndicator_present,"prSmall")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_small_r12;
-		} else if (strcmp(discRxPool_ResourceConfig_offsetIndicator_present,"prLarge")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_large_r12;
-		} else
-		   AssertFatal (0,
-		         "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_ResourceConfig_offsetIndicator_present choice: prNothing,prSmal,prLarge!\n",
-		         RC.config_file_name, i, discRxPool_ResourceConfig_offsetIndicator_present);
-
-		RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_choice[j] = discRxPool_ResourceConfig_offsetIndicator_choice;
-
-		if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prNothing")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_NOTHING;
-		} else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs4")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs4_r12;
-		} else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs8")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs8_r12;
-		} else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs12")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs12_r12;
-		} else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs16")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs16_r12;
-		} else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs30")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs30_r12;
-		} else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs40")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs40_r12;
-		} else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs42")==0) {
-		   RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs42_r12;
-		} else
-		   AssertFatal (0,
-		         "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_ResourceConfig_subframeBitmap_present choice: prNothing,prBs4,prBs8,prBs12,prBs16,prBs30,prBs40,prBs42!\n",
-		         RC.config_file_name, i, discRxPool_ResourceConfig_subframeBitmap_present);
-
-		RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf[j] = discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
-		RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_choice_bs_size[j] = discRxPool_ResourceConfig_subframeBitmap_choice_bs_size;
-		RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused[j] = discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
-
-		//SIB19 - For discRxPoolPS
-      if (strcmp(discRxPoolPS_cp_Len,"normal")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_cp_Len[j] = SL_CP_Len_r12_normal;
-      } else if (strcmp(discRxPoolPS_cp_Len,"extended")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_cp_Len[j] = SL_CP_Len_r12_extended;
-      } else
-         AssertFatal (0,
-               "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_cp_Len choice: normal,extended!\n",
-               RC.config_file_name, i, discRxPoolPS_cp_Len);
-
-
-      if (strcmp(discRxPoolPS_discPeriod,"rf32")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf32;
-      } else if (strcmp(discRxPoolPS_discPeriod,"rf64")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf64;
-      } else if (strcmp(discRxPoolPS_discPeriod,"rf128")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf128;
-      } else if (strcmp(discRxPoolPS_discPeriod,"rf256")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf256;
-      } else if (strcmp(discRxPoolPS_discPeriod,"rf512")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf512;
-      } else if (strcmp(discRxPoolPS_discPeriod,"rf1024")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf1024;
-      } else if (strcmp(discRxPoolPS_discPeriod,"rf16")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf16_v1310;
-      } else if (strcmp(discRxPoolPS_discPeriod,"spare")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_spare;
-      } else
-         AssertFatal (0,
-               "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_discPeriod choice: rf32,rf64,rf128,rf512,rf1024,rf16,spare!\n",
-               RC.config_file_name, i, discRxPoolPS_discPeriod);
-
-
-
-      RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_numRetx[j] = discRxPoolPS_numRetx;
-      RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_numRepetition[j] = discRxPoolPS_numRepetition;
-
-
-      RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_prb_Num[j] = discRxPoolPS_ResourceConfig_prb_Num;
-      RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_prb_Start[j] = discRxPoolPS_ResourceConfig_prb_Start;
-      RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_prb_End[j] = discRxPoolPS_ResourceConfig_prb_End;
-
-      if (strcmp(discRxPoolPS_ResourceConfig_offsetIndicator_present,"prNothing")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_NOTHING;
-      } else if (strcmp(discRxPoolPS_ResourceConfig_offsetIndicator_present,"prSmall")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_small_r12;
-      } else if (strcmp(discRxPoolPS_ResourceConfig_offsetIndicator_present,"prLarge")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_large_r12;
-      } else
-         AssertFatal (0,
-               "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_ResourceConfig_offsetIndicator_present choice: prNothing,prSmal,prLarge!\n",
-               RC.config_file_name, i, discRxPoolPS_ResourceConfig_offsetIndicator_present);
-
-      RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_choice[j] = discRxPoolPS_ResourceConfig_offsetIndicator_choice;
-
-      if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prNothing")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_NOTHING;
-      } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs4")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs4_r12;
-      } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs8")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs8_r12;
-      } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs12")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs12_r12;
-      } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs16")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs16_r12;
-      } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs30")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs30_r12;
-      } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs40")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs40_r12;
-      } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs42")==0) {
-         RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs42_r12;
-      } else
-         AssertFatal (0,
-               "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_ResourceConfig_subframeBitmap_present choice: prNothing,prBs4,prBs8,prBs12,prBs16,prBs30,prBs40,prBs42!\n",
-               RC.config_file_name, i, discRxPoolPS_ResourceConfig_subframeBitmap_present);
-
-      RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf[j] = discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf;
-      RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size[j] = discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size;
-      RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused[j] = discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
-
-
-	      }
-	    }
-	    char srb1path[MAX_OPTNAME_SIZE*2 + 8];
-	    sprintf(srb1path,"%s.%s",enbpath,ENB_CONFIG_STRING_SRB1);
-	    int npar = config_get( SRB1Params,sizeof(SRB1Params)/sizeof(paramdef_t), srb1path);
-	    if (npar == sizeof(SRB1Params)/sizeof(paramdef_t)) {
-	      switch (srb1_max_retx_threshold) {
-	      case 1:
-		rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t1;
-		break;
-
-	      case 2:
-		rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t2;
-		break;
-
-	      case 3:
-		rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t3;
-		break;
-
-	      case 4:
-		rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t4;
-		break;
-
-	      case 6:
-		rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t6;
-		break;
-
-	      case 8:
-		rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t8;
-		break;
-
-	      case 16:
-		rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t16;
-		break;
-
-	      case 32:
-		rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t32;
-		break;
-
-	      default:
-		AssertFatal (0,
-			     "Bad config value when parsing eNB configuration file %s, enb %d  srb1_max_retx_threshold %u!\n",
-			     RC.config_file_name, i, srb1_max_retx_threshold);
-	      }
-
-
-	      switch (srb1_poll_pdu) {
-	      case 4:
-		rrc->srb1_poll_pdu = PollPDU_p4;
-		break;
-
-	      case 8:
-		rrc->srb1_poll_pdu = PollPDU_p8;
-		break;
-
-	      case 16:
-		rrc->srb1_poll_pdu = PollPDU_p16;
-		break;
-
-	      case 32:
-		rrc->srb1_poll_pdu = PollPDU_p32;
-		break;
-
-	      case 64:
-		rrc->srb1_poll_pdu = PollPDU_p64;
-		break;
-
-	      case 128:
-		rrc->srb1_poll_pdu = PollPDU_p128;
-		break;
-
-	      case 256:
-		rrc->srb1_poll_pdu = PollPDU_p256;
-		break;
-
-	      default:
-		if (srb1_poll_pdu >= 10000)
-		  rrc->srb1_poll_pdu = PollPDU_pInfinity;
-		else
-		  AssertFatal (0,
-			       "Bad config value when parsing eNB configuration file %s, enb %d  srb1_poll_pdu %u!\n",
-			       RC.config_file_name, i, srb1_poll_pdu);
-	      }
-
-	      rrc->srb1_poll_byte             = srb1_poll_byte;
-
-	      switch (srb1_poll_byte) {
-	      case 25:
-		rrc->srb1_poll_byte = PollByte_kB25;
-		break;
-
-	      case 50:
-		rrc->srb1_poll_byte = PollByte_kB50;
-		break;
-
-	      case 75:
-		rrc->srb1_poll_byte = PollByte_kB75;
-		break;
-
-	      case 100:
-		rrc->srb1_poll_byte = PollByte_kB100;
-		break;
-
-	      case 125:
-		rrc->srb1_poll_byte = PollByte_kB125;
-		break;
-
-	      case 250:
-		rrc->srb1_poll_byte = PollByte_kB250;
-		break;
-
-	      case 375:
-		rrc->srb1_poll_byte = PollByte_kB375;
-		break;
-
-	      case 500:
-		rrc->srb1_poll_byte = PollByte_kB500;
-		break;
-
-	      case 750:
-		rrc->srb1_poll_byte = PollByte_kB750;
-		break;
-
-	      case 1000:
-		rrc->srb1_poll_byte = PollByte_kB1000;
-		break;
-
-	      case 1250:
-		rrc->srb1_poll_byte = PollByte_kB1250;
-		break;
-
-	      case 1500:
-		rrc->srb1_poll_byte = PollByte_kB1500;
-		break;
-
-	      case 2000:
-		rrc->srb1_poll_byte = PollByte_kB2000;
-		break;
-
-	      case 3000:
-		rrc->srb1_poll_byte = PollByte_kB3000;
-		break;
-
-	      default:
-		if (srb1_poll_byte >= 10000)
-		  rrc->srb1_poll_byte = PollByte_kBinfinity;
-		else
-		  AssertFatal (0,
-			       "Bad config value when parsing eNB configuration file %s, enb %d  srb1_poll_byte %u!\n",
-			       RC.config_file_name, i, srb1_poll_byte);
-	      }
-
-	      if (srb1_timer_poll_retransmit <= 250) {
-		rrc->srb1_timer_poll_retransmit = (srb1_timer_poll_retransmit - 5)/5;
-	      } else if (srb1_timer_poll_retransmit <= 500) {
-		rrc->srb1_timer_poll_retransmit = (srb1_timer_poll_retransmit - 300)/50 + 50;
-	      } else {
-		AssertFatal (0,
-			     "Bad config value when parsing eNB configuration file %s, enb %d  srb1_timer_poll_retransmit %u!\n",
-			     RC.config_file_name, i, srb1_timer_poll_retransmit);
-	      }
-
-	      if (srb1_timer_status_prohibit <= 250) {
-		rrc->srb1_timer_status_prohibit = srb1_timer_status_prohibit/5;
-	      } else if ((srb1_timer_poll_retransmit >= 300) && (srb1_timer_poll_retransmit <= 500)) {
-		rrc->srb1_timer_status_prohibit = (srb1_timer_status_prohibit - 300)/50 + 51;
-	      } else {
-		AssertFatal (0,
-			     "Bad config value when parsing eNB configuration file %s, enb %d  srb1_timer_status_prohibit %u!\n",
-			     RC.config_file_name, i, srb1_timer_status_prohibit);
-	      }
-
-	      switch (srb1_timer_reordering) {
-	      case 0:
-		rrc->srb1_timer_reordering = T_Reordering_ms0;
-		break;
-
-	      case 5:
-		rrc->srb1_timer_reordering = T_Reordering_ms5;
-		break;
-
-	      case 10:
-		rrc->srb1_timer_reordering = T_Reordering_ms10;
-		break;
-
-	      case 15:
-		rrc->srb1_timer_reordering = T_Reordering_ms15;
-		break;
-
-	      case 20:
-		rrc->srb1_timer_reordering = T_Reordering_ms20;
-		break;
-
-	      case 25:
-		rrc->srb1_timer_reordering = T_Reordering_ms25;
-		break;
-
-	      case 30:
-		rrc->srb1_timer_reordering = T_Reordering_ms30;
-		break;
-
-	      case 35:
-		rrc->srb1_timer_reordering = T_Reordering_ms35;
-		break;
-
-	      case 40:
-		rrc->srb1_timer_reordering = T_Reordering_ms40;
-		break;
-
-	      case 45:
-		rrc->srb1_timer_reordering = T_Reordering_ms45;
-		break;
-
-	      case 50:
-		rrc->srb1_timer_reordering = T_Reordering_ms50;
-		break;
-
-	      case 55:
-		rrc->srb1_timer_reordering = T_Reordering_ms55;
-		break;
-
-	      case 60:
-		rrc->srb1_timer_reordering = T_Reordering_ms60;
-		break;
-
-	      case 65:
-		rrc->srb1_timer_reordering = T_Reordering_ms65;
-		break;
-
-	      case 70:
-		rrc->srb1_timer_reordering = T_Reordering_ms70;
-		break;
-
-	      case 75:
-		rrc->srb1_timer_reordering = T_Reordering_ms75;
-		break;
-
-	      case 80:
-		rrc->srb1_timer_reordering = T_Reordering_ms80;
-		break;
-
-	      case 85:
-		rrc->srb1_timer_reordering = T_Reordering_ms85;
-		break;
-
-	      case 90:
-		rrc->srb1_timer_reordering = T_Reordering_ms90;
-		break;
-
-	      case 95:
-		rrc->srb1_timer_reordering = T_Reordering_ms95;
-		break;
-
-	      case 100:
-		rrc->srb1_timer_reordering = T_Reordering_ms100;
-		break;
-
-	      case 110:
-		rrc->srb1_timer_reordering = T_Reordering_ms110;
-		break;
-
-	      case 120:
-		rrc->srb1_timer_reordering = T_Reordering_ms120;
-		break;
-
-	      case 130:
-		rrc->srb1_timer_reordering = T_Reordering_ms130;
-		break;
-
-	      case 140:
-		rrc->srb1_timer_reordering = T_Reordering_ms140;
-		break;
-
-	      case 150:
-		rrc->srb1_timer_reordering = T_Reordering_ms150;
-		break;
-
-	      case 160:
-		rrc->srb1_timer_reordering = T_Reordering_ms160;
-		break;
-
-	      case 170:
-		rrc->srb1_timer_reordering = T_Reordering_ms170;
-		break;
-
-	      case 180:
-		rrc->srb1_timer_reordering = T_Reordering_ms180;
-		break;
-
-	      case 190:
-		rrc->srb1_timer_reordering = T_Reordering_ms190;
-		break;
-
-	      case 200:
-		rrc->srb1_timer_reordering = T_Reordering_ms200;
-		break;
-
-	      default:
-		AssertFatal (0,
-			     "Bad config value when parsing eNB configuration file %s, enb %d  srb1_timer_reordering %u!\n",
-			     RC.config_file_name, i, srb1_timer_reordering);
-	      }
-
-	    } else {
-	      rrc->srb1_timer_poll_retransmit = T_PollRetransmit_ms80;
-	      rrc->srb1_timer_reordering      = T_Reordering_ms35;
-	      rrc->srb1_timer_status_prohibit = T_StatusProhibit_ms0;
-	      rrc->srb1_poll_pdu              = PollPDU_p4;
-	      rrc->srb1_poll_byte             = PollByte_kBinfinity;
-	      rrc->srb1_max_retx_threshold    = UL_AM_RLC__maxRetxThreshold_t8;
-	    }
-
-	    /*
-	    // Network Controller 
-	    subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_NETWORK_CONTROLLER_CONFIG);
-
-	    if (subsetting != NULL) {
-	      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" );
-		}
-
-		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);
-	      }
-	    }
-	    */
-	    break;
-	}
-      
-    }
-  }
-return 0;
-}
+            if (!pusch_groupHoppingEnabled)
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
+                           RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_GROUP_HOPPING_EN);
+            else if (strcmp(pusch_groupHoppingEnabled, "ENABLE") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_groupHoppingEnabled[j] = TRUE;
+            }  else if (strcmp(pusch_groupHoppingEnabled, "DISABLE") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_groupHoppingEnabled[j] = FALSE;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_groupHoppingEnabled choice: ENABLE,DISABLE!\n",
+                           RC.config_file_name, i, pusch_groupHoppingEnabled);
 
-int RCconfig_gtpu(void ) {
+            RRC_CONFIGURATION_REQ (msg_p).pusch_groupAssignment[j] = pusch_groupAssignment;
 
-  int               num_enbs                      = 0;
+            if ((pusch_groupAssignment<0)||(pusch_groupAssignment>29))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_groupAssignment choice: 0..29!\n",
+                           RC.config_file_name, i, pusch_groupAssignment);
 
+            if (!pusch_sequenceHoppingEnabled)
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d define %s: ENABLE,DISABLE!\n",
+                           RC.config_file_name, i, ENB_CONFIG_STRING_PUSCH_SEQUENCE_HOPPING_EN);
+            else if (strcmp(pusch_sequenceHoppingEnabled, "ENABLE") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_sequenceHoppingEnabled[j] = TRUE;
+            }  else if (strcmp(pusch_sequenceHoppingEnabled, "DISABLE") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_sequenceHoppingEnabled[j] = FALSE;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pusch_sequenceHoppingEnabled choice: ENABLE,DISABLE!\n",
+                           RC.config_file_name, i, pusch_sequenceHoppingEnabled);
 
+            RRC_CONFIGURATION_REQ (msg_p).pusch_nDMRS1[j] = pusch_nDMRS1;  //cyclic_shift in RRC!
 
-  char*             enb_interface_name_for_S1U    = NULL;
-  char*             enb_ipv4_address_for_S1U      = NULL;
-  uint32_t          enb_port_for_S1U              = 0;
-  char             *address                       = NULL;
-  char             *cidr                          = NULL;
-  char gtpupath[MAX_OPTNAME_SIZE*2 + 8];
-	  
+            if ((pusch_nDMRS1 <0) || (pusch_nDMRS1>7))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_nDMRS1 choice: 0..7!\n",
+                           RC.config_file_name, i, pusch_nDMRS1);
+
+            if (strcmp(phich_duration,"NORMAL")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = PHICH_Config__phich_Duration_normal;
+            } else if (strcmp(phich_duration,"EXTENDED")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = PHICH_Config__phich_Duration_extended;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_duration choice: NORMAL,EXTENDED!\n",
+                           RC.config_file_name, i, phich_duration);
+
+            if (strcmp(phich_resource,"ONESIXTH")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_oneSixth ;
+            } else if (strcmp(phich_resource,"HALF")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_half;
+            } else if (strcmp(phich_resource,"ONE")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_one;
+            } else if (strcmp(phich_resource,"TWO")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_two;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_resource choice: ONESIXTH,HALF,ONE,TWO!\n",
+                           RC.config_file_name, i, phich_resource);
+
+            printf("phich.resource %ld (%s), phich.duration %ld (%s)\n",
+                   RRC_CONFIGURATION_REQ (msg_p).phich_resource[j],phich_resource,
+                   RRC_CONFIGURATION_REQ (msg_p).phich_duration[j],phich_duration);
+
+            if (strcmp(srs_enable, "ENABLE") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] = TRUE;
+            } else if (strcmp(srs_enable, "DISABLE") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] = FALSE;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n",
+                           RC.config_file_name, i, srs_enable);
+
+            if (RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] == TRUE) {
+              RRC_CONFIGURATION_REQ (msg_p).srs_BandwidthConfig[j] = srs_BandwidthConfig;
+
+              if ((srs_BandwidthConfig < 0) || (srs_BandwidthConfig >7))
+                AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value %d for srs_BandwidthConfig choice: 0...7\n",
+                             RC.config_file_name, i, srs_BandwidthConfig);
+
+              RRC_CONFIGURATION_REQ (msg_p).srs_SubframeConfig[j] = srs_SubframeConfig;
+
+              if ((srs_SubframeConfig<0) || (srs_SubframeConfig>15))
+                AssertFatal (0,
+                             "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for srs_SubframeConfig choice: 0..15 !\n",
+                             RC.config_file_name, i, srs_SubframeConfig);
+
+              if (strcmp(srs_ackNackST, "ENABLE") == 0) {
+                RRC_CONFIGURATION_REQ (msg_p).srs_ackNackST[j] = TRUE;
+              } else if (strcmp(srs_ackNackST, "DISABLE") == 0) {
+                RRC_CONFIGURATION_REQ (msg_p).srs_ackNackST[j] = FALSE;
+              } else
+                AssertFatal (0,
+                             "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_BandwidthConfig choice: ENABLE,DISABLE !\n",
+                             RC.config_file_name, i, srs_ackNackST);
+
+              if (strcmp(srs_MaxUpPts, "ENABLE") == 0) {
+                RRC_CONFIGURATION_REQ (msg_p).srs_MaxUpPts[j] = TRUE;
+              } else if (strcmp(srs_MaxUpPts, "DISABLE") == 0) {
+                RRC_CONFIGURATION_REQ (msg_p).srs_MaxUpPts[j] = FALSE;
+              } else
+                AssertFatal (0,
+                             "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for srs_MaxUpPts choice: ENABLE,DISABLE !\n",
+                             RC.config_file_name, i, srs_MaxUpPts);
+            }
 
-  paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
-  
-  paramdef_t GTPUParams[]  = GTPUPARAMS_DESC;
-  LOG_I(GTPU,"Configuring GTPu\n");
+            RRC_CONFIGURATION_REQ (msg_p).pusch_p0_Nominal[j] = pusch_p0_Nominal;
 
-/* get number of active eNodeBs */
-  config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL); 
-  num_enbs = ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt;
-  AssertFatal (num_enbs >0,
-   	       "Failed to parse config file no active eNodeBs in %s \n", ENB_CONFIG_STRING_ACTIVE_ENBS);
+            if ((pusch_p0_Nominal<-126) || (pusch_p0_Nominal>24))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pusch_p0_Nominal choice: -126..24 !\n",
+                           RC.config_file_name, i, pusch_p0_Nominal);
 
+#if (RRC_VERSION <= MAKE_VERSION(12, 0, 0))
 
-  sprintf(gtpupath,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,0,ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
-  config_get( GTPUParams,sizeof(GTPUParams)/sizeof(paramdef_t),gtpupath);    
+            if (strcmp(pusch_alpha,"AL0")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al0;
+            } else if (strcmp(pusch_alpha,"AL04")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al04;
+            } else if (strcmp(pusch_alpha,"AL05")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al05;
+            } else if (strcmp(pusch_alpha,"AL06")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al06;
+            } else if (strcmp(pusch_alpha,"AL07")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al07;
+            } else if (strcmp(pusch_alpha,"AL08")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al08;
+            } else if (strcmp(pusch_alpha,"AL09")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al09;
+            } else if (strcmp(pusch_alpha,"AL1")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = UplinkPowerControlCommon__alpha_al1;
+            }
 
+#endif
+#if (RRC_VERSION >= MAKE_VERSION(12, 0, 0))
 
+            if (strcmp(pusch_alpha,"AL0")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al0;
+            } else if (strcmp(pusch_alpha,"AL04")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al04;
+            } else if (strcmp(pusch_alpha,"AL05")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al05;
+            } else if (strcmp(pusch_alpha,"AL06")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al06;
+            } else if (strcmp(pusch_alpha,"AL07")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al07;
+            } else if (strcmp(pusch_alpha,"AL08")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al08;
+            } else if (strcmp(pusch_alpha,"AL09")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al09;
+            } else if (strcmp(pusch_alpha,"AL1")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pusch_alpha[j] = Alpha_r12_al1;
+            }
 
-	  cidr = enb_ipv4_address_for_S1U;
-	  address = strtok(cidr, "/");
-	  
-	  if (address) {
-	    IPV4_STR_ADDR_TO_INT_NWBO ( address, RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" );
+#endif
+            else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_Alpha choice: AL0,AL04,AL05,AL06,AL07,AL08,AL09,AL1!\n",
+                           RC.config_file_name, i, pusch_alpha);
 
-	    LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up);
+            RRC_CONFIGURATION_REQ (msg_p).pucch_p0_Nominal[j] = pucch_p0_Nominal;
 
-	  }
+            if ((pucch_p0_Nominal<-127) || (pucch_p0_Nominal>-96))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pucch_p0_Nominal choice: -127..-96 !\n",
+                           RC.config_file_name, i, pucch_p0_Nominal);
 
-	  RC.gtpv1u_data_g->enb_port_for_S1u_S12_S4_up = enb_port_for_S1U;
-return 0;
-}
+            RRC_CONFIGURATION_REQ (msg_p).msg3_delta_Preamble[j] = msg3_delta_Preamble;
 
+            if ((msg3_delta_Preamble<-1) || (msg3_delta_Preamble>6))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for msg3_delta_Preamble choice: -1..6 !\n",
+                           RC.config_file_name, i, msg3_delta_Preamble);
+
+            if (strcmp(pucch_deltaF_Format1,"deltaF_2")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF_2;
+            } else if (strcmp(pucch_deltaF_Format1,"deltaF0")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF0;
+            } else if (strcmp(pucch_deltaF_Format1,"deltaF2")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF2;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1 choice: deltaF_2,dltaF0,deltaF2!\n",
+                           RC.config_file_name, i, pucch_deltaF_Format1);
+
+            if (strcmp(pucch_deltaF_Format1b,"deltaF1")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF1;
+            } else if (strcmp(pucch_deltaF_Format1b,"deltaF3")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF3;
+            } else if (strcmp(pucch_deltaF_Format1b,"deltaF5")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format1b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF5;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format1b choice: deltaF1,dltaF3,deltaF5!\n",
+                           RC.config_file_name, i, pucch_deltaF_Format1b);
+
+            if (strcmp(pucch_deltaF_Format2,"deltaF_2")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF_2;
+            } else if (strcmp(pucch_deltaF_Format2,"deltaF0")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF0;
+            } else if (strcmp(pucch_deltaF_Format2,"deltaF1")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF1;
+            } else if (strcmp(pucch_deltaF_Format2,"deltaF2")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF2;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2 choice: deltaF_2,dltaF0,deltaF1,deltaF2!\n",
+                           RC.config_file_name, i, pucch_deltaF_Format2);
+
+            if (strcmp(pucch_deltaF_Format2a,"deltaF_2")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF_2;
+            } else if (strcmp(pucch_deltaF_Format2a,"deltaF0")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF0;
+            } else if (strcmp(pucch_deltaF_Format2a,"deltaF2")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2a[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF2;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2a choice: deltaF_2,dltaF0,deltaF2!\n",
+                           RC.config_file_name, i, pucch_deltaF_Format2a);
+
+            if (strcmp(pucch_deltaF_Format2b,"deltaF_2")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF_2;
+            } else if (strcmp(pucch_deltaF_Format2b,"deltaF0")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF0;
+            } else if (strcmp(pucch_deltaF_Format2b,"deltaF2")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).pucch_deltaF_Format2b[j] = DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF2;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for pucch_deltaF_Format2b choice: deltaF_2,dltaF0,deltaF2!\n",
+                           RC.config_file_name, i, pucch_deltaF_Format2b);
 
-int RCconfig_S1(MessageDef *msg_p, uint32_t i) {
+            RRC_CONFIGURATION_REQ (msg_p).rach_numberOfRA_Preambles[j] = (rach_numberOfRA_Preambles/4)-1;
 
-  int               j,k                           = 0;
-  
-  
-  int enb_id;
+            if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>64) || ((rach_numberOfRA_Preambles&3)!=0))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_numberOfRA_Preambles choice: 4,8,12,...,64!\n",
+                           RC.config_file_name, i, rach_numberOfRA_Preambles);
+
+            if (strcmp(rach_preamblesGroupAConfig, "ENABLE") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).rach_preamblesGroupAConfig[j] = TRUE;
+              RRC_CONFIGURATION_REQ (msg_p).rach_sizeOfRA_PreamblesGroupA[j] = (rach_sizeOfRA_PreamblesGroupA/4)-1;
+
+              if ((rach_numberOfRA_Preambles <4) || (rach_numberOfRA_Preambles>60) || ((rach_numberOfRA_Preambles&3)!=0))
+                AssertFatal (0,
+                             "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_sizeOfRA_PreamblesGroupA choice: 4,8,12,...,60!\n",
+                             RC.config_file_name, i, rach_sizeOfRA_PreamblesGroupA);
+
+              switch (rach_messageSizeGroupA) {
+                case 56:
+                  RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b56;
+                  break;
+
+                case 144:
+                  RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b144;
+                  break;
+
+                case 208:
+                  RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b208;
+                  break;
+
+                case 256:
+                  RRC_CONFIGURATION_REQ (msg_p).rach_messageSizeGroupA[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messageSizeGroupA_b256;
+                  break;
+
+                default:
+                  AssertFatal (0,
+                               "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_messageSizeGroupA choice: 56,144,208,256!\n",
+                               RC.config_file_name, i, rach_messageSizeGroupA);
+                  break;
+              }
 
-  int32_t     my_int;
+              if (strcmp(rach_messagePowerOffsetGroupB,"minusinfinity")==0) {
+                RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_minusinfinity;
+              } else if (strcmp(rach_messagePowerOffsetGroupB,"dB0")==0) {
+                RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB0;
+              } else if (strcmp(rach_messagePowerOffsetGroupB,"dB5")==0) {
+                RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB5;
+              } else if (strcmp(rach_messagePowerOffsetGroupB,"dB8")==0) {
+                RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB8;
+              } else if (strcmp(rach_messagePowerOffsetGroupB,"dB10")==0) {
+                RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB10;
+              } else if (strcmp(rach_messagePowerOffsetGroupB,"dB12")==0) {
+                RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB12;
+              } else if (strcmp(rach_messagePowerOffsetGroupB,"dB15")==0) {
+                RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB15;
+              } else if (strcmp(rach_messagePowerOffsetGroupB,"dB18")==0) {
+                RRC_CONFIGURATION_REQ (msg_p).rach_messagePowerOffsetGroupB[j] = RACH_ConfigCommon__preambleInfo__preamblesGroupAConfig__messagePowerOffsetGroupB_dB18;
+              } else
+                AssertFatal (0,
+                             "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_messagePowerOffsetGroupB choice: minusinfinity,dB0,dB5,dB8,dB10,dB12,dB15,dB18!\n",
+                             RC.config_file_name, i, rach_messagePowerOffsetGroupB);
+            } else if (strcmp(rach_preamblesGroupAConfig, "DISABLE") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).rach_preamblesGroupAConfig[j] = FALSE;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rach_preamblesGroupAConfig choice: ENABLE,DISABLE !\n",
+                           RC.config_file_name, i, rach_preamblesGroupAConfig);
 
+            RRC_CONFIGURATION_REQ (msg_p).rach_preambleInitialReceivedTargetPower[j] = (rach_preambleInitialReceivedTargetPower+120)/2;
 
+            if ((rach_preambleInitialReceivedTargetPower<-120) || (rach_preambleInitialReceivedTargetPower>-90) || ((rach_preambleInitialReceivedTargetPower&1)!=0))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleInitialReceivedTargetPower choice: -120,-118,...,-90 !\n",
+                           RC.config_file_name, i, rach_preambleInitialReceivedTargetPower);
 
-  const char*       active_enb[MAX_ENB];
+            RRC_CONFIGURATION_REQ (msg_p).rach_powerRampingStep[j] = rach_powerRampingStep/2;
 
+            if ((rach_powerRampingStep<0) || (rach_powerRampingStep>6) || ((rach_powerRampingStep&1)!=0))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_powerRampingStep choice: 0,2,4,6 !\n",
+                           RC.config_file_name, i, rach_powerRampingStep);
 
-  char             *address                       = NULL;
-  char             *cidr                          = NULL;
+            switch (rach_preambleTransMax) {
+#if (RRC_VERSION < MAKE_VERSION(14, 0, 0))
 
+              case 3:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n3;
+                break;
 
-  // for no gcc warnings 
+              case 4:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n4;
+                break;
 
-  (void)my_int;
+              case 5:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n5;
+                break;
 
-  memset((char*)active_enb,     0 , MAX_ENB * sizeof(char*));
+              case 6:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n6;
+                break;
 
-  paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
-  
-  paramdef_t ENBParams[]  = ENBPARAMS_DESC;
-  paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0};
+              case 7:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n7;
+                break;
 
-/* get global parameters, defined outside any section in the config file */
-  
-  config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
-  
+              case 8:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n8;
+                break;
 
+              case 10:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n10;
+                break;
 
-    AssertFatal (i<ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt,
-		 "Failed to parse config file %s, %uth attribute %s \n",
-		 RC.config_file_name, i, ENB_CONFIG_STRING_ACTIVE_ENBS);
-    
-  
-  if (ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt>0) {
-    // Output a list of all eNBs.
-       config_getlist( &ENBParamList,ENBParams,sizeof(ENBParams)/sizeof(paramdef_t),NULL); 
-    
-    
-      
-      
-    
-    if (ENBParamList.numelt > 0) {
-      for (k = 0; k < ENBParamList.numelt; k++) {
-	if (ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr == NULL) {
-	  // Calculate a default eNB ID
-
-  	  if (EPC_MODE_ENABLED) {
-  		uint32_t hash;
-  		
-  		hash = s1ap_generate_eNB_id ();
-  		enb_id = k + (hash & 0xFFFF8);
-  	  } else {
-  		enb_id = k;
-  	  }
-  	} else {
-  	    enb_id = *(ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr);
-  	}
-	
-	
-	// 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 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];
-	    
-	    S1AP_REGISTER_ENB_REQ (msg_p).eNB_id = enb_id;
-	    
-	    if (strcmp(*(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr), "CELL_MACRO_ENB") == 0) {
-	      S1AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_MACRO_ENB;
-	    } else  if (strcmp(*(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr), "CELL_HOME_ENB") == 0) {
-	      S1AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_HOME_ENB;
-	    } else {
-	      AssertFatal (0,
-			   "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n",
-			   RC.config_file_name, i, *(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr));
-	    }
-	    
-	    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);
-	    
-	    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;
-
-	    for (int l = 0; l < S1ParamList.numelt; l++) {
-
-	      S1AP_REGISTER_ENB_REQ (msg_p).nb_mme += 1;
-
-	      strcpy(S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4_address,*(S1ParamList.paramarray[l][ENB_MME_IPV4_ADDRESS_IDX].strptr));
-	      strcpy(S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6_address,*(S1ParamList.paramarray[l][ENB_MME_IPV6_ADDRESS_IDX].strptr));
-
-
-	      if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv4") == 0) {
-		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1;
-	      } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv6") == 0) {
-		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1;
-	      } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "no") == 0) {
-		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1;
-		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1;
-	      }
-	    }
-
-	  
-	    // SCTP SETTING
-	    S1AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = SCTP_OUT_STREAMS;
-	    S1AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams  = SCTP_IN_STREAMS;
-            if (EPC_MODE_ENABLED) {
-	      sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_SCTP_CONFIG);
-              config_get( SCTPParams,sizeof(SCTPParams)/sizeof(paramdef_t),aprefix); 
-              S1AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = (uint16_t)*(SCTPParams[ENB_SCTP_INSTREAMS_IDX].uptr);
-              S1AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = (uint16_t)*(SCTPParams[ENB_SCTP_OUTSTREAMS_IDX].uptr);
-              }
+              case 20:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n20;
+                break;
 
-            sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
-	    // NETWORK_INTERFACES
-            config_get( NETParams,sizeof(NETParams)/sizeof(paramdef_t),aprefix); 
+              case 50:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n50;
+                break;
 
-		//		S1AP_REGISTER_ENB_REQ (msg_p).enb_interface_name_for_S1U = strdup(enb_interface_name_for_S1U);
-		cidr = *(NETParams[ENB_IPV4_ADDRESS_FOR_S1_MME_IDX].strptr);
-		address = strtok(cidr, "/");
+              case 100:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n100;
+                break;
 
-		S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv6 = 0;
-		S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv4 = 1;
+              case 200:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n200;
+                break;
+#else
 
-		strcpy(S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv4_address, address);
+              case 3:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n3;
+                break;
 
-	    break;
-	  }
-	}
-      }
-    }
-  }
-return 0;
-}
+              case 4:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n4;
+                break;
 
-int RCconfig_X2(MessageDef *msg_p, uint32_t i)
-{
-  int   j, k, l;
+              case 5:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n5;
+                break;
 
-  int   enb_id;
+              case 6:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n6;
+                break;
 
-  char *address = NULL;
-  char *cidr    = NULL;
+              case 7:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n7;
+                break;
 
-  paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
-  paramdef_t ENBParams[]  = ENBPARAMS_DESC;
-  paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0};
+              case 8:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n8;
+                break;
 
-  /* get global parameters, defined outside any section in the config file */
+              case 10:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n10;
+                break;
+
+              case 20:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n20;
+                break;
+
+              case 50:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n50;
+                break;
+
+              case 100:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n100;
+                break;
+
+              case 200:
+                RRC_CONFIGURATION_REQ (msg_p).rach_preambleTransMax[j] =  PreambleTransMax_n200;
+                break;
+#endif
+
+              default:
+                AssertFatal (0,
+                             "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_preambleTransMax choice: 3,4,5,6,7,8,10,20,50,100,200!\n",
+                             RC.config_file_name, i, rach_preambleTransMax);
+                break;
+            }
+
+            RRC_CONFIGURATION_REQ (msg_p).rach_raResponseWindowSize[j] =  (rach_raResponseWindowSize==10)?7:rach_raResponseWindowSize-2;
+
+            if ((rach_raResponseWindowSize<0)||(rach_raResponseWindowSize==9)||(rach_raResponseWindowSize>10))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_raResponseWindowSize choice: 2,3,4,5,6,7,8,10!\n",
+                           RC.config_file_name, i, rach_preambleTransMax);
+
+            RRC_CONFIGURATION_REQ (msg_p).rach_macContentionResolutionTimer[j] = (rach_macContentionResolutionTimer/8)-1;
+
+            if ((rach_macContentionResolutionTimer<8) || (rach_macContentionResolutionTimer>64) || ((rach_macContentionResolutionTimer&7)!=0))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_macContentionResolutionTimer choice: 8,16,...,56,64!\n",
+                           RC.config_file_name, i, rach_preambleTransMax);
+
+            RRC_CONFIGURATION_REQ (msg_p).rach_maxHARQ_Msg3Tx[j] = rach_maxHARQ_Msg3Tx;
+
+            if ((rach_maxHARQ_Msg3Tx<0) || (rach_maxHARQ_Msg3Tx>8))
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for rach_maxHARQ_Msg3Tx choice: 1..8!\n",
+                           RC.config_file_name, i, rach_preambleTransMax);
+
+            switch (pcch_defaultPagingCycle) {
+              case 32:
+                RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf32;
+                break;
+
+              case 64:
+                RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf64;
+                break;
+
+              case 128:
+                RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf128;
+                break;
+
+              case 256:
+                RRC_CONFIGURATION_REQ (msg_p).pcch_defaultPagingCycle[j] = PCCH_Config__defaultPagingCycle_rf256;
+                break;
+
+              default:
+                AssertFatal (0,
+                             "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pcch_defaultPagingCycle choice: 32,64,128,256!\n",
+                             RC.config_file_name, i, pcch_defaultPagingCycle);
+                break;
+            }
+
+            if (strcmp(pcch_nB, "fourT") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_fourT;
+            } else if (strcmp(pcch_nB, "twoT") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_twoT;
+            } else if (strcmp(pcch_nB, "oneT") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneT;
+            } else if (strcmp(pcch_nB, "halfT") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_halfT;
+            } else if (strcmp(pcch_nB, "quarterT") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_quarterT;
+            } else if (strcmp(pcch_nB, "oneEighthT") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneEighthT;
+            } else if (strcmp(pcch_nB, "oneSixteenthT") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneSixteenthT;
+            } else if (strcmp(pcch_nB, "oneThirtySecondT") == 0) {
+              RRC_CONFIGURATION_REQ (msg_p).pcch_nB[j] = PCCH_Config__nB_oneThirtySecondT;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for pcch_nB choice: fourT,twoT,oneT,halfT,quarterT,oneighthT,oneSixteenthT,oneThirtySecondT !\n",
+                           RC.config_file_name, i, pcch_defaultPagingCycle);
+
+            switch (bcch_modificationPeriodCoeff) {
+              case 2:
+                RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n2;
+                break;
+
+              case 4:
+                RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n4;
+                break;
+
+              case 8:
+                RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n8;
+                break;
+
+              case 16:
+                RRC_CONFIGURATION_REQ (msg_p).bcch_modificationPeriodCoeff[j] = BCCH_Config__modificationPeriodCoeff_n16;
+                break;
+
+              default:
+                AssertFatal (0,
+                             "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for bcch_modificationPeriodCoeff choice: 2,4,8,16",
+                             RC.config_file_name, i, bcch_modificationPeriodCoeff);
+                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:
+                RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm1;
+                break;
+
+              case 2:
+                RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm2;
+                break;
+
+              case 3:
+                RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm3;
+                break;
+
+              case 4:
+                RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm4;
+                break;
+
+              case 5:
+                RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm5;
+                break;
+
+              case 6:
+                RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm6;
+                break;
+
+              case 7:
+                RRC_CONFIGURATION_REQ (msg_p).ue_TransmissionMode[j] = AntennaInfoDedicated__transmissionMode_tm7;
+                break;
+
+              default:
+                AssertFatal (0,
+                             "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_TransmissionMode choice: 1,2,3,4,5,6,7",
+                             RC.config_file_name, i, ue_TransmissionMode);
+                break;
+            }
+
+            RRC_CONFIGURATION_REQ (msg_p).ue_multiple_max[j] = ue_multiple_max;
+
+            switch (N_RB_DL) {
+              case 25:
+                if ((ue_multiple_max < 1) || (ue_multiple_max > 4))
+                  AssertFatal (0,
+                               "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_multiple_max choice: 1..4!\n",
+                               RC.config_file_name, i, ue_multiple_max);
+
+                break;
+
+              case 50:
+                if ((ue_multiple_max < 1) || (ue_multiple_max > 8))
+                  AssertFatal (0,
+                               "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_multiple_max choice: 1..8!\n",
+                               RC.config_file_name, i, ue_multiple_max);
+
+                break;
+
+              case 100:
+                if ((ue_multiple_max < 1) || (ue_multiple_max > 16))
+                  AssertFatal (0,
+                               "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for ue_multiple_max choice: 1..16!\n",
+                               RC.config_file_name, i, ue_multiple_max);
+
+                break;
+
+              default:
+                AssertFatal (0,
+                             "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for N_RB_DL choice: 25,50,100 !\n",
+                             RC.config_file_name, i, N_RB_DL);
+                break;
+            }
+
+            //TTN - for D2D
+            //SIB18
+            if (strcmp(rxPool_sc_CP_Len,"normal")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_CP_Len[j] = SL_CP_Len_r12_normal;
+            } else if (strcmp(rxPool_sc_CP_Len,"extended")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_CP_Len[j] = SL_CP_Len_r12_extended;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_sc_CP_Len choice: normal,extended!\n",
+                           RC.config_file_name, i, rxPool_sc_CP_Len);
+
+            if (strcmp(rxPool_sc_Period,"sf40")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf40;
+            } else if (strcmp(rxPool_sc_Period,"sf60")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf60;
+            } else if (strcmp(rxPool_sc_Period,"sf70")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf70;
+            } else if (strcmp(rxPool_sc_Period,"sf80")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf80;
+            } else if (strcmp(rxPool_sc_Period,"sf120")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf120;
+            } else if (strcmp(rxPool_sc_Period,"sf140")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf140;
+            } else if (strcmp(rxPool_sc_Period,"sf160")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf160;
+            } else if (strcmp(rxPool_sc_Period,"sf240")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf240;
+            } else if (strcmp(rxPool_sc_Period,"sf280")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf280;
+            } else if (strcmp(rxPool_sc_Period,"sf320")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_sf320;
+            } else if (strcmp(rxPool_sc_Period,"spare6")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare6;
+            } else if (strcmp(rxPool_sc_Period,"spare5")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare5;
+            } else if (strcmp(rxPool_sc_Period,"spare4")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare4;
+            } else if (strcmp(rxPool_sc_Period,"spare3")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare3;
+            } else if (strcmp(rxPool_sc_Period,"spare2")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare2;
+            } else if (strcmp(rxPool_sc_Period,"spare")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_sc_Period[j] = SL_PeriodComm_r12_spare;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_sc_Period choice: sf40,sf60,sf70,sf80,sf120,sf140,sf160,sf240,sf280,sf320,spare6,spare5,spare4,spare3,spare2,spare!\n",
+                           RC.config_file_name, i, rxPool_sc_Period);
+
+            if (strcmp(rxPool_data_CP_Len,"normal")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_data_CP_Len[j] = SL_CP_Len_r12_normal;
+            } else if (strcmp(rxPool_data_CP_Len,"extended")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_data_CP_Len[j] = SL_CP_Len_r12_extended;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_data_CP_Len choice: normal,extended!\n",
+                           RC.config_file_name, i, rxPool_data_CP_Len);
+
+            RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_prb_Num[j] = rxPool_ResourceConfig_prb_Num;
+            RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_prb_Start[j] = rxPool_ResourceConfig_prb_Start;
+            RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_prb_End[j] = rxPool_ResourceConfig_prb_End;
+
+            if (strcmp(rxPool_ResourceConfig_offsetIndicator_present,"prNothing")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_NOTHING;
+            } else if (strcmp(rxPool_ResourceConfig_offsetIndicator_present,"prSmall")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_small_r12;
+            } else if (strcmp(rxPool_ResourceConfig_offsetIndicator_present,"prLarge")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_large_r12;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_ResourceConfig_offsetIndicator_present choice: prNothing,prSmal,prLarge!\n",
+                           RC.config_file_name, i, rxPool_ResourceConfig_offsetIndicator_present);
+
+            RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_offsetIndicator_choice[j] = rxPool_ResourceConfig_offsetIndicator_choice;
+
+            if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prNothing")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_NOTHING;
+            } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs4")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs4_r12;
+            } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs8")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs8_r12;
+            } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs12")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs12_r12;
+            } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs16")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs16_r12;
+            } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs30")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs30_r12;
+            } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs40")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs40_r12;
+            } else if (strcmp(rxPool_ResourceConfig_subframeBitmap_present,"prBs42")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs42_r12;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for rxPool_ResourceConfig_subframeBitmap_present choice: prNothing,prBs4,prBs8,prBs12,prBs16,prBs30,prBs40,prBs42!\n",
+                           RC.config_file_name, i, rxPool_ResourceConfig_subframeBitmap_present);
+
+            RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_choice_bs_buf[j] = rxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
+            RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_choice_bs_size[j] = rxPool_ResourceConfig_subframeBitmap_choice_bs_size;
+            RRC_CONFIGURATION_REQ (msg_p).rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused[j] = rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
+
+            //SIB19 - for discRxPool
+            if (strcmp(discRxPool_cp_Len,"normal")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_cp_Len[j] = SL_CP_Len_r12_normal;
+            } else if (strcmp(discRxPool_cp_Len,"extended")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_cp_Len[j] = SL_CP_Len_r12_extended;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_cp_Len choice: normal,extended!\n",
+                           RC.config_file_name, i, discRxPool_cp_Len);
+
+            if (strcmp(discRxPool_discPeriod,"rf32")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf32;
+            } else if (strcmp(discRxPool_discPeriod,"rf64")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf64;
+            } else if (strcmp(discRxPool_discPeriod,"rf128")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf128;
+            } else if (strcmp(discRxPool_discPeriod,"rf256")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf256;
+            } else if (strcmp(discRxPool_discPeriod,"rf512")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf512;
+            } else if (strcmp(discRxPool_discPeriod,"rf1024")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf1024;
+            } else if (strcmp(discRxPool_discPeriod,"rf16")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf16_v1310;
+            } else if (strcmp(discRxPool_discPeriod,"spare")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_spare;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_discPeriod choice: rf32,rf64,rf128,rf512,rf1024,rf16,spare!\n",
+                           RC.config_file_name, i, discRxPool_discPeriod);
+
+            RRC_CONFIGURATION_REQ (msg_p).discRxPool_numRetx[j] = discRxPool_numRetx;
+            RRC_CONFIGURATION_REQ (msg_p).discRxPool_numRepetition[j] = discRxPool_numRepetition;
+            RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_prb_Num[j] = discRxPool_ResourceConfig_prb_Num;
+            RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_prb_Start[j] = discRxPool_ResourceConfig_prb_Start;
+            RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_prb_End[j] = discRxPool_ResourceConfig_prb_End;
+
+            if (strcmp(discRxPool_ResourceConfig_offsetIndicator_present,"prNothing")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_NOTHING;
+            } else if (strcmp(discRxPool_ResourceConfig_offsetIndicator_present,"prSmall")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_small_r12;
+            } else if (strcmp(discRxPool_ResourceConfig_offsetIndicator_present,"prLarge")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_large_r12;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_ResourceConfig_offsetIndicator_present choice: prNothing,prSmal,prLarge!\n",
+                           RC.config_file_name, i, discRxPool_ResourceConfig_offsetIndicator_present);
+
+            RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_offsetIndicator_choice[j] = discRxPool_ResourceConfig_offsetIndicator_choice;
+
+            if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prNothing")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_NOTHING;
+            } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs4")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs4_r12;
+            } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs8")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs8_r12;
+            } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs12")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs12_r12;
+            } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs16")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs16_r12;
+            } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs30")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs30_r12;
+            } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs40")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs40_r12;
+            } else if (strcmp(discRxPool_ResourceConfig_subframeBitmap_present,"prBs42")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs42_r12;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPool_ResourceConfig_subframeBitmap_present choice: prNothing,prBs4,prBs8,prBs12,prBs16,prBs30,prBs40,prBs42!\n",
+                           RC.config_file_name, i, discRxPool_ResourceConfig_subframeBitmap_present);
+
+            RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf[j] = discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
+            RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_choice_bs_size[j] = discRxPool_ResourceConfig_subframeBitmap_choice_bs_size;
+            RRC_CONFIGURATION_REQ (msg_p).discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused[j] = discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
+
+            //SIB19 - For discRxPoolPS
+            if (strcmp(discRxPoolPS_cp_Len,"normal")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_cp_Len[j] = SL_CP_Len_r12_normal;
+            } else if (strcmp(discRxPoolPS_cp_Len,"extended")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_cp_Len[j] = SL_CP_Len_r12_extended;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_cp_Len choice: normal,extended!\n",
+                           RC.config_file_name, i, discRxPoolPS_cp_Len);
+
+            if (strcmp(discRxPoolPS_discPeriod,"rf32")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf32;
+            } else if (strcmp(discRxPoolPS_discPeriod,"rf64")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf64;
+            } else if (strcmp(discRxPoolPS_discPeriod,"rf128")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf128;
+            } else if (strcmp(discRxPoolPS_discPeriod,"rf256")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf256;
+            } else if (strcmp(discRxPoolPS_discPeriod,"rf512")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf512;
+            } else if (strcmp(discRxPoolPS_discPeriod,"rf1024")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf1024;
+            } else if (strcmp(discRxPoolPS_discPeriod,"rf16")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_rf16_v1310;
+            } else if (strcmp(discRxPoolPS_discPeriod,"spare")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_discPeriod[j] = SL_DiscResourcePool_r12__discPeriod_r12_spare;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_discPeriod choice: rf32,rf64,rf128,rf512,rf1024,rf16,spare!\n",
+                           RC.config_file_name, i, discRxPoolPS_discPeriod);
+
+            RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_numRetx[j] = discRxPoolPS_numRetx;
+            RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_numRepetition[j] = discRxPoolPS_numRepetition;
+            RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_prb_Num[j] = discRxPoolPS_ResourceConfig_prb_Num;
+            RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_prb_Start[j] = discRxPoolPS_ResourceConfig_prb_Start;
+            RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_prb_End[j] = discRxPoolPS_ResourceConfig_prb_End;
+
+            if (strcmp(discRxPoolPS_ResourceConfig_offsetIndicator_present,"prNothing")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_NOTHING;
+            } else if (strcmp(discRxPoolPS_ResourceConfig_offsetIndicator_present,"prSmall")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_small_r12;
+            } else if (strcmp(discRxPoolPS_ResourceConfig_offsetIndicator_present,"prLarge")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_present[j] = SL_OffsetIndicator_r12_PR_large_r12;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_ResourceConfig_offsetIndicator_present choice: prNothing,prSmal,prLarge!\n",
+                           RC.config_file_name, i, discRxPoolPS_ResourceConfig_offsetIndicator_present);
+
+            RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_offsetIndicator_choice[j] = discRxPoolPS_ResourceConfig_offsetIndicator_choice;
+
+            if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prNothing")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_NOTHING;
+            } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs4")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs4_r12;
+            } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs8")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs8_r12;
+            } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs12")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs12_r12;
+            } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs16")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs16_r12;
+            } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs30")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs30_r12;
+            } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs40")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs40_r12;
+            } else if (strcmp(discRxPoolPS_ResourceConfig_subframeBitmap_present,"prBs42")==0) {
+              RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_present[j] = SubframeBitmapSL_r12_PR_bs42_r12;
+            } else
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for discRxPoolPS_ResourceConfig_subframeBitmap_present choice: prNothing,prBs4,prBs8,prBs12,prBs16,prBs30,prBs40,prBs42!\n",
+                           RC.config_file_name, i, discRxPoolPS_ResourceConfig_subframeBitmap_present);
+
+            RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf[j] = discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf;
+            RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size[j] = discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size;
+            RRC_CONFIGURATION_REQ (msg_p).discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused[j] = discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
+          }
+        }
+
+        char srb1path[MAX_OPTNAME_SIZE*2 + 8];
+        sprintf(srb1path,"%s.%s",enbpath,ENB_CONFIG_STRING_SRB1);
+        int npar = config_get( SRB1Params,sizeof(SRB1Params)/sizeof(paramdef_t), srb1path);
+
+        if (npar == sizeof(SRB1Params)/sizeof(paramdef_t)) {
+          switch (srb1_max_retx_threshold) {
+            case 1:
+              rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t1;
+              break;
+
+            case 2:
+              rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t2;
+              break;
+
+            case 3:
+              rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t3;
+              break;
+
+            case 4:
+              rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t4;
+              break;
+
+            case 6:
+              rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t6;
+              break;
+
+            case 8:
+              rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t8;
+              break;
+
+            case 16:
+              rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t16;
+              break;
+
+            case 32:
+              rrc->srb1_max_retx_threshold = UL_AM_RLC__maxRetxThreshold_t32;
+              break;
+
+            default:
+              AssertFatal (0,
+                           "Bad config value when parsing eNB configuration file %s, enb %d  srb1_max_retx_threshold %u!\n",
+                           RC.config_file_name, i, srb1_max_retx_threshold);
+          }
+
+          switch (srb1_poll_pdu) {
+            case 4:
+              rrc->srb1_poll_pdu = PollPDU_p4;
+              break;
+
+            case 8:
+              rrc->srb1_poll_pdu = PollPDU_p8;
+              break;
+
+            case 16:
+              rrc->srb1_poll_pdu = PollPDU_p16;
+              break;
+
+            case 32:
+              rrc->srb1_poll_pdu = PollPDU_p32;
+              break;
+
+            case 64:
+              rrc->srb1_poll_pdu = PollPDU_p64;
+              break;
+
+            case 128:
+              rrc->srb1_poll_pdu = PollPDU_p128;
+              break;
+
+            case 256:
+              rrc->srb1_poll_pdu = PollPDU_p256;
+              break;
+
+            default:
+              if (srb1_poll_pdu >= 10000)
+                rrc->srb1_poll_pdu = PollPDU_pInfinity;
+              else
+                AssertFatal (0,
+                             "Bad config value when parsing eNB configuration file %s, enb %d  srb1_poll_pdu %u!\n",
+                             RC.config_file_name, i, srb1_poll_pdu);
+          }
+
+          rrc->srb1_poll_byte             = srb1_poll_byte;
+
+          switch (srb1_poll_byte) {
+            case 25:
+              rrc->srb1_poll_byte = PollByte_kB25;
+              break;
+
+            case 50:
+              rrc->srb1_poll_byte = PollByte_kB50;
+              break;
+
+            case 75:
+              rrc->srb1_poll_byte = PollByte_kB75;
+              break;
+
+            case 100:
+              rrc->srb1_poll_byte = PollByte_kB100;
+              break;
+
+            case 125:
+              rrc->srb1_poll_byte = PollByte_kB125;
+              break;
+
+            case 250:
+              rrc->srb1_poll_byte = PollByte_kB250;
+              break;
+
+            case 375:
+              rrc->srb1_poll_byte = PollByte_kB375;
+              break;
+
+            case 500:
+              rrc->srb1_poll_byte = PollByte_kB500;
+              break;
+
+            case 750:
+              rrc->srb1_poll_byte = PollByte_kB750;
+              break;
+
+            case 1000:
+              rrc->srb1_poll_byte = PollByte_kB1000;
+              break;
+
+            case 1250:
+              rrc->srb1_poll_byte = PollByte_kB1250;
+              break;
+
+            case 1500:
+              rrc->srb1_poll_byte = PollByte_kB1500;
+              break;
+
+            case 2000:
+              rrc->srb1_poll_byte = PollByte_kB2000;
+              break;
+
+            case 3000:
+              rrc->srb1_poll_byte = PollByte_kB3000;
+              break;
+
+            default:
+              if (srb1_poll_byte >= 10000)
+                rrc->srb1_poll_byte = PollByte_kBinfinity;
+              else
+                AssertFatal (0,
+                             "Bad config value when parsing eNB configuration file %s, enb %d  srb1_poll_byte %u!\n",
+                             RC.config_file_name, i, srb1_poll_byte);
+          }
+
+          if (srb1_timer_poll_retransmit <= 250) {
+            rrc->srb1_timer_poll_retransmit = (srb1_timer_poll_retransmit - 5)/5;
+          } else if (srb1_timer_poll_retransmit <= 500) {
+            rrc->srb1_timer_poll_retransmit = (srb1_timer_poll_retransmit - 300)/50 + 50;
+          } else {
+            AssertFatal (0,
+                         "Bad config value when parsing eNB configuration file %s, enb %d  srb1_timer_poll_retransmit %u!\n",
+                         RC.config_file_name, i, srb1_timer_poll_retransmit);
+          }
+
+          if (srb1_timer_status_prohibit <= 250) {
+            rrc->srb1_timer_status_prohibit = srb1_timer_status_prohibit/5;
+          } else if ((srb1_timer_poll_retransmit >= 300) && (srb1_timer_poll_retransmit <= 500)) {
+            rrc->srb1_timer_status_prohibit = (srb1_timer_status_prohibit - 300)/50 + 51;
+          } else {
+            AssertFatal (0,
+                         "Bad config value when parsing eNB configuration file %s, enb %d  srb1_timer_status_prohibit %u!\n",
+                         RC.config_file_name, i, srb1_timer_status_prohibit);
+          }
+
+          switch (srb1_timer_reordering) {
+            case 0:
+              rrc->srb1_timer_reordering = T_Reordering_ms0;
+              break;
+
+            case 5:
+              rrc->srb1_timer_reordering = T_Reordering_ms5;
+              break;
+
+            case 10:
+              rrc->srb1_timer_reordering = T_Reordering_ms10;
+              break;
+
+            case 15:
+              rrc->srb1_timer_reordering = T_Reordering_ms15;
+              break;
+
+            case 20:
+              rrc->srb1_timer_reordering = T_Reordering_ms20;
+              break;
+
+            case 25:
+              rrc->srb1_timer_reordering = T_Reordering_ms25;
+              break;
+
+            case 30:
+              rrc->srb1_timer_reordering = T_Reordering_ms30;
+              break;
+
+            case 35:
+              rrc->srb1_timer_reordering = T_Reordering_ms35;
+              break;
+
+            case 40:
+              rrc->srb1_timer_reordering = T_Reordering_ms40;
+              break;
+
+            case 45:
+              rrc->srb1_timer_reordering = T_Reordering_ms45;
+              break;
+
+            case 50:
+              rrc->srb1_timer_reordering = T_Reordering_ms50;
+              break;
+
+            case 55:
+              rrc->srb1_timer_reordering = T_Reordering_ms55;
+              break;
+
+            case 60:
+              rrc->srb1_timer_reordering = T_Reordering_ms60;
+              break;
+
+            case 65:
+              rrc->srb1_timer_reordering = T_Reordering_ms65;
+              break;
+
+            case 70:
+              rrc->srb1_timer_reordering = T_Reordering_ms70;
+              break;
+
+            case 75:
+              rrc->srb1_timer_reordering = T_Reordering_ms75;
+              break;
+
+            case 80:
+              rrc->srb1_timer_reordering = T_Reordering_ms80;
+              break;
+
+            case 85:
+              rrc->srb1_timer_reordering = T_Reordering_ms85;
+              break;
+
+            case 90:
+              rrc->srb1_timer_reordering = T_Reordering_ms90;
+              break;
+
+            case 95:
+              rrc->srb1_timer_reordering = T_Reordering_ms95;
+              break;
+
+            case 100:
+              rrc->srb1_timer_reordering = T_Reordering_ms100;
+              break;
+
+            case 110:
+              rrc->srb1_timer_reordering = T_Reordering_ms110;
+              break;
+
+            case 120:
+              rrc->srb1_timer_reordering = T_Reordering_ms120;
+              break;
+
+            case 130:
+              rrc->srb1_timer_reordering = T_Reordering_ms130;
+              break;
+
+            case 140:
+              rrc->srb1_timer_reordering = T_Reordering_ms140;
+              break;
+
+            case 150:
+              rrc->srb1_timer_reordering = T_Reordering_ms150;
+              break;
+
+            case 160:
+              rrc->srb1_timer_reordering = T_Reordering_ms160;
+              break;
+
+            case 170:
+              rrc->srb1_timer_reordering = T_Reordering_ms170;
+              break;
+
+            case 180:
+              rrc->srb1_timer_reordering = T_Reordering_ms180;
+              break;
+
+            case 190:
+              rrc->srb1_timer_reordering = T_Reordering_ms190;
+              break;
+
+            case 200:
+              rrc->srb1_timer_reordering = T_Reordering_ms200;
+              break;
+
+            default:
+              AssertFatal (0,
+                           "Bad config value when parsing eNB configuration file %s, enb %d  srb1_timer_reordering %u!\n",
+                           RC.config_file_name, i, srb1_timer_reordering);
+          }
+        } else {
+          rrc->srb1_timer_poll_retransmit = T_PollRetransmit_ms80;
+          rrc->srb1_timer_reordering      = T_Reordering_ms35;
+          rrc->srb1_timer_status_prohibit = T_StatusProhibit_ms0;
+          rrc->srb1_poll_pdu              = PollPDU_p4;
+          rrc->srb1_poll_byte             = PollByte_kBinfinity;
+          rrc->srb1_max_retx_threshold    = UL_AM_RLC__maxRetxThreshold_t8;
+        }
+
+        /*
+          // Network Controller
+          subsetting = config_setting_get_member (setting_enb, ENB_CONFIG_STRING_NETWORK_CONTROLLER_CONFIG);
+
+          if (subsetting != NULL) {
+          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" );
+          }
+
+          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);
+          }
+          }
+        */
+        break;
+      }
+    }
+  }
+
+  return 0;
+}
+
+int RCconfig_gtpu(void ) {
+  int               num_enbs                      = 0;
+  char             *enb_interface_name_for_S1U    = NULL;
+  char             *enb_ipv4_address_for_S1U      = NULL;
+  uint32_t          enb_port_for_S1U              = 0;
+  char             *address                       = NULL;
+  char             *cidr                          = NULL;
+  char gtpupath[MAX_OPTNAME_SIZE*2 + 8];
+  paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
+  paramdef_t GTPUParams[]  = GTPUPARAMS_DESC;
+  LOG_I(GTPU,"Configuring GTPu\n");
+
+  /* get number of active eNodeBs */
+  config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
+  num_enbs = ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt;
+  AssertFatal (num_enbs >0,
+               "Failed to parse config file no active eNodeBs in %s \n", ENB_CONFIG_STRING_ACTIVE_ENBS);
+  sprintf(gtpupath,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,0,ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
+  config_get( GTPUParams,sizeof(GTPUParams)/sizeof(paramdef_t),gtpupath);
+  cidr = enb_ipv4_address_for_S1U;
+  address = strtok(cidr, "/");
+
+  if (address) {
+    MessageDef *message;
+    AssertFatal((message = itti_alloc_new_message(TASK_ENB_APP, GTPV1U_ENB_S1_REQ))!=NULL,"");
+    IPV4_STR_ADDR_TO_INT_NWBO ( address, GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up, "BAD IP ADDRESS FORMAT FOR eNB S1_U !\n" );
+    LOG_I(GTPU,"Configuring GTPu address : %s -> %x\n",address,GTPV1U_ENB_S1_REQ(message).enb_ip_address_for_S1u_S12_S4_up);
+    GTPV1U_ENB_S1_REQ(message).enb_port_for_S1u_S12_S4_up = enb_port_for_S1U;
+    itti_send_msg_to_task (TASK_GTPV1_U, 0, message); // data model is wrong: gtpu doesn't have enb_id (or module_id)
+  } else
+    LOG_E(GTPU,"invalid address for S1U\n");
+
+  return 0;
+}
+
+
+int RCconfig_S1(MessageDef *msg_p, uint32_t i) {
+  int               j,k                           = 0;
+  int enb_id;
+  int32_t     my_int;
+  const char       *active_enb[MAX_ENB];
+  char             *address                       = NULL;
+  char             *cidr                          = NULL;
+  // for no gcc warnings
+  (void)my_int;
+  memset((char *)active_enb,     0, MAX_ENB * sizeof(char *));
+  paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
+  paramdef_t ENBParams[]  = ENBPARAMS_DESC;
+  paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0};
+  /* get global parameters, defined outside any section in the config file */
+  config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
+  AssertFatal (i<ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt,
+               "Failed to parse config file %s, %uth attribute %s \n",
+               RC.config_file_name, i, ENB_CONFIG_STRING_ACTIVE_ENBS);
+
+  if (ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt>0) {
+    // Output a list of all eNBs.
+    config_getlist( &ENBParamList,ENBParams,sizeof(ENBParams)/sizeof(paramdef_t),NULL);
+
+    if (ENBParamList.numelt > 0) {
+      for (k = 0; k < ENBParamList.numelt; k++) {
+        if (ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr == NULL) {
+          // Calculate a default eNB ID
+          if (EPC_MODE_ENABLED) {
+            uint32_t hash;
+            hash = s1ap_generate_eNB_id ();
+            enb_id = k + (hash & 0xFFFF8);
+          } else {
+            enb_id = k;
+          }
+        } else {
+          enb_id = *(ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr);
+        }
+
+        // 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 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];
+            S1AP_REGISTER_ENB_REQ (msg_p).eNB_id = enb_id;
+
+            if (strcmp(*(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr), "CELL_MACRO_ENB") == 0) {
+              S1AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_MACRO_ENB;
+            } else  if (strcmp(*(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr), "CELL_HOME_ENB") == 0) {
+              S1AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_HOME_ENB;
+            } else {
+              AssertFatal (0,
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n",
+                           RC.config_file_name, i, *(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr));
+            }
+
+            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);
+            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;
+
+            for (int l = 0; l < S1ParamList.numelt; l++) {
+              S1AP_REGISTER_ENB_REQ (msg_p).nb_mme += 1;
+              strcpy(S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4_address,*(S1ParamList.paramarray[l][ENB_MME_IPV4_ADDRESS_IDX].strptr));
+              strcpy(S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6_address,*(S1ParamList.paramarray[l][ENB_MME_IPV6_ADDRESS_IDX].strptr));
+
+              if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv4") == 0) {
+                S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1;
+              } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv6") == 0) {
+                S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1;
+              } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "no") == 0) {
+                S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1;
+                S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1;
+              }
+            }
+
+            // SCTP SETTING
+            S1AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = SCTP_OUT_STREAMS;
+            S1AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams  = SCTP_IN_STREAMS;
+
+            if (EPC_MODE_ENABLED) {
+              sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_SCTP_CONFIG);
+              config_get( SCTPParams,sizeof(SCTPParams)/sizeof(paramdef_t),aprefix);
+              S1AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = (uint16_t)*(SCTPParams[ENB_SCTP_INSTREAMS_IDX].uptr);
+              S1AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = (uint16_t)*(SCTPParams[ENB_SCTP_OUTSTREAMS_IDX].uptr);
+            }
+
+            sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
+            // NETWORK_INTERFACES
+            config_get( NETParams,sizeof(NETParams)/sizeof(paramdef_t),aprefix);
+            //    S1AP_REGISTER_ENB_REQ (msg_p).enb_interface_name_for_S1U = strdup(enb_interface_name_for_S1U);
+            cidr = *(NETParams[ENB_IPV4_ADDRESS_FOR_S1_MME_IDX].strptr);
+            address = strtok(cidr, "/");
+            S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv6 = 0;
+            S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv4 = 1;
+            strcpy(S1AP_REGISTER_ENB_REQ (msg_p).enb_ip_address.ipv4_address, address);
+            break;
+          }
+        }
+      }
+    }
+  }
+
+  return 0;
+}
+
+int RCconfig_X2(MessageDef *msg_p, uint32_t i) {
+  int   I, J, j, k, l;
+  int   enb_id;
+  char *address = NULL;
+  char *cidr    = NULL;
+  paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
+  paramdef_t ENBParams[]  = ENBPARAMS_DESC;
+  paramlist_def_t ENBParamList = {ENB_CONFIG_STRING_ENB_LIST,NULL,0};
+  /* get global parameters, defined outside any section in the config file */
   config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
+
+  /* define CC params */
+
+  int32_t Nid_cell = 0;
+
+  char *frame_type, *prefix_type, *pbch_repetition, *prach_high_speed,
+    *pusch_hoppingMode, *pusch_enable64QAM, *pusch_groupHoppingEnabled,
+    *pusch_sequenceHoppingEnabled, *phich_duration, *phich_resource,
+    *srs_enable, *srs_ackNackST, *srs_MaxUpPts, *pusch_alpha,
+    *pucch_deltaF_Format1, *pucch_deltaF_Format1b, *pucch_deltaF_Format2,
+    *pucch_deltaF_Format2a, *pucch_deltaF_Format2b,
+    *rach_preamblesGroupAConfig, *rach_messagePowerOffsetGroupB, *pcch_nB;
+  long long int     downlink_frequency;
+  int32_t tdd_config, tdd_config_s, eutra_band, uplink_frequency_offset,
+    Nid_cell_mbsfn, N_RB_DL, nb_antenna_ports, prach_root, prach_config_index,
+    prach_zero_correlation, prach_freq_offset, pucch_delta_shift,
+    pucch_nRB_CQI, pucch_nCS_AN, pucch_n1_AN, pdsch_referenceSignalPower,
+    pdsch_p_b, pusch_n_SB, pusch_hoppingOffset, pusch_groupAssignment,
+    pusch_nDMRS1, srs_BandwidthConfig, srs_SubframeConfig, pusch_p0_Nominal,
+    pucch_p0_Nominal, msg3_delta_Preamble, rach_numberOfRA_Preambles,
+    rach_sizeOfRA_PreamblesGroupA, rach_messageSizeGroupA,
+    rach_powerRampingStep, rach_preambleInitialReceivedTargetPower,
+    rach_preambleTransMax, rach_raResponseWindowSize,
+    rach_macContentionResolutionTimer, rach_maxHARQ_Msg3Tx,
+    pcch_defaultPagingCycle, bcch_modificationPeriodCoeff,
+    ue_TimersAndConstants_t300, ue_TimersAndConstants_t301,
+    ue_TimersAndConstants_t310, ue_TimersAndConstants_t311,
+    ue_TimersAndConstants_n310, ue_TimersAndConstants_n311,
+    ue_TransmissionMode, ue_multiple_max;
+
+  const char*       rxPool_sc_CP_Len;
+  const char*       rxPool_sc_Period;
+  const char*       rxPool_data_CP_Len;
+  libconfig_int     rxPool_ResourceConfig_prb_Num;
+  libconfig_int     rxPool_ResourceConfig_prb_Start;
+  libconfig_int     rxPool_ResourceConfig_prb_End;
+  const char*       rxPool_ResourceConfig_offsetIndicator_present;
+  libconfig_int     rxPool_ResourceConfig_offsetIndicator_choice;
+  const char*       rxPool_ResourceConfig_subframeBitmap_present;
+  char*             rxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
+  libconfig_int     rxPool_ResourceConfig_subframeBitmap_choice_bs_size;
+  libconfig_int     rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
+
+  //SIB19
+  //for discRxPool
+  const char*       discRxPool_cp_Len;
+  const char*       discRxPool_discPeriod;
+  libconfig_int     discRxPool_numRetx;
+  libconfig_int     discRxPool_numRepetition;
+  libconfig_int     discRxPool_ResourceConfig_prb_Num;
+  libconfig_int     discRxPool_ResourceConfig_prb_Start;
+  libconfig_int     discRxPool_ResourceConfig_prb_End;
+  const char*       discRxPool_ResourceConfig_offsetIndicator_present;
+  libconfig_int     discRxPool_ResourceConfig_offsetIndicator_choice;
+  const char*       discRxPool_ResourceConfig_subframeBitmap_present;
+  char*             discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf;
+  libconfig_int     discRxPool_ResourceConfig_subframeBitmap_choice_bs_size;
+  libconfig_int     discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
+
+  //for discRxPoolPS
+  const char*       discRxPoolPS_cp_Len;
+  const char*       discRxPoolPS_discPeriod;
+  libconfig_int     discRxPoolPS_numRetx;
+  libconfig_int     discRxPoolPS_numRepetition;
+  libconfig_int     discRxPoolPS_ResourceConfig_prb_Num;
+  libconfig_int     discRxPoolPS_ResourceConfig_prb_Start;
+  libconfig_int     discRxPoolPS_ResourceConfig_prb_End;
+  const char*       discRxPoolPS_ResourceConfig_offsetIndicator_present;
+  libconfig_int     discRxPoolPS_ResourceConfig_offsetIndicator_choice;
+  const char*       discRxPoolPS_ResourceConfig_subframeBitmap_present;
+  char*             discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf;
+  libconfig_int     discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size;
+  libconfig_int     discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused;
+
+  checkedparam_t config_check_CCparams[] = CCPARAMS_CHECK;
+  paramdef_t CCsParams[] = CCPARAMS_DESC;
+  paramlist_def_t CCsParamList = {ENB_CONFIG_STRING_COMPONENT_CARRIERS, NULL, 0};
+
+  /* map parameter checking array instances to parameter definition array instances */
+  for (I = 0; I < (sizeof(CCsParams) / sizeof(paramdef_t)); I++) {
+    CCsParams[I].chkPptr = &(config_check_CCparams[I]);
+  }
 /*#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
     if (strcasecmp( *(ENBSParams[ENB_ASN1_VERBOSITY_IDX].strptr), ENB_CONFIG_STRING_ASN1_VERBOSITY_NONE) == 0) {
       asn_debug      = 0;
@@ -2370,13 +2288,13 @@ int RCconfig_X2(MessageDef *msg_p, uint32_t i)
   if (ENBSParams[ENB_ACTIVE_ENBS_IDX].numelt > 0) {
     // Output a list of all eNBs.
     config_getlist( &ENBParamList,ENBParams,sizeof(ENBParams)/sizeof(paramdef_t),NULL);
+
     if (ENBParamList.numelt > 0) {
       for (k = 0; k < ENBParamList.numelt; k++) {
         if (ENBParamList.paramarray[k][ENB_ENB_ID_IDX].uptr == NULL) {
           // Calculate a default eNB ID
 # if defined(ENABLE_USE_MME)
           uint32_t hash;
-
           hash = s1ap_generate_eNB_id ();
           enb_id = k + (hash & 0xFFFF8);
 # else
@@ -2389,16 +2307,14 @@ int RCconfig_X2(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 X2Params[]  = X2PARAMS_DESC;
             paramlist_def_t X2ParamList = {ENB_CONFIG_STRING_TARGET_ENB_X2_IP_ADDRESS,NULL,0};
-
             paramdef_t SCTPParams[]  = SCTPPARAMS_DESC;
             paramdef_t NETParams[]  =  NETPARAMS_DESC;
-            char aprefix[MAX_OPTNAME_SIZE*2 + 8];
-
+            /* TODO: fix the size - if set lower we have a crash (MAX_OPTNAME_SIZE was 64 when this code was written) */
+            /* this is most probably a problem with the config module */
+            char aprefix[MAX_OPTNAME_SIZE*80 + 8];
             /* Some default/random parameters */
-
             X2AP_REGISTER_ENB_REQ (msg_p).eNB_id = enb_id;
 
             if (strcmp(*(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr), "CELL_MACRO_ENB") == 0) {
@@ -2407,8 +2323,8 @@ int RCconfig_X2(MessageDef *msg_p, uint32_t i)
               X2AP_REGISTER_ENB_REQ (msg_p).cell_type = CELL_HOME_ENB;
             } else {
               AssertFatal (0,
-                  "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n",
-                  RC.config_file_name, i, *(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr));
+                           "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for cell_type choice: CELL_MACRO_ENB or CELL_HOME_ENB !\n",
+                           RC.config_file_name, i, *(ENBParamList.paramarray[k][ENB_CELL_TYPE_IDX].strptr));
             }
 
             X2AP_REGISTER_ENB_REQ (msg_p).eNB_name         = strdup(*(ENBParamList.paramarray[k][ENB_ENB_NAME_IDX].strptr));
@@ -2416,24 +2332,72 @@ int RCconfig_X2(MessageDef *msg_p, uint32_t i)
             X2AP_REGISTER_ENB_REQ (msg_p).mcc              = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_COUNTRY_CODE_IDX].strptr));
             X2AP_REGISTER_ENB_REQ (msg_p).mnc              = (uint16_t)atoi(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
             X2AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length = strlen(*(ENBParamList.paramarray[k][ENB_MOBILE_NETWORK_CODE_IDX].strptr));
-
             AssertFatal((X2AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 2) ||
                         (X2AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length == 3),
                         "BAD MNC DIGIT LENGTH %d",
                         X2AP_REGISTER_ENB_REQ (msg_p).mnc_digit_length);
 
+            /* CC params */
+            sprintf(aprefix, "%s.[%i]", ENB_CONFIG_STRING_ENB_LIST, k);
+            config_getlist(&CCsParamList, NULL, 0, aprefix);
+
+            X2AP_REGISTER_ENB_REQ (msg_p).num_cc = CCsParamList.numelt;
+
+            if (CCsParamList.numelt > 0) {
+
+              //char ccspath[MAX_OPTNAME_SIZE*2 + 16];
+
+              for (J = 0; J < CCsParamList.numelt ; J++) {
+
+                sprintf(aprefix, "%s.[%i].%s.[%i]", ENB_CONFIG_STRING_ENB_LIST, k, ENB_CONFIG_STRING_COMPONENT_CARRIERS, J);
+                config_get(CCsParams, sizeof(CCsParams)/sizeof(paramdef_t), aprefix);
+
+                X2AP_REGISTER_ENB_REQ (msg_p).eutra_band[J] = eutra_band;
+	        X2AP_REGISTER_ENB_REQ (msg_p).downlink_frequency[J] = (uint32_t) downlink_frequency;
+	        X2AP_REGISTER_ENB_REQ (msg_p).uplink_frequency_offset[J] = (unsigned int) uplink_frequency_offset;
+	        X2AP_REGISTER_ENB_REQ (msg_p).Nid_cell[J]= Nid_cell;
+
+	        if (Nid_cell>503) {
+	          AssertFatal (0,
+	            "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for Nid_cell choice: 0...503 !\n",
+                         RC.config_file_name, k, Nid_cell);
+	        }
+
+	        X2AP_REGISTER_ENB_REQ (msg_p).N_RB_DL[J]= N_RB_DL;
+
+	        if ((N_RB_DL!=6) && (N_RB_DL!=15) && (N_RB_DL!=25) && (N_RB_DL!=50) && (N_RB_DL!=75) && (N_RB_DL!=100)) {
+	          AssertFatal (0,
+                    "Failed to parse eNB configuration file %s, enb %d unknown value \"%d\" for N_RB_DL choice: 6,15,25,50,75,100 !\n",
+                         RC.config_file_name, k, N_RB_DL);
+	        }
+
+	        if (strcmp(frame_type, "FDD") == 0) {
+                  X2AP_REGISTER_ENB_REQ (msg_p).frame_type[J] = FDD;
+	        } else  if (strcmp(frame_type, "TDD") == 0) {
+                  X2AP_REGISTER_ENB_REQ (msg_p).frame_type[J] = TDD;
+                } else {
+	          AssertFatal (0,
+                    "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for frame_type choice: FDD or TDD !\n",
+		         RC.config_file_name, k, frame_type);
+	        }
+
+                X2AP_REGISTER_ENB_REQ (msg_p).fdd_earfcn_DL[J] = to_earfcn_DL(eutra_band, downlink_frequency, N_RB_DL);
+                X2AP_REGISTER_ENB_REQ (msg_p).fdd_earfcn_UL[J] = to_earfcn_UL(eutra_band, downlink_frequency + uplink_frequency_offset, N_RB_DL);
+              }
+            }
+
             sprintf(aprefix,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,k);
             config_getlist( &X2ParamList,X2Params,sizeof(X2Params)/sizeof(paramdef_t),aprefix);
 
-            if(X2ParamList.numelt>X2AP_MAX_NB_ENB_IP_ADDRESS){
-		 LOG_E(RRC,"value of X2ParamList.numelt %d must be lower than X2AP_MAX_NB_ENB_IP_ADDRESS %d value: reconsider to increase X2AP_MAX_NB_ENB_IP_ADDRESS\n",X2ParamList.numelt,X2AP_MAX_NB_ENB_IP_ADDRESS);
-		 exit(1);
-	    }
+            if(X2ParamList.numelt>X2AP_MAX_NB_ENB_IP_ADDRESS) {
+              LOG_E(RRC,"value of X2ParamList.numelt %d must be lower than X2AP_MAX_NB_ENB_IP_ADDRESS %d value: reconsider to increase X2AP_MAX_NB_ENB_IP_ADDRESS\n",X2ParamList.numelt,X2AP_MAX_NB_ENB_IP_ADDRESS);
+              exit(1);
+            }
 
             X2AP_REGISTER_ENB_REQ (msg_p).nb_x2 = 0;
+
             for (l = 0; l < X2ParamList.numelt; l++) {
               X2AP_REGISTER_ENB_REQ (msg_p).nb_x2 += 1;
-
               strcpy(X2AP_REGISTER_ENB_REQ (msg_p).target_enb_x2_ip_address[l].ipv4_address,*(X2ParamList.paramarray[l][ENB_X2_IPV4_ADDRESS_IDX].strptr));
               strcpy(X2AP_REGISTER_ENB_REQ (msg_p).target_enb_x2_ip_address[l].ipv6_address,*(X2ParamList.paramarray[l][ENB_X2_IPV6_ADDRESS_IDX].strptr));
 
@@ -2456,12 +2420,9 @@ int RCconfig_X2(MessageDef *msg_p, uint32_t i)
             X2AP_REGISTER_ENB_REQ (msg_p).sctp_in_streams = (uint16_t)*(SCTPParams[ENB_SCTP_INSTREAMS_IDX].uptr);
             X2AP_REGISTER_ENB_REQ (msg_p).sctp_out_streams = (uint16_t)*(SCTPParams[ENB_SCTP_OUTSTREAMS_IDX].uptr);
 #endif
-
             sprintf(aprefix,"%s.[%i].%s",ENB_CONFIG_STRING_ENB_LIST,k,ENB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
-
             // NETWORK_INTERFACES
             config_get( NETParams,sizeof(NETParams)/sizeof(paramdef_t),aprefix);
-
             X2AP_REGISTER_ENB_REQ (msg_p).enb_port_for_X2C = (uint32_t)*(NETParams[ENB_PORT_FOR_X2C_IDX].uptr);
 
             if ((NETParams[ENB_IPV4_ADDR_FOR_X2C_IDX].strptr == NULL) || (X2AP_REGISTER_ENB_REQ (msg_p).enb_port_for_X2C == 0)) {
@@ -2471,36 +2432,66 @@ int RCconfig_X2(MessageDef *msg_p, uint32_t i)
 
             cidr = *(NETParams[ENB_IPV4_ADDR_FOR_X2C_IDX].strptr);
             address = strtok(cidr, "/");
-
             X2AP_REGISTER_ENB_REQ (msg_p).enb_x2_ip_address.ipv6 = 0;
             X2AP_REGISTER_ENB_REQ (msg_p).enb_x2_ip_address.ipv4 = 1;
-
             strcpy(X2AP_REGISTER_ENB_REQ (msg_p).enb_x2_ip_address.ipv4_address, address);
           }
         }
       }
     }
   }
-return 0;
+
+  return 0;
 }
 
-void RCConfig(void) {
+int RCconfig_parallel(void)
+{
+  char *parallel_conf = NULL;
+  char *worker_conf   = NULL;
+  extern char *parallel_config;
+  extern char *worker_config;
 
+  paramdef_t ThreadParams[]  = THREAD_CONF_DESC;
+  paramlist_def_t THREADParamList = {THREAD_CONFIG_STRING_THREAD_STRUCT,NULL,0};
+  
+  config_getlist( &THREADParamList,NULL,0,NULL);
+
+  if(THREADParamList.numelt>0)
+  {
+    config_getlist( &THREADParamList,ThreadParams,sizeof(ThreadParams)/sizeof(paramdef_t),NULL);
+    parallel_conf = strdup(*(THREADParamList.paramarray[0][THREAD_PARALLEL_IDX].strptr));
+  }
+  else
+  {
+    parallel_conf = strdup("PARALLEL_RU_L1_TRX_SPLIT");
+  }
+  if(THREADParamList.numelt>0)
+  {
+    config_getlist( &THREADParamList,ThreadParams,sizeof(ThreadParams)/sizeof(paramdef_t),NULL);
+    worker_conf   = strdup(*(THREADParamList.paramarray[0][THREAD_WORKER_IDX].strptr));
+  }
+  else
+  {
+    worker_conf   = strdup("WORKER_ENABLE");
+  }
+
+
+  if(parallel_config == NULL) set_parallel_conf(parallel_conf);
+  if(worker_config == NULL)   set_worker_conf(worker_conf);
+
+  return 0;
+}
+
+void RCConfig(void) {
   paramlist_def_t MACRLCParamList = {CONFIG_STRING_MACRLC_LIST,NULL,0};
   paramlist_def_t L1ParamList = {CONFIG_STRING_L1_LIST,NULL,0};
   paramlist_def_t RUParamList = {CONFIG_STRING_RU_LIST,NULL,0};
   paramdef_t ENBSParams[] = ENBSPARAMS_DESC;
   paramlist_def_t CCsParamList = {ENB_CONFIG_STRING_COMPONENT_CARRIERS,NULL,0};
-  
-  char aprefix[MAX_OPTNAME_SIZE*2 + 8];  
-  
-
-
-/* get global parameters, defined outside any section in the config file */
- 
+  char aprefix[MAX_OPTNAME_SIZE*2 + 8];
+  /* get global parameters, defined outside any section in the config file */
   printf("Getting ENBSParams\n");
- 
-  config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL); 
+  config_get( ENBSParams,sizeof(ENBSParams)/sizeof(paramdef_t),NULL);
 # if defined(ENABLE_USE_MME)
   EPC_MODE_ENABLED = ((*ENBSParams[ENB_NOS1_IDX].uptr) == 0);
 #endif
@@ -2508,25 +2499,22 @@ void RCConfig(void) {
 
   if (RC.nb_inst > 0) {
     RC.nb_CC = (int *)malloc((1+RC.nb_inst)*sizeof(int));
-    for (int i=0;i<RC.nb_inst;i++) {
+
+    for (int i=0; i<RC.nb_inst; i++) {
       sprintf(aprefix,"%s.[%i]",ENB_CONFIG_STRING_ENB_LIST,i);
       config_getlist( &CCsParamList,NULL,0, aprefix);
-      RC.nb_CC[i]		 = CCsParamList.numelt;
+      RC.nb_CC[i]    = CCsParamList.numelt;
     }
   }
 
-    // Get num MACRLC instances
-    
- 
-    config_getlist( &MACRLCParamList,NULL,0, NULL);
-    RC.nb_macrlc_inst  = MACRLCParamList.numelt;
-    // Get num L1 instances
-    config_getlist( &L1ParamList,NULL,0, NULL);
-    RC.nb_L1_inst = L1ParamList.numelt;
-
-    // Get num RU instances
-    config_getlist( &RUParamList,NULL,0, NULL);  
-    RC.nb_RU     = RUParamList.numelt; 
- 
-
+  // Get num MACRLC instances
+  config_getlist( &MACRLCParamList,NULL,0, NULL);
+  RC.nb_macrlc_inst  = MACRLCParamList.numelt;
+  // Get num L1 instances
+  config_getlist( &L1ParamList,NULL,0, NULL);
+  RC.nb_L1_inst = L1ParamList.numelt;
+  // Get num RU instances
+  config_getlist( &RUParamList,NULL,0, NULL);
+  RC.nb_RU     = RUParamList.numelt;
+  RCconfig_parallel();
 }
diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h
index 04edea1493b955f5840e7da84ead7099168bfc2b..9403362c4fa03fdf0e25e8a710a6fd00b70028a9 100755
--- a/openair2/ENB_APP/enb_paramdef.h
+++ b/openair2/ENB_APP/enb_paramdef.h
@@ -879,3 +879,28 @@ typedef enum {
 #define MACRLC_SCHED_MODE_IDX                                  17
 #define MACRLC_PHY_TEST_IDX                                    18
 /*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+/* thread configuration parameters section name */
+#define THREAD_CONFIG_STRING_THREAD_STRUCT                "THREAD_STRUCT"
+
+/* thread configuration parameters names   */
+#define THREAD_CONFIG_STRING_PARALLEL              "parallel_config"
+#define THREAD_CONFIG_STRING_WORKER                "worker_config"
+
+
+#define THREAD_PARALLEL_IDX          0
+#define THREAD_WORKER_IDX            1
+
+/*-------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+/*                                                             thread configuration parameters                                                                 */
+/*   optname                                          helpstr   paramflags    XXXptr       defXXXval                                 type           numelt     */
+/*-------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+#define THREAD_CONF_DESC {  \
+{THREAD_CONFIG_STRING_PARALLEL,          CONFIG_HLP_PARALLEL,      0,       strptr:NULL,   defstrval:"PARALLEL_RU_L1_TRX_SPLIT",   TYPE_STRING,   0},          \
+{THREAD_CONFIG_STRING_WORKER,            CONFIG_HLP_WORKER,        0,       strptr:NULL,   defstrval:"WORKER_ENABLE",              TYPE_STRING,   0}           \
+}
+
+
+#define CONFIG_HLP_WORKER                          "coding and FEP worker thread WORKER_DISABLE or WORKER_ENABLE\n"
+#define CONFIG_HLP_PARALLEL                        "PARALLEL_SINGLE_THREAD, PARALLEL_RU_L1_SPLIT, or PARALLEL_RU_L1_TRX_SPLIT(RU_L1_TRX_SPLIT by defult)\n"
+/*-------------------------------------------------------------------------------------------------------------------------------------------------------------*/
diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c
index 5331f07a6883a7ebbbb0b0bf4f432711a3660e38..0b4f05a56e1883374afc17d50a35d9ee7a69bd4e 100644
--- a/openair2/LAYER2/MAC/config.c
+++ b/openair2/LAYER2/MAC/config.c
@@ -160,6 +160,58 @@ uint32_t to_earfcn(int eutra_bandP, uint32_t dl_CarrierFreq, uint32_t bw)
 	  (eutra_bandtable[i].N_OFFs_DL / 10));
 }
 
+uint32_t to_earfcn_DL(int eutra_bandP, long long int dl_CarrierFreq, uint32_t bw)
+{
+
+  uint32_t dl_CarrierFreq_by_100k = dl_CarrierFreq / 100000;
+  int bw_by_100 = bw / 100;
+
+  int i;
+
+  AssertFatal(eutra_bandP < 69, "eutra_band %d > 68\n", eutra_bandP);
+  for (i = 0; i < 69 && eutra_bandtable[i].band != eutra_bandP; i++);
+
+  AssertFatal(dl_CarrierFreq_by_100k >= eutra_bandtable[i].dl_min,
+              "Band %d, bw %u : DL carrier frequency %lld Hz < %u\n",
+              eutra_bandP, bw, dl_CarrierFreq,
+              eutra_bandtable[i].dl_min);
+  AssertFatal(dl_CarrierFreq_by_100k <=
+              (eutra_bandtable[i].dl_max - bw_by_100),
+              "Band %d, bw %u : DL carrier frequency %lld Hz > %d\n",
+              eutra_bandP, bw, dl_CarrierFreq,
+              eutra_bandtable[i].dl_max - bw_by_100);
+
+
+  return (dl_CarrierFreq_by_100k - eutra_bandtable[i].dl_min +
+          (eutra_bandtable[i].N_OFFs_DL / 10));
+}
+
+uint32_t to_earfcn_UL(int eutra_bandP, long long int ul_CarrierFreq, uint32_t bw)
+{
+
+  uint32_t ul_CarrierFreq_by_100k = ul_CarrierFreq / 100000;
+  int bw_by_100 = bw / 100;
+
+  int i;
+
+  AssertFatal(eutra_bandP < 69, "eutra_band %d > 68\n", eutra_bandP);
+  for (i = 0; i < 69 && eutra_bandtable[i].band != eutra_bandP; i++);
+
+  AssertFatal(ul_CarrierFreq_by_100k >= eutra_bandtable[i].ul_min,
+              "Band %d, bw %u : UL carrier frequency %lld Hz < %u\n",
+              eutra_bandP, bw, ul_CarrierFreq,
+              eutra_bandtable[i].ul_min);
+  AssertFatal(ul_CarrierFreq_by_100k <=
+              (eutra_bandtable[i].ul_max - bw_by_100),
+              "Band %d, bw %u : UL carrier frequency %lld Hz > %d\n",
+              eutra_bandP, bw, ul_CarrierFreq,
+              eutra_bandtable[i].ul_max - bw_by_100);
+
+
+  return (ul_CarrierFreq_by_100k - eutra_bandtable[i].ul_min +
+          ((eutra_bandtable[i].N_OFFs_DL + 180000) / 10));
+}
+
 uint32_t from_earfcn(int eutra_bandP, uint32_t dl_earfcn)
 {
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_phytest.c b/openair2/LAYER2/MAC/eNB_scheduler_phytest.c
index 03def311723c157b227742d2e5f4e74b0cadf66d..81c418c12352ea83d87cbe1aedbf0941df37641b 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_phytest.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_phytest.c
@@ -71,7 +71,7 @@ schedule_ue_spec_phy_test(
   uint16_t                       rnti      = 0x1235;
   uint32_t                       rb_alloc  = 0x1FFFFF;
   int32_t                        tpc       = 1;
-  int32_t                        mcs       = 10;
+  int32_t                        mcs       = 28;
   int32_t                        cqi       = 15;
   int32_t                        ndi       = (frameP*10+subframeP)/8;
   int32_t                        dai       = 0;
diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c
index e62596aed610a927cb5a31e7583bae215ee238f2..00f814b8b17de3f56721bb1847c58b91ad3004e2 100644
--- a/openair2/RRC/LTE/rrc_eNB.c
+++ b/openair2/RRC/LTE/rrc_eNB.c
@@ -7201,29 +7201,24 @@ void rrc_eNB_reconfigure_DRBs (const protocol_ctxt_t* const ctxt_pP,
   rrc_eNB_generate_dedicatedRRCConnectionReconfiguration(ctxt_pP, ue_context_pP, 0);
 }
 
-
-//-----------------------------------------------------------------------------
-void*
-rrc_enb_task(
-  void* args_p
-)
 //-----------------------------------------------------------------------------
-{
-  MessageDef                         *msg_p;
-  const char                         *msg_name_p;
-  instance_t                          instance;
-  int                                 result;
-  SRB_INFO                           *srb_info_p;
-  int                                 CC_id;
-
-  protocol_ctxt_t                     ctxt;
-
+void rrc_enb_init(void) {
   pthread_mutex_init(&lock_ue_freelist, NULL);
   pthread_mutex_init(&rrc_release_freelist, NULL);
   memset(&rrc_release_info,0,sizeof(RRC_release_list_t));
-  itti_mark_task_ready(TASK_RRC_ENB);
-  LOG_I(RRC,"Entering main loop of RRC message task\n");
-  while (1) {
+}
+
+//-----------------------------------------------------------------------------
+void *rrc_enb_process_itti_msg(void *notUsed) {
+    MessageDef                         *msg_p;
+    const char                         *msg_name_p;
+    instance_t                          instance;
+    int                                 result;
+    SRB_INFO                           *srb_info_p;
+    int                                 CC_id;
+    
+    protocol_ctxt_t                     ctxt;
+
     // Wait for a message
     itti_receive_msg(TASK_RRC_ENB, &msg_p);
 
@@ -7363,9 +7358,28 @@ rrc_enb_task(
     result = itti_free(ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
     if (result != EXIT_SUCCESS) {
         LOG_I(RRC, "Failed to free memory (%d)!\n",result);
-        continue;
     }
     msg_p = NULL;
+    return NULL;
+}
+
+//-----------------------------------------------------------------------------
+void*
+rrc_enb_task(
+  void* args_p
+)
+//-----------------------------------------------------------------------------
+{
+  rrc_enb_init();
+
+  itti_mark_task_ready(TASK_RRC_ENB);
+  LOG_I(RRC,"Entering main loop of RRC message task\n");
+
+  
+  while (1) {
+
+    (void) rrc_enb_process_itti_msg(NULL);
+
   }
 }
 #endif
diff --git a/openair2/RRC/LTE/rrc_proto.h b/openair2/RRC/LTE/rrc_proto.h
index e16391aef10d483778f661628ffbd11710bdf7a6..de16f45c2a718fcb6d583cbdaa92378be2442f51 100644
--- a/openair2/RRC/LTE/rrc_proto.h
+++ b/openair2/RRC/LTE/rrc_proto.h
@@ -336,6 +336,10 @@ rrc_eNB_reconfigure_DRBs (const protocol_ctxt_t* const ctxt_pP,
 			  rrc_eNB_ue_context_t*  ue_context_pP);
 
 #if defined(ENABLE_ITTI)
+
+void  rrc_enb_init(void);
+void *rrc_enb_process_itti_msg(void *);
+
 /**\brief RRC eNB task.
    \param void *args_p Pointer on arguments to start the task. */
 void *rrc_enb_task(void *args_p);
diff --git a/openair2/X2AP/x2ap_common.h b/openair2/X2AP/x2ap_common.h
index ceda1c8eb96e04a3a7e4509d460a4396be2be85b..a2f903a73725f812b44314e02408ad40ceed145f 100644
--- a/openair2/X2AP/x2ap_common.h
+++ b/openair2/X2AP/x2ap_common.h
@@ -28,12 +28,12 @@
 #include "X2AP_InitiatingMessage.h"
 #include "X2AP_SuccessfulOutcome.h"
 #include "X2AP_UnsuccessfulOutcome.h"
-#include "X2AP_ProtocolIE-Field.h"
 #include "X2AP_ProtocolIE-FieldPair.h"
 #include "X2AP_ProtocolIE-ContainerPair.h"
 #include "X2AP_ProtocolExtensionField.h"
 #include "X2AP_ProtocolExtensionContainer.h"
 #include "X2AP_asn_constant.h"
+#include "intertask_interface.h"
 
 #ifndef X2AP_COMMON_H_
 #define X2AP_COMMON_H_
@@ -87,15 +87,13 @@ extern int asn1_xer_print;
     if (mandatory) DevAssert(ie != NULL); \
   } while(0)
 
-//Forward declaration
-struct x2ap_message_s;
-
 /** \brief Function callback prototype.
  **/
 typedef int (*x2ap_message_decoded_callback)(
+  instance_t instance,
   uint32_t assocId,
   uint32_t stream,
-  struct x2ap_message_s *message);
+  X2AP_X2AP_PDU_t *pdu);
 
 /** \brief Encode a successfull outcome message
  \param buffer pointer to buffer in which data will be encoded
diff --git a/openair2/X2AP/x2ap_eNB.c b/openair2/X2AP/x2ap_eNB.c
index a1469509a90563acf4e6dd3546a74056a600cb3a..d12dfa881979b9a3841471ed236b64ff4475c621 100644
--- a/openair2/X2AP/x2ap_eNB.c
+++ b/openair2/X2AP/x2ap_eNB.c
@@ -31,6 +31,7 @@
 #include "x2ap_eNB_defs.h"
 #include "x2ap_eNB_management_procedures.h"
 #include "x2ap_eNB_handler.h"
+#include "x2ap_eNB_generate_messages.h"
 #include "x2ap_common.h"
 
 #include "queue.h"
@@ -42,9 +43,9 @@ struct x2ap_eNB_data_s;
 
 RB_PROTOTYPE(x2ap_enb_map, x2ap_eNB_data_s, entry, x2ap_eNB_compare_assoc_id);
 
-//static
-//void x2ap_eNB_handle_sctp_data_ind(instance_t instance,
-  //                                 sctp_data_ind_t *sctp_data_ind);
+static
+void x2ap_eNB_handle_sctp_data_ind(instance_t instance, sctp_data_ind_t *sctp_data_ind);
+
 static
 void x2ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp);
 
@@ -63,22 +64,21 @@ void x2ap_eNB_register_eNB(x2ap_eNB_instance_t *instance_p,
                            uint32_t             enb_port_for_X2C,
                            int                  multi_sd);
 
-/*
+
 static
-void x2ap_eNB_handle_sctp_data_ind(instance_t instance,
-				   sctp_data_ind_t *sctp_data_ind) {
+void x2ap_eNB_handle_sctp_data_ind(instance_t instance, sctp_data_ind_t *sctp_data_ind) {
 
   int result;
 
   DevAssert(sctp_data_ind != NULL);
 
-  x2ap_eNB_handle_message(sctp_data_ind->assoc_id, sctp_data_ind->stream,
+  x2ap_eNB_handle_message(instance, sctp_data_ind->assoc_id, sctp_data_ind->stream,
                           sctp_data_ind->buffer, sctp_data_ind->buffer_length);
 
   result = itti_free(TASK_UNKNOWN, sctp_data_ind->buffer);
   AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
 
-}*/
+}
 
 static
 void x2ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp)
@@ -143,7 +143,7 @@ printf("x2ap_eNB_handle_sctp_association_resp at 4\n");
 dump_trees();
 
   /* Prepare new x2 Setup Request */
-  //x2ap_eNB_generate_x2_setup_request(instance_p, x2ap_enb_data_p);
+  x2ap_eNB_generate_x2_setup_request(instance_p, x2ap_enb_data_p);
 }
 
 static
@@ -325,6 +325,19 @@ void x2ap_eNB_handle_register_eNB(instance_t instance,
     new_instance->mnc              = x2ap_register_eNB->mnc;
     new_instance->mnc_digit_length = x2ap_register_eNB->mnc_digit_length;
 
+    new_instance->num_cc           = x2ap_register_eNB->num_cc;
+
+    for (int i = 0; i< x2ap_register_eNB->num_cc; i++){
+      new_instance->eutra_band[i]              = x2ap_register_eNB->eutra_band[i];
+      new_instance->downlink_frequency[i]      = x2ap_register_eNB->downlink_frequency[i];
+      new_instance->uplink_frequency_offset[i] = x2ap_register_eNB->uplink_frequency_offset[i];
+      new_instance->Nid_cell[i]                = x2ap_register_eNB->Nid_cell[i];
+      new_instance->N_RB_DL[i]                 = x2ap_register_eNB->N_RB_DL[i];
+      new_instance->frame_type[i]              = x2ap_register_eNB->frame_type[i];
+      new_instance->fdd_earfcn_DL[i]           = x2ap_register_eNB->fdd_earfcn_DL[i];
+      new_instance->fdd_earfcn_UL[i]           = x2ap_register_eNB->fdd_earfcn_UL[i];
+    }
+
     DevCheck(x2ap_register_eNB->nb_x2 <= X2AP_MAX_NB_ENB_IP_ADDRESS,
              X2AP_MAX_NB_ENB_IP_ADDRESS, x2ap_register_eNB->nb_x2, 0);
     memcpy(new_instance->target_enb_x2_ip_address,
@@ -432,8 +445,8 @@ void *x2ap_task(void *arg)
       break;
 
     case SCTP_DATA_IND:
-      //x2ap_eNB_handle_sctp_data_ind(ITTI_MESSAGE_GET_INSTANCE(received_msg),
-	//			    &received_msg->ittiMsg.sctp_data_ind);
+      x2ap_eNB_handle_sctp_data_ind(ITTI_MESSAGE_GET_INSTANCE(received_msg),
+                                           &received_msg->ittiMsg.sctp_data_ind);
       break;
 
     default:
diff --git a/openair2/X2AP/x2ap_eNB_decoder.c b/openair2/X2AP/x2ap_eNB_decoder.c
new file mode 100644
index 0000000000000000000000000000000000000000..f156d96d175beab05523d01625cd34324bc1e1a5
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_decoder.c
@@ -0,0 +1,127 @@
+/*
+ * 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
+ */
+
+#include <stdio.h>
+
+#include "assertions.h"
+#include "intertask_interface.h"
+#include "x2ap_common.h"
+#include "x2ap_eNB_decoder.h"
+
+static int x2ap_eNB_decode_initiating_message(X2AP_X2AP_PDU_t *pdu)
+{
+  DevAssert(pdu != NULL);
+
+  switch(pdu->choice.initiatingMessage.procedureCode) {
+
+    case X2AP_ProcedureCode_id_x2Setup:
+      asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_X2AP_X2AP_PDU, pdu);
+      X2AP_INFO("x2ap_eNB_decode_initiating_message!\n");
+      break;
+
+    default:
+      X2AP_ERROR("Unknown procedure ID (%d) for initiating message\n",
+                  (int)pdu->choice.initiatingMessage.procedureCode);
+      AssertFatal( 0, "Unknown procedure ID (%d) for initiating message\n",
+                   (int)pdu->choice.initiatingMessage.procedureCode);
+      return -1;
+  }
+
+  return 0;
+}
+
+static int x2ap_eNB_decode_successful_outcome(X2AP_X2AP_PDU_t *pdu)
+{
+  DevAssert(pdu != NULL);
+
+  switch(pdu->choice.successfulOutcome.procedureCode) {
+    case X2AP_ProcedureCode_id_x2Setup:
+      asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_X2AP_X2AP_PDU, pdu);
+      X2AP_INFO("x2ap_eNB_decode_successfuloutcome_message!\n");
+      break;
+
+    default:
+      X2AP_ERROR("Unknown procedure ID (%d) for successfull outcome message\n",
+                  (int)pdu->choice.successfulOutcome.procedureCode);
+      return -1;
+  }
+
+  return 0;
+}
+
+static int x2ap_eNB_decode_unsuccessful_outcome(X2AP_X2AP_PDU_t *pdu)
+{
+  DevAssert(pdu != NULL);
+
+  switch(pdu->choice.unsuccessfulOutcome.procedureCode) {
+    case X2AP_ProcedureCode_id_x2Setup:
+      asn_encode_to_new_buffer(NULL, ATS_CANONICAL_XER, &asn_DEF_X2AP_X2AP_PDU, pdu);
+      X2AP_INFO("x2ap_eNB_decode_unsuccessfuloutcome_message!\n");
+      break;
+
+    default:
+       X2AP_ERROR("Unknown procedure ID (%d) for unsuccessfull outcome message\n",
+                  (int)pdu->choice.unsuccessfulOutcome.procedureCode);
+      return -1;
+  }
+
+  return 0;
+}
+
+int x2ap_eNB_decode_pdu(X2AP_X2AP_PDU_t *pdu, const uint8_t *const buffer, uint32_t length)
+{
+  asn_dec_rval_t dec_ret;
+
+  DevAssert(buffer != NULL);
+
+  dec_ret = aper_decode(NULL,
+                        &asn_DEF_X2AP_X2AP_PDU,
+                        (void **)&pdu,
+                        buffer,
+                        length,
+                        0,
+                        0);
+
+  xer_fprint(stdout, &asn_DEF_X2AP_X2AP_PDU, pdu);
+
+  if (dec_ret.code != RC_OK) {
+    X2AP_ERROR("Failed to decode pdu\n");
+    return -1;
+  }
+
+  switch(pdu->present) {
+    case X2AP_X2AP_PDU_PR_initiatingMessage:
+      return x2ap_eNB_decode_initiating_message(pdu);
+
+    case X2AP_X2AP_PDU_PR_successfulOutcome:
+      return x2ap_eNB_decode_successful_outcome(pdu);
+
+    case X2AP_X2AP_PDU_PR_unsuccessfulOutcome:
+      return x2ap_eNB_decode_unsuccessful_outcome(pdu);
+
+    default:
+      X2AP_DEBUG("Unknown presence (%d) or not implemented\n", (int)pdu->present);
+      break;
+  }
+
+
+  return -1;
+}
diff --git a/openair2/X2AP/x2ap_eNB_decoder.h b/openair2/X2AP/x2ap_eNB_decoder.h
new file mode 100644
index 0000000000000000000000000000000000000000..9ce9ea3d40ef039a9c36c45163bdeb2969b0b9fb
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_decoder.h
@@ -0,0 +1,29 @@
+/*
+ * 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
+ */
+
+#ifndef X2AP_ENB_DECODER_H_
+#define X2AP_ENB_DECODER_H_
+
+int x2ap_eNB_decode_pdu(X2AP_X2AP_PDU_t *pdu, const uint8_t *const buffer, uint32_t length)
+__attribute__ ((warn_unused_result));
+
+#endif /* X2AP_ENB_DECODER_H_ */
+
diff --git a/openair2/X2AP/x2ap_eNB_defs.h b/openair2/X2AP/x2ap_eNB_defs.h
index 11b4434dc0ae5c1146aff0faa151d18664c8f779..3014290206913e516b046bfc5dbab94fa64397b1 100644
--- a/openair2/X2AP/x2ap_eNB_defs.h
+++ b/openair2/X2AP/x2ap_eNB_defs.h
@@ -151,6 +151,17 @@ typedef struct x2ap_eNB_instance_s {
   uint16_t  mnc;
   uint8_t   mnc_digit_length;
 
+  /* CC params */
+  int16_t                 eutra_band[MAX_NUM_CCs];
+  uint32_t                downlink_frequency[MAX_NUM_CCs];
+  int32_t                 uplink_frequency_offset[MAX_NUM_CCs];
+  uint32_t                Nid_cell[MAX_NUM_CCs];
+  int16_t                 N_RB_DL[MAX_NUM_CCs];
+  lte_frame_type_t        frame_type[MAX_NUM_CCs];
+  uint32_t                fdd_earfcn_DL[MAX_NUM_CCs];
+  uint32_t                fdd_earfcn_UL[MAX_NUM_CCs];
+  int                     num_cc;
+
   net_ip_address_t target_enb_x2_ip_address[X2AP_MAX_NB_ENB_IP_ADDRESS];
   uint8_t          nb_x2;
   net_ip_address_t enb_x2_ip_address;
diff --git a/openair2/X2AP/x2ap_eNB_encoder.c b/openair2/X2AP/x2ap_eNB_encoder.c
new file mode 100644
index 0000000000000000000000000000000000000000..1eb617a7f1ddec817a88648fe25ddbef2ac9ad7c
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_encoder.c
@@ -0,0 +1,54 @@
+/*
+ * 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
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+
+#include "assertions.h"
+#include "conversions.h"
+#include "intertask_interface.h"
+#include "x2ap_common.h"
+#include "x2ap_eNB_encoder.h"
+
+int x2ap_eNB_encode_pdu(X2AP_X2AP_PDU_t *pdu, uint8_t **buffer, uint32_t *len)
+{
+  ssize_t    encoded;
+
+  DevAssert(pdu != NULL);
+  DevAssert(buffer != NULL);
+  DevAssert(len != NULL);
+
+  if (asn1_xer_print) {
+    xer_fprint(stdout, &asn_DEF_X2AP_X2AP_PDU, (void *)pdu);
+  }
+
+  encoded = aper_encode_to_new_buffer(&asn_DEF_X2AP_X2AP_PDU, 0, pdu, (void **)buffer);
+
+  if (encoded < 0) {
+    return -1;
+  }
+
+  *len = encoded;
+
+  ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_X2AP_X2AP_PDU, pdu);
+  return encoded;
+}
diff --git a/openair2/X2AP/x2ap_eNB_encoder.h b/openair2/X2AP/x2ap_eNB_encoder.h
new file mode 100644
index 0000000000000000000000000000000000000000..04c77583b4f27c05fcc723100784bf418bf26c3a
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_encoder.h
@@ -0,0 +1,28 @@
+/*
+ * 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
+ */
+
+#ifndef X2AP_ENB_ENCODER_H_
+#define X2AP_ENB_ENCODER_H_
+
+int x2ap_eNB_encode_pdu(X2AP_X2AP_PDU_t *pdu, uint8_t **buffer, uint32_t *len)
+__attribute__ ((warn_unused_result));
+
+#endif /* X2AP_ENB_ENCODER_H_ */
diff --git a/openair2/X2AP/x2ap_eNB_generate_messages.c b/openair2/X2AP/x2ap_eNB_generate_messages.c
new file mode 100644
index 0000000000000000000000000000000000000000..9c5a281506730409d8cf9b7048e4d68b90e826a7
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_generate_messages.c
@@ -0,0 +1,405 @@
+/*
+ * 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
+ */
+
+#include "intertask_interface.h"
+
+#include "x2ap_common.h"
+#include "x2ap_eNB.h"
+#include "x2ap_eNB_generate_messages.h"
+#include "x2ap_eNB_encoder.h"
+
+#include "x2ap_eNB_itti_messaging.h"
+
+#include "msc.h"
+#include "assertions.h"
+#include "conversions.h"
+
+int x2ap_eNB_generate_x2_setup_request(
+  x2ap_eNB_instance_t *instance_p, x2ap_eNB_data_t *x2ap_eNB_data_p)
+{
+  X2AP_X2AP_PDU_t                     pdu;
+  X2AP_X2SetupRequest_t              *out;
+  X2AP_X2SetupRequest_IEs_t          *ie;
+  X2AP_PLMN_Identity_t               *plmn;
+  ServedCells__Member                *servedCellMember;
+  X2AP_GU_Group_ID_t                 *gu;
+
+  uint8_t  *buffer;
+  uint32_t  len;
+  int       ret = 0;
+
+  DevAssert(instance_p != NULL);
+  DevAssert(x2ap_eNB_data_p != NULL);
+
+  x2ap_eNB_data_p->state = X2AP_ENB_STATE_WAITING;
+
+  /* Prepare the X2AP message to encode */
+  memset(&pdu, 0, sizeof(pdu));
+  pdu.present = X2AP_X2AP_PDU_PR_initiatingMessage;
+  pdu.choice.initiatingMessage.procedureCode = X2AP_ProcedureCode_id_x2Setup;
+  pdu.choice.initiatingMessage.criticality = X2AP_Criticality_reject;
+  pdu.choice.initiatingMessage.value.present = X2AP_InitiatingMessage__value_PR_X2SetupRequest;
+  out = &pdu.choice.initiatingMessage.value.choice.X2SetupRequest;
+
+  /* mandatory */
+  ie = (X2AP_X2SetupRequest_IEs_t *)calloc(1, sizeof(X2AP_X2SetupRequest_IEs_t));
+  ie->id = X2AP_ProtocolIE_ID_id_GlobalENB_ID;
+  ie->criticality = X2AP_Criticality_reject;
+  ie->value.present = X2AP_X2SetupRequest_IEs__value_PR_GlobalENB_ID;
+  MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,
+                    &ie->value.choice.GlobalENB_ID.pLMN_Identity);
+  ie->value.choice.GlobalENB_ID.eNB_ID.present = X2AP_ENB_ID_PR_macro_eNB_ID;
+  MACRO_ENB_ID_TO_BIT_STRING(instance_p->eNB_id,
+                             &ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID);
+  X2AP_INFO("%d -> %02x%02x%02x\n", instance_p->eNB_id,
+            ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf[0],
+            ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf[1],
+            ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf[2]);
+  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+  /* mandatory */
+  ie = (X2AP_X2SetupRequest_IEs_t *)calloc(1, sizeof(X2AP_X2SetupRequest_IEs_t));
+  ie->id = X2AP_ProtocolIE_ID_id_ServedCells;
+  ie->criticality = X2AP_Criticality_reject;
+  ie->value.present = X2AP_X2SetupRequest_IEs__value_PR_ServedCells;
+  {
+    for (int i = 0; i<instance_p->num_cc; i++){
+      servedCellMember = (ServedCells__Member *)calloc(1,sizeof(ServedCells__Member));
+      {
+        servedCellMember->servedCellInfo.pCI = instance_p->Nid_cell[i];
+
+        MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,
+                      &servedCellMember->servedCellInfo.cellId.pLMN_Identity);
+        MACRO_ENB_ID_TO_CELL_IDENTITY(instance_p->eNB_id,0,
+                                   &servedCellMember->servedCellInfo.cellId.eUTRANcellIdentifier);
+
+        INT16_TO_OCTET_STRING(instance_p->tac, &servedCellMember->servedCellInfo.tAC);
+        plmn = (X2AP_PLMN_Identity_t *)calloc(1,sizeof(X2AP_PLMN_Identity_t));
+        {
+          MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length, plmn);
+          ASN_SEQUENCE_ADD(&servedCellMember->servedCellInfo.broadcastPLMNs.list, plmn);
+        }
+
+	if (instance_p->frame_type[i] == FDD) {
+          servedCellMember->servedCellInfo.eUTRA_Mode_Info.present = X2AP_EUTRA_Mode_Info_PR_fDD;
+          servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_EARFCN = instance_p->fdd_earfcn_DL[i];
+          servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_EARFCN = instance_p->fdd_earfcn_UL[i];
+          switch (instance_p->N_RB_DL[i]) {
+            case 6:
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw6;
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw6;
+              break;
+            case 15:
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw15;
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw15;
+              break;
+            case 25:
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw25;
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw25;
+              break;
+            case 50:
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw50;
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw50;
+              break;
+            case 75:
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw75;
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw75;
+              break;
+            case 100:
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw100;
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw100;
+              break;
+            default:
+              AssertFatal(0,"Failed: Check value for N_RB_DL/N_RB_UL");
+              break;
+          }
+        }
+        else {
+          AssertFatal(0,"X2Setuprequest not supported for TDD!");
+        }
+      }
+      ASN_SEQUENCE_ADD(&ie->value.choice.ServedCells.list, servedCellMember);
+    }
+  }
+  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+  /* mandatory */
+  ie = (X2AP_X2SetupRequest_IEs_t *)calloc(1, sizeof(X2AP_X2SetupRequest_IEs_t));
+  ie->id = X2AP_ProtocolIE_ID_id_GUGroupIDList;
+  ie->criticality = X2AP_Criticality_reject;
+  ie->value.present = X2AP_X2SetupRequest_IEs__value_PR_GUGroupIDList;
+  {
+    gu = (X2AP_GU_Group_ID_t *)calloc(1, sizeof(X2AP_GU_Group_ID_t));
+    {
+      MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,
+                    &gu->pLMN_Identity);
+      //@TODO: consider to update this value
+      INT16_TO_OCTET_STRING(0, &gu->mME_Group_ID);
+    }
+    ASN_SEQUENCE_ADD(&ie->value.choice.GUGroupIDList.list, gu);
+  }
+  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+  if (x2ap_eNB_encode_pdu(&pdu, &buffer, &len) < 0) {
+    X2AP_ERROR("Failed to encode X2 setup request\n");
+    return -1;
+  }
+
+  MSC_LOG_TX_MESSAGE (MSC_X2AP_SRC_ENB, MSC_X2AP_TARGET_ENB, NULL, 0, "0 X2Setup/initiatingMessage assoc_id %u", x2ap_eNB_data_p->assoc_id);
+
+  x2ap_eNB_itti_send_sctp_data_req(instance_p->instance, x2ap_eNB_data_p->assoc_id, buffer, len, 0);
+
+  return ret;
+}
+
+int x2ap_eNB_generate_x2_setup_response(x2ap_eNB_data_t *x2ap_eNB_data_p)
+{
+  X2AP_X2AP_PDU_t                     pdu;
+  X2AP_X2SetupResponse_t              *out;
+  X2AP_X2SetupResponse_IEs_t          *ie;
+  X2AP_PLMN_Identity_t                *plmn;
+  ServedCells__Member                 *servedCellMember;
+  X2AP_GU_Group_ID_t                  *gu;
+
+  x2ap_eNB_instance_t                 *instance_p;
+
+  uint8_t  *buffer;
+  uint32_t  len;
+  int       ret = 0;
+
+  DevAssert(x2ap_eNB_data_p != NULL);
+
+  /* get the eNB instance */
+  instance_p = x2ap_eNB_data_p->x2ap_eNB_instance;
+
+  DevAssert(instance_p != NULL);
+
+  /* Prepare the X2AP message to encode */
+  memset(&pdu, 0, sizeof(pdu));
+  pdu.present = X2AP_X2AP_PDU_PR_successfulOutcome;
+  pdu.choice.successfulOutcome.procedureCode = X2AP_ProcedureCode_id_x2Setup;
+  pdu.choice.successfulOutcome.criticality = X2AP_Criticality_reject;
+  pdu.choice.successfulOutcome.value.present = X2AP_SuccessfulOutcome__value_PR_X2SetupResponse;
+  out = &pdu.choice.successfulOutcome.value.choice.X2SetupResponse;
+
+  /* mandatory */
+  ie = (X2AP_X2SetupResponse_IEs_t *)calloc(1, sizeof(X2AP_X2SetupResponse_IEs_t));
+  ie->id = X2AP_ProtocolIE_ID_id_GlobalENB_ID;
+  ie->criticality = X2AP_Criticality_reject;
+  ie->value.present = X2AP_X2SetupResponse_IEs__value_PR_GlobalENB_ID;
+  MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,
+                    &ie->value.choice.GlobalENB_ID.pLMN_Identity);
+  ie->value.choice.GlobalENB_ID.eNB_ID.present = X2AP_ENB_ID_PR_macro_eNB_ID;
+  MACRO_ENB_ID_TO_BIT_STRING(instance_p->eNB_id,
+                             &ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID);
+  X2AP_INFO("%d -> %02x%02x%02x\n", instance_p->eNB_id,
+            ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf[0],
+            ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf[1],
+            ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf[2]);
+  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+  /* mandatory */
+  ie = (X2AP_X2SetupResponse_IEs_t *)calloc(1, sizeof(X2AP_X2SetupResponse_IEs_t));
+  ie->id = X2AP_ProtocolIE_ID_id_ServedCells;
+  ie->criticality = X2AP_Criticality_reject;
+  ie->value.present = X2AP_X2SetupResponse_IEs__value_PR_ServedCells;
+  {
+    for (int i = 0; i<instance_p->num_cc; i++){
+      servedCellMember = (ServedCells__Member *)calloc(1,sizeof(ServedCells__Member));
+      {
+        servedCellMember->servedCellInfo.pCI = instance_p->Nid_cell[i];
+
+        MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,
+                      &servedCellMember->servedCellInfo.cellId.pLMN_Identity);
+        MACRO_ENB_ID_TO_CELL_IDENTITY(instance_p->eNB_id,0,
+                                   &servedCellMember->servedCellInfo.cellId.eUTRANcellIdentifier);
+
+        INT16_TO_OCTET_STRING(instance_p->tac, &servedCellMember->servedCellInfo.tAC);
+        plmn = (X2AP_PLMN_Identity_t *)calloc(1,sizeof(X2AP_PLMN_Identity_t));
+        {
+          MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length, plmn);
+          ASN_SEQUENCE_ADD(&servedCellMember->servedCellInfo.broadcastPLMNs.list, plmn);
+        }
+
+	if (instance_p->frame_type[i] == FDD) {
+          servedCellMember->servedCellInfo.eUTRA_Mode_Info.present = X2AP_EUTRA_Mode_Info_PR_fDD;
+          servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_EARFCN = instance_p->fdd_earfcn_DL[i];
+          servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_EARFCN = instance_p->fdd_earfcn_UL[i];
+          switch (instance_p->N_RB_DL[i]) {
+            case 6:
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw6;
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw6;
+              break;
+            case 15:
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw15;
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw15;
+              break;
+            case 25:
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw25;
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw25;
+              break;
+            case 50:
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw50;
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw50;
+              break;
+            case 75:
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw75;
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw75;
+              break;
+            case 100:
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.uL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw100;
+              servedCellMember->servedCellInfo.eUTRA_Mode_Info.choice.fDD.dL_Transmission_Bandwidth = X2AP_Transmission_Bandwidth_bw100;
+              break;
+            default:
+              AssertFatal(0,"Failed: Check value for N_RB_DL/N_RB_UL");
+              break;
+          }
+        }
+        else {
+          AssertFatal(0,"X2Setupresponse not supported for TDD!");
+        }
+      }
+      ASN_SEQUENCE_ADD(&ie->value.choice.ServedCells.list, servedCellMember);
+    }
+  }
+  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+  /* mandatory */
+  ie = (X2AP_X2SetupResponse_IEs_t *)calloc(1, sizeof(X2AP_X2SetupResponse_IEs_t));
+  ie->id = X2AP_ProtocolIE_ID_id_GUGroupIDList;
+  ie->criticality = X2AP_Criticality_reject;
+  ie->value.present = X2AP_X2SetupResponse_IEs__value_PR_GUGroupIDList;
+  {
+    gu = (X2AP_GU_Group_ID_t *)calloc(1, sizeof(X2AP_GU_Group_ID_t));
+    {
+      MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,
+                    &gu->pLMN_Identity);
+      //@TODO: consider to update this value
+      INT16_TO_OCTET_STRING(0, &gu->mME_Group_ID);
+    }
+    ASN_SEQUENCE_ADD(&ie->value.choice.GUGroupIDList.list, gu);
+  }
+  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+  if (x2ap_eNB_encode_pdu(&pdu, &buffer, &len) < 0) {
+    X2AP_ERROR("Failed to encode X2 setup response\n");
+    return -1;
+  }
+
+  x2ap_eNB_data_p->state = X2AP_ENB_STATE_READY;
+
+  MSC_LOG_TX_MESSAGE (MSC_X2AP_SRC_ENB, MSC_X2AP_TARGET_ENB, NULL, 0, "0 X2Setup/successfulOutcome assoc_id %u", x2ap_eNB_data_p->assoc_id);
+
+  x2ap_eNB_itti_send_sctp_data_req(instance_p->instance, x2ap_eNB_data_p->assoc_id, buffer, len, 0);
+
+  return ret;
+}
+
+int x2ap_eNB_generate_x2_setup_failure(instance_t instance,
+                                       uint32_t assoc_id,
+                                       X2AP_Cause_PR cause_type,
+                                       long cause_value,
+                                       long time_to_wait)
+{
+  X2AP_X2AP_PDU_t                     pdu;
+  X2AP_X2SetupFailure_t              *out;
+  X2AP_X2SetupFailure_IEs_t          *ie;
+
+  uint8_t  *buffer;
+  uint32_t  len;
+  int       ret = 0;
+
+  /* Prepare the X2AP message to encode */
+  memset(&pdu, 0, sizeof(pdu));
+  pdu.present = X2AP_X2AP_PDU_PR_unsuccessfulOutcome;
+  pdu.choice.unsuccessfulOutcome.procedureCode = X2AP_ProcedureCode_id_x2Setup;
+  pdu.choice.unsuccessfulOutcome.criticality = X2AP_Criticality_reject;
+  pdu.choice.unsuccessfulOutcome.value.present = X2AP_UnsuccessfulOutcome__value_PR_X2SetupFailure;
+  out = &pdu.choice.unsuccessfulOutcome.value.choice.X2SetupFailure;
+
+  /* mandatory */
+  ie = (X2AP_X2SetupFailure_IEs_t *)calloc(1, sizeof(X2AP_X2SetupFailure_IEs_t));
+  ie->id = X2AP_ProtocolIE_ID_id_Cause;
+  ie->criticality = X2AP_Criticality_ignore;
+  ie->value.present = X2AP_X2SetupFailure_IEs__value_PR_Cause;
+
+  x2ap_eNB_set_cause (&ie->value.choice.Cause, cause_type, cause_value);
+
+  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+  /* optional: consider to handle this later */
+  ie = (X2AP_X2SetupFailure_IEs_t *)calloc(1, sizeof(X2AP_X2SetupFailure_IEs_t));
+  ie->id = X2AP_ProtocolIE_ID_id_TimeToWait;
+  ie->criticality = X2AP_Criticality_ignore;
+  ie->value.present = X2AP_X2SetupFailure_IEs__value_PR_TimeToWait;
+
+  if (time_to_wait > -1) {
+    ie->value.choice.TimeToWait = time_to_wait;
+  }
+
+  ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
+
+  if (x2ap_eNB_encode_pdu(&pdu, &buffer, &len) < 0) {
+    X2AP_ERROR("Failed to encode X2 setup failure\n");
+    return -1;
+  }
+
+  MSC_LOG_TX_MESSAGE (MSC_X2AP_SRC_ENB,
+                      MSC_X2AP_TARGET_ENB, NULL, 0,
+                      "0 X2Setup/unsuccessfulOutcome  assoc_id %u cause %u value %u",
+                      assoc_id, cause_type, cause_value);
+
+  x2ap_eNB_itti_send_sctp_data_req(instance, assoc_id, buffer, len, 0);
+
+  return ret;
+}
+
+int x2ap_eNB_set_cause (X2AP_Cause_t * cause_p,
+                        X2AP_Cause_PR cause_type,
+                        long cause_value)
+{
+
+  DevAssert (cause_p != NULL);
+  cause_p->present = cause_type;
+
+  switch (cause_type) {
+  case X2AP_Cause_PR_radioNetwork:
+    cause_p->choice.misc = cause_value;
+    break;
+
+  case X2AP_Cause_PR_transport:
+    cause_p->choice.misc = cause_value;
+    break;
+
+  case X2AP_Cause_PR_protocol:
+    cause_p->choice.misc = cause_value;
+    break;
+
+  case X2AP_Cause_PR_misc:
+    cause_p->choice.misc = cause_value;
+    break;
+
+  default:
+    return -1;
+  }
+
+  return 0;
+}
diff --git a/openair2/X2AP/x2ap_eNB_generate_messages.h b/openair2/X2AP/x2ap_eNB_generate_messages.h
new file mode 100644
index 0000000000000000000000000000000000000000..a72b37e743da4ff24bdd8cd827ec0ffaeec47713
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_generate_messages.h
@@ -0,0 +1,44 @@
+/*
+ * 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
+ */
+
+#ifndef X2AP_ENB_GENERATE_MESSAGES_H_
+#define X2AP_ENB_GENERATE_MESSAGES_H_
+
+#include "x2ap_eNB_defs.h"
+#include "x2ap_common.h"
+
+int x2ap_eNB_generate_x2_setup_request(x2ap_eNB_instance_t *instance_p,
+				       x2ap_eNB_data_t *x2ap_enb_data_p);
+
+int x2ap_eNB_generate_x2_setup_response(x2ap_eNB_data_t *x2ap_enb_data_p);
+
+int x2ap_eNB_generate_x2_setup_failure(instance_t instance,
+                                       uint32_t assoc_id,
+                                       X2AP_Cause_PR cause_type,
+                                       long cause_value,
+                                       long time_to_wait);
+
+int x2ap_eNB_set_cause (X2AP_Cause_t * cause_p,
+                        X2AP_Cause_PR cause_type,
+                        long cause_value);
+
+#endif /*  X2AP_ENB_GENERATE_MESSAGES_H_ */
+
diff --git a/openair2/X2AP/x2ap_eNB_handler.c b/openair2/X2AP/x2ap_eNB_handler.c
index 180535baa69d932ab85e59ffe40940a4cc362ba6..a16a3da5a8ac9d3b5fd998875fed3e61cd8cc5fc 100644
--- a/openair2/X2AP/x2ap_eNB_handler.c
+++ b/openair2/X2AP/x2ap_eNB_handler.c
@@ -27,12 +27,72 @@
 #include "x2ap_common.h"
 #include "x2ap_eNB_defs.h"
 #include "x2ap_eNB_handler.h"
+#include "x2ap_eNB_decoder.h"
 
 #include "x2ap_eNB_management_procedures.h"
+#include "x2ap_eNB_generate_messages.h"
 
+#include "msc.h"
 #include "assertions.h"
 #include "conversions.h"
 
+static
+int x2ap_eNB_handle_x2_setup_request (instance_t instance,
+                                      uint32_t assoc_id,
+                                      uint32_t stream,
+                                      X2AP_X2AP_PDU_t *pdu);
+static
+int x2ap_eNB_handle_x2_setup_response (instance_t instance,
+                                       uint32_t assoc_id,
+                                       uint32_t stream,
+                                       X2AP_X2AP_PDU_t *pdu);
+static
+int x2ap_eNB_handle_x2_setup_failure (instance_t instance,
+                                      uint32_t assoc_id,
+                                      uint32_t stream,
+                                      X2AP_X2AP_PDU_t *pdu);
+
+/* Handlers matrix. Only eNB related procedure present here */
+x2ap_message_decoded_callback x2ap_messages_callback[][3] = {
+  { 0, 0, 0 }, /* handoverPreparation */
+  { 0, 0, 0 }, /* handoverCancel */
+  { 0, 0, 0 }, /* loadIndication */
+  { 0, 0, 0 }, /* errorIndication */
+  { 0, 0, 0 }, /* snStatusTransfer */
+  { 0, 0, 0 }, /* uEContextRelease */
+  { x2ap_eNB_handle_x2_setup_request, x2ap_eNB_handle_x2_setup_response, x2ap_eNB_handle_x2_setup_failure }, /* x2Setup */
+  { 0, 0, 0 }, /* reset */
+  { 0, 0, 0 }, /* eNBConfigurationUpdate */
+  { 0, 0, 0 }, /* resourceStatusReportingInitiation */
+  { 0, 0, 0 }, /* resourceStatusReporting */
+  { 0, 0, 0 }, /* privateMessage */
+  { 0, 0, 0 }, /* mobilitySettingsChange */
+  { 0, 0, 0 }, /* rLFIndication */
+  { 0, 0, 0 }, /* handoverReport */
+  { 0, 0, 0 }, /* cellActivation */
+  { 0, 0, 0 }, /* x2Release */
+  { 0, 0, 0 }, /* x2APMessageTransfer */
+  { 0, 0, 0 }, /* x2Removal */
+  { 0, 0, 0 }, /* seNBAdditionPreparation */
+  { 0, 0, 0 }, /* seNBReconfigurationCompletion */
+  { 0, 0, 0 }, /* meNBinitiatedSeNBModificationPreparation */
+  { 0, 0, 0 }, /* seNBinitiatedSeNBModification */
+  { 0, 0, 0 }, /* meNBinitiatedSeNBRelease */
+  { 0, 0, 0 }, /* seNBinitiatedSeNBRelease */
+  { 0, 0, 0 }, /* seNBCounterCheck */
+  { 0, 0, 0 }  /* retrieveUEContext */
+};
+
+char *x2ap_direction2String(int x2ap_dir) {
+static char *x2ap_direction_String[] = {
+  "", /* Nothing */
+  "Originating message", /* originating message */
+  "Successfull outcome", /* successfull outcome */
+  "UnSuccessfull outcome", /* successfull outcome */
+};
+return(x2ap_direction_String[x2ap_dir]);
+}
+
 void x2ap_handle_x2_setup_message(x2ap_eNB_data_t *enb_desc_p, int sctp_shutdown)
 {
   if (sctp_shutdown) {
@@ -77,3 +137,296 @@ void x2ap_handle_x2_setup_message(x2ap_eNB_data_t *enb_desc_p, int sctp_shutdown
     }
   }
 }
+
+
+int x2ap_eNB_handle_message(instance_t instance, uint32_t assoc_id, int32_t stream,
+                                const uint8_t *const data, const uint32_t data_length)
+{
+  X2AP_X2AP_PDU_t pdu;
+  int ret;
+
+  DevAssert(data != NULL);
+
+  memset(&pdu, 0, sizeof(pdu));
+
+  if (x2ap_eNB_decode_pdu(&pdu, data, data_length) < 0) {
+    X2AP_ERROR("Failed to decode PDU\n");
+    return -1;
+  }
+
+  /* Checking procedure Code and direction of message */
+  if (pdu.choice.initiatingMessage.procedureCode > sizeof(x2ap_messages_callback) / (3 * sizeof(
+        x2ap_message_decoded_callback))
+      || (pdu.present > X2AP_X2AP_PDU_PR_unsuccessfulOutcome)) {
+    X2AP_ERROR("[SCTP %d] Either procedureCode %ld or direction %d exceed expected\n",
+               assoc_id, pdu.choice.initiatingMessage.procedureCode, pdu.present);
+    ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_X2AP_X2AP_PDU, &pdu);
+    return -1;
+  }
+
+  /* No handler present.
+   * This can mean not implemented or no procedure for eNB (wrong direction).
+   */
+  if (x2ap_messages_callback[pdu.choice.initiatingMessage.procedureCode][pdu.present - 1] == NULL) {
+    X2AP_ERROR("[SCTP %d] No handler for procedureCode %ld in %s\n",
+                assoc_id, pdu.choice.initiatingMessage.procedureCode,
+               x2ap_direction2String(pdu.present - 1));
+    ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_X2AP_X2AP_PDU, &pdu);
+    return -1;
+  }
+
+  /* Calling the right handler */
+  ret = (*x2ap_messages_callback[pdu.choice.initiatingMessage.procedureCode][pdu.present - 1])
+        (instance, assoc_id, stream, &pdu);
+  ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_X2AP_X2AP_PDU, &pdu);
+  return ret;
+}
+
+int
+x2ap_eNB_handle_x2_setup_request(instance_t instance,
+                                 uint32_t assoc_id,
+                                 uint32_t stream,
+                                 X2AP_X2AP_PDU_t *pdu)
+{
+
+  X2AP_X2SetupRequest_t              *x2SetupRequest;
+  X2AP_X2SetupRequest_IEs_t          *ie;
+
+  x2ap_eNB_data_t                    *x2ap_eNB_data;
+  uint32_t                           eNB_id = 0;
+
+  DevAssert (pdu != NULL);
+  x2SetupRequest = &pdu->choice.initiatingMessage.value.choice.X2SetupRequest;
+
+  /*
+   * We received a new valid X2 Setup Request on a stream != 0.
+   * * * * This should not happen -> reject eNB x2 setup request.
+   */
+
+  if (stream != 0) {
+    X2AP_ERROR("Received new x2 setup request on stream != 0\n");
+      /*
+       * Send a x2 setup failure with protocol cause unspecified
+       */
+    return x2ap_eNB_generate_x2_setup_failure (instance,
+                                               assoc_id,
+                                               X2AP_Cause_PR_protocol,
+                                               X2AP_CauseProtocol_unspecified,
+                                               -1);
+  }
+
+  X2AP_DEBUG("Received a new X2 setup request\n");
+
+  X2AP_FIND_PROTOCOLIE_BY_ID(X2AP_X2SetupRequest_IEs_t, ie, x2SetupRequest,
+                             X2AP_ProtocolIE_ID_id_GlobalENB_ID, true);
+
+  if (ie->value.choice.GlobalENB_ID.eNB_ID.present == X2AP_ENB_ID_PR_home_eNB_ID) {
+    // Home eNB ID = 28 bits
+    uint8_t  *eNB_id_buf = ie->value.choice.GlobalENB_ID.eNB_ID.choice.home_eNB_ID.buf;
+
+    if (ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.size != 28) {
+      //TODO: handle case were size != 28 -> notify ? reject ?
+    }
+
+    eNB_id = (eNB_id_buf[0] << 20) + (eNB_id_buf[1] << 12) + (eNB_id_buf[2] << 4) + ((eNB_id_buf[3] & 0xf0) >> 4);
+    X2AP_DEBUG("Home eNB id: %07x\n", eNB_id);
+  } else {
+    // Macro eNB = 20 bits
+    uint8_t *eNB_id_buf = ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf;
+
+    if (ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.size != 20) {
+      //TODO: handle case were size != 20 -> notify ? reject ?
+    }
+
+    eNB_id = (eNB_id_buf[0] << 12) + (eNB_id_buf[1] << 4) + ((eNB_id_buf[2] & 0xf0) >> 4);
+    X2AP_DEBUG("macro eNB id: %05x\n", eNB_id);
+  }
+
+  X2AP_DEBUG("Adding eNB to the list of associated eNBs\n");
+
+  if ((x2ap_eNB_data = x2ap_is_eNB_id_in_list (eNB_id)) == NULL) {
+      /*
+       * eNB has not been found in list of associated eNB,
+       * * * * Add it to the tail of list and initialize data
+       */
+    if ((x2ap_eNB_data = x2ap_is_eNB_assoc_id_in_list (assoc_id)) == NULL) {
+      /*
+       * ??
+       */
+      return -1;
+    } else {
+      x2ap_eNB_data->state = X2AP_ENB_STATE_RESETTING;
+      x2ap_eNB_data->eNB_id = eNB_id;
+    }
+  } else {
+    x2ap_eNB_data->state = X2AP_ENB_STATE_RESETTING;
+    /*
+     * eNB has been found in list, consider the x2 setup request as a reset connection,
+     * * * * reseting any previous UE state if sctp association is != than the previous one
+     */
+    if (x2ap_eNB_data->assoc_id != assoc_id) {
+      /*
+       * ??: Send an overload cause...
+       */
+      X2AP_ERROR("Rejecting x2 setup request as eNB id %d is already associated to an active sctp association" "Previous known: %d, new one: %d\n", eNB_id, x2ap_eNB_data->assoc_id, assoc_id);
+
+      DevAssert(x2ap_eNB_data->x2ap_eNB_instance != NULL);
+      x2ap_eNB_generate_x2_setup_failure (x2ap_eNB_data->x2ap_eNB_instance->instance,
+                                          assoc_id,
+                                          X2AP_Cause_PR_protocol,
+                                          X2AP_CauseProtocol_unspecified,
+                                          -1);
+      return -1;
+    }
+    /*
+     * TODO: call the reset procedure
+     */
+  }
+
+  return x2ap_eNB_generate_x2_setup_response(x2ap_eNB_data);
+}
+
+static
+int x2ap_eNB_handle_x2_setup_response(instance_t instance,
+                                      uint32_t assoc_id,
+                                      uint32_t stream,
+                                      X2AP_X2AP_PDU_t *pdu)
+{
+
+  X2AP_X2SetupResponse_t              *x2SetupResponse;
+  X2AP_X2SetupResponse_IEs_t          *ie;
+
+  x2ap_eNB_data_t                     *x2ap_eNB_data;
+  uint32_t                            eNB_id = 0;
+
+  DevAssert (pdu != NULL);
+  x2SetupResponse = &pdu->choice.successfulOutcome.value.choice.X2SetupResponse;
+
+  /*
+   * We received a new valid X2 Setup Response on a stream != 0.
+   * * * * This should not happen -> reject eNB x2 setup response.
+   */
+
+  if (stream != 0) {
+    X2AP_ERROR("Received new x2 setup response on stream != 0\n");
+  }
+
+  if ((x2ap_eNB_data = x2ap_get_eNB(NULL, assoc_id, 0)) == NULL) {
+    X2AP_ERROR("[SCTP %d] Received X2 setup response for non existing "
+               "eNB context\n", assoc_id);
+    return -1;
+  }
+
+  X2AP_DEBUG("Received a new X2 setup response\n");
+
+  X2AP_FIND_PROTOCOLIE_BY_ID(X2AP_X2SetupResponse_IEs_t, ie, x2SetupResponse,
+                             X2AP_ProtocolIE_ID_id_GlobalENB_ID, true);
+
+  if (ie->value.choice.GlobalENB_ID.eNB_ID.present == X2AP_ENB_ID_PR_home_eNB_ID) {
+    // Home eNB ID = 28 bits
+    uint8_t  *eNB_id_buf = ie->value.choice.GlobalENB_ID.eNB_ID.choice.home_eNB_ID.buf;
+
+    if (ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.size != 28) {
+      //TODO: handle case were size != 28 -> notify ? reject ?
+    }
+
+    eNB_id = (eNB_id_buf[0] << 20) + (eNB_id_buf[1] << 12) + (eNB_id_buf[2] << 4) + ((eNB_id_buf[3] & 0xf0) >> 4);
+    X2AP_DEBUG("Home eNB id: %07x\n", eNB_id);
+  } else {
+    // Macro eNB = 20 bits
+    uint8_t *eNB_id_buf = ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.buf;
+
+    if (ie->value.choice.GlobalENB_ID.eNB_ID.choice.macro_eNB_ID.size != 20) {
+      //TODO: handle case were size != 20 -> notify ? reject ?
+    }
+
+    eNB_id = (eNB_id_buf[0] << 12) + (eNB_id_buf[1] << 4) + ((eNB_id_buf[2] & 0xf0) >> 4);
+    X2AP_DEBUG("macro eNB id: %05x\n", eNB_id);
+  }
+
+  X2AP_DEBUG("Adding eNB to the list of associated eNBs\n");
+
+  if ((x2ap_eNB_data = x2ap_is_eNB_id_in_list (eNB_id)) == NULL) {
+      /*
+       * eNB has not been found in list of associated eNB,
+       * * * * Add it to the tail of list and initialize data
+       */
+    if ((x2ap_eNB_data = x2ap_is_eNB_assoc_id_in_list (assoc_id)) == NULL) {
+      /*
+       * ??: Send an overload cause...
+       */
+      return -1;
+    } else {
+      x2ap_eNB_data->state = X2AP_ENB_STATE_RESETTING;
+      x2ap_eNB_data->eNB_id = eNB_id;
+    }
+  } else {
+    x2ap_eNB_data->state = X2AP_ENB_STATE_RESETTING;
+    /*
+     * TODO: call the reset procedure
+     */
+  }
+
+  /* Optionaly set the target eNB name */
+
+  /* The association is now ready as source and target eNBs know parameters of each other.
+   * Mark the association as connected.
+   */
+  x2ap_eNB_data->state = X2AP_ENB_STATE_READY;
+  x2ap_eNB_data->x2ap_eNB_instance->x2_target_enb_associated_nb ++;
+  x2ap_handle_x2_setup_message(x2ap_eNB_data, 0);
+
+  return 0;
+}
+
+static
+int x2ap_eNB_handle_x2_setup_failure(instance_t instance,
+                                     uint32_t assoc_id,
+                                     uint32_t stream,
+                                     X2AP_X2AP_PDU_t *pdu)
+{
+
+  X2AP_X2SetupFailure_t              *x2SetupFailure;
+  X2AP_X2SetupFailure_IEs_t          *ie;
+
+  x2ap_eNB_data_t                    *x2ap_eNB_data;
+
+  DevAssert(pdu != NULL);
+
+  x2SetupFailure = &pdu->choice.unsuccessfulOutcome.value.choice.X2SetupFailure;
+
+  /*
+   * We received a new valid X2 Setup Failure on a stream != 0.
+   * * * * This should not happen -> reject eNB x2 setup failure.
+  */
+
+  if (stream != 0) {
+    X2AP_WARN("[SCTP %d] Received x2 setup failure on stream != 0 (%d)\n",
+    assoc_id, stream);
+  }
+
+  if ((x2ap_eNB_data = x2ap_get_eNB (NULL, assoc_id, 0)) == NULL) {
+    X2AP_ERROR("[SCTP %d] Received X2 setup failure for non existing "
+    "eNB context\n", assoc_id);
+    return -1;
+  }
+
+  X2AP_DEBUG("Received a new X2 setup failure\n");
+
+  X2AP_FIND_PROTOCOLIE_BY_ID(X2AP_X2SetupFailure_IEs_t, ie, x2SetupFailure,
+                             X2AP_ProtocolIE_ID_id_Cause, true);
+
+
+  // need a FSM to handle all cases
+  if ((ie->value.choice.Cause.present == X2AP_Cause_PR_misc) &&
+      (ie->value.choice.Cause.choice.misc == X2AP_CauseMisc_unspecified)) {
+    X2AP_WARN("Received X2 setup failure for eNB ... eNB is not ready\n");
+  } else {
+    X2AP_ERROR("Received x2 setup failure for eNB... please check your parameters\n");
+  }
+
+  x2ap_eNB_data->state = X2AP_ENB_STATE_WAITING;
+  x2ap_handle_x2_setup_message(x2ap_eNB_data, 0);
+
+  return 0;
+}
diff --git a/openair2/X2AP/x2ap_eNB_handler.h b/openair2/X2AP/x2ap_eNB_handler.h
index 6d65c25a0a01e73bf7b543831b918508237dfc5e..0f93859a84213e273c3a19eac0dd158d1616212e 100644
--- a/openair2/X2AP/x2ap_eNB_handler.h
+++ b/openair2/X2AP/x2ap_eNB_handler.h
@@ -24,10 +24,10 @@
 
 #include "x2ap_eNB_defs.h"
 
-void x2ap_handle_x2_setup_message(x2ap_eNB_data_t *mme_desc_p, int sctp_shutdown);
+void x2ap_handle_x2_setup_message(x2ap_eNB_data_t *eNB_desc_p, int sctp_shutdown);
 
-//int x2ap_eNB_handle_message(uint32_t assoc_id, int32_t stream,
-  //                          const uint8_t * const data, const uint32_t data_length);
+int x2ap_eNB_handle_message(instance_t instance, uint32_t assoc_id, int32_t stream,
+                            const uint8_t * const data, const uint32_t data_length);
 
 #endif /* X2AP_ENB_HANDLERS_H_ */
 
diff --git a/openair2/X2AP/x2ap_eNB_itti_messaging.c b/openair2/X2AP/x2ap_eNB_itti_messaging.c
new file mode 100644
index 0000000000000000000000000000000000000000..d8e1e19afeeae608e1d44b18784ca1ec0aa293a6
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_itti_messaging.c
@@ -0,0 +1,56 @@
+/*
+ * 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
+ */
+
+#include "intertask_interface.h"
+
+#include "x2ap_eNB_itti_messaging.h"
+
+void x2ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,
+                                      uint32_t buffer_length, uint16_t stream)
+{
+  MessageDef      *message_p;
+  sctp_data_req_t *sctp_data_req;
+
+  message_p = itti_alloc_new_message(TASK_X2AP, SCTP_DATA_REQ);
+
+  sctp_data_req = &message_p->ittiMsg.sctp_data_req;
+
+  sctp_data_req->assoc_id      = assoc_id;
+  sctp_data_req->buffer        = buffer;
+  sctp_data_req->buffer_length = buffer_length;
+  sctp_data_req->stream        = stream;
+
+  itti_send_msg_to_task(TASK_SCTP, instance, message_p);
+}
+
+
+void x2ap_eNB_itti_send_sctp_close_association(instance_t instance, int32_t assoc_id)
+{
+  MessageDef               *message_p = NULL;
+  sctp_close_association_t *sctp_close_association_p = NULL;
+
+  message_p = itti_alloc_new_message(TASK_X2AP, SCTP_CLOSE_ASSOCIATION);
+  sctp_close_association_p = &message_p->ittiMsg.sctp_close_association;
+  sctp_close_association_p->assoc_id      = assoc_id;
+
+  itti_send_msg_to_task(TASK_SCTP, instance, message_p);
+}
+
diff --git a/openair2/X2AP/x2ap_eNB_itti_messaging.h b/openair2/X2AP/x2ap_eNB_itti_messaging.h
new file mode 100644
index 0000000000000000000000000000000000000000..55bf58b6605260c85c70b4d5887f768c42f3e49f
--- /dev/null
+++ b/openair2/X2AP/x2ap_eNB_itti_messaging.h
@@ -0,0 +1,32 @@
+/*
+ * 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
+ */
+
+#ifndef X2AP_ENB_ITTI_MESSAGING_H_
+#define X2AP_ENB_ITTI_MESSAGING_H_
+
+void x2ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,
+                                      uint32_t buffer_length, uint16_t stream);
+
+
+void x2ap_eNB_itti_send_sctp_close_association(instance_t instance, int32_t assoc_id);
+
+
+#endif /* X2AP_ENB_ITTI_MESSAGING_H_ */
diff --git a/openair3/GTPV1-U/gtpv1u_eNB.c b/openair3/GTPV1-U/gtpv1u_eNB.c
index 20c104ad1fa33a0ac7d2d43348d3e90e3debb69d..1e2cd85710752e7aff39f0241b56e833ef9e2781 100644
--- a/openair3/GTPV1-U/gtpv1u_eNB.c
+++ b/openair3/GTPV1-U/gtpv1u_eNB.c
@@ -49,120 +49,13 @@
 #include "common/utils/LOG/vcd_signal_dumper.h"
 #include "common/ran_context.h"
 #include "gtpv1u_eNB_defs.h"
+#include "gtpv1u_eNB_task.h"
 
 #undef GTP_DUMP_SOCKET
 
-/*
-extern boolean_t pdcp_data_req(
-  const protocol_ctxt_t* const  ctxt_pP,
-  const srb_flag_t     srb_flagP,
-  const rb_id_t        rb_idP,
-  const mui_t          muiP,
-  const confirm_t      confirmP,
-  const sdu_size_t     sdu_buffer_sizeP,
-  unsigned char *const sdu_buffer_pP,
-  const pdcp_transmission_mode_t modeP
-#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
-    ,const uint32_t * const sourceL2Id
-    ,const uint32_t * const destinationL2Id
-#endif
-    );
-
-  const pdcp_transmission_mode_t modeP);
-*/
 extern unsigned char NB_eNB_INST;
 extern RAN_CONTEXT_t RC;
 
-static int
-gtpv1u_eNB_send_init_udp(
-  uint16_t port_number);
-
-NwGtpv1uRcT
-gtpv1u_eNB_log_request(
-  NwGtpv1uLogMgrHandleT   hLogMgr,
-  uint32_t                  logLevel,
-  NwCharT                *file,
-  uint32_t                  line,
-  NwCharT                *logStr);
-
-NwGtpv1uRcT
-gtpv1u_eNB_send_udp_msg(
-  NwGtpv1uUdpHandleT      udpHandle,
-  uint8_t                  *buffer,
-  uint32_t                  buffer_len,
-  uint32_t                  buffer_offset,
-  uint32_t                  peerIpAddr,
-  uint16_t                  peerPort);
-
-NwGtpv1uRcT
-gtpv1u_eNB_process_stack_req(
-  NwGtpv1uUlpHandleT hUlp,
-  NwGtpv1uUlpApiT   *pUlpApi);
-
-int
-data_recv_callback(
-  uint16_t  portP,
-  uint32_t  address,
-  uint8_t  *buffer,
-  uint32_t  length,
-  void     *arg_p);
-//int
-//gtpv1u_create_tunnel_endpoint(
-//    gtpv1u_data_t *gtpv1u_data_pP,
-//    uint8_t        ue_idP,
-//    uint8_t        rab_idP,
-//    char          *sgw_ip_addr_pP,
-//    uint16_t       portP);
-static NwGtpv1uRcT
-gtpv1u_start_timer_wrapper(
-  NwGtpv1uTimerMgrHandleT tmrMgrHandle,
-  uint32_t                  timeoutSec,
-  uint32_t                  timeoutUsec,
-  uint32_t                  tmrType,
-  void                   *timeoutArg,
-  NwGtpv1uTimerHandleT   *hTmr);
-
-static NwGtpv1uRcT
-gtpv1u_stop_timer_wrapper(
-  NwGtpv1uTimerMgrHandleT     tmrMgrHandle,
-  NwGtpv1uTimerHandleT         hTmr);
-
-int
-gtpv1u_initial_req(
-  gtpv1u_data_t *gtpv1u_data_pP,
-  teid_t         teidP,
-  tcp_udp_port_t portP,
-  uint32_t       address);
-
-int
-gtpv1u_new_data_req(
-  uint8_t  enb_module_idP,
-  rnti_t   ue_rntiP,
-  uint8_t  rab_idP,
-  uint8_t *buffer_pP,
-  uint32_t buf_lenP,
-  uint32_t buf_offsetP
-);
-
-int
-gtpv1u_create_s1u_tunnel(
-  const instance_t instanceP,
-  const gtpv1u_enb_create_tunnel_req_t *  const create_tunnel_req_pP,
-        gtpv1u_enb_create_tunnel_resp_t * const create_tunnel_resp_pP);
-
-static int
-gtpv1u_delete_s1u_tunnel(
-  const instance_t instanceP,
-  const gtpv1u_enb_delete_tunnel_req_t * const req_pP);
-
-static int
-gtpv1u_eNB_init(void);
-
-void *
-gtpv1u_eNB_task(void *args);
-
-//static gtpv1u_data_t gtpv1u_data_g;
-
 #if defined(GTP_DUMP_SOCKET) && GTP_DUMP_SOCKET > 0
 #include <linux/if.h>
 static int           gtpv1u_dump_socket_g;
@@ -215,11 +108,11 @@ static void gtpv1u_eNB_write_dump_socket(uint8_t *buffer_pP, uint32_t buffer_len
 #endif
 
 //-----------------------------------------------------------------------------
-static int gtpv1u_eNB_send_init_udp(uint16_t port_number)
+static int gtpv1u_eNB_send_init_udp(const Gtpv1uS1Req * req)
 {
   // Create and alloc new message
   MessageDef *message_p;
-  struct in_addr addr;
+  struct in_addr addr={0};
 
   message_p = itti_alloc_new_message(TASK_GTPV1_U, UDP_INIT);
 
@@ -227,12 +120,10 @@ static int gtpv1u_eNB_send_init_udp(uint16_t port_number)
     return -1;
   }
 
-  UDP_INIT(message_p).port = port_number;
-  //LG UDP_INIT(message_p).address = "0.0.0.0"; //ANY address
-
-  addr.s_addr = RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up;
+  UDP_INIT(message_p).port = req->enb_port_for_S1u_S12_S4_up;
+  addr.s_addr = req->enb_ip_address_for_S1u_S12_S4_up;
   UDP_INIT(message_p).address = inet_ntoa(addr);
-  LOG_I(GTPU, "Tx UDP_INIT IP addr %s (%x)\n", UDP_INIT(message_p).address,RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up);
+  LOG_I(GTPU, "Tx UDP_INIT IP addr %s (%x)\n", UDP_INIT(message_p).address,UDP_INIT(message_p).port);
 
   MSC_LOG_EVENT(
 	  MSC_GTPU_ENB,
@@ -242,6 +133,16 @@ static int gtpv1u_eNB_send_init_udp(uint16_t port_number)
   return itti_send_msg_to_task(TASK_UDP, INSTANCE_DEFAULT, message_p);
 }
 
+static int gtpv1u_s1_req(
+  const instance_t                             instanceP,
+  const Gtpv1uS1Req * const req) {
+  memcpy(&RC.gtpv1u_data_g->enb_ip_address_for_S1u_S12_S4_up,
+	 &req->enb_ip_address_for_S1u_S12_S4_up, 
+	 sizeof (req->enb_ip_address_for_S1u_S12_S4_up));
+  gtpv1u_eNB_send_init_udp(req);
+  return 0;
+}
+
 //-----------------------------------------------------------------------------
 NwGtpv1uRcT gtpv1u_eNB_log_request(NwGtpv1uLogMgrHandleT hLogMgr,
                                    uint32_t logLevel,
@@ -999,23 +900,17 @@ static int gtpv1u_delete_s1u_tunnel(
 
 
 //-----------------------------------------------------------------------------
-static int gtpv1u_eNB_init(void)
+int gtpv1u_eNB_init(void)
 {
-  int                     ret;
   NwGtpv1uRcT             rc = NW_GTPV1U_FAILURE;
   NwGtpv1uUlpEntityT      ulp;
   NwGtpv1uUdpEntityT      udp;
   NwGtpv1uLogMgrEntityT   log;
   NwGtpv1uTimerMgrEntityT tmr;
 
-
   //  enb_properties_p = enb_config_get()->properties[0];
-  RC.gtpv1u_data_g = (gtpv1u_data_t*)malloc(sizeof(gtpv1u_data_t));
-  memset(RC.gtpv1u_data_g, 0, sizeof(gtpv1u_data_t));
-
-  RCconfig_gtpu();
-
-
+  RC.gtpv1u_data_g = (gtpv1u_data_t*)calloc(sizeof(gtpv1u_data_t),1);
+  
   LOG_I(GTPU, "Initializing GTPU stack %p\n",&RC.gtpv1u_data_g);
   //gtpv1u_data_g.gtpv1u_stack;
   /* Initialize UE hashtable */
@@ -1024,7 +919,6 @@ static int gtpv1u_eNB_init(void)
   RC.gtpv1u_data_g->teid_mapping    = hashtable_create (256, NULL, NULL);
   AssertFatal(RC.gtpv1u_data_g->teid_mapping != NULL, " ERROR Initializing TASK_GTPV1_U task interface: in hashtable_create\n");
 //  RC.gtpv1u_data_g.enb_ip_address_for_S1u_S12_S4_up         = enb_properties_p->enb_ipv4_address_for_S1U;
-  RC.gtpv1u_data_g->ip_addr         = NULL;
 
   //gtpv1u_data_g.udp_data;
   RC.gtpv1u_data_g->seq_num         = 0;
@@ -1089,35 +983,21 @@ static int gtpv1u_eNB_init(void)
   }
 
 #endif
-  ret = gtpv1u_eNB_send_init_udp(RC.gtpv1u_data_g->enb_port_for_S1u_S12_S4_up);
-
-  if (ret < 0) {
-    return ret;
-  }
 
   LOG_D(GTPU, "Initializing GTPV1U interface for eNB: DONE\n");
   return 0;
 }
 
-
 //-----------------------------------------------------------------------------
-void *gtpv1u_eNB_task(void *args)
-{
-  int                       rc = 0;
-  instance_t                instance;
-  //const char               *msg_name_p;
-
-  rc = gtpv1u_eNB_init();
-  AssertFatal(rc == 0, "gtpv1u_eNB_init Failed");
-  itti_mark_task_ready(TASK_GTPV1_U);
-  MSC_START_USE();
-
-  while(1) {
+void *gtpv1u_eNB_process_itti_msg(void *notUsed) {
     /* Trying to fetch a message from the message queue.
      * If the queue is empty, this function will block till a
      * message is sent to the task.
      */
+    instance_t  instance;
     MessageDef *received_message_p = NULL;
+    int         rc = 0;
+    
     itti_receive_msg(TASK_GTPV1_U, &received_message_p);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_ENB_TASK, VCD_FUNCTION_IN);
     DevAssert(received_message_p != NULL);
@@ -1127,6 +1007,9 @@ void *gtpv1u_eNB_task(void *args)
 
     switch (ITTI_MSG_ID(received_message_p)) {
 
+    case GTPV1U_ENB_S1_REQ:
+      gtpv1u_s1_req(instance, &received_message_p->ittiMsg.gtpv1uS1Req);
+
     case GTPV1U_ENB_DELETE_TUNNEL_REQ: {
       gtpv1u_delete_s1u_tunnel(instance, &received_message_p->ittiMsg.Gtpv1uDeleteTunnelReq);
     }
@@ -1258,6 +1141,22 @@ void *gtpv1u_eNB_task(void *args)
     AssertFatal(rc == EXIT_SUCCESS, "Failed to free memory (%d)!\n", rc);
     received_message_p = NULL;
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GTPV1U_ENB_TASK, VCD_FUNCTION_OUT);
+
+    return NULL;
+}
+
+//-----------------------------------------------------------------------------
+void *gtpv1u_eNB_task(void *args)
+{
+  int rc = 0;
+
+  rc = gtpv1u_eNB_init();
+  AssertFatal(rc == 0, "gtpv1u_eNB_init Failed");
+  itti_mark_task_ready(TASK_GTPV1_U);
+  MSC_START_USE();
+
+  while(1) {
+    (void) gtpv1u_eNB_process_itti_msg (NULL);
   }
 
   return NULL;
diff --git a/openair3/GTPV1-U/gtpv1u_eNB_defs.h b/openair3/GTPV1-U/gtpv1u_eNB_defs.h
index ddd996625ef614f7fb91a918c855526810acffb9..db928c4438d927cd333b59ac6caaef3b72513198 100644
--- a/openair3/GTPV1-U/gtpv1u_eNB_defs.h
+++ b/openair3/GTPV1-U/gtpv1u_eNB_defs.h
@@ -97,8 +97,6 @@ typedef struct gtpv1u_data_s {
   //RB_HEAD(gtpv1u_ue_map, gtpv1u_ue_data_s) gtpv1u_ue_map_head;
   /* Local IP address to use */
   in_addr_t             enb_ip_address_for_S1u_S12_S4_up;
-  char                 *ip_addr;
-  tcp_udp_port_t        enb_port_for_S1u_S12_S4_up;
   /* UDP internal data */
   //udp_data_t            udp_data;
 
diff --git a/openair3/GTPV1-U/gtpv1u_eNB_task.h b/openair3/GTPV1-U/gtpv1u_eNB_task.h
index 6afea103ef4892e158815779fd747f06bfe24a64..9830ea6169975439e708a840e20e29ea4af91cee 100644
--- a/openair3/GTPV1-U/gtpv1u_eNB_task.h
+++ b/openair3/GTPV1-U/gtpv1u_eNB_task.h
@@ -40,6 +40,8 @@ gtpv1u_new_data_req(
   uint32_t buf_len,
   uint32_t buf_offset);*/
 
+int   gtpv1u_eNB_init(void);
+void *gtpv1u_eNB_process_itti_msg(void*);
 void *gtpv1u_eNB_task(void *args);
 
 int
diff --git a/openair3/S1AP/s1ap_eNB.c b/openair3/S1AP/s1ap_eNB.c
index 2a6db4a5ce4361b08b4a9ffbd573ed6a6d13722e..a617963686d054d10842e55c78ecf8c19156f9fc 100644
--- a/openair3/S1AP/s1ap_eNB.c
+++ b/openair3/S1AP/s1ap_eNB.c
@@ -286,19 +286,20 @@ void s1ap_eNB_handle_sctp_data_ind(sctp_data_ind_t *sctp_data_ind)
   AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
 }
 
-void *s1ap_eNB_task(void *arg)
+void s1ap_eNB_init(void)
 {
-  MessageDef *received_msg = NULL;
-  int         result;
-
   S1AP_DEBUG("Starting S1AP layer\n");
 
   s1ap_eNB_prepare_internal_data();
 
   itti_mark_task_ready(TASK_S1AP);
   MSC_START_USE();
+}
 
-  while (1) {
+void *s1ap_eNB_process_itti_msg(void* notUsed)
+{
+  MessageDef *received_msg = NULL;
+  int         result;
     itti_receive_msg(TASK_S1AP, &received_msg);
 
     switch (ITTI_MSG_ID(received_msg)) {
@@ -413,6 +414,16 @@ void *s1ap_eNB_task(void *arg)
     AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
 
     received_msg = NULL;
+    return NULL;
+}
+
+
+void *s1ap_eNB_task(void *arg)
+{
+  s1ap_eNB_init();
+  
+  while (1) {
+    (void) s1ap_eNB_process_itti_msg(NULL);
   }
 
   return NULL;
diff --git a/openair3/S1AP/s1ap_eNB.h b/openair3/S1AP/s1ap_eNB.h
index e122703d82f2dbda6d5cf42b1bcbf08446a270a4..2abbc53ec992f288c14761eb31170e6134a046e0 100644
--- a/openair3/S1AP/s1ap_eNB.h
+++ b/openair3/S1AP/s1ap_eNB.h
@@ -39,6 +39,8 @@ extern s1ap_eNB_config_t s1ap_config;
 
 #define EPC_MODE_ENABLED       s1ap_config.mme_enabled
 
+void *s1ap_eNB_process_itti_msg(void*);
+void  s1ap_eNB_init(void);
 void *s1ap_eNB_task(void *arg);
 
 uint32_t s1ap_generate_eNB_id(void);
diff --git a/openair3/SCTP/sctp_eNB_task.c b/openair3/SCTP/sctp_eNB_task.c
index 6071b0da13d090babb3056c60371228cc207f0de..e7265d66d6485c25e74f5cf128e0a89e932001f8 100644
--- a/openair3/SCTP/sctp_eNB_task.c
+++ b/openair3/SCTP/sctp_eNB_task.c
@@ -1039,15 +1039,9 @@ sctp_eNB_flush_sockets(
   }
 }
 
-
 //------------------------------------------------------------------------------
-void *sctp_eNB_task(void *arg)
+void sctp_eNB_init(void)
 {
-  int                 nb_events;
-  struct epoll_event *events;
-  MessageDef         *received_msg = NULL;
-  int                 result;
-
   SCTP_DEBUG("Starting SCTP layer\n");
 
   STAILQ_INIT(&sctp_cnx_list);
@@ -1055,7 +1049,16 @@ void *sctp_eNB_task(void *arg)
   itti_mark_task_ready(TASK_SCTP);
   MSC_START_USE();
 
-  while (1) {
+}
+ 
+//------------------------------------------------------------------------------
+void *sctp_eNB_process_itti_msg(void *notUsed)
+{
+    int                 nb_events;
+    struct epoll_event *events;
+    MessageDef         *received_msg = NULL;
+    int                 result;
+    
     itti_receive_msg(TASK_SCTP, &received_msg);
 
     /* Check if there is a packet to handle */
@@ -1142,6 +1145,17 @@ void *sctp_eNB_task(void *arg)
     nb_events = itti_get_events(TASK_SCTP, &events);
     /* Now handle notifications for other sockets */
     sctp_eNB_flush_sockets(events, nb_events);
+
+    return NULL;
+}
+ 
+//------------------------------------------------------------------------------
+void *sctp_eNB_task(void *arg)
+{
+  sctp_eNB_init();
+
+  while (1) {
+    (void) sctp_eNB_process_itti_msg(NULL);
   }
 
   return NULL;
diff --git a/openair3/SCTP/sctp_eNB_task.h b/openair3/SCTP/sctp_eNB_task.h
index 31cb6831025e5eea879ebee904f24cc5dbf14276..e23e80675e647d94460b103ed163455ad73d54c9 100644
--- a/openair3/SCTP/sctp_eNB_task.h
+++ b/openair3/SCTP/sctp_eNB_task.h
@@ -22,6 +22,8 @@
 #ifndef SCTP_ENB_TASK_H_
 #define SCTP_ENB_TASK_H_
 
+void  sctp_eNB_init(void);
+void *sctp_eNB_process_itti_msg(void *);
 void *sctp_eNB_task(void *arg);
 
 #endif /* SCTP_ENB_TASK_H_ */
diff --git a/targets/ARCH/tcp_bridge/tcp_bridge_oai.c b/targets/ARCH/tcp_bridge/tcp_bridge_oai.c
index 4d7d49d9c7836c800430afc56d033a9fb8a921cd..32fddb9c2dcffcb811fdbe4136c3da45fa5e0be0 100644
--- a/targets/ARCH/tcp_bridge/tcp_bridge_oai.c
+++ b/targets/ARCH/tcp_bridge/tcp_bridge_oai.c
@@ -44,6 +44,7 @@ typedef struct {
   int sock;
   int samples_per_subframe;
   uint64_t timestamp;
+  uint64_t next_tx_timestamp;
   int is_enb;
 } tcp_bridge_state_t;
 
@@ -141,11 +142,27 @@ int tcp_bridge_write(openair0_device *device, openair0_timestamp timestamp, void
 {
   if (cc != 1) { printf("tcp_bridge: only 1 antenna supported\n"); exit(1); }
   tcp_bridge_state_t *t = device->priv;
+  /* deal with discontinuities in output (think: eNB in TDD mode) */
+  if (t->next_tx_timestamp && timestamp != t->next_tx_timestamp) {
+    uint32_t b[4096];
+    uint64_t to_send = timestamp - t->next_tx_timestamp;
+    memset(b, 0, 4096 * sizeof(uint32_t));
+    while (to_send) {
+      int len = to_send > 4096 ? 4096 : to_send;
+      int n = fullwrite(t->sock, b, len * 4);
+      if (n != len * 4) {
+        printf("tcp_bridge: write error ret %d error %s\n", n, strerror(errno));
+        abort();
+      }
+      to_send -= len;
+    }
+  }
   int n = fullwrite(t->sock, buff[0], nsamps * 4);
   if (n != nsamps * 4) {
     printf("tcp_bridge: write error ret %d (wanted %d) error %s\n", n, nsamps*4, strerror(errno));
     abort();
   }
+  t->next_tx_timestamp = timestamp + nsamps;
   return nsamps;
 }
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf
index bec9c2c6ddc9c573a4a9a329d6f7a69c0a523588..2761fe5fdbed1ff753c32dfa5402b40325860c57 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.100PRB.usrpx310.conf
@@ -156,6 +156,15 @@ eNBs =
         ENB_PORT_FOR_X2C                         = 36422; # Spec 36422
     };
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
     log_config :
     {
       global_log_level                      ="debug";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf
index 834b6cf044177eb27d4569c12b96ada46e68aa0c..56b3c37c0a62eee61c575d941556b232f30403b1 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band38.tm1.usrpx310.conf
@@ -156,6 +156,15 @@ eNBs =
         ENB_PORT_FOR_X2C                         = 36422; # Spec 36422
     };
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
     log_config :
     {
       global_log_level                      ="debug";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf
index 6b3614f490bb35c4317c9a7d07c82fd3d965f429..f088eda84f39a093ce6640f363d0be013f709243 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpx310.conf
@@ -193,6 +193,15 @@ RUs = (
     }
 );  
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
      log_config :
      {
        global_log_level                      ="info";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.replay.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.replay.conf
index fb184549c54eb67ce7e63ca62a85c9cc09778b5c..3bd4b1275adcd38c2f7870e6475ce81a7790741b 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.replay.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.25PRB.usrpb210.replay.conf
@@ -235,6 +235,15 @@ NETWORK_CONTROLLER :
     FLEXRAN_CACHE          = "/mnt/oai_agent_cache";
     FLEXRAN_AWAIT_RECONF   = "no";
 };
+
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
 /*
      log_config :
      {
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210-d2d.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210-d2d.conf
index c6ace3b68fa396c9b87c5a357c0b250d20e108c7..a41912284663542ad4735b072a47ee70c3efd7ed 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210-d2d.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210-d2d.conf
@@ -225,6 +225,15 @@ RUs = (
     }
 );  
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
      log_config :
      {
        global_log_level                      ="info";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf
index c2f10e20aebd768bfdb47271763d0c4f226ae8ba..e08b83d58a87d920e44639e2f4c2db6012be2e85 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf
@@ -238,6 +238,15 @@ NETWORK_CONTROLLER :
     FLEXRAN_AWAIT_RECONF   = "no";
 };
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
      log_config :
      {
        global_log_level                      ="info";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210_ue_expansion.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210_ue_expansion.conf
index e46467598ee5f1a207562226e81864271fab827f..f0a3cb524a1f094aba901fa51d6d78679e60f5a1 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210_ue_expansion.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210_ue_expansion.conf
@@ -192,6 +192,15 @@ RUs = (
     }
 );  
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
      log_config :
      {
        global_log_level                      ="info";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band38.tm1.if4p5.50PRB.lo.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band38.tm1.if4p5.50PRB.lo.conf
index a6efe742834a27904e4b39d4a998b96b6a0209cb..039f0c39c1839aa35397ba9f233a1bce53ae99d7 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band38.tm1.if4p5.50PRB.lo.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band38.tm1.if4p5.50PRB.lo.conf
@@ -199,6 +199,15 @@ RUs = (
     }
 );  
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
 log_config = { 
       global_log_level                      ="info";
       global_log_verbosity                  ="medium";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi-STUB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi-STUB.conf
index fefb4b11def94013d1efc34ba79c617f0e03aead..8f6aac632b4b5b17f049dbfee8d61e8ef77dfcc3 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi-STUB.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi-STUB.conf
@@ -182,6 +182,15 @@ MACRLCs = (
         }  
 );
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
      log_config :
      {
        global_log_level                      ="debug";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi.conf
index cd21fb935e44f8529457a66448dcac1159976c44..f4ac5a9aa3b13ef63f846da88c01e6d624a522d1 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.50PRB.nfapi.conf
@@ -210,6 +210,15 @@ MACRLCs = (
         }  
 );
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
 log_config =
     {
       global_log_level                      ="info";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf
index 581012d7d315f1f8ba9c3e02b2edaa75006e7bc5..ea205e44d178d594670cd812c120108b1a145671 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.conf
@@ -198,6 +198,15 @@ RUs = (
     }
 );  
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
 log_config = { 
       global_log_level                      ="info";
       global_log_verbosity                  ="medium";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.lo.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.lo.conf
index 5f9f8c4d7b6a1321ef12112f59c76612f26230a5..a2e97648c9ec532b9a23d24acd856270dd3e50e7 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.lo.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band7.tm1.if4p5.50PRB.lo.conf
@@ -197,6 +197,15 @@ RUs = (
     }
 );  
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
 log_config = { 
       global_log_level                      ="info";
       global_log_verbosity                  ="medium";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.conf
index 41b322fb55865e6a519f31ecfc587a50c9acaf9a..ba2e7f1ada542e7df2d29af491890c7b30cf6e4c 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.conf
@@ -17,6 +17,15 @@ RUs = (
     }
 );  
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
 log_config = { 
       global_log_level                      ="info";
       global_log_verbosity                  ="medium";
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.tdd.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.tdd.conf
index da1481ac7bc24260490a177884d91108bb5451c1..494086defdc827df902b90f7b5446bd38753f451 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.tdd.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rru.oaisim.tdd.conf
@@ -18,6 +18,15 @@ RUs = (
     }
 );  
 
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
 log_config = { 
       global_log_level                      ="info";
       global_log_verbosity                  ="medium";
diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c
index 93c53a37a00fc2128edf31542442d27b98195ea4..68f7435820786705b7099747a003646fabb12049 100644
--- a/targets/RT/USER/lte-enb.c
+++ b/targets/RT/USER/lte-enb.c
@@ -151,7 +151,8 @@ void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe);
 #if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
 void wakeup_prach_eNB_br(PHY_VARS_eNB *eNB,RU_t *ru,int frame,int subframe);
 #endif
-extern int codingw;
+extern PARALLEL_CONF_t get_thread_parallel_conf(void);
+extern WORKER_CONF_t   get_thread_worker_conf(void);
 
 extern uint8_t nfapi_mode;
 extern void oai_subframe_ind(uint16_t sfn, uint16_t sf);
@@ -223,7 +224,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
   }
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 1 );
 
-  if(!eNB->single_thread_flag && get_nprocs() >= 8){
+  if(get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT){
     if(wait_on_condition(&proc[1].mutex_rxtx,&proc[1].cond_rxtx,&proc[1].pipe_ready,"wakeup_tx")<0) {
       LOG_E(PHY,"Frame %d, subframe %d: TX1 not ready\n",proc[1].frame_rx,proc[1].subframe_rx);
       return(-1);
@@ -245,7 +246,7 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
   /* CONFLICT RESOLUTION: BEGIN */
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER , 0 );
   if(oai_exit) return(-1);
-  if(eNB->single_thread_flag || get_nprocs() <= 4){
+  if(get_thread_parallel_conf() == PARALLEL_SINGLE_THREAD){
 #ifndef PHY_TX_THREAD
     phy_procedures_eNB_TX(eNB, proc, 1);
 #endif
@@ -421,8 +422,8 @@ static void* eNB_thread_rxtx( void* param ) {
     }
     pthread_mutex_unlock( &proc->mutex_rxtx );
     if (nfapi_mode!=2){
-    	if(get_nprocs() >= 8)      wakeup_tx(eNB,eNB->proc.ru_proc);
-    	else
+    	if(get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT)      wakeup_tx(eNB,eNB->proc.ru_proc);
+    	else if(get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT)
     	{
     		phy_procedures_eNB_TX(eNB, proc, 1);
     		wakeup_txfh(proc,eNB->proc.ru_proc);
@@ -881,7 +882,7 @@ static void* process_stats_thread(void* param) {
 
 void init_eNB_proc(int inst) {
   
-  int i=0;
+  /*int i=0;*/
   int CC_id;
   PHY_VARS_eNB *eNB;
   eNB_proc_t *proc;
@@ -953,7 +954,7 @@ void init_eNB_proc(int inst) {
     //    attr_te     = &proc->attr_te; 
 #endif
 
-    if(get_nprocs() > 2 && codingw)
+    if(get_thread_worker_conf() == WORKER_ENABLE)
     {
       init_te_thread(eNB);
       init_td_thread(eNB);
@@ -962,7 +963,7 @@ void init_eNB_proc(int inst) {
 
     LOG_I(PHY,"eNB->single_thread_flag:%d\n", eNB->single_thread_flag);
 
-    if (eNB->single_thread_flag==0 && nfapi_mode!=2) {
+    if ((get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT || get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) && nfapi_mode!=2) {
       pthread_create( &proc_rxtx[0].pthread_rxtx, attr0, eNB_thread_rxtx, proc );
       pthread_create( &proc_rxtx[1].pthread_rxtx, attr1, tx_thread, proc);
     }
@@ -970,13 +971,13 @@ void init_eNB_proc(int inst) {
 #if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
     pthread_create( &proc->pthread_prach_br, attr_prach_br, eNB_thread_prach_br, eNB );
 #endif
-    char name[16];
+    /*char name[16];
     if (eNB->single_thread_flag==0) {
       snprintf( name, sizeof(name), "RXTX0 %d", i );
       pthread_setname_np( proc_rxtx[0].pthread_rxtx, name );
       snprintf( name, sizeof(name), "RXTX1 %d", i );
       pthread_setname_np( proc_rxtx[1].pthread_rxtx, name );
-    }
+    }*/
 
     AssertFatal(proc->instance_cnt_prach == -1,"instance_cnt_prach = %d\n",proc->instance_cnt_prach);
 	
@@ -1029,7 +1030,7 @@ void kill_eNB_proc(int inst) {
     proc = &eNB->proc;
     proc_rxtx = &proc->proc_rxtx[0];
 
-    if(get_nprocs() > 2 && codingw) {
+    if(get_thread_worker_conf() == WORKER_ENABLE) {
       kill_td_thread(eNB);
       kill_te_thread(eNB);
     }
@@ -1323,8 +1324,8 @@ void init_eNB(int single_thread_flag,int wait_for_sync) {
 #endif
 
 
-      eNB->td                   = ulsch_decoding_data_all;//(get_nprocs()<=4) ? ulsch_decoding_data : ulsch_decoding_data_2thread;
-      eNB->te                   = dlsch_encoding_all;//(get_nprocs()<=4) ? dlsch_encoding : dlsch_encoding_2threads;
+      eNB->td                   = ulsch_decoding_data_all;
+      eNB->te                   = dlsch_encoding_all;
 
       
       LOG_I(PHY,"Registering with MAC interface module\n");
diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c
index d20b614ad79d4332bc10915d270106bc67c3340b..7002bc4ebd0020f38fff3002eebe952a84356ae0 100644
--- a/targets/RT/USER/lte-ru.c
+++ b/targets/RT/USER/lte-ru.c
@@ -119,10 +119,10 @@ static int DEFENBS[] = {0};
 extern volatile int                    oai_exit;
 extern int emulate_rf;
 extern int numerology;
-extern int fepw;
-extern int single_thread_flag;
 extern clock_source_t clock_source;
 
+extern PARALLEL_CONF_t get_thread_parallel_conf(void);
+extern WORKER_CONF_t   get_thread_worker_conf(void);
 extern void  phy_init_RU(RU_t*);
 extern void  phy_free_RU(RU_t*);
 
@@ -1257,7 +1257,7 @@ void wakeup_eNBs(RU_t *ru) {
   LOG_D(PHY,"wakeup_eNBs (num %d) for RU %d ru->eNB_top:%p\n",ru->num_eNB,ru->idx, ru->eNB_top);
 
 
-  if (ru->num_eNB==1 && ru->eNB_top!=0 && (get_nprocs() <= 4 || single_thread_flag)) {
+  if (ru->num_eNB==1 && ru->eNB_top!=0 && get_thread_parallel_conf() == PARALLEL_SINGLE_THREAD) {
     // call eNB function directly
   
     char string[20];
@@ -1456,6 +1456,12 @@ int setup_RU_buffers(RU_t *ru) {
     if      (frame_parms->N_RB_DL == 100) ru->N_TA_offset = 624;
     else if (frame_parms->N_RB_DL == 50)  ru->N_TA_offset = 624/2;
     else if (frame_parms->N_RB_DL == 25)  ru->N_TA_offset = 624/4;
+#if BASIC_SIMULATOR
+    /* this is required for the basic simulator in TDD mode
+     * TODO: find a proper cleaner solution
+     */
+    ru->N_TA_offset = 0;
+#endif
   } 
   if (ru->openair0_cfg.mmapped_dma == 1) {
     // replace RX signal buffers with mmaped HW versions
@@ -1782,7 +1788,7 @@ static void* ru_thread( void* param ) {
     if (ru->num_eNB>0) wakeup_eNBs(ru);
     
 #ifndef PHY_TX_THREAD
-    if(get_nprocs() <= 4 || ru->num_eNB==0 || single_thread_flag){
+    if(get_thread_parallel_conf() == PARALLEL_SINGLE_THREAD || ru->num_eNB==0){
       // do TX front-end processing if needed (precoding and/or IDFTs)
       if (ru->feptx_prec) ru->feptx_prec(ru);
       
@@ -2195,7 +2201,7 @@ void init_RU_proc(RU_t *ru) {
   if(emulate_rf)
     pthread_create( &proc->pthread_emulateRF, attr_emulateRF, emulatedRF_thread, (void*)proc );
 
-  if (!single_thread_flag && get_nprocs() > 4)
+  if (get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT || get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT)
     pthread_create( &proc->pthread_FH1, attr_FH1, ru_thread_tx, (void*)ru );
 
   if (ru->function == NGFI_RRU_IF4p5) {
@@ -2222,7 +2228,7 @@ void init_RU_proc(RU_t *ru) {
     pthread_create( &proc->pthread_prach, attr_prach, ru_thread_prach, (void*)ru );
   }
 
-  if (get_nprocs()> 2 && fepw) { 
+  if (get_thread_worker_conf() == WORKER_ENABLE) { 
     init_fep_thread(ru,NULL); 
     init_feptx_thread(ru,NULL);
   } 
@@ -2260,7 +2266,7 @@ void kill_RU_proc(RU_t *ru)
   pthread_cond_destroy( &proc->cond_rf_tx);
 #endif
 
-  if (get_nprocs() > 2 && fepw) {
+  if (get_thread_worker_conf() == WORKER_ENABLE) {
       LOG_D(PHY, "killing FEP thread\n"); 
       kill_fep_thread(ru);
       LOG_D(PHY, "killing FEP TX thread\n"); 
@@ -2309,7 +2315,7 @@ void kill_RU_proc(RU_t *ru)
 
   LOG_D(PHY, "Joining pthread_FH\n");
   pthread_join(proc->pthread_FH, NULL);
-  if (!single_thread_flag && get_nprocs() > 4) {
+  if (get_thread_parallel_conf() == PARALLEL_RU_L1_SPLIT || get_thread_parallel_conf() == PARALLEL_RU_L1_TRX_SPLIT) {
     LOG_D(PHY, "Joining pthread_FHTX\n");
     pthread_join(proc->pthread_FH1, NULL);
   }
@@ -2583,8 +2589,8 @@ void set_function_spec_param(RU_t *ru)
       ru->fh_north_out          = fh_if4p5_north_out;       // send_IF4p5 on reception
       ru->fh_south_out          = tx_rf;                    // send output to RF
       ru->fh_north_asynch_in    = fh_if4p5_north_asynch_in; // TX packets come asynchronously
-      ru->feprx                 = (get_nprocs()<=2 || !fepw) ? fep_full :ru_fep_full_2thread;                 // RX DFTs
-      ru->feptx_ofdm            = (get_nprocs()<=2 || !fepw) ? feptx_ofdm : feptx_ofdm_2thread;               // this is fep with idft only (no precoding in RRU)
+      ru->feprx                 = (get_thread_worker_conf() == WORKER_DISABLE) ? fep_full :ru_fep_full_2thread;                 // RX DFTs
+      ru->feptx_ofdm            = (get_thread_worker_conf() == WORKER_DISABLE) ? feptx_ofdm : feptx_ofdm_2thread;               // this is fep with idft only (no precoding in RRU)
       ru->feptx_prec            = NULL;
       ru->start_if              = start_if;                 // need to start the if interface for if4p5
       ru->ifdevice.host_type    = RRU_HOST;
@@ -2605,8 +2611,8 @@ void set_function_spec_param(RU_t *ru)
     }
     else if (ru->function == eNodeB_3GPP) {
       ru->do_prach             = 0;                       // no prach processing in RU
-      ru->feprx                = (get_nprocs()<=2 || !fepw) ? fep_full : ru_fep_full_2thread;                // RX DFTs
-      ru->feptx_ofdm           = (get_nprocs()<=2 || !fepw) ? feptx_ofdm : feptx_ofdm_2thread;              // this is fep with idft and precoding
+      ru->feprx                = (get_thread_worker_conf() == WORKER_DISABLE) ? fep_full : ru_fep_full_2thread;                // RX DFTs
+      ru->feptx_ofdm           = (get_thread_worker_conf() == WORKER_DISABLE) ? feptx_ofdm : feptx_ofdm_2thread;              // this is fep with idft and precoding
       ru->feptx_prec           = feptx_prec;              // this is fep with idft and precoding
       ru->fh_north_in          = NULL;                    // no incoming fronthaul from north
       ru->fh_north_out         = NULL;                    // no outgoing fronthaul to north
@@ -2634,9 +2640,9 @@ void set_function_spec_param(RU_t *ru)
 
   case REMOTE_IF5: // the remote unit is IF5 RRU
     ru->do_prach               = 0;
-    ru->feprx                  = (get_nprocs()<=2 || !fepw) ? fep_full : fep_full;                   // this is frequency-shift + DFTs
+    ru->feprx                  = (get_thread_worker_conf() == WORKER_DISABLE) ? fep_full : fep_full;                   // this is frequency-shift + DFTs
     ru->feptx_prec             = feptx_prec;                 // need to do transmit Precoding + IDFTs
-    ru->feptx_ofdm             = (get_nprocs()<=2 || !fepw) ? feptx_ofdm : feptx_ofdm_2thread;                 // need to do transmit Precoding + IDFTs
+    ru->feptx_ofdm             = (get_thread_worker_conf() == WORKER_DISABLE) ? feptx_ofdm : feptx_ofdm_2thread;                 // need to do transmit Precoding + IDFTs
     if (ru->if_timing == synch_to_other) {
       ru->fh_south_in          = fh_slave_south_in;                  // synchronize to master
       ru->fh_south_out         = fh_if5_mobipass_south_out;          // use send_IF5 for mobipass
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 7990a48a14d2df678061cdbf583e889b6b9a776f..9a93bc4cbc90785799792171c0c9bd12d07d70d0 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -219,8 +219,31 @@ extern void init_eNB_afterRU(void);
 int transmission_mode=1;
 int emulate_rf = 0;
 int numerology = 0;
-int codingw = 0;
-int fepw = 0;
+char *parallel_config = NULL;
+char *worker_config = NULL;
+
+static THREAD_STRUCT thread_struct;
+void set_parallel_conf(char *parallel_conf)
+{
+  if(strcmp(parallel_conf,"PARALLEL_SINGLE_THREAD")==0)           thread_struct.parallel_conf = PARALLEL_SINGLE_THREAD;
+  else if(strcmp(parallel_conf,"PARALLEL_RU_L1_SPLIT")==0)        thread_struct.parallel_conf = PARALLEL_RU_L1_SPLIT;
+  else if(strcmp(parallel_conf,"PARALLEL_RU_L1_TRX_SPLIT")==0)    thread_struct.parallel_conf = PARALLEL_RU_L1_TRX_SPLIT;
+  printf("[CONFIG] parallel conf is set to %d\n",thread_struct.parallel_conf);
+} 
+void set_worker_conf(char *worker_conf)
+{
+  if(strcmp(worker_conf,"WORKER_DISABLE")==0)                     thread_struct.worker_conf = WORKER_DISABLE;
+  else if(strcmp(worker_conf,"WORKER_ENABLE")==0)                 thread_struct.worker_conf = WORKER_ENABLE;
+  printf("[CONFIG] worker conf is set to %d\n",thread_struct.worker_conf);
+} 
+PARALLEL_CONF_t get_thread_parallel_conf(void)
+{
+  return thread_struct.parallel_conf;
+} 
+WORKER_CONF_t get_thread_worker_conf(void)
+{
+  return thread_struct.worker_conf;
+} 
 
 
 
@@ -321,7 +344,15 @@ void signal_handler(int sig) {
 #define KBLU  "\x1B[34m"
 #define RESET "\033[0m"
 
-
+#if defined(ENABLE_ITTI)
+void signal_handler_itti(int sig) {
+  // Call exit function
+  char msg[256];
+  memset(msg, 0, 256);
+  sprintf(msg, "caught signal %s\n", strsignal(sig));
+  exit_function(__FILE__, __FUNCTION__, __LINE__, msg);
+}
+#endif
 
 void exit_function(const char* file, const char* function, const int line, const char* s)
 {
@@ -546,6 +577,8 @@ static void get_options(unsigned int *start_msc) {
          RC.nb_nb_iot_rrc_inst=RC.nb_nb_iot_L1_inst=RC.nb_nb_iot_macrlc_inst=0;
       }
    }
+  if(parallel_config != NULL) set_parallel_conf(parallel_config);
+  if(worker_config != NULL)   set_worker_conf(worker_config);
 }
 
 
@@ -954,6 +987,11 @@ int main( int argc, char **argv )
   signal(SIGINT, signal_handler);
 #endif
 
+#if defined(ENABLE_ITTI)
+  signal(SIGINT, signal_handler_itti);
+  signal(SIGTERM, signal_handler_itti);
+  signal(SIGABRT, signal_handler_itti);
+#endif
 
   check_clock();
 
diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h
index b421181f37ab1ebfb9efaf06c07af0d4aa5ff79c..2b087e5456b129f0f7468065de22b851d56fc2b8 100644
--- a/targets/RT/USER/lte-softmodem.h
+++ b/targets/RT/USER/lte-softmodem.h
@@ -92,9 +92,9 @@
 #define CONFIG_HLP_TNOFORK       "to ease debugging with gdb\n"
 
 #define CONFIG_HLP_NUMEROLOGY    "adding numerology for 5G\n"
-#define CONFIG_HLP_CODINGW       "coding worker thread enable(disable by defult)\n"
-#define CONFIG_HLP_FEPW          "FEP worker thread enabled(disable by defult)\n"
 #define CONFIG_HLP_EMULATE_RF    "Emulated RF enabled(disable by defult)\n"
+#define CONFIG_HLP_PARALLEL_CMD  "three config for level of parallelism 'PARALLEL_SINGLE_THREAD', 'PARALLEL_RU_L1_SPLIT', or 'PARALLEL_RU_L1_TRX_SPLIT'\n"
+#define CONFIG_HLP_WORKER_CMD    "two option for worker 'WORKER_DISABLE' or 'WORKER_ENABLE'\n"
 
 #define CONFIG_HLP_DISABLNBIOT   "disable nb-iot, even if defined in config\n"
 
@@ -186,9 +186,9 @@
 {"s" ,                      CONFIG_HLP_SNR,         0,                      iptr:&snr_dB,                       defintval:25,                   TYPE_INT,       0},                     \
 {"numerology" ,             CONFIG_HLP_NUMEROLOGY,  PARAMFLAG_BOOL,         iptr:&numerology,                   defintval:0,                    TYPE_INT,       0},                     \
 {"emulate-rf" ,             CONFIG_HLP_EMULATE_RF,  PARAMFLAG_BOOL,         iptr:&emulate_rf,                   defintval:0,                    TYPE_INT,       0},                     \
-{"codingw" ,                CONFIG_HLP_CODINGW,     PARAMFLAG_BOOL,         iptr:&codingw,                      defintval:0,                    TYPE_INT,       0},                     \
-{"fepw" ,                   CONFIG_HLP_FEPW,        PARAMFLAG_BOOL,         iptr:&fepw,                         defintval:0,                    TYPE_INT,       0},                     \
-{"nbiot-disable",           CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL,         iptr:&nonbiotflag,			defintval:0,			TYPE_INT,	0} \
+{"parallel-config",         CONFIG_HLP_PARALLEL_CMD,0,                      strptr:(char **)&parallel_config,   defstrval:NULL,                 TYPE_STRING,    0},                     \
+{"worker-config",           CONFIG_HLP_WORKER_CMD,  0,                      strptr:(char **)&worker_config,     defstrval:NULL,                 TYPE_STRING,    0},                     \
+{"nbiot-disable",           CONFIG_HLP_DISABLNBIOT, PARAMFLAG_BOOL,         iptr:&nonbiotflag,			defintval:0,                    TYPE_INT,       0}                      \
 }
 
 #define CONFIG_HLP_FLOG          "Enable online log \n"
@@ -279,6 +279,10 @@ PHY_VARS_UE* init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms,
                           uint8_t UE_id,
                           uint8_t abstraction_flag);
 void init_eNB_afterRU(void);
+PARALLEL_CONF_t get_thread_parallel_conf(void);
+WORKER_CONF_t   get_thread_worker_conf(void);
+void set_parallel_conf(char *parallel_conf);
+void set_worker_conf(char *worker_conf);
 
 extern int stop_L1L2(module_id_t enb_id);
 extern int restart_L1L2(module_id_t enb_id);
diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c
index 66107d79a42c5e88b613451c1c5f4458ea2c48d4..c49a54b98ac32c59f4e18e17f990209989f784ca 100644
--- a/targets/RT/USER/lte-ue.c
+++ b/targets/RT/USER/lte-ue.c
@@ -333,6 +333,13 @@ void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correcti
     }
     else UE->N_TA_offset = 0;
 
+#if BASIC_SIMULATOR
+    /* this is required for the basic simulator in TDD mode
+     * TODO: find a proper cleaner solution
+     */
+    UE->N_TA_offset = 0;
+#endif
+
     if (simL1flag == 1) init_ue_devices(UE);
     LOG_I(PHY,"Intializing UE Threads for instance %d (%p,%p)...\n",inst,PHY_vars_UE_g[inst],PHY_vars_UE_g[inst][0]);
     init_UE_threads(inst);
diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c
index 2efcb496ac1ba8d399971bea9ff8486715885284..c52fe130a1ed84fe80956cd593012e64f1e93a43 100644
--- a/targets/RT/USER/lte-uesoftmodem.c
+++ b/targets/RT/USER/lte-uesoftmodem.c
@@ -220,8 +220,31 @@ int transmission_mode=1;
 
 int emulate_rf = 0;
 int numerology = 0;
-int codingw = 0;
-int fepw = 0;
+char *parallel_config = NULL;
+char *worker_config = NULL;
+
+static THREAD_STRUCT thread_struct;
+void set_parallel_conf(char *parallel_conf)
+{
+  if(strcmp(parallel_conf,"PARALLEL_SINGLE_THREAD")==0)           thread_struct.parallel_conf = PARALLEL_SINGLE_THREAD;
+  else if(strcmp(parallel_conf,"PARALLEL_RU_L1_SPLIT")==0)        thread_struct.parallel_conf = PARALLEL_RU_L1_SPLIT;
+  else if(strcmp(parallel_conf,"PARALLEL_RU_L1_TRX_SPLIT")==0)    thread_struct.parallel_conf = PARALLEL_RU_L1_TRX_SPLIT;
+  printf("[CONFIG] parallel conf is set to %d\n",thread_struct.parallel_conf);
+} 
+void set_worker_conf(char *worker_conf)
+{
+  if(strcmp(worker_conf,"WORKER_DISABLE")==0)                     thread_struct.worker_conf = WORKER_DISABLE;
+  else if(strcmp(worker_conf,"WORKER_ENABLE")==0)                 thread_struct.worker_conf = WORKER_ENABLE;
+  printf("[CONFIG] worker conf is set to %d\n",thread_struct.worker_conf);
+} 
+PARALLEL_CONF_t get_thread_parallel_conf(void)
+{
+  return thread_struct.parallel_conf;
+} 
+WORKER_CONF_t get_thread_worker_conf(void)
+{
+  return thread_struct.worker_conf;
+}  
 
 /* struct for ethernet specific parameters given in eNB conf file */
 eth_params_t *eth_params;
@@ -583,6 +606,8 @@ static void get_options(unsigned int *start_msc) {
     if(nfapi_mode!=3)
     	uecap_xer_in=1;
 	} *//* UE with config file  */
+  if(parallel_config != NULL) set_parallel_conf(parallel_config);
+  if(worker_config != NULL)   set_worker_conf(worker_config);
 }
 
 
@@ -800,6 +825,8 @@ int main( int argc, char **argv )
   for (int i=0;i<MAX_NUM_CCs;i++) tx_max_power[i]=23; 
   get_options (&start_msc);
 
+printf("~~~~~~~~~~~~~~~~~~~~successfully get the parallel config[%d], worker config [%d] \n", get_thread_parallel_conf(), get_thread_worker_conf());
+
 
   printf("Running with %d UE instances\n",NB_UE_INST);
   if (NB_UE_INST > 1 && simL1flag != 1) {