diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000000000000000000000000000000000000..9fd870b8595e65c6398131d1c2b968897ff5addc
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,8 @@
+*.log
+cmake_targets/log/
+cmake_targets/ran_build/
+common/utils/T/T_IDs.h
+common/utils/T/T_messages.txt.h
+common/utils/T/genids
+common/utils/T/genids.o
+targets/bin/
diff --git a/ci-scripts/Jenkinsfile-gitlab b/ci-scripts/Jenkinsfile-gitlab
index 0e9e4adf8919ee63174967d64841537d2c1748e5..9a6f3639548a4b185c2f835b7d193e4cc9ec8452 100644
--- a/ci-scripts/Jenkinsfile-gitlab
+++ b/ci-scripts/Jenkinsfile-gitlab
@@ -35,6 +35,9 @@ def doFlexranCtrlTest = false
 // Location of the executor node
 def nodeExecutor = params.nodeExecutor
 
+// VM Lockable resources
+def vmResource = params.vmLockableResource
+
 pipeline {
     agent {
         label nodeExecutor
@@ -159,65 +162,81 @@ pipeline {
 
         stage ("Start VM -- basic-sim") {
             steps {
+              lock (vmResource) {
                 timeout (time: 5, unit: 'MINUTES') {
                     sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant basic-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
                 }
+              }
             }
         }
 
         stage ("Start VM -- gnb-usrp") {
             steps {
+              lock (vmResource) {
                 timeout (time: 5, unit: 'MINUTES') {
                     sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant gnb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
                 }
+              }
             }
         }
 
         stage ("Start VM -- nr-ue-usrp") {
             steps {
+              lock (vmResource) {
                 timeout (time: 5, unit: 'MINUTES') {
                     sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant nr-ue-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
                 }
+              }
             }
         }
 
         stage ("Start VM -- enb-usrp") {
             steps {
+              lock (vmResource) {
                 timeout (time: 5, unit: 'MINUTES') {
                     sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant enb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
                 }
+              }
             }
         }
 
         stage ("Start VM -- phy-sim") {
             steps {
+              lock (vmResource) {
                 timeout (time: 5, unit: 'MINUTES') {
                     sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant phy-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
                 }
+              }
             }
         }
         
         stage ("Start VM -- enb-ethernet") {
             steps {
+              lock (vmResource) {
                 timeout (time: 7, unit: 'MINUTES') {
                     sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant enb-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
                 }
+              }
             }
         }
 
         stage ("Start VM -- ue-ethernet") {
             steps {
+              lock (vmResource) {
                 timeout (time: 7, unit: 'MINUTES') {
                     sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
                 }
+              }
             }
         }
         
         stage ("Start VM -- cppcheck") {
             steps {
+              lock (vmResource) {
                 timeout (time: 7, unit: 'MINUTES') {
                     sh "./ci-scripts/oai-ci-vm-tool build --workspace $WORKSPACE --variant cppcheck --job-name ${JOB_NAME} --build-id ${BUILD_ID} --daemon"
                 }
+              }
             }
         }
 
@@ -288,11 +307,14 @@ pipeline {
                 }
                 stage ("Build UE-ethernet") {
                     steps {
+                      // This is typically the last one to finish.
+                      lock (vmResource) {
                         gitlabCommitStatus(name: "Build UE-ethernet") {
                             timeout (time: 20, unit: 'MINUTES') {
                                 sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant ue-ethernet --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
                             }
                         }
+                      }
                     }
                 }
             }
@@ -354,6 +376,7 @@ pipeline {
                     stages {
                         stage ("Test physical simulators") {
                             steps {
+                              lock (vmResource) {
                                 script {
                                     timeout (time: 90, unit: 'MINUTES') {
                                         try {
@@ -365,6 +388,7 @@ pipeline {
                                         }
                                     }
                                 }
+                              }
                             }
                         }
                         stage ("Build Flexran Controller") {
@@ -372,6 +396,7 @@ pipeline {
                                 expression {doFlexranCtrlTest}
                             }
                             steps {
+                              lock (vmResource) {
                                 script {
                                     timeout (time: 20, unit: 'MINUTES') {
                                         try {
@@ -381,10 +406,12 @@ pipeline {
                                         }
                                     }
                                 }
+                              }
                             }
                         }
                         stage ("Test basic simulator") {
                             steps {
+                              lock (vmResource) {
                                 script {
                                     timeout (time: 30, unit: 'MINUTES') {
                                         try {
@@ -396,10 +423,12 @@ pipeline {
                                         }
                                     }
                                 }
+                              }
                             }
                         }
                         stage ("Test L1 simulator") {
                             steps {
+                              lock (vmResource) {
                                 script {
                                     timeout (time: 30, unit: 'MINUTES') {
                                         try {
@@ -411,10 +440,12 @@ pipeline {
                                         }
                                     }
                                 }
+                              }
                             }
                         }
                         stage ("Test RF simulator") {
                             steps {
+                              lock (vmResource) {
                                 script {
                                     timeout (time: 40, unit: 'MINUTES') {
                                         try {
@@ -426,10 +457,12 @@ pipeline {
                                         }
                                     }
                                 }
+                              }
                             }
                         }
                         stage ("Test L2 simulator") {
                             steps {
+                              lock (vmResource) {
                                 script {
                                     timeout (time: 30, unit: 'MINUTES') {
                                         try {
@@ -441,11 +474,14 @@ pipeline {
                                         }
                                     }
                                 }
+                              }
                             }
                         }
                         stage ("Destroy all Virtual Machines") {
                             steps {
+                              lock (vmResource) {
                                 sh "./ci-scripts/oai-ci-vm-tool destroy --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
+                              }
                             }
                         }
                     }
diff --git a/ci-scripts/cls_oaicitest.py b/ci-scripts/cls_oaicitest.py
index 4b6f5ad66768146c7c2ae08a6e654167002e56ac..4ac1b0ea94b200f643ae8add3cbb3110bd91924b 100644
--- a/ci-scripts/cls_oaicitest.py
+++ b/ci-scripts/cls_oaicitest.py
@@ -72,6 +72,9 @@ class OaiCiTest():
 		self.ADBCentralized = True
 		self.testCase_id = ''
 		self.testXMLfiles = []
+		self.testUnstable = False
+		self.testMinStableId = '999999'
+		self.testStabilityPointReached = False
 		self.desc = ''
 		self.ping_args = ''
 		self.ping_packetloss_threshold = ''
@@ -211,7 +214,7 @@ class OaiCiTest():
 			logging.error('\u001B[1m Building OAI UE Failed\u001B[0m')
 			HTML.CreateHtmlTestRow(self.Build_OAI_UE_args, 'KO', CONST.ALL_PROCESSES_OK, 'OAI UE')
 			HTML.CreateHtmlTabFooter(False)
-			sys.exit(1)
+			self.ConditionalExit()
 
 	def CheckFlexranCtrlInstallation(self,RAN,EPC):
 		if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '':
@@ -335,7 +338,7 @@ class OaiCiTest():
 				if (pStatus < 0):
 					HTML.CreateHtmlTestRow(self.air_interface + ' ' + self.Initialize_OAI_UE_args, 'KO', pStatus)
 					HTML.CreateHtmlTabFooter(False)
-					sys.exit(1)
+					self.ConditionalExit()
 			UE_prefix = ''
 		else:
 			UE_prefix = 'NR '
@@ -719,7 +722,7 @@ class OaiCiTest():
 				logging.debug('Using the OAI EPC HSS: not implemented yet')
 				HTML.CreateHtmlTestRow(self.ping_args, 'KO', pStatus)
 				HTML.CreateHtmlTabFooter(False)
-				sys.exit(1)
+				self.ConditionalExit()
 			else:
 				SSH.command('egrep --color=never "Allocated ipv4 addr" /opt/ltebox/var/log/xGwLog.0', '\$', 5)
 				result = re.search('Allocated ipv4 addr: (?P<ipaddr>[0-9\.]+) from Pool', SSH.getBefore())
@@ -1046,7 +1049,7 @@ class OaiCiTest():
 		if (pStatus < 0):
 			HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
 			HTML.CreateHtmlTabFooter(False)
-			sys.exit(1)
+			self.ConditionalExit()
 		multi_jobs = []
 		for device_id in self.UEDevices:
 			p = Process(target = self.RebootUE_common, args = (device_id,))
@@ -1154,15 +1157,18 @@ class OaiCiTest():
 						self.UEDevicesRebootCmd.append(comma_split[5])
 					phone_list_file.close()
 
+		# better handling of the case when no UE detected
+		# Sys-exit is now dealt by the calling function
 		if terminate_ue_flag == True:
 			if len(self.UEDevices) == 0:
 				logging.debug('\u001B[1;37;41m UE Not Found! \u001B[0m')
-				sys.exit(1)
+				return False
 		if len(self.UEDevicesStatus) == 0:
 			cnt = 0
 			while cnt < len(self.UEDevices):
 				self.UEDevicesStatus.append(CONST.UE_STATUS_DETACHED)
 				cnt += 1
+		return True
 
 	def GetAllCatMDevices(self, terminate_ue_flag):
 		if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '':
@@ -1248,7 +1254,7 @@ class OaiCiTest():
 		if (pStatus < 0):
 			HTML.CreateHtmlTestRow('N/A', 'KO', pStatus)
 			HTML.CreateHtmlTabFooter(False)
-			sys.exit(1)
+			self.ConditionalExit()
 		multi_jobs = []
 		lock = Lock()
 		status_queue = SimpleQueue()
@@ -1386,7 +1392,14 @@ class OaiCiTest():
 				SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
 				SSH.command('cd ' + EPC.SourceCodePath, '\$', 5)
 				SSH.command('cd scripts', '\$', 5)
-				ping_status = SSH.command('stdbuf -o0 ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 | stdbuf -o0 tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
+				# In case of a docker-based deployment, we need to ping from the trf-gen container
+				launchFromTrfContainer = False
+				if re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE):
+					launchFromTrfContainer = True
+				if launchFromTrfContainer:
+					ping_status = SSH.command('docker exec -it prod-trf-gen /bin/bash -c "ping ' + self.ping_args + ' ' + UE_IPAddress + '" 2>&1 | tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
+				else:
+					ping_status = SSH.command('stdbuf -o0 ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 | stdbuf -o0 tee ping_' + self.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
 			else:
 				cmd = 'ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 > ping_' + self.testCase_id + '_' + device_id + '.log' 
 				message = cmd + '\n'
@@ -2028,7 +2041,8 @@ class OaiCiTest():
 					SSH.command('adb -s ' + device_id + ' shell "ls /data/local/tmp"', '\$', 5)
 				else:
 					SSH.command('ssh ' + self.UEDevicesRemoteUser[idx] + '@' + self.UEDevicesRemoteServer[idx] + ' \'adb -s ' + device_id + ' shell "ls /data/local/tmp"\'', '\$', 60)
-				result = re.search('iperf3', SSH.getBefore())
+				# DEBUG: disabling iperf3 usage for the moment
+				result = re.search('iperf4', SSH.getBefore())
 				if result is None:
 					result = re.search('iperf', SSH.getBefore())
 					if result is None:
@@ -2105,6 +2119,10 @@ class OaiCiTest():
 			launchFromEpc = True
 			if re.match('OAI-Rel14-CUPS', EPC.Type, re.IGNORECASE):
 				launchFromEpc = False
+			# When using a docker-based deployment, IPERF client shall be launched from trf container
+			launchFromTrfContainer = False
+			if re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE):
+				launchFromTrfContainer = True
 			if launchFromEpc:
 				SSH.open(EPC.IPAddress, EPC.UserName, EPC.Password)
 				SSH.command('cd ' + EPC.SourceCodePath + '/scripts', '\$', 5)
@@ -2129,7 +2147,16 @@ class OaiCiTest():
 				self.Iperf_analyzeV3Output(lock, UE_IPAddress, device_id, statusQueue,SSH)
 			else:
 				if launchFromEpc:
-					iperf_status = SSH.command('stdbuf -o0 iperf -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee iperf_' + self.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
+					if launchFromTrfContainer:
+						if self.ueIperfVersion == self.dummyIperfVersion:
+							prefix = ''
+						else:
+							prefix = ''
+							if self.ueIperfVersion == '2.0.5':
+								prefix = '/iperf-2.0.5/bin/'
+						iperf_status = SSH.command('docker exec -it prod-trf-gen /bin/bash -c "' + prefix + 'iperf -c ' + UE_IPAddress + ' ' + modified_options + '" 2>&1 | tee iperf_' + self.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
+					else:
+						iperf_status = SSH.command('stdbuf -o0 iperf -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee iperf_' + self.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
 				else:
 					if self.ueIperfVersion == self.dummyIperfVersion:
 						prefix = ''
@@ -3148,6 +3175,12 @@ class OaiCiTest():
 			HTML.CpuMHz[idx]=CpuMHz
 		SSH.close()
 
+	def ConditionalExit(self):
+		if self.testUnstable:
+			if self.testStabilityPointReached or self.testMinStableId == '999999':
+				sys.exit(0)
+		sys.exit(1)
+
 	def ShowTestID(self):
 		logging.debug('\u001B[1m----------------------------------------\u001B[0m')
 		logging.debug('\u001B[1mTest ID:' + self.testCase_id + '\u001B[0m')
diff --git a/ci-scripts/epc.py b/ci-scripts/epc.py
index 25bbbba091b3ad6b65ed8e5b0a976e883de06a4b..a1994c5ac31b5b30d9f2e40acba29505dc8517e4 100644
--- a/ci-scripts/epc.py
+++ b/ci-scripts/epc.py
@@ -65,6 +65,7 @@ class EPCManagement():
 		self.testCase_id = ''
 		self.MmeIPAddress = ''
 		self.containerPrefix = 'prod'
+		self.mmeConfFile = 'mme.conf'
 
 
 #-----------------------------------------------------------
@@ -127,7 +128,7 @@ class EPCManagement():
 			logging.debug('Using the OAI EPC Release 14 MME in Docker')
 			mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup tshark -i eth0 -i lo:s10 -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
 			time.sleep(5)
-			mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup ./bin/oai_mme -c ./etc/mme.conf > mme_check_run.log 2>&1"', '\$', 5)
+			mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup ./bin/oai_mme -c ./etc/' + self.mmeConfFile + ' > mme_check_run.log 2>&1"', '\$', 5)
 		elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
 			logging.debug('Using the OAI EPC Release 14 MME')
 			mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
diff --git a/ci-scripts/html.py b/ci-scripts/html.py
index 8f2d38cced95600c4ae587ba65aab2f871d3edc5..f50899be4fedde5d7027b5ef7ed1585f6f598aa1 100644
--- a/ci-scripts/html.py
+++ b/ci-scripts/html.py
@@ -64,6 +64,10 @@ class HTMLManagement():
 		self.htmlTabIcons = []
 		self.testXMLfiles = []
 
+		self.testUnstable = False
+		self.testMinStableId = '999999'
+		self.testStabilityPointReached = False
+
 		self.htmleNBFailureMsg = ''
 		self.htmlUEFailureMsg = ''
 
@@ -230,13 +234,20 @@ class HTMLManagement():
 
 	def CreateHtmlTabFooter(self, passStatus):
 		if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)):
+			testOkEvenIfUnstable = False
+			if self.testUnstable and not passStatus:
+				if self.testStabilityPointReached or self.testMinStableId == '999999':
+					testOkEvenIfUnstable = True
 			self.htmlFile = open('test_results.html', 'a')
 			self.htmlFile.write('      <tr>\n')
 			self.htmlFile.write('        <th bgcolor = "#33CCFF" colspan=3>Final Tab Status</th>\n')
 			if passStatus:
 				self.htmlFile.write('        <th bgcolor = "green" colspan=' + str(2 + self.htmlUEConnected) + '><font color="white">PASS <span class="glyphicon glyphicon-ok"></span> </font></th>\n')
 			else:
-				self.htmlFile.write('        <th bgcolor = "red" colspan=' + str(2 + self.htmlUEConnected) + '><font color="white">FAIL <span class="glyphicon glyphicon-remove"></span> </font></th>\n')
+				if testOkEvenIfUnstable:
+					self.htmlFile.write('        <th bgcolor = "orange" colspan=' + str(2 + self.htmlUEConnected) + '><font color="white">KNOWN UNSTABLE SCENARIO <span class="glyphicon glyphicon-exclamation-sign"></span> </font></th>\n')
+				else:
+					self.htmlFile.write('        <th bgcolor = "red" colspan=' + str(2 + self.htmlUEConnected) + '><font color="white">FAIL <span class="glyphicon glyphicon-remove"></span> </font></th>\n')
 			self.htmlFile.write('      </tr>\n')
 			self.htmlFile.write('  </table>\n')
 			self.htmlFile.write('  </div>\n')
@@ -246,7 +257,10 @@ class HTMLManagement():
 				cmd = "sed -i -e 's/__STATE_" + self.htmlTabNames[0] + "__//' test_results.html"
 				subprocess.run(cmd, shell=True)
 			else:
-				cmd = "sed -i -e 's/__STATE_" + self.htmlTabNames[0] + "__/<span class=\"glyphicon glyphicon-remove\"><\/span>/' test_results.html"
+				if testOkEvenIfUnstable:
+					cmd = "sed -i -e 's/__STATE_" + self.htmlTabNames[0] + "__/<span class=\"glyphicon glyphicon-exclamation-sign\"><\/span>/' test_results.html"
+				else:
+					cmd = "sed -i -e 's/__STATE_" + self.htmlTabNames[0] + "__/<span class=\"glyphicon glyphicon-remove\"><\/span>/' test_results.html"
 				subprocess.run(cmd, shell=True)
 		self.htmlFooterCreated = False
 
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index ca295387134b2bab379a6970324490f115213142..8fbc3b93a0170cf9559403f2b414e598b33e36be 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -283,6 +283,11 @@ def GetParametersFromXML(action):
 			else:
 				ldpc.forced_workspace_cleanup=False
 
+	elif action == 'Initialize_MME':
+		string_field = test.findtext('option')
+		if (string_field is not None):
+			EPC.mmeConfFile = string_field
+
 	else: # ie action == 'Run_PhySim':
 		ldpc.runargs = test.findtext('physim_run_args')
 		
@@ -489,6 +494,9 @@ elif re.match('^FinalizeHtml$', mode, re.IGNORECASE):
 	CiTestObj.RetrieveSystemVersion('UE',HTML,RAN)
 	HTML.CreateHtmlFooter(CiTestObj.finalStatus)
 elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re.IGNORECASE):
+	logging.debug('\u001B[1m----------------------------------------\u001B[0m')
+	logging.debug('\u001B[1m  Starting Scenario \u001B[0m')
+	logging.debug('\u001B[1m----------------------------------------\u001B[0m')
 	if re.match('^TesteNB$', mode, re.IGNORECASE):
 		if RAN.eNBIPAddress == '' or RAN.ranRepository == '' or RAN.ranBranch == '' or RAN.eNBUserName == '' or RAN.eNBPassword == '' or RAN.eNBSourceCodePath == '' or EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.Type == '' or EPC.SourceCodePath == '' or CiTestObj.ADBIPAddress == '' or CiTestObj.ADBUserName == '' or CiTestObj.ADBPassword == '':
 			HELP.GenericHelp(CONST.Version)
@@ -524,7 +532,14 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
 		HTML.htmlTabRefs.append(xmlRoot.findtext('htmlTabRef',default='test-tab-0'))
 		HTML.htmlTabNames.append(xmlRoot.findtext('htmlTabName',default='Test-0'))
 		repeatCount = xmlRoot.findtext('repeatCount',default='1')
+		testStability = xmlRoot.findtext('TestUnstable',default='False')
 		CiTestObj.repeatCounts.append(int(repeatCount))
+		if testStability == 'True':
+			CiTestObj.testUnstable = True
+			HTML.testUnstable = True
+			CiTestObj.testMinStableId = xmlRoot.findtext('TestMinId',default='999999')
+			HTML.testMinStableId = CiTestObj.testMinStableId
+			logging.debug('Test is tagged as Unstable -- starting from TestID ' + str(CiTestObj.testMinStableId))
 	all_tests=xmlRoot.findall('testCase')
 
 	exclusion_tests=exclusion_tests.split()
@@ -605,7 +620,11 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
 					if (CiTestObj.ADBIPAddress != 'none'):
 						#in these cases, having no devices is critical, GetAllUEDevices function has to manage it as a critical error, reason why terminate_ue_flag is set to True
 						terminate_ue_flag = True 
-						CiTestObj.GetAllUEDevices(terminate_ue_flag)
+						# Now we stop properly the test-suite --> clean reporting
+						status = CiTestObj.GetAllUEDevices(terminate_ue_flag)
+						if not status:
+							RAN.prematureExit = True
+							break
 				if action == 'Build_eNB':
 					RAN.BuildeNB()
 				elif action == 'WaitEndBuild_eNB':
@@ -681,11 +700,19 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
 					HTML=ldpc.Run_PhySim(HTML,CONST,id)
 				else:
 					sys.exit('Invalid class (action) from xml')
+				if not RAN.prematureExit:
+					if CiTestObj.testCase_id == CiTestObj.testMinStableId:
+						logging.debug('Scenario has reached minimal stability point')
+						CiTestObj.testStabilityPointReached = True
+						HTML.testStabilityPointReached = True
 		CiTestObj.FailReportCnt += 1
 	if CiTestObj.FailReportCnt == CiTestObj.repeatCounts[0] and RAN.prematureExit:
 		logging.debug('Testsuite failed ' + str(CiTestObj.FailReportCnt) + ' time(s)')
 		HTML.CreateHtmlTabFooter(False)
-		sys.exit('Failed Scenario')
+		if CiTestObj.testUnstable and (CiTestObj.testStabilityPointReached or CiTestObj.testMinStableId == '999999'):
+			logging.debug('Scenario has reached minimal stability point -- Not a Failure')
+		else:
+			sys.exit('Failed Scenario')
 	else:
 		logging.info('Testsuite passed after ' + str(CiTestObj.FailReportCnt) + ' time(s)')
 		HTML.CreateHtmlTabFooter(True)
diff --git a/ci-scripts/xml_files/enb_usrp210_band13_test_10mhz_tm1.xml b/ci-scripts/xml_files/enb_usrp210_band13_test_10mhz_tm1.xml
index 611492b0bcdcf54e29eb18fabb89b8561dbfa489..cdba0723dff81e5dc8bf6f6a24b08117bc4c8501 100644
--- a/ci-scripts/xml_files/enb_usrp210_band13_test_10mhz_tm1.xml
+++ b/ci-scripts/xml_files/enb_usrp210_band13_test_10mhz_tm1.xml
@@ -25,6 +25,7 @@
 	<htmlTabName>Test-LTE-M-10MHz-TM1</htmlTabName>
 	<htmlTabIcon>tasks</htmlTabIcon>
 	<repeatCount>1</repeatCount>
+	<TestUnstable>True</TestUnstable>
 	<TestCaseRequestedList>
  030201
  040102
diff --git a/ci-scripts/xml_files/enb_usrp210_band40_test_05mhz_tm2.xml b/ci-scripts/xml_files/enb_usrp210_band40_test_05mhz_tm2.xml
index 09aa0b04a2a8fbdfbb85cb3a521dc5451e9ac35e..5ece10d37e2cdd22605f19c5b8067fb5d465feb3 100644
--- a/ci-scripts/xml_files/enb_usrp210_band40_test_05mhz_tm2.xml
+++ b/ci-scripts/xml_files/enb_usrp210_band40_test_05mhz_tm2.xml
@@ -26,6 +26,8 @@
 	<htmlTabName>Test-05MHz-TM2</htmlTabName>
 	<htmlTabIcon>tasks</htmlTabIcon>
 	<repeatCount>2</repeatCount>
+	<TestUnstable>True</TestUnstable>
+	<TestMinId>040608</TestMinId>
         <TestCaseRequestedList>
  030201
  040101
diff --git a/ci-scripts/xml_files/enb_usrp210_band40_test_10mhz_tm1.xml b/ci-scripts/xml_files/enb_usrp210_band40_test_10mhz_tm1.xml
index 29699d3b3dfd35f7ee0de26774dfcbaf99137e4c..b1d87e598e7ef7cc7bda596ea7aebc34bf15b185 100644
--- a/ci-scripts/xml_files/enb_usrp210_band40_test_10mhz_tm1.xml
+++ b/ci-scripts/xml_files/enb_usrp210_band40_test_10mhz_tm1.xml
@@ -24,6 +24,8 @@
 	<htmlTabRef>test-10-tm1</htmlTabRef>
 	<htmlTabName>Test-10MHz-TM1</htmlTabName>
 	<htmlTabIcon>tasks</htmlTabIcon>
+	<TestUnstable>True</TestUnstable>
+	<TestMinId>040615</TestMinId>
 	<TestCaseRequestedList>
  030201
  040101
diff --git a/ci-scripts/xml_files/enb_usrp210_band40_test_20mhz_tm1.xml b/ci-scripts/xml_files/enb_usrp210_band40_test_20mhz_tm1.xml
index f98ed1600abdc92ef757beed95acdf7bc8ec77a9..d75704acebc026b5f449c68a7f4a196eb44f1cac 100644
--- a/ci-scripts/xml_files/enb_usrp210_band40_test_20mhz_tm1.xml
+++ b/ci-scripts/xml_files/enb_usrp210_band40_test_20mhz_tm1.xml
@@ -25,6 +25,8 @@
 	<htmlTabName>Test-20MHz-TM1</htmlTabName>
 	<htmlTabIcon>tasks</htmlTabIcon>
 	<repeatCount>4</repeatCount>
+	<TestUnstable>True</TestUnstable>
+	<TestMinId>040623</TestMinId>
 	<TestCaseRequestedList>
  030201
  040101
diff --git a/ci-scripts/xml_files/enb_usrp210_band40_test_20mhz_tm1_default_scheduler.xml b/ci-scripts/xml_files/enb_usrp210_band40_test_20mhz_tm1_default_scheduler.xml
index fd018f7a9ce98d16c81572e7eee3d9bbe07b42da..a6530a920ccc824d85aa659026ebf585c954ca5c 100644
--- a/ci-scripts/xml_files/enb_usrp210_band40_test_20mhz_tm1_default_scheduler.xml
+++ b/ci-scripts/xml_files/enb_usrp210_band40_test_20mhz_tm1_default_scheduler.xml
@@ -24,6 +24,8 @@
 	<htmlTabRef>test-20-tm1-defSched</htmlTabRef>
 	<htmlTabName>Test-20MHz-TM1-default-scheduler</htmlTabName>
 	<htmlTabIcon>tasks</htmlTabIcon>
+	<TestUnstable>True</TestUnstable>
+	<TestMinId>040522</TestMinId>
 	<TestCaseRequestedList>
  030201
  040101
diff --git a/ci-scripts/xml_files/fr1_epc_start_verizon.xml b/ci-scripts/xml_files/fr1_epc_start_verizon.xml
new file mode 100644
index 0000000000000000000000000000000000000000..19f5c03985a3eaecd35019282388552f045c6347
--- /dev/null
+++ b/ci-scripts/xml_files/fr1_epc_start_verizon.xml
@@ -0,0 +1,49 @@
+<!--
+
+ 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>
+		<option>mme-verizon.conf</option>
+	</testCase>
+
+	<testCase id="000102">
+		<class>Initialize_SPGW</class>
+		<desc>Initialize SPGW</desc>
+	</testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/fr1_usrp210_band7_test_05mhz_tm1.xml b/ci-scripts/xml_files/fr1_usrp210_band7_test_05mhz_tm1.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ea25d5b6946fedb72fee0a2965c182413fd540a1
--- /dev/null
+++ b/ci-scripts/xml_files/fr1_usrp210_band7_test_05mhz_tm1.xml
@@ -0,0 +1,151 @@
+<!--
+
+ 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
+ 030101 040301 040501 040603 040604 040605 040606 040607 040641 040642 040643 040644 040401 040201 030201
+
+-->
+<testCaseList>
+	<htmlTabRef>test-05-tm1</htmlTabRef>
+	<htmlTabName>Test-05MHz-TM1</htmlTabName>
+	<htmlTabIcon>tasks</htmlTabIcon>
+	<TestCaseRequestedList>
+ 030201
+ 040101
+ 030101 040301 000001 040501 040603 040401 030201
+	</TestCaseRequestedList>
+	<TestCaseExclusionList></TestCaseExclusionList>
+
+	<testCase id="000001">
+		<class>IdleSleep</class>
+		<desc>Sleep</desc>
+		<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
+	</testCase>
+
+	<testCase id="030101">
+		<class>Initialize_eNB</class>
+		<desc>Initialize eNB (FDD/Band7/5MHz)</desc>
+		<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf --eNBs.[0].plmn_list.[0].mcc 311 --eNBs.[0].plmn_list.[0].mnc 480 --eNBs.[0].plmn_list.[0].mnc_length 3 --eNBs.[0].component_carriers.[0].Nid_cell 10</Initialize_eNB_args>
+	</testCase>
+
+	<testCase id="030201">
+		<class>Terminate_eNB</class>
+		<desc>Terminate eNB</desc>
+	</testCase>
+
+	<testCase id="040101">
+		<class>Initialize_UE</class>
+		<desc>Initialize UE</desc>
+	</testCase>
+
+	<testCase id="040201">
+		<class>Terminate_UE</class>
+		<desc>Terminate UE</desc>
+	</testCase>
+
+	<testCase id="040301">
+		<class>Attach_UE</class>
+		<desc>Attach UE</desc>
+	</testCase>
+
+	<testCase id="040401">
+		<class>Detach_UE</class>
+		<desc>Detach UE</desc>
+	</testCase>
+
+	<testCase id="040501">
+		<class>Ping</class>
+		<desc>ping (5MHz - 20 sec)</desc>
+		<ping_args>-c 20</ping_args>
+		<ping_packetloss_threshold>5</ping_packetloss_threshold>
+	</testCase>
+
+	<testCase id="040603">
+		<class>Iperf</class>
+		<desc>iperf (5MHz - DL/15Mbps/UDP)(30 sec)(balanced profile)</desc>
+		<iperf_args>-u -b 15M -t 30 -i 1</iperf_args>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>balanced</iperf_profile>
+	</testCase>
+
+	<testCase id="040604">
+		<class>Iperf</class>
+		<desc>iperf (5MHz - DL/15Mbps/UDP)(30 sec)(single-ue profile)</desc>
+		<iperf_args>-u -b 15M -t 30 -i 1</iperf_args>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>single-ue</iperf_profile>
+	</testCase>
+
+	<testCase id="040605">
+		<class>Iperf</class>
+		<desc>iperf (5MHz - DL/15Mbps/UDP)(30 sec)(unbalanced profile)</desc>
+		<iperf_args>-u -b 15M -t 30 -i 1</iperf_args>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>unbalanced</iperf_profile>
+	</testCase>
+
+	<testCase id="040606">
+		<class>Iperf</class>
+		<desc>iperf (5MHz - DL/TCP)(30 sec)(single-ue profile)</desc>
+		<iperf_args>-t 30 -i 1 -fm</iperf_args>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>single-ue</iperf_profile>
+	</testCase>
+
+	<testCase id="040607">
+		<class>Iperf</class>
+		<desc>iperf (5MHz - DL/TCP)(30 sec)(balanced profile)</desc>
+		<iperf_args>-t 30 -i 1 -fm</iperf_args>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>balanced</iperf_profile>
+	</testCase>
+
+	<testCase id="040641">
+		<class>Iperf</class>
+		<desc>iperf (5MHz - UL/9Mbps/UDP)(30 sec)(balanced profile)</desc>
+		<iperf_args>-u -b 9M -t 30 -i 1 -R</iperf_args>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>balanced</iperf_profile>
+	</testCase>
+
+	<testCase id="040642">
+		<class>Iperf</class>
+		<desc>iperf (5MHz - UL/9Mbps/UDP)(30 sec)(single-ue profile)</desc>
+		<iperf_args>-u -b 9M -t 30 -i 1 -R</iperf_args>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>single-ue</iperf_profile>
+	</testCase>
+
+	<testCase id="040643">
+		<class>Iperf</class>
+		<desc>iperf (5MHz - UL/TCP)(30 sec)(single-ue profile)</desc>
+		<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>single-ue</iperf_profile>
+	</testCase>
+
+	<testCase id="040644">
+		<class>Iperf</class>
+		<desc>iperf (5MHz - UL/TCP)(30 sec)(balanced profile)</desc>
+		<iperf_args>-t 30 -i 1 -fm -R</iperf_args>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>balanced</iperf_profile>
+	</testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/if4p5_usrp210_band40_test_10mhz.xml b/ci-scripts/xml_files/if4p5_usrp210_band40_test_10mhz.xml
index 8276294e9af23a63adafd13786be22d81365b295..9224c67fe7ba02b3f0388b12063bec6cd66bcf6c 100644
--- a/ci-scripts/xml_files/if4p5_usrp210_band40_test_10mhz.xml
+++ b/ci-scripts/xml_files/if4p5_usrp210_band40_test_10mhz.xml
@@ -25,6 +25,8 @@
 	<htmlTabName>Test-10MHz</htmlTabName>
 	<htmlTabIcon>tasks</htmlTabIcon>
 	<repeatCount>2</repeatCount>
+	<TestUnstable>True</TestUnstable>
+	<TestMinId>040612</TestMinId>
 	<TestCaseRequestedList>
  030201
  040101
diff --git a/ci-scripts/xml_files/x2ho_enb_usrp210_band13_test_05mhz_tm1.xml b/ci-scripts/xml_files/x2ho_enb_usrp210_band13_test_05mhz_tm1.xml
index c43be75a8721feda87fbfeba9e29d932d96154ac..7256c985c584d02126109b0b41764531294d0d8d 100644
--- a/ci-scripts/xml_files/x2ho_enb_usrp210_band13_test_05mhz_tm1.xml
+++ b/ci-scripts/xml_files/x2ho_enb_usrp210_band13_test_05mhz_tm1.xml
@@ -26,6 +26,7 @@
 	<htmlTabName>Test-X2-HO-FDD-05MHz-TM1</htmlTabName>
 	<htmlTabIcon>tasks</htmlTabIcon>
 	<repeatCount>2</repeatCount>
+	<TestUnstable>True</TestUnstable>
 	<TestCaseRequestedList>
  030201 030202
  040101
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 024f7eb3dff3ebd234b381611c2048211b7cc98c..d6be2ab2fc09b1e2eaf1c3cce389d7c09102086d 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -825,7 +825,6 @@ add_boolean_option(MESSAGE_CHART_GENERATOR_PHY     False "trace some PHY exchang
 add_boolean_option(UE_EXPANSION             False         "enable UE_EXPANSION with max 256 UE")
 add_boolean_option(PHY_TX_THREAD            False         "enable UE_EXPANSION with max 256 UE")
 add_boolean_option(PRE_SCD_THREAD           False         "enable UE_EXPANSION with max 256 UE")
-add_boolean_option(UESIM_EXPANSION          False         "enable UESIM_EXPANSION with max 256 UE")
 
 ########################
 # Include order
@@ -1594,6 +1593,7 @@ set(PHY_SRC_UE
   ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c
   ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
   ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_dmrs_rx.c
+  ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_csi_rs.c
   ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c
   ${OPENAIR1_DIR}/PHY/NR_REFSIG/scrambling_luts.c
   ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gen_mod_table.c
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index d2432d64f3d173b3f86f9355f6efcdc80b578684..8330ebf27e6ec617e32da849efc98017d6331961 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -42,7 +42,6 @@ MSC_GEN=0
 XFORMS="True"
 SKIP_SHARED_LIB_FLAG="False"
 UE_EXPANSION="False"
-UESIM_EXPANSION="False"
 PRINT_STATS="False"
 VCD_TIMING="False"
 DEADLINE_SCHEDULER_FLAG_USER=""
@@ -264,10 +263,6 @@ function main() {
             UE_EXPANSION="True"
             echo_info "Will compile with UE_EXPANSION"
             shift;;
-       --musim)
-            UESIM_EXPANSION="True"
-            echo_info "Will compile with UESIM_EXPANSION"
-            shift;;
        --UE-conf-nvram)
             conf_nvram_path=$(readlink -f $2)
             shift 2;;
@@ -593,7 +588,6 @@ function main() {
     echo "set ( UE_EXPANSION $UE_EXPANSION )"                             >> $cmake_file
 #    echo "set ( PHY_TX_THREAD $UE_EXPANSION )"                            >> $cmake_file
     echo "set ( PRE_SCD_THREAD $UE_EXPANSION )"                           >> $cmake_file
-    echo "set ( UESIM_EXPANSION $UESIM_EXPANSION )"                       >> $cmake_file
     echo "set ( ENABLE_VCD_FIFO $VCD_TIMING )"                            >> $cmake_file
     echo "set ( RF_BOARD \"${HW}\")"                                      >> $cmake_file
     echo "set ( TRANSP_PRO \"${TP}\")"                                    >> $cmake_file
diff --git a/cmake_targets/phy_simulators/CMakeLists.txt b/cmake_targets/phy_simulators/CMakeLists.txt
index cf68ca4a9db0b25fc6cb85aca67c005a2d76b409..c5b69b3a2469ca670df36c5f21025c00c6a9c36b 100644
--- a/cmake_targets/phy_simulators/CMakeLists.txt
+++ b/cmake_targets/phy_simulators/CMakeLists.txt
@@ -4,7 +4,6 @@ set ( CMAKE_BUILD_TYPE  )
 set ( CFLAGS_PROCESSOR_USER "" )
 set ( UE_EXPANSION False )
 set ( PRE_SCD_THREAD False )
-set ( UESIM_EXPANSION False )
 set ( ENABLE_VCD_FIFO False )
 set ( RF_BOARD "None")
 set ( TRANSP_PRO "None")
diff --git a/docker/Dockerfile.eNB.rhel8.2 b/docker/Dockerfile.eNB.rhel8.2
index ebd62e49c853b23ed945e9c26924728b7b303450..363b070934b903bc2978a1e88e4db48daadddfd2 100644
--- a/docker/Dockerfile.eNB.rhel8.2
+++ b/docker/Dockerfile.eNB.rhel8.2
@@ -49,6 +49,7 @@ RUN yum update -y && \
         nettle \
         atlas \
         net-tools \
+        iputils \
         iproute \
         libyaml && \
     echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
@@ -120,3 +121,4 @@ WORKDIR /opt/oai-enb
 
 #CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
 #ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
+CMD ["sleep", "infinity"]
diff --git a/docker/Dockerfile.eNB.rhel8.2.oc4-4 b/docker/Dockerfile.eNB.rhel8.2.oc4-4
index b3d9b68af8fbf9bfa9e300121d10c8c2fbbbc1e0..039183a0f22675a62e308744596e9e4e109e6b7d 100644
--- a/docker/Dockerfile.eNB.rhel8.2.oc4-4
+++ b/docker/Dockerfile.eNB.rhel8.2.oc4-4
@@ -51,6 +51,7 @@ RUN yum update -y && \
         atlas \
         net-tools \
         iproute \
+        iputils \
         libyaml && \
     echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
     echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
@@ -121,4 +122,4 @@ WORKDIR /opt/oai-enb
 
 #CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
 #ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
-
+CMD ["sleep", "infinity"]
diff --git a/docker/Dockerfile.eNB.ubuntu18 b/docker/Dockerfile.eNB.ubuntu18
index 334ac1b5f2d8fb14d1b161025c743d7d3c158c41..9b6e5cb47d818f65493fc478b41cf4916b7e8781 100644
--- a/docker/Dockerfile.eNB.ubuntu18
+++ b/docker/Dockerfile.eNB.ubuntu18
@@ -57,6 +57,7 @@ RUN apt-get update && \
         libconfig9 \
         openssl \
         net-tools \
+        iputils-ping \
         iproute2 \
         libyaml-0-2 && \
     # Install UHD driver from ettus ppa 
@@ -120,3 +121,4 @@ WORKDIR /opt/oai-enb
 
 #CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
 #ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
+CMD ["sleep", "infinity"]
diff --git a/docker/Dockerfile.enb.rhel7.oc4-4 b/docker/Dockerfile.enb.rhel7.oc4-4
deleted file mode 100644
index 12d9a196400e06a0d0dffc5b9f5562f863765e39..0000000000000000000000000000000000000000
--- a/docker/Dockerfile.enb.rhel7.oc4-4
+++ /dev/null
@@ -1,92 +0,0 @@
-#/*
-# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
-# * contributor license agreements.  See the NOTICE file distributed with
-# * this work for additional information regarding copyright ownership.
-# * The OpenAirInterface Software Alliance licenses this file to You under
-# * the OAI Public License, Version 1.1  (the "License"); you may not use this file
-# * except in compliance with the License.
-# * You may obtain a copy of the License at
-# *
-# *      http://www.openairinterface.org/?page_id=698
-# *
-# * Unless required by applicable law or agreed to in writing, software
-# * distributed under the License is distributed on an "AS IS" BASIS,
-# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# * See the License for the specific language governing permissions and
-# * limitations under the License.
-# *-------------------------------------------------------------------------------
-# * For more information about the OpenAirInterface (OAI) Software Alliance:
-# *      contact@openairinterface.org
-# */
-#---------------------------------------------------------------------
-#
-# Dockerfile for the Open-Air-Interface eNB service
-#   Valid for RHEL7 in the OpenShift context (v4.4)
-#
-#---------------------------------------------------------------------
-
-
-ARG REGISTRY=localhost
-FROM $REGISTRY/oai-build-base:latest.el7 AS builder
-
-ARG GIT_TAG=v1.1.1
-
-WORKDIR /root
-
-RUN if [ "$EURECOM_PROXY" == true ]; then git config --global http.proxy http://:@proxy.eurecom.fr:8080; fi
-
-RUN git clone --depth=1 --branch=$GIT_TAG https://gitlab.eurecom.fr/oai/openairinterface5g.git
-COPY patches patches/
-RUN patch -p1 -d openairinterface5g < patches/disable_building_nasmesh_and_rbtool.patch \
-    && patch -p1 -d openairinterface5g < patches/disable_sched_fifo_fail_exits.patch
-RUN cd openairinterface5g/cmake_targets \
-    && ln -sf /usr/local/bin/asn1c_oai /usr/local/bin/asn1c \
-    && ln -sf /usr/local/share/asn1c_oai /usr/local/share/asn1c \
-    && ./build_oai -c --eNB -w USRP --verbose-compile
-
-
-FROM registry.redhat.io/ubi7/ubi
-LABEL name="oai-enb" \
-      version="$GIT_TAG" \
-      maintainer="Frank A. Zdarsky <fzdarsky@redhat.com>" \
-      io.k8s.description="openairinterface5g eNB $GIT_TAG." \
-      io.openshift.tags="oai,enb" \
-      io.openshift.non-scalable="true"
-
-RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \
-    && REPOLIST="rhel-7-server-optional-rpms" \
-    && PKGLIST="boost libconfig lksctp-tools protobuf-c iproute iputils procps-ng bind-utils xforms nettle libyaml libusb" \
-    # && yum -y upgrade-minimal --setopt=tsflags=nodocs --security --sec-severity=Critical --sec-severity=Important && \
-    && yum -y install --enablerepo ${REPOLIST} --setopt=tsflag=nodocs ${PKGLIST} \
-    && yum -y clean all \
-    && rm -rf /var/cache/yum
-
-ENV APP_ROOT=/opt/oai-enb
-ENV PATH=${APP_ROOT}:${PATH} HOME=${APP_ROOT}
-COPY --from=builder /root/openairinterface5g/cmake_targets/lte_build_oai/build/lte-softmodem ${APP_ROOT}/bin/
-COPY --from=builder /root/openairinterface5g/cmake_targets/lte_build_oai/build/*.so* /lib64
-COPY --from=builder /usr/local/lib64 /lib64
-COPY --from=builder /usr/local/bin/uhd_* /usr/local/bin
-COPY --from=builder /usr/local/share/uhd /usr/local/share/uhd
-RUN cd /lib64 \
-    && ln -sf liboai_eth_transpro.so liboai_transpro.so \
-    && ln -sf liboai_usrpdevif.so liboai_device.so \
-    && ln -sf libuhd.so.3.13 libuhd.so.3 \
-    && ln -sf libuhd.so.3 libuhd.so
-COPY scripts ${APP_ROOT}/bin/
-COPY configs ${APP_ROOT}/etc/
-RUN chmod -R u+x ${APP_ROOT} && \
-    chgrp -R 0 ${APP_ROOT} && \
-    chmod -R g=u ${APP_ROOT} /etc/passwd
-USER 10001
-WORKDIR ${APP_ROOT}
-
-EXPOSE 2152/udp  # S1U, GTP/UDP
-EXPOSE 22100/tcp # ?
-EXPOSE 36412/udp # S1C, SCTP/UDP
-EXPOSE 36422/udp # X2C, SCTP/UDP
-EXPOSE 50000/udp # IF5 / ORI (control)
-EXPOSE 50001/udp # IF5 / ECPRI (data)
-
-CMD ["/opt/oai-enb/bin/lte-softmodem", "-O", "/opt/oai-enb/etc/enb.conf"]
-ENTRYPOINT ["/opt/oai-enb/bin/entrypoint.sh"]
diff --git a/docker/Dockerfile.gNB.rhel8.2 b/docker/Dockerfile.gNB.rhel8.2
index cde171e20837ecb860dadcd076ef49f057fba904..901df9757ccca49449948019d1931139f1ab18dc 100644
--- a/docker/Dockerfile.gNB.rhel8.2
+++ b/docker/Dockerfile.gNB.rhel8.2
@@ -52,6 +52,8 @@ RUN yum repolist --disablerepo=* && \
         atlas \
         lksctp-tools \
         nettle \
+        net-tools \
+        iputils \
         libyaml && \
     echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
     echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
@@ -123,4 +125,4 @@ WORKDIR /opt/oai-gnb
 
 #CMD ["/opt/oai-gnb/bin/nr-softmodem", "-O", "/opt/oai-gnb/etc/gnb.conf"]
 #ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
-
+CMD ["sleep", "infinity"]
diff --git a/docker/Dockerfile.gNB.rhel8.2.oc4-4 b/docker/Dockerfile.gNB.rhel8.2.oc4-4
index 94d8ca2ea8a8f72d68a4457d5724856e65b59a53..197bc2a92ad9c69b0b1e139e84f674b8f78cb363 100644
--- a/docker/Dockerfile.gNB.rhel8.2.oc4-4
+++ b/docker/Dockerfile.gNB.rhel8.2.oc4-4
@@ -53,6 +53,8 @@ RUN yum repolist --disablerepo=* && \
         atlas \
         lksctp-tools \
         nettle \
+        net-tools \
+        iputils \
         libyaml && \
     echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
     echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
@@ -124,4 +126,4 @@ WORKDIR /opt/oai-gnb
 
 #CMD ["/opt/oai-gnb/bin/nr-softmodem", "-O", "/opt/oai-gnb/etc/gnb.conf"]
 #ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
-
+CMD ["sleep", "infinity"]
diff --git a/docker/Dockerfile.gNB.ubuntu18 b/docker/Dockerfile.gNB.ubuntu18
index 8481d49f9f067a5ed21bfcd6f3d33f17378294d7..4135b0e785f73928724d0531a56fda4c6ea92c09 100644
--- a/docker/Dockerfile.gNB.ubuntu18
+++ b/docker/Dockerfile.gNB.ubuntu18
@@ -59,6 +59,7 @@ RUN apt-get update && \
         openssl \
         net-tools \
         iproute2 \
+        iputils-ping \
         libyaml-0-2 && \
     # Install UHD driver from ettus ppa 
     # At time of writing, it is 3.14
@@ -121,4 +122,4 @@ WORKDIR /opt/oai-gnb
 
 #CMD ["/opt/oai-gnb/bin/nr-softmodem", "-O", "/opt/oai-gnb/etc/gnb.conf"]
 #ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
-
+CMD ["sleep", "infinity"]
diff --git a/docker/Dockerfile.lteUE.rhel8.2 b/docker/Dockerfile.lteUE.rhel8.2
index 32bfbfc60b8050dc090ffb4ebabe39742bad0dd0..6b64fdec1e1950dbc4e8e4067074e6dd64929ac4 100644
--- a/docker/Dockerfile.lteUE.rhel8.2
+++ b/docker/Dockerfile.lteUE.rhel8.2
@@ -51,6 +51,7 @@ RUN yum update -y && \
         atlas \
         iproute \
         net-tools \
+        iputils \
         libyaml && \
     echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
     echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
@@ -114,8 +115,9 @@ RUN ldconfig
 # Copy the relevant configuration files for eNB
 WORKDIR /opt/oai-lte-ue/etc
 COPY --from=lte-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
+COPY --from=lte-ue-build /oai-ran/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf ./ue_usim.conf
 
 WORKDIR /opt/oai-lte-ue
 #CMD ["/opt/oai-lte-ue/bin/lte-uesoftmodem", "-O", "/opt/oai-lte-ue/etc/enb.conf"]
 #ENTRYPOINT ["/opt/oai-lte-ue/bin/entrypoint.sh"]
-
+CMD ["sleep", "infinity"]
diff --git a/docker/Dockerfile.lteUE.rhel8.2.oc4-4 b/docker/Dockerfile.lteUE.rhel8.2.oc4-4
index 431c8caa7fd31877d63a0572fdca37a6a53c27cb..c390e01e3b9210672a1ba21cf90826c26f301c94 100644
--- a/docker/Dockerfile.lteUE.rhel8.2.oc4-4
+++ b/docker/Dockerfile.lteUE.rhel8.2.oc4-4
@@ -51,6 +51,7 @@ RUN yum update -y && \
         atlas \
         iproute \
         net-tools \
+        iputils \
         libyaml && \
     echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
     echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
@@ -114,8 +115,9 @@ RUN ldd /usr/local/lib/libdfts.so
 # Copy the relevant configuration files for eNB
 WORKDIR /opt/oai-lte-ue/etc
 COPY --from=lte-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
+COPY --from=lte-ue-build /oai-ran/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf ./ue_usim.conf
 
 WORKDIR /opt/oai-lte-ue
 #CMD ["/opt/oai-lte-ue/bin/lte-uesoftmodem", "-O", "/opt/oai-lte-ue/etc/enb.conf"]
 #ENTRYPOINT ["/opt/oai-lte-ue/bin/entrypoint.sh"]
-
+CMD ["sleep", "infinity"]
diff --git a/docker/Dockerfile.lteUE.ubuntu18 b/docker/Dockerfile.lteUE.ubuntu18
index 34d2552fafcbcbc15caf696810cf0755f0b5fbc3..f1233d6a01440feffc4f2aa93a65dbf7caf49cdf 100644
--- a/docker/Dockerfile.lteUE.ubuntu18
+++ b/docker/Dockerfile.lteUE.ubuntu18
@@ -58,6 +58,7 @@ RUN apt-get update && \
         libconfig9 \
         openssl \
         net-tools \
+        iputils-ping \
         iproute2 \
         libyaml-0-2 && \
     # Install UHD driver from ettus ppa 
@@ -114,8 +115,9 @@ RUN ldconfig
 # Copy the relevant configuration files for eNB
 WORKDIR /opt/oai-lte-ue/etc
 COPY --from=lte-ue-build /oai-ran/ci-scripts/conf_files/ue.* ./
+COPY --from=lte-ue-build /oai-ran/openair3/NAS/TOOLS/ue_eurecom_test_sfr.conf ./ue_usim.conf
 
 WORKDIR /opt/oai-lte-ue
 #CMD ["/opt/oai-lte-ue/bin/lte-uesoftmodem", "-O", "/opt/oai-lte-ue/etc/enb.conf"]
 #ENTRYPOINT ["/opt/oai-lte-ue/bin/entrypoint.sh"]
-
+CMD ["sleep", "infinity"]
diff --git a/docker/Dockerfile.nrUE.rhel8.2 b/docker/Dockerfile.nrUE.rhel8.2
index 647ba8ba3222bd88f6cd5d4793fe017bc0672a15..466eeedd403dabdfb1835136720003d3c2a387eb 100644
--- a/docker/Dockerfile.nrUE.rhel8.2
+++ b/docker/Dockerfile.nrUE.rhel8.2
@@ -48,6 +48,8 @@ RUN yum update -y && \
     yum install -y --enablerepo="ubi-8-codeready-builder" \
         lksctp-tools \
         nettle \
+        net-tools \
+        iputils \
         atlas \
         libXpm \
         libX11 \
@@ -114,4 +116,4 @@ COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
 WORKDIR /opt/oai-nr-ue
 #CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem", "-O", "/opt/oai-nr-ue/etc/enb.conf"]
 #ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
-
+CMD ["sleep", "infinity"]
diff --git a/docker/Dockerfile.nrUE.rhel8.2.oc4-4 b/docker/Dockerfile.nrUE.rhel8.2.oc4-4
index 0787cb481e29bdf7db7f5764ec293758f1bc509e..3b09b18b552eb5b20c13b3890d509c2e049bfadd 100644
--- a/docker/Dockerfile.nrUE.rhel8.2.oc4-4
+++ b/docker/Dockerfile.nrUE.rhel8.2.oc4-4
@@ -49,6 +49,8 @@ RUN yum update -y && \
     yum install -y --enablerepo="ubi-8-codeready-builder" \
         lksctp-tools \
         nettle \
+        net-tools \
+        iputils \
         atlas \
         libXpm \
         libX11 \
@@ -115,4 +117,4 @@ COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
 WORKDIR /opt/oai-nr-ue
 #CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem", "-O", "/opt/oai-nr-ue/etc/enb.conf"]
 #ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
-
+CMD ["sleep", "infinity"]
diff --git a/docker/Dockerfile.nrUE.ubuntu18 b/docker/Dockerfile.nrUE.ubuntu18
index 32ffbb833bc2752e3aba42184e74a0890d3ef11a..eecadacb507b89b584b1b9dc3d5c3eda9c6e7648 100644
--- a/docker/Dockerfile.nrUE.ubuntu18
+++ b/docker/Dockerfile.nrUE.ubuntu18
@@ -58,6 +58,7 @@ RUN apt-get update && \
         libconfig9 \
         openssl \
         net-tools \
+        iputils-ping \
         iproute2 \
         libyaml-0-2 && \
     # Install UHD driver from ettus ppa 
@@ -114,4 +115,4 @@ COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/ue.* .
 WORKDIR /opt/oai-nr-ue
 #CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem", "-O", "/opt/oai-nr-ue/etc/enb.conf"]
 #ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
-
+CMD ["sleep", "infinity"]
diff --git a/docker/README.md b/docker/README.md
index ca19396a49c085a5778172b20283460049774b66..3966196bb158ffb7f92c1dc586e592b18976890e 100644
--- a/docker/README.md
+++ b/docker/README.md
@@ -1,5 +1,153 @@
+<table style="border-collapse: collapse; border: none;">
+  <tr style="border-collapse: collapse; border: none;">
+    <td style="border-collapse: collapse; border: none;">
+      <a href="http://www.openairinterface.org/">
+         <img src="../doc/images/oai_final_logo.png" alt="" border=3 height=50 width=150>
+         </img>
+      </a>
+    </td>
+    <td style="border-collapse: collapse; border: none; vertical-align: center;">
+      <b><font size = "5">OAI Docker/Podman Build and Usage Procedures</font></b>
+    </td>
+  </tr>
+</table>
+
 ---
 
-to be done
+**Table of Contents**
+
+1. [Build Strategy](#1-build-strategy)
+2. [File organization](#2-file-organization)
+3. [Building using docker under Ubuntu 18.04](#3-building-using-docker-under-ubuntu-1804)
+4. [Building using podman under Red Hat Entreprise Linux 8.2](#4-building-using-podman-under-red-hat-entreprise-linux-82)
+5. [Running modems using docker under Ubuntu 18.04](#5-running-modems-using-docker-under-ubuntu-1804)
+6. [Running modems using podman under Red Hat Entreprise Linux 8.2](#6-running-modems-using-podman-under-red-hat-entreprise-linux-82)
 
 ---
+
+# 1. Build Strategy #
+
+For all platforms, the strategy for building docker/podman images is the same:
+
+*  First we create a common shared image that contains:
+   -  the latest source files (by using the `COPY` function)
+   -  all the means to build an OAI RAN executable
+      *  all packages, compilers, ...
+      *  especially UHD is installed 
+*  Then from this shared image (`ran-build`) we can build target images for:
+   -  eNB
+   -  gNB
+   -  lte-UE
+   -  nr-UE
+*  These target images will only contain:
+   -  the generated executable (for example `lte-softmodem.Rel15`)
+   -  the generated shared libraries (for example `liboai_usrpdevif.so.Rel15`)
+   -  the needed libraries and packages to run these generated binaries
+   -  Some configuration file templates
+   -  Some tools (such as `ping`, `ifconfig`)
+
+TO DO:
+
+-  Proper entrypoints
+-  Proper port exposure
+-  ...
+
+# 2. File organization #
+
+Dockerfiles are named with the following naming convention: `Dockerfile.${target}.${OS-version}.${cluster-version}`
+
+Targets can be:
+
+-  `ran` for an image named `ran-build` (the shared image)
+-  `eNB` for an image named `oai-enb`
+-  `gNB` for an image named `oai-gnb`
+-  `lteUE` for an image named `oai-lte-ue`
+-  `nrUE` for an image named `oai-nr-ue`
+
+The currently-supported OS are:
+
+- `rhel8.2` for Red Hat Entreprise Linux
+- `ubuntu18` for Ubuntu 18.04 LTS
+
+The currently-supported cluster version is:
+
+- `rhel8.2.oc4-4`
+
+We have also `rhel7.oc4-4` support but it will be discontinued soon.
+
+For more details in build within a Openshift Cluster, see [OpenShift README](../openshift/README.md) for more details.
+
+# 3. Building using `docker` under Ubuntu 18.04 #
+
+## 3.1. Pre-requisites ##
+
+* `git` installed
+* `docker-ce` installed
+* Pulling `ubuntu:bionic` from DockerHub
+
+## 3.2. Building the shared image ##
+
+This can be done starting `2020.w41` tag on the `develop` branch, or any branch that includes that tag.
+
+```bash
+git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git
+cd openairinterface5g
+git checkout develop
+```
+
+In our Eurecom/OSA environment we need to pass a GIT proxy.
+
+```bash
+docker build --target ran-build --tag ran-build:latest --file docker/Dockerfile.ran.ubuntu18 --build-arg NEEDED_GIT_PROXY="http://proxy.eurecom.fr:8080" .
+```
+
+if you don't need it, do NOT pass any value:
+
+```bash
+docker build --target ran-build --tag ran-build:latest --file docker/Dockerfile.ran.ubuntu18 .
+```
+
+After a while:
+
+```bash
+docker image ls
+REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
+ran-build           latest              ccb721bc0b57        1 minute ago        4.06GB
+...
+```
+
+## 3.3. Building any target image ##
+
+For example, the eNB:
+
+```bash
+docker build --target oai-enb --tag oai-enb:latest --file docker/Dockerfile.eNB.ubuntu18 .
+```
+
+After a while:
+
+```
+docker image ls
+REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
+oai-enb             latest              25ddbd8b7187        1 minute ago        516MB
+<none>              <none>              875ea3b05b60        8 minutes ago       8.18GB
+ran-build           latest              ccb721bc0b57        1 hour ago          4.06GB
+```
+
+Do not forget to remove the temporary image:
+
+```
+docker image prune --force
+```
+
+# 4. Building using `podman` under Red Hat Entreprise Linux 8.2 #
+
+TODO.
+
+# 5. Running modems using `docker` under Ubuntu 18.04 #
+
+TODO.
+
+# 6. Running modems using `podman` under Red Hat Entreprise Linux 8.2 #
+
+TODO.
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
index 63a1e3c6a853740ff25137d01b06c5e9d4f78e42..c254e1a0282c0971038a83aeabc7c60f1f41a213 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
@@ -1260,7 +1260,7 @@ typedef struct
 
 typedef struct 
 {
-  uint8_t  pdu_idx;//This value is an index for number of PDU identified by nPDU in this message Value: 0 -> 65535
+  uint8_t  pdu_idx;//This value is an index for number of PDU identified by nPDU in this message Value: 0 -> 255
 
 } nfapi_nr_ul_tti_request_number_of_ue_t;
 
@@ -1541,7 +1541,7 @@ typedef struct
 }nfapi_nr_uci_pucch_pdu_format_2_3_4_t;
 
 typedef enum {
-  NFAPI_NR_UCI_PDCCH_PDU_TYPE  = 0,
+  NFAPI_NR_UCI_PUSCH_PDU_TYPE  = 0,
   NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE  = 1,
   NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE = 2,
 } nfapi_nr_uci_pdu_type_e;
diff --git a/openair1/PHY/CODING/crc_byte.c b/openair1/PHY/CODING/crc_byte.c
index 555f314429b5636def3f9e0103764b181206e7ef..287cbcd1f48e4d754238dd042bb3804c57a1765c 100644
--- a/openair1/PHY/CODING/crc_byte.c
+++ b/openair1/PHY/CODING/crc_byte.c
@@ -260,7 +260,7 @@ crc6 (unsigned char * inptr, int bitlen)
   }
 
   if (resbit > 0)
-    crc = (crc << resbit) ^ (crc8Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))] << 24);
+    crc = (crc << resbit) ^ (crc6Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))] << 24);
 
   return crc;
 }
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index 04d8b55511b982475e5b3367134ebfe20d964348..80469f3e815817fc97b8805ed31b4c2472924e78 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -179,9 +179,27 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
   LOG_D(PHY,"Initializing PUSCH DMRS Gold sequence with (%x,%x)\n",Nid_pusch[0],Nid_pusch[1]);
   nr_gold_pusch(gNB, &Nid_pusch[0]);
 
+  //CSI RS init
+  gNB->nr_gold_csi_rs = (uint32_t ***)malloc16(fp->slots_per_frame*sizeof(uint32_t **));
+  uint32_t ***csi_rs = gNB->nr_gold_csi_rs;
+  AssertFatal(csi_rs!=NULL, "NR init: csi reference signal malloc failed\n");
+
+  for (int slot=0; slot<fp->slots_per_frame; slot++) {
+    csi_rs[slot] = (uint32_t **)malloc16(fp->symbols_per_slot*sizeof(uint32_t *));
+    AssertFatal(csi_rs[slot]!=NULL, "NR init: csi reference signal for slot %d - malloc failed\n", slot);
+
+    for (int symb=0; symb<fp->symbols_per_slot; symb++) {
+      csi_rs[slot][symb] = (uint32_t *)malloc16(NR_MAX_CSI_RS_INIT_LENGTH_DWORD*sizeof(uint32_t));
+      AssertFatal(csi_rs[slot][symb]!=NULL, "NR init: csi reference signal for slot %d symbol %d - malloc failed\n", slot, symb);
+    }
+  }
+
+  nr_init_csi_rs(gNB, 0); // TODO scramblingID currently hardcoded to 0, to be taken from higher layer parameter scramblingID when implemented
+
   /// Transport init necessary for NR synchro
   init_nr_transport(gNB);
 
+
   gNB->first_run_I0_measurements = 1;
 
   common_vars->rxdata  = (int32_t **)malloc16(Prx*sizeof(int32_t*));
diff --git a/openair1/PHY/NR_REFSIG/nr_gold.c b/openair1/PHY/NR_REFSIG/nr_gold.c
index 4b007f1292e7780fddebf6fdaf38e8ac38ccb471..b253e7e9045a550bd34f6273933a03449e9e76b8 100644
--- a/openair1/PHY/NR_REFSIG/nr_gold.c
+++ b/openair1/PHY/NR_REFSIG/nr_gold.c
@@ -65,7 +65,7 @@ void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid)
     for (uint8_t symb=0; symb<fp->symbols_per_slot; symb++) {
 
       reset = 1;
-      x2 = ((1<<17) * (14*slot+symb+1) * ((Nid<<1)+1)) + (Nid<<1);
+      x2 = ((1<<17) * (fp->symbols_per_slot*slot+symb+1) * ((Nid<<1)+1) + (Nid<<1));
 
       for (uint32_t n=0; n<NR_MAX_PDCCH_DMRS_INIT_LENGTH_DWORD; n++) {
         pdcch_dmrs[slot][symb][n] = lte_gold_generic(&x1, &x2, reset);
@@ -130,3 +130,26 @@ void nr_gold_pusch(PHY_VARS_gNB* gNB, uint32_t *Nid) {
     }
   }
 }
+
+
+void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid)
+{
+  NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
+  uint32_t ***csi_rs = gNB->nr_gold_csi_rs;
+  uint32_t x1, x2;
+  uint8_t reset;
+
+  for (uint8_t slot=0; slot<fp->slots_per_frame; slot++) {
+    for (uint8_t symb=0; symb<fp->symbols_per_slot; symb++) {
+
+      reset = 1;
+      x2 = ((1<<10) * (fp->symbols_per_slot*slot+symb+1) * ((Nid<<1)+1) + (Nid));
+
+      for (uint32_t n=0; n<NR_MAX_PDCCH_DMRS_INIT_LENGTH_DWORD; n++) {
+        csi_rs[slot][symb][n] = lte_gold_generic(&x1, &x2, reset);
+        reset = 0;
+      }
+    }  
+  }
+
+}
diff --git a/openair1/PHY/NR_REFSIG/nr_refsig.h b/openair1/PHY/NR_REFSIG/nr_refsig.h
index ced7f9eb667b69d14ef8ec532bc24bc5bba0fed9..f82a7880bba5fcc13203a692884ee597795fdc32 100644
--- a/openair1/PHY/NR_REFSIG/nr_refsig.h
+++ b/openair1/PHY/NR_REFSIG/nr_refsig.h
@@ -38,6 +38,7 @@ void nr_init_pbch_dmrs(PHY_VARS_gNB* gNB);
  */
 void nr_init_pdcch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid);
 void nr_init_pdsch_dmrs(PHY_VARS_gNB* gNB, uint32_t Nid);
+void nr_init_csi_rs(PHY_VARS_gNB* gNB, uint32_t Nid);
 
 void nr_gold_pusch(PHY_VARS_gNB* gNB, uint32_t *Nid);
 
diff --git a/openair1/PHY/NR_TRANSPORT/nr_csi_rs.c b/openair1/PHY/NR_TRANSPORT/nr_csi_rs.c
new file mode 100644
index 0000000000000000000000000000000000000000..10090788b4ba33bdb60303ed67c84b73a1cc250b
--- /dev/null
+++ b/openair1/PHY/NR_TRANSPORT/nr_csi_rs.c
@@ -0,0 +1,608 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+
+#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
+#include "PHY/MODULATION/nr_modulation.h"
+
+//#define NR_CSIRS_DEBUG
+
+int nr_generate_csi_rs(uint32_t **gold_csi_rs,
+                       int32_t** txdataF,
+                       int16_t amp,
+                       NR_DL_FRAME_PARMS frame_parms,
+                       nfapi_nr_dl_tti_csi_rs_pdu_rel15_t csi_params)
+{
+
+  int16_t mod_csi[frame_parms.symbols_per_slot][NR_MAX_CSI_RS_LENGTH>>1];
+  uint16_t b = csi_params.freq_domain;
+  uint16_t n, csi_bw, csi_start, p, k, l, mprime, na, kpn, csi_length;
+  uint8_t size, ports, kprime, lprime, i, gs;
+  uint8_t j[16], k_n[6], koverline[16], loverline[16];
+  int found = 0;
+  int wf, wt, lp, kp, symb;
+  uint8_t fi = 0;
+  double rho, alpha;
+  uint32_t beta = amp;
+
+  AssertFatal(b!=0, "Invalid CSI frequency domain mapping: no bit selected in bitmap\n");
+
+  switch (csi_params.row) {
+  // implementation of table 7.4.1.5.3-1 of 38.211
+  // lprime and kprime are the max value of l' and k'
+  case 1:
+    ports = 1;
+    kprime = 0;
+    lprime = 0;
+    size = 3;
+    while (found < 1) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi;
+        found++;
+      }
+      else
+        fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = 0;
+      loverline[i] = csi_params.symb_l0;
+      koverline[i] = k_n[0] + (i<<2);
+    }
+    break;
+
+  case 2:
+    ports = 1;
+    kprime = 0;
+    lprime = 0;
+    size = 1;
+    while (found < 1) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi;
+        found++;
+      }
+      else
+        fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = 0;
+      loverline[i] = csi_params.symb_l0;
+      koverline[i] = k_n[0];
+    }
+    break;
+
+  case 3:
+    ports = 2;
+    kprime = 1;
+    lprime = 0;
+    size = 1;
+    while (found < 1) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<1;
+        found++;
+      }
+      else
+        fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = 0;
+      loverline[i] = csi_params.symb_l0;
+      koverline[i] = k_n[0];
+    }
+    break;
+
+  case 4:
+    ports = 4;
+    kprime = 1;
+    lprime = 0;
+    size = 2;
+    while (found < 1) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<2;
+        found++;
+      }
+      else
+        fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = i;
+      loverline[i] = csi_params.symb_l0;
+      koverline[i] = k_n[0] + (i<<1);
+    }
+    break;
+
+  case 5:
+    ports = 4;
+    kprime = 1;
+    lprime = 0;
+    size = 2;
+    while (found < 1) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<1;
+        found++;
+      }
+      else
+        fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = i;
+      loverline[i] = csi_params.symb_l0 + i;
+      koverline[i] = k_n[0];
+    }
+    break;
+
+  case 6:
+    ports = 8;
+    kprime = 1;
+    lprime = 0;
+    size = 4;
+    while (found < 4) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<1;
+        found++;
+      }
+      fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = i;
+      loverline[i] = csi_params.symb_l0;
+      koverline[i] = k_n[i];
+    }
+    break;
+
+  case 7:
+    ports = 8;
+    kprime = 1;
+    lprime = 0;
+    size = 4;
+    while (found < 2) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<1;
+        found++;
+      }
+      fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = i;
+      loverline[i] = csi_params.symb_l0 + (i>>1);
+      koverline[i] = k_n[i%2];
+    }
+    break;
+
+  case 8:
+    ports = 8;
+    kprime = 1;
+    lprime = 1;
+    size = 2;
+    while (found < 2) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<1;
+        found++;
+      }
+      fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = i;
+      loverline[i] = csi_params.symb_l0;
+      koverline[i] = k_n[i];
+    }
+    break;
+
+  case 9:
+    ports = 12;
+    kprime = 1;
+    lprime = 0;
+    size = 6;
+    while (found < 6) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<1;
+        found++;
+      }
+      fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = i;
+      loverline[i] = csi_params.symb_l0;
+      koverline[i] = k_n[i];
+    }
+    break;
+
+  case 10:
+    ports = 12;
+    kprime = 1;
+    lprime = 1;
+    size = 3;
+    while (found < 3) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<1;
+        found++;
+      }
+      fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = i;
+      loverline[i] = csi_params.symb_l0;
+      koverline[i] = k_n[i];
+    }
+    break;
+
+  case 11:
+    ports = 16;
+    kprime = 1;
+    lprime = 0;
+    size = 8;
+    while (found < 4) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<1;
+        found++;
+      }
+      fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = i;
+      loverline[i] = csi_params.symb_l0 + (i>>2);
+      koverline[i] = k_n[i%4];
+    }
+    break;
+
+  case 12:
+    ports = 16;
+    kprime = 1;
+    lprime = 1;
+    size = 4;
+    while (found < 4) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<1;
+        found++;
+      }
+      fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = i;
+      loverline[i] = csi_params.symb_l0;
+      koverline[i] = k_n[i];
+    }
+    break;
+
+  case 13:
+    ports = 24;
+    kprime = 1;
+    lprime = 0;
+    size = 12;
+    while (found < 3) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<1;
+        found++;
+      }
+      fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = i;
+      if (i<6)
+        loverline[i] = csi_params.symb_l0 + i/3;
+      else
+        loverline[i] = csi_params.symb_l1 + i/9;
+      koverline[i] = k_n[i%3];
+    }
+    break;
+
+  case 14:
+    ports = 24;
+    kprime = 1;
+    lprime = 1;
+    size = 6;
+    while (found < 3) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<1;
+        found++;
+      }
+      fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = i;
+      if (i<3)
+        loverline[i] = csi_params.symb_l0;
+      else
+        loverline[i] = csi_params.symb_l1;
+      koverline[i] = k_n[i%3];
+    }
+    break;
+
+  case 15:
+    ports = 24;
+    kprime = 1;
+    lprime = 3;
+    size = 3;
+    while (found < 3) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<1;
+        found++;
+      }
+      fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = i;
+      loverline[i] = csi_params.symb_l0;
+      koverline[i] = k_n[i];
+    }
+    break;
+
+  case 16:
+    ports = 32;
+    kprime = 1;
+    lprime = 0;
+    size = 16;
+    while (found < 4) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<1;
+        found++;
+      }
+      fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = i;
+      if (i<8)
+        loverline[i] = csi_params.symb_l0 + (i>>2);
+      else
+        loverline[i] = csi_params.symb_l1 + (i/12);
+      koverline[i] = k_n[i%4];
+    }
+    break;
+
+  case 17:
+    ports = 32;
+    kprime = 1;
+    lprime = 1;
+    size = 8;
+    while (found < 4) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<1;
+        found++;
+      }
+      fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = i;
+      if (i<4)
+        loverline[i] = csi_params.symb_l0;
+      else
+        loverline[i] = csi_params.symb_l1;
+      koverline[i] = k_n[i%4];
+    }
+    break;
+
+  case 18:
+    ports = 32;
+    kprime = 1;
+    lprime = 3;
+    size = 4;
+    while (found < 4) {
+      if ((b >> fi) & 0x01) {
+        k_n[found] = fi<<1;
+        found++;
+      }
+      fi++;
+    }
+    for (i=0; i<size; i++) {
+      j[i] = i;
+      loverline[i] = csi_params.symb_l0;
+      koverline[i] = k_n[i];
+    }
+    break;
+
+  default:
+    AssertFatal(0==1, "Row %d is not valid for CSI Table 7.4.1.5.3-1\n", csi_params.row);
+  }
+
+#ifdef NR_CSIRS_DEBUG
+  printf(" row %d, n. of ports %d\n k' ",csi_params.row,ports);
+  for (kp=0; kp<=kprime; kp++)
+    printf("%d, ",kp);
+  printf("l' ");
+  for (lp=0; lp<=lprime; lp++)
+    printf("%d, ",lp);
+  printf("\n k overline ");
+  for (i=0; i<size; i++)
+    printf("%d, ",koverline[i]);
+  printf("\n l overline ");
+  for (i=0; i<size; i++)
+    printf("%d, ",loverline[i]);
+  printf("\n");
+#endif
+
+
+  // setting the frequency density from its index
+  switch (csi_params.freq_density) {
+  
+  case 0:
+    rho = 0.5;
+    break;
+  
+  case 1:
+    rho = 0.5;
+    break;
+
+   case 2:
+    rho = 1;
+    break;
+
+   case 3:
+    rho = 3;
+    break;
+
+  default:
+    AssertFatal(0==1, "Invalid frequency density index for CSI\n");
+  }
+
+  if (ports == 1)
+    alpha = rho;
+  else
+    alpha = 2*rho; 
+
+#ifdef NR_CSIRS_DEBUG
+    printf(" rho %f, alpha %f\n",rho,alpha);
+#endif
+
+  // CDM group size from CDM type index
+  switch (csi_params.cdm_type) {
+  
+  case 0:
+    gs = 1;
+    break;
+  
+  case 1:
+    gs = 2;
+    break;
+
+  case 2:
+    gs = 4;
+    break;
+
+  case 3:
+    gs = 8;
+    break;
+
+  default:
+    AssertFatal(0==1, "Invalid cdm type index for CSI\n");
+  }
+
+  // according to 38.214 5.2.2.3.1 last paragraph
+  if (csi_params.start_rb<csi_params.bwp_start)
+    csi_start = csi_params.bwp_start;
+  else 
+    csi_start = csi_params.start_rb;
+  if (csi_params.nr_of_rbs > (csi_params.bwp_start+csi_params.bwp_size-csi_start))
+    csi_bw = csi_params.bwp_start+csi_params.bwp_size-csi_start;
+  else
+    csi_bw = csi_params.nr_of_rbs;
+
+  if (rho < 1) {
+    if (csi_params.freq_density == 0)
+      csi_length = (((csi_bw + csi_start)>>1)<<kprime)<<1; 
+    else
+      csi_length = ((((csi_bw + csi_start)>>1)<<kprime)+1)<<1;
+  }
+  else
+    csi_length = (((uint16_t) rho*(csi_bw + csi_start))<<kprime)<<1; 
+
+#ifdef NR_CSIRS_DEBUG
+    printf(" start rb %d, n. rbs %d, csi length %d\n",csi_start,csi_bw,csi_length);
+#endif
+
+
+  // TRS
+  if (csi_params.csi_type == 0) {
+    // ???
+  }
+
+  // NZP CSI RS
+  if (csi_params.csi_type == 1) {
+   // assuming amp is the amplitude of SSB channels
+   switch (csi_params.power_control_offset_ss) {
+   case 0:
+    beta = (amp*ONE_OVER_SQRT2_Q15)>>15;
+    break;
+  
+   case 1:
+    beta = amp;
+    break;
+
+   case 2:
+    beta = (amp*ONE_OVER_SQRT2_Q15)>>14;
+    break;
+
+   case 3:
+    beta = amp<<1;
+    break;
+
+  default:
+    AssertFatal(0==1, "Invalid SS power offset density index for CSI\n");
+   }
+
+   for (lp=0; lp<=lprime; lp++){
+     symb = csi_params.symb_l0;
+     nr_modulation(gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]);
+     if ((csi_params.row == 5) || (csi_params.row == 7) || (csi_params.row == 11) || (csi_params.row == 13) || (csi_params.row == 16))
+       nr_modulation(gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]); 
+     if ((csi_params.row == 14) || (csi_params.row == 13) || (csi_params.row == 16) || (csi_params.row == 17)) {
+       symb = csi_params.symb_l1;
+       nr_modulation(gold_csi_rs[symb+lp], csi_length, DMRS_MOD_ORDER, mod_csi[symb+lp]);
+       if ((csi_params.row == 13) || (csi_params.row == 16))
+         nr_modulation(gold_csi_rs[symb+1], csi_length, DMRS_MOD_ORDER, mod_csi[symb+1]); 
+     }
+   }
+      
+  }
+
+  uint16_t start_sc = frame_parms.first_carrier_offset;
+
+  // resource mapping according to 38.211 7.4.1.5.3
+  for (n=csi_start; n<(csi_start+csi_bw); n++) {
+   if ( (csi_params.freq_density > 1) || (csi_params.freq_density == (n%2))) {  // for freq density 0.5 checks if even or odd RB
+    for (int ji=0; ji<size; ji++) { // loop over CDM groups
+      for (int s=0 ; s<gs; s++)  { // loop over each CDM group size
+        p = s+j[ji]*gs; // port index
+        for (kp=0; kp<=kprime; kp++) { // loop over frequency resource elements within a group
+          k = (start_sc+(n*NR_NB_SC_PER_RB)+koverline[ji]+kp)%(frame_parms.ofdm_symbol_size);  // frequency index of current resource element
+          // wf according to tables 7.4.5.3-2 to 7.4.5.3-5 
+          if (kp == 0)
+            wf = 1;
+          else
+            wf = -2*(s%2)+1;
+          na = n*alpha;
+          kpn = (rho*koverline[ji])/NR_NB_SC_PER_RB;
+          mprime = na + kp + kpn; // sequence index
+          for (lp=0; lp<=lprime; lp++) { // loop over frequency resource elements within a group
+            l = lp + loverline[ji];
+            // wt according to tables 7.4.5.3-2 to 7.4.5.3-5 
+            if (s < 2)
+              wt = 1;
+            else if (s < 4)
+              wt = -2*(lp%2)+1;
+            else if (s < 6)
+              wt = -2*(lp/2)+1;
+            else {
+              if ((lp == 0) || (lp == 3))
+                wt = 1;
+              else
+                wt = -1;
+            }
+            // ZP CSI RS
+            if (csi_params.csi_type == 2) {
+              ((int16_t*)txdataF[p])[(l*frame_parms.ofdm_symbol_size + k)<<1] = 0;
+              ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = 0;
+            }
+            else {
+              ((int16_t*)txdataF[p])[(l*frame_parms.ofdm_symbol_size + k)<<1] = (beta*wt*wf*mod_csi[l][mprime<<1]) >> 15;
+              ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1] = (beta*wt*wf*mod_csi[l][(mprime<<1) + 1]) >> 15;
+            }
+#ifdef NR_CSIRS_DEBUG
+            printf("l,k (%d %d)  seq. index %d \t port %d \t (%d,%d)\n",l,k-start_sc,mprime,p+3000,((int16_t*)txdataF[p])[(l*frame_parms.ofdm_symbol_size + k)<<1],
+               ((int16_t*)txdataF[p])[((l*frame_parms.ofdm_symbol_size + k)<<1) + 1]);
+#endif
+          }
+        }
+      }    
+    }
+   }
+  } 
+
+  return 0;
+}
diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
index 417f0d41a3b6e5b38b34664719b123cf59ff1d3c..5228cad98c870a27abc99382367478c7234edeb4 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
@@ -327,6 +327,13 @@ int nr_find_pucch(uint16_t rnti,
 void init_prach_list(PHY_VARS_gNB *gNB);
 void init_prach_ru_list(RU_t *ru);
 void free_nr_ru_prach_entry(RU_t *ru, int prach_id);
+
+int nr_generate_csi_rs(uint32_t **gold_csi_rs,
+                       int32_t **txdataF,
+                       int16_t amp,
+                       NR_DL_FRAME_PARMS frame_parms,
+                       nfapi_nr_dl_tti_csi_rs_pdu_rel15_t csi_params);
+
 void free_nr_prach_entry(PHY_VARS_gNB *gNB, int prach_id);
 
 void nr_decode_pucch1(int32_t **rxdataF,
@@ -354,5 +361,10 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
                       nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu,
                       nfapi_nr_pucch_pdu_t* pucch_pdu);
 
+void nr_decode_pucch2(PHY_VARS_gNB *gNB,
+                      int slot,
+                      nfapi_nr_uci_pucch_pdu_format_2_3_4_t* uci_pdu,
+                      nfapi_nr_pucch_pdu_t* pucch_pdu);
+
 
 #endif /*__NR_TRANSPORT__H__*/
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
index b27e7496f7d9595aa1e66476a2231948233bc309..4622c31db30522a22638bbd242b9822aa89e87cb 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
@@ -1136,8 +1136,8 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
                                 rel15_ul);
 
     for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
