diff --git a/ci-scripts/Jenkinsfile-GitLab-Container b/ci-scripts/Jenkinsfile-GitLab-Container
index 5a4e27ed19ea92c904d726d6f7e9f7bf5e087b7f..cd8a50ed918c88fb9ca707243f912c54fca31c0a 100644
--- a/ci-scripts/Jenkinsfile-GitLab-Container
+++ b/ci-scripts/Jenkinsfile-GitLab-Container
@@ -285,6 +285,29 @@ pipeline {
             }
           }
         }
+        stage ("OAI-FLEXRIC-RAN-Integration-Test") {
+          when { expression {do5Gtest} }
+          steps {
+            script {
+              triggerSlaveJob ('OAI-FLEXRIC-RAN-Integration-Test', 'OAI-FLEXRIC-RAN-Integration-Test')
+            }
+          }
+          post {
+            always {
+              script {
+                // Using a unique variable name for each test stage to avoid overwriting on a global variable
+                // due to parallel-time concurrency
+                flexricRAN5GStatus = finalizeSlaveJob('OAI-FLEXRIC-RAN-Integration-Test')
+              }
+            }
+            failure {
+              script {
+                currentBuild.result = 'FAILURE'
+                failingStages += flexricRAN5GStatus
+              }
+            }
+          }
+        }
         stage ("L2-Sim-Test-4G") {
           when { expression {do4Gtest} }
           steps {
diff --git a/ci-scripts/Jenkinsfile-tmp-ran b/ci-scripts/Jenkinsfile-tmp-ran
index e1593d52a45db788fc1ade5e0d87516c6f040f85..bc8c742bb5c98f668ca5500f30025a8e8eace5ab 100644
--- a/ci-scripts/Jenkinsfile-tmp-ran
+++ b/ci-scripts/Jenkinsfile-tmp-ran
@@ -58,6 +58,8 @@ def eNB_CommitID
 def eNB_AllowMergeRequestProcess = false
 def eNB_TargetBranch
 
+def flexricOption = ""
+
 pipeline {
     agent {
         label pythonExecutor
@@ -148,18 +150,24 @@ pipeline {
                         allParametersPresent = false
                     }
 
+                    if (params.Flexric_Tag != null) {
+                        echo "This pipeline is configured to run with a FlexRIC deployment."
+                        echo "Appending FlexRicTag option to the list of options"
+                        flexricOption = "--FlexRicTag=${params.Flexric_Tag}"
+                        echo "Using new Flexric option: ${flexricOption}"
+                    }
+
                     if (allParametersPresent) {
                         echo "All parameters are present"
                         if (eNB_AllowMergeRequestProcess) {
                             sh "git fetch"
                             sh "./ci-scripts/doGitLabMerge.sh --src-branch ${eNB_Branch} --src-commit ${eNB_CommitID} --target-branch ${eNB_TargetBranch} --target-commit latest"
-                        } else {
+                        } else if (eNB_CommitID != 'develop') {
                             sh "git fetch"
                             sh "git checkout -f ${eNB_CommitID}"
                         }
                     } else {
-                        echo "Some parameters are missing"
-                        sh "./ci-scripts/fail.sh"
+                        error "Some parameters are missing"
                     }
                 }
             }
@@ -190,13 +198,13 @@ pipeline {
                             [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password'],
                             [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.EPC_Credentials}", usernameVariable: 'EPC_Username', passwordVariable: 'EPC_Password'],
                         ]) {
-                            sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} ${mainPythonAllXmlFiles}"
+                            sh "python3 main.py --mode=InitiateHtml --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} ${flexricOption} ${mainPythonAllXmlFiles}"
                             String[] myXmlTestSuite = testXMLFile.split("\\r?\\n")
                             for (xmlFile in myXmlTestSuite) {
                             if (fileExists(xmlFile)) {
                                 try {
                                   timeout (time: 60, unit: 'MINUTES') {
-                                    sh "python3 main.py --mode=TesteNB --eNBIPAddress=${params.eNB_IPAddress} --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --EPCIPAddress=${params.EPC_IPAddress} --EPCType=${params.EPC_Type} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --XMLTestFile=${xmlFile}"
+                                    sh "python3 main.py --mode=TesteNB --ranRepository=${eNB_Repository} --ranBranch=${eNB_Branch} --ranCommitID=${eNB_CommitID} --ranAllowMerge=${eNB_AllowMergeRequestProcess} --ranTargetBranch=${eNB_TargetBranch} ${flexricOption} --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --EPCIPAddress=${params.EPC_IPAddress} --EPCType=${params.EPC_Type} --EPCUserName=${EPC_Username} --EPCPassword=${EPC_Password} --EPCSourceCodePath=${params.EPC_SourceCodePath} --XMLTestFile=${xmlFile}"
                                   }
                                 } catch (Exception e) {
                                     currentBuild.result = 'FAILURE'
diff --git a/ci-scripts/args_parse.py b/ci-scripts/args_parse.py
index 7d753d21c72cbca4807b0708800d6ecdbee7565a..c1a13eb9bfcdf2293b8aaca306627c065ecfbaf0 100644
--- a/ci-scripts/args_parse.py
+++ b/ci-scripts/args_parse.py
@@ -264,6 +264,9 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,CONTAINERS,HELP,SCA,PHYSIM,CLUSTER):
         elif re.match('^\-\-BuildId=(.+)$', myArgv, re.IGNORECASE):
             matchReg = re.match('^\-\-BuildId=(.+)$', myArgv, re.IGNORECASE)
             RAN.BuildId = matchReg.group(1)
+        elif re.match('^\-\-FlexRicTag=(.+)$', myArgv, re.IGNORECASE):
+            matchReg = re.match('^\-\-FlexRicTag=(.+)$', myArgv, re.IGNORECASE)
+            CONTAINERS.flexricTag = matchReg.group(1)
         else:
             HELP.GenericHelp(CONST.Version)
             sys.exit('Invalid Parameter: ' + myArgv)
diff --git a/ci-scripts/ci_infra.yaml b/ci-scripts/ci_infra.yaml
index cf6e0cad115204071f7fb0941e54b145a90be364..d651f2723c9d6346f321a6f6fc6f604b59b29be1 100644
--- a/ci-scripts/ci_infra.yaml
+++ b/ci-scripts/ci_infra.yaml
@@ -28,8 +28,8 @@ up2-fhi72:
 
 up2-aerial:
   Host: up2
-  AttachScript: sudo /opt/mbim-aerial/start_quectel_mbim.sh
-  DetachScript: sudo /opt/mbim-aerial/stop_quectel_mbim.sh
+  AttachScript: sudo /opt/mbim-fhi72/start_quectel_mbim.sh
+  DetachScript: sudo /opt/mbim-fhi72/stop_quectel_mbim.sh
   NetworkScript: ip a show dev wwan0
   IF: wwan0
   MTU: 1500
@@ -75,6 +75,13 @@ oc-cn5g-20897:
   NetworkScript: echo "inet 172.21.6.105"
   RunIperf3Server: False
 
+oc-cn5g-20897-aerial2:
+  Host: aerial2
+  Namespace: "oaicicd-core-for-fhi72"
+  CNPath: "/opt/oai-cn5g-fed-develop-2024-april-20897"
+  NetworkScript: echo "inet 172.21.6.105"
+  RunIperf3Server: False
+
 matix-cn5g:
   Host: matix
   NetworkScript: docker exec prod-trf-gen ip a show dev eth0
diff --git a/ci-scripts/cls_cluster.py b/ci-scripts/cls_cluster.py
index 503529d256cb06ded65decd9f651f925139f034a..77ec791af21a4f5811dc63538b139f0f00e68bf9 100644
--- a/ci-scripts/cls_cluster.py
+++ b/ci-scripts/cls_cluster.py
@@ -73,7 +73,7 @@ def OC_deploy_CN(cmd, ocUserName, ocPassword, ocNamespace, path):
 	if not succeeded:
 		return False, CONST.OC_LOGIN_FAIL
 	cmd.run('helm uninstall oai5gcn --wait --timeout 60s')
-	ret = cmd.run(f'helm install --wait --timeout 60s oai5gcn {path}/ci-scripts/charts/oai-5g-basic/.')
+	ret = cmd.run(f'helm install --wait --timeout 120s oai5gcn {path}/ci-scripts/charts/oai-5g-basic/.')
 	if ret.returncode != 0:
 		logging.error('OC OAI CN5G: Deployment failed')
 		OC_logout(cmd)
@@ -126,8 +126,6 @@ class Cluster:
 		self.ranAllowMerge = False
 		self.ranTargetBranch = ""
 		self.cmd = None
-		self.imageToPull = ''
-		self.testSvrId = None
 
 	def _recreate_entitlements(self):
 		# recreating entitlements, don't care if deletion fails
@@ -240,44 +238,30 @@ class Cluster:
 	def _undeploy_pod(self, filename):
 		self.cmd.run(f'oc delete -f {filename}')
 
-	def PullClusterImage(self, HTML, RAN):
-		if self.testSvrId == None: self.testSvrId = self.eNBIPAddress
-		if self.imageToPull == '':
-			HELP.GenericHelp(CONST.Version)
-			raise ValueError('Insufficient Parameter')
-		logging.debug(f'Pull OC image {self.imageToPull} to server {self.testSvrId}')
+	def PullClusterImage(self, HTML, node, images):
+		logging.debug(f'Pull OC image {images} to server {node}')
 		self.testCase_id = HTML.testCase_id
-		cmd = cls_cmd.getConnection(self.testSvrId)
-		logging.info(cmd.run('docker --version'))
-		succeeded = OC_login(cmd, self.OCUserName, self.OCPassword, CI_OC_RAN_NAMESPACE)
-		if not succeeded:
-			logging.error('\u001B[1m OC Cluster Login Failed\u001B[0m')
-			HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
-			return False
-		ret = cmd.run(f'oc whoami -t | docker login -u oaicicd --password-stdin {self.OCRegistry}')
-		if ret.returncode != 0:
-			logging.error(f'\u001B[1m Unable to access OC project {CI_OC_RAN_NAMESPACE}\u001B[0m')
-			OC_logout(cmd)
-			cmd.close()
-			HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
-			return False
-		for image in self.imageToPull:
-			imagePrefix = f'{self.OCRegistry}/{CI_OC_RAN_NAMESPACE}'
-			tag = cls_containerize.CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
-			imageTag = f"{image}:{tag}"
-			ret = cmd.run(f'docker pull {imagePrefix}/{imageTag}')
+		with cls_cmd.getConnection(node) as cmd:
+			succeeded = OC_login(cmd, self.OCUserName, self.OCPassword, CI_OC_RAN_NAMESPACE)
+			if not succeeded:
+				HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
+				return False
+			ret = cmd.run(f'oc whoami -t | docker login -u oaicicd --password-stdin {self.OCRegistry}')
 			if ret.returncode != 0:
-				logging.error(f'Could not pull {image} from local registry : {self.OCRegistry}')
+				logging.error(f'cannot authenticate at registry')
 				OC_logout(cmd)
-				cmd.close()
-				HTML.CreateHtmlTestRow('msg', 'KO', CONST.ALL_PROCESSES_OK)
+				HTML.CreateHtmlTestRow('N/A', 'KO', CONST.OC_LOGIN_FAIL)
 				return False
-			cmd.run(f'docker tag {imagePrefix}/{imageTag} oai-ci/{imageTag}')
-			cmd.run(f'docker rmi {imagePrefix}/{imageTag}')
-		OC_logout(cmd)
-		cmd.close()
-		HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
-		return True
+			tag = cls_containerize.CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
+			registry = f'{self.OCRegistry}/{CI_OC_RAN_NAMESPACE}'
+			success, msg = cls_containerize.Containerize.Pull_Image(cmd, images, tag, registry, None, None)
+			OC_logout(cmd)
+		param = f"on node {node}"
+		if success:
+			HTML.CreateHtmlTestRowQueue(param, 'OK', [msg])
+		else:
+			HTML.CreateHtmlTestRowQueue(param, 'KO', [msg])
+		return success
 
 	def BuildClusterImage(self, HTML):
 		if self.ranRepository == '' or self.ranBranch == '' or self.ranCommitID == '':
diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py
index 28f1abbfac043ee5b8fd3373a3bac0ba9cc1e0f0..a9c4b5be0839e833e63ea73566d0a965206b1436 100644
--- a/ci-scripts/cls_containerize.py
+++ b/ci-scripts/cls_containerize.py
@@ -70,6 +70,8 @@ def CreateWorkspace(host, sourcePath, ranRepository, ranCommitID, ranTargetBranc
 	return ret.returncode == 0
 
 def CreateTag(ranCommitID, ranBranch, ranAllowMerge):
+	if ranCommitID == 'develop':
+		return 'develop'
 	shortCommit = ranCommitID[0:8]
 	if ranAllowMerge:
 		# Allowing contributor to have a name/branchName format
@@ -159,26 +161,25 @@ def GetContainerHealth(ssh, containerName):
 		return False
 	if 'db_init' in containerName or 'db-init' in containerName: # exits with 0, there cannot be healthy
 		return True
-	time.sleep(5)
-	for _ in range(3):
+	for _ in range(8):
 		result = ssh.run(f'docker inspect --format="{{{{.State.Health.Status}}}}" {containerName}', silent=True)
 		if result.stdout == 'healthy':
 			return True
-		time.sleep(10)
+		time.sleep(5)
 	return False
 
 def ExistEnvFilePrint(ssh, wd, prompt='env vars in existing'):
-	ret = ssh.run(f'cat {wd}/.env', silent=True)
+	ret = ssh.run(f'cat {wd}/.env', silent=True, reportNonZero=False)
 	if ret.returncode != 0:
 		return False
 	env_vars = ret.stdout.strip().splitlines()
 	logging.info(f'{prompt} {wd}/.env: {env_vars}')
 	return True
 
-def WriteEnvFile(ssh, services, wd, tag):
-	ret = ssh.run(f'cat {wd}/.env', silent=True)
+def WriteEnvFile(ssh, services, wd, tag, flexric_tag):
+	ret = ssh.run(f'cat {wd}/.env', silent=True, reportNonZero=False)
 	registry = "oai-ci" # pull_images() gives us this registry path
-	envs = {"REGISTRY":registry, "TAG": tag}
+	envs = {"REGISTRY":registry, "TAG": tag, "FLEXRIC_TAG": flexric_tag}
 	if ret.returncode == 0: # it exists, we have to update
 		# transforms env file to dictionary
 		old_envs = {}
@@ -221,7 +222,6 @@ def CopyinContainerLog(ssh, lSourcePath, yaml, containerName, filename):
 	remote_filename = f"{lSourcePath}/cmake_targets/log/{filename}"
 	ssh.run(f'docker logs {containerName} &> {remote_filename}')
 	local_dir = f"{os.getcwd()}/../cmake_targets/log/{yaml}"
-	os.system(f'mkdir -p {local_dir}')
 	local_filename = f"{local_dir}/{filename}"
 	return ssh.copyin(remote_filename, local_filename)
 
@@ -334,12 +334,11 @@ class Containerize():
 		self.cliOptions = ''
 
 		self.imageToCopy = ''
-		self.registrySvrId = ''
-		self.testSvrId = ''
-		self.imageToPull = []
 		#checkers from xml
 		self.ran_checkers={}
 
+		self.flexricTag = ''
+
 #-----------------------------------------------------------
 # Container management functions
 #-----------------------------------------------------------
@@ -723,8 +722,8 @@ class Containerize():
 			HTML.CreateHtmlTabFooter(False)
 			return False
 
-	def Push_Image_to_Local_Registry(self, HTML):
-		lIpAddr, lSourcePath = self.GetCredentials(self.registrySvrId)
+	def Push_Image_to_Local_Registry(self, HTML, svr_id):
+		lIpAddr, lSourcePath = self.GetCredentials(svr_id)
 		logging.debug('Pushing images from server: ' + lIpAddr)
 		ssh = cls_cmd.getConnection(lIpAddr)
 		imagePrefix = 'porcepix.sboai.cs.eurecom.fr'
@@ -771,64 +770,66 @@ class Containerize():
 		HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
 		return True
 
-	def Pull_Image_from_Local_Registry(self, HTML):
-		lIpAddr, lSourcePath = self.GetCredentials(self.testSvrId)
-		logging.debug('\u001B[1m Pulling image(s) on server: ' + lIpAddr + '\u001B[0m')
-		myCmd = cls_cmd.getConnection(lIpAddr)
-		imagePrefix = 'porcepix.sboai.cs.eurecom.fr'
-		response = myCmd.run(f'docker login -u oaicicd -p oaicicd {imagePrefix}')
-		if response.returncode != 0:
-			msg = 'Could not log into local registry'
-			logging.error(msg)
-			myCmd.close()
-			HTML.CreateHtmlTestRow(msg, 'KO', CONST.ALL_PROCESSES_OK)
-			return False
+	def Pull_Image(cmd, images, tag, registry, username, password):
+		if username is not None and password is not None:
+			logging.info(f"logging into registry {username}@{registry}")
+			response = cmd.run(f'docker login -u {username} -p {password} {registry}', silent=True, reportNonZero=False)
+			if response.returncode != 0:
+				msg = f'Could not log into registry {username}@{registry}'
+				logging.error(msg)
+				return False, msg
 		pulled_images = []
-		for image in self.imageToPull:
-			tagToUse = CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
-			imageTag = f"{image}:{tagToUse}"
-			cmd = f'docker pull {imagePrefix}/{imageTag}'
-			response = myCmd.run(cmd, timeout=120)
+		for image in images:
+			imageTag = f"{image}:{tag}"
+			response = cmd.run(f'docker pull {registry}/{imageTag}')
 			if response.returncode != 0:
-				logging.debug(response)
-				msg = f'Could not pull {image} from local registry : {imageTag}'
+				msg = f'Could not pull {image} from local registry: {imageTag}'
 				logging.error(msg)
-				myCmd.close()
-				HTML.CreateHtmlTestRow('msg', 'KO', CONST.ALL_PROCESSES_OK)
-				return False
-			myCmd.run(f'docker tag {imagePrefix}/{imageTag} oai-ci/{imageTag}')
-			myCmd.run(f'docker rmi {imagePrefix}/{imageTag}')
+				return False, msg
+			cmd.run(f'docker tag {registry}/{imageTag} oai-ci/{imageTag}')
+			cmd.run(f'docker rmi {registry}/{imageTag}')
 			pulled_images += [f"oai-ci/{imageTag}"]
-		response = myCmd.run(f'docker logout {imagePrefix}')
-		if response.returncode != 0:
-			msg = 'Could not log off from local registry'
-			logging.error(msg)
-			myCmd.close()
-			HTML.CreateHtmlTestRow(msg, 'KO', CONST.ALL_PROCESSES_OK)
-			return False
-		myCmd.close()
+		if username is not None and password is not None:
+			response = cmd.run(f'docker logout {registry}')
+			# we have the images, if logout fails it's no problem
 		msg = "Pulled Images:\n" + '\n'.join(pulled_images)
-		HTML.CreateHtmlTestRowQueue('N/A', 'OK', [msg])
-		return True
+		return True, msg
 
-	def Clean_Test_Server_Images(self, HTML):
-		lIpAddr, lSourcePath = self.GetCredentials(self.testSvrId)
-		if lIpAddr != 'none':
-			logging.debug('Removing test images from server: ' + lIpAddr)
-			myCmd = cls_cmd.RemoteCmd(lIpAddr)
+	def Pull_Image_from_Registry(self, HTML, svr_id, images, tag=None, registry="porcepix.sboai.cs.eurecom.fr", username="oaicicd", password="oaicicd"):
+		lIpAddr, lSourcePath = self.GetCredentials(svr_id)
+		logging.debug('\u001B[1m Pulling image(s) on server: ' + lIpAddr + '\u001B[0m')
+		if not tag:
+			tag = CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
+		with cls_cmd.getConnection(lIpAddr) as cmd:
+			success, msg = Containerize.Pull_Image(cmd, images, tag, registry, username, password)
+		param = f"on node {lIpAddr}"
+		if success:
+			HTML.CreateHtmlTestRowQueue(param, 'OK', [msg])
 		else:
-			logging.debug('Removing test images locally')
-			myCmd = cls_cmd.LocalCmd()
+			HTML.CreateHtmlTestRowQueue(param, 'KO', [msg])
+		return success
 
-		for image in IMAGES:
+	def Clean_Test_Server_Images(self, HTML, svr_id, images, tag=None):
+		lIpAddr, lSourcePath = self.GetCredentials(svr_id)
+		logging.debug(f'\u001B[1m Cleaning image(s) from server: {lIpAddr}\u001B[0m')
+		if not tag:
 			tag = CreateTag(self.ranCommitID, self.ranBranch, self.ranAllowMerge)
-			imageTag = f"{image}:{tag}"
-			cmd = f'docker rmi oai-ci/{imageTag}'
-			myCmd.run(cmd, reportNonZero=False)
 
-		myCmd.close()
-		HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
-		return True
+		status = True
+		with cls_cmd.getConnection(lIpAddr) as myCmd:
+			removed_images = []
+			for image in images:
+				fullImage = f"oai-ci/{image}:{tag}"
+				cmd = f'docker rmi {fullImage}'
+				if myCmd.run(cmd).returncode != 0:
+					status = False
+				removed_images += [fullImage]
+
+		msg = "Removed Images:\n" + '\n'.join(removed_images)
+		s = 'OK' if status else 'KO'
+		param = f"on node {lIpAddr}"
+		HTML.CreateHtmlTestRowQueue(param, s, [msg])
+		return status
 
 	def Create_Workspace(self,HTML):
 		svr = self.eNB_serverId[self.eNB_instance]
@@ -845,6 +846,9 @@ class Containerize():
 		lIpAddr, lSourcePath = self.GetCredentials(svr)
 		logging.debug('\u001B[1m Deploying OAI Object on server: ' + lIpAddr + '\u001B[0m')
 		yaml = self.yamlPath[self.eNB_instance].strip('/')
+		# creating the log folder by default
+		local_dir = f"{os.getcwd()}/../cmake_targets/log/{yaml.split('/')[-1]}"
+		os.system(f'mkdir -p {local_dir}')
 		wd = f'{lSourcePath}/{yaml}'
 
 		with cls_cmd.getConnection(lIpAddr) as ssh:
@@ -856,7 +860,7 @@ class Containerize():
 				return False
 
 			ExistEnvFilePrint(ssh, wd)
-			WriteEnvFile(ssh, services, wd, self.deploymentTag)
+			WriteEnvFile(ssh, services, wd, self.deploymentTag, self.flexricTag)
 
 			logging.info(f"will start services {services}")
 			status = ssh.run(f'docker compose -f {wd}/docker-compose.y*ml up -d -- {services}')
diff --git a/ci-scripts/cls_oai_html.py b/ci-scripts/cls_oai_html.py
index b2efcc66b7cdf06966aca7516be362a22dafcca6..8e99b20de79c5af244a83a6bb19932a9a3b304e4 100644
--- a/ci-scripts/cls_oai_html.py
+++ b/ci-scripts/cls_oai_html.py
@@ -147,7 +147,7 @@ class HTMLManagement():
 				self.htmlFile.write('       <td bgcolor = "lightcyan" > <span class="glyphicon glyphicon-tag"></span> Commit ID </td>\n')
 			self.htmlFile.write('       <td>' + self.ranCommitID + '</td>\n')
 			self.htmlFile.write('     </tr>\n')
-			if self.ranAllowMerge != '':
+			if self.ranAllowMerge != '' and self.ranCommitID != 'develop':
 				commit_message = subprocess.check_output("git log -n1 --pretty=format:\"%s\" " + self.ranCommitID, shell=True, universal_newlines=True)
 				commit_message = commit_message.strip()
 				self.htmlFile.write('     <tr>\n')
diff --git a/ci-scripts/conf_files/gnb-vnf.sa.band78.273prb.aerial.conf b/ci-scripts/conf_files/gnb-vnf.sa.band78.273prb.aerial.conf
index c035882d36e015224df7d06ffc38133628644549..a38355ecea2496c14e76ffb52169f87a47a7c575 100644
--- a/ci-scripts/conf_files/gnb-vnf.sa.band78.273prb.aerial.conf
+++ b/ci-scripts/conf_files/gnb-vnf.sa.band78.273prb.aerial.conf
@@ -188,7 +188,7 @@ gNBs =
 
 
     ////////// AMF parameters:
-    amf_ip_address = ({ ipv4 = "192.168.71.132"; });
+    amf_ip_address = ({ ipv4 = "172.21.6.103"; });
 
 
     NETWORK_INTERFACES :
diff --git a/ci-scripts/conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf b/ci-scripts/conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf
index b89b385ad9f31b1a242f901fc27e80c86879e5f2..b9c569b6256d6e444d7abcc5bcfdd6552306f459 100644
--- a/ci-scripts/conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf
+++ b/ci-scripts/conf_files/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf
@@ -13,7 +13,6 @@ gNBs =
     tracking_area_code  =  1;
     plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ( { sst = 1; }); });
 
-    //nr_cellid = 12345678L;
     nr_cellid = 1;
 
     ////////// Physical parameters:
@@ -23,7 +22,7 @@ gNBs =
     maxMIMO_layers        = 2;
     pusch_AntennaPorts    = 4;
     do_CSIRS              = 1;
-    do_SRS                = 0 ;
+    do_SRS                = 0;
 
     pdcch_ConfigSIB1 = (
       {
@@ -38,10 +37,11 @@ gNBs =
       physCellId                                                    = 0;
 #  downlinkConfigCommon
     #frequencyInfoDL
-      # this is 3450.72 MHz (center frequency)
+      # center frequency = 3999.36 MHz
+      # selected SSB frequency = 3999.36 MHz
       absoluteFrequencySSB                                          = 666624;
       dl_frequencyBand                                              = 77;
-      # this is 3401.58 MHz
+      # frequency point A = 3950.22 MHz
       dl_absoluteFrequencyPointA                                    = 663348;
       #scs-SpecificCarrierList
         dl_offstToCarrier                                           = 0;
@@ -186,8 +186,8 @@ MACRLCs = (
   tr_n_preference             = "local_RRC";
   pusch_TargetSNRx10          = 180;
   pucch_TargetSNRx10          = 230;
-  ul_bler_target_upper=.35;
-  ul_bler_target_lower=.15;
+  ul_bler_target_upper        = .35;
+  ul_bler_target_lower        = .15;
   pusch_FailureThres          = 100;
 }
 );
@@ -211,7 +211,7 @@ RUs = (
   local_rf       = "no";
   nb_tx          = 4;
   nb_rx          = 4;
-  att_tx         = 0
+  att_tx         = 0;
   att_rx         = 0;
   bands          = [77];
   max_pdschReferenceSignalPower = -27;
@@ -220,21 +220,11 @@ RUs = (
   eNB_instances  = [0];
   ru_thread_core = 5;
   sl_ahead       = 5;
-  clock_src = "internal";
   tr_preference  = "raw_if4p5"; # important: activate FHI7.2
-  do_precoding = 0; # needs to match O-RU configuration
+  do_precoding   = 0; # needs to match O-RU configuration
 }
 );
 
-rfsimulator :
-{
-  serveraddr = "server";
-  serverport = "4043";
-  options = (); #("saviq"); or/and "chanmod"
-  modelname = "AWGN";
-  IQfile = "/tmp/rfsimulator.iqs";
-};
-
 security = {
   # preferred ciphering algorithms
   # the first one of the list that an UE supports in chosen
@@ -252,7 +242,8 @@ security = {
   drb_integrity = "no";
 };
 
-log_config : {
+log_config :
+{
   global_log_level = "info";
   hw_log_level     = "info";
   phy_log_level    = "info";
@@ -269,25 +260,21 @@ fhi_72 = {
   system_core = 0;
   io_core = 1;
   worker_cores = (2);
-  du_addr = ("76:76:64:6e:00:01", "76:76:64:6e:00:01");
   ru_addr = ("98:ae:71:01:c5:eb", "98:ae:71:01:c5:eb");
-  mtu = 9216; # check if xran uses this properly
+  mtu = 9600;
   fh_config = ({
     Tadv_cp_dl = 125;
-    T2a_cp_dl = (285, 429); # (min, max)
-    T2a_cp_ul = (285, 429); # (min, max)
-    T2a_up = (125, 428); # (min, max)
-    Ta3 = (130, 170); # (min, max)
-    T1a_cp_dl = (285, 470); # (min, max)
-    T1a_cp_ul = (285, 429); # (min, max)
-    T1a_up = (125, 350); # (min, max)
-    Ta4 = (110, 180); # (min, max)
+    T2a_cp_dl = (285, 429);
+    T2a_cp_ul = (285, 429);
+    T2a_up = (125, 428);
+    Ta3 = (130, 170);
+    T1a_cp_dl = (285, 470);
+    T1a_cp_ul = (285, 429);
+    T1a_up = (125, 350);
+    Ta4 = (110, 180);
     ru_config = {
       iq_width = 9;
       iq_width_prach = 9;
     };
-    prach_config = {
-      eAxC_offset = 4;
-    };
   });
 };
diff --git a/ci-scripts/conf_files/gnb.sa.band78.106prb.rfsim.flexric.conf b/ci-scripts/conf_files/gnb.sa.band78.106prb.rfsim.flexric.conf
new file mode 100644
index 0000000000000000000000000000000000000000..8e7f52a931213b02030407dd4ff054af339b8a5e
--- /dev/null
+++ b/ci-scripts/conf_files/gnb.sa.band78.106prb.rfsim.flexric.conf
@@ -0,0 +1,239 @@
+Active_gNBs = ( "gnb-rfsim");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID = 0xe00;
+
+    gNB_name  =  "gnb-rfsim";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+
+    plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1; }) });
+
+    nr_cellid = 12345678L
+
+    ////////// Physical parameters:
+
+    min_rxtxtime = 6;
+
+    servingCellConfigCommon = (
+    {
+#spCellConfigCommon
+
+      physCellId                                                    = 0;
+
+#  downlinkConfigCommon
+      #frequencyInfoDL
+      # this is 3300.60 MHz + 53*12*30e-3 MHz = 3319.68
+      absoluteFrequencySSB                                          = 621312;
+      # this is 3300.60 MHz
+      dl_absoluteFrequencyPointA                                    = 620040;
+      #scs-SpecificCarrierList
+      dl_offstToCarrier                                             = 0;
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      dl_subcarrierSpacing                                          = 1;
+      dl_carrierBandwidth                                           = 106;
+      #initialDownlinkBWP
+      #genericParameters
+      # this is RBstart=0,L=106 (275*(L-1))+RBstart
+      initialDLBWPlocationAndBandwidth                              = 28875;
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      initialDLBWPsubcarrierSpacing                                 = 1;
+      #pdcch-ConfigCommon
+      initialDLBWPcontrolResourceSetZero                            = 11;
+      initialDLBWPsearchSpaceZero                                   = 0;
+
+#  uplinkConfigCommon
+      #frequencyInfoUL
+      ul_frequencyBand                                              = 78;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                             = 0;
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                          = 1;
+      ul_carrierBandwidth                                           = 106;
+      pMax                                                          = 20;
+      #initialUplinkBWP
+      #genericParameters
+      initialULBWPlocationAndBandwidth                              = 28875;
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      initialULBWPsubcarrierSpacing                                 = 1;
+      #rach-ConfigCommon
+      #rach-ConfigGeneric
+      prach_ConfigurationIndex                                      = 98;
+      #prach_msg1_FDM
+      #0 = one, 1=two, 2=four, 3=eight
+      prach_msg1_FDM                                                = 0;
+      prach_msg1_FrequencyStart                                     = 0;
+      zeroCorrelationZoneConfig                                     = 12;
+      preambleReceivedTargetPower                                   = -104;
+      #preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+      preambleTransMax                                              = 6;
+      #powerRampingStep
+      # 0=dB0,1=dB2,2=dB4,3=dB6
+      powerRampingStep                                              = 1;
+      #ra_ReponseWindow
+      #1,2,4,8,10,20,40,80
+      ra_ResponseWindow                                             = 4;
+      #ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+      #1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+      ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                  = 3;
+      #oneHalf (0..15) 4,8,12,16,...60,64
+      ssb_perRACH_OccasionAndCB_PreamblesPerSSB                     = 15;
+      #ra_ContentionResolutionTimer
+      #(0..7) 8,16,24,32,40,48,56,64
+      ra_ContentionResolutionTimer                                  = 7;
+      rsrp_ThresholdSSB                                             = 19;
+      #prach-RootSequenceIndex_PR
+      #1 = 839, 2 = 139
+      prach_RootSequenceIndex_PR                                    = 2;
+      prach_RootSequenceIndex                                       = 1;
+      # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+      #
+      msg1_SubcarrierSpacing                                        = 1,
+      # restrictedSetConfig
+      # 0=unrestricted, 1=restricted type A, 2=restricted type B
+      restrictedSetConfig                                           = 0,
+
+      msg3_DeltaPreamble                                            = 1;
+      p0_NominalWithGrant                                           = -90;
+
+      # pucch-ConfigCommon setup :
+      # pucchGroupHopping
+      # 0 = neither, 1= group hopping, 2=sequence hopping
+      pucchGroupHopping                                             = 0;
+      hoppingId                                                     = 40;
+      p0_nominal                                                    = -90;
+
+      ssb_PositionsInBurst_Bitmap                                   = 1;
+
+      # ssb_periodicityServingCell
+      # 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+      # dmrs_TypeA_position
+      # 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 1;
+
+      #tdd-UL-DL-ConfigurationCommon
+      # subcarrierSpacing
+      # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 6;
+      nrofDownlinkSlots                                             = 7;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 2;
+      nrofUplinkSymbols                                             = 4;
+
+      ssPBCH_BlockPower                                             = -25;
+    });
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+    ////////// AMF parameters:
+    amf_ip_address = ({ ipv4 = "192.168.70.132"; });
+
+    NETWORK_INTERFACES :
+    {
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.70.151";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.70.151";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+
+  }
+);
+
+MACRLCs = (
+  {
+    num_cc             = 1;
+    tr_s_preference    = "local_L1";
+    tr_n_preference    = "local_RRC";
+    pusch_TargetSNRx10 = 200;
+    pucch_TargetSNRx10 = 200;
+  }
+);
+
+L1s = (
+{
+  num_cc                = 1;
+  tr_n_preference       = "local_mac";
+  prach_dtx_threshold   = 200;
+#  pucch0_dtx_threshold = 150;
+}
+);
+
+RUs = (
+    {
+       local_rf                      = "yes";
+       nb_tx                         = 1;
+       nb_rx                         = 1;
+       att_tx                        = 0;
+       att_rx                        = 0;
+       bands                         = [78];
+       max_pdschReferenceSignalPower = -27;
+       max_rxgain                    = 75;
+       eNB_instances                 = [0];
+       sf_extension                  = 0;
+       sdr_addrs                     = "serial=XXXXXXX";
+    }
+);
+
+rfsimulator: {
+    serveraddr = "server";
+};
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering        = "yes";
+  drb_integrity        = "no";
+};
+
+log_config : {
+  global_log_level                      ="info";
+  hw_log_level                          ="info";
+  phy_log_level                         ="info";
+  mac_log_level                         ="info";
+  rlc_log_level                         ="info";
+  pdcp_log_level                        ="info";
+  rrc_log_level                         ="info";
+  f1ap_log_level                        ="info";
+};
+
+e2_agent = {
+  near_ric_ip_addr = "192.168.70.150";
+  #sm_dir = "/path/where/the/SMs/are/located/"
+  sm_dir = "/usr/local/lib/flexric/"
+};
diff --git a/ci-scripts/conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf b/ci-scripts/conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf
index 139923e65a425cc42a95da02fec7fc55440c8002..de2a610371ad3121b50c7d35db6e59146ad6a514 100644
--- a/ci-scripts/conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf
+++ b/ci-scripts/conf_files/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf
@@ -22,9 +22,9 @@ gNBs =
     maxMIMO_layers        = 2;
     pusch_AntennaPorts    = 4;
     do_CSIRS              = 1;
-    do_SRS                = 0 ;
-    sib1_tda			  = 15;
-#    force_UL256qam_off    = 1;
+    do_SRS                = 0;
+    sib1_tda			        = 15;
+   # force_UL256qam_off    = 1;
 
     pdcch_ConfigSIB1 = (
       {
@@ -41,10 +41,11 @@ gNBs =
      # n_TimingAdvanceOffset                                         = 0;
 #  downlinkConfigCommon
     #frequencyInfoDL
-      # this is 3450.72 MHz (center frequency)
+      # center frequency = 3350.01 MHz
+      # selected SSB frequency = 3349.92 MHz
       absoluteFrequencySSB                                          = 623328;
       dl_frequencyBand                                              = 78;
-      # this is 3401.58 MHz
+      # frequency point A = 3300.87 MHz
       dl_absoluteFrequencyPointA                                    = 620052;
       #scs-SpecificCarrierList
         dl_offstToCarrier                                           = 0;
@@ -189,10 +190,10 @@ MACRLCs = (
   tr_n_preference             = "local_RRC";
   pusch_TargetSNRx10          = 100;
   pucch_TargetSNRx10          = 200;
-  dl_bler_target_upper=.35;
-  dl_bler_target_lower=.15;
-  ul_bler_target_upper=.35;
-  ul_bler_target_lower=.15;
+  dl_bler_target_upper        = .35;
+  dl_bler_target_lower        = .15;
+  ul_bler_target_upper        = .35;
+  ul_bler_target_lower        = .15;
   pusch_FailureThres          = 1000;
   ul_max_mcs                  = 28;
 }
@@ -218,7 +219,7 @@ RUs = (
   local_rf       = "no";
   nb_tx          = 4;
   nb_rx          = 4;
-  att_tx         = 0
+  att_tx         = 0;
   att_rx         = 0;
   bands          = [78];
   max_pdschReferenceSignalPower = -27;
@@ -228,7 +229,7 @@ RUs = (
   ru_thread_core = 5;
   sl_ahead       = 10;
   tr_preference  = "raw_if4p5"; # important: activate FHI7.2
-  do_precoding = 0; # needs to match O-RU configuration
+  do_precoding   = 0; # needs to match O-RU configuration
 }
 );
 
@@ -251,15 +252,15 @@ security = {
 
 log_config :
 {
-  global_log_level                      ="info";
-  hw_log_level                          ="info";
-  phy_log_level                         ="info";
-  mac_log_level                         ="info";
-  rlc_log_level                         ="info";
-  pdcp_log_level                        ="info";
-  rrc_log_level                         ="info";
-  ngap_log_level                        ="info";
-  f1ap_log_level                        ="info";
+  global_log_level = "info";
+  hw_log_level     = "info";
+  phy_log_level    = "info";
+  mac_log_level    = "info";
+  rlc_log_level    = "info";
+  pdcp_log_level   = "info";
+  rrc_log_level    = "info";
+  ngap_log_level   = "info";
+  f1ap_log_level   = "info";
 };
 
 fhi_72 = {
@@ -267,10 +268,8 @@ fhi_72 = {
   system_core = 0;
   io_core = 1;
   worker_cores = (2);
-  du_addr = ("00:11:22:33:44:66", "00:11:22:33:44:67");
   ru_addr = ("70:b3:d5:e1:5b:81", "70:b3:d5:e1:5b:81");
-  mtu = 9216;
-  file_prefix = "fhi_72";
+  mtu = 9600;
   fh_config = ({
     Tadv_cp_dl = 125;
     T2a_cp_dl = (259, 500);
@@ -285,8 +284,5 @@ fhi_72 = {
       iq_width = 9;
       iq_width_prach = 9;
     };
-    prach_config = {
-      eAxC_offset = 4;
-    };
   });
 };
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index 2e595aa83450d823ba48b54c12423378f5a174f7..9bf196338c1f38571b907d87cdf832c21051c8a5 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -370,26 +370,20 @@ def ExecuteActionWithParam(action):
 		success = SCA.CppCheckAnalysis(HTML)
 
 	elif action == 'Push_Local_Registry':
-		string_field = test.findtext('registry_svr_id')
-		if (string_field is not None):
-			CONTAINERS.registrySvrId = string_field
-		success = CONTAINERS.Push_Image_to_Local_Registry(HTML)
-
-	elif action == 'Pull_Local_Registry':
-		string_field = test.findtext('test_svr_id')
-		if (string_field is not None):
-			CONTAINERS.testSvrId = string_field
-		CONTAINERS.imageToPull.clear()
-		string_field = test.findtext('images_to_pull')
-		if (string_field is not None):
-			CONTAINERS.imageToPull = string_field.split()
-		success = CONTAINERS.Pull_Image_from_Local_Registry(HTML)
-
-	elif action == 'Clean_Test_Server_Images':
-		string_field = test.findtext('test_svr_id')
-		if (string_field is not None):
-			CONTAINERS.testSvrId = string_field
-		success = CONTAINERS.Clean_Test_Server_Images(HTML)
+		svr_id = test.findtext('svr_id')
+		success = CONTAINERS.Push_Image_to_Local_Registry(HTML, svr_id)
+
+	elif action == 'Pull_Local_Registry' or action == 'Clean_Test_Server_Images':
+		svr_id = test.findtext('svr_id')
+		images = test.findtext('images').split()
+		# hack: for FlexRIC, we need to overwrite the tag to use
+		tag = None
+		if len(images) == 1 and images[0] == "oai-flexric":
+			tag = CONTAINERS.flexricTag
+		if action == "Pull_Local_Registry":
+			success = CONTAINERS.Pull_Image_from_Registry(HTML, svr_id, images, tag=tag)
+		if action == "Clean_Test_Server_Images":
+			success = CONTAINERS.Clean_Test_Server_Images(HTML, svr_id, images, tag=tag)
 
 	elif action == 'Custom_Command':
 		node = test.findtext('node')
@@ -404,13 +398,9 @@ def ExecuteActionWithParam(action):
 		success = cls_oaicitest.Custom_Script(HTML, node, script, command_fail)
 
 	elif action == 'Pull_Cluster_Image':
-		string_field = test.findtext('images_to_pull')
-		if (string_field is not None):
-			CLUSTER.imageToPull = string_field.split()
-		string_field = test.findtext('test_svr_id')
-		if (string_field is not None):
-			CLUSTER.testSvrId = string_field
-		success = CLUSTER.PullClusterImage(HTML, RAN)
+		images = test.findtext('images').split()
+		node = test.findtext('node')
+		success = CLUSTER.PullClusterImage(HTML, node, images)
 
 	else:
 		logging.warning(f"unknown action {action}, skip step")
@@ -634,7 +624,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
 	#(6 digits or less than 6 digits followed by +)
 	for test in exclusion_tests:
 		if     (not re.match('^[0-9]{6}$', test) and
-				not re.match('^[0-9]{1,5}\+$', test)):
+				not re.match('^[0-9]{1,5}\\+$', test)):
 			logging.error('exclusion test is invalidly formatted: ' + test)
 			sys.exit(1)
 		else:
@@ -645,7 +635,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
 	#be verbose
 	for test in requested_tests:
 		if     (re.match('^[0-9]{6}$', test) or
-				re.match('^[0-9]{1,5}\+$', test)):
+				re.match('^[0-9]{1,5}\\+$', test)):
 			logging.info('test group/case requested: ' + test)
 		else:
 			logging.error('requested test is invalidly formatted: ' + test)
diff --git a/ci-scripts/tests/pull-clean-int-registry.py b/ci-scripts/tests/pull-clean-int-registry.py
new file mode 100644
index 0000000000000000000000000000000000000000..d4d5b4fc0a821f5a9a0bc803c224dd707d058e96
--- /dev/null
+++ b/ci-scripts/tests/pull-clean-int-registry.py
@@ -0,0 +1,53 @@
+import sys
+import logging
+logging.basicConfig(
+	level=logging.DEBUG,
+	stream=sys.stdout,
+	format="[%(asctime)s] %(levelname)8s: %(message)s"
+)
+import os
+os.system(f'rm -rf cmake_targets')
+os.system(f'mkdir -p cmake_targets/log')
+import unittest
+
+sys.path.append('./') # to find OAI imports below
+import cls_oai_html
+import cls_cmd
+import cls_containerize
+
+class TestDeploymentMethods(unittest.TestCase):
+	def setUp(self):
+		self.html = cls_oai_html.HTMLManagement()
+		self.html.testCaseId = "000000"
+		self.cont = cls_containerize.Containerize()
+		self.cont.eNBIPAddress = 'localhost'
+		self.cont.eNBSourceCodePath = os.getcwd()
+
+	def test_pull_clean_local_reg(self):
+		# the pull function has the authentication at the internal cluster hardcoded
+		# this is a refactoring opportunity: we should do it in a separate step
+		# and allow to have pull work with any registry
+		registry = "porcepix.sboai.cs.eurecom.fr"
+		with cls_cmd.getConnection("localhost") as cmd:
+			ret = cmd.run(f"ping -c1 -w1 {registry}")
+			if ret.returncode != 0: # could not ping once -> skip test
+				self.skipTest(f"test_pull_clean_local_reg: could not reach {registry} (run inside sboai)")
+		svr_id = '0'
+		images = ["oai-gnb"]
+		tag = "develop"
+		pull = self.cont.Pull_Image_from_Registry(self.html, svr_id, images, tag=tag)
+		clean = self.cont.Clean_Test_Server_Images(self.html, svr_id, images, tag=tag)
+		self.assertTrue(pull)
+		self.assertTrue(clean)
+
+	def test_pull_clean_docker_hub(self):
+		svr_id = '0'
+		r = "docker.io"
+		images = ["hello-world"]
+		tag = "latest"
+		pull = self.cont.Pull_Image_from_Registry(self.html, svr_id, images, tag=tag, registry=r, username=None, password=None)
+		clean = self.cont.Clean_Test_Server_Images(self.html, svr_id, images, tag=tag)
+		self.assertTrue(pull)
+		self.assertTrue(clean)
+
+if __name__ == '__main__':unittest.main()
diff --git a/ci-scripts/xml_files/container_4g_l2sim_tdd.xml b/ci-scripts/xml_files/container_4g_l2sim_tdd.xml
index 97a0610efa9cda1ac01bba638405aa00c0f9e0bf..6a0e5ae00f4d3f734f1f74da32472283e642870e 100644
--- a/ci-scripts/xml_files/container_4g_l2sim_tdd.xml
+++ b/ci-scripts/xml_files/container_4g_l2sim_tdd.xml
@@ -44,8 +44,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-enb oai-lte-ue</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-enb oai-lte-ue</images>
         </testCase>
         <testCase id="800813">
                 <class>Create_Workspace</class>
@@ -149,7 +149,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-enb oai-lte-ue</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_4g_rfsim_fdd_05MHz.xml b/ci-scripts/xml_files/container_4g_rfsim_fdd_05MHz.xml
index 9e8bb1e7047bcf33a77986404958623d8cf86963..12f8f13a5bd0bb0b0602d3c49fb711b5aad90533 100644
--- a/ci-scripts/xml_files/container_4g_rfsim_fdd_05MHz.xml
+++ b/ci-scripts/xml_files/container_4g_rfsim_fdd_05MHz.xml
@@ -52,8 +52,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-enb-asan oai-lte-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-enb-asan oai-lte-ue-asan</images>
         </testCase>
 
         <testCase id="000011">
@@ -166,7 +166,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-enb-asan oai-lte-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_4g_rfsim_fdd_05MHz_noS1.xml b/ci-scripts/xml_files/container_4g_rfsim_fdd_05MHz_noS1.xml
index 0081f8eab9854d46b94a52e45a0d4c47d39e3953..031a308a5ca54955b15bcf74e495b1ff2df8b462 100644
--- a/ci-scripts/xml_files/container_4g_rfsim_fdd_05MHz_noS1.xml
+++ b/ci-scripts/xml_files/container_4g_rfsim_fdd_05MHz_noS1.xml
@@ -43,8 +43,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-enb-asan oai-lte-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-enb-asan oai-lte-ue-asan</images>
         </testCase>
         <testCase id="800813">
                 <class>Create_Workspace</class>
@@ -137,7 +137,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-enb-asan oai-lte-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_4g_rfsim_fdd_10MHz.xml b/ci-scripts/xml_files/container_4g_rfsim_fdd_10MHz.xml
index 310f886497a5469268fa188c78c220aa4f60c278..d56aeb231e32f4e27640f0a7c1ad70702e59ff5b 100644
--- a/ci-scripts/xml_files/container_4g_rfsim_fdd_10MHz.xml
+++ b/ci-scripts/xml_files/container_4g_rfsim_fdd_10MHz.xml
@@ -47,8 +47,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-enb-asan oai-lte-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-enb-asan oai-lte-ue-asan</images>
         </testCase>
         <testCase id="800813">
                 <class>Create_Workspace</class>
@@ -166,7 +166,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-enb-asan oai-lte-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_4g_rfsim_fdd_20MHz.xml b/ci-scripts/xml_files/container_4g_rfsim_fdd_20MHz.xml
index 357db604a6d8be3876d7682d9efe1b60850dd0b9..e957417f1c4c712a2e94fff8c732e45e796a8f9c 100644
--- a/ci-scripts/xml_files/container_4g_rfsim_fdd_20MHz.xml
+++ b/ci-scripts/xml_files/container_4g_rfsim_fdd_20MHz.xml
@@ -47,8 +47,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-enb-asan oai-lte-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-enb-asan oai-lte-ue-asan</images>
         </testCase>
         <testCase id="800813">
                 <class>Create_Workspace</class>
@@ -166,7 +166,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-enb-asan oai-lte-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_4g_rfsim_fembms.xml b/ci-scripts/xml_files/container_4g_rfsim_fembms.xml
index e1484004e2cb5cf507e4014f360bc9e045903772..c030fbb4a435196fc2812fc87da2200468189345 100644
--- a/ci-scripts/xml_files/container_4g_rfsim_fembms.xml
+++ b/ci-scripts/xml_files/container_4g_rfsim_fembms.xml
@@ -40,8 +40,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-enb-asan oai-lte-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-enb-asan oai-lte-ue-asan</images>
         </testCase>
         <testCase id="800813">
                 <class>Create_Workspace</class>
@@ -104,7 +104,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-enb-asan oai-lte-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_4g_rfsim_mbms.xml b/ci-scripts/xml_files/container_4g_rfsim_mbms.xml
index cf154b44767f5d2d6c42d4c223800f7bdd367c80..34c2fc6c8924276922b401cc79e14b058fd2edd9 100644
--- a/ci-scripts/xml_files/container_4g_rfsim_mbms.xml
+++ b/ci-scripts/xml_files/container_4g_rfsim_mbms.xml
@@ -40,8 +40,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-enb-asan oai-lte-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-enb-asan oai-lte-ue-asan</images>
         </testCase>
         <testCase id="800813">
                 <class>Create_Workspace</class>
@@ -104,7 +104,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-enb-asan oai-lte-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_4g_rfsim_tdd_05MHz.xml b/ci-scripts/xml_files/container_4g_rfsim_tdd_05MHz.xml
index 77d9f19ee9865c793a2cdc1ad69272b20a0108d4..e292958576ca3a2cc61bbb9cef76bb167143f76c 100644
--- a/ci-scripts/xml_files/container_4g_rfsim_tdd_05MHz.xml
+++ b/ci-scripts/xml_files/container_4g_rfsim_tdd_05MHz.xml
@@ -47,8 +47,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-enb oai-lte-ue</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-enb oai-lte-ue</images>
         </testCase>
         <testCase id="800813">
                 <class>Create_Workspace</class>
@@ -159,7 +159,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-enb oai-lte-ue</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_e1_rfsim.xml b/ci-scripts/xml_files/container_5g_e1_rfsim.xml
index bf4cf6ec0434efc667790744ff0c143f6059f15a..8128fca08cc4a48cb95261043935e3046167219a 100644
--- a/ci-scripts/xml_files/container_5g_e1_rfsim.xml
+++ b/ci-scripts/xml_files/container_5g_e1_rfsim.xml
@@ -40,8 +40,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-gnb oai-nr-cuup oai-nr-ue</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-gnb oai-nr-cuup oai-nr-ue</images>
         </testCase>
         <testCase id="800813">
                 <class>Create_Workspace</class>
@@ -107,7 +107,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-gnb oai-nr-cuup oai-nr-ue</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_f1_rfsim.xml b/ci-scripts/xml_files/container_5g_f1_rfsim.xml
index 8c925cbc5f3f2e04042deed52e6fb19713ee37af..54d2b221b2073ffd676a3bfae3f9377cee0d879f 100644
--- a/ci-scripts/xml_files/container_5g_f1_rfsim.xml
+++ b/ci-scripts/xml_files/container_5g_f1_rfsim.xml
@@ -47,8 +47,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-gnb-asan oai-nr-cuup-asan oai-nr-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-cuup-asan oai-nr-ue-asan</images>
         </testCase>
         <testCase id="800813">
                 <class>Create_Workspace</class>
@@ -194,7 +194,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-cuup-asan oai-nr-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_fdd_rfsim.xml b/ci-scripts/xml_files/container_5g_fdd_rfsim.xml
index d3640da596d742740d1e9d00c4345826ac0c878f..276bb5b9a3e8edade5127fde1dfe9972e742f8b7 100644
--- a/ci-scripts/xml_files/container_5g_fdd_rfsim.xml
+++ b/ci-scripts/xml_files/container_5g_fdd_rfsim.xml
@@ -42,8 +42,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
         <testCase id="800813">
                 <class>Create_Workspace</class>
@@ -133,7 +133,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_flexric_rfsim.xml b/ci-scripts/xml_files/container_5g_flexric_rfsim.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cc791980f031adc1f64bd70f515c9a883689aafe
--- /dev/null
+++ b/ci-scripts/xml_files/container_5g_flexric_rfsim.xml
@@ -0,0 +1,213 @@
+<!--
+
+ 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
+
+-->
+<testCaseList>
+        <htmlTabRef>rfsim-5gnr-flexric</htmlTabRef>
+        <htmlTabName>Monolithic SA TDD gNB and FlexRic Integration</htmlTabName>
+        <htmlTabIcon>wrench</htmlTabIcon>
+        <repeatCount>1</repeatCount>
+        <TestCaseRequestedList>
+ 111110
+ 111111
+ 111112
+ 000001
+ 000002
+ 000003
+ 002001
+ 010000
+ 000004
+ 333333
+ 010001
+ 010002
+ 010003
+ 020005
+ 010013
+ 002006
+ 444444
+ 100002
+ 100001
+ 222221
+ 222222
+        </TestCaseRequestedList>
+        <TestCaseExclusionList></TestCaseExclusionList>
+
+        <testCase id="002001">
+                <class>IdleSleep</class>
+                <desc>Sleep</desc>
+                <idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
+        </testCase>
+
+        <testCase id="111110">
+                <class>Pull_Local_Registry</class>
+                <desc>Pull Images from Local Registry</desc>
+                <svr_id>0</svr_id>
+                <images>oai-gnb oai-nr-ue</images>
+        </testCase>
+
+        <testCase id="111111">
+                <class>Pull_Local_Registry</class>
+                <desc>Pull Images from Local Registry</desc>
+                <svr_id>0</svr_id>
+                <images>oai-flexric</images>
+        </testCase>
+
+        <testCase id="222221">
+                <class>Clean_Test_Server_Images</class>
+                <desc>Clean Test Images on Test Server</desc>
+                <svr_id>0</svr_id>
+                <images>oai-gnb oai-nr-ue</images>
+                <always_exec>true</always_exec>
+        </testCase>
+
+        <testCase id="222222">
+                <class>Clean_Test_Server_Images</class>
+                <desc>Clean Test Images on Test Server</desc>
+                <svr_id>0</svr_id>
+                <images>oai-flexric</images>
+                <always_exec>true</always_exec>
+        </testCase>
+
+        <testCase id="111112">
+                <class>Custom_Command</class>
+                <desc>Updating CN5G images</desc>
+                <node>localhost</node>
+                <command>docker compose -f ../doc/tutorial_resources/oai-cn5g/docker-compose.yaml pull</command>
+        </testCase>
+
+        <testCase id="000001">
+                <class>Deploy_Object</class>
+                <desc>Deploy OAI 5G CoreNetwork</desc>
+                <yaml_path>doc/tutorial_resources/oai-cn5g</yaml_path>
+                <services>mysql oai-nrf oai-udr oai-udm oai-ausf oai-amf oai-smf oai-upf oai-ext-dn</services>
+                <eNB_instance>0</eNB_instance>
+                <eNB_serverId>0</eNB_serverId>
+        </testCase>
+
+        <testCase id="000002">
+                <class>Deploy_Object</class>
+                <desc>Deploy OAI FlexRIC</desc>
+                <yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
+                <services>oai-flexric</services>
+                <eNB_instance>0</eNB_instance>
+                <eNB_serverId>0</eNB_serverId>
+        </testCase>
+
+        <testCase id="000003">
+                <class>Deploy_Object</class>
+                <desc>Deploy OAI 5G gNB in RF sim SA</desc>
+                <yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
+                <services>oai-gnb</services>
+                <eNB_instance>0</eNB_instance>
+                <eNB_serverId>0</eNB_serverId>
+        </testCase>
+
+        <testCase id="000004">
+                <class>Deploy_Object</class>
+                <desc>Deploy 2 OAI 5G NR-UEs in RF sim SA</desc>
+                <yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
+                <services>oai-nr-ue oai-nr-ue2</services>
+                <eNB_instance>0</eNB_instance>
+                <eNB_serverId>0</eNB_serverId>
+        </testCase>
+
+        <testCase id="020005">
+                <class>Ping</class>
+                <desc>Ping ext-dn from both UEs</desc>
+                <id>rfsim5g_ue rfsim5g_ue2</id>
+                <nodes>selfix selfix</nodes>
+                <ping_args>-c 20 192.168.70.135</ping_args>
+                <ping_packetloss_threshold>5</ping_packetloss_threshold>
+        </testCase>
+
+        <testCase id="333333">
+                <class>Attach_UE</class>
+                <desc>Attach OAI UE 1 and 2</desc>
+                <id>rfsim5g_ue rfsim5g_ue2</id>
+                <nodes>selfix selfix</nodes>
+        </testCase>
+
+        <testCase id="444444">
+                <class>Detach_UE</class>
+                <desc>Detach OAI UE 1 and 2</desc>
+                <id>rfsim5g_ue rfsim5g_ue2</id>
+                <nodes>selfix selfix</nodes>
+        </testCase>
+
+        <testCase id="100001">
+                <class>Undeploy_Object</class>
+                <desc>Undeploy Core Network</desc>
+                <yaml_path>doc/tutorial_resources/oai-cn5g</yaml_path>
+                <eNB_instance>0</eNB_instance>
+                <eNB_serverId>0</eNB_serverId>
+                <always_exec>true</always_exec>
+        </testCase>
+
+        <testCase id="100002">
+                <class>Undeploy_Object</class>
+                <desc>Undeploy RAN and Flexric</desc>
+                <yaml_path>ci-scripts/yaml_files/5g_rfsimulator_flexric</yaml_path>
+                <eNB_instance>0</eNB_instance>
+                <eNB_serverId>0</eNB_serverId>
+                <always_exec>true</always_exec>
+        </testCase>
+
+        <testCase id="010000">
+                <class>Custom_Command</class>
+                <desc>RC monitoring</desc>
+                <node>localhost</node>
+                <command_fail>yes</command_fail>
+                <command>docker exec oai-flexric bash -c "stdbuf -o0 /usr/local/flexric/xApp/c/monitor/xapp_rc_moni" > ../cmake_targets/log/5g_rfsimulator_flexric/rc-moni-010000.log</command>
+        </testCase>
+
+        <testCase id="010001">
+                <class>Custom_Command</class>
+                <desc>KPM monitoring</desc>
+                <node>localhost</node>
+                <command_fail>yes</command_fail>
+                <command>docker exec oai-flexric bash -c "stdbuf -o0 /usr/local/flexric/xApp/c/monitor/xapp_kpm_moni" > ../cmake_targets/log/5g_rfsimulator_flexric/kpm-moni-010001.log</command>
+        </testCase>
+
+        <testCase id="010002">
+                <class>Custom_Command</class>
+                <desc>KPM monitoring and RC control</desc>
+                <node>localhost</node>
+                <command_fail>yes</command_fail>
+                <command>docker exec oai-flexric bash -c "stdbuf -o0 /usr/local/flexric/xApp/c/kpm_rc/xapp_kpm_rc" > ../cmake_targets/log/5g_rfsimulator_flexric/kpm_rc-010002.log</command>
+        </testCase>
+
+        <testCase id="010003">
+                <class>Custom_Command</class>
+                <desc>Custom SMs monitoring</desc>
+                <node>localhost</node>
+                <command_fail>yes</command_fail>
+                <command>docker exec oai-flexric bash -c "stdbuf -o0 /usr/local/flexric/xApp/c/monitor/xapp_gtp_mac_rlc_pdcp_moni" > ../cmake_targets/log/5g_rfsimulator_flexric/sms-moni-010003.log</command>
+        </testCase>
+
+        <testCase id="010013">
+                <class>Custom_Command</class>
+                <desc>Custom SMs monitoring</desc>
+                <node>localhost</node>
+                <command_fail>yes</command_fail>
+                <command>docker exec oai-flexric bash -c "stdbuf -o0 /usr/local/flexric/xApp/c/monitor/xapp_gtp_mac_rlc_pdcp_moni" > ../cmake_targets/log/5g_rfsimulator_flexric/sms-moni-010013.log</command>
+        </testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_rfsim.xml b/ci-scripts/xml_files/container_5g_rfsim.xml
index 16eacb02c53563e0f792dccc54ceacfbc07f450e..6388a3fe3ed56237733a188872be16b9b3dd5989 100644
--- a/ci-scripts/xml_files/container_5g_rfsim.xml
+++ b/ci-scripts/xml_files/container_5g_rfsim.xml
@@ -57,8 +57,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-gnb-asan oai-nr-ue</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue</images>
         </testCase>
         <testCase id="800813">
                 <class>Create_Workspace</class>
@@ -259,7 +259,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_rfsim_24prb.xml b/ci-scripts/xml_files/container_5g_rfsim_24prb.xml
index 2e3bbf1d3ae7b72bd2b57593179a1779abe16e4c..5c2a0691220699b14fd6b8a34daafcc1e6b1c9a3 100644
--- a/ci-scripts/xml_files/container_5g_rfsim_24prb.xml
+++ b/ci-scripts/xml_files/container_5g_rfsim_24prb.xml
@@ -42,8 +42,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
         <testCase id="800813">
                 <class>Create_Workspace</class>
@@ -133,7 +133,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_rfsim_2x2.xml b/ci-scripts/xml_files/container_5g_rfsim_2x2.xml
index a18928cc80a12ae4852aa7903f39bc6a0192eb72..3b7a1d738e5956a83b92717893da9d246035f7cc 100644
--- a/ci-scripts/xml_files/container_5g_rfsim_2x2.xml
+++ b/ci-scripts/xml_files/container_5g_rfsim_2x2.xml
@@ -42,8 +42,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
         <testCase id="800813">
                 <class>Create_Workspace</class>
@@ -133,7 +133,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_rfsim_fdd_phytest.xml b/ci-scripts/xml_files/container_5g_rfsim_fdd_phytest.xml
index 10081b96068ceb6339d93347887732d69f1225a7..100465614d192623b47e933fd77315fa78d396f5 100644
--- a/ci-scripts/xml_files/container_5g_rfsim_fdd_phytest.xml
+++ b/ci-scripts/xml_files/container_5g_rfsim_fdd_phytest.xml
@@ -42,8 +42,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
 
         <testCase id="004000">
@@ -133,7 +133,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb.xml b/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb.xml
index b29be08d21f6bbd42f3d8d1cf8b592c155ea8d57..d7008626898b7cc63eb749a3c6f0169ff652354c 100644
--- a/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb.xml
+++ b/ci-scripts/xml_files/container_5g_rfsim_fr2_32prb.xml
@@ -39,8 +39,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
 
         <testCase id="800813">
@@ -101,7 +101,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_rfsim_ntn_geo.xml b/ci-scripts/xml_files/container_5g_rfsim_ntn_geo.xml
index 04bf430f036bb6279e0481ab5ce7e589a6fcf10a..5e3c4bedb5a280d02dd71fc3ac7d8375934a069a 100644
--- a/ci-scripts/xml_files/container_5g_rfsim_ntn_geo.xml
+++ b/ci-scripts/xml_files/container_5g_rfsim_ntn_geo.xml
@@ -41,8 +41,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
 
         <testCase id="800813">
@@ -107,7 +107,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_rfsim_sidelink.xml b/ci-scripts/xml_files/container_5g_rfsim_sidelink.xml
index d42f8851bb10f53cd3ccbf250c7de0dd6bd8dac1..133d960c3af55f7f9b88198bc31aae1b7a49feaf 100644
--- a/ci-scripts/xml_files/container_5g_rfsim_sidelink.xml
+++ b/ci-scripts/xml_files/container_5g_rfsim_sidelink.xml
@@ -39,8 +39,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-nr-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-nr-ue-asan</images>
         </testCase>
 
         <testCase id="800813">
@@ -97,7 +97,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-nr-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_rfsim_tdd_dora.xml b/ci-scripts/xml_files/container_5g_rfsim_tdd_dora.xml
index 35834493cc91078f886b844be7254227c8228656..861158c08fa55e3300775b7e629e87b0fa4760db 100644
--- a/ci-scripts/xml_files/container_5g_rfsim_tdd_dora.xml
+++ b/ci-scripts/xml_files/container_5g_rfsim_tdd_dora.xml
@@ -41,8 +41,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
 
         <testCase id="004000">
@@ -116,7 +116,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml b/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml
index 38d88b7e5ee5a99480c50b0262dac19e95308e5a..7014c54a2aaa517570e27ae593b581bf6ffa3f53 100644
--- a/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml
+++ b/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml
@@ -42,8 +42,8 @@
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-gnb-asan oai-nr-ue-asan</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
         <testCase id="800813">
                 <class>Create_Workspace</class>
@@ -133,7 +133,8 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-asan oai-nr-ue-asan</images>
         </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_image_build.xml b/ci-scripts/xml_files/container_image_build.xml
index 58b3c00d5ea3c725138973e488c0a880556b0df3..7db63e428181f464d6fd66d6ce772c97c966dae3 100644
--- a/ci-scripts/xml_files/container_image_build.xml
+++ b/ci-scripts/xml_files/container_image_build.xml
@@ -49,7 +49,7 @@
 	<testCase id="000010">
 		<class>Push_Local_Registry</class>
 		<desc>Push Images to Local Registry</desc>
-		<registry_svr_id>0</registry_svr_id>
+		<svr_id>0</svr_id>
 	</testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1.xml b/ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1.xml
index 00516269a61589334efc5331da55652b88922f08..01e1cfc4ed674eb0543b62c1c53445cde1edb13e 100644
--- a/ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1.xml
+++ b/ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1.xml
@@ -43,8 +43,8 @@ Replaces xml_files/enb_usrp210_band7_test_05mhz_tm1.xml
     <testCase id="111110">
         <class>Pull_Local_Registry</class>
         <desc>Pull Images from Local Registry</desc>
-        <test_svr_id>0</test_svr_id>
-        <images_to_pull>oai-enb</images_to_pull>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
     <testCase id="100000">
@@ -211,7 +211,8 @@ Replaces xml_files/enb_usrp210_band7_test_05mhz_tm1.xml
         <class>Clean_Test_Server_Images</class>
         <always_exec>true</always_exec>
         <desc>Clean Test Images on Test Server</desc>
-        <test_svr_id>0</test_svr_id>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1_if4_5.xml b/ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1_if4_5.xml
index 4ede8e072bb5f5e6c880f43dd1d0ab0a23a1ec8b..c13952094f6764a7c012dd7481a0c417afb016e3 100644
--- a/ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1_if4_5.xml
+++ b/ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1_if4_5.xml
@@ -42,8 +42,8 @@
     <testCase id="111110">
         <class>Pull_Local_Registry</class>
         <desc>Pull Images from Local Registry</desc>
-        <test_svr_id>0</test_svr_id>
-        <images_to_pull>oai-enb</images_to_pull>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
     <testCase id="100000">
@@ -194,7 +194,8 @@
         <class>Clean_Test_Server_Images</class>
         <always_exec>true</always_exec>
         <desc>Clean Test Images on Test Server</desc>
-        <test_svr_id>0</test_svr_id>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1_no_rrc_activity.xml b/ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1_no_rrc_activity.xml
index b9bc7f7a428f8a0489473e5dbcb41d88be9b3bb8..4bfcb02258012baacbfce5ee98cd129887414945 100644
--- a/ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1_no_rrc_activity.xml
+++ b/ci-scripts/xml_files/container_lte_b200_fdd_05Mhz_tm1_no_rrc_activity.xml
@@ -42,8 +42,8 @@ Replaces xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xm
     <testCase id="111110">
         <class>Pull_Local_Registry</class>
         <desc>Pull Images from Local Registry</desc>
-        <test_svr_id>0</test_svr_id>
-        <images_to_pull>oai-enb</images_to_pull>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
     <testCase id="100000">
         <class>Custom_Command</class>
@@ -176,7 +176,8 @@ Replaces xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xm
         <class>Clean_Test_Server_Images</class>
         <always_exec>true</always_exec>
         <desc>Clean Test Images on Test Server</desc>
-        <test_svr_id>0</test_svr_id>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1.xml b/ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1.xml
index 958e0a895acbc49d8863c599fdbe8337fc670832..6b1afaf079144c34704394e20a012433221a8305 100644
--- a/ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1.xml
+++ b/ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1.xml
@@ -44,8 +44,8 @@ Replaces xml_files/enb_usrp210_band7_test_10mhz_tm1.xml
     <testCase id="111110">
         <class>Pull_Local_Registry</class>
         <desc>Pull Images from Local Registry</desc>
-        <test_svr_id>0</test_svr_id>
-        <images_to_pull>oai-enb</images_to_pull>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
     <testCase id="100000">
         <class>Custom_Command</class>
@@ -206,7 +206,8 @@ Replaces xml_files/enb_usrp210_band7_test_10mhz_tm1.xml
         <class>Clean_Test_Server_Images</class>
         <always_exec>true</always_exec>
         <desc>Clean Test Images on Test Server</desc>
-        <test_svr_id>0</test_svr_id>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1_cdrx.xml b/ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1_cdrx.xml
index 60a9bd0c1618ff18f5679fce4c1d8e0024a6fef4..14699186172579b3057b25116e2e794f6c1ab516 100644
--- a/ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1_cdrx.xml
+++ b/ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1_cdrx.xml
@@ -43,8 +43,8 @@ Replaces xml_files/enb_usrp210_band7_test_10mhz_tm1.xml
     <testCase id="111110">
         <class>Pull_Local_Registry</class>
         <desc>Pull Images from Local Registry</desc>
-        <test_svr_id>0</test_svr_id>
-        <images_to_pull>oai-enb</images_to_pull>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
     <testCase id="100000">
             <class>Custom_Command</class>
@@ -138,7 +138,8 @@ Replaces xml_files/enb_usrp210_band7_test_10mhz_tm1.xml
         <class>Clean_Test_Server_Images</class>
         <always_exec>true</always_exec>
         <desc>Clean Test Images on Test Server</desc>
-        <test_svr_id>0</test_svr_id>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1_oaiue.xml b/ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1_oaiue.xml
index 10cd2e89c149deecd7e9ddad2d07a487f1cce9c2..f978d14cf96b8833d0428a6af2a04ac454690b37 100644
--- a/ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1_oaiue.xml
+++ b/ci-scripts/xml_files/container_lte_b200_fdd_10Mhz_tm1_oaiue.xml
@@ -49,14 +49,14 @@
     <testCase id="111110">
         <class>Pull_Local_Registry</class>
         <desc>Pull Images from Local Registry</desc>
-        <test_svr_id>0</test_svr_id>
-        <images_to_pull>oai-enb</images_to_pull>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
     <testCase id="111111">
         <class>Pull_Local_Registry</class>
         <desc>Pull Images from Local Registry</desc>
-        <test_svr_id>1</test_svr_id>
-        <images_to_pull>oai-lte-ue</images_to_pull>
+        <svr_id>1</svr_id>
+        <images>oai-lte-ue</images>
     </testCase>
     <testCase id="100000">
         <class>Custom_Command</class>
@@ -190,14 +190,16 @@
         <class>Clean_Test_Server_Images</class>
         <always_exec>true</always_exec>
         <desc>Clean Test Images on eNB Test Server</desc>
-        <test_svr_id>0</test_svr_id>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
     <testCase id="333333">
         <class>Clean_Test_Server_Images</class>
         <always_exec>true</always_exec>
         <desc>Clean Test Images on LTE-UE Test Server</desc>
-        <test_svr_id>1</test_svr_id>
+        <svr_id>1</svr_id>
+        <images>oai-lte-ue</images>
     </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_lte_b200_fdd_20Mhz_tm1.xml b/ci-scripts/xml_files/container_lte_b200_fdd_20Mhz_tm1.xml
index 510d0d3f2e5f8a798f2437a9acc77b931a833f37..a830803f9f977d4472b41973b53be5a3cdd695f2 100644
--- a/ci-scripts/xml_files/container_lte_b200_fdd_20Mhz_tm1.xml
+++ b/ci-scripts/xml_files/container_lte_b200_fdd_20Mhz_tm1.xml
@@ -43,8 +43,8 @@ Replaces xml_files/enb_usrp210_band7_test_10mhz_tm1.xml
     <testCase id="111110">
         <class>Pull_Local_Registry</class>
         <desc>Pull Images from Local Registry</desc>
-        <test_svr_id>0</test_svr_id>
-        <images_to_pull>oai-enb</images_to_pull>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
     <testCase id="100000">
             <class>Custom_Command</class>
@@ -206,7 +206,8 @@ Replaces xml_files/enb_usrp210_band7_test_10mhz_tm1.xml
         <class>Clean_Test_Server_Images</class>
         <always_exec>true</always_exec>
         <desc>Clean Test Images on Test Server</desc>
-        <test_svr_id>0</test_svr_id>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm1.xml b/ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm1.xml
index c8bcde980fcb7504b837c94c7ff5a63e614ee840..dc85ee58136f1d0b5086e8162c01084fcd954e72 100644
--- a/ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm1.xml
+++ b/ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm1.xml
@@ -43,8 +43,8 @@ Replaces xml_files/enb_usrp210_band40_test_05mhz_tm1.xml
     <testCase id="111110">
         <class>Pull_Local_Registry</class>
         <desc>Pull Images from Local Registry</desc>
-        <test_svr_id>0</test_svr_id>
-        <images_to_pull>oai-enb</images_to_pull>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
     <testCase id="100000">
@@ -223,7 +223,8 @@ Replaces xml_files/enb_usrp210_band40_test_05mhz_tm1.xml
         <class>Clean_Test_Server_Images</class>
         <always_exec>true</always_exec>
         <desc>Clean Test Images on Test Server</desc>
-        <test_svr_id>0</test_svr_id>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm1_if4_5.xml b/ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm1_if4_5.xml
index 22a86d1f575cc0b7cf5b7bc16b31beeeedf822d5..f5467c26230e1a76cecefde6e46b8b40995faeaa 100644
--- a/ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm1_if4_5.xml
+++ b/ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm1_if4_5.xml
@@ -41,8 +41,8 @@
     <testCase id="111110">
         <class>Pull_Local_Registry</class>
         <desc>Pull Images from Local Registry</desc>
-        <test_svr_id>0</test_svr_id>
-        <images_to_pull>oai-enb</images_to_pull>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
     <testCase id="100000">
@@ -209,7 +209,8 @@
         <class>Clean_Test_Server_Images</class>
         <always_exec>true</always_exec>
         <desc>Clean Test Images on Test Server</desc>
-        <test_svr_id>0</test_svr_id>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm2.xml b/ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm2.xml
index 068d4521b27d4f9fcb9965e091d86a0fe3a1f015..1a3bfa6692afbc78d79690aec4030bef9b3fffbc 100644
--- a/ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm2.xml
+++ b/ci-scripts/xml_files/container_lte_b200_tdd_05Mhz_tm2.xml
@@ -41,8 +41,8 @@ Replaces xml_files/enb_usrp210_band40_test_05mhz_tm2.xml
     <testCase id="111110">
         <class>Pull_Local_Registry</class>
         <desc>Pull Images from Local Registry</desc>
-        <test_svr_id>0</test_svr_id>
-        <images_to_pull>oai-enb</images_to_pull>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
     <testCase id="100000">
             <class>Custom_Command</class>
diff --git a/ci-scripts/xml_files/container_lte_b200_tdd_10Mhz_tm1.xml b/ci-scripts/xml_files/container_lte_b200_tdd_10Mhz_tm1.xml
index 570fffef7149353c6fed618eeaaea6f2e8556264..4d34ff1434145b5b1b485017cc3980b2ac63439c 100644
--- a/ci-scripts/xml_files/container_lte_b200_tdd_10Mhz_tm1.xml
+++ b/ci-scripts/xml_files/container_lte_b200_tdd_10Mhz_tm1.xml
@@ -42,8 +42,8 @@ Replaces xml_files/enb_usrp210_band40_test_10mhz_tm1.xml
     <testCase id="111110">
         <class>Pull_Local_Registry</class>
         <desc>Pull Images from Local Registry</desc>
-        <test_svr_id>0</test_svr_id>
-        <images_to_pull>oai-enb</images_to_pull>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
     <testCase id="100000">
         <class>Custom_Command</class>
@@ -214,7 +214,8 @@ Replaces xml_files/enb_usrp210_band40_test_10mhz_tm1.xml
         <class>Clean_Test_Server_Images</class>
         <always_exec>true</always_exec>
         <desc>Clean Test Images on Test Server</desc>
-        <test_svr_id>0</test_svr_id>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_lte_b200_tdd_20Mhz_tm1.xml b/ci-scripts/xml_files/container_lte_b200_tdd_20Mhz_tm1.xml
index 49826d782ccb0c60fa4365264249fd71dea64df2..2620296bde976453eaf6856210bce363945d2267 100644
--- a/ci-scripts/xml_files/container_lte_b200_tdd_20Mhz_tm1.xml
+++ b/ci-scripts/xml_files/container_lte_b200_tdd_20Mhz_tm1.xml
@@ -42,8 +42,8 @@ Replaces xml_files/enb_usrp210_band40_test_20mhz_tm1.xml
     <testCase id="111110">
         <class>Pull_Local_Registry</class>
         <desc>Pull Images from Local Registry</desc>
-        <test_svr_id>0</test_svr_id>
-        <images_to_pull>oai-enb</images_to_pull>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
     <testCase id="100000">
             <class>Custom_Command</class>
@@ -212,7 +212,8 @@ Replaces xml_files/enb_usrp210_band40_test_20mhz_tm1.xml
         <class>Clean_Test_Server_Images</class>
         <always_exec>true</always_exec>
         <desc>Clean Test Images on Test Server</desc>
-        <test_svr_id>0</test_svr_id>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_lte_b200_tdd_20Mhz_tm1_default_scheduler.xml b/ci-scripts/xml_files/container_lte_b200_tdd_20Mhz_tm1_default_scheduler.xml
index 8e47a61a487b224bda9d89891942d8561f3ecdbc..5dc0ab95859fa49a1b6b041b6e5dca5f5394274b 100644
--- a/ci-scripts/xml_files/container_lte_b200_tdd_20Mhz_tm1_default_scheduler.xml
+++ b/ci-scripts/xml_files/container_lte_b200_tdd_20Mhz_tm1_default_scheduler.xml
@@ -42,8 +42,8 @@ Replaces xml_files/enb_usrp210_band40_test_20mhz_tm1_default_scheduler.xml
     <testCase id="111110">
         <class>Pull_Local_Registry</class>
         <desc>Pull Images from Local Registry</desc>
-        <test_svr_id>0</test_svr_id>
-        <images_to_pull>oai-enb</images_to_pull>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
     <testCase id="100000">
@@ -217,7 +217,8 @@ Replaces xml_files/enb_usrp210_band40_test_20mhz_tm1_default_scheduler.xml
         <class>Clean_Test_Server_Images</class>
         <always_exec>true</always_exec>
         <desc>Clean Test Images on Test Server</desc>
-        <test_svr_id>0</test_svr_id>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_lte_n3xx_tdd_2x2_tm1.xml b/ci-scripts/xml_files/container_lte_n3xx_tdd_2x2_tm1.xml
index d1444483014e6cd44fc094224aaa94c536d35cd9..5234e2d35caeb352793c7060fd1464eade0650f8 100644
--- a/ci-scripts/xml_files/container_lte_n3xx_tdd_2x2_tm1.xml
+++ b/ci-scripts/xml_files/container_lte_n3xx_tdd_2x2_tm1.xml
@@ -48,8 +48,8 @@
   <testCase id="111111">
     <class>Pull_Local_Registry</class>
     <desc>Pull Images from Local Registry</desc>
-    <test_svr_id>0</test_svr_id>
-    <images_to_pull>oai-enb</images_to_pull>
+    <svr_id>0</svr_id>
+    <images>oai-enb</images>
   </testCase>
 
   <testCase id="100000">
@@ -153,7 +153,8 @@
         <class>Clean_Test_Server_Images</class>
         <always_exec>true</always_exec>
         <desc>Clean Test Images</desc>
-        <test_svr_id>0</test_svr_id>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_lte_n3xx_tdd_2x2_tm2.xml b/ci-scripts/xml_files/container_lte_n3xx_tdd_2x2_tm2.xml
index 50494d7778cd30217b7b3d965c2bd31f69ffcf79..a02d0c48effa09f6aef178d56b99868bddd79b72 100644
--- a/ci-scripts/xml_files/container_lte_n3xx_tdd_2x2_tm2.xml
+++ b/ci-scripts/xml_files/container_lte_n3xx_tdd_2x2_tm2.xml
@@ -48,8 +48,8 @@
   <testCase id="111111">
     <class>Pull_Local_Registry</class>
     <desc>Pull Images from Local Registry</desc>
-    <test_svr_id>0</test_svr_id>
-    <images_to_pull>oai-enb</images_to_pull>
+    <svr_id>0</svr_id>
+    <images>oai-enb</images>
   </testCase>
 
   <testCase id="100000">
@@ -153,7 +153,8 @@
         <class>Clean_Test_Server_Images</class>
         <always_exec>true</always_exec>
         <desc>Clean Test Images</desc>
-        <test_svr_id>0</test_svr_id>
+        <svr_id>0</svr_id>
+        <images>oai-enb</images>
     </testCase>
 
 
diff --git a/ci-scripts/xml_files/container_nsa_b200_quectel.xml b/ci-scripts/xml_files/container_nsa_b200_quectel.xml
index c745cb90aade46be745b56732a6095fe4e3e743d..7b43dc609b004543ae96f2b0c53ac8d1fcd3126d 100644
--- a/ci-scripts/xml_files/container_nsa_b200_quectel.xml
+++ b/ci-scripts/xml_files/container_nsa_b200_quectel.xml
@@ -57,15 +57,15 @@
 	<testCase id="111110">
 		<class>Pull_Local_Registry</class>
 		<desc>Pull Images from Local Registry</desc>
-		<test_svr_id>0</test_svr_id>
-		<images_to_pull>oai-enb</images_to_pull>
+		<svr_id>0</svr_id>
+		<images>oai-enb</images>
 	</testCase>
 
 	<testCase id="111111">
 		<class>Pull_Local_Registry</class>
 		<desc>Pull Images from Local Registry</desc>
-		<test_svr_id>1</test_svr_id>
-		<images_to_pull>oai-gnb</images_to_pull>
+		<svr_id>1</svr_id>
+		<images>oai-gnb</images>
 	</testCase>
 
 	<testCase id = "100000">
@@ -252,14 +252,16 @@
 		<class>Clean_Test_Server_Images</class>
     <always_exec>true</always_exec>
 		<desc>Clean Test Images on Test Server</desc>
-		<test_svr_id>0</test_svr_id>
+		<svr_id>0</svr_id>
+		<images>oai-enb</images>
 	</testCase>
 
 	<testCase id="222221">
 		<class>Clean_Test_Server_Images</class>
     <always_exec>true</always_exec>
 		<desc>Clean Test Images on Test Server</desc>
-		<test_svr_id>1</test_svr_id>
+		<svr_id>1</svr_id>
+		<images>oai-gnb</images>
 	</testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_sa_aerial_quectel.xml b/ci-scripts/xml_files/container_sa_aerial_quectel.xml
index 63f22af51dc9523e51b2e413d2b354802311ac47..0b110cab3bca7e0c34db45ca171c18cd53b550a0 100644
--- a/ci-scripts/xml_files/container_sa_aerial_quectel.xml
+++ b/ci-scripts/xml_files/container_sa_aerial_quectel.xml
@@ -25,6 +25,7 @@
         <htmlTabName>AERIAL 100 MHz TDD SA</htmlTabName>
         <htmlTabIcon>tasks</htmlTabIcon>
         <TestCaseRequestedList>
+                555000
                 111111
                 000222
                 800813
@@ -37,14 +38,20 @@
                 000222
                 222222
                 333333
+                000555
         </TestCaseRequestedList>
         <TestCaseExclusionList></TestCaseExclusionList>
+        <testCase id="555000">
+                <class>Initialize_5GCN</class>
+                <desc>Initialize 5G Core</desc>
+                <cn_id>oc-cn5g-20897-aerial2</cn_id>
+        </testCase>
 
         <testCase id="111111">
                 <class>Pull_Local_Registry</class>
                 <desc>Pull Images from Local Registry</desc>
-                <test_svr_id>0</test_svr_id>
-                <images_to_pull>oai-gnb-aerial</images_to_pull>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-aerial</images>
         </testCase>
 
         <testCase id="800813">
@@ -82,15 +89,15 @@
                 <class>Ping</class>
                 <desc>Ping: 100pings in 20sec</desc>
                 <id>up2-aerial</id>
-                <ping_args>-c 100 -i 0.2 %cn_ip%</ping_args>
+                <ping_args>-c 100 -i 0.2 172.21.6.104</ping_args>
                 <ping_packetloss_threshold>5</ping_packetloss_threshold>
         </testCase>
 
         <testCase id="000022">
                 <class>Iperf</class>
-                <desc>iperf (DL/UDP/700M)(30 sec)(single-ue profile)</desc>
+                <desc>iperf (DL/UDP/600M)(30 sec)(single-ue profile)</desc>
                 <iperf_args>-u -b 600M -t 30 -R</iperf_args>
-                <svr_id>porcepix-cn5g</svr_id>
+                <svr_id>oc-cn5g-20897-aerial2</svr_id>
                 <id>up2-aerial</id>
                 <iperf_packetloss_threshold>25</iperf_packetloss_threshold>
                 <iperf_bitrate_threshold>80</iperf_bitrate_threshold>
@@ -100,7 +107,7 @@
                 <class>Iperf</class>
                 <desc>iperf (UL/UDP/50M)(30 sec)(single-ue profile)</desc>
                 <iperf_args>-u -b 50M -t 30</iperf_args>
-                <svr_id>porcepix-cn5g</svr_id>
+                <svr_id>oc-cn5g-20897-aerial2</svr_id>
                 <id>up2-aerial</id>
                 <iperf_packetloss_threshold>25</iperf_packetloss_threshold>
                 <iperf_bitrate_threshold>80</iperf_bitrate_threshold>
@@ -128,8 +135,15 @@
                 <class>Clean_Test_Server_Images</class>
                 <always_exec>true</always_exec>
                 <desc>Clean Test Images on Test Server</desc>
-                <test_svr_id>0</test_svr_id>
+                <svr_id>0</svr_id>
+                <images>oai-gnb-aerial</images>
         </testCase>
 
+        <testCase id="000555">
+                <class>Terminate_5GCN</class>
+                <always_exec>true</always_exec>
+                <desc>Terminate 5G Core</desc>
+                <cn_id>oc-cn5g-20897-aerial2</cn_id>
+        </testCase>
 </testCaseList>
 
diff --git a/ci-scripts/xml_files/container_sa_aw2s_asue.xml b/ci-scripts/xml_files/container_sa_aw2s_asue.xml
index f023da84025e78eac4a9ddfed8a07b69e24359b3..701d4c23d5e93ccfda7138ee28308f20f0f730e7 100644
--- a/ci-scripts/xml_files/container_sa_aw2s_asue.xml
+++ b/ci-scripts/xml_files/container_sa_aw2s_asue.xml
@@ -65,7 +65,8 @@
     <class>Pull_Cluster_Image</class>
     <desc>Pull Images from Cluster</desc>
     <oc_project>oaicicd-ran</oc_project>
-    <images_to_pull>oai-gnb-aw2s</images_to_pull>
+    <images>oai-gnb-aw2s</images>
+    <node>avra</node>
   </testCase>
 
   <testCase id="101000">
@@ -277,7 +278,8 @@
     <class>Clean_Test_Server_Images</class>
     <always_exec>true</always_exec>
     <desc>Clean Test Images on Test Server</desc>
-    <test_svr_id>0</test_svr_id>
+    <svr_id>0</svr_id>
+    <images>oai-gnb-aw2s</images>
   </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_sa_aw2s_asue_2x2.xml b/ci-scripts/xml_files/container_sa_aw2s_asue_2x2.xml
index 514672df6637f36c06f89e7f7b32629bfd69e858..9f6a373eca9fe2f04b17d77458788b826983e4b3 100644
--- a/ci-scripts/xml_files/container_sa_aw2s_asue_2x2.xml
+++ b/ci-scripts/xml_files/container_sa_aw2s_asue_2x2.xml
@@ -64,7 +64,8 @@
     <class>Pull_Cluster_Image</class>
     <desc>Pull Images from Cluster</desc>
     <oc_project>oaicicd-ran</oc_project>
-    <images_to_pull>oai-gnb-aw2s</images_to_pull>
+    <images>oai-gnb-aw2s</images>
+    <node>avra</node>
   </testCase>
   <testCase id="800813">
     <class>Create_Workspace</class>
@@ -274,7 +275,8 @@
     <class>Clean_Test_Server_Images</class>
     <always_exec>true</always_exec>
     <desc>Clean Test Images on Test Server</desc>
-    <test_svr_id>0</test_svr_id>
+    <svr_id>0</svr_id>
+    <images>oai-gnb-aw2s</images>
   </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_sa_b200_quectel.xml b/ci-scripts/xml_files/container_sa_b200_quectel.xml
index 4a4c8309a54a82f38fc398f8e5569e510367736c..51d9c314b402a97655cb4135f7beac0088cb228c 100644
--- a/ci-scripts/xml_files/container_sa_b200_quectel.xml
+++ b/ci-scripts/xml_files/container_sa_b200_quectel.xml
@@ -59,8 +59,8 @@
   <testCase id="111111">
     <class>Pull_Local_Registry</class>
     <desc>Pull Images from Local Registry</desc>
-    <test_svr_id>0</test_svr_id>
-    <images_to_pull>oai-gnb</images_to_pull>
+    <svr_id>0</svr_id>
+    <images>oai-gnb</images>
   </testCase>
 
   <testCase id="100000">
@@ -220,7 +220,8 @@
     <class>Clean_Test_Server_Images</class>
     <always_exec>true</always_exec>
     <desc>Clean Test Images on Test Server</desc>
-    <test_svr_id>0</test_svr_id>
+    <svr_id>0</svr_id>
+    <images>oai-gnb</images>
   </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_sa_e1_b200_quectel.xml b/ci-scripts/xml_files/container_sa_e1_b200_quectel.xml
index 563167a2ddc76af1bd73d725914085d47008f5b0..f93da0e890f6064f69fde4b689cb067902d283be 100644
--- a/ci-scripts/xml_files/container_sa_e1_b200_quectel.xml
+++ b/ci-scripts/xml_files/container_sa_e1_b200_quectel.xml
@@ -56,8 +56,8 @@
   <testCase id="333333">
     <class>Pull_Local_Registry</class>
     <desc>Pull Images from Local Registry</desc>
-    <test_svr_id>0</test_svr_id>
-    <images_to_pull>oai-gnb oai-nr-cuup</images_to_pull>
+    <svr_id>0</svr_id>
+    <images>oai-gnb oai-nr-cuup</images>
   </testCase>
 
   <testCase id="310000">
@@ -218,7 +218,8 @@
     <class>Clean_Test_Server_Images</class>
     <always_exec>true</always_exec>
     <desc>Clean Test Images on Test Server</desc>
-    <test_svr_id>0</test_svr_id>
+    <svr_id>0</svr_id>
+    <images>oai-gnb oai-nr-cuup</images>
   </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_sa_f1_b200_quectel.xml b/ci-scripts/xml_files/container_sa_f1_b200_quectel.xml
index e03180e23673967cf3757f08f0df0a35181c8a72..82f3cc84e5b9daabf6c2f360ec8845b45ad55f56 100644
--- a/ci-scripts/xml_files/container_sa_f1_b200_quectel.xml
+++ b/ci-scripts/xml_files/container_sa_f1_b200_quectel.xml
@@ -64,8 +64,8 @@
   <testCase id="111111">
     <class>Pull_Local_Registry</class>
     <desc>Pull Images from Local Registry</desc>
-    <test_svr_id>0</test_svr_id>
-    <images_to_pull>oai-gnb</images_to_pull>
+    <svr_id>0</svr_id>
+    <images>oai-gnb</images>
   </testCase>
 
   <testCase id="110000">
@@ -251,7 +251,8 @@
     <class>Clean_Test_Server_Images</class>
     <always_exec>true</always_exec>
     <desc>Clean Test Images on Test Server</desc>
-    <test_svr_id>0</test_svr_id>
+    <svr_id>0</svr_id>
+    <images>oai-gnb</images>
   </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_sa_fhi72_vvdn_up2.xml b/ci-scripts/xml_files/container_sa_fhi72_vvdn_up2.xml
index 215fe3ea26a2e4e00b5944013a7920c15c06be46..927fe1a3e70b57bbbd226adb155b52f8cce9fb38 100644
--- a/ci-scripts/xml_files/container_sa_fhi72_vvdn_up2.xml
+++ b/ci-scripts/xml_files/container_sa_fhi72_vvdn_up2.xml
@@ -56,7 +56,8 @@
     <class>Pull_Cluster_Image</class>
     <desc>Pull Images from Cluster</desc>
     <oc_project>oaicicd-ran</oc_project>
-    <images_to_pull>oai-gnb-fhi72</images_to_pull>
+    <images>oai-gnb-fhi72</images>
+    <node>cacofonix</node>
   </testCase>
   <testCase id="800813">
     <class>Create_Workspace</class>
@@ -153,7 +154,8 @@
     <class>Clean_Test_Server_Images</class>
     <always_exec>true</always_exec>
     <desc>Clean Test Images on Test Server</desc>
-    <test_svr_id>0</test_svr_id>
+    <svr_id>0</svr_id>
+    <images>oai-gnb-fhi72</images>
   </testCase>
 
   <testCase id="888888">
diff --git a/ci-scripts/xml_files/container_sa_n310_2X2_100MHz_quectel.xml b/ci-scripts/xml_files/container_sa_n310_2X2_100MHz_quectel.xml
index 214991e1176a3710b9e979ae86b9e1d6efdff17e..3fd9c83522f6bcf7e70f32b922f493d2f4faaf9f 100644
--- a/ci-scripts/xml_files/container_sa_n310_2X2_100MHz_quectel.xml
+++ b/ci-scripts/xml_files/container_sa_n310_2X2_100MHz_quectel.xml
@@ -46,8 +46,8 @@
   <testCase id="111111">
     <class>Pull_Cluster_Image</class>
     <desc>Pull Images from Cluster</desc>
-    <images_to_pull>oai-gnb</images_to_pull>
-    <test_svr_id>matix</test_svr_id>
+    <images>oai-gnb</images>
+    <node>matix</node>
   </testCase>
 
   <testCase id="100000">
@@ -156,7 +156,8 @@
     <class>Clean_Test_Server_Images</class>
     <always_exec>true</always_exec>
     <desc>Clean Test Images on Test Server</desc>
-    <test_svr_id>0</test_svr_id>
+    <svr_id>0</svr_id>
+    <images>oai-gnb</images>
   </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_sa_n310_2X2_60MHz_quectel.xml b/ci-scripts/xml_files/container_sa_n310_2X2_60MHz_quectel.xml
index c94c30a7b234659b8957135e5ffa2352a9f47b61..d4d7568ec422948879f64b56b9c44f1ea20ef17b 100644
--- a/ci-scripts/xml_files/container_sa_n310_2X2_60MHz_quectel.xml
+++ b/ci-scripts/xml_files/container_sa_n310_2X2_60MHz_quectel.xml
@@ -46,8 +46,8 @@
   <testCase id="111111">
     <class>Pull_Cluster_Image</class>
     <desc>Pull Images from Cluster</desc>
-    <images_to_pull>oai-gnb</images_to_pull>
-    <test_svr_id>matix</test_svr_id>
+    <images>oai-gnb</images>
+    <node>matix</node>
   </testCase>
 
   <testCase id="100000">
@@ -156,7 +156,8 @@
     <class>Clean_Test_Server_Images</class>
     <always_exec>true</always_exec>
     <desc>Clean Test Images on Test Server</desc>
-    <test_svr_id>0</test_svr_id>
+    <svr_id>0</svr_id>
+    <images>oai-gnb</images>
   </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_sa_n310_4X4_60MHz_quectel.xml b/ci-scripts/xml_files/container_sa_n310_4X4_60MHz_quectel.xml
index 0ffe3044b64e3a0a8c76c8f8f832adaae4288ace..b89891f496e26f00762bf71c24d9e32bd8ded657 100644
--- a/ci-scripts/xml_files/container_sa_n310_4X4_60MHz_quectel.xml
+++ b/ci-scripts/xml_files/container_sa_n310_4X4_60MHz_quectel.xml
@@ -46,8 +46,8 @@
   <testCase id="111111">
     <class>Pull_Cluster_Image</class>
     <desc>Pull Images from Cluster</desc>
-    <images_to_pull>oai-gnb</images_to_pull>
-    <test_svr_id>matix</test_svr_id>
+    <images>oai-gnb</images>
+    <node>matix</node>
   </testCase>
 
   <testCase id="100000">
@@ -156,7 +156,8 @@
     <class>Clean_Test_Server_Images</class>
     <always_exec>true</always_exec>
     <desc>Clean Test Images on Test Server</desc>
-    <test_svr_id>0</test_svr_id>
+    <svr_id>0</svr_id>
+    <images>oai-gnb</images>
   </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_sa_n310_nrue.xml b/ci-scripts/xml_files/container_sa_n310_nrue.xml
index a358bbf5f843498dbcca3a3563a2ef6e07052853..e1e79ccec98a0218af73a174c01478df251390c8 100644
--- a/ci-scripts/xml_files/container_sa_n310_nrue.xml
+++ b/ci-scripts/xml_files/container_sa_n310_nrue.xml
@@ -44,15 +44,15 @@
   <testCase id="010000">
     <class>Pull_Cluster_Image</class>
     <desc>Pull Images from Cluster</desc>
-    <images_to_pull>oai-gnb</images_to_pull>
-    <test_svr_id>avra</test_svr_id>
+    <images>oai-gnb</images>
+    <node>avra</node>
   </testCase>
 
   <testCase id="010001">
     <class>Pull_Cluster_Image</class>
     <desc>Pull Images from Cluster</desc>
-    <images_to_pull>oai-nr-ue</images_to_pull>
-    <test_svr_id>caracal</test_svr_id>
+    <images>oai-nr-ue</images>
+    <node>caracal</node>
   </testCase>
 
   <testCase id = "030000">
@@ -163,14 +163,16 @@
     <class>Clean_Test_Server_Images</class>
     <always_exec>true</always_exec>
     <desc>Clean Test Images on Test Server</desc>
-    <test_svr_id>0</test_svr_id>
+    <svr_id>0</svr_id>
+    <images>oai-gnb</images>
   </testCase>
 
   <testCase id="444444">
     <class>Clean_Test_Server_Images</class>
     <always_exec>true</always_exec>
     <desc>Clean Test Images on Test Server</desc>
-    <test_svr_id>1</test_svr_id>
+    <svr_id>1</svr_id>
+    <images>oai-nr-ue</images>
   </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/container_sa_sc_b200_quectel.xml b/ci-scripts/xml_files/container_sa_sc_b200_quectel.xml
index d2bfaa02d49a567ef0511c76b47f966eb169404c..a8515f3ec0cab72db8897fa20812278659fc4f7c 100644
--- a/ci-scripts/xml_files/container_sa_sc_b200_quectel.xml
+++ b/ci-scripts/xml_files/container_sa_sc_b200_quectel.xml
@@ -53,8 +53,8 @@
   <testCase id="311111">
     <class>Pull_Local_Registry</class>
     <desc>Pull Images from Local Registry</desc>
-    <test_svr_id>0</test_svr_id>
-    <images_to_pull>oai-gnb</images_to_pull>
+    <svr_id>0</svr_id>
+    <images>oai-gnb</images>
   </testCase>
 
   <testCase id="300000">
@@ -214,7 +214,8 @@
     <class>Clean_Test_Server_Images</class>
     <always_exec>true</always_exec>
     <desc>Clean Test Images on Test Server</desc>
-    <test_svr_id>0</test_svr_id>
+    <svr_id>0</svr_id>
+    <images>oai-gnb</images>
   </testCase>
 
 </testCaseList>
diff --git a/ci-scripts/xml_files/nsa_epc_closure.xml b/ci-scripts/xml_files/nsa_epc_closure.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2fd80319364b8cf12e5ae10d18ed8da8fce80fa3
--- /dev/null
+++ b/ci-scripts/xml_files/nsa_epc_closure.xml
@@ -0,0 +1,47 @@
+<!--
+
+ 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
+
+-->
+<testCaseList>
+	<htmlTabRef>epc-closure</htmlTabRef>
+	<htmlTabName>EPC-Closure</htmlTabName>
+	<htmlTabIcon>log-out</htmlTabIcon>
+	<TestCaseRequestedList>
+060000 060001 060002
+	</TestCaseRequestedList>
+	<TestCaseExclusionList></TestCaseExclusionList>
+
+	<testCase id="060000">
+		<class>Terminate_HSS</class>
+		<desc>Terminate HSS</desc>
+	</testCase>
+
+	<testCase id="060001">
+		<class>Terminate_MME</class>
+		<desc>Terminate MME</desc>
+	</testCase>
+
+	<testCase id="060002">
+		<class>Terminate_SPGW</class>
+		<desc>Terminate SPGW</desc>
+	</testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/nsa_epc_start.xml b/ci-scripts/xml_files/nsa_epc_start.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5cef2b5a6a0d5b5d855ad8e9948ce5d98b499865
--- /dev/null
+++ b/ci-scripts/xml_files/nsa_epc_start.xml
@@ -0,0 +1,48 @@
+<!--
+
+ 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
+
+-->
+<testCaseList>
+	<htmlTabRef>epc-start-tab</htmlTabRef>
+	<htmlTabName>EPC-Start</htmlTabName>
+	<htmlTabIcon>log-in</htmlTabIcon>
+	<TestCaseRequestedList>
+ 000100 000101 000102
+	</TestCaseRequestedList>
+	<TestCaseExclusionList>
+	</TestCaseExclusionList>
+
+	<testCase id="000100">
+		<class>Initialize_HSS</class>
+		<desc>Initialize HSS</desc>
+	</testCase>
+
+	<testCase id="000101">
+		<class>Initialize_MME</class>
+		<desc>Initialize MME</desc>
+	</testCase>
+
+	<testCase id="000102">
+		<class>Initialize_SPGW</class>
+		<desc>Initialize SPGW</desc>
+	</testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/sa_oaiue_cn5g_deploy.xml b/ci-scripts/xml_files/sa_oaiue_cn5g_deploy.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3de615330a8bb07032147b3382c56e2acb019491
--- /dev/null
+++ b/ci-scripts/xml_files/sa_oaiue_cn5g_deploy.xml
@@ -0,0 +1,38 @@
+<!--
+
+ 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
+
+-->
+<testCaseList>
+	<htmlTabRef>cn5g-start-tab</htmlTabRef>
+	<htmlTabName>CN5G-Start</htmlTabName>
+	<htmlTabIcon>log-in</htmlTabIcon>
+	<TestCaseRequestedList>
+000100
+	</TestCaseRequestedList>
+	<TestCaseExclusionList>
+	</TestCaseExclusionList>
+
+	<testCase id="000100">
+		<class>Initialize_5GCN</class>
+		<desc>Initialize 5G Core</desc>
+		<cn_id>oc-cn5g</cn_id>
+	</testCase>
+</testCaseList>
diff --git a/ci-scripts/xml_files/sa_oaiue_cn5g_undeploy.xml b/ci-scripts/xml_files/sa_oaiue_cn5g_undeploy.xml
new file mode 100644
index 0000000000000000000000000000000000000000..727e208d4c6f94a0e0a86bfe6762e8a33e19d10b
--- /dev/null
+++ b/ci-scripts/xml_files/sa_oaiue_cn5g_undeploy.xml
@@ -0,0 +1,38 @@
+<!--
+
+ 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
+
+-->
+<testCaseList>
+	<htmlTabRef>cn5g-closure</htmlTabRef>
+	<htmlTabName>CN5G-Closure</htmlTabName>
+	<htmlTabIcon>log-out</htmlTabIcon>
+	<TestCaseRequestedList>
+060000
+	</TestCaseRequestedList>
+	<TestCaseExclusionList></TestCaseExclusionList>
+
+	<testCase id="060000">
+		<class>Terminate_5GCN</class>
+		<desc>Terminate 5G Core</desc>
+		<cn_id>oc-cn5g</cn_id>
+	</testCase>
+
+</testCaseList>
diff --git a/ci-scripts/yaml_files/5g_rfsimulator_flexric/conf/flexric.conf b/ci-scripts/yaml_files/5g_rfsimulator_flexric/conf/flexric.conf
new file mode 100644
index 0000000000000000000000000000000000000000..5ffbf3d47f478272a3f04f2b65e3bde0f08f6ae4
--- /dev/null
+++ b/ci-scripts/yaml_files/5g_rfsimulator_flexric/conf/flexric.conf
@@ -0,0 +1,5 @@
+[NEAR-RIC]
+NEAR_RIC_IP = 192.168.70.150
+[XAPP]
+DB_PATH = /flexric/db/
+DB_NAME = xapp_rnis_db
diff --git a/ci-scripts/yaml_files/5g_rfsimulator_flexric/docker-compose.yml b/ci-scripts/yaml_files/5g_rfsimulator_flexric/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9afdd02b60420ec873432c64601a6cfb5c4046fa
--- /dev/null
+++ b/ci-scripts/yaml_files/5g_rfsimulator_flexric/docker-compose.yml
@@ -0,0 +1,81 @@
+services:
+    oai-flexric:
+        image: ${REGISTRY:-oaisoftwarealliance}/oai-flexric:${FLEXRIC_TAG:-develop}
+        container_name: oai-flexric
+        networks:
+            public_net:
+                ipv4_address: 192.168.70.150
+        volumes:
+            - ./conf/flexric.conf:/usr/local/etc/flexric/flexric.conf
+            - sharedXappLibs:/usr/local/lib/flexric/
+        healthcheck:
+            test: /bin/bash -c "pgrep nearRT-RIC"
+            interval: 10s
+            timeout: 5s
+
+    oai-gnb:
+        image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
+        privileged: true
+        container_name: rfsim5g-oai-gnb
+        environment:
+            USE_ADDITIONAL_OPTIONS: -E --rfsim --log_config.global_log_options level,nocolor,time
+            ASAN_OPTIONS: detect_leaks=0
+        depends_on:
+            - oai-flexric
+        networks:
+            public_net:
+                ipv4_address: 192.168.70.151
+        volumes:
+            - ../../conf_files/gnb.sa.band78.106prb.rfsim.flexric.conf:/opt/oai-gnb/etc/gnb.conf
+            - sharedXappLibs:/usr/local/lib/flexric/
+        healthcheck:
+            test: /bin/bash -c "pgrep nr-softmodem"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+    oai-nr-ue:
+        image: ${REGISTRY:-oaisoftwarealliance}/${NRUE_IMG:-oai-nr-ue}:${TAG:-develop}
+        privileged: true
+        container_name: rfsim5g-oai-nr-ue
+        environment:
+            USE_ADDITIONAL_OPTIONS: -E --rfsim -r 106 --numerology 1 -C 3619200000 --uicc0.imsi 001010000000003 --rfsimulator.serveraddr 192.168.70.151 --log_config.global_log_options level,nocolor,time
+        depends_on:
+            - oai-gnb
+        networks:
+            public_net:
+                ipv4_address: 192.168.70.152
+        volumes:
+            - ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
+        healthcheck:
+            test: /bin/bash -c "pgrep nr-uesoftmodem"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+    oai-nr-ue2:
+        image: ${REGISTRY:-oaisoftwarealliance}/${NRUE_IMG:-oai-nr-ue}:${TAG:-develop}
+        privileged: true
+        container_name: rfsim5g-oai-nr-ue2
+        environment:
+            USE_ADDITIONAL_OPTIONS: -E --rfsim -r 106 --numerology 1 -C 3619200000 --uicc0.imsi 001010000000004 --rfsimulator.serveraddr 192.168.70.151 --log_config.global_log_options level,nocolor,time
+        depends_on:
+            - oai-gnb
+        networks:
+            public_net:
+                ipv4_address: 192.168.70.153
+        volumes:
+            - ../../conf_files/nrue.uicc.conf:/opt/oai-nr-ue/etc/nr-ue.conf
+        healthcheck:
+            test: /bin/bash -c "pgrep nr-uesoftmodem"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+volumes:
+    sharedXappLibs:
+
+networks:
+    public_net:
+        name: oai-cn5g-public-net
+        external: true
diff --git a/common/platform_types.h b/common/platform_types.h
index 888a812465fa4be4d9a31bede061800dbcf05b60..cb3d872804dc60255f51528e6c64bc71214a3eef 100644
--- a/common/platform_types.h
+++ b/common/platform_types.h
@@ -193,6 +193,20 @@ typedef struct nsa_msg_t {
   uint8_t msg_buffer[MAX_MESSAGE_SIZE];
 } nsa_msg_t;
 
+typedef struct transport_layer_addr_s {
+  /**
+   * Transport Layer Address as a bitstring:
+   * - 32 bits for IPv4 (RFC 791),
+   * - 128 bits for IPv6 (RFC 2460),
+   * - 160 bits for both IPv4 and IPv6, with IPv4 in the first 32 bits.
+   * The S1AP/NGAP layer forwards this address (bitstring<1..160>)
+   * to S1-U/NG-U without interpreting it.
+   */
+  uint8_t length;
+  /// Buffer: address in network byte order
+  uint8_t buffer[20];
+} transport_layer_addr_t;
+
 //-----------------------------------------------------------------------------
 // GTPV1U TYPES
 //-----------------------------------------------------------------------------
diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h
index 94102a858fc996275d91ad25b9dc506a9c2ed5f8..1408f271b0047dd0a01fdf8c56184bc407533c9e 100644
--- a/common/utils/nr/nr_common.h
+++ b/common/utils/nr/nr_common.h
@@ -43,6 +43,7 @@
 #define MAX_BWP_SIZE 275
 #define NR_MAX_NUM_BWP 4
 #define NR_MAX_HARQ_PROCESSES 32
+#define NR_MAX_HARQ_ROUNDS_FOR_STATS 16
 #define NR_NB_REG_PER_CCE 6
 #define NR_NB_SC_PER_RB 12
 #define NR_MAX_NUM_LCID 32
diff --git a/doc/ORAN_FHI7.2_Tutorial.md b/doc/ORAN_FHI7.2_Tutorial.md
index a07777816298d159ef64e148152d1e2f63398a74..d0e66fe68c06c03ff05b5be64b18043955ac935c 100644
--- a/doc/ORAN_FHI7.2_Tutorial.md
+++ b/doc/ORAN_FHI7.2_Tutorial.md
@@ -42,7 +42,10 @@ NICs we have tested so far:
 |E810-C         |4.20 0x8001784e 22.0.9  |
 |Intel XXV710   |6.02 0x80003888         |
 
-**Note**: With AMD servers/desktop machines with PCIe 5.0 we have only used E810 cards. 
+**Note**:
+
+- With AMD servers/desktop machines with PCIe 5.0 we have only used E810 cards.
+- If you are using Mellanox NIC, please be aware that DPDK can't bind the NIC as vfio-pci. Instead it must be bind with mlx driver.
 
 PTP enabled switches and grandmaster clock we have in are lab:
 
@@ -481,12 +484,15 @@ Contact the RU vendor and get the configuration manual to understand the below c
 
 ### Benetel 650
 
-- **Valid only for version RAN650-1v1.0.4-dda1bf5**
-- TDD pattern `DDDDDDDSUU`, 5ms
+**Valid only for version RAN650-1v1.0.4-dda1bf5**
+
+The OAI configuration file [`gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf) corresponds to:
+- TDD pattern `DDDSU`, 2.5ms
 - Bandwidth 100MHz
-- MTU 9216 (this is the maximum we can configure on our switch)
+- MTU 9600
 - 4TX4R
-- The OAI configuration file [`gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf) corresponds to below RU configuration. 
+
+#### RU configuration
 
 After switching on the radio or rebooting, wait for the radio bring up to complete, which you can follow using `tail -f  /tmp/logs/radio_status`. Once you will see `[INFO] Radio bringup complete`, you can configure the RU via editing `/etc/ru_config.cfg`
 
@@ -506,12 +512,15 @@ dl_ul_tuning_special_slot=0xfd00000
 
 ### Benetel 550
 
+**Valid only for version RAN550-1v1.0.4-605a25a**
 
-- **Valid only for version RAN550-1v1.0.4-605a25a**
+The OAI configuration file [`gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf) corresponds to:
 - TDD pattern `DDDDDDDSUU`, 5ms
 - Bandwidth 100MHz
+- MTU 9600
 - 4TX4R
-- The OAI configuration file [`gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf) corresponds to below RU configuration.
+
+#### RU configuration
 
 After switching on the radio or rebooting, wait for the radio bring up to complete, which you can follow using `tail -f  /tmp/logs/radio_status`. Once you will see `[INFO] Radio bringup complete`, you can configure the RU via editing `/etc/ru_config.cfg`
 
@@ -529,48 +538,56 @@ flexran_prach_workaround=disabled
 dl_tuning_special_slot=0x13b6
 ```
 
-### LiteON
+### LITEON
 
+**Verson 01.00.08**
+The OAI configuration file [`gnb.sa.band78.273prb.fhi72.4x4-liteon.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf) corresponds to:
 - TDD pattern `DDDSU`, 2.5ms
 - Bandwidth 100MHz
-- Default MTU is 1500
+- MTU 1500 (the above mentioned LITEON version doesn't support jumbo frames)
 
-SSH to the unit as user `user`. Write `enable` in the terminal to enter the configuration console; the password should be in the user guide. Use the command `show oru-status` to check the RU status. The output should be similar to:
+#### RU configuration
 
+SSH to the unit as user `user`. Write `enable` in the terminal to enter the configuration console; the password should be in the user guide. Use the command `show oru-status` to check the RU status. The output should be similar to:
 ```bash
 # show oru-status 
 Sync State  : SYNCHRONIZED
 RF State    : Ready
 DPD         : Ready
+DuConnected : notReady
 ```
 
-Once the RU is PTP synced, and RF state and DPD are `Ready`, write `configure` in the terminal to set:
+Also, you can use `show running-config` to display the current RU configuration. 
 
+Once the RU is PTP synced, and RF state and DPD are `Ready`, write `configure terminal` to set:
 - Center frequency 
 - Bandwidth
 - Compression Bitwidth
 - TX/RX attenuation
 
-To configure 4TX and 4RX antennas, you have to repeat the below steps after every reboot, so don't restart the RU after entering below commands:
-
+After each reboot, the PRACH has to be manually configured.
+To do so, please login to RU as user `root` and run below commands:
 ```bash
 devmem 0x80001014 32 0x00050004
 devmem 0x80001018 32 0x00070006
 devmem 0x8000201C 32 0x00000001
 ```
 
-If you want to set MTU size to 9000 then use the below command: 
-
+If you have RU version that supports jumbo frames, please enable it as:
 ```bash
 devmem 0x8000200C 32 0x00000001
 ```
 
 ### VVDN LPRU
 
+**Version 3.x**
+
+The OAI configuration file [`gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf) corresponds to:
 - TDD pattern `DDDSU`, 2.5ms
 - Bandwidth 100MHz
-- MTU 9216 (this is the maximum we can configure on our switch)
-- The OAI configuration file [`gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf) corresponds to below RU configuration. 
+- MTU 9600
+
+#### RU configuration
 
 Check in the RU user manual how to configure the center frequency. There are multiple ways to do it. We set the center frequency by editing `sysrepocfg` database. You can use `sysrepocfg --edit=vi -d running` to do the same. You can edit the `startup` database to make the center frequency change persistent. 
 
@@ -604,76 +621,140 @@ Execute the below commands on every restart
 ```bash
 xml_parser 4x4-config.xml
 ## To enable prach compression
-mw.l a0010024 1919
+mw.l a0010024 1919 # format `<PRACH-comp-method><PRACH-compr-value><PUSCH-comp-method><PUSCH-compr-value>
 ## This will show the current configuration
 /etc/scripts/lpru_configuration.sh
 ## Edit the sysrepo to ACTIVATE the carrier when you want to use the RU
+## option 1 - activation by writing directly in register
+mw.l a0050010 <YOUR-RU-VLAN>3 # e.g. VLAN = 4 => `mw.l a0050010 43`
+## option 2 - activation via sysrepocfg command
 sysrepocfg --edit=vi -d running
 ```
 
+### Metanoia RU
+
+**Version 2.0.6**
+
+The OAI configuration file [`gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf) corresponds to:
+- TDD pattern `DDDSU`, 2.5ms (`DDDDDDDSUU`, 5ms, also supported)
+- Bandwidth 100MHz
+- 4TX4R
+
+The RU configuration is stored in `/etc/rumanager.conf`. The required modifications:
+1. `processing_element/vlan_id`
+2. `processing_element/du_mac_address`
+3. `low_level_tx_endpoint/compression_type` -> `STATIC`
+4. `low_level_rx_endpoint/compression_type` -> `STATIC`
+5. `low_level_rx_endpoint/compression/fs-offset` -> `8`
+6. `center-of-channel-bandwidth` -> `3750000000`
+7. `tx_gain_correction` -> tested with `6020` (please be careful to not fry the RU)
+8. `rx_gain_correction` -> tested with `-903` (please be careful to not fry the RU)
+
+At this stage, RU must be rebooted so the changes apply.
+
 ## Configure Network Interfaces and DPDK VFs
 
 The 7.2 fronthaul uses the xran library, which requires DPDK. In this step, we
 need to configure network interfaces to send data to the RU, and configure DPDK
 to bind to the corresponding PCI interfaces. More specifically, in the
 following we use [SR-IOV](https://en.wikipedia.org/wiki/Single-root_input/output_virtualization)
-to create multiple virtual functions (VFs) through which Control plane (C
+to create one or multiple virtual functions (VFs) through which Control plane (C
 plane) and User plane (U plane) traffic will flow. The following commands are
 not persistant, and have to be repeated after reboot.
 
 In the following, we will use these short hands:
 
-- `physical-interface`: Physical network interface through which you can access the RU
-- `vlan`: VLAN tags as defined in the RU configuration
-- `mtu`: the MTU as specified by the RU vendor, and supported by the NIC
-- `du-c-plane-mac-addr`: DU C plane MAC address
-- `pci-address-c-plane-vf`: PCI bus address of the VF for C plane
-- `du-u-plane-mac-addr`: DU U plane MAC address
-- `pci-address-u-plane-vf`: PCI bus address of the VF for U plane
+- `IF_NAME`: Physical network interface through which you can access the RU
+- `VLAN`: the VLAN tag as recommended by the RU vendor
+- `MTU`: the MTU as specified by the RU vendor, and supported by the NIC
+- `DU_U_PLANE_MAC_ADD`: DU U plane MAC address
+- `U_PLANE_PCI_BUS_ADD`: PCI bus address of the VF for U plane
+- `DU_C_PLANE_MAC_ADD`: DU C plane MAC address
+- `C_PLANE_PCI_BUS_ADD`: PCI bus address of the VF for C plane
 
 In the configuration file, in option `fhi_72.dpdk_devices`, the first PCI address is for U-plane and the second for C-plane.
 
-For both the MAC addresses, you might use the MAC addresses which are
-pre-configured in the RUs (typically `00:11:22:33:44:66`, but that is not
-always the case). Note that if your system has Intel E-810 NIC cards/ICE
-driver, you have to choose different MAC addresses (valid for above-mentioned
-kernels). If the RU vendor requires untagged traffic, remove the VLAN tagging
+RU might support either one DU MAC address for both CU planes or two different.
+i.e. VVDN Gen3, Metanoia support only one, Benetel550 supports both cases
+
+
+**Note**
+
+- X710 NIC supports the same DU MAC address for multiple VFs
+- E-810 NIC requires different DU MAC addresses for multiple VFs
+
+If the RU vendor requires untagged traffic, remove the VLAN tagging
 in the below command and configure VLAN on the switch as "access VLAN". In case
 the MTU is different than 1500, you have to update the MTU on the switch
 interface as well.
 
-First, set maximum ring buffers:
+### Set maximum ring buffers:
+
+As a first step, please set up the maximum allowed buffer size to your desired interface. To check the maximum value, please execute the following command:
 ```bash
-sudo ethtool -g <physical-interface>
-sudo ethtool -G <physical-interface> rx 4096     # assumes 4096 is max
-sudo ethtool -G <physical-interface> tx 4096     # assumes 4096 is max
+sudo ethtool -g $IF_NAME
 ```
 
-Set the maximum MTU in the physical interface:
 ```bash
-sudo ifconfig <physical-interface> mtu <mtu>
+set -x
+IF_NAME=<YOUR_PHYSICAL_INTERFACE_NAME>
+MAX_RING_BUFFER_SIZE=<YOUR_PHYSICAL_INTERFACE_MAX_BUFFER_SIZE>
+
+sudo ethtool -G $IF_NAME rx $MAX_RING_BUFFER_SIZE tx $MAX_RING_BUFFER_SIZE
 ```
 
-(Re-)create two VFs, load the Linux "Base Driver for Intel Ethernet Adaptive
-Virtual Function" (in case you use Intel ethernet card), and set up the VFs.
+### Set the maximum MTU in the physical interface:
+```bash
+set -x
+IF_NAME=<YOUR_PHYSICAL_INTERFACE_NAME>
+MTU=<RU_MTU>
+
+sudo ip link set $IF_NAME mtu $MTU
+```
+
+### (Re-)create VF(s)
+
+#### one VF
 
 ```bash
+set -x
+IF_NAME=<YOUR_PHYSICAL_INTERFACE_NAME>
+DU_CU_PLANE_MAC_ADD=<YOUR_DU_CU_PLANE_MAC_ADDRESS>
+VLAN=<RU_VLAN>
+MTU=<RU_MTU>
+
 sudo modprobe iavf
-sudo sh -c echo "0" > /sys/class/net/<physical-interface>/device/sriov_numvfs
-sudo sh -c echo "2" > /sys/class/net/<physical-interface>/device/sriov_numvfs
-sudo ip link set <physical-interface> vf 0 mac <du-c-plane-mac-addr> vlan <vlan> mtu <mtu> spoofchk off
-sudo ip link set <physical-interface> vf 1 mac <du-u-plane-mac-addr> vlan <vlan> mtu <mtu> spoofchk off
+sudo sh -c 'echo 0 > /sys/class/net/$IF_NAME/device/sriov_numvfs'
+sudo sh -c 'echo 1 > /sys/class/net/$IF_NAME/device/sriov_numvfs'
+sudo ip link set $IF_NAME vf 0 mac $DU_CU_PLANE_MAC_ADD vlan $VLAN mtu $MTU spoofchk off # set CU planes PCI address
 ```
 
-After running the above commands, the kernel created virtual functions that
+#### two VFs
+
+```bash
+set -x
+IF_NAME=<YOUR_PHYSICAL_INTERFACE_NAME>
+DU_U_PLANE_MAC_ADD=<YOUR_DU_U_PLANE_MAC_ADDRESS>
+DU_C_PLANE_MAC_ADD=<YOUR_DU_C_PLANE_MAC_ADDRESS> # can be same as for U plane -> depends if the NIC supports the same MAC address
+VLAN=<RU_VLAN>
+MTU=<RU_MTU>
+
+sudo modprobe iavf
+sudo sh -c 'echo 0 > /sys/class/net/$IF_NAME/device/sriov_numvfs'
+sudo sh -c 'echo 2 > /sys/class/net/$IF_NAME/device/sriov_numvfs'
+sudo ip link set $IF_NAME vf 0 mac $DU_U_PLANE_MAC_ADD vlan $VLAN mtu $MTU spoofchk off # set U plane PCI address
+sudo ip link set $IF_NAME vf 1 mac $DU_C_PLANE_MAC_ADD vlan $VLAN mtu $MTU spoofchk off # set C plane PCI address
+```
+
+After running the above commands, the kernel created VF(s) that
 have been assigned a PCI address under the same device and vendor ID. For
 instance, use `sudo lshw -c network -businfo` to get a list of PCI addresses
-and interface names, locate the PCI address of `<physical-interface>`, then use
+and interface names, locate the PCI address of `$IF_NAME`, then use
 `lspci | grep Virtual` to get all virtual interfaces and use the ones with the
 same Device/Vendor ID parts (first two numbers).
 
 <details>
-<summary>Example</summary>
+<summary>Example with two VFs</summary>
 
 The machine in this example has an Intel X710 card. The interface
 <physical-interface> in question is `eno12409`. Running `lshw` gives:
@@ -706,41 +787,68 @@ The hardware card `31:00.1` has two associated virtual functions `31:06.0` and
 `31:06.1`.
 </details>
 
+### Bind VF(s)
+
 Now, unbind any pre-existing DPDK devices, load the "Virtual Function I/O"
-driver `vfio_pci`, and bind DPDK to these devices:
+driver `vfio_pci` or `mlx5_core`, and bind DPDK to these devices.
 
+#### Bind one VF
+
+```bash
+set -x
+CU_PLANE_PCI_BUS_ADD=<YOUR_CU_PLANE_PCI_BUS_ADDRESS>
+DRIVER=<YOUR_DRIVER> # set to `vfio_pci` or `mlx5_core`, depending on your NIC
+
+sudo /usr/local/bin/dpdk-devbind.py --unbind $CU_PLANE_PCI_BUS_ADD
+sudo modprobe $DRIVER
+sudo /usr/local/bin/dpdk-devbind.py --bind $DRIVER $CU_PLANE_PCI_BUS_ADD
 ```
-sudo /usr/local/bin/dpdk-devbind.py --unbind <pci-address-c-plane-vf>
-sudo /usr/local/bin/dpdk-devbind.py --unbind <pci-address-u-plane-vf>
-sudo modprobe vfio_pci
-sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci <pci-address-c-plane-vf>
-sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci <pci-address-u-plane-vf>
+
+#### Bind two VFs
+
+```bash
+set -x
+U_PLANE_PCI_BUS_ADD=<YOUR_U_PLANE_PCI_BUS_ADDRESS>
+C_PLANE_PCI_BUS_ADD=<YOUR_C_PLANE_PCI_BUS_ADDRESS>
+DRIVER=<YOUR_DRIVER> # set to `vfio_pci` or `mlx5_core`, depending on your NIC
+
+sudo /usr/local/bin/dpdk-devbind.py --unbind $U_PLANE_PCI_BUS_ADD
+sudo /usr/local/bin/dpdk-devbind.py --unbind $C_PLANE_PCI_BUS_ADD
+sudo modprobe $DRIVER
+sudo /usr/local/bin/dpdk-devbind.py --bind $DRIVER $U_PLANE_PCI_BUS_ADD
+sudo /usr/local/bin/dpdk-devbind.py --bind $DRIVER $C_PLANE_PCI_BUS_ADD
 ```
 
-We recommand to put the above commands into a script file to quickly repeat them.
+We recommand to put the above four steps into one script file to quickly repeat them.
 
 <details>
-<summary>Example script for Benetel 550-A/650 with Intel X710 on host</summary>
+<summary>Example script for Benetel 550-A/650 with Intel X710 on host with two VFs</summary>
 
-```console
+```bash
 set -x
-
-sudo ethtool -G eno12409 rx 4096
-sudo ethtool -G eno12409 tx 4096
-sudo ifconfig eno12409 mtu 9216
-
-sudo modprobe -r iavf
+IF_NAME=eno12409
+MAX_RING_BUFFER_SIZE=4096
+MTU=9600
+DU_U_PLANE_MAC_ADD=00:11:22:33:44:66
+DU_C_PLANE_MAC_ADD=00:11:22:33:44:67
+VLAN=3
+U_PLANE_PCI_BUS_ADD=31:06.0
+C_PLANE_PCI_BUS_ADD=31:06.1
+DRIVER=vfio_pci
+
+sudo ethtool -G $IF_NAME rx $MAX_RING_BUFFER_SIZE tx $MAX_RING_BUFFER_SIZE
+sudo ip link set $IF_NAME mtu $MTU
 sudo modprobe iavf
-sudo sh -c 'echo 0 > /sys/class/net/eno12409/device/sriov_numvfs'
-sudo sh -c 'echo 2 > /sys/class/net/eno12409/device/sriov_numvfs'
-sudo ip link set eno12409 vf 0 mac 00:11:22:33:44:66 vlan 3 qos 0 spoofchk off mtu 9216
-sudo ip link set eno12409 vf 1 mac 00:11:22:33:44:67 vlan 3 qos 0 spoofchk off mtu 9216
-
-sudo /usr/local/bin/dpdk-devbind.py --unbind 31:06.0
-sudo /usr/local/bin/dpdk-devbind.py --unbind 31:06.1
-sudo modprobe vfio-pci
-sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci 31:06.0
-sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci 31:06.1
+sudo sh -c 'echo 0 > /sys/class/net/$IF_NAME/device/sriov_numvfs'
+sudo sh -c 'echo 2 > /sys/class/net/$IF_NAME/device/sriov_numvfs'
+sudo ip link set $IF_NAME vf 0 mac $DU_U_PLANE_MAC_ADD vlan $VLAN mtu $MTU spoofchk off # set U plane PCI address
+sudo ip link set $IF_NAME vf 1 mac $DU_C_PLANE_MAC_ADD vlan $VLAN mtu $MTU spoofchk off # set C plane PCI address
+sleep 1
+sudo /usr/local/bin/dpdk-devbind.py --unbind $U_PLANE_PCI_BUS_ADD
+sudo /usr/local/bin/dpdk-devbind.py --unbind $C_PLANE_PCI_BUS_ADD
+sudo modprobe $DRIVER
+sudo /usr/local/bin/dpdk-devbind.py --bind $DRIVER $U_PLANE_PCI_BUS_ADD
+sudo /usr/local/bin/dpdk-devbind.py --bind $DRIVER $C_PLANE_PCI_BUS_ADD
 ```
 </details>
 
@@ -751,9 +859,19 @@ sudo /usr/local/bin/dpdk-devbind.py --bind vfio-pci 31:06.1
 **Beware in the following section to let in the range of isolated cores the parameters that should be (i.e. `L1s.L1_rx_thread_core`, `L1s.L1_tx_thread_core`, `RUs.ru_thread_core`, `fhi_72.io_core` and `fhi_72.worker_cores`)**
 
 Sample configuration files for OAI gNB, specific to the manufacturer of the radio unit, are available at:
-1. LITE-ON RU: [`gnb.sa.band78.273prb.fhi72.4x4-liteon.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf) (band n78, 273 PRBs, 3.5GHz center freq, 4x4 antenna configuration with 9 bit I/Q samples (compressed) for PUSCH/PDSCH/PRACH, 2-layer DL MIMO, UL SISO)
-2. Benetel 650 RU: [`gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel650.conf) (band n78, 273 PRBs, 3.5GHz center freq, 4x2 antenna configuration with 9 bit I/Q samples (compressed) for PUSCH/PDSCH/PRACH, 2-layer DL MIMO, UL SISO)
-3. VVDN RU: [`gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf) (band n77, 273 PRBs, 4.0GHz center freq, 4x4 antenna configuration with 9 bit I/Q samples (compressed) for PUSCH/PDSCH/PRACH, 2-layer DL MIMO, UL SISO)
+1. LITEON RU:
+[`gnb.sa.band78.273prb.fhi72.4x4-liteon.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf)
+2. VVDN RU:
+[`gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf)
+[`gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf)
+[`gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf)
+3. Benetel 650 RU:
+[`gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf)
+4. Benetel 550 RU:
+[`gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf)
+[`gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf)
+5. Metanoia RU:
+[`gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf)
 
 Edit the sample OAI gNB configuration file and check following parameters:
 
@@ -778,16 +896,15 @@ Edit the sample OAI gNB configuration file and check following parameters:
 * `fhi_72` (FrontHaul Interface) section: this config follows the structure
   that is employed by the xRAN library (`xran_fh_init` and `xran_fh_config`
   structs in the code):
-  * `dpdk_devices`: PCI addresses of NIC VFs binded to the DPDK (not the physical NIC but the VFs, use `lspci | grep Virtual`)
+  * `dpdk_devices`: PCI addresses of NIC VFs binded to the DPDK (not the physical NIC but the VFs, use `lspci | grep Virtual`) in the format `{VF-U-plane, VF-C-plane}`;
+    if one VF used per RU, U and C planes will share the same VF => depends on the RU capabilities
   * `system_core`: absolute CPU core ID for DPDK control threads, it should be an isolated core, in our environment we are using CPU 0
     (`rte_mp_handle`, `eal-intr-thread`, `iavf-event-thread`)
   * `io_core`: absolute CPU core ID for XRAN library, it should be an isolated core, in our environment we are using CPU 4
   * `worker_cores`: array of absolute CPU core IDs for XRAN library, they should be isolated cores, in our environment we are using CPU 2
-  * `du_addr`: DU C- and U-plane MAC-addresses (format `UU:VV:WW:XX:YY:ZZ`,
-    hexadecimal numbers)
-  * `ru_addr`: RU C- and U-plane MAC-addresses (format `UU:VV:WW:XX:YY:ZZ`,
-    hexadecimal numbers)
-  * `mtu`: Maximum Transmission Unit for the RU, specified by RU vendor
+  * `ru_addr`: RU U- and C-plane MAC-addresses (format `UU:VV:WW:XX:YY:ZZ`, hexadecimal numbers)
+  * `mtu`: Maximum Transmission Unit for the RU, specified by RU vendor; either 1500 or 9600 B (Jumbo Frames); if not set, 1500 is used
+  * `file_prefix` : used to specify a unique prefix for shared memory and files created by multiple DPDK processes; if not set, default value of `wls_0` is used
   * `dpdk_mem_size`: the huge page size that should be pre-allocated by DPDK
     _for NUMA node 0_; by default, this is 8192 MiB (corresponding to 8 huge
     pages à 1024 MiB each, see above). In the current implementation, you
@@ -804,17 +921,19 @@ Edit the sample OAI gNB configuration file and check following parameters:
       * `iq_width_prach`: Width of PRACH IQ samples: if 16, no compression, if <16, applies
         compression
     * `prach_config`: PRACH-specific configuration
-      * `eAxC_offset`:  PRACH antenna offset
+      * `eAxC_offset`:  PRACH antenna offset; if not set, default value of `N = max(Nrx,Ntx)` is used
       * `kbar`: the PRACH guard interval, provided in RU
 
 Layer mapping (eAxC offsets) happens as follows:
-- For PUSCH/PDSCH, the layers are mapped to `[0,1,...,N-1]` where `N` is the
+- For PUSCH/PDSCH, the layers are mapped to `[0,1,...,Nrx-1]/[0,1,...,Ntx-1]` where `Nrx/Ntx` is the
   respective RX/TX number of antennas.
-- For PRACH, the layers are mapped to `[No,No+1,...No+N-1]` where No is the
-  `fhi_72.fh_config.[0].prach_config.eAxC_offset` and `N` the number of receive
-  antennas.
+- For PRACH, the layers are mapped to `[No,No+1,...No+Nrx-1]` where `No` is the
+  `fhi_72.fh_config.[0].prach_config.eAxC_offset`. Please be aware that the following equation must be fullfilled: `No >= max(Nrx,Ntx)`.
 
-xRAN SRS reception is not supported.
+**Note**
+
+- At the moment, OAI is compatible with CAT A O-RU only. Therefore, SRS is not supported.
+- XRAN retreives DU MAC address with `rte_eth_macaddr_get()` function. Hence, `fhi_72.du_addr` parameter is not taken into account.
 
 # Start and Operation of OAI gNB
 
@@ -920,7 +1039,7 @@ Some caveats:
 
 For two RUs each using a 4x4 configuration, make sure to configure the 8x8
 configuration, i.e., set `nb_tx` and `nb_rx` under `RUs` to 8 each (NOT two
-RUs!). Also, set the antenna port information as listed above, i.e.,
+`RUs`!). Also, set the antenna port information as listed above, i.e.,
 
 ```
 pdsch_AntennaPorts_XP = 2;
@@ -934,11 +1053,10 @@ Next, configure the `fhi_72` section as indicated below:
 
 ```
 fhi_72 = {
-   dpdk_devices = ("ru1_up_vf_pci", "ru1_cp_vf_pci", "ru2_up_vf_pci", "ru2_cp_vf_pci");
+   dpdk_devices = ("ru1_up_vf_pci", "ru1_cp_vf_pci", "ru2_up_vf_pci", "ru2_cp_vf_pci"); # two VFs can be used as well
    // core config as always
-   du_addr = ("du_ru1_up_mac_addr", "du_ru1_cp_mac_addr", "du_ru2_up_mac_addr", "du_ru2_cp_mac_addr");
-   ru_addr = ("ru1_up_mac_addr", "ru1_cp_mac_addr", "ru2_up_mac_addr", "ru2_cp_mac_addr");
-   // mtu, file_prefix ...
+   ru_addr = ("ru1_up_mac_addr", "ru1_cp_mac_addr", "ru2_up_mac_addr", "ru2_cp_mac_addr"); # if two VFs, set two RU MAC addresses (one per RU)
+   // mtu
    fh_config = (
      {
        // timing, ru_config, prach_config of RU1
@@ -950,12 +1068,12 @@ fhi_72 = {
 };
 ```
 
-i.e., for `dpdk_devices`, `du_addr`, and `ru_addr` is configured for
+i.e., for `dpdk_devices`, and `ru_addr` is configured for
 both RUs in a (flat) array, and the individual radio configuration is given for
 each RU individually inside the `fh_config`.
 
 <details>
-<summary>Sample FHI 7.2 configuration for two RUs (Benetel 550 and 650)</summary>
+<summary>Sample FHI 7.2 configuration for two RUs (2 x Benetel 650)</summary>
 
 ```
 fhi_72 = {
@@ -963,12 +1081,10 @@ fhi_72 = {
   system_core = 0;
   io_core = 1;
   worker_cores = (2);
-  du_addr = ("00:11:22:33:44:66","00:11:22:33:44:67","00:11:22:33:44:66","00:11:22:33:44:67");
-  ru_addr = ("70:b3:d5:e1:5b:ff","70:b3:d5:e1:5b:ff","70:b3:d5:e1:5b:81", "70:b3:d5:e1:5b:81");
-  mtu = 9216;
-  file_prefix = "fhi_72";
+  ru_addr = ("8c:1f:64:d1:10:46","8c:1f:64:d1:10:46","8c:1f:64:d1:10:43","8c:1f:64:d1:10:43")
+  mtu = 9600;
   fh_config = (
-# RAN650
+# RAN650 #1
    {
     Tadv_cp_dl = 125;
     T2a_cp_dl = (259, 500);
@@ -983,11 +1099,8 @@ fhi_72 = {
       iq_width = 9;
       iq_width_prach = 9;
     };
-    prach_config = {
-      eAxC_offset = 4;
-    };
   },
-# RAN550
+# RAN650 #2
   {
     Tadv_cp_dl = 125;
     T2a_cp_dl = (259, 500);
@@ -1002,38 +1115,35 @@ fhi_72 = {
       iq_width = 9;
       iq_width_prach = 9;
     };
-    prach_config = {
-      eAxC_offset = 4;
-    };
   });
 ```
 </details>
 
 Compare also with the example (DU) configuration in
-[`gnb-du.sa.band78.106prb.fhi72.8x8-benetel-650-550.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band78.106prb.fhi72.8x8-benetel-650-550.conf).
+[`gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650.conf`](../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650.conf).
 
 Afterwards, start the gNB with the modified configuration file. If everything
 went well, you should see the RU counters for both RUs go up:
 
 ```
-[NR_PHY]   [o-du 0][rx  614400 pps   61440 kbps  844953][tx 1275076 pps  127488 kbps 1998585][Total Msgs_Rcvd 614400]
-[NR_PHY]   [o_du0][pusch0  107520 prach0   46080]
-[NR_PHY]   [o_du0][pusch1  107520 prach1   46080]
-[NR_PHY]   [o_du0][pusch2  107520 prach2   46080]
-[NR_PHY]   [o_du0][pusch3  107520 prach3   46080]
-[NR_PHY]   [o-du 1][rx  614400 pps   61440 kbps  844953][tx 1275076 pps  127488 kbps 1998585][Total Msgs_Rcvd 614400]
-[NR_PHY]   [o_du1][pusch0  107520 prach0   46080]
-[NR_PHY]   [o_du1][pusch1  107520 prach1   46080]
-[NR_PHY]   [o_du1][pusch2  107520 prach2   46080]
-[NR_PHY]   [o_du1][pusch3  107520 prach3   46080]
+[NR_PHY]   [o-du 0][rx   63488 pps   63264 kbps 2759808][tx  127684 pps  127116 kbps 4717971][Total Msgs_Rcvd 63488]
+[NR_PHY]   [o_du0][pusch0   14336 prach0    1536]
+[NR_PHY]   [o_du0][pusch1   14336 prach1    1536]
+[NR_PHY]   [o_du0][pusch2   14336 prach2    1536]
+[NR_PHY]   [o_du0][pusch3   14336 prach3    1536]
+[NR_PHY]   [o-du 1][rx   63544 pps   63320 kbps 2763240][tx  127684 pps  127116 kbps 4717971][Total Msgs_Rcvd 63544]
+[NR_PHY]   [o_du1][pusch0   14350 prach0    1536]
+[NR_PHY]   [o_du1][pusch1   14350 prach1    1536]
+[NR_PHY]   [o_du1][pusch2   14350 prach2    1536]
+[NR_PHY]   [o_du1][pusch3   14350 prach3    1536]
 ```
 
 You can also verify that there is signal on all RX antennas like so:
 ```bash
 $ cat nrL1_stats.log
 [...]
-max_IO = 66 (81), min_I0 = 0 (53), avg_I0 = 51 dB(46.48.45.46.51.56.55.45.)
-PRACH I0 = 38.0 dB
+max_IO = 55 (85), min_I0 = 0 (136), avg_I0 = 44 dB(43.44.43.45.44.43.43.45.)
+PRACH I0 = 30.6 dB
 ```
 
 Note the eight entries after `avg_IO`.
@@ -1049,7 +1159,7 @@ Your email should contain below information:
 - A clear subject in your email.
 - For all the queries there should be [Query\] in the subject of the email and for problems there should be [Problem\].
 - In case of a problem, add a small description.
-- Do not share any photos unless you want to share a diagram. 
+- Do not share any screenshots/photos unless you want to share a diagram.
 - OAI gNB/DU/CU/CU-CP/CU-UP configuration file in `.conf` format only.
 - Logs of OAI gNB/DU/CU/CU-CP/CU-UP in `.log` or `.txt` format only.
 - RU Vendor and Version.
diff --git a/doc/TESTBenches.md b/doc/TESTBenches.md
index c41657538fd608dfcb645b0dd3b70c4678c89de7..57606548e7c52393f623c5f7228c3774fc2bed55 100644
--- a/doc/TESTBenches.md
+++ b/doc/TESTBenches.md
@@ -128,6 +128,9 @@ information on how the images are built.
 - [OAI-CN5G-COTS-UE-Test](https://jenkins-oai.eurecom.fr/job/OAI-CN5G-COTS-UE-Test/)
   ~5G-NR
   - using 5GC bench (resources `CI-Cetautomatix-OC-oaicicd-session`, `CI-Dogmatix-CN5G-gNB`): Attach/Detach of UE with multiple PDU sessions
+- [OAI-FLEXRIC-RAN-Integration-Test](https://jenkins-oai.eurecom.fr/job/OAI-FLEXRIC-RAN-Integration-Test/) ~5G-NR
+  - selfix (gNB, nrUE, OAI 5GC, FlexRIC)
+  - uses RFsimulator, tests FlexRIC/E2 interface and xApps
 - [RAN-gNB-N300-Timing-Phytest-LDPC](https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-gNB-N300-Timing-Phytest-LDPC/)
   ~5G-NR
   - caracal + N310
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index e449e6c33ed29652bb38ef445ec77d6875977aed..48011f8d17b7dd674e0fd1c299df2708025ded11 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -21,66 +21,13 @@
 
 
 #define _GNU_SOURCE             /* See feature_test_macros(7) */
-#include <sched.h>
-
-
-#include "T.h"
-
-#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
-#include <common/utils/assertions.h>
-#include "common/oai_version.h"
-
-#include "PHY/types.h"
-#include "common/ran_context.h"
 
-#include "PHY/defs_gNB.h"
-#include "PHY/defs_common.h"
 #include "common/config/config_userapi.h"
-#include "common/utils/load_module_shlib.h"
-#undef MALLOC //there are two conflicting definitions, so we better make sure we don't use it at all
-//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
-
-#include "radio/COMMON/common_lib.h"
-#include "radio/ETHERNET/if_defs.h"
-
-//#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
-
-#include "PHY/phy_vars.h"
 #include "RRC/LTE/rrc_vars.h"
-#include "PHY_INTERFACE/phy_interface_vars.h"
-#include "gnb_config.h"
-#include "SIMULATION/TOOLS/sim.h"
-
 #ifdef SMBV
 #include "PHY/TOOLS/smbv.h"
 unsigned short config_frames[4] = {2,9,11,13};
 #endif
-
-#include "common/utils/LOG/log.h"
-#include "common/utils/LOG/vcd_signal_dumper.h"
-#include "UTIL/OPT/opt.h"
-#include "LAYER2/nr_pdcp/nr_pdcp_oai_api.h"
-
-#include "intertask_interface.h"
-
-#include "PHY/INIT/nr_phy_init.h"
-
-#include "system.h"
-#include <openair2/GNB_APP/gnb_app.h>
-#include "PHY/TOOLS/phy_scope_interface.h"
-#include "PHY/TOOLS/nr_phy_scope.h"
-#include "nr-softmodem.h"
-#include "executables/softmodem-common.h"
-#include "executables/thread-common.h"
-#include "NB_IoT_interface.h"
-#include "x2ap_eNB.h"
-#include "ngap_gNB.h"
-#include "gnb_paramdef.h"
-#include <openair3/ocp-gtpu/gtp_itf.h>
-#include "nfapi/oai_integration/vendor_ext.h"
-#include "gnb_config.h"
-#include "openair2/E1AP/e1ap_common.h"
-#include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
 #ifdef ENABLE_AERIAL
 #include "nfapi/oai_integration/aerial/fapi_nvIPC.h"
 #endif
@@ -88,6 +35,58 @@ unsigned short config_frames[4] = {2,9,11,13};
 #include "openair2/E2AP/flexric/src/agent/e2_agent_api.h"
 #include "openair2/E2AP/RAN_FUNCTION/init_ran_func.h"
 #endif
+#include "nr-softmodem.h"
+#include <common/utils/assertions.h>
+#include <openair2/GNB_APP/gnb_app.h>
+#include <openair3/ocp-gtpu/gtp_itf.h>
+#include <pthread.h>
+#include <sched.h>
+#include <simple_executable.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "LAYER2/nr_pdcp/nr_pdcp_oai_api.h"
+#include "NR_MAC_COMMON/nr_mac_extern.h"
+#include "NR_PHY_INTERFACE/NR_IF_Module.h"
+#include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
+#include "PHY/INIT/nr_phy_init.h"
+#include "PHY/TOOLS/phy_scope_interface.h"
+#include "PHY/defs_common.h"
+#include "PHY/defs_gNB.h"
+#include "PHY/defs_nr_common.h"
+#include "PHY/phy_vars.h"
+#include "RRC/NR/nr_rrc_defs.h"
+#include "RRC/NR/nr_rrc_proto.h"
+#include "RRC_nr_paramsvalues.h"
+#include "SIMULATION/TOOLS/sim.h"
+#include "T.h"
+#include "UTIL/OPT/opt.h"
+#include "common/config/config_userapi.h"
+#include "common/ngran_types.h"
+#include "common/oai_version.h"
+#include "common/ran_context.h"
+#include "common/utils/LOG/log.h"
+#include "e1ap_messages_types.h"
+#include "executables/softmodem-common.h"
+#include "gnb_config.h"
+#include "gnb_paramdef.h"
+#include "intertask_interface.h"
+#include "nfapi/oai_integration/vendor_ext.h"
+#include "nfapi_interface.h"
+#include "nfapi_nr_interface_scf.h"
+#include "ngap_gNB.h"
+#include "nr-softmodem-common.h"
+#include "openair2/E1AP/e1ap_common.h"
+#include "pdcp.h"
+#include "radio/COMMON/common_lib.h"
+#include "s1ap_eNB.h"
+#include "sctp_eNB_task.h"
+#include "softmodem-bits.h"
+#include "system.h"
+#include "time_meas.h"
+#include "utils.h"
+#include "x2ap_eNB.h"
 
 pthread_cond_t nfapi_sync_cond;
 pthread_mutex_t nfapi_sync_mutex;
@@ -424,7 +423,6 @@ void init_pdcp(void) {
 }
 
 #ifdef E2_AGENT
-#include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h" // need to get info from MAC
 static void initialize_agent(ngran_node_t node_type, e2_agent_args_t oai_args)
 {
   AssertFatal(oai_args.sm_dir != NULL , "Please, specify the directory where the SMs are located in the config file, i.e., add in config file the next line: e2_agent = {near_ric_ip_addr = \"127.0.0.1\"; sm_dir = \"/usr/local/lib/flexric/\");} ");
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index d6c308631755af8d5c5aab2080ebfbdbca6d189e..a7661b0c061f199951f01be93178f5108c441e9b 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -594,7 +594,11 @@ void processSlotTX(void *arg)
   RU_write(rxtxD, sl_tx_action);
 }
 
-static int UE_dl_preprocessing(PHY_VARS_NR_UE *UE, const UE_nr_rxtx_proc_t *proc, int *tx_wait_for_dlsch, nr_phy_data_t *phy_data)
+static int UE_dl_preprocessing(PHY_VARS_NR_UE *UE,
+                               const UE_nr_rxtx_proc_t *proc,
+                               int *tx_wait_for_dlsch,
+                               nr_phy_data_t *phy_data,
+                               bool *stats_printed)
 {
   int sampleShift = INT_MAX;
   NR_DL_FRAME_PARMS *fp = &UE->frame_parms;
@@ -602,7 +606,6 @@ static int UE_dl_preprocessing(PHY_VARS_NR_UE *UE, const UE_nr_rxtx_proc_t *proc
     fp = &UE->SL_UE_PHY_PARAMS.sl_frame_params;
 
   if (IS_SOFTMODEM_NOS1 || IS_SA_MODE(get_softmodem_params())) {
-
     // Start synchronization with a target gNB
     if (UE->synch_request.received_synch_request == 1) {
       fapi_nr_synch_request_t *synch_req = &UE->synch_request.synch_req;
@@ -655,6 +658,16 @@ static int UE_dl_preprocessing(PHY_VARS_NR_UE *UE, const UE_nr_rxtx_proc_t *proc
       const int ack_nack_slot = (proc->nr_slot_rx + phy_data->dlsch[0].dlsch_config.k1_feedback) % UE->frame_parms.slots_per_frame;
       tx_wait_for_dlsch[ack_nack_slot]++;
     }
+  } else {
+    // good time to print statistics, we don't have to spend time  to decode DCI
+    if (proc->frame_rx % 128 == 0) {
+      if (*stats_printed == false) {
+        print_ue_mac_stats(UE->Mod_id, proc->frame_rx, proc->nr_slot_rx);
+        *stats_printed = true;
+      }
+    } else {
+      *stats_printed = false;
+    }
   }
 
   if (UE->sl_mode == 2) {
@@ -833,6 +846,7 @@ void *UE_thread(void *arg)
   int shiftForNextFrame = 0;
   int intialSyncOffset = 0;
   openair0_timestamp sync_timestamp;
+  bool stats_printed = false;
 
   if (get_softmodem_params()->sync_ref && UE->sl_mode == 2) {
     UE->is_synchronized = 1;
@@ -1029,7 +1043,7 @@ void *UE_thread(void *arg)
     notifiedFIFO_elt_t *newRx = newNotifiedFIFO_elt(sizeof(nr_rxtx_thread_data_t), curMsg.proc.nr_slot_rx, NULL, UE_dl_processing);
     nr_rxtx_thread_data_t *curMsgRx = (nr_rxtx_thread_data_t *)NotifiedFifoData(newRx);
     *curMsgRx = (nr_rxtx_thread_data_t){.proc = curMsg.proc, .UE = UE};
-    int ret = UE_dl_preprocessing(UE, &curMsgRx->proc, tx_wait_for_dlsch, &curMsgRx->phy_data);
+    int ret = UE_dl_preprocessing(UE, &curMsgRx->proc, tx_wait_for_dlsch, &curMsgRx->phy_data, &stats_printed);
     if (ret != INT_MAX)
       shiftForNextFrame = ret;
     pushTpool(&(get_nrUE_params()->Tpool), newRx);
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index fbd10c5c04638e71a8633a059bb340f3438dd48b..8a9f0c626f2ca1b464933f118092adb1bbcc6301 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -87,6 +87,7 @@ unsigned short config_frames[4] = {2,9,11,13};
 #include "nr_nas_msg.h"
 #include <openair1/PHY/MODULATION/nr_modulation.h>
 #include "openair2/GNB_APP/gnb_paramdef.h"
+#include "pdcp.h"
 
 extern const char *duplex_mode[];
 THREAD_STRUCT thread_struct;
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index a240f3ecdeec95a11718e6f40c0f1a54f756b6a7..677401ae47bdbdfbc147190a5501be6942dde893 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -467,10 +467,10 @@ void nr_init_ul_harq_processes(NR_UL_UE_HARQ_t harq_list[NR_MAX_ULSCH_HARQ_PROCE
 void init_nr_ue_transport(PHY_VARS_NR_UE *ue) {
 
   nr_init_dl_harq_processes(ue->dl_harq_processes, NR_MAX_DLSCH_HARQ_PROCESSES, ue->frame_parms.N_RB_DL);
-  nr_init_ul_harq_processes(ue->ul_harq_processes, NR_MAX_ULSCH_HARQ_PROCESSES, ue->frame_parms.N_RB_UL, ue->frame_parms.nb_antennas_tx);
-
-  for(int i=0; i<5; i++)
-    ue->dl_stats[i] = 0;
+  nr_init_ul_harq_processes(ue->ul_harq_processes,
+                            NR_MAX_ULSCH_HARQ_PROCESSES,
+                            ue->frame_parms.N_RB_UL,
+                            ue->frame_parms.nb_antennas_tx);
 }
 
 void clean_UE_harq(PHY_VARS_NR_UE *UE)
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
index b8b44eceb6fd83d6da3c71c9d95e5c27195ab2c9..acdd291343d5eb5d4b70415d06df63fbb59e5e23 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
@@ -19,7 +19,6 @@
  *      contact@openairinterface.org
  */
 
-
 #include <string.h>
 
 #include "nr_ul_estimation.h"
@@ -35,13 +34,12 @@
 #include "executables/softmodem-common.h"
 #include "nr_phy_common.h"
 
-
 //#define DEBUG_CH
 //#define DEBUG_PUSCH
 //#define SRS_DEBUG
 
 #define NO_INTERP 1
-#define dBc(x,y) (dB_fixed(((int32_t)(x))*(x) + ((int32_t)(y))*(y)))
+#define dBc(x, y) (dB_fixed(((int32_t)(x)) * (x) + ((int32_t)(y)) * (y)))
 
 __attribute__((always_inline)) inline c16_t c32x16cumulVectVectWithSteps(c16_t *in1,
                                                                          int *offset1,
@@ -50,130 +48,81 @@ __attribute__((always_inline)) inline c16_t c32x16cumulVectVectWithSteps(c16_t *
                                                                          int *offset2,
                                                                          const int step2,
                                                                          const int modulo2,
-                                                                         const int N) {
-
-  int localOffset1=*offset1;
-  int localOffset2=*offset2;
-  c32_t cumul={0};
-  for (int i=0; i<N; i++) {
-    cumul=c32x16maddShift(in1[localOffset1], in2[localOffset2], cumul, 15);
-    localOffset1+=step1;
-    localOffset2= (localOffset2 + step2) % modulo2;
+                                                                         const int N)
+{
+  int localOffset1 = *offset1;
+  int localOffset2 = *offset2;
+  c32_t cumul = {0};
+  for (int i = 0; i < N; i++) {
+    cumul = c32x16maddShift(in1[localOffset1], in2[localOffset2], cumul, 15);
+    localOffset1 += step1;
+    localOffset2 = (localOffset2 + step2) % modulo2;
   }
-  *offset1=localOffset1;
-  *offset2=localOffset2;
+  *offset1 = localOffset1;
+  *offset2 = localOffset2;
   return c16x32div(cumul, N);
 }
 
-int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
-                                unsigned char Ns,
-                                int nl,
-                                unsigned short p,
-                                unsigned char symbol,
-                                int ul_id,
-                                int beam_nb,
-                                unsigned short bwp_start_subcarrier,
-                                nfapi_nr_pusch_pdu_t *pusch_pdu,
-                                int *max_ch,
-                                uint32_t *nvar)
+static void nr_pusch_antenna_processing(void *arg)
 {
-  c16_t pilot[3280] __attribute__((aligned(32)));
-  const int chest_freq = gNB->chest_freq;
-
-#ifdef DEBUG_CH
-  FILE *debug_ch_est;
-  debug_ch_est = fopen("debug_ch_est.txt","w");
-#endif
-  NR_gNB_PUSCH *pusch_vars = &gNB->pusch_vars[ul_id];
+  puschAntennaProc_t *rdata = (puschAntennaProc_t *)arg;
+  unsigned char Ns = rdata->Ns;
+  int nl = rdata->nl;
+  unsigned short p = rdata->p;
+  unsigned char symbol = rdata->symbol;
+  int aarx = rdata->aarx;
+  int numAntennas = rdata->numAntennas;
+  unsigned short bwp_start_subcarrier = rdata->bwp_start_subcarrier;
+  nfapi_nr_pusch_pdu_t *pusch_pdu = rdata->pusch_pdu;
+  int *max_ch = rdata->max_ch;
+  c16_t *pilot = rdata->pilot;
+  uint64_t noise_amp2 = *(rdata->noise_amp2);
+  int nest_count = *(rdata->nest_count);
+  delay_t *delay = rdata->delay;
+
+  const int chest_freq = rdata->chest_freq;
+  NR_gNB_PUSCH *pusch_vars = rdata->pusch_vars;
   c16_t **ul_ch_estimates = (c16_t **)pusch_vars->ul_ch_estimates;
-  const int symbolSize = gNB->frame_parms.ofdm_symbol_size;
-  const int slot_offset = (Ns & 3) * gNB->frame_parms.symbols_per_slot * symbolSize;
+  NR_DL_FRAME_PARMS *frame_parms = rdata->frame_parms;
+  const int symbolSize = frame_parms->ofdm_symbol_size;
+  const int slot_offset = (Ns & 3) * frame_parms->symbols_per_slot * symbolSize;
   const int delta = get_delta(p, pusch_pdu->dmrs_config_type);
   const int symbol_offset = symbolSize * symbol;
   const int k0 = bwp_start_subcarrier;
   const int nb_rb_pusch = pusch_pdu->rb_size;
+  const int beam_nb = rdata->beam_nb;
+  for (int antenna = aarx; antenna < aarx + numAntennas; antenna++) {
+    c16_t ul_ls_est[symbolSize] __attribute__((aligned(32)));
+    memset(ul_ls_est, 0, sizeof(c16_t) * symbolSize);
+    c16_t *rxdataF = (c16_t *)&rdata->rxdataF[beam_nb][antenna][symbol_offset + slot_offset];
+    c16_t *ul_ch = &ul_ch_estimates[nl * frame_parms->nb_antennas_rx + antenna][symbol_offset];
+    memset(ul_ch, 0, sizeof(*ul_ch) * symbolSize);
 
-  LOG_D(PHY, "symbol_offset %d, slot_offset %d, OFDM size %d, Ns = %d, k0 = %d, symbol %d\n",
-        symbol_offset,
-        slot_offset,
-        symbolSize,
-        Ns,
-        k0,
-        symbol);
-
-  //------------------generate DMRS------------------//
-
-  if (pusch_pdu->transform_precoding == transformPrecoder_disabled) {
-    // Note: pilot returned by the following function is already the complex conjugate of the transmitted DMRS
-    NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
-    const uint32_t *gold = nr_gold_pusch(fp->N_RB_UL,
-                                         fp->symbols_per_slot,
-                                         gNB->gNB_config.cell_config.phy_cell_id.value,
-                                         pusch_pdu->scid,
-                                         Ns,
-                                         symbol);
-    nr_pusch_dmrs_rx(gNB,
-                     Ns,
-                     gold,
-                     pilot,
-                     (1000 + p),
-                     0,
-                     nb_rb_pusch,
-                     (pusch_pdu->bwp_start + pusch_pdu->rb_start) * NR_NB_SC_PER_RB,
-                     pusch_pdu->dmrs_config_type);
-  } else { // if transform precoding or SC-FDMA is enabled in Uplink
-    // NR_SC_FDMA supports type1 DMRS so only 6 DMRS REs per RB possible
-    const int index = get_index_for_dmrs_lowpapr_seq(nb_rb_pusch * (NR_NB_SC_PER_RB / 2));
-    const uint8_t u = pusch_pdu->dfts_ofdm.low_papr_group_number;
-    const uint8_t v = pusch_pdu->dfts_ofdm.low_papr_sequence_number;
-    c16_t *dmrs_seq = gNB_dmrs_lowpaprtype1_sequence[u][v][index];
-    LOG_D(PHY,"Transform Precoding params. u: %d, v: %d, index for dmrsseq: %d\n", u, v, index);
-    AssertFatal(index >= 0, "Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs cannot be multiple of any other primenumber other than 2,3,5\n");
-    AssertFatal(dmrs_seq != NULL, "DMRS low PAPR seq not found, check if DMRS sequences are generated");
-    nr_pusch_lowpaprtype1_dmrs_rx(gNB, Ns, dmrs_seq, pilot, 1000, 0, nb_rb_pusch, 0, pusch_pdu->dmrs_config_type);
-#ifdef DEBUG_PUSCH
-    printf ("NR_UL_CHANNEL_EST: index %d, u %d,v %d\n", index, u, v);
-    LOG_M("gNb_DMRS_SEQ.m","gNb_DMRS_SEQ", dmrs_seq,6*nb_rb_pusch,1,1);
-#endif
-  }
-  //------------------------------------------------//
-
-#ifdef DEBUG_PUSCH
-
-  for (int i = 0; i < (6 * nb_rb_pusch); i++) {
-    LOG_I(PHY, "In %s: %d + j*(%d)\n", __FUNCTION__, pilot[i].r,pilot[i].i);
-  }
-
-#endif
-
-  int nest_count = 0;
-  uint64_t noise_amp2 = 0;
-  c16_t ul_ls_est[symbolSize] __attribute__((aligned(32)));
-  memset(ul_ls_est, 0, sizeof(c16_t) * symbolSize);
-  delay_t *delay = &gNB->ulsch[ul_id].delay;
-  memset(delay, 0, sizeof(*delay));
-
-  for (int aarx=0; aarx<gNB->frame_parms.nb_antennas_rx; aarx++) {
-    c16_t *rxdataF = (c16_t *)&gNB->common_vars.rxdataF[beam_nb][aarx][symbol_offset + slot_offset];
-    c16_t *ul_ch = &ul_ch_estimates[nl * gNB->frame_parms.nb_antennas_rx + aarx][symbol_offset];
+    LOG_D(PHY,
+          "symbol_offset %d, slot_offset %d, OFDM size %d, Ns = %d, k0 = %d, symbol %d\n",
+          symbol_offset,
+          slot_offset,
+          symbolSize,
+          Ns,
+          k0,
+          symbol);
 
-    memset(ul_ch, 0, sizeof(*ul_ch) * symbolSize);
 #ifdef DEBUG_PUSCH
     LOG_I(PHY, "symbol_offset %d, delta %d\n", symbol_offset, delta);
-    LOG_I(PHY, "ch est pilot, N_RB_UL %d\n", gNB->frame_parms.N_RB_UL);
+    LOG_I(PHY, "ch est pilot, N_RB_UL %d\n", frame_parms->N_RB_UL);
     LOG_I(PHY,
           "bwp_start_subcarrier %d, k0 %d, first_carrier %d, nb_rb_pusch %d\n",
           bwp_start_subcarrier,
           k0,
-          gNB->frame_parms.first_carrier_offset,
+          frame_parms->first_carrier_offset,
           nb_rb_pusch);
     LOG_I(PHY, "ul_ch addr %p \n", ul_ch);
 #endif
 
     if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1 && chest_freq == 0) {
-      c16_t *pil   = pilot;
+      c16_t *pil = pilot;
       int re_offset = k0;
-      LOG_D(PHY,"PUSCH estimation DMRS type 1, Freq-domain interpolation");
+      LOG_D(PHY, "PUSCH estimation DMRS type 1, Freq-domain interpolation");
       int pilot_cnt = 0;
 
       for (int n = 0; n < 3 * nb_rb_pusch; n++) {
@@ -187,27 +136,25 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
         }
 
         c16_t ch16 = {.r = (int16_t)ch.r, .i = (int16_t)ch.i};
-        *max_ch = max(*max_ch, max(abs(ch.r), abs(ch.i)));
+        *max_ch = max(abs(ch.r), abs(ch.i));
         for (int k = pilot_cnt << 1; k < (pilot_cnt << 1) + 4; k++) {
           ul_ls_est[k] = ch16;
         }
         pilot_cnt += 2;
       }
 
-      nr_est_delay(gNB->frame_parms.ofdm_symbol_size, ul_ls_est, (c16_t *)pusch_vars->ul_ch_estimates_time[aarx], delay);
+      nr_est_delay(frame_parms->ofdm_symbol_size, ul_ls_est, (c16_t *)pusch_vars->ul_ch_estimates_time[antenna], delay);
       int delay_idx = get_delay_idx(delay->est_delay, MAX_DELAY_COMP);
-      c16_t *ul_delay_table = gNB->frame_parms.delay_table[delay_idx];
+      c16_t *ul_delay_table = frame_parms->delay_table[delay_idx];
 
 #ifdef DEBUG_PUSCH
       printf("Estimated delay = %i\n", delay->est_delay >> 1);
 #endif
 
       pilot_cnt = 0;
-      for (int n = 0; n < 3*nb_rb_pusch; n++) {
-
+      for (int n = 0; n < 3 * nb_rb_pusch; n++) {
         // Channel interpolation
         for (int k_line = 0; k_line <= 1; k_line++) {
-
           // Apply delay
           int k = pilot_cnt << 1;
           c16_t ch16 = c16mulShift(ul_ls_est[k], ul_delay_table[k], 8);
@@ -216,7 +163,13 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
           re_offset = (k0 + (n << 2) + (k_line << 1)) % symbolSize;
           c16_t *rxF = &rxdataF[re_offset];
           printf("pilot %4d: pil -> (%6d,%6d), rxF -> (%4d,%4d), ch -> (%4d,%4d)\n",
-                 pilot_cnt, pil->r, pil->i, rxF->r, rxF->i, ch16.r, ch16.i);
+                 pilot_cnt,
+                 pil->r,
+                 pil->i,
+                 rxF->r,
+                 rxF->i,
+                 ch.r,
+                 ch.i);
 #endif
 
           if (pilot_cnt == 0) {
@@ -238,9 +191,9 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 
       // Revert delay
       pilot_cnt = 0;
-      ul_ch = &ul_ch_estimates[nl * gNB->frame_parms.nb_antennas_rx + aarx][symbol_offset];
+      ul_ch = &ul_ch_estimates[nl * frame_parms->nb_antennas_rx + antenna][symbol_offset];
       int inv_delay_idx = get_delay_idx(-delay->est_delay, MAX_DELAY_COMP);
-      c16_t *ul_inv_delay_table = gNB->frame_parms.delay_table[inv_delay_idx];
+      c16_t *ul_inv_delay_table = frame_parms->delay_table[inv_delay_idx];
       for (int n = 0; n < 3 * nb_rb_pusch; n++) {
         for (int k_line = 0; k_line <= 1; k_line++) {
           int k = pilot_cnt << 1;
@@ -258,7 +211,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
         }
       }
 
-    } else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type2 && chest_freq == 0) { // pusch_dmrs_type2  |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
+    } else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type2
+               && chest_freq == 0) { // pusch_dmrs_type2  |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
       LOG_D(PHY, "PUSCH estimation DMRS type 2, Freq-domain interpolation\n");
       c16_t *pil = pilot;
       c16_t *rx = &rxdataF[delta];
@@ -268,26 +222,27 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
         c16_t ch1 = c16mulShift(*pil, rx[(k0 + n + 1) % symbolSize], 15);
         pil++;
         c16_t ch = c16addShift(ch0, ch1, 1);
-        *max_ch = max(*max_ch, max(abs(ch.r), abs(ch.i)));
+        *max_ch = max(abs(ch.r), abs(ch.i));
         multadd_real_four_symbols_vector_complex_scalar(filt8_rep4, &ch, &ul_ls_est[n]);
         ul_ls_est[n + 4] = ch;
         ul_ls_est[n + 5] = ch;
         noise_amp2 += c16amp2(c16sub(ch0, ch));
-        nest_count++;
+        nest_count += 1;
       }
 
       // Delay compensation
-      nr_est_delay(gNB->frame_parms.ofdm_symbol_size, ul_ls_est, (c16_t *)pusch_vars->ul_ch_estimates_time[aarx], delay);
+      nr_est_delay(frame_parms->ofdm_symbol_size, ul_ls_est, (c16_t *)pusch_vars->ul_ch_estimates_time[antenna], delay);
       int delay_idx = get_delay_idx(-delay->est_delay, MAX_DELAY_COMP);
-      c16_t *ul_delay_table = gNB->frame_parms.delay_table[delay_idx];
+      c16_t *ul_delay_table = frame_parms->delay_table[delay_idx];
       for (int n = 0; n < nb_rb_pusch * NR_NB_SC_PER_RB; n++) {
         ul_ch[n] = c16mulShift(ul_ls_est[n], ul_delay_table[n % 6], 8);
       }
 
     }
-    // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 6 DMRS REs and use a common value for the whole PRB
+    // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 6 DMRS REs and use a
+    // common value for the whole PRB
     else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1) {
-      LOG_D(PHY,"PUSCH estimation DMRS type 1, no Freq-domain interpolation\n");
+      LOG_D(PHY, "PUSCH estimation DMRS type 1, no Freq-domain interpolation\n");
       c16_t *rxF = &rxdataF[delta];
       int pil_offset = 0;
       int re_offset = k0;
@@ -297,8 +252,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
       ch = c32x16cumulVectVectWithSteps(pilot, &pil_offset, 1, rxF, &re_offset, 2, symbolSize, 6);
 
 #if NO_INTERP
-      for (c16_t *end=ul_ch+12; ul_ch<end; ul_ch++)
-        *ul_ch=ch;
+      for (c16_t *end = ul_ch + 12; ul_ch < end; ul_ch++)
+        *ul_ch = ch;
 #else
       c16multaddVectRealComplex(filt8_avlip0, &ch, ul_ch, 8);
       ul_ch += 8;
@@ -308,16 +263,16 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
       ul_ch -= 12;
 #endif
 
-      for (int pilot_cnt=6; pilot_cnt<6*(nb_rb_pusch-1); pilot_cnt += 6) {
+      for (int pilot_cnt = 6; pilot_cnt < 6 * (nb_rb_pusch - 1); pilot_cnt += 6) {
         ch = c32x16cumulVectVectWithSteps(pilot, &pil_offset, 1, rxF, &re_offset, 2, symbolSize, 6);
-        *max_ch = max(*max_ch, max(abs(ch.r), abs(ch.i)));
+        *max_ch = max(abs(ch.r), abs(ch.i));
 
 #if NO_INTERP
-      for (c16_t *end=ul_ch+12; ul_ch<end; ul_ch++)
-          *ul_ch=ch;
+        for (c16_t *end = ul_ch + 12; ul_ch < end; ul_ch++)
+          *ul_ch = ch;
 #else
-        ul_ch[3].r += (ch.r * 1365)>>15; // 1/12*16384
-        ul_ch[3].i += (ch.i * 1365)>>15; // 1/12*16384
+        ul_ch[3].r += (ch.r * 1365) >> 15; // 1/12*16384
+        ul_ch[3].i += (ch.i * 1365) >> 15; // 1/12*16384
 
         ul_ch += 4;
         c16multaddVectRealComplex(filt8_avlip3, &ch, ul_ch, 8);
@@ -329,26 +284,27 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 #endif
       }
       // Last PRB
-      ch=c32x16cumulVectVectWithSteps(pilot, &pil_offset, 1, rxF, &re_offset, 2, symbolSize, 6);
+      ch = c32x16cumulVectVectWithSteps(pilot, &pil_offset, 1, rxF, &re_offset, 2, symbolSize, 6);
 
 #if NO_INTERP
-      for (c16_t *end=ul_ch+12; ul_ch<end; ul_ch++)
-        *ul_ch=ch;
+      for (c16_t *end = ul_ch + 12; ul_ch < end; ul_ch++)
+        *ul_ch = ch;
 #else
-      ul_ch[3].r += (ch.r * 1365)>>15; // 1/12*16384
-      ul_ch[3].i += (ch.i * 1365)>>15; // 1/12*16384
+      ul_ch[3].r += (ch.r * 1365) >> 15; // 1/12*16384
+      ul_ch[3].i += (ch.i * 1365) >> 15; // 1/12*16384
 
       ul_ch += 4;
       c16multaddVectRealComplex(filt8_avlip3, &ch, ul_ch, 8);
       ul_ch += 8;
       c16multaddVectRealComplex(filt8_avlip6, &ch, ul_ch, 8);
 #endif
-    } else  { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 4 DMRS REs and use a common value for the whole PRB
-      LOG_D(PHY,"PUSCH estimation DMRS type 2, no Freq-domain interpolation");
+    } else { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 4 DMRS REs
+             // and use a common value for the whole PRB
+      LOG_D(PHY, "PUSCH estimation DMRS type 2, no Freq-domain interpolation");
       c16_t *pil = pilot;
       int re_offset = (k0 + delta) % symbolSize;
       c32_t ch0 = {0};
-      //First PRB
+      // First PRB
       ch0 = c32x16mulShift(*pil, rxdataF[re_offset], 15);
       pil++;
       re_offset = (re_offset + 1) % symbolSize;
@@ -361,10 +317,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
       pil++;
       re_offset = (re_offset + 5) % symbolSize;
 
-      c16_t ch=c16x32div(ch0, 4);
+      c16_t ch = c16x32div(ch0, 4);
 #if NO_INTERP
-      for (c16_t *end=ul_ch+12; ul_ch<end; ul_ch++)
-        *ul_ch=ch;
+      for (c16_t *end = ul_ch + 12; ul_ch < end; ul_ch++)
+        *ul_ch = ch;
 #else
       c16multaddVectRealComplex(filt8_avlip0, &ch, ul_ch, 8);
       ul_ch += 8;
@@ -374,7 +330,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
       ul_ch -= 12;
 #endif
 
-      for (int pilot_cnt=4; pilot_cnt<4*(nb_rb_pusch-1); pilot_cnt += 4) {
+      for (int pilot_cnt = 4; pilot_cnt < 4 * (nb_rb_pusch - 1); pilot_cnt += 4) {
         c32_t ch0;
         ch0 = c32x16mulShift(*pil, rxdataF[re_offset], 15);
         pil++;
@@ -390,14 +346,14 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 
         ch0 = c32x16maddShift(*pil, rxdataF[re_offset], ch0, 15);
         pil++;
-        re_offset = (re_offset+5) % symbolSize;
+        re_offset = (re_offset + 5) % symbolSize;
 
-        ch=c16x32div(ch0, 4);
-        *max_ch = max(*max_ch, max(abs(ch.r), abs(ch.i)));
+        ch = c16x32div(ch0, 4);
+        *max_ch = max(abs(ch.r), abs(ch.i));
 
 #if NO_INTERP
-        for (c16_t *end=ul_ch+12; ul_ch<end; ul_ch++)
-          *ul_ch=ch;
+        for (c16_t *end = ul_ch + 12; ul_ch < end; ul_ch++)
+          *ul_ch = ch;
 #else
         ul_ch[3] = c16maddShift(ch, (c16_t){1365, 1365}, (c16_t){0, 0}, 15); // 1365 = 1/12*16384 (full range is +/- 32768)
         ul_ch += 4;
@@ -427,10 +383,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
       pil++;
       re_offset = (re_offset + 5) % symbolSize;
 
-      ch=c16x32div(ch0, 4);
+      ch = c16x32div(ch0, 4);
 #if NO_INTERP
-      for (c16_t *end=ul_ch+12; ul_ch<end; ul_ch++)
-          *ul_ch=ch;
+      for (c16_t *end = ul_ch + 12; ul_ch < end; ul_ch++)
+        *ul_ch = ch;
 #else
       ul_ch[3] = c16maddShift(ch, (c16_t){1365, 1365}, (c16_t){0, 0}, 15); // 1365 = 1/12*16384 (full range is +/- 32768)
       ul_ch += 4;
@@ -444,12 +400,162 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
     ul_ch = &ul_ch_estimates[nl * gNB->frame_parms.nb_antennas_rx + aarx][symbol_offset];
     for (int idxP = 0; idxP < ceil((float)nb_rb_pusch * 12 / 8); idxP++) {
       for (int idxI = 0; idxI < 8; idxI++) {
-          printf("%d\t%d\t", ul_ch[idxP * 8 + idxI].r, ul_ch[idxP * 8 + idxI].i);
+        printf("%d\t%d\t", ul_ch[idxP * 8 + idxI].r, ul_ch[idxP * 8 + idxI].i);
       }
       printf("%d\n", idxP);
     }
 #endif
+    // update the values inside the arrays
+    *(rdata->noise_amp2) = noise_amp2;
+    *(rdata->nest_count) = nest_count;
+  }
+}
+
+
+int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
+                                unsigned char Ns,
+                                int nl,
+                                unsigned short p,
+                                unsigned char symbol,
+                                int ul_id,
+                                int beam_nb,
+                                unsigned short bwp_start_subcarrier,
+                                nfapi_nr_pusch_pdu_t *pusch_pdu,
+                                int *max_ch,
+                                uint32_t *nvar)
+{
+  c16_t pilot[3280] __attribute__((aligned(32)));
+
+#ifdef DEBUG_CH
+  FILE *debug_ch_est;
+  debug_ch_est = fopen("debug_ch_est.txt", "w");
+#endif
+
+  const int nb_rb_pusch = pusch_pdu->rb_size;
+
+  //------------------generate DMRS------------------//
 
+  if (pusch_pdu->transform_precoding == transformPrecoder_disabled) {
+    // Note: pilot returned by the following function is already the complex conjugate of the transmitted DMRS
+    NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
+    const uint32_t *gold = nr_gold_pusch(fp->N_RB_UL,
+                                         fp->symbols_per_slot,
+                                         gNB->gNB_config.cell_config.phy_cell_id.value,
+                                         pusch_pdu->scid,
+                                         Ns,
+                                         symbol);
+    nr_pusch_dmrs_rx(gNB,
+                     Ns,
+                     gold,
+                     pilot,
+                     (1000 + p),
+                     0,
+                     nb_rb_pusch,
+                     (pusch_pdu->bwp_start + pusch_pdu->rb_start) * NR_NB_SC_PER_RB,
+                     pusch_pdu->dmrs_config_type);
+  } else { // if transform precoding or SC-FDMA is enabled in Uplink
+    // NR_SC_FDMA supports type1 DMRS so only 6 DMRS REs per RB possible
+    const int index = get_index_for_dmrs_lowpapr_seq(nb_rb_pusch * (NR_NB_SC_PER_RB / 2));
+    const uint8_t u = pusch_pdu->dfts_ofdm.low_papr_group_number;
+    const uint8_t v = pusch_pdu->dfts_ofdm.low_papr_sequence_number;
+    c16_t *dmrs_seq = gNB_dmrs_lowpaprtype1_sequence[u][v][index];
+    LOG_D(PHY, "Transform Precoding params. u: %d, v: %d, index for dmrsseq: %d\n", u, v, index);
+    AssertFatal(index >= 0,
+                "Num RBs not configured according to 3GPP 38.211 section 6.3.1.4. For PUSCH with transform precoding, num RBs "
+                "cannot be multiple of any other primenumber other than 2,3,5\n");
+    AssertFatal(dmrs_seq != NULL, "DMRS low PAPR seq not found, check if DMRS sequences are generated");
+    nr_pusch_lowpaprtype1_dmrs_rx(gNB, Ns, dmrs_seq, pilot, 1000, 0, nb_rb_pusch, 0, pusch_pdu->dmrs_config_type);
+#ifdef DEBUG_PUSCH
+    printf("NR_UL_CHANNEL_EST: index %d, u %d,v %d\n", index, u, v);
+    LOG_M("gNb_DMRS_SEQ.m", "gNb_DMRS_SEQ", dmrs_seq, 6 * nb_rb_pusch, 1, 1);
+#endif
+  }
+  //------------------------------------------------//
+
+#ifdef DEBUG_PUSCH
+
+  for (int i = 0; i < (6 * nb_rb_pusch); i++) {
+    LOG_I(PHY, "In %s: %d + j*(%d)\n", __FUNCTION__, pilot[i].r, pilot[i].i);
+  }
+
+#endif
+
+  int nbAarx = 0;
+  int nest_count = 0;
+  uint64_t noise_amp2 = 0;
+  delay_t *delay = &gNB->ulsch[ul_id].delay;
+  memset(delay, 0, sizeof(*delay));
+
+  int nb_antennas_rx = gNB->frame_parms.nb_antennas_rx;
+  delay_t delay_arr[nb_antennas_rx];
+  uint64_t noise_amp2_arr[nb_antennas_rx];
+  int max_ch_arr[nb_antennas_rx];
+  int nest_count_arr[nb_antennas_rx];
+
+  for (int i = 0; i < nb_antennas_rx; ++i) {
+    max_ch_arr[i] = *max_ch;
+    nest_count_arr[i] = nest_count;
+    noise_amp2_arr[i] = noise_amp2;
+    delay_arr[i] = *delay;
+  }
+
+  notifiedFIFO_t respPuschAarx;
+  initNotifiedFIFO(&respPuschAarx);
+  start_meas(&gNB->pusch_channel_estimation_antenna_processing_stats);
+  int numAntennas = gNB->dmrs_num_antennas_per_thread;
+  for (int aarx = 0; aarx < gNB->frame_parms.nb_antennas_rx; aarx += numAntennas) {
+    union puschAntennaReqUnion id = {.s = {ul_id, 0}};
+    id.p = 1 + aarx;
+    notifiedFIFO_elt_t *req = newNotifiedFIFO_elt(sizeof(puschAntennaProc_t),
+                                                  id.p,
+                                                  &respPuschAarx,
+                                                  &nr_pusch_antenna_processing); // create a job for Tpool
+    puschAntennaProc_t *rdata = (puschAntennaProc_t *)NotifiedFifoData(req); // data for the job
+
+    // Local init in the current loop
+    rdata->Ns = Ns;
+    rdata->nl = nl;
+    rdata->p = p;
+    rdata->symbol = symbol;
+    rdata->aarx = aarx;
+    rdata->numAntennas = numAntennas;
+    rdata->bwp_start_subcarrier = bwp_start_subcarrier;
+    rdata->pusch_pdu = pusch_pdu;
+    rdata->max_ch = &max_ch_arr[rdata->aarx];
+    rdata->pilot = pilot;
+    rdata->nest_count = &nest_count_arr[rdata->aarx];
+    rdata->noise_amp2 = &noise_amp2_arr[rdata->aarx];
+    rdata->delay = &delay_arr[rdata->aarx];
+    rdata->beam_nb = beam_nb;
+    rdata->frame_parms = &gNB->frame_parms;
+    rdata->pusch_vars = &gNB->pusch_vars[ul_id];
+    rdata->chest_freq = gNB->chest_freq;
+    rdata->rxdataF = gNB->common_vars.rxdataF;
+    // Call the nr_pusch_antenna_processing function
+    pushTpool(&gNB->threadPool, req);
+    nbAarx++;
+
+    LOG_D(PHY, "Added Antenna (count %d) to process, in pipe\n", nbAarx);
+  } // Antenna Loop
+
+  while (nbAarx > 0) {
+    notifiedFIFO_elt_t *req = pullTpool(&respPuschAarx, &gNB->threadPool);
+    nbAarx--;
+    delNotifiedFIFO_elt(req);
+  }
+
+  stop_meas(&gNB->pusch_channel_estimation_antenna_processing_stats);
+  for (int aarx = 0; aarx < gNB->frame_parms.nb_antennas_rx; aarx++) {
+    *max_ch = max(*max_ch, max_ch_arr[aarx]);
+    noise_amp2 += noise_amp2_arr[aarx];
+    nest_count += nest_count_arr[aarx];
+  }
+  // get the maximum delay
+  *delay = delay_arr[0];
+  for (int aarx = 1; aarx < gNB->frame_parms.nb_antennas_rx; aarx++) {
+    if (delay_arr[aarx].est_delay >= delay->est_delay) {
+      *delay = delay_arr[aarx];
+    }
   }
 
 #ifdef DEBUG_CH
@@ -463,7 +569,6 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
   return 0;
 }
 
-
 /*******************************************************************
  *
  * NAME :         nr_pusch_ptrs_processing
@@ -495,51 +600,46 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
                               uint32_t nb_re_pusch)
 {
   NR_gNB_PUSCH *pusch_vars = &gNB->pusch_vars[ulsch_id];
-  int32_t *ptrs_re_symbol   = NULL;
-  int8_t   ret = 0;
-  uint8_t  symbInSlot       = rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols;
-  uint8_t *startSymbIndex   = &rel15_ul->start_symbol_index;
-  uint8_t *nbSymb           = &rel15_ul->nr_of_symbols;
-  uint8_t  *L_ptrs          = &rel15_ul->pusch_ptrs.ptrs_time_density;
-  uint8_t  *K_ptrs          = &rel15_ul->pusch_ptrs.ptrs_freq_density;
-  uint16_t *dmrsSymbPos     = &rel15_ul->ul_dmrs_symb_pos;
+  int32_t *ptrs_re_symbol = NULL;
+  int8_t ret = 0;
+  uint8_t symbInSlot = rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols;
+  uint8_t *startSymbIndex = &rel15_ul->start_symbol_index;
+  uint8_t *nbSymb = &rel15_ul->nr_of_symbols;
+  uint8_t *L_ptrs = &rel15_ul->pusch_ptrs.ptrs_time_density;
+  uint8_t *K_ptrs = &rel15_ul->pusch_ptrs.ptrs_freq_density;
+  uint16_t *dmrsSymbPos = &rel15_ul->ul_dmrs_symb_pos;
   uint16_t *ptrsSymbPos = &pusch_vars->ptrs_symbols;
   uint8_t *ptrsSymbIdx = &pusch_vars->ptrs_symbol_index;
-  uint16_t *nb_rb           = &rel15_ul->rb_size;
-  uint8_t  *ptrsReOffset    = &rel15_ul->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset;
+  uint16_t *nb_rb = &rel15_ul->rb_size;
+  uint8_t *ptrsReOffset = &rel15_ul->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset;
 
   /* loop over antennas */
-  for (int aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
+  for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
     c16_t *phase_per_symbol = (c16_t *)pusch_vars->ptrs_phase_per_slot[aarx];
     ptrs_re_symbol = &pusch_vars->ptrs_re_per_slot;
     *ptrs_re_symbol = 0;
-    phase_per_symbol[symbol].i = 0; 
+    phase_per_symbol[symbol].i = 0;
     /* set DMRS estimates to 0 angle with magnitude 1 */
-    if(is_dmrs_symbol(symbol,*dmrsSymbPos)) {
+    if (is_dmrs_symbol(symbol, *dmrsSymbPos)) {
       /* set DMRS real estimation to 32767 */
-      phase_per_symbol[symbol].r=INT16_MAX; // 32767
+      phase_per_symbol[symbol].r = INT16_MAX; // 32767
 #ifdef DEBUG_UL_PTRS
-      printf("[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d\n", symbol, phase_per_symbol[symbol].r,phase_per_symbol[symbol].i);
+      printf("[PHY][PTRS]: DMRS Symbol %d -> %4d + j*%4d\n", symbol, phase_per_symbol[symbol].r, phase_per_symbol[symbol].i);
 #endif
-    }
-    else {// real ptrs value is set to 0
-      phase_per_symbol[symbol].r = 0; 
+    } else { // real ptrs value is set to 0
+      phase_per_symbol[symbol].r = 0;
     }
 
-    if(symbol == *startSymbIndex) {
+    if (symbol == *startSymbIndex) {
       *ptrsSymbPos = 0;
-      set_ptrs_symb_idx(ptrsSymbPos,
-                        *nbSymb,
-                        *startSymbIndex,
-                        1<< *L_ptrs,
-                        *dmrsSymbPos);
+      set_ptrs_symb_idx(ptrsSymbPos, *nbSymb, *startSymbIndex, 1 << *L_ptrs, *dmrsSymbPos);
     }
 
     /* if not PTRS symbol set current ptrs symbol index to zero*/
     *ptrsSymbIdx = 0;
 
     /* Check if current symbol contains PTRS */
-    if(is_ptrs_symbol(symbol, *ptrsSymbPos)) {
+    if (is_ptrs_symbol(symbol, *ptrsSymbPos)) {
       *ptrsSymbIdx = symbol;
       /*------------------------------------------------------------------------------------------------------- */
       /* 1) Estimate common phase error per PTRS symbol                                                                */
@@ -564,27 +664,27 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
     }
 
     /* For last OFDM symbol at each antenna perform interpolation and compensation for the slot*/
-    if(symbol == (symbInSlot -1)) {
+    if (symbol == (symbInSlot - 1)) {
       /*------------------------------------------------------------------------------------------------------- */
       /* 2) Interpolate PTRS estimated value in TD */
       /*------------------------------------------------------------------------------------------------------- */
       /* If L-PTRS is > 0 then we need interpolation */
-      if(*L_ptrs > 0) {
-        ret = nr_ptrs_process_slot(*dmrsSymbPos, *ptrsSymbPos, (int16_t*)phase_per_symbol, *startSymbIndex, *nbSymb);
-        if(ret != 0) {
-          LOG_W(PHY,"[PTRS] Compensation is skipped due to error in PTRS slot processing !!\n");
+      if (*L_ptrs > 0) {
+        ret = nr_ptrs_process_slot(*dmrsSymbPos, *ptrsSymbPos, (int16_t *)phase_per_symbol, *startSymbIndex, *nbSymb);
+        if (ret != 0) {
+          LOG_W(PHY, "[PTRS] Compensation is skipped due to error in PTRS slot processing !!\n");
         }
       }
 
       /*------------------------------------------------------------------------------------------------------- */
       /* 3) Compensated DMRS based estimated signal with PTRS estimation                                        */
       /*--------------------------------------------------------------------------------------------------------*/
-      for(uint8_t i = *startSymbIndex; i < symbInSlot; i++) {
+      for (uint8_t i = *startSymbIndex; i < symbInSlot; i++) {
         /* DMRS Symbol has 0 phase so no need to rotate the respective symbol */
         /* Skip rotation if the slot processing is wrong */
-        if((!is_dmrs_symbol(i,*dmrsSymbPos)) && (ret == 0)) {
+        if ((!is_dmrs_symbol(i, *dmrsSymbPos)) && (ret == 0)) {
 #ifdef DEBUG_UL_PTRS
-          printf("[PHY][UL][PTRS]: Rotate Symbol %2d with  %d + j* %d\n", i, phase_per_symbol[i].r,phase_per_symbol[i].i);
+          printf("[PHY][UL][PTRS]: Rotate Symbol %2d with  %d + j* %d\n", i, phase_per_symbol[i].r, phase_per_symbol[i].i);
 #endif
           rotate_cpx_vector((c16_t *)&pusch_vars->rxdataF_comp[aarx][i * nb_re_pusch],
                             &phase_per_symbol[i],
@@ -613,22 +713,22 @@ int nr_srs_channel_estimation(
     int8_t *snr)
 {
 #ifdef SRS_DEBUG
-  LOG_I(NR_PHY,"Calling %s function\n", __FUNCTION__);
+  LOG_I(NR_PHY, "Calling %s function\n", __FUNCTION__);
 #endif
 
   const NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
-  const uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*NR_NB_SC_PER_RB;
+  const uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start * NR_NB_SC_PER_RB;
 
-  const uint8_t N_ap = 1<<srs_pdu->num_ant_ports;
-  const uint8_t K_TC = 2<<srs_pdu->comb_size;
+  const uint8_t N_ap = 1 << srs_pdu->num_ant_ports;
+  const uint8_t K_TC = 2 << srs_pdu->comb_size;
   const uint16_t m_SRS_b = get_m_srs(srs_pdu->config_index, srs_pdu->bandwidth_index);
-  const uint16_t M_sc_b_SRS = m_SRS_b * NR_NB_SC_PER_RB/K_TC;
+  const uint16_t M_sc_b_SRS = m_SRS_b * NR_NB_SC_PER_RB / K_TC;
   uint8_t fd_cdm = N_ap;
   if (N_ap == 4 && ((K_TC == 2 && srs_pdu->cyclic_shift >= 4) || (K_TC == 4 && srs_pdu->cyclic_shift >= 6))) {
     fd_cdm = 2;
   }
 
-  c16_t srs_ls_estimated_channel[frame_parms->ofdm_symbol_size*(1<<srs_pdu->num_symbols)];
+  c16_t srs_ls_estimated_channel[frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols)];
   uint32_t noise_power_per_rb[srs_pdu->bwp_size];
 
   const uint32_t arr_len = frame_parms->nb_antennas_rx * N_ap * M_sc_b_SRS;
@@ -639,7 +739,8 @@ int nr_srs_channel_estimation(
   c16_t noise[arr_len];
   memset(noise, 0, arr_len * sizeof(c16_t));
 
-  uint8_t mem_offset = ((16 - ((long)&srs_estimated_channel_freq[0][0][subcarrier_offset + nr_srs_info->k_0_p[0][0]])) & 0xF) >> 2; // >> 2 <=> /sizeof(int32_t)
+  uint8_t mem_offset = ((16 - ((long)&srs_estimated_channel_freq[0][0][subcarrier_offset + nr_srs_info->k_0_p[0][0]])) & 0xF)
+                       >> 2; // >> 2 <=> /sizeof(int32_t)
 
   // filt16_end is {4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0}
   // The End of OFDM symbol corresponds to the position of last 16384 in the filter
@@ -649,26 +750,23 @@ int nr_srs_channel_estimation(
   c16_t ls_estimated = {0};
 
   for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) {
-
     for (int p_index = 0; p_index < N_ap; p_index++) {
-
-      memset(srs_ls_estimated_channel, 0, frame_parms->ofdm_symbol_size*(1<<srs_pdu->num_symbols)*sizeof(c16_t));
-      memset(srs_est, 0, (frame_parms->ofdm_symbol_size*(1<<srs_pdu->num_symbols) + mem_offset)*sizeof(int32_t));
+      memset(srs_ls_estimated_channel, 0, frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols) * sizeof(c16_t));
+      memset(srs_est, 0, (frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols) + mem_offset) * sizeof(int32_t));
 
 #ifdef SRS_DEBUG
-      LOG_I(NR_PHY,"====================== UE port %d --> gNB Rx antenna %i ======================\n", p_index, ant);
+      LOG_I(NR_PHY, "====================== UE port %d --> gNB Rx antenna %i ======================\n", p_index, ant);
 #endif
 
       uint16_t subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][0];
-      if (subcarrier>frame_parms->ofdm_symbol_size) {
+      if (subcarrier > frame_parms->ofdm_symbol_size) {
         subcarrier -= frame_parms->ofdm_symbol_size;
       }
 
       c16_t *srs_estimated_channel16 = (c16_t *)&srs_est[subcarrier + mem_offset];
 
       for (int k = 0; k < M_sc_b_SRS; k++) {
-
-        if (k%fd_cdm==0) {
+        if (k % fd_cdm == 0) {
           ls_estimated = (c16_t){0, 0};
           uint16_t subcarrier_cdm = subcarrier;
 
@@ -676,18 +774,21 @@ int nr_srs_channel_estimation(
             int16_t generated_real = srs_generated_signal[p_index][subcarrier_cdm].r;
             int16_t generated_imag = srs_generated_signal[p_index][subcarrier_cdm].i;
 
-            int16_t received_real = ((c16_t*)srs_received_signal[ant])[subcarrier_cdm].r;
-            int16_t received_imag = ((c16_t*)srs_received_signal[ant])[subcarrier_cdm].i;
+            int16_t received_real = ((c16_t *)srs_received_signal[ant])[subcarrier_cdm].r;
+            int16_t received_imag = ((c16_t *)srs_received_signal[ant])[subcarrier_cdm].i;
 
-            // We know that nr_srs_info->srs_generated_signal_bits bits are enough to represent the generated_real and generated_imag.
-            // So we only need a nr_srs_info->srs_generated_signal_bits shift to ensure that the result fits into 16 bits.
-            ls_estimated.r += (int16_t)(((int32_t)generated_real*received_real + (int32_t)generated_imag*received_imag)>>nr_srs_info->srs_generated_signal_bits);
-            ls_estimated.i += (int16_t)(((int32_t)generated_real*received_imag - (int32_t)generated_imag*received_real)>>nr_srs_info->srs_generated_signal_bits);
+            // We know that nr_srs_info->srs_generated_signal_bits bits are enough to represent the generated_real and
+            // generated_imag. So we only need a nr_srs_info->srs_generated_signal_bits shift to ensure that the result fits into 16
+            // bits.
+            ls_estimated.r += (int16_t)(((int32_t)generated_real * received_real + (int32_t)generated_imag * received_imag)
+                                        >> nr_srs_info->srs_generated_signal_bits);
+            ls_estimated.i += (int16_t)(((int32_t)generated_real * received_imag - (int32_t)generated_imag * received_real)
+                                        >> nr_srs_info->srs_generated_signal_bits);
 
             // Subcarrier increment
             subcarrier_cdm += K_TC;
             if (subcarrier_cdm >= frame_parms->ofdm_symbol_size) {
-              subcarrier_cdm=subcarrier_cdm-frame_parms->ofdm_symbol_size;
+              subcarrier_cdm = subcarrier_cdm - frame_parms->ofdm_symbol_size;
             }
           }
         }
@@ -695,19 +796,23 @@ int nr_srs_channel_estimation(
         srs_ls_estimated_channel[subcarrier] = ls_estimated;
 
 #ifdef SRS_DEBUG
-        int subcarrier_log = subcarrier-subcarrier_offset;
-        if(subcarrier_log < 0) {
+        int subcarrier_log = subcarrier - subcarrier_offset;
+        if (subcarrier_log < 0) {
           subcarrier_log = subcarrier_log + frame_parms->ofdm_symbol_size;
         }
-        if(subcarrier_log%12 == 0) {
-          LOG_I(NR_PHY,"------------------------------------ %d ------------------------------------\n", subcarrier_log/12);
-          LOG_I(NR_PHY,"\t  __genRe________genIm__|____rxRe_________rxIm__|____lsRe________lsIm_\n");
+        if (subcarrier_log % 12 == 0) {
+          LOG_I(NR_PHY, "------------------------------------ %d ------------------------------------\n", subcarrier_log / 12);
+          LOG_I(NR_PHY, "\t  __genRe________genIm__|____rxRe_________rxIm__|____lsRe________lsIm_\n");
         }
-        LOG_I(NR_PHY,"(%4i) %6i\t%6i  |  %6i\t%6i  |  %6i\t%6i\n",
+        LOG_I(NR_PHY,
+              "(%4i) %6i\t%6i  |  %6i\t%6i  |  %6i\t%6i\n",
               subcarrier_log,
-              ((c16_t*)srs_generated_signal[p_index])[subcarrier].r, ((c16_t*)srs_generated_signal[p_index])[subcarrier].i,
-              ((c16_t*)srs_received_signal[ant])[subcarrier].r, ((c16_t*)srs_received_signal[ant])[subcarrier].i,
-              ls_estimated.r, ls_estimated.i);
+              ((c16_t *)srs_generated_signal[p_index])[subcarrier].r,
+              ((c16_t *)srs_generated_signal[p_index])[subcarrier].i,
+              ((c16_t *)srs_received_signal[ant])[subcarrier].r,
+              ((c16_t *)srs_received_signal[ant])[subcarrier].i,
+              ls_estimated.r,
+              ls_estimated.i);
 #endif
 
         const uint16_t sc_offset = subcarrier + mem_offset;
@@ -722,7 +827,8 @@ int nr_srs_channel_estimation(
             srs_estimated_channel16 = (c16_t *)&srs_est[subcarrier];
             const short *filter = mem_offset == 0 ? filt8_start : filt8_start_shift2;
             c16multaddVectRealComplex(filter, &ls_estimated, srs_estimated_channel16, 8);
-          } else if ((subcarrier + K_TC) >= frame_parms->ofdm_symbol_size || k == (M_sc_b_SRS - 1)) { // End of OFDM symbol or last subcarrier cases
+          } else if ((subcarrier + K_TC) >= frame_parms->ofdm_symbol_size
+                     || k == (M_sc_b_SRS - 1)) { // End of OFDM symbol or last subcarrier cases
             // filt8_end is {4096,8192,12288,16384,0,0,0,0}
             const short *filter = mem_offset == 0 || k == (M_sc_b_SRS - 1) ? filt8_end : filt8_end_shift2;
             c16multaddVectRealComplex(filter, &ls_estimated, srs_estimated_channel16, 8);
@@ -742,7 +848,8 @@ int nr_srs_channel_estimation(
             srs_estimated_channel16 = (c16_t *)&srs_est[sc_offset];
             // filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0}
             c16multaddVectRealComplex(filt16_start, &ls_estimated, srs_estimated_channel16, 16);
-          } else if ((subcarrier + K_TC) >= frame_parms->ofdm_symbol_size || k == (M_sc_b_SRS - 1)) { // End of OFDM symbol or last subcarrier cases
+          } else if ((subcarrier + K_TC) >= frame_parms->ofdm_symbol_size
+                     || k == (M_sc_b_SRS - 1)) { // End of OFDM symbol or last subcarrier cases
             // filt16_end is {4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0}
             c16multaddVectRealComplex(filt16_end, &ls_estimated, srs_estimated_channel16, 16);
           } else { // Middle case
@@ -755,18 +862,18 @@ int nr_srs_channel_estimation(
         // Subcarrier increment
         subcarrier += K_TC;
         if (subcarrier >= frame_parms->ofdm_symbol_size) {
-          subcarrier=subcarrier-frame_parms->ofdm_symbol_size;
+          subcarrier = subcarrier - frame_parms->ofdm_symbol_size;
         }
 
       } // for (int k = 0; k < M_sc_b_SRS; k++)
 
       memcpy(&srs_estimated_channel_freq[ant][p_index][0],
              &srs_est[mem_offset],
-             (frame_parms->ofdm_symbol_size*(1<<srs_pdu->num_symbols))*sizeof(int32_t));
+             (frame_parms->ofdm_symbol_size * (1 << srs_pdu->num_symbols)) * sizeof(int32_t));
 
       // Compute noise
       subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][0];
-      if (subcarrier>frame_parms->ofdm_symbol_size) {
+      if (subcarrier > frame_parms->ofdm_symbol_size) {
         subcarrier -= frame_parms->ofdm_symbol_size;
       }
       uint16_t base_idx = ant * N_ap * M_sc_b_SRS + p_index * M_sc_b_SRS;
@@ -782,23 +889,23 @@ int nr_srs_channel_estimation(
 
 #ifdef SRS_DEBUG
       subcarrier = subcarrier_offset + nr_srs_info->k_0_p[p_index][0];
-      if (subcarrier>frame_parms->ofdm_symbol_size) {
+      if (subcarrier > frame_parms->ofdm_symbol_size) {
         subcarrier -= frame_parms->ofdm_symbol_size;
       }
 
-      for (int k = 0; k < K_TC*M_sc_b_SRS; k++) {
-
-        int subcarrier_log = subcarrier-subcarrier_offset;
-        if(subcarrier_log < 0) {
+      for (int k = 0; k < K_TC * M_sc_b_SRS; k++) {
+        int subcarrier_log = subcarrier - subcarrier_offset;
+        if (subcarrier_log < 0) {
           subcarrier_log = subcarrier_log + frame_parms->ofdm_symbol_size;
         }
 
-        if(subcarrier_log%12 == 0) {
-          LOG_I(NR_PHY,"------------------------------------- %d -------------------------------------\n", subcarrier_log/12);
-          LOG_I(NR_PHY,"\t  __lsRe__________lsIm__|____intRe_______intIm__|____noiRe_______noiIm__\n");
+        if (subcarrier_log % 12 == 0) {
+          LOG_I(NR_PHY, "------------------------------------- %d -------------------------------------\n", subcarrier_log / 12);
+          LOG_I(NR_PHY, "\t  __lsRe__________lsIm__|____intRe_______intIm__|____noiRe_______noiIm__\n");
         }
 
-        LOG_I(NR_PHY,"(%4i) %6i\t%6i  |  %6i\t%6i  |  %6i\t%6i\n",
+        LOG_I(NR_PHY,
+              "(%4i) %6i\t%6i  |  %6i\t%6i  |  %6i\t%6i\n",
               subcarrier_log,
               srs_ls_estimated_channel[subcarrier].r,
               srs_ls_estimated_channel[subcarrier].i,
@@ -810,23 +917,23 @@ int nr_srs_channel_estimation(
         // Subcarrier increment
         subcarrier++;
         if (subcarrier >= frame_parms->ofdm_symbol_size) {
-          subcarrier=subcarrier-frame_parms->ofdm_symbol_size;
+          subcarrier = subcarrier - frame_parms->ofdm_symbol_size;
         }
       }
 #endif
 
       // Convert to time domain
       freq2time(gNB->frame_parms.ofdm_symbol_size,
-                (int16_t*) srs_estimated_channel_freq[ant][p_index],
-                (int16_t*) srs_estimated_channel_time[ant][p_index]);
+                (int16_t *)srs_estimated_channel_freq[ant][p_index],
+                (int16_t *)srs_estimated_channel_time[ant][p_index]);
 
       memcpy(&srs_estimated_channel_time_shifted[ant][p_index][0],
-             &srs_estimated_channel_time[ant][p_index][gNB->frame_parms.ofdm_symbol_size>>1],
-             (gNB->frame_parms.ofdm_symbol_size>>1)*sizeof(int32_t));
+             &srs_estimated_channel_time[ant][p_index][gNB->frame_parms.ofdm_symbol_size >> 1],
+             (gNB->frame_parms.ofdm_symbol_size >> 1) * sizeof(int32_t));
 
-      memcpy(&srs_estimated_channel_time_shifted[ant][p_index][gNB->frame_parms.ofdm_symbol_size>>1],
+      memcpy(&srs_estimated_channel_time_shifted[ant][p_index][gNB->frame_parms.ofdm_symbol_size >> 1],
              &srs_estimated_channel_time[ant][p_index][0],
-             (gNB->frame_parms.ofdm_symbol_size>>1)*sizeof(int32_t));
+             (gNB->frame_parms.ofdm_symbol_size >> 1) * sizeof(int32_t));
 
     } // for (int p_index = 0; p_index < N_ap; p_index++)
   } // for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++)
@@ -835,7 +942,7 @@ int nr_srs_channel_estimation(
   uint32_t signal_power = max(signal_energy_nodc(ch, arr_len), 1);
 
 #ifdef SRS_DEBUG
-  LOG_I(NR_PHY,"signal_power = %u\n", signal_power);
+  LOG_I(NR_PHY, "signal_power = %u\n", signal_power);
 #endif
 
   if (signal_power == 0) {
@@ -845,14 +952,13 @@ int nr_srs_channel_estimation(
 
   // Compute noise power
   const uint8_t srs_symbols_per_rb = srs_pdu->comb_size == 0 ? 6 : 3;
-  const uint8_t n_noise_est = frame_parms->nb_antennas_rx*N_ap*srs_symbols_per_rb;
+  const uint8_t n_noise_est = frame_parms->nb_antennas_rx * N_ap * srs_symbols_per_rb;
   uint64_t sum_re = 0;
   uint64_t sum_re2 = 0;
   uint64_t sum_im = 0;
   uint64_t sum_im2 = 0;
 
   for (int rb = 0; rb < m_SRS_b; rb++) {
-
     sum_re = 0;
     sum_re2 = 0;
     sum_im = 0;
@@ -870,12 +976,13 @@ int nr_srs_channel_estimation(
       } // for (int p_index = 0; p_index < N_ap; p_index++)
     } // for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++)
 
-    noise_power_per_rb[rb] = max(sum_re2 / n_noise_est - (sum_re / n_noise_est) * (sum_re / n_noise_est) +
-                                 sum_im2 / n_noise_est - (sum_im / n_noise_est) * (sum_im / n_noise_est), 1);
+    noise_power_per_rb[rb] = max(sum_re2 / n_noise_est - (sum_re / n_noise_est) * (sum_re / n_noise_est) + sum_im2 / n_noise_est
+                                     - (sum_im / n_noise_est) * (sum_im / n_noise_est),
+                                 1);
     snr_per_rb[rb] = dB_fixed(signal_power) - dB_fixed(noise_power_per_rb[rb]);
 
 #ifdef SRS_DEBUG
-    LOG_I(NR_PHY,"noise_power_per_rb[%i] = %i, snr_per_rb[%i] = %i dB\n", rb, noise_power_per_rb[rb], rb, snr_per_rb[rb]);
+    LOG_I(NR_PHY, "noise_power_per_rb[%i] = %i, snr_per_rb[%i] = %i dB\n", rb, noise_power_per_rb[rb], rb, snr_per_rb[rb]);
 #endif
 
   } // for (int rb = 0; rb < m_SRS_b; rb++)
@@ -885,7 +992,7 @@ int nr_srs_channel_estimation(
   *snr = dB_fixed(signal_power) - dB_fixed(noise_power);
 
 #ifdef SRS_DEBUG
-  LOG_I(NR_PHY,"noise_power = %u, SNR = %i dB\n", noise_power, *snr);
+  LOG_I(NR_PHY, "noise_power = %u, SNR = %i dB\n", noise_power, *snr);
 #endif
 
   return 0;
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
index 82407980feb113f38f5a4fdf0420969cca400fd6..6a57c1eafeb5b1cb4f50ef95d2c5489055b4eb59 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
@@ -1486,14 +1486,16 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
 
   int total_res = 0;
   for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < end_symbol; symbol += numSymbols) {
+    int res_per_task = 0;
     for (int s = 0; s < numSymbols; s++) { 
       pusch_vars->ul_valid_re_per_slot[symbol+s] = get_nb_re_pusch(frame_parms,rel15_ul,symbol+s);
       pusch_vars->llr_offset[symbol+s] = ((symbol+s) == rel15_ul->start_symbol_index) ? 
                                          0 : 
                                          pusch_vars->llr_offset[symbol+s-1] + pusch_vars->ul_valid_re_per_slot[symbol+s-1] * rel15_ul->qam_mod_order;
-      total_res+=pusch_vars->ul_valid_re_per_slot[symbol+s];
+      res_per_task += pusch_vars->ul_valid_re_per_slot[symbol + s];
     }
-    if (total_res > 0) {
+    total_res += res_per_task;
+    if (res_per_task > 0) {
       union puschSymbolReqUnion id = {.s={ulsch_id,frame,slot,0}};
       id.p=1+symbol;
       notifiedFIFO_elt_t *req = newNotifiedFIFO_elt(sizeof(puschSymbolProc_t), id.p, &gNB->respPuschSymb, &nr_pusch_symbol_processing); // create a job for Tpool
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index 243e3f9a230e4f3d83cfc698a3e787b75d9543f9..58114dfeb526f2474afd279046abf917962c0d48 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -285,7 +285,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
   }
 
   // HARQ stats
-  phy_vars_ue->dl_stats[harq_process->DLround]++;
   LOG_D(PHY, "Round %d RV idx %d\n", harq_process->DLround, dlsch->dlsch_config.rv);
   uint16_t nb_rb;// = 30;
   uint8_t dmrs_Type = dlsch->dlsch_config.dmrsConfigType;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
index 9bc764fa3514f9ee5ddd9c3fe9fafd2b9997817b..c0019fb3ec1d8025fecc9c2eb6db47f80a7fb0fd 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
@@ -28,6 +28,8 @@
  * \note
  * \warning
  */
+
+#include "common/platform_constants.h"
 #include "nr_phy_common.h"
 #include "PHY/defs_nr_UE.h"
 #include "PHY/phy_extern.h"
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
index 6c26a3e59d9223dbf71db012f7a8600e42b3f3ed..176ed67cf3d469d0200c3c62fb9122a005ad227c 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
@@ -200,13 +200,6 @@ int nr_rx_pbch(PHY_VARS_NR_UE *ue,
 #define modOrder(I_MCS,I_TBS) ((I_MCS-I_TBS)*2+2) // Find modulation order from I_TBS and I_MCS
 #endif
 
-int dump_ue_stats(PHY_VARS_NR_UE *phy_vars_ue,
-                  const UE_nr_rxtx_proc_t *proc,
-                  char *buffer,
-                  int length,
-                  runmode_t mode,
-                  int input_level_dBm);
-
 /*!
   \brief This function performs the initial cell search procedure - PSS detection, SSS detection and PBCH detection.  At the
   end, the basic frame parameters are known (Frame configuration - TDD/FDD and cyclic prefix length,
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index 7022ad8b2382fa37494b350caa29718801322ddc..81d193634a3160f26ea30390a63ef9aae8ce1dd8 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -33,6 +33,7 @@
 #ifndef __PHY_DEFS_GNB__H__
 #define __PHY_DEFS_GNB__H__
 
+#include "common/platform_constants.h"
 #include "defs_nr_common.h"
 #include "CODING/nrPolar_tools/nr_polar_pbch_defs.h"
 #include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h"
@@ -543,6 +544,7 @@ typedef struct PHY_VARS_gNB_s {
   time_stats_t ulsch_decoding_stats;
   time_stats_t ulsch_deinterleaving_stats;
   time_stats_t ulsch_channel_estimation_stats;
+  time_stats_t pusch_channel_estimation_antenna_processing_stats;
   time_stats_t ulsch_llr_stats;
   time_stats_t rx_srs_stats;
   time_stats_t generate_srs_stats;
@@ -562,7 +564,10 @@ typedef struct PHY_VARS_gNB_s {
   notifiedFIFO_t L1_rx_out;
   notifiedFIFO_t resp_RU_tx;
   tpool_t threadPool;
+  int nbSymb;
+  int nbAarx;
   int num_pusch_symbols_per_thread;
+  int dmrs_num_antennas_per_thread;
   pthread_t L1_rx_thread;
   int L1_rx_thread_core;
   pthread_t L1_tx_thread;
@@ -585,6 +590,37 @@ union puschSymbolReqUnion {
   uint64_t p;
 };
 
+typedef struct puschAntennaProc_s {
+  unsigned char Ns;
+  int nl;
+  unsigned short p;
+  unsigned char symbol;
+  unsigned short bwp_start_subcarrier;
+  int aarx;
+  int beam_nb;
+  int numAntennas;
+  nfapi_nr_pusch_pdu_t *pusch_pdu;
+  int *max_ch;
+  c16_t *pilot;
+  int *nest_count;
+  uint64_t *noise_amp2;
+  delay_t *delay;
+  int chest_freq;
+  NR_gNB_PUSCH *pusch_vars;
+  NR_DL_FRAME_PARMS *frame_parms;
+  c16_t ***rxdataF;
+} puschAntennaProc_t;
+
+struct puschAntennaReqId {
+  uint16_t ul_id;
+  uint16_t spare;
+} __attribute__((packed));
+
+union puschAntennaReqUnion {
+  struct puschAntennaReqId s;
+  uint64_t p;
+};
+
 typedef struct LDPCDecode_s {
   PHY_VARS_gNB *gNB;
   NR_UL_gNB_HARQ_t *ulsch_harq;
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index 12b10e4b96c9e480ebf3c8ec82df571a68b0fd4a..7178faefd12f1e9266a1463ca8b92373225fa1e0 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -520,8 +520,6 @@ typedef struct PHY_VARS_NR_UE_s {
   SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX];
   SLIST_HEAD(ral_thresholds_lte_poll_s, ral_threshold_phy_t) ral_thresholds_lte_polled[RAL_LINK_PARAM_LTE_MAX];
 #endif
-  int dl_errors;
-  _Atomic(int) dl_stats[16];
   void* scopeData;
   // Pointers to hold PDSCH data only for phy simulators
   void *phy_sim_rxdataF;
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 2be6faeb9c3264736e81bb652f0c28291fe770af..a737b5246eacfa1229858f475a96cf57ed275190 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -1010,22 +1010,6 @@ int pbch_pdcch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_
     } // for rsc_id
   } // for gNB_id
 
-  if ((frame_rx%64 == 0) && (nr_slot_rx==0)) {
-    LOG_I(NR_PHY,"============================================\n");
-    // fixed text + 8 HARQs rounds à 10 ("999999999/") + NULL
-    // if we use 999999999 HARQs, that should be sufficient for at least 138 hours
-    const size_t harq_output_len = 31 + 10 * 8 + 1;
-    char output[harq_output_len];
-    char *p = output;
-    const char *end = output + harq_output_len;
-    p += snprintf(p, end - p, "[UE %d] Harq round stats for Downlink: %d", ue->Mod_id, ue->dl_stats[0]);
-    for (int round = 1; round < 16 && (round < 3 || ue->dl_stats[round] != 0); ++round)
-      p += snprintf(p, end - p,"/%d", ue->dl_stats[round]);
-    LOG_I(NR_PHY,"%s\n", output);
-
-    LOG_I(NR_PHY,"============================================\n");
-  }
-
   LOG_D(PHY," ------ --> PDCCH ChannelComp/LLR Frame.slot %d.%d ------  \n", frame_rx%1024, nr_slot_rx);
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDCCH, VCD_FUNCTION_IN);
 
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index a67c5be9dae696960d36444e882ff60bb06ed128..c445bfb6a045f121b58c32c75ab117e0a7745a5b 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -19,59 +19,81 @@
  *      contact@openairinterface.org
  */
 
-#include <fcntl.h>
+#include <errno.h>
+#include <limits.h>
 #include <math.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <unistd.h>
-#include "common/ran_context.h"
-#include "common/config/config_userapi.h"
+#include "common/utils/assertions.h"
 #include "common/utils/nr/nr_common.h"
 #include "common/utils/var_array.h"
-#include "common/utils/LOG/log.h"
-#include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
+#include "executables/nr-uesoftmodem.h"
+#include "executables/softmodem-common.h"
 #include "LAYER2/NR_MAC_UE/mac_defs.h"
-#include "LAYER2/NR_MAC_UE/mac_extern.h"
+#include "LAYER2/NR_MAC_UE/mac_proto.h"
+#include "LAYER2/NR_MAC_gNB/mac_proto.h"
+#include "LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h"
+#include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
+#include "NR_BCCH-BCH-Message.h"
+#include "NR_BWP-Downlink.h"
+#include "NR_CellGroupConfig.h"
+#include "NR_MAC_COMMON/nr_mac.h"
+#include "NR_MAC_COMMON/nr_mac_common.h"
+#include "NR_PHY_INTERFACE/NR_IF_Module.h"
+#include "NR_ReconfigurationWithSync.h"
+#include "NR_ServingCellConfig.h"
+#include "NR_SetupRelease.h"
+#include "NR_UE_PHY_INTERFACE/NR_IF_Module.h"
+#include "PHY/CODING/nrLDPC_extern.h"
+#include "PHY/INIT/nr_phy_init.h"
+#include "PHY/MODULATION/modulation_common.h"
+#include "PHY/NR_REFSIG/ptrs_nr.h"
+#include "PHY/NR_TRANSPORT/nr_dlsch.h"
+#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
+#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
+#include "PHY/TOOLS/tools_defs.h"
+#include "PHY/defs_RU.h"
+#include "PHY/defs_common.h"
 #include "PHY/defs_gNB.h"
-#include "PHY/defs_nr_common.h"
 #include "PHY/defs_nr_UE.h"
+#include "PHY/defs_nr_common.h"
+#include "PHY/impl_defs_nr.h"
 #include "PHY/phy_vars_nr_ue.h"
-#include "PHY/types.h"
-#include "PHY/INIT/nr_phy_init.h"
-#include "PHY/MODULATION/modulation_eNB.h"
-#include "PHY/MODULATION/nr_modulation.h"
-#include "PHY/MODULATION/modulation_UE.h"
-#include "PHY/NR_REFSIG/refsig_defs_ue.h"
-#include "PHY/NR_TRANSPORT/nr_dlsch.h"
-#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
-#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
+#include "RRC/NR/nr_rrc_config.h"
+#include "RRC/NR/nr_rrc_proto.h"
 #include "SCHED_NR/fapi_nr_l1.h"
 #include "SCHED_NR/sched_nr.h"
 #include "SCHED_NR_UE/defs.h"
 #include "SCHED_NR_UE/fapi_nr_ue_l1.h"
-#include "NR_PHY_INTERFACE/NR_IF_Module.h"
-#include "NR_UE_PHY_INTERFACE/NR_IF_Module.h"
-
-#include "LAYER2/NR_MAC_UE/mac_proto.h"
-#include "LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h"
-#include "LAYER2/NR_MAC_gNB/mac_proto.h"
-#include "NR_asn_constant.h"
-#include "RRC/NR/nr_rrc_config.h"
-#include "openair1/SIMULATION/RF/rf.h"
-#include "openair1/SIMULATION/TOOLS/sim.h"
+#include "T.h"
+#include "asn_internal.h"
+#include "assertions.h"
+#include "common/config/config_load_configmodule.h"
+#include "common/ngran_types.h"
+#include "common/ran_context.h"
+#include "common/utils/T/T.h"
+#include "common/utils/nr/nr_common.h"
+#include "common/utils/var_array.h"
+#include "common_lib.h"
+#include "e1ap_messages_types.h"
+#include "fapi_nr_ue_interface.h"
+#include "nfapi_interface.h"
+#include "nfapi_nr_interface.h"
+#include "nfapi_nr_interface_scf.h"
+#include "nr_ue_phy_meas.h"
+#include "oai_asn1.h"
 #include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h"
-#include "PHY/NR_REFSIG/ptrs_nr.h"
-#include "NR_RRCReconfiguration.h"
+#include "openair1/SIMULATION/TOOLS/sim.h"
+#include "openair2/RRC/LTE/rrc_vars.h"
+#include "softmodem-bits.h"
+#include "thread-pool.h"
+#include "time_meas.h"
+#include "utils.h"
 #define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0))
 #include "SIMULATION/LTE_PHY/common_sim.h"
-#include "PHY/NR_REFSIG/dmrs_nr.h"
-
-#include <openair2/RRC/LTE/rrc_vars.h>
-
-#include <executables/softmodem-common.h>
-#include <openair3/ocp-gtpu/gtp_itf.h>
-#include <executables/nr-uesoftmodem.h>
 
 const char *__asan_default_options()
 {
diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c
index 76b5d979b3b5ef9c3533a263d041b33d9a39c9b2..08bf2e8fe6fc32f52eb975a340431cc88a2295fb 100644
--- a/openair1/SIMULATION/NR_PHY/prachsim.c
+++ b/openair1/SIMULATION/NR_PHY/prachsim.c
@@ -19,40 +19,54 @@
  *      contact@openairinterface.org
  */
 
-#include <string.h>
-#include <math.h>
-#include <unistd.h>
-#include <pthread.h>
 
+#include <math.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "common/utils/assertions.h"
+#include "executables/softmodem-common.h"
+#include "common/platform_types.h"
+#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h"
+#include "NR_PHY_INTERFACE/NR_IF_Module.h"
 #include "common/config/config_userapi.h"
-#include "common/utils/load_module_shlib.h"
-#include "common/utils/LOG/log.h"
-#include "common/ran_context.h" 
-
-#include "SIMULATION/TOOLS/sim.h"
-#include "SIMULATION/RF/rf.h"
-#include "PHY/types.h"
-#include "PHY/defs_gNB.h"
 #include "PHY/defs_nr_UE.h"
-#include "SCHED_NR/sched_nr.h"
-#include "SCHED_NR_UE/phy_frame_config_nr.h"
-#include "PHY/phy_vars_nr_ue.h"
-#include "PHY/NR_REFSIG/refsig_defs_ue.h"
-#include "PHY/MODULATION/nr_modulation.h"
-#include "PHY/MODULATION/modulation_eNB.h"
-#include "PHY/MODULATION/modulation_UE.h"
 #include "PHY/INIT/nr_phy_init.h"
-#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
+#include "PHY/MODULATION/nr_modulation.h"
 #include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
+#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
 #include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
 #include "nr_unitary_defs.h"
-#include <openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h>
-#include <openair2/RRC/LTE/rrc_vars.h>
-#include <executables/softmodem-common.h>
-#include <openair2/RRC/NR_UE/rrc_defs.h>
-#include <openair3/ocp-gtpu/gtp_itf.h>
+#include "openair2/RRC/LTE/rrc_vars.h"
+#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
+#include "PHY/TOOLS/tools_defs.h"
+#include "PHY/defs_RU.h"
+#include "PHY/defs_common.h"
+#include "PHY/defs_gNB.h"
+#include "PHY/defs_nr_UE.h"
+#include "PHY/defs_nr_common.h"
+#include "PHY/impl_defs_nr.h"
+#include "PHY/phy_vars_nr_ue.h"
+#include "SCHED_NR/phy_frame_config_nr.h"
+#include "SCHED_NR/sched_nr.h"
+#include "SIMULATION/TOOLS/sim.h"
+#include "T.h"
+#include "assertions.h"
+#include "common/config/config_load_configmodule.h"
+#include "common/ran_context.h"
+#include "common/utils/LOG/log.h"
+#include "common/utils/T/T.h"
+#include "common/utils/load_module_shlib.h"
+#include "common_lib.h"
+#include "defs.h"
 #include "executables/nr-uesoftmodem.h"
+#include "fapi_nr_ue_interface.h"
 #include "nfapi/oai_integration/vendor_ext.h"
+#include "nfapi_interface.h"
+#include "nfapi_nr_interface_scf.h"
+#include "nr_common.h"
+#include "time_meas.h"
 
 #define NR_PRACH_DEBUG 1
 #define PRACH_WRITE_OUTPUT_DEBUG 1
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index 431e4875fc9c2f94c3b53ac1614a7ea57227ccd6..8ffa0e4a3fe65cece2fafaa503fddbb72c75c567 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -19,54 +19,80 @@
 *      contact@openairinterface.org
 */
 
-#include <string.h>
+#include <limits.h>
 #include <math.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include "common/ran_context.h"
-#include "common/config/config_userapi.h"
-#include "common/utils/LOG/log.h"
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <bits/getopt_core.h>
 #include "common/utils/nr/nr_common.h"
 #include "common/utils/var_array.h"
-#include "PHY/defs_gNB.h"
-#include "PHY/defs_nr_common.h"
-#include "PHY/defs_nr_UE.h"
-#include "PHY/phy_vars_nr_ue.h"
-#include "PHY/types.h"
+#define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0))
+#include "SIMULATION/LTE_PHY/common_sim.h"
+#include "openair2/RRC/LTE/rrc_vars.h"
+#include "common/utils/assertions.h"
+#include "executables/softmodem-common.h"
+#include "NR_BCCH-BCH-Message.h"
+#include "NR_IF_Module.h"
+#include "NR_MAC_COMMON/nr_mac.h"
+#include "NR_MAC_COMMON/nr_mac_common.h"
+#include "NR_MAC_UE/mac_defs.h"
+#include "NR_MAC_gNB/nr_mac_gNB.h"
+#include "NR_PHY_INTERFACE/NR_IF_Module.h"
+#include "NR_ReconfigurationWithSync.h"
+#include "NR_ServingCellConfig.h"
+#include "NR_UE-NR-Capability.h"
+#include "PHY/CODING/nrLDPC_extern.h"
 #include "PHY/INIT/nr_phy_init.h"
-#include "PHY/MODULATION/modulation_UE.h"
 #include "PHY/MODULATION/nr_modulation.h"
 #include "PHY/NR_REFSIG/dmrs_nr.h"
-#include "PHY/NR_REFSIG/refsig_defs_ue.h"
-#include "PHY/NR_TRANSPORT/nr_dlsch.h"
-#include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
-#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
+#include "PHY/NR_REFSIG/ptrs_nr.h"
+#include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
+#include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
 #include "PHY/NR_TRANSPORT/nr_ulsch.h"
-#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
+#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
 #include "PHY/TOOLS/tools_defs.h"
+#include "PHY/defs_RU.h"
+#include "PHY/defs_common.h"
+#include "PHY/defs_gNB.h"
+#include "PHY/defs_nr_UE.h"
+#include "PHY/defs_nr_common.h"
+#include "PHY/impl_defs_nr.h"
+#include "PHY/phy_vars_nr_ue.h"
 #include "SCHED_NR/fapi_nr_l1.h"
 #include "SCHED_NR/sched_nr.h"
 #include "SCHED_NR_UE/defs.h"
 #include "SCHED_NR_UE/fapi_nr_ue_l1.h"
-#include "openair1/SIMULATION/TOOLS/sim.h"
-#include "openair1/SIMULATION/RF/rf.h"
+#include "asn_internal.h"
+#include "assertions.h"
+#include "common/config/config_load_configmodule.h"
+#include "common/ngran_types.h"
+#include "common/openairinterface5g_limits.h"
+#include "common/ran_context.h"
+#include "common/utils/LOG/log.h"
+#include "common/utils/T/T.h"
+#include "common/utils/nr/nr_common.h"
+#include "common/utils/threadPool/thread-pool.h"
+#include "common/utils/var_array.h"
+#include "common_lib.h"
+#include "e1ap_messages_types.h"
+#include "executables/nr-uesoftmodem.h"
+#include "fapi_nr_ue_constants.h"
+#include "fapi_nr_ue_interface.h"
+#include "nfapi_interface.h"
+#include "nfapi_nr_interface_scf.h"
+#include "nr_ue_phy_meas.h"
 #include "openair1/SIMULATION/NR_PHY/nr_unitary_defs.h"
-#include "openair2/RRC/NR/nr_rrc_config.h"
+#include "openair1/SIMULATION/TOOLS/sim.h"
 #include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
 #include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
-#include "common/utils/threadPool/thread-pool.h"
-#include "PHY/NR_REFSIG/ptrs_nr.h"
-#define inMicroS(a) (((double)(a))/(get_cpu_freq_GHz()*1000.0))
-#include "SIMULATION/LTE_PHY/common_sim.h"
-
-#include <openair2/RRC/LTE/rrc_vars.h>
+#include "openair2/RRC/NR/nr_rrc_config.h"
+#include "time_meas.h"
+#include "utils.h"
 
-#include <executables/softmodem-common.h>
-#include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
-#include <openair3/ocp-gtpu/gtp_itf.h>
-#include "executables/nr-uesoftmodem.h"
 //#define DEBUG_ULSIM
 
 const char *__asan_default_options()
@@ -213,6 +239,7 @@ int main(int argc, char *argv[])
   int params_from_file = 0;
   int threadCnt=0;
   int max_ldpc_iterations = 5;
+  int num_antennas_per_thread = 1;
   if ((uniqCfg = load_configmodule(argc, argv, CONFIG_ENABLECMDLINEONLY)) == 0) {
     exit_fun("[NR_ULSIM] Error, configuration module init failed\n");
   }
@@ -224,7 +251,7 @@ int main(int argc, char *argv[])
   InitSinLUT();
 
   int c;
-  while ((c = getopt(argc, argv, "--:O:a:b:c:d:ef:g:h:i:k:m:n:op:q:r:s:t:u:v:w:y:z:C:F:G:H:I:M:N:PR:S:T:U:L:ZW:E:X:")) != -1) {
+  while ((c = getopt(argc, argv, "--:O:a:b:c:d:ef:g:h:i:k:m:n:op:q:r:s:t:u:v:w:y:z:A:C:F:G:H:I:M:N:PR:S:T:U:L:ZW:E:X:")) != -1) {
 
     /* ignore long options starting with '--', option '-O' and their arguments that are handled by configmodule */
     /* with this opstring getopt returns 1 for non-option arguments, refer to 'man 3 getopt' */
@@ -395,6 +422,10 @@ int main(int argc, char *argv[])
       }
       break;
 
+    case 'A':
+      num_antennas_per_thread = atoi(optarg);
+      break;
+
     case 'F':
       input_fd = fopen(optarg, "r");
       if (input_fd == NULL) {
@@ -512,6 +543,7 @@ int main(int argc, char *argv[])
       printf("-w Start PRB for PUSCH\n");
       printf("-y Number of TX antennas used at UE\n");
       printf("-z Number of RX antennas used at gNB\n");
+      printf("-A Number of antennas per thread for PUSCH channel estimation\n");
       printf("-C Specify the number of threads for the simulation\n");
       printf("-E {SRS: [0] Disabled, [1] Enabled} e.g. -E 1\n");
       printf("-F Input filename (.txt format) for RX conformance testing\n");
@@ -559,6 +591,7 @@ int main(int argc, char *argv[])
   gNB = RC.gNB[0];
   gNB->ofdm_offset_divisor = UINT_MAX;
   gNB->num_pusch_symbols_per_thread = 1;
+  gNB->dmrs_num_antennas_per_thread = num_antennas_per_thread;
   gNB->RU_list[0] = calloc(1, sizeof(**gNB->RU_list));
   gNB->RU_list[0]->rfdevice.openair0_cfg = openair0_cfg;
 
@@ -952,6 +985,7 @@ int main(int argc, char *argv[])
     reset_meas(&gNB->rx_pusch_symbol_processing_stats);
     reset_meas(&gNB->ulsch_decoding_stats);
     reset_meas(&gNB->ulsch_channel_estimation_stats);
+    reset_meas(&gNB->pusch_channel_estimation_antenna_processing_stats);
     reset_meas(&gNB->rx_srs_stats);
     reset_meas(&gNB->generate_srs_stats);
     reset_meas(&gNB->get_srs_signal_stats);
@@ -1512,6 +1546,7 @@ int main(int argc, char *argv[])
       printDistribution(&gNB->phy_proc_rx,table_rx, "Total PHY proc rx");
       printStatIndent(&gNB->rx_pusch_stats, "RX PUSCH time");
       printStatIndent2(&gNB->ulsch_channel_estimation_stats, "ULSCH channel estimation time");
+      printStatIndent3(&gNB->pusch_channel_estimation_antenna_processing_stats, "Antenna Processing time");
       printStatIndent2(&gNB->rx_pusch_init_stats, "RX PUSCH Initialization time");
       printStatIndent2(&gNB->rx_pusch_symbol_processing_stats, "RX PUSCH Symbol Processing time");
       printStatIndent(&gNB->ulsch_decoding_stats,"ULSCH total decoding time");
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c
index 33cd1b3432117505b6cdc7b22200ba9f7824bd6b..1217f70fbaefa8930355532b85cfb81fd1cf9aa6 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c
@@ -180,7 +180,7 @@ int test_pucch_basic_error(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pr
   }
 
   /* set a tx slot with no ack */
-  NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
+  NR_UE_DL_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
 
   harq_status->slot_for_feedback_ack  = proc->nr_slot_tx;
 
@@ -267,7 +267,7 @@ int test_pucch_common_config_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_
   common_pucch_configuration(ue, gNB_id, TST_PUCCH_COMMON_CONFIG_INDEX_OK);
 
   /* set a tx slot with no ack */
-  NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
+  NR_UE_DL_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[TST_DL_HARQ_PID_FIRST].harq_ack;
 
   harq_status->ack = DL_ACK;
 
@@ -557,7 +557,7 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id,
   int reset_harq = false;
   int dl_harq_pid[TST_NB_STEP_SINGLE_TRANSPORT_BLOCK] = {TST_DL_HARQ_PID_FIRST, TST_DL_HARQ_PID_SECOND, TST_DL_HARQ_PID_THIRD, TST_DL_HARQ_PID_FOURTH };
   int pucch_resource_indicator[TST_NB_STEP_SINGLE_TRANSPORT_BLOCK][2] = { { 0, 4 }, { 1, 0 } , { 1, 3 } , { 5, 7 } };
-  NR_UE_HARQ_STATUS_t *harq_status;
+  NR_UE_DL_HARQ_STATUS_t *harq_status;
 
   ue->PDSCH_Config.maxNrofCodeWordsScheduledByDCI = nb_code_n1;
 
@@ -584,7 +584,7 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id,
     /* set a tx slot with no ack */
     ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = dl_harq_pid[i];
 
-    NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
+    NR_UE_DL_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
 
     harq_status->slot_for_feedback_ack  = proc->nr_slot_tx;
     harq_status->send_harq_status = 1;
@@ -618,7 +618,7 @@ int test_pucch_dedicated_single_transport_block(PHY_VARS_NR_UE *ue, int gNB_id,
     /* set a tx slot with no ack */
     ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = dl_harq_pid[i];
 
-    NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
+    NR_UE_DL_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid[i]].harq_ack;
 
     harq_status->slot_for_feedback_ack  = proc->nr_slot_tx;
     harq_status->send_harq_status = 1;
@@ -662,7 +662,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
   int reset_harq = false;
   int dl_harq_pid[TST_NB_STEP_TWO_TRANSPORT_BLOCKS] = {TST_DL_HARQ_PID_FIRST, TST_DL_HARQ_PID_SECOND, TST_DL_HARQ_PID_THIRD, TST_DL_HARQ_PID_FOURTH };
   int pucch_resource_indicator[TST_NB_STEP_TWO_TRANSPORT_BLOCKS][2] = { { 0, 1 }, { 3, 7 } , { 2 , 4 } , { 4 , 6 } };
-  NR_UE_HARQ_STATUS_t *harq_status;
+  NR_UE_DL_HARQ_STATUS_t *harq_status;
   int TB_identifier = 1;
   int thread_number = TST_THREAD_ID;
 
@@ -682,7 +682,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
       /* set a tx slot with no ack */
       ue->dlsch[proc->thread_id][gNB_id][code_word]->current_harq_pid = dl_harq_pid[i];
 
-      NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
+      NR_UE_DL_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
 
       harq_status->slot_for_feedback_ack  = proc->nr_slot_tx;
       harq_status->send_harq_status = 1;
@@ -725,7 +725,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
       /* set a tx slot with no ack */
       ue->dlsch[proc->thread_id][gNB_id][code_word]->current_harq_pid = dl_harq_pid[i];
 
-      NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
+      NR_UE_DL_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
 
       harq_status->slot_for_feedback_ack  = proc->nr_slot_tx;
       harq_status->send_harq_status = 1;
@@ -759,7 +759,7 @@ int test_pucch_dedicated_two_transport_blocks(PHY_VARS_NR_UE *ue, int gNB_id, UE
       /* set a tx slot with no ack */
       ue->dlsch[proc->thread_id][gNB_id][code_word]->current_harq_pid = dl_harq_pid[i];
 
-      NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
+      NR_UE_DL_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][code_word]->harq_processes[dl_harq_pid[i]].harq_ack;
 
       harq_status->slot_for_feedback_ack  = proc->nr_slot_tx;
       harq_status->send_harq_status = 1;
@@ -973,7 +973,7 @@ int test_sr_ack_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *pro
 
   /* set a first harq ack context */
 
-  NR_UE_HARQ_STATUS_t *harq_status;
+  NR_UE_DL_HARQ_STATUS_t *harq_status;
 
   ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_FIRST;
 
@@ -1085,7 +1085,7 @@ int test_csi_dedicated(PHY_VARS_NR_UE *ue, int gNB_id, UE_nr_rxtx_proc_t *proc)
 
   /* set a first harq ack context */
 
-  NR_UE_HARQ_STATUS_t *harq_status;
+  NR_UE_DL_HARQ_STATUS_t *harq_status;
 
   ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid = TST_DL_HARQ_PID_FIRST;
 
diff --git a/openair2/COMMON/gtpv1_u_messages_types.h b/openair2/COMMON/gtpv1_u_messages_types.h
index 77e92f39bbf1358b686d4cb16eb9073b6198e6a1..0a2691e6436ee4343688992293c2b19a1b171441 100644
--- a/openair2/COMMON/gtpv1_u_messages_types.h
+++ b/openair2/COMMON/gtpv1_u_messages_types.h
@@ -24,6 +24,7 @@
 
 #include "LTE_asn_constant.h"
 #include "NR_asn_constant.h"
+#include "s1ap_messages_types.h"
 
 #define GTPV1U_MAX_BEARERS_PER_UE max_val_LTE_DRB_Identity
 #define NR_GTPV1U_MAX_BEARERS_PER_UE max_val_NR_DRB_Identity
@@ -170,13 +171,10 @@ typedef struct {
 typedef struct gtpv1u_gnb_create_tunnel_req_s {
   ue_id_t                ue_id;
   int                    num_tunnels;
-  //teid_t                 upf_NGu_teid[NR_GTPV1U_MAX_BEARERS_PER_UE];  ///< Tunnel Endpoint Identifier
   teid_t                 outgoing_teid[NR_GTPV1U_MAX_BEARERS_PER_UE];
   int outgoing_qfi[NR_GTPV1U_MAX_BEARERS_PER_UE];
   pdusessionid_t         pdusession_id[NR_GTPV1U_MAX_BEARERS_PER_UE];
   ebi_t                  incoming_rb_id[NR_GTPV1U_MAX_BEARERS_PER_UE];
-  //ebi_t                  outgoing_rb_id[NR_GTPV1U_MAX_BEARERS_PER_UE];
-  //transport_layer_addr_t upf_addr[NR_GTPV1U_MAX_BEARERS_PER_UE];
   transport_layer_addr_t dst_addr[NR_GTPV1U_MAX_BEARERS_PER_UE];
 } gtpv1u_gnb_create_tunnel_req_t;
 
diff --git a/openair2/COMMON/ngap_messages_types.h b/openair2/COMMON/ngap_messages_types.h
index 0f1555cfdf16d3010cedc1f0405131876b027f5d..cdba1c5e2de40795db098e79bbcae0738689478f 100644
--- a/openair2/COMMON/ngap_messages_types.h
+++ b/openair2/COMMON/ngap_messages_types.h
@@ -32,11 +32,9 @@
 #include "common/platform_constants.h"
 #include "common/platform_types.h"
 #include "common/5g_platform_types.h"
-#include "LTE_asn_constant.h"
 #include "s1ap_messages_types.h"
-//-------------------------------------------------------------------------------------------//
-// Defines to access message fields.
 
+// Defines to access message fields.
 #define NGAP_REGISTER_GNB_REQ(mSGpTR)           (mSGpTR)->ittiMsg.ngap_register_gnb_req
 
 #define NGAP_REGISTER_GNB_CNF(mSGpTR)           (mSGpTR)->ittiMsg.ngap_register_gnb_cnf
@@ -72,10 +70,9 @@
 #define NGAP_PDUSESSION_RELEASE_RESPONSE(mSGpTR)     (mSGpTR)->ittiMsg.ngap_pdusession_release_resp
 
 //-------------------------------------------------------------------------------------------//
-/* Maximum number of e-rabs to be setup/deleted in a single message.
- * Even if only one bearer will be modified by message.
- */
-#define NGAP_MAX_PDUSESSION  (LTE_maxDRB + 3)
+
+// maxnoofPDUSessions in 3GPP TS 38.413
+#define NGAP_MAX_PDUSESSION 16 // 256 according to specs
 
 /* Length of the transport layer address string
  * 160 bits / 8 bits by char.
diff --git a/openair2/COMMON/s1ap_messages_types.h b/openair2/COMMON/s1ap_messages_types.h
index 7537d7c6d794ecc4183f0113473d16295a7df785..e7bbfc798906195104ce9fa8818b8fd0fff47557 100644
--- a/openair2/COMMON/s1ap_messages_types.h
+++ b/openair2/COMMON/s1ap_messages_types.h
@@ -224,16 +224,6 @@ typedef struct nas_pdu_s {
   uint32_t  length;
 } nas_pdu_t, ue_radio_cap_t;
 
-typedef struct transport_layer_addr_s {
-  /* Length of the transport layer address buffer in bits. S1AP layer received a
-   * bit string<1..160> containing one of the following addresses: ipv4,
-   * ipv6, or ipv4 and ipv6. The layer doesn't interpret the buffer but
-   * silently forward it to S1-U.
-   */
-  uint8_t length;
-  uint8_t buffer[20]; // in network byte order
-} transport_layer_addr_t;
-
 #define TRANSPORT_LAYER_ADDR_COPY(dEST,sOURCE)        \
   do {                                                \
       AssertFatal(sOURCE.len <= 20);                  \
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_gtp.c b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_gtp.c
index c1d2a0f0b7f69242fc0ee81108cdfd8599c4a97f..31d96433c183cee0382d5f1823de5b1e0f70f61e 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_gtp.c
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_gtp.c
@@ -93,5 +93,7 @@ void read_gtp_setup_sm(void* data)
 sm_ag_if_ans_t write_ctrl_gtp_sm(void const* src)
 {
   assert(src != NULL);
-  assert(0 !=0 && "Not supported");
+  printf("write_ctrl callback for GTP SM: operation not supported\n");
+  sm_ag_if_ans_t ans = {0};
+  return ans;
 }
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_mac.c b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_mac.c
index 56633f53e0d4257a880908592fef33803c9c8d75..3e3caac9fe721b6bf28b4f28cbd9934d00662f08 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_mac.c
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_mac.c
@@ -123,6 +123,8 @@ void read_mac_setup_sm(void* data)
 sm_ag_if_ans_t write_ctrl_mac_sm(void const* data)
 {
   assert(data != NULL);
-  assert(0 !=0 && "Not supported");
+  printf("write_ctrl callback for MAC SM: operation not supported\n");
+  sm_ag_if_ans_t ans = {0};
+  return ans;
 }
 
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_pdcp.c b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_pdcp.c
index 6c8c1268a79c8483bc092900af22a8b148b8b931..21b2e0f41cb1bf58f64c2d377d1c07be93df5575 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_pdcp.c
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_pdcp.c
@@ -152,7 +152,7 @@ sm_ag_if_ans_t write_ctrl_pdcp_sm(void const* data)
 {
   assert(data != NULL);
 //  assert(data->type == PDCP_CTRL_REQ_V0 );
-  assert(0 !=0 && "Not supported");
+  printf("write_ctrl callback for PDCP SM: operation not supported\n");
   sm_ag_if_ans_t ans = {0};
   return ans;
 }
diff --git a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_rlc.c b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_rlc.c
index d78c103fbf705167f5ca360efb144d4700e329b2..08b070eb8de5352b29988a2ece4f960901d74134 100644
--- a/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_rlc.c
+++ b/openair2/E2AP/RAN_FUNCTION/CUSTOMIZED/ran_func_rlc.c
@@ -174,6 +174,8 @@ void read_rlc_setup_sm(void* data)
 sm_ag_if_ans_t write_ctrl_rlc_sm(void const* data)
 {
   (void)data;
-  assert(0!=0 && "Not supported");
+  printf("write_ctrl callback for RLC SM: operation not supported\n");
+  sm_ag_if_ans_t ans = {0};
+  return ans;
 }
 
diff --git a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c
index 748b4f7d299dcff85ce9a24fe93502e9e1c4477f..40371df046815d266c9b0d33eb7f88d748ec0e7c 100644
--- a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c
+++ b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c
@@ -537,7 +537,7 @@ void read_kpm_setup_sm(void* e2ap)
 
 sm_ag_if_ans_t write_ctrl_kpm_sm(void const* src)
 {
-  assert(0 !=0 && "Not supported");
+  printf("write_ctrl callback for KPM SM: operation not supported\n");
   (void)src;
   sm_ag_if_ans_t ans = {0};
   return ans;
diff --git a/openair2/GNB_APP/L1_nr_paramdef.h b/openair2/GNB_APP/L1_nr_paramdef.h
index b6d2e87d9c981eb11b6bc2dc2a2068fe1e2f0640..e313818ad22711708690de0a405fe4485a33af94 100644
--- a/openair2/GNB_APP/L1_nr_paramdef.h
+++ b/openair2/GNB_APP/L1_nr_paramdef.h
@@ -59,6 +59,8 @@
 #define HLP_L1TX_BO "Backoff from full-scale output at the L1 entity(frequency domain), ex. 12 would corresponding to 14-bit input level (6 dB/bit). Default 36 dBFS for OAI RU entity"
 #define CONFIG_STRING_L1_PHASE_COMP                        "phase_compensation"
 #define HLP_L1_PHASE_COMP "Apply NR symbolwise phase rotation"
+#define CONFIG_STRING_NUM_ANTENNAS_PER_THREAD              "dmrs_num_antennas_per_thread"
+#define HLP_NUM_ARX "Number of antennas per thread for PUSCH channel estimation"
 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/
 /*                                            L1 configuration parameters                                                                             */
 /*   optname                                         helpstr   paramflags    XXXptr              defXXXval                  type           numelt     */
@@ -84,6 +86,7 @@
   {CONFIG_STRING_L1_TX_THREAD_CORE,                    NULL,       0,         .uptr=NULL,           .defintval=-1,              TYPE_UINT,     0},          \
   {CONFIG_STRING_L1_TX_AMP_BACKOFF_dB,                 HLP_L1TX_BO,0,         .uptr=NULL,           .defintval=36,              TYPE_UINT,     0},         \
   {CONFIG_STRING_L1_PHASE_COMP,                        HLP_L1_PHASE_COMP,PARAMFLAG_BOOL, .uptr=NULL,.defintval=1,               TYPE_UINT,     0},         \
+  {CONFIG_STRING_NUM_ANTENNAS_PER_THREAD,              HLP_NUM_ARX,0,         .uptr=NULL,           .defintval=1,               TYPE_UINT,     0},         \
 }
 // clang-format on
 #define L1_CC_IDX                                          0
@@ -105,6 +108,7 @@
 #define L1_TX_THREAD_CORE                                  16
 #define L1_TX_AMP_BACKOFF_dB                               17
 #define L1_PHASE_COMP                                      18
+#define NUM_ANTENNAS_PER_THREAD                            19
 
 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/
 #endif
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index 44c402fb8ad82cfdd403acf0260df62986ddad69..0612fa96775593d538810f9e59594ff54f3aea9e 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -27,27 +27,64 @@
   EMAIL   : Lionel.Gauthier@eurecom.fr, navid.nikaein@eurecom.fr, kroempa@gmail.com
 */
 
-#include "executables/softmodem-common.h"
 #include "gnb_config.h"
-#include "enb_paramdef.h"
-#include "UTIL/OTG/otg.h"
-#include "sctp_default_values.h"
-#include "f1ap_common.h"
-#include "PHY/INIT/nr_phy_init.h"
-#include "radio/ETHERNET/ethernet_lib.h"
-#include "nfapi_vnf.h"
-#include "nfapi_pnf.h"
-#include "prs_nr_paramdef.h"
+#include <limits.h>
+#include <math.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include "BIT_STRING.h"
 #include "L1_nr_paramdef.h"
 #include "MACRLC_nr_paramdef.h"
-#include "gnb_paramdef.h"
-#include "NR_MAC_gNB/mac_proto.h"
+#include "PHY/INIT/nr_phy_init.h"
+#include "PHY/defs_common.h"
+#include "PHY/defs_gNB.h"
+#include "PHY/defs_nr_common.h"
+#include "RRC/NR/nr_rrc_config.h"
 #include "RRC/NR/nr_rrc_extern.h"
+#include "RRC_nr_paramsvalues.h"
+#include "T.h"
+#include "asn_SEQUENCE_OF.h"
+#include "asn_codecs.h"
+#include "asn_internal.h"
+#include "NR_MAC_gNB/nr_mac_gNB.h"
+#include "NR_MAC_gNB/mac_proto.h"
+#include "common/5g_platform_types.h"
+#include "common/config/config_paramdesc.h"
+#include "common/config/config_userapi.h"
+#include "common/openairinterface5g_limits.h"
+#include "common/ran_context.h"
+#include "common/utils/T/T.h"
+#include "common_lib.h"
+#include "constr_TYPE.h"
+#include "enb_paramdef.h"
+#include "executables/softmodem-common.h"
+#include "f1ap_common.h"
+#include "gnb_paramdef.h"
+#include "lib/f1ap_interface_management.h"
 #include "nfapi/oai_integration/vendor_ext.h"
+#include "nfapi_pnf.h"
+#include "nfapi_vnf.h"
+#include "ngap_gNB.h"
+#include "ngap_messages_types.h"
+#include "nr_common.h"
+#include "oai_asn1.h"
+#include "openair1/PHY/defs_common.h"
+#include "prs_nr_paramdef.h"
+#include "radio/ETHERNET/if_defs.h"
+#include "rrc_messages_types.h"
+#include "s1ap_messages_types.h"
+#include "sctp_default_values.h"
+#include "seq_arr.h"
+#include "uper_encoder.h"
+#include "utils.h"
+#include "x2ap_messages_types.h"
 #ifdef ENABLE_AERIAL
 #include "nfapi/oai_integration/aerial/fapi_vnf_p5.h"
 #endif
-#include "lib/f1ap_interface_management.h"
 
 static int DEFBANDS[] = {7};
 static int DEFENBS[] = {0};
@@ -914,6 +951,7 @@ void RCconfig_NR_L1(void)
       LOG_I(NR_PHY, "L1_RX_THREAD_CORE %d (%d)\n", *(L1_ParamList.paramarray[j][L1_RX_THREAD_CORE].iptr), L1_RX_THREAD_CORE);
       gNB->TX_AMP = (int16_t)(32767.0 / pow(10.0, .05 * (double)(*L1_ParamList.paramarray[j][L1_TX_AMP_BACKOFF_dB].uptr)));
       gNB->phase_comp = *L1_ParamList.paramarray[j][L1_PHASE_COMP].uptr;
+      gNB->dmrs_num_antennas_per_thread = *(L1_ParamList.paramarray[j][NUM_ANTENNAS_PER_THREAD].uptr);
       LOG_I(NR_PHY, "TX_AMP = %d (-%d dBFS)\n", gNB->TX_AMP, *L1_ParamList.paramarray[j][L1_TX_AMP_BACKOFF_dB].uptr);
       AssertFatal(gNB->TX_AMP > 300, "TX_AMP is too small, must be larger than 300 (is %d)\n", gNB->TX_AMP);
       // Midhaul configuration
diff --git a/openair2/GNB_APP/gnb_config.h b/openair2/GNB_APP/gnb_config.h
index 0a526846122a94ea416b30edc19e2537b47adaf7..aaa945509cfa32e4fc16a1afb33cf02e79579882 100644
--- a/openair2/GNB_APP/gnb_config.h
+++ b/openair2/GNB_APP/gnb_config.h
@@ -29,23 +29,13 @@
 
 #ifndef GNB_CONFIG_H_
 #define GNB_CONFIG_H_
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <libconfig.h>
-
-#include "commonDef.h"
-#include "common/platform_types.h"
-#include "common/platform_constants.h"
-#include "PHY/defs_eNB.h"
-#include "s1ap_messages_types.h"
-#include "ngap_messages_types.h"
+#include <stdint.h>
+#include "RRC/NR/nr_rrc_defs.h"
+#include "assertions.h"
+#include "common/config/config_load_configmodule.h"
+#include "common/ngran_types.h"
 #include "f1ap_messages_types.h"
-#include "e1ap_messages_types.h"
-
-#include "rrc_messages_types.h"
 #include "intertask_interface.h"
-#include "RRC/NR/nr_rrc_defs.h"
 
 #define IPV4_STR_ADDR_TO_INT_NWBO(AdDr_StR,NwBo,MeSsAgE ) do {\
             struct in_addr inp;\
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index 28bf3bfc8ef06ba6dbba29e7424e5efc7d8f6ec2..08cfd7303c676a7587eaab41c539a8b87596b0af 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -2232,8 +2232,7 @@ static const uint16_t Table_51311[32][2] = {{2, 1200}, {2, 1570}, {2, 1930}, {2,
                                             {4, 6580}, {6, 4380}, {6, 4660}, {6, 5170}, {6, 5670}, {6, 6160}, {6, 6660}, {6, 7190},
                                             {6, 7720}, {6, 8220}, {6, 8730}, {6, 9100}, {6, 9480}, {2, 0}, {4, 0}, {6, 0}};
 
-//Table 5.1.3.1-2 of 38.214
-// Imcs values 20 and 26 have been multiplied by 2 to avoid the floating point
+// Table 5.1.3.1-2 of 38.214
 static const uint16_t Table_51312[32][2] = {{2, 1200}, {2, 1930}, {2, 3080}, {2, 4490}, {2, 6020}, {4, 3780}, {4, 4340},
                                             {4, 4900}, {4, 5530}, {4, 6160}, {4, 6580}, {6, 4660}, {6, 5170}, {6, 5670},
                                             {6, 6160}, {6, 6660}, {6, 7190}, {6, 7720}, {6, 8220}, {6, 8730}, {8, 6825},
diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c
index 80e2255aa50da9769175fcf0f515b0fbfc610f53..b430727955580f111cf8b7af19c31396e07aab31 100644
--- a/openair2/LAYER2/NR_MAC_UE/config_ue.c
+++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c
@@ -1676,6 +1676,32 @@ static int get_ta_offset(long *n_TimingAdvanceOffset)
   return -1;
 }
 
+static void configure_si_schedulingInfo(NR_UE_MAC_INST_t *mac,
+                                        NR_SI_SchedulingInfo_t *si_SchedulingInfo,
+                                        NR_SI_SchedulingInfo_v1700_t *si_SchedulingInfo_v1700)
+{
+  asn_sequence_empty(&mac->si_SchedInfo.si_SchedInfo_list);
+  if (si_SchedulingInfo) {
+    mac->si_SchedInfo.si_WindowLength = si_SchedulingInfo->si_WindowLength;
+    for (int i = 0; i < si_SchedulingInfo->schedulingInfoList.list.count; i++) {
+      si_schedinfo_config_t *config = calloc_or_fail(1, sizeof(*config));
+      config->type = NR_SI_INFO;
+      config->si_WindowPosition = i + 1;
+      config->si_Periodicity = si_SchedulingInfo->schedulingInfoList.list.array[i]->si_Periodicity;
+      ASN_SEQUENCE_ADD(&mac->si_SchedInfo.si_SchedInfo_list, config);
+    }
+  }
+  if (si_SchedulingInfo_v1700) {
+    for (int i = 0; i < si_SchedulingInfo_v1700->schedulingInfoList2_r17.list.count; i++) {
+      si_schedinfo_config_t *config = calloc_or_fail(1, sizeof(*config));
+      config->type = NR_SI_INFO_v1700;
+      config->si_WindowPosition = si_SchedulingInfo_v1700->schedulingInfoList2_r17.list.array[i]->si_WindowPosition_r17;
+      config->si_Periodicity = si_SchedulingInfo_v1700->schedulingInfoList2_r17.list.array[i]->si_Periodicity_r17;
+      ASN_SEQUENCE_ADD(&mac->si_SchedInfo.si_SchedInfo_list, config);
+    }
+  }
+}
+
 void nr_rrc_mac_config_req_sib1(module_id_t module_id,
                                 int cc_idP,
                                 NR_SI_SchedulingInfo_t *si_SchedulingInfo,
@@ -1688,8 +1714,7 @@ void nr_rrc_mac_config_req_sib1(module_id_t module_id,
   AssertFatal(scc, "SIB1 SCC should not be NULL\n");
 
   UPDATE_IE(mac->tdd_UL_DL_ConfigurationCommon, scc->tdd_UL_DL_ConfigurationCommon, NR_TDD_UL_DL_ConfigCommon_t);
-  UPDATE_IE(mac->si_SchedulingInfo, si_SchedulingInfo, NR_SI_SchedulingInfo_t);
-  UPDATE_IE(mac->si_SchedulingInfo_v1700, si_SchedulingInfo_v1700, NR_SI_SchedulingInfo_v1700_t);
+  configure_si_schedulingInfo(mac, si_SchedulingInfo, si_SchedulingInfo_v1700);
   mac->n_ta_offset = get_ta_offset(scc->n_TimingAdvanceOffset);
 
   config_common_ue_sa(mac, scc, cc_idP);
@@ -1734,35 +1759,32 @@ void nr_rrc_mac_config_req_sib19_r17(module_id_t module_id,
 
 static void handle_reconfiguration_with_sync(NR_UE_MAC_INST_t *mac,
                                              int cc_idP,
-                                             const NR_ReconfigurationWithSync_t *reconfigurationWithSync)
+                                             const NR_ReconfigurationWithSync_t *reconfWithSync)
 {
-  mac->crnti = reconfigurationWithSync->newUE_Identity;
+  reset_mac_inst(mac);
+  mac->crnti = reconfWithSync->newUE_Identity;
   LOG_I(NR_MAC, "Configuring CRNTI %x\n", mac->crnti);
 
   RA_config_t *ra = &mac->ra;
-  if (reconfigurationWithSync->rach_ConfigDedicated) {
-    AssertFatal(
-        reconfigurationWithSync->rach_ConfigDedicated->present == NR_ReconfigurationWithSync__rach_ConfigDedicated_PR_uplink,
-        "RACH on supplementaryUplink not supported\n");
-    UPDATE_IE(ra->rach_ConfigDedicated, reconfigurationWithSync->rach_ConfigDedicated->choice.uplink, NR_RACH_ConfigDedicated_t);
+  if (reconfWithSync->rach_ConfigDedicated) {
+    AssertFatal(reconfWithSync->rach_ConfigDedicated->present == NR_ReconfigurationWithSync__rach_ConfigDedicated_PR_uplink,
+                "RACH on supplementaryUplink not supported\n");
+    UPDATE_IE(ra->rach_ConfigDedicated, reconfWithSync->rach_ConfigDedicated->choice.uplink, NR_RACH_ConfigDedicated_t);
   }
 
-  if (reconfigurationWithSync->spCellConfigCommon) {
-    NR_ServingCellConfigCommon_t *scc = reconfigurationWithSync->spCellConfigCommon;
+  if (reconfWithSync->spCellConfigCommon) {
+    NR_ServingCellConfigCommon_t *scc = reconfWithSync->spCellConfigCommon;
     mac->n_ta_offset = get_ta_offset(scc->n_TimingAdvanceOffset);
     if (scc->physCellId)
       mac->physCellId = *scc->physCellId;
     mac->dmrs_TypeA_Position = scc->dmrs_TypeA_Position;
     UPDATE_IE(mac->tdd_UL_DL_ConfigurationCommon, scc->tdd_UL_DL_ConfigurationCommon, NR_TDD_UL_DL_ConfigCommon_t);
     config_common_ue(mac, scc, cc_idP);
+    const int bwp_id = 0;
     if (scc->downlinkConfigCommon)
-      configure_common_BWP_dl(mac,
-                              0, // bwp-id
-                              scc->downlinkConfigCommon->initialDownlinkBWP);
+      configure_common_BWP_dl(mac, bwp_id, scc->downlinkConfigCommon->initialDownlinkBWP);
     if (scc->uplinkConfigCommon)
-      configure_common_BWP_ul(mac,
-                              0, // bwp-id
-                              scc->uplinkConfigCommon->initialUplinkBWP);
+      configure_common_BWP_ul(mac, bwp_id, scc->uplinkConfigCommon->initialUplinkBWP);
   }
 
   mac->state = UE_NOT_SYNC;
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
index 1530846d6be364abaa184c4690fe2b3427153719..51b9c29058829c4cbcaa6ab9f9957da8d3403c5f 100644
--- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
@@ -385,13 +385,15 @@ typedef struct {
   uint32_t R;
   uint32_t TBS;
   int last_ndi;
-} NR_UE_HARQ_STATUS_t;
+  int round;
+} NR_UE_DL_HARQ_STATUS_t;
 
 typedef struct {
   uint32_t R;
   uint32_t TBS;
   int last_ndi;
-} NR_UL_HARQ_INFO_t;
+  int round;
+} NR_UE_UL_HARQ_INFO_t;
 
 typedef struct {
   uint8_t freq_hopping;
@@ -510,6 +512,48 @@ typedef enum {
   ON_PUSCH
 } CSI_mapping_t;
 
+typedef struct {
+  uint64_t rounds[NR_MAX_HARQ_ROUNDS_FOR_STATS];
+  uint64_t total_bits;
+  uint64_t total_symbols;
+  uint64_t target_code_rate;
+  uint64_t qam_mod_order;
+  uint64_t rb_size;
+  uint64_t nr_of_symbols;
+} ue_mac_dir_stats_t;
+
+typedef struct {
+  ue_mac_dir_stats_t dl;
+  ue_mac_dir_stats_t ul;
+  uint32_t bad_dci;
+  uint32_t ulsch_DTX;
+  uint64_t ulsch_total_bytes_scheduled;
+  uint32_t pucch0_DTX;
+  int cumul_rsrp;
+  uint8_t num_rsrp_meas;
+  char srs_stats[50]; // Statistics may differ depending on SRS usage
+  int pusch_snrx10;
+  int deltaMCS;
+  int NPRB;
+} ue_mac_stats_t;
+
+typedef enum {
+  NR_SI_INFO,
+  NR_SI_INFO_v1700
+} nr_si_info_type;
+
+typedef struct {
+  nr_si_info_type type;
+  long si_Periodicity;
+  long si_WindowPosition;
+} si_schedinfo_config_t;
+
+typedef struct {
+  int si_window_start;
+  int si_WindowLength;
+  A_SEQUENCE_OF(si_schedinfo_config_t) si_SchedInfo_list;
+} si_schedInfo_t;
+
 /*!\brief Top level UE MAC structure */
 typedef struct NR_UE_MAC_INST_s {
   module_id_t ue_id;
@@ -520,9 +564,8 @@ typedef struct NR_UE_MAC_INST_s {
   bool get_sib1;
   bool get_otherSI;
   NR_MIB_t *mib;
-  struct NR_SI_SchedulingInfo *si_SchedulingInfo;
-  struct NR_SI_SchedulingInfo_v1700 *si_SchedulingInfo_v1700;
-  int si_window_start;
+
+  si_schedInfo_t si_SchedInfo;
   ssb_list_info_t ssb_list[MAX_NUM_BWP_UE];
   prach_association_pattern_t prach_assoc_pattern[MAX_NUM_BWP_UE];
 
@@ -594,8 +637,8 @@ typedef struct NR_UE_MAC_INST_s {
 
   // Defined for abstracted mode
   nr_downlink_indication_t dl_info;
-  NR_UE_HARQ_STATUS_t dl_harq_info[NR_MAX_HARQ_PROCESSES];
-  NR_UL_HARQ_INFO_t ul_harq_info[NR_MAX_HARQ_PROCESSES];
+  NR_UE_DL_HARQ_STATUS_t dl_harq_info[NR_MAX_HARQ_PROCESSES];
+  NR_UE_UL_HARQ_INFO_t ul_harq_info[NR_MAX_HARQ_PROCESSES];
 
   NR_TAG_Id_t tag_Id;
   A_SEQUENCE_OF(NR_TAG_t) TAG_list;
@@ -615,6 +658,7 @@ typedef struct NR_UE_MAC_INST_s {
   bool pusch_power_control_initialized;
   int delta_msg2;
   pthread_mutex_t if_mutex;
+  ue_mac_stats_t stats;
 } NR_UE_MAC_INST_t;
 
 /*@}*/
diff --git a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
index 68dd57efd1976b8ddc4b97ffa9592757cd817667..76dd88d07d95a3f30d25fe537397942c5719b1de 100644
--- a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
+++ b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
@@ -60,7 +60,7 @@ void nr_ue_init_mac(NR_UE_MAC_INST_t *mac)
   mac->get_sib1 = false;
   mac->get_otherSI = false;
   memset(&mac->phy_config, 0, sizeof(mac->phy_config));
-  mac->si_window_start = -1;
+  mac->si_SchedInfo.si_window_start = -1;
   mac->servCellIndex = 0;
   mac->harq_ACK_SpatialBundlingPUCCH = false;
   mac->harq_ACK_SpatialBundlingPUSCH = false;
@@ -240,8 +240,7 @@ void reset_mac_inst(NR_UE_MAC_INST_t *nr_mac)
   nr_mac->scheduling_info.phr_info.was_mac_reset = true;
 
   // flush the soft buffers for all DL HARQ processes
-  for (int k = 0; k < NR_MAX_HARQ_PROCESSES; k++)
-    memset(&nr_mac->dl_harq_info[k], 0, sizeof(NR_UE_HARQ_STATUS_t));
+  memset(nr_mac->dl_harq_info, 0, sizeof(nr_mac->dl_harq_info));
 
   // for each DL HARQ process, consider the next received transmission for a TB as the very first transmission
   for (int k = 0; k < NR_MAX_HARQ_PROCESSES; k++)
@@ -262,7 +261,7 @@ void release_mac_configuration(NR_UE_MAC_INST_t *mac, NR_UE_MAC_reset_cause_t ca
     asn1cFreeStruc(asn_DEF_NR_MIB, mac->mib);
     asn1cFreeStruc(asn_DEF_NR_SearchSpace, mac->search_space_zero);
     asn1cFreeStruc(asn_DEF_NR_ControlResourceSet, mac->coreset0);
-    asn1cFreeStruc(asn_DEF_NR_SI_SchedulingInfo, mac->si_SchedulingInfo);
+    asn_sequence_empty(&mac->si_SchedInfo.si_SchedInfo_list);
     asn1cFreeStruc(asn_DEF_NR_TDD_UL_DL_ConfigCommon, mac->tdd_UL_DL_ConfigurationCommon);
     for (int i = mac->lc_ordered_list.count; i > 0 ; i--)
       asn_sequence_del(&mac->lc_ordered_list, i - 1, 1);
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
index 53f29ff056e8de495824cd83e0c1370c754a5772..26fcd9575740de1d0b75bbd31d1f3eecd6b31c01 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
@@ -1053,7 +1053,7 @@ void trigger_MAC_UE_RA(NR_UE_MAC_INST_t *mac)
 
 void prepare_msg4_msgb_feedback(NR_UE_MAC_INST_t *mac, int pid, int ack_nack)
 {
-  NR_UE_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[pid];
+  NR_UE_DL_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[pid];
   int sched_slot = current_harq->ul_slot;
   int sched_frame = current_harq->ul_frame;
   mac->nr_ue_emul_l1.num_harqs = 1;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
index 1c01f84d4d8515ba2a287ca495725fa7a86c9451..debd5226bee0f478a68f68a36326927ff0bd0608 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
@@ -444,8 +444,8 @@ bool search_space_monitoring_ocasion_other_si(NR_UE_MAC_INST_t *mac,
       int K = mac->ssb_list->nb_ssb_per_index[mac->mib_ssb];
 
       // numbering current frame and slot in terms of monitoring occasions in window
-      int current_monitor_occasion =
-          ((abs_slot - mac->si_window_start) % period) + (duration * (abs_slot - mac->si_window_start) / period);
+      int rel_slot = abs_slot - mac->si_SchedInfo.si_window_start;
+      int current_monitor_occasion = (rel_slot % period) + (duration * rel_slot / period);
       return current_monitor_occasion % N == K;
     }
   }
@@ -455,12 +455,12 @@ bool search_space_monitoring_ocasion_other_si(NR_UE_MAC_INST_t *mac,
 
 bool is_window_valid(NR_UE_MAC_INST_t *mac, int window_slots, int abs_slot)
 {
-  if (mac->si_window_start == -1) {
+  if (mac->si_SchedInfo.si_window_start == -1) {
     // out of window
     return false;
-  } else if (abs_slot > mac->si_window_start + window_slots) {
+  } else if (abs_slot > mac->si_SchedInfo.si_window_start + window_slots) {
     // window expired
-    mac->si_window_start = -1;
+    mac->si_SchedInfo.si_window_start = -1;
     return false;
   }
   return true;
@@ -472,56 +472,38 @@ bool monitor_dci_for_other_SI(NR_UE_MAC_INST_t *mac,
                               const int frame,
                               const int slot)
 {
-  const struct NR_SI_SchedulingInfo *si_SchedulingInfo = mac->si_SchedulingInfo;
-  const struct NR_SI_SchedulingInfo_v1700 *si_SchedulingInfo_v1700 = mac->si_SchedulingInfo_v1700;
-  // 5.2.2.3.2 in 331
-
-  if (!si_SchedulingInfo_v1700 && !si_SchedulingInfo) {
-    LOG_D(NR_MAC_DCI, "No scheduling info provided in SIB1\n");
-    return false;
-  }
-
+  // according to 5.2.2.3.2 in 331
   const int abs_slot = frame * slots_per_frame + slot;
   const int bwp_id = mac->current_DL_BWP->bwp_id;
 
-  if (si_SchedulingInfo) {
-    const int si_window_slots = 5 << si_SchedulingInfo->si_WindowLength;
-    for (int n = 0; n < si_SchedulingInfo->schedulingInfoList.list.count; n++) {
-      struct NR_SchedulingInfo *sched_Info = si_SchedulingInfo->schedulingInfoList.list.array[n];
-      if (mac->si_window_start == -1) {
-        int x = n * si_window_slots;
-        int T = 8 << sched_Info->si_Periodicity; // radio frame periodicity
-        if ((frame % T) == (x / slots_per_frame) && (x % slots_per_frame == 0))
-          mac->si_window_start = abs_slot; // in terms of absolute slot number
-      }
-      bool check_valid = is_window_valid(mac, si_window_slots, abs_slot);
-      if (check_valid && search_space_monitoring_ocasion_other_si(mac, ss, abs_slot, frame, slot, slots_per_frame, bwp_id)) {
-        return true;
-      }
-    }
-  }
-
-  if (si_SchedulingInfo_v1700) {
-    for (int n = 0; n < si_SchedulingInfo_v1700->schedulingInfoList2_r17.list.count; n++) {
-      struct NR_SchedulingInfo2_r17 *sched_Info = si_SchedulingInfo_v1700->schedulingInfoList2_r17.list.array[n];
-
-      const int T = 8 << sched_Info->si_Periodicity_r17;
-      const int window_slots = 5 << 1; // 10 slots
-      const int x = ((sched_Info->si_WindowPosition_r17 - 1) * window_slots); //  currently window starts from slot 0, maybe + 1?
-      const int N = 10; // TS 38.211
-
-      if (mac->si_window_start == -1) {
-        // this condition will calculate where SI-window starts
-        // 5.2.2.3.2
-        if ((frame % T == floor(x / N)) && (slot == x % N)) {
-          mac->si_window_start = abs_slot;
+  for (int i = 0; i < mac->si_SchedInfo.si_SchedInfo_list.count; i++) {
+    si_schedinfo_config_t *config = mac->si_SchedInfo.si_SchedInfo_list.array[i];
+    int window_slots = 5 << mac->si_SchedInfo.si_WindowLength;
+    int x = (config->si_WindowPosition - 1) * window_slots;
+    int T = 8 << config->si_Periodicity; // radio frame periodicity
+    bool check_valid;
+    switch (config->type) {
+      case NR_SI_INFO :
+        if (mac->si_SchedInfo.si_window_start == -1) {
+          if ((frame % T) == (x / slots_per_frame) && (x % slots_per_frame == 0))
+            mac->si_SchedInfo.si_window_start = abs_slot; // in terms of absolute slot number
         }
-      }
-
-      bool check_valid = is_window_valid(mac, window_slots, abs_slot);
-      if (check_valid && (sched_Info->si_WindowPosition_r17 - 1) == slot) {
-        return search_space_monitoring_ocasion_other_si(mac, ss, abs_slot, frame, slot, slots_per_frame, bwp_id);
-      }
+        check_valid = is_window_valid(mac, window_slots, abs_slot);
+        if (check_valid && search_space_monitoring_ocasion_other_si(mac, ss, abs_slot, frame, slot, slots_per_frame, bwp_id))
+          return true;
+        break;
+      case NR_SI_INFO_v1700 :
+        if (mac->si_SchedInfo.si_window_start == -1) {
+          if ((frame % T == floor(x / slots_per_frame)) && (slot == x % slots_per_frame))
+            mac->si_SchedInfo.si_window_start = abs_slot;
+        }
+        window_slots = 10; // TODO window length hardcoded to 10 at gNB for NTN
+        check_valid = is_window_valid(mac, window_slots, abs_slot);
+        if (check_valid && (config->si_WindowPosition - 1) == slot)
+          return search_space_monitoring_ocasion_other_si(mac, ss, abs_slot, frame, slot, slots_per_frame, bwp_id);
+        break;
+      default :
+        AssertFatal(false, "Invalid SI-SchedulingInfo case\n");
     }
   }
   return false;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index c871a696da92901004826b9e3ab06c1952c3c8a5..5376d85ef8fb0792a04b92f9a88a566f7cdb950c 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -806,7 +806,7 @@ static int nr_ue_process_dci_dl_10(NR_UE_MAC_INST_t *mac,
   /* MCS */
   dlsch_pdu->mcs = dci->mcs;
 
-  NR_UE_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[dci->harq_pid.val];
+  NR_UE_DL_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[dci->harq_pid.val];
   /* NDI (only if CRC scrambled by C-RNTI or CS-RNTI or new-RNTI or TC-RNTI)*/
   if (dl_conf_req->pdu_type == FAPI_NR_DL_CONFIG_TYPE_SI_DLSCH ||
       dl_conf_req->pdu_type == FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH ||
@@ -815,9 +815,9 @@ static int nr_ue_process_dci_dl_10(NR_UE_MAC_INST_t *mac,
     dlsch_pdu->new_data_indicator = true;
     current_harq->R = 0;
     current_harq->TBS = 0;
-  }
-  else
+  } else {
     dlsch_pdu->new_data_indicator = false;
+  }
 
   if (dl_conf_req->pdu_type != FAPI_NR_DL_CONFIG_TYPE_SI_DLSCH &&
       dl_conf_req->pdu_type != FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH) {
@@ -935,6 +935,12 @@ static int nr_ue_process_dci_dl_10(NR_UE_MAC_INST_t *mac,
                     dci_ind->N_CCE,
                     frame,
                     slot);
+    if (dlsch_pdu->new_data_indicator)
+      current_harq->round = 0;
+    else
+      current_harq->round++;
+    if (current_harq->round < sizeofArray(mac->stats.dl.rounds))
+      mac->stats.dl.rounds[current_harq->round]++;
   }
 
   LOG_D(MAC,
@@ -1126,7 +1132,7 @@ static int nr_ue_process_dci_dl_11(NR_UE_MAC_INST_t *mac,
   /* MCS (for transport block 1)*/
   dlsch_pdu->mcs = dci->mcs;
   /* NDI (for transport block 1)*/
-  NR_UE_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[dci->harq_pid.val];
+  NR_UE_DL_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[dci->harq_pid.val];
   if (dci->ndi != current_harq->last_ndi) {
     // new data
     dlsch_pdu->new_data_indicator = true;
@@ -1275,6 +1281,12 @@ static int nr_ue_process_dci_dl_11(NR_UE_MAC_INST_t *mac,
                   dci_ind->N_CCE,
                   frame,
                   slot);
+  if (dlsch_pdu->new_data_indicator)
+    current_harq->round = 0;
+  else
+    current_harq->round++;
+  if (current_harq->round < sizeofArray(mac->stats.dl.rounds))
+    mac->stats.dl.rounds[current_harq->round]++;
   // send the ack/nack slot number to phy to indicate tx thread to wait for DLSCH decoding
   dlsch_pdu->k1_feedback = feedback_ti;
 
@@ -1432,10 +1444,11 @@ nr_dci_format_t nr_ue_process_dci_indication_pdu(NR_UE_MAC_INST_t *mac, frame_t
       nr_extract_dci_info(mac, dci->dci_format, dci->payloadSize, dci->rnti, dci->ss_type, dci->payloadBits, slot);
   if (format == NR_DCI_NONE)
     return NR_DCI_NONE;
-  dci_pdu_rel15_t *def_dci_pdu_rel15 = &mac->def_dci_pdu_rel15[slot][format];
-  int ret = nr_ue_process_dci(mac, frame, slot, def_dci_pdu_rel15, dci, format);
-  if (ret < 0)
+  int ret = nr_ue_process_dci(mac, frame, slot, mac->def_dci_pdu_rel15[slot] + format, dci, format);
+  if (ret < 0) {
+    mac->stats.bad_dci++;
     return NR_DCI_NONE;
+  }
   return format;
 }
 
@@ -1459,7 +1472,7 @@ void set_harq_status(NR_UE_MAC_INST_t *mac,
                      frame_t frame,
                      int slot)
 {
-  NR_UE_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[harq_id];
+  NR_UE_DL_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[harq_id];
   current_harq->active = true;
   current_harq->ack_received = false;
   current_harq->pucch_resource_indicator = pucch_id;
@@ -1486,7 +1499,7 @@ void set_harq_status(NR_UE_MAC_INST_t *mac,
     // looking for other active HARQ processes with feedback in the same frame/slot
     if (i == harq_id)
       continue;
-    NR_UE_HARQ_STATUS_t *harq = &mac->dl_harq_info[i];
+    NR_UE_DL_HARQ_STATUS_t *harq = &mac->dl_harq_info[i];
     if (harq->active &&
         harq->ul_frame == current_harq->ul_frame &&
         harq->ul_slot == current_harq->ul_slot) {
@@ -2331,7 +2344,7 @@ bool get_downlink_ack(NR_UE_MAC_INST_t *mac, frame_t frame, int slot, PUCCH_sche
 
     for (int dl_harq_pid = 0; dl_harq_pid < num_dl_harq; dl_harq_pid++) {
 
-      NR_UE_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[dl_harq_pid];
+      NR_UE_DL_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[dl_harq_pid];
 
       if (current_harq->active) {
         LOG_D(PHY, "HARQ pid %d is active for %d.%d\n",
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index ff44c21541f223e47d37d7f6ce96a9705eb7bba5..65597bd3dd8303f58b01191f9f5f5bc9f2e0b72c 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -166,8 +166,8 @@ void handle_time_alignment_timer_expired(NR_UE_MAC_INST_t *mac)
 {
   // flush all HARQ buffers for all Serving Cells
   for (int k = 0; k < NR_MAX_HARQ_PROCESSES; k++) {
-    memset(&mac->dl_harq_info[k], 0, sizeof(NR_UE_HARQ_STATUS_t));
-    memset(&mac->ul_harq_info[k], 0, sizeof(NR_UL_HARQ_INFO_t));
+    memset(&mac->dl_harq_info[k], 0, sizeof(*mac->dl_harq_info));
+    memset(&mac->ul_harq_info[k], 0, sizeof(*mac->ul_harq_info));
     mac->dl_harq_info[k].last_ndi = -1; // initialize to invalid value
     mac->ul_harq_info[k].last_ndi = -1; // initialize to invalid value
   }
@@ -704,6 +704,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
                                                        0,
                                                        f_alloc) < 0) {
       LOG_E(NR_MAC, "can't nr_ue_process_dci_freq_dom_resource_assignment()\n");
+      mac->stats.bad_dci++;
       return -1;
     }
 
@@ -713,7 +714,6 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
     // Time domain allocation
     pusch_config_pdu->start_symbol_index = tda_info->startSymbolIndex;
     pusch_config_pdu->nr_of_symbols = tda_info->nrOfSymbols;
-
     l_prime_mask = get_l_prime(tda_info->nrOfSymbols,
                                tda_info->mapping_type,
                                add_pos,
@@ -817,11 +817,13 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
       ul_ports_config(mac, &dmrslength, pusch_config_pdu, dci, dci_format);
     } else {
       LOG_E(NR_MAC, "UL grant from DCI format %d is not handled...\n", dci_format);
+      mac->stats.bad_dci++;
       return -1;
     }
 
     if (pusch_config_pdu->nrOfLayers < 1) {
       LOG_E(NR_MAC, "Invalid UL number of layers %d from DCI\n", pusch_config_pdu->nrOfLayers);
+      mac->stats.bad_dci++;
       return -1;
     }
 
@@ -892,6 +894,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
                                                        0,
                                                        dci->frequency_domain_assignment) < 0) {
       LOG_E(NR_MAC, "can't nr_ue_process_dci_freq_dom_resource_assignment()\n");
+      mac->stats.bad_dci++;
       return -1;
     }
 
@@ -910,18 +913,20 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
     pusch_config_pdu->mcs_table = get_pusch_mcs_table(mcs_table_config, tp_enabled, dci_format, rnti_type, ss_type, false);
 
     /* NDI */
-    NR_UL_HARQ_INFO_t *harq = &mac->ul_harq_info[dci->harq_pid.val];
+    const int pid = dci->harq_pid.val;
+    NR_UE_UL_HARQ_INFO_t *harq = &mac->ul_harq_info[pid];
     pusch_config_pdu->pusch_data.new_data_indicator = false;
     if (dci->ndi != harq->last_ndi) {
       pusch_config_pdu->pusch_data.new_data_indicator = true;
       // if new data reset harq structure
       memset(harq, 0, sizeof(*harq));
-    }
+    } else
+      harq->round++;
     harq->last_ndi = dci->ndi;
     /* RV */
     pusch_config_pdu->pusch_data.rv_index = dci->rv;
     /* HARQ_PROCESS_NUMBER */
-    pusch_config_pdu->pusch_data.harq_process_id = dci->harq_pid.val;
+    pusch_config_pdu->pusch_data.harq_process_id = pid;
 
     if (NR_DMRS_ulconfig != NULL)
       add_pos = (NR_DMRS_ulconfig->dmrs_AdditionalPosition == NULL) ? 2 : *NR_DMRS_ulconfig->dmrs_AdditionalPosition;
@@ -994,6 +999,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
   pusch_config_pdu->qam_mod_order = nr_get_Qm_ul(pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table);
   if (pusch_config_pdu->qam_mod_order == 0) {
     LOG_W(NR_MAC, "Invalid Mod order, likely due to unexpected UL DCI. Ignoring DCI! \n");
+    mac->stats.bad_dci++;
     return -1;
   }
 
@@ -1001,15 +1007,16 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
   int number_of_symbols = pusch_config_pdu->nr_of_symbols;
   int number_dmrs_symbols = 0;
   for (int i = start_symbol; i < start_symbol + number_of_symbols; i++) {
-    if((pusch_config_pdu->ul_dmrs_symb_pos >> i) & 0x01)
+    if ((pusch_config_pdu->ul_dmrs_symb_pos >> i) & 0x01)
       number_dmrs_symbols += 1;
   }
 
-  int nb_dmrs_re_per_rb = ((pusch_config_pdu->dmrs_config_type == pusch_dmrs_type1) ? 6 : 4) * pusch_config_pdu->num_dmrs_cdm_grps_no_data;
+  int nb_dmrs_re_per_rb =
+      ((pusch_config_pdu->dmrs_config_type == pusch_dmrs_type1) ? 6 : 4) * pusch_config_pdu->num_dmrs_cdm_grps_no_data;
 
   // Compute TBS
   uint16_t R = nr_get_code_rate_ul(pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table);
-  int pid = pusch_config_pdu->pusch_data.harq_process_id;
+  const int pid = pusch_config_pdu->pusch_data.harq_process_id;
   if (R > 0) {
     pusch_config_pdu->target_code_rate = R;
     pusch_config_pdu->pusch_data.tb_size = nr_compute_tbs(pusch_config_pdu->qam_mod_order,
@@ -1022,8 +1029,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
                                                           pusch_config_pdu->nrOfLayers) >> 3;
     mac->ul_harq_info[pid].TBS = pusch_config_pdu->pusch_data.tb_size;
     mac->ul_harq_info[pid].R = R;
-  }
-  else {
+  } else {
     pusch_config_pdu->target_code_rate = mac->ul_harq_info[pid].R;
     pusch_config_pdu->pusch_data.tb_size = mac->ul_harq_info[pid].TBS;
   }
@@ -1052,7 +1058,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
                                                      pusch_config_pdu->rb_start,
                                                      pusch_config_pdu->nr_of_symbols,
                                                      nb_dmrs_re_per_rb * number_dmrs_symbols,
-                                                     0, //TODO: count PTRS per RB
+                                                     0, // TODO: count PTRS per RB
                                                      pusch_config_pdu->qam_mod_order,
                                                      pusch_config_pdu->target_code_rate,
                                                      pusch_config_pdu->pusch_uci.beta_offset_csi1,
@@ -1063,12 +1069,13 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
 
   pusch_config_pdu->ldpcBaseGraph = get_BG(pusch_config_pdu->pusch_data.tb_size << 3, pusch_config_pdu->target_code_rate);
 
-  //The MAC entity shall restart retxBSR-Timer upon reception of a grant for transmission of new data on any UL-SCH
+  // The MAC entity shall restart retxBSR-Timer upon reception of a grant for transmission of new data on any UL-SCH
   if (pusch_config_pdu->pusch_data.new_data_indicator && dci && dci->ulsch_indicator)
     nr_timer_start(&mac->scheduling_info.retxBSR_Timer);
 
   if (pusch_config_pdu->pusch_data.tb_size == 0) {
     LOG_E(MAC, "Invalid TBS = 0. Probably caused by missed detection of DCI\n");
+    mac->stats.bad_dci++;
     return -1;
   }
 
@@ -1081,6 +1088,14 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
       nr_timer_start(&mac->scheduling_info.phr_info.periodicPHR_Timer);
     }
   }
+  if (mac->ul_harq_info[pid].round < sizeofArray(mac->stats.ul.rounds))
+    mac->stats.ul.rounds[mac->ul_harq_info[pid].round]++;
+  int bits = pusch_config_pdu->pusch_data.tb_size;
+  mac->stats.ul.total_bits += bits;
+  mac->stats.ul.target_code_rate += pusch_config_pdu->target_code_rate * bits;
+  mac->stats.ul.total_symbols += bits / pusch_config_pdu->qam_mod_order;
+  mac->stats.ul.rb_size += pusch_config_pdu->rb_size;
+  mac->stats.ul.nr_of_symbols += pusch_config_pdu->nr_of_symbols;
 
   return 0;
 }
@@ -2124,9 +2139,9 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac)
                         tx_ssb->nb_mapped_ro);
                   // If all the required SSBs are mapped to this RO, exit the loop of SSBs
                   if (ro_p->nb_mapped_ssb == ssb_rach_ratio) {
-                      idx++;
-                      break;
-                    }
+                    idx++;
+                    break;
+                  }
                 }
                 done = MAX_NB_SSB == idx;
               }
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index 9ded7673958ffc9b9416ec94521d145e38a4e118..4927f407d0e7d2393332407e550c1a0fd968e88b 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -30,26 +30,37 @@
 
  */
 
-#include "common/platform_types.h"
-#include "common/platform_constants.h"
-#include "common/ran_context.h"
-#include "common/utils/nr/nr_common.h"
-#include "common/utils/LOG/log.h"
-#include "common/utils/LOG/vcd_signal_dumper.h"
-
+#include <complex.h>
+#include <math.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include "BIT_STRING.h"
+#include "LAYER2/NR_MAC_COMMON/nr_mac_common.h"
+#include "LAYER2/NR_MAC_gNB/mac_proto.h"
+#include "NR_MIB.h"
+#include "NR_MAC_COMMON/nr_mac_extern.h"
+#include "NR_MAC_gNB/nr_mac_gNB.h"
 #include "NR_BCCH-BCH-Message.h"
 #include "NR_ServingCellConfigCommon.h"
-#include "uper_encoder.h"
-
-#include "LAYER2/NR_MAC_gNB/mac_proto.h"
-#include "SCHED_NR/phy_frame_config_nr.h"
-
 #include "NR_MIB.h"
-#include "LAYER2/NR_MAC_COMMON/nr_mac_common.h"
-#include "nfapi/oai_integration/vendor_ext.h"
-/* Softmodem params */
+#include "PHY/TOOLS/tools_defs.h"
+#include "PHY/defs_common.h"
+#include "RRC/NR/nr_rrc_config.h"
+#include "SCHED_NR/phy_frame_config_nr.h"
+#include "T.h"
+#include "asn_internal.h"
+#include "assertions.h"
+#include "common/ran_context.h"
+#include "common/utils/T/T.h"
+#include "common/utils/nr/nr_common.h"
 #include "executables/softmodem-common.h"
-#include <complex.h>
+#include "f1ap_messages_types.h"
+#include "nfapi/oai_integration/vendor_ext.h"
+#include "nfapi_interface.h"
+#include "nfapi_nr_interface.h"
+#include "nfapi_nr_interface_scf.h"
+#include "utils.h"
 
 extern RAN_CONTEXT_t RC;
 //extern int l2_init_gNB(void);
diff --git a/openair2/LAYER2/NR_MAC_gNB/main.c b/openair2/LAYER2/NR_MAC_gNB/main.c
index a663ed522ca9c0683a59abe66d8d11b607d6c0e4..f8e6d120de11a5974d790745b8b75ba6a04224cd 100644
--- a/openair2/LAYER2/NR_MAC_gNB/main.c
+++ b/openair2/LAYER2/NR_MAC_gNB/main.c
@@ -30,17 +30,47 @@
 
  */
 
+#include <errno.h>
+#include <inttypes.h>
+#include <pthread.h>
+#include <sched.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+#include "NR_DRB-ToAddMod.h"
+#include "NR_DRB-ToAddModList.h"
+#include "NR_MAC_COMMON/nr_mac.h"
+#include "NR_MAC_COMMON/nr_mac_common.h"
 #include "NR_MAC_gNB/mac_proto.h"
-#include "NR_MAC_COMMON/nr_mac_extern.h"
+#include "NR_MAC_gNB/mac_rrc_ul.h"
+#include "NR_MAC_gNB/nr_mac_gNB.h"
+#include "NR_PHY_INTERFACE/NR_IF_Module.h"
+#include "NR_RLC-BearerConfig.h"
+#include "NR_RadioBearerConfig.h"
+#include "NR_ServingCellConfig.h"
+#include "NR_ServingCellConfigCommon.h"
+#include "NR_TAG.h"
+#include "PHY/defs_common.h"
+#include "RRC/NR/MESSAGES/asn1_msg.h"
+#include "RRC/NR/nr_rrc_config.h"
 #include "assertions.h"
+#include "common/ngran_types.h"
+#include "common/ran_context.h"
+#include "common/utils/T/T.h"
+#include "executables/softmodem-common.h"
+#include "linear_alloc.h"
+#include "nr_pdcp/nr_pdcp_entity.h"
 #include "nr_pdcp/nr_pdcp_oai_api.h"
-
-#include "common/utils/LOG/log.h"
 #include "nr_rlc/nr_rlc_oai_api.h"
 #include "openair2/F1AP/f1ap_ids.h"
-
-#include "common/ran_context.h"
-#include "executables/softmodem-common.h"
+#include "rlc.h"
+#include "seq_arr.h"
+#include "system.h"
+#include "time_meas.h"
+#include "utils.h"
 
 extern RAN_CONTEXT_t RC;
 
diff --git a/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.c b/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.c
index e0ac1302790d1cf7be85cc8e5ff48b80b8afee8c..ab2756c3cdbb4f0dbdf03bcefebf11f0aa861d67 100644
--- a/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.c
+++ b/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.c
@@ -20,20 +20,33 @@
  */
 
 #include "cucp_cuup_handler.h"
-
+#include <netinet/in.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include "NR_DRB-ToAddMod.h"
 #include "NR_DRB-ToAddModList.h"
-
-#include "common/platform_types.h"
-#include "intertask_interface.h"
-#include "openair2/COMMON/e1ap_messages_types.h"
-#include "openair3/ocp-gtpu/gtp_itf.h"
-#include "openair2/F1AP/f1ap_ids.h"
-#include "nr_pdcp_oai_api.h"
-#include "cuup_cucp_if.h"
+#include "NR_PDCP-Config.h"
+#include "NR_QFI.h"
+#include "NR_SDAP-Config.h"
+#include "PHY/defs_common.h"
+#include "RRC/NR/nr_rrc_common.h"
+#include "SDAP/nr_sdap/nr_sdap_entity.h"
+#include "asn_internal.h"
+#include "assertions.h"
+#include "common/utils/T/T.h"
 #include "common/utils/oai_asn1.h"
-#include "openair2/SDAP/nr_sdap/nr_sdap.h"
+#include "constr_TYPE.h"
+#include "cuup_cucp_if.h"
+#include "gtpv1_u_messages_types.h"
+#include "nr_pdcp/nr_pdcp_entity.h"
+#include "nr_pdcp_oai_api.h"
+#include "openair2/COMMON/e1ap_messages_types.h"
 #include "openair2/E1AP/e1ap_common.h"
 #include "openair2/F1AP/f1ap_common.h"
+#include "openair2/F1AP/f1ap_ids.h"
+#include "openair2/SDAP/nr_sdap/nr_sdap.h"
+#include "openair3/ocp-gtpu/gtp_itf.h"
 
 static void fill_DRB_configList_e1(NR_DRB_ToAddModList_t *DRB_configList, const pdu_session_to_setup_t *pdu)
 {
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
index a416ddd617c50efd43d7266b36d4bdf2b76bb532..cb80ec99cef2eda5d989b8e830dbb0b7397441b3 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
@@ -22,27 +22,50 @@
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
+#include "nr_pdcp_oai_api.h"
+#include <errno.h>
+#include <fcntl.h>
+#include <openair3/ocp-gtpu/gtp_itf.h>
+#include <pthread.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "LAYER2/MAC/mac_extern.h"
+#include "LTE_DRB-ToAddModList.h"
+#include "LTE_DRB-ToReleaseList.h"
+#include "LTE_PMCH-InfoList-r9.h"
+#include "LTE_SRB-ToAddModList.h"
+#include "NR_DRB-ToAddMod.h"
+#include "NR_QFI.h"
+#include "NR_SDAP-Config.h"
+#include "NR_SRB-ToAddMod.h"
+#include "SDAP/nr_sdap/nr_sdap_entity.h"
+#include "assertions.h"
+#include "common/ngran_types.h"
+#include "common/platform_constants.h"
+#include "common/ran_context.h"
+#include "common/utils/T/T.h"
+#include "common/utils/tun_if.h"
+#include "cuup_cucp_if.h"
+#include "executables/lte-softmodem.h"
+#include "executables/softmodem-common.h"
+#include "f1ap_messages_types.h"
+#include "gnb_config.h"
+#include "gtpv1_u_messages_types.h"
+#include "hashtable.h"
+#include "intertask_interface.h"
+#include "common/utils/LOG/log.h"
+#include "nfapi/oai_integration/vendor_ext.h"
 #include "nr_pdcp_asn1_utils.h"
-#include "nr_pdcp_ue_manager.h"
 #include "nr_pdcp_timer_thread.h"
-#include "NR_RadioBearerConfig.h"
-#include "NR_RLC-BearerConfig.h"
-#include "NR_RLC-Config.h"
-#include "NR_CellGroupConfig.h"
-#include "openair2/RRC/NR/nr_rrc_proto.h"
-#include "common/utils/mem/oai_memory.h"
-#include <stdint.h>
-
-/* from OAI */
-#include "oai_asn1.h"
-#include "nr_pdcp_oai_api.h"
-#include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
+#include "nr_pdcp_ue_manager.h"
 #include "openair2/F1AP/f1ap_ids.h"
-#include <openair3/ocp-gtpu/gtp_itf.h>
 #include "openair2/SDAP/nr_sdap/nr_sdap.h"
-#include "gnb_config.h"
-#include "executables/softmodem-common.h"
-#include "cuup_cucp_if.h"
+#include "pdcp.h"
+#include "pdcp_messages_types.h"
+#include "rlc.h"
+#include "utils.h"
 
 #define TODO do { \
     printf("%s:%d:%s: todo\n", __FILE__, __LINE__, __FUNCTION__); \
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h
index 967a2719ee9da84a9f271521a05c44e659a1c328..bdeb01fff135f9132a7174c36b58763638a4a8bd 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h
@@ -22,8 +22,17 @@
 #ifndef NR_PDCP_OAI_API_H
 #define NR_PDCP_OAI_API_H
 
-#include "pdcp.h"
+#include <assertions.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include "NR_DRB-ToAddModList.h"
+#include "NR_PDCP-Config.h"
+#include "NR_SRB-ToAddModList.h"
+#include "nr_pdcp/nr_pdcp_entity.h"
+#include "nr_pdcp/nr_pdcp_integrity_data.h"
 #include "nr_pdcp_ue_manager.h"
+struct NR_DRB_ToAddMod;
+struct NR_SRB_ToAddMod;
 
 void nr_pdcp_layer_init(void);
 uint64_t nr_pdcp_module_init(uint64_t _pdcp_optmask, int id);
diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
index 455deb1eacd34a35e4a5bab38a530959f100692b..fd392ceae8d39be788bddccdc210640b5dfd0af8 100644
--- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
@@ -31,14 +31,20 @@
 */
 
 #include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h"
-#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
 #include "LAYER2/NR_MAC_gNB/mac_proto.h"
-#include "common/ran_context.h"
+#include "PHY/defs_common.h"
+#include "common/platform_constants.h"
+#include "common/utils/T/T.h"
 #include "executables/softmodem-common.h"
-#include "nfapi/oai_integration/vendor_ext.h" 
 #include "nfapi/oai_integration/gnb_ind_vars.h"
-#include "openair2/PHY_INTERFACE/queue_t.h"
+#include "nfapi/oai_integration/vendor_ext.h"
+#include "nfapi_interface.h"
 #include "openair2/NR_PHY_INTERFACE/nr_sched_response.h"
+#include "openair2/PHY_INTERFACE/queue_t.h"
+#include "utils.h"
 
 #define MAX_IF_MODULES 100
 
diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_PHY_INTERFACE/NR_IF_Module.h
index 82ccdb782f4fcca421533c3090eb73673ee86a01..261ead1ba065dbb177de86ee0255c8df7ecaac48 100644
--- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.h
+++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.h
@@ -35,9 +35,8 @@
 
 #include <pthread.h>
 #include <stdint.h>
+#include "assertions.h"
 #include "nfapi_nr_interface_scf.h"
-#include "common/platform_constants.h"
-#include "common/platform_types.h"
 
 #define MAX_NUM_DL_PDU 100
 #define MAX_NUM_UL_PDU 100
diff --git a/openair2/NR_PHY_INTERFACE/nr_sched_response.c b/openair2/NR_PHY_INTERFACE/nr_sched_response.c
index 17b6c56c29e3d6b2b27e19a413d3bfc427ff1b8c..9c66b215368ce2451f5b8fdee4ca2255179d1638 100644
--- a/openair2/NR_PHY_INTERFACE/nr_sched_response.c
+++ b/openair2/NR_PHY_INTERFACE/nr_sched_response.c
@@ -38,10 +38,10 @@
  */
 
 #include "nr_sched_response.h"
-
 #include <pthread.h>
+#include <stdbool.h>
 #include <stdlib.h>
-
+#include "NR_PHY_INTERFACE/NR_IF_Module.h"
 #include "common/utils/LOG/log.h"
 #include "common/utils/assertions.h"
 
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
index 10faa6cc657387dc8f301c82fea386d09a28bf44..44118704a49d18eb9310c64987cd53f9ac541d31 100644
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
@@ -67,6 +67,57 @@ queue_t nr_ul_dci_req_queue;
 queue_t nr_ul_tti_req_queue;
 static void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request);
 
+void print_ue_mac_stats(const module_id_t mod, const int frame_rx, const int slot_rx)
+{
+  NR_UE_MAC_INST_t *mac = get_mac_inst(mod);
+  int ret = pthread_mutex_lock(&mac->if_mutex);
+  AssertFatal(!ret, "mutex failed %d\n", ret);
+
+  char txt[1024];
+  char *end = txt + sizeof(txt);
+  char *cur = txt;
+
+  float nbul = 0;
+  for (uint64_t *p = mac->stats.ul.rounds; p < mac->stats.ul.rounds + NR_MAX_HARQ_ROUNDS_FOR_STATS; p++)
+    nbul += *p;
+  if (nbul < 1)
+    nbul = 1;
+
+  float nbdl = 0;
+  for (uint64_t *p = mac->stats.dl.rounds; p < mac->stats.dl.rounds + NR_MAX_HARQ_ROUNDS_FOR_STATS; p++)
+    nbdl += *p;
+  if (nbdl < 1)
+    nbdl = 1;
+
+  cur += snprintf(cur, end - cur, "UE %d stats sfn: %d.%d, cumulated bad DCI %d\n", mod, frame_rx, slot_rx, mac->stats.bad_dci);
+
+  cur += snprintf(cur, end - cur, "    DL harq: %lu", mac->stats.dl.rounds[0]);
+  int nb;
+  for (nb = NR_MAX_HARQ_ROUNDS_FOR_STATS - 1; nb > 1; nb--)
+    if (mac->stats.ul.rounds[nb])
+      break;
+  for (int i = 1; i < nb + 1; i++)
+    cur += snprintf(cur, end - cur, "/%lu", mac->stats.dl.rounds[i]);
+
+  cur += snprintf(cur, end - cur, "\n    Ul harq: %lu", mac->stats.ul.rounds[0]);
+  for (nb = NR_MAX_HARQ_ROUNDS_FOR_STATS - 1; nb > 1; nb--)
+    if (mac->stats.ul.rounds[nb])
+      break;
+  for (int i = 1; i < nb + 1; i++)
+    cur += snprintf(cur, end - cur, "/%lu", mac->stats.ul.rounds[i]);
+  snprintf(cur,
+           end - cur,
+           " avg code rate %.01f, avg bit/symbol %.01f, avg per TB: "
+           "(nb RBs %.01f, nb symbols %.01f)\n",
+           (double)mac->stats.ul.target_code_rate / (mac->stats.ul.total_bits * 1024 * 10), // See const Table_51311 definition
+           (double)mac->stats.ul.total_bits / mac->stats.ul.total_symbols,
+           mac->stats.ul.rb_size / nbul,
+           mac->stats.ul.nr_of_symbols / nbul);
+  LOG_I(NR_MAC, "%s", txt);
+  ret = pthread_mutex_unlock(&mac->if_mutex);
+  AssertFatal(!ret, "mutex failed %d\n", ret);
+}
+
 void nrue_init_standalone_socket(int tx_port, int rx_port)
 {
   {
@@ -1120,7 +1171,7 @@ static int8_t handle_csirs_measurements(NR_UE_MAC_INST_t *mac,
 
 void update_harq_status(NR_UE_MAC_INST_t *mac, uint8_t harq_pid, uint8_t ack_nack)
 {
-  NR_UE_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[harq_pid];
+  NR_UE_DL_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[harq_pid];
 
   if (current_harq->active) {
     LOG_D(PHY,"Updating harq_status for harq_id %d, ack/nak %d\n", harq_pid, current_harq->ack);
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
index 6654fc8bff23add9766993977d1f697fdf75d913..c43eef87a32ee0596c62893b7c68e25a638479f9 100644
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
@@ -322,5 +322,7 @@ int nr_ue_ul_indication(nr_uplink_indication_t *ul_info);
 
 void nr_ue_sl_indication(nr_sidelink_indication_t *sl_indication);
 
+void print_ue_mac_stats(const module_id_t mod, const int frame_rx, const int slot_rx);
+
 #endif
 
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.h b/openair2/RRC/NR/MESSAGES/asn1_msg.h
index 2f0b4febf83c42e0ab53a29801353a109abb7778..d7642ca663a35676fea11367fb62be0e5bb7a6e3 100644
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.h
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.h
@@ -31,17 +31,30 @@
 #ifndef __RRC_NR_MESSAGES_ASN1_MSG__H__
 #define __RRC_NR_MESSAGES_ASN1_MSG__H__
 
+#include <common/utils/assertions.h>
+#include <stdint.h>
 #include <stdio.h>
-#include <sys/types.h>
-#include <stdlib.h> /* for atoi(3) */
-#include <unistd.h> /* for getopt(3) */
-#include <string.h> /* for strerror(3) */
-#include <sysexits.h> /* for EX_* exit codes */
-#include <errno.h>  /* for errno */
-
-#include <asn_application.h>
-
-#include "RRC/NR/nr_rrc_config.h"
+#include "NR_ARFCN-ValueNR.h"
+#include "NR_CellGroupConfig.h"
+#include "NR_CipheringAlgorithm.h"
+#include "NR_DRB-ToAddModList.h"
+#include "NR_DRB-ToReleaseList.h"
+#include "NR_IntegrityProtAlgorithm.h"
+#include "NR_LogicalChannelConfig.h"
+#include "NR_MeasConfig.h"
+#include "NR_MeasTiming.h"
+#include "NR_RLC-BearerConfig.h"
+#include "NR_RLC-Config.h"
+#include "NR_RRC-TransactionIdentifier.h"
+#include "NR_RadioBearerConfig.h"
+#include "NR_ReestablishmentCause.h"
+#include "NR_SRB-ToAddModList.h"
+#include "NR_SecurityConfig.h"
+#include "RRC/NR/nr_rrc_defs.h"
+#include "ds/seq_arr.h"
+#include "rrc_messages_types.h"
+struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList;
+struct asn_TYPE_descriptor_s;
 
 /*
  * The variant of the above function which dumps the BASIC-XER (XER_F_BASIC)
diff --git a/openair2/RRC/NR/cucp_cuup_direct.c b/openair2/RRC/NR/cucp_cuup_direct.c
index 97763d65d751dd2cdbfb28130b82926fec117239..2e8bbfa428a74d127b410c1d4cf6720070cc0b63 100644
--- a/openair2/RRC/NR/cucp_cuup_direct.c
+++ b/openair2/RRC/NR/cucp_cuup_direct.c
@@ -19,8 +19,10 @@
  *      contact@openairinterface.org
  */
 
+#include <netinet/in.h>
+#include <netinet/sctp.h>
+#include "assertions.h"
 #include "cucp_cuup_if.h"
-
 #include "nr_rrc_defs.h"
 #include "openair2/COMMON/e1ap_messages_types.h"
 #include "openair2/LAYER2/nr_pdcp/cucp_cuup_handler.h"
diff --git a/openair2/RRC/NR/cucp_cuup_e1ap.c b/openair2/RRC/NR/cucp_cuup_e1ap.c
index b567fd76d48651d2c4364232110258ebff31506b..69cb92f50a5b4b78c082265eb7f26559f064b6dd 100644
--- a/openair2/RRC/NR/cucp_cuup_e1ap.c
+++ b/openair2/RRC/NR/cucp_cuup_e1ap.c
@@ -19,13 +19,14 @@
  *      contact@openairinterface.org
  */
 
+#include <netinet/in.h>
+#include <netinet/sctp.h>
+#include "assertions.h"
 #include "cucp_cuup_if.h"
+#include "e1ap_messages_types.h"
+#include "intertask_interface.h"
 #include "nr_rrc_defs.h"
 
-#include "nr_rrc_proto.h"
-#include "nr_rrc_extern.h"
-#include "cucp_cuup_if.h"
-
 static void cucp_cuup_bearer_context_setup_e1ap(sctp_assoc_t assoc_id, const e1ap_bearer_setup_req_t *req)
 {
   AssertFatal(assoc_id > 0, "illegal assoc_id %d\n", assoc_id);
diff --git a/openair2/RRC/NR/mac_rrc_dl_direct.c b/openair2/RRC/NR/mac_rrc_dl_direct.c
index 54ec7c8e4c2fadb05fa7fdc6535360286161ab79..77113f6c8bddf573750de63d0bdac2a206919766 100644
--- a/openair2/RRC/NR/mac_rrc_dl_direct.c
+++ b/openair2/RRC/NR/mac_rrc_dl_direct.c
@@ -19,9 +19,13 @@
  *      contact@openairinterface.org
  */
 
-#include "nr_rrc_defs.h"
-
+#include <netinet/in.h>
+#include <netinet/sctp.h>
+#include <stdbool.h>
+#include "assertions.h"
+#include "f1ap_messages_types.h"
 #include "mac_rrc_dl.h"
+#include "nr_rrc_defs.h"
 #include "openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.h"
 
 static void f1_reset_cu_initiated_direct(sctp_assoc_t assoc_id, const f1ap_reset_t *reset)
diff --git a/openair2/RRC/NR/mac_rrc_dl_f1ap.c b/openair2/RRC/NR/mac_rrc_dl_f1ap.c
index 70d36a144fc19336c2b4f3e6d53e000519fd0eda..8593ff816a9cb61673a040cb078f9cc5ace1d4c3 100644
--- a/openair2/RRC/NR/mac_rrc_dl_f1ap.c
+++ b/openair2/RRC/NR/mac_rrc_dl_f1ap.c
@@ -19,8 +19,15 @@
  *      contact@openairinterface.org
  */
 
+#include <netinet/in.h>
+#include <netinet/sctp.h>
+#include <stdbool.h>
+#include <stdint.h>
 #include <stdlib.h>
-
+#include <string.h>
+#include "assertions.h"
+#include "f1ap_messages_types.h"
+#include "intertask_interface.h"
 #include "mac_rrc_dl.h"
 #include "nr_rrc_defs.h"
 #include "openair2/F1AP/lib/f1ap_rrc_message_transfer.h"
diff --git a/openair2/RRC/NR/nr_rrc_common.h b/openair2/RRC/NR/nr_rrc_common.h
index f81a57f5ad70aafe8352b5ff697df4b3da7606b6..f3bc3681a990dc59ca16a2a738f4a0ce2cd37d80 100644
--- a/openair2/RRC/NR/nr_rrc_common.h
+++ b/openair2/RRC/NR/nr_rrc_common.h
@@ -22,8 +22,6 @@
 #ifndef __NR_RRC_COMMON_H__
 #define __NR_RRC_COMMON_H__
 
-#include <stdio.h>
-#include <stdlib.h>
 #include <stdint.h> 
 
 #define NR_NUM_SRB 4 /* Number of Signalling Radio Bearers according to clause 4.2.2 of 3GPP TS 38.331 */
diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c
index f955528167520b6f162f09b98cae7f182d183417..798ec5ce4e8851f49a3e95731fcb5031382288de 100644
--- a/openair2/RRC/NR/nr_rrc_config.c
+++ b/openair2/RRC/NR/nr_rrc_config.c
@@ -28,18 +28,33 @@
  * \email: raymond.knopp@eurecom.fr, kroempa@gmail.com
  */
 
-#include "openair3/UTILS/conversions.h"
 #include "nr_rrc_config.h"
+#include <endian.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "BIT_STRING.h"
+#include "NULL.h"
+#include "RRC/NR/MESSAGES/asn1_msg.h"
+#include "RRC/NR/nr_rrc_proto.h"
+#include "SIMULATION/TOOLS/sim.h"
+#include "T.h"
+#include "asn_SET_OF.h"
+#include "asn_codecs.h"
+#include "asn_internal.h"
+#include "assertions.h"
+#include "common/openairinterface5g_limits.h"
+#include "common/utils/T/T.h"
 #include "common/utils/nr/nr_common.h"
-#include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
+#include "constr_TYPE.h"
 #include "executables/softmodem-common.h"
 #include "oai_asn1.h"
-#include "SIMULATION/TOOLS/sim.h" // for taus();
-
-#include "NR_MeasurementTimingConfiguration.h"
-
+#include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
+#include "openair3/UTILS/conversions.h"
 #include "uper_decoder.h"
 #include "uper_encoder.h"
+#include "utils.h"
+#include "xer_encoder.h"
 
 const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160};
 
@@ -3090,8 +3105,6 @@ NR_CellGroupConfig_t *get_initial_cellGroupConfig(int uid,
   return cellGroupConfig;
 }
 
-#include "common/ran_context.h"
-#include "nr_rrc_defs.h"
 void update_cellGroupConfig(NR_CellGroupConfig_t *cellGroupConfig,
                             const int uid,
                             NR_UE_NR_Capability_t *uecap,
diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h
index ff94f2ab7e144a75e27578791aadc9d75439b9a9..b9f030e897f7e4a1e47dc1b89b33cf8e28964e95 100644
--- a/openair2/RRC/NR/nr_rrc_config.h
+++ b/openair2/RRC/NR/nr_rrc_config.h
@@ -31,8 +31,17 @@
 #ifndef __NR_RRC_CONFIG_H__
 #define __NR_RRC_CONFIG_H__
 
-#include "nr_rrc_defs.h"
-#include "openair2/RRC/NR/MESSAGES/asn1_msg.h"
+#include <stdbool.h>
+#include <stdint.h>
+#include "NR_BCCH-BCH-Message.h"
+#include "NR_BCCH-DL-SCH-Message.h"
+#include "NR_CellGroupConfig.h"
+#include "NR_UE-NR-Capability.h"
+#include "NR_UL-CCCH-Message.h"
+#include "PHY/defs_common.h"
+#include "f1ap_messages_types.h"
+struct NR_MeasurementTimingConfiguration;
+struct NR_PDSCH_TimeDomainResourceAllocationList;
 
 // forward declaration of MAC configuration parameters, definition is included in C file
 struct nr_mac_config_t;
diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h
index 7650718e66ade7dd73b05bd6e21aeb90caf5d42f..b33b2c158ce2780e39b382c3d3c1eba2fb29f32d 100644
--- a/openair2/RRC/NR/nr_rrc_defs.h
+++ b/openair2/RRC/NR/nr_rrc_defs.h
@@ -34,39 +34,25 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-
 #include "collection/tree.h"
 #include "collection/linear_alloc.h"
 #include "common/utils/ds/seq_arr.h"
 #include "nr_rrc_common.h"
 #include "ds/byte_array.h"
-
 #include "common/platform_constants.h"
 #include "common/platform_types.h"
 #include "mac_rrc_dl.h"
 #include "cucp_cuup_if.h"
-
-#include "NR_SIB1.h"
-#include "NR_RRCReconfigurationComplete.h"
-#include "NR_RRCReconfiguration.h"
-#include "NR_RRCReestablishmentRequest.h"
 #include "NR_BCCH-BCH-Message.h"
 #include "NR_BCCH-DL-SCH-Message.h"
-#include "NR_BCCH-BCH-Message.h"
-#include "NR_PLMN-IdentityInfo.h"
-#include "NR_MCC-MNC-Digit.h"
-#include "NR_NG-5G-S-TMSI.h"
-
-#include "NR_UE-NR-Capability.h"
-#include "NR_UE-MRDC-Capability.h"
-#include "NR_MeasResults.h"
 #include "NR_CellGroupConfig.h"
-#include "NR_ServingCellConfigCommon.h"
-#include "NR_EstablishmentCause.h"
+#include "NR_MeasurementReport.h"
 #include "NR_MeasurementTimingConfiguration.h"
-
-//-------------------
-
+#include "NR_RRCReconfiguration.h"
+#include "NR_UE-CapabilityRAT-ContainerList.h"
+#include "NR_UL-CCCH-Message.h"
+#include "NR_UE-MRDC-Capability.h"
+#include "NR_UE-NR-Capability.h"
 #include "intertask_interface.h"
 
 // 3GPP TS 38.331 Section 12 Table 12.1-1: UE performance requirements for RRC procedures for UEs
diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h
index 576a1f636a752d470e7464188a2a0783027aa049..ab2a95ecdea72eaffbd66d24ac58942c6639312b 100644
--- a/openair2/RRC/NR/nr_rrc_proto.h
+++ b/openair2/RRC/NR/nr_rrc_proto.h
@@ -35,14 +35,9 @@
 #define __NR_RRC_PROTO_H__
 
 #include "RRC/NR/nr_rrc_defs.h"
-#include "NR_RRCReconfiguration.h"
-#include "NR_UE-NR-Capability.h"
-#include "NR_UE-CapabilityRAT-ContainerList.h"
-#include "LTE_UE-CapabilityRAT-ContainerList.h"
 #include "NR_CG-Config.h"
 #include "NR_CG-ConfigInfo.h"
-#include "NR_SecurityConfig.h"
-#include "NR_CellGroupConfig.h"
+#include "NR_RRCReconfiguration.h"
 
 #define NR_MAX_SUPPORTED_DL_LAYERS 4
 
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index 881a6d7fee494ddc0e86853cea66e28f583b829a..e94358f274f5a1e4c8745f7ae6d182e5b1094e9f 100644
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -30,79 +30,70 @@
 #define RRC_GNB_C
 #define RRC_GNB_C
 
-#include <sys/socket.h>
 #include <netinet/in.h>
-#include <arpa/inet.h>
+#include <netinet/sctp.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <time.h>
-
-#include "nr_rrc_config.h"
-#include "nr_rrc_defs.h"
-#include "nr_rrc_extern.h"
-#include "assertions.h"
-#include "common/ran_context.h"
-#include "oai_asn1.h"
-#include "rrc_gNB_radio_bearers.h"
-
-#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
-#include "LAYER2/NR_MAC_gNB/mac_proto.h"
-#include "common/utils/LOG/log.h"
+#include "openair2/RRC/NR/nr_rrc_proto.h"
+#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
+#include "openair3/SECU/key_nas_deriver.h"
+#include "openair3/ocp-gtpu/gtp_itf.h"
+#include "BIT_STRING.h"
+#include "F1AP_CauseProtocol.h"
+#include "F1AP_CauseRadioNetwork.h"
+#include "NGAP_CauseRadioNetwork.h"
+#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac.h"
+#include "OCTET_STRING.h"
+#include "PHY/defs_common.h"
 #include "RRC/NR/MESSAGES/asn1_msg.h"
-#include "openair2/E1AP/e1ap_asnc.h"
-
-#include "NR_BCCH-BCH-Message.h"
-#include "NR_UL-DCCH-Message.h"
-#include "NR_DL-DCCH-Message.h"
-#include "NR_DL-CCCH-Message.h"
-#include "NR_UL-CCCH-Message.h"
-#include "NR_RRCReject.h"
-#include "NR_RejectWaitTime.h"
-#include "NR_RRCSetup.h"
-
-#include "NR_CellGroupConfig.h"
-#include "NR_MeasResults.h"
-#include "NR_UL-CCCH-Message.h"
-#include "NR_RRCSetupRequest-IEs.h"
-#include "NR_RRCSetupComplete-IEs.h"
-#include "NR_RRCReestablishmentRequest-IEs.h"
-#include "NR_MIB.h"
-#include "uper_encoder.h"
-#include "uper_decoder.h"
-
-#include "common/platform_types.h"
-#include "common/utils/LOG/vcd_signal_dumper.h"
-
+#include "RRC/NR/mac_rrc_dl.h"
+#include "RRC/NR/nr_rrc_common.h"
+#include "SIMULATION/TOOLS/sim.h"
 #include "T.h"
-
-#include "openair3/SECU/secu_defs.h"
-
-#include "rrc_gNB_NGAP.h"
-#include "rrc_gNB_du.h"
-#include "rrc_gNB_mobility.h"
-
-#include "rrc_gNB_GTPV1U.h"
-
+#include "asn_codecs.h"
+#include "asn_internal.h"
+#include "assertions.h"
+#include "byte_array.h"
+#include "common/ngran_types.h"
+#include "common/openairinterface5g_limits.h"
+#include "common/platform_constants.h"
+#include "common/ran_context.h"
+#include "common_lib.h"
+#include "constr_SEQUENCE.h"
+#include "constr_TYPE.h"
+#include "cucp_cuup_if.h"
+#include "e1ap_messages_types.h"
+#include "executables/softmodem-common.h"
+#include "f1ap_messages_types.h"
+#include "gtpv1_u_messages_types.h"
+#include "intertask_interface.h"
+#include "linear_alloc.h"
+#include "ngap_messages_types.h"
 #include "nr_pdcp/nr_pdcp_entity.h"
 #include "nr_pdcp/nr_pdcp_oai_api.h"
-
-#include "intertask_interface.h"
-#include "SIMULATION/TOOLS/sim.h" // for taus
-
-#include "executables/softmodem-common.h"
-#include <openair2/RRC/NR/rrc_gNB_UE_context.h>
-#include <openair2/X2AP/x2ap_eNB.h>
-#include <openair3/SECU/key_nas_deriver.h>
-#include <openair3/ocp-gtpu/gtp_itf.h>
-#include <openair2/RRC/NR/nr_rrc_proto.h>
+#include "nr_rrc_defs.h"
+#include "nr_rrc_extern.h"
+#include "oai_asn1.h"
 #include "openair2/F1AP/f1ap_common.h"
 #include "openair2/F1AP/f1ap_ids.h"
 #include "openair2/F1AP/lib/f1ap_lib_extern.h"
-#include "openair2/SDAP/nr_sdap/nr_sdap_entity.h"
-#include "openair2/E1AP/e1ap.h"
-#include "cucp_cuup_if.h"
 #include "lib/f1ap_interface_management.h"
-
-#include "BIT_STRING.h"
-#include "assertions.h"
+#include "rrc_gNB_NGAP.h"
+#include "rrc_gNB_du.h"
+#include "rrc_gNB_mobility.h"
+#include "rrc_gNB_radio_bearers.h"
+#include "rrc_messages_types.h"
+#include "seq_arr.h"
+#include "tree.h"
+#include "uper_decoder.h"
+#include "uper_encoder.h"
+#include "utils.h"
+#include "x2ap_messages_types.h"
+#include "xer_encoder.h"
 
 #ifdef E2_AGENT
 #include "openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_extern.h"
@@ -568,7 +559,7 @@ static void rrc_gNB_generate_dedicatedRRCReconfiguration(gNB_RRC_INST *rrc, gNB_
   DevAssert(size > 0 && size <= sizeof(buffer));
 
   LOG_UE_DL_EVENT(ue_p, "Generate RRCReconfiguration (bytes %d, xid %d)\n", size, xid);
-  nr_rrc_transfer_protected_rrc_message(rrc, ue_p, DCCH, buffer, size);
+  nr_rrc_transfer_protected_rrc_message(rrc, ue_p, DL_SCH_LCID_DCCH, buffer, size);
 }
 
 void rrc_gNB_modify_dedicatedRRCReconfiguration(gNB_RRC_INST *rrc, gNB_RRC_UE_t *ue_p)
@@ -677,7 +668,7 @@ void rrc_gNB_modify_dedicatedRRCReconfiguration(gNB_RRC_INST *rrc, gNB_RRC_UE_t
     clear_nas_pdu(&ue_p->pduSession[i].param.nas_pdu);
 
   LOG_I(NR_RRC, "UE %d: Generate RRCReconfiguration (bytes %d)\n", ue_p->rrc_ue_id, size);
-  nr_rrc_transfer_protected_rrc_message(rrc, ue_p, DCCH, buffer, size);
+  nr_rrc_transfer_protected_rrc_message(rrc, ue_p, DL_SCH_LCID_DCCH, buffer, size);
 }
 
 //-----------------------------------------------------------------------------
@@ -729,7 +720,7 @@ void rrc_gNB_generate_dedicatedRRCReconfiguration_release(gNB_RRC_INST *rrc,
   }
 
   LOG_I(NR_RRC, "UE %d: Generate NR_RRCReconfiguration (bytes %d)\n", ue_p->rrc_ue_id, size);
-  nr_rrc_transfer_protected_rrc_message(rrc, ue_p, DCCH, buffer, size);
+  nr_rrc_transfer_protected_rrc_message(rrc, ue_p, DL_SCH_LCID_DCCH, buffer, size);
 }
 
 /* \brief find existing PDU session inside E1AP Bearer Modif message, or
@@ -860,10 +851,10 @@ static void rrc_gNB_generate_RRCReestablishment(rrc_gNB_ue_context_t *ue_context
   uint32_t old_gNB_DU_ue_id = old_rnti;
   f1ap_dl_rrc_message_t dl_rrc = {.gNB_CU_ue_id = ue_p->rrc_ue_id,
                                   .gNB_DU_ue_id = ue_data.secondary_ue,
-                                  .srb_id = DCCH,
+                                  .srb_id = DL_SCH_LCID_DCCH,
                                   .old_gNB_DU_ue_id = &old_gNB_DU_ue_id};
   deliver_dl_rrc_message_data_t data = {.rrc = rrc, .dl_rrc = &dl_rrc, .assoc_id = ue_data.du_assoc_id};
-  nr_pdcp_data_req_srb(ue_p->rrc_ue_id, DCCH, rrc_gNB_mui++, size, (unsigned char *const)buffer, rrc_deliver_dl_rrc_message, &data);
+  nr_pdcp_data_req_srb(ue_p->rrc_ue_id, DL_SCH_LCID_DCCH, rrc_gNB_mui++, size, (unsigned char *const)buffer, rrc_deliver_dl_rrc_message, &data);
 
   /* RRCReestablishment has been generated, let's enable ciphering now. */
   security_parameters.ciphering_algorithm = ue_p->ciphering_algorithm;
@@ -965,7 +956,7 @@ static void rrc_gNB_process_RRCReestablishmentComplete(gNB_RRC_INST *rrc, gNB_RR
         ue_p->rrc_ue_id,
         ue_p->rnti,
         size);
-  nr_rrc_transfer_protected_rrc_message(rrc, ue_p, DCCH, buffer, size);
+  nr_rrc_transfer_protected_rrc_message(rrc, ue_p, DL_SCH_LCID_DCCH, buffer, size);
 }
 //-----------------------------------------------------------------------------
 
@@ -986,7 +977,7 @@ int nr_rrc_reconfiguration_req(gNB_RRC_INST *rrc, gNB_RRC_UE_t *ue_p, const int
   uint8_t buffer[NR_RRC_BUF_SIZE];
   int size = do_RRCReconfiguration(ue_p, buffer, NR_RRC_BUF_SIZE, xid, NULL, NULL, NULL, NULL, NULL, NULL, masterCellGroup);
 
-  nr_rrc_transfer_protected_rrc_message(rrc, ue_p, DCCH, buffer, size);
+  nr_rrc_transfer_protected_rrc_message(rrc, ue_p, DL_SCH_LCID_DCCH, buffer, size);
 
   return 0;
 }
@@ -1406,7 +1397,7 @@ void rrc_forward_ue_nas_message(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE)
   unsigned int xid = rrc_gNB_get_next_transaction_identifier(rrc->module_id);
   uint32_t length = do_NR_DLInformationTransfer(buffer, sizeof(buffer), xid, UE->nas_pdu.length, UE->nas_pdu.buffer);
   LOG_DUMPMSG(NR_RRC, DEBUG_RRC, buffer, length, "[MSG] RRC DL Information Transfer\n");
-  rb_id_t srb_id = UE->Srb[2].Active ? DCCH1 : DCCH;
+  rb_id_t srb_id = UE->Srb[2].Active ? DL_SCH_LCID_DCCH1 : DL_SCH_LCID_DCCH;
   nr_rrc_transfer_protected_rrc_message(rrc, UE, srb_id, buffer, length);
   // no need to free UE->nas_pdu.buffer, do_NR_DLInformationTransfer() did that
   UE->nas_pdu.buffer = NULL;
@@ -1654,7 +1645,7 @@ static void rrc_gNB_generate_UECapabilityEnquiry(gNB_RRC_INST *rrc, gNB_RRC_UE_t
 
   AssertFatal(!NODE_IS_DU(rrc->node_type), "illegal node type DU!\n");
 
-  nr_rrc_transfer_protected_rrc_message(rrc, ue, DCCH, buffer, size);
+  nr_rrc_transfer_protected_rrc_message(rrc, ue, DL_SCH_LCID_DCCH, buffer, size);
 }
 
 static int rrc_gNB_decode_dcch(gNB_RRC_INST *rrc, const f1ap_ul_rrc_message_t *msg)
@@ -2001,7 +1992,7 @@ static void rrc_CU_process_ue_context_release_request(MessageDef *msg_p, sctp_as
           .gNB_DU_ue_id = source_ctx->du_ue_id,
           .cause = F1AP_CAUSE_RADIO_NETWORK,
           .cause_value = 5, // 5 = F1AP_CauseRadioNetwork_interaction_with_other_procedure
-          .srb_id = DCCH,
+          .srb_id = DL_SCH_LCID_DCCH,
       };
       rrc->mac_rrc.ue_context_release_command(assoc_id, &cmd);
       nr_rrc_finalize_ho(UE);
@@ -2649,7 +2640,7 @@ void rrc_gNB_generate_SecurityModeCommand(gNB_RRC_INST *rrc, gNB_RRC_UE_t *ue_p)
   LOG_DUMPMSG(NR_RRC, DEBUG_RRC, (char *)buffer, size, "[MSG] RRC Security Mode Command\n");
   LOG_I(NR_RRC, "UE %u Logical Channel DL-DCCH, Generate SecurityModeCommand (bytes %d)\n", ue_p->rrc_ue_id, size);
 
-  nr_rrc_transfer_protected_rrc_message(rrc, ue_p, DCCH, buffer, size);
+  nr_rrc_transfer_protected_rrc_message(rrc, ue_p, DL_SCH_LCID_DCCH, buffer, size);
 }
 
 typedef struct deliver_ue_ctxt_release_data_t {
@@ -2684,10 +2675,10 @@ void rrc_gNB_generate_RRCRelease(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE)
     .gNB_DU_ue_id = ue_data.secondary_ue,
     .cause = F1AP_CAUSE_RADIO_NETWORK,
     .cause_value = 10, // 10 = F1AP_CauseRadioNetwork_normal_release
-    .srb_id = DCCH,
+    .srb_id = DL_SCH_LCID_DCCH,
   };
   deliver_ue_ctxt_release_data_t data = {.rrc = rrc, .release_cmd = &ue_context_release_cmd, .assoc_id = ue_data.du_assoc_id};
-  nr_pdcp_data_req_srb(UE->rrc_ue_id, DCCH, rrc_gNB_mui++, size, buffer, rrc_deliver_ue_ctxt_release_cmd, &data);
+  nr_pdcp_data_req_srb(UE->rrc_ue_id, DL_SCH_LCID_DCCH, rrc_gNB_mui++, size, buffer, rrc_deliver_ue_ctxt_release_cmd, &data);
 }
 
 int rrc_gNB_generate_pcch_msg(sctp_assoc_t assoc_id, const NR_SIB1_t *sib1, uint32_t tmsi, uint8_t paging_drx)
diff --git a/openair2/RRC/NR/rrc_gNB_GTPV1U.c b/openair2/RRC/NR/rrc_gNB_GTPV1U.c
index e5412778bc020b4d7990e4993aee362e86f0bdb2..6bf64a27a98945a673f5f51e5781bd13d2088cbc 100644
--- a/openair2/RRC/NR/rrc_gNB_GTPV1U.c
+++ b/openair2/RRC/NR/rrc_gNB_GTPV1U.c
@@ -27,20 +27,14 @@
  * \email: lionel.gauthier@eurecom.fr, panagiotis.matzakos@eurecom.fr
  */
 
-# include "rrc_defs.h"
-# include "rrc_extern.h"
-# include "RRC/LTE/MESSAGES/asn1_msg.h"
-# include "rrc_eNB_GTPV1U.h"
-# include "rrc_eNB_UE_context.h"
-# include "openair2/RRC/NR/rrc_gNB_UE_context.h"
-
-//# if defined(ENABLE_ITTI)
-#   include "oai_asn1.h"
-#   include "intertask_interface.h"
-//#endif
-
-# include "common/ran_context.h"
 #include "openair2/RRC/NR/rrc_gNB_GTPV1U.h"
+#include "LOG/log.h"
+#include "RRC/NR/nr_rrc_defs.h"
+#include "common/ran_context.h"
+#include "openair2/RRC/NR/rrc_gNB_UE_context.h"
+#include "rrc_defs.h"
+#include "rrc_eNB_GTPV1U.h"
+#include "s1ap_messages_types.h"
 
 extern RAN_CONTEXT_t RC;
 
diff --git a/openair2/RRC/NR/rrc_gNB_GTPV1U.h b/openair2/RRC/NR/rrc_gNB_GTPV1U.h
index 85ad11105ef5f43accecc8fb2adec887d62cba3f..60a6c0c5b55e6fac300b6a0fa1be2d0db712a9c8 100644
--- a/openair2/RRC/NR/rrc_gNB_GTPV1U.h
+++ b/openair2/RRC/NR/rrc_gNB_GTPV1U.h
@@ -30,6 +30,10 @@
 #ifndef RRC_GNB_GTPV1U_H_
 #define RRC_GNB_GTPV1U_H_
 
+#include <stdint.h>
+#include "openair2/RRC/NR/nr_rrc_defs.h"
+#include "gtpv1_u_messages_types.h"
+
 int rrc_gNB_process_GTPV1U_CREATE_TUNNEL_RESP(gNB_RRC_UE_t *ue,
                                               const gtpv1u_enb_create_tunnel_resp_t *const create_tunnel_resp_pP,
                                               uint8_t *inde_list);
diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c
index 6a35f61b3fa28af3738426647ce29e50ad1e62ff..c2a641db3204e2f18ca05a6aecfbd2a58747f4a4 100644
--- a/openair2/RRC/NR/rrc_gNB_NGAP.c
+++ b/openair2/RRC/NR/rrc_gNB_NGAP.c
@@ -29,56 +29,64 @@
  */
 
 #include "rrc_gNB_NGAP.h"
-#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
-#include "rrc_eNB_S1AP.h"
-#include "gnb_config.h"
-#include "common/ran_context.h"
-
-#include "oai_asn1.h"
-#include "intertask_interface.h"
-#include "nr_pdcp/nr_pdcp_oai_api.h"
-#include "pdcp_primitives.h"
-#include "SDAP/nr_sdap/nr_sdap.h"
-
-#include "openair3/ocp-gtpu/gtp_itf.h"
+#include <netinet/in.h>
+#include <netinet/sctp.h>
 #include <openair3/ocp-gtpu/gtp_itf.h>
-#include "RRC/LTE/rrc_eNB_GTPV1U.h"
-#include "RRC/NR/rrc_gNB_GTPV1U.h"
-
-#include "S1AP_NAS-PDU.h"
-#include "executables/softmodem-common.h"
-#include "openair3/SECU/key_nas_deriver.h"
-
-#include "ngap_gNB_defs.h"
-#include "ngap_gNB_ue_context.h"
-#include "ngap_gNB_management_procedures.h"
-#include "NR_ULInformationTransfer.h"
-#include "RRC/NR/MESSAGES/asn1_msg.h"
-#include "NR_UERadioAccessCapabilityInformation.h"
-#include "NR_UE-CapabilityRAT-ContainerList.h"
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "E1AP_ConfidentialityProtectionIndication.h"
+#include "E1AP_IntegrityProtectionIndication.h"
 #include "NGAP_CauseRadioNetwork.h"
-#include "f1ap_messages_types.h"
-#include "openair2/F1AP/f1ap_ids.h"
-#include "openair2/E1AP/e1ap_asnc.h"
-#include "openair2/E1AP/e1ap.h"
-#include "NGAP_asn_constant.h"
-#include "NGAP_PDUSessionResourceSetupRequestTransfer.h"
-#include "NGAP_PDUSessionResourceModifyRequestTransfer.h"
-#include "NGAP_ProtocolIE-Field.h"
+#include "NGAP_Dynamic5QIDescriptor.h"
 #include "NGAP_GTPTunnel.h"
-#include "NGAP_QosFlowSetupRequestItem.h"
-#include "NGAP_QosFlowAddOrModifyRequestItem.h"
 #include "NGAP_NonDynamic5QIDescriptor.h"
-#include "NGAP_Dynamic5QIDescriptor.h"
-#include "conversions.h"
+#include "NGAP_PDUSessionResourceModifyRequestTransfer.h"
+#include "NGAP_PDUSessionResourceSetupRequestTransfer.h"
+#include "NGAP_QosFlowAddOrModifyRequestItem.h"
+#include "NGAP_QosFlowSetupRequestItem.h"
+#include "NGAP_asn_constant.h"
+#include "NGAP_ProtocolIE-Field.h"
+#include "NR_UE-NR-Capability.h"
+#include "NR_UERadioAccessCapabilityInformation.h"
+#include "MAC/mac.h"
+#include "OCTET_STRING.h"
+#include "PHY/defs_common.h"
+#include "RRC/NR/MESSAGES/asn1_msg.h"
+#include "RRC/NR/nr_rrc_common.h"
+#include "RRC/NR/nr_rrc_defs.h"
+#include "RRC/NR/nr_rrc_proto.h"
+#include "RRC/NR/rrc_gNB_UE_context.h"
 #include "RRC/NR/rrc_gNB_radio_bearers.h"
+#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac.h"
+#include "T.h"
+#include "aper_decoder.h"
+#include "asn_codecs.h"
+#include "assertions.h"
+#include "common/ngran_types.h"
+#include "common/platform_constants.h"
+#include "common/ran_context.h"
+#include "common/utils/T/T.h"
+#include "constr_TYPE.h"
+#include "conversions.h"
+#include "e1ap_messages_types.h"
+#include "f1ap_messages_types.h"
+#include "gtpv1_u_messages_types.h"
+#include "intertask_interface.h"
+#include "nr_pdcp/nr_pdcp_entity.h"
+#include "nr_pdcp/nr_pdcp_oai_api.h"
+#include "oai_asn1.h"
+#include "openair2/F1AP/f1ap_ids.h"
+#include "openair3/SECU/key_nas_deriver.h"
+#include "rrc_messages_types.h"
+#include "s1ap_messages_types.h"
+#include "uper_encoder.h"
 
 #ifdef E2_AGENT
 #include "openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_extern.h"
 #endif
 
-#include "uper_encoder.h"
-
 extern RAN_CONTEXT_t RC;
 
 /* Masks for NGAP Encryption algorithms, NEA0 is always supported (not coded) */
@@ -140,7 +148,7 @@ void nr_rrc_pdcp_config_security(gNB_RRC_UE_t *UE, bool enable_ciphering)
     }
   }
 
-  nr_pdcp_config_set_security(UE->rrc_ue_id, DCCH, true, &security_parameters);
+  nr_pdcp_config_set_security(UE->rrc_ue_id, DL_SCH_LCID_DCCH, true, &security_parameters);
 }
 
 //------------------------------------------------------------------------------
diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.h b/openair2/RRC/NR/rrc_gNB_NGAP.h
index 9d83f28c3c0be669a44557f78d27fd33eebcc071..235a175954a83d30cea66def27cd7302e226faed 100644
--- a/openair2/RRC/NR/rrc_gNB_NGAP.h
+++ b/openair2/RRC/NR/rrc_gNB_NGAP.h
@@ -31,14 +31,14 @@
 #ifndef RRC_GNB_NGAP_H_
 #define RRC_GNB_NGAP_H_
 
-#include "rrc_gNB_UE_context.h"
-#include "nr_rrc_defs.h"
-#include "nr_rrc_extern.h"
-
+#include <assertions.h>
+#include <stdint.h>
 #include "NR_RRCSetupComplete-IEs.h"
-#include "NR_RegisteredAMF.h"
+#include "NR_UECapabilityInformation.h"
 #include "NR_UL-DCCH-Message.h"
-#include "NGAP_CauseRadioNetwork.h"
+#include "intertask_interface.h"
+#include "ngap_messages_types.h"
+#include "nr_rrc_defs.h"
 
 void rrc_gNB_send_NGAP_NAS_FIRST_REQ(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, NR_RRCSetupComplete_IEs_t *rrcSetupComplete);
 
diff --git a/openair2/RRC/NR/rrc_gNB_UE_context.c b/openair2/RRC/NR/rrc_gNB_UE_context.c
index 15f644955dc8abe6bddc6f3029c40320b9d2de9b..eae5c0706edeb65bb9b605258c5a2de1f0c78305 100644
--- a/openair2/RRC/NR/rrc_gNB_UE_context.c
+++ b/openair2/RRC/NR/rrc_gNB_UE_context.c
@@ -28,15 +28,18 @@
  * \email: lionel.gauthier@eurecom.fr
  */
 
+#include "rrc_gNB_UE_context.h"
 #include <stdio.h>
 #include <stdlib.h>
-#include <string.h>
-#include <limits.h>
 #include <time.h>
-
+#include "RRC/NR/nr_rrc_defs.h"
+#include "T.h"
+#include "assertions.h"
+#include "common/platform_constants.h"
 #include "common/utils/LOG/log.h"
-#include "rrc_gNB_UE_context.h"
+#include "linear_alloc.h"
 #include "openair2/F1AP/f1ap_ids.h"
+#include "tree.h"
 
 static void rrc_gNB_ue_context_update_time(rrc_gNB_ue_context_t *ctxt)
 {
diff --git a/openair2/RRC/NR/rrc_gNB_UE_context.h b/openair2/RRC/NR/rrc_gNB_UE_context.h
index 37d71f9c290a0cc8a62b435a343d87bc17655bdf..9485672463513e281a5808a166508ed55153b538 100644
--- a/openair2/RRC/NR/rrc_gNB_UE_context.h
+++ b/openair2/RRC/NR/rrc_gNB_UE_context.h
@@ -30,8 +30,11 @@
 #ifndef __RRC_GNB_UE_CONTEXT_H__
 #define __RRC_GNB_UE_CONTEXT_H__
 
+#include <common/utils/assertions.h>
+#include <netinet/in.h>
+#include <netinet/sctp.h>
+#include <stdint.h>
 #include "collection/tree.h"
-#include "common/platform_types.h"
 #include "nr_rrc_defs.h"
 
 int rrc_gNB_compare_ue_rnti_id(rrc_gNB_ue_context_t* c1_pP, rrc_gNB_ue_context_t* c2_pP);
diff --git a/openair2/RRC/NR/rrc_gNB_cuup.c b/openair2/RRC/NR/rrc_gNB_cuup.c
index 729f5f28b46be1a27c2d7f92126c304fe54c8e4e..621ebca56e0566d2e5c967f8cd4183e3d74e8e64 100644
--- a/openair2/RRC/NR/rrc_gNB_cuup.c
+++ b/openair2/RRC/NR/rrc_gNB_cuup.c
@@ -19,9 +19,24 @@
  *      contact@openairinterface.org
  */
 
+#include <netinet/in.h>
+#include <netinet/sctp.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include "PHY/defs_common.h"
+#include "RRC/NR/nr_rrc_proto.h"
+#include "T.h"
+#include "as_message.h"
+#include "assertions.h"
 #include "common/ran_context.h"
+#include "common/utils/T/T.h"
+#include "e1ap_messages_types.h"
+#include "intertask_interface.h"
 #include "nr_rrc_defs.h"
 #include "openair2/F1AP/f1ap_ids.h"
+#include "rrc_messages_types.h"
+#include "tree.h"
 
 static int cuup_compare(const nr_rrc_cuup_container_t *a, const nr_rrc_cuup_container_t *b)
 {
diff --git a/openair2/RRC/NR/rrc_gNB_du.c b/openair2/RRC/NR/rrc_gNB_du.c
index 98cdb313dfe550d93c8261514d054ce39aeec0eb..639c279d4decf9084196b191bb933f954185ed33 100644
--- a/openair2/RRC/NR/rrc_gNB_du.c
+++ b/openair2/RRC/NR/rrc_gNB_du.c
@@ -20,17 +20,37 @@
  */
 
 #include "rrc_gNB_du.h"
-#include "rrc_gNB_NGAP.h"
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include "F1AP_CauseMisc.h"
+#include "F1AP_CauseProtocol.h"
+#include "F1AP_CauseRadioNetwork.h"
+#include "PHY/defs_common.h"
+#include "T.h"
+#include "asn_codecs.h"
+#include "assertions.h"
 #include "common/ran_context.h"
+#include "common/utils/T/T.h"
+#include "common/utils/alg/foreach.h"
+#include "common/utils/ds/seq_arr.h"
+#include "constr_TYPE.h"
+#include "executables/softmodem-common.h"
+#include "f1ap_messages_types.h"
+#include "ngap_messages_types.h"
 #include "nr_rrc_defs.h"
-#include "rrc_gNB_UE_context.h"
 #include "rrc_gNB_mobility.h"
 #include "openair2/F1AP/f1ap_common.h"
 #include "openair2/F1AP/f1ap_ids.h"
-#include "executables/softmodem-common.h"
-#include "common/utils/ds/seq_arr.h"
-#include "common/utils/alg/foreach.h"
 #include "lib/f1ap_interface_management.h"
+#include "rrc_gNB_NGAP.h"
+#include "rrc_gNB_UE_context.h"
+#include "rrc_messages_types.h"
+#include "s1ap_messages_types.h"
+#include "tree.h"
+#include "uper_decoder.h"
+#include "utils.h"
+#include "xer_encoder.h"
 
 int get_dl_band(const struct f1ap_served_cell_info_t *cell_info)
 {
diff --git a/openair2/RRC/NR/rrc_gNB_du.h b/openair2/RRC/NR/rrc_gNB_du.h
index bd3c4f6443b937bfd51e2453e5fab8a6545984e2..aadac0845a746790534540eaee1263ef2f1dfcc8 100644
--- a/openair2/RRC/NR/rrc_gNB_du.h
+++ b/openair2/RRC/NR/rrc_gNB_du.h
@@ -26,7 +26,6 @@
 #include <netinet/sctp.h>
 #include <stdint.h>
 #include <stdio.h>
-
 struct f1ap_setup_req_s;
 struct f1ap_lost_connection_t;
 struct gNB_RRC_INST_s;
diff --git a/openair2/RRC/NR/rrc_gNB_internode.c b/openair2/RRC/NR/rrc_gNB_internode.c
index 6b001e16fdb1939fdc1ba9f5c4337484172e05d3..4fbca5f8f0bf12501b944afb9d220da6074729bf 100644
--- a/openair2/RRC/NR/rrc_gNB_internode.c
+++ b/openair2/RRC/NR/rrc_gNB_internode.c
@@ -30,16 +30,22 @@
 #ifndef RRC_GNB_INTERNODE_C
 #define RRC_GNB_INTERNODE_C
 
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "OCTET_STRING.h"
+#include "PHY/defs_common.h"
+#include "RRC/NR/nr_rrc_proto.h"
+#include "T.h"
+#include "asn_codecs.h"
+#include "assertions.h"
+#include "common/utils/T/T.h"
+#include "constr_TYPE.h"
+#include "executables/softmodem-common.h"
 #include "nr_rrc_defs.h"
-#include "NR_RRCReconfiguration.h"
-#include "NR_UE-NR-Capability.h"
-#include "NR_CG-ConfigInfo.h"
-#include "NR_UE-CapabilityRAT-ContainerList.h"
-#include "LTE_UE-CapabilityRAT-ContainerList.h"
-#include "NR_CG-Config.h"
-#include "uper_encoder.h"
 #include "uper_decoder.h"
-#include "executables/softmodem-common.h"
+#include "uper_encoder.h"
+#include "x2ap_messages_types.h"
 
 int parse_CG_ConfigInfo(gNB_RRC_INST *rrc, NR_CG_ConfigInfo_t *CG_ConfigInfo, x2ap_ENDC_sgnb_addition_req_t *m) {
   if (CG_ConfigInfo->criticalExtensions.present == NR_CG_ConfigInfo__criticalExtensions_PR_c1) {
diff --git a/openair2/RRC/NR/rrc_gNB_mobility.c b/openair2/RRC/NR/rrc_gNB_mobility.c
index 137e7010c28e4b88a3b9da4f44296d29b255c87b..22e86c5120835e95bbcd9f6e48893caccebf7148 100644
--- a/openair2/RRC/NR/rrc_gNB_mobility.c
+++ b/openair2/RRC/NR/rrc_gNB_mobility.c
@@ -29,6 +29,7 @@
 #include "rrc_gNB_du.h"
 #include "rrc_gNB_radio_bearers.h"
 #include "rrc_gNB_UE_context.h"
+#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac.h"
 #include "openair2/F1AP/f1ap_ids.h"
 #include "MESSAGES/asn1_msg.h"
 #include "nr_pdcp/nr_pdcp_oai_api.h"
@@ -286,7 +287,7 @@ static void nr_rrc_f1_ho_complete(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE)
       .gNB_DU_ue_id = source_ctx->du_ue_id,
       .cause = F1AP_CAUSE_RADIO_NETWORK, // better
       .cause_value = 5, // 5 = F1AP_CauseRadioNetwork_interaction_with_other_procedure
-      .srb_id = DCCH,
+      .srb_id = DL_SCH_LCID_DCCH,
   };
   rrc->mac_rrc.ue_context_release_command(source_ctx->du->assoc_id, &cmd);
   LOG_I(NR_RRC, "UE %d Handover: trigger release on DU assoc_id %d\n", UE->rrc_ue_id, source_ctx->du->assoc_id);
@@ -302,7 +303,7 @@ static void nr_rrc_cancel_f1_ho(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE)
       .gNB_DU_ue_id = target_ctx->du_ue_id,
       .cause = F1AP_CAUSE_RADIO_NETWORK, // better
       .cause_value = 5, // 5 = F1AP_CauseRadioNetwork_interaction_with_other_procedure
-      .srb_id = DCCH,
+      .srb_id = DL_SCH_LCID_DCCH,
   };
   rrc->mac_rrc.ue_context_release_command(target_ctx->du->assoc_id, &cmd);
 }
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index 73509f6d72f76c44d472f504aefed230ef9eb406..bae7c451808fa128f31abb3e7407cdcf1b3bb48f 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -28,30 +28,49 @@
  * \email: raymond.knopp@eurecom.fr
  */
 
+#include <assert.h>
+#include <assertions.h>
+#include <openair2/RRC/NR/nr_rrc_proto.h>
+#include <openair2/RRC/NR/rrc_gNB_UE_context.h>
+#include <openair3/ocp-gtpu/gtp_itf.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "MESSAGES/asn1_msg.h"
+#include "OCTET_STRING.h"
+#include "PHY/defs_common.h"
+#include "RRC/NR/nr_rrc_config.h"
+#include "T.h"
+#include "asn_codecs.h"
+#include "asn_internal.h"
+#include "assertions.h"
+#include "common/ngran_types.h"
+#include "common/ran_context.h"
+#include "common/utils/T/T.h"
+#include "constr_TYPE.h"
+#include "executables/nr-softmodem.h"
+#include "executables/softmodem-common.h"
+#include "gtpv1_u_messages_types.h"
+#include "intertask_interface.h"
+#include "ngap_messages_types.h"
+#include "nr_pdcp/nr_pdcp_entity.h"
+#include "nr_pdcp/nr_pdcp_oai_api.h"
 #include "nr_rrc_defs.h"
-#include "NR_RRCReconfiguration.h"
-#include "NR_UE-NR-Capability.h"
-//#include "NR_UE-CapabilityRAT-ContainerList.h"
-#include "LTE_UE-CapabilityRAT-ContainerList.h"
-#include "NR_CellGroupConfig.h"
-#include "NR_CG-Config.h"
-//#include "NR_SRB-ToAddModList.h"
-#include "uper_encoder.h"
-#include "uper_decoder.h"
+#include "openair2/F1AP/f1ap_ids.h"
 #include "openair2/LAYER2/NR_MAC_gNB/mac_proto.h"
 #include "openair2/LAYER2/nr_rlc/nr_rlc_oai_api.h"
 #include "openair2/RRC/NR/rrc_gNB_GTPV1U.h"
-#include "openair2/F1AP/f1ap_ids.h"
-#include "executables/softmodem-common.h"
-#include "executables/nr-softmodem.h"
-#include <openair2/RRC/NR/rrc_gNB_UE_context.h>
-#include <openair3/ocp-gtpu/gtp_itf.h>
-#include "openair3/SECU/secu_defs.h"
 #include "openair3/SECU/key_nas_deriver.h"
-
-#include <openair2/RRC/NR/nr_rrc_proto.h>
-#include "nr_pdcp/nr_pdcp_oai_api.h"
-#include "MESSAGES/asn1_msg.h"
+#include "rlc.h"
+#include "s1ap_messages_types.h"
+#include "tree.h"
+#include "uper_decoder.h"
+#include "uper_encoder.h"
+#include "x2ap_messages_types.h"
+#include "xer_decoder.h"
+#include "xer_encoder.h"
 
 void rrc_parse_ue_capabilities(gNB_RRC_INST *rrc, NR_UE_CapabilityRAT_ContainerList_t *UE_CapabilityRAT_ContainerList, x2ap_ENDC_sgnb_addition_req_t *m, NR_CG_ConfigInfo_IEs_t *cg_config_info)
 {
diff --git a/openair2/RRC/NR/rrc_gNB_radio_bearers.c b/openair2/RRC/NR/rrc_gNB_radio_bearers.c
index aec7865a1cfabf3d78d9dd5a6835db66778b572a..ce6eb40bbebb5e7ab83b5865d58d83e153526869 100644
--- a/openair2/RRC/NR/rrc_gNB_radio_bearers.c
+++ b/openair2/RRC/NR/rrc_gNB_radio_bearers.c
@@ -20,8 +20,17 @@
  */
 
 #include "rrc_gNB_radio_bearers.h"
+#include <stddef.h>
+#include "E1AP_RLC-Mode.h"
+#include "PHY/defs_common.h"
+#include "RRC/NR/nr_rrc_defs.h"
+#include "T.h"
+#include "asn_internal.h"
+#include "assertions.h"
+#include "common/platform_constants.h"
+#include "common/utils/T/T.h"
+#include "ngap_messages_types.h"
 #include "oai_asn1.h"
-#include "openair2/E1AP/e1ap.h"
 
 rrc_pdu_session_param_t *find_pduSession(gNB_RRC_UE_t *ue, int id, bool create)
 {
diff --git a/openair2/RRC/NR/rrc_gNB_radio_bearers.h b/openair2/RRC/NR/rrc_gNB_radio_bearers.h
index 29fead6beaf8d74345dd4853cfffd44cccb3c874..37ddbdd4313add99759269511a1bdabb38c1c88c 100644
--- a/openair2/RRC/NR/rrc_gNB_radio_bearers.h
+++ b/openair2/RRC/NR/rrc_gNB_radio_bearers.h
@@ -22,12 +22,11 @@
 #ifndef _RRC_GNB_DRBS_H_
 #define _RRC_GNB_DRBS_H_
 
-#include "nr_rrc_defs.h"
-#include "NR_SDAP-Config.h"
+#include <stdbool.h>
+#include <stdint.h>
 #include "NR_DRB-ToAddMod.h"
-#include "NR_SRB-ToAddMod.h"
-
-#include "common/platform_constants.h"
+#include "e1ap_messages_types.h"
+#include "nr_rrc_defs.h"
 
 #define DRB_ACTIVE_NONGBR       (2)   /* DRB is used for Non-GBR Flows */
 #define DRB_ACTIVE              (1)
diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c
index d8e9593e08564a7bdec48235714fef4bdf933386..1f94e21d6c13c51a3caf38f59d14aa6d714e6f10 100644
--- a/openair2/RRC/NR/rrc_gNB_reconfig.c
+++ b/openair2/RRC/NR/rrc_gNB_reconfig.c
@@ -30,24 +30,15 @@
 #ifndef RRC_GNB_NSA_C
 #define RRC_GNB_NSA_C
 
-#include "NR_ServingCellConfigCommon.h"
-#include "NR_ServingCellConfig.h"
-#include "NR_RRCReconfiguration.h"
-#include "NR_RRCReconfiguration-IEs.h"
-#include "NR_CellGroupConfig.h"
-#include "NR_MAC-CellGroupConfig.h"
-#include "NR_BSR-Config.h"
-#include "NR_PDSCH-ServingCellConfig.h"
-#include "NR_RLC-BearerConfig.h"
-#include "BOOLEAN.h"
-#include "uper_encoder.h"
+#include <stdlib.h>
+
+#include "OCTET_STRING.h"
+#include "RRC/NR/nr_rrc_proto.h"
+#include "asn_codecs.h"
 #include "assertions.h"
+#include "constr_TYPE.h"
 #include "oai_asn1.h"
-#include "common/utils/nr/nr_common.h"
-#include "executables/softmodem-common.h"
-#include "LAYER2/nr_rlc/nr_rlc_oai_api.h"
-#include "nr_rrc_config.h"
-#include "MESSAGES/asn1_msg.h"
+#include "uper_encoder.h"
 
 NR_RRCReconfiguration_IEs_t *get_default_reconfig(const NR_CellGroupConfig_t *secondaryCellGroup)
 {
diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c
index 13e5965d751ea7d141ac5bc5e34d7f39e7901783..e9d1f20fb369c26dfbc94f96a4c9fb5c25efff81 100644
--- a/openair2/RRC/NR_UE/rrc_UE.c
+++ b/openair2/RRC/NR_UE/rrc_UE.c
@@ -47,6 +47,7 @@
 
 #include "rrc_defs.h"
 #include "rrc_proto.h"
+#include "openair2/RRC/LTE/rrc_defs.h"
 #include "L2_interface_ue.h"
 #include "LAYER2/NR_MAC_UE/mac_proto.h"
 
@@ -140,10 +141,6 @@ static void nr_rrc_ue_process_RadioBearerConfig(NR_UE_RRC_INST_t *ue_rrc,
                                                 NR_RadioBearerConfig_t *const radioBearerConfig);
 static void nr_rrc_ue_generate_rrcReestablishmentComplete(const NR_UE_RRC_INST_t *rrc, const NR_RRCReestablishment_t *rrcReestablishment);
 static void process_lte_nsa_msg(NR_UE_RRC_INST_t *rrc, nsa_msg_t *msg, int msg_len);
-static void nr_rrc_ue_process_rrcReconfiguration(NR_UE_RRC_INST_t *rrc,
-                                                 int gNB_index,
-                                                 NR_RRCReconfiguration_t *rrcReconfiguration);
-
 static void nr_rrc_ue_process_ueCapabilityEnquiry(NR_UE_RRC_INST_t *rrc, NR_UECapabilityEnquiry_t *UECapabilityEnquiry);
 static void nr_rrc_ue_process_masterCellGroup(NR_UE_RRC_INST_t *rrc,
                                               OCTET_STRING_t *masterCellGroup,
@@ -168,43 +165,282 @@ static void set_DRB_status(NR_UE_RRC_INST_t *rrc, NR_DRB_Identity_t drb_id, NR_R
   rrc->status_DRBs[drb_id - 1] = status;
 }
 
-static void nr_rrc_ue_process_rrcReconfiguration(NR_UE_RRC_INST_t *rrc,
-                                                 int gNB_index,
-                                                 NR_RRCReconfiguration_t *rrcReconfiguration)
+static void nr_decode_SI(NR_UE_RRC_SI_INFO *SI_info, NR_SystemInformation_t *si)
+{
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SI, VCD_FUNCTION_IN);
+
+  // Dump contents
+  if (si->criticalExtensions.present == NR_SystemInformation__criticalExtensions_PR_systemInformation
+      || si->criticalExtensions.present == NR_SystemInformation__criticalExtensions_PR_criticalExtensionsFuture_r16) {
+    LOG_D(NR_RRC,
+          "[UE] si->criticalExtensions.choice.NR_SystemInformation_t->sib_TypeAndInfo.list.count %d\n",
+          si->criticalExtensions.choice.systemInformation->sib_TypeAndInfo.list.count);
+  } else {
+    LOG_D(NR_RRC, "[UE] Unknown criticalExtension version (not Rel16)\n");
+    return;
+  }
+
+  for (int i = 0; i < si->criticalExtensions.choice.systemInformation->sib_TypeAndInfo.list.count; i++) {
+    SystemInformation_IEs__sib_TypeAndInfo__Member *typeandinfo;
+    typeandinfo = si->criticalExtensions.choice.systemInformation->sib_TypeAndInfo.list.array[i];
+    LOG_I(NR_RRC, "Found SIB%d\n", typeandinfo->present + 1);
+    switch(typeandinfo->present) {
+      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib2:
+        SI_info->sib2_validity = true;
+        nr_timer_start(&SI_info->sib2_timer);
+        break;
+      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib3:
+        SI_info->sib3_validity = true;
+        nr_timer_start(&SI_info->sib3_timer);
+        break;
+      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib4:
+        SI_info->sib4_validity = true;
+        nr_timer_start(&SI_info->sib4_timer);
+        break;
+      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib5:
+        SI_info->sib5_validity = true;
+        nr_timer_start(&SI_info->sib5_timer);
+        break;
+      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib6:
+        SI_info->sib6_validity = true;
+        nr_timer_start(&SI_info->sib6_timer);
+        break;
+      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib7:
+        SI_info->sib7_validity = true;
+        nr_timer_start(&SI_info->sib7_timer);
+        break;
+      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib8:
+        SI_info->sib8_validity = true;
+        nr_timer_start(&SI_info->sib8_timer);
+        break;
+      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib9:
+        SI_info->sib9_validity = true;
+        nr_timer_start(&SI_info->sib9_timer);
+        break;
+      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib10_v1610:
+        SI_info->sib10_validity = true;
+        nr_timer_start(&SI_info->sib10_timer);
+        break;
+      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib11_v1610:
+        SI_info->sib11_validity = true;
+        nr_timer_start(&SI_info->sib11_timer);
+        break;
+      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib12_v1610:
+        SI_info->sib12_validity = true;
+        nr_timer_start(&SI_info->sib12_timer);
+        break;
+      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib13_v1610:
+        SI_info->sib13_validity = true;
+        nr_timer_start(&SI_info->sib13_timer);
+        break;
+      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib14_v1610:
+        SI_info->sib14_validity = true;
+        nr_timer_start(&SI_info->sib14_timer);
+        break;
+      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib19_v1700:
+        SI_info->SInfo_r17.sib19_validity = true;
+        if (g_log->log_component[NR_RRC].level >= OAILOG_DEBUG)
+          xer_fprint(stdout, &asn_DEF_NR_SIB19_r17, (const void *)typeandinfo->choice.sib19_v1700);
+        nr_timer_start(&SI_info->SInfo_r17.sib19_timer);
+        break;
+      default:
+        break;
+    }
+  }
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SI, VCD_FUNCTION_OUT);
+}
+
+static void nr_rrc_ue_prepare_RRCSetupRequest(NR_UE_RRC_INST_t *rrc)
+{
+  LOG_D(NR_RRC, "Generation of RRCSetupRequest\n");
+  uint8_t rv[6];
+  // Get RRCConnectionRequest, fill random for now
+  // Generate random byte stream for contention resolution
+  for (int i = 0; i < 6; i++) {
+#ifdef SMBV
+    // if SMBV is configured the contention resolution needs to be fix for the connection procedure to succeed
+    rv[i] = i;
+#else
+    rv[i] = taus() & 0xff;
+#endif
+  }
+
+  uint8_t buf[1024];
+  int len = do_RRCSetupRequest(buf, sizeof(buf), rv);
+
+  nr_rlc_srb_recv_sdu(rrc->ue_id, 0, buf, len);
+}
+
+static void nr_rrc_configure_default_SI(NR_UE_RRC_SI_INFO *SI_info,
+                                        struct NR_SI_SchedulingInfo *si_SchedulingInfo,
+                                        struct NR_SI_SchedulingInfo_v1700 *si_SchedulingInfo_v1700)
+{
+  if (si_SchedulingInfo) {
+    SI_info->default_otherSI_map = 0;
+    for (int i = 0; i < si_SchedulingInfo->schedulingInfoList.list.count; i++) {
+      struct NR_SchedulingInfo *schedulingInfo = si_SchedulingInfo->schedulingInfoList.list.array[i];
+      for (int j = 0; j < schedulingInfo->sib_MappingInfo.list.count; j++) {
+        struct NR_SIB_TypeInfo *sib_Type = schedulingInfo->sib_MappingInfo.list.array[j];
+        SI_info->default_otherSI_map |= 1 << sib_Type->type;
+      }
+    }
+  }
+
+  if (si_SchedulingInfo_v1700) {
+    SI_info->SInfo_r17.default_otherSI_map_r17 = 0;
+    for (int i = 0; i < si_SchedulingInfo_v1700->schedulingInfoList2_r17.list.count; i++) {
+      struct NR_SchedulingInfo2_r17 *schedulingInfo2 = si_SchedulingInfo_v1700->schedulingInfoList2_r17.list.array[i];
+      for (int j = 0; j < schedulingInfo2->sib_MappingInfo_r17.list.count; j++) {
+        struct NR_SIB_TypeInfo_v1700 *sib_TypeInfo_v1700 = schedulingInfo2->sib_MappingInfo_r17.list.array[j];
+        if (sib_TypeInfo_v1700->sibType_r17.present == NR_SIB_TypeInfo_v1700__sibType_r17_PR_type1_r17) {
+          SI_info->SInfo_r17.default_otherSI_map_r17 |= 1 << sib_TypeInfo_v1700->sibType_r17.choice.type1_r17;
+        }
+      }
+    }
+  }
+}
+
+static void nr_rrc_process_sib1(NR_UE_RRC_INST_t *rrc, NR_UE_RRC_SI_INFO *SI_info, NR_SIB1_t *sib1)
+{
+  if(g_log->log_component[NR_RRC].level >= OAILOG_DEBUG)
+    xer_fprint(stdout, &asn_DEF_NR_SIB1, (const void *) sib1);
+  LOG_A(NR_RRC, "SIB1 decoded\n");
+  nr_timer_start(&SI_info->sib1_timer);
+  SI_info->sib1_validity = true;
+  if (rrc->nrRrcState == RRC_STATE_IDLE_NR) {
+    rrc->ra_trigger = RRC_CONNECTION_SETUP;
+    // preparing RRC setup request payload in advance
+    nr_rrc_ue_prepare_RRCSetupRequest(rrc);
+  }
+
+  NR_SI_SchedulingInfo_v1700_t *si_SchedInfo_v1700 = NULL;
+  if (sib1->nonCriticalExtension
+      && sib1->nonCriticalExtension->nonCriticalExtension
+      && sib1->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension) {
+    si_SchedInfo_v1700 = sib1->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->si_SchedulingInfo_v1700;
+  }
+
+  // configure default SI
+  nr_rrc_configure_default_SI(SI_info, sib1->si_SchedulingInfo, si_SchedInfo_v1700);
+  // configure timers and constant
+  nr_rrc_set_sib1_timers_and_constants(&rrc->timers_and_constants, sib1);
+  // RRC storage of SIB1 timers and constants (eg needed in re-establishment)
+  UPDATE_IE(rrc->timers_and_constants.sib1_TimersAndConstants, sib1->ue_TimersAndConstants, NR_UE_TimersAndConstants_t);
+
+  nr_rrc_mac_config_req_sib1(rrc->ue_id, 0, sib1->si_SchedulingInfo, si_SchedInfo_v1700, sib1->servingCellConfigCommon);
+}
+
+static void nr_rrc_process_reconfiguration_v1530(NR_UE_RRC_INST_t *rrc, NR_RRCReconfiguration_v1530_IEs_t *rec_1530, int gNB_index)
+{
+  if (rec_1530->fullConfig) {
+    // TODO perform the full configuration procedure as specified in 5.3.5.11 of 331
+    LOG_E(NR_RRC, "RRCReconfiguration includes fullConfig but this is not implemented yet\n");
+  }
+  if (rec_1530->masterCellGroup)
+    nr_rrc_ue_process_masterCellGroup(rrc, rec_1530->masterCellGroup, rec_1530->fullConfig);
+  if (rec_1530->masterKeyUpdate) {
+    // TODO perform AS security key update procedure as specified in 5.3.5.7
+    LOG_E(NR_RRC, "RRCReconfiguration includes masterKeyUpdate but this is not implemented yet\n");
+  }
+  /* Check if there is dedicated NAS information to forward to NAS */
+  if (rec_1530->dedicatedNAS_MessageList) {
+    struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList *tmp = rec_1530->dedicatedNAS_MessageList;
+    for (int i = 0; i < tmp->list.count; i++) {
+      MessageDef *ittiMsg = itti_alloc_new_message(TASK_RRC_NRUE, rrc->ue_id, NAS_CONN_ESTABLI_CNF);
+      nas_establish_cnf_t *msg = &NAS_CONN_ESTABLI_CNF(ittiMsg);
+      msg->errCode = AS_SUCCESS;
+      msg->nasMsg.length = tmp->list.array[i]->size;
+      msg->nasMsg.nas_data = tmp->list.array[i]->buf;
+      itti_send_msg_to_task(TASK_NAS_NRUE, rrc->ue_id, ittiMsg);
+    }
+    tmp->list.count = 0; // to prevent the automatic free by ASN1_FREE
+  }
+  NR_UE_RRC_SI_INFO *SI_info = &rrc->perNB[gNB_index].SInfo;
+  if (rec_1530->dedicatedSIB1_Delivery) {
+    NR_SIB1_t *sib1 = NULL;
+    asn_dec_rval_t dec_rval = uper_decode(NULL,
+                                          &asn_DEF_NR_SIB1,
+                                          (void **)&sib1,
+                                          (uint8_t *)rec_1530->dedicatedSIB1_Delivery->buf,
+                                          rec_1530->dedicatedSIB1_Delivery->size,
+                                          0,
+                                          0);
+    if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+      LOG_E(NR_RRC, "dedicatedSIB1-Delivery decode error\n");
+      SEQUENCE_free(&asn_DEF_NR_SIB1, sib1, 1);
+    } else {
+      nr_rrc_process_sib1(rrc, SI_info, sib1);
+    }
+  }
+  if (rec_1530->dedicatedSystemInformationDelivery) {
+    NR_SystemInformation_t *si = NULL;
+    asn_dec_rval_t dec_rval = uper_decode(NULL,
+                                          &asn_DEF_NR_SystemInformation,
+                                          (void **)&si,
+                                          (uint8_t *)rec_1530->dedicatedSystemInformationDelivery->buf,
+                                          rec_1530->dedicatedSystemInformationDelivery->size,
+                                          0,
+                                          0);
+    if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+      LOG_E(NR_RRC, "dedicatedSystemInformationDelivery decode error\n");
+      SEQUENCE_free(&asn_DEF_NR_SystemInformation, si, 1);
+    } else {
+      LOG_I(NR_RRC, "[UE %ld] Decoding dedicatedSystemInformationDelivery\n", rrc->ue_id);
+      nr_decode_SI(SI_info, si);
+    }
+  }
+  if (rec_1530->otherConfig) {
+    // TODO perform the other configuration procedure as specified in 5.3.5.9
+    LOG_E(NR_RRC, "RRCReconfiguration includes otherConfig but this is not handled yet\n");
+  }
+  NR_RRCReconfiguration_v1540_IEs_t *rec_1540 = rec_1530->nonCriticalExtension;
+  if (rec_1540) {
+    NR_RRCReconfiguration_v1560_IEs_t *rec_1560 = rec_1540->nonCriticalExtension;
+    if (rec_1560->sk_Counter) {
+      // TODO perform AS security key update procedure as specified in 5.3.5.7
+      LOG_E(NR_RRC, "RRCReconfiguration includes sk-Counter but this is not implemented yet\n");
+    }
+    if (rec_1560->mrdc_SecondaryCellGroupConfig) {
+      // TODO perform handling of mrdc-SecondaryCellGroupConfig as specified in 5.3.5.3
+      LOG_E(NR_RRC, "RRCReconfiguration includes mrdc-SecondaryCellGroupConfig but this is not handled yet\n");
+    }
+    if (rec_1560->radioBearerConfig2) {
+      NR_RadioBearerConfig_t *RadioBearerConfig = NULL;
+      asn_dec_rval_t dec_rval = uper_decode(NULL,
+                                            &asn_DEF_NR_RadioBearerConfig,
+                                            (void **)&RadioBearerConfig,
+                                            (uint8_t *)rec_1560->radioBearerConfig2->buf,
+                                            rec_1560->radioBearerConfig2->size,
+                                            0,
+                                            0);
+      if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+        LOG_E(NR_RRC, "radioBearerConfig2 decode error\n");
+        SEQUENCE_free(&asn_DEF_NR_RadioBearerConfig, RadioBearerConfig, 1);
+      } else
+        nr_rrc_ue_process_RadioBearerConfig(rrc, RadioBearerConfig);
+    }
+  }
+}
+
+static void nr_rrc_ue_process_rrcReconfiguration(NR_UE_RRC_INST_t *rrc, int gNB_index, NR_RRCReconfiguration_t *reconfiguration)
 {
   rrcPerNB_t *rrcNB = rrc->perNB + gNB_index;
 
-  switch (rrcReconfiguration->criticalExtensions.present) {
+  switch (reconfiguration->criticalExtensions.present) {
     case NR_RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration: {
-      NR_RRCReconfiguration_IEs_t *ie = rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration;
+      NR_RRCReconfiguration_IEs_t *ie = reconfiguration->criticalExtensions.choice.rrcReconfiguration;
 
-      if (ie->radioBearerConfig != NULL) {
-        LOG_I(NR_RRC, "radio Bearer Configuration is present\n");
+      if (ie->radioBearerConfig) {
+        LOG_I(NR_RRC, "RRCReconfiguration includes radio Bearer Configuration\n");
         nr_rrc_ue_process_RadioBearerConfig(rrc, ie->radioBearerConfig);
         if (LOG_DEBUGFLAG(DEBUG_ASN1))
           xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void *)ie->radioBearerConfig);
       }
 
-      if (ie->nonCriticalExtension) {
-        NR_RRCReconfiguration_v1530_IEs_t *ext = ie->nonCriticalExtension;
-        if (ext->masterCellGroup)
-          nr_rrc_ue_process_masterCellGroup(rrc, ext->masterCellGroup, ext->fullConfig);
-        /* Check if there is dedicated NAS information to forward to NAS */
-        if (ie->nonCriticalExtension->dedicatedNAS_MessageList) {
-          struct NR_RRCReconfiguration_v1530_IEs__dedicatedNAS_MessageList *tmp = ext->dedicatedNAS_MessageList;
-          for (int i = 0; i < tmp->list.count; i++) {
-            MessageDef *ittiMsg = itti_alloc_new_message(TASK_RRC_NRUE, rrc->ue_id, NAS_CONN_ESTABLI_CNF);
-            nas_establish_cnf_t *msg = &NAS_CONN_ESTABLI_CNF(ittiMsg);
-            msg->errCode = AS_SUCCESS;
-            msg->nasMsg.length = tmp->list.array[i]->size;
-            msg->nasMsg.nas_data = tmp->list.array[i]->buf;
-            itti_send_msg_to_task(TASK_NAS_NRUE, rrc->ue_id, ittiMsg);
-          }
-          tmp->list.count = 0; // to prevent the automatic free by ASN1_FREE
-        }
-      }
+      if (ie->nonCriticalExtension)
+        nr_rrc_process_reconfiguration_v1530(rrc, ie->nonCriticalExtension, gNB_index);
 
-      if (ie->secondaryCellGroup != NULL) {
+      if (ie->secondaryCellGroup) {
         NR_CellGroupConfig_t *cellGroupConfig = NULL;
         asn_dec_rval_t dec_rval = uper_decode(NULL,
                                               &asn_DEF_NR_CellGroupConfig, // might be added prefix later
@@ -232,15 +468,14 @@ static void nr_rrc_ue_process_rrcReconfiguration(NR_UE_RRC_INST_t *rrc,
         nr_rrc_mac_config_req_cg(rrc->ue_id, 0, cellGroupConfig, rrc->UECap.UE_NR_Capability);
         asn1cFreeStruc(asn_DEF_NR_CellGroupConfig, cellGroupConfig);
       }
-      if (ie->measConfig != NULL) {
-        LOG_I(NR_RRC, "Measurement Configuration is present\n");
+      if (ie->measConfig) {
+        LOG_I(NR_RRC, "RRCReconfiguration includes Measurement Configuration\n");
         nr_rrc_ue_process_measConfig(rrcNB, ie->measConfig, &rrc->timers_and_constants);
       }
-      if (ie->lateNonCriticalExtension != NULL) {
-        //  unuse now
+      if (ie->lateNonCriticalExtension) {
+        LOG_E(NR_RRC, "RRCReconfiguration includes lateNonCriticalExtension. Not handled.\n");
       }
     } break;
-
     case NR_RRCReconfiguration__criticalExtensions_PR_NOTHING:
     case NR_RRCReconfiguration__criticalExtensions_PR_criticalExtensionsFuture:
     default:
@@ -262,7 +497,7 @@ void process_nsa_message(NR_UE_RRC_INST_t *rrc, nsa_message_t nsa_message_type,
       if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
         LOG_E(NR_RRC, "NR_RRCReconfiguration decode error\n");
         // free the memory
-        SEQUENCE_free( &asn_DEF_NR_RRCReconfiguration, RRCReconfiguration, 1 );
+        SEQUENCE_free(&asn_DEF_NR_RRCReconfiguration, RRCReconfiguration, 1);
         return;
       }
       nr_rrc_ue_process_rrcReconfiguration(rrc, 0, RRCReconfiguration);
@@ -328,6 +563,7 @@ NR_UE_RRC_INST_t* nr_rrc_init_ue(char* uecap_file, int nb_inst, int num_ant_tx)
     rrc->ul_bwp_id = 0;
     rrc->as_security_activated = false;
     rrc->detach_after_release = false;
+    rrc->reconfig_after_reestab = false;
 
     FILE *f = NULL;
     if (uecap_file)
@@ -376,55 +612,55 @@ bool check_si_validity(NR_UE_RRC_SI_INFO *SI_info, int si_type)
 {
   switch (si_type) {
     case NR_SIB_TypeInfo__type_sibType2:
-      if (!SI_info->sib2)
+      if (!SI_info->sib2_validity)
         return false;
       break;
     case NR_SIB_TypeInfo__type_sibType3:
-      if (!SI_info->sib3)
+      if (!SI_info->sib3_validity)
         return false;
       break;
     case NR_SIB_TypeInfo__type_sibType4:
-      if (!SI_info->sib4)
+      if (!SI_info->sib4_validity)
         return false;
       break;
     case NR_SIB_TypeInfo__type_sibType5:
-      if (!SI_info->sib5)
+      if (!SI_info->sib5_validity)
         return false;
       break;
     case NR_SIB_TypeInfo__type_sibType6:
-      if (!SI_info->sib6)
+      if (!SI_info->sib6_validity)
         return false;
       break;
     case NR_SIB_TypeInfo__type_sibType7:
-      if (!SI_info->sib7)
+      if (!SI_info->sib7_validity)
         return false;
       break;
     case NR_SIB_TypeInfo__type_sibType8:
-      if (!SI_info->sib8)
+      if (!SI_info->sib8_validity)
         return false;
       break;
     case NR_SIB_TypeInfo__type_sibType9:
-      if (!SI_info->sib9)
+      if (!SI_info->sib9_validity)
         return false;
       break;
     case NR_SIB_TypeInfo__type_sibType10_v1610:
-      if (!SI_info->sib10)
+      if (!SI_info->sib10_validity)
         return false;
       break;
     case NR_SIB_TypeInfo__type_sibType11_v1610:
-      if (!SI_info->sib11)
+      if (!SI_info->sib11_validity)
         return false;
       break;
     case NR_SIB_TypeInfo__type_sibType12_v1610:
-      if (!SI_info->sib12)
+      if (!SI_info->sib12_validity)
         return false;
       break;
     case NR_SIB_TypeInfo__type_sibType13_v1610:
-      if (!SI_info->sib13)
+      if (!SI_info->sib13_validity)
         return false;
       break;
     case NR_SIB_TypeInfo__type_sibType14_v1610:
-      if (!SI_info->sib14)
+      if (!SI_info->sib14_validity)
         return false;
       break;
     default :
@@ -437,31 +673,31 @@ bool check_si_validity_r17(NR_UE_RRC_SI_INFO_r17 *SI_info, int si_type)
 {
   switch (si_type) {
     case NR_SIB_TypeInfo_v1700__sibType_r17__type1_r17_sibType15:
-      if (!SI_info->sib15)
+      if (!SI_info->sib15_validity)
         return false;
       break;
     case NR_SIB_TypeInfo_v1700__sibType_r17__type1_r17_sibType16:
-      if (!SI_info->sib16)
+      if (!SI_info->sib16_validity)
         return false;
       break;
     case NR_SIB_TypeInfo_v1700__sibType_r17__type1_r17_sibType17:
-      if (!SI_info->sib17)
+      if (!SI_info->sib17_validity)
         return false;
       break;
     case NR_SIB_TypeInfo_v1700__sibType_r17__type1_r17_sibType18:
-      if (!SI_info->sib18)
+      if (!SI_info->sib18_validity)
         return false;
       break;
     case NR_SIB_TypeInfo_v1700__sibType_r17__type1_r17_sibType19:
-      if (!SI_info->sib19)
+      if (!SI_info->sib19_validity)
         return false;
       break;
     case NR_SIB_TypeInfo_v1700__sibType_r17__type1_r17_sibType20:
-      if (!SI_info->sib20)
+      if (!SI_info->sib20_validity)
         return false;
       break;
     case NR_SIB_TypeInfo_v1700__sibType_r17__type1_r17_sibType21:
-      if (!SI_info->sib21)
+      if (!SI_info->sib21_validity)
         return false;
       break;
     default :
@@ -473,10 +709,10 @@ bool check_si_validity_r17(NR_UE_RRC_SI_INFO_r17 *SI_info, int si_type)
 int check_si_status(NR_UE_RRC_SI_INFO *SI_info)
 {
   // schedule reception of SIB1 if RRC doesn't have it
-  if (!SI_info->sib1)
+  if (!SI_info->sib1_validity)
     return 1;
   else {
-    if (SI_info->sib1->si_SchedulingInfo) {
+    if (SI_info->default_otherSI_map) {
       // Check if RRC has configured default SI
       // from SIB2 to SIB14 as current ASN1 version
       // TODO can be used for on demand SI when (if) implemented
@@ -570,133 +806,6 @@ static void nr_rrc_ue_decode_NR_BCCH_BCH_Message(NR_UE_RRC_INST_t *rrc,
   return;
 }
 
-static int nr_decode_SI(NR_UE_RRC_SI_INFO *SI_info, NR_SystemInformation_t *si)
-{
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SI, VCD_FUNCTION_IN );
-
-  // Dump contents
-  if (si->criticalExtensions.present == NR_SystemInformation__criticalExtensions_PR_systemInformation ||
-      si->criticalExtensions.present == NR_SystemInformation__criticalExtensions_PR_criticalExtensionsFuture_r16) {
-    LOG_D(NR_RRC,
-          "[UE] si->criticalExtensions.choice.NR_SystemInformation_t->sib_TypeAndInfo.list.count %d\n",
-          si->criticalExtensions.choice.systemInformation->sib_TypeAndInfo.list.count);
-  } else {
-    LOG_D(NR_RRC, "[UE] Unknown criticalExtension version (not Rel16)\n");
-    return -1;
-  }
-
-  for (int i = 0; i < si->criticalExtensions.choice.systemInformation->sib_TypeAndInfo.list.count; i++) {
-    SystemInformation_IEs__sib_TypeAndInfo__Member *typeandinfo;
-    typeandinfo = si->criticalExtensions.choice.systemInformation->sib_TypeAndInfo.list.array[i];
-    LOG_I(NR_RRC, "Found SIB%d\n", typeandinfo->present + 1);
-    switch(typeandinfo->present) {
-      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib2:
-        if(!SI_info->sib2)
-          SI_info->sib2 = calloc(1, sizeof(*SI_info->sib2));
-        memcpy(SI_info->sib2, typeandinfo->choice.sib2, sizeof(NR_SIB2_t));
-        nr_timer_start(&SI_info->sib2_timer);
-        break;
-
-      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib3:
-        if(!SI_info->sib3)
-          SI_info->sib3 = calloc(1, sizeof(*SI_info->sib3));
-        memcpy(SI_info->sib3, typeandinfo->choice.sib3, sizeof(NR_SIB3_t));
-        nr_timer_start(&SI_info->sib3_timer);
-        break;
-
-      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib4:
-        if(!SI_info->sib4)
-          SI_info->sib4 = calloc(1, sizeof(*SI_info->sib4));
-        memcpy(SI_info->sib4, typeandinfo->choice.sib4, sizeof(NR_SIB4_t));
-        nr_timer_start(&SI_info->sib4_timer);
-        break;
-
-      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib5:
-        if(!SI_info->sib5)
-          SI_info->sib5 = calloc(1, sizeof(*SI_info->sib5));
-        memcpy(SI_info->sib5, typeandinfo->choice.sib5, sizeof(NR_SIB5_t));
-        nr_timer_start(&SI_info->sib5_timer);
-        break;
-
-      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib6:
-        if(!SI_info->sib6)
-          SI_info->sib6 = calloc(1, sizeof(*SI_info->sib6));
-        memcpy(SI_info->sib6, typeandinfo->choice.sib6, sizeof(NR_SIB6_t));
-        nr_timer_start(&SI_info->sib6_timer);
-        break;
-
-      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib7:
-        if(!SI_info->sib7)
-          SI_info->sib7 = calloc(1, sizeof(*SI_info->sib7));
-        memcpy(SI_info->sib7, typeandinfo->choice.sib7, sizeof(NR_SIB7_t));
-        nr_timer_start(&SI_info->sib7_timer);
-        break;
-
-      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib8:
-        if(!SI_info->sib8)
-          SI_info->sib8 = calloc(1, sizeof(*SI_info->sib8));
-        memcpy(SI_info->sib8, typeandinfo->choice.sib8, sizeof(NR_SIB8_t));
-        nr_timer_start(&SI_info->sib8_timer);
-        break;
-
-      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib9:
-        if(!SI_info->sib9)
-          SI_info->sib9 = calloc(1, sizeof(*SI_info->sib9));
-        memcpy(SI_info->sib9, typeandinfo->choice.sib9, sizeof(NR_SIB9_t));
-        nr_timer_start(&SI_info->sib9_timer);
-        break;
-
-      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib10_v1610:
-        if(!SI_info->sib10)
-          SI_info->sib10 = calloc(1, sizeof(*SI_info->sib10));
-        memcpy(SI_info->sib10, typeandinfo->choice.sib10_v1610, sizeof(NR_SIB10_r16_t));
-        nr_timer_start(&SI_info->sib10_timer);
-        break;
-
-      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib11_v1610:
-        if(!SI_info->sib11)
-          SI_info->sib11 = calloc(1, sizeof(*SI_info->sib11));
-        memcpy(SI_info->sib11, typeandinfo->choice.sib11_v1610, sizeof(NR_SIB11_r16_t));
-        nr_timer_start(&SI_info->sib11_timer);
-        break;
-
-      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib12_v1610:
-        if(!SI_info->sib12)
-          SI_info->sib12 = calloc(1, sizeof(*SI_info->sib12));
-        memcpy(SI_info->sib12, typeandinfo->choice.sib12_v1610, sizeof(NR_SIB12_r16_t));
-        nr_timer_start(&SI_info->sib12_timer);
-        break;
-
-      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib13_v1610:
-        if(!SI_info->sib13)
-          SI_info->sib13 = calloc(1, sizeof(*SI_info->sib13));
-        memcpy(SI_info->sib13, typeandinfo->choice.sib13_v1610, sizeof(NR_SIB13_r16_t));
-        nr_timer_start(&SI_info->sib13_timer);
-        break;
-
-      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib14_v1610:
-        if(!SI_info->sib14)
-          SI_info->sib14 = calloc(1, sizeof(*SI_info->sib14));
-        memcpy(SI_info->sib12, typeandinfo->choice.sib14_v1610, sizeof(NR_SIB14_r16_t));
-        nr_timer_start(&SI_info->sib14_timer);
-        break;
-
-      case NR_SystemInformation_IEs__sib_TypeAndInfo__Member_PR_sib19_v1700:
-        if(!SI_info->SInfo_r17.sib19)
-          SI_info->SInfo_r17.sib19 = calloc(1, sizeof(*SI_info->SInfo_r17.sib19));
-        asn_copy(&asn_DEF_NR_SIB19_r17, (void **) &SI_info->SInfo_r17.sib19, typeandinfo->choice.sib19_v1700);
-        if (g_log->log_component[NR_RRC].level >= OAILOG_DEBUG)
-          xer_fprint(stdout, &asn_DEF_NR_SIB19_r17, (const void *)SI_info->SInfo_r17.sib19);
-        nr_timer_start(&SI_info->SInfo_r17.sib19_timer);
-        break;
-      default:
-        break;
-    }
-  }
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_UE_DECODE_SI, VCD_FUNCTION_OUT);
-  return 0;
-}
-
 static void nr_rrc_handle_msg3_indication(NR_UE_RRC_INST_t *rrc, rnti_t rnti)
 {
   NR_UE_Timers_Constants_t *tac = &rrc->timers_and_constants;
@@ -747,63 +856,6 @@ static void nr_rrc_handle_msg3_indication(NR_UE_RRC_INST_t *rrc, rnti_t rnti)
   }
 }
 
-static void nr_rrc_ue_prepare_RRCSetupRequest(NR_UE_RRC_INST_t *rrc)
-{
-  LOG_D(NR_RRC, "Generation of RRCSetupRequest\n");
-  uint8_t rv[6];
-  // Get RRCConnectionRequest, fill random for now
-  // Generate random byte stream for contention resolution
-  for (int i = 0; i < 6; i++) {
-#ifdef SMBV
-    // if SMBV is configured the contention resolution needs to be fix for the connection procedure to succeed
-    rv[i] = i;
-#else
-    rv[i] = taus() & 0xff;
-#endif
-  }
-
-  uint8_t buf[1024];
-  int len = do_RRCSetupRequest(buf, sizeof(buf), rv);
-
-  nr_rlc_srb_recv_sdu(rrc->ue_id, 0, buf, len);
-}
-
-static void nr_rrc_configure_default_SI(NR_UE_RRC_SI_INFO *SI_info, NR_SIB1_t *sib1)
-{
-  struct NR_SI_SchedulingInfo *si_SchedulingInfo = sib1->si_SchedulingInfo;
-  struct NR_SI_SchedulingInfo_v1700 *si_SchedulingInfo_v1700 = NULL;
-
-  if (sib1->nonCriticalExtension && sib1->nonCriticalExtension->nonCriticalExtension
-      && sib1->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension
-      && sib1->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->si_SchedulingInfo_v1700) {
-    si_SchedulingInfo_v1700 = sib1->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->si_SchedulingInfo_v1700;
-  }
-
-  if (si_SchedulingInfo) {
-    SI_info->default_otherSI_map = 0;
-    for (int i = 0; i < si_SchedulingInfo->schedulingInfoList.list.count; i++) {
-      struct NR_SchedulingInfo *schedulingInfo = si_SchedulingInfo->schedulingInfoList.list.array[i];
-      for (int j = 0; j < schedulingInfo->sib_MappingInfo.list.count; j++) {
-        struct NR_SIB_TypeInfo *sib_Type = schedulingInfo->sib_MappingInfo.list.array[j];
-        SI_info->default_otherSI_map |= 1 << sib_Type->type;
-      }
-    }
-  }
-
-  if (si_SchedulingInfo_v1700) {
-    SI_info->SInfo_r17.default_otherSI_map_r17 = 0;
-    for (int i = 0; i < si_SchedulingInfo_v1700->schedulingInfoList2_r17.list.count; i++) {
-      struct NR_SchedulingInfo2_r17 *schedulingInfo2 = si_SchedulingInfo_v1700->schedulingInfoList2_r17.list.array[i];
-      for (int j = 0; j < schedulingInfo2->sib_MappingInfo_r17.list.count; j++) {
-        struct NR_SIB_TypeInfo_v1700 *sib_TypeInfo_v1700 = schedulingInfo2->sib_MappingInfo_r17.list.array[j];
-        if (sib_TypeInfo_v1700->sibType_r17.present == NR_SIB_TypeInfo_v1700__sibType_r17_PR_type1_r17) {
-          SI_info->SInfo_r17.default_otherSI_map_r17 |= 1 << sib_TypeInfo_v1700->sibType_r17.choice.type1_r17;
-        }
-      }
-    }
-  }
-}
-
 static int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(NR_UE_RRC_INST_t *rrc,
                                                       const uint8_t gNB_index,
                                                       uint8_t *const Sdu,
@@ -838,31 +890,8 @@ static int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(NR_UE_RRC_INST_t *rrc,
   if (bcch_message->message.present == NR_BCCH_DL_SCH_MessageType_PR_c1) {
     switch (bcch_message->message.choice.c1->present) {
       case NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1:
-        LOG_D(NR_RRC, "[UE %ld] Decoding SIB1\n", rrc->ue_id);
-        UPDATE_IE(SI_info->sib1, bcch_message->message.choice.c1->choice.systemInformationBlockType1, NR_SIB1_t);
-        if(g_log->log_component[NR_RRC].level >= OAILOG_DEBUG)
-          xer_fprint(stdout, &asn_DEF_NR_SIB1, (const void *) SI_info->sib1);
-        LOG_A(NR_RRC, "SIB1 decoded\n");
-        nr_timer_start(&SI_info->sib1_timer);
-        if (rrc->nrRrcState == RRC_STATE_IDLE_NR) {
-          rrc->ra_trigger = RRC_CONNECTION_SETUP;
-          // preparing RRC setup request payload in advance
-          nr_rrc_ue_prepare_RRCSetupRequest(rrc);
-        }
-        // configure default SI
-        nr_rrc_configure_default_SI(SI_info, SI_info->sib1);
-        // configure timers and constant
-        nr_rrc_set_sib1_timers_and_constants(&rrc->timers_and_constants, SI_info->sib1);
-
-        NR_SI_SchedulingInfo_v1700_t *si_SchedulingInfo_v1700 = NULL;
-        if (SI_info->sib1->nonCriticalExtension && SI_info->sib1->nonCriticalExtension->nonCriticalExtension
-            && SI_info->sib1->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension) {
-          si_SchedulingInfo_v1700 = SI_info->sib1->nonCriticalExtension->nonCriticalExtension->nonCriticalExtension->si_SchedulingInfo_v1700;
-        }
-
-        nr_rrc_mac_config_req_sib1(rrc->ue_id, 0, SI_info->sib1->si_SchedulingInfo, si_SchedulingInfo_v1700, SI_info->sib1->servingCellConfigCommon);
+        nr_rrc_process_sib1(rrc, SI_info, bcch_message->message.choice.c1->choice.systemInformationBlockType1);
         break;
-
       case NR_BCCH_DL_SCH_MessageType__c1_PR_systemInformation:
         LOG_I(NR_RRC, "[UE %ld] Decoding SI\n", rrc->ue_id);
         NR_SystemInformation_t *si = bcch_message->message.choice.c1->choice.systemInformation;
@@ -924,40 +953,39 @@ static void nr_rrc_manage_rlc_bearers(NR_UE_RRC_INST_t *rrc,
   }
 }
 
-void nr_rrc_cellgroup_configuration(NR_UE_RRC_INST_t *rrc, NR_CellGroupConfig_t *cellGroupConfig)
+static void nr_rrc_process_reconfigurationWithSync(NR_UE_RRC_INST_t *rrc, NR_ReconfigurationWithSync_t *reconfigurationWithSync)
 {
+  // perform Reconfiguration with sync according to 5.3.5.5.2
+  if (!rrc->as_security_activated && !(get_softmodem_params()->phy_test || get_softmodem_params()->do_ra)) {
+    // if the AS security is not activated, perform the actions upon going to RRC_IDLE as specified in 5.3.11
+    // with the release cause 'other' upon which the procedure ends
+    NR_Release_Cause_t release_cause = OTHER;
+    nr_rrc_going_to_IDLE(rrc, release_cause, NULL);
+    return;
+  }
+
+  if (reconfigurationWithSync->spCellConfigCommon &&
+      reconfigurationWithSync->spCellConfigCommon->downlinkConfigCommon &&
+      reconfigurationWithSync->spCellConfigCommon->downlinkConfigCommon->frequencyInfoDL &&
+      reconfigurationWithSync->spCellConfigCommon->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB)
+    rrc->arfcn_ssb = *reconfigurationWithSync->spCellConfigCommon->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB;
+
   NR_UE_Timers_Constants_t *tac = &rrc->timers_and_constants;
+  nr_timer_stop(&tac->T310);
+  int t304_value = nr_rrc_get_T304(reconfigurationWithSync->t304);
+  nr_timer_setup(&tac->T304, t304_value, 10); // 10ms step
+  nr_timer_start(&tac->T304);
+  rrc->rnti = reconfigurationWithSync->newUE_Identity;
+  // reset the MAC entity of this cell group (done at MAC in handle_reconfiguration_with_sync)
+}
 
+void nr_rrc_cellgroup_configuration(NR_UE_RRC_INST_t *rrc, NR_CellGroupConfig_t *cellGroupConfig)
+{
   NR_SpCellConfig_t *spCellConfig = cellGroupConfig->spCellConfig;
-  if(spCellConfig != NULL) {
-    if (spCellConfig->reconfigurationWithSync != NULL) {
-      NR_ReconfigurationWithSync_t *reconfigurationWithSync = spCellConfig->reconfigurationWithSync;
-      if (reconfigurationWithSync->spCellConfigCommon &&
-          reconfigurationWithSync->spCellConfigCommon->downlinkConfigCommon &&
-          reconfigurationWithSync->spCellConfigCommon->downlinkConfigCommon->frequencyInfoDL &&
-          reconfigurationWithSync->spCellConfigCommon->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB)
-        rrc->arfcn_ssb = *reconfigurationWithSync->spCellConfigCommon->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB;
-      // perform Reconfiguration with sync according to 5.3.5.5.2
-      if (!rrc->as_security_activated && rrc->nrRrcState != RRC_STATE_IDLE_NR) {
-        // perform the actions upon going to RRC_IDLE as specified in 5.3.11
-        // with the release cause 'other' upon which the procedure ends
-        // TODO
-      }
-      nr_timer_stop(&tac->T310);
-      int t304_value = nr_rrc_get_T304(reconfigurationWithSync->t304);
-      nr_timer_setup(&tac->T304, t304_value, 10); // 10ms step
-      nr_timer_start(&tac->T304);
-      rrc->rnti = reconfigurationWithSync->newUE_Identity;
-      // resume suspended radio bearers
-      for (int i = 0; i < NR_NUM_SRB; i++) {
-        if (rrc->Srb[i] == RB_SUSPENDED)
-          rrc->Srb[i] = RB_ESTABLISHED;
-      }
-      for (int i = 1; i <= MAX_DRBS_PER_UE; i++) {
-        if (get_DRB_status(rrc, i) == RB_SUSPENDED)
-          set_DRB_status(rrc, i, RB_ESTABLISHED);
-      }
-      // TODO reset MAC
+  if(spCellConfig) {
+    if (spCellConfig->reconfigurationWithSync) {
+      LOG_I(NR_RRC, "Processing reconfigurationWithSync\n");
+      nr_rrc_process_reconfigurationWithSync(rrc, spCellConfig->reconfigurationWithSync);
     }
     nr_rrc_handle_SetupRelease_RLF_TimersAndConstants(rrc, spCellConfig->rlf_TimersAndConstants);
     if (spCellConfig->spCellConfigDedicated) {
@@ -971,11 +999,10 @@ void nr_rrc_cellgroup_configuration(NR_UE_RRC_INST_t *rrc, NR_CellGroupConfig_t
 
   nr_rrc_manage_rlc_bearers(rrc, cellGroupConfig);
 
-  AssertFatal(cellGroupConfig->sCellToReleaseList == NULL,
-              "Secondary serving cell release not implemented\n");
-
-  AssertFatal(cellGroupConfig->sCellToAddModList == NULL,
-              "Secondary serving cell addition not implemented\n");
+  if (cellGroupConfig->ext1)
+    AssertFatal(cellGroupConfig->ext1->reportUplinkTxDirectCurrent == NULL, "Reporting of UplinkTxDirectCurrent not implemented\n");
+  AssertFatal(cellGroupConfig->sCellToReleaseList == NULL, "Secondary serving cell release not implemented\n");
+  AssertFatal(cellGroupConfig->sCellToAddModList == NULL, "Secondary serving cell addition not implemented\n");
 }
 
 
@@ -1691,6 +1718,8 @@ static void nr_rrc_ue_process_rrcReestablishment(NR_UE_RRC_INST_t *rrc,
 
   // resetting the RA trigger state after receiving MSG4 with RRCReestablishment
   rrc->ra_trigger = RA_NOT_RUNNING;
+  // to flag 1st reconfiguration after reestablishment
+  rrc->reconfig_after_reestab = true;
 
   // submit the RRCReestablishmentComplete message to lower layers for transmission
   nr_rrc_ue_generate_rrcReestablishmentComplete(rrc, rrcReestablishment);
@@ -1731,6 +1760,17 @@ static int nr_rrc_ue_decode_dcch(NR_UE_RRC_INST_t *rrc,
 
         case NR_DL_DCCH_MessageType__c1_PR_rrcReconfiguration: {
           nr_rrc_ue_process_rrcReconfiguration(rrc, gNB_indexP, c1->choice.rrcReconfiguration);
+          if (rrc->reconfig_after_reestab) {
+            // if this is the first RRCReconfiguration message after successful completion of the RRC re-establishment procedure
+            // resume SRB2 and DRBs that are suspended
+            if (rrc->Srb[2] == RB_SUSPENDED)
+              rrc->Srb[2] = RB_ESTABLISHED;
+            for (int i = 1; i <= MAX_DRBS_PER_UE; i++) {
+              if (get_DRB_status(rrc, i) == RB_SUSPENDED)
+                set_DRB_status(rrc, i, RB_ESTABLISHED);
+            }
+            rrc->reconfig_after_reestab = false;
+          }
           nr_rrc_ue_generate_RRCReconfigurationComplete(rrc, Srb_id, c1->choice.rrcReconfiguration->rrc_TransactionIdentifier);
         } break;
 
@@ -2041,18 +2081,15 @@ static void nr_rrc_ue_process_ueCapabilityEnquiry(NR_UE_RRC_INST_t *rrc, NR_UECa
   ASN_STRUCT_RESET(asn_DEF_NR_UL_DCCH_Message, &ul_dcch_msg);
 }
 
-void nr_rrc_initiate_rrcReestablishment(NR_UE_RRC_INST_t *rrc,
-                                        NR_ReestablishmentCause_t cause,
-                                        const int gnb_id)
+static void nr_rrc_initiate_rrcReestablishment(NR_UE_RRC_INST_t *rrc, NR_ReestablishmentCause_t cause)
 {
   rrc->reestablishment_cause = cause;
 
   NR_UE_Timers_Constants_t *timers = &rrc->timers_and_constants;
-  rrcPerNB_t *rrcNB = rrc->perNB + gnb_id;
 
   // reset timers to SIB1 as part of release of spCellConfig
   // it needs to be done before handling timers
-  set_rlf_sib1_timers_and_constants(timers, rrcNB->SInfo.sib1);
+  set_rlf_sib1_timers_and_constants(timers, rrc->timers_and_constants.sib1_TimersAndConstants);
 
   // stop timer T310, if running
   nr_timer_stop(&timers->T310);
@@ -2321,7 +2358,7 @@ void handle_rlf_detection(NR_UE_RRC_INST_t *rrc)
   }
 
   if (rrc->as_security_activated && srb2 && any_drb) // initiate the connection re-establishment procedure
-    nr_rrc_initiate_rrcReestablishment(rrc, NR_ReestablishmentCause_otherFailure, 0);
+    nr_rrc_initiate_rrcReestablishment(rrc, NR_ReestablishmentCause_otherFailure);
   else {
     NR_Release_Cause_t cause = rrc->as_security_activated ? RRC_CONNECTION_FAILURE : OTHER;
     nr_rrc_going_to_IDLE(rrc, cause, NULL);
@@ -2416,24 +2453,33 @@ void nr_rrc_going_to_IDLE(NR_UE_RRC_INST_t *rrc,
     rrcPerNB_t *nb = &rrc->perNB[i];
     NR_UE_RRC_SI_INFO *SI_info = &nb->SInfo;
     init_SI_timers(SI_info);
-    asn1cFreeStruc(asn_DEF_NR_SIB1, SI_info->sib1);
-    asn1cFreeStruc(asn_DEF_NR_SIB2, SI_info->sib2);
-    asn1cFreeStruc(asn_DEF_NR_SIB3, SI_info->sib3);
-    asn1cFreeStruc(asn_DEF_NR_SIB4, SI_info->sib4);
-    asn1cFreeStruc(asn_DEF_NR_SIB5, SI_info->sib5);
-    asn1cFreeStruc(asn_DEF_NR_SIB6, SI_info->sib6);
-    asn1cFreeStruc(asn_DEF_NR_SIB7, SI_info->sib7);
-    asn1cFreeStruc(asn_DEF_NR_SIB8, SI_info->sib8);
-    asn1cFreeStruc(asn_DEF_NR_SIB9, SI_info->sib9);
-    asn1cFreeStruc(asn_DEF_NR_SIB10_r16, SI_info->sib10);
-    asn1cFreeStruc(asn_DEF_NR_SIB11_r16, SI_info->sib11);
-    asn1cFreeStruc(asn_DEF_NR_SIB12_r16, SI_info->sib12);
-    asn1cFreeStruc(asn_DEF_NR_SIB13_r16, SI_info->sib13);
-    asn1cFreeStruc(asn_DEF_NR_SIB14_r16, SI_info->sib14);
-  }
-
-  if (rrc->nrRrcState == RRC_STATE_DETACH_NR)
+    SI_info->sib1_validity = false;
+    SI_info->sib2_validity = false;
+    SI_info->sib3_validity = false;
+    SI_info->sib4_validity = false;
+    SI_info->sib5_validity = false;
+    SI_info->sib6_validity = false;
+    SI_info->sib7_validity = false;
+    SI_info->sib8_validity = false;
+    SI_info->sib9_validity = false;
+    SI_info->sib10_validity = false;
+    SI_info->sib11_validity = false;
+    SI_info->sib12_validity = false;
+    SI_info->sib13_validity = false;
+    SI_info->sib14_validity = false;
+    SI_info->SInfo_r17.sib15_validity = false;
+    SI_info->SInfo_r17.sib16_validity = false;
+    SI_info->SInfo_r17.sib17_validity = false;
+    SI_info->SInfo_r17.sib18_validity = false;
+    SI_info->SInfo_r17.sib19_validity = false;
+    SI_info->SInfo_r17.sib20_validity = false;
+    SI_info->SInfo_r17.sib21_validity = false;
+  }
+
+  if (rrc->nrRrcState == RRC_STATE_DETACH_NR) {
     asn1cFreeStruc(asn_DEF_NR_UE_NR_Capability, rrc->UECap.UE_NR_Capability);
+    asn1cFreeStruc(asn_DEF_NR_UE_TimersAndConstants, tac->sib1_TimersAndConstants);
+  }
 
   // reset MAC
   NR_UE_MAC_reset_cause_t cause = (rrc->nrRrcState == RRC_STATE_DETACH_NR) ? DETACH : GO_TO_IDLE;
diff --git a/openair2/RRC/NR_UE/rrc_defs.h b/openair2/RRC/NR_UE/rrc_defs.h
index 26a102fdb09d60bf10163033e9308d557dcf0303..a4cd52ee23f7f5a9c034f0c2979db128acf82926 100644
--- a/openair2/RRC/NR_UE/rrc_defs.h
+++ b/openair2/RRC/NR_UE/rrc_defs.h
@@ -106,51 +106,51 @@ typedef enum RA_trigger_e {
 
 typedef struct UE_RRC_SI_INFO_NR_r17_s {
   uint32_t default_otherSI_map_r17;
-  NR_SIB15_r17_t *sib15;
+  bool sib15_validity;
   NR_timer_t sib15_timer;
-  NR_SIB16_r17_t *sib16;
+  bool sib16_validity;
   NR_timer_t sib16_timer;
-  NR_SIB17_r17_t *sib17;
+  bool sib17_validity;
   NR_timer_t sib17_timer;
-  NR_SIB18_r17_t *sib18;
+  bool sib18_validity;
   NR_timer_t sib18_timer;
-  NR_SIB19_r17_t *sib19;
+  bool sib19_validity;
   NR_timer_t sib19_timer;
-  NR_SIB20_r17_t *sib20;
+  bool sib20_validity;
   NR_timer_t sib20_timer;
-  NR_SIB21_r17_t *sib21;
+  bool sib21_validity;
   NR_timer_t sib21_timer;
 } NR_UE_RRC_SI_INFO_r17;
 
 typedef struct UE_RRC_SI_INFO_NR_s {
   uint32_t default_otherSI_map;
-  NR_SIB1_t *sib1;
+  bool sib1_validity;
   NR_timer_t sib1_timer;
-  NR_SIB2_t *sib2;
+  bool sib2_validity;
   NR_timer_t sib2_timer;
-  NR_SIB3_t *sib3;
+  bool sib3_validity;
   NR_timer_t sib3_timer;
-  NR_SIB4_t *sib4;
+  bool sib4_validity;
   NR_timer_t sib4_timer;
-  NR_SIB5_t *sib5;
+  bool sib5_validity;
   NR_timer_t sib5_timer;
-  NR_SIB6_t *sib6;
+  bool sib6_validity;
   NR_timer_t sib6_timer;
-  NR_SIB7_t *sib7;
+  bool sib7_validity;
   NR_timer_t sib7_timer;
-  NR_SIB8_t *sib8;
+  bool sib8_validity;
   NR_timer_t sib8_timer;
-  NR_SIB9_t *sib9;
+  bool sib9_validity;
   NR_timer_t sib9_timer;
-  NR_SIB10_r16_t *sib10;
+  bool sib10_validity;
   NR_timer_t sib10_timer;
-  NR_SIB11_r16_t *sib11;
+  bool sib11_validity;
   NR_timer_t sib11_timer;
-  NR_SIB12_r16_t *sib12;
+  bool sib12_validity;
   NR_timer_t sib12_timer;
-  NR_SIB13_r16_t *sib13;
+  bool sib13_validity;
   NR_timer_t sib13_timer;
-  NR_SIB14_r16_t *sib14;
+  bool sib14_validity;
   NR_timer_t sib14_timer;
   NR_UE_RRC_SI_INFO_r17 SInfo_r17;
 } NR_UE_RRC_SI_INFO;
@@ -175,6 +175,7 @@ typedef struct NR_UE_Timers_Constants_s {
   // constants (limits configured by the network)
   uint32_t N310_k;
   uint32_t N311_k;
+  NR_UE_TimersAndConstants_t *sib1_TimersAndConstants;
 } NR_UE_Timers_Constants_t;
 
 typedef enum {
@@ -230,7 +231,8 @@ typedef struct NR_UE_RRC_INST_s {
   NR_RRCRelease_t *RRCRelease;
   long selected_plmn_identity;
   Rrc_State_NR_t nrRrcState;
-
+  // flag to identify 1st reconfiguration after reestablishment
+  bool reconfig_after_reestab;
   //Sidelink params
   NR_SL_PreconfigurationNR_r16_t *sl_preconfig;
 
diff --git a/openair2/RRC/NR_UE/rrc_proto.h b/openair2/RRC/NR_UE/rrc_proto.h
index d1f1d3228fb963df122aac3cfb38a1022b7249fe..f4728f0f588c6d0262bd73ba6155030c22b7d498 100644
--- a/openair2/RRC/NR_UE/rrc_proto.h
+++ b/openair2/RRC/NR_UE/rrc_proto.h
@@ -55,7 +55,7 @@ void nr_rrc_going_to_IDLE(NR_UE_RRC_INST_t *rrc,
 
 void handle_RRCRelease(NR_UE_RRC_INST_t *rrc);
 
-void set_rlf_sib1_timers_and_constants(NR_UE_Timers_Constants_t *tac, NR_SIB1_t *sib1);
+void set_rlf_sib1_timers_and_constants(NR_UE_Timers_Constants_t *tac, NR_UE_TimersAndConstants_t *ue_TimersAndConstants);
 
 /**\brief RRC UE task.
    \param void *args_p Pointer on arguments to start the task. */
diff --git a/openair2/RRC/NR_UE/rrc_timers_and_constants.c b/openair2/RRC/NR_UE/rrc_timers_and_constants.c
index 7e0c040731f5eb4d561dd5e7fddfd985f31ce535..6629055b3a7d9f6fec39908797df7486e6ca3e87 100644
--- a/openair2/RRC/NR_UE/rrc_timers_and_constants.c
+++ b/openair2/RRC/NR_UE/rrc_timers_and_constants.c
@@ -45,80 +45,80 @@ void init_SI_timers(NR_UE_RRC_SI_INFO *SInfo)
 
 void nr_rrc_SI_timers(NR_UE_RRC_SI_INFO *SInfo)
 {
-  if (SInfo->sib1) {
+  if (SInfo->sib1_validity) {
    bool sib1_expired = nr_timer_tick(&SInfo->sib1_timer);
    if (sib1_expired)
-     asn1cFreeStruc(asn_DEF_NR_SIB1, SInfo->sib1);
+     SInfo->sib1_validity = false;
   }
-  if (SInfo->sib2) {
+  if (SInfo->sib2_validity) {
    bool sib2_expired = nr_timer_tick(&SInfo->sib2_timer);
    if (sib2_expired)
-     asn1cFreeStruc(asn_DEF_NR_SIB2, SInfo->sib2);
+     SInfo->sib2_validity = false;
   }
-  if (SInfo->sib3) {
+  if (SInfo->sib3_validity) {
    bool sib3_expired = nr_timer_tick(&SInfo->sib3_timer);
    if (sib3_expired)
-     asn1cFreeStruc(asn_DEF_NR_SIB3, SInfo->sib3);
+     SInfo->sib3_validity = false;
   }
-  if (SInfo->sib4) {
+  if (SInfo->sib4_validity) {
    bool sib4_expired = nr_timer_tick(&SInfo->sib4_timer);
    if (sib4_expired)
-     asn1cFreeStruc(asn_DEF_NR_SIB4, SInfo->sib4);
+     SInfo->sib4_validity = false;
   }
-  if (SInfo->sib5) {
+  if (SInfo->sib5_validity) {
    bool sib5_expired = nr_timer_tick(&SInfo->sib5_timer);
    if (sib5_expired)
-     asn1cFreeStruc(asn_DEF_NR_SIB5, SInfo->sib5);
+     SInfo->sib5_validity = false;
   }
-  if (SInfo->sib6) {
+  if (SInfo->sib6_validity) {
    bool sib6_expired = nr_timer_tick(&SInfo->sib6_timer);
    if (sib6_expired)
-     asn1cFreeStruc(asn_DEF_NR_SIB6, SInfo->sib6);
+     SInfo->sib6_validity = false;
   }
-  if (SInfo->sib7) {
+  if (SInfo->sib7_validity) {
    bool sib7_expired = nr_timer_tick(&SInfo->sib7_timer);
    if (sib7_expired)
-     asn1cFreeStruc(asn_DEF_NR_SIB7, SInfo->sib7);
+     SInfo->sib7_validity = false;
   }
-  if (SInfo->sib8) {
+  if (SInfo->sib8_validity) {
    bool sib8_expired = nr_timer_tick(&SInfo->sib8_timer);
    if (sib8_expired)
-     asn1cFreeStruc(asn_DEF_NR_SIB8, SInfo->sib8);
+     SInfo->sib8_validity = false;
   }
-  if (SInfo->sib9) {
+  if (SInfo->sib9_validity) {
    bool sib9_expired = nr_timer_tick(&SInfo->sib9_timer);
    if (sib9_expired)
-     asn1cFreeStruc(asn_DEF_NR_SIB9, SInfo->sib9);
+     SInfo->sib9_validity = false;
   }
-  if (SInfo->sib10) {
+  if (SInfo->sib10_validity) {
    bool sib10_expired = nr_timer_tick(&SInfo->sib10_timer);
    if (sib10_expired)
-     asn1cFreeStruc(asn_DEF_NR_SIB10_r16, SInfo->sib10);
+     SInfo->sib10_validity = false;
   }
-  if (SInfo->sib11) {
+  if (SInfo->sib11_validity) {
    bool sib11_expired = nr_timer_tick(&SInfo->sib11_timer);
    if (sib11_expired)
-     asn1cFreeStruc(asn_DEF_NR_SIB11_r16, SInfo->sib11);
+     SInfo->sib11_validity = false;
   }
-  if (SInfo->sib12) {
+  if (SInfo->sib12_validity) {
    bool sib12_expired = nr_timer_tick(&SInfo->sib12_timer);
    if (sib12_expired)
-     asn1cFreeStruc(asn_DEF_NR_SIB12_r16, SInfo->sib12);
+     SInfo->sib12_validity = false;
   }
-  if (SInfo->sib13) {
+  if (SInfo->sib13_validity) {
    bool sib13_expired = nr_timer_tick(&SInfo->sib13_timer);
    if (sib13_expired)
-     asn1cFreeStruc(asn_DEF_NR_SIB13_r16, SInfo->sib13);
+     SInfo->sib13_validity = false;
   }
-  if (SInfo->sib14) {
+  if (SInfo->sib14_validity) {
    bool sib14_expired = nr_timer_tick(&SInfo->sib14_timer);
    if (sib14_expired)
-     asn1cFreeStruc(asn_DEF_NR_SIB14_r16, SInfo->sib14);
+     SInfo->sib14_validity = false;
   }
-  if (SInfo->SInfo_r17.sib19) {
+  if (SInfo->SInfo_r17.sib19_validity) {
    bool sib19_expired = nr_timer_tick(&SInfo->SInfo_r17.sib19_timer);
    if (sib19_expired)
-     asn1cFreeStruc(asn_DEF_NR_SIB19_r17, SInfo->SInfo_r17.sib19);
+     SInfo->SInfo_r17.sib19_validity = false;
   }
 }
 
@@ -205,11 +205,11 @@ int nr_rrc_get_T304(long t304)
   return target;
 }
 
-void set_rlf_sib1_timers_and_constants(NR_UE_Timers_Constants_t *tac, NR_SIB1_t *sib1)
+void set_rlf_sib1_timers_and_constants(NR_UE_Timers_Constants_t *tac, NR_UE_TimersAndConstants_t *ue_TimersAndConstants)
 {
-  if(sib1 && sib1->ue_TimersAndConstants) {
+  if(ue_TimersAndConstants) {
     int k = 0;
-    switch (sib1->ue_TimersAndConstants->t301) {
+    switch (ue_TimersAndConstants->t301) {
       case NR_UE_TimersAndConstants__t301_ms100 :
         k = 100;
         break;
@@ -235,10 +235,10 @@ void set_rlf_sib1_timers_and_constants(NR_UE_Timers_Constants_t *tac, NR_SIB1_t
         k = 2000;
         break;
       default :
-        AssertFatal(false, "Invalid T301 %ld\n", sib1->ue_TimersAndConstants->t301);
+        AssertFatal(false, "Invalid T301 %ld\n", ue_TimersAndConstants->t301);
     }
     nr_timer_setup(&tac->T301, k, 10); // 10ms step
-    switch (sib1->ue_TimersAndConstants->t310) {
+    switch (ue_TimersAndConstants->t310) {
       case NR_UE_TimersAndConstants__t310_ms0 :
         k = 0;
         break;
@@ -261,10 +261,10 @@ void set_rlf_sib1_timers_and_constants(NR_UE_Timers_Constants_t *tac, NR_SIB1_t
         k = 2000;
         break;
       default :
-        AssertFatal(false, "Invalid T310 %ld\n", sib1->ue_TimersAndConstants->t310);
+        AssertFatal(false, "Invalid T310 %ld\n", ue_TimersAndConstants->t310);
     }
     nr_timer_setup(&tac->T310, k, 10); // 10ms step
-    switch (sib1->ue_TimersAndConstants->t311) {
+    switch (ue_TimersAndConstants->t311) {
       case NR_UE_TimersAndConstants__t311_ms1000 :
         k = 1000;
         break;
@@ -287,10 +287,10 @@ void set_rlf_sib1_timers_and_constants(NR_UE_Timers_Constants_t *tac, NR_SIB1_t
         k = 30000;
         break;
       default :
-        AssertFatal(false, "Invalid T311 %ld\n", sib1->ue_TimersAndConstants->t311);
+        AssertFatal(false, "Invalid T311 %ld\n", ue_TimersAndConstants->t311);
     }
     nr_timer_setup(&tac->T311, k, 10); // 10ms step
-    switch (sib1->ue_TimersAndConstants->n310) {
+    switch (ue_TimersAndConstants->n310) {
       case NR_UE_TimersAndConstants__n310_n1 :
         tac->N310_k = 1;
         break;
@@ -316,9 +316,9 @@ void set_rlf_sib1_timers_and_constants(NR_UE_Timers_Constants_t *tac, NR_SIB1_t
         tac->N310_k = 20;
         break;
       default :
-        AssertFatal(false, "Invalid N310 %ld\n", sib1->ue_TimersAndConstants->n310);
+        AssertFatal(false, "Invalid N310 %ld\n", ue_TimersAndConstants->n310);
     }
-    switch (sib1->ue_TimersAndConstants->n311) {
+    switch (ue_TimersAndConstants->n311) {
       case NR_UE_TimersAndConstants__n311_n1 :
         tac->N311_k = 1;
         break;
@@ -344,16 +344,16 @@ void set_rlf_sib1_timers_and_constants(NR_UE_Timers_Constants_t *tac, NR_SIB1_t
         tac->N311_k = 10;
         break;
       default :
-        AssertFatal(false, "Invalid N311 %ld\n", sib1->ue_TimersAndConstants->n311);
+        AssertFatal(false, "Invalid N311 %ld\n", ue_TimersAndConstants->n311);
     }
   }
   else
-    LOG_E(NR_RRC,"SIB1 should not be NULL and neither UE_Timers_Constants\n");
+    LOG_E(NR_RRC,"UE_Timers_Constants should not be NULL\n");
 }
 
 void nr_rrc_set_sib1_timers_and_constants(NR_UE_Timers_Constants_t *tac, NR_SIB1_t *sib1)
 {
-  set_rlf_sib1_timers_and_constants(tac, sib1);
+  set_rlf_sib1_timers_and_constants(tac, sib1->ue_TimersAndConstants);
   if(sib1 && sib1->ue_TimersAndConstants) {
     int k = 0;
     switch (sib1->ue_TimersAndConstants->t300) {
@@ -430,7 +430,7 @@ void nr_rrc_handle_SetupRelease_RLF_TimersAndConstants(NR_UE_RRC_INST_t *rrc,
   switch(rlf_TimersAndConstants->present){
     case NR_SetupRelease_RLF_TimersAndConstants_PR_release :
       // use values for timers T301, T310, T311 and constants N310, N311, as included in ue-TimersAndConstants received in SIB1
-      set_rlf_sib1_timers_and_constants(tac, rrc->perNB[0].SInfo.sib1);
+      set_rlf_sib1_timers_and_constants(tac, rrc->timers_and_constants.sib1_TimersAndConstants);
       break;
     case NR_SetupRelease_RLF_TimersAndConstants_PR_setup :
       rlf_tac = rlf_TimersAndConstants->choice.setup;
diff --git a/openair2/SDAP/nr_sdap/nr_sdap.c b/openair2/SDAP/nr_sdap/nr_sdap.c
index 783ca5a914eaa309733515447932b9a421d10d39..d1a82310e58b8eed149821cac81637fc98c87037 100644
--- a/openair2/SDAP/nr_sdap/nr_sdap.c
+++ b/openair2/SDAP/nr_sdap/nr_sdap.c
@@ -20,6 +20,10 @@
  */
 
 #include "nr_sdap.h"
+#include <inttypes.h>
+#include <stddef.h>
+#include "nr_sdap_entity.h"
+#include "common/utils/LOG/log.h"
 
 uint8_t nas_qfi;
 uint8_t nas_pduid;
diff --git a/openair2/SDAP/nr_sdap/nr_sdap.h b/openair2/SDAP/nr_sdap/nr_sdap.h
index 8fb313a340a297837235fd9ea6e65317b3553aff..ec2d7ad185131d3d9c551b31dabfae3790de659e 100644
--- a/openair2/SDAP/nr_sdap/nr_sdap.h
+++ b/openair2/SDAP/nr_sdap/nr_sdap.h
@@ -22,9 +22,9 @@
 #ifndef _NR_SDAP_GNB_H_
 #define _NR_SDAP_GNB_H_
 
+#include <stdbool.h>
+#include <stdint.h>
 #include "common/platform_types.h"
-#include "common/utils/LOG/log.h"
-#include "nr_sdap_entity.h"
 
 /*
  * TS 37.324 4.4 Functions
diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.c b/openair2/SDAP/nr_sdap/nr_sdap_entity.c
index 1a1d28782f77e217c0a717fcb39594dacfb1ce1e..bcc93c87dca4d03f36cc92538661db1a76ebd3d6 100644
--- a/openair2/SDAP/nr_sdap/nr_sdap_entity.c
+++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.c
@@ -20,14 +20,18 @@
  */
 
 #include "nr_sdap_entity.h"
-#include "common/utils/LOG/log.h"
 #include <openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.h>
 #include <openair3/ocp-gtpu/gtp_itf.h>
-#include "openair2/LAYER2/nr_pdcp/nr_pdcp_ue_manager.h"
-
 #include <stdlib.h>
 #include <string.h>
-#include <pthread.h>
+#include <unistd.h>
+#include "PHY/defs_common.h"
+#include "T.h"
+#include "assertions.h"
+#include "common/utils/T/T.h"
+#include "gtpv1_u_messages_types.h"
+#include "intertask_interface.h"
+#include "rlc.h"
 
 typedef struct {
   nr_sdap_entity_t *sdap_entity_llist;
diff --git a/openair2/SDAP/nr_sdap/nr_sdap_entity.h b/openair2/SDAP/nr_sdap/nr_sdap_entity.h
index 3768d60f6ab62bdc3aa7f56f7bf3701402aa1714..bff1c492813d28c610aea35ce06d3dd62335fa2c 100644
--- a/openair2/SDAP/nr_sdap/nr_sdap_entity.h
+++ b/openair2/SDAP/nr_sdap/nr_sdap_entity.h
@@ -22,11 +22,12 @@
 #ifndef _NR_SDAP_ENTITY_H_
 #define _NR_SDAP_ENTITY_H_
 
-#include <stdint.h>
+#include <assertions.h>
 #include <stdbool.h>
-#include "common/platform_types.h"
-#include "openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h"
-#include "NR_RadioBearerConfig.h"
+#include <stdint.h>
+#include "NR_QFI.h"
+#include "NR_SDAP-Config.h"
+#include "common/platform_constants.h"
 
 #define SDAP_BITMASK_DC             (0x80)
 #define SDAP_BITMASK_R              (0x40)
diff --git a/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishmentAccept.c b/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishmentAccept.c
index 2872ba3d5e90a15d136340275abdd7c2cd0e6ac1..aa19cae2e4c304b8e6fa5de1ff6b4022605441fe 100644
--- a/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishmentAccept.c
+++ b/openair3/NAS/COMMON/ESM/MSG/PduSessionEstablishmentAccept.c
@@ -19,6 +19,7 @@
  *      contact@openairinterface.org
  */
 
+#include <netinet/in.h>
 #include "PduSessionEstablishmentAccept.h"
 #include "common/utils/LOG/log.h"
 #include "nr_nas_msg.h"
diff --git a/openair3/NGAP/ngap_common.c b/openair3/NGAP/ngap_common.c
index 53b04e09ebb3b0c27343d1c9ded8dfa214646aaf..bded329570186c7f9ad0ce2f780470a017f6a153 100644
--- a/openair3/NGAP/ngap_common.c
+++ b/openair3/NGAP/ngap_common.c
@@ -28,14 +28,6 @@
  */
 
 #include <stdint.h>
-
 #include "ngap_common.h"
-#include "NGAP_NGAP-PDU.h"
-
 
 int asn1_xer_print = 0;
-
-
-void ngap_handle_criticality(NGAP_Criticality_t criticality)
-{
-}
diff --git a/openair3/NGAP/ngap_common.h b/openair3/NGAP/ngap_common.h
index 3c060eac034b40c16122aacdb25ef8c253844410..f83414e2bb08bd849eb2f20b0a71e49672e6d59f 100644
--- a/openair3/NGAP/ngap_common.h
+++ b/openair3/NGAP/ngap_common.h
@@ -36,55 +36,10 @@
 #ifndef NGAP_COMMON_H_
 #define NGAP_COMMON_H_
 
-
+#include <netinet/sctp.h>
 #include "common/utils/LOG/log.h"
 #include "oai_asn1.h"
-
-#include "NGAP_ProtocolIE-Field.h"
-#include "NGAP_NGAP-PDU.h"
-#include "NGAP_InitiatingMessage.h"
-#include "NGAP_SuccessfulOutcome.h"
-#include "NGAP_UnsuccessfulOutcome.h"
-#include "NGAP_ProtocolIE-Field.h"
-#include "NGAP_ProtocolIE-FieldPair.h"
-#include "NGAP_ProtocolIE-ContainerPair.h"
-#include "NGAP_ProtocolExtensionField.h"
-#include "NGAP_ProtocolExtensionContainer.h"
-#include "NGAP_asn_constant.h"
-#include "NGAP_SupportedTAItem.h"
-#include "NGAP_ServedGUAMIItem.h"
-#include "NGAP_BroadcastPLMNItem.h"
-#include "NGAP_SliceSupportItem.h"
-#include "NGAP_PLMNSupportItem.h"
-#include "NGAP_PDUSessionResourceSetupResponseTransfer.h"
-#include "NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.h"
-#include "NGAP_PDUSessionResourceSetupItemCxtRes.h"
-#include "NGAP_PDUSessionResourceFailedToSetupItemCxtRes.h"
-#include "NGAP_PDUSessionResourceSetupItemSUReq.h"
-#include "NGAP_PDUSessionResourceSetupItemSURes.h"
-#include "NGAP_PDUSessionResourceFailedToSetupItemSURes.h"
-#include "NGAP_AssociatedQosFlowItem.h"
-#include "NGAP_PDUSessionResourceSetupRequestTransfer.h"
-#include "NGAP_PDUSessionResourceSetupItemCxtReq.h"
-#include "NGAP_QosFlowSetupRequestItem.h"
-#include "NGAP_AllowedNSSAI-Item.h"
-#include "NGAP_PDUSessionResourceModifyItemModRes.h"
-#include "NGAP_PDUSessionResourceFailedToModifyItemModRes.h"
-#include "NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.h"
-#include "NGAP_PDUSessionResourceReleasedItemRelRes.h"
-#include "NGAP_PDUSessionResourceToReleaseItemRelCmd.h"
-#include "NGAP_PDUSessionResourceModifyItemModReq.h"
-#include "NGAP_PDUSessionResourceModifyRequestTransfer.h"
-#include "NGAP_QosFlowAddOrModifyRequestItem.h"
-#include "NGAP_PDUSessionResourceModifyResponseTransfer.h"
-#include "NGAP_QosFlowAddOrModifyResponseList.h"
-#include "NGAP_QosFlowAddOrModifyResponseItem.h"
-#include "NGAP_TAIListForPagingItem.h"
-#include "NGAP_GNB-ID.h"
-#include "NGAP_GlobalGNB-ID.h"
-#include "NGAP_GTPTunnel.h"
-#include "NGAP_UE-NGAP-ID-pair.h"
-#include "NGAP_UserLocationInformationNR.h"
+#include "ngap_msg_includes.h"
 
 /* Checking version of ASN1C compiler */
 #if (ASN1C_ENVIRONMENT_VERSION < ASN1C_MINIMUM_VERSION)
@@ -129,11 +84,6 @@ extern int asn1_xer_print;
  **/
 typedef int (*ngap_message_decoded_callback)(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NGAP_PDU_t *pdu);
 
-/** \brief Handle criticality
- \param criticality Criticality of the IE
- @returns void
- **/
-void ngap_handle_criticality(NGAP_Criticality_t criticality);
 /** @}*/
 
 #endif /* NGAP_COMMON_H_ */
diff --git a/openair3/NGAP/ngap_gNB.c b/openair3/NGAP/ngap_gNB.c
index 70f6bd5e49dd6a6fb411a80acb6987865853ef40..9c328c37c7d11f330cb8d0d3c7a46cdc85890015 100644
--- a/openair3/NGAP/ngap_gNB.c
+++ b/openair3/NGAP/ngap_gNB.c
@@ -28,38 +28,41 @@
  * @ingroup _ngap
  */
 
-
-#include <pthread.h>
+#include <openair3/NGAP/ngap_gNB.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <stdint.h>
-#include "openair3/SECU/kdf.h"
-
-#include "tree.h"
-#include "queue.h"
-
+#include <string.h>
+#include <unistd.h>
+#include "BIT_STRING.h"
+#include "ngap_msg_includes.h"
+#include "OCTET_STRING.h"
+#include "PHY/defs_common.h"
+#include "T.h"
+#include "asn_internal.h"
+#include "assertions.h"
+#include "common/utils/T/T.h"
+#include "conversions.h"
+#include "ds/byte_array.h"
 #include "intertask_interface.h"
-
-#include "ngap_gNB_default_values.h"
-
 #include "ngap_common.h"
-
-#include "ngap_gNB_defs.h"
 #include "ngap_gNB.h"
+#include "ngap_gNB_context_management_procedures.h"
+#include "ngap_gNB_default_values.h"
+#include "ngap_gNB_defs.h"
 #include "ngap_gNB_encoder.h"
 #include "ngap_gNB_handlers.h"
-#include "ngap_gNB_nnsf.h"
-
-#include "ngap_gNB_nas_procedures.h"
-#include "ngap_gNB_management_procedures.h"
-#include "ngap_gNB_context_management_procedures.h"
-
 #include "ngap_gNB_itti_messaging.h"
+#include "ngap_gNB_management_procedures.h"
+#include "ngap_gNB_nas_procedures.h"
+#include "ngap_messages_types.h"
+#include "oai_asn1.h"
+#include "openair3/SECU/kdf.h"
+#include "queue.h"
+#include "s1ap_messages_types.h"
+#include "sctp_messages_types.h"
+#include "tree.h"
 
-#include "ngap_gNB_ue_context.h" // test, to be removed
-
-#include "assertions.h"
-#include "conversions.h"
 #if defined(TEST_S1C_AMF)
   #include "oaisim_amf_test_s1c.h"
 #endif
diff --git a/openair3/NGAP/ngap_gNB.h b/openair3/NGAP/ngap_gNB.h
index 9a838009c648c1f51ae668bbe77956cb345117c3..b3ca6acfa541c22350e7658648d43272a1bef53f 100644
--- a/openair3/NGAP/ngap_gNB.h
+++ b/openair3/NGAP/ngap_gNB.h
@@ -28,7 +28,6 @@
  * @ingroup _ngap
  */
 
-#include <stdio.h>
 #include <stdint.h>
 
 /** @defgroup _ngap_impl_ NGAP Layer Reference Implementation
diff --git a/openair3/NGAP/ngap_gNB_context_management_procedures.c b/openair3/NGAP/ngap_gNB_context_management_procedures.c
index 242da7a257f0427e041118dc2f6f1d46a774be8e..524fcee6c46f591be109842d184cc9b9f1e86234 100644
--- a/openair3/NGAP/ngap_gNB_context_management_procedures.c
+++ b/openair3/NGAP/ngap_gNB_context_management_procedures.c
@@ -27,30 +27,24 @@
  * \version 1.0
  * @ingroup _ngap
  */
- 
 
+#include "ngap_gNB_context_management_procedures.h"
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <stdint.h>
-
+#include "INTEGER.h"
+#include "T.h"
 #include "assertions.h"
-#include "conversions.h"
-
+#include "common/utils/T/T.h"
 #include "intertask_interface.h"
-
+#include "ngap_msg_includes.h"
 #include "ngap_common.h"
 #include "ngap_gNB_defs.h"
-
-#include "ngap_gNB_itti_messaging.h"
-
 #include "ngap_gNB_encoder.h"
-#include "ngap_gNB_nnsf.h"
-#include "ngap_gNB_ue_context.h"
-#include "ngap_gNB_nas_procedures.h"
+#include "ngap_gNB_itti_messaging.h"
 #include "ngap_gNB_management_procedures.h"
-#include "ngap_gNB_context_management_procedures.h"
-#include "NGAP_PDUSessionResourceItemCxtRelReq.h"
-#include "NGAP_PDUSessionResourceItemCxtRelCpl.h"
+#include "ngap_gNB_ue_context.h"
+#include "oai_asn1.h"
 
 int ngap_ue_context_release_complete(instance_t instance,
                                      ngap_ue_release_complete_t *ue_release_complete_p)
diff --git a/openair3/NGAP/ngap_gNB_context_management_procedures.h b/openair3/NGAP/ngap_gNB_context_management_procedures.h
index 5eca34e56d412ae20441c0e52b1c6040929a0660..273b246d95f19067d275820eed6234440ca91ac2 100644
--- a/openair3/NGAP/ngap_gNB_context_management_procedures.h
+++ b/openair3/NGAP/ngap_gNB_context_management_procedures.h
@@ -28,6 +28,9 @@
  * @ingroup _ngap
  */
 
+#include "assertions.h"
+#include "ngap_messages_types.h"
+
 #ifndef NGAP_GNB_CONTEXT_MANAGEMENT_PROCEDURES_H_
 #define NGAP_GNB_CONTEXT_MANAGEMENT_PROCEDURES_H_
 
diff --git a/openair3/NGAP/ngap_gNB_decoder.c b/openair3/NGAP/ngap_gNB_decoder.c
index 4ea3f69fecd039fed21a719e97fa29c0c56ab4ae..4b76abecbbde5b64b8cca019987a7e6e1084081c 100644
--- a/openair3/NGAP/ngap_gNB_decoder.c
+++ b/openair3/NGAP/ngap_gNB_decoder.c
@@ -26,16 +26,17 @@
  * \date 2020
  * \version 0.1
  */
-
- 
+#include "ngap_gNB_decoder.h"
 #include <stdio.h>
-
+#include <stdlib.h>
+#include "ngap_msg_includes.h"
+#include "T.h"
+#include "aper_decoder.h"
+#include "asn_application.h"
+#include "asn_codecs.h"
 #include "assertions.h"
-
-#include "intertask_interface.h"
-
+#include "common/utils/T/T.h"
 #include "ngap_common.h"
-#include "ngap_gNB_decoder.h"
 
 static int ngap_gNB_decode_initiating_message(NGAP_NGAP_PDU_t *pdu) {
   asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
diff --git a/openair3/NGAP/ngap_gNB_decoder.h b/openair3/NGAP/ngap_gNB_decoder.h
index 9fc8d433c420bcd395f561ec9d33523e0697f93d..d75f069c50998f3a64060a83239442d20d730ea3 100644
--- a/openair3/NGAP/ngap_gNB_decoder.h
+++ b/openair3/NGAP/ngap_gNB_decoder.h
@@ -27,6 +27,7 @@
  */
 
 #include <stdint.h>
+#include "NGAP_NGAP-PDU.h"
 
 #ifndef NGAP_GNB_DECODER_H_
 #define NGAP_GNB_DECODER_H_
diff --git a/openair3/NGAP/ngap_gNB_encoder.c b/openair3/NGAP/ngap_gNB_encoder.c
index e85ae4c8ebd46ea30a8355acac9393e8f3aa5884..ee3b37e07d02d910bb53156d2f58c962e170dcc4 100644
--- a/openair3/NGAP/ngap_gNB_encoder.c
+++ b/openair3/NGAP/ngap_gNB_encoder.c
@@ -27,16 +27,19 @@
  * \version 0.1
  */
 
-
-#include <stdio.h>
-#include <string.h>
+#include "ngap_gNB_encoder.h"
 #include <stdint.h>
-
+#include <stdio.h>
+#include "ngap_msg_includes.h"
+#include "T.h"
+#include "asn_application.h"
+#include "asn_codecs.h"
 #include "assertions.h"
-#include "conversions.h"
-#include "intertask_interface.h"
+#include "common/utils/T/T.h"
+#include "constr_TYPE.h"
 #include "ngap_common.h"
-#include "ngap_gNB_encoder.h"
+#include "utils.h"
+#include "xer_encoder.h"
 
 static inline int ngap_gNB_encode_initiating(NGAP_NGAP_PDU_t *pdu, uint8_t **buffer, uint32_t *len)
 {
diff --git a/openair3/NGAP/ngap_gNB_encoder.h b/openair3/NGAP/ngap_gNB_encoder.h
index bd151405ff947d763db302c71d21f70b6eaffd6b..4c015d352ad0524c1123e57eb57a0fd318a2c38d 100644
--- a/openair3/NGAP/ngap_gNB_encoder.h
+++ b/openair3/NGAP/ngap_gNB_encoder.h
@@ -30,6 +30,9 @@
 #ifndef NGAP_GNB_ENCODER_H_
 #define NGAP_GNB_ENCODER_H_
 
+#include <stdint.h>
+#include "NGAP_NGAP-PDU.h"
+
 int ngap_gNB_encode_pdu(NGAP_NGAP_PDU_t *pdu, uint8_t **buffer, uint32_t *len)
 __attribute__ ((warn_unused_result));
 
diff --git a/openair3/NGAP/ngap_gNB_handlers.c b/openair3/NGAP/ngap_gNB_handlers.c
index 59b2792602eee60246fb03e9054795911984c0ca..2916967b83943ebbf798795e5d1d95cf1ae9b0af 100644
--- a/openair3/NGAP/ngap_gNB_handlers.c
+++ b/openair3/NGAP/ngap_gNB_handlers.c
@@ -27,26 +27,31 @@
  * \version 0.1
  */
  
+#include "ngap_gNB_handlers.h"
+#include <stdbool.h>
 #include <stdint.h>
-
+#include <stdlib.h>
+#include <string.h>
+#include "INTEGER.h"
+#include "ngap_msg_includes.h"
+#include "OCTET_STRING.h"
+#include "PHY/defs_common.h"
+#include "T.h"
+#include "assertions.h"
+#include "common/utils/T/T.h"
+#include "constr_TYPE.h"
+#include "conversions.h"
 #include "intertask_interface.h"
-
 #include "ngap_common.h"
-// #include "ngap_gNB.h"
-#include "ngap_gNB_defs.h"
-#include "ngap_gNB_handlers.h"
 #include "ngap_gNB_decoder.h"
-
-#include "ngap_gNB_ue_context.h"
-#include "ngap_gNB_trace.h"
-#include "ngap_gNB_nas_procedures.h"
+#include "ngap_gNB_defs.h"
 #include "ngap_gNB_management_procedures.h"
-
-#include "ngap_gNB_default_values.h"
-
-#include "assertions.h"
-#include "conversions.h"
-#include "NGAP_NonDynamic5QIDescriptor.h"
+#include "ngap_gNB_nas_procedures.h"
+#include "ngap_gNB_trace.h"
+#include "ngap_gNB_ue_context.h"
+#include "ngap_messages_types.h"
+#include "oai_asn1.h"
+#include "queue.h"
 
 static void allocCopy(ngap_pdu_t *out, OCTET_STRING_t in)
 {
diff --git a/openair3/NGAP/ngap_gNB_handlers.h b/openair3/NGAP/ngap_gNB_handlers.h
index 5291b78fa8a206f212caa3c689e54dfaa02e6be2..d39b6df443fced8bad9b110f676fff28cfcfa1d6 100644
--- a/openair3/NGAP/ngap_gNB_handlers.h
+++ b/openair3/NGAP/ngap_gNB_handlers.h
@@ -30,6 +30,9 @@
 #ifndef NGAP_GNB_HANDLERS_H_
 #define NGAP_GNB_HANDLERS_H_
 
+#include <stdint.h>
+#include "ngap_gNB_defs.h"
+
 void ngap_handle_ng_setup_message(ngap_gNB_amf_data_t *amf_desc_p, int sctp_shutdown);
 
 int ngap_gNB_handle_message(sctp_assoc_t assoc_id, int32_t stream, const uint8_t *const data, const uint32_t data_length);
diff --git a/openair3/NGAP/ngap_gNB_itti_messaging.c b/openair3/NGAP/ngap_gNB_itti_messaging.c
index 4f4a3b26545ba18839c7dc2e091ac471ffed276e..87eb93c8f6fe6da4956a85e806841b18a401d1a1 100644
--- a/openair3/NGAP/ngap_gNB_itti_messaging.c
+++ b/openair3/NGAP/ngap_gNB_itti_messaging.c
@@ -26,10 +26,12 @@
  * \date 2020
  * \version 0.1
  */
- 
-#include "intertask_interface.h"
 
-#include "ngap_gNB_itti_messaging.h"
+#include <stdlib.h>
+#include <string.h>
+#include "intertask_interface.h"
+#include "ngap_messages_types.h"
+#include "sctp_messages_types.h"
 
 void ngap_gNB_itti_send_sctp_data_req(instance_t instance,
                                       sctp_assoc_t assoc_id,
diff --git a/openair3/NGAP/ngap_gNB_itti_messaging.h b/openair3/NGAP/ngap_gNB_itti_messaging.h
index 362c9a0266f5808af6b6fe23d894157211e0e2b1..67054761e3345b1a36afd7ba5111fb85363e21cd 100644
--- a/openair3/NGAP/ngap_gNB_itti_messaging.h
+++ b/openair3/NGAP/ngap_gNB_itti_messaging.h
@@ -30,6 +30,10 @@
 #ifndef NGAP_GNB_ITTI_MESSAGING_H_
 #define NGAP_GNB_ITTI_MESSAGING_H_
 
+#include <assertions.h>
+#include <netinet/sctp.h>
+#include <stdint.h>
+
 void ngap_gNB_itti_send_sctp_data_req(instance_t instance,
                                       sctp_assoc_t assoc_id,
                                       uint8_t *buffer,
diff --git a/openair3/NGAP/ngap_gNB_management_procedures.c b/openair3/NGAP/ngap_gNB_management_procedures.c
index 6ed06d93240800ce2e7171df15e60bfb7c54ffb1..0c6c513af429061098682ec463f7e2aa97e60ea3 100644
--- a/openair3/NGAP/ngap_gNB_management_procedures.c
+++ b/openair3/NGAP/ngap_gNB_management_procedures.c
@@ -28,18 +28,16 @@
  * @ingroup _ngap
  */
 
+#include <netinet/in.h>
+#include <netinet/sctp.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <stdint.h>
-
-#include "intertask_interface.h"
-
+#include <string.h>
 #include "assertions.h"
-#include "conversions.h"
-
-#include "ngap_common.h"
 #include "ngap_gNB_defs.h"
-#include "ngap_gNB.h"
+#include "queue.h"
+#include "tree.h"
 
 ngap_gNB_internal_data_t ngap_gNB_internal_data;
 
diff --git a/openair3/NGAP/ngap_gNB_nas_procedures.c b/openair3/NGAP/ngap_gNB_nas_procedures.c
index 29541d8acf81b25098ac5b5f4d3918845d4d8616..6cce5b695e7e7b784e9d976a0798fa9180d1064b 100644
--- a/openair3/NGAP/ngap_gNB_nas_procedures.c
+++ b/openair3/NGAP/ngap_gNB_nas_procedures.c
@@ -28,26 +28,36 @@
  * @ingroup _ngap
  */
 
- 
+#include "ngap_gNB_nas_procedures.h"
+#include <inttypes.h>
+#include <stdbool.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <stdint.h>
-
+#include <string.h>
+#include "BIT_STRING.h"
+#include "INTEGER.h"
+#include "ngap_msg_includes.h"
+#include "OCTET_STRING.h"
+#include "PHY/defs_common.h"
+#include "T.h"
+#include "aper_encoder.h"
+#include "asn_application.h"
+#include "asn_codecs.h"
 #include "assertions.h"
+#include "common/utils/T/T.h"
+#include "constr_TYPE.h"
 #include "conversions.h"
-
-#include "intertask_interface.h"
-
 #include "ngap_common.h"
 #include "ngap_gNB_defs.h"
-
-#include "ngap_gNB_itti_messaging.h"
-
 #include "ngap_gNB_encoder.h"
+#include "ngap_gNB_itti_messaging.h"
+#include "ngap_gNB_management_procedures.h"
 #include "ngap_gNB_nnsf.h"
 #include "ngap_gNB_ue_context.h"
-#include "ngap_gNB_nas_procedures.h"
-#include "ngap_gNB_management_procedures.h"
+#include "oai_asn1.h"
+#include "s1ap_messages_types.h"
+#include "xer_encoder.h"
 
 static void allocCopy(OCTET_STRING_t *out, ngap_pdu_t in)
 {
diff --git a/openair3/NGAP/ngap_gNB_nas_procedures.h b/openair3/NGAP/ngap_gNB_nas_procedures.h
index da55a349ed0371a27569052335d4fa25864f8fd4..f977bf3a69436b9de2bb45dd0adbd23172f6de9b 100644
--- a/openair3/NGAP/ngap_gNB_nas_procedures.h
+++ b/openair3/NGAP/ngap_gNB_nas_procedures.h
@@ -31,6 +31,11 @@
 #ifndef NGAP_GNB_NAS_PROCEDURES_H_
 #define NGAP_GNB_NAS_PROCEDURES_H_
 
+#include <stdint.h>
+#include "assertions.h"
+#include "ngap_messages_types.h"
+#include "ngap_msg_includes.h"
+
 int ngap_gNB_handle_nas_downlink(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NGAP_PDU_t *pdu);
 
 int ngap_gNB_nas_uplink(instance_t instance, ngap_uplink_nas_t *ngap_uplink_nas_p);
diff --git a/openair3/NGAP/ngap_gNB_nnsf.c b/openair3/NGAP/ngap_gNB_nnsf.c
index 0d002e9836ab26f964dd1b5c992f04649fc6fba9..a04474669c31a46790573657ed92ea3c48b9d351 100644
--- a/openair3/NGAP/ngap_gNB_nnsf.c
+++ b/openair3/NGAP/ngap_gNB_nnsf.c
@@ -27,15 +27,11 @@
  * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
  */
 
+#include "ngap_gNB_nnsf.h"
 #include <stdio.h>
-#include <stdlib.h>
-
-#include "intertask_interface.h"
-
-#include "ngap_common.h"
-
 #include "ngap_gNB_defs.h"
-#include "ngap_gNB_nnsf.h"
+#include "queue.h"
+#include "tree.h"
 
 struct ngap_gNB_amf_data_s *
 ngap_gNB_nnsf_select_amf(ngap_gNB_instance_t       *instance_p,
diff --git a/openair3/NGAP/ngap_gNB_nnsf.h b/openair3/NGAP/ngap_gNB_nnsf.h
index 7d43a890ea6d18abc06c11c0a5a82585e75c4a3d..bf6c309af06360d2ed98cf67c57e05fd6d702f16 100644
--- a/openair3/NGAP/ngap_gNB_nnsf.h
+++ b/openair3/NGAP/ngap_gNB_nnsf.h
@@ -30,6 +30,10 @@
 #ifndef NGAP_GNB_NNSF_H_
 #define NGAP_GNB_NNSF_H_
 
+#include <stdint.h>
+#include "ngap_gNB_defs.h"
+#include "ngap_messages_types.h"
+
 struct ngap_gNB_amf_data_s *
 ngap_gNB_nnsf_select_amf(ngap_gNB_instance_t       *instance_p,
                          ngap_rrc_establishment_cause_t  cause);
diff --git a/openair3/NGAP/ngap_gNB_overload.c b/openair3/NGAP/ngap_gNB_overload.c
index d8512c06956d755a6ffe5fe7c3c43af97cc118f8..cc5cd997cfb732cd9f5f2ea92569d2c1d5b1b9b8 100644
--- a/openair3/NGAP/ngap_gNB_overload.c
+++ b/openair3/NGAP/ngap_gNB_overload.c
@@ -27,24 +27,13 @@
  * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
  */
 
-
-#include <stdio.h>
-#include <stdlib.h>
+#include "ngap_gNB_overload.h"
 #include <stdint.h>
-
-#include "intertask_interface.h"
-
-#include "ngap_common.h"
+#include <stdio.h>
+#include "assertions.h"
 #include "ngap_gNB_defs.h"
-
-#include "ngap_gNB.h"
-#include "ngap_gNB_ue_context.h"
-#include "ngap_gNB_encoder.h"
-#include "ngap_gNB_overload.h"
 #include "ngap_gNB_management_procedures.h"
 
-#include "assertions.h"
-
 int ngap_gNB_handle_overload_start(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NGAP_PDU_t *pdu)
 {
     //TODO
diff --git a/openair3/NGAP/ngap_gNB_overload.h b/openair3/NGAP/ngap_gNB_overload.h
index b893194a4b35757a81c43f7b805831e92d08c10a..8f0644e5b0e59a2e9cb82611976e9deaeaa3b9af 100644
--- a/openair3/NGAP/ngap_gNB_overload.h
+++ b/openair3/NGAP/ngap_gNB_overload.h
@@ -30,6 +30,11 @@
 #ifndef NGAP_GNB_OVERLOAD_H_
 #define NGAP_GNB_OVERLOAD_H_
 
+#include <netinet/in.h>
+#include <netinet/sctp.h>
+#include <stdint.h>
+#include "NGAP_NGAP-PDU.h"
+
 /**
  * \brief Handle an overload start message
  **/
diff --git a/openair3/NGAP/ngap_gNB_trace.c b/openair3/NGAP/ngap_gNB_trace.c
index 8fc0968ccdbc23fce36c80b590ae7d84caea1d9a..679fa354fc4450dcf07de5af26c1cd5685d3c9de 100644
--- a/openair3/NGAP/ngap_gNB_trace.c
+++ b/openair3/NGAP/ngap_gNB_trace.c
@@ -27,23 +27,8 @@
  * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
  */
 
-#include <stdint.h>
-
-#include "assertions.h"
-
-#include "intertask_interface.h"
-
-#include "ngap_gNB_default_values.h"
-
-#include "ngap_common.h"
-#include "ngap_gNB_defs.h"
-
-#include "ngap_gNB.h"
-#include "ngap_gNB_ue_context.h"
-#include "ngap_gNB_encoder.h"
 #include "ngap_gNB_trace.h"
-#include "ngap_gNB_itti_messaging.h"
-#include "ngap_gNB_management_procedures.h"
+#include <stdint.h>
 
 int ngap_gNB_handle_trace_start(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NGAP_PDU_t *pdu)
 {
diff --git a/openair3/NGAP/ngap_gNB_trace.h b/openair3/NGAP/ngap_gNB_trace.h
index b35354a16f466ee677b012f7920d7c94bd729988..566172cbcd6976825ecf61e8c723118a174558b7 100644
--- a/openair3/NGAP/ngap_gNB_trace.h
+++ b/openair3/NGAP/ngap_gNB_trace.h
@@ -30,6 +30,11 @@
 #ifndef NGAP_GNB_TRACE_H_
 #define NGAP_GNB_TRACE_H_
 
+#include <netinet/in.h>
+#include <netinet/sctp.h>
+#include <stdint.h>
+#include "NGAP_NGAP-PDU.h"
+
 int ngap_gNB_handle_trace_start(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NGAP_PDU_t *pdu);
 
 int ngap_gNB_handle_deactivate_trace(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NGAP_PDU_t *pdu);
diff --git a/openair3/NGAP/ngap_gNB_ue_context.c b/openair3/NGAP/ngap_gNB_ue_context.c
index 0be4fc480e92bda38ad5f1c9cf9aff6e6d1c614a..894491ebbe0d81662715cdd4df58f04e12ae68ab 100644
--- a/openair3/NGAP/ngap_gNB_ue_context.c
+++ b/openair3/NGAP/ngap_gNB_ue_context.c
@@ -27,18 +27,14 @@
  * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
  */ 
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include "ngap_gNB_ue_context.h"
 #include <stdint.h>
-
-#include "tree.h"
-
-#include "intertask_interface.h"
-
+#include <stdio.h>
+#include "PHY/defs_common.h"
+#include "T.h"
+#include "common/utils/T/T.h"
 #include "ngap_common.h"
-#include "ngap_gNB_defs.h"
-#include "ngap_gNB_ue_context.h"
+#include "tree.h"
 
 /* Tree of UE ordered by gNB_ue_ngap_id's
  * NO INSTANCE, the 32 bits id is large enough to handle all UEs, regardless the cell, gNB, ...
diff --git a/openair3/NGAP/ngap_gNB_ue_context.h b/openair3/NGAP/ngap_gNB_ue_context.h
index 8de03b63bad4efe08818e98f2cb14c2a8c0821b2..2ca75141efa43fd437b4dac639c5ca9b02c80457 100644
--- a/openair3/NGAP/ngap_gNB_ue_context.h
+++ b/openair3/NGAP/ngap_gNB_ue_context.h
@@ -26,11 +26,10 @@
  * \version 0.1
  * \email: yoshio.inoue@fujitsu.com,masayuki.harada@fujitsu.com (yoshio.inoue%40fujitsu.com%2cmasayuki.harada%40fujitsu.com)
  */
- 
-#include "tree.h"
-#include "queue.h"
 
+#include <stdint.h>
 #include "ngap_gNB_defs.h"
+#include "tree.h"
 
 #ifndef NGAP_GNB_UE_CONTEXT_H_
 #define NGAP_GNB_UE_CONTEXT_H_
diff --git a/openair3/NGAP/ngap_msg_includes.h b/openair3/NGAP/ngap_msg_includes.h
new file mode 100644
index 0000000000000000000000000000000000000000..c7ef77be6a2203bfcdd3de9c715c7c7fe00814bd
--- /dev/null
+++ b/openair3/NGAP/ngap_msg_includes.h
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file ngap_msg_includes.h
+ * \brief NGAP ASN.1 message includes
+ * \author Guido Casati
+ * \date 2024
+ * \email: hello@guidocasati.com
+ * \version 1.0
+ * @ingroup _ngap
+ *
+ * This header file contains the includes for the NGAP ASN.1 messages,
+ * generated from the ASN.1 specifications.
+ */
+
+#ifndef NGAP_MSG_INCLUDES_H
+#define NGAP_MSG_INCLUDES_H
+
+#include "NGAP_AllowedNSSAI-Item.h"
+#include "NGAP_AssociatedQosFlowItem.h"
+#include "NGAP_BroadcastPLMNItem.h"
+#include "NGAP_GlobalGNB-ID.h"
+#include "NGAP_GTPTunnel.h"
+#include "NGAP_InitiatingMessage.h"
+#include "NGAP_NGAP-PDU.h"
+#include "NGAP_PDUSessionResourceFailedToModifyItemModRes.h"
+#include "NGAP_PDUSessionResourceFailedToSetupItemCxtRes.h"
+#include "NGAP_PDUSessionResourceFailedToSetupItemSURes.h"
+#include "NGAP_PDUSessionResourceItemCxtRelCpl.h"
+#include "NGAP_PDUSessionResourceItemCxtRelReq.h"
+#include "NGAP_PDUSessionResourceModifyItemModReq.h"
+#include "NGAP_PDUSessionResourceModifyItemModRes.h"
+#include "NGAP_PDUSessionResourceModifyResponseTransfer.h"
+#include "NGAP_PDUSessionResourceModifyUnsuccessfulTransfer.h"
+#include "NGAP_PDUSessionResourceReleasedItemRelRes.h"
+#include "NGAP_PDUSessionResourceSetupItemCxtReq.h"
+#include "NGAP_PDUSessionResourceSetupItemCxtRes.h"
+#include "NGAP_PDUSessionResourceSetupItemSUReq.h"
+#include "NGAP_PDUSessionResourceSetupItemSURes.h"
+#include "NGAP_PDUSessionResourceSetupResponseTransfer.h"
+#include "NGAP_PDUSessionResourceSetupUnsuccessfulTransfer.h"
+#include "NGAP_PDUSessionResourceToReleaseItemRelCmd.h"
+#include "NGAP_PLMNSupportItem.h"
+#include "NGAP_ProtocolIE-Field.h"
+#include "NGAP_QosFlowAddOrModifyResponseItem.h"
+#include "NGAP_QosFlowAddOrModifyResponseList.h"
+#include "NGAP_ServedGUAMIItem.h"
+#include "NGAP_SliceSupportItem.h"
+#include "NGAP_SuccessfulOutcome.h"
+#include "NGAP_SupportedTAItem.h"
+#include "NGAP_TAIListForPagingItem.h"
+#include "NGAP_UE-NGAP-ID-pair.h"
+#include "NGAP_UnsuccessfulOutcome.h"
+#include "NGAP_UserLocationInformationNR.h"
+#include "NGAP_asn_constant.h"
+
+#endif // NGAP_MSG_INCLUDES_H
diff --git a/radio/fhi_72/oran-config.c b/radio/fhi_72/oran-config.c
index 2973fdc2b0724974b9df2d32a98b46c8143b7f6d..4f828b8a1af31458589d705e342f79f5d2b479e2 100644
--- a/radio/fhi_72/oran-config.c
+++ b/radio/fhi_72/oran-config.c
@@ -27,6 +27,7 @@
 #include "xran_fh_o_du.h"
 #include "xran_cp_api.h"
 #include "rte_ether.h"
+#include <rte_ethdev.h>
 
 #include "stdio.h"
 #include "string.h"
@@ -234,13 +235,14 @@ void print_fh_init(const struct xran_fh_init *fh_init)
   dpdkBasebandFecMode %d\n\
   dpdkBasebandDevice %s\n\
   filePrefix %s\n\
-  mtu %d\n",
+  mtu %d\n\
+  p_o_du_addr %s\n",
       fh_init->xran_ports,
       fh_init->dpdkBasebandFecMode,
       fh_init->dpdkBasebandDevice,
       fh_init->filePrefix,
-      fh_init->mtu);
-  print_ether_addr("  p_o_du_addr", fh_init->xran_ports * fh_init->io_cfg.num_vfs, (struct rte_ether_addr *)fh_init->p_o_du_addr);
+      fh_init->mtu,
+      fh_init->p_o_du_addr);
   print_ether_addr("  p_o_ru_addr", fh_init->xran_ports * fh_init->io_cfg.num_vfs, (struct rte_ether_addr *)fh_init->p_o_ru_addr);
   printf("\
   totalBfWeights %d\n",
@@ -448,15 +450,19 @@ void print_fh_config(const struct xran_fh_config *fh_config)
   printf("\
   bbdev_enc %p\n\
   bbdev_dec %p\n\
-  tx_cp_eAxC2Vf [not implemented by fhi_lib]\n\
-  tx_up_eAxC2Vf [not implemented by fhi_lib]\n\
-  rx_cp_eAxC2Vf [not implemented by fhi_lib]\n\
-  rx_up_eAxC2Vf [not implemented by fhi_lib]\n\
+  tx_cp_eAxC2Vf %p\n\
+  tx_up_eAxC2Vf %p\n\
+  rx_cp_eAxC2Vf %p\n\
+  rx_up_eAxC2Vf %p\n\
   log_level %d\n\
   max_sections_per_slot %d\n\
   max_sections_per_symbol %d\n",
       fh_config->bbdev_enc,
       fh_config->bbdev_dec,
+      fh_config->tx_cp_eAxC2Vf,
+      fh_config->tx_up_eAxC2Vf,
+      fh_config->rx_cp_eAxC2Vf,
+      fh_config->rx_up_eAxC2Vf,
       fh_config->log_level,
       fh_config->max_sections_per_slot,
       fh_config->max_sections_per_symbol);
@@ -483,52 +489,66 @@ static uint64_t get_u64_mask(const paramdef_t *pd)
   return mask;
 }
 
-static bool set_fh_io_cfg(struct xran_io_cfg *io_cfg, const paramdef_t *fhip, int nump)
+static bool set_fh_io_cfg(struct xran_io_cfg *io_cfg, const paramdef_t *fhip, int nump, const int num_rus)
 {
   DevAssert(fhip != NULL);
   int num_dev = gpd(fhip, nump, ORAN_CONFIG_DPDK_DEVICES)->numelt;
   AssertFatal(num_dev > 0, "need to provide DPDK devices for O-RAN 7.2 Fronthaul\n");
   AssertFatal(num_dev < 17, "too many DPDK devices for O-RAN 7.2 Fronthaul\n");
 
-  io_cfg->id = 0; // 0 = O-DU
-  io_cfg->num_vfs = num_dev;
-  io_cfg->num_rxq = 2; // Assume two HW RX queues per RU
-  for (int i = 0; i < num_dev; ++i)
-    io_cfg->dpdk_dev[i] = strdup(gpd(fhip, nump, ORAN_CONFIG_DPDK_DEVICES)->strlistptr[i]);
-  //io_cfg->bbdev_dev = NULL;
-  io_cfg->bbdev_mode = XRAN_BBDEV_NOT_USED; // none
-  io_cfg->dpdkIoVaMode = 0; /* IOVA mode */
-  io_cfg->dpdkMemorySize = *gpd(fhip, nump, ORAN_CONFIG_DPDK_MEM_SIZE)->uptr;
-  io_cfg->core = *gpd(fhip, nump, ORAN_CONFIG_IO_CORE)->iptr;
-  io_cfg->system_core = *gpd(fhip, nump, ORAN_CONFIG_SYSTEM_CORE)->iptr;
-  io_cfg->pkt_proc_core = get_u64_mask(gpd(fhip, nump, ORAN_CONFIG_WORKER_CORES));
-  io_cfg->pkt_proc_core_64_127 = 0x0; // bitmap 0 -> no core
-  io_cfg->pkt_aux_core = 0; /* sapmle app says 0 = "do not start" */
-  io_cfg->timing_core = *gpd(fhip, nump, ORAN_CONFIG_IO_CORE)->iptr; /* sample app: equal to io_core */
-  //io_cfg->port = {0}; // all 0
-  io_cfg->io_sleep = 0; // no sleep
-  io_cfg->nEthLinePerPort = *gpd(fhip, nump, ORAN_CONFIG_NETHPERPORT)->uptr;
-  io_cfg->nEthLineSpeed = *gpd(fhip, nump, ORAN_CONFIG_NETHSPEED)->uptr;
-  io_cfg->one_vf_cu_plane = 0; // false: C/U-plane don't share VF
-  // io_cfg->eowd_cmn[0] // all 0
-  // io_cfg->eowd_cmn[1] // all 0
-  // io_cfg->eowd_port[0]... // all 0
+  io_cfg->id = 0; // 0 -> xran as O-DU; 1 -> xran as O-RU
+  io_cfg->num_vfs = num_dev; // number of VFs for C-plane and U-plane (should be even); max = XRAN_VF_MAX
+  io_cfg->num_rxq = 1; // number of RX queues per VF
+  for (int i = 0; i < num_dev; ++i) {
+    io_cfg->dpdk_dev[i] = strdup(gpd(fhip, nump, ORAN_CONFIG_DPDK_DEVICES)->strlistptr[i]); // VFs devices
+  }
+  io_cfg->bbdev_dev[0] = NULL; // BBDev dev name; max devices = 1
+  io_cfg->bbdev_mode = XRAN_BBDEV_NOT_USED; // DPDK for BBDev
+  io_cfg->dpdkIoVaMode = 0; // IOVA mode
+  io_cfg->dpdkMemorySize = *gpd(fhip, nump, ORAN_CONFIG_DPDK_MEM_SIZE)->uptr; // DPDK max memory allocation
+
+  /* the following core assignment is needed for rte_eal_init() function within xran library;
+    these parameters are machine specific */
+  io_cfg->core = *gpd(fhip, nump, ORAN_CONFIG_IO_CORE)->iptr; // core used for IO; absolute CPU core ID for xran library, it should be an isolated core
+  io_cfg->system_core = *gpd(fhip, nump, ORAN_CONFIG_SYSTEM_CORE)->iptr; // absolute CPU core ID for DPDK control threads, it should be an isolated core
+  io_cfg->pkt_proc_core = get_u64_mask(gpd(fhip, nump, ORAN_CONFIG_WORKER_CORES)); // worker mask 0-63
+  io_cfg->pkt_proc_core_64_127 = 0x0; // worker mask 64-127; to be used if machine supports more than 64 cores
+  io_cfg->pkt_aux_core = 0; // sample app says 0 = "do not start"
+  io_cfg->timing_core = *gpd(fhip, nump, ORAN_CONFIG_IO_CORE)->iptr; // core used by xran
+
+  // io_cfg->port[XRAN_VF_MAX] // VFs ports; filled within xran library
+  io_cfg->io_sleep = 0; // enable sleep on PMD cores; 0 -> no sleep
+  io_cfg->nEthLinePerPort = *gpd(fhip, nump, ORAN_CONFIG_NETHPERPORT)->uptr; // 1, 2, 3 total number of links per O-RU (Fronthaul Ethernet link)
+  io_cfg->nEthLineSpeed = *gpd(fhip, nump, ORAN_CONFIG_NETHSPEED)->uptr; // 10G,25G,40G,100G speed of Physical connection on O-RU
+  io_cfg->one_vf_cu_plane = (io_cfg->num_vfs == num_rus); // C-plane and U-plane use one VF
+
+  /* use owdm to calculate T12 and T34 -> CUS specification, section 2.3.3.3 */
+  // io_cfg->eowd_cmn[2] // ecpri one-way delay measurements common settings for O-DU and O-RU
+  // io_cfg->eowd_port[2][XRAN_VF_MAX] // ecpri owd measurements per port variables for O-DU and O-RU
 
   return true;
 }
 
 static bool set_fh_eaxcid_conf(struct xran_eaxcid_config *eaxcid_conf, enum xran_category cat)
 {
-  // values taken from sample app
+  /* CUS specification, section 3.1.3.1.6
+    DU_port_ID - used to differentiate processing units at O-DU (e.g., different baseband cards).
+    BandSector_ID - aggregated cell identifier (distinguishes bands and sectors supported by the O-RU).
+    CC_ID - distinguishes Carrier Components supported by the O-RU.
+    RU_Port_ID - designates logical flows such as data layers or spatial streams, and logical flows such as separate
+                 numerologies (e.g. PRACH) or signaling channels requiring special antenna assignments such as SRS.
+    The assignment of the DU_port_ID, BandSector_ID, CC_ID, and RU_Port_ID
+    as part of the eAxC ID is done solely by the O-DU via the M-plane.
+    Each ID field has a flexible bit allocation, but the total eAxC ID field length is fixed, 16 bits. */
   switch (cat) {
     case XRAN_CATEGORY_A:
       eaxcid_conf->mask_cuPortId = 0xf000;
       eaxcid_conf->mask_bandSectorId = 0x0f00;
       eaxcid_conf->mask_ccId = 0x00f0;
       eaxcid_conf->mask_ruPortId = 0x000f;
-      eaxcid_conf->bit_cuPortId = 12;
-      eaxcid_conf->bit_bandSectorId = 8;
-      eaxcid_conf->bit_ccId = 4;
+      eaxcid_conf->bit_cuPortId = 0;
+      eaxcid_conf->bit_bandSectorId = 0; // total number of band sectors supported by O-RU should be retreived by M-plane - <max-num-bands> && <max-num-sectors>
+      eaxcid_conf->bit_ccId = 0; // total number of CC supported by O-RU should be retreived by M-plane - <max-num-component-carriers>
       eaxcid_conf->bit_ruPortId = 0;
       break;
     case XRAN_CATEGORY_B:
@@ -560,7 +580,7 @@ uint8_t *get_ether_addr(const char *addr, struct rte_ether_addr *ether_addr)
   return NULL;
 }
 
-bool set_fh_init(struct xran_fh_init *fh_init)
+static bool set_fh_init(struct xran_fh_init *fh_init, enum xran_category xran_cat)
 {
   memset(fh_init, 0, sizeof(*fh_init));
 
@@ -588,42 +608,28 @@ bool set_fh_init(struct xran_fh_init *fh_init)
   sprintf(aprefix, "%s", CONFIG_STRING_ORAN);
   const int nfh = sizeofArray(FHconfigs);
   config_getlist(config_get_if(), &FH_ConfigList, FHconfigs, nfh, aprefix);
-  int num_rus = FH_ConfigList.numelt;
-  int num_ru_addr = gpd(fhip, nump, ORAN_CONFIG_RU_ADDR)->numelt;
-  int num_du_addr = gpd(fhip, nump, ORAN_CONFIG_DU_ADDR)->numelt;
-  int num_vfs = gpd(fhip, nump, ORAN_CONFIG_DPDK_DEVICES)->numelt;
-  if (num_ru_addr != num_du_addr) {
-    printf("need to have same number of DUs and RUs!\n");
-    return false;
-  }
-  if (num_ru_addr != num_vfs) {
-    printf("need to have as many RU/DU entries as DPDK devices (one VF for CP and UP each)\n");
-    return false;
-  }
 
-  if (!set_fh_io_cfg(&fh_init->io_cfg, fhip, nump))
+  int num_rus = FH_ConfigList.numelt; // based on the number of fh_config sections -> number of RUs
+
+  if (!set_fh_io_cfg(&fh_init->io_cfg, fhip, nump, num_rus))
     return false;
-  if (!set_fh_eaxcid_conf(&fh_init->eAxCId_conf, XRAN_CATEGORY_A))
+  if (!set_fh_eaxcid_conf(&fh_init->eAxCId_conf, xran_cat))
     return false;
 
-  fh_init->xran_ports = num_rus;
-  fh_init->dpdkBasebandFecMode = 0;
-  fh_init->dpdkBasebandDevice = NULL;
-  fh_init->filePrefix = strdup(*gpd(fhip, nump, ORAN_CONFIG_FILE_PREFIX)->strptr); // see DPDK --file-prefix
+  fh_init->xran_ports = num_rus; // since we use xran as O-DU, xran_ports is set to the number of RUs
+  fh_init->dpdkBasebandFecMode = 0; // DPDK Baseband FEC device mode (0-SW, 1-HW); not used in xran
+  fh_init->dpdkBasebandDevice = NULL; // DPDK Baseband device address; not used in xran
+  /* used to specify a unique prefix for shared memory, and files created by multiple DPDK processes;
+    is it necessary */
+  fh_init->filePrefix = strdup(*gpd(fhip, nump, ORAN_CONFIG_FILE_PREFIX)->strptr);
+  /* maximum transmission unit (MTU) is the size of the largest protocol data unit (PDU) that can be
+    communicated in a single xRAN network layer transaction. Supported 1500 bytes and 9600 bytes (Jumbo Frame);
+    xran only checks if (MTU <= 1500), therefore setting any value > 1500, xran assumes 9600 value is used */
   fh_init->mtu = *gpd(fhip, nump, ORAN_CONFIG_MTU)->uptr;
 
-  // if multiple RUs: xran_ethdi_init_dpdk_io() iterates over
-  // &p_o_ru_addr[i]
-  char **du_addrs = gpd(fhip, nump, ORAN_CONFIG_DU_ADDR)->strlistptr;
-  fh_init->p_o_du_addr = calloc(num_du_addr, sizeof(struct rte_ether_addr));
-  AssertFatal(fh_init->p_o_du_addr != NULL, "out of memory\n");
-  for (int i = 0; i < num_du_addr; ++i) {
-    struct rte_ether_addr *ea = (struct rte_ether_addr *)fh_init->p_o_du_addr;
-    if (get_ether_addr(du_addrs[i], &ea[i]) == NULL) {
-      printf("could not read ethernet address '%s' for DU!\n", du_addrs[i]);
-      return false;
-    }
-  }
+  fh_init->p_o_du_addr = NULL; // DPDK retreives DU MAC address within the xran library with rte_eth_macaddr_get() function
+
+  int num_ru_addr = gpd(fhip, nump, ORAN_CONFIG_RU_ADDR)->numelt;
   fh_init->p_o_ru_addr = calloc(num_ru_addr, sizeof(struct rte_ether_addr));
   char **ru_addrs = gpd(fhip, nump, ORAN_CONFIG_RU_ADDR)->strlistptr;
   AssertFatal(fh_init->p_o_ru_addr != NULL, "out of memory\n");
@@ -634,40 +640,10 @@ bool set_fh_init(struct xran_fh_init *fh_init)
       return false;
     }
   }
-  fh_init->totalBfWeights = 32;
 
-  return true;
-}
+  fh_init->totalBfWeights = 0; // only used if id = O_RU (for emulation); C-plane extension types; section 5.4.6 of CUS spec
 
-static enum xran_cp_filterindex get_prach_filterindex_fr1(duplex_mode_t mode, int prach_index)
-{
-  if (mode == duplex_mode_TDD) {
-    // 38.211 table 6.3.3.2-3 "unpaired spectrum" -> TDD
-    switch (prach_index) {
-      case 0 ... 39:
-      case 256 ... 262:
-        return XRAN_FILTERINDEX_PRACH_012;
-      case 40 ... 66:
-        return XRAN_FILTERINDEX_PRACH_3;
-      case 67 ... 255:
-        return XRAN_FILTERINDEX_PRACH_ABC;
-    }
-  } else if (mode == duplex_mode_FDD) {
-    // 38.211 table 6.3.3.2-2 "paired spectrum" -> FDD
-    switch (prach_index) {
-      case 0 ... 59:
-        return XRAN_FILTERINDEX_PRACH_012;
-      case 60 ... 86:
-        return XRAN_FILTERINDEX_PRACH_3;
-      case 87 ... 255:
-        return XRAN_FILTERINDEX_PRACH_ABC;
-      default:
-        AssertFatal(false, "unknown PRACH index %d\n", prach_index);
-    }
-  } else {
-    AssertFatal(false, "unsupported duplex mode %d\n", mode);
-  }
-  return XRAN_FILTERINDEX_STANDARD;
+  return true;
 }
 
 // PRACH guard interval. Raymond: "[it] is not in the configuration, (i.e. it
@@ -678,73 +654,82 @@ static enum xran_cp_filterindex get_prach_filterindex_fr1(duplex_mode_t mode, in
 int g_kbar;
 
 static bool set_fh_prach_config(const openair0_config_t *oai0,
+                                const uint32_t max_num_ant,
                                 const paramdef_t *prachp,
                                 int nprach,
                                 struct xran_prach_config *prach_config)
 {
   const split7_config_t *s7cfg = &oai0->split7;
 
-  prach_config->nPrachConfIdx = s7cfg->prach_index;
-  prach_config->nPrachSubcSpacing = oai0->nr_scs_for_raster;
-  prach_config->nPrachZeroCorrConf = 0;
-  prach_config->nPrachRestrictSet = 0;
-  prach_config->nPrachRootSeqIdx = 0;
-  prach_config->nPrachFreqStart = s7cfg->prach_freq_start;
-  prach_config->nPrachFreqOffset = (s7cfg->prach_freq_start * 12 - oai0->num_rb_dl * 6) * 2;
-  if (oai0->nr_band < 100)
-    prach_config->nPrachFilterIdx = get_prach_filterindex_fr1(oai0->duplex_mode, s7cfg->prach_index);
-  else
-    prach_config->nPrachFilterIdx = XRAN_FILTERINDEX_PRACH_ABC;
+  prach_config->nPrachConfIdx = s7cfg->prach_index; // PRACH Configuration Index
+  prach_config->nPrachSubcSpacing = oai0->nr_scs_for_raster; // 0 -> 15kHz, 1 -> 30kHz, 2 -> 60kHz, 3 -> 120kHz
+  prach_config->nPrachZeroCorrConf = 0; // PRACH zeroCorrelationZoneConfig; should be saved from config file; not used in xran
+  prach_config->nPrachRestrictSet = 0; /* PRACH restrictedSetConfig; should be saved from config file; 0 = unrestricted,
+                                          1 = restricted type A, 2=restricted type B; not used in xran */
+  prach_config->nPrachRootSeqIdx = 0; // PRACH Root Sequence Index; should be saved from config file; 1 = 839, 2 = 139; not used in xran
+  prach_config->nPrachFreqStart = s7cfg->prach_freq_start; // PRACH frequency start (MSG1)
+  prach_config->nPrachFreqOffset = (s7cfg->prach_freq_start * 12 - oai0->num_rb_dl * 6) * 2; // PRACH frequency offset
+  prach_config->nPrachFilterIdx = 0; /* PRACH filter index; not used in xran;
+                                        in E release hardcoded to XRAN_FILTERINDEX_PRACH_ABC (preamble format A1~3, B1~4, C0, C2)
+                                        in F release properly calculated */
+
+  /* Return values after initialization */
   prach_config->startSymId = 0;
   prach_config->lastSymId = 0;
   prach_config->startPrbc = 0;
   prach_config->numPrbc = 0;
   prach_config->timeOffset = 0;
   prach_config->freqOffset = 0;
-  prach_config->eAxC_offset = *gpd(prachp, nprach, ORAN_PRACH_CONFIG_EAXC_OFFSET)->u8ptr;
 
-  g_kbar = *gpd(prachp, nprach, ORAN_PRACH_CONFIG_KBAR)->uptr;
+  /* xran defines PDSCH eAxC IDs as [0...Ntx-1];
+     xran defines PUSCH eAxC IDs as [0...Nrx-1];
+     PRACH offset must be >= max(Ntx, Nrx) */
+  uint8_t offset = *gpd(prachp, nprach, ORAN_PRACH_CONFIG_EAXC_OFFSET)->u8ptr;
+  prach_config->eAxC_offset = (offset != 0) ? offset : max_num_ant;
 
-  return true;
-}
+  g_kbar = *gpd(prachp, nprach, ORAN_PRACH_CONFIG_KBAR)->uptr;
 
-static bool set_fh_srs_config(struct xran_srs_config *srs_config)
-{
-  srs_config->symbMask = 0;
-  srs_config->eAxC_offset = 8;
   return true;
 }
 
 static bool set_fh_frame_config(const openair0_config_t *oai0, struct xran_frame_config *frame_config)
 {
   const split7_config_t *s7cfg = &oai0->split7;
-  frame_config->nFrameDuplexType = oai0->duplex_mode == duplex_mode_TDD ? XRAN_TDD : XRAN_FDD;
-  frame_config->nNumerology = oai0->nr_scs_for_raster;
+  frame_config->nFrameDuplexType = oai0->duplex_mode == duplex_mode_TDD ? XRAN_TDD : XRAN_FDD; // Frame Duplex type:  0 -> FDD, 1 -> TDD
+  frame_config->nNumerology = oai0->nr_scs_for_raster; /* 0 -> 15kHz,  1 -> 30kHz,  2 -> 60kHz
+                                                          3 -> 120kHz, 4 -> 240kHz */
+
+  if (frame_config->nFrameDuplexType == XRAN_FDD)
+    return true;
+
+  // TDD periodicity
   frame_config->nTddPeriod = s7cfg->n_tdd_period;
 
+  // TDD Slot configuration
   struct xran_slot_config *sc = &frame_config->sSlotConfig[0];
   for (int slot = 0; slot < frame_config->nTddPeriod; ++slot)
     for (int sym = 0; sym < 14; ++sym)
       sc[slot].nSymbolType[sym] = s7cfg->slot_dirs[slot].sym_dir[sym];
+
   return true;
 }
 
-static bool set_fh_ru_config(const paramdef_t *rup, uint16_t fftSize, int nru, struct xran_ru_config *ru_config)
+static bool set_fh_ru_config(const paramdef_t *rup, uint16_t fftSize, int nru, enum xran_category xran_cat, struct xran_ru_config *ru_config)
 {
-  ru_config->xranTech = XRAN_RAN_5GNR;
-  ru_config->xranCat = XRAN_CATEGORY_A;
-  ru_config->xranCompHdrType = XRAN_COMP_HDR_TYPE_STATIC;
-  ru_config->iqWidth = *gpd(rup, nru, ORAN_RU_CONFIG_IQWIDTH)->uptr;
+  ru_config->xranTech = XRAN_RAN_5GNR; // 5GNR or LTE
+  ru_config->xranCat = xran_cat; // mode: Catergory A or Category B
+  ru_config->xranCompHdrType = XRAN_COMP_HDR_TYPE_STATIC; // dynamic or static udCompHdr handling
+  ru_config->iqWidth = *gpd(rup, nru, ORAN_RU_CONFIG_IQWIDTH)->uptr; // IQ bit width
   AssertFatal(ru_config->iqWidth <= 16, "IQ Width cannot be > 16!\n");
-  ru_config->compMeth = ru_config->iqWidth < 16 ? XRAN_COMPMETHOD_BLKFLOAT : XRAN_COMPMETHOD_NONE;
-  ru_config->iqWidth_PRACH = *gpd(rup, nru, ORAN_RU_CONFIG_IQWIDTH_PRACH)->uptr;
+  ru_config->compMeth = ru_config->iqWidth < 16 ? XRAN_COMPMETHOD_BLKFLOAT : XRAN_COMPMETHOD_NONE; // compression method
+  ru_config->iqWidth_PRACH = *gpd(rup, nru, ORAN_RU_CONFIG_IQWIDTH_PRACH)->uptr; // IQ bit width for PRACH
   AssertFatal(ru_config->iqWidth_PRACH <= 16, "IQ Width for PRACH cannot be > 16!\n");
-  ru_config->compMeth_PRACH = ru_config->iqWidth_PRACH < 16 ? XRAN_COMPMETHOD_BLKFLOAT : XRAN_COMPMETHOD_NONE;
+  ru_config->compMeth_PRACH = ru_config->iqWidth_PRACH < 16 ? XRAN_COMPMETHOD_BLKFLOAT : XRAN_COMPMETHOD_NONE; // compression method for PRACH
   AssertFatal(fftSize > 0, "FFT size cannot be 0\n");
-  ru_config->fftSize = fftSize;
-  ru_config->byteOrder = XRAN_NE_BE_BYTE_ORDER;
-  ru_config->iqOrder = XRAN_I_Q_ORDER;
-  ru_config->xran_max_frame = 0;
+  ru_config->fftSize = fftSize; // FFT Size
+  ru_config->byteOrder = XRAN_NE_BE_BYTE_ORDER; // order of bytes in int16_t in buffer; big or little endian
+  ru_config->iqOrder = XRAN_I_Q_ORDER; // order of IQs in the buffer
+  ru_config->xran_max_frame = 0; // max frame number supported; if not specified, default of 1023 is used
   return true;
 }
 
@@ -764,14 +749,12 @@ static bool set_maxmin_pd(const paramdef_t *pd, int num, const char *name, uint1
   return true;
 }
 
-extern uint32_t to_nrarfcn(int nr_bandP, uint64_t dl_CarrierFreq, uint8_t scs_index, uint32_t bw);
-bool set_fh_config(int ru_idx, int num_rus, const openair0_config_t *oai0, struct xran_fh_config *fh_config)
+static bool set_fh_config(int ru_idx, int num_rus, enum xran_category xran_cat, const openair0_config_t *oai0, struct xran_fh_config *fh_config)
 {
   AssertFatal(num_rus == 1 || num_rus == 2, "only support 1 or 2 RUs as of now\n");
   AssertFatal(ru_idx < num_rus, "illegal ru_idx %d: must be < %d\n", ru_idx, num_rus);
   DevAssert(oai0->tx_num_channels > 0 && oai0->rx_num_channels > 0);
   DevAssert(oai0->tx_bw > 0 && oai0->rx_bw > 0);
-  //AssertFatal(oai0->tx_num_channels == oai0->rx_num_channels, "cannot handle unequal number of TX/RX channels\n");
   DevAssert(oai0->tx_freq[0] > 0);
   for (int i = 1; i < oai0->tx_num_channels; ++i)
     DevAssert(oai0->tx_freq[0] == oai0->tx_freq[i]);
@@ -782,12 +765,6 @@ bool set_fh_config(int ru_idx, int num_rus, const openair0_config_t *oai0, struc
   DevAssert(oai0->nr_scs_for_raster > 0);
   AssertFatal(oai0->threequarter_fs == 0, "cannot use three-quarter sampling with O-RAN 7.2 split\n");
 
-  // we simply assume that the loading process provides function to_nrarfcn()
-  // to calculate the ARFCN numbers from frequency. That is not clean, but the
-  // best we can do without copy-pasting the function.
-  uint32_t nDLCenterFreqARFCN = to_nrarfcn(oai0->nr_band, oai0->tx_freq[0], oai0->nr_scs_for_raster, oai0->tx_bw);
-  uint32_t nULCenterFreqARFCN = to_nrarfcn(oai0->nr_band, oai0->rx_freq[0], oai0->nr_scs_for_raster, oai0->rx_bw);
-
   paramdef_t FHconfigs[] = ORAN_FH_DESC;
   paramlist_def_t FH_ConfigList = {CONFIG_STRING_ORAN_FH};
   char aprefix[MAX_OPTNAME_SIZE] = {0};
@@ -819,30 +796,30 @@ bool set_fh_config(int ru_idx, int num_rus, const openair0_config_t *oai0, struc
 
   memset(fh_config, 0, sizeof(*fh_config));
 
-  fh_config->dpdk_port = ru_idx;
-  fh_config->sector_id = 0;
-  fh_config->nCC = 1;
-  fh_config->neAxc = oai0->tx_num_channels / num_rus;
-  fh_config->neAxcUl = oai0->rx_num_channels / num_rus;
-  fh_config->nAntElmTRx = oai0->tx_num_channels / num_rus;
-  fh_config->nDLFftSize = 0;
-  fh_config->nULFftSize = 0;
-  fh_config->nDLRBs = oai0->num_rb_dl;
-  fh_config->nULRBs = oai0->num_rb_dl;
-  fh_config->nDLAbsFrePointA = 0;
-  fh_config->nULAbsFrePointA = 0;
-  fh_config->nDLCenterFreqARFCN = nDLCenterFreqARFCN;
-  fh_config->nULCenterFreqARFCN = nULCenterFreqARFCN;
-  fh_config->ttiCb = NULL;
-  fh_config->ttiCbParam = NULL;
-  fh_config->Tadv_cp_dl = *gpd(fhp, nfh, ORAN_FH_CONFIG_TADV_CP_DL)->uptr;
-  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T2A_CP_DL, &fh_config->T2a_min_cp_dl, &fh_config->T2a_max_cp_dl))
+  fh_config->dpdk_port = ru_idx; // DPDK port number used for FH
+  fh_config->sector_id = 0; // Band sector ID for FH; not used in xran
+  fh_config->nCC = 1; // number of Component carriers supported on FH; M-plane info
+  fh_config->neAxc = RTE_MAX(oai0->tx_num_channels / num_rus, oai0->rx_num_channels / num_rus); // number of eAxc supported on one CC = max(PDSCH, PUSCH)
+  fh_config->neAxcUl = 0; // number of eAxc supported on one CC for UL direction = PUSCH; used only if XRAN_CATEGORY_B
+  fh_config->nAntElmTRx = 0; // number of antenna elements for TX and RX = SRS; used only if XRAN_CATEGORY_B
+  fh_config->nDLFftSize = 0; // DL FFT size; not used in xran
+  fh_config->nULFftSize = 0; // UL FFT size; not used in xran
+  fh_config->nDLRBs = oai0->num_rb_dl; // DL PRB
+  fh_config->nULRBs = oai0->num_rb_dl; // UL PRB; in xran not used as id = O_DU,  but used in oaioran.c/oran-init.c
+  fh_config->nDLAbsFrePointA = 0; // Abs Freq Point A of the Carrier Center Frequency for in KHz Value; not used in xran
+  fh_config->nULAbsFrePointA = 0; // Abs Freq Point A of the Carrier Center Frequency for in KHz Value; not used in xran
+  fh_config->nDLCenterFreqARFCN = 0; // center frequency for DL in NR-ARFCN; not used in xran
+  fh_config->nULCenterFreqARFCN = 0; // center frequency for UL in NR-ARFCN; not used in xran
+  fh_config->ttiCb = NULL; // check tti_to_phy_cb(), tx_cp_dl_cb() and tx_cp_ul_cb => first_call
+  fh_config->ttiCbParam = NULL; // check tti_to_phy_cb(), tx_cp_dl_cb() and tx_cp_ul_cb => first_call
+  fh_config->Tadv_cp_dl = *gpd(fhp, nfh, ORAN_FH_CONFIG_TADV_CP_DL)->uptr; // not used in xran
+  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T2A_CP_DL, &fh_config->T2a_min_cp_dl, &fh_config->T2a_max_cp_dl)) // not used in xran
     return false;
-  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T2A_CP_UL, &fh_config->T2a_min_cp_ul, &fh_config->T2a_max_cp_ul))
+  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T2A_CP_UL, &fh_config->T2a_min_cp_ul, &fh_config->T2a_max_cp_ul)) // not used in xran
     return false;
-  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T2A_UP, &fh_config->T2a_min_up, &fh_config->T2a_max_up))
+  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T2A_UP, &fh_config->T2a_min_up, &fh_config->T2a_max_up)) // not used in xran
     return false;
-  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_TA3, &fh_config->Ta3_min, &fh_config->Ta3_max))
+  if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_TA3, &fh_config->Ta3_min, &fh_config->Ta3_max)) // not used in xran
     return false;
   if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_T1A_CP_DL, &fh_config->T1a_min_cp_dl, &fh_config->T1a_max_cp_dl))
     return false;
@@ -852,37 +829,71 @@ bool set_fh_config(int ru_idx, int num_rus, const openair0_config_t *oai0, struc
     return false;
   if (!set_maxmin_pd(fhp, nfh, ORAN_FH_CONFIG_TA4, &fh_config->Ta4_min, &fh_config->Ta4_max))
     return false;
-  fh_config->enableCP = 1;
-  fh_config->prachEnable = 1;
-  fh_config->srsEnable = 0;
-  fh_config->puschMaskEnable = 0;
-  fh_config->puschMaskSlot = 0;
-  fh_config->cp_vlan_tag = *gpd(fhp, nfh, ORAN_FH_CONFIG_CP_VLAN_TAG)->uptr;
-  fh_config->up_vlan_tag = *gpd(fhp, nfh, ORAN_FH_CONFIG_UP_VLAN_TAG)->uptr;
-  fh_config->debugStop = 0;
-  fh_config->debugStopCount = 0;
-  fh_config->DynamicSectionEna = 0;
-  fh_config->GPS_Alpha = 0;
-  fh_config->GPS_Beta = 0;
-
-  if (!set_fh_prach_config(oai0, prachp, nprach, &fh_config->prach_conf))
-    return false;
-  if (!set_fh_srs_config(&fh_config->srs_conf))
+  fh_config->enableCP = 1; // enable C-plane
+  fh_config->prachEnable = 1; // enable PRACH
+  fh_config->srsEnable = 0; // enable SRS; used only if XRAN_CATEGORY_B
+  fh_config->puschMaskEnable = 0; // enable PUSCH mask; only used if id = O_RU
+  fh_config->puschMaskSlot = 0; // specific which slot PUSCH channel masked; only used if id = O_RU
+  fh_config->cp_vlan_tag = *gpd(fhp, nfh, ORAN_FH_CONFIG_CP_VLAN_TAG)->uptr; // C-plane VLAN tag; not used in xran; needed for M-plane
+  fh_config->up_vlan_tag = *gpd(fhp, nfh, ORAN_FH_CONFIG_UP_VLAN_TAG)->uptr; // U-plane VLAN tag; not used in xran; needed for M-plane
+  fh_config->debugStop = 0; // enable auto stop; not used in xran
+  fh_config->debugStopCount = 0; // enable auto stop after number of Tx packets; not used in xran
+  fh_config->DynamicSectionEna = 0; // enable dynamic C-Plane section allocation; not used in xran
+  fh_config->GPS_Alpha = 0; // refers to alpha as defined in section 9.7.2 of ORAN spec. this value should be alpha*(1/1.2288ns), range 0 - 1e7 (ns); offset_nsec = (pConf->GPS_Beta - offset_sec * 100) * 1e7 + pConf->GPS_Alpha
+  fh_config->GPS_Beta = 0; // beta value as defined in section 9.7.2 of ORAN spec. range -32767 ~ +32767; offset_sec = pConf->GPS_Beta / 100
+
+  if (!set_fh_prach_config(oai0, fh_config->neAxc, prachp, nprach, &fh_config->prach_conf))
     return false;
+  /* SRS only used if XRAN_CATEGORY_B
+    Note: srs_config->eAxC_offset >= prach_config->eAxC_offset + PRACH */
+  // fh_config->srs_conf = {0};
   if (!set_fh_frame_config(oai0, &fh_config->frame_conf))
     return false;
-  if (!set_fh_ru_config(rup, oai0->split7.fftSize, nru, &fh_config->ru_conf))
+  if (!set_fh_ru_config(rup, oai0->split7.fftSize, nru, xran_cat, &fh_config->ru_conf))
+    return false;
+
+  fh_config->bbdev_enc = NULL; // call back to poll BBDev encoder
+  fh_config->bbdev_dec = NULL; // call back to poll BBDev decoder
+
+  /* CUS specification, section 3.1.3.1.6 
+    This parameter is an eAxC identifier (eAxC ID) and identifies the specific data flow associated with each
+    C-Plane (ecpriRtcid) or U-Plane (ecpriPcid) message.
+    Each of bellow parameters is a matrix [XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR*2 + XRAN_MAX_ANT_ARRAY_ELM_NR] */
+  // fh_config->tx_cp_eAxC2Vf // mapping of C-Plane (ecpriRtcid) to VF; not used in xran
+  // fh_config->tx_up_eAxC2Vf // mapping of U-Plane (ecpriPcid) to VF; not used in xran
+  // fh_config->rx_cp_eAxC2Vf // mapping of C-Plane (ecpriRtcid) to VF; not used in xran
+  // fh_config->rx_up_eAxC2Vf // mapping of U-Plane (ecpriPcid) to VF; not used in xran
+
+  fh_config->log_level = 1; // configuration of log level; 1 -> enabled
+
+  /* Parameters that should be retreived via M-plane
+    O-RU defines them for Section Type 1 (Most DL/UL radio channels) and 3 (PRACH and mixed-numerology channels)
+    Note: When PRACH having same numerology as other UL channels, Section type 1 can alternatively be used by O-DU for PRACH signaling.
+          In this case, O-RU is not expected to perform any PRACH specific processing. */
+  fh_config->max_sections_per_slot = 0; // not used in xran
+  fh_config->max_sections_per_symbol = 0; // not used in xran
+
+  return true;
+}
+
+bool get_xran_config(const openair0_config_t *openair0_cfg, struct xran_fh_init *fh_init, struct xran_fh_config *fh_config)
+{
+  /* This xran integration release is only valid for O-RU CAT A.
+    Therefore, each FH parameter is hardcoded to CAT A.
+    If you are interested in CAT B, please be aware that parameters of fh_init and fh_config structs must be modified accordingly. */
+  enum xran_category xran_cat = XRAN_CATEGORY_A;
+
+  if (!set_fh_init(fh_init, xran_cat)) {
+    printf("could not read FHI 7.2/ORAN config\n");
     return false;
+  }
 
-  fh_config->bbdev_enc = NULL;
-  fh_config->bbdev_dec = NULL;
-  // fh_config->tx_cp_eAxC2Vf [not implemented by fhi_lib]
-  // fh_config->tx_up_eAxC2Vf [not implemented by fhi_lib]
-  // fh_config->rx_cp_eAxC2Vf [not implemented by fhi_lib]
-  // fh_config->rx_up_eAxC2Vf [not implemented by fhi_lib]
-  fh_config->log_level = 1;
-  fh_config->max_sections_per_slot = 8;
-  fh_config->max_sections_per_symbol = 8;
+  for (int32_t o_xu_id = 0; o_xu_id < fh_init->xran_ports; o_xu_id++) {
+    if (!set_fh_config(o_xu_id, fh_init->xran_ports, xran_cat, openair0_cfg, &fh_config[o_xu_id])) {
+      printf("could not read FHI 7.2/RU-specific config\n");
+      return false;
+    }
+  }
 
   return true;
 }
diff --git a/radio/fhi_72/oran-config.h b/radio/fhi_72/oran-config.h
index 77f04d8e0c5c96cdc78cdec55b98ab9b7565c17f..c5a086638f3390ef6eaed68cd5a5695cdb8356f7 100644
--- a/radio/fhi_72/oran-config.h
+++ b/radio/fhi_72/oran-config.h
@@ -26,13 +26,13 @@
 #include "stdint.h"
 
 struct xran_fh_init;
-void print_fh_init(const struct xran_fh_init *fh_init);
 struct xran_fh_config;
-void print_fh_config(const struct xran_fh_config *fh_config);
-
-bool set_fh_init(struct xran_fh_init *fh_init);
 struct openair0_config;
-bool set_fh_config(int ru_idx, int num_rus, const struct openair0_config *oai0_cfg, struct xran_fh_config *fh_config);
+
+bool get_xran_config(const struct openair0_config *openair0_cfg, struct xran_fh_init *fh_init, struct xran_fh_config *fh_config);
+
+void print_fh_init(const struct xran_fh_init *fh_init);
+void print_fh_config(const struct xran_fh_config *fh_config);
 
 // hack to workaround LiteOn limitation
 extern int g_kbar;
diff --git a/radio/fhi_72/oran-init.c b/radio/fhi_72/oran-init.c
index 7a629ce5aadbd412c0254833014ad5f6e6e2ffe5..e290db561bf11a7a4b908c31f94d19f8b4fd7c4c 100644
--- a/radio/fhi_72/oran-init.c
+++ b/radio/fhi_72/oran-init.c
@@ -396,35 +396,20 @@ static void oran_allocate_buffers(void *handle,
   xran_5g_prach_req(pi->instanceHandle, prach, prachdecomp, oai_xran_fh_rx_prach_callback, &portInstances->prach_tag);
 }
 
-int *oai_oran_initialize(const openair0_config_t *openair0_cfg)
+int *oai_oran_initialize(struct xran_fh_init *xran_fh_init, struct xran_fh_config *xran_fh_config)
 {
   int32_t xret = 0;
 
-  struct xran_fh_init init = {0};
-  if (!set_fh_init(&init)) {
-    printf("could not read FHI 7.2/ORAN config\n");
-    return NULL;
-  }
-  print_fh_init(&init);
-
-  /* read all configuration before starting anything */
-  struct xran_fh_config xran_fh_config[XRAN_PORTS_NUM] = {0};
-  for (int32_t o_xu_id = 0; o_xu_id < init.xran_ports; o_xu_id++) {
-    if (!set_fh_config(o_xu_id, init.xran_ports, openair0_cfg, &xran_fh_config[o_xu_id])) {
-      printf("could not read FHI 7.2/RU-specific config\n");
-      return NULL;
-    }
-    print_fh_config(&xran_fh_config[o_xu_id]);
-  }
-
-  xret = xran_init(0, NULL, &init, NULL, &gxran_handle);
+  print_fh_init(xran_fh_init);
+  xret = xran_init(0, NULL, xran_fh_init, NULL, &gxran_handle);
   if (xret != XRAN_STATUS_SUCCESS) {
     printf("xran_init failed %d\n", xret);
     exit(-1);
   }
 
   /** process all the O-RU|O-DU for use case */
-  for (int32_t o_xu_id = 0; o_xu_id < init.xran_ports; o_xu_id++) {
+  for (int32_t o_xu_id = 0; o_xu_id < xran_fh_init->xran_ports; o_xu_id++) {
+    print_fh_config(&xran_fh_config[o_xu_id]);
     xret = xran_open(gxran_handle, &xran_fh_config[o_xu_id]);
     if (xret != XRAN_STATUS_SUCCESS) {
       printf("xran_open failed %d\n", xret);
@@ -432,7 +417,7 @@ int *oai_oran_initialize(const openair0_config_t *openair0_cfg)
     }
 
     int sector = 0;
-    printf("Initialize ORAN port instance %d (%d) sector %d\n", o_xu_id, init.xran_ports, sector);
+    printf("Initialize ORAN port instance %d (%d) sector %d\n", o_xu_id, xran_fh_init->xran_ports, sector);
     oran_port_instance_t *pi = &gPortInst[o_xu_id][sector];
     struct xran_cb_tag tag = {.cellId = sector, .oXuId = o_xu_id};
     pi->prach_tag = tag;
diff --git a/radio/fhi_72/oran-init.h b/radio/fhi_72/oran-init.h
index dad57a60c3d403f184d9297a08fe8cecee3b2cc8..b9f31d9889ce11f8bf7f5dbc05a5bdafbf1b395c 100644
--- a/radio/fhi_72/oran-init.h
+++ b/radio/fhi_72/oran-init.h
@@ -57,7 +57,6 @@ typedef struct oran_port_instance_t {
 extern struct xran_fh_config gxran_fh_config[XRAN_PORTS_NUM];
 extern void *gxran_handle;
 
-struct openair0_config;
-int *oai_oran_initialize(const struct openair0_config *openair0_cfg);
+int *oai_oran_initialize(struct xran_fh_init *fh_init, struct xran_fh_config *fh_config);
 
 #endif /* ORAN_INIT_H */
diff --git a/radio/fhi_72/oran-params.h b/radio/fhi_72/oran-params.h
index ff8058f9cade76f0ce55cac13c3d7f9d6aa43d4c..e9de03660cdf7aaccc1de824616b654c84fb9527 100644
--- a/radio/fhi_72/oran-params.h
+++ b/radio/fhi_72/oran-params.h
@@ -31,7 +31,6 @@
 #define ORAN_CONFIG_SYSTEM_CORE "system_core"
 #define ORAN_CONFIG_IO_CORE "io_core"
 #define ORAN_CONFIG_WORKER_CORES "worker_cores"
-#define ORAN_CONFIG_DU_ADDR "du_addr"
 #define ORAN_CONFIG_RU_ADDR "ru_addr"
 #define ORAN_CONFIG_MTU "mtu"
 #define ORAN_CONFIG_FILE_PREFIX "file_prefix"
@@ -47,9 +46,8 @@
   {ORAN_CONFIG_SYSTEM_CORE,     "DPDK control threads core\n",              PARAMFLAG_MANDATORY, .iptr=NULL,       .defintval=0,        TYPE_INT,        0}, \
   {ORAN_CONFIG_IO_CORE,         "DPDK Core used for IO\n",                  PARAMFLAG_MANDATORY, .iptr=NULL,       .defintval=4,        TYPE_INT,        0}, \
   {ORAN_CONFIG_WORKER_CORES,    "CPU Cores to use for workers\n",           PARAMFLAG_MANDATORY, .uptr=NULL,       .defintarrayval=NULL,TYPE_UINTARRAY,  0}, \
-  {ORAN_CONFIG_DU_ADDR,         "Ether addr of DU\n",                       PARAMFLAG_MANDATORY, .strlistptr=NULL, .defstrlistval=NULL, TYPE_STRINGLIST, 0}, \
   {ORAN_CONFIG_RU_ADDR,         "Ether addr of RU\n",                       PARAMFLAG_MANDATORY, .strlistptr=NULL, .defstrlistval=NULL, TYPE_STRINGLIST, 0}, \
-  {ORAN_CONFIG_MTU,             "MTU of Eth interface\n",                   PARAMFLAG_MANDATORY, .uptr=NULL,       .defuintval=1500,    TYPE_UINT,       0}, \
+  {ORAN_CONFIG_MTU,             "MTU of Eth interface\n",                   0,                   .uptr=NULL,       .defuintval=1500,    TYPE_UINT,       0}, \
   {ORAN_CONFIG_FILE_PREFIX,     "DPDK file-prefix\n",                       0,                   .strptr=NULL,     .defstrval="wls_0",  TYPE_STRING,     0}, \
   {ORAN_CONFIG_NETHPERPORT,     "number of links per port\n",               0,                   .uptr=NULL,       .defuintval=1,       TYPE_UINT,       0}, \
   {ORAN_CONFIG_NETHSPEED,       "ethernet speed link\n",                    0,                   .uptr=NULL,       .defuintval=10,      TYPE_UINT,       0}, \
diff --git a/radio/fhi_72/oran_isolate.c b/radio/fhi_72/oran_isolate.c
index 32bdb7c77198caff7cfd23faba2664cb1c2c3340..8f81337855e7ad60a84a83f7794a28bed06c947e 100644
--- a/radio/fhi_72/oran_isolate.c
+++ b/radio/fhi_72/oran_isolate.c
@@ -33,6 +33,7 @@
 #include "openair1/PHY/defs_gNB.h"
 #include "common/utils/threadPool/thread-pool.h"
 #include "oaioran.h"
+#include "oran-config.h"
 
 // include the following file for VERSIONX, version of xran lib, to print it during
 // startup. Only relevant for printing, if it ever makes problem, remove this
@@ -317,7 +318,16 @@ __attribute__((__visibility__("default"))) int transport_init(openair0_device *d
   LOG_I(HW, "Initializing O-RAN 7.2 FH interface through xran library (compiled against headers of %s)\n", VERSIONX);
 
   initNotifiedFIFO(&oran_sync_fifo);
-  eth->oran_priv = oai_oran_initialize(openair0_cfg);
+
+  struct xran_fh_init fh_init = {0};
+  struct xran_fh_config fh_config[XRAN_PORTS_NUM] = {0};
+#ifndef OAI_MPLANE_SUPPORT
+  bool success = get_xran_config(openair0_cfg, &fh_init, fh_config);
+  AssertFatal(success, "cannot get configuration for xran\n");
+#else
+  /* TODO: M-plane integration */
+#endif
+  eth->oran_priv = oai_oran_initialize(&fh_init, fh_config);
   AssertFatal(eth->oran_priv != NULL, "can not initialize fronthaul");
   // create message queues for ORAN sync
   return 0;
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf
new file mode 100644
index 0000000000000000000000000000000000000000..5072dc32bb0ecc8130e4524b92ec7bae708485f7
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.4x4-benetel650.conf
@@ -0,0 +1,270 @@
+Active_gNBs = ( "gNB-OAI-DU");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+    gNB_DU_ID =  0xe00;
+    gNB_name  =  "gNB-OAI-DU";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+    plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ( { sst = 1; }); });
+
+    nr_cellid = 1;
+
+    ////////// Physical parameters:
+
+    pdsch_AntennaPorts_XP = 2;
+    pdsch_AntennaPorts_N1 = 2;
+    pusch_AntennaPorts    = 4;
+    do_CSIRS              = 1;
+    do_SRS                = 0;
+    sib1_tda			        = 15;
+    force_UL256qam_off    = 1;
+    # maxMIMO_layers        = 2;
+
+    pdcch_ConfigSIB1 = (
+      {
+        controlResourceSetZero = 11;
+        searchSpaceZero = 0;
+      }
+    );
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+     # n_TimingAdvanceOffset                                         = 0;
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # center frequency = 3950.4 MHz
+      # selected SSB frequency = 3950.4 MHz
+      absoluteFrequencySSB                                          = 663360;
+      dl_frequencyBand                                              = 77;
+      # frequency point A = 3901.26 MHz
+      dl_absoluteFrequencyPointA                                    = 660084;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                           = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        dl_subcarrierSpacing                                        = 1;
+        dl_carrierBandwidth                                         = 273;
+     #initialDownlinkBWP
+      #genericParameters
+       initialDLBWPlocationAndBandwidth                             = 1099; #38.101-1 Table 5.3.2-1
+       #
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                               = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                          = 11;
+        initialDLBWPsearchSpaceZero                                 = 0;
+
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                              = 77;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                             = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                          = 1;
+      ul_carrierBandwidth                                           = 273;
+      pMax                                                          = 23;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                            = 1099;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                               = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 151;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 0;
+          preambleReceivedTargetPower                               = -100;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 8;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 3;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 5;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #
+        msg1_SubcarrierSpacing                                      = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+
+# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB
+        msg3_DeltaPreamble                                          = 2;
+        p0_NominalWithGrant                                         = -96;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 0;
+        p0_nominal                                                  = -96;
+
+      ssb_PositionsInBurst_Bitmap                                   = 0x1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 1;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 5;
+      nrofDownlinkSlots                                             = 3;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 1;
+      nrofUplinkSymbols                                             = 4;
+
+  ssPBCH_BlockPower                                                 = 5;
+  }
+
+  );
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+  }
+);
+
+
+MACRLCs = (
+{
+  num_cc                      = 1;
+  tr_s_preference             = "local_L1";
+  tr_n_preference             = "f1";
+  local_n_if_name             = "enp193s0f0";
+  local_n_address             = "172.21.16.51";
+  remote_n_address            = "172.21.6.90";
+  local_n_portc               = 500;
+  local_n_portd               = 2153;
+  remote_n_portc              = 501;
+  remote_n_portd              = 2153;
+  pusch_TargetSNRx10          = 170;
+  pucch_TargetSNRx10          = 230;
+  dl_bler_target_upper        = .35;
+  dl_bler_target_lower        = .15; 
+  ul_bler_target_upper        = .35;
+  ul_bler_target_lower        = .15;
+  pusch_FailureThres          = 100;
+  ul_max_mcs                  = 28;
+  min_grant_prb               = 1;
+}
+);
+
+L1s = (
+{
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  prach_dtx_threshold = 100;
+  pucch0_dtx_threshold = 80;
+  pusch_dtx_threshold = 10;
+  max_ldpc_iterations = 10;
+  tx_amp_backoff_dB = 12; # needs to match O-RU configuration
+  L1_rx_thread_core = 8;
+  L1_tx_thread_core = 10; # relevant after merge of l1_tx_thread
+  phase_compensation = 0; # needs to match O-RU configuration
+}
+);
+
+RUs = (
+{
+  local_rf       = "no";
+  nb_tx          = 4;
+  nb_rx          = 4;
+  att_tx         = 0;
+  att_rx         = 0;
+  bands          = [77];
+  max_pdschReferenceSignalPower = -27;
+  max_rxgain                    = 75;
+  sf_extension                  = 0;
+  eNB_instances  = [0];
+  ru_thread_core = 9;
+  sl_ahead       = 5;
+  tr_preference  = "raw_if4p5"; # important: activate FHI7.2
+  do_precoding   = 0; # needs to match O-RU configuration
+}
+);
+
+log_config :
+{
+  global_log_level = "info";
+  hw_log_level     = "info";
+  phy_log_level    = "info";
+  mac_log_level    = "info";
+  rlc_log_level    = "info";
+  pdcp_log_level   = "info";
+  rrc_log_level    = "info";
+  ngap_log_level   = "info";
+  f1ap_log_level   = "info";
+};
+
+fhi_72 = {
+  dpdk_devices = ("0000:c1:11.0", "0000:c1:11.1"); # one VF can be used as well
+  system_core = 0;
+  io_core = 1;
+  worker_cores = (2);
+  ru_addr = ("8c:1f:64:d1:10:46","8c:1f:64:d1:10:46");
+  mtu = 9600;
+  fh_config = ({
+    Tadv_cp_dl = 125;
+    T2a_cp_dl = (259, 500);
+    T2a_cp_ul = (25, 500);
+    T2a_up = (134, 375);
+    Ta3 = (152, 160);
+    T1a_cp_dl = (419, 470);
+    T1a_cp_ul = (285, 336);
+    T1a_up = (294, 345);
+    Ta4 = (0, 200);
+    ru_config = {
+      iq_width = 9;
+      iq_width_prach = 9;
+    };
+  });
+};
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band78.106prb.fhi72.8x8-benetel-650-550.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650.conf
similarity index 82%
rename from targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band78.106prb.fhi72.8x8-benetel-650-550.conf
rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650.conf
index 9c26f76d9e7fe510f62a3ad643e5868609bda094..fa54c074243ac0f7241166dc7ae2ee0e7458ade2 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band78.106prb.fhi72.8x8-benetel-650-550.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-du.sa.band77.273prb.fhi72.8x8-benetel650_650.conf
@@ -22,10 +22,11 @@ gNBs =
     pdsch_AntennaPorts_N1 = 2;
     pusch_AntennaPorts    = 8;
     do_CSIRS              = 1;
-    do_SRS                = 0 ;
-    sib1_tda			  = 15;
-#    force_UL256qam_off    = 1;
-    maxMIMO_layers         = 2;
+    do_SRS                = 0;
+    sib1_tda			        = 15;
+    force_UL256qam_off    = 1;
+    maxMIMO_layers        = 2;
+
     pdcch_ConfigSIB1 = (
       {
         controlResourceSetZero = 11;
@@ -41,20 +42,21 @@ gNBs =
      # n_TimingAdvanceOffset                                         = 0;
 #  downlinkConfigCommon
     #frequencyInfoDL
-    # this is 3430.56 MHz (center frequency)
-      absoluteFrequencySSB                                          = 628704;
-      dl_frequencyBand                                              = 78;
-    # this is 3411.48 MHz
-      dl_absoluteFrequencyPointA                                    = 627432;
+      # center frequency = 3950.4 MHz
+      # selected SSB frequency = 3950.4 MHz
+      absoluteFrequencySSB                                          = 663360;
+      dl_frequencyBand                                              = 77;
+      # frequency point A = 3901.26 MHz
+      dl_absoluteFrequencyPointA                                    = 660084;
       #scs-SpecificCarrierList
         dl_offstToCarrier                                           = 0;
 # subcarrierSpacing
 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
         dl_subcarrierSpacing                                        = 1;
-        dl_carrierBandwidth                                         = 106;
+        dl_carrierBandwidth                                         = 273;
      #initialDownlinkBWP
       #genericParameters
-       initialDLBWPlocationAndBandwidth                             = 28875; #38.101-1 Table 5.3.2-1
+       initialDLBWPlocationAndBandwidth                             = 1099; #38.101-1 Table 5.3.2-1
        #
 # subcarrierSpacing
 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
@@ -65,23 +67,23 @@ gNBs =
 
   #uplinkConfigCommon
      #frequencyInfoUL
-      ul_frequencyBand                                              = 78;
+      ul_frequencyBand                                              = 77;
       #scs-SpecificCarrierList
       ul_offstToCarrier                                             = 0;
 # subcarrierSpacing
 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
       ul_subcarrierSpacing                                          = 1;
-      ul_carrierBandwidth                                           = 106;
+      ul_carrierBandwidth                                           = 273;
       pMax                                                          = 23;
      #initialUplinkBWP
       #genericParameters
-        initialULBWPlocationAndBandwidth                            = 28875;
+        initialULBWPlocationAndBandwidth                            = 1099;
 # subcarrierSpacing
 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
         initialULBWPsubcarrierSpacing                               = 1;
       #rach-ConfigCommon
         #rach-ConfigGeneric
-          prach_ConfigurationIndex                                  = 154;
+          prach_ConfigurationIndex                                  = 151;
 #prach_msg1_FDM
 #0 = one, 1=two, 2=four, 3=eight
           prach_msg1_FDM                                            = 0;
@@ -127,7 +129,7 @@ gNBs =
         hoppingId                                                   = 0;
         p0_nominal                                                  = -96;
 
-      ssb_PositionsInBurst_Bitmap                                   = 0x10001L;
+      ssb_PositionsInBurst_Bitmap                                   = 0x1;
 
 # ssb_periodicityServingCell
 # 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
@@ -142,16 +144,20 @@ gNBs =
       subcarrierSpacing                                             = 1;
 
 
-#tdd-UL-DL-ConfigurationCommon
-# 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10 8=ms3 9=ms4
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
       referenceSubcarrierSpacing                                    = 1;
-      dl_UL_TransmissionPeriodicity = 8;
-      nrofDownlinkSlots = 3;
-      nrofDownlinkSymbols = 6;
-      nrofUplinkSlots = 2;
-      nrofUplinkSymbols = 4;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 5;
+      nrofDownlinkSlots                                             = 3;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 1;
+      nrofUplinkSymbols                                             = 4;
 
-    ssPBCH_BlockPower                                                 = 10;
+    ssPBCH_BlockPower                                               = 10;
   }
 
   );
@@ -180,14 +186,15 @@ MACRLCs = (
   local_n_portd               = 2153;
   remote_n_portc              = 501;
   remote_n_portd              = 2153;
-  pusch_TargetSNRx10          = 230;
-  pucch_TargetSNRx10          = 270;
-  dl_bler_target_upper = .35;
-  dl_bler_target_lower = .15;
-  ul_bler_target_upper = .35;
-  ul_bler_target_lower = .15;
+  pusch_TargetSNRx10          = 120;
+  pucch_TargetSNRx10          = 200;
+  dl_bler_target_upper        = .35;
+  dl_bler_target_lower        = .15;
+  ul_bler_target_upper        = .35;
+  ul_bler_target_lower        = .15;
   pusch_FailureThres          = 100;
   ul_max_mcs                  = 28;
+  min_grant_prb               = 1;
 }
 );
 
@@ -211,18 +218,17 @@ RUs = (
   local_rf       = "no";
   nb_tx          = 8;
   nb_rx          = 8;
-  att_tx         = 0
+  att_tx         = 0;
   att_rx         = 0;
-  bands          = [78];
+  bands          = [77];
   max_pdschReferenceSignalPower = -27;
   max_rxgain                    = 75;
   sf_extension                  = 0;
   eNB_instances  = [0];
   ru_thread_core = 9;
   sl_ahead       = 10;
-  clock_src = "internal";
   tr_preference  = "raw_if4p5"; # important: activate FHI7.2
-  do_precoding = 0; # needs to match O-RU configuration
+  do_precoding   = 0; # needs to match O-RU configuration
 }
 );
 
@@ -233,21 +239,22 @@ log_config :
   phy_log_level    = "info";
   mac_log_level    = "info";
   rlc_log_level    = "info";
+  pdcp_log_level   = "info";
+  rrc_log_level    = "info";
+  ngap_log_level   = "info";
   f1ap_log_level   = "info";
 };
 
 fhi_72 = {
-  dpdk_devices = ("0000:01:01.0", "0000:01:01.1", "0000:01:01.2", "0000:01:01.3");
+  dpdk_devices = ("0000:01:01.0", "0000:01:01.1", "0000:01:01.2", "0000:01:01.3"); # two VFs can be used as well
   system_core = 0;
   io_core = 1;
   worker_cores = (2);
-  du_addr = ("00:11:22:33:44:66","00:11:22:33:44:67","00:11:22:33:44:68","00:11:22:33:44:69");
-  ru_addr = ("70:b3:d5:e1:5b:ff","70:b3:d5:e1:5b:ff","70:b3:d5:e1:5b:81", "70:b3:d5:e1:5b:81");
-  mtu = 9216;
-  file_prefix = "fhi_72";
+  ru_addr = ("8c:1f:64:d1:10:46","8c:1f:64:d1:10:46","8c:1f:64:d1:10:43","8c:1f:64:d1:10:43"); # if two VFs, set two RU MAC addresses (one per RU)
+  mtu = 9600;
   fh_config = (
-# RAN650
-   {
+# RAN650 #1
+  {
     Tadv_cp_dl = 125;
     T2a_cp_dl = (259, 500);
     T2a_cp_ul = (25, 500);
@@ -261,11 +268,8 @@ fhi_72 = {
       iq_width = 9;
       iq_width_prach = 9;
     };
-    prach_config = {
-      eAxC_offset = 4;
-    };
   },
-# RAN550
+# RAN650 #2
   {
     Tadv_cp_dl = 125;
     T2a_cp_dl = (259, 500);
@@ -280,8 +284,5 @@ fhi_72 = {
       iq_width = 9;
       iq_width_prach = 9;
     };
-    prach_config = {
-      eAxC_offset = 4;
-    };
   });
 };
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf
new file mode 100644
index 0000000000000000000000000000000000000000..8f9d6460c78cb8e54864a83fabbdb4aa3a53d6b2
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.106prb.fhi72.4x4-vvdn.conf
@@ -0,0 +1,286 @@
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+    gNB_name  =  "gNB-OAI";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+    plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ( { sst = 1; }); });
+
+    nr_cellid = 1;
+
+    ////////// Physical parameters:
+
+    pdsch_AntennaPorts_XP = 2;
+    pdsch_AntennaPorts_N1 = 2;
+    maxMIMO_layers        = 2;
+    pusch_AntennaPorts    = 4;
+    do_CSIRS              = 1;
+    do_SRS                = 0;
+    sib1_tda			        = 15;
+
+    pdcch_ConfigSIB1 = (
+      {
+        controlResourceSetZero = 11;
+        searchSpaceZero = 0;
+      }
+    );
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+     # n_TimingAdvanceOffset                                         = 0;
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # center frequency = 3999.36 MHz
+      # selected SSB frequency = 3999.36 MHz
+      absoluteFrequencySSB                                          = 666624;
+      dl_frequencyBand                                              = 77;
+      # frequency point A = 3980.28 MHz
+      dl_absoluteFrequencyPointA                                    = 665352;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                           = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        dl_subcarrierSpacing                                        = 1;
+        dl_carrierBandwidth                                         = 106;
+     #initialDownlinkBWP
+      #genericParameters
+       initialDLBWPlocationAndBandwidth                             = 28875; #38.101-1 Table 5.3.2-1
+       #
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                               = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                          = 11;
+        initialDLBWPsearchSpaceZero                                 = 0;
+
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                              = 77;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                             = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                          = 1;
+      ul_carrierBandwidth                                           = 106;
+      pMax                                                          = 23;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                            = 28875;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                               = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 159;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 0;
+          preambleReceivedTargetPower                               = -100;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 7;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 2;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 5;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #
+        msg1_SubcarrierSpacing                                      = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+
+# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB
+        msg3_DeltaPreamble                                          = 2;
+        p0_NominalWithGrant                                         = -100;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 0;
+        p0_nominal                                                  = -96;
+
+      ssb_PositionsInBurst_Bitmap                                   = 0x1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 1;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 5;
+      nrofDownlinkSlots                                             = 3;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 1;
+      nrofUplinkSymbols                                             = 4;
+
+  ssPBCH_BlockPower                                                 = 0;
+  }
+
+  );
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// AMF parameters:
+    amf_ip_address = ({ ipv4 = "172.21.6.5"; });
+
+    NETWORK_INTERFACES :
+    {
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "172.21.16.51";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "172.21.16.51";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+  }
+);
+
+MACRLCs = (
+{
+  num_cc                      = 1;
+  tr_s_preference             = "local_L1";
+  tr_n_preference             = "local_RRC";
+  pusch_TargetSNRx10          = 200;
+  pucch_TargetSNRx10          = 200;
+ # dl_bler_target_upper        = .35;
+ # dl_bler_target_lower        = .15;
+  ul_bler_target_upper        = .35;
+  ul_bler_target_lower        = .15;
+  pusch_FailureThres          = 100;
+}
+);
+
+L1s = (
+{
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  prach_dtx_threshold = 110;
+  pucch0_dtx_threshold = 80;
+  pusch_dtx_threshold = -100;
+ # thread_pool_size = 8;
+  tx_amp_backoff_dB = 3;
+  L1_rx_thread_core = 8;
+  L1_tx_thread_core = 10;
+  phase_compensation = 0; # needs to match O-RU configuration
+}
+);
+
+RUs = (
+{
+  local_rf       = "no";
+  nb_tx          = 4;
+  nb_rx          = 4;
+  att_tx         = 0;
+  att_rx         = 0;
+  bands          = [77];
+  max_pdschReferenceSignalPower = -27;
+  max_rxgain                    = 75;
+  sf_extension                  = 0;
+  eNB_instances  = [0];
+  ru_thread_core = 9;
+  sl_ahead       = 5;
+  tr_preference  = "raw_if4p5"; # important: activate FHI7.2
+  do_precoding   = 0; # needs to match O-RU configuration
+}
+);
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering = "yes";
+  drb_integrity = "no";
+};
+
+log_config :
+{
+  global_log_level = "info";
+  hw_log_level     = "info";
+  phy_log_level    = "info";
+  mac_log_level    = "info";
+  rlc_log_level    = "info";
+  pdcp_log_level   = "info";
+  rrc_log_level    = "info";
+  ngap_log_level   = "info";
+  f1ap_log_level   = "info";
+};
+
+fhi_72 = {
+  dpdk_devices = ("0000:c1:11.0", "0000:c1:11.1"); # one VF can be used as well
+  system_core = 0;
+  io_core = 1;
+  worker_cores = (2);
+  ru_addr = ("98:ae:71:01:c5:eb", "98:ae:71:01:c5:eb");
+  mtu = 9600;
+  fh_config = ({
+    Tadv_cp_dl = 125;
+    T2a_cp_dl = (285, 429);
+    T2a_cp_ul = (285, 429);
+    T2a_up = (125, 428);
+    Ta3 = (130, 170);
+    T1a_cp_dl = (285, 470);
+    T1a_cp_ul = (285, 429);
+    T1a_up = (125, 350);
+    Ta4 = (110, 180);
+    ru_config = {
+      iq_width = 9;
+      iq_width_prach = 9;
+    };
+  });
+};
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf
new file mode 100644
index 0000000000000000000000000000000000000000..ab97c214e23ef3f5fa8f16597ef789e07f7cc82f
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.2x2-vvdn.conf
@@ -0,0 +1,283 @@
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+    gNB_name  =  "gNB-OAI";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+    plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ( { sst = 1; }); });
+
+    nr_cellid = 1;
+
+    ////////// Physical parameters:
+
+    pdsch_AntennaPorts_XP = 2;
+    pusch_AntennaPorts    = 2;
+    do_CSIRS              = 1;
+    do_SRS                = 0;
+    sib1_tda			        = 15;
+
+    pdcch_ConfigSIB1 = (
+      {
+        controlResourceSetZero = 11;
+        searchSpaceZero = 0;
+      }
+    );
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+     # n_TimingAdvanceOffset                                         = 0;
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # center frequency = 3999.36 MHz
+      # selected SSB frequency = 3999.36 MHz
+      absoluteFrequencySSB                                          = 666624;
+      dl_frequencyBand                                              = 77;
+      # frequency point A = 3950.22 MHz
+      dl_absoluteFrequencyPointA                                    = 663348;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                           = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        dl_subcarrierSpacing                                        = 1;
+        dl_carrierBandwidth                                         = 273;
+     #initialDownlinkBWP
+      #genericParameters
+       initialDLBWPlocationAndBandwidth                             = 1099; #38.101-1 Table 5.3.2-1
+       #
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                               = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                          = 11;
+        initialDLBWPsearchSpaceZero                                 = 0;
+
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                              = 77;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                             = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                          = 1;
+      ul_carrierBandwidth                                           = 273;
+      pMax                                                          = 23;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                            = 1099;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                               = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 159;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 0;
+          preambleReceivedTargetPower                               = -100;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 7;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 2;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 5;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #
+        msg1_SubcarrierSpacing                                      = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+
+# this is the offset between the last PRACH preamble power and the Msg3 PUSCH, 2 times the field value in dB
+        msg3_DeltaPreamble                                          = 2;
+        p0_NominalWithGrant                                         = -100;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 0;
+        p0_nominal                                                  = -96;
+
+      ssb_PositionsInBurst_Bitmap                                   = 0x1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 1;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 5;
+      nrofDownlinkSlots                                             = 3;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 1;
+      nrofUplinkSymbols                                             = 4;
+
+  ssPBCH_BlockPower                                                 = 0;
+  }
+  );
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// AMF parameters:
+    amf_ip_address = ({ ipv4 = "172.21.6.5"; });
+
+    NETWORK_INTERFACES :
+    {
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "172.21.16.51";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "172.21.16.51";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+  }
+);
+
+MACRLCs = (
+{
+  num_cc                      = 1;
+  tr_s_preference             = "local_L1";
+  tr_n_preference             = "local_RRC";
+  pusch_TargetSNRx10          = 180;
+  pucch_TargetSNRx10          = 250;
+ # dl_bler_target_upper        = .35;
+ # dl_bler_target_lower        = .15;
+  ul_bler_target_upper        = .35;
+  ul_bler_target_lower        = .15;
+  pusch_FailureThres          = 100;
+}
+);
+
+L1s = (
+{
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  prach_dtx_threshold = 130
+  pucch0_dtx_threshold = 80;
+  pusch_dtx_threshold = -100;
+ # thread_pool_size = 8;
+  tx_amp_backoff_dB = 3;
+  L1_rx_thread_core = 8;
+  L1_tx_thread_core = 10;
+  phase_compensation = 0; # needs to match O-RU configuration
+}
+);
+
+RUs = (
+{
+  local_rf       = "no";
+  nb_tx          = 2;
+  nb_rx          = 2;
+  att_tx         = 0;
+  att_rx         = 0;
+  bands          = [77];
+  max_pdschReferenceSignalPower = -27;
+  max_rxgain                    = 75;
+  sf_extension                  = 0;
+  eNB_instances  = [0];
+  ru_thread_core = 9;
+  sl_ahead       = 5;
+  tr_preference  = "raw_if4p5"; # important: activate FHI7.2
+  do_precoding   = 0; # needs to match O-RU configuration
+}
+);
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering = "yes";
+  drb_integrity = "no";
+};
+
+log_config :
+{
+  global_log_level = "info";
+  hw_log_level     = "info";
+  phy_log_level    = "info";
+  mac_log_level    = "info";
+  rlc_log_level    = "info";
+  pdcp_log_level   = "info";
+  rrc_log_level    = "info";
+  ngap_log_level   = "info";
+  f1ap_log_level   = "info";
+};
+
+fhi_72 = {
+  dpdk_devices = ("0000:c1:11.0", "0000:c1:11.1"); # one VF can be used as well
+  system_core = 0;
+  io_core = 1;
+  worker_cores = (2);
+  ru_addr = ("98:ae:71:01:c5:eb", "98:ae:71:01:c5:eb");
+  mtu = 9600;
+  fh_config = ({
+    Tadv_cp_dl = 125;
+    T2a_cp_dl = (285, 429);
+    T2a_cp_ul = (285, 429);
+    T2a_up = (125, 428);
+    Ta3 = (130, 170);
+    T1a_cp_dl = (285, 470);
+    T1a_cp_ul = (285, 429);
+    T1a_up = (125, 350);
+    Ta4 = (110, 180);
+    ru_config = {
+      iq_width = 16;
+      iq_width_prach = 16;
+    };
+  });
+};
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf
index 254f3cfe9070e2761abf4dcf380b94704fd63aae..2954e6e096516820a074e98bdfaf851ccccf9767 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.273prb.fhi72.4x4-vvdn.conf
@@ -13,18 +13,17 @@ gNBs =
     tracking_area_code  =  1;
     plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ( { sst = 1; }); });
 
-    //nr_cellid = 12345678L;
     nr_cellid = 1;
 
     ////////// Physical parameters:
 
-    pdsch_AntennaPorts_XP = 2; 
+    pdsch_AntennaPorts_XP = 2;
     pdsch_AntennaPorts_N1 = 2;
     maxMIMO_layers        = 2;
-    pusch_AntennaPorts    = 4; 
+    pusch_AntennaPorts    = 4;
     do_CSIRS              = 1;
-    do_SRS                = 0 ;
-    sib1_tda			  = 15;
+    do_SRS                = 0;
+    sib1_tda			        = 15;
 
     pdcch_ConfigSIB1 = (
       {
@@ -41,10 +40,11 @@ gNBs =
      # n_TimingAdvanceOffset                                         = 0;
 #  downlinkConfigCommon
     #frequencyInfoDL
-      # this is 3450.72 MHz (center frequency)
+      # center frequency = 3999.36 MHz
+      # selected SSB frequency = 3999.36 MHz
       absoluteFrequencySSB                                          = 666624;
       dl_frequencyBand                                              = 77;
-      # this is 3401.58 MHz
+      # frequency point A = 3950.22 MHz
       dl_absoluteFrequencyPointA                                    = 663348;
       #scs-SpecificCarrierList
         dl_offstToCarrier                                           = 0;
@@ -157,7 +157,6 @@ gNBs =
 
   ssPBCH_BlockPower                                                 = 0;
   }
-
   );
 
 
@@ -175,8 +174,8 @@ gNBs =
 
     NETWORK_INTERFACES :
     {
-        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "172.21.16.108/22";
-        GNB_IPV4_ADDRESS_FOR_NGU                 = "172.21.16.108/22";
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "172.21.16.51";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "172.21.16.51";
         GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
     };
   }
@@ -187,12 +186,12 @@ MACRLCs = (
   num_cc                      = 1;
   tr_s_preference             = "local_L1";
   tr_n_preference             = "local_RRC";
-  pusch_TargetSNRx10          = 300;
-  pucch_TargetSNRx10          = 200;
- # dl_bler_target_upper=.35;
- # dl_bler_target_lower=.15; 
-  ul_bler_target_upper=.35;
-  ul_bler_target_lower=.15;
+  pusch_TargetSNRx10          = 180;
+  pucch_TargetSNRx10          = 250;
+ # dl_bler_target_upper        = .35;
+ # dl_bler_target_lower        = .15; 
+  ul_bler_target_upper        = .35;
+  ul_bler_target_lower        = .15;
   pusch_FailureThres          = 100;
 }
 );
@@ -204,7 +203,7 @@ L1s = (
   prach_dtx_threshold = 130
   pucch0_dtx_threshold = 80;
   pusch_dtx_threshold = -100;
-#thread_pool_size = 8;
+ # thread_pool_size = 8;
   tx_amp_backoff_dB = 3;
   L1_rx_thread_core = 8;
   L1_tx_thread_core = 10;
@@ -217,30 +216,20 @@ RUs = (
   local_rf       = "no";
   nb_tx          = 4;
   nb_rx          = 4;
-  att_tx         = 0
+  att_tx         = 0;
   att_rx         = 0;
   bands          = [77];
   max_pdschReferenceSignalPower = -27;
   max_rxgain                    = 75;
   sf_extension                  = 0;
   eNB_instances  = [0];
-  ru_thread_core = 6;
+  ru_thread_core = 9;
   sl_ahead       = 5;
-  clock_src = "internal";
   tr_preference  = "raw_if4p5"; # important: activate FHI7.2
-  do_precoding = 0; # needs to match O-RU configuration
+  do_precoding   = 0; # needs to match O-RU configuration
 }
 );
 
-rfsimulator :
-{
-  serveraddr = "server";
-  serverport = "4043";
-  options = (); #("saviq"); or/and "chanmod"
-  modelname = "AWGN";
-  IQfile = "/tmp/rfsimulator.iqs";
-};
-
 security = {
   # preferred ciphering algorithms
   # the first one of the list that an UE supports in chosen
@@ -258,7 +247,8 @@ security = {
   drb_integrity = "no";
 };
 
-log_config : {
+log_config :
+{
   global_log_level = "info";
   hw_log_level     = "info";
   phy_log_level    = "info";
@@ -271,29 +261,25 @@ log_config : {
 };
 
 fhi_72 = {
-  dpdk_devices = ("0000:31:06.0", "0000:31:06.1");
+  dpdk_devices = ("0000:c1:11.0", "0000:c1:11.1"); # one VF can be used as well
   system_core = 0;
-  io_core = 4;
+  io_core = 1;
   worker_cores = (2);
-  du_addr = ("76:76:64:6e:00:01", "76:76:64:6e:00:01");
   ru_addr = ("98:ae:71:01:c5:eb", "98:ae:71:01:c5:eb");
-  mtu = 9216; # check if xran uses this properly
+  mtu = 9600;
   fh_config = ({
     Tadv_cp_dl = 125;
-    T2a_cp_dl = (285, 429); # (min, max)
-    T2a_cp_ul = (285, 429); # (min, max)
-    T2a_up = (125, 428); # (min, max)
-    Ta3 = (130, 170); # (min, max)
-    T1a_cp_dl = (285, 470); # (min, max)
-    T1a_cp_ul = (285, 429); # (min, max)
-    T1a_up = (125, 350); # (min, max)
-    Ta4 = (110, 180); # (min, max)
+    T2a_cp_dl = (285, 429);
+    T2a_cp_ul = (285, 429);
+    T2a_up = (125, 428);
+    Ta3 = (130, 170);
+    T1a_cp_dl = (285, 470);
+    T1a_cp_ul = (285, 429);
+    T1a_up = (125, 350);
+    Ta4 = (110, 180);
     ru_config = {
       iq_width = 9;
       iq_width_prach = 9;
     };
-    prach_config = {
-      eAxC_offset = 4;
-    };
   });
 };
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf
similarity index 85%
rename from targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf
rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf
index 767c55188153634501e6cd10945baf65e39cbcdd..2c25a6334891d97541664a39575693ff29a8d006 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel650.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x2-benetel550.conf
@@ -11,20 +11,18 @@ gNBs =
 
     // Tracking area code, 0x0000 and 0xfffe are reserved values
     tracking_area_code  =  1;
-    plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ( { sst = 1;}); });
+    plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ( { sst = 1; }); });
 
     nr_cellid = 1;
 
     ////////// Physical parameters:
 
-    pdsch_AntennaPorts_XP = 2; 
-    pdsch_AntennaPorts_N1 = 2;
-    maxMIMO_layers        = 2;
-    pusch_AntennaPorts    = 4;
+    pdsch_AntennaPorts_XP = 2;
+    pusch_AntennaPorts    = 2;
     do_CSIRS              = 1;
-    do_SRS                = 0 ;
-    sib1_tda			  = 15;
-    #force_UL256qam_off    = 1;
+    do_SRS                = 0;
+    sib1_tda			        = 15;
+   # force_UL256qam_off    = 1;
 
     pdcch_ConfigSIB1 = (
       {
@@ -41,11 +39,12 @@ gNBs =
      # n_TimingAdvanceOffset                                         = 0;
 #  downlinkConfigCommon
     #frequencyInfoDL
-      # this is 3450.72 MHz (center frequency)
+      # center frequency = 3350.01 MHz
+      # selected SSB frequency = 3349.92 MHz
       absoluteFrequencySSB                                          = 623328;
       dl_frequencyBand                                              = 78;
-      # this is 3401.58 MHz
-      dl_absoluteFrequencyPointA                                    = 620052;
+      # frequency point A = 3300.87 MHz
+      dl_absoluteFrequencyPointA                                    = 620058;
       #scs-SpecificCarrierList
         dl_offstToCarrier                                           = 0;
 # subcarrierSpacing
@@ -155,11 +154,11 @@ gNBs =
       nrofUplinkSlots                                               = 2;
       nrofUplinkSymbols                                             = 4;
 
-  ssPBCH_BlockPower                                                 = 10;
+  ssPBCH_BlockPower                                                 = 0;
   }
-
   );
 
+
     # ------- SCTP definitions
     SCTP :
     {
@@ -181,23 +180,22 @@ gNBs =
   }
 );
 
-
 MACRLCs = (
 {
   num_cc                      = 1;
   tr_s_preference             = "local_L1";
   tr_n_preference             = "local_RRC";
-  pusch_TargetSNRx10          = 230;
-  pucch_TargetSNRx10          = 230;
-  dl_bler_target_upper=.35;
-  dl_bler_target_lower=.15; 
-  ul_bler_target_upper=.35;
-  ul_bler_target_lower=.15;
-  pusch_FailureThres          = 100;
+  pusch_TargetSNRx10          = 180;
+  pucch_TargetSNRx10          = 220;
+  dl_bler_target_upper        = .35;
+  dl_bler_target_lower        = .15;
+  ul_bler_target_upper        = .35;
+  ul_bler_target_lower        = .15;
+  pusch_FailureThres          = 1000;
+  ul_max_mcs                  = 28;
 }
 );
 
-
 L1s = (
 {
   num_cc = 1;
@@ -205,10 +203,10 @@ L1s = (
   prach_dtx_threshold = 100;
   pucch0_dtx_threshold = 80;
   pusch_dtx_threshold = 10;
-  max_ldpc_iterations = 10;
+  max_ldpc_iterations = 15;
   tx_amp_backoff_dB = 12; # needs to match O-RU configuration
   L1_rx_thread_core = 8;
-  L1_tx_thread_core = 10; # relevant after merge of l1_tx_thread
+  L1_tx_thread_core = 10;
   phase_compensation = 0; # needs to match O-RU configuration
 }
 );
@@ -217,8 +215,8 @@ RUs = (
 {
   local_rf       = "no";
   nb_tx          = 4;
-  nb_rx          = 4;
-  att_tx         = 0
+  nb_rx          = 2;
+  att_tx         = 0;
   att_rx         = 0;
   bands          = [78];
   max_pdschReferenceSignalPower = -27;
@@ -228,7 +226,7 @@ RUs = (
   ru_thread_core = 9;
   sl_ahead       = 10;
   tr_preference  = "raw_if4p5"; # important: activate FHI7.2
-  do_precoding = 0; # needs to match O-RU configuration
+  do_precoding   = 0; # needs to match O-RU configuration
 }
 );
 
@@ -251,26 +249,24 @@ security = {
 
 log_config :
 {
-  global_log_level                      ="info";
-  hw_log_level                          ="info";
-  phy_log_level                         ="info";
-  mac_log_level                         ="info";
-  rlc_log_level                         ="info";
-  pdcp_log_level                        ="info";
-  rrc_log_level                         ="info";
-  ngap_log_level                        ="info";
-  f1ap_log_level                        ="info";
+  global_log_level = "info";
+  hw_log_level     = "info";
+  phy_log_level    = "info";
+  mac_log_level    = "info";
+  rlc_log_level    = "info";
+  pdcp_log_level   = "info";
+  rrc_log_level    = "info";
+  ngap_log_level   = "info";
+  f1ap_log_level   = "info";
 };
 
 fhi_72 = {
-  dpdk_devices = ("0000:c1:11.0", "0000:c1:11.1");
+  dpdk_devices = ("0000:c1:11.0", "0000:c1:11.1"); # one VF can be used as well
   system_core = 0;
   io_core = 1;
   worker_cores = (2);
-  du_addr = ("00:11:22:33:44:66", "00:11:22:33:44:67");
-  ru_addr = ("70:b3:d5:e1:5b:ff", "70:b3:d5:e1:5b:ff");
-  mtu = 9216;
-  file_prefix = "fhi_72";
+  ru_addr = ("70:b3:d5:e1:5b:81", "70:b3:d5:e1:5b:81");
+  mtu = 9600;
   fh_config = ({
     Tadv_cp_dl = 125;
     T2a_cp_dl = (259, 500);
@@ -285,8 +281,5 @@ fhi_72 = {
       iq_width = 9;
       iq_width_prach = 9;
     };
-    prach_config = {
-      eAxC_offset = 4;
-    };
   });
 };
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf
index a8f072a1992a9d9be8660ffb313f14ed8f5f6b35..ba96da73ce5a506bbb36277728d449a65951741b 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-benetel550.conf
@@ -11,20 +11,20 @@ gNBs =
 
     // Tracking area code, 0x0000 and 0xfffe are reserved values
     tracking_area_code  =  1;
-    plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ( { sst = 1; }); });
+    plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ( { sst = 1; }); });
 
     nr_cellid = 1;
 
     ////////// Physical parameters:
 
-    pdsch_AntennaPorts_XP = 2; 
+    pdsch_AntennaPorts_XP = 2;
     pdsch_AntennaPorts_N1 = 2;
     maxMIMO_layers        = 2;
-    pusch_AntennaPorts    = 4; 
+    pusch_AntennaPorts    = 4;
     do_CSIRS              = 1;
-    do_SRS                = 0 ;
-    sib1_tda			  = 15;
-#    force_UL256qam_off    = 1;
+    do_SRS                = 0;
+    sib1_tda			        = 15;
+   # force_UL256qam_off    = 1;
 
     pdcch_ConfigSIB1 = (
       {
@@ -41,11 +41,12 @@ gNBs =
      # n_TimingAdvanceOffset                                         = 0;
 #  downlinkConfigCommon
     #frequencyInfoDL
-      # this is 3450.72 MHz (center frequency)
+      # center frequency = 3350.01 MHz
+      # selected SSB frequency = 3349.92 MHz
       absoluteFrequencySSB                                          = 623328;
       dl_frequencyBand                                              = 78;
-      # this is 3401.58 MHz
-      dl_absoluteFrequencyPointA                                    = 620052;
+      # frequency point A = 3300.87 MHz
+      dl_absoluteFrequencyPointA                                    = 620058;
       #scs-SpecificCarrierList
         dl_offstToCarrier                                           = 0;
 # subcarrierSpacing
@@ -157,7 +158,6 @@ gNBs =
 
   ssPBCH_BlockPower                                                 = 0;
   }
-
   );
 
 
@@ -187,12 +187,12 @@ MACRLCs = (
   num_cc                      = 1;
   tr_s_preference             = "local_L1";
   tr_n_preference             = "local_RRC";
-  pusch_TargetSNRx10          = 230;
-  pucch_TargetSNRx10          = 250;
-  dl_bler_target_upper=.35;
-  dl_bler_target_lower=.15; 
-  ul_bler_target_upper=.35;
-  ul_bler_target_lower=.15;
+  pusch_TargetSNRx10          = 180;
+  pucch_TargetSNRx10          = 220;
+  dl_bler_target_upper        = .35;
+  dl_bler_target_lower        = .15; 
+  ul_bler_target_upper        = .35;
+  ul_bler_target_lower        = .15;
   pusch_FailureThres          = 1000;
   ul_max_mcs                  = 28;
 }
@@ -218,7 +218,7 @@ RUs = (
   local_rf       = "no";
   nb_tx          = 4;
   nb_rx          = 4;
-  att_tx         = 0
+  att_tx         = 0;
   att_rx         = 0;
   bands          = [78];
   max_pdschReferenceSignalPower = -27;
@@ -228,7 +228,7 @@ RUs = (
   ru_thread_core = 9;
   sl_ahead       = 10;
   tr_preference  = "raw_if4p5"; # important: activate FHI7.2
-  do_precoding = 0; # needs to match O-RU configuration
+  do_precoding   = 0; # needs to match O-RU configuration
 }
 );
 
@@ -251,26 +251,24 @@ security = {
 
 log_config :
 {
-  global_log_level                      ="info";
-  hw_log_level                          ="info";
-  phy_log_level                         ="info";
-  mac_log_level                         ="info";
-  rlc_log_level                         ="info";
-  pdcp_log_level                        ="info";
-  rrc_log_level                         ="info";
-  ngap_log_level                        ="info";
-  f1ap_log_level                        ="info";
+  global_log_level = "info";
+  hw_log_level     = "info";
+  phy_log_level    = "info";
+  mac_log_level    = "info";
+  rlc_log_level    = "info";
+  pdcp_log_level   = "info";
+  rrc_log_level    = "info";
+  ngap_log_level   = "info";
+  f1ap_log_level   = "info";
 };
 
 fhi_72 = {
-  dpdk_devices = ("0000:c1:11.0", "0000:c1:11.1");
+  dpdk_devices = ("0000:c1:11.0", "0000:c1:11.1"); # one VF can be used as well
   system_core = 0;
   io_core = 1;
   worker_cores = (2);
-  du_addr = ("00:11:22:33:44:66", "00:11:22:33:44:67");
   ru_addr = ("70:b3:d5:e1:5b:81", "70:b3:d5:e1:5b:81");
-  mtu = 9216;
-  file_prefix = "fhi_72";
+  mtu = 9600;
   fh_config = ({
     Tadv_cp_dl = 125;
     T2a_cp_dl = (259, 500);
@@ -285,8 +283,5 @@ fhi_72 = {
       iq_width = 9;
       iq_width_prach = 9;
     };
-    prach_config = {
-      eAxC_offset = 4;
-    };
   });
 };
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf
index 2cc2cbeee774200acdf0bde84f1754984ce555e9..f1698391a0e5409e2c3e289c8015621579203cc7 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-liteon.conf
@@ -17,13 +17,13 @@ gNBs =
 
     ////////// Physical parameters:
 
-    pdsch_AntennaPorts_XP = 2; 
+    pdsch_AntennaPorts_XP = 2;
     pdsch_AntennaPorts_N1 = 2;
     maxMIMO_layers        = 2;
-    pusch_AntennaPorts    = 4; 
+    pusch_AntennaPorts    = 4;
     do_CSIRS              = 1;
-    do_SRS                = 0 ;
-    sib1_tda			  = 15;
+    do_SRS                = 0;
+    sib1_tda			        = 15;
 
     pdcch_ConfigSIB1 = (
       {
@@ -40,10 +40,11 @@ gNBs =
      # n_TimingAdvanceOffset                                         = 0;
 #  downlinkConfigCommon
     #frequencyInfoDL
-      # this is 3450.72 MHz (center frequency)
+      # center frequency = 3450.72 MHz
+      # selected SSB frequency = 3450.72 MHz
       absoluteFrequencySSB                                          = 630048;
       dl_frequencyBand                                              = 78;
-      # this is 3401.58 MHz
+      # frequency point A = 3401.58 MHz
       dl_absoluteFrequencyPointA                                    = 626772;
       #scs-SpecificCarrierList
         dl_offstToCarrier                                           = 0;
@@ -156,7 +157,6 @@ gNBs =
 
   ssPBCH_BlockPower                                                 = 0;
   }
-
   );
 
 
@@ -174,8 +174,8 @@ gNBs =
 
     NETWORK_INTERFACES :
     {
-        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "172.21.16.108/22";
-        GNB_IPV4_ADDRESS_FOR_NGU                 = "172.21.16.108/22";
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "172.21.16.51";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "172.21.16.51";
         GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
     };
   }
@@ -186,12 +186,12 @@ MACRLCs = (
   num_cc                      = 1;
   tr_s_preference             = "local_L1";
   tr_n_preference             = "local_RRC";
-  pusch_TargetSNRx10          = 300;
+  pusch_TargetSNRx10          = 200;
   pucch_TargetSNRx10          = 200;
- # dl_bler_target_upper=.35;
- # dl_bler_target_lower=.15; 
-  ul_bler_target_upper=.35;
-  ul_bler_target_lower=.15;
+ # dl_bler_target_upper        = .35;
+ # dl_bler_target_lower        = .15;
+  ul_bler_target_upper        = .35;
+  ul_bler_target_lower        = .15;
   pusch_FailureThres          = 100;
 }
 );
@@ -215,18 +215,17 @@ RUs = (
   local_rf       = "no";
   nb_tx          = 4;
   nb_rx          = 4;
-  att_tx         = 0; # TODO relevant?
-  att_rx         = 0; # TODO relevant?
+  att_tx         = 0;
+  att_rx         = 0;
   bands          = [78];
   max_pdschReferenceSignalPower = -27;
-  max_rxgain                    = 75; # TODO relevant?
-  sf_extension                  = 0; # TODO relevant?
-  eNB_instances  = [0]; # TODO is relevant?
-  ru_thread_core = 6;
+  max_rxgain                    = 75;
+  sf_extension                  = 0;
+  eNB_instances  = [0];
+  ru_thread_core = 9;
   sl_ahead       = 5;
   tr_preference  = "raw_if4p5"; # important: activate FHI7.2
-  do_precoding = 0; # needs to match O-RU configuration
-  
+  do_precoding   = 0; # needs to match O-RU configuration
 }
 );
 
@@ -249,41 +248,38 @@ security = {
 
 log_config :
 {
-  global_log_level                      ="info";
-  hw_log_level                          ="info";
-  phy_log_level                         ="info";
-  mac_log_level                         ="info";
-  rlc_log_level                         ="info";
-  pdcp_log_level                        ="info";
-  rrc_log_level                         ="info";
-  ngap_log_level                        ="info";
-  f1ap_log_level                        ="info";
+  global_log_level = "info";
+  hw_log_level     = "info";
+  phy_log_level    = "info";
+  mac_log_level    = "info";
+  rlc_log_level    = "info";
+  pdcp_log_level   = "info";
+  rrc_log_level    = "info";
+  ngap_log_level   = "info";
+  f1ap_log_level   = "info";
 };
 
 fhi_72 = {
-  dpdk_devices = ("0000:31:06.0", "0000:31:06.1");
+  dpdk_devices = ("0000:c1:11.0", "0000:c1:11.1"); # one VF can be used as well
   system_core = 0;
-  io_core = 4;
+  io_core = 1;
   worker_cores = (2);
-  du_addr = ("00:11:22:33:44:99", "00:11:22:33:44:99");
   ru_addr = ("e8:c7:4f:1e:c7:11", "e8:c7:4f:1e:c7:11");
-  mtu = 1500; # check if xran uses this properly
   fh_config = ({
     Tadv_cp_dl = 125;
-    T2a_cp_dl = (285, 429); # (min, max)
-    T2a_cp_ul = (285, 429); # (min, max)
-    T2a_up = (125, 428); # (min, max)
-    Ta3 = (130, 170); # (min, max)
-    T1a_cp_dl = (285, 429); # (min, max)
-    T1a_cp_ul = (285, 429); # (min, max)
-    T1a_up = (96, 196); # (min, max)
-    Ta4 = (110, 180); # (min, max)
+    T2a_cp_dl = (285, 429);
+    T2a_cp_ul = (285, 429);
+    T2a_up = (125, 428);
+    Ta3 = (130, 170);
+    T1a_cp_dl = (285, 429);
+    T1a_cp_ul = (285, 429);
+    T1a_up = (96, 196);
+    Ta4 = (110, 180);
     ru_config = {
-      iq_width = 9;
-      iq_width_prach = 9;
+      iq_width = 8;
+      iq_width_prach = 8;
     };
     prach_config = {
-      eAxC_offset = 4;
       kbar = 0;
     };
   });
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf
new file mode 100644
index 0000000000000000000000000000000000000000..cf3e429709b5d456eb7a394b4a497be129e2a5dd
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.273prb.fhi72.4x4-metanoia.conf
@@ -0,0 +1,269 @@
+Active_gNBs = ( "oai-du");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+    gNB_name  =  "oai-du";
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+    plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ( { sst = 1; }); });
+
+    nr_cellid = 1;
+
+    ////////// Physical parameters:
+    pdsch_AntennaPorts_XP = 2;
+    pusch_AntennaPorts    = 4;
+    pdsch_AntennaPorts_N1 = 2;
+    maxMIMO_layers        = 4;
+    do_CSIRS              = 1;
+    do_SRS                = 0;
+    force_UL256qam_off    = 1;
+   # sib1_tda			        = 15;
+
+    pdcch_ConfigSIB1 = (
+      {
+        controlResourceSetZero = 12;
+        searchSpaceZero = 0;
+      }
+    );
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+      physCellId                                                    = 0;
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # center frequency = 3750 MHz
+      # selected SSB frequency = 3748.8 MHz
+      absoluteFrequencySSB                                          = 649920;
+      dl_frequencyBand                                              = 78;
+      # frequency point A = 3700.86 MHz
+      dl_absoluteFrequencyPointA                                    = 646724;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                           = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        dl_subcarrierSpacing                                        = 1;
+        dl_carrierBandwidth                                         = 273;
+     #initialDownlinkBWP
+      #genericParameters
+       # this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart))
+       initialDLBWPlocationAndBandwidth                             = 1099;
+       #
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                               = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                          = 12;
+        initialDLBWPsearchSpaceZero                                 = 0;
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                              = 78;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                             = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                          = 1;
+      ul_carrierBandwidth                                           = 273;
+      pMax                                                          = 20;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                            = 1099;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                               = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 151;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 12;
+          preambleReceivedTargetPower                               = -96;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 5;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #
+        msg1_SubcarrierSpacing                                      = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+        msg3_DeltaPreamble                                          = 1;
+        p0_NominalWithGrant                                         = -90;
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 40;
+        p0_nominal                                                  = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+      ssb_PositionsInBurst_PR                                       = 2;
+      ssb_PositionsInBurst_Bitmap                                   = 1;
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 1;
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 5; #6;
+      nrofDownlinkSlots                                             = 3; #7;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 1; #2;
+      nrofUplinkSymbols                                             = 4;
+      ssPBCH_BlockPower                                             = -10;
+  }
+  );
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+        ////////// AMF parameters:
+    amf_ip_address = ({ ipv4 = "172.21.6.5"; });
+
+    NETWORK_INTERFACES :
+    {
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "172.21.16.51";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "172.21.16.51";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+  }
+);
+
+MACRLCs = (
+{
+  num_cc                      = 1;
+  tr_s_preference             = "local_L1";
+  tr_n_preference             = "local_RRC";
+  pusch_TargetSNRx10          = 220;
+  pucch_TargetSNRx10          = 220;
+  ul_bler_target_upper        = .35;
+  ul_bler_target_lower        = .15;
+  pusch_FailureThres          = 100;
+  ul_max_mcs                  = 28;
+}
+);
+
+L1s = (
+{
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  prach_dtx_threshold = 130;
+  pucch0_dtx_threshold = 80;
+  pusch_dtx_threshold = 10;
+  max_ldpc_iterations = 15;
+  tx_amp_backoff_dB = 12; # needs to match O-RU configuration
+  L1_rx_thread_core = 8;
+  L1_tx_thread_core = 10; # relevant after merge of l1_tx_thread
+  phase_compensation = 0; # needs to match O-RU configuration
+}
+);
+
+RUs = (
+{
+  local_rf       = "no";
+  nb_tx          = 4;
+  nb_rx          = 4;
+  att_tx         = 0;
+  att_rx         = 0;
+  bands          = [78];
+  max_pdschReferenceSignalPower = -27;
+  max_rxgain                    = 75;
+  sf_extension                  = 0;
+  eNB_instances  = [0];
+  ru_thread_core = 9;
+  sl_ahead       = 10;
+  tr_preference  = "raw_if4p5"; # important: activate FHI7.2
+  do_precoding   = 0; # needs to match O-RU configuration
+}
+);
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering = "yes";
+  drb_integrity = "no";
+};
+
+log_config :
+{
+  global_log_level = "info";
+  hw_log_level     = "info";
+  phy_log_level    = "info";
+  mac_log_level    = "info";
+  rlc_log_level    = "info";
+  pdcp_log_level   = "info";
+  rrc_log_level    = "info";
+  ngap_log_level   = "info";
+  f1ap_log_level   = "info";
+};
+
+fhi_72 = {
+  dpdk_devices = ("0000:c1:11.0", "0000:c1:11.1"); # one VF can be used as well
+  system_core = 0;
+  io_core = 1;
+  worker_cores = (2);
+  ru_addr = ("00:e0:0c:00:ae:06", "00:e0:0c:00:ae:06");
+  mtu = 9000;
+  fh_config = ({
+    Tadv_cp_dl = 125;
+    T2a_cp_dl = (285, 429);
+    T2a_cp_ul = (285, 429);
+    T2a_up = (125, 428);
+    Ta3 = (130, 170);
+    T1a_cp_dl = (285, 470);
+    T1a_cp_ul = (285, 429);
+    T1a_up = (125, 350);
+    Ta4 = (110, 180);
+    ru_config = {
+      iq_width = 9;
+      iq_width_prach = 9;
+    };
+  });
+};
diff --git a/tools/iwyu/README.md b/tools/iwyu/README.md
index 30b573747aa2cd590203264f67a6a1d2e849e710..16775dcf1c01096472bed8032688b96123303e1e 100644
--- a/tools/iwyu/README.md
+++ b/tools/iwyu/README.md
@@ -3,6 +3,10 @@
 IWYU - [include what you use](https://github.com/include-what-you-use/include-what-you-use)
 is a tool that can detect and correct C/C++ include errors
 
+# Pre-requisites
+
+The image ran-base:latest needs to be built. Please refer to [docker/README.md](../../docker/README.md)
+
 # Usage
 
 ```