diff --git a/ci-scripts/Jenkinsfile-gitlab b/ci-scripts/Jenkinsfile-gitlab
index 8f1955f26567f184d11b9900baba59302f4758e5..3042ada815afe4ad4a60c7efb4a096ee432f3187 100644
--- a/ci-scripts/Jenkinsfile-gitlab
+++ b/ci-scripts/Jenkinsfile-gitlab
@@ -529,28 +529,6 @@ pipeline {
                         }
                     }
                 }
-                stage ("Test IF4p5 - TDD - Band 38 - B210 - MultiRRU") {
-                    when {
-                        expression {doFullTestsuite}
-                    }
-                    steps {
-                        script {
-                            triggerSlaveJob ('eNB-CI-IF4p5-TDD-Band38-MultiRRU-B210', 'Test-IF4p5-TDD-Band38-Multi-RRU')
-                        }
-                    }
-                    post {
-                        always {
-                            script {
-                                finalizeSlaveJob('eNB-CI-IF4p5-TDD-Band38-MultiRRU-B210')
-                            }
-                        }
-                        failure {
-                            script {
-                                currentBuild.result = 'FAILURE'
-                            }
-                        }
-                    }
-                }
                 stage ("Test OAI UE - FDD - Band 20 - B200") {
                     when {
                         expression {doFullTestsuite}
diff --git a/ci-scripts/conf_files/enb.band38.lte_2x2_tm2.100PRB.usrpn310.conf b/ci-scripts/conf_files/enb.band38.lte_2x2_tm2.100PRB.usrpn310.conf
index 15a2e6ac1db01d5e2bdd612ff10cd58377f10c59..f116c3708d4dd07544b6effbf8f1f6ca941dbc57 100644
--- a/ci-scripts/conf_files/enb.band38.lte_2x2_tm2.100PRB.usrpn310.conf
+++ b/ci-scripts/conf_files/enb.band38.lte_2x2_tm2.100PRB.usrpn310.conf
@@ -36,7 +36,7 @@ eNBs =
       Nid_cell					      = 0;
       N_RB_DL                 			      = 100;
       Nid_cell_mbsfn          			      = 0;
-      nb_antenna_ports                                = 1;
+      nb_antenna_ports                                = 2;
       nb_antennas_tx          			      = 2;
       nb_antennas_rx          			      = 2;
       tx_gain                                            = 90;
diff --git a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf
index 77693d5f72053e957aba548f35327a1d250d4724..16f72c68e5662526ea7af92a300256d62f7f0bc3 100644
--- a/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf
+++ b/ci-scripts/conf_files/gNB_SA_n78_106PRB.2x2_usrpn310.conf
@@ -232,7 +232,7 @@ L1s = (
       {
       num_cc = 1;
       tr_n_preference = "local_mac";
-      pusch_proc_threads = 2;
+      pusch_proc_threads = 8;
       prach_dtx_threshold = 120;
       pucch0_dtx_threshold = 150;
       }  
diff --git a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf
index c9b369eaff94b87e2f43613cc67ca491e6c99e57..1a940a51c40eb1826e0011205ea496f41747daeb 100644
--- a/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf
+++ b/ci-scripts/conf_files/gNB_SA_n78_133PRB.2x2_usrpn310.conf
@@ -229,7 +229,7 @@ L1s = (
       {
       num_cc = 1;
       tr_n_preference = "local_mac";
-      pusch_proc_threads = 2;
+      pusch_proc_threads = 8;
       prach_dtx_threshold = 120;
         }  
 );
diff --git a/ci-scripts/constants.py b/ci-scripts/constants.py
index bb110bc0e87b149cc999222bfa2d0567b0b305c4..3c056759283a973543e16d61f6a57d984dd2ac8c 100644
--- a/ci-scripts/constants.py
+++ b/ci-scripts/constants.py
@@ -44,6 +44,7 @@ ENB_PROCESS_ASSERTION = -12
 ENB_PROCESS_REALTIME_ISSUE = -13
 ENB_PROCESS_NOLOGFILE_TO_ANALYZE = -14
 ENB_PROCESS_SLAVE_RRU_NOT_SYNCED = -15
+ENB_REAL_TIME_PROCESSING_ISSUE = -16
 HSS_PROCESS_FAILED = -2
 HSS_PROCESS_OK = +2
 MME_PROCESS_FAILED = -3
diff --git a/ci-scripts/datalog_rt_stats.2x2.yaml b/ci-scripts/datalog_rt_stats.2x2.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..9e2b66862d6ab4cd53137c67695fe82fd4771a78
--- /dev/null
+++ b/ci-scripts/datalog_rt_stats.2x2.yaml
@@ -0,0 +1,35 @@
+#this is a configuration file
+#used to build real time processing statistics 
+#for 5G NR phy test (gNB terminate)
+Title : Processing Time (us)
+ColNames :
+  - Metric
+  - Average
+  - Max
+  - Average vs Reference Deviation (Reference Value ; Acceptability Threshold)
+Ref : 
+  feprx : 120.0
+  feptx_prec : 8.0
+  feptx_ofdm : 50.0
+  feptx_total : 75.0
+  L1 Tx processing thread 0 : 300.0
+  L1 Tx processing thread 1 : 300.0
+  DLSCH encoding : 230.0
+  L1 Rx processing : 175.0
+  PUSCH inner-receiver : 100.0
+  PUSCH decoding : 180.0 
+  DL & UL scheduling timing stats : 37.0
+  UL Indication : 38.0
+Threshold :
+  feprx : 1.25
+  feptx_prec : 1.25
+  feptx_ofdm : 1.25
+  feptx_total : 1.25
+  L1 Tx processing thread 0 : 1.25
+  L1 Tx processing thread 1 : 1.25
+  DLSCH encoding : 1.25
+  L1 Rx processing : 1.25
+  PUSCH inner-receiver : 1.25
+  PUSCH decoding : 1.25
+  DL & UL scheduling timing stats : 1.25
+  UL Indication : 1.25
diff --git a/ci-scripts/datalog_rt_stats.yaml b/ci-scripts/datalog_rt_stats.default.yaml
similarity index 100%
rename from ci-scripts/datalog_rt_stats.yaml
rename to ci-scripts/datalog_rt_stats.default.yaml
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index 5b5eec285ccaa8f608edd79734a8ba9d7d30f9be..d8cad1c96224bd963ea128cba0690fe34fa8144c 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -155,6 +155,11 @@ def GetParametersFromXML(action):
 	elif action == 'Initialize_eNB':
 		RAN.eNB_Trace=test.findtext('eNB_Trace')
 		RAN.eNB_Stats=test.findtext('eNB_Stats')
+		datalog_rt_stats_file=test.findtext('rt_stats_cfg')
+		if datalog_rt_stats_file is None:
+			RAN.datalog_rt_stats_file='datalog_rt_stats.default.yaml'
+		else:
+			RAN.datalog_rt_stats_file=datalog_rt_stats_file
 		RAN.Initialize_eNB_args=test.findtext('Initialize_eNB_args')
 		eNB_instance=test.findtext('eNB_instance')
 		USRPIPAddress=test.findtext('USRP_IPAddress')
diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py
index 3f9c1a8e9ef9c6314c4ad9af3dbb763cd4e90945..baf3a007251fd3aef8aa5829fa52eb5d6bf92b1e 100644
--- a/ci-scripts/ran.py
+++ b/ci-scripts/ran.py
@@ -92,6 +92,7 @@ class RANManagement():
 		self.epcPcapFile = ''
 		self.runtime_stats= ''
 		self.datalog_rt_stats={}
+		self.datalog_rt_stats_file='datalog_rt_stats.default.yaml'
 		self.eNB_Trace = '' #if 'yes', Tshark will be launched at initialization
 		self.eNB_Stats = '' #if 'yes', Statistics Monitor will be launched at initialization		
 		self.USRPIPAddress = ''
@@ -722,6 +723,9 @@ class RANManagement():
 				logStatus = self.AnalyzeLogFile_eNB(fileToAnalyze, HTML)
 				if (logStatus < 0):
 					HTML.CreateHtmlTestRow('N/A', 'KO', logStatus)
+					#display rt stats for gNB only
+					if len(self.datalog_rt_stats)!=0 and nodeB_prefix == 'g':
+						HTML.CreateHtmlDataLogTable(self.datalog_rt_stats)
 					self.prematureExit = True
 					self.eNBmbmsEnables[int(self.eNB_instance)] = False
 					return
@@ -810,6 +814,7 @@ class RANManagement():
 		#NSA specific log markers
 		nsa_markers ={'SgNBReleaseRequestAcknowledge': [],'FAILURE': [], 'scgFailureInformationNR-r15': [], 'SgNBReleaseRequest': []}
 		nodeB_prefix_found = False
+		RealTimeProcessingIssue = False
 	
 		line_cnt=0 #log file line counter
 		for line in enb_log_file.readlines():
@@ -1011,7 +1016,7 @@ class RANManagement():
 		#the following part takes the *_stats.log files as source (not the stdout log file)
 
 		#the datalog config file has to be loaded
-		datalog_rt_stats_file='datalog_rt_stats.yaml'
+		datalog_rt_stats_file=self.datalog_rt_stats_file
 		if (os.path.isfile(datalog_rt_stats_file)):
 			yaml_file=datalog_rt_stats_file
 		elif (os.path.isfile('ci-scripts/'+datalog_rt_stats_file)):
@@ -1127,8 +1132,7 @@ class RANManagement():
 				#check if there is a fail => will render the test as failed
 				for k in datalog_rt_stats['Data']:
 					if float(datalog_rt_stats['Data'][k][2])> datalog_rt_stats['Threshold'][k]: #condition for fail : avg/ref is greater than the fixed threshold
-						#setting prematureExit is ok although not the best option
-						self.prematureExit=False #temp for debug : do not stop the test if RT stats are excedeed
+						RealTimeProcessingIssue = True
 			else:
 				statMsg = 'No real time stats found in the log file\n'
 				logging.debug('No real time stats found in the log file')
@@ -1162,7 +1166,10 @@ class RANManagement():
 			logging.debug(statMsg)
 			htmleNBFailureMsg += htmlMsg			
 
-
+		if RealTimeProcessingIssue:
+			logging.debug('\u001B[1;37;41m ' + nodeB_prefix + 'NB ended with real time processing issue! \u001B[0m')
+			htmleNBFailureMsg += 'Fail due to real time processing issue\n'
+			global_status = CONST.ENB_REAL_TIME_PROCESSING_ISSUE
 		if uciStatMsgCount > 0:
 			statMsg = nodeB_prefix + 'NB showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)'
 			logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
diff --git a/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml b/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
index 045466a8adaf46b6c8600c57d24dece37d4de949..5c53bf5eed4de0b43ae07e18fb3f89cfd4821a2c 100644
--- a/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
+++ b/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
@@ -79,6 +79,7 @@
 		<eNB_serverId>1</eNB_serverId>
 		<air_interface>nr</air_interface>
 		<eNB_Stats>yes</eNB_Stats>
+		<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
 		<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
 	</testCase>
 
diff --git a/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml b/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml
index 6fe23e022b600e379e6d9c624fde29d35d1f802a..02544f273baae039405add42c5d89ef67c07cf8c 100644
--- a/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml
+++ b/ci-scripts/xml_files/fr1_nsa_2x2_quectel_attach_detach.xml
@@ -99,6 +99,7 @@
 		<eNB_serverId>1</eNB_serverId>
 		<air_interface>nr</air_interface>
 		<eNB_Stats>yes</eNB_Stats>
+		<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
 		<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
 	</testCase>
 
diff --git a/ci-scripts/xml_files/fr1_sa_quectel.xml b/ci-scripts/xml_files/fr1_sa_quectel.xml
index 72b4c0a273fbdcacf39241ab0650b746a04e5f63..28c6b2e9e011efb64958659d141519cfbcc0c30e 100644
--- a/ci-scripts/xml_files/fr1_sa_quectel.xml
+++ b/ci-scripts/xml_files/fr1_sa_quectel.xml
@@ -64,6 +64,7 @@
 		<air_interface>nr</air_interface>
 		<eNB_Trace>yes</eNB_Trace>
 		<eNB_Stats>yes</eNB_Stats>
+		<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
 		<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
 	</testCase>
 
diff --git a/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml b/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml
index f465b320b6555f414f7d696d401a62e93755e001..696ec790ffd0e4643b86117dcc10fea92759a2cc 100644
--- a/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml
+++ b/ci-scripts/xml_files/fr1_sa_quectel_162prb.xml
@@ -64,6 +64,7 @@
 		<air_interface>nr</air_interface>
 		<eNB_Trace>yes</eNB_Trace>
 		<eNB_Stats>yes</eNB_Stats>
+		<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
 		<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
 	</testCase>
 
diff --git a/ci-scripts/xml_files/fr1_sa_quectel_stages.xml b/ci-scripts/xml_files/fr1_sa_quectel_stages.xml
index dabe53f233089b8a83db34742823fe72e3fee0f0..edc444061212fdee1154541cf1cd1446558fc223 100644
--- a/ci-scripts/xml_files/fr1_sa_quectel_stages.xml
+++ b/ci-scripts/xml_files/fr1_sa_quectel_stages.xml
@@ -71,6 +71,7 @@
 		<air_interface>nr</air_interface>
 		<eNB_Trace>yes</eNB_Trace>
 		<eNB_Stats>yes</eNB_Stats>
+		<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
 		<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
 	</testCase>
 
diff --git a/ci-scripts/xml_files/fr1_sa_quectel_stages_162prb.xml b/ci-scripts/xml_files/fr1_sa_quectel_stages_162prb.xml
index c28791e555ec67fb41261a6a1b7ab183c3f68004..5feed7558657b039d75c1d16ca8b3f9ffce85d40 100644
--- a/ci-scripts/xml_files/fr1_sa_quectel_stages_162prb.xml
+++ b/ci-scripts/xml_files/fr1_sa_quectel_stages_162prb.xml
@@ -73,6 +73,7 @@
 		<air_interface>nr</air_interface>
 		<eNB_Trace>yes</eNB_Trace>
 		<eNB_Stats>yes</eNB_Stats>
+		<rt_stats_cfg>datalog_rt_stats.2x2.yaml</rt_stats_cfg>
 		<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
 	</testCase>
 
diff --git a/ci-scripts/yaml_files/5g_f1_rfsimulator/docker-compose.yaml b/ci-scripts/yaml_files/5g_f1_rfsimulator/docker-compose.yaml
index eb15aef0d8aa48076f147111234baff19a16c3ca..6a39f2147ea7719ba7337db9b0ffc6713240f0d8 100644
--- a/ci-scripts/yaml_files/5g_f1_rfsimulator/docker-compose.yaml
+++ b/ci-scripts/yaml_files/5g_f1_rfsimulator/docker-compose.yaml
@@ -111,7 +111,6 @@ services:
     oai-smf:
         container_name: "rfsim5g-oai-smf"
         image: oai-smf:latest
-        entrypoint: /bin/bash -c "/openair-smf/bin/oai_smf -c /openair-smf/bin/oai-smf.conf -o"
         environment:
             - TZ=Europe/Paris
             - INSTANCE=0
@@ -140,12 +139,13 @@ services:
             - REGISTER_NRF=yes
             - DISCOVER_UPF=yes
             - USE_FQDN_DNS=yes
+            - DNN_NI0=oai
+            - DNN_NI2=oai.ipv4
         depends_on:
             - oai-nrf
             - oai-amf
         volumes:
             - ./smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh
-            - ./oai-smf.conf:/openair-smf/bin/oai-smf.conf
         healthcheck:
             test: /bin/bash -c "/openair-smf/bin/smf-healthcheck.sh"
             interval: 10s
diff --git a/ci-scripts/yaml_files/5g_f1_rfsimulator/oai-smf.conf b/ci-scripts/yaml_files/5g_f1_rfsimulator/oai-smf.conf
deleted file mode 100644
index 0c83ab8be937cee03a6b1dc0931473e162c952df..0000000000000000000000000000000000000000
--- a/ci-scripts/yaml_files/5g_f1_rfsimulator/oai-smf.conf
+++ /dev/null
@@ -1,133 +0,0 @@
-################################################################################
-# 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
-################################################################################
-
-SMF =
-{
-    FQDN = "oai-smf-svc";               
-    INSTANCE      = 0;         # 0 is the default
-    PID_DIRECTORY = "/var/run";  # /var/run is the default
-
-    INTERFACES :
-    {
-        N4 :
-        {
-            # SMF binded interface for N4 communication (UPF)
-            INTERFACE_NAME = "eth0"; # YOUR NETWORK CONFIG HERE
-            IPV4_ADDRESS   = "read";                        
-         };
-
-        SBI :
-        {
-            # SMF binded interface for SBI interface (e.g., communication with AMF, UDM)
-            INTERFACE_NAME = "eth0";     # YOUR NETWORK CONFIG HERE
-            IPV4_ADDRESS   = "read";
-            PORT           = 80;       # YOUR NETWORK CONFIG HERE (default: 80)
-            HTTP2_PORT     = 9090; # YOUR NETWORK CONFIG HERE
-            API_VERSION    = "v1";                # YOUR SMF API VERSION CONFIG HERE
-         };                 
-
-    };
-
-
-    # Pool of UE assigned IP addresses
-    # Do not make IP pools overlap
-    # first IPv4 address X.Y.Z.1 is reserved for GTP network device on UPF
-    IP_ADDRESS_POOL :
-    {
-        IPV4_LIST = (
-                      {RANGE = "12.1.1.2 - 12.1.1.128";},         # STRING, IPv4 RANGE IP_start - IP_end, YOUR NETWORK CONFIG HERE.
-                      {RANGE = "12.1.1.129 - 12.1.1.224";},       # STRING, IPv4 RANGE IP_start - IP_end, YOUR NETWORK CONFIG HERE.
-                      {RANGE = "10.10.10.2 - 10.10.10.253";}  # STRING, IPv4 RANGE IP_start - IP_end, YOUR NETWORK CONFIG HERE.
-
-                    );
-        IPV6_LIST = (
-                      {PREFIX = "2001:1:2::/64";},                # STRING, IPv6 prefix, YOUR NETWORK CONFIG HERE.
-                      {PREFIX = "3001:1:2::/64";},                # STRING, IPv6 prefix, YOUR NETWORK CONFIG HERE.
-                      {PREFIX = "4001:1:2::/64";}                 # STRING, IPv6 prefix, YOUR NETWORK CONFIG HERE.
-                    );
-    };
-
-    DNN_LIST = (
-       # IPV4_POOL, IPV6_POOL are index in IPV4_LIST, IPV6_LIST, PDU_SESSION_TYPE choice in {IPv4, IPv6, IPv4v6}
-      {DNN_NI = "default"; PDU_SESSION_TYPE = "IPv4"; IPV4_POOL  = 2; IPV6_POOL = -1},
-      {DNN_NI = "carrier.com"; PDU_SESSION_TYPE = "IPv4"; IPV4_POOL = 1; IPV6_POOL = -1},
-      {DNN_NI = "oai"; PDU_SESSION_TYPE = "IPv4"; IPV4_POOL = 0; IPV6_POOL = -1}
-    );
-
-    # DNS address communicated to UEs
-    DEFAULT_DNS_IPV4_ADDRESS     = "192.168.18.129";      # YOUR DNS CONFIG HERE
-    DEFAULT_DNS_SEC_IPV4_ADDRESS = "192.168.18.129";  # YOUR DNS CONFIG HERE
-    DEFAULT_DNS_IPV6_ADDRESS     = "2001:4860:4860::8888";            # YOUR DNS CONFIG HERE
-    DEFAULT_DNS_SEC_IPV6_ADDRESS = "2001:4860:4860::8844";            # YOUR DNS CONFIG HERE
- 
-    SUPPORT_FEATURES: 
-    {
-      # STRING, {"yes", "no"}, 
-      REGISTER_NRF = "yes";  # Set to yes if SMF resgisters to an NRF
-      DISCOVER_UPF = "yes";  # Set to yes to enable UPF discovery and selection
-      FORCE_PUSH_PROTOCOL_CONFIGURATION_OPTIONS = "no"; # Non standard feature, normally should be set to "no", 
-                                                        # but you may need to set to yes for UE that do not explicitly request a PDN address through NAS signalling
-      USE_LOCAL_SUBSCRIPTION_INFO = "yes";  # Set to yes if SMF uses local subscription information instead of from an UDM
-      USE_FQDN_DNS = "yes";                  # Set to yes if AMF/UDM/NRF/UPF will relying on a DNS to resolve FQDN
-    }  
-  
-    AMF :
-    {
-      IPV4_ADDRESS = "0.0.0.0";  # YOUR AMF CONFIG HERE
-      PORT         = 80;            # YOUR AMF CONFIG HERE (default: 80)
-      API_VERSION  = "v1";   # YOUR AMF API VERSION FOR SBI CONFIG HERE
-      FQDN         = "oai-amf"               # YOUR AMF FQDN CONFIG HERE
-    };
-    
-    UDM :
-    {
-      IPV4_ADDRESS = "127.0.0.1";  # YOUR UDM CONFIG HERE
-      PORT         = 80;            # YOUR UDM CONFIG HERE (default: 80)
-      API_VERSION  = "v1";   # YOUR UDM API VERSION FOR SBI CONFIG HERE
-      FQDN         = "localhost"      # YOUR UDM FQDN CONFIG HERE
-    };    
-
-    NRF :
-    {
-      IPV4_ADDRESS = "192.168.71.130";  # YOUR NRF CONFIG HERE
-      PORT         = 80;            # YOUR NRF CONFIG HERE (default: 80)
-      API_VERSION  = "v1";   # YOUR NRF API VERSION FOR SBI CONFIG HERE
-      FQDN         = "oai-nrf"      # YOUR NRF FQDN CONFIG HERE
-    };
-        
-    UPF_LIST = (
-         {IPV4_ADDRESS = "192.168.71.134" ; FQDN = "oai-spgwu"}   # YOUR UPF CONFIG HERE
-    );   
-   
-    LOCAL_CONFIGURATION :
-    {
-      SESSION_MANAGEMENT_SUBSCRIPTION_LIST = (
-         { NSSAI_SST = 222, NSSAI_SD = "123", DNN = "default", DEFAULT_SESSION_TYPE = "IPV4", DEFAULT_SSC_MODE = 1, 
-           QOS_PROFILE_5QI = 7, QOS_PROFILE_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PREEMPTCAP = "NOT_PREEMPT", 
-           QOS_PROFILE_ARP_PREEMPTVULN = "NOT_PREEMPTABLE", SESSION_AMBR_UL = "20Mbps", SESSION_AMBR_DL = "22Mbps"},
-         { NSSAI_SST = 1; NSSAI_SD = "1", DNN = "oai", DEFAULT_SESSION_TYPE = "IPV4", DEFAULT_SSC_MODE = 1, 
-           QOS_PROFILE_5QI = 6, QOS_PROFILE_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PREEMPTCAP = "NOT_PREEMPT", 
-           QOS_PROFILE_ARP_PREEMPTVULN = "NOT_PREEMPTABLE", SESSION_AMBR_UL = "20Mbps", SESSION_AMBR_DL = "22Mbps"}
-        );                 
-    };   
-    
-};
-
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/README.md b/ci-scripts/yaml_files/5g_rfsimulator/README.md
index 5c384b3202fe080d5d8f20e4ef272f311b035373..fc562dd1eb97521aef7471435d04c1daef2ccc70 100644
--- a/ci-scripts/yaml_files/5g_rfsimulator/README.md
+++ b/ci-scripts/yaml_files/5g_rfsimulator/README.md
@@ -14,7 +14,7 @@
 
 This page is only valid for an `Ubuntu18` host.
 
-**NOTE: this version (2021-10-05) is valid for the `v1.1.0` and `v1.2.0` versions of the `OAI 5G CN`.**
+**NOTE: this version (2022-01-27) has been updated  for the `v1.3.0` version of the `OAI 5G CN`.**
 
 **TABLE OF CONTENTS**
 
@@ -76,9 +76,9 @@ $ docker image tag rdefosseoai/oai-nr-ue:develop oai-nr-ue:develop
 $ docker logout
 ```
 
-**CAUTION: 2021/10/05 with the release `v1.2.0` of the `CN5G`, the previous version was not compatible any-more.**
+**CAUTION: 2022/01/27 with the release `v1.3.0` of the `CN5G`, the previous version was not compatible any-more.**
 
-**This new version is working for both the `v1.1.0` and `v1.2.0` of the `CN5G`.**
+**This new version is working only with the `v1.3.0` of the `CN5G`.**
 
 # 2. Deploy containers #
 
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml b/ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml
index 952da8087dd93c44f7a1b2c63ebfee5ee1477597..f0476b0a1efd0ed1932c16ca927e7c9dac926bc0 100644
--- a/ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml
+++ b/ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml
@@ -111,7 +111,6 @@ services:
     oai-smf:
         container_name: "rfsim5g-oai-smf"
         image: oai-smf:latest
-        entrypoint: /bin/bash -c "/openair-smf/bin/oai_smf -c /openair-smf/bin/oai-smf.conf -o"
         environment:
             - TZ=Europe/Paris
             - INSTANCE=0
@@ -140,12 +139,13 @@ services:
             - REGISTER_NRF=yes
             - DISCOVER_UPF=yes
             - USE_FQDN_DNS=yes
+            - DNN_NI0=oai
+            - DNN_NI2=oai.ipv4
         depends_on:
             - oai-nrf
             - oai-amf
         volumes:
             - ./smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh
-            - ./oai-smf.conf:/openair-smf/bin/oai-smf.conf
         healthcheck:
             test: /bin/bash -c "/openair-smf/bin/smf-healthcheck.sh"
             interval: 10s
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/oai-smf.conf b/ci-scripts/yaml_files/5g_rfsimulator/oai-smf.conf
deleted file mode 100644
index 0c83ab8be937cee03a6b1dc0931473e162c952df..0000000000000000000000000000000000000000
--- a/ci-scripts/yaml_files/5g_rfsimulator/oai-smf.conf
+++ /dev/null
@@ -1,133 +0,0 @@
-################################################################################
-# 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
-################################################################################
-
-SMF =
-{
-    FQDN = "oai-smf-svc";               
-    INSTANCE      = 0;         # 0 is the default
-    PID_DIRECTORY = "/var/run";  # /var/run is the default
-
-    INTERFACES :
-    {
-        N4 :
-        {
-            # SMF binded interface for N4 communication (UPF)
-            INTERFACE_NAME = "eth0"; # YOUR NETWORK CONFIG HERE
-            IPV4_ADDRESS   = "read";                        
-         };
-
-        SBI :
-        {
-            # SMF binded interface for SBI interface (e.g., communication with AMF, UDM)
-            INTERFACE_NAME = "eth0";     # YOUR NETWORK CONFIG HERE
-            IPV4_ADDRESS   = "read";
-            PORT           = 80;       # YOUR NETWORK CONFIG HERE (default: 80)
-            HTTP2_PORT     = 9090; # YOUR NETWORK CONFIG HERE
-            API_VERSION    = "v1";                # YOUR SMF API VERSION CONFIG HERE
-         };                 
-
-    };
-
-
-    # Pool of UE assigned IP addresses
-    # Do not make IP pools overlap
-    # first IPv4 address X.Y.Z.1 is reserved for GTP network device on UPF
-    IP_ADDRESS_POOL :
-    {
-        IPV4_LIST = (
-                      {RANGE = "12.1.1.2 - 12.1.1.128";},         # STRING, IPv4 RANGE IP_start - IP_end, YOUR NETWORK CONFIG HERE.
-                      {RANGE = "12.1.1.129 - 12.1.1.224";},       # STRING, IPv4 RANGE IP_start - IP_end, YOUR NETWORK CONFIG HERE.
-                      {RANGE = "10.10.10.2 - 10.10.10.253";}  # STRING, IPv4 RANGE IP_start - IP_end, YOUR NETWORK CONFIG HERE.
-
-                    );
-        IPV6_LIST = (
-                      {PREFIX = "2001:1:2::/64";},                # STRING, IPv6 prefix, YOUR NETWORK CONFIG HERE.
-                      {PREFIX = "3001:1:2::/64";},                # STRING, IPv6 prefix, YOUR NETWORK CONFIG HERE.
-                      {PREFIX = "4001:1:2::/64";}                 # STRING, IPv6 prefix, YOUR NETWORK CONFIG HERE.
-                    );
-    };
-
-    DNN_LIST = (
-       # IPV4_POOL, IPV6_POOL are index in IPV4_LIST, IPV6_LIST, PDU_SESSION_TYPE choice in {IPv4, IPv6, IPv4v6}
-      {DNN_NI = "default"; PDU_SESSION_TYPE = "IPv4"; IPV4_POOL  = 2; IPV6_POOL = -1},
-      {DNN_NI = "carrier.com"; PDU_SESSION_TYPE = "IPv4"; IPV4_POOL = 1; IPV6_POOL = -1},
-      {DNN_NI = "oai"; PDU_SESSION_TYPE = "IPv4"; IPV4_POOL = 0; IPV6_POOL = -1}
-    );
-
-    # DNS address communicated to UEs
-    DEFAULT_DNS_IPV4_ADDRESS     = "192.168.18.129";      # YOUR DNS CONFIG HERE
-    DEFAULT_DNS_SEC_IPV4_ADDRESS = "192.168.18.129";  # YOUR DNS CONFIG HERE
-    DEFAULT_DNS_IPV6_ADDRESS     = "2001:4860:4860::8888";            # YOUR DNS CONFIG HERE
-    DEFAULT_DNS_SEC_IPV6_ADDRESS = "2001:4860:4860::8844";            # YOUR DNS CONFIG HERE
- 
-    SUPPORT_FEATURES: 
-    {
-      # STRING, {"yes", "no"}, 
-      REGISTER_NRF = "yes";  # Set to yes if SMF resgisters to an NRF
-      DISCOVER_UPF = "yes";  # Set to yes to enable UPF discovery and selection
-      FORCE_PUSH_PROTOCOL_CONFIGURATION_OPTIONS = "no"; # Non standard feature, normally should be set to "no", 
-                                                        # but you may need to set to yes for UE that do not explicitly request a PDN address through NAS signalling
-      USE_LOCAL_SUBSCRIPTION_INFO = "yes";  # Set to yes if SMF uses local subscription information instead of from an UDM
-      USE_FQDN_DNS = "yes";                  # Set to yes if AMF/UDM/NRF/UPF will relying on a DNS to resolve FQDN
-    }  
-  
-    AMF :
-    {
-      IPV4_ADDRESS = "0.0.0.0";  # YOUR AMF CONFIG HERE
-      PORT         = 80;            # YOUR AMF CONFIG HERE (default: 80)
-      API_VERSION  = "v1";   # YOUR AMF API VERSION FOR SBI CONFIG HERE
-      FQDN         = "oai-amf"               # YOUR AMF FQDN CONFIG HERE
-    };
-    
-    UDM :
-    {
-      IPV4_ADDRESS = "127.0.0.1";  # YOUR UDM CONFIG HERE
-      PORT         = 80;            # YOUR UDM CONFIG HERE (default: 80)
-      API_VERSION  = "v1";   # YOUR UDM API VERSION FOR SBI CONFIG HERE
-      FQDN         = "localhost"      # YOUR UDM FQDN CONFIG HERE
-    };    
-
-    NRF :
-    {
-      IPV4_ADDRESS = "192.168.71.130";  # YOUR NRF CONFIG HERE
-      PORT         = 80;            # YOUR NRF CONFIG HERE (default: 80)
-      API_VERSION  = "v1";   # YOUR NRF API VERSION FOR SBI CONFIG HERE
-      FQDN         = "oai-nrf"      # YOUR NRF FQDN CONFIG HERE
-    };
-        
-    UPF_LIST = (
-         {IPV4_ADDRESS = "192.168.71.134" ; FQDN = "oai-spgwu"}   # YOUR UPF CONFIG HERE
-    );   
-   
-    LOCAL_CONFIGURATION :
-    {
-      SESSION_MANAGEMENT_SUBSCRIPTION_LIST = (
-         { NSSAI_SST = 222, NSSAI_SD = "123", DNN = "default", DEFAULT_SESSION_TYPE = "IPV4", DEFAULT_SSC_MODE = 1, 
-           QOS_PROFILE_5QI = 7, QOS_PROFILE_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PREEMPTCAP = "NOT_PREEMPT", 
-           QOS_PROFILE_ARP_PREEMPTVULN = "NOT_PREEMPTABLE", SESSION_AMBR_UL = "20Mbps", SESSION_AMBR_DL = "22Mbps"},
-         { NSSAI_SST = 1; NSSAI_SD = "1", DNN = "oai", DEFAULT_SESSION_TYPE = "IPV4", DEFAULT_SSC_MODE = 1, 
-           QOS_PROFILE_5QI = 6, QOS_PROFILE_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PREEMPTCAP = "NOT_PREEMPT", 
-           QOS_PROFILE_ARP_PREEMPTVULN = "NOT_PREEMPTABLE", SESSION_AMBR_UL = "20Mbps", SESSION_AMBR_DL = "22Mbps"}
-        );                 
-    };   
-    
-};
-
diff --git a/cmake_targets/install_external_packages.ubuntu20 b/cmake_targets/install_external_packages.ubuntu20
index 0023c8d3c853d55f54d5b751a226355bf3698282..33e558a2349d80ca898a72d02defa4bac319f995 100755
--- a/cmake_targets/install_external_packages.ubuntu20
+++ b/cmake_targets/install_external_packages.ubuntu20
@@ -24,6 +24,7 @@
 # authors Laurent Thomas
 #
 #######################################
+
 if [ ! -f /etc/os-release ]; then
     echo "No /etc/os-release file found. You're likely on an unsupported distro."
     exit 1
@@ -472,7 +473,7 @@ if ! check_supported_distribution; then
     echo_error "Your distribution $(get_distribution_release) is not supported by oai !"
     exit 1
 fi
-
+set_openair_env
 echo_info "Installing packages"
 check_install_ubuntu_packages
 
diff --git a/common/config/config_load_configmodule.c b/common/config/config_load_configmodule.c
index d336c1f2293f64bb3a5a878a0be4fb3f09312d13..773692a82a05b53f1419b1418dffdb9acf54f04f 100644
--- a/common/config/config_load_configmodule.c
+++ b/common/config/config_load_configmodule.c
@@ -254,7 +254,7 @@ configmodule_interface_t *load_configmodule(int argc,
   cfgptr = calloc(sizeof(configmodule_interface_t),1);
   /* argv_info is used to memorize command line options which have been recognized */
   /* and to detect unrecognized command line options which might have been specified */
-  cfgptr->argv_info = calloc(sizeof(int32_t), argc);
+  cfgptr->argv_info = calloc(sizeof(int32_t), argc+10);
   /* argv[0] is the exec name, always Ok */
   cfgptr->argv_info[0] |= CONFIG_CMDLINEOPT_PROCESSED;
 
diff --git a/doc/SW-archi-graph.md b/doc/SW-archi-graph.md
new file mode 100644
index 0000000000000000000000000000000000000000..8f8a6f6e5cf1ed944d291c8e9fc02f48002c522a
--- /dev/null
+++ b/doc/SW-archi-graph.md
@@ -0,0 +1,75 @@
+```mermaid
+flowchart TB
+    A[ru_thread] --> RFin>block rx_rf] --> feprx
+    feprx --> half-slot --> end_feprx
+    feprx --> second-thread -- block_end_feprx --> end_feprx>feprx]
+    end_feprx --> rx_nr_prach_ru
+rx_nr_prach_ru -- block_queue_singleton --> resp_L1>resp L1]
+resp_L1 -- async launch --> rx_func
+resp_L1 -- immediate return --> RFin
+
+subgraph rxfunc
+rx_func_implem[rx_func] 
+    subgraph rxfuncbeg
+      handle_nr_slot_ind
+      --> rnti_to_remove-mgmt
+      --> L1_nr_prach_procedures
+      --> apply_nr_rotation_ul
+    end 
+    subgraph phy_procedures_gNB_uespec_RX
+      fill_ul_rb_mask
+      --> pucch(decode each gNB->pucch)
+      -->nr_fill_ul_indication
+      --> nr_ulsch_procedures
+      --> nr_ulsch_decoding
+      --> segInParallel[[all segments decode in parallel]]
+      --> barrier_end_of_ulsch_decoding
+    end 
+    subgraph NR_UL_indication
+      handle_nr_rach
+      --> handle_nr_uci
+      --> handle_nr_ulsch
+      subgraph gNB_dlsch_ulsch_scheduler
+          run_pdcp
+          --> nr_rrc_trigger
+          --> schedule_xxxx
+      end
+      handle_nr_ulsch --> gNB_dlsch_ulsch_scheduler
+      subgraph NR_Schedule_response
+         L1_tx_free3>L1_tx_free]
+         --> handle_nr_nfapi_xxx_pdu
+         --> sendTxFilled((L1_tx_filled))
+         --> nr_fill_ul_xxx
+         --> nr_fill_prach
+      end
+      gNB_dlsch_ulsch_scheduler --> NR_Schedule_response
+    end 
+    rx_func_implem --> rxfuncbeg
+    rxfuncbeg --> phy_procedures_gNB_uespec_RX
+phy_procedures_gNB_uespec_RX --> NR_UL_indication
+-- block_queue_block_PNF_monolithic --> L1_tx_free2>L1 tx filled]
+-- async launch --> tx_func
+L1_tx_free2 -- send_msg --> rsp((resp_L1))
+end 
+rx_func --> rxfunc
+
+
+subgraph tx_func
+    direction LR
+    subgraph phy_procedures_gNB_TX
+       dcitop[nr_generate dci top]
+       --> nr_generate_csi_rs
+       --> apply_nr_rotation
+       -- send_msg --> end_tx_func((L1_tx_out))
+    end
+    subgraph tx_reorder_thread
+        L1_tx_out>L1_tx_out]
+        --> reorder{re order} --> reorder
+        reorder --> ru_tx_func
+        reorder --> L1_tx_free((L1_tx_free))
+        ru_tx_func --> feptx_prec
+        --> feptx_ofdm
+    end 
+end
+
+```
diff --git a/doc/SW_archi.md b/doc/SW_archi.md
index 059386310213a17ef6149ec571c3c0bd813a084f..0e77cfa580afa5647df6173fc9458adef0f23f20 100644
--- a/doc/SW_archi.md
+++ b/doc/SW_archi.md
@@ -17,6 +17,70 @@ body {
 
 </style>
 
+```mermaid
+flowchart TB
+    A[ru_thread] --> RFin>block rx_rf] --> feprx
+    feprx --> half-slot --> end_feprx
+    feprx --> second-thread -- block_end_feprx --> end_feprx>feprx]
+    end_feprx --> rx_nr_prach_ru
+rx_nr_prach_ru -- block_queue --> resp_L1>resp L1]
+resp_L1 -- async launch --> rx_func
+resp_L1 -- immediate return --> RFin
+
+subgraph rxfunc
+rx_func_implem[rx_func] 
+    subgraph rxfuncbeg
+      handle_nr_slot_ind
+      --> rnti_to_remove-mgmt
+      --> L1_nr_prach_procedures
+      --> apply_nr_rotation_ul
+    end 
+    subgraph phy_procedures_gNB_uespec_RX
+      fill_ul_rb_mask
+      --> pucch(decode each gNB->pucch)
+      -->nr_fill_ul_indication
+      --> nr_ulsch_procedures
+      --> nr_ulsch_decoding
+      --> segInParallel[[all segments decode in parallel]]
+      --> barrier_end_of_ulsch_decoding
+    end 
+    subgraph NR_UL_indication
+      handle_nr_rach
+      --> handle_nr_uci
+      --> handle_nr_ulsch
+      --> gNB_dlsch_ulsch_scheduler
+      --> NR_Schedule_response
+    end 
+    rx_func_implem --> rxfuncbeg
+    rxfuncbeg --> phy_procedures_gNB_uespec_RX
+phy_procedures_gNB_uespec_RX --> NR_UL_indication
+-- block_queue --> L1_tx_free2>L1 tx free]
+-- async launch --> tx_func
+L1_tx_free2 -- send_msg --> rsp((resp_L1))
+end 
+rx_func --> rxfunc
+
+
+subgraph tx
+    direction LR
+    subgraph tx_func2
+       phy_procedures_gNB_TX
+       --> dcitop[nr_generate dci top]
+       --> nr_generate_csi_rs
+       --> apply_nr_rotation
+       -- send_msg --> end_tx_func((L1_tx_out))
+    end
+    subgraph tx_reorder_thread
+        L1_tx_out>L1_tx_out]
+        --> reorder{re order} --> reorder
+        reorder --> ru_tx_func
+        reorder --> L1_tx_free((L1_tx_free))
+        ru_tx_func --> feptx_prec
+        --> feptx_ofdm
+    end 
+    tx_func2 --> tx_reorder_thread
+end
+```
 
 This tuto for 5G gNB design, with Open Cells main
 {: .text-center}
diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index 4fe8cfa1bfd310c21c35e70be1651516ef591d12..9551a71921ebb0e1c2bb94a07e7d418f4b366c26 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -87,7 +87,6 @@
 #include <openair1/PHY/NR_TRANSPORT/nr_ulsch.h>
 #include <openair1/PHY/NR_TRANSPORT/nr_dlsch.h>
 #include <PHY/NR_ESTIMATION/nr_ul_estimation.h>
-//#define DEBUG_THREADS 1
 
 //#define USRP_DEBUG 1
 // Fix per CC openair rf/if device update
@@ -114,7 +113,6 @@ time_stats_t softmodem_stats_rx_sf; // total rx time
 void tx_func(void *param) {
 
   processingData_L1tx_t *info = (processingData_L1tx_t *) param;
-  PHY_VARS_gNB *gNB = info->gNB;
   int frame_tx = info->frame;
   int slot_tx = info->slot;
 
@@ -122,35 +120,9 @@ void tx_func(void *param) {
                         frame_tx,
                         slot_tx,
                         1);
-  info->slot = -1;
-  //if ((frame_tx&127) == 0) dump_pdsch_stats(fd,gNB);
-
-  // If the later of the 2 L1 tx thread finishes first,
-  // we wait for the earlier one to finish and start the RU thread
-  // to avoid realtime issues with USRP
-
-  // Start RU TX processing.
-  notifiedFIFO_elt_t *res;
-  res = pullTpool(gNB->resp_RU_tx, gNB->threadPool);
-  processingData_RU_t *syncMsg = (processingData_RU_t *)NotifiedFifoData(res);
-  LOG_D(PHY,"waiting for previous tx to finish, next slot %d,%d\n",syncMsg->next_slot,slot_tx);
-  while (syncMsg->next_slot != slot_tx) {
-    pushNotifiedFIFO(gNB->resp_RU_tx, res);
-    res = pullTpool(gNB->resp_RU_tx, gNB->threadPool);
-    syncMsg = (processingData_RU_t *)NotifiedFifoData(res);
-  }
-  LOG_D(PHY,"previous tx finished, next slot %d,%d\n",syncMsg->next_slot,slot_tx);
-  syncMsg->frame_tx = frame_tx;
-  syncMsg->slot_tx = slot_tx;
-  syncMsg->next_slot = get_next_downlink_slot(gNB, &gNB->gNB_config, frame_tx, slot_tx);
-  syncMsg->timestamp_tx = info->timestamp_tx;
-  syncMsg->ru = gNB->RU_list[0];
-  res->key = slot_tx;
-  pushTpool(gNB->threadPool, res);
 }
 
 void rx_func(void *param) {
-
   processingData_L1_t *info = (processingData_L1_t *) param;
   PHY_VARS_gNB *gNB = info->gNB;
   int frame_rx = info->frame_rx;
@@ -275,15 +247,12 @@ void rx_func(void *param) {
   
   if (tx_slot_type == NR_DOWNLINK_SLOT || tx_slot_type == NR_MIXED_SLOT) {
     notifiedFIFO_elt_t *res;
-    res = pullTpool(gNB->resp_L1_tx, gNB->threadPool);
-    processingData_L1tx_t *syncMsg = (processingData_L1tx_t *)NotifiedFifoData(res);
-    while (syncMsg->slot != slot_tx) {
-      pushNotifiedFIFO(gNB->resp_L1_tx, res);
-      res = pullTpool(gNB->resp_L1_tx, gNB->threadPool);
-      syncMsg = (processingData_L1tx_t *)NotifiedFifoData(res);
-    }
+    processingData_L1tx_t *syncMsg;
+    // Its a FIFO so it maitains the order in which the MAC fills the messages
+    // so no need for checking for right slot
+    res = pullTpool(gNB->L1_tx_filled, gNB->threadPool);
+    syncMsg = (processingData_L1tx_t *)NotifiedFifoData(res);
     syncMsg->gNB = gNB;
-    AssertFatal(syncMsg->slot == slot_tx, "Thread message slot and logical slot number do not match\n");
     syncMsg->timestamp_tx = info->timestamp_tx;
     res->key = slot_tx;
     pushTpool(gNB->threadPool, res);
@@ -331,8 +300,8 @@ void rx_func(void *param) {
 }
 static void dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output) {
   int stroff = 0;
-  stroff += print_meas_log(gNB->phy_proc_tx_0, "L1 Tx processing thread 0", NULL, NULL, output);
-  stroff += print_meas_log(gNB->phy_proc_tx_1, "L1 Tx processing thread 1", NULL, NULL, output+stroff);
+  stroff += print_meas_log(gNB->phy_proc_tx[0], "L1 Tx processing thread 0", NULL, NULL, output);
+  //stroff += print_meas_log(gNB->phy_proc_tx[1], "L1 Tx processing thread 1", NULL, NULL, output+stroff);
   stroff += print_meas_log(&gNB->dlsch_encoding_stats, "DLSCH encoding", NULL, NULL, output+stroff);
   stroff += print_meas_log(&gNB->phy_proc_rx, "L1 Rx processing", NULL, NULL, output+stroff);
   stroff += print_meas_log(&gNB->ul_indication_stats, "UL Indication", NULL, NULL, output+stroff);
@@ -367,8 +336,8 @@ void *nrL1_stats_thread(void *param) {
   fd=fopen("nrL1_stats.log","w");
   AssertFatal(fd!=NULL,"Cannot open nrL1_stats.log\n");
 
-  reset_meas(gNB->phy_proc_tx_0);
-  reset_meas(gNB->phy_proc_tx_1);
+  reset_meas(gNB->phy_proc_tx[0]);
+  //reset_meas(gNB->phy_proc_tx[1]);
   reset_meas(&gNB->dlsch_encoding_stats);
   reset_meas(&gNB->phy_proc_rx);
   reset_meas(&gNB->ul_indication_stats);
@@ -389,6 +358,52 @@ void *nrL1_stats_thread(void *param) {
   return(NULL);
 }
 
+// This thread reads the finished L1 tx jobs from threaPool
+// and pushes RU tx thread in the right order. It works only
+// two parallel L1 tx threads.
+void *tx_reorder_thread(void* param) {
+  PHY_VARS_gNB *gNB = (PHY_VARS_gNB *)param;
+    notifiedFIFO_elt_t *resL1Reserve = NULL;
+  
+
+  resL1Reserve=pullTpool(gNB->L1_tx_out, gNB->threadPool);
+  int next_tx_slot=((processingData_L1tx_t *)NotifiedFifoData(resL1Reserve))->slot;
+  
+  while (!oai_exit) {
+    notifiedFIFO_elt_t *resL1;
+    if (resL1Reserve) {
+       resL1=resL1Reserve;
+       if (((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot != next_tx_slot) {
+         LOG_E(PHY,"order mistake");
+	 resL1Reserve=NULL;
+	 resL1 = pullTpool(gNB->L1_tx_out, gNB->threadPool);
+       }
+     } else { 
+       resL1 = pullTpool(gNB->L1_tx_out, gNB->threadPool);
+       if (((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot != next_tx_slot) {
+          if (resL1Reserve)
+              LOG_E(PHY,"error, have a stored packet, then a second one\n");
+	  resL1Reserve=resL1;
+          resL1 = pullTpool(gNB->L1_tx_out, gNB->threadPool);
+          if (((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot != next_tx_slot)
+	    LOG_E(PHY,"error, pull two msg, none is good\n");
+       }
+    }
+    processingData_L1tx_t *syncMsgL1= (processingData_L1tx_t *)NotifiedFifoData(resL1);
+    processingData_RU_t syncMsgRU;
+    syncMsgRU.frame_tx = syncMsgL1->frame;
+    syncMsgRU.slot_tx = syncMsgL1->slot;
+    syncMsgRU.timestamp_tx = syncMsgL1->timestamp_tx;
+    syncMsgRU.ru = gNB->RU_list[0];
+    next_tx_slot = get_next_downlink_slot(gNB, &gNB->gNB_config, syncMsgRU.frame_tx, syncMsgRU.slot_tx);
+    pushNotifiedFIFO(gNB->L1_tx_free, resL1);
+    if (resL1==resL1Reserve)
+       resL1Reserve=NULL;
+    ru_tx_func((void*)&syncMsgRU);
+  }
+  return(NULL);
+}
+
 void init_gNB_Tpool(int inst) {
   PHY_VARS_gNB *gNB;
   gNB = RC.gNB[inst];
@@ -420,40 +435,29 @@ void init_gNB_Tpool(int inst) {
   pushNotifiedFIFO(gNB->resp_L1,msg); // to unblock the process in the beginning
 
   // L1 TX result FIFO 
-  gNB->resp_L1_tx = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
-  initNotifiedFIFO(gNB->resp_L1_tx);
+  gNB->L1_tx_free = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
+  gNB->L1_tx_filled = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
+  gNB->L1_tx_out = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
+  initNotifiedFIFO(gNB->L1_tx_free);
+  initNotifiedFIFO(gNB->L1_tx_filled);
+  initNotifiedFIFO(gNB->L1_tx_out);
+  
   // we create 2 threads for L1 tx processing
-  notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0,gNB->resp_L1_tx,tx_func);
-  processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx);
-  init_DLSCH_struct(gNB, msgDataTx);
-  msgDataTx->slot = -1;
-  memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t));
-  reset_meas(&msgDataTx->phy_proc_tx);
-  gNB->phy_proc_tx_0 = &msgDataTx->phy_proc_tx;
-  pushNotifiedFIFO(gNB->resp_L1_tx,msgL1Tx); // to unblock the process in the beginning
-
-  msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0,gNB->resp_L1_tx,tx_func);
-  msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx);
-  init_DLSCH_struct(gNB, msgDataTx);
-  msgDataTx->slot = -1;
-  memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t));
-  reset_meas(&msgDataTx->phy_proc_tx);
-  gNB->phy_proc_tx_1 = &msgDataTx->phy_proc_tx;
-  pushNotifiedFIFO(gNB->resp_L1_tx,msgL1Tx); // to unblock the process in the beginning
-
-  // RU TX result FIFO 
-  gNB->resp_RU_tx = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
-  initNotifiedFIFO(gNB->resp_RU_tx);
-  notifiedFIFO_elt_t *msgRUTx = newNotifiedFIFO_elt(sizeof(processingData_RU_t),0,gNB->resp_RU_tx,ru_tx_func);
-  processingData_RU_t *msgData = (processingData_RU_t*)msgRUTx->msgData;
-  int first_tx_slot = sf_ahead*gNB->frame_parms.slots_per_subframe;
-  msgData->next_slot = get_next_downlink_slot(gNB, &gNB->gNB_config, 0, first_tx_slot-1);
-  pushNotifiedFIFO(gNB->resp_RU_tx,msgRUTx); // to unblock the process in the beginning
-
-  if (!get_softmodem_params()->emulate_l1) {
-    threadCreate(&proc->L1_stats_thread,nrL1_stats_thread,(void*)gNB,"L1_stats",-1,OAI_PRIORITY_RT_LOW);
+  for (int i=0; i < 1; i++) {
+    notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0,gNB->L1_tx_out,tx_func);
+    processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx);
+    init_DLSCH_struct(gNB, msgDataTx);
+    memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t));
+    reset_meas(&msgDataTx->phy_proc_tx);
+    gNB->phy_proc_tx[i] = &msgDataTx->phy_proc_tx;
+    pushNotifiedFIFO(gNB->L1_tx_free,msgL1Tx); // to unblock the process in the beginning
   }
 
+  if (!get_softmodem_params()->emulate_l1) 
+     threadCreate(&proc->L1_stats_thread,nrL1_stats_thread,(void*)gNB,"L1_stats",-1,OAI_PRIORITY_RT_LOW);
+
+  threadCreate(&proc->pthread_tx_reorder, tx_reorder_thread, (void *)gNB, "thread_tx_reorder", -1, OAI_PRIORITY_RT_MAX);
+
 }
 
 
diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index c7375601a635430a8d2cf225d7bbe18765be5b4a..c3788ef480be863d9d52eab9bea21a029cd0c128 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -1471,11 +1471,9 @@ void *ru_thread( void *param ) {
 
   res = pullNotifiedFIFO(gNB->resp_L1);
   delNotifiedFIFO_elt(res);
-  res = pullNotifiedFIFO(gNB->resp_L1_tx);
+  res = pullNotifiedFIFO(gNB->L1_tx_free);
   delNotifiedFIFO_elt(res);
-  res = pullNotifiedFIFO(gNB->resp_L1_tx);
-  delNotifiedFIFO_elt(res);
-  res = pullNotifiedFIFO(gNB->resp_RU_tx);
+  res = pullNotifiedFIFO(gNB->L1_tx_free);
   delNotifiedFIFO_elt(res);
 
   ru_thread_status = 0;
diff --git a/nfapi/oai_integration/nfapi_pnf.c b/nfapi/oai_integration/nfapi_pnf.c
index 3a59be41e9e40564acf9287d1655f107a68d6719..2c317687cf6cc3e925ed1b57f07426816e8d169d 100644
--- a/nfapi/oai_integration/nfapi_pnf.c
+++ b/nfapi/oai_integration/nfapi_pnf.c
@@ -1101,41 +1101,10 @@ void pnf_phy_deallocate_p7_vendor_ext(nfapi_p7_message_header_t *header) {
 
 notifiedFIFO_elt_t *l1tx_message_extract(PHY_VARS_gNB *gNB, int frame, int slot) {
   notifiedFIFO_elt_t *res;
-  notifiedFIFO_elt_t *freeRes = NULL;
 
-  // check first message
-  res = pullTpool(gNB->resp_L1_tx, gNB->threadPool);
-  processingData_L1tx_t *msgTx = (processingData_L1tx_t *)NotifiedFifoData(res);
-  if (msgTx->slot == slot) {
-    return res;
-  }
-  if (msgTx->slot == -1) {
-    freeRes = res;
-  }
-
-  // check second message
-  pushNotifiedFIFO(gNB->resp_L1_tx,res);
-  res = pullTpool(gNB->resp_L1_tx, gNB->threadPool);
-  msgTx = (processingData_L1tx_t *)NotifiedFifoData(res);
-  if (msgTx->slot == slot) {
-    return res;
-  }
-  if (msgTx->slot == -1) {
-    freeRes = res;
-  }
-
-  if (freeRes) {
-    msgTx = (processingData_L1tx_t *)NotifiedFifoData(res);
-    msgTx->num_pdsch_slot=0;
-    msgTx->pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
-    msgTx->ul_pdcch_pdu.pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
-    msgTx->slot = slot;
-    msgTx->frame = frame;
-    return freeRes;
-  }
-  pushNotifiedFIFO(gNB->resp_L1_tx,res);
-  AssertFatal(1==0, "It means both L1 Tx messages are still waiting to be processed. This happens when L1 Tx processing is too slow. Message slot %d, scheduled slot %d\n",
-    msgTx->slot, slot);
+  //TODO: This needs to be reworked for nfapi to work
+  res = pullTpool(gNB->L1_tx_free, gNB->threadPool);
+  return res;
 }
 
 int pnf_phy_ul_dci_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_ul_dci_request_t *req) {
@@ -1161,7 +1130,7 @@ int pnf_phy_ul_dci_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7,
     }
   }
 
-  pushNotifiedFIFO(gNB->resp_L1_tx,res);
+  pushNotifiedFIFO(gNB->L1_tx_filled,res);
 
   return 0;
 }
@@ -1269,7 +1238,7 @@ int pnf_phy_dl_tti_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7,
     else {
       NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() UNKNOWN:%d\n", __FUNCTION__, dl_tti_pdu_list[i].PDUType);
     }
-    pushNotifiedFIFO(gNB->resp_L1_tx,res);
+    pushNotifiedFIFO(gNB->L1_tx_filled,res);
   }
 
   if(req->vendor_extension)
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
index ef1c8e2571f60c76f507169ee346152825f5f876..75c5a30dabd4efc0a1e46dfa00e203deb262454d 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
@@ -353,6 +353,8 @@ typedef struct {
 } fapi_nr_ul_config_request_pdu_t;
 
 typedef struct {
+  //uint16_t sfn;
+  //uint16_t slot;
   uint16_t sfn;
   uint16_t slot;
   uint8_t number_pdus;
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index afd1fc6e0da14dcb0aeba83edbff8963fe5fc381..819fccc588e6fbaad543a21dba34b8be62898f2e 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -294,8 +294,8 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ENCODING, VCD_FUNCTION_IN);
   uint32_t A = rel15->TBSize[0]<<3;
 
-  if ( dlsch->rnti != SI_RNTI )
-    trace_NRpdu(DIRECTION_DOWNLINK, a, rel15->TBSize[0], 0, WS_C_RNTI, dlsch->rnti, frame, slot,0, 0);
+  if ( rel15->rnti != SI_RNTI)
+    trace_NRpdu(DIRECTION_DOWNLINK, a, rel15->TBSize[0], 0, WS_C_RNTI, rel15->rnti, frame, slot,0, 0);
 
   NR_gNB_SCH_STATS_t *stats=NULL;
   int first_free=-1;
diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c
index 44adf02f576f16d39e906238676abda1df701184..5594d566934d659c322ce19382d67c90b5c8e57d 100644
--- a/openair1/PHY/TOOLS/nr_phy_scope.c
+++ b/openair1/PHY/TOOLS/nr_phy_scope.c
@@ -33,7 +33,6 @@
 #define ScaleZone 4
 #define localBuff(NaMe,SiZe) float NaMe[SiZe]; memset(NaMe,0,sizeof(NaMe));
 
-int otg_enabled;
 
 const FL_COLOR rx_antenna_colors[4] = {FL_RED,FL_BLUE,FL_GREEN,FL_YELLOW};
 const FL_COLOR water_colors[4] = {FL_BLUE,FL_GREEN,FL_YELLOW,FL_RED};
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index fb4f9a0092936d553a0a0566a944e55fbc0b8040..edcac7a91dedcf13ea9c62912c68c9fc1f80da4c 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -594,6 +594,8 @@ typedef struct gNB_L1_proc_t_s {
   pthread_t L1_stats_thread;
   /// pthread structure for printing time meas
   pthread_t process_stats_thread;
+  /// pthread structure for reordering L1 tx thread messages
+  pthread_t pthread_tx_reorder;
   /// flag to indicate first RX acquisition
   int first_rx;
   /// flag to indicate first TX transmission
@@ -844,8 +846,7 @@ typedef struct PHY_VARS_gNB_s {
   /*
   time_stats_t phy_proc;
   */
-  time_stats_t *phy_proc_tx_0;
-  time_stats_t *phy_proc_tx_1;
+  time_stats_t *phy_proc_tx[2];
   time_stats_t phy_proc_rx;
   time_stats_t rx_prach;
   /*
@@ -886,7 +887,9 @@ typedef struct PHY_VARS_gNB_s {
   */
   notifiedFIFO_t *respDecode;
   notifiedFIFO_t *resp_L1;
-  notifiedFIFO_t *resp_L1_tx;
+  notifiedFIFO_t *L1_tx_free;
+  notifiedFIFO_t *L1_tx_filled;
+  notifiedFIFO_t *L1_tx_out;
   notifiedFIFO_t *resp_RU_tx;
   tpool_t *threadPool;
   int nbDecode;
diff --git a/openair1/PHY/phy_vars.h b/openair1/PHY/phy_vars.h
index 9fd186ec4f9d7ab2a25f7725b735d3150631bbb8..d99a3016ba6a07a012cb9a6f1640c156fedd495f 100644
--- a/openair1/PHY/phy_vars.h
+++ b/openair1/PHY/phy_vars.h
@@ -82,8 +82,7 @@ const double sinr_to_cqi[4][16]= { {-2.5051, -2.5051, -1.7451, -0.3655, 1.0812,
   { -4.1057, -4.1057, -3.3768, -2.2916, -1.1392, 0.1236, 1.2849, 3.1933, 5.9298, 6.4052, 9.6245, 10.9414, 13.5166, 14.9545, 14.9545, 14.9545}
 };
 
-//int cqi_to_mcs[16]={0, 0, 1, 3, 5, 7, 9, 13, 15, 16, 20, 23, 25, 27, 27, 27};
-const int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 27};
+const int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 28};
 
 //for SNR to MI conversion 7 th order Polynomial coeff
 const double q_qam16[8]= {3.21151853033897e-10,5.55435952230651e-09,-2.30760065362117e-07,-6.25587743817859e-06,4.62251036452795e-06,0.00224150813158937,0.0393723140344367,0.245486379182639};
diff --git a/openair1/PHY/phy_vars_nr_ue.h b/openair1/PHY/phy_vars_nr_ue.h
index 303853add22a5012bc2b7ff157429a522e0be91b..550a2f0394665bda6fef28b3ca8f5acc42defd25 100644
--- a/openair1/PHY/phy_vars_nr_ue.h
+++ b/openair1/PHY/phy_vars_nr_ue.h
@@ -83,9 +83,6 @@ const double sinr_to_cqi[4][16]= { {-2.5051, -2.5051, -1.7451, -0.3655, 1.0812,
   { -4.1057, -4.1057, -3.3768, -2.2916, -1.1392, 0.1236, 1.2849, 3.1933, 5.9298, 6.4052, 9.6245, 10.9414, 13.5166, 14.9545, 14.9545, 14.9545}
 };
 
-//int cqi_to_mcs[16]={0, 0, 1, 3, 5, 7, 9, 13, 15, 16, 20, 23, 25, 27, 27, 27};
-const int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 27};
-
 //for SNR to MI conversion 7 th order Polynomial coeff
 const double q_qam16[8]= {3.21151853033897e-10,5.55435952230651e-09,-2.30760065362117e-07,-6.25587743817859e-06,4.62251036452795e-06,0.00224150813158937,0.0393723140344367,0.245486379182639};
 const double q_qpsk[8]= {1.94491167814437e-09,8.40494123817774e-08,4.75527131198034e-07,-2.48946285301621e-05,-0.000347614016158364,0.00209252225437100,0.0742986115462510,0.488297879889425};
diff --git a/openair1/PHY/phy_vars_ue.h b/openair1/PHY/phy_vars_ue.h
index 2c1334b80b19e679d6312894b10a7addfde95890..2cdec82f0f9565a9fd2519c7460ff476ad531e43 100644
--- a/openair1/PHY/phy_vars_ue.h
+++ b/openair1/PHY/phy_vars_ue.h
@@ -72,8 +72,7 @@ const double sinr_to_cqi[4][16]= { {-2.5051, -2.5051, -1.7451, -0.3655, 1.0812,
   { -4.1057, -4.1057, -3.3768, -2.2916, -1.1392, 0.1236, 1.2849, 3.1933, 5.9298, 6.4052, 9.6245, 10.9414, 13.5166, 14.9545, 14.9545, 14.9545}
 };
 
-//int cqi_to_mcs[16]={0, 0, 1, 3, 5, 7, 9, 13, 15, 16, 20, 23, 25, 27, 27, 27};
-const int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 27};
+const int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 28};
 
 //for SNR to MI conversion 7 th order Polynomial coeff
 const double q_qam16[8]= {3.21151853033897e-10,5.55435952230651e-09,-2.30760065362117e-07,-6.25587743817859e-06,4.62251036452795e-06,0.00224150813158937,0.0393723140344367,0.245486379182639};
diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c
index 1b13ca83f419d22ca37d69fe5558dd5481441b10..70e2948402993639ebabe98425f040d860900c9a 100644
--- a/openair1/SCHED_NR/fapi_nr_l1.c
+++ b/openair1/SCHED_NR/fapi_nr_l1.c
@@ -148,6 +148,9 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
   AssertFatal(RC.gNB[Mod_id]!=NULL,"RC.gNB[%d] is null\n",Mod_id);
 
   gNB = RC.gNB[Mod_id];
+  nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
+
+  int slot_type = nr_slot_select(cfg,frame,slot);
 
   uint8_t number_dl_pdu             = (DL_req==NULL) ? 0 : DL_req->dl_tti_request_body.nPDUs;
   uint8_t number_ul_dci_pdu         = (UL_dci_req==NULL) ? 0 : UL_dci_req->numPdus;
@@ -155,62 +158,59 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
   uint8_t number_tx_data_pdu        = (TX_req == NULL) ? 0 : TX_req->Number_of_PDUs;
 
   if (NFAPI_MODE == NFAPI_MONOLITHIC){
-    notifiedFIFO_elt_t *res;
-    res = pullTpool(gNB->resp_L1_tx, gNB->threadPool);
-    processingData_L1tx_t *msgTx = (processingData_L1tx_t *)NotifiedFifoData(res);
-    if (DL_req != NULL && TX_req!=NULL && (number_dl_pdu > 0 || number_ul_dci_pdu > 0 || number_ul_tti_pdu > 0))
-      LOG_D(PHY,"NFAPI: Sched_INFO:SFN/SLOT:%04d/%d DL_req:SFN/SLO:%04d/%d:dl_pdu:%d tx_req:SFN/SLOT:%04d/%d:pdus:%d;ul_dci %d ul_tti %d\n",
-      frame,slot,
-      DL_req->SFN,DL_req->Slot,number_dl_pdu,
-      TX_req->SFN,TX_req->Slot,TX_req->Number_of_PDUs,
-      number_ul_dci_pdu,number_ul_tti_pdu);
-
-    int pdcch_received=0;
-    msgTx->num_pdsch_slot=0;
-    msgTx->pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
-    msgTx->ul_pdcch_pdu.pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
-    msgTx->slot = slot;
-    msgTx->frame = frame;
-
-    for (int i=0;i<number_dl_pdu;i++) {
-      nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdu = &DL_req->dl_tti_request_body.dl_tti_pdu_list[i];
-      LOG_D(PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_tti_pdu->PDUType);
-      switch (dl_tti_pdu->PDUType) {
-        case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
-          handle_nr_nfapi_ssb_pdu(msgTx,frame,slot,
-                                  dl_tti_pdu);
-          break;
-
-        case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
-          AssertFatal(pdcch_received == 0, "pdcch_received is not 0, we can only handle one PDCCH PDU per slot\n");
-          msgTx->pdcch_pdu = dl_tti_pdu->pdcch_pdu;
-
-          pdcch_received = 1;
-          break;
 
-        case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
-          LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot);
-          handle_nfapi_nr_csirs_pdu(msgTx,frame,slot,
-            &dl_tti_pdu->csi_rs_pdu);
-          break;
-
-        case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
-          LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot);
-          nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdu->pdsch_pdu.pdsch_pdu_rel15;
-          uint16_t pduIndex = pdsch_pdu_rel15->pduIndex;
-          AssertFatal(TX_req->pdu_list[pduIndex].num_TLV == 1, "TX_req->pdu_list[%d].num_TLV %d != 1\n",
-          pduIndex,TX_req->pdu_list[pduIndex].num_TLV);
-          uint8_t *sdu = (uint8_t *)TX_req->pdu_list[pduIndex].TLVs[0].value.direct;
-          AssertFatal(msgTx->num_pdsch_slot < gNB->number_of_nr_dlsch_max,"Number of PDSCH PDUs %d exceeded the limit %d\n",
-            msgTx->num_pdsch_slot,gNB->number_of_nr_dlsch_max);
-          handle_nr_nfapi_pdsch_pdu(msgTx,&dl_tti_pdu->pdsch_pdu, sdu);
+    if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT) {
+      notifiedFIFO_elt_t *res;
+      res = pullTpool(gNB->L1_tx_free, gNB->threadPool);
+      processingData_L1tx_t *msgTx = (processingData_L1tx_t *)NotifiedFifoData(res);
+
+      int pdcch_received=0;
+      msgTx->num_pdsch_slot=0;
+      msgTx->pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
+      msgTx->ul_pdcch_pdu.pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
+      msgTx->slot = slot;
+      msgTx->frame = frame;
+
+      for (int i=0;i<number_dl_pdu;i++) {
+        nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdu = &DL_req->dl_tti_request_body.dl_tti_pdu_list[i];
+        LOG_D(PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_tti_pdu->PDUType);
+        switch (dl_tti_pdu->PDUType) {
+          case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
+            handle_nr_nfapi_ssb_pdu(msgTx,frame,slot,
+                                    dl_tti_pdu);
+            break;
+
+          case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
+            AssertFatal(pdcch_received == 0, "pdcch_received is not 0, we can only handle one PDCCH PDU per slot\n");
+            msgTx->pdcch_pdu = dl_tti_pdu->pdcch_pdu;
+
+            pdcch_received = 1;
+            break;
+
+          case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
+            LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot);
+            handle_nfapi_nr_csirs_pdu(msgTx,frame,slot,
+              &dl_tti_pdu->csi_rs_pdu);
+            break;
+
+          case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
+            LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot);
+            nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdu->pdsch_pdu.pdsch_pdu_rel15;
+            uint16_t pduIndex = pdsch_pdu_rel15->pduIndex;
+            AssertFatal(TX_req->pdu_list[pduIndex].num_TLV == 1, "TX_req->pdu_list[%d].num_TLV %d != 1\n",
+            pduIndex,TX_req->pdu_list[pduIndex].num_TLV);
+            uint8_t *sdu = (uint8_t *)TX_req->pdu_list[pduIndex].TLVs[0].value.direct;
+            AssertFatal(msgTx->num_pdsch_slot < gNB->number_of_nr_dlsch_max,"Number of PDSCH PDUs %d exceeded the limit %d\n",
+              msgTx->num_pdsch_slot,gNB->number_of_nr_dlsch_max);
+            handle_nr_nfapi_pdsch_pdu(msgTx,&dl_tti_pdu->pdsch_pdu, sdu);
+        }
       }
-    }
 
-    if (number_ul_dci_pdu > 0)
-      msgTx->ul_pdcch_pdu = UL_dci_req->ul_dci_pdu_list[number_ul_dci_pdu-1]; // copy the last pdu
+      if (number_ul_dci_pdu > 0)
+        msgTx->ul_pdcch_pdu = UL_dci_req->ul_dci_pdu_list[number_ul_dci_pdu-1]; // copy the last pdu
 
-    pushNotifiedFIFO(gNB->resp_L1_tx,res);
+      pushNotifiedFIFO(gNB->L1_tx_filled,res);
+    }
 
     for (int i = 0; i < number_ul_tti_pdu; i++) {
       switch (UL_tti_req->pdus_list[i].pdu_type) {
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 5819958befb7b53988e8794b62f4a8a159144a90..100c2238928659c5615011d31cf34695149aa08e 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -128,6 +128,7 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
                            int frame,
                            int slot,
                            int do_meas) {
+
   int aa;
   PHY_VARS_gNB *gNB = msgTx->gNB;
   NR_DL_FRAME_PARMS *fp=&gNB->frame_parms;
@@ -204,6 +205,8 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
   }
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX+offset,0);
+  //pthread_mutex_unlock(&mutextest);
+
 }
 
 
diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
index 6d8bdfc76c07e7f60836f42bfb0452f3ca1b9bac..db06b045a64072685db49d72310a7d74d6795793 100644
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
@@ -421,6 +421,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
         }
       }
 
+
       //Clear the fields when all the config pdu are done
       if (pdu_done == ul_config->number_pdus) {
         if (scheduled_response->tx_request)
@@ -431,6 +432,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
         LOG_D(PHY, "%d.%d clear ul_config %p\n", scheduled_response->frame, slot, ul_config);
         memset(ul_config->ul_config_list, 0, sizeof(ul_config->ul_config_list));
       }
+
       pthread_mutex_unlock(&ul_config->mutex_ul_config);
     }
   }
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index fd4b05543f509d53fd5db693df1ca25600cf0a89..4efd98d905a5f8d773898ed90b990718889fc8cc 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -980,18 +980,21 @@ int main(int argc, char **argv)
 
   gNB->threadPool = (tpool_t*)malloc(sizeof(tpool_t));
   initTpool(gNBthreads, gNB->threadPool, true);
-  gNB->resp_L1_tx = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
-  initNotifiedFIFO(gNB->resp_L1_tx);
+  gNB->L1_tx_free = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
+  gNB->L1_tx_filled = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
+  gNB->L1_tx_out = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
+  initNotifiedFIFO(gNB->L1_tx_free);
+  initNotifiedFIFO(gNB->L1_tx_filled);
+  initNotifiedFIFO(gNB->L1_tx_out);
   // we create 2 threads for L1 tx processing
-  notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0,gNB->resp_L1_tx,processSlotTX);
+  notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0,gNB->L1_tx_free,processSlotTX);
   processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx);
   init_DLSCH_struct(gNB, msgDataTx);
   msgDataTx->slot = slot;
   msgDataTx->frame = frame;
   memset(msgDataTx->ssb, 0, 64*sizeof(NR_gNB_SSB_t));
   reset_meas(&msgDataTx->phy_proc_tx);
-  gNB->phy_proc_tx_0 = &msgDataTx->phy_proc_tx;
-  pushTpool(gNB->threadPool,msgL1Tx);
+  gNB->phy_proc_tx[0] = &msgDataTx->phy_proc_tx;
 
   for (SNR = snr0; SNR < snr1; SNR += .2) {
 
@@ -1070,6 +1073,7 @@ int main(int argc, char **argv)
         Sched_INFO.UL_tti_req    = gNB_mac->UL_tti_req_ahead[slot];
         Sched_INFO.UL_dci_req  = NULL;
         Sched_INFO.TX_req    = &gNB_mac->TX_req[0];
+        pushNotifiedFIFO(gNB->L1_tx_free,msgL1Tx);
         nr_schedule_response(&Sched_INFO);
 
         /* PTRS values for DLSIM calculations   */
@@ -1303,10 +1307,10 @@ int main(int argc, char **argv)
     printf("\n");
 
     if (print_perf==1) {
-      printf("\ngNB TX function statistics (per %d us slot, NPRB %d, mcs %d, TBS %d)\n",
+      printf("\ngNB TX function statistics (per %d us slot, NPRB %d, mcs %d, block %d)\n",
 	     1000>>*scc->ssbSubcarrierSpacing, g_rbSize, g_mcsIndex,
 	     msgDataTx->dlsch[0][0]->harq_process.pdsch_pdu.pdsch_pdu_rel15.TBSize[0]<<3);
-      printDistribution(gNB->phy_proc_tx_0,table_tx,"PHY proc tx");
+      printDistribution(gNB->phy_proc_tx[0],table_tx,"PHY proc tx");
       printStatIndent2(&gNB->dlsch_encoding_stats,"DLSCH encoding time");
       printStatIndent3(&gNB->dlsch_segmentation_stats,"DLSCH segmentation time");
       printStatIndent3(&gNB->tinput,"DLSCH LDPC input processing time");
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index 6c2ea03421c8b3115b1782c47258b4fdce9110c7..ac991ae940cb82a91ff8c51981f6b9de1e6c5853 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -670,13 +670,16 @@ int main(int argc, char **argv)
   char tp_param[] = "n";
   initTpool(tp_param, gNB->threadPool, false);
   initNotifiedFIFO(gNB->respDecode);
-  gNB->resp_L1_tx = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
-  initNotifiedFIFO(gNB->resp_L1_tx);
-  notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0,gNB->resp_L1_tx,NULL);
+  gNB->L1_tx_free = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
+  gNB->L1_tx_filled = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
+  gNB->L1_tx_out = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
+  initNotifiedFIFO(gNB->L1_tx_free);
+  initNotifiedFIFO(gNB->L1_tx_filled);
+  initNotifiedFIFO(gNB->L1_tx_out);
+  notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1tx_t),0,gNB->L1_tx_free,NULL);
   processingData_L1tx_t *msgDataTx = (processingData_L1tx_t *)NotifiedFifoData(msgL1Tx);
   msgDataTx->slot = -1;
-  gNB->phy_proc_tx_0 = &msgDataTx->phy_proc_tx;
-  pushNotifiedFIFO(gNB->resp_L1_tx,msgL1Tx); // to unblock the process in the beginning
+  gNB->phy_proc_tx[0] = &msgDataTx->phy_proc_tx;
   //gNB_config = &gNB->gNB_config;
 
   //memset((void *)&gNB->UL_INFO,0,sizeof(gNB->UL_INFO));
@@ -1118,6 +1121,7 @@ int main(int argc, char **argv)
       }
 
       // prepare ULSCH/PUSCH reception
+      pushNotifiedFIFO(gNB->L1_tx_free,msgL1Tx); // to unblock the process in the beginning
       nr_schedule_response(Sched_INFO);
 
       // --------- setting parameters for UE --------
diff --git a/openair2/GNB_APP/L1_nr_paramdef.h b/openair2/GNB_APP/L1_nr_paramdef.h
index 0306713845b9f302a42a44b5bef53ae61b8030ed..6545408b9b98ccba1cf77508dfa9262d5429d6bd 100644
--- a/openair2/GNB_APP/L1_nr_paramdef.h
+++ b/openair2/GNB_APP/L1_nr_paramdef.h
@@ -65,7 +65,7 @@
 {CONFIG_STRING_L1_REMOTE_N_PORTC,                    NULL,      0,         uptr:NULL,           defintval:50030,           TYPE_UINT,     0},         \
 {CONFIG_STRING_L1_LOCAL_N_PORTD,                     NULL,      0,         uptr:NULL,           defintval:50031,           TYPE_UINT,     0},         \
 {CONFIG_STRING_L1_REMOTE_N_PORTD,                    NULL,      0,         uptr:NULL,           defintval:50031,           TYPE_UINT,     0},         \
-{CONFIG_STRING_L1_PUSCH_PROC_THREADS,                NULL,      0,         uptr:NULL,           defintval:3,               TYPE_UINT,     0}, \
+{CONFIG_STRING_L1_PUSCH_PROC_THREADS,                NULL,      0,         uptr:NULL,           defintval:4,               TYPE_UINT,     0}, \
 {CONFIG_STRING_L1_OFDM_OFFSET_DIVISOR,               NULL,      0,         uptr:NULL,           defuintval:8,              TYPE_UINT,     0}, \
 {CONFIG_STRING_L1_PUCCH0_DTX_THRESHOLD,              NULL,      0,         uptr:NULL,           defintval:100,             TYPE_UINT,     0},         \
 {CONFIG_STRING_L1_PRACH_DTX_THRESHOLD,               NULL,      0,         uptr:NULL,           defintval:150,             TYPE_UINT,     0},         \
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index 5284f7fc53c9db5cf3bde91a523c5a6404f9b342..22a13d223b47f1caba29f1e1b0496bb8cbe221f1 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -73,6 +73,8 @@ void fill_ul_config(fapi_nr_ul_config_request_t *ul_config, frame_t frame_tx, in
     memset(ul_config->ul_config_list, 0, sizeof(ul_config->ul_config_list)); 
   }
   ul_config->ul_config_list[ul_config->number_pdus].pdu_type = pdu_type;
+  //ul_config->slot = slot_tx;
+  //ul_config->sfn = frame_tx;
   ul_config->slot = slot_tx;
   ul_config->sfn = frame_tx;
   ul_config->number_pdus++;
@@ -971,6 +973,8 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
         uint8_t ulsch_input_buffer_array[NFAPI_MAX_NUM_UL_PDU][MAX_ULSCH_PAYLOAD_BYTES];
         nr_scheduled_response_t scheduled_response;
         fapi_nr_tx_request_t tx_req;
+        //tx_req.slot = slot_tx;
+        //tx_req.sfn = frame_tx;
         tx_req.slot = slot_tx;
         tx_req.sfn = frame_tx;
         tx_req.number_of_pdus = 0;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index ae52f8cc60e4dc103d4d418dd011098126662c26..87c1dee1e50c91f56c52dc234b218742e93af410 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -272,6 +272,7 @@ bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot) {
 void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
                                frame_t frame,
                                sub_frame_t slot){
+  //pthread_mutex_lock(&mutextest);
 
   protocol_ctxt_t   ctxt={0};
   PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frame, slot,module_idP);
diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg.c b/openair2/RRC/LTE/MESSAGES/asn1_msg.c
index b1f2e6d9b3c2f26c4cb9da378a353b7c34e03bf9..b06959131618470ba8ce0c7cc9d82c64c23dbbd7 100644
--- a/openair2/RRC/LTE/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/LTE/MESSAGES/asn1_msg.c
@@ -4293,7 +4293,7 @@ ssize_t do_nrMeasurementReport(uint8_t *buffer,
   LTE_MeasResultListEUTRA_t  *measResultListEUTRA2=&measResultNeighCells->choice.measResultListEUTRA;
   asn1cSequenceAdd(measResultListEUTRA2->list, struct LTE_MeasResultEUTRA, measresulteutra_list);
   measresulteutra_list->physCellId = phy_id;
-  asn1cCalloc(measresulteutra_list->cgi_Info, measresult_cgi2);
+  //asn1cCalloc(measresulteutra_list->cgi_Info, measresult_cgi2);
   //measresult_cgi2->cellGlobalId= {0};
   //measresult_cgi2->trackingAreaCode= {0};
   struct LTE_MeasResultEUTRA__measResult* measResult= &measresulteutra_list->measResult;
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf
index 417e937edf15fd7948b20327566fdf7bb858ad18..01050b0d00db73c68c6182551ce43c34dc0877d7 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf
@@ -213,7 +213,7 @@ L1s = (
     	{
 	num_cc = 1;
 	tr_n_preference = "local_mac";
-        pusch_proc_threads = 2;
+        pusch_proc_threads = 8;
         }  
 );