-      gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] = signal_energy(&gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][symbol*frame_parms->ofdm_symbol_size],
-                                                                   rel15_ul->rb_size*12);
+      gNB->pusch_vars[ulsch_id]->ulsch_power[aarx] = signal_energy_nodc(&gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][symbol*frame_parms->ofdm_symbol_size],
+                                                                        rel15_ul->rb_size*12);
       if (gNB->pusch_vars[ulsch_id]->ulsch_power[aarx]==1) return (1);
     }
 
diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
index bee868b5a59ba090ccbb0223520f915004b6efa3..1fd89ea5680f65236d9abd72195137d904ee48be 100644
--- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
@@ -96,7 +96,6 @@ void nr_fill_pucch(PHY_VARS_gNB *gNB,
   pucch->slot = slot;
   pucch->active = 1;
   memcpy((void*)&pucch->pucch_pdu, (void*)pucch_pdu, sizeof(nfapi_nr_pucch_pdu_t));
-
 }
 
 
@@ -166,7 +165,6 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
                       nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu,
                       nfapi_nr_pucch_pdu_t* pucch_pdu) {
 
-
   int32_t **rxdataF = gNB->common_vars.rxdataF;
   NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
 
@@ -381,7 +379,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
 #endif
 
   // estimate CQI for MAC (from antenna port 0 only)
-  int SNRtimes10 = dB_fixed_times10(signal_energy(&rxdataF[0][pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size+re_offset],12)) - (10*gNB->measurements.n0_power_tot_dB);
+  int SNRtimes10 = dB_fixed_times10(signal_energy_nodc(&rxdataF[0][pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size+re_offset],12)) - (10*gNB->measurements.n0_power_tot_dB);
   int cqi;
   if (SNRtimes10 < -640) cqi=0;
   else if (SNRtimes10 >  635) cqi=255;
@@ -395,9 +393,9 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
   // first bit of bitmap for sr presence and second bit for acknack presence
   uci_pdu->pduBitmap = pucch_pdu->sr_flag | ((pucch_pdu->bit_len_harq>0)<<1);
   uci_pdu->pucch_format = 0; // format 0
-  uci_pdu->ul_cqi = cqi; // currently not valid
+  uci_pdu->ul_cqi = cqi;
   uci_pdu->timing_advance = 0xffff; // currently not valid
-  uci_pdu->rssi = 1280 - (10*dB_fixed(32767*32767)-dB_fixed_times10(signal_energy(&rxdataF[0][pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size+re_offset],12)));
+  uci_pdu->rssi = 1280 - (10*dB_fixed(32767*32767)-dB_fixed_times10(signal_energy_nodc(&rxdataF[0][pucch_pdu->start_symbol_index*frame_parms->ofdm_symbol_size+re_offset],12)));
   if (pucch_pdu->bit_len_harq==0) {
     uci_pdu->harq = NULL;
     uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
@@ -414,8 +412,8 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
     uci_pdu->harq->harq_confidence_level = (no_conf) ? 1 : 0;
     uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(1);
     uci_pdu->harq->harq_list[0].harq_value = index&0x01;
-    LOG_D(PHY, "HARQ value %d with confidence level (0 is good, 1 is bad) %d\n",
-          uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level);
+    LOG_I(PHY, "Slot %d HARQ value %d with confidence level (0 is good, 1 is bad) %d\n",
+          slot,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level);
     if (pucch_pdu->sr_flag == 1) {
       uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
       uci_pdu->sr->sr_indication = (index>1) ? 1 : 0;
@@ -429,8 +427,8 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
     uci_pdu->harq->harq_list = (nfapi_nr_harq_t*)malloc(2);
     uci_pdu->harq->harq_list[1].harq_value = index&0x01;
     uci_pdu->harq->harq_list[0].harq_value = (index>>1)&0x01;
-    LOG_D(PHY, "HARQ values %d and %d with confidence level (0 is good, 1 is bad) %d\n",
-          uci_pdu->harq->harq_list[1].harq_value,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level);
+    LOG_I(PHY, "Slot %d HARQ values %d and %d with confidence level (0 is good, 1 is bad) %d\n",
+          slot,uci_pdu->harq->harq_list[1].harq_value,uci_pdu->harq->harq_list[0].harq_value,uci_pdu->harq->harq_confidence_level);
     if (pucch_pdu->sr_flag == 1) {
       uci_pdu->sr = calloc(1,sizeof(*uci_pdu->sr));
       uci_pdu->sr->sr_indication = (index>3) ? 1 : 0;
@@ -1091,11 +1089,12 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
   NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
   //pucch_GroupHopping_t pucch_GroupHopping = pucch_pdu->group_hop_flag + (pucch_pdu->sequence_hop_flag<<1);
 
-
-
   AssertFatal(pucch_pdu->nr_of_symbols==1 || pucch_pdu->nr_of_symbols==2,
 	      "Illegal number of symbols  for PUCCH 2 %d\n",pucch_pdu->nr_of_symbols);
 
+  AssertFatal((pucch_pdu->prb_start-((pucch_pdu->prb_start>>2)<<2))==0,
+              "Current pucch2 receiver implementation requires a PRB offset multiple of 4. The one selected is %d",
+              pucch_pdu->prb_start);
 
   //extract pucch and dmrs first
 
@@ -1118,10 +1117,24 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
   int16_t rd_im_ext[Prx2][4*pucch_pdu->nr_of_symbols*pucch_pdu->prb_size] __attribute__((aligned(32)));
   int16_t *r_re_ext_p,*r_im_ext_p,*rd_re_ext_p,*rd_im_ext_p;
 
-  int16_t *rp[Prx2];
+  int nb_re_pucch = 12*pucch_pdu->prb_size;
+
+  int16_t rp[Prx2][nb_re_pucch*2],*tmp_rp;
   __m64 dmrs_re,dmrs_im;
 
-  for (int aa=0;aa<Prx;aa++) rp[aa] = ((int16_t *)&rxdataF[aa][(l2*frame_parms->ofdm_symbol_size)+re_offset]);
+  for (int aa=0;aa<Prx;aa++){
+    tmp_rp = ((int16_t *)&rxdataF[aa][l2*frame_parms->ofdm_symbol_size]);
+
+    if (re_offset + nb_re_pucch < frame_parms->ofdm_symbol_size) {
+      memcpy1((void*)rp[aa],(void*)&tmp_rp[re_offset*2],nb_re_pucch*sizeof(int32_t));
+    }
+    else {
+      int neg_length = frame_parms->ofdm_symbol_size-re_offset;
+      int pos_length = nb_re_pucch-neg_length;
+      memcpy1((void*)rp[aa],(void*)&tmp_rp[re_offset*2],neg_length*sizeof(int32_t));
+      memcpy1((void*)&rp[aa][neg_length*2],(void*)tmp_rp,pos_length*sizeof(int32_t));
+    }
+  }
 
 #ifdef DEBUG_NR_PUCCH_RX
   printf("Decoding pucch2 for %d symbols, %d PRB\n",pucch_pdu->nr_of_symbols,pucch_pdu->prb_size);
@@ -1142,67 +1155,19 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
 	rd_re_ext_p=&rd_re_ext[aa][4*prb];
 	rd_im_ext_p=&rd_im_ext[aa][4*prb];
 
-	r_re_ext_p[0]=rp[aa][0];
-	r_im_ext_p[0]=rp[aa][1];
-	rd_re_ext_p[0]=rp[aa][2];
-	rd_im_ext_p[0]=rp[aa][3];
-	r_re_ext_p[1]=rp[aa][4];
-	r_im_ext_p[1]=rp[aa][5];
-
-	r_re_ext_p[2]=rp[aa][6];
-	r_im_ext_p[2]=rp[aa][7];
-	rd_re_ext_p[1]=rp[aa][8];
-	rd_im_ext_p[1]=rp[aa][9];
-	r_re_ext_p[3]=rp[aa][10];
-	r_im_ext_p[3]=rp[aa][11];
-
-	r_re_ext_p[4]=rp[aa][12];
-	r_im_ext_p[4]=rp[aa][13];
-	rd_re_ext_p[2]=rp[aa][14];
-	rd_im_ext_p[2]=rp[aa][15];
-	r_re_ext_p[5]=rp[aa][16];
-	r_im_ext_p[5]=rp[aa][17];
-
-	r_re_ext_p[6]=rp[aa][18];
-	r_im_ext_p[6]=rp[aa][19];
-	rd_re_ext_p[3]=rp[aa][20];
-	rd_im_ext_p[3]=rp[aa][21];
-	r_re_ext_p[7]=rp[aa][22];
-	r_im_ext_p[7]=rp[aa][23];
-
-	r_re_ext_p[8]=rp[aa][24];
-	r_im_ext_p[8]=rp[aa][25];
-	rd_re_ext_p[4]=rp[aa][26];
-	rd_im_ext_p[4]=rp[aa][27];
-	r_re_ext_p[9]=rp[aa][28];
-	r_im_ext_p[9]=rp[aa][29];
-
-	r_re_ext_p[10]=rp[aa][30];
-	r_im_ext_p[10]=rp[aa][31];
-	rd_re_ext_p[5]=rp[aa][32];
-	rd_im_ext_p[5]=rp[aa][33];
-	r_re_ext_p[11]=rp[aa][34];
-	r_im_ext_p[11]=rp[aa][35];
-
-	r_re_ext_p[12]=rp[aa][36];
-	r_im_ext_p[12]=rp[aa][37];
-	rd_re_ext_p[6]=rp[aa][38];
-	rd_im_ext_p[6]=rp[aa][39];
-	r_re_ext_p[13]=rp[aa][40];
-	r_im_ext_p[13]=rp[aa][41];
-
-	r_re_ext_p[14]=rp[aa][42];
-	r_im_ext_p[14]=rp[aa][43];
-	rd_re_ext_p[7]=rp[aa][44];
-	rd_im_ext_p[7]=rp[aa][45];
-	r_re_ext_p[15]=rp[aa][46];
-	r_im_ext_p[15]=rp[aa][47];
+        for (int idx=0; idx<8; idx++) {
+          r_re_ext_p[idx<<1]=rp[aa][prb*24+6*idx];
+          r_im_ext_p[idx<<1]=rp[aa][prb*24+1+6*idx];
+          rd_re_ext_p[idx]=rp[aa][prb*24+2+6*idx];
+          rd_im_ext_p[idx]=rp[aa][prb*24+3+6*idx];
+          r_re_ext_p[1+(idx<<1)]=rp[aa][prb*24+4+6*idx];
+          r_im_ext_p[1+(idx<<1)]=rp[aa][prb*24+5+6*idx];
+        }
 		  
 #ifdef DEBUG_NR_PUCCH_RX
 	for (int i=0;i<8;i++) printf("Ant %d PRB %d dmrs[%d] -> (%d,%d)\n",aa,prb+(i>>2),i,rd_re_ext_p[i],rd_im_ext_p[i]);
 	for (int i=0;i<16;i++) printf("Ant %d PRB %d data[%d] -> (%d,%d)\n",aa,prb+(i>>3),i,r_re_ext_p[i],r_im_ext_p[i]);
 #endif
-	rp[aa]+=48;
       } // aa
     } // prb
 
@@ -1214,7 +1179,11 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
     printf("slot %d, start_symbol_index %d, dmrs_scrambling_id %d\n",
 	   slot,pucch_pdu->start_symbol_index,pucch_pdu->dmrs_scrambling_id);
 #endif
-    s = lte_gold_generic(&x1, &x2, 1);
+    int reset = 1;
+    for (int i=0; i<=(pucch_pdu->prb_start>>2); i++) {
+      s = lte_gold_generic(&x1, &x2, reset);
+      reset = 0;
+    }
 
     for (int group=0;group<ngroup;group++) {
       // each group has 8*nc_group_size elements, compute 1 complex correlation with DMRS per group
@@ -1476,7 +1445,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
 	
 	for (int aa=0;aa<Prx;aa++) {
 	  LOG_D(PHY,"pucch2 cw %d group %d aa %d: (%d,%d)+(%d,%d) = (%d,%d)\n",cw,group,aa,
-		corr32_re[group][aa],corr32_im[0][aa],
+		corr32_re[group][aa],corr32_im[group][aa],
 		((int16_t*)(&prod_re[aa]))[0],
 		((int16_t*)(&prod_im[aa]))[0],
 		corr32_re[group][aa]+((int16_t*)(&prod_re[aa]))[0],
@@ -1495,7 +1464,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
       }
     } // cw loop
     corr_dB = dB_fixed64((uint64_t)corr);
-    LOG_D(PHY,"cw_ML %d, metric %d dB\n",cw_ML,corr_dB);
+    LOG_I(PHY,"cw_ML %d, metric %d dB\n",cw_ML,corr_dB);
     decodedPayload[0]=(uint64_t)cw_ML;
   }
   else { // polar coded case
@@ -1554,24 +1523,24 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
 	  corr_re = ( corr32_re[half_prb>>2][aa]/(2*nc_group_size*4/2)+((int16_t*)(&prod_re[aa]))[0]);
 	  corr_im = ( corr32_im[half_prb>>2][aa]/(2*nc_group_size*4/2)+((int16_t*)(&prod_im[aa]))[0]);
 	  corr_tmp += corr_re*corr_re + corr_im*corr_im;
-	  /*	  
-	  LOG_D(PHY,"pucch2 half_prb %d cw %d (%d,%d) aa %d: (%d,%d,%d,%d,%d,%d,%d,%d)x(%d,%d,%d,%d,%d,%d,%d,%d)  (%d,%d)+(%d,%d) = (%d,%d) => %d\n",
-		half_prb,cw,cw&15,cw>>4,aa,
-		((int16_t*)&pucch2_polar_4bit[cw&15])[0],((int16_t*)&pucch2_polar_4bit[cw>>4])[0],
-		((int16_t*)&pucch2_polar_4bit[cw&15])[1],((int16_t*)&pucch2_polar_4bit[cw>>4])[1],
-		((int16_t*)&pucch2_polar_4bit[cw&15])[2],((int16_t*)&pucch2_polar_4bit[cw>>4])[2],
-		((int16_t*)&pucch2_polar_4bit[cw&15])[3],((int16_t*)&pucch2_polar_4bit[cw>>4])[3],
-		((int16_t*)&rp_re[aa][half_prb])[0],((int16_t*)&rp_im[aa][half_prb])[0],
-		((int16_t*)&rp_re[aa][half_prb])[1],((int16_t*)&rp_im[aa][half_prb])[1],
-		((int16_t*)&rp_re[aa][half_prb])[2],((int16_t*)&rp_im[aa][half_prb])[2],
-		((int16_t*)&rp_re[aa][half_prb])[3],((int16_t*)&rp_im[aa][half_prb])[3],
-		corr32_re[half_prb>>2][aa]/(2*nc_group_size*4/2),corr32_im[half_prb>>2][aa]/(2*nc_group_size*4/2),
-		((int16_t*)(&prod_re[aa]))[0],
-		((int16_t*)(&prod_im[aa]))[0],
-		corr_re,
-		corr_im,
-		corr_tmp);
-	  */	  
+          /*
+          LOG_D(PHY,"pucch2 half_prb %d cw %d (%d,%d) aa %d: (%d,%d,%d,%d,%d,%d,%d,%d)x(%d,%d,%d,%d,%d,%d,%d,%d)  (%d,%d)+(%d,%d) = (%d,%d) => %d\n",
+                half_prb,cw,cw&15,cw>>4,aa,
+                ((int16_t*)&pucch2_polar_4bit[cw&15])[0],((int16_t*)&pucch2_polar_4bit[cw>>4])[0],
+                ((int16_t*)&pucch2_polar_4bit[cw&15])[1],((int16_t*)&pucch2_polar_4bit[cw>>4])[1],
+                ((int16_t*)&pucch2_polar_4bit[cw&15])[2],((int16_t*)&pucch2_polar_4bit[cw>>4])[2],
+                ((int16_t*)&pucch2_polar_4bit[cw&15])[3],((int16_t*)&pucch2_polar_4bit[cw>>4])[3],
+                ((int16_t*)&rp_re[aa][half_prb])[0],((int16_t*)&rp_im[aa][half_prb])[0],
+                ((int16_t*)&rp_re[aa][half_prb])[1],((int16_t*)&rp_im[aa][half_prb])[1],
+                ((int16_t*)&rp_re[aa][half_prb])[2],((int16_t*)&rp_im[aa][half_prb])[2],
+                ((int16_t*)&rp_re[aa][half_prb])[3],((int16_t*)&rp_im[aa][half_prb])[3],
+                corr32_re[half_prb>>2][aa]/(2*nc_group_size*4/2),corr32_im[half_prb>>2][aa]/(2*nc_group_size*4/2),
+                ((int16_t*)(&prod_re[aa]))[0],
+                ((int16_t*)(&prod_im[aa]))[0],
+                corr_re,
+                corr_im,
+                corr_tmp);
+          */
 	}
 	corr16 = _mm_set1_epi16((int16_t)(corr_tmp>>8));
 	/*	
@@ -1625,26 +1594,34 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
     } // half_prb
     // run polar decoder on llrs
     decoderState = polar_decoder_int16((int16_t*)llrs, decodedPayload, 0, currentPtr);
-    LOG_D(PHY,"UCI decoderState %d, payload[0] %llux\n",decoderState,(unsigned long long)decodedPayload[0]);
+    LOG_D(PHY,"UCI decoderState %d, payload[0] %llu\n",decoderState,(unsigned long long)decodedPayload[0]);
     if (decoderState>0) decoderState=1;
     corr_dB = dB_fixed64(corr);
     LOG_D(PHY,"metric %d dB\n",corr_dB);
   }
+
+  re_offset = (12*pucch_pdu->prb_start) + (12*pucch_pdu->bwp_start) + frame_parms->first_carrier_offset;
+  // estimate CQI for MAC (from antenna port 0 only)
+  int SNRtimes10 = dB_fixed_times10(signal_energy_nodc(&rxdataF[0][(l2*frame_parms->ofdm_symbol_size)+re_offset],12*pucch_pdu->prb_size)) - (10*gNB->measurements.n0_power_tot_dB);
+  int cqi;
+  if (SNRtimes10 < -640) cqi=0;
+  else if (SNRtimes10 >  635) cqi=255;
+  else cqi=(640+SNRtimes10)/5;
+
   uci_pdu->harq.harq_bit_len = pucch_pdu->bit_len_harq;
   uci_pdu->pduBitmap=0;
   uci_pdu->rnti=pucch_pdu->rnti;
   uci_pdu->handle=pucch_pdu->handle;
   uci_pdu->pucch_format=0;
-  uci_pdu->ul_cqi=corr_dB;
-  // need to fill these field!
-  uci_pdu->timing_advance=31;
-  uci_pdu->rssi=0;
+  uci_pdu->ul_cqi=cqi;
+  uci_pdu->timing_advance=0xffff; // currently not valid
+  uci_pdu->rssi=1280 - (10*dB_fixed(32767*32767)-dB_fixed_times10(signal_energy_nodc(&rxdataF[0][(l2*frame_parms->ofdm_symbol_size)+re_offset],12*pucch_pdu->prb_size)));
   if (pucch_pdu->bit_len_harq>0) {
     int harq_bytes=pucch_pdu->bit_len_harq>>3;
     if ((pucch_pdu->bit_len_harq&7) > 0) harq_bytes++;
     uci_pdu->pduBitmap|=1;
     uci_pdu->harq.harq_payload = (uint8_t*)malloc(harq_bytes);
-    uci_pdu->harq.harq_crc = decoderState > 0 ? 1 : 0;
+    uci_pdu->harq.harq_crc = decoderState;
     int i=0;
     for (;i<harq_bytes-1;i++) {
       uci_pdu->harq.harq_payload[i] = decodedPayload[0] & 255;
@@ -1667,19 +1644,18 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
     int csi_part1_bytes=pucch_pdu->bit_len_csi_part1>>3;
     if ((pucch_pdu->bit_len_csi_part1&7) > 0) csi_part1_bytes++;
     uci_pdu->csi_part1.csi_part1_payload = (uint8_t*)malloc(csi_part1_bytes);
-    uci_pdu->csi_part1.csi_part1_crc = decoderState > 0 ? 1 : 0;
+    uci_pdu->csi_part1.csi_part1_crc = decoderState;
     int i=0;
     for (;i<csi_part1_bytes-1;i++) {
       uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & 255;
       decodedPayload[0]>>=8;
     }
     uci_pdu->csi_part1.csi_part1_payload[i] = decodedPayload[0] & ((1<<(pucch_pdu->bit_len_csi_part1&7))-1);
-    decodedPayload[0] >>= pucch_pdu->bit_len_csi_part1;      
+    decodedPayload[0] >>= pucch_pdu->bit_len_csi_part1;
   }
   
   if (pucch_pdu->bit_len_csi_part2>0) {
     uci_pdu->pduBitmap|=8;
   }
-
 }
     
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
index 18376643912e8fc4229bd9bc47f98562cf8f35e6..892c6b769282d9edc41240c59569389ad164ba60 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
@@ -87,6 +87,10 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
                         unsigned char rank_adaptation,
                         uint8_t subframe);
 
+void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
+						uint8_t slot,
+						uint8_t abstraction_flag);
+
 void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue,
                         uint32_t rx_power_fil_dB,
                         uint8_t eNB_id);
@@ -94,4 +98,6 @@ void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue,
 int16_t get_nr_PL(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_index);
 
 
+float_t get_nr_RSRP(module_id_t Mod_id,uint8_t CC_id,uint8_t gNB_index);
+
 #endif
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c b/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c
index 860ca11d8cbccd2fd9a5851708c459f9daa1c296..1dfdfc939f6d27abd072a407ae56d3d870350365 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_ue_measurements.c
@@ -23,6 +23,7 @@
 #include "PHY/phy_extern_nr_ue.h"
 #include "common/utils/LOG/log.h"
 #include "PHY/sse_intrin.h"
+#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
 
 //#define k1 1000
 #define k1 ((long long int) 1000)
@@ -76,6 +77,35 @@ int16_t get_nr_PL(uint8_t Mod_id, uint8_t CC_id, uint8_t gNB_index){
                     //(ue->frame_parms.pdsch_config_common.referenceSignalPower*10))/10));
 }
 
+uint32_t get_nr_rx_total_gain_dB (module_id_t Mod_id,uint8_t CC_id)
+{
+
+  PHY_VARS_NR_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
+
+  if (ue)
+    return ue->rx_total_gain_dB;
+
+  return 0xFFFFFFFF;
+}
+
+
+float_t get_nr_RSRP(module_id_t Mod_id,uint8_t CC_id,uint8_t gNB_index)
+{
+
+  AssertFatal(PHY_vars_UE_g!=NULL,"PHY_vars_UE_g is null\n");
+  AssertFatal(PHY_vars_UE_g[Mod_id]!=NULL,"PHY_vars_UE_g[%d] is null\n",Mod_id);
+  AssertFatal(PHY_vars_UE_g[Mod_id][CC_id]!=NULL,"PHY_vars_UE_g[%d][%d] is null\n",Mod_id,CC_id);
+
+  PHY_VARS_NR_UE *ue = PHY_vars_UE_g[Mod_id][CC_id];
+
+  if (ue)
+    return (10*log10(ue->measurements.rsrp[gNB_index])-
+	    get_nr_rx_total_gain_dB(Mod_id,0) -
+	    10*log10(20*12));
+  return -140.0;
+}
+
+
 void nr_ue_measurements(PHY_VARS_NR_UE *ue,
                          unsigned int subframe_offset,
                          unsigned char N0_symbol,
@@ -191,4 +221,74 @@ void nr_ue_measurements(PHY_VARS_NR_UE *ue,
   _mm_empty();
   _m_empty();
 #endif
-}
\ No newline at end of file
+}
+
+void nr_ue_rsrp_measurements(PHY_VARS_NR_UE *ue,
+    uint8_t slot,
+    uint8_t abstraction_flag)
+{
+	int aarx,rb, symbol_offset;
+	int16_t *rxF;
+
+	uint16_t Nid_cell = ue->frame_parms.Nid_cell;
+	uint8_t eNB_offset=0,l,nushift;
+	uint16_t off,nb_rb;
+//	NR_UE_MAC_INST_t *mac = get_mac_inst(0);
+	int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[slot]].rxdataF;
+
+	nushift =  ue->frame_parms.Nid_cell%4;
+	ue->frame_parms.nushift = nushift;
+	unsigned int  ssb_offset = ue->frame_parms.first_carrier_offset + ue->frame_parms.ssb_start_subcarrier;
+	if (ssb_offset>= ue->frame_parms.ofdm_symbol_size) ssb_offset-=ue->frame_parms.ofdm_symbol_size;
+	
+	symbol_offset = ue->frame_parms.ofdm_symbol_size*(ue->symbol_offset+1);
+
+    ue->measurements.rsrp[eNB_offset] = 0;
+
+    //if (mac->csirc->reportQuantity.choice.ssb_Index_RSRP){ 
+		nb_rb = 20;
+	//} else{
+	//	LOG_E(PHY,"report quantity not supported \n");
+	//}
+
+    if (abstraction_flag == 0) {
+
+      for (l=0; l<1; l++) {
+
+        LOG_D(PHY,"[UE %d]  slot %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, l %d)\n",ue->Mod_id,slot,Nid_cell,nushift,
+              eNB_offset,l);
+
+        for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
+          rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+ssb_offset+nushift)];
+          off  = 0; 
+
+          if (l==0) {
+            for (rb=0; rb<nb_rb; rb++) {
+
+              ue->measurements.rsrp[eNB_offset] += (((int32_t)(rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1]));
+                      //printf("rb %d, off %d : %d\n",rb,off,((((int32_t)rxF[off])*rxF[off])+((int32_t)(rxF[off+1])*rxF[off+1])));
+
+              off = (off+4) % ue->frame_parms.ofdm_symbol_size;
+            }
+          }
+        }
+      }
+
+	  ue->measurements.rsrp[eNB_offset]/=nb_rb;
+
+	} else { 
+
+      ue->measurements.rsrp[eNB_offset] = -93 ;
+    }
+
+
+      if (eNB_offset == 0)
+
+      LOG_I(PHY,"[UE %d] slot %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d)\n",
+            ue->Mod_id,
+            slot,eNB_offset,
+            (eNB_offset>0) ? ue->measurements.adj_cell_id[eNB_offset-1] : ue->frame_parms.Nid_cell,
+            10*log10(ue->measurements.rsrp[eNB_offset])-ue->rx_total_gain_dB,
+            ue->measurements.rsrp[eNB_offset]);
+
+}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
index 0b8111fc32897f7440e48d3d5291e107dd5edb99..dd43fcee5e8e1fb1745b10294d8260adc5cd3c42 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
@@ -1045,7 +1045,11 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
   for (int l=0; l<nrofSymbols; l++) {
     x2 = (((1<<17)*((14*nr_tti_tx) + (l+startingSymbolIndex) + 1)*((2*dmrs_scrambling_id) + 1)) + (2*dmrs_scrambling_id))%(1U<<31); // c_init calculation according to TS38.211 subclause
 
-    s = lte_gold_generic(&x1, &x2, 1);
+    int reset = 1;
+    for (int ii=0; ii<=(startingPRB>>2); ii++) {
+      s = lte_gold_generic(&x1, &x2, reset);
+      reset = 0;
+    }
     m = 0;
     for (int rb=0; rb<nrofPRB; rb++) {
       //startingPRB = startingPRB + rb;
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index 4d5a46c4fd0cf620bd3d85149a1650f3c71faefa..3d73483dfd363c74ac06befc299c00f9fad2fa6a 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -752,6 +752,9 @@ typedef struct PHY_VARS_gNB_s {
   uint32_t rb_mask_ul[9];
   int ulmask_symb;
 
+  /// CSI  RS sequence
+  uint32_t ***nr_gold_csi_rs;
+
   /// Indicator set to 0 after first SR
   uint8_t first_sr[NUMBER_OF_NR_SR_MAX];
 
diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h
index 4caed624bf93d9c26c6d64636a1c889c42824e5e..4630be64dce1f6c208cceeac35602ba8b0972d5a 100644
--- a/openair1/PHY/defs_nr_common.h
+++ b/openair1/PHY/defs_nr_common.h
@@ -82,6 +82,9 @@
 #define NR_MAX_PDSCH_DMRS_LENGTH 3300      //275*6(k)*2(QPSK real+imag) 
 #define NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD 104  // ceil(NR_MAX_PDSCH_DMRS_LENGTH/32)
 
+#define NR_MAX_CSI_RS_LENGTH 4400 //275*8(max allocation per RB)*2(QPSK)
+#define NR_MAX_CSI_RS_INIT_LENGTH_DWORD 138  // ceil(NR_MAX_CSI_RS_LENGTH/32)
+
 #define NR_MAX_PUSCH_DMRS_LENGTH NR_MAX_PDSCH_DMRS_LENGTH 
 #define NR_MAX_PUSCH_DMRS_INIT_LENGTH_DWORD NR_MAX_PDSCH_DMRS_INIT_LENGTH_DWORD
 
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index e574221e33d30765c6675dff20ac918a199ccfe6..914e691669e4858524643799cae5ef662c9f5c60 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -136,8 +136,6 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
   int offset = gNB->CC_id;
   uint8_t ssb_frame_periodicity = 1;  // every how many frames SSB are generated
   int txdataF_offset = (slot%2)*fp->samples_per_slot_wCP;
-
-  
   
   if (cfg->ssb_table.ssb_period.value > 1) 
     ssb_frame_periodicity = 1 <<(cfg->ssb_table.ssb_period.value -1) ; 
@@ -518,7 +516,6 @@ void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
                      0);
     }
   }
-
 }
 
 void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
@@ -540,10 +537,8 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
 
         nfapi_nr_pucch_pdu_t  *pucch_pdu = &pucch->pucch_pdu;
         uint16_t num_ucis;
-
         switch (pucch_pdu->format_type) {
         case 0:
-
           num_ucis = gNB->UL_INFO.uci_ind.num_ucis;
           gNB->UL_INFO.uci_ind.uci_list = &gNB->uci_pdu_list[0];
           gNB->UL_INFO.uci_ind.sfn = frame_rx;
@@ -560,8 +555,25 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
           gNB->UL_INFO.uci_ind.num_ucis += 1;
           pucch->active = 0;
 	  break;
+        case 2:
+          num_ucis = gNB->UL_INFO.uci_ind.num_ucis;
+          gNB->UL_INFO.uci_ind.uci_list = &gNB->uci_pdu_list[0];
+          gNB->UL_INFO.uci_ind.sfn = frame_rx;
+          gNB->UL_INFO.uci_ind.slot = slot_rx;
+          gNB->uci_pdu_list[num_ucis].pdu_type = NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE;
+          gNB->uci_pdu_list[num_ucis].pdu_size = sizeof(nfapi_nr_uci_pucch_pdu_format_2_3_4_t);
+          nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu_format2 = &gNB->uci_pdu_list[num_ucis].pucch_pdu_format_2_3_4;
+
+          nr_decode_pucch2(gNB,
+                           slot_rx,
+                           uci_pdu_format2,
+                           pucch_pdu);
+
+          gNB->UL_INFO.uci_ind.num_ucis += 1;
+          pucch->active = 0;
+          break;
         default:
-	  AssertFatal(1==0,"Only PUCCH format 0 is currently supported\n");
+	  AssertFatal(1==0,"Only PUCCH formats 0 and 2 are currently supported\n");
         }
       }
     }
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index d24c88fd1fe4bdccdff04f251e2c802fe1613310..6e648f3fc01bcc363cb00f83938c00118a217fae 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -50,7 +50,9 @@
 #include "SCHED/phy_procedures_emos.h"
 #endif
 #include "executables/softmodem-common.h"
+#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
 
+//#define DEBUG_PHY_PROC
 #define NR_PDCCH_SCHED
 //#define NR_PDCCH_SCHED_DEBUG
 //#define NR_PUCCH_SCHED
@@ -1649,6 +1651,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
   uint8_t dci_cnt = 0;
   NR_DL_FRAME_PARMS *fp = &ue->frame_parms;
 
+  //NR_UE_MAC_INST_t *mac = get_mac_inst(0);
+  
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN);
 
   LOG_D(PHY," ****** start RX-Chain for Frame.Slot %d.%d ******  \n", frame_rx%1024, nr_tti_rx);
@@ -1687,6 +1691,12 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
 #endif
       
       }
+      
+      //if (mac->csirc->reportQuantity.choice.ssb_Index_RSRP){ 
+        nr_ue_rsrp_measurements(ue,nr_tti_rx,0);
+      //}
+	
+
       nr_ue_pbch_procedures(gNB_id, ue, proc, 0);
 
       if (ue->no_timing_correction==0) {
diff --git a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
index ccbe5021945d7cdd0fa7711b9effe5c69da73c7f..85e315ecdddc56544d1326659d23f27bfed9846a 100644
--- a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
+++ b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
@@ -37,6 +37,8 @@
 #include "PHY/defs_nr_UE.h"
 #include <openair1/SCHED/sched_common.h>
 #include <openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h>
+#include "openair2/LAYER2/NR_MAC_UE/mac_proto.h"
+#include "openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h"
 
 #ifndef NO_RAT_NR
 
@@ -54,6 +56,44 @@
 
 uint8_t nr_is_cqi_TXOp(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t gNB_id);
 uint8_t nr_is_ri_TXOp(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t gNB_id);
+
+long
+binary_search_float_nr(
+  float elements[],
+  long numElem,
+  float value
+)
+//-----------------------------------------------------------------------------
+{
+  long first, last, middle;
+  first = 0;
+  last = numElem-1;
+  middle = (first+last)/2;
+
+  if(value < elements[0]) {
+    return first;
+  }
+
+  if(value >= elements[last]) {
+    return last;
+  }
+
+  while (last - first > 1) {
+    if (elements[middle] > value) {
+      last = middle;
+    } else {
+      first = middle;
+    }
+
+    middle = (first+last)/2;
+  }
+
+  if (first < 0 || first >= numElem) {
+    LOG_E(RRC,"\n Error in binary search float!");
+  }
+
+  return first;
+}
 /*
 void nr_generate_pucch0(int32_t **txdataF,
                         NR_DL_FRAME_PARMS *frame_parms,
@@ -241,7 +281,17 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
   ri_status = ((ue->cqi_report_config[gNB_id].CQI_ReportPeriodic.ri_ConfigIndex>0) &&
                                                          (nr_is_ri_TXOp(ue,proc,gNB_id) == 1));
 
-  csi_status = get_csi_nr(ue, gNB_id, &csi_payload);
+  
+  NR_CSI_MeasConfig_t *csi_MeasConfig = mac->scg->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
+  
+  uint16_t report_slot_csi =csi_MeasConfig->csi_ReportConfigToAddModList->list.array[0]->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320;
+
+  //if (mac->csirc->reportQuantity.choice.ssb_Index_RSRP){ 
+	  if (report_slot_csi == proc->nr_tti_tx)
+		csi_status = get_csi_nr(mac, ue, gNB_id, &csi_payload);
+	  else
+	    csi_status = 0;
+  //}
 
   O_CSI = cqi_status + ri_status + csi_status;
 
@@ -397,7 +447,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
   }
 
   int max_code_rate = 0;
-  int Q_m = BITS_PER_SYMBOL_QPSK; /* default pucch modulation type is QPSK with 2 bits per symbol */
+  //int Q_m = BITS_PER_SYMBOL_QPSK; /* default pucch modulation type is QPSK with 2 bits per symbol */
   int N_sc_ctrl_RB = 0;
   int O_CRC = 0;
 
@@ -426,18 +476,18 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
     case pucch_format3_nr:
     {
       nb_of_prbs = pucch_resource->format.choice.format3->nrofPRBs;
-      if (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->format3->choice.setup->pi2BPSK[0] == 1) {
-        Q_m = BITS_PER_SYMBOL_BPSK; /* set bpsk modulation type with 1 bit per modulation symbol */
-      }
+      //if (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->format3->choice.setup->pi2BPSK[0] == 1) {
+      //  Q_m = BITS_PER_SYMBOL_BPSK; /* set bpsk modulation type with 1 bit per modulation symbol */
+      //}
       N_sc_ctrl_RB = N_SC_RB;
       nb_symbols = nb_symbols_excluding_dmrs[nb_symbols_total-4][index_additional_dmrs][index_hopping];
       break;
     }
     case pucch_format4_nr:
     {
-      if (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->format4->choice.setup->pi2BPSK[0] == 1) {
-        Q_m = BITS_PER_SYMBOL_BPSK; /* set bpsk modulation type with 1 bit per modulation symbol */
-      }
+      //if (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->format4->choice.setup->pi2BPSK[0] == 1) {
+      //  Q_m = BITS_PER_SYMBOL_BPSK; /* set bpsk modulation type with 1 bit per modulation symbol */
+      //}
       nb_symbols = nb_symbols_excluding_dmrs[nb_symbols_total-4][index_additional_dmrs][index_hopping];
       nb_of_prbs = 1;
       subframe_number = nr_tti_tx/(ue->frame_parms.slots_per_subframe);//ttis_per_subframe);
@@ -464,26 +514,27 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
 
     /* TS 38.212 6.3.1.2  Code block segmentation and CRC attachment */
     /* crc attachment can be done depending of payload size */
-    if (N_UCI < 11) {
-      O_CRC = 0;  /* no additional crc bits */
-    }
-    else if ((N_UCI >= 12) && (N_UCI <= 19)) {
-      O_CRC = 6;  /* number of additional crc bits */
-    }
-    else if (N_UCI >= 20) {
-      O_CRC = 11; /* number of additional crc bits */
-    }
+//    if (N_UCI < 11) {
+//      O_CRC = 0;  /* no additional crc bits */
+//    }
+//    else if ((N_UCI >= 12) && (N_UCI <= 19)) {
+//      O_CRC = 6;  /* number of additional crc bits */
+//    }
+//   else if (N_UCI >= 20) {
+//      O_CRC = 11; /* number of additional crc bits */
+//    }
 
     N_UCI = N_UCI + O_CRC;
 
     /* for format 2 and 3, number of prb should be adjusted to minimum value which cope to information size */
-    if (nb_of_prbs > 1 ) {
+    /*if (nb_of_prbs > 1 ) {
       int nb_prb_min = 0;
       int payload_in_bits;
       do {
         nb_prb_min++;
-        payload_in_bits = (nb_prb_min * N_sc_ctrl_RB * nb_symbols * Q_m * max_code_rate)/100; /* code rate has been multiplied by 100 */
-        NR_TST_PHY_PRINTF("PUCCH Adjust number of prb : (N_UCI : %d ) (payload_in_bits : %d) (N_sc_ctrl_RB : %d) (nb_symbols : %d) (Q_m : %d) (max_code_rate*100 : %d) \n",
+        payload_in_bits = (nb_prb_min * N_sc_ctrl_RB * nb_symbols * Q_m * max_code_rate)/100; */ /* code rate has been multiplied by 100 */
+        
+        /*NR_TST_PHY_PRINTF("PUCCH Adjust number of prb : (N_UCI : %d ) (payload_in_bits : %d) (N_sc_ctrl_RB : %d) (nb_symbols : %d) (Q_m : %d) (max_code_rate*100 : %d) \n",
                                                N_UCI,        payload_in_bits,       N_sc_ctrl_RB,       nb_symbols,       Q_m,       max_code_rate);
       } while (N_UCI > payload_in_bits);
 
@@ -494,7 +545,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
       else {
         nb_of_prbs = nb_prb_min;
       }
-    }
+    }*/
 
     /* TS 38.213 9.2.4 for a positive SR transmission, payload b(0) = 0 */
     if ((O_SR == 1) && (format ==  pucch_format1_nr)) {
@@ -986,7 +1037,10 @@ boolean_t select_pucch_resource(PHY_VARS_NR_UE *ue, NR_UE_MAC_INST_t *mac, uint8
               current_resource_id = r_PUCCH;
             }
             else {
-              current_resource_id = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id]->resourceList.list.array[pucch_resource_indicator][0];
+		if (pucch_resource_set_id !=0 )
+			current_resource_id = 3; //TBC mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id]->resourceList.list.array[pucch_resource_indicator][0];
+		else
+			current_resource_id = 1;
             }
           }
 
@@ -1050,7 +1104,7 @@ boolean_t select_pucch_resource(PHY_VARS_NR_UE *ue, NR_UE_MAC_INST_t *mac, uint8
 int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, int uci_size)
 {
   int pucch_resource_set_id = 0;
-  long *pucch_max_pl_bits = NULL;
+  //long *pucch_max_pl_bits = NULL;
 
   /* from TS 38.331 field maxPayloadMinus1
     -- Maximum number of payload bits minus 1 that the UE may transmit using this PUCCH resource set. In a PUCCH occurrence, the UE
@@ -1062,9 +1116,15 @@ int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, int uci_size)
   /* look for the first resource set which supports uci_size number of bits for payload */
   while (pucch_resource_set_id < MAX_NB_OF_PUCCH_RESOURCE_SETS) {
     if (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL) {
-      pucch_max_pl_bits = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id]->maxPayloadMinus1;
-      if (uci_size <= (((pucch_max_pl_bits != NULL) ? *pucch_max_pl_bits : 1706) + 1)) {
-        NR_TST_PHY_PRINTF("PUCCH found resource set %d \n",  pucch_resource_set_id);
+      //pucch_max_pl_bits = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id]->maxPayloadMinus1;
+      if (uci_size <= 2) { //TBC rrc (((pucch_max_pl_bits != NULL) ? *pucch_max_pl_bits : 1706) + 1)) {
+        //NR_TST_PHY_PRINTF("PUCCH found resource set %d max bits %d\n",  pucch_resource_set_id, pucch_max_pl_bits);
+        pucch_resource_set_id = 0;
+        return (pucch_resource_set_id);
+        break;
+      }
+      else {
+	pucch_resource_set_id = 1;
         return (pucch_resource_set_id);
         break;
       }
@@ -1096,7 +1156,7 @@ boolean_t check_pucch_format(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, pucch_format
 {
   pucch_format_nr_t selected_pucch_format;
   pucch_format_nr_t selected_pucch_format_second;
-  NR_SetupRelease_PUCCH_FormatConfig_t *identified_format = NULL;
+  /*NR_SetupRelease_PUCCH_FormatConfig_t *identified_format = NULL;
 
   switch (format_pucch) {
     case pucch_format1_nr:
@@ -1121,12 +1181,12 @@ boolean_t check_pucch_format(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, pucch_format
 
     default:
     break;
-  }
+  }*/
 
-  if ((identified_format != NULL) && (identified_format->choice.setup->nrofSlots[0] != 1)) {
+ /* if ((identified_format != NULL) && (identified_format->choice.setup->nrofSlots[0] != 1)) {
     LOG_E(PHY,"PUCCH not implemented multislots transmission : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
     return (FALSE);
-  }
+  }*/
 
   if (nb_symbols_for_tx <= 2) {
     if (uci_size <= 2) {
@@ -1247,19 +1307,68 @@ uint32_t dummy_csi_payload = 0;
 
 /* FFS TODO_NR code that should be developed */
 
-int get_csi_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint32_t *csi_payload)
+uint16_t get_nr_csi_bitlen(NR_UE_MAC_INST_t *mac) {
+
+  uint16_t csi_bitlen =0;
+  uint16_t rsrp_bitlen = 0;
+  uint16_t diff_rsrp_bitlen = 0;
+  uint16_t nb_ssbri_cri = 0; 
+  uint16_t cri_ssbri_bitlen = 0;
+  
+  NR_CSI_MeasConfig_t *csi_MeasConfig = mac->scg->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
+  struct NR_CSI_ResourceConfig__csi_RS_ResourceSetList__nzp_CSI_RS_SSB * nzp_CSI_RS_SSB = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[0]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB;
+
+  uint16_t nb_csi_ssb_report = nzp_CSI_RS_SSB->csi_SSB_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.count:0;
+  
+  if (0 != nb_csi_ssb_report){
+	  uint8_t nb_ssb_resources =0;
+	  
+  if (NULL != csi_MeasConfig->csi_ReportConfigToAddModList->list.array[0]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
+      nb_ssbri_cri = *(csi_MeasConfig->csi_ReportConfigToAddModList->list.array[0]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
+  else
+      nb_ssbri_cri = 1;
+  
+  nb_ssb_resources = csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[0]->csi_SSB_ResourceList.list.count;
+  
+  if (nb_ssb_resources){
+	cri_ssbri_bitlen =ceil(log2 (nb_ssb_resources));
+	rsrp_bitlen = 7;
+	diff_rsrp_bitlen = 4;
+	}
+  else{
+	cri_ssbri_bitlen =0;
+	rsrp_bitlen = 0;
+	diff_rsrp_bitlen = 0;
+	}
+  
+  csi_bitlen = ((cri_ssbri_bitlen * nb_ssbri_cri) + rsrp_bitlen +(diff_rsrp_bitlen *(nb_ssbri_cri -1 ))) *nb_csi_ssb_report;
+               
+  //printf("get csi bitlen %d nb_ssbri_cri %d nb_csi_report %d nb_resources %d\n", csi_bitlen,nb_ssbri_cri ,nb_csi_ssb_report, nb_ssb_resources);
+  }
+  return csi_bitlen;
+}
+
+int get_csi_nr(NR_UE_MAC_INST_t *mac, PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint32_t *csi_payload)
 {
   VOID_PARAMETER ue;
   VOID_PARAMETER gNB_id;
+  float rsrp_db[7];
+  int nElem = 98;
+  int rsrp_offset = 17;
+  int csi_status = 0;
+  
+  csi_status = get_nr_csi_bitlen(mac);
+  rsrp_db[0] = get_nr_RSRP(0,0,0);
 
-  if (dummy_csi_status == 0) {
+
+  if (csi_status == 0) {
     *csi_payload = 0;
   }
   else {
-    *csi_payload = dummy_csi_payload;
+    *csi_payload = binary_search_float_nr(RSRP_meas_mapping_nr,nElem, rsrp_db[0]) + rsrp_offset;
   }
 
-  return (dummy_csi_status);
+  return (csi_status);
 }
 
 /* FFS TODO_NR code that should be removed */
@@ -1326,6 +1435,9 @@ int get_ics_pucch(NR_PUCCH_Resource_t *pucch_resource, pucch_format_nr_t format_
 
     case pucch_format1_nr:
       return pucch_resource->format.choice.format1->initialCyclicShift;
+      
+    case pucch_format2_nr:
+      return 0;
 
     default:
       return -1;
diff --git a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h
index 089fae9f55cbb328617d4cef498477656713d433..9b53331f503c9c7fb34b860b1834dba1982b5e58 100644
--- a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h
+++ b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h
@@ -60,6 +60,111 @@
 
 /************** VARIABLES *****************************************/
 
+float RSRP_meas_mapping_nr[98] 
+#ifdef INIT_VARIABLES_PUCCH_UE_NR_H 
+= {
+  -140,
+    -139,
+    -138,
+    -137,
+    -136,
+    -135,
+    -134,
+    -133,
+    -132,
+    -131,
+    -130,
+    -129,
+    -128,
+    -127,
+    -126,
+    -125,
+    -124,
+    -123,
+    -122,
+    -121,
+    -120,
+    -119,
+    -118,
+    -117,
+    -116,
+    -115,
+    -114,
+    -113,
+    -112,
+    -111,
+    -110,
+    -109,
+    -108,
+    -107,
+    -106,
+    -105,
+    -104,
+    -103,
+    -102,
+    -101,
+    -100,
+    -99,
+    -98,
+    -97,
+    -96,
+    -95,
+    -94,
+    -93,
+    -92,
+    -91,
+    -90,
+    -89,
+    -88,
+    -87,
+    -86,
+    -85,
+    -84,
+    -83,
+    -82,
+    -81,
+    -80,
+    -79,
+    -78,
+    -77,
+    -76,
+    -75,
+    -74,
+    -73,
+    -72,
+    -71,
+    -70,
+    -69,
+    -68,
+    -67,
+    -66,
+    -65,
+    -64,
+    -63,
+    -62,
+    -61,
+    -60,
+    -59,
+    -58,
+    -57,
+    -56,
+    -55,
+    -54,
+    -53,
+    -52,
+    -51,
+    -50,
+    -49,
+    -48,
+    -47,
+    -46,
+    -45,
+    -44,
+    -43
+  }
+  #endif
+  ;
+  
 /* TS 36.213 Table 9.2.1-1: PUCCH resource sets before dedicated PUCCH resource configuration */
 const initial_pucch_resource_t initial_pucch_resource[NB_INITIAL_PUCCH_RESOURCE]
 #ifdef INIT_VARIABLES_PUCCH_UE_NR_H
@@ -226,12 +331,14 @@ int trigger_periodic_scheduling_request(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_n
     @param csi_payload is updated with CSI
     @returns number of bits of CSI */
 
-int get_csi_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint32_t *csi_payload);
+int get_csi_nr(NR_UE_MAC_INST_t *mac, PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint32_t *csi_payload);
 
 /** \brief This dummy function sets current CSI for simulation
     @param csi_status
     @param csi_payload is updated with CSI
     @returns none */
+    
+uint16_t get_nr_csi_bitlen(NR_UE_MAC_INST_t *mac);
 
 void set_csi_nr(int csi_status, uint32_t csi_payload);
 
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 779a3a8dce7abbf833561be8ea4b2ae2d02f47b1..a4ee4c8c6ef0f6f20999d2e30f1096096849b390 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -537,13 +537,14 @@ int main(int argc, char **argv)
   uint64_t ssb_bitmap;
   fill_scc(rrc.carrier.servingcellconfigcommon,&ssb_bitmap,N_RB_DL,N_RB_DL,mu,mu);
 
+  fix_scc(scc,ssb_bitmap);
+
   fill_default_secondaryCellGroup(scc,
 				  secondaryCellGroup,
 				  0,
 				  1,
 				  n_tx,
 				  0);
-  fix_scc(scc,ssb_bitmap);
 
   xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
 
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
index 833b81f853b1d604d90825eee24dde1ae361e7fe..602e7a0ff59f35dcabb5398c4c019582729996dc 100644
--- a/openair1/SIMULATION/NR_PHY/pbchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -35,6 +35,7 @@
 #include "PHY/NR_REFSIG/refsig_defs_ue.h"
 #include "PHY/MODULATION/modulation_eNB.h"
 #include "PHY/MODULATION/modulation_UE.h"
+#include "PHY/MODULATION/nr_modulation.h"
 #include "PHY/INIT/phy_init.h"
 #include "PHY/NR_TRANSPORT/nr_transport_proto.h"
 #include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index 5494e64eca8a9e1fce967fd4ab77fd8acd85a569..ec0465aed8f35131ec540f8a366245bf5ef98c1f 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -565,13 +565,14 @@ int main(int argc, char **argv)
   uint64_t ssb_bitmap;
   fill_scc(rrc.carrier.servingcellconfigcommon,&ssb_bitmap,N_RB_DL,N_RB_DL,mu,mu);
 
+  fix_scc(scc,ssb_bitmap);
+
   fill_default_secondaryCellGroup(scc,
 				  secondaryCellGroup,
 				  0,
 				  1,
 				  n_tx,
 				  0);
-  fix_scc(scc,ssb_bitmap);
 
   // xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
 
diff --git a/openair2/COMMON/platform_constants.h b/openair2/COMMON/platform_constants.h
index af364437b82e294e9a6a5c050f51c1d951f59aa1..49cb2247bf1e940b8dd9a0ee4a01ac7b2eb48d1b 100644
--- a/openair2/COMMON/platform_constants.h
+++ b/openair2/COMMON/platform_constants.h
@@ -65,18 +65,6 @@
 #define MAX_NR_RRC_UE_CONTEXTS 64
 
 #ifndef UE_EXPANSION
-  // TODO:L2 FAPI simulator.
-  // UESIM_EXPANSION is used to be same value of MAX_MOBILES_PER_ENB
-  // in eNB and UE.
-  // now , if we use --mu option in UE, compiling error will occur.
-  // This problem will be fixed in the future.
-  #ifdef UESIM_EXPANSION
-    #define MAX_MOBILES_PER_ENB         256
-    #define MAX_MOBILES_PER_ENB_NB_IoT  256
-    #define MAX_MOBILES_PER_GNB         256
-    #define MAX_eNB                      2
-    #define MAX_gNB                      2
-  #else
     #ifdef LARGE_SCALE
       #define MAX_MOBILES_PER_ENB         128
       #define MAX_MOBILES_PER_ENB_NB_IoT  128
@@ -90,7 +78,6 @@
       #define MAX_eNB                      2
       #define MAX_gNB                      2
     #endif
-  #endif
 #else
   #define MAX_MOBILES_PER_ENB         256
   #define MAX_MOBILES_PER_ENB_NB_IoT  256
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index 91c1c68a877bb631f2d46e31e597827ea379c1c6..2b662e4808f297d69998610a328510e79ef872d7 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -1457,7 +1457,7 @@ nr_bandentry_t nr_bandtable[] = {
   {5,    824000,  849000,  869000,  894000, 20, 173800, 100},
   {7,   2500000, 2570000, 2620000, 2690000, 20, 524000, 100},
   {8,    880000,  915000,  925000,  960000, 20, 185000, 100},
-  {12,   698000,  716000,  728000,  746000, 20, 145800, 100},
+  {12,   698000,  716000,  729000,  746000, 20, 145800, 100},
   {14,   788000,  798000,  758000,  768000, 20, 151600, 100},
   {18,   815000,  830000,  860000,  875000, 20, 172000, 100},
   {20,   832000,  862000,  791000,  821000, 20, 158200, 100},
@@ -1489,14 +1489,14 @@ nr_bandentry_t nr_bandtable[] = {
   {77,  3300000, 4200000, 3300000, 4200000,  2, 620000,  30},
   {78,  3300000, 3800000, 3300000, 3800000,  1, 620000,  15},
   {78,  3300000, 3800000, 3300000, 3800000,  2, 620000,  30},
-  {79,  4400000, 5000000, 4400000, 5000000,  1, 693334,  15},
-  {79,  4400000, 5000000, 4400000, 5000000,  2, 693334,  30},
+  {79,  4400010, 5000000, 4400010, 5000000,  1, 693334,  15},
+  {79,  4400010, 5000000, 4400010, 5000000,  2, 693334,  30},
   {80,  1710000, 1785000,     000,     000, 20, 342000, 100},
-  {81,   860000,  915000,     000,     000, 20, 176000, 100},
+  {81,   880000,  915000,     000,     000, 20, 176000, 100},
   {82,   832000,  862000,     000,     000, 20, 166400, 100},
   {83,   703000,  748000,     000,     000, 20, 140600, 100},
   {84,  1920000, 1980000,     000,     000, 20, 384000, 100},
-  {86,  1710000, 1780000,     000,     000, 20, 342000, 100},
+  {86,  1710000, 1785000,     000,     000, 20, 342000, 100},
   {89,   824000,  849000,     000,     000, 20, 342000, 100},
   {90,  2496000, 2690000, 2496000, 2690000, 3,  499200,  15},
   {90,  2496000, 2690000, 2496000, 2690000, 6,  499200,  30},
@@ -1506,14 +1506,14 @@ nr_bandentry_t nr_bandtable[] = {
   {93,   880000,  915000, 1427000, 1432000, 20, 285400, 100},
   {94,   880000,  915000, 1432000, 1517000, 20, 286400, 100},
   {95,  2010000, 2025000,     000,     000, 20, 402000, 100},
-  {257,26500000,29500000,26500000,29500000,  1,2054166,  60},
-  {257,26500000,29500000,26500000,29500000,  2,2054167, 120},
-  {258,24250000,27500000,24250000,27500000,  1,2016667,  60},
-  {258,24250000,27500000,24250000,27500000,  2,2016667, 120},
-  {260,37000000,40000000,37000000,40000000,  1,2229166,  60},
-  {260,37000000,40000000,37000000,40000000,  2,2229167, 120},
-  {261,27500000,28350000,27500000,28350000,  1,2070833,  60},
-  {261,27500000,28350000,27500000,28350000,  2,2070833, 120}
+  {257,26500020,29500000,26500020,29500000,  1,2054166,  60},
+  {257,26500080,29500000,26500080,29500000,  2,2054167, 120},
+  {258,24250080,27500000,24250080,27500000,  1,2016667,  60},
+  {258,24250080,27500000,24250080,27500000,  2,2016667, 120},
+  {260,37000020,40000000,37000020,40000000,  1,2229166,  60},
+  {260,37000080,40000000,37000080,40000000,  2,2229167, 120},
+  {261,27500040,28350000,27500040,28350000,  1,2070833,  60},
+  {261,27500040,28350000,27500040,28350000,  2,2070833, 120}
 };
 
 
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
index 97c99b60503275c22e6083e4e0574704a88f6e01..fdee0e76d435fcec588ab7c92c3b62a05441d1a7 100755
--- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
@@ -63,7 +63,11 @@
 #include "NR_PhysicalCellGroupConfig.h"
 #include "NR_CellGroupConfig.h"
 #include "NR_ServingCellConfig.h"
-
+#include "NR_MeasConfig.h"
+#include "fapi_nr_ue_interface.h"
+#include "NR_IF_Module.h"
+#include "PHY/defs_nr_common.h"
+#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac.h"
 
 #define NB_NR_UE_MAC_INST 1
 /*!\brief Maximum number of logical channl group IDs */
@@ -158,6 +162,7 @@ typedef struct {
   NR_CellGroupConfig_t            *scg;
   NR_RACH_ConfigDedicated_t       *rach_ConfigDedicated;
   int                             servCellIndex;
+  NR_CSI_ReportConfig_t           *csirc;
   ////  MAC config
   NR_DRX_Config_t                 *drx_Config;
   NR_SchedulingRequestConfig_t    *schedulingRequestConfig;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index 529ab13d9dcea19e053904b6b2c79da621d2df93..766ce79536d757cf3f8d4b8f70006003df89661e 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -538,7 +538,7 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
       first_symbol_index = 0;
     }
     //  38.213 chapter 13: over two consecutive slots
-    search_space_duration = 2;
+    //search_space_duration = 2;
   }
 
   /// MUX PATTERN 2
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index 943a3ef776d207c45b8296605ba9c34bdff7c752..ab49fcdc8c8947950999ba463f5cce45ddc8b447 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -308,6 +308,7 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, NR_ServingCellConfigComm
 }
 
 
+
 int rrc_mac_config_req_gNB(module_id_t Mod_idP, 
 			   int ssb_SubcarrierOffset,
                            int pdsch_AntennaPorts,
@@ -360,6 +361,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
     if (add_ue == 1 && get_softmodem_params()->phy_test) {
       const int UE_id = add_new_nr_ue(Mod_idP,rnti);
       UE_info->secondaryCellGroup[UE_id] = secondaryCellGroup;
+      compute_csi_bitlen (secondaryCellGroup, UE_info, UE_id);
       struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList =
           secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
       AssertFatal(bwpList->list.count == 1,
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index 63ca351911dc6c3699184a9ebdad663f06d69fc9..4e60bd2ab8e82042799d5971cf18ed97b7c1b53d 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -344,9 +344,8 @@ void nr_schedule_pucch(int Mod_idP,
                        frame_t frameP,
                        sub_frame_t slotP) {
 
-  uint16_t O_uci;
-  uint16_t O_ack;
-  uint8_t SR_flag = 0; // no SR in PUCCH implemented for now
+  uint16_t O_csi, O_ack, O_uci;
+  uint8_t O_sr = 0; // no SR in PUCCH implemented for now
   NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon;
   NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
   AssertFatal(UE_info->active[UE_id],"Cannot find UE_id %d is not active\n",UE_id);
@@ -359,31 +358,36 @@ void nr_schedule_pucch(int Mod_idP,
   NR_sched_pucch *curr_pucch;
 
   for (int k=0; k<nr_ulmix_slots; k++) {
-    curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k];
-    if ((curr_pucch->dai_c > 0) && (frameP == curr_pucch->frame) && (slotP == curr_pucch->ul_slot)) {
-      UL_tti_req->SFN = curr_pucch->frame;
-      UL_tti_req->Slot = curr_pucch->ul_slot;
-      UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE;
-      UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pucch_pdu_t);
-      nfapi_nr_pucch_pdu_t  *pucch_pdu = &UL_tti_req->pdus_list[UL_tti_req->n_pdus].pucch_pdu;
-      memset(pucch_pdu,0,sizeof(nfapi_nr_pucch_pdu_t));
-      UL_tti_req->n_pdus+=1;
+    for (int l=0; l<2; l++) {
+      curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][l];
       O_ack = curr_pucch->dai_c;
-      O_uci = O_ack; // for now we are just sending acknacks in pucch
-
-      LOG_D(MAC, "Scheduling pucch reception for frame %d slot %d\n", frameP, slotP);
-
-      nr_configure_pucch(pucch_pdu,
-			 scc,
-			 ubwp,
-                         curr_pucch->resource_indicator,
-                         O_uci,
-                         O_ack,
-                         SR_flag);
-
-      memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k],
-             0,
-             sizeof(NR_sched_pucch));
+      O_csi = curr_pucch->csi_bits;
+      O_uci = O_ack + O_csi + O_sr;
+      if ((O_uci>0) && (frameP == curr_pucch->frame) && (slotP == curr_pucch->ul_slot)) {
+        UL_tti_req->SFN = curr_pucch->frame;
+        UL_tti_req->Slot = curr_pucch->ul_slot;
+        UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE;
+        UL_tti_req->pdus_list[UL_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pucch_pdu_t);
+        nfapi_nr_pucch_pdu_t  *pucch_pdu = &UL_tti_req->pdus_list[UL_tti_req->n_pdus].pucch_pdu;
+        memset(pucch_pdu,0,sizeof(nfapi_nr_pucch_pdu_t));
+        UL_tti_req->n_pdus+=1;
+
+        LOG_I(MAC,"Scheduling pucch reception for frame %d slot %d with (%d, %d, %d) (SR ACK, CSI) bits\n",
+              frameP,slotP,O_sr,O_ack,curr_pucch->csi_bits);
+
+        nr_configure_pucch(pucch_pdu,
+                           scc,
+                           ubwp,
+                           UE_info->rnti[UE_id],
+                           curr_pucch->resource_indicator,
+                           O_csi,
+                           O_ack,
+                           O_sr);
+
+        memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][l],
+               0,
+               sizeof(NR_sched_pucch));
+      }
     }
   }
 }
@@ -395,6 +399,7 @@ bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot) {
 void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
                                frame_t frame,
                                sub_frame_t slot){
+
   protocol_ctxt_t   ctxt;
   PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frame, slot,module_idP);
  
@@ -411,19 +416,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
   const int num_slots_per_tdd = slots_per_frame[*scc->ssbSubcarrierSpacing] >> (7 - tdd_pattern->dl_UL_TransmissionPeriodicity);
   const int nr_ulmix_slots = tdd_pattern->nrofUplinkSlots + (tdd_pattern->nrofUplinkSymbols!=0);
 
-  if (slot == 0 && UE_info->active[UE_id]) {
-    for (int k=0; k<nr_ulmix_slots; k++) {
-      /* Seems to be covered 384? */
-      /*memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k],
-             0,
-             sizeof(NR_sched_pucch));*/
-      /* Seems to be covered in line 335? */
-      /*memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pusch[k],
-             0,
-             sizeof(NR_sched_pusch));*/
-    }
-  }
-
   start_meas(&RC.nrmac[module_idP]->eNB_scheduler);
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_IN);
 
@@ -466,8 +458,9 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
   // This schedule SR
   // TODO
 
-  // This schedule CSI
-  // TODO
+  // This schedule CSI measurement reporting
+  if (UE_info->active[UE_id])
+    nr_csi_meas_reporting(module_idP, UE_id, frame, slot, num_slots_per_tdd, nr_ulmix_slots, slots_per_frame[*scc->ssbSubcarrierSpacing]);
 
   // This schedule RA procedure if not in phy_test mode
   // Otherwise already consider 5G already connected
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index 4c6558d4f6398a5e19bb45d5b575b6979aec840a..f1d1ed2b725d1c5483272928e3f58cfc3976acf7 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -343,68 +343,98 @@ int nr_generate_dlsch_pdu(module_id_t module_idP,
   return offset;
 }
 
-void handle_nr_uci(NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats, int target_snrx10) {
+void nr_rx_acknack(nfapi_nr_uci_pusch_pdu_t *uci_pusch,
+                   nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_01,
+                   nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_234,
+                   NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats) {
+
   // TODO
   int max_harq_rounds = 4; // TODO define macro
-  int num_ucis = UL_info->uci_ind.num_ucis;
-  nfapi_nr_uci_t *uci_list = UL_info->uci_ind.uci_list;
-
-  for (int i = 0; i < num_ucis; i++) {
-    switch (uci_list[i].pdu_type) {
-      case NFAPI_NR_UCI_PDCCH_PDU_TYPE: break;
-
-      case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: {
-        //if (get_softmodem_params()->phy_test == 0) {
-          nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_pdu = &uci_list[i].pucch_pdu_format_0_1;
-          // handle harq
-          int harq_idx_s = 0;
-          // tpc (power control)
-          sched_ctrl->tpc1 = nr_get_tpc(target_snrx10,uci_pdu->ul_cqi,30);
-          // iterate over received harq bits
-          for (int harq_bit = 0; harq_bit < uci_pdu->harq->num_harq; harq_bit++) {
-            // search for the right harq process
-            for (int harq_idx = harq_idx_s; harq_idx < NR_MAX_NB_HARQ_PROCESSES; harq_idx++) {
-              // if the gNB received ack with a good confidence
-              if ((UL_info->slot-1) == sched_ctrl->harq_processes[harq_idx].feedback_slot) {
-                if ((uci_pdu->harq->harq_list[harq_bit].harq_value == 1) &&
-                    (uci_pdu->harq->harq_confidence_level == 0)) {
-                  // toggle NDI and reset round
-                  sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
-                  sched_ctrl->harq_processes[harq_idx].round = 0;
-                }
-                else
-                  sched_ctrl->harq_processes[harq_idx].round++;
-                sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
-                harq_idx_s = harq_idx + 1;
-                // if the max harq rounds was reached
-                if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
-                  sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
-                  sched_ctrl->harq_processes[harq_idx].round = 0;
-                  stats->dlsch_errors++;
-                }
-                break;
-              }
-              // if feedback slot processing is aborted
-              else if (((UL_info->slot-1) > sched_ctrl->harq_processes[harq_idx].feedback_slot) &&
-                      (sched_ctrl->harq_processes[harq_idx].is_waiting)) {
-                sched_ctrl->harq_processes[harq_idx].round++;
-                if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
-                  sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
-                  sched_ctrl->harq_processes[harq_idx].round = 0;
-                }
-                sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
-              }
-            }
+
+  if (uci_01 != NULL) {
+    // handle harq
+    int harq_idx_s = 0;
+
+    // iterate over received harq bits
+    for (int harq_bit = 0; harq_bit < uci_01->harq->num_harq; harq_bit++) {
+      // search for the right harq process
+      for (int harq_idx = harq_idx_s; harq_idx < NR_MAX_NB_HARQ_PROCESSES; harq_idx++) {
+        // if the gNB received ack with a good confidence
+        if ((UL_info->slot-1) == sched_ctrl->harq_processes[harq_idx].feedback_slot) {
+          if ((uci_01->harq->harq_list[harq_bit].harq_value == 1) &&
+              (uci_01->harq->harq_confidence_level == 0)) {
+            // toggle NDI and reset round
+            sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
+            sched_ctrl->harq_processes[harq_idx].round = 0;
+          }
+          else
+            sched_ctrl->harq_processes[harq_idx].round++;
+          sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
+          harq_idx_s = harq_idx + 1;
+          // if the max harq rounds was reached
+          if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
+            sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
+            sched_ctrl->harq_processes[harq_idx].round = 0;
+            stats->dlsch_errors++;
+          }
+          break;
+        }
+        // if feedback slot processing is aborted
+        else if (((UL_info->slot-1) > sched_ctrl->harq_processes[harq_idx].feedback_slot) &&
+                 (sched_ctrl->harq_processes[harq_idx].is_waiting)) {
+          sched_ctrl->harq_processes[harq_idx].round++;
+          if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
+            sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
+            sched_ctrl->harq_processes[harq_idx].round = 0;
           }
-        //}
-        break;
+          sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
+        }
       }
-
-      case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: break;
     }
   }
 
-  UL_info->uci_ind.num_ucis = 0;
+
+  if (uci_234 != NULL) {
+    int harq_idx_s = 0;
+    int acknack;
+
+    // iterate over received harq bits
+    for (int harq_bit = 0; harq_bit < uci_234->harq.harq_bit_len; harq_bit++) {
+      acknack = ((uci_234->harq.harq_payload[harq_bit>>3])>>harq_bit)&0x01;
+      for (int harq_idx = harq_idx_s; harq_idx < NR_MAX_NB_HARQ_PROCESSES-1; harq_idx++) {
+        // if the gNB received ack with a good confidence or if the max harq rounds was reached
+        if ((UL_info->slot-1) == sched_ctrl->harq_processes[harq_idx].feedback_slot) {
+          // TODO add some confidence level for when there is no CRC
+          if ((uci_234->harq.harq_crc != 1) && acknack) {
+            // toggle NDI and reset round
+            sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
+            sched_ctrl->harq_processes[harq_idx].round = 0;
+          }
+          else
+            sched_ctrl->harq_processes[harq_idx].round++;
+          sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
+          harq_idx_s = harq_idx + 1;
+          // if the max harq rounds was reached
+          if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
+            sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
+            sched_ctrl->harq_processes[harq_idx].round = 0;
+            stats->dlsch_errors++;
+          }
+          break;
+        }
+        // if feedback slot processing is aborted
+        else if (((UL_info->slot-1) > sched_ctrl->harq_processes[harq_idx].feedback_slot) &&
+                 (sched_ctrl->harq_processes[harq_idx].is_waiting)) {
+          sched_ctrl->harq_processes[harq_idx].round++;
+          if (sched_ctrl->harq_processes[harq_idx].round == max_harq_rounds) {
+            sched_ctrl->harq_processes[harq_idx].ndi ^= 1;
+            sched_ctrl->harq_processes[harq_idx].round = 0;
+          }
+          sched_ctrl->harq_processes[harq_idx].is_waiting = 0;
+        }
+      }
+    }
+  }
 }
 
 int getNrOfSymbols(NR_BWP_Downlink_t *bwp, int tda) {
@@ -505,8 +535,14 @@ void nr_simple_dlsch_preprocessor(module_id_t module_id,
   UE_info->num_pdcch_cand[UE_id][cid]++;
 
   /* Find PUCCH occasion */
-  nr_update_pucch_scheduling(
-      module_id, UE_id, frame, slot, num_slots_per_tdd, &sched_ctrl->pucch_sched_idx);
+  nr_acknack_scheduling(module_id,
+                        UE_id,
+                        frame,
+                        slot,
+                        num_slots_per_tdd,
+                        &sched_ctrl->pucch_sched_idx,
+                        &sched_ctrl->pucch_occ_idx);
+
   AssertFatal(sched_ctrl->pucch_sched_idx >= 0, "no uplink slot for PUCCH found!\n");
 
   uint8_t *vrb_map = RC.nrmac[module_id]->common_channels[CC_id].vrb_map;
@@ -634,7 +670,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
 
     const int current_harq_pid = sched_ctrl->current_harq_pid;
     NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid];
-    NR_sched_pucch *pucch = &sched_ctrl->sched_pucch[sched_ctrl->pucch_sched_idx];
+    NR_sched_pucch *pucch = &sched_ctrl->sched_pucch[sched_ctrl->pucch_sched_idx][sched_ctrl->pucch_occ_idx];
     harq->feedback_slot = pucch->ul_slot;
     harq->is_waiting = 1;
     UE_info->mac_stats[UE_id].dlsch_rounds[harq->round]++;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index 4ee4e292136065546e3a7ba988d4cec5f7227856..b259b987cb0dfb06c8383f8c93a3749ef2f60b8e 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -369,7 +369,6 @@ int configure_fapi_dl_pdu_phytest(int Mod_idP,
   dci_pdu_rel15[0].ndi = UE_info->UE_sched_ctrl[UE_id].harq_processes[current_harq_pid].ndi;
   // DAI
   dci_pdu_rel15[0].dai[0].val = (pucch_sched->dai_c-1)&3;
-
   // TPC for PUCCH
   dci_pdu_rel15[0].tpc = UE_info->UE_sched_ctrl[UE_id].tpc1; // table 7.2.1-1 in 38.213
   // PUCCH resource indicator
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index 89bb360ff8133d647e1f97a610ebb5ce14076c09..cc10f6884216a0110f3e4b60af5bfe2254b01cae 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -735,10 +735,11 @@ void nr_configure_pdcch(gNB_MAC_INST *nr_mac,
 void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
 			NR_ServingCellConfigCommon_t *scc,
 			NR_BWP_Uplink_t *bwp,
+                        uint16_t rnti,
                         uint8_t pucch_resource,
-                        uint16_t O_uci,
+                        uint16_t O_csi,
                         uint16_t O_ack,
-                        uint8_t SR_flag) {
+                        uint8_t O_sr) {
 
   NR_PUCCH_Config_t *pucch_Config;
   NR_PUCCH_Resource_t *pucchres;
@@ -753,6 +754,8 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
 
   pucch_pdu->bit_len_harq = O_ack;
 
+  uint16_t O_uci = O_csi + O_ack;
+
   if (bwp) { // This is not the InitialBWP
 
     NR_PUSCH_Config_t *pusch_Config = bwp->bwp_Dedicated->pusch_Config->choice.setup;
@@ -815,7 +818,7 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
         else 
           AssertFatal(1==0,"Couldn't fine pucch resource indicator %d in PUCCH resource set %d for %d UCI bits",pucch_resource,i,O_uci);
       }
-      else {
+      if (pucchresset->pucch_ResourceSetId == 1 && O_uci>2) {
         N3 = pucchresset->maxPayloadMinus1!= NULL ?  *pucchresset->maxPayloadMinus1 : 1706;
         if (N2<O_uci && N3>O_uci) {
           if (pucch_resource < n_list)
@@ -841,6 +844,7 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
       if (pucchres->pucch_ResourceId == *resource_id) {
         res_found = 1;
         pucch_pdu->prb_start = pucchres->startingPRB;
+        pucch_pdu->rnti = rnti;
         // FIXME why there is only one frequency hopping flag
         // what about inter slot frequency hopping?
         pucch_pdu->freq_hop_flag = pucchres->intraSlotFrequencyHopping!= NULL ?  1 : 0;
@@ -851,7 +855,7 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
             pucch_pdu->initial_cyclic_shift = pucchres->format.choice.format0->initialCyclicShift;
             pucch_pdu->nr_of_symbols = pucchres->format.choice.format0->nrofSymbols;
             pucch_pdu->start_symbol_index = pucchres->format.choice.format0->startingSymbolIndex;
-            pucch_pdu->sr_flag = SR_flag;
+            pucch_pdu->sr_flag = O_sr;
             break;
           case NR_PUCCH_Resource__format_PR_format1 :
             pucch_pdu->format_type = 1;
@@ -859,21 +863,23 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
             pucch_pdu->nr_of_symbols = pucchres->format.choice.format1->nrofSymbols;
             pucch_pdu->start_symbol_index = pucchres->format.choice.format1->startingSymbolIndex;
             pucch_pdu->time_domain_occ_idx = pucchres->format.choice.format1->timeDomainOCC;
-            pucch_pdu->sr_flag = SR_flag;
+            pucch_pdu->sr_flag = O_sr;
             break;
           case NR_PUCCH_Resource__format_PR_format2 :
             pucch_pdu->format_type = 2;
             pucch_pdu->nr_of_symbols = pucchres->format.choice.format2->nrofSymbols;
             pucch_pdu->start_symbol_index = pucchres->format.choice.format2->startingSymbolIndex;
-            pucch_pdu->prb_size = pucchres->format.choice.format2->nrofPRBs;
             pucch_pdu->data_scrambling_id = pusch_id!= NULL ? *pusch_id : *scc->physCellId;
             pucch_pdu->dmrs_scrambling_id = id0!= NULL ? *id0 : *scc->physCellId;
+            pucch_pdu->prb_size = compute_pucch_prb_size(2,pucchres->format.choice.format2->nrofPRBs,
+                                                         O_uci+O_sr,O_csi,pucch_Config->format2->choice.setup->maxCodeRate,
+                                                         2,pucchres->format.choice.format2->nrofSymbols,8);
+            pucch_pdu->bit_len_csi_part1 = O_csi;
             break;
           case NR_PUCCH_Resource__format_PR_format3 :
             pucch_pdu->format_type = 3;
             pucch_pdu->nr_of_symbols = pucchres->format.choice.format3->nrofSymbols;
             pucch_pdu->start_symbol_index = pucchres->format.choice.format3->startingSymbolIndex;
-            pucch_pdu->prb_size = pucchres->format.choice.format3->nrofPRBs;
             pucch_pdu->data_scrambling_id = pusch_id!= NULL ? *pusch_id : *scc->physCellId;
             if (pucch_Config->format3 == NULL) {
               pucch_pdu->pi_2bpsk = 0;
@@ -884,6 +890,19 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
               pucch_pdu->pi_2bpsk = pucchfmt->pi2BPSK!= NULL ?  1 : 0;
               pucch_pdu->add_dmrs_flag = pucchfmt->additionalDMRS!= NULL ?  1 : 0;
             }
+            int f3_dmrs_symbols;
+            if (pucchres->format.choice.format3->nrofSymbols==4)
+              f3_dmrs_symbols = 1<<pucch_pdu->freq_hop_flag;
+            else {
+              if(pucchres->format.choice.format3->nrofSymbols<10)
+                f3_dmrs_symbols = 2;
+              else
+                f3_dmrs_symbols = 2<<pucch_pdu->add_dmrs_flag;
+            }
+            pucch_pdu->prb_size = compute_pucch_prb_size(3,pucchres->format.choice.format3->nrofPRBs,
+                                                         O_uci+O_sr,O_csi,pucch_Config->format3->choice.setup->maxCodeRate,
+                                                         2-pucch_pdu->pi_2bpsk,pucchres->format.choice.format3->nrofSymbols-f3_dmrs_symbols,12);
+            pucch_pdu->bit_len_csi_part1 = O_csi;
             break;
           case NR_PUCCH_Resource__format_PR_format4 :
             pucch_pdu->format_type = 4;
@@ -901,6 +920,7 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
               pucch_pdu->pi_2bpsk = pucchfmt->pi2BPSK!= NULL ?  1 : 0;
               pucch_pdu->add_dmrs_flag = pucchfmt->additionalDMRS!= NULL ?  1 : 0;
             }
+            pucch_pdu->bit_len_csi_part1 = O_csi;
             break;
           default :
             AssertFatal(1==0,"Undefined PUCCH format \n");
@@ -916,6 +936,84 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
 }
 
 
+uint16_t compute_pucch_prb_size(uint8_t format,
+                                uint8_t nr_prbs,
+                                uint16_t O_tot,
+                                uint16_t O_csi,
+                                NR_PUCCH_MaxCodeRate_t *maxCodeRate,
+                                uint8_t Qm,
+                                uint8_t n_symb,
+                                uint8_t n_re_ctrl) {
+
+  uint16_t O_crc;
+
+  if (O_tot<12)
+    O_crc = 0;
+  else{
+    if (O_tot<20)
+      O_crc = 6;
+    else {
+      if (O_tot<360)
+        O_crc = 11;
+      else
+        AssertFatal(1==0,"Case for segmented PUCCH not yet implemented");
+    }
+  }
+
+  int rtimes100;
+  switch(*maxCodeRate){
+    case NR_PUCCH_MaxCodeRate_zeroDot08 :
+      rtimes100 = 8;
+      break;
+    case NR_PUCCH_MaxCodeRate_zeroDot15 :
+      rtimes100 = 15;
+      break;
+    case NR_PUCCH_MaxCodeRate_zeroDot25 :
+      rtimes100 = 25;
+      break;
+    case NR_PUCCH_MaxCodeRate_zeroDot35 :
+      rtimes100 = 35;
+      break;
+    case NR_PUCCH_MaxCodeRate_zeroDot45 :
+      rtimes100 = 45;
+      break;
+    case NR_PUCCH_MaxCodeRate_zeroDot60 :
+      rtimes100 = 60;
+      break;
+    case NR_PUCCH_MaxCodeRate_zeroDot80 :
+      rtimes100 = 80;
+      break;
+  default :
+    AssertFatal(1==0,"Invalid MaxCodeRate");
+  }
+
+  float r = (float)rtimes100/100;
+
+  if (O_csi == O_tot) {
+    if ((O_tot+O_csi)>(nr_prbs*n_re_ctrl*n_symb*Qm*r))
+      AssertFatal(1==0,"MaxCodeRate %.2f can't support %d UCI bits and %d CRC bits with %d PRBs",
+                  r,O_tot,O_crc,nr_prbs);
+    else
+      return nr_prbs;
+  }
+
+  if (format==2){
+    // TODO fix this for multiple CSI reports
+    for (int i=1; i<=nr_prbs; i++){
+      if((O_tot+O_crc)<=(i*n_symb*Qm*n_re_ctrl*r) &&
+         (O_tot+O_crc)>((i-1)*n_symb*Qm*n_re_ctrl*r))
+        return i;
+    }
+    AssertFatal(1==0,"MaxCodeRate %.2f can't support %d UCI bits and %d CRC bits with at most %d PRBs",
+                r,O_tot,O_crc,nr_prbs);
+  }
+  else{
+    AssertFatal(1==0,"Not yet implemented");
+  }
+
+}
+
+
 void prepare_dci(NR_CellGroupConfig_t *secondaryCellGroup,
                  dci_pdu_rel15_t *dci_pdu_rel15,
                  nr_dci_format_t format,
@@ -1686,15 +1784,21 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP){
     memset((void *) &UE_info->UE_sched_ctrl[UE_id],
            0,
            sizeof(NR_UE_sched_ctrl_t));
+
     UE_info->UE_sched_ctrl[UE_id].ta_timer = 100;
     UE_info->UE_sched_ctrl[UE_id].ta_update = 31;
     UE_info->UE_sched_ctrl[UE_id].ul_rssi = 0;
-    UE_info->UE_sched_ctrl[UE_id].sched_pucch = (NR_sched_pucch *)malloc(num_slots_ul*sizeof(NR_sched_pucch));
+    UE_info->UE_sched_ctrl[UE_id].sched_pucch = (NR_sched_pucch **)malloc(num_slots_ul*sizeof(NR_sched_pucch *));
+    for (int s=0; s<num_slots_ul;s++)
+      UE_info->UE_sched_ctrl[UE_id].sched_pucch[s] = (NR_sched_pucch *)malloc(2*sizeof(NR_sched_pucch));
     UE_info->UE_sched_ctrl[UE_id].sched_pusch = (NR_sched_pusch *)malloc(num_slots_ul*sizeof(NR_sched_pusch));
+
     for (int k=0; k<num_slots_ul; k++) {
-      memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k],
-             0,
-             sizeof(NR_sched_pucch));
+      for (int l=0; l<2; l++)
+        memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][l],
+               0,
+               sizeof(NR_sched_pucch));
+
       memset((void *) &UE_info->UE_sched_ctrl[UE_id].sched_pusch[k],
              0,
              sizeof(NR_sched_pusch));
@@ -1817,50 +1921,302 @@ void get_pdsch_to_harq_feedback(int Mod_idP,
   }
 }
 
+
+uint16_t nr_get_csi_bitlen(int Mod_idP,
+                           int UE_id,
+                           uint8_t csi_report_id) {
+
+  uint16_t csi_bitlen =0;
+  NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
+  CRI_SSBRI_RSRP_bitlen_t * CSI_report_bitlen = NULL;
+
+  CSI_report_bitlen = &(UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0]);
+  csi_bitlen = ((CSI_report_bitlen->cri_ssbri_bitlen * CSI_report_bitlen->nb_ssbri_cri) +
+               CSI_report_bitlen->rsrp_bitlen +(CSI_report_bitlen->diff_rsrp_bitlen *
+               (CSI_report_bitlen->nb_ssbri_cri -1 )) *UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report);
+
+  return csi_bitlen;
+}
+
+
+void csi_period_offset(NR_CSI_ReportConfig_t *csirep,
+                       int *period, int *offset) {
+
+    NR_CSI_ReportPeriodicityAndOffset_PR p_and_o = csirep->reportConfigType.choice.periodic->reportSlotConfig.present;
+
+    switch(p_and_o){
+      case NR_CSI_ReportPeriodicityAndOffset_PR_slots4:
+        *period = 4;
+        *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots4;
+        break;
+      case NR_CSI_ReportPeriodicityAndOffset_PR_slots5:
+        *period = 5;
+        *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots5;
+        break;
+      case NR_CSI_ReportPeriodicityAndOffset_PR_slots8:
+        *period = 8;
+        *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots8;
+        break;
+      case NR_CSI_ReportPeriodicityAndOffset_PR_slots10:
+        *period = 10;
+        *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots10;
+        break;
+      case NR_CSI_ReportPeriodicityAndOffset_PR_slots16:
+        *period = 16;
+        *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots16;
+        break;
+      case NR_CSI_ReportPeriodicityAndOffset_PR_slots20:
+        *period = 20;
+        *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots20;
+        break;
+      case NR_CSI_ReportPeriodicityAndOffset_PR_slots40:
+        *period = 40;
+        *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots40;
+        break;
+      case NR_CSI_ReportPeriodicityAndOffset_PR_slots80:
+        *period = 80;
+        *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots80;
+        break;
+      case NR_CSI_ReportPeriodicityAndOffset_PR_slots160:
+        *period = 160;
+        *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots160;
+        break;
+      case NR_CSI_ReportPeriodicityAndOffset_PR_slots320:
+        *period = 320;
+        *offset = csirep->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320;
+        break;
+    default:
+      AssertFatal(1==0,"No periodicity and offset resource found in CSI report");
+    }
+}
+
+
+//!TODO : same function can be written to handle csi_resources
+void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t *UE_info, int UE_id) {
+  uint8_t csi_report_id = 0;
+  uint8_t csi_resourceidx =0;
+  uint8_t csi_ssb_idx =0;
+
+  NR_CSI_MeasConfig_t *csi_MeasConfig = secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
+  NR_CSI_ResourceConfigId_t csi_ResourceConfigId;
+  for (csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
+    csi_ResourceConfigId=csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->resourcesForChannelMeasurement;
+    UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->reportQuantity.present;
+
+    for ( csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) {
+      if ( csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_ResourceConfigId != csi_ResourceConfigId)
+	continue;
+      else {
+      //Finding the CSI_RS or SSB Resources
+        UE_info->csi_report_template[UE_id][csi_report_id].CSI_Resource_type= csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.present;
+        if (NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB ==UE_info->csi_report_template[UE_id][csi_report_id].CSI_Resource_type){
+          struct NR_CSI_ResourceConfig__csi_RS_ResourceSetList__nzp_CSI_RS_SSB * nzp_CSI_RS_SSB = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB;
+
+          UE_info->csi_report_template[UE_id][csi_report_id].nb_of_nzp_csi_report = nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list.count:0;
+          UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report = nzp_CSI_RS_SSB->csi_SSB_ResourceSetList!=NULL ? nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.count:0;
+        }
+
+        if (0 != UE_info->csi_report_template[UE_id][csi_report_id].nb_of_csi_ssb_report){
+	  uint8_t nb_ssb_resources =0;
+          for ( csi_ssb_idx = 0; csi_ssb_idx < csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.count; csi_ssb_idx++) {
+            if (csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceSetId ==
+                *(csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx]->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])) { ///We can configure only one SSB resource set from spec 38.331 IE CSI-ResourceConfig
+              if (NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled ==
+                csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.present ) {
+	        if (NULL != csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)
+                  UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri = *(csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id]->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
+                else
+		/*! From Spec 38.331
+		 * nrofReportedRS
+		 * The number (N) of measured RS resources to be reported per report setting in a non-group-based report. N <= N_max, where N_max is either 2 or 4 depending on UE
+		 * capability. FFS: The signaling mechanism for the gNB to select a subset of N beams for the UE to measure and report.
+		 * When the field is absent the UE applies the value 1
+		 */
+	          UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri= 1;
+	        }else
+		  UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].nb_ssbri_cri= 2;
+
+	      nb_ssb_resources=  csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList.list.count;
+	      if (nb_ssb_resources){
+		UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen =ceil(log2 (nb_ssb_resources));
+	        UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen = 7; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP 
+	        UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen =4; //From spec 38.212 Table 6.3.1.1.2-6: CRI, SSBRI, and RSRP
+              }
+	      else{
+		UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen =0;
+	        UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen = 0;
+	        UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen =0;
+              }
+
+	      LOG_I (MAC, "UCI: CSI_bit len : ssbri %d, rsrp: %d, diff_rsrp: %d",
+			      UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].cri_ssbri_bitlen,
+			      UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].rsrp_bitlen,
+			      UE_info->csi_report_template[UE_id][csi_report_id].CSI_report_bitlen[0].diff_rsrp_bitlen);
+	      break ;
+            }
+	  }
+        }
+	if (0 != UE_info->csi_report_template[UE_id][csi_report_id].nb_of_nzp_csi_report){
+          AssertFatal(1==0,"Currently configuring only SSB beamreporting.");
+	}
+	break;
+      }
+    }
+  }
+}
+
+void nr_csi_meas_reporting(int Mod_idP,
+                           int UE_id,
+                           frame_t frame,
+                           sub_frame_t slot,
+                           int slots_per_tdd,
+                           int ul_slots,
+                           int n_slots_frame) {
+
+  NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
+  NR_sched_pucch *curr_pucch;
+  NR_PUCCH_ResourceSet_t *pucchresset;
+  NR_CSI_ReportConfig_t *csirep;
+  NR_CellGroupConfig_t *secondaryCellGroup = UE_info->secondaryCellGroup[UE_id];
+  NR_CSI_MeasConfig_t *csi_measconfig = secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
+  NR_BWP_Uplink_t *ubwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0];
+  NR_PUCCH_Config_t *pucch_Config = ubwp->bwp_Dedicated->pucch_Config->choice.setup;
+
+  AssertFatal(csi_measconfig->csi_ReportConfigToAddModList->list.count>0,"NO CSI report configuration available");
+
+  for (int csi_report_id = 0; csi_report_id < csi_measconfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
+
+    csirep = csi_measconfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
+
+    AssertFatal(csirep->reportConfigType.choice.periodic!=NULL,"Only periodic CSI reporting is implemented currently");
+    int period, offset, sched_slot;
+    csi_period_offset(csirep,&period,&offset);
+    sched_slot = (period+offset)%n_slots_frame;
+    // prepare to schedule csi measurement reception according to 5.2.1.4 in 38.214
+    // preparation is done in first slot of tdd period
+    if ( (frame%(period/n_slots_frame)==(offset/n_slots_frame)) && (slot==((sched_slot/slots_per_tdd)*slots_per_tdd))) {
+
+      // we are scheduling pucch for csi in the first pucch occasion (this comes before ack/nack)
+      curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[sched_slot-slots_per_tdd+ul_slots][0];
+
+      NR_PUCCH_CSI_Resource_t *pucchcsires = csirep->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list.array[0];
+
+      int found = -1;
+      pucchresset = pucch_Config->resourceSetToAddModList->list.array[1]; // set with formats >1
+      int n_list = pucchresset->resourceList.list.count;
+      for (int i=0; i<n_list; i++) {
+        if (*pucchresset->resourceList.list.array[i] == pucchcsires->pucch_Resource)
+          found = i;
+      }
+      AssertFatal(found>-1,"CSI resource not found among PUCCH resources");
+
+      curr_pucch->resource_indicator = found;
+
+      n_list = pucch_Config->resourceToAddModList->list.count;
+
+      // going through the list of PUCCH resources to find the one indexed by resource_id
+      for (int i=0; i<n_list; i++) {
+        NR_PUCCH_Resource_t *pucchres = pucch_Config->resourceToAddModList->list.array[i];
+        if (pucchres->pucch_ResourceId == *pucchresset->resourceList.list.array[found]) {
+          switch(pucchres->format.present){
+            case NR_PUCCH_Resource__format_PR_format2:
+              if (pucch_Config->format2->choice.setup->simultaneousHARQ_ACK_CSI == NULL)
+                curr_pucch->simultaneous_harqcsi = false;
+              else
+                curr_pucch->simultaneous_harqcsi = true;
+              break;
+            case NR_PUCCH_Resource__format_PR_format3:
+              if (pucch_Config->format3->choice.setup->simultaneousHARQ_ACK_CSI == NULL)
+                curr_pucch->simultaneous_harqcsi = false;
+              else
+                curr_pucch->simultaneous_harqcsi = true;
+              break;
+            case NR_PUCCH_Resource__format_PR_format4:
+              if (pucch_Config->format4->choice.setup->simultaneousHARQ_ACK_CSI == NULL)
+                curr_pucch->simultaneous_harqcsi = false;
+              else
+                curr_pucch->simultaneous_harqcsi = true;
+              break;
+          default:
+            AssertFatal(1==0,"Invalid PUCCH format type");
+          }
+        }
+      }
+      curr_pucch->csi_bits += nr_get_csi_bitlen(Mod_idP,UE_id,csi_report_id); // TODO function to compute CSI meas report bit size
+      curr_pucch->frame = frame;
+      curr_pucch->ul_slot = sched_slot;
+    }
+  }
+}
+
+
 // function to update pucch scheduling parameters in UE list when a USS DL is scheduled
-void nr_update_pucch_scheduling(int Mod_idP,
-                                int UE_id,
-                                frame_t frameP,
-                                sub_frame_t slotP,
-                                int slots_per_tdd,
-                                int *pucch_id) {
+void nr_acknack_scheduling(int Mod_idP,
+                           int UE_id,
+                           frame_t frameP,
+                           sub_frame_t slotP,
+                           int slots_per_tdd,
+                           int *pucch_id,
+                           int *pucch_occ) {
 
   NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels->ServingCellConfigCommon;
   NR_UE_info_t *UE_info = &RC.nrmac[Mod_idP]->UE_info;
   NR_sched_pucch *curr_pucch;
-  int first_ul_slot_tdd,k,i;
+  int max_acknacks,pucch_res,first_ul_slot_tdd,k,i,l;
   uint8_t pdsch_to_harq_feedback[8];
   int found = 0;
   int nr_ulmix_slots = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
   if (scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols!=0)
     nr_ulmix_slots++;
 
+  bool csi_pres=false;
+  for (k=0; k<nr_ulmix_slots; k++) {
+    if(UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][0].csi_bits>0)
+      csi_pres=true;
+  }
+
+  // As a preference always schedule ack nacks in PUCCH0 (max 2 per slots)
+  // Unless there is CSI meas reporting scheduled in the period to avoid conflicts in the same slot
+  if (csi_pres)
+    max_acknacks=10;
+  else
+    max_acknacks=2;
+
   // this is hardcoded for now as ue specific
   NR_SearchSpace__searchSpaceType_PR ss_type = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
   get_pdsch_to_harq_feedback(Mod_idP,UE_id,ss_type,pdsch_to_harq_feedback);
 
   // for each possible ul or mixed slot
   for (k=0; k<nr_ulmix_slots; k++) {
-    curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k];
-    // if there is free room in current pucch structure
-    if (curr_pucch->dai_c<MAX_ACK_BITS) {
-      curr_pucch->frame = frameP;
-      curr_pucch->dai_c++;
-      curr_pucch->resource_indicator = 0; // in phytest with only 1 UE we are using just the 1st resource
-      // first pucch occasion in first UL or MIXED slot
-      first_ul_slot_tdd = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots;
-      i = 0;
-      while (i<8 && found == 0)  {  // look if timing indicator is among allowed values
-        if (pdsch_to_harq_feedback[i]==(first_ul_slot_tdd+k)-(slotP % slots_per_tdd))
-          found = 1;
-        if (found == 0) i++;
-      }
-      if (found == 1) {
-        // computing slot in which pucch is scheduled
-        curr_pucch->ul_slot = first_ul_slot_tdd + k + (slotP - (slotP % slots_per_tdd));
-        curr_pucch->timing_indicator = i; // index in the list of timing indicators
-        *pucch_id = k;
-        return;
+    for (l=0; l<1; l++) { // scheduling 2 PUCCH in a single slot does not work with the phone, currently
+      curr_pucch = &UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][l];
+      //if it is possible to schedule acknack in current pucch (no exclusive csi pucch)
+      if ((curr_pucch->csi_bits == 0) || (curr_pucch->simultaneous_harqcsi==true)) {
+        // if there is free room in current pucch structure
+        if (curr_pucch->dai_c<max_acknacks) {
+          pucch_res = get_pucch_resource(UE_info,UE_id,k,l);
+          if (pucch_res>-1){
+            curr_pucch->resource_indicator = pucch_res;
+            curr_pucch->frame = frameP;
+            // first pucch occasion in first UL or MIXED slot
+            first_ul_slot_tdd = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots;
+            i = 0;
+            while (i<8 && found == 0)  {  // look if timing indicator is among allowed values
+              if (pdsch_to_harq_feedback[i]==(first_ul_slot_tdd+k)-(slotP % slots_per_tdd))
+                found = 1;
+              if (found == 0) i++;
+            }
+            if (found == 1) {
+              // computing slot in which pucch is scheduled
+              curr_pucch->dai_c++;
+              curr_pucch->ul_slot = first_ul_slot_tdd + k + (slotP - (slotP % slots_per_tdd));
+              curr_pucch->timing_indicator = i; // index in the list of timing indicators
+              *pucch_id = k;
+              *pucch_occ = l;
+              return;
+            }
+          }
+        }
       }
     }
   }
@@ -1868,6 +2224,22 @@ void nr_update_pucch_scheduling(int Mod_idP,
 }
 
 
+int get_pucch_resource(NR_UE_info_t *UE_info,int UE_id,int k,int l) {
+
+  // to be updated later, for now simple implementation
+  // use the second allocation just in case there is csi in the first
+  // in that case use second resource (for a different symbol) see 9.2 in 38.213
+  if (l==1) {
+    if (UE_info->UE_sched_ctrl[UE_id].sched_pucch[k][0].csi_bits==0)
+      return -1;
+    else
+      return 1;
+  }
+  else
+    return 0;
+
+}
+
 void find_aggregation_candidates(uint8_t *aggregation_level,
                                  uint8_t *nr_of_candidates,
                                  NR_SearchSpace_t *ss) {
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index 0479c4da305eb23a7b74d163b604405f31513637..1c2371131569a4e2ad535f980cad63876b1338bc 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -340,6 +340,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
       LOG_I(MAC, "reset RA state information for RA-RNTI %04x\n", ra->rnti);
       const int UE_id = add_new_nr_ue(gnb_mod_idP, ra->rnti);
       UE_info->secondaryCellGroup[UE_id] = ra->secondaryCellGroup;
+      compute_csi_bitlen (ra->secondaryCellGroup, UE_info, UE_id);
       UE_info->UE_beam_index[UE_id] = ra->beam_id;
       struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
       AssertFatal(bwpList->list.count == 1,
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index 605c328535cf0c6f7935b5c31b75dada1f3fabea..b5c9d48b3b35e3a02647ab09e4cb6c50eb45f366 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -36,8 +36,6 @@
 #include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
 #include "NR_TAG-Id.h"
 
-#define MAX_ACK_BITS 2 //only format 0 is available for now
-
 void set_cset_offset(uint16_t);
 
 void mac_top_init_gNB(void);
@@ -163,6 +161,11 @@ int configure_fapi_dl_pdu_phytest(int Mod_id,
                                   uint16_t *rbSize,
                                   uint16_t *rbStart);
 
+void nr_rx_acknack(nfapi_nr_uci_pusch_pdu_t *uci_pusch,
+                   nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_01,
+                   nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_234,
+                   NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats);
+
 void config_uldci(NR_BWP_Uplink_t *ubwp,
                   nfapi_nr_pusch_pdu_t *pusch_pdu,
                   nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15,
@@ -198,12 +201,23 @@ void nr_schedule_pucch(int Mod_idP,
                        frame_t frameP,
                        sub_frame_t slotP);
 
-void nr_update_pucch_scheduling(int Mod_idP,
-                                int UE_id,
-                                frame_t frameP,
-                                sub_frame_t slotP,
-                                int slots_per_tdd,
-                                int *pucch_id);
+void nr_csi_meas_reporting(int Mod_idP,
+                           int UE_id,
+                           frame_t frameP,
+                           sub_frame_t slotP,
+                           int slots_per_tdd,
+                           int ul_slots,
+                           int n_slots_frame);
+
+void nr_acknack_scheduling(int Mod_idP,
+                           int UE_id,
+                           frame_t frameP,
+                           sub_frame_t slotP,
+                           int slots_per_tdd,
+                           int *pucch_id,
+                           int *pucch_occ);
+
+int get_pucch_resource(NR_UE_info_t *UE_info,int UE_id,int k,int l);
 
 void get_pdsch_to_harq_feedback(int Mod_idP,
                                 int UE_id,
@@ -232,10 +246,11 @@ int nr_is_dci_opportunity(nfapi_nr_search_space_t search_space,
 void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
 			NR_ServingCellConfigCommon_t *scc,
 			NR_BWP_Uplink_t *bwp,
+                        uint16_t rnti,
                         uint8_t pucch_resource,
-                        uint16_t O_uci,
+                        uint16_t O_csi,
                         uint16_t O_ack,
-                        uint8_t SR_flag);
+                        uint8_t O_sr);
 
 void find_search_space(int ss_type,
                        NR_BWP_Downlink_t *bwp,
@@ -320,6 +335,17 @@ int allocate_nr_CCEs(gNB_MAC_INST *nr_mac,
                      int m,
                      int nr_of_candidates);
 
+uint16_t compute_pucch_prb_size(uint8_t format,
+                                uint8_t nr_prbs,
+                                uint16_t O_tot,
+                                uint16_t O_csi,
+                                NR_PUCCH_MaxCodeRate_t *maxCodeRate,
+                                uint8_t Qm,
+                                uint8_t n_symb,
+                                uint8_t n_re_ctrl);
+
+void compute_csi_bitlen (NR_CellGroupConfig_t *secondaryCellGroup, NR_UE_info_t *UE_info, int UE_id);
+
 int get_dlscs(nfapi_nr_config_request_t *cfg);
 
 int get_ulscs(nfapi_nr_config_request_t *cfg);
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index f6fdea064c81c6fdf5e06d13950b3e30b31b0d1b..896c52536f8c37603eddd1c2fab1fb9e9b6de678 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -274,10 +274,12 @@ typedef struct UE_info {
 typedef struct NR_sched_pucch {
   int frame;
   int ul_slot;
+  bool sr_flag;
+  int csi_bits;
+  bool simultaneous_harqcsi;
   uint8_t dai_c;
   uint8_t timing_indicator;
   uint8_t resource_indicator;
-  bool active;
 } NR_sched_pucch;
 
 typedef struct NR_sched_pusch {
@@ -315,6 +317,25 @@ typedef struct NR_UE_ul_harq {
   NR_UL_harq_states_t state;
 } NR_UE_ul_harq_t;
 
+
+typedef struct {
+  uint8_t nb_ssbri_cri;
+  uint8_t cri_ssbri_bitlen;
+  uint8_t rsrp_bitlen;
+  uint8_t diff_rsrp_bitlen;
+}CRI_SSBRI_RSRP_bitlen_t;
+
+
+#define MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG 16
+typedef struct nr_csi_report {
+  NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
+  NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR CSI_Resource_type;
+  uint8_t nb_of_nzp_csi_report;
+  uint8_t nb_of_csi_ssb_report;
+  CRI_SSBRI_RSRP_bitlen_t CSI_report_bitlen[MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG];
+} nr_csi_report_t;
+
+
 /*! \brief scheduling control information set through an API */
 typedef struct {
   /// total amount of data awaiting for this UE
@@ -324,9 +345,10 @@ typedef struct {
 
   /// the currently active BWP in DL
   NR_BWP_Downlink_t *active_bwp;
-  NR_sched_pucch *sched_pucch;
+  NR_sched_pucch **sched_pucch;
   /// selected PUCCH index, if scheduled
   int pucch_sched_idx;
+  int pucch_occ_idx;
   NR_sched_pusch *sched_pusch;
 
   /// CCE index and aggregation, should be coherent with cce_list
@@ -385,9 +407,11 @@ typedef struct {
 } NR_UE_list_t;
 
 /*! \brief UE list used by gNB to order UEs/CC for scheduling*/
+#define MAX_CSI_REPORTCONFIG 48
 typedef struct {
   DLSCH_PDU DLSCH_pdu[4][MAX_MOBILES_PER_GNB];
   /// scheduling control info
+  nr_csi_report_t csi_report_template[MAX_MOBILES_PER_GNB][MAX_CSI_REPORTCONFIG];
   NR_UE_sched_ctrl_t UE_sched_ctrl[MAX_MOBILES_PER_GNB];
   NR_mac_stats_t mac_stats[MAX_MOBILES_PER_GNB];
   NR_UE_list_t list;
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
index 33f268f07fbb25fadc232e1843de855d95644707..a990954947c1a561022ce3edc460d9046faff180 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
@@ -996,17 +996,7 @@ pdcp_data_ind(
            * TODO: be sure of this
            */
           if (NFAPI_MODE == NFAPI_UE_STUB_PNF ) {
-#ifdef UESIM_EXPANSION
-
-            if (UE_NAS_USE_TUN) {
-              pdcpHead->inst  = ctxt_pP->module_id;
-            } else {
-              pdcpHead->inst  = 0;
-            }
-
-#else
             pdcpHead->inst  = ctxt_pP->module_id;
-#endif
           } else {  // nfapi_mode
             if (UE_NAS_USE_TUN) {
               pdcpHead->inst  = ctxt_pP->module_id;
@@ -2287,7 +2277,7 @@ uint64_t pdcp_module_init( uint64_t pdcp_optmask ) {
     nas_getparams();
 
     if(UE_NAS_USE_TUN) {
-      int num_if = (NFAPI_MODE == NFAPI_UE_STUB_PNF || IS_SOFTMODEM_SIML1 )?MAX_NUMBER_NETIF:1;
+      int num_if = (NFAPI_MODE == NFAPI_UE_STUB_PNF || IS_SOFTMODEM_SIML1 )? MAX_MOBILES_PER_ENB : 1;
       netlink_init_tun("ue",num_if);
       if (IS_SOFTMODEM_NOS1)
     	  nas_config(1, 1, 2, "ue");
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
index de8a1b385b59bea9392af83ff2b719991ff9da3c..c8ab4499eeddc9f07fb6d0d9e8506346d9a9e3e4 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
@@ -53,9 +53,6 @@ typedef rlc_op_status_t  (*send_rlc_data_req_func_t)(const protocol_ctxt_t *cons
 typedef boolean_t (*pdcp_data_ind_func_t)( const protocol_ctxt_t *, const srb_flag_t,
     const MBMS_flag_t, const rb_id_t, const sdu_size_t,
     mem_block_t *,const uint32_t *const, const uint32_t *const);
-/* maximum number of tun interfaces that will be created to emulates UEs */
-/* UEs beyond that will be multiplexed on the same tun   */
-#define MAX_NUMBER_NETIF           16
 
 #define ENB_NAS_USE_TUN_W_MBMS_BIT      (1<< 10)
 #define PDCP_USE_NETLINK_BIT            (1<< 11)
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
index c9a62d573b5b78decde8c5af19a814a526151741..4542abd6c146e989a8c6116d19f830a4259abe60 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
@@ -86,12 +86,6 @@ extern struct msghdr nas_msg_rx;
 
 
 
-#ifdef UESIM_EXPANSION
-  extern uint16_t inst_pdcp_list[NUMBER_OF_UE_MAX];
-#endif
-
-
-
 #  include "gtpv1u_eNB_task.h"
 #  include "gtpv1u_eNB_defs.h"
 
@@ -503,11 +497,7 @@ int pdcp_fifo_read_input_sdus_fromnetlinksock (const protocol_ctxt_t *const  ctx
             }
           } else { // ctxt.enb_flag => UE
             if (NFAPI_MODE == NFAPI_UE_STUB_PNF) {
-#ifdef UESIM_EXPANSION
-              ctxt.module_id = inst_pdcp_list[pdcp_read_header_g.inst];
-#else
               ctxt.module_id = pdcp_read_header_g.inst;
-#endif
             } else {
               ctxt.module_id = 0;
             }
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
index 0d98840f5b6a06d519697fab146969cea3d750ca..3f08bc5bbee6665a7508938b165ebf19b858a323 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
@@ -368,7 +368,7 @@ uint64_t pdcp_module_init(uint64_t _pdcp_optmask)
     nas_getparams();
 
     if(UE_NAS_USE_TUN) {
-      int num_if = (NFAPI_MODE == NFAPI_UE_STUB_PNF || IS_SOFTMODEM_SIML1 )?MAX_NUMBER_NETIF:1;
+      int num_if = (NFAPI_MODE == NFAPI_UE_STUB_PNF || IS_SOFTMODEM_SIML1 )? MAX_MOBILES_PER_ENB : 1;
       netlink_init_tun("ue",num_if);
       //Add --nr-ip-over-lte option check for next line
       if (IS_SOFTMODEM_NOS1)
diff --git a/openair2/NETWORK_DRIVER/UE_IP/common.c b/openair2/NETWORK_DRIVER/UE_IP/common.c
index 86e00ef674a92ffde62e14b0b895725baa5a9201..05118a5f6bb00f7ba446437623fbf90b65196a2b 100644
--- a/openair2/NETWORK_DRIVER/UE_IP/common.c
+++ b/openair2/NETWORK_DRIVER/UE_IP/common.c
@@ -287,18 +287,6 @@ ue_ip_common_ip2wireless(
         printk("[UE_IP_DRV][%s] Dest %d.%d.%d.%d\n",__FUNCTION__, dst_addr[0],dst_addr[1],dst_addr[2],dst_addr[3]);
       }
 
-      // modify inst by IP address for the U-Plane of multiple UEs while L2 fapi simulator start
-#ifdef UESIM_EXPANSION
-
-      if ((src_addr[3] - 2)> instP) {
-        pdcph.inst = src_addr[3] - 2;
-        printk("[UE_IP_DRV] change INST from %d to %d\n",instP, pdcph.inst);
-        instP = src_addr[3] - 2;
-        priv_p=netdev_priv(ue_ip_dev[instP]);
-      }
-
-#endif
-      // modify inst by IP address for the U-Plane of multiple UEs while L2 fapi simulator end
       //get Ipv4 address and pass to PCDP header
       printk("[UE_IP_DRV] source Id: 0x%08x\n",pdcph.sourceL2Id );
       printk("[UE_IP_DRV] destinationL2Id Id: 0x%08x\n",pdcph.destinationL2Id );
diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
index 22099c340a7f8086ed3ed0549c047577039aae3b..4e1a8ae1310f246e8e893691ee4da6f172783813 100644
--- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
@@ -79,6 +79,44 @@ void handle_nr_rach(NR_UL_IND_t *UL_info) {
 }
 
 
+void handle_nr_uci(NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats, int target_snrx10) {
+
+  int num_ucis = UL_info->uci_ind.num_ucis;
+  nfapi_nr_uci_t *uci_list = UL_info->uci_ind.uci_list;
+
+  for (int i = 0; i < num_ucis; i++) {
+    switch (uci_list[i].pdu_type) {
+      case NFAPI_NR_UCI_PUSCH_PDU_TYPE: break;
+
+      case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: {
+        nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_pdu = &uci_list[i].pucch_pdu_format_0_1;
+
+        // tpc (power control)
+        sched_ctrl->tpc1 = nr_get_tpc(target_snrx10,uci_pdu->ul_cqi,30);
+
+        if( (uci_pdu->pduBitmap>>1) & 0x01)
+          nr_rx_acknack(NULL,uci_pdu,NULL,UL_info,sched_ctrl,stats);
+
+        break;
+      }
+      case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
+        nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &uci_list[i].pucch_pdu_format_2_3_4;
+
+        // tpc (power control)
+        sched_ctrl->tpc1 = nr_get_tpc(target_snrx10,uci_pdu->ul_cqi,30);
+
+        if( (uci_pdu->pduBitmap>>1) & 0x01)
+          nr_rx_acknack(NULL,NULL,uci_pdu,UL_info,sched_ctrl,stats);
+
+        break;
+      }
+    }
+  }
+
+  UL_info->uci_ind.num_ucis = 0;
+}
+
+
 void handle_nr_ulsch(NR_UL_IND_t *UL_info, NR_UE_sched_ctrl_t *sched_ctrl, NR_mac_stats_t *stats) {
 
   if(nfapi_mode == 1) {
diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c
index 5863b8102b07e3c69d7853c885c51451f3e96bc2..a9e27da95de52cdd8c7086821b71e7763791e8c9 100644
--- a/openair2/RRC/NR/rrc_gNB_reconfig.c
+++ b/openair2/RRC/NR/rrc_gNB_reconfig.c
@@ -56,6 +56,11 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
                                      int initial_csi_index) {
   AssertFatal(servingcellconfigcommon!=NULL,"servingcellconfigcommon is null\n");
   AssertFatal(secondaryCellGroup!=NULL,"secondaryCellGroup is null\n");
+
+  if(servingcellconfigcommon->ssb_PositionsInBurst->present !=2)
+    AssertFatal(1==0,"Currenrly implemented only for medium size SSB bitmap\n");
+  uint8_t bitmap = servingcellconfigcommon->ssb_PositionsInBurst->choice.mediumBitmap.buf[0];
+
   memset(secondaryCellGroup,0,sizeof(NR_CellGroupConfig_t));
   secondaryCellGroup->cellGroupId = scg_id;
   NR_RLC_BearerConfig_t *RLC_BearerConfig = calloc(1,sizeof(*RLC_BearerConfig));
@@ -242,9 +247,29 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition));
  *secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos0;
 
-#if 0
+
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList));
 
+ int n_ssb = 0;
+ NR_TCI_State_t *tcic[8];
+ for (int i=0;i<8;i++) {
+   if ((bitmap>>(7-i))&0x01){
+     tcic[i]=calloc(1,sizeof(*tcic[i]));
+     tcic[i]->tci_StateId=n_ssb;
+     tcic[i]->qcl_Type1.cell=NULL;
+     tcic[i]->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcic[i]->qcl_Type1.bwp_Id));
+     *tcic[i]->qcl_Type1.bwp_Id=1;
+     tcic[i]->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
+     tcic[i]->qcl_Type1.referenceSignal.choice.ssb = i;
+     tcic[i]->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
+     ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcic[i]);
+     n_ssb++;
+   }
+ }
+
+
+#if 0
+
  NR_TCI_State_t*tci0=calloc(1,sizeof(*tci0));
  tci0->tci_StateId=0;
  tci0->qcl_Type1.cell=NULL;
@@ -325,85 +350,6 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  tci7->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
  ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tci7);
 
- NR_TCI_State_t*tci8=calloc(1,sizeof(*tci8));
- tci8->tci_StateId=8;
- tci8->qcl_Type1.cell=NULL;
- tci8->qcl_Type1.bwp_Id=calloc(1,sizeof(*tci8->qcl_Type1.bwp_Id));
- *tci8->qcl_Type1.bwp_Id=1;
- tci8->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tci8->qcl_Type1.referenceSignal.choice.ssb = 0;
- tci8->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tci8);
-
- NR_TCI_State_t*tci9=calloc(1,sizeof(*tci9));
- tci9->tci_StateId=9;
- tci9->qcl_Type1.cell=NULL;
- tci9->qcl_Type1.bwp_Id=calloc(1,sizeof(*tci9->qcl_Type1.bwp_Id));
- *tci9->qcl_Type1.bwp_Id=1;
- tci9->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tci9->qcl_Type1.referenceSignal.choice.ssb = 1;
- tci9->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tci9);
-
- NR_TCI_State_t*tci10=calloc(1,sizeof(*tci10));
- tci10->tci_StateId=10;
- tci10->qcl_Type1.cell=NULL;
- tci10->qcl_Type1.bwp_Id=calloc(1,sizeof(*tci10->qcl_Type1.bwp_Id));
- *tci10->qcl_Type1.bwp_Id=1;
- tci10->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tci10->qcl_Type1.referenceSignal.choice.ssb = 2;
- tci10->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tci10);
-
- NR_TCI_State_t*tci11=calloc(1,sizeof(*tci11));
- tci11->tci_StateId=11;
- tci11->qcl_Type1.cell=NULL;
- tci11->qcl_Type1.bwp_Id=calloc(1,sizeof(*tci11->qcl_Type1.bwp_Id));
- *tci11->qcl_Type1.bwp_Id=1;
- tci11->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tci11->qcl_Type1.referenceSignal.choice.ssb = 3;
- tci11->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tci11);
-
- NR_TCI_State_t*tci12=calloc(1,sizeof(*tci12));
- tci12->tci_StateId=12;
- tci12->qcl_Type1.cell=NULL;
- tci12->qcl_Type1.bwp_Id=calloc(1,sizeof(*tci12->qcl_Type1.bwp_Id));
- *tci12->qcl_Type1.bwp_Id=1;
- tci12->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tci12->qcl_Type1.referenceSignal.choice.ssb = 4;
- tci12->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tci12);
-
- NR_TCI_State_t*tci13=calloc(1,sizeof(*tci13));
- tci13->tci_StateId=13;
- tci13->qcl_Type1.cell=NULL;
- tci13->qcl_Type1.bwp_Id=calloc(1,sizeof(*tci13->qcl_Type1.bwp_Id));
- *tci13->qcl_Type1.bwp_Id=1;
- tci13->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tci13->qcl_Type1.referenceSignal.choice.ssb = 5;
- tci13->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tci13);
-
- NR_TCI_State_t*tci14=calloc(1,sizeof(*tci14));
- tci14->tci_StateId=14;
- tci14->qcl_Type1.cell=NULL;
- tci14->qcl_Type1.bwp_Id=calloc(1,sizeof(*tci14->qcl_Type1.bwp_Id));
- *tci14->qcl_Type1.bwp_Id=1;
- tci14->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tci14->qcl_Type1.referenceSignal.choice.ssb = 6;
- tci14->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tci14);
-
- NR_TCI_State_t*tci15=calloc(1,sizeof(*tci15));
- tci15->tci_StateId=15;
- tci15->qcl_Type1.cell=NULL;
- tci15->qcl_Type1.bwp_Id=calloc(1,sizeof(*tci15->qcl_Type1.bwp_Id));
- *tci15->qcl_Type1.bwp_Id=1;
- tci15->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tci15->qcl_Type1.referenceSignal.choice.ssb = 7;
- tci15->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tci15);
 #endif
 
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup->tci_StatesToReleaseList=NULL;
@@ -485,9 +431,11 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  coreset->tci_StatesPDCCH_ToAddList=calloc(1,sizeof(*coreset->tci_StatesPDCCH_ToAddList));
  NR_TCI_StateId_t *tci[8];
  for (int i=0;i<8;i++) {
-   tci[i]=calloc(1,sizeof(*tci[i]));
-   *tci[i] = i;
-   ASN_SEQUENCE_ADD(&coreset->tci_StatesPDCCH_ToAddList->list,tci[i]);
+   if ((bitmap>>(7-i))&0x01){
+     tci[i]=calloc(1,sizeof(*tci[i]));
+     *tci[i] = i;
+     ASN_SEQUENCE_ADD(&coreset->tci_StatesPDCCH_ToAddList->list,tci[i]);
+   }
  }
  coreset->tci_StatesPDCCH_ToReleaseList = NULL;
  coreset->tci_PresentInDCI = NULL;
@@ -616,7 +564,9 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition));
  *bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NR_DMRS_DownlinkConfig__dmrs_AdditionalPosition_pos0;
 
- bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=NULL;
+ //bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=NULL;
+ bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
+
 #if 0
  bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList));
 
@@ -699,88 +649,27 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  tcid7->qcl_Type1.referenceSignal.choice.csi_rs = 30;
  tcid7->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeA;
  ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid7);
-
- NR_TCI_State_t*tcid8=calloc(1,sizeof(*tcid8));
- tcid8->tci_StateId=8;
- tcid8->qcl_Type1.cell=NULL;
- tcid8->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid8->qcl_Type1.bwp_Id));
- *tcid8->qcl_Type1.bwp_Id=1;
- tcid8->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tcid8->qcl_Type1.referenceSignal.choice.ssb = 0;
- tcid8->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid8);
-
- NR_TCI_State_t*tcid9=calloc(1,sizeof(*tcid9));
- tcid9->tci_StateId=9;
- tcid9->qcl_Type1.cell=NULL;
- tcid9->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid9->qcl_Type1.bwp_Id));
- *tcid9->qcl_Type1.bwp_Id=1;
- tcid9->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tcid9->qcl_Type1.referenceSignal.choice.ssb = 1;
- tcid9->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid9);
-
- NR_TCI_State_t*tcid10=calloc(1,sizeof(*tcid10));
- tcid10->tci_StateId=10;
- tcid10->qcl_Type1.cell=NULL;
- tcid10->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid10->qcl_Type1.bwp_Id));
- *tcid10->qcl_Type1.bwp_Id=1;
- tcid10->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tcid10->qcl_Type1.referenceSignal.choice.ssb = 2;
- tcid10->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid10);
-
- NR_TCI_State_t*tcid11=calloc(1,sizeof(*tcid11));
- tcid11->tci_StateId=11;
- tcid11->qcl_Type1.cell=NULL;
- tcid11->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid11->qcl_Type1.bwp_Id));
- *tcid11->qcl_Type1.bwp_Id=1;
- tcid11->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tcid11->qcl_Type1.referenceSignal.choice.ssb = 3;
- tcid11->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid11);
-
- NR_TCI_State_t*tcid12=calloc(1,sizeof(*tcid12));
- tcid12->tci_StateId=12;
- tcid12->qcl_Type1.cell=NULL;
- tcid12->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid12->qcl_Type1.bwp_Id));
- *tcid12->qcl_Type1.bwp_Id=1;
- tcid12->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tcid12->qcl_Type1.referenceSignal.choice.ssb = 4;
- tcid12->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid12);
-
- NR_TCI_State_t*tcid13=calloc(1,sizeof(*tcid13));
- tcid13->tci_StateId=13;
- tcid13->qcl_Type1.cell=NULL;
- tcid13->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid13->qcl_Type1.bwp_Id));
- *tcid13->qcl_Type1.bwp_Id=1;
- tcid13->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tcid13->qcl_Type1.referenceSignal.choice.ssb = 5;
- tcid13->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid13);
-
- NR_TCI_State_t*tcid14=calloc(1,sizeof(*tcid14));
- tcid14->tci_StateId=14;
- tcid14->qcl_Type1.cell=NULL;
- tcid14->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid14->qcl_Type1.bwp_Id));
- *tcid14->qcl_Type1.bwp_Id=1;
- tcid14->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tcid14->qcl_Type1.referenceSignal.choice.ssb = 6;
- tcid14->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid14);
-
- NR_TCI_State_t*tcid15=calloc(1,sizeof(*tcid15));
- tcid15->tci_StateId=15;
- tcid15->qcl_Type1.cell=NULL;
- tcid15->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid15->qcl_Type1.bwp_Id));
- *tcid15->qcl_Type1.bwp_Id=1;
- tcid15->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
- tcid15->qcl_Type1.referenceSignal.choice.ssb = 7;
- tcid15->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
- ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid15);
 #endif
 
+
+ n_ssb = 0;
+ NR_TCI_State_t *tcid[8];
+ for (int i=0;i<8;i++) {
+   if ((bitmap>>(7-i))&0x01){
+     tcid[i]=calloc(1,sizeof(*tcid[i]));
+     tcid[i]->tci_StateId=n_ssb;
+     tcid[i]->qcl_Type1.cell=NULL;
+     tcid[i]->qcl_Type1.bwp_Id=calloc(1,sizeof(*tcid[i]->qcl_Type1.bwp_Id));
+     *tcid[i]->qcl_Type1.bwp_Id=1;
+     tcid[i]->qcl_Type1.referenceSignal.present = NR_QCL_Info__referenceSignal_PR_ssb;
+     tcid[i]->qcl_Type1.referenceSignal.choice.ssb = i;
+     tcid[i]->qcl_Type1.qcl_Type=NR_QCL_Info__qcl_Type_typeC;
+     ASN_SEQUENCE_ADD(&bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToAddModList->list,tcid[i]);
+     n_ssb++;
+   }
+ }
+
+
  bwp->bwp_Dedicated->pdsch_Config->choice.setup->tci_StatesToReleaseList=NULL;
  bwp->bwp_Dedicated->pdsch_Config->choice.setup->vrb_ToPRB_Interleaver=NULL;
  bwp->bwp_Dedicated->pdsch_Config->choice.setup->resourceAllocation=NR_PDSCH_Config__resourceAllocation_resourceAllocationType1;
@@ -895,12 +784,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  aset->alpha=calloc(1,sizeof(*aset->alpha));
  *aset->alpha=NR_Alpha_alpha1;
  ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->p0_AlphaSets->list,aset);
- pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList = calloc(1,sizeof(*pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList));
- NR_PUSCH_PathlossReferenceRS_t *pl = calloc(1,sizeof(*pl));
- pl->pusch_PathlossReferenceRS_Id=0;
- pl->referenceSignal.present = NR_PUSCH_PathlossReferenceRS__referenceSignal_PR_csi_RS_Index;
- pl->referenceSignal.choice.csi_RS_Index=0;
- ASN_SEQUENCE_ADD(&pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList->list,pl);
+ pusch_Config->pusch_PowerControl->pathlossReferenceRSToAddModList = NULL;
  pusch_Config->pusch_PowerControl->pathlossReferenceRSToReleaseList = NULL;
  pusch_Config->pusch_PowerControl->twoPUSCH_PC_AdjustmentStates = NULL;
  pusch_Config->pusch_PowerControl->deltaMCS = NULL;
@@ -1058,7 +942,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  pucchres2->secondHopPRB=NULL;
  pucchres2->format.present= NR_PUCCH_Resource__format_PR_format2;
  pucchres2->format.choice.format2=calloc(1,sizeof(*pucchres2->format.choice.format2));
- pucchres2->format.choice.format2->nrofPRBs=16;
+ pucchres2->format.choice.format2->nrofPRBs=4;
  pucchres2->format.choice.format2->nrofSymbols=1;
  pucchres2->format.choice.format2->startingSymbolIndex=13;
  ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres2);
@@ -1069,7 +953,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  pucchres3->secondHopPRB=NULL;
  pucchres3->format.present= NR_PUCCH_Resource__format_PR_format2;
  pucchres3->format.choice.format2=calloc(1,sizeof(*pucchres3->format.choice.format2));
- pucchres3->format.choice.format2->nrofPRBs=16;
+ pucchres3->format.choice.format2->nrofPRBs=4;
  pucchres3->format.choice.format2->nrofSymbols=1;
  pucchres3->format.choice.format2->startingSymbolIndex=12;
  ASN_SEQUENCE_ADD(&pucch_Config->resourceToAddModList->list,pucchres3);
@@ -1081,7 +965,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  pucchfmt2->interslotFrequencyHopping=NULL;
  pucchfmt2->additionalDMRS=NULL;
  pucchfmt2->maxCodeRate=calloc(1,sizeof(*pucchfmt2->maxCodeRate));
- *pucchfmt2->maxCodeRate=NR_PUCCH_MaxCodeRate_zeroDot15;
+ *pucchfmt2->maxCodeRate=NR_PUCCH_MaxCodeRate_zeroDot25;
  pucchfmt2->nrofSlots=NULL;
  pucchfmt2->pi2BPSK=NULL;
  pucchfmt2->simultaneousHARQ_ACK_CSI=NULL;
@@ -1122,12 +1006,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  p00->p0_PUCCH_Id=1;
  p00->p0_PUCCH_Value = 0;
  ASN_SEQUENCE_ADD(&pucch_Config->pucch_PowerControl->p0_Set->list,p00);
- pucch_Config->pucch_PowerControl->pathlossReferenceRSs = calloc(1,sizeof(*pucch_Config->pucch_PowerControl->pathlossReferenceRSs));
- NR_PUCCH_PathlossReferenceRS_t *pucchPLRef=calloc(1,sizeof(*pucchPLRef));
- pucchPLRef->pucch_PathlossReferenceRS_Id=0;
- pucchPLRef->referenceSignal.present = NR_PUCCH_PathlossReferenceRS__referenceSignal_PR_csi_RS_Index;
- pucchPLRef->referenceSignal.choice.csi_RS_Index=0;
- ASN_SEQUENCE_ADD(&pucch_Config->pucch_PowerControl->pathlossReferenceRSs->list,pucchPLRef);
+ pucch_Config->pucch_PowerControl->pathlossReferenceRSs = NULL;
 
  // copy pusch_Config from dedicated initialBWP
  ubwp->bwp_Dedicated->pusch_Config = calloc(1,sizeof(*ubwp->bwp_Dedicated->pusch_Config));
@@ -1178,595 +1057,61 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  pdsch_servingcellconfig->ext1->processingType2Enabled = NULL;
  
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig=NULL;
- //secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig));
- //secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->present = NR_SetupRelease_CSI_MeasConfig_PR_setup;
-
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig=calloc(1,sizeof(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig));
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->present = NR_SetupRelease_CSI_MeasConfig_PR_setup;
 
  NR_CSI_MeasConfig_t *csi_MeasConfig = calloc(1,sizeof(*csi_MeasConfig));
-// secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup = csi_MeasConfig;
- csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList = calloc(1,sizeof(*csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList));
-
- NR_NZP_CSI_RS_Resource_t *nzpres0 = calloc(1,sizeof(*nzpres0));
- nzpres0->nzp_CSI_RS_ResourceId=0;
- nzpres0->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_other;
- nzpres0->resourceMapping.frequencyDomainAllocation.choice.other.buf = calloc(1,1);
- nzpres0->resourceMapping.frequencyDomainAllocation.choice.other.size = 1;
- nzpres0->resourceMapping.frequencyDomainAllocation.choice.other.bits_unused = 2;
- nzpres0->resourceMapping.frequencyDomainAllocation.choice.other.buf[0]=1<<2;
- nzpres0->resourceMapping.nrofPorts = (n_physical_antenna_ports==1)? NR_CSI_RS_ResourceMapping__nrofPorts_p1 : NR_CSI_RS_ResourceMapping__nrofPorts_p2;
- nzpres0->resourceMapping.firstOFDMSymbolInTimeDomain=7;
- nzpres0->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
- nzpres0->resourceMapping.cdm_Type = (n_physical_antenna_ports==1)? NR_CSI_RS_ResourceMapping__cdm_Type_noCDM : NR_CSI_RS_ResourceMapping__cdm_Type_fd_CDM2;
- nzpres0->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_one;
- nzpres0->resourceMapping.density.choice.one=(NULL_t)0;
- nzpres0->resourceMapping.freqBand.startingRB=0;
- nzpres0->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
- nzpres0->powerControlOffset=13;
- nzpres0->powerControlOffsetSS=NULL;
- nzpres0->scramblingID=40;
- nzpres0->periodicityAndOffset = calloc(1,sizeof(*nzpres0->periodicityAndOffset));
- nzpres0->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots320;
- nzpres0->periodicityAndOffset->choice.slots320 = 2;
- nzpres0->qcl_InfoPeriodicCSI_RS=NULL;
- ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres0);
-
- if (n_physical_antenna_ports > 1) {
-   NR_NZP_CSI_RS_Resource_t *nzpres2 = calloc(1,sizeof(*nzpres2));
-   nzpres2->nzp_CSI_RS_ResourceId=2;
-   nzpres2->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres2->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres2->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres2->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres2->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=1;
-   nzpres2->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres2->resourceMapping.firstOFDMSymbolInTimeDomain=4;
-   nzpres2->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres2->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres2->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres2->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres2->resourceMapping.freqBand.startingRB=0;
-   nzpres2->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres2->powerControlOffset=0;
-   nzpres2->powerControlOffsetSS=calloc(1,sizeof(*nzpres2->powerControlOffsetSS));
-   *nzpres2->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres2->scramblingID=40;
-   nzpres2->periodicityAndOffset = calloc(1,sizeof(*nzpres2->periodicityAndOffset));
-   nzpres2->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres2->periodicityAndOffset->choice.slots160 = 25;
-   nzpres2->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres2->qcl_InfoPeriodicCSI_RS));
-   *nzpres2->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres2);
-   
-   
-   NR_NZP_CSI_RS_Resource_t *nzpres3 = calloc(1,sizeof(*nzpres3));
-   nzpres3->nzp_CSI_RS_ResourceId=3;
-   nzpres3->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres3->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres3->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres3->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres3->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=1;
-   nzpres3->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres3->resourceMapping.firstOFDMSymbolInTimeDomain=8;
-   nzpres3->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres3->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres3->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres3->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres3->resourceMapping.freqBand.startingRB=0;
-   nzpres3->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres3->powerControlOffset=0;
-   nzpres3->powerControlOffsetSS=calloc(1,sizeof(*nzpres3->powerControlOffsetSS));
-   *nzpres3->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres3->scramblingID=40;
-   nzpres3->periodicityAndOffset = calloc(1,sizeof(*nzpres3->periodicityAndOffset));
-   nzpres3->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres3->periodicityAndOffset->choice.slots160 = 25;
-   nzpres3->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres3->qcl_InfoPeriodicCSI_RS));
-   *nzpres3->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres3);
- }
- if (n_physical_antenna_ports > 3) {
-   NR_NZP_CSI_RS_Resource_t *nzpres4 = calloc(1,sizeof(*nzpres4));
-   nzpres4->nzp_CSI_RS_ResourceId=4;
-   nzpres4->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres4->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres4->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres4->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres4->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=1;
-   nzpres4->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres4->resourceMapping.firstOFDMSymbolInTimeDomain=4;
-   nzpres4->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres4->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres4->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres4->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres4->resourceMapping.freqBand.startingRB=0;
-   nzpres4->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres4->powerControlOffset=0;
-   nzpres4->powerControlOffsetSS=calloc(1,sizeof(*nzpres4->powerControlOffsetSS));
-   *nzpres4->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres4->scramblingID=40;
-   nzpres4->periodicityAndOffset = calloc(1,sizeof(*nzpres4->periodicityAndOffset));
-   nzpres4->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres4->periodicityAndOffset->choice.slots160 = 26;
-   nzpres4->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres4->qcl_InfoPeriodicCSI_RS));
-   *nzpres4->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres4);
-   
-   NR_NZP_CSI_RS_Resource_t *nzpres5 = calloc(1,sizeof(*nzpres5));
-   nzpres5->nzp_CSI_RS_ResourceId=5;
-   nzpres5->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres5->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres5->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres5->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres5->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=1;
-   nzpres5->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres5->resourceMapping.firstOFDMSymbolInTimeDomain=8;
-   nzpres5->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres5->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres5->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres5->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres5->resourceMapping.freqBand.startingRB=0;
-   nzpres5->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres5->powerControlOffset=0;
-   nzpres5->powerControlOffsetSS=calloc(1,sizeof(*nzpres5->powerControlOffsetSS));
-   *nzpres5->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres5->scramblingID=40;
-   nzpres5->periodicityAndOffset = calloc(1,sizeof(*nzpres5->periodicityAndOffset));
-   nzpres5->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres5->periodicityAndOffset->choice.slots160 = 26;
-   nzpres5->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres5->qcl_InfoPeriodicCSI_RS));
-   *nzpres5->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres5);
- }
- if (n_physical_antenna_ports > 7) {
-   NR_NZP_CSI_RS_Resource_t *nzpres6 = calloc(1,sizeof(*nzpres6));
-   nzpres6->nzp_CSI_RS_ResourceId=6;
-   nzpres6->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres6->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres6->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres6->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres6->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=4;
-   nzpres6->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres6->resourceMapping.firstOFDMSymbolInTimeDomain=4;
-   nzpres6->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres6->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres6->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres6->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres6->resourceMapping.freqBand.startingRB=0;
-   nzpres6->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres6->powerControlOffset=0;
-   nzpres6->powerControlOffsetSS=calloc(1,sizeof(*nzpres6->powerControlOffsetSS));
-   *nzpres6->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres6->scramblingID=40;
-   nzpres6->periodicityAndOffset = calloc(1,sizeof(*nzpres6->periodicityAndOffset));
-   nzpres6->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres6->periodicityAndOffset->choice.slots160 = 25;
-   nzpres6->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres6->qcl_InfoPeriodicCSI_RS));
-   *nzpres6->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres6);
-   
-   NR_NZP_CSI_RS_Resource_t *nzpres7 = calloc(1,sizeof(*nzpres7));
-   nzpres7->nzp_CSI_RS_ResourceId=7;
-   nzpres7->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres7->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres7->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres7->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres7->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=4;
-   nzpres7->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres7->resourceMapping.firstOFDMSymbolInTimeDomain=8;
-   nzpres7->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres7->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres7->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres7->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres7->resourceMapping.freqBand.startingRB=0;
-   nzpres7->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres7->powerControlOffset=0;
-   nzpres7->powerControlOffsetSS=calloc(1,sizeof(*nzpres7->powerControlOffsetSS));
-   *nzpres7->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres7->scramblingID=40;
-   nzpres7->periodicityAndOffset = calloc(1,sizeof(*nzpres7->periodicityAndOffset));
-   nzpres7->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres7->periodicityAndOffset->choice.slots160 = 25;
-   nzpres7->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres7->qcl_InfoPeriodicCSI_RS));
-   *nzpres7->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres7);
-   NR_NZP_CSI_RS_Resource_t *nzpres8 = calloc(1,sizeof(*nzpres8));
-   nzpres8->nzp_CSI_RS_ResourceId=8;
-   nzpres8->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres8->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres8->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres8->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres8->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=4;
-   nzpres8->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres8->resourceMapping.firstOFDMSymbolInTimeDomain=4;
-   nzpres8->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres8->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres8->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres8->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres8->resourceMapping.freqBand.startingRB=0;
-   nzpres8->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres8->powerControlOffset=0;
-   nzpres8->powerControlOffsetSS=calloc(1,sizeof(*nzpres8->powerControlOffsetSS));
-   *nzpres8->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres8->scramblingID=40;
-   nzpres8->periodicityAndOffset = calloc(1,sizeof(*nzpres8->periodicityAndOffset));
-   nzpres8->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres8->periodicityAndOffset->choice.slots160 = 26;
-   nzpres8->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres8->qcl_InfoPeriodicCSI_RS));
-   *nzpres8->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres8);
-   
-   NR_NZP_CSI_RS_Resource_t *nzpres9 = calloc(1,sizeof(*nzpres9));
-   nzpres9->nzp_CSI_RS_ResourceId=9;
-   nzpres9->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres9->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres9->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres9->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres9->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=4;
-   nzpres9->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres9->resourceMapping.firstOFDMSymbolInTimeDomain=8;
-   nzpres9->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres9->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres9->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres9->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres9->resourceMapping.freqBand.startingRB=0;
-   nzpres9->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres9->powerControlOffset=0;
-   nzpres9->powerControlOffsetSS=calloc(1,sizeof(*nzpres9->powerControlOffsetSS));
-   *nzpres9->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres9->scramblingID=40;
-   nzpres9->periodicityAndOffset = calloc(1,sizeof(*nzpres9->periodicityAndOffset));
-   nzpres9->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres9->periodicityAndOffset->choice.slots160 = 26;
-   nzpres9->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres9->qcl_InfoPeriodicCSI_RS));
-   *nzpres9->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres9);
- }
- if (n_physical_antenna_ports > 15) {
-   NR_NZP_CSI_RS_Resource_t *nzpres10 = calloc(1,sizeof(*nzpres10));
-   nzpres10->nzp_CSI_RS_ResourceId=10;
-   nzpres10->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres10->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres10->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres10->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres10->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=2;
-   nzpres10->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres10->resourceMapping.firstOFDMSymbolInTimeDomain=4;
-   nzpres10->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres10->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres10->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres10->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres10->resourceMapping.freqBand.startingRB=0;
-   nzpres10->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres10->powerControlOffset=0;
-   nzpres10->powerControlOffsetSS=calloc(1,sizeof(*nzpres10->powerControlOffsetSS));
-   *nzpres10->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres10->scramblingID=40;
-   nzpres10->periodicityAndOffset = calloc(1,sizeof(*nzpres10->periodicityAndOffset));
-   nzpres10->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres10->periodicityAndOffset->choice.slots160 = 25;
-   nzpres10->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres10->qcl_InfoPeriodicCSI_RS));
-   *nzpres10->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres10);
-   
-   NR_NZP_CSI_RS_Resource_t *nzpres11 = calloc(1,sizeof(*nzpres11));
-   nzpres11->nzp_CSI_RS_ResourceId=11;
-   nzpres11->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres11->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres11->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres11->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres11->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=2;
-   nzpres11->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres11->resourceMapping.firstOFDMSymbolInTimeDomain=8;
-   nzpres11->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres11->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres11->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres11->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres11->resourceMapping.freqBand.startingRB=0;
-   nzpres11->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres11->powerControlOffset=0;
-   nzpres11->powerControlOffsetSS=calloc(1,sizeof(*nzpres11->powerControlOffsetSS));
-   *nzpres11->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres11->scramblingID=40;
-   nzpres11->periodicityAndOffset = calloc(1,sizeof(*nzpres11->periodicityAndOffset));
-   nzpres11->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres11->periodicityAndOffset->choice.slots160 = 25;
-   nzpres11->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres11->qcl_InfoPeriodicCSI_RS));
-   *nzpres11->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres11);
-   NR_NZP_CSI_RS_Resource_t *nzpres12 = calloc(1,sizeof(*nzpres12));
-   nzpres12->nzp_CSI_RS_ResourceId=12;
-   nzpres12->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres12->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres12->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres12->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres12->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=2;
-   nzpres12->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres12->resourceMapping.firstOFDMSymbolInTimeDomain=4;
-   nzpres12->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres12->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres12->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres12->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres12->resourceMapping.freqBand.startingRB=0;
-   nzpres12->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres12->powerControlOffset=0;
-   nzpres12->powerControlOffsetSS=calloc(1,sizeof(*nzpres12->powerControlOffsetSS));
-   *nzpres12->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres12->scramblingID=40;
-   nzpres12->periodicityAndOffset = calloc(1,sizeof(*nzpres12->periodicityAndOffset));
-   nzpres12->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres12->periodicityAndOffset->choice.slots160 = 26;
-   nzpres12->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres12->qcl_InfoPeriodicCSI_RS));
-   *nzpres12->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres12);
-   
-   NR_NZP_CSI_RS_Resource_t *nzpres13 = calloc(1,sizeof(*nzpres13));
-   nzpres13->nzp_CSI_RS_ResourceId=13;
-   nzpres13->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres13->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres13->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres13->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres13->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=2;
-   nzpres13->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres13->resourceMapping.firstOFDMSymbolInTimeDomain=8;
-   nzpres13->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres13->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres13->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres13->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres13->resourceMapping.freqBand.startingRB=0;
-   nzpres13->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres13->powerControlOffset=0;
-   nzpres13->powerControlOffsetSS=calloc(1,sizeof(*nzpres13->powerControlOffsetSS));
-   *nzpres13->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres13->scramblingID=40;
-   nzpres13->periodicityAndOffset = calloc(1,sizeof(*nzpres13->periodicityAndOffset));
-   nzpres13->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres13->periodicityAndOffset->choice.slots160 = 26;
-   nzpres13->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres13->qcl_InfoPeriodicCSI_RS));
-   *nzpres13->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres13);
-   NR_NZP_CSI_RS_Resource_t *nzpres14 = calloc(1,sizeof(*nzpres14));
-   nzpres14->nzp_CSI_RS_ResourceId=14;
-   nzpres14->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres14->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres14->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres14->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres14->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=8;
-   nzpres14->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres14->resourceMapping.firstOFDMSymbolInTimeDomain=4;
-   nzpres14->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres14->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres14->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres14->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres14->resourceMapping.freqBand.startingRB=0;
-   nzpres14->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres14->powerControlOffset=0;
-   nzpres14->powerControlOffsetSS=calloc(1,sizeof(*nzpres14->powerControlOffsetSS));
-   *nzpres14->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres14->scramblingID=40;
-   nzpres14->periodicityAndOffset = calloc(1,sizeof(*nzpres14->periodicityAndOffset));
-   nzpres14->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres14->periodicityAndOffset->choice.slots160 = 25;
-   nzpres14->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres14->qcl_InfoPeriodicCSI_RS));
-   *nzpres14->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres14);
-   
-   NR_NZP_CSI_RS_Resource_t *nzpres15 = calloc(1,sizeof(*nzpres15));
-   nzpres15->nzp_CSI_RS_ResourceId=15;
-   nzpres15->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres15->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres15->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres15->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres15->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=8;
-   nzpres15->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres15->resourceMapping.firstOFDMSymbolInTimeDomain=8;
-   nzpres15->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres15->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres15->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres15->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres15->resourceMapping.freqBand.startingRB=0;
-   nzpres15->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres15->powerControlOffset=0;
-   nzpres15->powerControlOffsetSS=calloc(1,sizeof(*nzpres15->powerControlOffsetSS));
-   *nzpres15->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres15->scramblingID=40;
-   nzpres15->periodicityAndOffset = calloc(1,sizeof(*nzpres15->periodicityAndOffset));
-   nzpres15->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres15->periodicityAndOffset->choice.slots160 = 25;
-   nzpres15->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres15->qcl_InfoPeriodicCSI_RS));
-   *nzpres15->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres15);
-   NR_NZP_CSI_RS_Resource_t *nzpres16 = calloc(1,sizeof(*nzpres16));
-   nzpres16->nzp_CSI_RS_ResourceId=16;
-   nzpres16->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres16->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres16->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres16->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres16->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=8;
-   nzpres16->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres16->resourceMapping.firstOFDMSymbolInTimeDomain=5;
-   nzpres16->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres16->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres16->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres16->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres16->resourceMapping.freqBand.startingRB=0;
-   nzpres16->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres16->powerControlOffset=0;
-   nzpres16->powerControlOffsetSS=calloc(1,sizeof(*nzpres16->powerControlOffsetSS));
-   *nzpres16->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres16->scramblingID=40;
-   nzpres16->periodicityAndOffset = calloc(1,sizeof(*nzpres16->periodicityAndOffset));
-   nzpres16->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres16->periodicityAndOffset->choice.slots160 = 26;
-   nzpres16->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres16->qcl_InfoPeriodicCSI_RS));
-   *nzpres16->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres16);
-   
-   NR_NZP_CSI_RS_Resource_t *nzpres17 = calloc(1,sizeof(*nzpres17));
-   nzpres17->nzp_CSI_RS_ResourceId=9;
-   nzpres17->resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1;
-   nzpres17->resourceMapping.frequencyDomainAllocation.choice.row1.buf = calloc(1,1);
-   nzpres17->resourceMapping.frequencyDomainAllocation.choice.row1.size = 1;
-   nzpres17->resourceMapping.frequencyDomainAllocation.choice.row1.bits_unused = 4;
-   nzpres17->resourceMapping.frequencyDomainAllocation.choice.row1.buf[0]=8;
-   nzpres17->resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
-   nzpres17->resourceMapping.firstOFDMSymbolInTimeDomain=9;
-   nzpres17->resourceMapping.firstOFDMSymbolInTimeDomain2=NULL;
-   nzpres17->resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
-   nzpres17->resourceMapping.density.present=NR_CSI_RS_ResourceMapping__density_PR_three;
-   nzpres17->resourceMapping.density.choice.three=(NULL_t)0;
-   nzpres17->resourceMapping.freqBand.startingRB=0;
-   nzpres17->resourceMapping.freqBand.nrofRBs= servingcellconfigcommon->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-   nzpres17->powerControlOffset=0;
-   nzpres17->powerControlOffsetSS=calloc(1,sizeof(*nzpres17->powerControlOffsetSS));
-   *nzpres17->powerControlOffsetSS=NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
-   nzpres17->scramblingID=40;
-   nzpres17->periodicityAndOffset = calloc(1,sizeof(*nzpres17->periodicityAndOffset));
-   nzpres17->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots160;
-   nzpres17->periodicityAndOffset->choice.slots160 = 26;
-   nzpres17->qcl_InfoPeriodicCSI_RS=calloc(1,sizeof(*nzpres17->qcl_InfoPeriodicCSI_RS));
-   *nzpres17->qcl_InfoPeriodicCSI_RS=8;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpres17);
- }
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup = csi_MeasConfig;
 
- if (n_physical_antenna_ports > 16) AssertFatal(1==0,"Fill in for more than 16 antenna elements\n");
- 
- csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList  = calloc(1,sizeof(*csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList));
- csi_MeasConfig->nzp_CSI_RS_ResourceSetToReleaseList = NULL;
- NR_NZP_CSI_RS_ResourceSet_t *nzpresset0=calloc(1,sizeof(*nzpresset0));
- nzpresset0->nzp_CSI_ResourceSetId=0;
- NR_NZP_CSI_RS_ResourceSetId_t *nzpresset00=calloc(1,sizeof(*nzpresset00));
- *nzpresset00=0;
- ASN_SEQUENCE_ADD(&nzpresset0->nzp_CSI_RS_Resources.list,nzpresset00);
- nzpresset0->repetition=NULL;
- nzpresset0->aperiodicTriggeringOffset=NULL;
- nzpresset0->trs_Info=NULL;
- ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list,nzpresset0);
- if (n_physical_antenna_ports > 1) {
-   NR_NZP_CSI_RS_ResourceSet_t *nzpresset3=calloc(1,sizeof(*nzpresset3));
-   nzpresset3->nzp_CSI_ResourceSetId=3;
-   NR_NZP_CSI_RS_ResourceSetId_t *nzpresset30=calloc(1,sizeof(*nzpresset30));
-   *nzpresset30=2;
-   ASN_SEQUENCE_ADD(&nzpresset3->nzp_CSI_RS_Resources.list,nzpresset30);
-   if (n_physical_antenna_ports > 3) {
-   NR_NZP_CSI_RS_ResourceSetId_t *nzpresset31=calloc(1,sizeof(*nzpresset31));
-   *nzpresset31=3;
-   ASN_SEQUENCE_ADD(&nzpresset3->nzp_CSI_RS_Resources.list,nzpresset31);
-   NR_NZP_CSI_RS_ResourceSetId_t *nzpresset32=calloc(1,sizeof(*nzpresset32));
-   *nzpresset32=4;
-   ASN_SEQUENCE_ADD(&nzpresset3->nzp_CSI_RS_Resources.list,nzpresset32);
-   NR_NZP_CSI_RS_ResourceSetId_t *nzpresset33=calloc(1,sizeof(*nzpresset33));
-   *nzpresset33=5;
-   ASN_SEQUENCE_ADD(&nzpresset3->nzp_CSI_RS_Resources.list,nzpresset33);
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list,nzpresset3);
-   }
-   nzpresset3->repetition=calloc(1,sizeof(*nzpresset3->repetition));
-   *nzpresset3->repetition=NR_NZP_CSI_RS_ResourceSet__repetition_off;
-   nzpresset3->aperiodicTriggeringOffset=NULL;
-   nzpresset3->trs_Info=calloc(1,sizeof(*nzpresset3->trs_Info));
-   *nzpresset3->trs_Info=NR_NZP_CSI_RS_ResourceSet__trs_Info_true;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list,nzpresset3);
- }
-
- if (n_physical_antenna_ports > 7) {
-   NR_NZP_CSI_RS_ResourceSet_t *nzpresset4=calloc(1,sizeof(*nzpresset4));
-   nzpresset4->nzp_CSI_ResourceSetId=4;
-   NR_NZP_CSI_RS_ResourceSetId_t *nzpresset40=calloc(1,sizeof(*nzpresset40));
-   *nzpresset40=6;
-   ASN_SEQUENCE_ADD(&nzpresset4->nzp_CSI_RS_Resources.list,nzpresset40);
-   NR_NZP_CSI_RS_ResourceSetId_t *nzpresset41=calloc(1,sizeof(*nzpresset41));
-   *nzpresset41=7;
-   ASN_SEQUENCE_ADD(&nzpresset4->nzp_CSI_RS_Resources.list,nzpresset41);
-   NR_NZP_CSI_RS_ResourceSetId_t *nzpresset42=calloc(1,sizeof(*nzpresset42));
-   *nzpresset42=8;
-   ASN_SEQUENCE_ADD(&nzpresset4->nzp_CSI_RS_Resources.list,nzpresset42);
-   NR_NZP_CSI_RS_ResourceSetId_t *nzpresset43=calloc(1,sizeof(*nzpresset43));
-   *nzpresset43=9;
-   ASN_SEQUENCE_ADD(&nzpresset4->nzp_CSI_RS_Resources.list,nzpresset43);
-   nzpresset4->repetition=calloc(1,sizeof(*nzpresset4->repetition));
-   *nzpresset4->repetition=NR_NZP_CSI_RS_ResourceSet__repetition_off;
-   nzpresset4->aperiodicTriggeringOffset=NULL;
-   nzpresset4->trs_Info=calloc(1,sizeof(*nzpresset4->trs_Info));
-   *nzpresset4->trs_Info=NR_NZP_CSI_RS_ResourceSet__trs_Info_true;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list,nzpresset4);
- }
- if (n_physical_antenna_ports > 15) {
-   NR_NZP_CSI_RS_ResourceSet_t *nzpresset5=calloc(1,sizeof(*nzpresset5));
-   nzpresset5->nzp_CSI_ResourceSetId=5;
-   NR_NZP_CSI_RS_ResourceSetId_t *nzpresset50=calloc(1,sizeof(*nzpresset50));
-   *nzpresset50=10;
-   ASN_SEQUENCE_ADD(&nzpresset5->nzp_CSI_RS_Resources.list,nzpresset50);
-   NR_NZP_CSI_RS_ResourceSetId_t *nzpresset51=calloc(1,sizeof(*nzpresset51));
-   *nzpresset51=11;
-   ASN_SEQUENCE_ADD(&nzpresset5->nzp_CSI_RS_Resources.list,nzpresset51);
-   NR_NZP_CSI_RS_ResourceSetId_t *nzpresset52=calloc(1,sizeof(*nzpresset52));
-   *nzpresset52=12;
-   ASN_SEQUENCE_ADD(&nzpresset5->nzp_CSI_RS_Resources.list,nzpresset52);
-   NR_NZP_CSI_RS_ResourceSetId_t *nzpresset53=calloc(1,sizeof(*nzpresset53));
-   *nzpresset53=13;
-   ASN_SEQUENCE_ADD(&nzpresset5->nzp_CSI_RS_Resources.list,nzpresset53);
-   nzpresset5->repetition=calloc(1,sizeof(*nzpresset5->repetition));
-   *nzpresset5->repetition=NR_NZP_CSI_RS_ResourceSet__repetition_off;
-   nzpresset5->aperiodicTriggeringOffset=NULL;
-   nzpresset5->trs_Info=calloc(1,sizeof(*nzpresset5->trs_Info));
-   *nzpresset5->trs_Info=NR_NZP_CSI_RS_ResourceSet__trs_Info_true;
-   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list,nzpresset5);
- }
-
- csi_MeasConfig->csi_IM_ResourceToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceToAddModList));
+ csi_MeasConfig->csi_IM_ResourceToAddModList = NULL;
  csi_MeasConfig->csi_IM_ResourceToReleaseList = NULL;
- NR_CSI_IM_Resource_t *imres0 = calloc(1,sizeof(*imres0));
- imres0->csi_IM_ResourceId=0;
- imres0->csi_IM_ResourceElementPattern=calloc(1,sizeof(*imres0->csi_IM_ResourceElementPattern));
- imres0->csi_IM_ResourceElementPattern->present = NR_CSI_IM_Resource__csi_IM_ResourceElementPattern_PR_pattern1 ;
- imres0->csi_IM_ResourceElementPattern->choice.pattern1=calloc(1,sizeof(*imres0->csi_IM_ResourceElementPattern->choice.pattern1));
- imres0->csi_IM_ResourceElementPattern->choice.pattern1->subcarrierLocation_p1 = NR_CSI_IM_Resource__csi_IM_ResourceElementPattern__pattern1__subcarrierLocation_p1_s4;
- imres0->csi_IM_ResourceElementPattern->choice.pattern1->symbolLocation_p1=7;
- imres0->freqBand=calloc(1,sizeof(*imres0->freqBand));
- imres0->freqBand->startingRB=0;
- imres0->freqBand->nrofRBs=106;
- imres0->periodicityAndOffset=calloc(1,sizeof(*imres0->periodicityAndOffset));
- imres0->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots320;
- imres0->periodicityAndOffset->choice.slots320 = 2;
- ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceToAddModList->list,imres0);
- csi_MeasConfig->csi_IM_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceSetToAddModList));
+ csi_MeasConfig->csi_IM_ResourceSetToAddModList = NULL;
  csi_MeasConfig->csi_IM_ResourceSetToReleaseList = NULL;
- NR_CSI_IM_ResourceSet_t *imresset0 = calloc(1,sizeof(*imresset0));
- imresset0->csi_IM_ResourceSetId=0;
- NR_CSI_IM_ResourceId_t *imresset00=calloc(1,sizeof(*imresset00));
- *imresset00=0;
- ASN_SEQUENCE_ADD(&imresset0->csi_IM_Resources.list,imresset00);
- ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceSetToAddModList->list,imresset0);
- 
+ csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList  = NULL;
+ csi_MeasConfig->nzp_CSI_RS_ResourceSetToReleaseList = NULL;
+ csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList = NULL;
+
  csi_MeasConfig->csi_SSB_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_SSB_ResourceSetToAddModList));
  csi_MeasConfig->csi_SSB_ResourceSetToReleaseList = NULL;
+
  NR_CSI_SSB_ResourceSet_t *ssbresset0 = calloc(1,sizeof(*ssbresset0));
- ssbresset0->csi_SSB_ResourceSetId=0; 
- NR_SSB_Index_t *ssbresset00=calloc(1,sizeof(*ssbresset00));
- *ssbresset00=0;
- ASN_SEQUENCE_ADD(&ssbresset0->csi_SSB_ResourceList.list,ssbresset00);
- if (n_physical_antenna_ports > 1) {
+ ssbresset0->csi_SSB_ResourceSetId=0;
+ if ((bitmap>>7)&0x01){
+   NR_SSB_Index_t *ssbresset00=calloc(1,sizeof(*ssbresset00));
+   *ssbresset00=0;
+   ASN_SEQUENCE_ADD(&ssbresset0->csi_SSB_ResourceList.list,ssbresset00);
+ }
+ if ((bitmap>>6)&0x01) {
    NR_SSB_Index_t *ssbresset01=calloc(1,sizeof(*ssbresset01));
    *ssbresset01=1;
    ASN_SEQUENCE_ADD(&ssbresset0->csi_SSB_ResourceList.list,ssbresset01);
  }
- if (n_physical_antenna_ports > 3) {
+ if ((bitmap>>5)&0x01) {
    NR_SSB_Index_t *ssbresset02=calloc(1,sizeof(*ssbresset02));
    *ssbresset02=2;
    ASN_SEQUENCE_ADD(&ssbresset0->csi_SSB_ResourceList.list,ssbresset02);
+ }
+ if ((bitmap>>4)&0x01) {
    NR_SSB_Index_t *ssbresset03=calloc(1,sizeof(*ssbresset03));
    *ssbresset03=3;
    ASN_SEQUENCE_ADD(&ssbresset0->csi_SSB_ResourceList.list,ssbresset03);
  }
- if (n_physical_antenna_ports > 7) {
+ if ((bitmap>>3)&0x01) {
    NR_SSB_Index_t *ssbresset04=calloc(1,sizeof(*ssbresset04));
    *ssbresset04=4;
    ASN_SEQUENCE_ADD(&ssbresset0->csi_SSB_ResourceList.list,ssbresset04);
+ }
+ if ((bitmap>>2)&0x01) {
    NR_SSB_Index_t *ssbresset05=calloc(1,sizeof(*ssbresset05));
    *ssbresset05=5;
    ASN_SEQUENCE_ADD(&ssbresset0->csi_SSB_ResourceList.list,ssbresset05);
+ }
+ if ((bitmap>>1)&0x01) {
    NR_SSB_Index_t *ssbresset06=calloc(1,sizeof(*ssbresset06));
    *ssbresset06=6;
    ASN_SEQUENCE_ADD(&ssbresset0->csi_SSB_ResourceList.list,ssbresset06);
+ }
+ if ((bitmap)&0x01) {
    NR_SSB_Index_t *ssbresset07=calloc(1,sizeof(*ssbresset07));
    *ssbresset07=7;
    ASN_SEQUENCE_ADD(&ssbresset0->csi_SSB_ResourceList.list,ssbresset07);
@@ -1779,222 +1124,21 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  csires0->csi_ResourceConfigId=0;
  csires0->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB;
  csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
- csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = calloc(1,sizeof(*csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList));
- csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = NULL;
- NR_NZP_CSI_RS_ResourceSetId_t *csires00 = calloc(1,sizeof(*csires00));
- *csires00 = 0;
- ASN_SEQUENCE_ADD(&csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list,csires00);
+ csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = NULL;
+ csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = calloc(1,sizeof(*csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList));
+ NR_CSI_SSB_ResourceSetId_t *ssbres00 = calloc(1,sizeof(*ssbres00));
+ *ssbres00 = 0;
+ ASN_SEQUENCE_ADD(&csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list,ssbres00);
  csires0->bwp_Id = 1;
  csires0->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
  ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires0);
 
- NR_CSI_ResourceConfig_t *csires11 = calloc(1,sizeof(*csires11));
- csires11->csi_ResourceConfigId=11;
- csires11->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_csi_IM_ResourceSetList;
- csires11->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList = calloc(1,sizeof(*csires11->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList));
- NR_NZP_CSI_RS_ResourceSetId_t *csires110 = calloc(1,sizeof(*csires110));
- *csires110 = 0;
- ASN_SEQUENCE_ADD(&csires11->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList->list,csires110);
- csires11->bwp_Id = 1;
- csires11->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
- //ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires11);
-
- NR_CSI_ResourceConfig_t *csires10 = calloc(1,sizeof(*csires10));
- csires10->csi_ResourceConfigId=10;
- csires10->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB;
- csires10->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires10->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
- csires10->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = calloc(1,sizeof(*csires10->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList));
- csires10->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = NULL;
- NR_NZP_CSI_RS_ResourceSetId_t *csires100 = calloc(1,sizeof(*csires100));
- *csires100 = 0;
- ASN_SEQUENCE_ADD(&csires10->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list,csires100);
- csires10->bwp_Id = 1;
- csires10->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
- //ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires10);
-
- NR_CSI_ResourceConfig_t *csires2 = calloc(1,sizeof(*csires2));
- csires2->csi_ResourceConfigId=2;
- csires2->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB;
- csires2->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires2->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
- csires2->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = calloc(1,sizeof(*csires2->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList));
- csires2->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = NULL;
- NR_NZP_CSI_RS_ResourceSetId_t *csires20 = calloc(1,sizeof(*csires20));
- *csires20 = 0;
- ASN_SEQUENCE_ADD(&csires2->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list,csires20);
- csires2->bwp_Id = 1;
- csires2->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
- //ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires2);
-
- NR_CSI_ResourceConfig_t *csires3 = calloc(1,sizeof(*csires3));
- csires3->csi_ResourceConfigId=3;
- csires3->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB;
- csires3->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires3->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
- csires3->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = calloc(1,sizeof(*csires3->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList));
- csires3->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = NULL;
- NR_NZP_CSI_RS_ResourceSetId_t *csires30 = calloc(1,sizeof(*csires30));
- *csires30 = 0;
- ASN_SEQUENCE_ADD(&csires3->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list,csires30);
- csires3->bwp_Id = 1;
- csires3->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
- //ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires3);
-
- NR_CSI_ResourceConfig_t *csires4 = calloc(1,sizeof(*csires4));
- csires4->csi_ResourceConfigId=4;
- csires4->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB;
- csires4->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires4->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
- csires4->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = calloc(1,sizeof(*csires4->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList));
- csires4->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = NULL;
- NR_NZP_CSI_RS_ResourceSetId_t *csires40 = calloc(1,sizeof(*csires40));
- *csires40 = 0;
- ASN_SEQUENCE_ADD(&csires4->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list,csires40);
- csires4->bwp_Id = 1;
- csires4->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
- //ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires4);
-
- NR_CSI_ResourceConfig_t *csires5 = calloc(1,sizeof(*csires5));
- csires5->csi_ResourceConfigId=5;
- csires5->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB;
- csires5->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires5->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
- csires5->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = calloc(1,sizeof(*csires5->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList));
- csires5->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = NULL;
- NR_NZP_CSI_RS_ResourceSetId_t *csires50 = calloc(1,sizeof(*csires50));
- *csires50 = 0;
- ASN_SEQUENCE_ADD(&csires5->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list,csires50);
- csires5->bwp_Id = 1;
- csires5->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
- //ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires5);
-
- NR_CSI_ResourceConfig_t *csires6 = calloc(1,sizeof(*csires6));
- csires6->csi_ResourceConfigId=6;
- csires6->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB;
- csires6->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires6->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
- csires6->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = calloc(1,sizeof(*csires6->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList));
- csires6->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = NULL;
- NR_NZP_CSI_RS_ResourceSetId_t *csires60 = calloc(1,sizeof(*csires60));
- *csires60 = 0;
- ASN_SEQUENCE_ADD(&csires6->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list,csires60);
- csires6->bwp_Id = 1;
- csires6->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
- //ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires6);
-
- NR_CSI_ResourceConfig_t *csires7 = calloc(1,sizeof(*csires7));
- csires7->csi_ResourceConfigId=7;
- csires7->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB;
- csires7->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires7->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
- csires7->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = calloc(1,sizeof(*csires7->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList));
- csires7->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = NULL;
- NR_NZP_CSI_RS_ResourceSetId_t *csires70 = calloc(1,sizeof(*csires70));
- *csires70 = 0;
- ASN_SEQUENCE_ADD(&csires7->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list,csires70);
- csires7->bwp_Id = 1;
- csires7->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
- //ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires7);
-
- NR_CSI_ResourceConfig_t *csires8 = calloc(1,sizeof(*csires8));
- csires8->csi_ResourceConfigId=8;
- csires8->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB;
- csires8->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires8->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
- csires8->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = calloc(1,sizeof(*csires8->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList));
- csires8->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = NULL;
- NR_NZP_CSI_RS_ResourceSetId_t *csires80 = calloc(1,sizeof(*csires80));
- *csires80 = 0;
- ASN_SEQUENCE_ADD(&csires8->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list,csires80);
- csires8->bwp_Id = 1;
- csires8->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
- //ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires8);
-
- NR_CSI_ResourceConfig_t *csires9 = calloc(1,sizeof(*csires9));
- csires9->csi_ResourceConfigId=9;
- csires9->csi_RS_ResourceSetList.present = NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR_nzp_CSI_RS_SSB;
- csires9->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB = calloc(1,sizeof(*csires9->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB));
- csires9->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList = calloc(1,sizeof(*csires9->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList));
- csires9->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList = NULL;
- NR_NZP_CSI_RS_ResourceSetId_t *csires90 = calloc(1,sizeof(*csires90));
- *csires90 = 0;
- ASN_SEQUENCE_ADD(&csires9->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list,csires90);
- csires9->bwp_Id = 1; 
- csires9->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
- //ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires9);
-
  csi_MeasConfig->csi_ReportConfigToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_ReportConfigToAddModList));
  csi_MeasConfig->csi_ReportConfigToReleaseList = NULL;
- NR_CSI_ReportConfig_t *csirep0 = calloc(1,sizeof(*csirep0));
- csirep0->reportConfigId=0;
- csirep0->carrier=NULL;
- csirep0->resourcesForChannelMeasurement=0;
- csirep0->csi_IM_ResourcesForInterference=calloc(1,sizeof(*csirep0->csi_IM_ResourcesForInterference));
- *csirep0->csi_IM_ResourcesForInterference=11;
- csirep0->nzp_CSI_RS_ResourcesForInterference=NULL;
- csirep0->reportConfigType.present = NR_CSI_ReportConfig__reportConfigType_PR_periodic;
- csirep0->reportConfigType.choice.periodic = calloc(1,sizeof(*csirep0->reportConfigType.choice.periodic));
- csirep0->reportConfigType.choice.periodic->reportSlotConfig.present=NR_CSI_ReportPeriodicityAndOffset_PR_slots320;
- csirep0->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320 = 9;
-
- NR_PUCCH_CSI_Resource_t *pucchcsires0 = calloc(1,sizeof(*pucchcsires0));
- pucchcsires0->uplinkBandwidthPartId=1;
- pucchcsires0->pucch_Resource=11;
- ASN_SEQUENCE_ADD(&csirep0->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list,pucchcsires0);
- csirep0->reportQuantity.present = NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI;
- csirep0->reportQuantity.choice.cri_RI_PMI_CQI = (NULL_t)0;
- csirep0->reportFreqConfiguration = calloc(1,sizeof(*csirep0->reportFreqConfiguration));
- csirep0->reportFreqConfiguration->cqi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI;
- csirep0->reportFreqConfiguration->pmi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__pmi_FormatIndicator_widebandPMI;
- csirep0->reportFreqConfiguration->csi_ReportingBand=calloc(1,sizeof(*csirep0->reportFreqConfiguration->csi_ReportingBand));
- 
- 
- AssertFatal(*secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id>0,"firstActiveDownlinkBWP_Id %d\n",(int)*secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id);
- int NPRB  = NRRIV2BW(secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[*secondaryCellGroup->spCellConfig->spCellConfigDedicated->firstActiveDownlinkBWP_Id-1]->bwp_Common->genericParameters.locationAndBandwidth,275);
- int sbsize = get_subband_size(NPRB,0);
- int numsb = NPRB/sbsize;
- if (NPRB%sbsize == 0) numsb++;
- csirep0->reportFreqConfiguration->csi_ReportingBand->present= 	NR_CSI_ReportConfig__reportFreqConfiguration__csi_ReportingBand_PR_NOTHING+(numsb-2);
- csirep0->reportFreqConfiguration->csi_ReportingBand->choice.subbands18.size=numsb/8;
- if ((numsb&7) > 0) csirep0->reportFreqConfiguration->csi_ReportingBand->choice.subbands18.size++;
- csirep0->reportFreqConfiguration->csi_ReportingBand->choice.subbands18.bits_unused = (8-(numsb&7))&7;
- csirep0->reportFreqConfiguration->csi_ReportingBand->choice.subbands18.buf=malloc(csirep0->reportFreqConfiguration->csi_ReportingBand->choice.subbands18.size);
- for (int i=0;i<csirep0->reportFreqConfiguration->csi_ReportingBand->choice.subbands18.size;i++) 
-   csirep0->reportFreqConfiguration->csi_ReportingBand->choice.subbands18.buf[i]=0xff;
- csirep0->reportFreqConfiguration->csi_ReportingBand->choice.subbands18.buf[csirep0->reportFreqConfiguration->csi_ReportingBand->choice.subbands18.size-1]&=~((1<<csirep0->reportFreqConfiguration->csi_ReportingBand->choice.subbands18.bits_unused)-1);
-
- csirep0->timeRestrictionForChannelMeasurements= NR_CSI_ReportConfig__timeRestrictionForChannelMeasurements_configured;
- csirep0->timeRestrictionForInterferenceMeasurements=NR_CSI_ReportConfig__timeRestrictionForInterferenceMeasurements_configured;
- csirep0->codebookConfig=calloc(1,sizeof(*csirep0->codebookConfig));
- csirep0->codebookConfig->codebookType.present = NR_CodebookConfig__codebookType_PR_type1;
- csirep0->codebookConfig->codebookType.choice.type1 = calloc(1,sizeof(*csirep0->codebookConfig->codebookType.choice.type1));
- csirep0->codebookConfig->codebookType.choice.type1->subType.present = NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel; 
- csirep0->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel=calloc(1,sizeof(*csirep0->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel));
- csirep0->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present=NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two;
- csirep0->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two=
-   calloc(1,sizeof(*csirep0->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two));
- csirep0->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.size=1;
- csirep0->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.bits_unused=2;
- csirep0->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.buf=malloc(1);
- csirep0->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.buf[0]=0xfc;
- //'111111'B
-
-
- csirep0->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.size=1; 
- csirep0->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.bits_unused=0;
- csirep0->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf=malloc(1); 
- csirep0->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0]=0xc0; //'00000011'B
-
- csirep0->codebookConfig->codebookType.choice.type1->codebookMode=1;
- csirep0->dummy = NULL;
- csirep0->groupBasedBeamReporting.present = NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled;
- csirep0->groupBasedBeamReporting.choice.disabled=calloc(1,sizeof(*csirep0->groupBasedBeamReporting.choice.disabled));
- csirep0->groupBasedBeamReporting.choice.disabled->nrofReportedRS = NULL;
- csirep0->cqi_Table = calloc(1,sizeof(*csirep0->cqi_Table));
- *csirep0->cqi_Table = NR_CSI_ReportConfig__cqi_Table_table1;
- csirep0->subbandSize = NR_CSI_ReportConfig__subbandSize_value1;
- csirep0->non_PMI_PortIndication = NULL;
- csirep0->ext1 = NULL;
-
- ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ReportConfigToAddModList->list,csirep0);
-
  NR_CSI_ReportConfig_t *csirep1 = calloc(1,sizeof(*csirep1));
- csirep1->reportConfigId=2;
+ csirep1->reportConfigId=0;
  csirep1->carrier=NULL;
- csirep1->resourcesForChannelMeasurement=initial_csi_index;
+ csirep1->resourcesForChannelMeasurement=0;
  csirep1->csi_IM_ResourcesForInterference=NULL;
  csirep1->nzp_CSI_RS_ResourcesForInterference=NULL;
  csirep1->reportConfigType.present = NR_CSI_ReportConfig__reportConfigType_PR_periodic;
@@ -2003,7 +1147,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  csirep1->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320 = 49;
  NR_PUCCH_CSI_Resource_t *pucchcsires1 = calloc(1,sizeof(*pucchcsires1));
  pucchcsires1->uplinkBandwidthPartId=1;
- pucchcsires1->pucch_Resource=12;
+ pucchcsires1->pucch_Resource=3;
  ASN_SEQUENCE_ADD(&csirep1->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list,pucchcsires1);
  csirep1->reportQuantity.present = NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP;
  csirep1->reportQuantity.choice.ssb_Index_RSRP=(NULL_t)0;
@@ -2038,7 +1182,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  csirep1->groupBasedBeamReporting.present = NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled;
  csirep1->groupBasedBeamReporting.choice.disabled=calloc(1,sizeof(*csirep1->groupBasedBeamReporting.choice.disabled));
  csirep1->groupBasedBeamReporting.choice.disabled->nrofReportedRS = calloc(1,sizeof(*csirep1->groupBasedBeamReporting.choice.disabled->nrofReportedRS));
- *csirep1->groupBasedBeamReporting.choice.disabled->nrofReportedRS=NR_CSI_ReportConfig__groupBasedBeamReporting__disabled__nrofReportedRS_n2;
+ *csirep1->groupBasedBeamReporting.choice.disabled->nrofReportedRS=NR_CSI_ReportConfig__groupBasedBeamReporting__disabled__nrofReportedRS_n1;
  // this corresponds to:
  //if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'disabled', the UE is not required to update measurements for more than 64 CSI-RS and/or SSB resources, and the UE shall report in a single report nrofReportedRS (higher layer configured) different CRI or SSBRI for each report setting. 
 
@@ -2050,7 +1194,6 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
 
  ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ReportConfigToAddModList->list,csirep1);
 
-
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->sCellDeactivationTimer=NULL;
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->crossCarrierSchedulingConfig=NULL;
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->tag_Id=0;
diff --git a/openair3/NAS/UE/ESM/esm_ebr_context.c b/openair3/NAS/UE/ESM/esm_ebr_context.c
index cd493dd09e54466cf784b0ec675eac917dc5e68e..0c79fa3e3af330a22e1d294ffc6cd96f7e276327 100644
--- a/openair3/NAS/UE/ESM/esm_ebr_context.c
+++ b/openair3/NAS/UE/ESM/esm_ebr_context.c
@@ -55,10 +55,6 @@ Description Defines functions used to handle EPS bearer contexts.
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
-#ifdef UESIM_EXPANSION
-  #include "openairinterface5g_limits.h"
-  extern uint16_t inst_pdcp_list[NUMBER_OF_UE_MAX];
-#endif
 
 /****************************************************************************/
 /****************  E X T E R N A L    D E F I N I T I O N S  ****************/
@@ -200,7 +196,7 @@ int esm_ebr_context_create(
           char          *tmp          = NULL;
           char           ipv4_addr[INET_ADDRSTRLEN];
           //char           ipv6_addr[INET6_ADDRSTRLEN];
-          char          *netmask      = NULL;
+          int            netmask      = 32;
           char           broadcast[INET_ADDRSTRLEN];
           struct in_addr in_addr;
           char           command_line[500];
@@ -227,7 +223,7 @@ int esm_ebr_context_create(
               strcpy(ipv4_addr, tmp);
 
               if (IN_CLASSA(ntohl(in_addr.s_addr))) {
-                netmask = "255.0.0.0";
+                netmask = 8;
                 in_addr.s_addr = pdn->ip_addr[0] << 24 |
                                  ((255  << 16) & 0x00FF0000) |
                                  ((255 <<  8)  & 0x0000FF00) |
@@ -239,7 +235,7 @@ int esm_ebr_context_create(
                 //                                        in_addr.s_addr);
                 strcpy(broadcast, tmp);
               } else if (IN_CLASSB(ntohl(in_addr.s_addr))) {
-                netmask = "255.255.0.0";
+                netmask = 16;
                 in_addr.s_addr =  pdn->ip_addr[0] << 24 |
                                   ((pdn->ip_addr[1] << 16) & 0x00FF0000) |
                                   ((255 <<  8)  & 0x0000FF00) |
@@ -251,7 +247,7 @@ int esm_ebr_context_create(
                 //                                        in_addr.s_addr);
                 strcpy(broadcast, tmp);
               } else if (IN_CLASSC(ntohl(in_addr.s_addr))) {
-                netmask = "255.255.255.0";
+                netmask = 24;
                 in_addr.s_addr = pdn->ip_addr[0] << 24 |
                                  ((pdn->ip_addr[1] << 16) & 0x00FF0000) |
                                  ((pdn->ip_addr[2] <<  8) & 0x0000FF00) |
@@ -263,56 +259,23 @@ int esm_ebr_context_create(
                 //                                        in_addr.s_addr);
                 strcpy(broadcast, tmp);
               } else {
-                netmask = "255.255.255.255";
+                netmask = 32;
                 strcpy(broadcast, ipv4_addr);
               }
 
-              if(NFAPI_MODE==NFAPI_UE_STUB_PNF) {
-                // this is for L2 FAPI simulator.
-                // change for multiple UE's like 256UEs.
-                // if it's made too many tables , OS may crush so we use one table.
-                if(PDCP_USE_NETLINK) {
-#ifdef UESIM_EXPANSION
-                  uint16_t inst_nic = (pdn->ip_addr[3] & 0x000000FF) - 2;
-                  res = sprintf(command_line,
-                                "ifconfig %s%d %s netmask %s broadcast %s up && "
-                                "ip rule add from %s/24 table %d && "
-                                "ip rule add to %s/24 table %d && "
-                                "ip route add default dev %s%d table %d",
-                                UE_NAS_USE_TUN?"oaitun_ue":"oip",
-                                inst_nic + 1, ipv4_addr, netmask, broadcast,
-                                ipv4_addr, 201,
-                                ipv4_addr, 201,
-                                UE_NAS_USE_TUN?"oaitun_ue":"oip",
-                                inst_nic + 1, 201);
-                  inst_pdcp_list[inst_nic] = ueid;
-#else
-                  res = sprintf(command_line,
-                                "ifconfig %s%d %s netmask %s broadcast %s up && "
-                                "ip rule add from %s/32 table %d && "
-                                "ip rule add to %s/32 table %d && "
-                                "ip route add default dev %s%d table %d",
-                                UE_NAS_USE_TUN?"oaitun_ue":"oip",
-                                ueid + 1, ipv4_addr, netmask, broadcast,
-                                ipv4_addr, ueid + 201,
-                                ipv4_addr, ueid + 201,
-                                UE_NAS_USE_TUN?"oaitun_ue":"oip",
-                                ueid + 1, ueid + 201);
-#endif
-                } // PDCP_USE_NETLINK
-              } else {
-                res = sprintf(command_line,
-                              "ifconfig %s%d %s netmask %s broadcast %s up && "
-                              "ip rule add from %s/32 table %d && "
-                              "ip rule add to %s/32 table %d && "
-                              "ip route add default dev %s%d table %d",
-                              UE_NAS_USE_TUN?"oaitun_ue":"oip",
-                              ueid + 1, ipv4_addr, netmask, broadcast,
-                              ipv4_addr, ueid + 201,
-                              ipv4_addr, ueid + 201,
-                              UE_NAS_USE_TUN?"oaitun_ue":"oip",
-                              ueid + 1, ueid + 201);
-              }
+              res = sprintf(command_line,
+                            "ip address add %s/%d broadcast %s dev %s%d && "
+                            "ip link set %s%d up && "
+                            "ip rule add from %s/32 table %d && "
+                            "ip rule add to %s/32 table %d && "
+                            "ip route add default dev %s%d table %d",
+                            ipv4_addr, netmask, broadcast,
+                            UE_NAS_USE_TUN ? "oaitun_ue" : "oip", ueid + 1,
+                            UE_NAS_USE_TUN ? "oaitun_ue" : "oip", ueid + 1,
+                            ipv4_addr, ueid + 10000,
+                            ipv4_addr, ueid + 10000,
+                            UE_NAS_USE_TUN ? "oaitun_ue" : "oip",
+                            ueid + 1, ueid + 10000);
 
               if ( res<0 ) {
                 LOG_TRACE(WARNING, "ESM-PROC  - Failed to system command string");
diff --git a/openshift/README.md b/openshift/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..b7409ab94556d868930abf458847a9d179ede52c
--- /dev/null
+++ b/openshift/README.md
@@ -0,0 +1,107 @@
+<table style="border-collapse: collapse; border: none;">
+  <tr style="border-collapse: collapse; border: none;">
+    <td style="border-collapse: collapse; border: none;">
+      <a href="http://www.openairinterface.org/">
+         <img src="../doc/images/oai_final_logo.png" alt="" border=3 height=50 width=150>
+         </img>
+      </a>
+    </td>
+    <td style="border-collapse: collapse; border: none; vertical-align: center;">
+      <b><font size = "5">OpenShift Build and Usage Procedures</font></b>
+    </td>
+  </tr>
+</table>
+
+-----
+
+**CAUTION: this is experimental. Still a lot to be done.**
+
+-----
+
+# 1. Build pre-requisites #
+
+To build our RAN images, we SHALL use the `codeready-builder-for-rhel-8-x86_64-rpms` repository with all the proper development libraries.
+
+This repository is not directly accessible from the UBI RHEL8 image (`registry.access.redhat.com/ubi8/ubi:latest`).
+
+So we need to copy from a register RHEL8 machine certificates and subsccription manager configuration files.
+
+SO on a `RHEL8` physical machine (or a virtual machine) connected to the OpenShift Cluster, recover the entitlement and the RH subscription manager configs:
+
+```bash
+oc create configmap rhsm-conf --from-file /etc/rhsm/rhsm.conf
+oc create configmap rhsm-ca --from-file /etc/rhsm/ca/redhat-uep.pem
+
+oc create secret generic etc-pki-entitlement --from-file /etc/pki/entitlement/{NUMBER_ON_YOUR_COMPUTER}.pem --from-file /etc/pki/entitlement/{NUMBER_ON_YOUR_COMPUTER}-key.pem
+```
+
+These configmaps and secret will be shared by all the build configs in your OC project. No need to do it each time.
+
+**CAUTION: these files expire every month or so. If you have done a build on your OC project and try again a few weeks later, you may need to re-copy them**.
+
+```bash
+oc delete secret etc-pki-entitlement
+oc delete cm rhsm-conf
+oc delete cm rhsm-ca
+```
+
+**LAST POINT: your OC project SHALL be `oai`.**
+
+# 2. Build the Builder shared image #
+
+In our Eurecom/OSA environment we need to pass a GIT proxy.
+
+2 things are impacted by this situation:
+
+*  In `openshift/oai-ran-rh8-build-config.yml` file
+   * `httpProxy: http://proxy.eurecom.fr:8080` 
+   * `httpsProxy: https://proxy.eurecom.fr:8080`
+*  Add a environment variable to the build config
+
+```bash
+oc apply -f openshift/oai-ran-rh8-image-stream.yml
+oc apply -f openshift/oai-ran-rh8-build-config.yml
+oc set env bc/oai-ran-rhel8-build-config NEEDED_GIT_PROXY=http://proxy.eurecom.fr:8080
+oc start-build oai-ran-rhel8-build-config --follow
+```
+
+In case you do NOT require a GIT proxy: **you SHALL remove the 2 lines in `openshift/oai-ran-rh8-build-config.yml` file.**
+
+And no need to add a `NEEDED_GIT_PROXY` variable to the build config.
+
+```bash
+oc apply -f openshift/oai-ran-rh8-image-stream.yml
+oc apply -f openshift/modified-oai-ran-rh8-build-config.yml
+oc start-build oai-ran-rhel8-build-config --follow
+```
+
+After a while it should be successful.
+
+# 3. Build an OAI target image #
+
+For the example the eNB:
+
+```bash
+oc apply -f openshift/oai-enb-rh8-image-stream.yml
+oc apply -f openshift/oai-enb-rh8-build-config.yml
+oc start-build oai-enb-rh8-build-config --follow
+```
+
+**CAUTION: if you are pushing modifications to the branch you are using, it won't be taken into account besides the Dockerfile.**
+
+**Because the source files are copied during the shared image creation.**
+
+**Only way to regenerate images w/ modified source code is to re-start from step #2.**
+
+# 4. Deployment using HELM charts #
+
+**CAUTION: even more experimental.**
+
+Helm charts are located in another repository:
+
+```bash
+git clone https://github.com/OPENAIRINTERFACE/openair-k8s.git
+cd openair-k8s
+git checkout helm-deployment-S6a-S1C-S1U-in-network-18-with-enb
+helm install mme /path-to-your-cloned/openair-k8s/charts/oai-mme/
+```
diff --git a/openshift/oc_init_enb.sh b/openshift/oc_init_enb.sh
deleted file mode 100644
index 6154363cd90ad8cbab07386d2c278ac2d3235005..0000000000000000000000000000000000000000
--- a/openshift/oc_init_enb.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-oc apply -f openshift/oai-enb-image-stream.yml
-oc apply -f openshift/oai-enb-build-config.yml
-oc set env bc/oai-enb-build-config NEEDED_GIT_PROXY=http://proxy.eurecom.fr:8080
-oc start-build oai-enb-build-config --follow
diff --git a/openshift/oc_init_gnb.sh b/openshift/oc_init_gnb.sh
deleted file mode 100644
index e7a570bb4334e5f88ebe8296b554a57508ce1354..0000000000000000000000000000000000000000
--- a/openshift/oc_init_gnb.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-oc apply -f openshift/oai-gnb-image-stream.yml
-oc apply -f openshift/oai-gnb-build-config.yml
-oc set env bc/oai-gnb-build-config NEEDED_GIT_PROXY=http://proxy.eurecom.fr:8080
-oc start-build oai-gnb-build-config --follow
diff --git a/openshift/oc_init_ran.sh b/openshift/oc_init_ran.sh
deleted file mode 100644
index 57dbb662e83a2d6013abc3e8281db252bdd038f8..0000000000000000000000000000000000000000
--- a/openshift/oc_init_ran.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-oc apply -f openshift/oai-ran-image-stream.yml
-oc apply -f openshift/oai-ran-build-config.yml
-oc set env bc/oai-ran-build-config NEEDED_GIT_PROXY=http://proxy.eurecom.fr:8080
-oc start-build oai-ran-build-config --follow
diff --git a/targets/COMMON/openairinterface5g_limits.h b/targets/COMMON/openairinterface5g_limits.h
index aa99eee048d115003f3e9773d4bcde6759d91ea4..a678197fde7426455ab35fb5935ba1c5a6086cb2 100644
--- a/targets/COMMON/openairinterface5g_limits.h
+++ b/targets/COMMON/openairinterface5g_limits.h
@@ -8,23 +8,11 @@
 #        define NUMBER_OF_NR_RU_MAX 2
 #        ifndef PHYSIM
 #            ifndef UE_EXPANSION
-// TODO:L2 FAPI simulator.
-// UESIM_EXPANSION is used to be same value of NUMBER_OF_UE_MAX
-// in eNB and UE.
-// now , if we use --mu option in UE, compiling error will occur.
-// This problem will be fixed in the future.
-#                ifndef UESIM_EXPANSION
 #                    define NUMBER_OF_UE_MAX 4
 #                    define NUMBER_OF_NR_UE_MAX 4
 #                    define NUMBER_OF_UCI_VARS_MAX 14
 #                    define NUMBER_OF_CONNECTED_eNB_MAX 1
 #                    define NUMBER_OF_CONNECTED_gNB_MAX 1
-#            	 else
-#                    define NUMBER_OF_UE_MAX 256
-#                    define NUMBER_OF_UCI_VARS_MAX 256
-#                    define NUMBER_OF_CONNECTED_eNB_MAX 1
-#                    define NUMBER_OF_CONNECTED_gNB_MAX 3
-#                endif
 #            else
 #                    define NUMBER_OF_UE_MAX 256
 #                    define NUMBER_OF_UCI_VARS_MAX 256
@@ -48,17 +36,10 @@ eNB process will exit because unexpected access happens.
 Now some parts are using NUMBER_OF_UE_MAX
 and the other are using MAX_MOBILES_PER_ENB in for-loop.
 */
-#            ifndef UESIM_EXPANSION
 #                define NUMBER_OF_UE_MAX 16
 #                define NUMBER_OF_UCI_VARS_MAX 56
 #                define NUMBER_OF_CONNECTED_eNB_MAX 3
 #                define NUMBER_OF_CONNECTED_gNB_MAX 3
-#            else
-#                define NUMBER_OF_UE_MAX 256
-#                define NUMBER_OF_UCI_VARS_MAX 256
-#                define NUMBER_OF_CONNECTED_eNB_MAX 1
-#                define NUMBER_OF_CONNECTED_gNB_MAX 3
-#            endif
 #        else
 #                define NUMBER_OF_UE_MAX 256
 #                define NUMBER_OF_UCI_VARS_MAX 256
diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c
index 54a9f4a669e7fb8087d1acca604348d46442aa82..033d683440865af2b667ea464567c31e6e9167aa 100644
--- a/targets/RT/USER/lte-uesoftmodem.c
+++ b/targets/RT/USER/lte-uesoftmodem.c
@@ -95,9 +95,6 @@ pthread_mutex_t nfapi_sync_mutex;
 int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex
 
 
-#ifdef UESIM_EXPANSION
-  uint16_t inst_pdcp_list[NUMBER_OF_UE_MAX];
-#endif
 uint16_t sf_ahead=2;
 int tddflag;
 char *emul_iface;
@@ -546,9 +543,6 @@ void init_pdcp(void) {
 int main( int argc, char **argv ) {
   int CC_id;
   uint8_t  abstraction_flag=0;
-#ifdef UESIM_EXPANSION
-  memset(inst_pdcp_list, 0, sizeof(inst_pdcp_list));
-#endif
   // Default value for the number of UEs. It will hold,
   // if not changed from the command line option --num-ues
   NB_UE_INST=1;