diff --git a/ci-scripts/Jenkinsfile-GitLab-Container b/ci-scripts/Jenkinsfile-GitLab-Container
index a4d7a4bf92869514876c72e470ef93420ed18cfc..f4b99e7f9246928a38d555b585aaab75bd9201d0 100644
--- a/ci-scripts/Jenkinsfile-GitLab-Container
+++ b/ci-scripts/Jenkinsfile-GitLab-Container
@@ -198,6 +198,26 @@ pipeline {
             }
           }
         }
+        stage ("RF Simulators") {
+          when { expression {doMandatoryTests} }
+          steps {
+            script {
+              triggerSlaveJob ('RAN-RF-Sim-Test', 'Test-RF-Sim-Container')
+            }
+          }
+          post {
+            always {
+              script {
+                finalizeSlaveJob('RAN-RF-Sim-Test')
+              }
+            }
+            failure {
+              script {
+                currentBuild.result = 'FAILURE'
+              }
+            }
+          }
+        }
       }
     }
   }
diff --git a/ci-scripts/Jenkinsfile-gitlab b/ci-scripts/Jenkinsfile-gitlab
index 576ae7b05555c86cfd84162e4a0468ea488c6325..6b53230c097981053140ba424a42b600d1e7218e 100644
--- a/ci-scripts/Jenkinsfile-gitlab
+++ b/ci-scripts/Jenkinsfile-gitlab
@@ -384,6 +384,26 @@ pipeline {
                               }
                             }
                         }
+                        stage ("Test 5G RF simulator") {
+                            when {
+                                expression {doMandatoryTests}
+                            }
+                            steps {
+                              lock (vmResource) {
+                                script {
+                                    timeout (time: 40, unit: 'MINUTES') {
+                                        try {
+                                            gitlabCommitStatus(name: "Test 5G RF-sim") {
+                                                sh "./ci-scripts/oai-ci-vm-tool test --workspace $WORKSPACE --variant rf5g-sim --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive"
+                                            }
+                                        } catch (Exception e) {
+                                            currentBuild.result = 'FAILURE'
+                                        }
+                                    }
+                                }
+                              }
+                            }
+                        }
                         stage ("Test L2 simulator") {
                             when {
                                 expression {doFullTestsuite}
diff --git a/ci-scripts/Jenkinsfile-tmp-ran b/ci-scripts/Jenkinsfile-tmp-ran
index 7d5307620f0ad4b8034cc174a86b5fff2544db89..a0d0f13871ac21770dd9f971d6e1c28c989aecd0 100644
--- a/ci-scripts/Jenkinsfile-tmp-ran
+++ b/ci-scripts/Jenkinsfile-tmp-ran
@@ -369,7 +369,7 @@ pipeline {
                              [$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.eNB_Credentials}", usernameVariable: 'eNB_Username', passwordVariable: 'eNB_Password']
                         ]) {
                             echo '\u2705 \u001B[32mLog Collection (eNB - Run)\u001B[0m'
-                            sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath}"
+                            sh "python3 ci-scripts/main.py --mode=LogCollecteNB --eNBIPAddress=${params.eNB_IPAddress} --eNBUserName=${eNB_Username} --eNBPassword=${eNB_Password} --eNBSourceCodePath=${params.eNB_SourceCodePath} --BuildId=${env.BUILD_ID}"
 
                             echo '\u2705 \u001B[32mLog Transfer (eNB - Run)\u001B[0m'
                             sh "sshpass -p \'${eNB_Password}\' scp -o 'StrictHostKeyChecking no' -o 'ConnectTimeout 10' ${eNB_Username}@${params.eNB_IPAddress}:${eNB_SourceCodePath}/cmake_targets/enb.log.zip ./enb.log.${env.BUILD_ID}.zip || true"
diff --git a/ci-scripts/args_parse.py b/ci-scripts/args_parse.py
index 0ed12bfc08a2a1bc23ae6a01ee1192599a576e4f..c0203a4c98abf4ccd1a0c91907d311a0cfcc17bc 100644
--- a/ci-scripts/args_parse.py
+++ b/ci-scripts/args_parse.py
@@ -266,6 +266,9 @@ def ArgsParse(argvs,CiTestObj,RAN,HTML,EPC,ldpc,CONTAINERS,HELP,SCA,PHYSIM):
         elif re.match('^\-\-OCProjectName=(.+)$', myArgv, re.IGNORECASE):
             matchReg = re.match('^\-\-OCProjectName=(.+)$', myArgv, re.IGNORECASE)
             PHYSIM.OCProjectName = matchReg.group(1)
+        elif re.match('^\-\-BuildId=(.+)$', myArgv, re.IGNORECASE):
+            matchReg = re.match('^\-\-BuildId=(.+)$', myArgv, re.IGNORECASE)
+            RAN.BuildId = matchReg.group(1)
         else:
             HELP.GenericHelp(CONST.Version)
             sys.exit('Invalid Parameter: ' + myArgv)
diff --git a/ci-scripts/ci_ueinfra.yaml b/ci-scripts/ci_ueinfra.yaml
index 67331fdfb27cca122cfccb39bd53ca5194fbc4f9..619e8fba15bfeaae26831327696a9ff600d1d73c 100644
--- a/ci-scripts/ci_ueinfra.yaml
+++ b/ci-scripts/ci_ueinfra.yaml
@@ -7,12 +7,29 @@ idefix:
     Cmd : /home/oaicicd/quectel-CM/quectel-CM -s oai.ipv4 -4
   WakeupScript : ci_ctl_qtel.py /dev/ttyUSB2 wup
   DetachScript : ci_ctl_qtel.py /dev/ttyUSB2 detach
+  LogStore : /media/usb-drive/ci_qlogs
   PLMN : 22201
   UENetwork : wwan0 
   HostIPAddress : 192.168.18.188
   HostUsername : oaicicd
   HostPassword : oaicicd
   HostSourceCodePath : none
+nrmodule2_quectel:
+  ID: nrmodule2_quectel
+  State : enabled
+  Kind : quectel
+  Process :
+    Name : quectel-CM
+    Cmd : /home/nrmodule2/quectel-CM/quectel-CM -s oai.ipv4 -4
+  WakeupScript : ci_ctl_qtel.py /dev/ttyUSB7 wup
+  DetachScript : ci_ctl_qtel.py /dev/ttyUSB7 detach
+  LogStore : /media/ci_qlogs  
+  PLMN : 20899 
+  UENetwork : wwan1
+  HostIPAddress : 192.168.18.189
+  HostUsername : nrmodule2 
+  HostPassword : linux 
+  HostSourceCodePath : none
 dummy:
   ID: ''
   State : ''
diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py
index f32e8b38646196b406836b45d2602190f639037b..3e65f83e063a7f5385771290437ce6d3fd9f6d73 100644
--- a/ci-scripts/cls_containerize.py
+++ b/ci-scripts/cls_containerize.py
@@ -36,6 +36,7 @@ import re               # reg
 import logging
 import os
 import shutil
+import subprocess
 import time
 from multiprocessing import Process, Lock, SimpleQueue
 from zipfile import ZipFile
@@ -76,6 +77,9 @@ class Containerize():
 		self.eNB_instance = 0
 		self.eNB_serverId = ['', '', '']
 		self.yamlPath = ['', '', '']
+		self.services = ['', '', '']
+		self.nb_healthy = [0, 0, 0]
+		self.exitStatus = 0
 		self.eNB_logFile = ['', '', '']
 
 		self.testCase_id = ''
@@ -89,6 +93,14 @@ class Containerize():
 		self.allImagesSize = {}
 		self.collectInfo = {}
 
+		self.pingContName = ''
+		self.pingOptions = ''
+		self.pingLossThreshold = ''
+		self.svrContName = ''
+		self.svrOptions = ''
+		self.cliContName = ''
+		self.cliOptions = ''
+
 #-----------------------------------------------------------
 # Container management functions
 #-----------------------------------------------------------
@@ -476,7 +488,6 @@ class Containerize():
 			HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK)
 
 	def UndeployObject(self, HTML, RAN):
-		logging.info('\u001B[1m Undeploying OAI Object Pass\u001B[0m')
 		if self.eNB_serverId[self.eNB_instance] == '0':
 			lIpAddr = self.eNBIPAddress
 			lUserName = self.eNBUserName
@@ -529,4 +540,295 @@ class Containerize():
 				HTML.CreateHtmlTestRow(RAN.runtime_stats, 'KO', logStatus)
 			else:
 				HTML.CreateHtmlTestRow(RAN.runtime_stats, 'OK', CONST.ALL_PROCESSES_OK)
+		logging.info('\u001B[1m Undeploying OAI Object Pass\u001B[0m')
+
+	def DeployGenObject(self, HTML):
+		self.exitStatus = 0
+		logging.info('\u001B[1m Checking Services to deploy\u001B[0m')
+		cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose config --services'
+		logging.debug(cmd)
+		try:
+			listServices = subprocess.check_output(cmd, shell=True, universal_newlines=True)
+		except Exception as e:
+			self.exitStatus = 1
+			HTML.CreateHtmlTestRow('SVC not Found', 'KO', CONST.ALL_PROCESSES_OK)
+			return
+		for reqSvc in self.services[0].split(' '):
+			res = re.search(reqSvc, listServices)
+			if res is None:
+				logging.error(reqSvc + ' not found in specified docker-compose')
+				self.exitStatus = 1
+		if (self.exitStatus == 1):
+			HTML.CreateHtmlTestRow('SVC not Found', 'KO', CONST.ALL_PROCESSES_OK)
+			return
+
+		if (self.ranAllowMerge):
+			cmd = 'cd ' + self.yamlPath[0] + ' && sed -e "s@develop@ci-temp@" docker-compose.y*ml > docker-compose-ci.yml'
+		else:
+			cmd = 'cd ' + self.yamlPath[0] + ' && sed -e "s@develop@develop@" docker-compose.y*ml > docker-compose-ci.yml'
+		logging.debug(cmd)
+		subprocess.run(cmd, shell=True)
+
+		cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml up -d ' + self.services[0]
+		logging.debug(cmd)
+		try:
+			deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=30)
+		except Exception as e:
+			self.exitStatus = 1
+			logging.error('Could not deploy')
+			HTML.CreateHtmlTestRow('Could not deploy', 'KO', CONST.ALL_PROCESSES_OK)
+			return
+
+		logging.info('\u001B[1m Checking if all deployed healthy\u001B[0m')
+		cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml ps -a'
+		count = 0
+		healthy = 0
+		while (count < 10):
+			count += 1
+			deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
+			healthy = 0
+			for state in deployStatus.split('\n'):
+				res = re.search('Up \(healthy\)', state)
+				if res is not None:
+					healthy += 1
+			if healthy == self.nb_healthy[0]:
+				count = 100
+			else:
+				time.sleep(10)
+
+		if count == 100 and healthy == self.nb_healthy[0]:
+			HTML.CreateHtmlTestRow('n/a', 'OK', CONST.ALL_PROCESSES_OK)
+			logging.info('\u001B[1m Deploying OAI Object(s) PASS\u001B[0m')
+		else:
+			self.exitStatus = 1
+			HTML.CreateHtmlTestRow('Could not deploy in time', 'KO', CONST.ALL_PROCESSES_OK)
+			logging.error('\u001B[1m Deploying OAI Object(s) FAILED\u001B[0m')
+
+	def UndeployGenObject(self, HTML):
+		self.exitStatus = 0
+
+		if (self.ranAllowMerge):
+			cmd = 'cd ' + self.yamlPath[0] + ' && sed -e "s@develop@ci-temp@" docker-compose.y*ml > docker-compose-ci.yml'
+		else:
+			cmd = 'cd ' + self.yamlPath[0] + ' && sed -e "s@develop@develop@" docker-compose.y*ml > docker-compose-ci.yml'
+		logging.debug(cmd)
+		subprocess.run(cmd, shell=True)
+
+		# if the containers are running, recover the logs!
+		cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml ps --all'
+		logging.debug(cmd)
+		deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
+		anyLogs = False
+		for state in deployStatus.split('\n'):
+			res = re.search('Name|----------', state)
+			if res is not None:
+				continue
+			if len(state) == 0:
+				continue
+			res = re.search('^(?P<container_name>[a-zA-Z0-9\-\_]+) ', state)
+			if res is not None:
+				anyLogs = True
+				cName = res.group('container_name')
+				cmd = 'cd ' + self.yamlPath[0] + ' && docker logs ' + cName + ' > ' + cName + '.log 2>&1'
+				logging.debug(cmd)
+				deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
+		if anyLogs:
+			cmd = 'mkdir -p ../cmake_targets/log && mv ' + self.yamlPath[0] + '/*.log ../cmake_targets/log'
+			logging.debug(cmd)
+			deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
+
+		cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml down'
+		logging.debug(cmd)
+		try:
+			deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=100)
+		except Exception as e:
+			self.exitStatus = 1
+			logging.error('Could not undeploy')
+			HTML.CreateHtmlTestRow('Could not undeploy', 'KO', CONST.ALL_PROCESSES_OK)
+			logging.error('\u001B[1m Undeploying OAI Object(s) FAILED\u001B[0m')
+			return
+
+		HTML.CreateHtmlTestRow('n/a', 'OK', CONST.ALL_PROCESSES_OK)
+		logging.info('\u001B[1m Undeploying OAI Object(s) PASS\u001B[0m')
+
+	def PingFromContainer(self, HTML):
+		self.exitStatus = 0
+		cmd = 'mkdir -p ../cmake_targets/log'
+		deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
+
+		cmd = 'docker exec ' + self.pingContName + ' /bin/bash -c "ping ' + self.pingOptions + '" 2>&1 | tee ../cmake_targets/log/ping_' + HTML.testCase_id + '.log'
+		logging.debug(cmd)
+		deployStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=100)
+
+		result = re.search(', (?P<packetloss>[0-9\.]+)% packet loss, time [0-9\.]+ms', deployStatus)
+		if result is None:
+			self.PingExit(HTML, False, 'Packet Loss Not Found')
+			return
+
+		packetloss = result.group('packetloss')
+		if float(packetloss) == 100:
+			self.PingExit(HTML, False, 'Packet Loss is 100%')
+			return
+
+		result = re.search('rtt min\/avg\/max\/mdev = (?P<rtt_min>[0-9\.]+)\/(?P<rtt_avg>[0-9\.]+)\/(?P<rtt_max>[0-9\.]+)\/[0-9\.]+ ms', deployStatus)
+		if result is None:
+			self.PingExit(HTML, False, 'Ping RTT_Min RTT_Avg RTT_Max Not Found!')
+			return
 
+		rtt_min = result.group('rtt_min')
+		rtt_avg = result.group('rtt_avg')
+		rtt_max = result.group('rtt_max')
+		pal_msg = 'Packet Loss : ' + packetloss + '%'
+		min_msg = 'RTT(Min)    : ' + rtt_min + ' ms'
+		avg_msg = 'RTT(Avg)    : ' + rtt_avg + ' ms'
+		max_msg = 'RTT(Max)    : ' + rtt_max + ' ms'
+
+		message = 'ping result\n'
+		message += '    ' + pal_msg + '\n'
+		message += '    ' + min_msg + '\n'
+		message += '    ' + avg_msg + '\n'
+		message += '    ' + max_msg + '\n'
+		packetLossOK = True
+		if float(packetloss) > float(self.pingLossThreshold):
+			message += '\nPacket Loss too high'
+			packetLossOK = False
+		elif float(packetloss) > 0:
+			message += '\nPacket Loss is not 0%'
+		self.PingExit(HTML, packetLossOK, message)
+
+		if packetLossOK:
+			logging.debug('\u001B[1;37;44m ping result \u001B[0m')
+			logging.debug('\u001B[1;34m    ' + pal_msg + '\u001B[0m')
+			logging.debug('\u001B[1;34m    ' + min_msg + '\u001B[0m')
+			logging.debug('\u001B[1;34m    ' + avg_msg + '\u001B[0m')
+			logging.debug('\u001B[1;34m    ' + max_msg + '\u001B[0m')
+			logging.info('\u001B[1m Ping Test PASS\u001B[0m')
+
+	def PingExit(self, HTML, status, message):
+		html_queue = SimpleQueue()
+		html_cell = '<pre style="background-color:white">UE\n' + message + '</pre>'
+		html_queue.put(html_cell)
+		if status:
+			HTML.CreateHtmlTestRowQueue(self.pingOptions, 'OK', 1, html_queue)
+		else:
+			self.exitStatus = 1
+			logging.error('\u001B[1;37;41m ' + message + ' \u001B[0m')
+			HTML.CreateHtmlTestRowQueue(self.pingOptions, 'KO', 1, html_queue)
+
+	def IperfFromContainer(self, HTML):
+		self.exitStatus = 0
+
+		cmd = 'mkdir -p ../cmake_targets/log'
+		logStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
+
+		# Start the server process
+		cmd = 'docker exec -d ' + self.svrContName + ' /bin/bash -c "nohup iperf ' + self.svrOptions + ' > /tmp/iperf_server.log 2>&1"'
+		logging.debug(cmd)
+		serverStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
+		time.sleep(5)
+
+		# Start the client process
+		cmd = 'docker exec ' + self.cliContName + ' /bin/bash -c "iperf ' + self.cliOptions + '" 2>&1 | tee ../cmake_targets/log/iperf_client_' + HTML.testCase_id + '.log'
+		logging.debug(cmd)
+		clientStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=100)
+
+		# Stop the server process
+		cmd = 'docker exec ' + self.svrContName + ' /bin/bash -c "pkill iperf"'
+		logging.debug(cmd)
+		serverStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
+		time.sleep(5)
+		cmd = 'docker cp ' + self.svrContName + ':/tmp/iperf_server.log ../cmake_targets/log/iperf_server_' + HTML.testCase_id + '.log'
+		logging.debug(cmd)
+		serverStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=10)
+
+		# Analyze client output
+		result = re.search('Server Report:', clientStatus)
+		if result is None:
+			result = re.search('read failed: Connection refused', clientStatus)
+			if result is not None:
+				message = 'Could not connect to iperf server!'
+			else:
+				message = 'Server Report and Connection refused Not Found!'
+			self.IperfExit(HTML, False, message)
+			return
+
+		# Computing the requested bandwidth in float
+		result = re.search('-b (?P<iperf_bandwidth>[0-9\.]+)[KMG]', self.cliOptions)
+		if result is not None:
+			req_bandwidth = result.group('iperf_bandwidth')
+			req_bw = float(req_bandwidth)
+			result = re.search('-b [0-9\.]+K', self.cliOptions)
+			if result is not None:
+				req_bandwidth = '%.1f Kbits/sec' % req_bw
+				req_bw = req_bw * 1000
+			result = re.search('-b [0-9\.]+M', self.cliOptions)
+			if result is not None:
+				req_bandwidth = '%.1f Mbits/sec' % req_bw
+				req_bw = req_bw * 1000000
+
+		reportLine = None
+		reportLineFound = False
+		for iLine in clientStatus.split('\n'):
+			if reportLineFound:
+				reportLine = iLine
+				reportLineFound = False
+			res = re.search('Server Report:', iLine)
+			if res is not None:
+				reportLineFound = True
+		result = None
+		if reportLine is not None:
+			result = re.search('(?:|\[ *\d+\].*) (?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?P<jitter>[0-9\.]+ ms) +(\d+\/ ..\d+) +(\((?P<packetloss>[0-9\.]+)%\))', reportLine)
+		iperfStatus = True
+		if result is not None:
+			bitrate = result.group('bitrate')
+			packetloss = result.group('packetloss')
+			jitter = result.group('jitter')
+			logging.debug('\u001B[1;37;44m iperf result \u001B[0m')
+			iperfStatus = True
+			msg = 'Req Bitrate : ' + req_bandwidth + '\n'
+			logging.debug('\u001B[1;34m    Req Bitrate : ' + req_bandwidth + '\u001B[0m')
+			if bitrate is not None:
+				msg += 'Bitrate     : ' + bitrate + '\n'
+				logging.debug('\u001B[1;34m    Bitrate     : ' + bitrate + '\u001B[0m')
+				result = re.search('(?P<real_bw>[0-9\.]+) [KMG]bits/sec', str(bitrate))
+				if result is not None:
+					actual_bw = float(str(result.group('real_bw')))
+					result = re.search('[0-9\.]+ K', bitrate)
+					if result is not None:
+						actual_bw = actual_bw * 1000
+					result = re.search('[0-9\.]+ M', bitrate)
+					if result is not None:
+						actual_bw = actual_bw * 1000000
+					br_loss = 100 * actual_bw / req_bw
+					if br_loss < 90:
+						iperfStatus = False
+					bitperf = '%.2f ' % br_loss
+					msg += 'Bitrate Perf: ' + bitperf + '%\n'
+					logging.debug('\u001B[1;34m    Bitrate Perf: ' + bitperf + '%\u001B[0m')
+			if packetloss is not None:
+				msg += 'Packet Loss : ' + packetloss + '%\n'
+				logging.debug('\u001B[1;34m    Packet Loss : ' + packetloss + '%\u001B[0m')
+				if float(packetloss) > float(5):
+					msg += 'Packet Loss too high!\n'
+					logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m')
+					iperfStatus = False
+			if jitter is not None:
+				msg += 'Jitter      : ' + jitter + '\n'
+				logging.debug('\u001B[1;34m    Jitter      : ' + jitter + '\u001B[0m')
+			self.IperfExit(HTML, iperfStatus, msg)
+		else:
+			iperfStatus = False
+			logging.error('problem?')
+			self.IperfExit(HTML, iperfStatus, 'problem?')
+		if iperfStatus:
+			logging.info('\u001B[1m Iperf Test PASS\u001B[0m')
+
+	def IperfExit(self, HTML, status, message):
+		html_queue = SimpleQueue()
+		html_cell = '<pre style="background-color:white">UE\n' + message + '</pre>'
+		html_queue.put(html_cell)
+		if status:
+			HTML.CreateHtmlTestRowQueue(self.cliOptions, 'OK', 1, html_queue)
+		else:
+			self.exitStatus = 1
+			HTML.CreateHtmlTestRowQueue(self.cliOptions, 'KO', 1, html_queue)
diff --git a/ci-scripts/cls_log_mgt.py b/ci-scripts/cls_log_mgt.py
index 36e7d51a4ba482710030d96623fd941db04b23fa..7fb45ed3ea0f83bdb648c1b5dfe726793f03cca8 100644
--- a/ci-scripts/cls_log_mgt.py
+++ b/ci-scripts/cls_log_mgt.py
@@ -25,7 +25,7 @@
 #---------------------------------------------------------------------
 
 #USAGE: 
-#	log=Log_Mgt(IPAddress,Password,Path)
+#	log=Log_Mgt(Username,IPAddress,Password,Path)
 #	log.LogRotation()
 
 
@@ -38,7 +38,8 @@ import math
 
 class Log_Mgt:
 
-	def __init__(self,IPAddress,Password,Path):
+	def __init__(self,Username, IPAddress,Password,Path):
+		self.Username=Username
 		self.IPAddress=IPAddress
 		self.Password=Password
 		self.path=Path
@@ -49,7 +50,7 @@ class Log_Mgt:
 
 
 	def __CheckAvailSpace(self):
-		HOST=self.IPAddress
+		HOST=self.Username+'@'+self.IPAddress
 		COMMAND="df "+ self.path
 		ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
 		result = ssh.stdout.readlines()
@@ -58,7 +59,7 @@ class Log_Mgt:
 		return tmp[3] #return avail space from the line
 
 	def __GetOldestFile(self):
-		HOST=self.IPAddress
+		HOST=self.Username+'@'+self.IPAddress
 		COMMAND="ls -rtl "+ self.path #-rtl will bring oldest file on top
 		ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
 		result = ssh.stdout.readlines()
@@ -68,16 +69,19 @@ class Log_Mgt:
 
 
 	def __AvgSize(self):
-		HOST=self.IPAddress
+		HOST=self.Username+'@'+self.IPAddress
 		COMMAND="ls -rtl "+ self.path
 		ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
 		result = ssh.stdout.readlines()
-		total_size=0
-		for i in range(1,len(result)):
-			s=result[i].decode('utf-8').rstrip()
-			tmp=s.split()
-			total_size+=int(tmp[4]) #get filesize
-		return math.floor(total_size/(len(result)-1)) #compute average file/artifact size
+		if len(result)>1: #at least 1 file present
+			total_size=0
+			for i in range(1,len(result)):
+				s=result[i].decode('utf-8').rstrip()
+				tmp=s.split()
+				total_size+=int(tmp[4]) #get filesize
+			return math.floor(total_size/(len(result)-1)) #compute average file/artifact size
+		else:#empty,no files
+			return 0
 
 
 #-----------------$
@@ -91,7 +95,7 @@ class Log_Mgt:
 		logging.debug("Avail Space : " + str(avail_space) + " / Artifact Avg Size : " + str(avg_size))
 		if avail_space < 2*avg_size: #reserved space is 2x artifact file ; oldest file will be deleted
 			oldestfile=self.__GetOldestFile()
-			HOST=self.IPAddress
+			HOST=self.Username+'@'+self.IPAddress
 			COMMAND="echo " + self.Password + " | sudo -S rm "+ self.path + "/" + oldestfile
 			logging.debug(COMMAND)
 			ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
diff --git a/ci-scripts/cls_module_ue.py b/ci-scripts/cls_module_ue.py
index 75b628fd1f4333086970d4e4b8cc0c10281b27ba..96d4e0310ef99bae7be74ca607be4cd91f008554 100644
--- a/ci-scripts/cls_module_ue.py
+++ b/ci-scripts/cls_module_ue.py
@@ -62,7 +62,7 @@ class Module_UE:
 	#this method checks if the specified Process is running on the server hosting the module
 	#if not it will be started
 	def CheckCMProcess(self):
-		HOST=self.HostIPAddress
+		HOST=self.HostUsername+'@'+self.HostIPAddress
 		COMMAND="ps aux | grep " + self.Process['Name'] + " | grep -v grep "
 		logging.debug(COMMAND)
 		ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
@@ -80,7 +80,7 @@ class Module_UE:
 			mySSH.close()
 			#checking the process
 			time.sleep(5)
-			HOST=self.HostIPAddress
+			HOST=self.HostUsername+'@'+self.HostIPAddress
 			COMMAND="ps aux | grep " + self.Process['Name'] + " | grep -v grep "
 			logging.debug(COMMAND)
 			ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
@@ -104,7 +104,7 @@ class Module_UE:
 
 	#this method retrieves the Module IP address (not the Host IP address) 
 	def GetModuleIPAddress(self):
-		HOST=self.HostIPAddress
+		HOST=self.HostUsername+'@'+self.HostIPAddress
 		response= []
 		tentative = 3 
 		while (len(response)==0) and (tentative>0):
@@ -163,12 +163,12 @@ class Module_UE:
 			now=datetime.now()
 			now_string = now.strftime("%Y%m%d-%H%M")
 			source='ci_qlog'
-			destination='/media/usb-drive/ci_qlogs/ci_qlog_'+now_string+'.zip'
+			destination= self.LogStore + '/ci_qlog_'+now_string+'.zip'
 			#qlog artifact is zipped into the target folder
 			mySSH.command('echo $USER; echo ' + self.HostPassword + ' | nohup sudo -S zip -r '+destination+' '+source+' &','\$', 10)
 			mySSH.close()
 			#post action : log cleaning to make sure enough space is reserved for the next run
-			Log_Mgt=cls_log_mgt.Log_Mgt(self.HostIPAddress, self.HostPassword, "/media/usb-drive/ci_qlogs")
+			Log_Mgt=cls_log_mgt.Log_Mgt(self.HostUsername,self.HostIPAddress, self.HostPassword, self.LogStore)
 			Log_Mgt.LogRotation()
 		else:
 			destination=""
diff --git a/ci-scripts/cls_oaicitest.py b/ci-scripts/cls_oaicitest.py
index 73141aa9b7a6878c30f1857331a3b2d93191a3d2..f1ab8c106fbc51a0c8d33ffec48eb0bcdf3c44ab 100644
--- a/ci-scripts/cls_oaicitest.py
+++ b/ci-scripts/cls_oaicitest.py
@@ -1536,8 +1536,13 @@ class OaiCiTest():
 					SSH.command('cat ' + EPC.SourceCodePath + '/scripts/ping_' + self.testCase_id + '_' + device_id + '.log', '\$', 5)
 				else: #launch from Module
 					SSH.open(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword)
+					#target address is different depending on EPC type
+					if re.match('OAI-Rel14-Docker', EPC.Type, re.IGNORECASE):
+						Target = EPC.MmeIPAddress
+					else:
+						Target = EPC.IPAddress
 					#ping from module NIC rather than IP address to make sure round trip is over the air	
-					cmd = 'ping -I ' + Module_UE.UENetwork  + ' ' + self.ping_args + ' ' +  EPC.IPAddress  + ' 2>&1 > ping_' + self.testCase_id + '_' + self.ue_id + '.log' 
+					cmd = 'ping -I ' + Module_UE.UENetwork  + ' ' + self.ping_args + ' ' +  Target  + ' 2>&1 > ping_' + self.testCase_id + '_' + self.ue_id + '.log' 
 					SSH.command(cmd,'\$',int(ping_time[0])*1.5)
 					#copy the ping log file to have it locally for analysis (ping stats)
 					SSH.copyin(Module_UE.HostIPAddress, Module_UE.HostUsername, Module_UE.HostPassword, 'ping_' + self.testCase_id + '_' + self.ue_id + '.log', '.')
@@ -2000,6 +2005,7 @@ class OaiCiTest():
 					curr_br = curr_br * 1000 * 1000
 				br_sum = curr_br + br_sum
 				ji_sum = float(ji[0]) + ji_sum
+
 		if (row_idx > 0):
 			br_sum = br_sum / row_idx
 			ji_sum = ji_sum / row_idx
@@ -2020,10 +2026,12 @@ class OaiCiTest():
 				pl = float(100 * pl_sum / ps_sum)
 				packetloss = '%2.1f ' % (pl)
 				packetloss += '%'
-			else:
-				packetloss = 'unknown'
+				if float(pl) > float(self.iperf_packetloss_threshold):
+					pal_too_high_msg = 'Packet Loss too high :  actual = '+packetloss+', target = '+self.iperf_packetloss_threshold+'%\n'
+				else:
+					pal_too_high_msg=''			
 			lock.acquire()
-			if (br_loss < 90):
+			if (br_loss < 90) or (float(pl) > float(self.iperf_packetloss_threshold)):
 				statusQueue.put(1)
 			else:
 				statusQueue.put(0)
@@ -2034,13 +2042,14 @@ class OaiCiTest():
 			brl_msg = 'Bitrate Perf: ' + bitperf
 			jit_msg = 'Jitter      : ' + jitter
 			pal_msg = 'Packet Loss : ' + packetloss
-			statusQueue.put(req_msg + '\n' + bir_msg + '\n' + brl_msg + '\n' + jit_msg + '\n' + pal_msg + '\n')
+			statusQueue.put(req_msg + '\n' + bir_msg + '\n' + brl_msg + '\n' + jit_msg + '\n' + pal_msg + '\n' + pal_too_high_msg + '\n')
 			logging.debug('\u001B[1;37;45m iperf result (' + UE_IPAddress + ') \u001B[0m')
 			logging.debug('\u001B[1;35m    ' + req_msg + '\u001B[0m')
 			logging.debug('\u001B[1;35m    ' + bir_msg + '\u001B[0m')
 			logging.debug('\u001B[1;35m    ' + brl_msg + '\u001B[0m')
 			logging.debug('\u001B[1;35m    ' + jit_msg + '\u001B[0m')
 			logging.debug('\u001B[1;35m    ' + pal_msg + '\u001B[0m')
+			logging.debug('\u001B[1;35m    ' + pal_too_high_msg + '\u001B[0m')
 			lock.release()
 		else:
 			self.ping_iperf_wrong_exit(lock, UE_IPAddress, device_id, statusQueue, 'Could not analyze from server log')
@@ -2700,7 +2709,7 @@ class OaiCiTest():
 
 		if (status_queue.empty()):
 			HTML.CreateHtmlTestRow(self.iperf_args, 'KO', CONST.ALL_PROCESSES_OK)
-			self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfaUE)
+			self.AutoTerminateUEandeNB(HTML,RAN,COTS_UE,EPC,InfraUE)
 		else:
 			iperf_status = True
 			iperf_noperf = False
diff --git a/ci-scripts/cls_physim1.py b/ci-scripts/cls_physim1.py
index 1c8252683113a8a971acc3e2f7bddcb540cf60c3..131aa01c4c90babbf9af457c6dabd443843d4326 100644
--- a/ci-scripts/cls_physim1.py
+++ b/ci-scripts/cls_physim1.py
@@ -245,7 +245,7 @@ class PhySim:
 		isFinished = False
 		# doing a deep copy!
 		tmpPodNames = podNames.copy()
-		while(count < 28 and isFinished == False):
+		while(count < 32 and isFinished == False):
 			time.sleep(60)
 			for podName in tmpPodNames:
 				mySSH.command2(f'oc logs --tail=1 {podName} 2>&1', 6, silent=True)
@@ -257,6 +257,8 @@ class PhySim:
 			count += 1
 		if isFinished:
 			logging.debug('\u001B[1m PhySim test is Complete\u001B[0m')
+		else:
+			logging.error('\u001B[1m PhySim test Timed-out!\u001B[0m')
 
 		# Getting the logs of each executables running in individual pods
 		for podName in podNames:
@@ -279,15 +281,18 @@ class PhySim:
 		mySSH.command('oc logout', '\$', 6)
 		mySSH.close()
 		self.AnalyzeLogFile_phySim(HTML)
-		if self.testStatus:
+		if self.testStatus and isFinished:
 			HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK)
 			HTML.CreateHtmlTestRowPhySimTestResult(self.testSummary,self.testResult)
 			logging.info('\u001B[1m Physical Simulator Pass\u001B[0m')
 		else:
 			RAN.prematureExit = True
-			HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK)
+			if isFinished:
+				HTML.CreateHtmlTestRow('N/A', 'KO', CONST.ALL_PROCESSES_OK)
+			else:
+				HTML.CreateHtmlTestRow('Some test(s) timed-out!', 'KO', CONST.ALL_PROCESSES_OK)
 			HTML.CreateHtmlTestRowPhySimTestResult(self.testSummary,self.testResult)
-			logging.info('\u001B[1m Physical Simulator Fail\u001B[0m')
+			logging.error('\u001B[1m Physical Simulator Fail\u001B[0m')
 
 	def AnalyzeLogFile_phySim(self, HTML):
 		lIpAddr = self.eNBIPAddress
diff --git a/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf b/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf
new file mode 100644
index 0000000000000000000000000000000000000000..db0802fdd7fcac457580b53bb54c8b02cad0b113
--- /dev/null
+++ b/ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf
@@ -0,0 +1,280 @@
+Active_eNBs = ( "eNB-Eurecom-B38");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+eNBs =
+(
+ {
+    ////////// Identification parameters:
+    eNB_ID    =  0xe00;
+
+    cell_type =  "CELL_MACRO_ENB";
+
+    eNB_name  =  "eNB-Eurecom-B38";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code = 1;
+    plmn_list = ( { mcc = 208; mnc = 99; mnc_length = 2; } );
+
+    tr_s_preference     = "local_mac"
+
+    ////////// Physical parameters:
+
+    component_carriers = (
+      {
+      node_function             = "3GPP_eNODEB";
+      node_timing               = "synch_to_ext_device";
+      node_synch_ref            = 0;
+      frame_type					      = "TDD";
+      tdd_config 					      = 1;
+      tdd_config_s            			      = 0;
+      prefix_type             			      = "NORMAL";
+      eutra_band              			      = 38;
+      downlink_frequency      			      = 2605000000L;
+      uplink_frequency_offset 			      = 0;
+      Nid_cell					      = 0;
+      N_RB_DL                 			      = 100;
+      Nid_cell_mbsfn          			      = 0;
+      nb_antenna_ports                                = 1;
+      nb_antennas_tx          			      = 2;
+      nb_antennas_rx          			      = 2;
+      tx_gain                                            = 90;
+      rx_gain                                            = 125;
+      pbch_repetition                                 = "FALSE";
+      prach_root              			      = 0;
+      prach_config_index      			      = 0;
+      prach_high_speed        			      = "DISABLE";
+      prach_zero_correlation  			      = 1;
+      prach_freq_offset       			      = 2;
+      pucch_delta_shift       			      = 1;
+      pucch_nRB_CQI           			      = 0;
+      pucch_nCS_AN            			      = 0;
+      pucch_n1_AN             			      = 0;
+      pdsch_referenceSignalPower 			      = -29;
+      pdsch_p_b                  			      = 0;
+      pusch_n_SB                 			      = 1;
+      pusch_enable64QAM          			      = "DISABLE";
+      pusch_hoppingMode                                  = "interSubFrame";
+      pusch_hoppingOffset                                = 0;
+      pusch_groupHoppingEnabled  			      = "ENABLE";
+      pusch_groupAssignment      			      = 0;
+      pusch_sequenceHoppingEnabled		   	      = "DISABLE";
+      pusch_nDMRS1                                       = 1;
+      phich_duration                                     = "NORMAL";
+      phich_resource                                     = "ONESIXTH";
+      srs_enable                                         = "DISABLE";
+      /*  srs_BandwidthConfig                                =;
+      srs_SubframeConfig                                 =;
+      srs_ackNackST                                      =;
+      srs_MaxUpPts                                       =;*/
+
+      pusch_p0_Nominal                                   = -96;
+      pusch_alpha                                        = "AL1";
+      pucch_p0_Nominal                                   = -104;
+      msg3_delta_Preamble                                = 6;
+      pucch_deltaF_Format1                               = "deltaF2";
+      pucch_deltaF_Format1b                              = "deltaF3";
+      pucch_deltaF_Format2                               = "deltaF0";
+      pucch_deltaF_Format2a                              = "deltaF0";
+      pucch_deltaF_Format2b		    	      = "deltaF0";
+
+      rach_numberOfRA_Preambles                          = 64;
+      rach_preamblesGroupAConfig                         = "DISABLE";
+      /*
+      rach_sizeOfRA_PreamblesGroupA                      = ;
+      rach_messageSizeGroupA                             = ;
+      rach_messagePowerOffsetGroupB                      = ;
+      */
+      rach_powerRampingStep                              = 4;
+      rach_preambleInitialReceivedTargetPower            = -108;
+      rach_preambleTransMax                              = 10;
+      rach_raResponseWindowSize                          = 10;
+      rach_macContentionResolutionTimer                  = 48;
+      rach_maxHARQ_Msg3Tx                                = 4;
+
+      pcch_default_PagingCycle                           = 128;
+      pcch_nB                                            = "oneT";
+      bcch_modificationPeriodCoeff			      = 2;
+      ue_TimersAndConstants_t300			      = 1000;
+      ue_TimersAndConstants_t301			      = 1000;
+      ue_TimersAndConstants_t310			      = 1000;
+      ue_TimersAndConstants_t311			      = 10000;
+      ue_TimersAndConstants_n310			      = 20;
+      ue_TimersAndConstants_n311			      = 1;
+      ue_TransmissionMode                                    = 1;
+
+      //Parameters for SIB18
+      rxPool_sc_CP_Len                                       = "normal";
+      rxPool_sc_Period                                       = "sf40";
+      rxPool_data_CP_Len                                     = "normal";
+      rxPool_ResourceConfig_prb_Num                          = 20;
+      rxPool_ResourceConfig_prb_Start                        = 5;
+      rxPool_ResourceConfig_prb_End                          = 44;
+      rxPool_ResourceConfig_offsetIndicator_present          = "prSmall";
+      rxPool_ResourceConfig_offsetIndicator_choice           = 0;
+      rxPool_ResourceConfig_subframeBitmap_present           = "prBs40";
+      rxPool_ResourceConfig_subframeBitmap_choice_bs_buf              = "00000000000000000000";
+      rxPool_ResourceConfig_subframeBitmap_choice_bs_size             = 5;
+      rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused      = 0;
+/*    rxPool_dataHoppingConfig_hoppingParameter                       = 0;
+      rxPool_dataHoppingConfig_numSubbands                            = "ns1";
+      rxPool_dataHoppingConfig_rbOffset                               = 0;
+      rxPool_commTxResourceUC-ReqAllowed                              = "TRUE";
+*/
+      // Parameters for SIB19
+      discRxPool_cp_Len                                               = "normal"
+      discRxPool_discPeriod                                           = "rf32"
+      discRxPool_numRetx                                              = 1;
+      discRxPool_numRepetition                                        = 2;
+      discRxPool_ResourceConfig_prb_Num                               = 5;
+      discRxPool_ResourceConfig_prb_Start                             = 3;
+      discRxPool_ResourceConfig_prb_End                               = 21;
+      discRxPool_ResourceConfig_offsetIndicator_present               = "prSmall";
+      discRxPool_ResourceConfig_offsetIndicator_choice                = 0;
+      discRxPool_ResourceConfig_subframeBitmap_present                = "prBs40";
+      discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf          = "f0ffffffff";
+      discRxPool_ResourceConfig_subframeBitmap_choice_bs_size         = 5;
+      discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused  = 0;
+
+      }
+    );
+
+
+    srb1_parameters :
+    {
+        # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
+        timer_poll_retransmit    = 80;
+
+        # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
+        timer_reordering         = 35;
+
+        # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
+        timer_status_prohibit    = 0;
+
+        # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
+        poll_pdu                 =  4;
+
+        # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
+        poll_byte                =  99999;
+
+        # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
+        max_retx_threshold       =  4;
+    }
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// MME parameters:
+    mme_ip_address      = ( { ipv4       = "CI_MME_IP_ADDR";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+    enable_measurement_reports = "no";
+
+    ///X2
+    enable_x2 = "yes";
+    t_reloc_prep      = 1000;      /* unit: millisecond */
+    tx2_reloc_overall = 2000;      /* unit: millisecond */
+    t_dc_prep         = 1000;      /* unit: millisecond */
+    t_dc_overall      = 2000;      /* unit: millisecond */
+
+    NETWORK_INTERFACES :
+    {
+        ENB_INTERFACE_NAME_FOR_S1_MME            = "eno1";
+        ENB_IPV4_ADDRESS_FOR_S1_MME              = "CI_ENB_IP_ADDR";
+        ENB_INTERFACE_NAME_FOR_S1U               = "eno1";
+        ENB_IPV4_ADDRESS_FOR_S1U                 = "CI_ENB_IP_ADDR";
+        ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
+        ENB_IPV4_ADDRESS_FOR_X2C                 = "CI_ENB_IP_ADDR";
+        ENB_PORT_FOR_X2C                         = 36422; # Spec 36422
+    };
+  }
+);
+
+MACRLCs = (
+	{
+	num_cc = 1;
+	tr_s_preference = "local_L1";
+	tr_n_preference = "local_RRC";
+	phy_test_mode = 0;
+        scheduler_mode = "fairRR";
+        bler_target_upper = 20.0;
+        bler_target_lower = 10.0;
+        max_ul_rb_index   = 24;
+        puSch10xSnr     =  100;
+        puCch10xSnr     =  150;
+        }  
+);
+
+L1s = (
+    	{
+	num_cc = 1;
+	tr_n_preference = "local_mac";
+        prach_dtx_threshold = 200;
+        pucch1_dtx_threshold = 5
+        pucch1ab_dtx_threshold =0;
+        }  
+);
+
+RUs = (
+    {		  
+       local_rf       = "yes"
+         nb_tx          = 2
+         nb_rx          = 2
+         att_tx         = 0
+         att_rx         = 0;
+         bands          = [38];
+         max_pdschReferenceSignalPower = -27;
+         max_rxgain                    = 75;
+         eNB_instances  = [0];
+         sdr_addrs      = "mgmt_addr=192.168.18.241,addr=192.168.20.2,second_addr=192.168.10.2";
+
+    }
+);  
+
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_SINGLE_THREAD";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
+NETWORK_CONTROLLER :
+{
+    FLEXRAN_ENABLED        = "no";
+    FLEXRAN_INTERFACE_NAME = "lo";
+    FLEXRAN_IPV4_ADDRESS   = "127.0.0.1";
+    FLEXRAN_PORT           = 2210;
+    FLEXRAN_CACHE          = "/mnt/oai_agent_cache";
+    FLEXRAN_AWAIT_RECONF   = "no";
+};
+
+     log_config :
+     {
+       global_log_level                      ="info";
+       global_log_verbosity                  ="medium";
+       hw_log_level                          ="info";
+       hw_log_verbosity                      ="medium";
+       phy_log_level                         ="info";
+       phy_log_verbosity                     ="medium";
+       mac_log_level                         ="info";
+       mac_log_verbosity                     ="high";
+       rlc_log_level                         ="info";
+       rlc_log_verbosity                     ="medium";
+       pdcp_log_level                        ="info";
+       pdcp_log_verbosity                    ="medium";
+       rrc_log_level                         ="info";
+       rrc_log_verbosity                     ="medium";
+    };
+
diff --git a/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf
index f29fc163b3d0459df1e633c397f3b67fb0711575..6fc84012361a0c9c59d0b7a456f04f2b304525f4 100644
--- a/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf
@@ -6,10 +6,8 @@ eNBs =
 (
  {
     ////////// Identification parameters:
-    eNB_ID    =  0xe00;
-
+    eNB_ID    =  0xe01;
     cell_type =  "CELL_MACRO_ENB";
-
     eNB_name  =  "eNB-Eurecom-LTEBox";
 
     // Tracking area code, 0x0000 and 0xfffe are reserved values
@@ -128,24 +126,25 @@ eNBs =
       rxPool_commTxResourceUC-ReqAllowed                     = "TRUE";
 */
       // Parameters for SIB19
-      discRxPool_cp_Len                                      = "normal"
-      discRxPool_discPeriod                                  = "rf32"
-      discRxPool_numRetx                                     = 1;
-      discRxPool_numRepetition                               = 2;
-      discRxPool_ResourceConfig_prb_Num                      = 5;
-      discRxPool_ResourceConfig_prb_Start                    = 3;
-      discRxPool_ResourceConfig_prb_End                      = 21;
-      discRxPool_ResourceConfig_offsetIndicator_present      = "prSmall";
-      discRxPool_ResourceConfig_offsetIndicator_choice       = 0;
-      discRxPool_ResourceConfig_subframeBitmap_present       = "prBs40";
-      discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf = "f0ffffffff";
-      discRxPool_ResourceConfig_subframeBitmap_choice_bs_size= 5;
+      discRxPool_cp_Len                                               = "normal"
+      discRxPool_discPeriod                                           = "rf32"
+      discRxPool_numRetx                                              = 1;
+      discRxPool_numRepetition                                        = 2;
+      discRxPool_ResourceConfig_prb_Num                               = 5;
+      discRxPool_ResourceConfig_prb_Start                             = 3;
+      discRxPool_ResourceConfig_prb_End                               = 21;
+      discRxPool_ResourceConfig_offsetIndicator_present               = "prSmall";
+      discRxPool_ResourceConfig_offsetIndicator_choice                = 0;
+      discRxPool_ResourceConfig_subframeBitmap_present                = "prBs40";
+      discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf          = "f0ffffffff";
+      discRxPool_ResourceConfig_subframeBitmap_choice_bs_size         = 5;
       discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused  = 0;
 
+      //SSB central frequency of NR secondary cell group (for ENDC NSA)
+      nr_scg_ssb_freq = 641272;
       }
     );
 
-
     srb1_parameters :
     {
         # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
@@ -175,6 +174,7 @@ eNBs =
         SCTP_OUTSTREAMS = 2;
     };
 
+    enable_measurement_reports = "no";
 
     ////////// MME parameters:
     mme_ip_address      = ( { ipv4       = "CI_MME_IP_ADDR";
@@ -185,10 +185,8 @@ eNBs =
                             }
                           );
 
-    enable_measurement_reports = "no";
-
     ///X2
-    enable_x2 = "no";
+    enable_x2         = "no";
     t_reloc_prep      = 1000;      /* unit: millisecond */
     tx2_reloc_overall = 2000;      /* unit: millisecond */
     t_dc_prep         = 1000;      /* unit: millisecond */
diff --git a/ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf
index fff3cd1b9aac11df2b9f76c891220fb0365dbb4e..454649f20d4b858c8abcf280882603e0d7cfa901 100644
--- a/ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf
@@ -5,110 +5,106 @@ Asn1_verbosity = "none";
 eNBs =
 (
  {
-    # real_time choice in {hard, rt-preempt, no}
-    real_time       =  "no";
     ////////// Identification parameters:
     eNB_ID    =  0xe01;
     cell_type =  "CELL_MACRO_ENB";
     eNB_name  =  "eNB-Eurecom-LTEBox";
     
     // Tracking area code, 0x0000 and 0xfffe are reserved values
-    tracking_area_code  =  1;
-    plmn_list = (
-      { mcc = 222; mnc = 01; mnc_length = 2; }
-    );
+    tracking_area_code = 1;
+    plmn_list = ( { mcc = 222; mnc = 01; mnc_length = 2; } );
     
     tr_s_preference     = "local_mac"
 
+    // In seconds
+    rrc_inactivity_threshold = 0;
+
     ////////// Physical parameters:
   
     component_carriers = (
       {
-        node_function                    = "eNodeB_3GPP";
-        node_timing                      = "synch_to_ext_device";
-        node_synch_ref                   = 0;
-        nb_antenna_ports                 = 1;
-        ue_TransmissionMode              = 1;
-        frame_type                       = "FDD"; 
-        tdd_config                       = 3;
-        tdd_config_s                     = 0;
-        prefix_type                      = "NORMAL";
-        eutra_band                       = 7;
-        downlink_frequency               = 2680000000L;
-        uplink_frequency_offset          = -120000000;
-  
-        Nid_cell                         = 0;
-        N_RB_DL                          = 25;
-        Nid_cell_mbsfn                   = 0;
-        nb_antennas_tx                   = 1;
-        nb_antennas_rx                   = 1; 
-        prach_root                       = 0;
-        tx_gain                          = 90;
-        rx_gain                          = 115;
-        pbch_repetition                  = "FALSE";
-
-        prach_config_index               = 0;
-        prach_high_speed                 = "DISABLE";
-        prach_zero_correlation           = 1;
-        prach_freq_offset                = 2;
-
-        pucch_delta_shift                = 1;
-        pucch_nRB_CQI                    = 0;
-        pucch_nCS_AN                     = 0;
-        pucch_n1_AN                      = 0;
-        pdsch_referenceSignalPower       = -29;
-        pdsch_p_b                        = 0;
-        pusch_n_SB                       = 1; 
-        pusch_enable64QAM                = "DISABLE";
-        pusch_hoppingMode                = "interSubFrame";
-        pusch_hoppingOffset              = 0;
-        pusch_groupHoppingEnabled        = "ENABLE";
-        pusch_groupAssignment            = 0;
-        pusch_sequenceHoppingEnabled     = "DISABLE";
-        pusch_nDMRS1                     = 1;
-        phich_duration                   = "NORMAL";
-        phich_resource                   = "ONESIXTH";
-        srs_enable                       = "DISABLE";
+      node_function             = "3GPP_eNODEB";
+      node_timing               = "synch_to_ext_device";
+      node_synch_ref            = 0;
+      frame_type                = "FDD";
+      tdd_config                = 3;
+      tdd_config_s              = 0;
+      prefix_type               = "NORMAL";
+      eutra_band                = 7;
+      downlink_frequency        = 2680000000L;
+      uplink_frequency_offset   = -120000000;
+      Nid_cell                  = 0;
+      N_RB_DL                   = 25;
+      Nid_cell_mbsfn            = 0;
+      nb_antenna_ports          = 1;
+      nb_antennas_tx            = 1;
+      nb_antennas_rx            = 1;
+      tx_gain                   = 90;
+      rx_gain                   = 115;
+      pbch_repetition           = "FALSE";
+      prach_root                = 0;
+      prach_config_index        = 0;
+      prach_high_speed          = "DISABLE";
+      prach_zero_correlation    = 1;
+      prach_freq_offset         = 2;
+      pucch_delta_shift         = 1;
+      pucch_nRB_CQI             = 0;
+      pucch_nCS_AN              = 0;
+      pucch_n1_AN               = 0;
+      pdsch_referenceSignalPower= -29;
+      pdsch_p_b                 = 0;
+      pusch_n_SB                = 1;
+      pusch_enable64QAM         = "DISABLE";
+      pusch_hoppingMode         = "interSubFrame";
+      pusch_hoppingOffset       = 0;
+      pusch_groupHoppingEnabled = "ENABLE";
+      pusch_groupAssignment     = 0;
+      pusch_sequenceHoppingEnabled = "DISABLE";
+      pusch_nDMRS1              = 1;
+      phich_duration            = "NORMAL";
+      phich_resource            = "ONESIXTH";
+      srs_enable                = "DISABLE";
 /*
-        srs_BandwidthConfig              =;
-        srs_SubframeConfig               =;
-        srs_ackNackST                    =;
-        srs_MaxUpPts                     =;
+      srs_BandwidthConfig       =;
+      srs_SubframeConfig        =;
+      srs_ackNackST             =;
+      srs_MaxUpPts              =;
 */
 
-        pusch_p0_Nominal                 = -96;
-        pusch_alpha                      = "AL1";
-        pucch_p0_Nominal                 = -96;
-        msg3_delta_Preamble              = 6;
-        pucch_deltaF_Format1             = "deltaF2";
-        pucch_deltaF_Format1b            = "deltaF3";
-        pucch_deltaF_Format2             = "deltaF0";
-        pucch_deltaF_Format2a            = "deltaF0";
-        pucch_deltaF_Format2b            = "deltaF0";
+      pusch_p0_Nominal          = -96;
+      pusch_alpha               = "AL1";
+      pucch_p0_Nominal          = -96;
+      msg3_delta_Preamble       = 6;
+      pucch_deltaF_Format1      = "deltaF2";
+      pucch_deltaF_Format1b     = "deltaF3";
+      pucch_deltaF_Format2      = "deltaF0";
+      pucch_deltaF_Format2a     = "deltaF0";
+      pucch_deltaF_Format2b     = "deltaF0";
  
-        rach_numberOfRA_Preambles        = 64;
-        rach_preamblesGroupAConfig       = "DISABLE";
+      rach_numberOfRA_Preambles                = 64;
+      rach_preamblesGroupAConfig               = "DISABLE";
 /*
-        rach_sizeOfRA_PreamblesGroupA    = ;
-        rach_messageSizeGroupA           = ;
-        rach_messagePowerOffsetGroupB    = ; 
+      rach_sizeOfRA_PreamblesGroupA            = ;
+      rach_messageSizeGroupA                   = ;
+      rach_messagePowerOffsetGroupB            = ;
 */
-        rach_powerRampingStep                   = 4;
-        rach_preambleInitialReceivedTargetPower = -108;
-        rach_preambleTransMax                   = 10;
-        rach_raResponseWindowSize               = 10;
-        rach_macContentionResolutionTimer       = 48;
-        rach_maxHARQ_Msg3Tx                     = 4;
+      rach_powerRampingStep                    = 4;
+      rach_preambleInitialReceivedTargetPower  = -108;
+      rach_preambleTransMax                    = 10;
+      rach_raResponseWindowSize                = 10;
+      rach_macContentionResolutionTimer        = 48;
+      rach_maxHARQ_Msg3Tx                      = 4;
 
-      pcch_default_PagingCycle           = 128;
-      pcch_nB                            = "oneT";
-      bcch_modificationPeriodCoeff       = 2;
-      ue_TimersAndConstants_t300         = 1000;
-      ue_TimersAndConstants_t301         = 1000;
-      ue_TimersAndConstants_t310         = 1000;
-      ue_TimersAndConstants_t311         = 10000;
-      ue_TimersAndConstants_n310         = 20;
-      ue_TimersAndConstants_n311         = 1;
+      pcch_default_PagingCycle                 = 128;
+      pcch_nB                                  = "oneT";
+      bcch_modificationPeriodCoeff             = 2;
+      ue_TimersAndConstants_t300               = 1000;
+      ue_TimersAndConstants_t301               = 1000;
+      ue_TimersAndConstants_t310               = 1000;
+      ue_TimersAndConstants_t311               = 10000;
+      ue_TimersAndConstants_n310               = 20;
+      ue_TimersAndConstants_n311               = 1;
+      ue_TransmissionMode                      = 1;
 
       //Parameters for SIB18
       rxPool_sc_CP_Len                                       = "normal"; 
@@ -120,25 +116,25 @@ eNBs =
       rxPool_ResourceConfig_offsetIndicator_present          = "prSmall";
       rxPool_ResourceConfig_offsetIndicator_choice           = 0;      
       rxPool_ResourceConfig_subframeBitmap_present           = "prBs40";
-      rxPool_ResourceConfig_subframeBitmap_choice_bs_buf              = "00000000000000000000";
-      rxPool_ResourceConfig_subframeBitmap_choice_bs_size             = 5;
-      rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused      = 0;
+      rxPool_ResourceConfig_subframeBitmap_choice_bs_buf     = "00000000000000000000";
+      rxPool_ResourceConfig_subframeBitmap_choice_bs_size    = 5;
+      rxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused = 0;
 /*
-      rxPool_dataHoppingConfig_hoppingParameter                       = 0;
-      rxPool_dataHoppingConfig_numSubbands                            = "ns1";
-      rxPool_dataHoppingConfig_rbOffset                               = 0;
-      rxPool_commTxResourceUC-ReqAllowed                              = "TRUE";
+      rxPool_dataHoppingConfig_hoppingParameter              = 0;
+      rxPool_dataHoppingConfig_numSubbands                   = "ns1";
+      rxPool_dataHoppingConfig_rbOffset                      = 0;
+      rxPool_commTxResourceUC-ReqAllowed                     = "TRUE";
 */    
       // Parameters for SIB19
       discRxPool_cp_Len                                               = "normal"
       discRxPool_discPeriod                                           = "rf32"
-      discRxPool_numRetx                                              = 1;   
+      discRxPool_numRetx                                              = 1;
       discRxPool_numRepetition                                        = 2;
-      discRxPool_ResourceConfig_prb_Num                               = 5;  
+      discRxPool_ResourceConfig_prb_Num                               = 5;
       discRxPool_ResourceConfig_prb_Start                             = 3;
       discRxPool_ResourceConfig_prb_End                               = 21;
       discRxPool_ResourceConfig_offsetIndicator_present               = "prSmall";
-      discRxPool_ResourceConfig_offsetIndicator_choice                = 0;      
+      discRxPool_ResourceConfig_offsetIndicator_choice                = 0;
       discRxPool_ResourceConfig_subframeBitmap_present                = "prBs40";
       discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf          = "f0ffffffff";
       discRxPool_ResourceConfig_subframeBitmap_choice_bs_size         = 5;
@@ -190,7 +186,7 @@ eNBs =
                           );
 
     ///X2
-    enable_x2 = "yes";
+    enable_x2         = "yes";
     t_reloc_prep      = 1000;      /* unit: millisecond */
     tx2_reloc_overall = 2000;      /* unit: millisecond */
     t_dc_prep         = 1000;      /* unit: millisecond */
@@ -198,39 +194,19 @@ eNBs =
 
     NETWORK_INTERFACES : 
     {
-        ENB_INTERFACE_NAME_FOR_S1_MME            = "eth1";
+        ENB_INTERFACE_NAME_FOR_S1_MME            = "eth0";
         ENB_IPV4_ADDRESS_FOR_S1_MME              = "CI_ENB_IP_ADDR";
-
-        ENB_INTERFACE_NAME_FOR_S1U               = "eth1";
+        ENB_INTERFACE_NAME_FOR_S1U               = "eth0";
         ENB_IPV4_ADDRESS_FOR_S1U                 = "CI_ENB_IP_ADDR";
         ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
-
         ENB_IPV4_ADDRESS_FOR_X2C                 = "CI_ENB_IP_ADDR";
         ENB_PORT_FOR_X2C                         = 36422; # Spec 36422
     };
-    
-    log_config : 
-    {
-     global_log_level                      ="info"; 
-     global_log_verbosity                  ="high";
-     hw_log_level                          ="info"; 
-     hw_log_verbosity                      ="medium";
-     phy_log_level                         ="info"; 
-     phy_log_verbosity                     ="medium";
-     mac_log_level                         ="info"; 
-     mac_log_verbosity                     ="high";
-     rlc_log_level                         ="debug"; 
-     rlc_log_verbosity                     ="high";
-     pdcp_log_level                        ="info"; 
-     pdcp_log_verbosity                    ="high";
-     rrc_log_level                         ="info"; 
-     rrc_log_verbosity                     ="medium";
-   }; 
-   
   }
 );
 
-MACRLCs = (
+MACRLCs =
+(
   {
     num_cc          = 1;
     tr_s_preference = "local_L1";
@@ -238,37 +214,52 @@ MACRLCs = (
     phy_test_mode   = 0;
     puSch10xSnr     =  160;
     puCch10xSnr     =  160;
-  }  
-);
-
-THREAD_STRUCT = (
-  {
-    parallel_config = "PARALLEL_RU_L1_TRX_SPLIT";
-    worker_config   = "WORKER_ENABLE";
   }
 );
 
-L1s = (
+L1s =
+(
   {
-    num_cc          = 1;
+    num_cc = 1;
     tr_n_preference = "local_mac";
-  }  
+  }
 );
 
-RUs = (
-  {             
-    local_rf       = "yes"
-    nb_tx          = 1
-    nb_rx          = 1
-    att_tx         = 3
-    att_rx         = 0;
-    bands          = [7];
+RUs =
+(
+  {
+    local_rf                      = "yes"
+    nb_tx                         = 1
+    nb_rx                         = 1
+    att_tx                        = 3
+    att_rx                        = 0;
+    bands                         = [7];
     max_pdschReferenceSignalPower = -27;
     max_rxgain                    = 115;
-    eNB_instances  = [0];
-#    clock_src      = "external";
+    eNB_instances                 = [0];
+#    clock_src                     = "external";
   }
-);  
+);
+
+THREAD_STRUCT =
+(
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
+NETWORK_CONTROLLER :
+{
+    FLEXRAN_ENABLED        = "no";
+    FLEXRAN_INTERFACE_NAME = "eth0";
+    FLEXRAN_IPV4_ADDRESS   = "CI_FLEXRAN_CTL_IP_ADDR";
+    FLEXRAN_PORT           = 2210;
+    FLEXRAN_CACHE          = "/mnt/oai_agent_cache";
+    FLEXRAN_AWAIT_RECONF   = "no";
+};
 
 log_config : 
   {
@@ -286,4 +277,5 @@ log_config :
      pdcp_log_verbosity                    ="high";
      rrc_log_level                         ="info"; 
      rrc_log_verbosity                     ="medium";
-  }; 
+};
+
diff --git a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
index a4d9985dcafa05dfa89b6b3f547b636cf3eeaff2..8d403cf4cea59bf0c7433bb6b16fd30ec1bc71d2 100644
--- a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
@@ -236,9 +236,10 @@ MACRLCs = (
 
 L1s = (
     	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
-	pusch_proc_threads = 8;
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf
index 1209a6f227f77167d113ae752e892bafbc3ae0f8..05c71c082e4a6d5e91e73e87eb0fa1f14f576110 100644
--- a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf
@@ -219,6 +219,7 @@ L1s = (
   num_cc = 1;
   tr_n_preference = "local_mac";
   pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
   }
 );
 
diff --git a/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf
new file mode 100644
index 0000000000000000000000000000000000000000..24dbdbd74b74c25e9bb357af2d2c68d09c4156d1
--- /dev/null
+++ b/ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf
@@ -0,0 +1,296 @@
+Active_gNBs = ( "gNB-Eurecom-5GNRBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+
+    cell_type =  "CELL_MACRO_GNB";
+    gNB_name  =  "gNB-Eurecom-5GNRBox";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+    plmn_list = ({mcc = 208; mnc = 99; mnc_length = 2;});	 
+
+    tr_s_preference     = "local_mac"
+
+    ////////// Physical parameters:
+
+    ssb_SubcarrierOffset                                      = 31; //0;
+    pdsch_AntennaPorts                                        = 1;
+    pusch_AntennaPorts                                        = 2;
+    pusch_TargetSNRx10                                        = 200;
+    pucch_TargetSNRx10                                        = 200;
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # this is 3600 MHz + 84 PRBs@30kHz SCS (same as initial BWP)
+      absoluteFrequencySSB                                          = 641272; //641032;      #641968; 641968=start of ssb at 3600MHz + 82 RBs    641032=center of SSB at center of cell
+      dl_frequencyBand                                                 = 78;
+      # this is 3600 MHz
+      dl_absoluteFrequencyPointA                                       = 640000;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                              = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
+        dl_subcarrierSpacing                                           = 1;
+        dl_carrierBandwidth                                            = 106;
+     #initialDownlinkBWP
+      #genericParameters
+        # this is RBstart=84,L=13 (275*(L-1))+RBstart
+        initialDLBWPlocationAndBandwidth                                        = 6368;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
+        initialDLBWPsubcarrierSpacing                                           = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                                      = 0;
+        initialDLBWPsearchSpaceZero                                             = 0;
+      #pdsch-ConfigCommon
+        #pdschTimeDomainAllocationList (up to 16 entries)
+        initialDLBWPk0_0                    = 0;  #for DL slot
+        initialDLBWPmappingType_0           = 0;  #0=typeA,1=typeB
+        initialDLBWPstartSymbolAndLength_0  = 40; #this is SS=1,L=13
+
+        initialDLBWPk0_1                    = 0;  #for mixed slot
+        initialDLBWPmappingType_1           = 0;
+        initialDLBWPstartSymbolAndLength_1  = 57; #this is SS=1,L=5
+
+  #uplinkConfigCommon 
+     #frequencyInfoUL
+      ul_frequencyBand                                                 = 78;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                              = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
+      ul_subcarrierSpacing                                           = 1;
+      ul_carrierBandwidth                                            = 106;
+      pMax                                                          = 20;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                                        = 6368;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
+        initialULBWPsubcarrierSpacing                                           = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 13;
+          preambleReceivedTargetPower                               = -100;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 5;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 14; //15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #  
+        msg1_SubcarrierSpacing                                      = 1,
+
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+      # pusch-ConfigCommon (up to 16 elements)
+        initialULBWPk2_0                      = 2;  # used for UL slot
+        initialULBWPmappingType_0             = 1
+        initialULBWPstartSymbolAndLength_0    = 41; # this is SS=0 L=13
+
+        initialULBWPk2_1                      = 2;  # used for mixed slot
+        initialULBWPmappingType_1             = 1;
+        initialULBWPstartSymbolAndLength_1    = 24; # this is SS=10 L=2
+
+        initialULBWPk2_2                      = 7;  # used for Msg.3 during RA
+        initialULBWPmappingType_2             = 1;
+        initialULBWPstartSymbolAndLength_2    = 52; # this is SS=10 L=4
+
+        msg3_DeltaPreamble                                          = 1;
+        p0_NominalWithGrant                                         =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 40;
+        p0_nominal                                                  = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+      ssb_PositionsInBurst_PR                                       = 2;
+      ssb_PositionsInBurst_Bitmap                                   = 1; #0x80;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1 
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
+      subcarrierSpacing                                             = 1;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1 
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 6;
+      nrofDownlinkSlots                                             = 7; //8; //7;
+      nrofDownlinkSymbols                                           = 6; //0; //6;
+      nrofUplinkSlots                                               = 2;
+      nrofUplinkSymbols                                             = 4; //0; //4;
+
+  ssPBCH_BlockPower                                             = -25;
+  }
+
+  );
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// MME parameters:
+    amf_ip_address      = ( { ipv4       = "CI_MME_IP_ADDR";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+    ///X2
+    enable_x2 = "yes";
+    t_reloc_prep      = 1000;      /* unit: millisecond */
+    tx2_reloc_overall = 2000;      /* unit: millisecond */
+    t_dc_prep         = 1000;      /* unit: millisecond */
+    t_dc_overall      = 2000;      /* unit: millisecond */
+    target_enb_x2_ip_address      = (
+                                     { ipv4       = "CI_FR1_CTL_ENB_IP_ADDR";
+                                       ipv6       = "192:168:30::17";
+                                       preference = "ipv4";
+                                     }
+                                    );
+
+    NETWORK_INTERFACES :
+    {
+
+        GNB_INTERFACE_NAME_FOR_NG_AMF            = "eth0";
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "CI_GNB_IP_ADDR";
+        GNB_INTERFACE_NAME_FOR_NGU               = "eth0";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "CI_GNB_IP_ADDR";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+        GNB_IPV4_ADDRESS_FOR_X2C                 = "CI_GNB_IP_ADDR";
+        GNB_PORT_FOR_X2C                         = 36422; # Spec 36422
+    };
+  }
+);
+
+MACRLCs = (
+	{
+	num_cc = 1;
+	tr_s_preference = "local_L1";
+	tr_n_preference = "local_RRC";
+        }  
+);
+
+L1s = (
+    	{
+	num_cc = 1;
+	tr_n_preference = "local_mac";
+	pusch_proc_threads = 8;
+        prach_dtx_threshold = 100;
+        }  
+);
+
+RUs = (
+    {		  
+       local_rf       = "yes"
+         nb_tx          = 2
+         nb_rx          = 2
+         att_tx         = 0
+         att_rx         = 0;
+         bands          = [7];
+         max_pdschReferenceSignalPower = -27;
+         max_rxgain                    = 75;
+         eNB_instances  = [0];
+         bf_weights = [0x00007fff, 0x00007fff];
+         #clock_src = "external";
+         sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
+    }
+);  
+
+THREAD_STRUCT = (
+  {
+    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
+    //parallel_config    = "PARALLEL_SINGLE_THREAD";
+    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+    worker_config      = "WORKER_ENABLE";
+  }
+);
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0", "nea2" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia0" );
+};
+
+     log_config :
+     {
+       global_log_level                      ="info";
+       global_log_verbosity                  ="medium";
+       hw_log_level                          ="info";
+       hw_log_verbosity                      ="medium";
+       phy_log_level                         ="info";
+       phy_log_verbosity                     ="medium";
+       mac_log_level                         ="info";
+       mac_log_verbosity                     ="high";
+       rlc_log_level                         ="info";
+       rlc_log_verbosity                     ="medium";
+       pdcp_log_level                        ="info";
+       pdcp_log_verbosity                    ="medium";
+       rrc_log_level                         ="info";
+       rrc_log_verbosity                     ="medium";
+    };
+
diff --git a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf
similarity index 97%
rename from ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpb210.conf
rename to ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf
index 73e583c3d2064b92870dffcb4732b96a77fb7865..db190f177d2452f804e17a5d1be19aa66170ad17 100644
--- a/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf
@@ -12,8 +12,8 @@ gNBs =
     // Tracking area code, 0x0000 and 0xfffe are reserved values
     tracking_area_code  =  1;
     plmn_list = ({
-                  mcc = 222;
-                  mnc = 01;
+                  mcc = 208;
+                  mnc = 99;
                   mnc_length = 2;
                   snssaiList = (
                     {
@@ -252,11 +252,12 @@ RUs = (
          att_rx         = 0;
          bands          = [7];
          max_pdschReferenceSignalPower = -27;
-         max_rxgain                    = 114;
+         max_rxgain                    = 81;
          eNB_instances  = [0];
          #beamforming 1x4 matrix:
          bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
-         clock_src = "internal";
+         #clock_src = "external";
+         sdr_addrs = "mgmt_addr=192.168.18.240,addr=192.168.10.2,second_addr=192.168.20.2,clock_source=internal,time_source=internal"
     }
 );
 
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
index 7a8e694a63528073f139f648835f60f2d1d71b3d..df2fd874cafb4fd1806aa2f76e78cf087be6a47b 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
@@ -8,7 +8,6 @@ gNBs =
  {
     ////////// Identification parameters:
     gNB_ID    =  0xe00;
-
     cell_type =  "CELL_MACRO_GNB";
     gNB_name  =  "gNB-Eurecom-5GNRBox";
 
@@ -185,102 +184,102 @@ gNBs =
 
 
     ////////// MME parameters:
-    mme_ip_address      = ( { ipv4       = "CI_MME_IP_ADDR";
-                              ipv6       = "192:168:30::17";
-                              port       = 36412 ;
-                              active     = "yes";
-                              preference = "ipv4";
-                            }
-                          );
+#    mme_ip_address      = ( { ipv4       = "CI_MME_IP_ADDR";
+#                              ipv6       = "192:168:30::17";
+#                              port       = 36412 ;
+#                              active     = "yes";
+#                              preference = "ipv4";
+#                            }
+#                          );
 
     ///X2
-    enable_x2 = "yes";
+    enable_x2         = "yes";
     t_reloc_prep      = 1000;      /* unit: millisecond */
     tx2_reloc_overall = 2000;      /* unit: millisecond */
     t_dc_prep         = 1000;      /* unit: millisecond */
     t_dc_overall      = 2000;      /* unit: millisecond */
-    target_enb_x2_ip_address      = (
-                                     { ipv4       = "CI_FR1_CTL_ENB_IP_ADDR";
-                                       ipv6       = "192:168:30::17";
-                                       preference = "ipv4";
-                                     }
-                                    );
+
+    target_enb_x2_ip_address = ( { ipv4       = "CI_FR1_CTL_ENB_IP_ADDR";
+                                   ipv6       = "192:168:30::17";
+                                   preference = "ipv4";
+                                 }
+                               );
 
     NETWORK_INTERFACES :
     {
-
-        GNB_INTERFACE_NAME_FOR_S1_MME            = "eth0";
-        GNB_IPV4_ADDRESS_FOR_S1_MME              = "CI_GNB_IP_ADDR";
-        GNB_INTERFACE_NAME_FOR_S1U               = "eth0";
-        GNB_IPV4_ADDRESS_FOR_S1U                 = "CI_GNB_IP_ADDR";
-        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
-        GNB_IPV4_ADDRESS_FOR_X2C                 = "CI_GNB_IP_ADDR";
-        GNB_PORT_FOR_X2C                         = 36422; # Spec 36422
+      GNB_INTERFACE_NAME_FOR_S1_MME  = "eth0";
+      GNB_IPV4_ADDRESS_FOR_S1_MME    = "CI_GNB_IP_ADDR";
+      GNB_INTERFACE_NAME_FOR_S1U     = "eth0";
+      GNB_IPV4_ADDRESS_FOR_S1U       = "CI_GNB_IP_ADDR";
+      GNB_PORT_FOR_S1U               = 2152; # Spec 2152
+      GNB_IPV4_ADDRESS_FOR_X2C       = "CI_GNB_IP_ADDR";
+      GNB_PORT_FOR_X2C               = 36422; # Spec 36422
     };
+
   }
 );
 
 MACRLCs = (
-    {
-        num_cc              = 1;
-        tr_s_preference     = "local_L1";
-        tr_n_preference     = "local_RRC";
-        pusch_TargetSNRx10  = 200;
-        pucch_TargetSNRx10  = 200;
-    }
+  {
+    num_cc              = 1;
+    tr_s_preference     = "local_L1";
+    tr_n_preference     = "local_RRC";
+    pusch_TargetSNRx10  = 200;
+    pucch_TargetSNRx10  = 200;
+  }
 );
 
 L1s = (
-      {
-  num_cc = 1;
-  tr_n_preference = "local_mac";
-  pusch_proc_threads = 6;
-        }  
+  {
+    num_cc = 1;
+    tr_n_preference = "local_mac";
+    pusch_proc_threads = 6;
+    ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+  }  
 );
 
 RUs = (
-    {      
-       local_rf       = "yes"
-         nb_tx          = 1
-         nb_rx          = 1
-         att_tx         = 3
-         att_rx         = 0;
-         bands          = [7];
-         max_pdschReferenceSignalPower = -27;
-         max_rxgain                    = 111;
-         eNB_instances  = [0];
-#         clock_src = "external";
-    }
+  {
+    local_rf       = "yes"
+    nb_tx          = 1
+    nb_rx          = 1
+    att_tx         = 3
+    att_rx         = 0;
+    bands          = [7];
+    max_pdschReferenceSignalPower = -27;
+    max_rxgain     = 111;
+    eNB_instances  = [0];
+#    clock_src      = "external";
+  }
 );  
 
 THREAD_STRUCT = (
   {
     #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
     parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
-    //parallel_config    = "PARALLEL_SINGLE_THREAD";
     #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
     worker_config      = "WORKER_ENABLE";
   }
 );
 
-     log_config :
-     {
-       global_log_level                      ="info";
-       global_log_verbosity                  ="medium";
-       hw_log_level                          ="info";
-       hw_log_verbosity                      ="medium";
-       phy_log_level                         ="info";
-       phy_log_verbosity                     ="medium";
-       mac_log_level                         ="info";
-       mac_log_verbosity                     ="high";
-       rlc_log_level                         ="info";
-       rlc_log_verbosity                     ="medium";
-       pdcp_log_level                        ="info";
-       pdcp_log_verbosity                    ="medium";
-       rrc_log_level                         ="info";
-       rrc_log_verbosity                     ="medium";
-    };
+log_config :
+{
+  global_log_level      ="info";
+  global_log_verbosity  ="medium";
+  hw_log_level          ="info";
+  hw_log_verbosity      ="medium";
+  phy_log_level         ="info";
+  phy_log_verbosity     ="medium";
+  mac_log_level         ="info";
+  mac_log_verbosity     ="high";
+  rlc_log_level         ="info";
+  rlc_log_verbosity     ="medium";
+  pdcp_log_level        ="info";
+  pdcp_log_verbosity    ="medium";
+  rrc_log_level         ="info";
+  rrc_log_verbosity     ="medium";
+};
 
 uicc: {
-opc = "testopc";
+  opc = "testopc";
 };
diff --git a/ci-scripts/conf_files/nr-ue-sim.conf b/ci-scripts/conf_files/nr-ue-sim.conf
new file mode 100644
index 0000000000000000000000000000000000000000..05ac825db418ab46f02b6a73d5a8f40bb8acb51d
--- /dev/null
+++ b/ci-scripts/conf_files/nr-ue-sim.conf
@@ -0,0 +1,8 @@
+uicc0 = {
+  imsi = "@FULL_IMSI@";
+  key = "@FULL_KEY@";
+  opc= "@OPC@";
+  dnn= "@DNN@";
+  nssai_sst=@NSSAI_SST@;
+  nssai_sd=@NSSAI_SD@;
+}
diff --git a/ci-scripts/html.py b/ci-scripts/html.py
index 9eadf30279678850e32c6d03b179661de31d33f8..b172ffb71113b74dedbdf933545623933a85ed38 100644
--- a/ci-scripts/html.py
+++ b/ci-scripts/html.py
@@ -182,9 +182,12 @@ class HTMLManagement():
 				self.htmlFile.write('     </tr>\n')
 			self.htmlFile.write('  </table>\n')
 
-			if (ADBIPAddress != 'none'):
+			if (ADBIPAddress != 'none') and (ADBIPAddress != 'modules'):
 				self.htmlFile.write('  <h2><span class="glyphicon glyphicon-phone"></span> <span class="glyphicon glyphicon-menu-right"></span> ' + str(self.htmlNb_Smartphones) + ' UE(s) is(are) connected to ADB bench server</h2>\n')
 				self.htmlFile.write('  <h2><span class="glyphicon glyphicon-phone"></span> <span class="glyphicon glyphicon-menu-right"></span> ' + str(self.htmlNb_CATM_Modules) + ' CAT-M UE(s) is(are) connected to bench server</h2>\n')
+			elif (ADBIPAddress == 'modules'):
+				self.htmlUEConnected = 1
+				self.htmlFile.write('  <h2><span class="glyphicon glyphicon-phone"></span> <span class="glyphicon glyphicon-menu-right"></span> 1 commercial module is connected to CI bench</h2>\n')
 			else:
 				self.htmlUEConnected = 1
 				self.htmlFile.write('  <h2><span class="glyphicon glyphicon-phone"></span> <span class="glyphicon glyphicon-menu-right"></span> 1 OAI UE(s) is(are) connected to CI bench</h2>\n')
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index fd8f664ecf84f423188e5f2ba88c1dcb234dc332..d66c0c630578310bff402a62f525ab5ebf1e059b 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -65,6 +65,7 @@ import xml.etree.ElementTree as ET
 import logging
 import datetime
 import signal
+import subprocess
 from multiprocessing import Process, Lock, SimpleQueue
 logging.basicConfig(
 	level=logging.DEBUG,
@@ -155,6 +156,11 @@ def GetParametersFromXML(action):
 		RAN.eNB_Trace=test.findtext('eNB_Trace')
 		RAN.Initialize_eNB_args=test.findtext('Initialize_eNB_args')
 		eNB_instance=test.findtext('eNB_instance')
+		USRPIPAddress=test.findtext('USRP_IPAddress')
+		if USRPIPAddress is None:
+			RAN.USRPIPAddress=''
+		else:
+			RAN.USRPIPAddress=USRPIPAddress
 		if (eNB_instance is None):
 			RAN.eNB_instance=0
 		else:
@@ -367,6 +373,41 @@ def GetParametersFromXML(action):
 		if (string_field is not None):
 			CONTAINERS.yamlPath[CONTAINERS.eNB_instance] = string_field
 
+	elif action == 'DeployGenObject' or action == 'UndeployGenObject':
+		string_field=test.findtext('yaml_path')
+		if (string_field is not None):
+			CONTAINERS.yamlPath[0] = string_field
+		string_field=test.findtext('services')
+		if (string_field is not None):
+			CONTAINERS.services[0] = string_field
+		string_field=test.findtext('nb_healthy')
+		if (string_field is not None):
+			CONTAINERS.nb_healthy[0] = int(string_field)
+
+	elif action == 'PingFromContainer':
+		string_field = test.findtext('container_name')
+		if (string_field is not None):
+			CONTAINERS.pingContName = string_field
+		string_field = test.findtext('options')
+		if (string_field is not None):
+			CONTAINERS.pingOptions = string_field
+		string_field = test.findtext('loss_threshold')
+		if (string_field is not None):
+			CONTAINERS.pingLossThreshold = string_field
+
+	elif action == 'IperfFromContainer':
+		string_field = test.findtext('server_container_name')
+		if (string_field is not None):
+			CONTAINERS.svrContName = string_field
+		string_field = test.findtext('server_options')
+		if (string_field is not None):
+			CONTAINERS.svrOptions = string_field
+		string_field = test.findtext('client_container_name')
+		if (string_field is not None):
+			CONTAINERS.cliContName = string_field
+		string_field = test.findtext('client_options')
+		if (string_field is not None):
+			CONTAINERS.cliOptions = string_field
 
 	else: # ie action == 'Run_PhySim':
 		ldpc.runargs = test.findtext('physim_run_args')
@@ -474,6 +515,8 @@ if re.match('^TerminateeNB$', mode, re.IGNORECASE):
 	if RAN.eNBIPAddress == '' or RAN.eNBUserName == '' or RAN.eNBPassword == '':
 		HELP.GenericHelp(CONST.Version)
 		sys.exit('Insufficient Parameter')
+	if RAN.eNBIPAddress == 'none':
+		sys.exit(0)
 	RAN.eNB_instance=0
 	RAN.eNB_serverId[0]='0'
 	RAN.eNBSourceCodePath='/tmp/'
@@ -509,11 +552,18 @@ elif re.match('^LogCollectBuild$', mode, re.IGNORECASE):
 	if (RAN.eNBIPAddress == '' or RAN.eNBUserName == '' or RAN.eNBPassword == '' or RAN.eNBSourceCodePath == '') and (CiTestObj.UEIPAddress == '' or CiTestObj.UEUserName == '' or CiTestObj.UEPassword == '' or CiTestObj.UESourceCodePath == ''):
 		HELP.GenericHelp(CONST.Version)
 		sys.exit('Insufficient Parameter')
+	if RAN.eNBIPAddress == 'none':
+		sys.exit(0)
 	CiTestObj.LogCollectBuild(RAN)
 elif re.match('^LogCollecteNB$', mode, re.IGNORECASE):
 	if RAN.eNBIPAddress == '' or RAN.eNBUserName == '' or RAN.eNBPassword == '' or RAN.eNBSourceCodePath == '':
 		HELP.GenericHelp(CONST.Version)
 		sys.exit('Insufficient Parameter')
+	if RAN.eNBIPAddress == 'none':
+		cmd = 'zip -r enb.log.' + RAN.BuildId + '.zip cmake_targets/log'
+		logging.debug(cmd)
+		zipStatus = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT, universal_newlines=True, timeout=60)
+		sys.exit(0)
 	RAN.LogCollecteNB()
 elif re.match('^LogCollectHSS$', mode, re.IGNORECASE):
 	if EPC.IPAddress == '' or EPC.UserName == '' or EPC.Password == '' or EPC.Type == '' or EPC.SourceCodePath == '':
@@ -568,7 +618,7 @@ elif re.match('^InitiateHtml$', mode, re.IGNORECASE):
 	if foundCount != HTML.nbTestXMLfiles:
 		HTML.nbTestXMLfiles=foundCount
 	
-	if (CiTestObj.ADBIPAddress != 'none'):
+	if (CiTestObj.ADBIPAddress != 'none') and (CiTestObj.ADBIPAddress != 'modules'):
 		terminate_ue_flag = False
 		CiTestObj.GetAllUEDevices(terminate_ue_flag)
 		CiTestObj.GetAllCatMDevices(terminate_ue_flag)
@@ -672,10 +722,12 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
 
 	signal.signal(signal.SIGUSR1, receive_signal)
 
-	if (CiTestObj.ADBIPAddress != 'none'):
+	if (CiTestObj.ADBIPAddress != 'none') and (CiTestObj.ADBIPAddress != 'modules'):
 		terminate_ue_flag = False
 		CiTestObj.GetAllUEDevices(terminate_ue_flag)
 		CiTestObj.GetAllCatMDevices(terminate_ue_flag)
+	elif (CiTestObj.ADBIPAddress == 'modules'):
+		CiTestObj.UEDevices.append('COTS-Module')
 	else:
 		CiTestObj.UEDevices.append('OAI-UE')
 	HTML.SethtmlUEConnected(len(CiTestObj.UEDevices) + len(CiTestObj.CatMDevices))
@@ -709,7 +761,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
 				CiTestObj.ShowTestID()
 				GetParametersFromXML(action)
 				if action == 'Initialize_UE' or action == 'Attach_UE' or action == 'Detach_UE' or action == 'Ping' or action == 'Iperf' or action == 'Reboot_UE' or action == 'DataDisable_UE' or action == 'DataEnable_UE' or action == 'CheckStatusUE':
-					if (CiTestObj.ADBIPAddress != 'none'):
+					if (CiTestObj.ADBIPAddress != 'none') and (CiTestObj.ADBIPAddress != 'modules'):
 						#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 
 						# Now we stop properly the test-suite --> clean reporting
@@ -794,7 +846,8 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
 					CiTestObj.Perform_X2_Handover(HTML,RAN,EPC)
 				elif action == 'Build_PhySim':
 					HTML=ldpc.Build_PhySim(HTML,CONST)
-					if ldpc.exitStatus==1:sys.exit()
+					if ldpc.exitStatus==1:
+						RAN.prematureExit = True
 				elif action == 'Run_PhySim':
 					HTML=ldpc.Run_PhySim(HTML,CONST,id)
 				elif action == 'Build_Image':
@@ -807,9 +860,25 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
 					SCA.CppCheckAnalysis(HTML)
 				elif action == 'Deploy_Run_PhySim':
 					PHYSIM.Deploy_PhySim(HTML, RAN)
+				elif action == 'DeployGenObject':
+					CONTAINERS.DeployGenObject(HTML)
+					if CONTAINERS.exitStatus==1:
+						RAN.prematureExit = True
+				elif action == 'UndeployGenObject':
+					CONTAINERS.UndeployGenObject(HTML)
+					if CONTAINERS.exitStatus==1:
+						RAN.prematureExit = True
+				elif action == 'PingFromContainer':
+					CONTAINERS.PingFromContainer(HTML)
+					if CONTAINERS.exitStatus==1:
+						RAN.prematureExit = True
+				elif action == 'IperfFromContainer':
+					CONTAINERS.IperfFromContainer(HTML)
+					if CONTAINERS.exitStatus==1:
+						RAN.prematureExit = True
 				else:
 					sys.exit('Invalid class (action) from xml')
-				if not RAN.prematureExit:
+				if RAN.prematureExit:
 					if CiTestObj.testCase_id == CiTestObj.testMinStableId:
 						logging.debug('Scenario has reached minimal stability point')
 						CiTestObj.testStabilityPointReached = True
diff --git a/ci-scripts/oai-ci-vm-tool b/ci-scripts/oai-ci-vm-tool
index d8f088b707e608f33cc1f25c727708dfd60f131b..5ee653c8e15768303ff5a67d505c13ce95157bb1 100755
--- a/ci-scripts/oai-ci-vm-tool
+++ b/ci-scripts/oai-ci-vm-tool
@@ -170,20 +170,20 @@ function setvar_usage {
 # for compatibility reasons  
 
 function variant__v1__enb_usrp {
-    NB_PATTERN_FILES=9
+    NB_PATTERN_FILES=7
     BUILD_OPTIONS="--eNB -w USRP --mu"
     VM_MEMORY=3072
 }
     
 function variant__v2__basic_sim {
-    NB_PATTERN_FILES=13
+    NB_PATTERN_FILES=11
     BUILD_OPTIONS="--eNB --UE"
     VM_MEMORY=8192
     RUN_OPTIONS="complex"
 }
 
 function variant__v3__phy_sim {
-    NB_PATTERN_FILES=13
+    NB_PATTERN_FILES=11
     BUILD_OPTIONS="--phy_simulators"
     VM_MEMORY=8192
     VM_DISK=20
@@ -200,28 +200,28 @@ function variant__v4__cppcheck {
 function variant__v5__gnb_usrp {
     VM_MEMORY=10240
     VM_CPU=8
-    NB_PATTERN_FILES=9
+    NB_PATTERN_FILES=7
     BUILD_OPTIONS="--gNB -w USRP"
 }
 
 function variant__v6__nr_ue_usrp {
     VM_MEMORY=4096
     VM_CPU=4
-    NB_PATTERN_FILES=9
+    NB_PATTERN_FILES=7
     BUILD_OPTIONS="--nrUE -w USRP"
 }
 
 function variant__v7__enb_ethernet {
     VM_MEMORY=4096
     ARCHIVES_LOC=enb_eth
-    NB_PATTERN_FILES=9
+    NB_PATTERN_FILES=7
     BUILD_OPTIONS="--eNB -w USRP"
 }
 
 function variant__v8__ue_ethernet {
     VM_MEMORY=4096
     ARCHIVES_LOC=ue_eth
-    NB_PATTERN_FILES=13
+    NB_PATTERN_FILES=11
     BUILD_OPTIONS="--UE -w USRP"
 }
 
@@ -247,6 +247,11 @@ function variant__v22__l2_sim {
     RUN_OPTIONS="complex"
 }
 
+function variant__v23__rf5g_sim {
+    ARCHIVES_LOC=rf5g_sim
+    RUN_OPTIONS="complex"
+}
+
 # Following function lists all variant__v<n>__<variant name> functions
 # and set the VARIANTS_SHORT and VARIANTS_LONG arrays from
 # the function names
diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py
index 470572f2ff50e1470ad735a5c6cb6348563d2bfa..5e3d8e388f8feca72c0aadbf3613554f9c90970e 100644
--- a/ci-scripts/ran.py
+++ b/ci-scripts/ran.py
@@ -94,6 +94,7 @@ class RANManagement():
 		self.runtime_stats= ''
 		self.datalog_rt_stats={}
 		self.eNB_Trace = '' #if 'yes', Tshark will be launched at initialization
+		self.USRPIPAddress = ''
 
 
 
@@ -341,20 +342,35 @@ class RANManagement():
 		self.testCase_id = HTML.testCase_id
 		mySSH = SSH.SSHConnection()
 		
+		#reboot USRP if requested in xml
+		if self.USRPIPAddress!='':
+			logging.debug('USRP '+ self.USRPIPAddress +'reboot request')
+			mySSH.open(lIpAddr, lUserName, lPassWord)
+			cmd2usrp='ssh root@'+self.USRPIPAddress+' reboot'
+			mySSH.command2(cmd2usrp,1)
+			mySSH.close()
+			logging.debug('Waiting for USRP to be ready')
+			time.sleep(120)
+
+
 		if (self.pStatus < 0):
 			HTML.CreateHtmlTestRow(self.air_interface[self.eNB_instance] + ' ' + self.Initialize_eNB_args, 'KO', self.pStatus)
 			HTML.CreateHtmlTabFooter(False)
 			sys.exit(1)
-		#Get pcap on S1 and X2 eNB interface, if enabled in the xml 
-		#will not work for gNB at this stage
-		if ((self.air_interface[self.eNB_instance] == 'lte-softmodem') or (self.air_interface[self.eNB_instance] == 'ocp-enb')) and self.eNB_Trace=='yes':
+
+		#Get pcap on enb and/or gnb if enabled in the xml 
+		if self.eNB_Trace=='yes':
+			if ((self.air_interface[self.eNB_instance] == 'lte-softmodem') or (self.air_interface[self.eNB_instance] == 'ocp-enb')):
+				pcapfile_prefix="enb_"
+			else:
+				pcapfile_prefix="gnb_"
 			mySSH.open(lIpAddr, lUserName, lPassWord)
 			mySSH.command('ip addr show | awk -f /tmp/active_net_interfaces.awk | egrep -v "lo|tun"', '\$', 5)
 			result = re.search('interfaceToUse=(?P<eth_interface>[a-zA-Z0-9\-\_]+)done', mySSH.getBefore())
 			if result is not None:
 				eth_interface = result.group('eth_interface')
 				logging.debug('\u001B[1m Launching tshark on interface ' + eth_interface + '\u001B[0m')
-				pcapfile = 'enb_' + self.testCase_id + '_s1x2log.pcap'
+				pcapfile = pcapfile_prefix + self.testCase_id + '_log.pcap'
 				mySSH.command('echo ' + lPassWord + ' | sudo -S rm -f /tmp/' + pcapfile , '\$', 5)
 				mySSH.command('echo $USER; nohup sudo -E tshark  -i ' + eth_interface + ' -w /tmp/' + pcapfile + ' 2>&1 &','\$', 5)
 			mySSH.close()
@@ -672,10 +688,11 @@ class RANManagement():
 		mySSH.open(self.eNBIPAddress, self.eNBUserName, self.eNBPassword)
 		mySSH.command('cd ' + self.eNBSourceCodePath, '\$', 5)
 		mySSH.command('cd cmake_targets', '\$', 5)
-		mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/enb_*_s1x2log.pcap .','\$',20)
+		mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/enb_*.pcap .','\$',20)
+		mySSH.command('echo ' + self.eNBPassword + ' | sudo -S mv /tmp/gnb_*.pcap .','\$',20)
 		mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm -f enb.log.zip', '\$', 5)
-		mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip enb*.log core* enb_*record.raw enb_*.pcap enb_*txt physim_*.log *stats.log', '\$', 60)
-		mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap enb_*txt physim_*.log *stats.log', '\$', 5)
+		mySSH.command('echo ' + self.eNBPassword + ' | sudo -S zip enb.log.zip enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log', '\$', 60)
+		mySSH.command('echo ' + self.eNBPassword + ' | sudo -S rm enb*.log core* enb_*record.raw enb_*.pcap gnb_*.pcap enb_*txt physim_*.log *stats.log', '\$', 5)
 		mySSH.close()
 
 	def AnalyzeLogFile_eNB(self, eNBlogFile, HTML):
@@ -921,8 +938,9 @@ class RANManagement():
 				if result is not None:
 					#remove 1- all useless char before relevant info  2- trailing char
 					line=line.replace('[0m','')
-					tmp=re.match(rf'^.*?(\b{k}\b.*)',line.rstrip()) #from python 3.6 we can use literal string interpolation for the variable k, using rf' in the regex 
-					real_time_stats[k]=tmp.group(1)
+					tmp=re.match(rf'^.*?(\b{k}\b.*)',line.rstrip()) #from python 3.6 we can use literal string interpolation for the variable k, using rf' in the regex
+					if tmp!=None: #with ULULULUULULULLLL at the head of the line, we skip it
+						real_time_stats[k]=tmp.group(1)
 
 			#count "problem receiving samples" msg
 			result = re.search('\[PHY\]\s+problem receiving samples', str(line))
diff --git a/ci-scripts/reportBuildLocally.sh b/ci-scripts/reportBuildLocally.sh
index eab005c7408cb3ad4a6c28020d1d65e29b62abd4..8b6db9261a57945d5c2621d7ef5a7229dddb83f6 100755
--- a/ci-scripts/reportBuildLocally.sh
+++ b/ci-scripts/reportBuildLocally.sh
@@ -576,8 +576,6 @@ function report_build {
     summary_table_row "RF Simulator - Release 15" ./archives/enb_eth/rfsimulator.Rel15.txt "Built target rfsimulator" ./enb_eth_row5.html
     summary_table_row "TCP OAI Bridge - Release 15" ./archives/enb_eth/tcp_bridge_oai.Rel15.txt "Built target tcp_bridge_oai" ./enb_eth_row6.html
     summary_table_row "OAI USRP device if - Release 15" ./archives/enb_eth/oai_usrpdevif.Rel15.txt "Built target oai_usrpdevif" ./enb_eth_row7.html
-    summary_table_row "NASMESH - Release 15" ./archives/enb_eth/nasmesh.Rel15.txt "Built target nasmesh" ./enb_eth_row8.html
-    summary_table_row "RB Tool - Release 15" ./archives/enb_eth/rb_tool.Rel15.txt "Built target rb_tool" ./enb_eth_row9.html
     summary_table_footer
 
     summary_table_header "OAI Build: 4G LTE UE -- USRP option" ./archives/ue_eth
@@ -600,9 +598,7 @@ function report_build {
     summary_table_row "Coding - Release 15" ./archives/basic_sim/coding.Rel15.txt "Built target coding" ./basic_sim_row3.html
     summary_table_row "Conf 2 UE data - Release 15" ./archives/basic_sim/conf2uedata.Rel15.txt "Built target conf2uedata" ./basic_sim_row4.html
     summary_table_row "OAI ETHERNET transport - Release 15" ./archives/basic_sim/oai_eth_transpro.Rel15.txt "Built target oai_eth_transpro" ./basic_sim_row5.html
-    summary_table_row "NASMESH - Release 15" ./archives/basic_sim/nasmesh.Rel15.txt "Built target nasmesh" ./basic_sim_row6.html
     summary_table_row "Parameters Lib Config - Release 15" ./archives/basic_sim/params_libconfig.Rel15.txt "Built target params_libconfig" ./basic_sim_row7.html
-    summary_table_row "RB Tool - Release 15" ./archives/basic_sim/rb_tool.Rel15.txt "Built target rb_tool" ./basic_sim_row8.html
     summary_table_row "RF Simulator - Release 15" ./archives/basic_sim/rfsimulator.Rel15.txt "Built target rfsimulator" ./basic_sim_row9.html
     summary_table_row "TCP Bridge - Release 15" ./archives/basic_sim/tcp_bridge_oai.Rel15.txt "Built target tcp_bridge_oai" ./basic_sim_row10.html
     summary_table_row "UE IP - Release 15" ./archives/basic_sim/ue_ip.Rel15.txt "Built target ue_ip" ./basic_sim_row11.html
@@ -617,9 +613,7 @@ function report_build {
         summary_table_row "Coding - Release 15" ./archives/gnb_usrp/coding.Rel15.txt "Built target coding" ./gnb_usrp_row2.html
         summary_table_row "OAI USRP device if - Release 15" ./archives/gnb_usrp/oai_usrpdevif.Rel15.txt "Built target oai_usrpdevif" ./gnb_usrp_row3.html
         summary_table_row "OAI ETHERNET transport - Release 15" ./archives/gnb_usrp/oai_eth_transpro.Rel15.txt "Built target oai_eth_transpro" ./gnb_usrp_row4.html
-        summary_table_row "NASMESH - Release 15" ./archives/gnb_usrp/nasmesh.Rel15.txt "Built target nasmesh" ./gnb_usrp_row5.html
         summary_table_row "Parameters Lib Config - Release 15" ./archives/gnb_usrp/params_libconfig.Rel15.txt "Built target params_libconfig" ./gnb_usrp_row6.html
-        summary_table_row "RB Tool - Release 15" ./archives/gnb_usrp/rb_tool.Rel15.txt "Built target rb_tool" ./gnb_usrp_row7.html
         summary_table_footer
     fi
 
@@ -630,9 +624,7 @@ function report_build {
         summary_table_row "Coding - Release 15" ./archives/nr_ue_usrp/coding.Rel15.txt "Built target coding" ./nr_ue_usrp_row2.html
         summary_table_row "OAI USRP device if - Release 15" ./archives/nr_ue_usrp/oai_usrpdevif.Rel15.txt "Built target oai_usrpdevif" ./nr_ue_usrp_row3.html
         summary_table_row "OAI ETHERNET transport - Release 15" ./archives/nr_ue_usrp/oai_eth_transpro.Rel15.txt "Built target oai_eth_transpro" ./nr_ue_usrp_row4.html
-        summary_table_row "NASMESH - Release 15" ./archives/nr_ue_usrp/nasmesh.Rel15.txt "Built target nasmesh" ./nr_ue_usrp_row5.html
         summary_table_row "Parameters Lib Config - Release 15" ./archives/nr_ue_usrp/params_libconfig.Rel15.txt "Built target params_libconfig" ./nr_ue_usrp_row6.html
-        summary_table_row "RB Tool - Release 15" ./archives/nr_ue_usrp/rb_tool.Rel15.txt "Built target rb_tool" ./nr_ue_usrp_row7.html
         summary_table_footer
     fi
 
@@ -652,7 +644,7 @@ function report_build {
     echo "   <button data-toggle=\"collapse\" data-target=\"#oai-compilation-details\">Details for Compilation Errors and Warnings </button>" >> ./build_results.html
     echo "   <div id=\"oai-compilation-details\" class=\"collapse\">" >> ./build_results.html
 
-    if [ -f ./enb_eth_row1.html ] || [ -f ./enb_eth_row2.html ] || [ -f ./enb_eth_row3.html ] || [ -f ./enb_eth_row4.html ] || [ -f ./enb_eth_row5.html ] || [ -f ./enb_eth_row6.html ] || [ -f ./enb_eth_row7.html ] || [ -f ./enb_eth_row8.html ] || [ -f ./enb_eth_row9.html ]
+    if [ -f ./enb_eth_row1.html ] || [ -f ./enb_eth_row2.html ] || [ -f ./enb_eth_row3.html ] || [ -f ./enb_eth_row4.html ] || [ -f ./enb_eth_row5.html ] || [ -f ./enb_eth_row6.html ] || [ -f ./enb_eth_row7.html ]
     then
         for DETAILS_TABLE in `ls ./enb_eth_row*.html`
         do
diff --git a/ci-scripts/reportTestLocally.sh b/ci-scripts/reportTestLocally.sh
index 7290507b4e4f52487207764191794f672489e366..19fac7fd781827e8d83b5bf470772eb03bcbaa9f 100755
--- a/ci-scripts/reportTestLocally.sh
+++ b/ci-scripts/reportTestLocally.sh
@@ -717,7 +717,11 @@ function report_test {
         done
         echo "   </table>" >> ./test_simulator_results.html
         echo "   </div>" >> ./test_simulator_results.html
+    fi
 
+    ARCHIVES_LOC=archives/rf5g_sim/test
+    if [ -d $ARCHIVES_LOC ]
+    then
         echo "   <h3>5G NR RF Simulator Check</h3>" >> ./test_simulator_results.html
 
         if [ -f $ARCHIVES_LOC/test_final_status.log ]
@@ -762,9 +766,9 @@ function report_test {
                 echo "      <tr bgcolor = \"#8FBC8F\" >" >> ./test_simulator_results.html
                 if [[ $CN_CONFIG =~ .*wS1.* ]]
                 then
-                    echo "          <td align = \"center\" colspan = 4 >Test with EPC (aka withS1): ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
+                    echo "          <td align = \"center\" colspan = 4 >Test with CN5G : ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
                 else
-                    echo "          <td align = \"center\" colspan = 4 >Test without EPC (aka noS1): ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
+                    echo "          <td align = \"center\" colspan = 4 >Test without CN5G : ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
                 fi
                 echo "      </tr>" >> ./test_simulator_results.html
 
@@ -837,9 +841,9 @@ function report_test {
                 echo "      <tr bgcolor = \"#8FBC8F\" >" >> ./test_simulator_results.html
                 if [[ $CN_CONFIG =~ .*wS1.* ]]
                 then
-                    echo "          <td align = \"center\" colspan = 4 >Test with EPC (aka withS1): ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
+                    echo "          <td align = \"center\" colspan = 4 >Test with CN5G : ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
                 else
-                    echo "          <td align = \"center\" colspan = 4 >Test without EPC (aka noS1): ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
+                    echo "          <td align = \"center\" colspan = 4 >Test without CN5G : ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
                 fi
                 echo "      </tr>" >> ./test_simulator_results.html
 
@@ -907,9 +911,9 @@ function report_test {
                 echo "      <tr bgcolor = \"#8FBC8F\" >" >> ./test_simulator_results.html
                 if [[ $CN_CONFIG =~ .*wS1.* ]]
                 then
-                    echo "          <td align = \"center\" colspan = 4 >Test with EPC (aka withS1): ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
+                    echo "          <td align = \"center\" colspan = 4 >Test with CN5G : ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
                 else
-                    echo "          <td align = \"center\" colspan = 4 >Test without EPC (aka noS1): ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
+                    echo "          <td align = \"center\" colspan = 4 >Test without CN5G : ${TMODE} -- ${BW}PRB -- ${FR_MODE}</td>" >> ./test_simulator_results.html
                 fi
                 echo "      </tr>" >> ./test_simulator_results.html
 
diff --git a/ci-scripts/runTestOnVM.sh b/ci-scripts/runTestOnVM.sh
index 058d64b0ba21a33b679f66bf4b4e85ee176924f6..de696cdc64b77cb03be90a6d91080fd05e5f837e 100755
--- a/ci-scripts/runTestOnVM.sh
+++ b/ci-scripts/runTestOnVM.sh
@@ -1355,8 +1355,11 @@ function start_rf_sim_gnb {
     ssh -T -o StrictHostKeyChecking=no ubuntu@$LOC_GNB_VM_IP_ADDR < $1
     rm $1
     # Copy the RAW files from the gNB run for the NR-UE
-    scp -o StrictHostKeyChecking=no ubuntu@$LOC_GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/ran_build/build/rbconfig.raw .
-    scp -o StrictHostKeyChecking=no ubuntu@$LOC_GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/ran_build/build/reconfig.raw .
+    if [ $LOC_RA_SA_TEST -ne 2 ]
+    then
+        scp -o StrictHostKeyChecking=no ubuntu@$LOC_GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/ran_build/build/rbconfig.raw .
+        scp -o StrictHostKeyChecking=no ubuntu@$LOC_GNB_VM_IP_ADDR:/home/ubuntu/tmp/cmake_targets/ran_build/build/reconfig.raw .
+    fi
 }
 
 function start_rf_sim_nr_ue {
@@ -1371,8 +1374,11 @@ function start_rf_sim_nr_ue {
     local LOC_RA_SA_TEST=$8
 
     # Copy the RAW files from the gNB run
-    scp -o StrictHostKeyChecking=no rbconfig.raw ubuntu@$LOC_NR_UE_VM_IP_ADDR:/home/ubuntu/tmp
-    scp -o StrictHostKeyChecking=no reconfig.raw ubuntu@$LOC_NR_UE_VM_IP_ADDR:/home/ubuntu/tmp
+    if [ $LOC_RA_SA_TEST -ne 2 ]
+    then
+        scp -o StrictHostKeyChecking=no rbconfig.raw ubuntu@$LOC_NR_UE_VM_IP_ADDR:/home/ubuntu/tmp
+        scp -o StrictHostKeyChecking=no reconfig.raw ubuntu@$LOC_NR_UE_VM_IP_ADDR:/home/ubuntu/tmp
+    fi
 
     echo "echo \"sudo apt-get --yes --quiet install daemon \"" > $1
     echo "sudo apt-get --yes install daemon >> /home/ubuntu/tmp/cmake_targets/log/daemon-install.txt 2>&1" >> $1
@@ -1380,8 +1386,12 @@ function start_rf_sim_nr_ue {
     echo "export RFSIMULATOR=${LOC_GNB_VM_IP_ADDR}" >> $1
     echo "echo \"cd /home/ubuntu/tmp/cmake_targets/ran_build/build/\"" >> $1
     echo "sudo chmod 777 /home/ubuntu/tmp/cmake_targets/ran_build/build/" >> $1
-    echo "sudo cp /home/ubuntu/tmp/r*config.raw /home/ubuntu/tmp/cmake_targets/ran_build/build/" >> $1
-    echo "sudo chmod 666 /home/ubuntu/tmp/cmake_targets/ran_build/build/r*config.raw" >> $1
+    echo "sudo rm -f /home/ubuntu/tmp/cmake_targets/ran_build/build/r*config.raw" >> $1
+    if [ $LOC_RA_SA_TEST -ne 2 ]
+    then
+        echo "sudo cp /home/ubuntu/tmp/r*config.raw /home/ubuntu/tmp/cmake_targets/ran_build/build/" >> $1
+        echo "sudo chmod 666 /home/ubuntu/tmp/cmake_targets/ran_build/build/r*config.raw" >> $1
+    fi
     echo "cd /home/ubuntu/tmp/cmake_targets/ran_build/build/" >> $1
     if [ $LOC_S1_CONFIGURATION -eq 0 ]
     then
@@ -1472,11 +1482,13 @@ function run_test_on_vm {
         UE_VM_CMDS=${UE_VM_NAME}_cmds.txt
         echo "UE_VM_NAME          = $UE_VM_NAME"
         echo "UE_VM_CMD_FILE      = $UE_VM_CMDS"
-        GNB_VM_NAME=`echo $VM_NAME | sed -e "s#l2-sim#gnb-usrp#" -e "s#rf-sim#gnb-usrp#"`
+    elif [[ (( "$RUN_OPTIONS" == "complex" ) && ( $VM_NAME =~ .*-rf5g-sim.* ))  ]]
+    then
+        GNB_VM_NAME=`echo $VM_NAME | sed -e "s#rf5g-sim#gnb-usrp#"`
         GNB_VM_CMDS=${GNB_VM_NAME}_cmds.txt
         echo "GNB_VM_NAME         = $GNB_VM_NAME"
         echo "GNB_VM_CMD_FILE     = $GNB_VM_CMDS"
-        NR_UE_VM_NAME=`echo $VM_NAME | sed -e "s#l2-sim#nr-ue-usrp#" -e "s#rf-sim#nr-ue-usrp#"`
+        NR_UE_VM_NAME=`echo $VM_NAME | sed -e "s#rf5g-sim#nr-ue-usrp#"`
         NR_UE_VM_CMDS=${UE_VM_NAME}_cmds.txt
         echo "NR_UE_VM_NAME       = $NR_UE_VM_NAME"
         echo "NR_UE_VM_CMD_FILE   = $NR_UE_VM_CMDS"
@@ -1505,6 +1517,8 @@ function run_test_on_vm {
         UE_VM_IP_ADDR=`uvt-kvm ip $UE_VM_NAME`
         echo "$UE_VM_NAME has for IP addr = $UE_VM_IP_ADDR"
 
+    elif [[ (( "$RUN_OPTIONS" == "complex" ) && ( $VM_NAME =~ .*-rf5g-sim.* ))  ]]
+    then
         echo "############################################################"
         echo "Waiting for GNB VM to be started"
         echo "############################################################"
@@ -2239,14 +2253,23 @@ function run_test_on_vm {
 
     fi
 
-    if [[ "$RUN_OPTIONS" == "complex" ]] && [[ $VM_NAME =~ .*-rf-sim.* ]]
+    if [[ "$RUN_OPTIONS" == "complex" ]] && [[ $VM_NAME =~ .*-rf5g-sim.* ]]
     then
+        PING_STATUS=0
+        IPERF_STATUS=0
+        NR_STATUS=0
+        if [ -d $ARCHIVES_LOC ]
+        then
+            rm -Rf $ARCHIVES_LOC
+        fi
+        mkdir --parents $ARCHIVES_LOC
+
         echo "############################################################"
         echo "SA TEST"
         echo "############################################################"
         #SA test, attention : has a different config file from the rest of the test
         CN_CONFIG="noS1"
-        CONF_FILE=gnb.band78.sa.fr1.106PRB.usrpb210.conf 
+        CONF_FILE=gnb.band78.sa.fr1.106PRB.usrpn310.conf
         S1_NOS1_CFG=0
         PRB=106
         FREQUENCY=3510
@@ -2257,7 +2280,6 @@ function run_test_on_vm {
         fi
 
         local try_cnt=0
-        NR_STATUS=0
 
         ######### start of SA TEST loop
         while [ $try_cnt -lt 5 ] #5 because it hardly succeed within CI
@@ -2314,6 +2336,7 @@ function run_test_on_vm {
                 echo "try_cnt = " $try_cnt
                 try_cnt=$((try_cnt+1))
             else
+                echo "SA test OK"
                 try_cnt=$((try_cnt+10))
             fi
         done
@@ -2339,14 +2362,14 @@ function run_test_on_vm {
         fi
 
         local try_cnt=0
-        NR_STATUS=0
 
         ######### start of RA TEST loop
+        RA_FR2_STATUS=0
         while [ $try_cnt -lt 5 ] #5 because it hardly succeed within CI
         do
 
             SYNC_STATUS=0
-            RA_FR2_STATUS=0
+            RA_STATUS=0
             rm -f $ARCHIVES_LOC/tdd_${PRB}prb_${CN_CONFIG}*ra_fr2_test.log
 
             echo "############################################################"
@@ -2390,12 +2413,15 @@ function run_test_on_vm {
 
             # Proper check to be done when RA test is working!
             check_ra_result $ARCHIVES_LOC/$CURRENT_GNB_LOG_FILE $ARCHIVES_LOC/$CURRENT_NR_UE_LOG_FILE
-            if [ $RA_FR2_STATUS -ne 0 ]
+            if [ $RA_STATUS -ne 0 ]
             then
                 echo "RA FR2 test NOT OK"
                 echo "try_cnt = " $try_cnt
                 try_cnt=$((try_cnt+1))
+                RA_FR2_STATUS=-1
             else
+                echo "RA FR2 test OK"
+                RA_FR2_STATUS=0
                 try_cnt=$((try_cnt+10))
             fi
         done
@@ -2439,8 +2465,8 @@ function run_test_on_vm {
             FREQUENCY=3510
           fi
 
+          RA_FR1_STATUS=0
           local try_cnt=0
-          NR_STATUS=0
           while [ $try_cnt -lt 5 ] #5 because it hardly succeed within CI
 
           do
@@ -2493,8 +2519,11 @@ function run_test_on_vm {
             then
                 echo "RA FR1 test NOT OK"
                 echo "try_cnt = " $try_cnt
+                RA_FR1_STATUS=-1
                 try_cnt=$((try_cnt+1))
             else
+                echo "RA FR1 test OK"
+                RA_FR1_STATUS=0
                 try_cnt=$((try_cnt+10))
             fi
           done
@@ -2629,17 +2658,17 @@ function run_test_on_vm {
 
         if [ $SA_STATUS -ne 0 ]; then NR_STATUS=-1; fi     
         if [ $RA_FR2_STATUS -ne 0 ]; then NR_STATUS=-1; fi        
-        if [ $RA_STATUS -ne 0 ]; then NR_STATUS=-1; fi
+        if [ $RA_FR1_STATUS -ne 0 ]; then NR_STATUS=-1; fi
         if [ $SYNC_STATUS -ne 0 ]; then NR_STATUS=-1; fi
         if [ $PING_STATUS -ne 0 ]; then NR_STATUS=-1; fi
         if [ $IPERF_STATUS -ne 0 ]; then NR_STATUS=-1; fi
         if [ $NR_STATUS -eq 0 ]
         then
             echo "5G-NR RFSIM seems OK"
-            echo "5G-NR: TEST_OK" >> $ARCHIVES_LOC/test_final_status.log
+            echo "5G-NR: TEST_OK" > $ARCHIVES_LOC/test_final_status.log
         else
             echo "5G-NR RFSIM seems to FAIL"
-            echo "5G-NR: TEST_KO" >> $ARCHIVES_LOC/test_final_status.log
+            echo "5G-NR: TEST_KO" > $ARCHIVES_LOC/test_final_status.log
             STATUS=-1
         fi
     fi
diff --git a/ci-scripts/xml_class_list.yml b/ci-scripts/xml_class_list.yml
index a43e5b79c01a33b54146edad0976624e8ccb523e..d8e1b26a215ddabafbea38471a0c6f0b34e71f86 100755
--- a/ci-scripts/xml_class_list.yml
+++ b/ci-scripts/xml_class_list.yml
@@ -41,3 +41,7 @@
   - Undeploy_Object
   - Cppcheck_Analysis
   - Deploy_Run_PhySim
+  - DeployGenObject
+  - UndeployGenObject
+  - PingFromContainer
+  - IperfFromContainer
diff --git a/ci-scripts/xml_files/container_4g_rfsim.xml b/ci-scripts/xml_files/container_4g_rfsim.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5430b2b0567ea92703cbf25f967d38cc8a9e3af4
--- /dev/null
+++ b/ci-scripts/xml_files/container_4g_rfsim.xml
@@ -0,0 +1,129 @@
+<!--
+
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+      contact@openairinterface.org
+
+-->
+<testCaseList>
+        <htmlTabRef>rfsim-4glte</htmlTabRef>
+        <htmlTabName>Testing 4G LTE RF sim in containers</htmlTabName>
+        <htmlTabIcon>wrench</htmlTabIcon>
+        <TestCaseRequestedList>
+ 100011
+ 000011
+ 000001
+ 000012
+ 000002
+ 000013
+ 000001
+ 000014
+ 000002
+ 020011
+ 020012
+ 030011
+ 030012
+ 100011
+        </TestCaseRequestedList>
+        <TestCaseExclusionList></TestCaseExclusionList>
+
+        <testCase id="000011">
+                <class>DeployGenObject</class>
+                <desc>Deploy Cassandra Database</desc>
+                <yaml_path>yaml_files/4g_rfsimulator</yaml_path>
+                <services>cassandra db_init</services>
+                <nb_healthy>1</nb_healthy>
+        </testCase>
+
+        <testCase id="000001">
+                <class>IdleSleep</class>
+                <desc>Sleep</desc>
+                <idle_sleep_time_in_sec>30</idle_sleep_time_in_sec>
+        </testCase>
+
+        <testCase id="000002">
+                <class>IdleSleep</class>
+                <desc>Sleep</desc>
+                <idle_sleep_time_in_sec>10</idle_sleep_time_in_sec>
+        </testCase>
+
+        <testCase id="000012">
+                <class>DeployGenObject</class>
+                <desc>Deploy OAI 4G CoreNetwork</desc>
+                <yaml_path>yaml_files/4g_rfsimulator</yaml_path>
+                <services>oai_hss oai_mme oai_spgwc oai_spgwu trf_gen</services>
+                <nb_healthy>6</nb_healthy>
+        </testCase>
+
+        <testCase id="000013">
+                <class>DeployGenObject</class>
+                <desc>Deploy OAI 4G eNB RF sim</desc>
+                <yaml_path>yaml_files/4g_rfsimulator</yaml_path>
+                <services>enb</services>
+                <nb_healthy>7</nb_healthy>
+        </testCase>
+
+        <testCase id="000014">
+                <class>DeployGenObject</class>
+                <desc>Deploy OAI 4G NR-UE RF sim</desc>
+                <yaml_path>yaml_files/4g_rfsimulator</yaml_path>
+                <services>oai_ue0</services>
+                <nb_healthy>8</nb_healthy>
+        </testCase>
+
+        <testCase id="020011">
+                <class>PingFromContainer</class>
+                <desc>Ping Traffic-Gen from LTE-UE</desc>
+                <container_name>rfsim4g-oai-lte-ue0</container_name>
+                <options>-I oaitun_ue1 -c 20 192.168.61.11</options>
+                <loss_threshold>5</loss_threshold>
+        </testCase>
+
+        <testCase id="020012">
+                <class>PingFromContainer</class>
+                <desc>Ping LTE-UE from Traffic-Gen</desc>
+		<container_name>rfsim4g-trf-gen</container_name>
+                <options>-c 20 12.0.0.2</options>
+                <loss_threshold>5</loss_threshold>
+        </testCase>
+
+        <testCase id="030011">
+                <class>IperfFromContainer</class>
+                <desc>Iperf UDP Downlink</desc>
+                <server_container_name>rfsim4g-oai-lte-ue0</server_container_name>
+                <client_container_name>rfsim4g-trf-gen</client_container_name>
+                <server_options>-B 12.0.0.2 -u -i 1 -s</server_options>
+                <client_options>-c 12.0.0.2 -u -i 1 -t 30 -b 2M</client_options>
+        </testCase>
+
+        <testCase id="030012">
+                <class>IperfFromContainer</class>
+                <desc>Iperf UDP Uplink</desc>
+                <server_container_name>rfsim4g-trf-gen</server_container_name>
+                <client_container_name>rfsim4g-oai-lte-ue0</client_container_name>
+                <server_options>-u -i 1 -s</server_options>
+                <client_options>-B 12.0.0.2 -c 192.168.61.11 -u -i 1 -t 30 -b 1M</client_options>
+        </testCase>
+
+        <testCase id="100011">
+                <class>UndeployGenObject</class>
+                <desc>Undeploy all OAI 4G stack</desc>
+                <yaml_path>yaml_files/4g_rfsimulator</yaml_path>
+        </testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/container_4g_rfsim_down.xml b/ci-scripts/xml_files/container_4g_rfsim_down.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dee516d9248e1ea3dd2141dca5fa7f5e2987f3d2
--- /dev/null
+++ b/ci-scripts/xml_files/container_4g_rfsim_down.xml
@@ -0,0 +1,38 @@
+<!--
+
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+      contact@openairinterface.org
+
+-->
+<testCaseList>
+        <htmlTabRef>rfsim-4glte-down</htmlTabRef>
+        <htmlTabName>CleanUp 4G RF</htmlTabName>
+        <htmlTabIcon>trash</htmlTabIcon>
+        <TestCaseRequestedList>
+ 100011
+        </TestCaseRequestedList>
+        <TestCaseExclusionList></TestCaseExclusionList>
+
+        <testCase id="100011">
+                <class>UndeployGenObject</class>
+                <desc>Undeploy all OAI 4G stack</desc>
+                <yaml_path>yaml_files/4g_rfsimulator</yaml_path>
+        </testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_rfsim.xml b/ci-scripts/xml_files/container_5g_rfsim.xml
new file mode 100644
index 0000000000000000000000000000000000000000..660cd7cde86090c0739d6c1fa94ba7393c90703e
--- /dev/null
+++ b/ci-scripts/xml_files/container_5g_rfsim.xml
@@ -0,0 +1,104 @@
+<!--
+
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+      contact@openairinterface.org
+
+-->
+<testCaseList>
+        <htmlTabRef>rfsim-5gnr</htmlTabRef>
+        <htmlTabName>Testing 5G NR RF sim in containers</htmlTabName>
+        <htmlTabIcon>wrench</htmlTabIcon>
+        <TestCaseRequestedList>
+ 100001
+ 000001
+ 000002
+ 000003
+ 020001
+ 020002
+ 030001
+ 030002
+ 100001
+        </TestCaseRequestedList>
+        <TestCaseExclusionList></TestCaseExclusionList>
+
+        <testCase id="000001">
+                <class>DeployGenObject</class>
+                <desc>Deploy OAI 5G CoreNetwork</desc>
+                <yaml_path>yaml_files/5g_rfsimulator</yaml_path>
+                <services>mysql oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn</services>
+                <nb_healthy>6</nb_healthy>
+        </testCase>
+
+        <testCase id="000002">
+                <class>DeployGenObject</class>
+                <desc>Deploy OAI 5G gNB RF sim SA</desc>
+                <yaml_path>yaml_files/5g_rfsimulator</yaml_path>
+                <services>oai-gnb</services>
+                <nb_healthy>7</nb_healthy>
+        </testCase>
+
+        <testCase id="000003">
+                <class>DeployGenObject</class>
+                <desc>Deploy OAI 5G NR-UE RF sim SA</desc>
+                <yaml_path>yaml_files/5g_rfsimulator</yaml_path>
+                <services>oai-nr-ue</services>
+                <nb_healthy>8</nb_healthy>
+        </testCase>
+
+        <testCase id="020001">
+                <class>PingFromContainer</class>
+                <desc>Ping ext-dn from NR-UE</desc>
+                <container_name>rfsim5g-oai-nr-ue</container_name>
+                <options>-I oaitun_ue1 -c 20 192.168.72.135</options>
+                <loss_threshold>5</loss_threshold>
+        </testCase>
+
+        <testCase id="020002">
+                <class>PingFromContainer</class>
+                <desc>Ping NR-UE from ext-dn</desc>
+		<container_name>rfsim5g-oai-ext-dn</container_name>
+                <options>-c 20 12.1.1.2</options>
+                <loss_threshold>5</loss_threshold>
+        </testCase>
+
+        <testCase id="030001">
+                <class>IperfFromContainer</class>
+                <desc>Iperf UDP Downlink</desc>
+                <server_container_name>rfsim5g-oai-nr-ue</server_container_name>
+                <client_container_name>rfsim5g-oai-ext-dn</client_container_name>
+                <server_options>-B 12.1.1.2 -u -i 1 -s</server_options>
+                <client_options>-c 12.1.1.2 -u -i 1 -t 30 -b 400K</client_options>
+        </testCase>
+
+        <testCase id="030002">
+                <class>IperfFromContainer</class>
+                <desc>Iperf UDP Uplink</desc>
+                <server_container_name>rfsim5g-oai-ext-dn</server_container_name>
+                <client_container_name>rfsim5g-oai-nr-ue</client_container_name>
+                <server_options>-u -i 1 -s</server_options>
+                <client_options>-B 12.1.1.2 -c 192.168.72.135 -u -i 1 -t 30 -b 20K</client_options>
+        </testCase>
+
+        <testCase id="100001">
+                <class>UndeployGenObject</class>
+                <desc>Undeploy all OAI 5G stack</desc>
+                <yaml_path>yaml_files/5g_rfsimulator</yaml_path>
+        </testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/container_5g_rfsim_down.xml b/ci-scripts/xml_files/container_5g_rfsim_down.xml
new file mode 100644
index 0000000000000000000000000000000000000000..57b0f67a214c297fe86648559e29aaf04012c1f7
--- /dev/null
+++ b/ci-scripts/xml_files/container_5g_rfsim_down.xml
@@ -0,0 +1,38 @@
+<!--
+
+ Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The OpenAirInterface Software Alliance licenses this file to You under
+ the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ except in compliance with the License.
+ You may obtain a copy of the License at
+
+      http://www.openairinterface.org/?page_id=698
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ For more information about the OpenAirInterface (OAI) Software Alliance:
+      contact@openairinterface.org
+
+-->
+<testCaseList>
+        <htmlTabRef>rfsim-5gnr-down</htmlTabRef>
+        <htmlTabName>CleanUp 5G RF</htmlTabName>
+        <htmlTabIcon>trash</htmlTabIcon>
+        <TestCaseRequestedList>
+ 100002
+        </TestCaseRequestedList>
+        <TestCaseExclusionList></TestCaseExclusionList>
+
+        <testCase id="100002">
+                <class>UndeployGenObject</class>
+                <desc>Undeploy all OAI 5G stack</desc>
+                <yaml_path>yaml_files/5g_rfsimulator</yaml_path>
+        </testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/fr1_gnb_build.xml b/ci-scripts/xml_files/fr1_gnb_build.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d0c91f407df41d8d58543ade502653440e31dba1
--- /dev/null
+++ b/ci-scripts/xml_files/fr1_gnb_build.xml
@@ -0,0 +1,50 @@
+<!--
+
+ 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>build-tab</htmlTabRef>
+	<htmlTabName>Build</htmlTabName>
+	<htmlTabIcon>wrench</htmlTabIcon>
+	<TestCaseRequestedList>
+ 000001
+ 000002
+	</TestCaseRequestedList>
+	<TestCaseExclusionList></TestCaseExclusionList>
+
+	<testCase id="000001">
+		<class>Build_eNB</class>
+		<desc>Build gNB</desc>
+		<Build_eNB_args>-w USRP -c --gNB --ninja</Build_eNB_args>
+		<eNB_instance>0</eNB_instance>
+		<eNB_serverId>0</eNB_serverId>
+		<backgroundBuild>True</backgroundBuild>
+		<forced_workspace_cleanup>True</forced_workspace_cleanup>
+	</testCase>
+
+	<testCase id="000002">
+		<class>WaitEndBuild_eNB</class>
+		<desc>Wait for end of Build gNB</desc>
+		<eNB_instance>0</eNB_instance>
+		<eNB_serverId>0</eNB_serverId>
+	</testCase>
+
+</testCaseList>
diff --git a/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml b/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a8e385b854120a2451253e4fd42c9c4aff314b11
--- /dev/null
+++ b/ci-scripts/xml_files/fr1_nsa_2x2_quectel.xml
@@ -0,0 +1,146 @@
+<!--
+
+ 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>TEST-NSA-FR1-TM1</htmlTabRef>
+	<htmlTabName>NSA Ping DL UL with QUECTEL</htmlTabName>
+	<htmlTabIcon>tasks</htmlTabIcon>
+	<repeatCount>1</repeatCount>
+	<TestCaseRequestedList>
+ 030000
+ 040000
+ 000002
+ 010000
+ 000001
+ 050000
+ 000001
+ 010002
+ 080001
+ 080000
+	</TestCaseRequestedList>
+	<TestCaseExclusionList></TestCaseExclusionList>
+
+	<testCase id="010000">
+		<class>Initialize_UE</class>
+		<desc>Initialize Quectel</desc>
+		<id>nrmodule2_quectel</id>
+		<UE_Trace>yes</UE_Trace>
+	</testCase>
+
+
+	<testCase id="010002">
+		<class>Terminate_UE</class>
+		<desc>Terminate Quectel</desc>
+		<id>nrmodule2_quectel</id>
+	</testCase>
+
+
+	<testCase id="030000">
+		<class>Initialize_eNB</class>
+		<desc>Initialize eNB</desc>
+		<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band38.nsa_2x2.100PRB.usrpn310.conf</Initialize_eNB_args>
+		<eNB_instance>0</eNB_instance>
+		<eNB_serverId>0</eNB_serverId>
+		<air_interface>lte</air_interface>
+		<eNB_Trace>yes</eNB_Trace>
+		<USRP_IPAddress>192.168.18.241</USRP_IPAddress>
+	</testCase>
+
+
+	<testCase id="040000">
+		<class>Initialize_eNB</class>
+		<desc>Initialize gNB</desc>
+		<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.nsa_2x2.106PRB.usrpn310.conf -q</Initialize_eNB_args>
+		<eNB_instance>1</eNB_instance>
+		<eNB_serverId>1</eNB_serverId>
+		<air_interface>nr</air_interface>
+		<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
+	</testCase>
+
+	<testCase id="000001">
+		<class>IdleSleep</class>
+		<desc>Sleep</desc>
+		<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
+	</testCase>
+
+	<testCase id="000002">
+		<class>IdleSleep</class>
+		<desc>Sleep</desc>
+		<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
+	</testCase>
+
+
+	<testCase id="050000">
+		<class>Ping</class>
+		<desc>Ping: 20pings in 20sec</desc>
+		<id>nrmodule2_quectel</id>
+		<ping_args>-c 20</ping_args>
+		<ping_packetloss_threshold>50</ping_packetloss_threshold>
+	</testCase>
+
+	<testCase id="050001">
+		<class>Ping</class>
+		<desc>Ping: 100pings in 20sec</desc>
+		<id>nrmodule2_quectel</id>
+		<ping_args>-c 100 -i 0.2</ping_args>
+		<ping_packetloss_threshold>50</ping_packetloss_threshold>
+	</testCase>
+
+	<testCase id="070000">
+		<class>Iperf</class>
+		<desc>iperf (DL/20Mbps/UDP)(60 sec)(single-ue profile)</desc>
+		<iperf_args>-u -b 20M -t 60</iperf_args>
+		<direction>DL</direction>
+		<id>nrmodule2_quectel</id>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>single-ue</iperf_profile>
+	</testCase>
+
+	<testCase id="070001">
+		<class>Iperf</class>
+		<desc>iperf (UL/3Mbps/UDP)(60 sec)(single-ue profile)</desc>
+		<iperf_args>-u -b 3M -t 60</iperf_args>
+		<direction>UL</direction>
+		<id>nrmodule2_quectel</id>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>single-ue</iperf_profile>
+	</testCase>
+
+
+	<testCase id="080000">
+		<class>Terminate_eNB</class>
+		<desc>Terminate eNB</desc>
+		<eNB_instance>0</eNB_instance>
+		<eNB_serverId>0</eNB_serverId>
+		<air_interface>lte</air_interface>
+	</testCase>
+
+	<testCase id="080001">
+		<class>Terminate_eNB</class>
+		<desc>Terminate gNB</desc>
+		<eNB_instance>1</eNB_instance>
+		<eNB_serverId>1</eNB_serverId>
+		<air_interface>nr</air_interface>
+	</testCase>
+
+</testCaseList>
+
diff --git a/ci-scripts/xml_files/fr1_nsa_quectel.xml b/ci-scripts/xml_files/fr1_nsa_quectel.xml
index 7ec3a5f1402ceb1d6365c731b6d467235a01ceda..6c11a66d912bd29a94075f7db2819a4a5185ed4a 100644
--- a/ci-scripts/xml_files/fr1_nsa_quectel.xml
+++ b/ci-scripts/xml_files/fr1_nsa_quectel.xml
@@ -97,7 +97,7 @@
 		<desc>Ping: 20pings in 20sec</desc>
 		<id>idefix</id>
 		<ping_args>-c 20</ping_args>
-		<ping_packetloss_threshold>50</ping_packetloss_threshold>
+		<ping_packetloss_threshold>1</ping_packetloss_threshold>
 	</testCase>
 
 	<testCase id="050001">
@@ -105,7 +105,7 @@
 		<desc>Ping: 100pings in 20sec</desc>
 		<id>idefix</id>
 		<ping_args>-c 100 -i 0.2</ping_args>
-		<ping_packetloss_threshold>50</ping_packetloss_threshold>
+		<ping_packetloss_threshold>1</ping_packetloss_threshold>
 	</testCase>
 
 	<testCase id="070000">
@@ -114,7 +114,7 @@
 		<iperf_args>-u -b 20M -t 60</iperf_args>
 		<direction>DL</direction>
 		<id>idefix</id>
-		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_packetloss_threshold>3</iperf_packetloss_threshold>
 		<iperf_profile>single-ue</iperf_profile>
 	</testCase>
 
@@ -124,7 +124,7 @@
 		<iperf_args>-u -b 3M -t 60</iperf_args>
 		<direction>UL</direction>
 		<id>idefix</id>
-		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
 		<iperf_profile>single-ue</iperf_profile>
 	</testCase>
 
diff --git a/ci-scripts/xml_files/fr1_sa_quectel.xml b/ci-scripts/xml_files/fr1_sa_quectel.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4c8fba0611be738bc6732ad12c2804e40fcf87ed
--- /dev/null
+++ b/ci-scripts/xml_files/fr1_sa_quectel.xml
@@ -0,0 +1,125 @@
+<!--
+
+ 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>TEST-SA-FR1-TM1</htmlTabRef>
+	<htmlTabName>SA Ping DL UL with QUECTEL</htmlTabName>
+	<htmlTabIcon>tasks</htmlTabIcon>
+	<repeatCount>1</repeatCount>
+	<TestCaseRequestedList>
+ 040000
+ 000002
+ 010000
+ 000001
+ 050000
+ 000001
+ 010002
+ 080000
+	</TestCaseRequestedList>
+	<TestCaseExclusionList></TestCaseExclusionList>
+
+	<testCase id="010000">
+		<class>Initialize_UE</class>
+		<desc>Initialize Quectel</desc>
+		<id>nrmodule2_quectel</id>
+		<UE_Trace>yes</UE_Trace>
+	</testCase>
+
+
+	<testCase id="010002">
+		<class>Terminate_UE</class>
+		<desc>Terminate Quectel</desc>
+		<id>nrmodule2_quectel</id>
+	</testCase>
+
+
+	<testCase id="040000">
+		<class>Initialize_eNB</class>
+		<desc>Initialize gNB</desc>
+		<Initialize_eNB_args>-O ci-scripts/conf_files/gnb.band78.sa.fr1.106PRB.usrpn310.conf --sa -q</Initialize_eNB_args>
+		<eNB_instance>0</eNB_instance>
+		<eNB_serverId>0</eNB_serverId>
+		<air_interface>nr</air_interface>
+		<eNB_Trace>yes</eNB_Trace>
+		<USRP_IPAddress>192.168.18.240</USRP_IPAddress>
+	</testCase>
+
+	<testCase id="000001">
+		<class>IdleSleep</class>
+		<desc>Sleep</desc>
+		<idle_sleep_time_in_sec>5</idle_sleep_time_in_sec>
+	</testCase>
+
+	<testCase id="000002">
+		<class>IdleSleep</class>
+		<desc>Sleep</desc>
+		<idle_sleep_time_in_sec>20</idle_sleep_time_in_sec>
+	</testCase>
+
+
+	<testCase id="050000">
+		<class>Ping</class>
+		<desc>Ping: 20pings in 20sec</desc>
+		<id>nrmodule2_quectel</id>
+		<ping_args>-c 20</ping_args>
+		<ping_packetloss_threshold>50</ping_packetloss_threshold>
+	</testCase>
+
+	<testCase id="050001">
+		<class>Ping</class>
+		<desc>Ping: 100pings in 20sec</desc>
+		<id>nrmodule2_quectel</id>
+		<ping_args>-c 100 -i 0.2</ping_args>
+		<ping_packetloss_threshold>50</ping_packetloss_threshold>
+	</testCase>
+
+	<testCase id="070000">
+		<class>Iperf</class>
+		<desc>iperf (DL/20Mbps/UDP)(60 sec)(single-ue profile)</desc>
+		<iperf_args>-u -b 20M -t 60</iperf_args>
+		<direction>DL</direction>
+		<id>nrmodule2_quectel</id>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>single-ue</iperf_profile>
+	</testCase>
+
+	<testCase id="070001">
+		<class>Iperf</class>
+		<desc>iperf (UL/3Mbps/UDP)(60 sec)(single-ue profile)</desc>
+		<iperf_args>-u -b 3M -t 60</iperf_args>
+		<direction>UL</direction>
+		<id>nrmodule2_quectel</id>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>single-ue</iperf_profile>
+	</testCase>
+
+
+	<testCase id="080000">
+		<class>Terminate_eNB</class>
+		<desc>Terminate gNB</desc>
+		<eNB_instance>0</eNB_instance>
+		<eNB_serverId>0</eNB_serverId>
+		<air_interface>nr</air_interface>
+	</testCase>
+
+</testCaseList>
+
diff --git a/ci-scripts/yaml_files/4g_rfsimulator/README.md b/ci-scripts/yaml_files/4g_rfsimulator/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..b2a7f8e30cc74622d02435986513aa01863c04da
--- /dev/null
+++ b/ci-scripts/yaml_files/4g_rfsimulator/README.md
@@ -0,0 +1,504 @@
+<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 Full Stack 4G-LTE RF simulation with containers</font></b>
+    </td>
+  </tr>
+</table>
+
+This page is only valid for an `Ubuntu18` host.
+
+**TABLE OF CONTENTS**
+
+1. [Retrieving the images on Docker-Hub](#1-retrieving-the-images-on-docker-hub)
+2. [Deploy containers](#2-deploy-containers)
+   1. [Deploy and Configure Cassandra Database](#21-deploy-and-configure-cassandra-database)
+   2. [Deploy OAI CN4G containers](#22-deploy-oai-cn4g-containers)
+   3. [Deploy OAI eNB in RF simulator mode](#23-deploy-oai-enb-in-rf-simulator-mode)
+   4. [Deploy OAI LTE UE in RF simulator mode](#24-deploy-oai-lte-ue-in-rf-simulator-mode)
+3. [Check traffic](#3-check-traffic)
+4. [Un-deployment](#4-un-deployment)
+5. [Explanation on the configuration](#5-explanation-on-the-configuration)
+   1. [UE IMSI and Keys](#51-ue-imsi-and-keys)
+   2. [PLMN and TAI](#52-plmn-and-tai)
+   3. [Access to Internet](#53-access-to-internet)
+
+# 1. Retrieving the images on Docker-Hub #
+
+Currently the images are hosted under the user account `rdefosseoai`.
+
+This may change in the future.
+
+Once again you may need to log on [docker-hub](https://hub.docker.com/) if your organization has reached pulling limit as `anonymous`.
+
+```bash
+$ docker login
+Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
+Username:
+Password:
+```
+
+Now pull images.
+
+```bash
+$ docker pull cassandra:2.1
+$ docker pull rdefosseoai/oai-hss:latest
+$ docker pull rdefosseoai/oai-mme:latest
+$ docker pull rdefosseoai/oai-spgwc:latest
+$ docker pull rdefosseoai/oai-spgwu-tiny:latest
+
+$ docker pull rdefosseoai/oai-enb:develop
+$ docker pull rdefosseoai/oai-lte-ue:develop
+```
+
+And **re-tag** them for tutorials' docker-compose file to work.
+
+```bash
+$ docker image tag rdefosseoai/oai-spgwc:latest oai-spgwc:latest
+$ docker image tag rdefosseoai/oai-hss:latest oai-hss:latest
+$ docker image tag rdefosseoai/oai-spgwu-tiny:latest oai-spgwu-tiny:latest 
+$ docker image tag rdefosseoai/oai-mme:latest oai-mme:latest
+
+$ docker image tag rdefosseoai/oai-enb:develop oai-enb:develop
+$ docker image tag rdefosseoai/oai-lte-ue:develop oai-lte-ue:develop
+```
+
+```bash
+$ docker logout
+```
+
+How to build the Traffic-Generator image is explained [here](https://github.com/OPENAIRINTERFACE/openair-epc-fed/blob/master/docs/GENERATE_TRAFFIC.md#1-build-a-traffic-generator-image).
+
+# 2. Deploy containers #
+
+**CAUTION: this SHALL be done in multiple steps.**
+
+**Just `docker-compose up -d` WILL NOT WORK!**
+
+All the following commands **SHALL** be run from the `ci-scripts/yaml_files/4g_rfsimulator` folder.
+
+## 2.1. Deploy and Configure Cassandra Database ##
+
+It is very crutial that the Cassandra DB is fully configured before you do anything else!
+
+```bash
+$ cd ci-scripts/yaml_files/4g_rfsimulator
+$ docker-compose up -d db_init
+Creating network "rfsim4g-oai-private-net" with the default driver
+Creating network "rfsim4g-oai-public-net" with the default driver
+Creating rfsim4g-cassandra ... done
+Creating rfsim4g-db-init   ... done
+
+$ docker logs rfsim4g-db-init --follow
+Connection error: ('Unable to connect to any servers', {'192.168.68.2': error(111, "Tried connecting to [('192.168.68.2', 9042)]. Last error: Connection refused")})
+...
+Connection error: ('Unable to connect to any servers', {'192.168.68.2': error(111, "Tried connecting to [('192.168.68.2', 9042)]. Last error: Connection refused")})
+OK
+```
+
+**You SHALL wait until you HAVE the `OK` message in the logs!**
+
+```bash
+$ docker rm rfsim4g-db-init
+```
+
+At this point, you can prepare a capture on the newly-created public docker bridge:
+
+```bash
+$ ifconfig rfsim4g-public
+        inet 192.168.61.1  netmask 255.255.255.192  broadcast 192.168.61.63
+        ether 02:42:8f:dd:ba:5a  txqueuelen 0  (Ethernet)
+        RX packets 0  bytes 0 (0.0 B)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 0  bytes 0 (0.0 B)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+$ sudo tshark -i rfsim4g-public -f 'port 3868 or port 2123 or port 36412 or port 36422 or port 46520 or port 8805' -w /tmp/my-oai-control-plane.pcap
+```
+
+**BE CAREFUL: please use that filter or you will also capture the data-plane with IQ samples between `eNB` and `LTE-UE`.**
+
+**and your capture WILL become huge (10s of Gbytes).**
+
+## 2.2. Deploy OAI CN4G containers ##
+
+```bash
+$ docker-compose up -d oai_mme oai_spgwu trf_gen
+rfsim4g-cassandra is up-to-date
+Creating rfsim4g-trf-gen   ... done
+Creating rfsim4g-oai-hss ... done
+Creating rfsim4g-oai-mme ... done
+Creating rfsim4g-oai-spgwc ... done
+Creating rfsim4g-oai-spgwu-tiny ... done
+```
+
+You shall wait until all containers are `healthy`. About 10 seconds!
+
+```bash
+$ docker-compose ps -a
+         Name                       Command                  State                            Ports                      
+-------------------------------------------------------------------------------------------------------------------------
+rfsim4g-cassandra        docker-entrypoint.sh cassa ...   Up (healthy)   7000/tcp, 7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp
+rfsim4g-oai-hss          /openair-hss/bin/entrypoin ...   Up (healthy)   5868/tcp, 9042/tcp, 9080/tcp, 9081/tcp          
+rfsim4g-oai-mme          /openair-mme/bin/entrypoin ...   Up (healthy)   2123/udp, 3870/tcp, 5870/tcp                    
+rfsim4g-oai-spgwc        /openair-spgwc/bin/entrypo ...   Up (healthy)   2123/udp, 8805/udp                              
+rfsim4g-oai-spgwu-tiny   /openair-spgwu-tiny/bin/en ...   Up (healthy)   2152/udp, 8805/udp                              
+rfsim4g-trf-gen          /bin/bash -c ip route add  ...   Up (healthy)                                                   
+```
+
+## 2.3. Deploy OAI eNB in RF simulator mode ##
+
+```bash
+$ docker-compose up -d enb
+Creating rfsim4g-oai-enb ... done
+```
+
+Again wait for the healthy state:
+
+```bash
+$ docker-compose ps -a
+         Name                       Command                  State                            Ports                      
+-------------------------------------------------------------------------------------------------------------------------
+rfsim4g-cassandra        docker-entrypoint.sh cassa ...   Up (healthy)   7000/tcp, 7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp
+rfsim4g-oai-enb          /opt/oai-enb/bin/entrypoin ...   Up (healthy)   2152/udp, 36412/udp, 36422/udp                  
+rfsim4g-oai-hss          /openair-hss/bin/entrypoin ...   Up (healthy)   5868/tcp, 9042/tcp, 9080/tcp, 9081/tcp          
+rfsim4g-oai-mme          /openair-mme/bin/entrypoin ...   Up (healthy)   2123/udp, 3870/tcp, 5870/tcp                    
+rfsim4g-oai-spgwc        /openair-spgwc/bin/entrypo ...   Up (healthy)   2123/udp, 8805/udp                              
+rfsim4g-oai-spgwu-tiny   /openair-spgwu-tiny/bin/en ...   Up (healthy)   2152/udp, 8805/udp                              
+rfsim4g-trf-gen          /bin/bash -c ip route add  ...   Up (healthy)                                    
+```
+
+Check if the eNB connected to MME:
+
+```bash
+$ docker logs rfsim4g-oai-mme
+...
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0039    ======================================= STATISTICS ============================================
+
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0042                   |   Current Status| Added since last display|  Removed since last display |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0048    Connected eNBs |          0      |              0              |             0               |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0054    Attached UEs   |          0      |              0              |             0               |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0060    Connected UEs  |          0      |              0              |             0               |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0066    Default Bearers|          0      |              0              |             0               |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0072    S1-U Bearers   |          0      |              0              |             0               |
+
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0075    ======================================= STATISTICS ============================================
+
+DEBUG SCTP   rc/sctp/sctp_primitives_server.c:0469    Client association changed: 0
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0101    ----------------------
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0102    SCTP Status:
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0103    assoc id .....: 675
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0104    state ........: 4
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0105    instrms ......: 2
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0106    outstrms .....: 2
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0108    fragmentation : 1452
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0109    pending data .: 0
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0110    unack data ...: 0
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0111    rwnd .........: 106496
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0112    peer info     :
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0114        state ....: 2
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0116        cwnd .....: 4380
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0118        srtt .....: 0
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0120        rto ......: 3000
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0122        mtu ......: 1500
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0123    ----------------------
+DEBUG SCTP   rc/sctp/sctp_primitives_server.c:0479    New connection
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0205    ----------------------
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0206    Local addresses:
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0217        - [192.168.61.3]
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0234    ----------------------
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0151    ----------------------
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0152    Peer addresses:
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0163        - [192.168.61.20]
+DEBUG SCTP   enair-mme/src/sctp/sctp_common.c:0178    ----------------------
+DEBUG SCTP   rc/sctp/sctp_primitives_server.c:0554    SCTP RETURNING!!
+DEBUG SCTP   rc/sctp/sctp_primitives_server.c:0547    [675][44] Msg of length 51 received from port 36412, on stream 0, PPID 18
+DEBUG SCTP   rc/sctp/sctp_primitives_server.c:0554    SCTP RETURNING!!
+DEBUG S1AP   mme/src/s1ap/s1ap_mme_handlers.c:2826    Create eNB context for assoc_id: 675
+DEBUG S1AP   mme/src/s1ap/s1ap_mme_handlers.c:0361    S1-Setup-Request macroENB_ID.size 3 (should be 20)
+DEBUG S1AP   mme/src/s1ap/s1ap_mme_handlers.c:0321    New s1 setup request incoming from macro eNB id: 00e01
+DEBUG S1AP   mme/src/s1ap/s1ap_mme_handlers.c:0423    Adding eNB to the list of served eNBs
+DEBUG S1AP   mme/src/s1ap/s1ap_mme_handlers.c:0438    Adding eNB id 3585 to the list of served eNBs
+DEBUG SCTP   rc/sctp/sctp_primitives_server.c:0283    [44][675] Sending buffer 0x7f9394009f90 of 27 bytes on stream 0 with ppid 18
+DEBUG SCTP   rc/sctp/sctp_primitives_server.c:0296    Successfully sent 27 bytes on stream 0
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0039    ======================================= STATISTICS ============================================
+
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0042                   |   Current Status| Added since last display|  Removed since last display |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0048    Connected eNBs |          1      |              1              |             0               |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0054    Attached UEs   |          0      |              0              |             0               |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0060    Connected UEs  |          0      |              0              |             0               |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0066    Default Bearers|          0      |              0              |             0               |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0072    S1-U Bearers   |          0      |              0              |             0               |
+
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0075    ======================================= STATISTICS ============================================
+...
+```
+
+## 2.4. Deploy OAI LTE UE in RF simulator mode ##
+
+```bash
+$ docker-compose up -d oai_ue0
+Creating rfsim4g-oai-lte-ue0 ... done
+```
+
+Again a bit of patience:
+
+```bash
+$ docker-compose ps -a
+         Name                       Command                  State                            Ports                      
+-------------------------------------------------------------------------------------------------------------------------
+rfsim4g-cassandra        docker-entrypoint.sh cassa ...   Up (healthy)   7000/tcp, 7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp
+rfsim4g-oai-enb          /opt/oai-enb/bin/entrypoin ...   Up (healthy)   2152/udp, 36412/udp, 36422/udp                  
+rfsim4g-oai-hss          /openair-hss/bin/entrypoin ...   Up (healthy)   5868/tcp, 9042/tcp, 9080/tcp, 9081/tcp          
+rfsim4g-oai-lte-ue0      /opt/oai-lte-ue/bin/entryp ...   Up (healthy)   10000/tcp                                       
+rfsim4g-oai-mme          /openair-mme/bin/entrypoin ...   Up (healthy)   2123/udp, 3870/tcp, 5870/tcp                    
+rfsim4g-oai-spgwc        /openair-spgwc/bin/entrypo ...   Up (healthy)   2123/udp, 8805/udp                              
+rfsim4g-oai-spgwu-tiny   /openair-spgwu-tiny/bin/en ...   Up (healthy)   2152/udp, 8805/udp                              
+rfsim4g-trf-gen          /bin/bash -c ip route add  ...   Up (healthy)                                             
+Creating rfsim4g-oai-enb ... done
+```
+
+Making sure the OAI UE is connected:
+
+```bash
+$ docker logs rfsim4g-oai-enb
+...
+[RRC]   RRCConnectionReconfiguration Encoded 1098 bits (138 bytes)
+[RRC]   [eNB 0] Frame 0, Logical Channel DL-DCCH, Generate LTE_RRCConnectionReconfiguration (bytes 138, UE id 617b)
+[RRC]   sent RRC_DCCH_DATA_REQ to TASK_PDCP_ENB
+[PDCP]   [FRAME 00000][eNB][MOD 00][RNTI 617b][SRB 02]  Action ADD  LCID 2 (SRB id 2) configured with SN size 5 bits and RLC AM
+[PDCP]   [FRAME 00000][eNB][MOD 00][RNTI 617b][DRB 01]  Action ADD  LCID 3 (DRB id 1) configured with SN size 12 bits and RLC AM
+[SCTP]   Successfully sent 46 bytes on stream 1 for assoc_id 676
+[RRC]   [FRAME 00000][eNB][MOD 00][RNTI 617b] UE State = RRC_RECONFIGURED (default DRB, xid 0)
+[PDCP]   [FRAME 00000][eNB][MOD 00][RNTI 617b][SRB 02]  Action MODIFY LCID 2 RB id 2 reconfigured with SN size 5 and RLC AM 
+[PDCP]   [FRAME 00000][eNB][MOD 00][RNTI 617b][DRB 01]  Action MODIFY LCID 3 RB id 1 reconfigured with SN size 1 and RLC AM 
+[RRC]   [eNB 0] Frame  0 CC 0 : SRB2 is now active
+[RRC]   [eNB 0] Frame  0 : Logical Channel UL-DCCH, Received LTE_RRCConnectionReconfigurationComplete from UE rnti 617b, reconfiguring DRB 1/LCID 3
+[RRC]   [eNB 0] Frame  0 : Logical Channel UL-DCCH, Received LTE_RRCConnectionReconfigurationComplete, reconfiguring DRB 1/LCID 3
+[MAC]   UE 0 RNTI 617b adding LC 3 idx 2 to scheduling control (total 3)
+[MAC]   Added physicalConfigDedicated 0x7f98e0004950 for 0.0
+[S1AP]   initial_ctxt_resp_p: e_rab ID 5, enb_addr 192.168.61.20, SIZE 4 
+[SCTP]   Successfully sent 40 bytes on stream 1 for assoc_id 676
+[SCTP]   Successfully sent 61 bytes on stream 1 for assoc_id 676
+...
+```
+
+On the MME:
+
+```bash
+$ docker logs rfsim4g-oai-mme
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0039    ======================================= STATISTICS ============================================
+
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0042                   |   Current Status| Added since last display|  Removed since last display |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0048    Connected eNBs |          1      |              0              |             0               |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0054    Attached UEs   |          1      |              0              |             0               |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0060    Connected UEs  |          1      |              0              |             0               |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0066    Default Bearers|          0      |              0              |             0               |
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0072    S1-U Bearers   |          0      |              0              |             0               |
+
+DEBUG MME-AP src/mme_app/mme_app_statistics.c:0075    ======================================= STATISTICS ============================================
+```
+
+On the LTE UE:
+
+```bash
+$ docker exec rfsim4g-oai-lte-ue0 /bin/bash -c "ifconfig"
+eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
+        inet 192.168.61.30  netmask 255.255.255.192  broadcast 192.168.61.63
+        ether 02:42:c0:a8:3d:1e  txqueuelen 0  (Ethernet)
+        RX packets 1109931  bytes 8078031934 (8.0 GB)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 1232068  bytes 7798928848 (7.7 GB)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+
+lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
+        inet 127.0.0.1  netmask 255.0.0.0
+        loop  txqueuelen 1000  (Local Loopback)
+        RX packets 0  bytes 0 (0.0 B)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 0  bytes 0 (0.0 B)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+
+oaitun_ue1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
+        inet 12.0.0.2  netmask 255.0.0.0  destination 12.0.0.2
+        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
+        RX packets 0  bytes 0 (0.0 B)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 0  bytes 0 (0.0 B)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+
+oaitun_uem1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
+        inet 10.0.2.2  netmask 255.255.255.0  destination 10.0.2.2
+        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
+        RX packets 0  bytes 0 (0.0 B)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 0  bytes 0 (0.0 B)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+```
+
+The tunnel `oaitun_ue1` SHALL be mounted and with an IP address in the `12.0.0.xxx` range.
+
+# 3. Check traffic #
+
+```bash
+$ docker exec rfsim4g-oai-lte-ue0 /bin/bash -c "ping -c 2 www.lemonde.fr"
+PING s2.shared.global.fastly.net (151.101.122.217) 56(84) bytes of data.
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=1 ttl=54 time=12.9 ms
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=2 ttl=54 time=12.9 ms
+
+--- s2.shared.global.fastly.net ping statistics ---
+2 packets transmitted, 2 received, 0% packet loss, time 1001ms
+rtt min/avg/max/mdev = 12.940/12.965/12.990/0.025 ms
+
+$ docker exec rfsim4g-oai-lte-ue0 /bin/bash -c "ping -I oaitun_ue1 -c 2 www.lemonde.fr"
+PING s2.shared.global.fastly.net (151.101.122.217) from 12.0.0.2 oaitun_ue1: 56(84) bytes of data.
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=1 ttl=53 time=23.6 ms
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=2 ttl=53 time=29.5 ms
+
+--- s2.shared.global.fastly.net ping statistics ---
+2 packets transmitted, 2 received, 0% packet loss, time 1001ms
+rtt min/avg/max/mdev = 23.659/26.626/29.593/2.967 ms
+```
+
+The 1st ping command is NOT using the OAI stack. My network infrastructure has a response of `13 ms` to reach this website.
+
+The 2nd ping command is using the OAI stack. So the stack takes `26.6 - 12.9 = 13.7 ms`.
+
+# 4. Un-deployment #
+
+```bash
+$ docker-compose down
+Stopping rfsim4g-oai-lte-ue0    ... done
+Stopping rfsim4g-oai-enb        ... done
+Stopping rfsim4g-oai-spgwu-tiny ... done
+Stopping rfsim4g-oai-spgwc      ... done
+Stopping rfsim4g-oai-mme        ... done
+Stopping rfsim4g-oai-hss        ... done
+Stopping rfsim4g-trf-gen        ... done
+Stopping rfsim4g-cassandra      ... done
+Removing rfsim4g-oai-lte-ue0    ... done
+Removing rfsim4g-oai-enb        ... done
+Removing rfsim4g-oai-spgwu-tiny ... done
+Removing rfsim4g-oai-spgwc      ... done
+Removing rfsim4g-oai-mme        ... done
+Removing rfsim4g-oai-hss        ... done
+Removing rfsim4g-trf-gen        ... done
+Removing rfsim4g-cassandra      ... done
+Removing network rfsim4g-oai-private-net
+Removing network rfsim4g-oai-public-net
+```
+
+# 5. Explanation on the configuration #
+
+With a single `docker-compose.yml` file, it is easier to explain how I made the full connection.
+
+Try to modify as little as possible. And if you don't understand a field/value, you'd better NOT modify it.
+
+## 5.1. UE IMSI and Keys ##
+
+in HSS config:
+
+```yaml
+            OP_KEY: 1006020f0a478bf6b699f15c062e42b3
+            LTE_K: fec86ba6eb707ed08905757b1bb44b8f
+            APN1: oai.ipv4
+            APN2: internet
+            FIRST_IMSI: 208960100000001
+            NB_USERS: 10
+```
+
+in UE config:
+
+```yaml
+            MCC: '208'
+            MNC: '96'
+            SHORT_IMSI: '0100000001'
+            LTE_KEY: 'fec86ba6eb707ed08905757b1bb44b8f'
+            OPC: 'c42449363bbad02b66d16bc975d77cc1'
+            MSISDN: '001011234561010'
+            HPLMN: 20896
+```
+
+As you can see: `LTE_K` and `LTE_KEY` are the same value. And `OP_KEY` and `OPC` can be deduced from each other. Look in HSS logs.
+
+```bash
+$ docker logs rfsim4g-oai-hss
+...
+Compute opc:
+	K:  FEC86BA6EB707ED08905757B1BB44B8F           <== `LTE_K`
+	In: 1006020F0A478BF6B699F15C062E42B3           <== `OP_KEY`
+	Rinj:   D4224B3931FD5BDDD0489A9573F93E72
+	Out:    C42449363BBAD02B66D16BC975D77CC1       <== `OPC`
+...
+```
+
+In HSS, I've provisioned 10 users starting at `208960100000001` (`FIRST_IMSI` and `NB_USERS`).
+
+My 1st UE IMSI is an aggregation of `MCC`, `MNC`, `SHORT_IMSI`.
+
+## 5.2. PLMN and TAI ##
+
+in MME config:
+
+```yaml
+            REALM: openairinterface.org
+..
+            MCC: '208'
+            MNC: '96'
+            MME_GID: 32768
+            MME_CODE: 3
+            TAC_0: 1
+            TAC_1: 2
+            TAC_2: 3
+            MME_FQDN: mme.openairinterface.org
+```
+
+in SPGW-C/-U configs:
+
+```yaml
+            MCC: '208'
+            MNC: '96'
+            MNC03: '096'
+            TAC: 1
+            GW_ID: 1
+            REALM: openairinterface.org
+```
+
+in eNB config:
+
+```yaml
+            MCC: '208'
+            MNC: '96'
+            MNC_LENGTH: 2
+            TAC: 1
+```
+
+The values SHALL match, and `TAC` shall match `TAC_0` from MME.
+
+## 5.3. Access to Internet ##
+
+In my traffic test, I was able to ping outside of my local network.
+
+in SPGW-C config:
+
+```yaml
+            DEFAULT_DNS_IPV4_ADDRESS: 192.168.18.129
+            DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
+            PUSH_PROTOCOL_OPTION: 'true'
+```
+
+in SPGW-U config:
+
+```yaml
+            NETWORK_UE_NAT_OPTION: 'yes'
+```
+
+Please put your own DNS server IP adress.
+
+And you may have to play with `PUSH_PROTOCOL_OPTION` and `NETWORK_UE_NAT_OPTION` depending on your network.
+
diff --git a/ci-scripts/yaml_files/4g_rfsimulator/docker-compose.yml b/ci-scripts/yaml_files/4g_rfsimulator/docker-compose.yml
index d8be6679b165760f290d1ce94469009407e461be..32e4bd41e8146f4b6e52a16324948d2b18f66e9c 100644
--- a/ci-scripts/yaml_files/4g_rfsimulator/docker-compose.yml
+++ b/ci-scripts/yaml_files/4g_rfsimulator/docker-compose.yml
@@ -32,7 +32,7 @@ services:
         entrypoint: /bin/bash -c "cqlsh --file /home/oai_db.cql 192.168.68.2 && echo 'OK'"
 
     oai_hss:
-        image: oai-hss:develop-2021-06-14
+        image: oai-hss:latest
         container_name: rfsim4g-oai-hss
         privileged: true
         depends_on: [cassandra]
@@ -59,7 +59,7 @@ services:
             retries: 5
 
     oai_mme:
-        image: oai-mme:production
+        image: oai-mme:latest
         container_name: rfsim4g-oai-mme
         privileged: true
         depends_on: [oai_hss]
@@ -116,7 +116,7 @@ services:
             retries: 5
 
     oai_spgwc:
-        image: oai-spgwc:develop-2021-06-14
+        image: oai-spgwc:latest
         privileged: true
         depends_on: [oai_mme]
         container_name: rfsim4g-oai-spgwc
@@ -148,7 +148,7 @@ services:
             retries: 5
 
     oai_spgwu:
-        image: oai-spgwu-tiny:develop-2021-06-14
+        image: oai-spgwu-tiny:latest
         privileged: true
         container_name: rfsim4g-oai-spgwu-tiny
         depends_on: [oai_spgwc]
@@ -177,19 +177,6 @@ services:
             timeout: 5s
             retries: 5
 
-    flexran_rtc:
-        image: flexran-rtc:production
-        privileged: true
-        container_name: rfsim4g-flexran-rtc
-        networks:
-            public_net:
-                ipv4_address: 192.168.61.10
-        healthcheck:
-            test: /bin/bash -c "pgrep rt_controller"
-            interval: 10s
-            timeout: 5s
-            retries: 5
-
     trf_gen:
         image: trf-gen:production
         privileged: true
@@ -235,6 +222,11 @@ services:
             FLEXRAN_INTERFACE_NAME: eth0
             FLEXRAN_IPV4_ADDRESS: 192.168.61.10
             USE_ADDITIONAL_OPTIONS: --rfsim
+        healthcheck:
+            test: /bin/bash -c "pgrep lte-softmodem"
+            interval: 10s
+            timeout: 5s
+            retries: 5
 
     oai_ue0:
         image: oai-lte-ue:develop
@@ -257,6 +249,11 @@ services:
             MSISDN: '001011234561010'
             HPLMN: 20896
             USE_ADDITIONAL_OPTIONS: --rfsim -C 2680000000 -r 25 --ue-rxgain 140 --ue-txgain 120 --nokrnmod 1
+        healthcheck:
+            test: /bin/bash -c "pgrep lte-uesoftmodem"
+            interval: 10s
+            timeout: 5s
+            retries: 5
 
 networks:
     private_net:
@@ -264,9 +261,12 @@ networks:
         ipam:
             config:
                 - subnet: 192.168.68.0/26
+        driver_opts:
+            com.docker.network.bridge.name: "rfsim4g-private"
     public_net:
         name: rfsim4g-oai-public-net
         ipam:
             config:
                 - subnet: 192.168.61.0/26
-
+        driver_opts:
+            com.docker.network.bridge.name: "rfsim4g-public"
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/README.md b/ci-scripts/yaml_files/5g_rfsimulator/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..1351d6742bc234daa3271e3d289098df3db26278
--- /dev/null
+++ b/ci-scripts/yaml_files/5g_rfsimulator/README.md
@@ -0,0 +1,368 @@
+<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 Full Stack 5G-NR RF simulation with containers</font></b>
+    </td>
+  </tr>
+</table>
+
+This page is only valid for an `Ubuntu18` host.
+
+**TABLE OF CONTENTS**
+
+1. [Retrieving the images on Docker-Hub](#1-retrieving-the-images-on-docker-hub)
+2. [Deploy containers](#2-deploy-containers)
+   1. [Deploy OAI 5G Core Network](#21-deploy-oai-5g-core-network)
+   2. [Deploy OAI gNB in RF simulator mode and in Standalone Mode](#22-deploy-oai-gnb-in-rf-simulator-mode-and-in-standalone-mode)
+   3. [Deploy OAI NR-UE in RF simulator mode and in Standalone Mode](#23-deploy-oai-nr-ue-in-rf-simulator-mode-and-in-standalone-mode)
+3. [Check traffic](#3-check-traffic)
+   1. [Check your Internet connectivity](#31-check-your-internet-connectivity)
+   2. [Start the iperf server inside the NR-UE container](#32-start-the-iperf-server-inside-the-nr-ue-container)
+   3. [Start the iperf client inside the ext-dn container](#33-start-the-iperf-client-inside-the-ext-dn-container)
+4. [Un-deployment](#4-un-deployment)
+
+# 1. Retrieving the images on Docker-Hub #
+
+Currently the images are hosted under the user account `rdefosseoai`.
+
+This may change in the future.
+
+Once again you may need to log on [docker-hub](https://hub.docker.com/) if your organization has reached pulling limit as `anonymous`.
+
+```bash
+$ docker login
+Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
+Username:
+Password:
+```
+
+Now pull images.
+
+```bash
+$ docker pull mysql:5.7
+$ docker pull rdefosseoai/oai-amf:latest
+$ docker pull rdefosseoai/oai-nrf:latest
+$ docker pull rdefosseoai/oai-smf:latest
+$ docker pull rdefosseoai/oai-spgwu-tiny:latest
+
+$ docker pull rdefosseoai/oai-gnb:develop
+$ docker pull rdefosseoai/oai-nr-ue:develop
+```
+
+And **re-tag** them for tutorials' docker-compose file to work.
+
+```bash
+$ docker image tag rdefosseoai/oai-amf:latest oai-amf:latest
+$ docker image tag rdefosseoai/oai-nrf:latest oai-nrf:latest
+$ docker image tag rdefosseoai/oai-smf:latest oai-smf:latest
+$ docker image tag rdefosseoai/oai-spgwu-tiny:latest oai-spgwu-tiny:latest
+
+$ docker image tag rdefosseoai/oai-gnb:develop oai-gnb:develop
+$ docker image tag rdefosseoai/oai-nr-ue:develop oai-nr-ue:develop
+```
+
+```bash
+$ docker logout
+```
+
+# 2. Deploy containers #
+
+![Deployment](./oai-end-to-end.jpg)
+
+**CAUTION: this SHALL be done in multiple steps.**
+
+**Just `docker-compose up -d` WILL NOT WORK!**
+
+All the following commands **SHALL** be run from the `ci-scripts/yaml_files/5g_rfsimulator` folder.
+
+## 2.1. Deploy OAI 5G Core Network ##
+
+```bash
+$ cd ci-scripts/yaml_files/5g_rfsimulator
+$ docker-compose up -d mysql oai-nrf oai-amf oai-smf oai-spgwu oai-ext-dn
+Creating network "rfsim5g-oai-public-net" with driver "bridge"
+Creating network "rfsim5g-oai-traffic_net-net" with driver "bridge"
+Creating rfsim5g-oai-nrf ... done
+Creating rfsim5g-mysql      ... done
+Creating rfsim5g-oai-spgwu ... done
+Creating rfsim5g-oai-amf   ... done
+Creating rfsim5g-oai-smf   ... done
+Creating rfsim5g-oai-ext-dn ... done
+```
+
+Wait for a bit.
+
+```bash
+$ docker-compose ps -a
+       Name                     Command                  State                  Ports            
+-------------------------------------------------------------------------------------------------
+rfsim5g-mysql        docker-entrypoint.sh mysqld      Up (healthy)   3306/tcp, 33060/tcp         
+rfsim5g-oai-amf      /bin/bash /openair-amf/bin ...   Up (healthy)   38412/sctp, 80/tcp, 9090/tcp
+rfsim5g-oai-ext-dn   /bin/bash -c  apt update;  ...   Up (healthy)                               
+rfsim5g-oai-nrf      /bin/bash /openair-nrf/bin ...   Up (healthy)   80/tcp, 9090/tcp            
+rfsim5g-oai-smf      /bin/bash -c /openair-smf/ ...   Up (healthy)   80/tcp, 8805/udp, 9090/tcp  
+rfsim5g-oai-spgwu    /openair-spgwu-tiny/bin/en ...   Up (healthy)   2152/udp, 8805/udp          
+```
+
+At this point, you can prepare a capture on the newly-created public docker bridges:
+
+```bash
+$ ifconfig 
+...
+rfsim5g-public: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
+        inet 192.168.71.129  netmask 255.255.255.192  broadcast 192.168.71.191
+        inet6 fe80::42:c4ff:fe2b:3d38  prefixlen 64  scopeid 0x20<link>
+        ether 02:42:c4:2b:3d:38  txqueuelen 0  (Ethernet)
+        RX packets 4  bytes 112 (112.0 B)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 7  bytes 626 (626.0 B)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+
+rfsim5g-traffic: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
+        inet 192.168.72.129  netmask 255.255.255.192  broadcast 192.168.72.191
+        inet6 fe80::42:b5ff:fed3:e732  prefixlen 64  scopeid 0x20<link>
+        ether 02:42:b5:d3:e7:32  txqueuelen 0  (Ethernet)
+        RX packets 2652  bytes 142335 (142.3 KB)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 3999  bytes 23367972 (23.3 MB)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+...
+```
+
+## 2.2. Deploy OAI gNB in RF simulator mode and in Standalone Mode ##
+
+```bash
+$ docker-compose up -d oai-gnb
+rfsim5g-oai-nrf is up-to-date
+rfsim5g-oai-spgwu is up-to-date
+rfsim5g-oai-ext-dn is up-to-date
+Creating rfsim5g-oai-gnb ... done
+```
+
+Wait for a bit.
+
+```bash
+$ docker-compose ps -a
+       Name                     Command                  State                  Ports            
+-------------------------------------------------------------------------------------------------
+rfsim5g-mysql        docker-entrypoint.sh mysqld      Up (healthy)   3306/tcp, 33060/tcp         
+rfsim5g-oai-amf      /bin/bash /openair-amf/bin ...   Up (healthy)   38412/sctp, 80/tcp, 9090/tcp
+rfsim5g-oai-ext-dn   /bin/bash -c  apt update;  ...   Up (healthy)                               
+rfsim5g-oai-gnb      /opt/oai-gnb/bin/entrypoin ...   Up (healthy)                               
+rfsim5g-oai-nrf      /bin/bash /openair-nrf/bin ...   Up (healthy)   80/tcp, 9090/tcp            
+rfsim5g-oai-smf      /bin/bash -c /openair-smf/ ...   Up (healthy)   80/tcp, 8805/udp, 9090/tcp  
+rfsim5g-oai-spgwu    /openair-spgwu-tiny/bin/en ...   Up (healthy)   2152/udp, 8805/udp          
+```
+
+## 2.3. Deploy OAI NR-UE in RF simulator mode and in Standalone Mode ##
+
+```bash
+$ docker-compose up -d oai-nr-ue
+rfsim5g-mysql is up-to-date
+rfsim5g-oai-nrf is up-to-date
+rfsim5g-oai-spgwu is up-to-date
+rfsim5g-oai-ext-dn is up-to-date
+rfsim5g-oai-gnb is up-to-date
+Creating rfsim5g-oai-nr-ue ... done
+```
+
+Wait for a bit.
+
+```bash
+$ docker-compose ps -a
+       Name                     Command                  State                  Ports            
+-------------------------------------------------------------------------------------------------
+rfsim5g-mysql        docker-entrypoint.sh mysqld      Up (healthy)   3306/tcp, 33060/tcp         
+rfsim5g-oai-amf      /bin/bash /openair-amf/bin ...   Up (healthy)   38412/sctp, 80/tcp, 9090/tcp
+rfsim5g-oai-ext-dn   /bin/bash -c  apt update;  ...   Up (healthy)                               
+rfsim5g-oai-gnb      /opt/oai-gnb/bin/entrypoin ...   Up (healthy)                               
+rfsim5g-oai-nr-ue    /opt/oai-nr-ue/bin/entrypo ...   Up (healthy)                               
+rfsim5g-oai-nrf      /bin/bash /openair-nrf/bin ...   Up (healthy)   80/tcp, 9090/tcp            
+rfsim5g-oai-smf      /bin/bash -c /openair-smf/ ...   Up (healthy)   80/tcp, 8805/udp, 9090/tcp  
+rfsim5g-oai-spgwu    /openair-spgwu-tiny/bin/en ...   Up (healthy)   2152/udp, 8805/udp          
+```
+
+Making sure the OAI UE is connected:
+
+```bash
+$ docker exec -it rfsim5g-oai-nr-ue /bin/bash
+root@bb4d400a832d:/opt/oai-nr-ue# ifconfig 
+eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
+        inet 192.168.71.137  netmask 255.255.255.192  broadcast 192.168.71.191
+        ether 02:42:c0:a8:47:89  txqueuelen 0  (Ethernet)
+        RX packets 224259  bytes 5821372018 (5.8 GB)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 235916  bytes 7848786376 (7.8 GB)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+
+lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
+        inet 127.0.0.1  netmask 255.0.0.0
+        loop  txqueuelen 1000  (Local Loopback)
+        RX packets 0  bytes 0 (0.0 B)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 0  bytes 0 (0.0 B)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+
+oaitun_ue1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
+        inet 12.1.1.2  netmask 255.255.255.0  destination 12.1.1.2
+        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
+        RX packets 0  bytes 0 (0.0 B)
+        RX errors 0  dropped 0  overruns 0  frame 0
+        TX packets 0  bytes 0 (0.0 B)
+        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
+```
+
+# 3. Check traffic #
+
+## 3.1. Check your Internet connectivity ##
+
+```bash
+$ docker exec -it rfsim5g-oai-nr-ue /bin/bash
+root@bb4d400a832d:/opt/oai-nr-ue# ping -I oaitun_ue1 -c 10 www.lemonde.fr
+PING s2.shared.global.fastly.net (151.101.122.217) from 12.1.1.2 oaitun_ue1: 56(84) bytes of data.
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=1 ttl=53 time=64.5 ms
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=2 ttl=53 time=37.0 ms
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=3 ttl=53 time=43.2 ms
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=4 ttl=53 time=43.2 ms
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=5 ttl=53 time=54.3 ms
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=6 ttl=53 time=24.0 ms
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=7 ttl=53 time=32.5 ms
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=8 ttl=53 time=37.0 ms
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=9 ttl=53 time=41.2 ms
+64 bytes from 151.101.122.217 (151.101.122.217): icmp_seq=10 ttl=53 time=50.3 ms
+
+--- s2.shared.global.fastly.net ping statistics ---
+10 packets transmitted, 10 received, 0% packet loss, time 9011ms
+rtt min/avg/max/mdev = 24.035/42.765/64.557/10.904 ms
+```
+
+If it does not work, certainly you need to modify the DNS values in the docker-compose.
+
+But you can also check with the `ext-dn` container (IP address is `192.168.72.135` in docker-compose)
+
+```bash
+$ docker exec -it rfsim5g-oai-nr-ue /bin/bash
+root@bb4d400a832d# ping -I oaitun_ue1 -c 2 192.168.72.135
+PING 192.168.72.135 (192.168.72.135) from 12.1.1.2 oaitun_ue1: 56(84) bytes of data.
+64 bytes from 192.168.72.135: icmp_seq=1 ttl=63 time=10.9 ms
+64 bytes from 192.168.72.135: icmp_seq=2 ttl=63 time=16.5 ms
+
+--- 192.168.72.135 ping statistics ---
+2 packets transmitted, 2 received, 0% packet loss, time 1001ms
+rtt min/avg/max/mdev = 10.939/13.747/16.556/2.810 ms
+```
+
+Let now try to check UDP traffic in Downlink.
+
+You will need 2 terminals: one in the NR-UE container, one in the ext-dn container.
+
+## 3.2. Start the `iperf` server inside the NR-UE container ##
+
+```bash
+$ docker exec -it rfsim5g-oai-nr-ue /bin/bash
+root@bb4d400a832d:/opt/oai-nr-ue# iperf -B 12.1.1.2 -u -i 1 -s
+------------------------------------------------------------
+Server listening on UDP port 5001
+Binding to local address 12.1.1.2
+Receiving 1470 byte datagrams
+UDP buffer size:  208 KByte (default)
+------------------------------------------------------------
+```
+
+## 3.3. Start the `iperf` client inside the ext-dn container ##
+
+```bash
+$ docker exec -it rfsim5g-oai-ext-dn /bin/bash
+root@f239e31a0bd0:/# iperf -c 12.1.1.2 -u -i 1 -t 20 -b 500K
+------------------------------------------------------------
+Client connecting to 12.1.1.2, UDP port 5001
+Sending 1470 byte datagrams, IPG target: 22968.75 us (kalman adjust)
+UDP buffer size:  208 KByte (default)
+------------------------------------------------------------
+[  3] local 192.168.72.135 port 58800 connected with 12.1.1.2 port 5001
+[ ID] Interval       Transfer     Bandwidth
+[  3]  0.0- 1.0 sec  64.6 KBytes   529 Kbits/sec
+[  3]  1.0- 2.0 sec  63.2 KBytes   517 Kbits/sec
+[  3]  2.0- 3.0 sec  61.7 KBytes   506 Kbits/sec
+[  3]  3.0- 4.0 sec  63.2 KBytes   517 Kbits/sec
+[  3]  4.0- 5.0 sec  61.7 KBytes   506 Kbits/sec
+[  3]  5.0- 6.0 sec  63.2 KBytes   517 Kbits/sec
+[  3]  6.0- 7.0 sec  61.7 KBytes   506 Kbits/sec
+[  3]  7.0- 8.0 sec  63.2 KBytes   517 Kbits/sec
+[  3]  8.0- 9.0 sec  61.7 KBytes   506 Kbits/sec
+[  3]  9.0-10.0 sec  63.2 KBytes   517 Kbits/sec
+[  3] 10.0-11.0 sec  61.7 KBytes   506 Kbits/sec
+[  3] 11.0-12.0 sec  63.2 KBytes   517 Kbits/sec
+[  3] 12.0-13.0 sec  61.7 KBytes   506 Kbits/sec
+[  3] 13.0-14.0 sec  63.2 KBytes   517 Kbits/sec
+[  3] 14.0-15.0 sec  63.2 KBytes   517 Kbits/sec
+[  3] 15.0-16.0 sec  61.7 KBytes   506 Kbits/sec
+[  3] 16.0-17.0 sec  63.2 KBytes   517 Kbits/sec
+[  3] 17.0-18.0 sec  61.7 KBytes   506 Kbits/sec
+[  3] 18.0-19.0 sec  63.2 KBytes   517 Kbits/sec
+[  3] 19.0-20.0 sec  61.7 KBytes   506 Kbits/sec
+[  3]  0.0-20.0 sec  1.22 MBytes   512 Kbits/sec
+[  3] Sent 872 datagrams
+[  3] Server Report:
+[  3]  0.0-20.0 sec  1.22 MBytes   510 Kbits/sec   0.000 ms    3/  872 (0%)
+```
+
+Back on your NR-UE terminal you shall see:
+
+```bash
+[  3] local 12.1.1.2 port 5001 connected with 192.168.72.135 port 58800
+[ ID] Interval       Transfer     Bandwidth        Jitter   Lost/Total Datagrams
+[  3]  0.0- 1.0 sec  63.2 KBytes   517 Kbits/sec   1.113 ms    0/   44 (0%)
+[  3]  1.0- 2.0 sec  61.7 KBytes   506 Kbits/sec   1.466 ms    0/   43 (0%)
+[  3]  2.0- 3.0 sec  63.2 KBytes   517 Kbits/sec   1.770 ms    0/   44 (0%)
+[  3]  3.0- 4.0 sec  61.7 KBytes   506 Kbits/sec   1.378 ms    0/   43 (0%)
+[  3]  4.0- 5.0 sec  63.2 KBytes   517 Kbits/sec   1.614 ms    0/   44 (0%)
+[  3]  5.0- 6.0 sec  63.2 KBytes   517 Kbits/sec   1.427 ms    0/   44 (0%)
+[  3]  6.0- 7.0 sec  60.3 KBytes   494 Kbits/sec   1.507 ms    1/   43 (2.3%)
+[  3]  7.0- 8.0 sec  63.2 KBytes   517 Kbits/sec   1.409 ms    0/   44 (0%)
+[  3]  8.0- 9.0 sec  61.7 KBytes   506 Kbits/sec   1.525 ms    0/   43 (0%)
+[  3]  9.0-10.0 sec  63.2 KBytes   517 Kbits/sec   1.393 ms    0/   44 (0%)
+[  3] 10.0-11.0 sec  61.7 KBytes   506 Kbits/sec   1.377 ms    0/   43 (0%)
+[  3] 11.0-12.0 sec  63.2 KBytes   517 Kbits/sec   1.501 ms    0/   44 (0%)
+[  3] 12.0-13.0 sec  61.7 KBytes   506 Kbits/sec   1.788 ms    0/   43 (0%)
+[  3] 13.0-14.0 sec  63.2 KBytes   517 Kbits/sec   1.466 ms    0/   44 (0%)
+[  3] 14.0-15.0 sec  61.7 KBytes   506 Kbits/sec   1.381 ms    0/   43 (0%)
+[  3] 15.0-16.0 sec  61.7 KBytes   506 Kbits/sec   1.417 ms    1/   44 (2.3%)
+[  3] 16.0-17.0 sec  61.7 KBytes   506 Kbits/sec   1.569 ms    0/   43 (0%)
+[  3] 17.0-18.0 sec  63.2 KBytes   517 Kbits/sec   1.492 ms    1/   45 (2.2%)
+[  3] 18.0-19.0 sec  61.7 KBytes   506 Kbits/sec   1.376 ms    0/   43 (0%)
+[  3] 19.0-20.0 sec  61.7 KBytes   506 Kbits/sec   1.589 ms    0/   43 (0%)
+[  3]  0.0-20.0 sec  1.22 MBytes   510 Kbits/sec   1.551 ms    3/  872 (0.34%)
+```
+
+The `500 Kbits/sec` value may change depending on your CPU power!
+
+# 4. Un-deployment #
+
+```bash
+$ docker-compose down
+Stopping rfsim5g-oai-nr-ue  ... done
+Stopping rfsim5g-oai-gnb    ... done
+Stopping rfsim5g-oai-ext-dn ... done
+Stopping rfsim5g-oai-smf    ... done
+Stopping rfsim5g-oai-amf    ... done
+Stopping rfsim5g-oai-spgwu  ... done
+Stopping rfsim5g-oai-nrf    ... done
+Stopping rfsim5g-mysql      ... done
+Removing rfsim5g-oai-nr-ue  ... done
+Removing rfsim5g-oai-gnb    ... done
+Removing rfsim5g-oai-ext-dn ... done
+Removing rfsim5g-oai-smf    ... done
+Removing rfsim5g-oai-amf    ... done
+Removing rfsim5g-oai-spgwu  ... done
+Removing rfsim5g-oai-nrf    ... done
+Removing rfsim5g-mysql      ... done
+Removing network rfsim5g-oai-public-net
+Removing network rfsim5g-oai-traffic_net-net
+```
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/amf-healthcheck.sh b/ci-scripts/yaml_files/5g_rfsimulator/amf-healthcheck.sh
new file mode 100755
index 0000000000000000000000000000000000000000..8bfdee2aac6150b50240f7af4fa15a5eb105e9bc
--- /dev/null
+++ b/ci-scripts/yaml_files/5g_rfsimulator/amf-healthcheck.sh
@@ -0,0 +1,57 @@
+#!/bin/bash
+set -eo pipefail
+
+STATUS=0
+AMF_PORT_FOR_NGAP=38412
+AMF_PORT_FOR_N11_HTTP=80
+AMF_IP_NGAP_INTERFACE=$(ifconfig $AMF_INTERFACE_NAME_FOR_NGAP | grep inet | awk {'print $2'})
+AMF_IP_N11_INTERFACE=$(ifconfig $AMF_INTERFACE_NAME_FOR_N11 | grep inet | awk {'print $2'})
+N2_PORT_STATUS=$(netstat -Snpl | grep -o "$AMF_IP_NGAP_INTERFACE:$AMF_PORT_FOR_NGAP")
+N11_PORT_STATUS=$(netstat -tnpl | grep -o "$AMF_IP_N11_INTERFACE:$AMF_PORT_FOR_N11_HTTP")
+#Check if entrypoint properly configured the conf file and no parameter is unset (optional)
+NB_UNREPLACED_AT=`cat /openair-amf/etc/*.conf | grep -v contact@openairinterface.org | grep -c @ || true`
+
+if [ $NB_UNREPLACED_AT -ne 0 ]; then
+	STATUS=1
+	echo "Healthcheck error: configuration file is not configured properly"
+fi
+
+if [[ -z $N2_PORT_STATUS ]]; then
+	STATUS=1
+	echo "Healthcheck error: N2 SCTP port $AMF_PORT_FOR_NGAP is not listening"
+fi
+
+if [[ -z $N11_PORT_STATUS ]]; then
+	STATUS=1
+	echo "Healthcheck error: N11/SBI TCP/HTTP port $AMF_PORT_FOR_N11_HTTP is not listening"
+fi
+
+#host="${MYSQL_SERVER}"
+#user="${MYSQL_USER:-root}"
+#export MYSQL_PWD="${MYSQL_PASS}"
+
+#args=(
+#	-h"$host"
+#	-u"$user"
+#	--silent
+#)
+
+#if ! command -v mysql &> /dev/null; then
+#	echo "Installing mysql command"
+#	apt update
+#	apt-get -y install mysql-client
+#else
+#	if select="$(echo 'SELECT 1' | mysql "${args[@]}")" && [ "$select" = '1' ]; then
+#		database_check=$(mysql -h$host -u$user -D oai_db --silent -e "SELECT * FROM users;")
+#		if [[ -z $database_check ]]; then
+#			echo "Healthcheck error: oai_db not populated"
+#			STATUS=1
+#		fi
+#		STATUS=0
+#	else
+#		echo "Healthcheck error: Mysql port inactive"
+#		STATUS=1
+#	fi
+#fi
+
+exit $STATUS
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml b/ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..5da7a353ab3ccc373d9d7830c85775be06fb5dea
--- /dev/null
+++ b/ci-scripts/yaml_files/5g_rfsimulator/docker-compose.yaml
@@ -0,0 +1,293 @@
+version: '3.8'
+services:
+    oai-nrf:
+        container_name: "rfsim5g-oai-nrf"
+        image: oai-nrf:latest
+        environment:
+            - NRF_INTERFACE_NAME_FOR_SBI=eth0
+            - NRF_INTERFACE_PORT_FOR_SBI=80
+            - NRF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
+            - NRF_API_VERSION=v1
+            - INSTANCE=0
+            - PID_DIRECTORY=/var/run
+        networks:
+            public_net:
+                ipv4_address: 192.168.71.130
+        volumes:
+            - ./nrf-healthcheck.sh:/openair-nrf/bin/nrf-healthcheck.sh
+        healthcheck:
+            test: /bin/bash -c "/openair-nrf/bin/nrf-healthcheck.sh"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+    mysql:
+        container_name: "rfsim5g-mysql"
+        image: mysql:5.7
+        volumes:
+            - ./oai_db.sql:/docker-entrypoint-initdb.d/oai_db.sql
+            - ./mysql-healthcheck.sh:/tmp/mysql-healthcheck.sh
+        environment:
+            - TZ=Europe/Paris
+            - MYSQL_DATABASE=oai_db
+            - MYSQL_USER=test
+            - MYSQL_PASSWORD=test
+            - MYSQL_ROOT_PASSWORD=linux
+        healthcheck:
+            test: /bin/bash -c "/tmp/mysql-healthcheck.sh"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+        networks:
+            public_net:
+                ipv4_address: 192.168.71.131
+    oai-amf:
+        container_name: "rfsim5g-oai-amf"
+        image: oai-amf:latest
+        environment:
+            - TZ=Europe/paris
+            - INSTANCE=0
+            - PID_DIRECTORY=/var/run
+            - MCC=208
+            - MNC=99
+            - REGION_ID=128
+            - AMF_SET_ID=1
+            - SERVED_GUAMI_MCC_0=208
+            - SERVED_GUAMI_MNC_0=99
+            - SERVED_GUAMI_REGION_ID_0=128
+            - SERVED_GUAMI_AMF_SET_ID_0=1
+            - SERVED_GUAMI_MCC_1=460
+            - SERVED_GUAMI_MNC_1=11
+            - SERVED_GUAMI_REGION_ID_1=10
+            - SERVED_GUAMI_AMF_SET_ID_1=1
+            - PLMN_SUPPORT_MCC=208
+            - PLMN_SUPPORT_MNC=99
+            - PLMN_SUPPORT_TAC=0x0001
+            - SST_0=1
+            - SD_0=1
+            - SST_1=1
+            - SD_1=12
+            - AMF_INTERFACE_NAME_FOR_NGAP=eth0
+            - AMF_INTERFACE_NAME_FOR_N11=eth0
+            - SMF_INSTANCE_ID_0=1
+            - SMF_FQDN_0=oai-smf
+            - SMF_IPV4_ADDR_0=0.0.0.0
+            - SMF_HTTP_VERSION_0=v1
+            - SELECTED_0=true
+            - SMF_INSTANCE_ID_1=2
+            - SMF_FQDN_1=oai-smf
+            - SMF_IPV4_ADDR_1=0.0.0.0
+            - SMF_HTTP_VERSION_1=v1
+            - SELECTED_1=false
+            - MYSQL_SERVER=192.168.71.131
+            - MYSQL_USER=root
+            - MYSQL_PASS=linux
+            - MYSQL_DB=oai_db
+            - OPERATOR_KEY=c42449363bbad02b66d16bc975d77cc1
+            - NRF_IPV4_ADDRESS=192.168.71.130
+            - NRF_PORT=80
+            - NF_REGISTRATION=yes
+            - SMF_SELECTION=yes
+            - USE_FQDN_DNS=yes
+            - NRF_API_VERSION=v1
+            - NRF_FQDN=oai-nrf
+            - AUSF_IPV4_ADDRESS=127.0.0.1
+            - AUSF_PORT=80
+            - AUSF_API_VERSION=v1
+        depends_on:
+            - oai-nrf
+        volumes:
+            - ./amf-healthcheck.sh:/openair-amf/bin/amf-healthcheck.sh
+        healthcheck:
+            test: /bin/bash -c "/openair-amf/bin/amf-healthcheck.sh"
+            interval: 10s
+            timeout: 15s
+            retries: 5
+        networks:
+            public_net:
+                ipv4_address: 192.168.71.132
+    oai-smf:
+        container_name: "rfsim5g-oai-smf"
+        image: oai-smf:latest
+        entrypoint: /bin/bash -c "/openair-smf/bin/oai_smf -c /openair-smf/bin/oai-smf.conf -o"
+        environment:
+            - TZ=Europe/Paris
+            - INSTANCE=0
+            - PID_DIRECTORY=/var/run
+            - SMF_INTERFACE_NAME_FOR_N4=eth0
+            - SMF_INTERFACE_NAME_FOR_SBI=eth0
+            - SMF_INTERFACE_PORT_FOR_SBI=80
+            - SMF_INTERFACE_HTTP2_PORT_FOR_SBI=9090
+            - SMF_API_VERSION=v1
+            - DEFAULT_DNS_IPV4_ADDRESS=192.168.18.129
+            - DEFAULT_DNS_SEC_IPV4_ADDRESS=4.4.4.4
+            - AMF_IPV4_ADDRESS=0.0.0.0
+            - AMF_PORT=80
+            - AMF_API_VERSION=v1
+            - AMF_FQDN=oai-amf
+            - UDM_IPV4_ADDRESS=127.0.0.1
+            - UDM_PORT=80
+            - UDM_API_VERSION=v1
+            - UDM_FQDN=localhost
+            - UPF_IPV4_ADDRESS=192.168.71.134
+            - UPF_FQDN_0=oai-spgwu
+            - NRF_IPV4_ADDRESS=192.168.71.130
+            - NRF_PORT=80
+            - NRF_API_VERSION=v1
+            - NRF_FQDN=oai-nrf
+            - REGISTER_NRF=yes
+            - DISCOVER_UPF=yes
+            - USE_FQDN_DNS=yes
+        depends_on:
+            - oai-nrf
+        volumes:
+            - ./smf-healthcheck.sh:/openair-smf/bin/smf-healthcheck.sh
+            - ./oai-smf.conf:/openair-smf/bin/oai-smf.conf
+        healthcheck:
+            test: /bin/bash -c "/openair-smf/bin/smf-healthcheck.sh"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+        networks:
+            public_net:
+                ipv4_address: 192.168.71.133
+    oai-spgwu:
+        container_name: "rfsim5g-oai-spgwu"
+        image: oai-spgwu-tiny:latest
+        environment:
+            - TZ=Europe/Paris
+            - PID_DIRECTORY=/var/run
+            - SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP=eth0
+            - SGW_INTERFACE_NAME_FOR_SX=eth0
+            - PGW_INTERFACE_NAME_FOR_SGI=eth0
+            - NETWORK_UE_NAT_OPTION=yes
+            - NETWORK_UE_IP=12.1.1.0/24
+            - SPGWC0_IP_ADDRESS=192.168.71.133
+            - BYPASS_UL_PFCP_RULES=no
+            - MCC=208
+            - MNC=99
+            - MNC03=099
+            - TAC=1
+            - GTP_EXTENSION_HEADER_PRESENT=yes
+            - GW_ID=1
+            - REALM=openairinterface.org
+            - ENABLE_5G_FEATURES=yes
+            - REGISTER_NRF=yes
+            - USE_FQDN_NRF=yes
+            - UPF_FQDN_5G=oai-spgwu
+            - NRF_IPV4_ADDRESS=192.168.71.130
+            - NRF_PORT=80
+            - NRF_API_VERSION=v1
+            - NRF_FQDN=oai-nrf
+            - NSSAI_SST_0=1
+            - NSSAI_SD_0=1
+            - DNN_0=oai
+        depends_on:
+            - oai-nrf
+        cap_add:
+            - NET_ADMIN
+            - SYS_ADMIN
+        cap_drop:
+            - ALL
+        privileged: true
+        volumes:
+            - ./spgwu-healthcheck.sh:/openair-spgwu-tiny/bin/spgwu-healthcheck.sh
+        healthcheck:
+            test: /bin/bash -c "/openair-spgwu-tiny/bin/spgwu-healthcheck.sh"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+        networks:
+            public_net:
+                ipv4_address: 192.168.71.134
+            traffic_net:
+                ipv4_address: 192.168.72.134
+    oai-ext-dn:
+        image: ubuntu:bionic
+        privileged: true
+        container_name: rfsim5g-oai-ext-dn
+        entrypoint: /bin/bash -c \
+              "apt update; apt install -y procps iptables iproute2 iperf iputils-ping;"\
+              "iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;"\
+              "ip route add 12.1.1.0/24 via 192.168.72.134 dev eth0; sleep infinity"
+        depends_on:
+            - oai-spgwu
+        networks:
+            traffic_net:
+                ipv4_address: 192.168.72.135
+        healthcheck:
+            test: /bin/bash -c "ping -c 2 192.168.72.134"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+    oai-gnb:
+        image: oai-gnb:develop
+        privileged: true
+        container_name: rfsim5g-oai-gnb
+        environment: 
+            RFSIMULATOR: server
+            USE_SA_TDD_MONO: 'yes'
+            GNB_NAME: gnb-rfsim
+            TAC: 1
+            MCC: '208'
+            MNC: '99'
+            MNC_LENGTH: 2
+            NSSAI_SST: 1
+            NSSAI_SD0: 1
+            NSSAI_SD1: 112233
+            AMF_IP_ADDRESS: 192.168.71.132
+            GNB_NGA_IF_NAME: eth0
+            GNB_NGA_IP_ADDRESS: 192.168.71.136
+            GNB_NGU_IF_NAME: eth0
+            GNB_NGU_IP_ADDRESS: 192.168.71.136
+            USE_ADDITIONAL_OPTIONS: --sa -E --rfsim
+        depends_on:
+            - oai-ext-dn
+        networks:
+            public_net:
+                ipv4_address: 192.168.71.136
+        healthcheck:
+            test: /bin/bash -c "pgrep nr-softmodem"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+    oai-nr-ue:
+        image: oai-nr-ue:develop
+        privileged: true
+        container_name: rfsim5g-oai-nr-ue
+        environment: 
+            RFSIMULATOR: 192.168.71.136
+            FULL_IMSI: '208990100001100'
+            FULL_KEY: 'fec86ba6eb707ed08905757b1bb44b8f'
+            OPC: 'C42449363BBAD02B66D16BC975D77CC1'
+            DNN: oai
+            NSSAI_SST: 1
+            NSSAI_SD: 1
+            USE_ADDITIONAL_OPTIONS: -E --sa --rfsim -r 106 --numerology 1 -C 3619200000 --nokrnmod
+        depends_on:
+            - oai-gnb
+        networks:
+            public_net:
+                ipv4_address: 192.168.71.137
+        healthcheck:
+            test: /bin/bash -c "pgrep nr-uesoftmodem"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+networks:
+    public_net:
+        driver: bridge
+        name: rfsim5g-oai-public-net
+        ipam:
+            config:
+                - subnet: 192.168.71.128/26
+        driver_opts:
+            com.docker.network.bridge.name: "rfsim5g-public"
+    traffic_net:
+        driver: bridge
+        name: rfsim5g-oai-traffic_net-net
+        ipam:
+            config:
+                - subnet: 192.168.72.128/26
+        driver_opts:
+            com.docker.network.bridge.name: "rfsim5g-traffic"
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/mysql-healthcheck.sh b/ci-scripts/yaml_files/5g_rfsimulator/mysql-healthcheck.sh
new file mode 100755
index 0000000000000000000000000000000000000000..c92efb9f00a1f69e36dbc8bd410c163bb5d37a97
--- /dev/null
+++ b/ci-scripts/yaml_files/5g_rfsimulator/mysql-healthcheck.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+set -eo pipefail
+
+if [ "$MYSQL_ROOT_PASSWORD" ] && [ -z "$MYSQL_USER" ] && [ -z "$MYSQL_PASSWORD" ]; then
+	echo >&2 'Healthcheck error: cannot determine root password (and MYSQL_USER and MYSQL_PASSWORD were not set)'
+	exit 0
+fi
+
+host="$(hostname --ip-address || echo '127.0.0.1')"
+user="${MYSQL_USER:-root}"
+export MYSQL_PWD="${MYSQL_PASSWORD:-$MYSQL_ROOT_PASSWORD}"
+
+args=(
+	# force mysql to not use the local "mysqld.sock" (test "external" connectivity)
+	-h"$host"
+	-u"$user"
+	--silent
+)
+
+STATUS=0
+if command -v mysqladmin &> /dev/null; then
+	if mysqladmin "${args[@]}" ping > /dev/null; then
+		database_check=$(mysql -u$user -D oai_db --silent -e "SELECT * FROM users;")
+		if [[ -z $database_check ]]; then
+			echo "Healthcheck error: oai_db not populated"
+			STATUS=1
+		fi
+		STATUS=0
+	else
+		echo "Healthcheck error: Mysql port inactive"
+		STATUS=1
+	fi
+else
+	if select="$(echo 'SELECT 1' | mysql "${args[@]}")" && [ "$select" = '1' ]; then
+		database_check=$(mysql -u$user -D oai_db --silent -e "SELECT * FROM users;")
+		if [[ -z $database_check ]]; then
+			echo "Healthcheck error: oai_db not populated"
+			STATUS=1
+		fi
+		STATUS=0
+	else
+		echo "Healthcheck error: Mysql port inactive"
+		STATUS=1
+	fi
+fi
+exit $STATUS
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/nrf-healthcheck.sh b/ci-scripts/yaml_files/5g_rfsimulator/nrf-healthcheck.sh
new file mode 100755
index 0000000000000000000000000000000000000000..3479c092e8805bf45007d1a4635ee43149786401
--- /dev/null
+++ b/ci-scripts/yaml_files/5g_rfsimulator/nrf-healthcheck.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+set -eo pipefail
+
+STATUS=0
+NRF_IP_SBI_INTERFACE=$(ifconfig $NRF_INTERFACE_NAME_FOR_SBI | grep inet | awk {'print $2'})
+NRF_SBI_PORT_STATUS=$(netstat -tnpl | grep -o "$NRF_IP_SBI_INTERFACE:$NRF_INTERFACE_PORT_FOR_SBI")
+#Check if entrypoint properly configured the conf file and no parameter is unset(optional)
+NB_UNREPLACED_AT=`cat /openair-nrf/etc/*.conf | grep -v contact@openairinterface.org | grep -c @ || true`
+
+if [ $NB_UNREPLACED_AT -ne 0 ]; then
+	STATUS=1
+	echo "Healthcheck error: UNHEALTHY configuration file is not configured properly"
+fi
+
+if [[ -z $NRF_SBI_PORT_STATUS ]]; then
+	STATUS=1
+	echo "Healthcheck error: UNHEALTHY SBI TCP/HTTP port $NRF_INTERFACE_PORT_FOR_SBI is not listening."
+fi
+
+exit $STATUS
\ No newline at end of file
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/oai-end-to-end.jpg b/ci-scripts/yaml_files/5g_rfsimulator/oai-end-to-end.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..f454a016f624196c87baa431f5974d148ec677be
Binary files /dev/null and b/ci-scripts/yaml_files/5g_rfsimulator/oai-end-to-end.jpg differ
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/oai-smf.conf b/ci-scripts/yaml_files/5g_rfsimulator/oai-smf.conf
new file mode 100644
index 0000000000000000000000000000000000000000..0c83ab8be937cee03a6b1dc0931473e162c952df
--- /dev/null
+++ b/ci-scripts/yaml_files/5g_rfsimulator/oai-smf.conf
@@ -0,0 +1,133 @@
+################################################################################
+# Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The OpenAirInterface Software Alliance licenses this file to You under
+# the OAI Public License, Version 1.1  (the "License"); you may not use this file
+# except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.openairinterface.org/?page_id=698
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#-------------------------------------------------------------------------------
+# For more information about the OpenAirInterface (OAI) Software Alliance:
+#      contact@openairinterface.org
+################################################################################
+
+SMF =
+{
+    FQDN = "oai-smf-svc";               
+    INSTANCE      = 0;         # 0 is the default
+    PID_DIRECTORY = "/var/run";  # /var/run is the default
+
+    INTERFACES :
+    {
+        N4 :
+        {
+            # SMF binded interface for N4 communication (UPF)
+            INTERFACE_NAME = "eth0"; # YOUR NETWORK CONFIG HERE
+            IPV4_ADDRESS   = "read";                        
+         };
+
+        SBI :
+        {
+            # SMF binded interface for SBI interface (e.g., communication with AMF, UDM)
+            INTERFACE_NAME = "eth0";     # YOUR NETWORK CONFIG HERE
+            IPV4_ADDRESS   = "read";
+            PORT           = 80;       # YOUR NETWORK CONFIG HERE (default: 80)
+            HTTP2_PORT     = 9090; # YOUR NETWORK CONFIG HERE
+            API_VERSION    = "v1";                # YOUR SMF API VERSION CONFIG HERE
+         };                 
+
+    };
+
+
+    # Pool of UE assigned IP addresses
+    # Do not make IP pools overlap
+    # first IPv4 address X.Y.Z.1 is reserved for GTP network device on UPF
+    IP_ADDRESS_POOL :
+    {
+        IPV4_LIST = (
+                      {RANGE = "12.1.1.2 - 12.1.1.128";},         # STRING, IPv4 RANGE IP_start - IP_end, YOUR NETWORK CONFIG HERE.
+                      {RANGE = "12.1.1.129 - 12.1.1.224";},       # STRING, IPv4 RANGE IP_start - IP_end, YOUR NETWORK CONFIG HERE.
+                      {RANGE = "10.10.10.2 - 10.10.10.253";}  # STRING, IPv4 RANGE IP_start - IP_end, YOUR NETWORK CONFIG HERE.
+
+                    );
+        IPV6_LIST = (
+                      {PREFIX = "2001:1:2::/64";},                # STRING, IPv6 prefix, YOUR NETWORK CONFIG HERE.
+                      {PREFIX = "3001:1:2::/64";},                # STRING, IPv6 prefix, YOUR NETWORK CONFIG HERE.
+                      {PREFIX = "4001:1:2::/64";}                 # STRING, IPv6 prefix, YOUR NETWORK CONFIG HERE.
+                    );
+    };
+
+    DNN_LIST = (
+       # IPV4_POOL, IPV6_POOL are index in IPV4_LIST, IPV6_LIST, PDU_SESSION_TYPE choice in {IPv4, IPv6, IPv4v6}
+      {DNN_NI = "default"; PDU_SESSION_TYPE = "IPv4"; IPV4_POOL  = 2; IPV6_POOL = -1},
+      {DNN_NI = "carrier.com"; PDU_SESSION_TYPE = "IPv4"; IPV4_POOL = 1; IPV6_POOL = -1},
+      {DNN_NI = "oai"; PDU_SESSION_TYPE = "IPv4"; IPV4_POOL = 0; IPV6_POOL = -1}
+    );
+
+    # DNS address communicated to UEs
+    DEFAULT_DNS_IPV4_ADDRESS     = "192.168.18.129";      # YOUR DNS CONFIG HERE
+    DEFAULT_DNS_SEC_IPV4_ADDRESS = "192.168.18.129";  # YOUR DNS CONFIG HERE
+    DEFAULT_DNS_IPV6_ADDRESS     = "2001:4860:4860::8888";            # YOUR DNS CONFIG HERE
+    DEFAULT_DNS_SEC_IPV6_ADDRESS = "2001:4860:4860::8844";            # YOUR DNS CONFIG HERE
+ 
+    SUPPORT_FEATURES: 
+    {
+      # STRING, {"yes", "no"}, 
+      REGISTER_NRF = "yes";  # Set to yes if SMF resgisters to an NRF
+      DISCOVER_UPF = "yes";  # Set to yes to enable UPF discovery and selection
+      FORCE_PUSH_PROTOCOL_CONFIGURATION_OPTIONS = "no"; # Non standard feature, normally should be set to "no", 
+                                                        # but you may need to set to yes for UE that do not explicitly request a PDN address through NAS signalling
+      USE_LOCAL_SUBSCRIPTION_INFO = "yes";  # Set to yes if SMF uses local subscription information instead of from an UDM
+      USE_FQDN_DNS = "yes";                  # Set to yes if AMF/UDM/NRF/UPF will relying on a DNS to resolve FQDN
+    }  
+  
+    AMF :
+    {
+      IPV4_ADDRESS = "0.0.0.0";  # YOUR AMF CONFIG HERE
+      PORT         = 80;            # YOUR AMF CONFIG HERE (default: 80)
+      API_VERSION  = "v1";   # YOUR AMF API VERSION FOR SBI CONFIG HERE
+      FQDN         = "oai-amf"               # YOUR AMF FQDN CONFIG HERE
+    };
+    
+    UDM :
+    {
+      IPV4_ADDRESS = "127.0.0.1";  # YOUR UDM CONFIG HERE
+      PORT         = 80;            # YOUR UDM CONFIG HERE (default: 80)
+      API_VERSION  = "v1";   # YOUR UDM API VERSION FOR SBI CONFIG HERE
+      FQDN         = "localhost"      # YOUR UDM FQDN CONFIG HERE
+    };    
+
+    NRF :
+    {
+      IPV4_ADDRESS = "192.168.71.130";  # YOUR NRF CONFIG HERE
+      PORT         = 80;            # YOUR NRF CONFIG HERE (default: 80)
+      API_VERSION  = "v1";   # YOUR NRF API VERSION FOR SBI CONFIG HERE
+      FQDN         = "oai-nrf"      # YOUR NRF FQDN CONFIG HERE
+    };
+        
+    UPF_LIST = (
+         {IPV4_ADDRESS = "192.168.71.134" ; FQDN = "oai-spgwu"}   # YOUR UPF CONFIG HERE
+    );   
+   
+    LOCAL_CONFIGURATION :
+    {
+      SESSION_MANAGEMENT_SUBSCRIPTION_LIST = (
+         { NSSAI_SST = 222, NSSAI_SD = "123", DNN = "default", DEFAULT_SESSION_TYPE = "IPV4", DEFAULT_SSC_MODE = 1, 
+           QOS_PROFILE_5QI = 7, QOS_PROFILE_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PREEMPTCAP = "NOT_PREEMPT", 
+           QOS_PROFILE_ARP_PREEMPTVULN = "NOT_PREEMPTABLE", SESSION_AMBR_UL = "20Mbps", SESSION_AMBR_DL = "22Mbps"},
+         { NSSAI_SST = 1; NSSAI_SD = "1", DNN = "oai", DEFAULT_SESSION_TYPE = "IPV4", DEFAULT_SSC_MODE = 1, 
+           QOS_PROFILE_5QI = 6, QOS_PROFILE_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PRIORITY_LEVEL = 1, QOS_PROFILE_ARP_PREEMPTCAP = "NOT_PREEMPT", 
+           QOS_PROFILE_ARP_PREEMPTVULN = "NOT_PREEMPTABLE", SESSION_AMBR_UL = "20Mbps", SESSION_AMBR_DL = "22Mbps"}
+        );                 
+    };   
+    
+};
+
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/oai_db.sql b/ci-scripts/yaml_files/5g_rfsimulator/oai_db.sql
new file mode 100755
index 0000000000000000000000000000000000000000..fbd7907a71edd41cc32016f91176b270b8b5bd11
--- /dev/null
+++ b/ci-scripts/yaml_files/5g_rfsimulator/oai_db.sql
@@ -0,0 +1,217 @@
+-- MySQL dump 10.13  Distrib 5.5.46, for debian-linux-gnu (x86_64)
+--
+-- Host: localhost    Database: oai_db
+-- ------------------------------------------------------
+-- Server version	5.5.46-0ubuntu0.14.04.2
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+--
+-- Table structure for table `apn`
+--
+
+DROP TABLE IF EXISTS `apn`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `apn` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `apn-name` varchar(60) NOT NULL,
+  `pdn-type` enum('IPv4','IPv6','IPv4v6','IPv4_or_IPv6') NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `apn-name` (`apn-name`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `apn`
+--
+
+LOCK TABLES `apn` WRITE;
+/*!40000 ALTER TABLE `apn` DISABLE KEYS */;
+/*!40000 ALTER TABLE `apn` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `mmeidentity`
+--
+
+DROP TABLE IF EXISTS `mmeidentity`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `mmeidentity` (
+  `idmmeidentity` int(11) NOT NULL AUTO_INCREMENT,
+  `mmehost` varchar(255) DEFAULT NULL,
+  `mmerealm` varchar(200) DEFAULT NULL,
+  `UE-Reachability` tinyint(1) NOT NULL COMMENT 'Indicates whether the MME supports UE Reachability Notifcation',
+  PRIMARY KEY (`idmmeidentity`)
+) ENGINE=MyISAM AUTO_INCREMENT=46 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `mmeidentity`
+--
+
+LOCK TABLES `mmeidentity` WRITE;
+/*!40000 ALTER TABLE `mmeidentity` DISABLE KEYS */;
+INSERT INTO `mmeidentity` VALUES (2,'mme2.openair4G.eur','openair4G.eur',0),(1,'nano.openair4G.eur','openair4G.eur',0),(5,'abeille.openair4G.eur','openair4G.eur',0),(4,'yang.openair4G.eur','openair4G.eur',0),(3,'mme3.openair4G.eur','openair4G.eur',0),(6,'calisson.openair4G.eur','openair4G.eur',0);
+/*!40000 ALTER TABLE `mmeidentity` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `pdn`
+--
+
+DROP TABLE IF EXISTS `pdn`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `pdn` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `apn` varchar(60) NOT NULL,
+  `pdn_type` enum('IPv4','IPv6','IPv4v6','IPv4_or_IPv6') NOT NULL DEFAULT 'IPv4',
+  `pdn_ipv4` varchar(15) DEFAULT '0.0.0.0',
+  `pdn_ipv6` varchar(45) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT '0:0:0:0:0:0:0:0',
+  `aggregate_ambr_ul` int(10) unsigned DEFAULT '50000000',
+  `aggregate_ambr_dl` int(10) unsigned DEFAULT '100000000',
+  `pgw_id` int(11) NOT NULL,
+  `users_imsi` varchar(15) NOT NULL,
+  `qci` tinyint(3) unsigned NOT NULL DEFAULT '9',
+  `priority_level` tinyint(3) unsigned NOT NULL DEFAULT '15',
+  `pre_emp_cap` enum('ENABLED','DISABLED') DEFAULT 'DISABLED',
+  `pre_emp_vul` enum('ENABLED','DISABLED') DEFAULT 'DISABLED',
+  `LIPA-Permissions` enum('LIPA-prohibited','LIPA-only','LIPA-conditional') NOT NULL DEFAULT 'LIPA-only',
+  PRIMARY KEY (`id`,`pgw_id`,`users_imsi`),
+  KEY `fk_pdn_pgw1_idx` (`pgw_id`),
+  KEY `fk_pdn_users1_idx` (`users_imsi`)
+) ENGINE=MyISAM AUTO_INCREMENT=60 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `pdn`
+--
+
+LOCK TABLES `pdn` WRITE;
+/*!40000 ALTER TABLE `pdn` DISABLE KEYS */;
+INSERT INTO `pdn` VALUES (1,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000001',9,15,'DISABLED','ENABLED','LIPA-only'),(41,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'20834123456789',9,15,'DISABLED','ENABLED','LIPA-only'),(40,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'20810000001234',9,15,'DISABLED','ENABLED','LIPA-only'),(42,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'31002890832150',9,15,'DISABLED','ENABLED','LIPA-only'),(16,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000002',9,15,'DISABLED','ENABLED','LIPA-only'),(43,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'001010123456789',9,15,'DISABLED','ENABLED','LIPA-only'),(2,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000002',9,15,'DISABLED','ENABLED','LIPA-only'),(3,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000003',9,15,'DISABLED','ENABLED','LIPA-only'),(4,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000004',9,15,'DISABLED','ENABLED','LIPA-only'),(5,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000005',9,15,'DISABLED','ENABLED','LIPA-only'),(6,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000006',9,15,'DISABLED','ENABLED','LIPA-only'),(7,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930000000007',9,15,'DISABLED','ENABLED','LIPA-only'),(8,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000001',9,15,'DISABLED','ENABLED','LIPA-only'),(9,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000002',9,15,'DISABLED','ENABLED','LIPA-only'),(10,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000003',9,15,'DISABLED','ENABLED','LIPA-only'),(11,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000004',9,15,'DISABLED','ENABLED','LIPA-only'),(12,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000005',9,15,'DISABLED','ENABLED','LIPA-only'),(13,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000006',9,15,'DISABLED','ENABLED','LIPA-only'),(14,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208940000000007',9,15,'DISABLED','ENABLED','LIPA-only'),(15,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000001',9,15,'DISABLED','ENABLED','LIPA-only'),(17,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000003',9,15,'DISABLED','ENABLED','LIPA-only'),(18,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000004',9,15,'DISABLED','ENABLED','LIPA-only'),(19,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000005',9,15,'DISABLED','ENABLED','LIPA-only'),(20,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000006',9,15,'DISABLED','ENABLED','LIPA-only'),(21,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000007',9,15,'DISABLED','ENABLED','LIPA-only'),(22,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001100',9,15,'DISABLED','ENABLED','LIPA-only'),(23,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001101',9,15,'DISABLED','ENABLED','LIPA-only'),(24,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001102',9,15,'DISABLED','ENABLED','LIPA-only'),(25,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001103',9,15,'DISABLED','ENABLED','LIPA-only'),(26,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001104',9,15,'DISABLED','ENABLED','LIPA-only'),(27,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001105',9,15,'DISABLED','ENABLED','LIPA-only'),(28,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001106',9,15,'DISABLED','ENABLED','LIPA-only'),(29,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001107',9,15,'DISABLED','ENABLED','LIPA-only'),(30,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001108',9,15,'DISABLED','ENABLED','LIPA-only'),(31,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001109',9,15,'DISABLED','ENABLED','LIPA-only'),(32,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001110',9,15,'DISABLED','ENABLED','LIPA-only'),(33,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001111',9,15,'DISABLED','ENABLED','LIPA-only'),(34,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001112',9,15,'DISABLED','ENABLED','LIPA-only'),(35,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001113',9,15,'DISABLED','ENABLED','LIPA-only'),(44,'operator','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001113',9,15,'DISABLED','ENABLED','LIPA-only'),(45,'operator','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001112',9,15,'DISABLED','ENABLED','LIPA-only'),(46,'operator','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208930100001111',9,15,'DISABLED','ENABLED','LIPA-only'),(47,'operator','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000002',9,15,'DISABLED','ENABLED','LIPA-only'),(48,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000008',9,15,'DISABLED','ENABLED','LIPA-only'),(49,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000009',9,15,'DISABLED','ENABLED','LIPA-only'),(50,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000010',9,15,'DISABLED','ENABLED','LIPA-only'),(51,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000011',9,15,'DISABLED','ENABLED','LIPA-only'),(52,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000012',9,15,'DISABLED','ENABLED','LIPA-only'),(53,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000013',9,15,'DISABLED','ENABLED','LIPA-only'),(54,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000014',9,15,'DISABLED','ENABLED','LIPA-only'),(55,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208950000000015',9,15,'DISABLED','ENABLED','LIPA-only'),(56,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001118',9,15,'DISABLED','ENABLED','LIPA-only'),(57,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001121',9,15,'DISABLED','ENABLED','LIPA-only'),(58,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001120',9,15,'DISABLED','ENABLED','LIPA-only'),(59,'oai.ipv4','IPv4','0.0.0.0','0:0:0:0:0:0:0:0',50000000,100000000,3,'208920100001119',9,15,'DISABLED','ENABLED','LIPA-only');
+/*!40000 ALTER TABLE `pdn` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `pgw`
+--
+
+DROP TABLE IF EXISTS `pgw`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `pgw` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `ipv4` varchar(15) NOT NULL,
+  `ipv6` varchar(39) NOT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `ipv4` (`ipv4`),
+  UNIQUE KEY `ipv6` (`ipv6`)
+) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `pgw`
+--
+
+LOCK TABLES `pgw` WRITE;
+/*!40000 ALTER TABLE `pgw` DISABLE KEYS */;
+INSERT INTO `pgw` VALUES (1,'127.0.0.1','0:0:0:0:0:0:0:1'),(2,'192.168.56.101',''),(3,'10.0.0.2','0');
+/*!40000 ALTER TABLE `pgw` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `terminal-info`
+--
+
+DROP TABLE IF EXISTS `terminal-info`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `terminal-info` (
+  `imei` varchar(15) NOT NULL,
+  `sv` varchar(2) NOT NULL,
+  UNIQUE KEY `imei` (`imei`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `terminal-info`
+--
+
+LOCK TABLES `terminal-info` WRITE;
+/*!40000 ALTER TABLE `terminal-info` DISABLE KEYS */;
+/*!40000 ALTER TABLE `terminal-info` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `users`
+--
+
+DROP TABLE IF EXISTS `users`;
+/*!40101 SET @saved_cs_client     = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `users` (
+  `imsi` varchar(15) NOT NULL COMMENT 'IMSI is the main reference key.',
+  `msisdn` varchar(46) DEFAULT NULL COMMENT 'The basic MSISDN of the UE (Presence of MSISDN is optional).',
+  `imei` varchar(15) DEFAULT NULL COMMENT 'International Mobile Equipment Identity',
+  `imei_sv` varchar(2) DEFAULT NULL COMMENT 'International Mobile Equipment Identity Software Version Number',
+  `ms_ps_status` enum('PURGED','NOT_PURGED') DEFAULT 'PURGED' COMMENT 'Indicates that ESM and EMM status are purged from MME',
+  `rau_tau_timer` int(10) unsigned DEFAULT '120',
+  `ue_ambr_ul` bigint(20) unsigned DEFAULT '50000000' COMMENT 'The Maximum Aggregated uplink MBRs to be shared across all Non-GBR bearers according to the subscription of the user.',
+  `ue_ambr_dl` bigint(20) unsigned DEFAULT '100000000' COMMENT 'The Maximum Aggregated downlink MBRs to be shared across all Non-GBR bearers according to the subscription of the user.',
+  `access_restriction` int(10) unsigned DEFAULT '60' COMMENT 'Indicates the access restriction subscription information. 3GPP TS.29272 #7.3.31',
+  `mme_cap` int(10) unsigned zerofill DEFAULT NULL COMMENT 'Indicates the capabilities of the MME with respect to core functionality e.g. regional access restrictions.',
+  `mmeidentity_idmmeidentity` int(11) NOT NULL DEFAULT '0',
+  `key` varbinary(16) NOT NULL DEFAULT '0' COMMENT 'UE security key',
+  `RFSP-Index` smallint(5) unsigned NOT NULL DEFAULT '1' COMMENT 'An index to specific RRM configuration in the E-UTRAN. Possible values from 1 to 256',
+  `urrp_mme` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'UE Reachability Request Parameter indicating that UE activity notification from MME has been requested by the HSS.',
+  `sqn` bigint(20) unsigned zerofill NOT NULL,
+  `rand` varbinary(16) NOT NULL,
+  `OPc` varbinary(16) DEFAULT NULL COMMENT 'Can be computed by HSS',
+  PRIMARY KEY (`imsi`,`mmeidentity_idmmeidentity`),
+  KEY `fk_users_mmeidentity_idx1` (`mmeidentity_idmmeidentity`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `users`
+--
+
+LOCK TABLES `users` WRITE;
+/*!40000 ALTER TABLE `users` DISABLE KEYS */;
+INSERT INTO `users` VALUES ('20834123456789','380561234567','35609204079300',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,'+�E��ų\0�,IH��H',0,0,00000000000000000096,'Px�X \Z1��x��','^��K�����FeU���'),('20810000001234','33611123456','35609204079299',NULL,'PURGED',120,40000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000281454575616225,'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0','�4�s@���z��~�'),('31002890832150','33638060059','35611302209414',NULL,'PURGED',120,40000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000012416,'`�F�݆��D��ϛ���','�4�s@���z��~�'),('001010123456789','33600101789','35609204079298',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'\0	\n\r',1,0,00000000000000000351,'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0','L�*\\�����^��]� '),('208930000000001','33638030001','35609204079301',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208950000000002','33638050002','35609204079502',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000020471,'\0	\n\r','�4�s@���z��~�'),('208950000000003','33638050003','35609204079503',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000012343,'\0	\n\r','�4�s@���z��~�'),('208950000000004','33638050004','35609204079504',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000005','33638050005','35609204079505',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000001','33638050001','35609204079501',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208950000000006','33638050006','35609204079506',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000007','33638050007','35609204079507',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208930000000002','33638030002','35609204079302',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208930000000003','33638030003','35609204079303',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208930000000004','33638030004','35609204079304',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208930000000005','33638030005','35609204079305',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208930000000006','33638030006','35609204079306',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208930000000007','33638030007','35609204079307',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000007','33638040007','35609204079407',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000006','33638040006','35609204079406',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000005','33638040005','35609204079405',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000004','33638040004','35609204079404',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000003','33638040003','35609204079403',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000002','33638040002','35609204079402',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208940000000001','33638040001','35609204079401',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'��wq��gzW�Ё��Z]','�4�s@���z��~�'),('208920100001100','33638020001','35609204079201',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001101','33638020001','35609204079201',NULL,'NOT_PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000281044204937234,'\0	\n\r','�$I6;��+f�k�u�|�'),('208920100001102','33638020002','35609204079202',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001103','33638020003','35609204079203',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001104','33638020004','35609204079204',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001105','33638020005','35609204079205',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001106','33638020006','35609204079206',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000000000000006103,'ebd07771ace8677a','�$I6;��+f�k�u�|�'),('208920100001107','33638020007','35609204079207',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001108','33638020008','35609204079208',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001109','33638020009','35609204079209',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208920100001110','33638020010','35609204079210',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208930100001111','33638030011','35609304079211',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208930100001112','33638030012','35609304079212',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006103,'ebd07771ace8677a','�4�s@���z��~�'),('208930100001113','33638030013','35609304079213',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000006263,'�SNܒ�Iv��e�6','�4�s@���z��~�'),('208950000000008','33638050008','35609204079508',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000009','33638050009','35609204079509',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000010','33638050010','35609204079510',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000011','33638050011','35609204079511',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000012','33638050012','35609204079512',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000013','33638050013','35609204079513',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000014','33638050014','35609204079514',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000012215,'56f0261d9d051063','�4�s@���z��~�'),('208950000000015','33638050015','35609204079515',NULL,'PURGED',120,50000000,100000000,47,0000000000,1,'��G?/�Д����	|hb',1,0,00000000000000000000,'3536663032363164','�4�s@���z��~�'),('208920100001118','33638020010','35609204079210',NULL,'NOT_PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000281044204934762,'~?03�u-%�ey�y�','�$I6;��+f�k�u�|�'),('208920100001121','33638020010','35609204079210',NULL,'NOT_PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000281044204935293,'&��@xg�]���\n��Vp','�$I6;��+f�k�u�|�'),('208920100001119','33638020010','35609204079210',NULL,'NOT_PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000281044204935293,'269482407867805d','�$I6;��+f�k�u�|�'),('208920100001120','33638020010','35609204079210',NULL,'NOT_PURGED',120,50000000,100000000,47,0000000000,1,'��k��p~Љu{�K�',1,0,00000281044204935293,'3236393438323430','�$I6;��+f�k�u�|�');
+INSERT INTO `users` VALUES ('208990100001100','1','55000000000000',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0xfec86ba6eb707ed08905757b1bb44b8f,0,0,0x40,'ebd07771ace8677a',0xc42449363bbad02b66d16bc975d77cc1);
+INSERT INTO `users` VALUES ('208950000000031','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
+INSERT INTO `users` VALUES ('208950000000032','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
+INSERT INTO `users` VALUES ('208950000000033','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
+INSERT INTO `users` VALUES ('208950000000034','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
+INSERT INTO `users` VALUES ('208950000000035','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
+INSERT INTO `users` VALUES ('208950000000036','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
+INSERT INTO `users` VALUES ('208950000000037','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
+INSERT INTO `users` VALUES ('208950000000038','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
+INSERT INTO `users` VALUES ('208950000000039','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
+INSERT INTO `users` VALUES ('208950000000040','380561234567','55000000000001',NULL,'PURGED',50,40000000,100000000,47,0000000000,1,0x0C0A34601D4F07677303652C0462535B,0,0,0x40,'ebd07771ace8677a',0x63bfa50ee6523365ff14c1f45f88737d);
+/*!40000 ALTER TABLE `users` ENABLE KEYS */;
+UNLOCK TABLES;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+-- Dump completed on 2016-06-28 11:41:40
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/smf-healthcheck.sh b/ci-scripts/yaml_files/5g_rfsimulator/smf-healthcheck.sh
new file mode 100755
index 0000000000000000000000000000000000000000..d9ff7608e80d8ec5e840e94bcf074d27759c702d
--- /dev/null
+++ b/ci-scripts/yaml_files/5g_rfsimulator/smf-healthcheck.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+set -eo pipefail
+
+STATUS=0
+SMF_IP_SBI_INTERFACE=$(ifconfig $SMF_INTERFACE_NAME_FOR_SBI | grep inet | awk {'print $2'})
+SMF_SBI_PORT_STATUS=$(netstat -tnpl | grep -o "$SMF_IP_SBI_INTERFACE:$SMF_INTERFACE_PORT_FOR_SBI")
+
+#Check if entrypoint properly configured the conf file and no parameter is unset(optional)
+#NB_UNREPLACED_AT=`cat /openair-smf/etc/*.conf | grep -v contact@openairinterface.org | grep -c @ || true`
+
+#if [ $NB_UNREPLACED_AT -ne 0 ]; then
+#	STATUS=-1
+#	echo "Healthcheck error: UNHEALTHY configuration file is not configured properly"
+#fi
+#
+if [[ -z $SMF_SBI_PORT_STATUS ]]; then
+	STATUS=-1
+	echo "Healthcheck error: UNHEALTHY SBI TCP/HTTP port $SMF_INTERFACE_PORT_FOR_SBI is not listening."
+fi
+
+exit $STATUS
diff --git a/ci-scripts/yaml_files/5g_rfsimulator/spgwu-healthcheck.sh b/ci-scripts/yaml_files/5g_rfsimulator/spgwu-healthcheck.sh
new file mode 100755
index 0000000000000000000000000000000000000000..0e3b67ee7e5653a19552ceae70abd36b04a223a7
--- /dev/null
+++ b/ci-scripts/yaml_files/5g_rfsimulator/spgwu-healthcheck.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+set -eo pipefail
+
+STATUS=0
+SGW_PORT_FOR_S1U_S12_S4_UP=2152
+SGW_PORT_FOR_SX=8805
+SGW_IP_S1U_INTERFACE=$(ifconfig $SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP | grep inet | awk {'print $2'})
+SGW_IP_SX_INTERFACE=$(ifconfig $SGW_INTERFACE_NAME_FOR_SX | grep inet | awk {'print $2'})
+S1U_S12_S4_UP_PORT_STATUS=$(netstat -unpl | grep -o "$SGW_IP_S1U_INTERFACE:$SGW_PORT_FOR_S1U_S12_S4_UP")
+SX_PORT_STATUS=$(netstat -unpl | grep -o "$SGW_IP_SX_INTERFACE:$SGW_PORT_FOR_SX")
+#Check if entrypoint properly configured the conf file and no parameter is unset (optional)
+NB_UNREPLACED_AT=`cat /openair-spgwu/etc/*.conf | grep -v contact@openairinterface.org | grep -c @ || true`
+if [ $NB_UNREPLACED_AT -ne 0 ]; then
+	STATUS=1
+	echo "Healthcheck error: UNHEALTHY configuration file is not configured properly"
+fi
+
+if [[ -z $S1U_S12_S4_UP_PORT_STATUS ]]; then
+	STATUS=1
+	echo "Healthcheck error: UNHEALTHY S1U port $SGW_PORT_FOR_S1U_S12_S4_UP is not listening."
+fi
+
+if [[ -z $SX_PORT_STATUS ]]; then
+	STATUS=1
+	echo "Healthcheck error: UNHEALTHY SX port $SGW_PORT_FOR_SX is not listening."
+fi
+
+exit $STATUS
\ No newline at end of file
diff --git a/ci-scripts/yaml_files/fr1_epc_tim/docker-compose.yml b/ci-scripts/yaml_files/fr1_epc_tim/docker-compose.yml
index 28ae154838aed5b750eb9954ef7467f05318198d..73a6b3a1fff2b10258d0ed3dbcb21a4878c86681 100644
--- a/ci-scripts/yaml_files/fr1_epc_tim/docker-compose.yml
+++ b/ci-scripts/yaml_files/fr1_epc_tim/docker-compose.yml
@@ -40,18 +40,19 @@ services:
             private_net:
                 ipv4_address: 192.168.68.3
             public_net:
-                ipv4_address: 192.168.61.2
+                ipv4_address: 192.168.61.194
         environment:
+            TZ: Europe/Paris
             REALM: openairinterface.org
             HSS_FQDN: hss.openairinterface.org
             PREFIX: /openair-hss/etc
             cassandra_Server_IP: 192.168.68.2
             OP_KEY: 1006020f0a478bf6b699f15c062e42b3
-            LTE_K: fec86ba6eb707ed08905757b1bb44b8f
+            LTE_K: FEC86BA6EB707ED08905757B1BB44B8F 
             APN1: oai.ipv4
-            APN2: internet
-            FIRST_IMSI: 222010100001120
-            NB_USERS: 10
+            APN2: oai2.ipv4
+            FIRST_IMSI: 208990100001127 
+            NB_USERS: 5
         healthcheck:
             test: /bin/bash -c "pgrep oai_hss"
             interval: 10s
@@ -65,45 +66,46 @@ services:
         depends_on: [oai_hss]
         networks:
             public_net:
-                ipv4_address: 192.168.61.3
+                ipv4_address: 192.168.61.195
         environment:
+            TZ: Europe/Paris
             REALM: openairinterface.org
             PREFIX: /openair-mme/etc
             INSTANCE: 1
             PID_DIRECTORY: /var/run
-            HSS_IP_ADDR: 192.168.61.2
+            HSS_IP_ADDR: 192.168.61.194
             HSS_HOSTNAME: hss
             HSS_FQDN: hss.openairinterface.org
             HSS_REALM: openairinterface.org
-            MCC: '222'
-            MNC: '01'
+            MCC: '208'
+            MNC: '99'
             MME_GID: 32768
             MME_CODE: 3
             TAC_0: 1
             TAC_1: 2
             TAC_2: 3
             MME_FQDN: mme.openairinterface.org
-            MME_S6A_IP_ADDR: 192.168.61.3
+            MME_S6A_IP_ADDR: 192.168.61.195
             MME_INTERFACE_NAME_FOR_S1_MME: eth0
-            MME_IPV4_ADDRESS_FOR_S1_MME: 192.168.61.3
+            MME_IPV4_ADDRESS_FOR_S1_MME: 192.168.61.195
             MME_INTERFACE_NAME_FOR_S11: eth0
-            MME_IPV4_ADDRESS_FOR_S11: 192.168.61.3
+            MME_IPV4_ADDRESS_FOR_S11: 192.168.61.195
             MME_INTERFACE_NAME_FOR_S10: lo
             MME_IPV4_ADDRESS_FOR_S10: 127.0.0.10
             OUTPUT: CONSOLE
-            SGW_IPV4_ADDRESS_FOR_S11_0: 192.168.61.4
+            SGW_IPV4_ADDRESS_FOR_S11_0: 192.168.61.196
             PEER_MME_IPV4_ADDRESS_FOR_S10_0: 0.0.0.0
             PEER_MME_IPV4_ADDRESS_FOR_S10_1: 0.0.0.0
-            MCC_SGW_0: '222'
-            MNC3_SGW_0: '001'
+            MCC_SGW_0: '208'
+            MNC3_SGW_0: '099'
             TAC_LB_SGW_0: '01'
             TAC_HB_SGW_0: '00'
-            MCC_MME_0: '222'
-            MNC3_MME_0: '001'
+            MCC_MME_0: '208'
+            MNC3_MME_0: '099'
             TAC_LB_MME_0: '02'
             TAC_HB_MME_0: '00'
-            MCC_MME_1: '222'
-            MNC3_MME_1: '001'
+            MCC_MME_1: '208'
+            MNC3_MME_1: '099'
             TAC_LB_MME_1: '03'
             TAC_HB_MME_1: '00'
             TAC_LB_SGW_TEST_0: '03'
@@ -122,18 +124,25 @@ services:
         container_name: prod-oai-spgwc
         networks:
             public_net:
-                ipv4_address: 192.168.61.4
+                ipv4_address: 192.168.61.196
         environment:
-            PID_DIRECTORY: /var/run
+            TZ: Europe/Paris
             SGW_INTERFACE_NAME_FOR_S11: eth0
-            SGW_IP_FOR_S5_S8_CP: 127.0.0.11/8
-            PGW_IP_FOR_S5_S8_CP: 127.0.0.12/8
             PGW_INTERFACE_NAME_FOR_SX: eth0
-            DEFAULT_APN: oai.ipv4
             DEFAULT_DNS_IPV4_ADDRESS: 192.168.18.129
             DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
-            UE_IP_ADDRESS_POOL: '12.1.1.2 - 12.1.1.254'
-            PUSH_PROTOCOL_OPTION: 'yes'
+            PUSH_PROTOCOL_OPTION: 'true'
+            APN_NI_1: oai.ipv4
+            APN_NI_2: oai2.ipv4
+            DEFAULT_APN_NI_1: oai.ipv4
+            UE_IP_ADDRESS_POOL_1: '12.1.1.2 - 12.1.1.254'
+            UE_IP_ADDRESS_POOL_2: '12.0.0.2 - 12.0.0.254'
+            MCC: '208'
+            MNC: '99'
+            MNC03: '099'
+            TAC: 1
+            GW_ID: 1
+            REALM: openairinterface.org
         healthcheck:
             test: /bin/bash -c "pgrep oai_spgwc"
             interval: 10s
@@ -147,45 +156,39 @@ services:
         depends_on: [oai_spgwc]
         networks:
             public_net:
-                ipv4_address: 192.168.61.5
+                ipv4_address: 192.168.61.197
         environment:
+            TZ: Europe/Paris
             PID_DIRECTORY: /var/run
             INSTANCE: 1
             SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP: eth0
             PGW_INTERFACE_NAME_FOR_SGI: eth0
             SGW_INTERFACE_NAME_FOR_SX: eth0
-            SPGWC0_IP_ADDRESS: 192.168.61.4
+            SPGWC0_IP_ADDRESS: 192.168.61.196
             NETWORK_UE_IP: '12.1.1.0/24'
             NETWORK_UE_NAT_OPTION: 'yes'
+            MCC: '208'
+            MNC: '99'
+            MNC03: '099'
+            TAC: 1
+            GW_ID: 1
+            REALM: openairinterface.org
         healthcheck:
             test: /bin/bash -c "pgrep oai_spgwu"
             interval: 10s
             timeout: 5s
             retries: 5
 
-    flexran_rtc:
-        image: flexran-rtc:production
-        privileged: true
-        container_name: prod-flexran-rtc
-        networks:
-            public_net:
-                ipv4_address: 192.168.61.10
-        healthcheck:
-            test: /bin/bash -c "pgrep rt_controller"
-            interval: 10s
-            timeout: 5s
-            retries: 5
-
     trf_gen:
         image: trf-gen:production
         privileged: true
         container_name: prod-trf-gen
         networks:
             public_net:
-                ipv4_address: 192.168.61.11
-        entrypoint: /bin/bash -c "ip route add 12.1.1.0/24 via 192.168.61.5 dev eth0; sleep infinity"
+                ipv4_address: 192.168.61.200
+        entrypoint: /bin/bash -c "ip route add 12.1.1.0/24 via 192.168.61.197 dev eth0; sleep infinity"
         healthcheck:
-            test: /bin/bash -c "ping -c 2 192.168.61.5"
+            test: /bin/bash -c "ping -c 2 192.168.61.197"
             interval: 10s
             timeout: 5s
             retries: 5
@@ -200,4 +203,4 @@ networks:
         name: prod-oai-public-net
         ipam:
             config:
-                - subnet: 192.168.61.0/26
+                - subnet: 192.168.61.192/26
diff --git a/ci-scripts/yaml_files/fr1_epc_tim/docker-compose.yml.orig b/ci-scripts/yaml_files/fr1_epc_tim/docker-compose.yml.orig
new file mode 100644
index 0000000000000000000000000000000000000000..28ae154838aed5b750eb9954ef7467f05318198d
--- /dev/null
+++ b/ci-scripts/yaml_files/fr1_epc_tim/docker-compose.yml.orig
@@ -0,0 +1,203 @@
+version: '3.8'
+
+services:
+    cassandra:
+        image: cassandra:2.1
+        container_name: prod-cassandra
+        networks:
+            private_net:
+                ipv4_address: 192.168.68.2
+        environment:
+            CASSANDRA_CLUSTER_NAME: "OAI HSS Cluster"
+            CASSANDRA_ENDPOINT_SNITCH: GossipingPropertyFileSnitch
+        healthcheck:
+            test: /bin/bash -c "nodetool status"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+    db_init:
+        image: cassandra:2.1
+        container_name: prod-db-init
+        depends_on: [cassandra]
+        deploy:
+            restart_policy:
+                condition: on-failure
+                max_attempts: 10
+        networks:
+            private_net:
+                ipv4_address: 192.168.68.4
+        volumes:
+            - ./oai_db.cql:/home/oai_db.cql
+        entrypoint: /bin/bash -c "cqlsh --file /home/oai_db.cql 192.168.68.2 && echo 'OK'"
+
+    oai_hss:
+        image: oai-hss:production
+        container_name: prod-oai-hss
+        privileged: true
+        depends_on: [cassandra]
+        networks:
+            private_net:
+                ipv4_address: 192.168.68.3
+            public_net:
+                ipv4_address: 192.168.61.2
+        environment:
+            REALM: openairinterface.org
+            HSS_FQDN: hss.openairinterface.org
+            PREFIX: /openair-hss/etc
+            cassandra_Server_IP: 192.168.68.2
+            OP_KEY: 1006020f0a478bf6b699f15c062e42b3
+            LTE_K: fec86ba6eb707ed08905757b1bb44b8f
+            APN1: oai.ipv4
+            APN2: internet
+            FIRST_IMSI: 222010100001120
+            NB_USERS: 10
+        healthcheck:
+            test: /bin/bash -c "pgrep oai_hss"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+    oai_mme:
+        image: oai-mme:production
+        container_name: prod-oai-mme
+        privileged: true
+        depends_on: [oai_hss]
+        networks:
+            public_net:
+                ipv4_address: 192.168.61.3
+        environment:
+            REALM: openairinterface.org
+            PREFIX: /openair-mme/etc
+            INSTANCE: 1
+            PID_DIRECTORY: /var/run
+            HSS_IP_ADDR: 192.168.61.2
+            HSS_HOSTNAME: hss
+            HSS_FQDN: hss.openairinterface.org
+            HSS_REALM: openairinterface.org
+            MCC: '222'
+            MNC: '01'
+            MME_GID: 32768
+            MME_CODE: 3
+            TAC_0: 1
+            TAC_1: 2
+            TAC_2: 3
+            MME_FQDN: mme.openairinterface.org
+            MME_S6A_IP_ADDR: 192.168.61.3
+            MME_INTERFACE_NAME_FOR_S1_MME: eth0
+            MME_IPV4_ADDRESS_FOR_S1_MME: 192.168.61.3
+            MME_INTERFACE_NAME_FOR_S11: eth0
+            MME_IPV4_ADDRESS_FOR_S11: 192.168.61.3
+            MME_INTERFACE_NAME_FOR_S10: lo
+            MME_IPV4_ADDRESS_FOR_S10: 127.0.0.10
+            OUTPUT: CONSOLE
+            SGW_IPV4_ADDRESS_FOR_S11_0: 192.168.61.4
+            PEER_MME_IPV4_ADDRESS_FOR_S10_0: 0.0.0.0
+            PEER_MME_IPV4_ADDRESS_FOR_S10_1: 0.0.0.0
+            MCC_SGW_0: '222'
+            MNC3_SGW_0: '001'
+            TAC_LB_SGW_0: '01'
+            TAC_HB_SGW_0: '00'
+            MCC_MME_0: '222'
+            MNC3_MME_0: '001'
+            TAC_LB_MME_0: '02'
+            TAC_HB_MME_0: '00'
+            MCC_MME_1: '222'
+            MNC3_MME_1: '001'
+            TAC_LB_MME_1: '03'
+            TAC_HB_MME_1: '00'
+            TAC_LB_SGW_TEST_0: '03'
+            TAC_HB_SGW_TEST_0: '00'
+            SGW_IPV4_ADDRESS_FOR_S11_TEST_0: 0.0.0.0
+        healthcheck:
+            test: /bin/bash -c "pgrep oai_mme"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+    oai_spgwc:
+        image: oai-spgwc:production
+        privileged: true
+        depends_on: [oai_mme]
+        container_name: prod-oai-spgwc
+        networks:
+            public_net:
+                ipv4_address: 192.168.61.4
+        environment:
+            PID_DIRECTORY: /var/run
+            SGW_INTERFACE_NAME_FOR_S11: eth0
+            SGW_IP_FOR_S5_S8_CP: 127.0.0.11/8
+            PGW_IP_FOR_S5_S8_CP: 127.0.0.12/8
+            PGW_INTERFACE_NAME_FOR_SX: eth0
+            DEFAULT_APN: oai.ipv4
+            DEFAULT_DNS_IPV4_ADDRESS: 192.168.18.129
+            DEFAULT_DNS_SEC_IPV4_ADDRESS: 8.8.4.4
+            UE_IP_ADDRESS_POOL: '12.1.1.2 - 12.1.1.254'
+            PUSH_PROTOCOL_OPTION: 'yes'
+        healthcheck:
+            test: /bin/bash -c "pgrep oai_spgwc"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+    oai_spgwu:
+        image: oai-spgwu-tiny:production
+        privileged: true
+        container_name: prod-oai-spgwu-tiny
+        depends_on: [oai_spgwc]
+        networks:
+            public_net:
+                ipv4_address: 192.168.61.5
+        environment:
+            PID_DIRECTORY: /var/run
+            INSTANCE: 1
+            SGW_INTERFACE_NAME_FOR_S1U_S12_S4_UP: eth0
+            PGW_INTERFACE_NAME_FOR_SGI: eth0
+            SGW_INTERFACE_NAME_FOR_SX: eth0
+            SPGWC0_IP_ADDRESS: 192.168.61.4
+            NETWORK_UE_IP: '12.1.1.0/24'
+            NETWORK_UE_NAT_OPTION: 'yes'
+        healthcheck:
+            test: /bin/bash -c "pgrep oai_spgwu"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+    flexran_rtc:
+        image: flexran-rtc:production
+        privileged: true
+        container_name: prod-flexran-rtc
+        networks:
+            public_net:
+                ipv4_address: 192.168.61.10
+        healthcheck:
+            test: /bin/bash -c "pgrep rt_controller"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+    trf_gen:
+        image: trf-gen:production
+        privileged: true
+        container_name: prod-trf-gen
+        networks:
+            public_net:
+                ipv4_address: 192.168.61.11
+        entrypoint: /bin/bash -c "ip route add 12.1.1.0/24 via 192.168.61.5 dev eth0; sleep infinity"
+        healthcheck:
+            test: /bin/bash -c "ping -c 2 192.168.61.5"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+networks:
+    private_net:
+        name: prod-oai-private-net
+        ipam:
+            config:
+                - subnet: 192.168.68.0/26
+    public_net:
+        name: prod-oai-public-net
+        ipam:
+            config:
+                - subnet: 192.168.61.0/26
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index e7c2cbc6cdf5cc0d88fe4ccabb133fb14956ec57..9592334125b9ab691503f036754ddacd8427c40e 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -124,13 +124,13 @@ if(EXISTS "/usr/include/atlas/cblas.h" OR EXISTS "/usr/include/cblas.h")
 
 # for ubuntu 17.10, directories are different
 elseif(EXISTS "/usr/include/x86_64-linux-gnu/cblas.h")
-
+  
   include_directories("/usr/include/x86_64-linux-gnu")
   LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu")
   list(APPEND ATLAS_LIBRARIES cblas)
   list(APPEND ATLAS_LIBRARIES atlas)
   list(APPEND ATLAS_LIBRARIES lapack)
-
+  
 else()
   message("No Blas/Atlas libs found, some targets will fail")
 endif()
@@ -155,8 +155,6 @@ set (OPENAIR_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY})
 
 project (OpenAirInterface)
 
-
-
 ##############################################
 # Base CUDA setting
 ##############################################
@@ -257,6 +255,7 @@ macro(add_list_string_option name val helpstr)
   endif()
 endmacro(add_list_string_option)
 
+# this function should produce the same value as the macro MAKE_VERSION defined in the C code (file types.h)
 function(make_version VERSION_VALUE)
   math(EXPR RESULT "0")
   foreach (ARG ${ARGN})
@@ -309,49 +308,38 @@ if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86")
 endif()
 
 #
-set(CMAKE_C_FLAGS
-  "${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} -pipe -std=gnu99 -Wall -Wstrict-prototypes -fno-strict-aliasing -rdynamic -funroll-loops -Wno-packed-bitfield-compat -fPIC")
 # add autotools definitions that were maybe used!
-if (CUDA_FOUND)
-	set(MKVER "'MAKE_VERSION(a,b,c)=((a)*256+(b)*16+c)'")
-    set(CUDA_CMAKE_C_FLAGS
-           "${CMAKE_C_FLAGS} -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP -D CUDA_FLAG"
-    )
-    set(CUDA_CMAKE_CXX_FLAGS
-	"${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -Wno-packed-bitfield-compat -fPIC -Wall -fno-strict-aliasing -rdynamic -std=c++11 -D CUDA_FLAG"
-    )
+add_definitions("-DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP")
 
-	set(CMAKE_C_FLAGS
-           "${CMAKE_C_FLAGS} -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP -D${MKVER} -D CUDA_FLAG"
-    )
-    set(CMAKE_CXX_FLAGS
-	"${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -Wno-packed-bitfield-compat -fPIC -Wall -fno-strict-aliasing -rdynamic -std=c++11 -D${MKVER} -D CUDA_FLAG"
-    )
-else (CUDA_FOUND)
-    set(MKVER "'MAKE_VERSION(a,b,c)=((a)*256+(b)*16+c)'")
-    set(CMAKE_C_FLAGS
-           "${CMAKE_C_FLAGS} -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_FCNTL_H=1 -DHAVE_ARPA_INET_H=1 -DHAVE_SYS_TIME_H=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_STRERROR=1 -DHAVE_SOCKET=1 -DHAVE_MEMSET=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_STDLIB_H=1 -DHAVE_MALLOC=1 -DHAVE_LIBSCTP -D${MKVER}"
-    )
-    set(CMAKE_CXX_FLAGS
-	"${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR} -Wno-packed-bitfield-compat -fPIC -Wall -fno-strict-aliasing -rdynamic -std=c++11 -D${MKVER}"
-    )
-endif ()
+set(commonOpts "-pipe -Wno-packed-bitfield-compat -fPIC -Wall -fno-strict-aliasing -rdynamic")
+
+set(CMAKE_C_FLAGS
+  "${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} ${commonOpts} -std=gnu99 -funroll-loops")
+set(CMAKE_CXX_FLAGS
+  "${CMAKE_CXX_FLAGS} ${C_FLAGS_PROCESSOR}  ${commonOpts} -std=c++11")
+
+# cuda compiler bug (limitation) on complex macro definition
+if (CUDA_FOUND)
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DCUDA_FLAG")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCUDA_FLAG")
+endif()
 
 if (SANITIZE_ADDRESS)
-    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-common")
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-common")
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-common")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-common")
 endif ()
 
 add_definitions("-DASN_DISABLE_OER_SUPPORT")
 
 #########################
-set(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,${CMAKE_CURRENT_BINARY_DIR}")
+set(CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} -ggdb3 -Wl,-rpath -Wl,${CMAKE_CURRENT_BINARY_DIR}")
 #########################
 # set a flag for changes in the source code
 # these changes are related to hardcoded path to include .h files
-set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS} -g3 -Og -DMALLOC_CHECK_=3")
-set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS} -g3 -DMALLOC_CHECK_=3 -O2 -fno-delete-null-pointer-checks")
-set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS}  -O3")
+set(debugOpt "-ggdb3 -DMALLOC_CHECK_=3 -fno-delete-null-pointer-checks")
+set(CMAKE_C_FLAGS_DEBUG "${debugOpt} -O0")
+set(CMAKE_C_FLAGS_RELWITHDEBINFO "${debugOpt} -O2")
+set(CMAKE_C_FLAGS_RELEASE "-O3")
 
 set(GIT_BRANCH        "UNKNOWN")
 set(GIT_COMMIT_HASH   "UNKNOWN")
@@ -385,7 +373,6 @@ if(GIT_FOUND)
   )
 endif()
 
-
 # Below is a hard-coded info
 set (FIRMWARE_VERSION "No svn information")
 add_definitions("-DFIRMWARE_VERSION=\"${FIRMWARE_VERSION}\"")
@@ -406,14 +393,12 @@ add_boolean_option(PDCP_MSG_PRINT      False "print PDCP messages to /tmp/pdcp.l
 add_boolean_option(DEBUG_PDCP_PAYLOAD  False "print PDCP PDU to stdout")  # if true, make sure that global and PDCP log levels are trace
 add_boolean_option(DEBUG_MAC_INTERFACE False "print MAC-RLC PDU exchange to stdout") # if true, make sure that global and PDCP log levels are trace
 add_boolean_option(TRACE_RLC_PAYLOAD   False "print RLC PDU to stdout") # if true, make sure that global and PDCP log levels are trace
-add_boolean_option(TEST_OMG            False "???")
-add_boolean_option(DEBUG_OMG           False "???")
 add_boolean_option(PRINT_STATS         False "This adds the possibility to see the status")
 add_boolean_option(T_TRACER            True  "Activate the T tracer, a debugging/monitoring framework" )
 add_boolean_option(UE_AUTOTEST_TRACE   False "Activate UE autotest specific logs")
 add_boolean_option(UE_DEBUG_TRACE      False "Activate UE debug trace")
 add_boolean_option(UE_TIMING_TRACE     False "Activate UE timing trace")
-add_boolean_option(DEBUG_CONSOLE       False "makes debugging easier, disables stdout/stderr buffering")
+add_boolean_option(DEBUG_CONSOLE       False "disables stdout/stderr buffering")
 
 set (OCP_ITTI ${OPENAIR_DIR}/common/utils/ocp_itti)
 add_library(ITTI
@@ -421,8 +406,6 @@ add_library(ITTI
   ${OPENAIR_DIR}/common/utils/backtrace.c
   )
 add_dependencies(ITTI rrc_flag)
-  set(ITTI_LIB ITTI)
-
 
 ##################################################
 # ASN.1 grammar C code generation & dependencies #
@@ -474,8 +457,8 @@ include_directories ("${RRC_FULL_DIR}")
 #NR RRC
 #######
 set (NR_RRC_ASN1_VERSION "NR_Rel16" )
-make_version(NR_RRC_VERSION 16 1 0)
-set (NR_RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-16.1.0.asn1)
+make_version(NR_RRC_VERSION 16 4 1)
+set (NR_RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-16.4.1.asn1)
 add_definitions(-DNR_RRC_VERSION=${NR_RRC_VERSION})
 set (NR_RRC_FULL_DIR ${asn1_generated_dir}/RRC_${NR_RRC_ASN1_VERSION})
 
@@ -837,11 +820,11 @@ if (${RU} STREQUAL 0)
     COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "F1AP_" "-findirect-choice -fno-include-deps" ${F1AP_ASN_GENERATED_C_DIR} ${F1AP_ASN_FILES}
     RESULT_VARIABLE ret
     )
-
+  
   if (NOT ${ret} STREQUAL 0)
     message(FATAL_ERROR "asn1c: error")
   endif (NOT ${ret} STREQUAL 0)
-
+  
   add_custom_target (
     f1_flag ALL
     COMMAND ${OPENAIR_CMAKE}/tools/make_asn1c_includes.sh "F1AP_" "-findirect-choice -fno-include-deps" ${F1AP_ASN_GENERATED_C_DIR} ${F1AP_ASN_FILES}
@@ -852,15 +835,13 @@ if (${RU} STREQUAL 0)
     ${F1AP_ASN_GENERATED_C_FILES}
     )
   add_dependencies (F1AP_LIB  f1_flag)
-
-include_directories ("${F1AP_ASN_GENERATED_C_DIR}")
-include_directories ("${F1AP_DIR}")
-
-file(GLOB F1AP_C_FILES ${F1AP_DIR}/*.c)
-add_library(F1AP
-  ${F1AP_C_FILES}
-)
-
+  
+  include_directories ("${F1AP_ASN_GENERATED_C_DIR}")
+  include_directories ("${F1AP_DIR}")
+  
+  file(GLOB F1AP_C_FILES ${F1AP_DIR}/*.c)
+  add_library(F1AP ${F1AP_C_FILES} )
+  
 endif (${RU} STREQUAL 0)
 
 # Hardware dependant options
@@ -873,22 +854,22 @@ add_list2_option(RF_BOARD "EXMIMO" "RF head type" "None" "OAI_USRP" "OAI_BLADERF
 add_list2_option(TRANSP_PRO "None" "Transport protocol type" "None" "ETHERNET")
 #NOKIA config enhancement
 set (CONFIG_ROOTDIR
-    ${OPENAIR_DIR}/common/config
-   )
+  ${OPENAIR_DIR}/common/config
+  )
 set (CONFIG_SOURCES
-    ${CONFIG_ROOTDIR}/config_load_configmodule.c
-    ${CONFIG_ROOTDIR}/config_userapi.c
-    ${CONFIG_ROOTDIR}/config_cmdline.c
-   )
+  ${CONFIG_ROOTDIR}/config_load_configmodule.c
+  ${CONFIG_ROOTDIR}/config_userapi.c
+  ${CONFIG_ROOTDIR}/config_cmdline.c
+  )
 set (CONFIG_LIBCONFIG_SOURCES
-    ${CONFIG_ROOTDIR}/libconfig/config_libconfig.c
-    )
+  ${CONFIG_ROOTDIR}/libconfig/config_libconfig.c
+  )
 add_library(CONFIG_LIB ${CONFIG_SOURCES})
 add_library(params_libconfig MODULE ${CONFIG_LIBCONFIG_SOURCES} )
 target_link_libraries(params_libconfig config)
 # shared library loader
 set (SHLIB_LOADER_SOURCES
-    ${OPENAIR_DIR}/common/utils/load_module_shlib.c
+  ${OPENAIR_DIR}/common/utils/load_module_shlib.c
 )
 # include RF devices / transport protocols library modules
 ######################################################################
@@ -927,8 +908,8 @@ add_library(oai_eth_transpro MODULE ${TPLIB_ETHERNET_SOURCE} )
 include_directories("${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/")
 set(option_HWIRISLIB_lib "-l SoapySDR")
 set(HWLIB_IRIS_SOURCE
-        ${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp
-        )
+  ${OPENAIR_TARGETS}/ARCH/IRIS/USERSPACE/LIB/iris_lib.cpp
+  )
 add_library(oai_irisdevif MODULE ${HWLIB_IRIS_SOURCE})
 target_include_directories(oai_irisdevif PRIVATE /usr/local/lib/SoapySDR/modules0.7/)
 target_link_libraries(oai_irisdevif SoapySDR)
@@ -1035,7 +1016,6 @@ add_boolean_option(ENABLE_VCD              False  "always true now, time measure
 add_boolean_option(ENABLE_VCD_FIFO         False  "time measurements of proc calls and var displays sent to FIFO (one more thread)")
 add_boolean_option(LINUX                   False "used in weird memcpy() in pdcp.c ???")
 add_boolean_option(LINUX_LIST              False "used only in lists.c: either use OAI implementation of lists or Linux one (should be True, but it is False")
-add_boolean_option(OPENAIR_LTE             True "Seems legacy: keep it to true")
 
 ##########################
 # PHY options
@@ -1044,10 +1024,7 @@ add_boolean_option(DRIVER2013              True "only relevant for EXMIMO")
 add_boolean_option(EXMIMO_IOT              True "????")
 add_boolean_option(LOCALIZATION            False "???")
 add_integer_option(MAX_NUM_CCs             1     "????")
-add_boolean_option(MU_RECEIVER             False "????")
 add_boolean_option(PHYSIM                  False  "for L1 simulators (dlsim, ulsim, ...)")
-add_boolean_option(PHY_CONTEXT             True "not clear: must remain False for dlsim")
-add_boolean_option(PHY_EMUL                False "not clear: must remain False for dlsim")
 add_boolean_option(SMBV                    False "Rohde&Schwarz SMBV100A vector signal generator")
 add_boolean_option(DEBUG_PHY               False "Enable PHY layer debugging options")
 add_boolean_option(DEBUG_PHY_PROC          False "Enable debugging of PHY layer procedures")
@@ -1389,42 +1366,42 @@ target_link_libraries (msc LFDS)
 include_directories(${OPENAIR_DIR}/common/utils/msc)
 
 set(UTIL_SRC
-#  ${OPENAIR2_DIR}/UTIL/CLI/cli.c
-#  ${OPENAIR2_DIR}/UTIL/CLI/cli_cmd.c
-#  ${OPENAIR2_DIR}/UTIL/CLI/cli_server.c
+  #  ${OPENAIR2_DIR}/UTIL/CLI/cli.c
+  #  ${OPENAIR2_DIR}/UTIL/CLI/cli_cmd.c
+  #  ${OPENAIR2_DIR}/UTIL/CLI/cli_server.c
   ${OPENAIR2_DIR}/UTIL/FIFO/pad_list.c
   ${OPENAIR2_DIR}/UTIL/LISTS/list.c
   ${OPENAIR2_DIR}/UTIL/LISTS/list2.c
   ${OPENAIR_DIR}/common/utils/LOG/log.c
   ${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.c
   ${OPENAIR2_DIR}/UTIL/MATH/oml.c
-#  ${OPENAIR2_DIR}/UTIL/MEM/mem_block.c
-#  ${OPENAIR2_DIR}/UTIL/OCG/OCG.c
-#  ${OPENAIR2_DIR}/UTIL/OCG/OCG_create_dir.c
-#  ${OPENAIR2_DIR}/UTIL/OCG/OCG_detect_file.c
-#  ${OPENAIR2_DIR}/UTIL/OCG/OCG_generate_report.c
-#  ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_filename.c
-#  ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_XML.c
-#  ${OPENAIR2_DIR}/UTIL/OCG/OCG_save_XML.c
-#  ${OPENAIR2_DIR}/UTIL/OMG/common.c
-#  ${OPENAIR2_DIR}/UTIL/OMG/grid.c
-#  ${OPENAIR2_DIR}/UTIL/OMG/job.c
-#  ${OPENAIR2_DIR}/UTIL/OMG/mobility_parser.c
-#  ${OPENAIR2_DIR}/UTIL/OMG/omg.c
-#  ${OPENAIR2_DIR}/UTIL/OMG/omg_hashtable.c
-#  ${OPENAIR2_DIR}/UTIL/OMG/rwalk.c
-#  ${OPENAIR2_DIR}/UTIL/OMG/rwp.c
-#  ${OPENAIR2_DIR}/UTIL/OMG/static.c
-#  ${OPENAIR2_DIR}/UTIL/OMG/steadystaterwp.c
-#  ${OPENAIR2_DIR}/UTIL/OMG/trace.c
-#  ${OPENAIR2_DIR}/UTIL/OMG/trace_hashtable.c
+  #  ${OPENAIR2_DIR}/UTIL/MEM/mem_block.c
+  #  ${OPENAIR2_DIR}/UTIL/OCG/OCG.c
+  #  ${OPENAIR2_DIR}/UTIL/OCG/OCG_create_dir.c
+  #  ${OPENAIR2_DIR}/UTIL/OCG/OCG_detect_file.c
+  #  ${OPENAIR2_DIR}/UTIL/OCG/OCG_generate_report.c
+  #  ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_filename.c
+  #  ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_XML.c
+  #  ${OPENAIR2_DIR}/UTIL/OCG/OCG_save_XML.c
+  #  ${OPENAIR2_DIR}/UTIL/OMG/common.c
+  #  ${OPENAIR2_DIR}/UTIL/OMG/grid.c
+  #  ${OPENAIR2_DIR}/UTIL/OMG/job.c
+  #  ${OPENAIR2_DIR}/UTIL/OMG/mobility_parser.c
+  #  ${OPENAIR2_DIR}/UTIL/OMG/omg.c
+  #  ${OPENAIR2_DIR}/UTIL/OMG/omg_hashtable.c
+  #  ${OPENAIR2_DIR}/UTIL/OMG/rwalk.c
+  #  ${OPENAIR2_DIR}/UTIL/OMG/rwp.c
+  #  ${OPENAIR2_DIR}/UTIL/OMG/static.c
+  #  ${OPENAIR2_DIR}/UTIL/OMG/steadystaterwp.c
+  #  ${OPENAIR2_DIR}/UTIL/OMG/trace.c
+  #  ${OPENAIR2_DIR}/UTIL/OMG/trace_hashtable.c
   ${OPENAIR2_DIR}/UTIL/OPT/probe.c
-#  ${OPENAIR2_DIR}/UTIL/OTG/otg_tx.c
-#  ${OPENAIR2_DIR}/UTIL/OTG/otg.c
-#  ${OPENAIR2_DIR}/UTIL/OTG/otg_kpi.c
-#  ${OPENAIR2_DIR}/UTIL/OTG/otg_models.c
-#  ${OPENAIR2_DIR}/UTIL/OTG/otg_form.c
-#  ${OPENAIR2_DIR}/UTIL/OTG/otg_rx.c
+  #  ${OPENAIR2_DIR}/UTIL/OTG/otg_tx.c
+  #  ${OPENAIR2_DIR}/UTIL/OTG/otg.c
+  #  ${OPENAIR2_DIR}/UTIL/OTG/otg_kpi.c
+  #  ${OPENAIR2_DIR}/UTIL/OTG/otg_models.c
+  #  ${OPENAIR2_DIR}/UTIL/OTG/otg_form.c
+  #  ${OPENAIR2_DIR}/UTIL/OTG/otg_rx.c
   )
 add_library(UTIL ${UTIL_SRC})
 add_dependencies(UTIL rrc_flag)
@@ -1506,7 +1483,6 @@ set(SCHED_SRC_NR_UE
   ${OPENAIR1_DIR}/SCHED_NR_UE/phy_frame_config_nr_ue.c
   ${OPENAIR1_DIR}/SCHED_NR_UE/harq_nr.c
   ${OPENAIR1_DIR}/SCHED_NR_UE/pucch_uci_ue_nr.c
-  ${OPENAIR1_DIR}/SCHED_NR_UE/pucch_power_control_ue_nr.c
 )
 add_library(SCHED_NR_UE_LIB ${SCHED_SRC_NR_UE})
 
@@ -1515,7 +1491,7 @@ add_library(SCHED_NR_UE_LIB ${SCHED_SRC_NR_UE})
 #################################
 set(NFAPI_COMMON_SRC
   ${NFAPI_DIR}/common/src/debug.c
-)
+  )
 add_library(NFAPI_COMMON_LIB ${NFAPI_COMMON_SRC})
 
 include_directories(${NFAPI_DIR}/common/public_inc)
@@ -2173,7 +2149,6 @@ set (MISC_NFAPI_LTE
  ${OPENAIR1_DIR}/SCHED/nfapi_lte_dummy.c
  )
 
-
 add_library(MISC_NFAPI_LTE_LIB
   ${MISC_NFAPI_LTE}
  )
@@ -2182,7 +2157,6 @@ set (MISC_NFAPI_NR
  ${OPENAIR1_DIR}/SCHED/nfapi_nr_dummy.c
  )
 
-
 add_library(MISC_NFAPI_NR_LIB
   ${MISC_NFAPI_NR}
  )
@@ -2265,8 +2239,8 @@ set(GTPV1U_DIR ${OPENAIR3_DIR}/GTPV1-U)
 add_library (GTPV1U_OCP
   ${NR_RRC_DIR}/rrc_gNB_GTPV1U.c
   ${RRC_DIR}/rrc_eNB_GTPV1U.c
-${OPENAIR3_DIR}/ocp-gtpu/gtp_itf.cpp
-)
+  ${OPENAIR3_DIR}/ocp-gtpu/gtp_itf.cpp
+  )
 target_compile_definitions(GTPV1U_OCP PUBLIC NEW_GTPU)
 add_dependencies(GTPV1U_OCP rrc_flag)
 include_directories(${OPENAIR3_DIR}/ocp-gtp)
@@ -2282,7 +2256,7 @@ set (NR_GTPV1U_SRC
   ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1uMsg.c
   ${GTPV1U_DIR}/nw-gtpv1u/src/NwGtpv1u.c
   ${GTPV1U_DIR}/gtpv1u_teid_pool.c
-)
+  )
 add_library(NR_GTPV1U ${NR_GTPV1U_SRC})
 add_dependencies(NR_GTPV1U rrc_flag)
 
@@ -2304,7 +2278,6 @@ add_dependencies(SCTP_CLIENT rrc_flag)
 add_library(UDP ${OPENAIR3_DIR}/UDP/udp_eNB_task.c)
 add_dependencies(UDP rrc_flag)
 
-
 set(NAS_SRC ${OPENAIR3_DIR}/NAS/)
 set(libnas_api_OBJS
   ${NAS_SRC}COMMON/API/NETWORK/as_message.c
@@ -2463,171 +2436,171 @@ set (libnas_utils_OBJS
   ${NAS_SRC}COMMON/UTIL/OctetString.c
 )
 
-  set(libnas_ue_api_OBJS
-    ${NAS_SRC}UE/API/USER/at_command.c
-    ${NAS_SRC}UE/API/USER/at_error.c
-    ${NAS_SRC}UE/API/USER/at_response.c
-    ${NAS_SRC}UE/API/USER/user_api.c
-    ${NAS_SRC}UE/API/USER/user_indication.c
-    ${NAS_SRC}UE/API/USIM/aka_functions.c
-    ${NAS_SRC}UE/API/USIM/usim_api.c
-  )
-  set(libnas_ue_emm_OBJS
-    ${NAS_SRC}UE/EMM/Attach.c
-    ${NAS_SRC}UE/EMM/Authentication.c
-    ${NAS_SRC}UE/EMM/Detach.c
-    ${NAS_SRC}UE/EMM/emm_main.c
-    ${NAS_SRC}UE/EMM/EmmStatusHdl.c
-    ${NAS_SRC}UE/EMM/Identification.c
-    ${NAS_SRC}UE/EMM/IdleMode.c
-    ${NAS_SRC}UE/EMM/LowerLayer.c
-    ${NAS_SRC}UE/EMM/SecurityModeControl.c
-    ${NAS_SRC}UE/EMM/ServiceRequestHdl.c
-    ${NAS_SRC}UE/EMM/TrackingAreaUpdate.c
-  )
-  set(libnas_ue_emm_sap_OBJS
-    ${NAS_SRC}UE/EMM/SAP/emm_as.c
-    ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredAttachNeeded.c
-    ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c
-    ${NAS_SRC}UE/EMM/SAP/EmmDeregistered.c
-    ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredInitiated.c
-    ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredLimitedService.c
-    ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c
-    ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNoImsi.c
-    ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNormalService.c
-    ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredPlmnSearch.c
-    ${NAS_SRC}UE/EMM/SAP/emm_esm.c
-    ${NAS_SRC}UE/EMM/SAP/emm_fsm.c
-    ${NAS_SRC}UE/EMM/SAP/EmmNull.c
-    ${NAS_SRC}UE/EMM/SAP/emm_recv.c
-    ${NAS_SRC}UE/EMM/SAP/emm_reg.c
-    ${NAS_SRC}UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c
-    ${NAS_SRC}UE/EMM/SAP/EmmRegistered.c
-    ${NAS_SRC}UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c
-    ${NAS_SRC}UE/EMM/SAP/EmmRegisteredInitiated.c
-    ${NAS_SRC}UE/EMM/SAP/EmmRegisteredLimitedService.c
-    ${NAS_SRC}UE/EMM/SAP/EmmRegisteredNoCellAvailable.c
-    ${NAS_SRC}UE/EMM/SAP/EmmRegisteredNormalService.c
-    ${NAS_SRC}UE/EMM/SAP/EmmRegisteredPlmnSearch.c
-    ${NAS_SRC}UE/EMM/SAP/EmmRegisteredUpdateNeeded.c
-    ${NAS_SRC}UE/EMM/SAP/emm_sap.c
-    ${NAS_SRC}UE/EMM/SAP/emm_send.c
-    ${NAS_SRC}UE/EMM/SAP/EmmServiceRequestInitiated.c
-    ${NAS_SRC}UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c
-  )
-  set (libnas_ue_esm_OBJS
-    ${NAS_SRC}UE/ESM/DedicatedEpsBearerContextActivation.c
-    ${NAS_SRC}UE/ESM/DefaultEpsBearerContextActivation.c
-    ${NAS_SRC}UE/ESM/EpsBearerContextDeactivation.c
-    ${NAS_SRC}UE/ESM/esm_ebr.c
-    ${NAS_SRC}UE/ESM/esm_ebr_context.c
-    ${NAS_SRC}UE/ESM/esm_ip.c
-    ${NAS_SRC}UE/ESM/esm_main.c
-    ${NAS_SRC}UE/ESM/esm_pt.c
-    ${NAS_SRC}UE/ESM/EsmStatusHdl.c
-    ${NAS_SRC}UE/ESM/PdnConnectivity.c
-    ${NAS_SRC}UE/ESM/PdnDisconnect.c
-  )
-  set(libnas_ue_esm_sap_OBJS
-    ${NAS_SRC}UE/ESM/SAP/esm_recv.c
-    ${NAS_SRC}UE/ESM/SAP/esm_send.c
-    ${NAS_SRC}UE/ESM/SAP/esm_sap.c
-  )
-
-  set(libnrnas_emm_msg_OBJS
-    ${NAS_SRC}COMMON/EMM/MSG/RegistrationRequest.c
-    ${NAS_SRC}COMMON/EMM/MSG/RegistrationAccept.c
-    ${NAS_SRC}COMMON/EMM/MSG/FGSIdentityResponse.c
-    ${NAS_SRC}COMMON/EMM/MSG/FGSAuthenticationResponse.c
-    ${NAS_SRC}COMMON/EMM/MSG/FGSNASSecurityModeComplete.c
-    ${NAS_SRC}COMMON/EMM/MSG/RegistrationComplete.c
-    ${NAS_SRC}COMMON/EMM/MSG/FGSUplinkNasTransport.c
-    ${NAS_SRC}COMMON/ESM/MSG/PduSessionEstablishRequest.c
-  )
-
-  set(libnrnas_ies_OBJS
-    ${NAS_SRC}COMMON/IES/ExtendedProtocolDiscriminator.c
-    ${NAS_SRC}COMMON/IES/FGSMobileIdentity.c
-    ${NAS_SRC}COMMON/IES/FGSRegistrationType.c
-    ${NAS_SRC}COMMON/IES/SpareHalfOctet.c
-    ${NAS_SRC}COMMON/IES/FGSRegistrationResult.c
-    ${NAS_SRC}COMMON/IES/FGMMCapability.c
-    ${NAS_SRC}COMMON/IES/NrUESecurityCapability.c
-    ${NAS_SRC}COMMON/IES/FGCNasMessageContainer.c
-    ${NAS_SRC}COMMON/IES/SORTransparentContainer.c
-  )
-
-  add_library(LIB_NAS_SIMUE
-    ${NAS_SRC}UE/nas_itti_messaging.c
-    ${NAS_SRC}UE/nas_network.c
-    ${NAS_SRC}UE/nas_parser.c
-    ${NAS_SRC}UE/nas_proc.c
-    ${NAS_SRC}UE/nas_user.c
-    ${NAS_SRC}NR_UE/nr_nas_msg_sim.c
-    ${libnas_api_OBJS}
-    ${libnas_ue_api_OBJS}
-    ${libnas_emm_msg_OBJS}
-    ${libnas_esm_msg_OBJS}
-    ${libnas_ies_OBJS}
-    ${libnas_utils_OBJS}
-    ${libnas_ue_emm_OBJS}
-    ${libnas_ue_emm_sap_OBJS}
-    ${libnas_ue_esm_OBJS}
-    ${libnas_ue_esm_sap_OBJS}
-    ${libnrnas_emm_msg_OBJS}
-    ${libnrnas_ies_OBJS}
-  )
-  add_dependencies(LIB_NAS_SIMUE rrc_flag)
-  set(NAS_SIM_LIB LIB_NAS_SIMUE)
-
-  add_library(LIB_NAS_UE
-    ${NAS_SRC}UE/nas_itti_messaging.c
-    ${NAS_SRC}UE/nas_network.c
-    ${NAS_SRC}UE/nas_parser.c
-    ${NAS_SRC}UE/nas_proc.c
-    ${NAS_SRC}UE/nas_user.c
-    ${libnas_api_OBJS}
-    ${libnas_ue_api_OBJS}
-    ${libnas_emm_msg_OBJS}
-    ${libnas_esm_msg_OBJS}
-    ${libnas_ies_OBJS}
-    ${libnas_utils_OBJS}
-    ${libnas_ue_emm_OBJS}
-    ${libnas_ue_emm_sap_OBJS}
-    ${libnas_ue_esm_OBJS}
-    ${libnas_ue_esm_sap_OBJS}
-  )
-  add_dependencies(LIB_NAS_UE rrc_flag)
-  set(NAS_UE_LIB LIB_NAS_UE)
-
-
-  include_directories(${NAS_SRC}NR_UE)
-  include_directories(${NAS_SRC}UE)
-  include_directories(${NAS_SRC}UE/API/USER)
-  include_directories(${NAS_SRC}UE/API/USIM)
-  include_directories(${NAS_SRC}UE/EMM)
-  include_directories(${NAS_SRC}UE/EMM/SAP)
-  include_directories(${NAS_SRC}UE/ESM)
-  include_directories(${NAS_SRC}UE/ESM/SAP)
+set(libnas_ue_api_OBJS
+  ${NAS_SRC}UE/API/USER/at_command.c
+  ${NAS_SRC}UE/API/USER/at_error.c
+  ${NAS_SRC}UE/API/USER/at_response.c
+  ${NAS_SRC}UE/API/USER/user_api.c
+  ${NAS_SRC}UE/API/USER/user_indication.c
+  ${NAS_SRC}UE/API/USIM/aka_functions.c
+  ${NAS_SRC}UE/API/USIM/usim_api.c
+  )
+set(libnas_ue_emm_OBJS
+  ${NAS_SRC}UE/EMM/Attach.c
+  ${NAS_SRC}UE/EMM/Authentication.c
+  ${NAS_SRC}UE/EMM/Detach.c
+  ${NAS_SRC}UE/EMM/emm_main.c
+  ${NAS_SRC}UE/EMM/EmmStatusHdl.c
+  ${NAS_SRC}UE/EMM/Identification.c
+  ${NAS_SRC}UE/EMM/IdleMode.c
+  ${NAS_SRC}UE/EMM/LowerLayer.c
+  ${NAS_SRC}UE/EMM/SecurityModeControl.c
+  ${NAS_SRC}UE/EMM/ServiceRequestHdl.c
+  ${NAS_SRC}UE/EMM/TrackingAreaUpdate.c
+  )
+set(libnas_ue_emm_sap_OBJS
+  ${NAS_SRC}UE/EMM/SAP/emm_as.c
+  ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredAttachNeeded.c
+  ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c
+  ${NAS_SRC}UE/EMM/SAP/EmmDeregistered.c
+  ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredInitiated.c
+  ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredLimitedService.c
+  ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c
+  ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNoImsi.c
+  ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredNormalService.c
+  ${NAS_SRC}UE/EMM/SAP/EmmDeregisteredPlmnSearch.c
+  ${NAS_SRC}UE/EMM/SAP/emm_esm.c
+  ${NAS_SRC}UE/EMM/SAP/emm_fsm.c
+  ${NAS_SRC}UE/EMM/SAP/EmmNull.c
+  ${NAS_SRC}UE/EMM/SAP/emm_recv.c
+  ${NAS_SRC}UE/EMM/SAP/emm_reg.c
+  ${NAS_SRC}UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c
+  ${NAS_SRC}UE/EMM/SAP/EmmRegistered.c
+  ${NAS_SRC}UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c
+  ${NAS_SRC}UE/EMM/SAP/EmmRegisteredInitiated.c
+  ${NAS_SRC}UE/EMM/SAP/EmmRegisteredLimitedService.c
+  ${NAS_SRC}UE/EMM/SAP/EmmRegisteredNoCellAvailable.c
+  ${NAS_SRC}UE/EMM/SAP/EmmRegisteredNormalService.c
+  ${NAS_SRC}UE/EMM/SAP/EmmRegisteredPlmnSearch.c
+  ${NAS_SRC}UE/EMM/SAP/EmmRegisteredUpdateNeeded.c
+  ${NAS_SRC}UE/EMM/SAP/emm_sap.c
+  ${NAS_SRC}UE/EMM/SAP/emm_send.c
+  ${NAS_SRC}UE/EMM/SAP/EmmServiceRequestInitiated.c
+  ${NAS_SRC}UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c
+  )
+set (libnas_ue_esm_OBJS
+  ${NAS_SRC}UE/ESM/DedicatedEpsBearerContextActivation.c
+  ${NAS_SRC}UE/ESM/DefaultEpsBearerContextActivation.c
+  ${NAS_SRC}UE/ESM/EpsBearerContextDeactivation.c
+  ${NAS_SRC}UE/ESM/esm_ebr.c
+  ${NAS_SRC}UE/ESM/esm_ebr_context.c
+  ${NAS_SRC}UE/ESM/esm_ip.c
+  ${NAS_SRC}UE/ESM/esm_main.c
+  ${NAS_SRC}UE/ESM/esm_pt.c
+  ${NAS_SRC}UE/ESM/EsmStatusHdl.c
+  ${NAS_SRC}UE/ESM/PdnConnectivity.c
+  ${NAS_SRC}UE/ESM/PdnDisconnect.c
+  )
+set(libnas_ue_esm_sap_OBJS
+  ${NAS_SRC}UE/ESM/SAP/esm_recv.c
+  ${NAS_SRC}UE/ESM/SAP/esm_send.c
+  ${NAS_SRC}UE/ESM/SAP/esm_sap.c
+  )
+
+set(libnrnas_emm_msg_OBJS
+  ${NAS_SRC}COMMON/EMM/MSG/RegistrationRequest.c
+  ${NAS_SRC}COMMON/EMM/MSG/RegistrationAccept.c
+  ${NAS_SRC}COMMON/EMM/MSG/FGSIdentityResponse.c
+  ${NAS_SRC}COMMON/EMM/MSG/FGSAuthenticationResponse.c
+  ${NAS_SRC}COMMON/EMM/MSG/FGSNASSecurityModeComplete.c
+  ${NAS_SRC}COMMON/EMM/MSG/RegistrationComplete.c
+  ${NAS_SRC}COMMON/EMM/MSG/FGSUplinkNasTransport.c
+  ${NAS_SRC}COMMON/ESM/MSG/PduSessionEstablishRequest.c
+  )
+
+set(libnrnas_ies_OBJS
+  ${NAS_SRC}COMMON/IES/ExtendedProtocolDiscriminator.c
+  ${NAS_SRC}COMMON/IES/FGSMobileIdentity.c
+  ${NAS_SRC}COMMON/IES/FGSRegistrationType.c
+  ${NAS_SRC}COMMON/IES/SpareHalfOctet.c
+  ${NAS_SRC}COMMON/IES/FGSRegistrationResult.c
+  ${NAS_SRC}COMMON/IES/FGMMCapability.c
+  ${NAS_SRC}COMMON/IES/NrUESecurityCapability.c
+  ${NAS_SRC}COMMON/IES/FGCNasMessageContainer.c
+  ${NAS_SRC}COMMON/IES/SORTransparentContainer.c
+  )
+
+add_library(LIB_NAS_SIMUE
+  ${NAS_SRC}UE/nas_itti_messaging.c
+  ${NAS_SRC}UE/nas_network.c
+  ${NAS_SRC}UE/nas_parser.c
+  ${NAS_SRC}UE/nas_proc.c
+  ${NAS_SRC}UE/nas_user.c
+  ${NAS_SRC}NR_UE/nr_nas_msg_sim.c
+  ${libnas_api_OBJS}
+  ${libnas_ue_api_OBJS}
+  ${libnas_emm_msg_OBJS}
+  ${libnas_esm_msg_OBJS}
+  ${libnas_ies_OBJS}
+  ${libnas_utils_OBJS}
+  ${libnas_ue_emm_OBJS}
+  ${libnas_ue_emm_sap_OBJS}
+  ${libnas_ue_esm_OBJS}
+  ${libnas_ue_esm_sap_OBJS}
+  ${libnrnas_emm_msg_OBJS}
+  ${libnrnas_ies_OBJS}
+  )
+add_dependencies(LIB_NAS_SIMUE rrc_flag)
+set(NAS_SIM_LIB LIB_NAS_SIMUE)
+
+add_library(LIB_NAS_UE
+  ${NAS_SRC}UE/nas_itti_messaging.c
+  ${NAS_SRC}UE/nas_network.c
+  ${NAS_SRC}UE/nas_parser.c
+  ${NAS_SRC}UE/nas_proc.c
+  ${NAS_SRC}UE/nas_user.c
+  ${libnas_api_OBJS}
+  ${libnas_ue_api_OBJS}
+  ${libnas_emm_msg_OBJS}
+  ${libnas_esm_msg_OBJS}
+  ${libnas_ies_OBJS}
+  ${libnas_utils_OBJS}
+  ${libnas_ue_emm_OBJS}
+  ${libnas_ue_emm_sap_OBJS}
+  ${libnas_ue_esm_OBJS}
+  ${libnas_ue_esm_sap_OBJS}
+  )
+add_dependencies(LIB_NAS_UE rrc_flag)
+set(NAS_UE_LIB LIB_NAS_UE)
+
+
+include_directories(${NAS_SRC}NR_UE)
+include_directories(${NAS_SRC}UE)
+include_directories(${NAS_SRC}UE/API/USER)
+include_directories(${NAS_SRC}UE/API/USIM)
+include_directories(${NAS_SRC}UE/EMM)
+include_directories(${NAS_SRC}UE/EMM/SAP)
+include_directories(${NAS_SRC}UE/ESM)
+include_directories(${NAS_SRC}UE/ESM/SAP)
 
 # nbiot
 add_definitions("-DNUMBER_OF_UE_MAX_NB_IoT=16")
 set (NBIOT_SOURCES
-    ${OPENAIR2_DIR}/ENB_APP/NB_IoT_config.c
-)
+  ${OPENAIR2_DIR}/ENB_APP/NB_IoT_config.c
+  )
 add_library(NB_IoT MODULE ${NBIOT_SOURCES} )
 
 # shared library loader
 set (SHLIB_LOADER_SOURCES
-    ${OPENAIR_DIR}/common/utils/load_module_shlib.c
-)
+  ${OPENAIR_DIR}/common/utils/load_module_shlib.c
+  )
 
 add_library(LIB_5GNAS_GNB
-	${NAS_SRC}/COMMON/nr_common.c
-	${NAS_SRC}/gNB/network_process_nas.c
-	${NAS_SRC}/NR_UE/ue_process_nas.c
-	${OPENAIR3_DIR}//UICC/usim_interface.c
-	)
+  ${NAS_SRC}/COMMON/nr_common.c
+  ${NAS_SRC}/gNB/network_process_nas.c
+  ${NAS_SRC}/NR_UE/ue_process_nas.c
+  ${OPENAIR3_DIR}//UICC/usim_interface.c
+  )
 target_link_libraries(LIB_5GNAS_GNB SECU_CN ${CRYPTO_LIBRARIES})
 
 # Make lfds as a own source code (even if it is a outside library)
@@ -2859,10 +2832,9 @@ add_dependencies(lte-softmodem rrc_flag s1ap_flag x2_flag oai_iqplayer)
 
 target_link_libraries (lte-softmodem
   -Wl,--start-group
-
   RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB NR_GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB
   PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB LFDS7
-  ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB}
+  ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB}
   -Wl,--end-group z dl)
 
 target_link_libraries (lte-softmodem ${LIBXML2_LIBRARIES})
@@ -2905,7 +2877,7 @@ target_link_libraries (ocp-enb
 
   RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB NR_GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB SCHED_RU_LIB
   PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_LIB MISC_NFAPI_LTE_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB LFDS7 SIMU_COMMON
-  ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB}
+  ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} ${FSPT_MSG_LIB} ${PROTO_AGENT_LIB}
   -Wl,--end-group z dl)
 target_link_libraries (ocp-enb ${LIBXML2_LIBRARIES} pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} sctp ${PROTOBUF_LIB}  ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${LIB_LMS_LIBRARIES} ${T_LIB})
 
@@ -2920,7 +2892,7 @@ add_executable(cu_test
 )
 target_link_libraries(cu_test
   ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FSPT_MSG_LIB} ${PROTOBUF_LIB}
-  ${PROTO_AGENT_LIB} pthread UTIL ${T_LIB} dl ${ITTI_LIB}
+  ${PROTO_AGENT_LIB} pthread UTIL ${T_LIB} dl ITTI
 )
 
 add_executable(du_test
@@ -2934,7 +2906,7 @@ add_executable(du_test
 )
 target_link_libraries(du_test
   ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FSPT_MSG_LIB} ${PROTOBUF_LIB}
-  ${PROTO_AGENT_LIB} pthread UTIL ${T_LIB} dl ${ITTI_LIB}
+  ${PROTO_AGENT_LIB} pthread UTIL ${T_LIB} dl ITTI
 )
 
 add_executable(oairu
@@ -3002,7 +2974,7 @@ target_link_libraries (lte-uesoftmodem
 
   NR_GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON
   PHY_UE PHY_RU LFDS L2_UE L2_LTE LFDS7 SIMU_COMMON SIMU NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB MISC_NFAPI_LTE_LIB
-  ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${ATLAS_LIBRARIES}
+  ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${ATLAS_LIBRARIES}
   -Wl,--end-group z dl)
 
 target_link_libraries (lte-uesoftmodem ${LIBXML2_LIBRARIES})
@@ -3045,7 +3017,7 @@ target_compile_definitions(nr-softmodem PUBLIC NEW_GTPU)
 target_link_libraries (nr-softmodem
   -Wl,--start-group
   UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS GTPV1U_OCP SECU_CN SECU_OSA
-  ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB
+  ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB
   NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
   X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB}
   -Wl,--end-group z dl)
@@ -3084,7 +3056,7 @@ add_executable(ocp-gnb
 target_link_libraries (ocp-gnb
   -Wl,--start-group
   UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS GTPV1U_OCP SECU_CN SECU_OSA
-  ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB
+  ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB
   NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
   X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB SIMU_COMMON
   -Wl,--end-group z dl)
@@ -3130,9 +3102,9 @@ target_link_libraries (nr-uesoftmodem
   RRC_LIB NR_RRC_LIB NGAP_LIB NGAP_GNB SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB
   PHY_COMMON PHY_NR_COMMON PHY_UE PHY_NR_UE PHY_RU LFDS NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB
   NFAPI_USER_LIB MISC_NFAPI_NR_LIB S1AP_LIB S1AP_ENB
-  ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES}
+  ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES}
   NFAPI_USER_LIB S1AP_LIB S1AP_ENB
-  ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} LIB_5GNAS_GNB LIB_NAS_SIMUE ${NAS_SIM_LIB}
+  ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} LFDS7 ${ATLAS_LIBRARIES} LIB_5GNAS_GNB LIB_NAS_SIMUE ${NAS_SIM_LIB}
   -Wl,--end-group z dl)
 
 target_link_libraries (nr-uesoftmodem ${LIBXML2_LIBRARIES})
@@ -3158,7 +3130,7 @@ add_executable(dlsim_tm4
   ${T_SOURCE}
   )
 target_link_libraries (dlsim_tm4
-  -Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB PHY LFDS ${ITTI_LIB} -Wl,--end-group
+  -Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB PHY LFDS ITTI -Wl,--end-group
   pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${T_LIB}
   )
 
@@ -3201,14 +3173,6 @@ target_link_libraries(smallblocktest
   m pthread ${ATLAS_LIBRARIES} dl
   )
 
-
-# temp_C_flag = CMAKE_C_FLAGS
-#set(CMAKE_C_FLAGS " ")
-set (TEMP_C_FLAG ${CMAKE_C_FLAGS})
-set (CMAKE_C_FLAGS ${CUDA_CMAKE_C_FLAGS})
-
-set (TEMP_CXX_FLAG ${CMAKE_CXX_FLAGS})
-set (CMAKE_CXX_FLAGS ${CUDA_CMAKE_CXX_FLAGS})
 if (CUDA_FOUND)
 ###################################################
 # For CUDA library
@@ -3239,8 +3203,6 @@ else (CUDA_FOUND)
        )
 
 endif ()
-set (CMAKE_C_FLAGS ${TEMP_C_FLAG})
-set (CMAKE_CXX_FLAGS ${TEMP_CXX_FLAG})
 
 
 # add_executable(ldpctest
@@ -3268,7 +3230,7 @@ add_executable(nr_dlschsim
   )
 target_link_libraries(nr_dlschsim
   -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
-  m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl
+  m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI dl
   )
 
 add_executable(nr_pbchsim
@@ -3283,7 +3245,7 @@ add_executable(nr_pbchsim
   )
 target_link_libraries(nr_pbchsim
   -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
-  m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl
+  m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI dl
   )
 
 #PUCCH ---> Prashanth
@@ -3300,7 +3262,7 @@ add_executable(nr_pucchsim
   )
 target_link_libraries(nr_pucchsim
   -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
-  m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl
+  m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI dl
   )
 
 add_executable(nr_dlsim
@@ -3319,7 +3281,7 @@ add_executable(nr_dlsim
   )
 target_link_libraries(nr_dlsim
   -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group
-  m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} ${OPENSSL_LIBRARIES} dl
+  m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI ${OPENSSL_LIBRARIES} dl
   )
 target_compile_definitions(nr_dlsim PUBLIC -DPHYSICAL_SIMULATOR)
 
@@ -3338,7 +3300,7 @@ add_executable(nr_prachsim
   ${SHLIB_LOADER_SOURCES})
 target_link_libraries(nr_prachsim
   -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_RU PHY_NR_UE MAC_NR_COMMON SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group
-  m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} ${OPENSSL_LIBRARIES} dl)
+  m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI ${OPENSSL_LIBRARIES} dl)
 
 add_executable(nr_ulschsim
   ${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
@@ -3352,7 +3314,7 @@ add_executable(nr_ulschsim
   )
 target_link_libraries(nr_ulschsim
   -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
-  m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl
+  m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI dl
   )
 
 add_executable(nr_ulsim
@@ -3371,7 +3333,7 @@ add_executable(nr_ulsim
   )
 target_link_libraries(nr_ulsim
   -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB SCHED_NR_UE_LIB MAC_NR MAC_UE_NR MAC_NR_COMMON RRC_LIB NR_RRC_LIB CONFIG_LIB L2_LTE_NR L2_NR HASHTABLE X2AP_ENB X2AP_LIB SECU_CN NGAP_GNB -Wl,--end-group
-  m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} ${OPENSSL_LIBRARIES} dl
+  m pthread ${ATLAS_LIBRARIES} ${T_LIB} ITTI ${OPENSSL_LIBRARIES} dl
   )
 target_compile_definitions(nr_ulsim PUBLIC -DPHYSICAL_SIMULATOR)
 
@@ -3393,7 +3355,7 @@ foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim pr
     ${NFAPI_USER_DIR}/nfapi.c
     )
   target_link_libraries (${myExe}
-    -Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_NR_COMMON PHY PHY_UE PHY_RU LFDS ${ITTI_LIB} LFDS7 -Wl,--end-group
+    -Wl,--start-group SIMU_COMMON SIMU UTIL SCHED_LIB SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON PHY_NR_COMMON PHY PHY_UE PHY_RU LFDS ITTI LFDS7 -Wl,--end-group
     pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES}  ${XFORMS_LIBRARIES} ${T_LIB} dl
     )
 
@@ -3408,7 +3370,7 @@ add_executable(test_epc_generate_scenario
   ${OPENAIR3_DIR}/S1AP/s1ap_eNB_defs.h
   )
 target_link_libraries (test_epc_generate_scenario
-  -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP NR_GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB PHY LFDS ${ITTI_LIB} ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB}
+  -Wl,--start-group RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP NR_GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB PHY LFDS ITTI ${MSC_LIB} L2 -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB}
   )
 
 add_executable(test_epc_play_scenario
@@ -3427,7 +3389,7 @@ add_executable(test_epc_play_scenario
   )
 target_include_directories(test_epc_play_scenario PUBLIC /usr/local/share/asn1c)
 target_link_libraries (test_epc_play_scenario
-  -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP NR_GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE LFDS ${ITTI_LIB} ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB}
+  -Wl,--start-group RRC_LIB S1AP_LIB X2AP_LIB X2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP NR_GTPV1U LIB_NAS_UE SECU_CN UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_LIB PHY_NR_COMMON PHY_COMMON PHY PHY_UE LFDS ITTI ${MSC_LIB} -Wl,--end-group pthread m rt crypt sctp ${LIBXML2_LIBRARIES} ${LIBXSLT_LIBRARIES} ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${CONFIG_LIB}
   )
 
 
@@ -3529,7 +3491,7 @@ endfunction(make_driver name dir src)
 # nashmesh module
 ################
 list(APPEND nasmesh_src device.c common.c ioctl.c classifier.c tool.c mesh.c)
-set(module_cc_opt "${module_cc_opt} -DNAS_NETLINK -DPDCP_USE_NETLINK -D${MKVER}")
+set(module_cc_opt "${module_cc_opt} -DNAS_NETLINK -DPDCP_USE_NETLINK")
 # legacy Makefile was using NAS_NETLINK flag, but other drivers the hereafter flag
 # so, this cmake use OAI_NW_DRIVER_USE_NETLINK everywhere
 if (OAI_NW_DRIVER_USE_NETLINK)
@@ -3583,7 +3545,7 @@ target_compile_definitions(nr-ittisim PUBLIC NEW_GTPU)
 target_link_libraries (nr-ittisim
   -Wl,--start-group
   UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS GTPV1U_OCP SECU_CN SECU_OSA
-  ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_SIM_LIB} RRC_LIB NR_RRC_LIB
+  ITTI ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_SIM_LIB} RRC_LIB NR_RRC_LIB
   NGAP_LIB NGAP_GNB S1AP_LIB S1AP_ENB L2_LTE_NR L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
   X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB}
   PHY_NR_UE SCHED_NR_UE_LIB NR_L2_UE
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 7e7556248eb5461705ff3beb7a0c28b3ead4ae49..c9390d67ce5202478b4951746a58505aef22c5c8 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -683,21 +683,7 @@ function main() {
           $build_dir coding \
           libcoding.so $dbin/libcoding.so
 
-        #check if we run inside a container or not
-        #IS_CONTAINER variable is defined in build_helper file
-        #compile  nasmesh and rb_tool only if NOT running in a container
-        if [ $IS_CONTAINER -eq 0 ]
-        then
-          compilations \
-            $build_dir nasmesh \
-            CMakeFiles/nasmesh/nasmesh.ko $dbin/nasmesh.ko
-
-          compilations \
-            $build_dir rb_tool \
-            rb_tool $dbin/rb_tool
 
-          cp $OPENAIR_DIR/cmake_targets/tools/init_nas_nos1 $dbin
-        fi #IS_CONTAINER
       fi
     fi
   fi
diff --git a/common/config/config_userapi.c b/common/config/config_userapi.c
index af70cae71eccf889a3618ed152f5f1138ac28627..462299b8939fcdb19316d1efc7cace4157d1dbcb 100644
--- a/common/config/config_userapi.c
+++ b/common/config/config_userapi.c
@@ -83,9 +83,14 @@ char *config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length) {
   }
 
   if (*ptr == NULL) {
-    *ptr = malloc(length>40?length:40);
     // LTS: dummy fix, waiting Francois full fix in 4G branch
     // the issue is we don't know at this point the size we will get
+    // for parmeters on the command line, 
+    // The length sould probably managed, in a later version
+    // 100 is a very large value for a string parameter of today OAI
+    if (length<100)
+       length=100;
+    *ptr = malloc(length);
 
     if ( *ptr != NULL) {
       memset(*ptr,0,length);
diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt
index ca5690497dc05140dc918e8b47254ec94f0ab26f..cd66be73f5ac650da9b6a25abfb44b1447b2f7c0 100644
--- a/common/utils/T/T_messages.txt
+++ b/common/utils/T/T_messages.txt
@@ -16,7 +16,7 @@ ID = ENB_PHY_DL_TICK
 ID = ENB_PHY_DLSCH_UE_DCI
     DESC = eNodeB downlink UE specific DCI as sent by the PHY layer
     GROUP = ALL:PHY:GRAPHIC:ENB
-    FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,dci_format : int,harq_pid : int,mcs : int,TBS
+    FORMAT = int,eNB_ID : int,frame : int,subframe : int,rnti : int,dci_format : int,harq_pid : int,mcs : int,TBS : int,ndi : int,rv : int,rbc : int,nb_rb : int,rb_alloc
 ID = ENB_PHY_DLSCH_UE_ACK
     DESC = eNodeB downlink UE ACK as seen by the PHY layer in process_HARQ_feedback
     GROUP = ALL:PHY:GRAPHIC:ENB
diff --git a/common/utils/nr/nr_common.c b/common/utils/nr/nr_common.c
index cc2860191af34fd80ebc78e8bb93e9a204a64ad2..8ba4633604a5933d7245d3656b0c754b849f47bf 100644
--- a/common/utils/nr/nr_common.c
+++ b/common/utils/nr/nr_common.c
@@ -106,6 +106,40 @@ nr_bandentry_t nr_bandtable[] = {
   {261,27500040,28350000,27500040,28350000,  2,2070833, 120}
 };
 
+uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex)
+{
+  const uint64_t dl_freq_khz = downlink_frequency / 1000;
+  const int32_t  delta_duplex_khz = delta_duplex / 1000;
+
+  uint64_t center_freq_diff_khz = 999999999999999999; // 2^64
+  uint16_t current_band = 0;
+
+  for (int ind = 0; ind < nr_bandtable_size; ind++) {
+
+    if (dl_freq_khz < nr_bandtable[ind].dl_min || dl_freq_khz > nr_bandtable[ind].dl_max)
+      continue;
+
+    int32_t current_offset_khz = nr_bandtable[ind].ul_min - nr_bandtable[ind].dl_min;
+
+    if (current_offset_khz != delta_duplex_khz)
+      continue;
+
+    uint64_t center_frequency_khz = (nr_bandtable[ind].dl_max + nr_bandtable[ind].dl_min) / 2;
+
+    if (abs(dl_freq_khz - center_frequency_khz) < center_freq_diff_khz){
+      current_band = nr_bandtable[ind].band;
+      center_freq_diff_khz = abs(dl_freq_khz - center_frequency_khz);
+    }
+  }
+
+  printf("DL frequency %"PRIu64": band %d, UL frequency %"PRIu64"\n",
+        downlink_frequency, current_band, downlink_frequency+delta_duplex);
+
+  AssertFatal(current_band != 0, "Can't find EUTRA band for frequency %"PRIu64" and duplex_spacing %u\n", downlink_frequency, delta_duplex);
+
+  return current_band;
+}
+
 const size_t nr_bandtable_size = sizeof(nr_bandtable) / sizeof(nr_bandentry_t);
 
 int NRRIV2BW(int locationAndBandwidth,int N_RB) {
@@ -196,6 +230,26 @@ uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx) {
   }
 }
 
+
+int get_dmrs_port(int nl, uint16_t dmrs_ports) {
+
+  if (dmrs_ports == 0) return 0; // dci 1_0
+  int p = -1;
+  int found = -1;
+  for (int i=0; i<12; i++) { // loop over dmrs ports
+    if((dmrs_ports>>i)&0x01) { // check if current bit is 1
+      found++;
+      if (found == nl) { // found antenna port number corresponding to current layer
+        p = i;
+        break;
+      }
+    }
+  }
+  AssertFatal(p>-1,"No dmrs port corresponding to layer %d found\n",nl);
+  return p;
+}
+
+
 int get_subband_size(int NPRB,int size) {
   // implements table  5.2.1.4-2 from 36.214
   //
diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h
index 6389c2c09431071b43608e2229b0268773173ed3..b3d2469a12d41751bc5c06f3de797bfe818cf8fc 100644
--- a/common/utils/nr/nr_common.h
+++ b/common/utils/nr/nr_common.h
@@ -50,6 +50,7 @@ typedef struct nr_bandentry_s {
 extern const size_t nr_bandtable_size;
 extern nr_bandentry_t nr_bandtable[];
 
+uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex);
 int NRRIV2BW(int locationAndBandwidth,int N_RB);
 int NRRIV2PRBOFFSET(int locationAndBandwidth,int N_RB);
 int PRBalloc_to_locationandbandwidth0(int NPRB,int RBstart,int BWPsize);
@@ -62,7 +63,7 @@ uint8_t nr_get_Qm(uint8_t Imcs, uint8_t table_idx);
 uint32_t nr_get_code_rate(uint8_t Imcs, uint8_t table_idx);
 int get_subband_size(int NPRB,int size);
 void SLIV2SL(int SLIV,int *S,int *L);
-
+int get_dmrs_port(int nl, uint16_t dmrs_ports);
 
 #define CEILIDIV(a,b) ((a+b-1)/b)
 #define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
diff --git a/common/utils/system.c b/common/utils/system.c
index d8b66c51d3210287bfe95fa8f6165d0a23539937..38d1c1d7ad001202368bca781545fd161b8c7b12 100644
--- a/common/utils/system.c
+++ b/common/utils/system.c
@@ -209,6 +209,10 @@ int background_system(char *command) {
 void start_background_system(void) {
   int p[2];
   pid_t son;
+
+  if (module_initialized == 1)
+    return;
+
   module_initialized = 1;
 
   if (pipe(p) == -1) {
diff --git a/doc/NR_NFAPI_archi.md b/doc/NR_NFAPI_archi.md
new file mode 100644
index 0000000000000000000000000000000000000000..59c511fb52c92a9887fd8b83ce77d4c539c21dbd
--- /dev/null
+++ b/doc/NR_NFAPI_archi.md
@@ -0,0 +1,141 @@
+# global
+
+xnf is pnf or vnf
+
+The xnf starting functions are configure_nfapi_xnf()
+
+The OAI code that read the configuration parameters call these functions that will create autonomous thread for xnf control part
+
+These control threads create a SCTP socket by Linux API call (no use of OpenAir internal architecture with SCTP itti thread).
+
+The main() function of softmodem has to create and start the other threads+loop on event for appropriate work: RF Rx in pnf, NGAP, GTP-U, X2, RLC, PDCP for vnf
+
+NFAPI has it's own code directly on Linux+Posix, it doesn't reuse any piece of the OpenAir framework: SCTP thread, thread creation and management, ... 
+
+## signaling (P5) xnf main loop
+
+nfapi_vnf_start() create the SCTP socket, then do event waiting in a infinite loop while(vnf->terminate == 0). It accepts the pnf connections, then process the messages on reception
+
+nfapi_pnf_start() initiate connection to vnf until it has a link. Then it enter a similar infinite loop in pnf_message_pump()
+
+After some checks, when a message is obtained, it calls pnf_handle_p5_message() or vnf_handle_p4_p5_message() that have a switch on each p5 message types: the enum nfapi_message_id_e
+
+Each message type has it's own processing function in the switch, like 
+```
+case NFAPI_START_RESPONSE:
+        vnf_handle_start_response(pRecvMsg, recvMsgLen, config, p5_idx);
+        break;
+```
+
+These loops are autonomous in their thread waiting incoming message.
+
+## P7 xnf main loop
+
+When the p5 interface receives appropriate message, it starts the p7 interface by launching a thread (see the calls to pthread_create() in nfapi/oai_integration/nfapi_xnf.c)
+
+The p7 main loops starting is a bit simpler, thanks to UDP non connected protocol. The xnf_dispatch_p7_message() do p7 fragments re-assembly, then 
+calls xnf_dispatch_p7_message() that have the big switch on message type (as in p5 above description)
+
+So, we have the logic for UL reception in vnf, and DL reception in pnf
+
+## P7 UL transmission by PNF
+
+RF samples are received, and decoding is done by the PNF using control data transmitted by the VNF to the PNF through downlink p7 messages (UL_TTI_req and UL_DCI_req). 
+
+After decoding, results are accumulated into the xNB->UL_INFO structure at the PNF. 
+
+The data in the UL_INFO struct is transmitted through a socket in the form of 'uplink indication functions' from the PNF to the VNF. Each uplink indication message is transmitted from their respective handle functions in NR_UL_indication(). For example,
+
+```
+
+void handle_nr_rach(NR_UL_IND_t *UL_info) {
+  if(NFAPI_MODE == NFAPI_MODE_PNF) {
+    if (UL_info->rach_ind.number_of_pdus>0) {
+      oai_nfapi_nr_rach_indication(&UL_info->rach_ind); //This function calls the routines required for packing + transmission through socket
+      UL_info->rach_ind.number_of_pdus = 0;
+    }
+  }
+
+```
+
+## P7 UL reception at VNF
+
+Through the infinite loop [while(vnf_p7->terminate == 0)] running in nfapi_nr_vnf_p7_start(), the VNF receives and unpacks the uplink indication message received on its socket. Based on the unpacked messages, UL_INFO struct on the VNF side gets populated. 
+
+```
+
+// have a p7 message
+			if(FD_ISSET(vnf_p7->socket, &rfds))
+			{
+				vnf_nr_p7_read_dispatch_message(vnf_p7); 
+			}
+
+```
+
+vnf_nr_dispatch_p7_message() is the function that contains the switch on various message headers so that the appropriate unpack function is called. 
+
+## P7 DL Transmission by VNF 
+
+DL messages are scheduled at the VNF, through NR_UL_indication(). NR_UL_indication() is called when the SFN/slot in the UL_info structure changes (this acts as a trigger for next slot processing, instead of running a separate clock at the VNF). The SFN/slot at the VNF in UL_info is updated using the slot_indication uplink p7 message, which is sent at the beginning of every slot by the PNF. The slot_indication message contains SFN/slot of the TX_thread, so that the scheduler operates slot_ahead slots ahead of the RX thread. This ensures that UL_tti_req is received before RX slot processing at the PNF. 
+
+The function NR_schedule_response calls oai_nfapi_[DL P7 msg]_req(), which contains the routines for packing + transmission of scheduled messages through the socket to the PNF. For example, to send the 'TX_data_req' p7 message 
+
+```
+
+if (Sched_INFO->TX_req->Number_of_PDUs > 0)
+{
+  oai_nfapi_tx_data_req(Sched_INFO->TX_req);
+}
+
+```
+
+```mermaid
+
+graph TD
+    pselect[VNF socket pselect] -- timed out : end of slot --> call_sched[Call Scheduler NR_UL_indication] -- oai_nfapi_***_req sends the DL p7 msg--> slot_inc[Increment sfn/slot];
+    pselect[VNF socket pselect] -- UL p7 xyz msg recvd --> msg_recvd[Read message vnf_nr_p7_read_dispatch_message] --> header_unpack[Unpack Header] -- switch cases on header --> unpack_msg[Handle Message vnf_handle_nr_xyz] --> fill_ul_info[Fill UL info struct with fn pointer vnf_p7->_public.nr_rx_xyz];
+    fill_ul_info -- update pselect_timeout: next_slot_start - time_xyz_msg_recvd-->pselect;
+    slot_inc -- next slot --> pselect
+
+```
+Note that since DL P7 message reception and TX/RX processing are done on separate threads, there is the issue of the L1 processing threads trying to do their job before the required P7 message is received. In the case of RX processing, since the scheduler operates slot_ahead slots ahead of the RX thread, the required messages conveniently arrive earlier than they are required. However, in the case of TX processing, this cannot be ensured if the scheduler is exactly in sync with the TX thread.  
+
+Therefore, we operate the VNF vnf_slot_ahead (which is currently 2) slots ahead of the PNF. This is to ensure that the DL fapi structures for a particular TX slot are all received before TX processing for that slot.
+
+## P7 DL Reception at PNF 
+
+Through the infinite loop [while(pnf_p7->terminate == 0)] running in pnf_nr_p7_message_pump(), the PNF receives and unpacks the downlink P7 message received on its socket. Based on the unpacked message, the appropriate message structures are filled in the PNF, and these are used further down the pipeline for processing. 
+
+While receiving the DL P7 message, we check whether the message was received within a timing window from which it was sent. The duration of the window can be set by the user (set as a parameter for xnf in the p5 messages). Note that the DL information must be received by the PNF within a timing window at least lesser than the duration of slot_ahead variable (timing_window <= slot_ahead * slot_duration).
+
+```mermaid
+
+graph TB
+    pselect[PNF socket pselect] -- timed out : end of slot --> slot_inc[Increment sfn/slot];
+    pselect[PNF socket pselect] -- DL p7 xyz msg recvd --> msg_recvd[Read message pnf_nr_nfapi_p7_read_dispatch_message] --> header_unpack[Unpack Header] -- switch cases on header --> unpack_msg[Unpack Message pnf_handle_nr_xyz] --> fill_pnf_p7[Fill pnf_p7 global structure pnf_handle_nr_xyz] --Data from pnf_p7 struct copied to fapi structures using pnf_phy_***_req. Called every slot from handle_nr_slot_ind-->pselect;
+
+    slot_inc -- next slot --> pselect
+```
+Once the messages are received, they are filled into slot buffers, and are stored until the processing of the slot that they were meant for. 
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/RUN_NR_NFAPI.md b/doc/RUN_NR_NFAPI.md
new file mode 100644
index 0000000000000000000000000000000000000000..ea7c2590c7378d5bf1f4a90680b57707b91f976e
--- /dev/null
+++ b/doc/RUN_NR_NFAPI.md
@@ -0,0 +1,54 @@
+# Procedure to run nFAPI in 5G NR
+
+## Contributed by 5G Testbed IISc 
+
+### Developers: Gokul S, Mahesh A, Aniq U R
+
+## Procedure to Build gNB and UE
+
+The regular commands to build gNB and UE can be used
+```
+sudo ./build_oai --gNB --nrUE
+
+```
+## Procedure to run NR nFAPI using RF-Simulator
+
+### Bring up another loopback interface
+
+If running for the first time on your computer, or you have restarted your computer, bring up another loopback interface with this command:  
+
+sudo ifconfig lo: 127.0.0.2 netmask 255.0.0.0 up
+
+### VNF command
+```
+sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf --nfapi 2 --noS1 --phy-test
+
+```
+### PNF command
+```
+sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf --nfapi 1 --rfsim --phy-test --rfsimulator.serveraddr server
+
+```
+### UE command
+```
+sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem --rfsim --phy-test --rrc_config_path . -d
+
+```
+## Procedure to run NR nFAPI using Hardware (tested with USRP x310)
+
+### VNF command
+```
+sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf --nfapi 2 --noS1 --phy-test
+
+```
+### PNF command
+```
+sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf --nfapi 1 --phy-test
+
+```
+### UE command
+```
+sudo ./nr-uesoftmodem --usrp-args "addr=*USRP_ADDRESS*,clock_source=external,time_source=external" --phy-test --rrc_config_path ../../../ci-scripts/rrc-files
+
+```
+
diff --git a/docker/Dockerfile.eNB.rhel8.2 b/docker/Dockerfile.eNB.rhel8.2
index cf012502e07feba1c0bd8d07a04413325c94ea56..90c807fc0e3b0719ed52daad370d465e3a84d7e7 100644
--- a/docker/Dockerfile.eNB.rhel8.2
+++ b/docker/Dockerfile.eNB.rhel8.2
@@ -37,9 +37,7 @@ RUN /bin/sh oaienv && \
     mkdir -p log && \
     ./build_oai --eNB --ninja -w USRP --verbose-ci
 
-RUN yum install -y python3-pip && \
-    pip3 install --ignore-installed pyyaml && \
-    python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml
+RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml
 
 #start from scratch for target executable
 FROM registry.access.redhat.com/ubi8/ubi:latest as oai-enb
@@ -48,6 +46,7 @@ RUN yum update -y && \
     yum install -y --enablerepo="ubi-8-codeready-builder" \
         lksctp-tools \
         nettle \
+        procps-ng \
         atlas \
         net-tools \
         iputils \
diff --git a/docker/Dockerfile.eNB.ubuntu18 b/docker/Dockerfile.eNB.ubuntu18
index 2954d3fb186c6d010f6ebc4a456b6b3903a6e263..c4393dc78e6b16f027d9d760bfb3821d388eed52 100644
--- a/docker/Dockerfile.eNB.ubuntu18
+++ b/docker/Dockerfile.eNB.ubuntu18
@@ -37,9 +37,7 @@ RUN /bin/sh oaienv && \
     mkdir -p log && \
     ./build_oai --eNB --ninja -w USRP --verbose-ci
 
-RUN apt-get install -y python3-pip && \
-    pip3 install --ignore-installed pyyaml && \
-    python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml
+RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml
 
 #start from scratch for target executable
 FROM ubuntu:bionic as oai-enb
@@ -51,6 +49,7 @@ RUN apt-get update && \
     DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
     DEBIAN_FRONTEND=noninteractive apt-get install --yes \
         software-properties-common \
+        procps \
         libsctp1 \
         libnettle6 \
         libblas3 \
diff --git a/docker/Dockerfile.gNB.rhel8.2 b/docker/Dockerfile.gNB.rhel8.2
index 6969c691fdf6197dccb14cf8925bbda766f3581d..9ee0bf9ae9d52683895b6940909858c0b0df8696 100644
--- a/docker/Dockerfile.gNB.rhel8.2
+++ b/docker/Dockerfile.gNB.rhel8.2
@@ -25,7 +25,7 @@
 #
 #---------------------------------------------------------------------
 
-FROM localhost/ran-build:latest AS gnb-build 
+FROM ran-build:latest AS gnb-build
 
 RUN rm -Rf /oai-ran
 WORKDIR /oai-ran
@@ -37,11 +37,7 @@ RUN /bin/sh oaienv && \
     mkdir -p log && \
     ./build_oai --gNB --ninja -w USRP --verbose-ci
 
-#debug
-#RUN ldconfig -v
-#RUN ldd /oai-ran/targets/bin/nr-softmodem.Rel15
-#RUN ls -lst /oai-ran/targets/bin
-#RUN ls -lst /oai-ran/cmake_targets/ran_build/build/*.so
+RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/gnb_parameters.yaml
 
 #start from scratch for target executable
 FROM registry.access.redhat.com/ubi8/ubi:latest as oai-gnb
@@ -49,6 +45,7 @@ FROM registry.access.redhat.com/ubi8/ubi:latest as oai-gnb
 RUN yum repolist --disablerepo=* && \
     yum update -y && \
     yum install -y --enablerepo="ubi-8-codeready-builder" \
+        procps-ng \
         libXpm \
         libX11 \
         atlas \
@@ -62,6 +59,7 @@ RUN yum repolist --disablerepo=* && \
 
 WORKDIR /opt/oai-gnb/bin
 COPY --from=gnb-build /oai-ran/targets/bin/nr-softmodem.Rel15 .
+COPY --from=gnb-build /oai-ran/docker/scripts/gnb_entrypoint.sh entrypoint.sh
 
 WORKDIR /usr/local/lib/
 COPY --from=gnb-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
@@ -99,23 +97,10 @@ COPY --from=gnb-build /lib64/libboost_timer.so.1.66.0 /lib64
 COPY --from=gnb-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
 
 RUN ldconfig
-#debug
-#RUN ldd /opt/oai-gnb/bin/nr-softmodem.Rel15
-#RUN ldd /usr/local/lib/liboai_eth_transpro.so.Rel15
-#RUN ldd /usr/local/lib/libtcp_bridge_oai.so.Rel15
-#RUN ldd /usr/local/lib/librfsimulator.so.Rel15
-#RUN ldd /usr/local/lib/liboai_usrpdevif.so.Rel15
-#RUN ldd /usr/local/lib/libcoding.so
-#RUN ldd /usr/local/lib/libparams_libconfig.so
-#RUN ldd /usr/local/lib/libdfts.so
-#RUN ldd /usr/local/lib/libldpc.so
-#RUN ldd /usr/local/lib/libldpc_optim.so
-#RUN ldd /usr/local/lib/libldpc_optim8seg.so
-#RUN ldd /usr/local/lib/libldpc_orig.so
 
 # Copy the relevant configuration files for gNB
 WORKDIR /opt/oai-gnb/etc
-COPY --from=gnb-build /oai-ran/ci-scripts/conf_files/gnb.* .
+COPY --from=gnb-build /oai-ran/docker/etc .
 
 WORKDIR /opt/oai-gnb
 #EXPOSE 2152/udp  # S1U, GTP/UDP
@@ -125,6 +110,5 @@ WORKDIR /opt/oai-gnb
 #EXPOSE 50000/udp # IF5 / ORI (control)
 #EXPOSE 50001/udp # IF5 / ECPRI (data)
 
-#CMD ["/opt/oai-gnb/bin/nr-softmodem", "-O", "/opt/oai-gnb/etc/gnb.conf"]
-#ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
-CMD ["sleep", "infinity"]
+ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
+CMD ["/opt/oai-gnb/bin/nr-softmodem.Rel15", "-O", "/opt/oai-gnb/etc/gnb.conf"]
diff --git a/docker/Dockerfile.gNB.ubuntu18 b/docker/Dockerfile.gNB.ubuntu18
index 276d6989c4e9bf61d87cb4c86a32ff8c55ff7d4b..990c4363e5b98aad04ee852826937807b8883487 100644
--- a/docker/Dockerfile.gNB.ubuntu18
+++ b/docker/Dockerfile.gNB.ubuntu18
@@ -25,7 +25,7 @@
 #
 #---------------------------------------------------------------------
 
-FROM ran-build:latest AS gnb-build 
+FROM ran-build:latest AS gnb-build
 
 RUN rm -Rf /oai-ran
 WORKDIR /oai-ran
@@ -37,23 +37,20 @@ RUN /bin/sh oaienv && \
     mkdir -p log && \
     ./build_oai --gNB --ninja -w USRP --verbose-ci
 
-#debug
-RUN ldconfig -v
-RUN ldd /oai-ran/targets/bin/nr-softmodem.Rel15
-RUN ls -lst /oai-ran/targets/bin
-RUN ls -lst /oai-ran/cmake_targets/ran_build/build/*.so
+RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/gnb_parameters.yaml
 
 #start from scratch for target executable
 FROM ubuntu:bionic as oai-gnb
 ENV DEBIAN_FRONTEND=noninteractive
 ENV TZ=Europe
-RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
 
 RUN apt-get update && \
     DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
     DEBIAN_FRONTEND=noninteractive apt-get install --yes \
         software-properties-common \
+        procps \
         libsctp1 \
+        tzdata \
         libnettle6 \
         libblas3 \
         libatlas3-base \
@@ -76,6 +73,7 @@ RUN apt-get update && \
 
 WORKDIR /opt/oai-gnb/bin
 COPY --from=gnb-build /oai-ran/targets/bin/nr-softmodem.Rel15 .
+COPY --from=gnb-build /oai-ran/docker/scripts/gnb_entrypoint.sh entrypoint.sh
 
 WORKDIR /usr/local/lib/
 COPY --from=gnb-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
@@ -96,23 +94,10 @@ RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/li
 COPY --from=gnb-build /usr/local/lib/libprotobuf-c.so.1 .
 
 RUN ldconfig
-#debug
-#RUN ldd /opt/oai-gnb/bin/nr-softmodem.Rel15
-#RUN ldd /usr/local/lib/liboai_eth_transpro.so.Rel15
-#RUN ldd /usr/local/lib/libtcp_bridge_oai.so.Rel15
-#RUN ldd /usr/local/lib/librfsimulator.so.Rel15
-#RUN ldd /usr/local/lib/liboai_usrpdevif.so.Rel15
-#RUN ldd /usr/local/lib/libcoding.so
-#RUN ldd /usr/local/lib/libparams_libconfig.so
-#RUN ldd /usr/local/lib/libdfts.so
-#RUN ldd /usr/local/lib/libldpc.so
-#RUN ldd /usr/local/lib/libldpc_optim.so
-#RUN ldd /usr/local/lib/libldpc_optim8seg.so
-#RUN ldd /usr/local/lib/libldpc_orig.so
 
 # Copy the relevant configuration files for gNB
 WORKDIR /opt/oai-gnb/etc
-COPY --from=gnb-build /oai-ran/ci-scripts/conf_files/gnb.* ./
+COPY --from=gnb-build /oai-ran/docker/etc .
 
 WORKDIR /opt/oai-gnb
 #EXPOSE 2152/udp  # S1U, GTP/UDP
@@ -122,6 +107,5 @@ WORKDIR /opt/oai-gnb
 #EXPOSE 50000/udp # IF5 / ORI (control)
 #EXPOSE 50001/udp # IF5 / ECPRI (data)
 
-#CMD ["/opt/oai-gnb/bin/nr-softmodem", "-O", "/opt/oai-gnb/etc/gnb.conf"]
-#ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
-CMD ["sleep", "infinity"]
+ENTRYPOINT ["/opt/oai-gnb/bin/entrypoint.sh"]
+CMD ["/opt/oai-gnb/bin/nr-softmodem.Rel15", "-O", "/opt/oai-gnb/etc/gnb.conf"]
diff --git a/docker/Dockerfile.lteRU.rhel8.2 b/docker/Dockerfile.lteRU.rhel8.2
index 35078de00720f47e0b36742dd641b7743a3fa85d..314c01dff39eb3d46014216ad947929172915bd3 100644
--- a/docker/Dockerfile.lteRU.rhel8.2
+++ b/docker/Dockerfile.lteRU.rhel8.2
@@ -37,9 +37,7 @@ RUN /bin/sh oaienv && \
     mkdir -p log && \
     ./build_oai --RU --ninja -w USRP --verbose-ci
 
-RUN yum install -y python3-pip && \
-    pip3 install --ignore-installed pyyaml && \
-    python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml
+RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml
 
 #start from scratch for target executable
 FROM registry.access.redhat.com/ubi8/ubi:latest as oai-lte-ru
@@ -48,6 +46,7 @@ ENV TZ=Europe/Paris
 RUN yum update -y && \
     yum install -y --enablerepo="ubi-8-codeready-builder" \
         tzdata \
+        procps-ng \
         atlas \
         net-tools \
         iputils \
diff --git a/docker/Dockerfile.lteRU.ubuntu18 b/docker/Dockerfile.lteRU.ubuntu18
index 381d63d9f30ffcd6faa89e4550f524802e8f19b9..fa99827d942ca3e9e5e566acbb75860fd14f5554 100644
--- a/docker/Dockerfile.lteRU.ubuntu18
+++ b/docker/Dockerfile.lteRU.ubuntu18
@@ -37,9 +37,7 @@ RUN /bin/sh oaienv && \
     mkdir -p log && \
     ./build_oai --RU --ninja -w USRP --verbose-ci
 
-RUN apt-get install -y python3-pip && \
-    pip3 install --ignore-installed pyyaml && \
-    python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml
+RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/enb_parameters.yaml
 
 #start from scratch for target executable
 FROM ubuntu:bionic as oai-lte-ru
@@ -50,6 +48,7 @@ RUN apt-get update && \
     DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
     DEBIAN_FRONTEND=noninteractive apt-get install --yes \
         tzdata \
+        procps \
         software-properties-common \
         libblas3 \
         libatlas3-base \
diff --git a/docker/Dockerfile.lteUE.rhel8.2 b/docker/Dockerfile.lteUE.rhel8.2
index 731abed1a834e78159c34f765bc50925c73dee6a..936780297a6c8f1d5976e3fbe374dd15316aba70 100644
--- a/docker/Dockerfile.lteUE.rhel8.2
+++ b/docker/Dockerfile.lteUE.rhel8.2
@@ -37,9 +37,7 @@ RUN /bin/sh oaienv && \
     mkdir -p log && \
     ./build_oai --UE --ninja -w USRP --verbose-ci
 
-RUN yum install -y python3-pip && \
-    pip3 install --ignore-installed pyyaml && \
-    python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_parameters.yaml && \
+RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_parameters.yaml && \
     python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_sim_parameters.yaml
 
 #start from scratch for target executable
@@ -48,6 +46,7 @@ FROM registry.access.redhat.com/ubi8/ubi:latest as oai-lte-ue
 RUN yum update -y && \
     yum install -y --enablerepo="ubi-8-codeready-builder" \
         lksctp-tools \
+        procps-ng \
         nettle \
         atlas \
         iproute \
diff --git a/docker/Dockerfile.lteUE.ubuntu18 b/docker/Dockerfile.lteUE.ubuntu18
index fcd16f0c151854b82ecce6664299d808e55d70cd..34cbe651adc90fcae4150080148b4468455be982 100644
--- a/docker/Dockerfile.lteUE.ubuntu18
+++ b/docker/Dockerfile.lteUE.ubuntu18
@@ -37,9 +37,7 @@ RUN /bin/sh oaienv && \
     mkdir -p log && \
     ./build_oai --UE --ninja -w USRP --verbose-ci
 
-RUN apt-get install -y python3-pip && \
-    pip3 install --ignore-installed pyyaml && \
-    python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_parameters.yaml && \
+RUN python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_parameters.yaml && \
     python3 ./docker/scripts/generateTemplate.py ./docker/scripts/lte_ue_sim_parameters.yaml
 
 #start from scratch for target executable
@@ -52,6 +50,7 @@ RUN apt-get update && \
     DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
     DEBIAN_FRONTEND=noninteractive apt-get install --yes \
         software-properties-common \
+        procps \
         libsctp1 \
         libnettle6 \
         liblapacke \
diff --git a/docker/Dockerfile.nrUE.rhel8.2 b/docker/Dockerfile.nrUE.rhel8.2
index 01988fd6ff6608d8f132eefbce4524c16149a305..56fc746adeb53cc0336ca28b88f80cd068b6d4b9 100644
--- a/docker/Dockerfile.nrUE.rhel8.2
+++ b/docker/Dockerfile.nrUE.rhel8.2
@@ -25,7 +25,7 @@
 #
 #---------------------------------------------------------------------
 
-FROM localhost/ran-build:latest AS nr-ue-build 
+FROM ran-build:latest AS nr-ue-build 
 
 RUN rm -Rf /oai-ran
 WORKDIR /oai-ran
@@ -37,21 +37,19 @@ RUN /bin/sh oaienv && \
     mkdir -p log && \
     ./build_oai --nrUE --ninja -w USRP --verbose-ci
 
-# debug
-#RUN ldconfig -v
-#RUN ldd /oai-ran/targets/bin/nr-uesoftmodem.Rel15
-#RUN ls -lst /oai-ran/targets/bin
-#RUN ls -lst /oai-ran/cmake_targets/ran_build/build/*.so
-
 #start from scratch for target executable
 FROM registry.access.redhat.com/ubi8/ubi:latest as oai-nr-ue
+ENV TZ=Europe/Paris
 
 RUN yum update -y && \
     yum install -y --enablerepo="ubi-8-codeready-builder" \
         lksctp-tools \
+        procps-ng \
+        tzdata \
         nettle \
         net-tools \
         iputils \
+        iproute \
         atlas \
         libXpm \
         libX11 \
@@ -61,6 +59,10 @@ RUN yum update -y && \
 
 WORKDIR /opt/oai-nr-ue/bin
 COPY --from=nr-ue-build /oai-ran/targets/bin/nr-uesoftmodem.Rel15 .
+COPY --from=nr-ue-build /oai-ran/docker/scripts/nr_ue_entrypoint.sh entrypoint.sh
+
+WORKDIR /opt/oai-nr-ue/etc
+COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf .
 
 WORKDIR /usr/local/lib/
 COPY --from=nr-ue-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
@@ -98,24 +100,11 @@ COPY --from=nr-ue-build /lib64/libboost_timer.so.1.66.0 /lib64
 COPY --from=nr-ue-build /usr/local/lib64/libuhd.so.4.0.0 /usr/local/lib64
 
 RUN ldconfig
-#RUN ldd /opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15
-#RUN ldd /usr/local/lib/liboai_eth_transpro.so.Rel15
-#RUN ldd /usr/local/lib/libtcp_bridge_oai.so.Rel15
-#RUN ldd /usr/local/lib/librfsimulator.so.Rel15
-#RUN ldd /usr/local/lib/liboai_usrpdevif.so.Rel15
-#RUN ldd /usr/local/lib/libcoding.so
-#RUN ldd /usr/local/lib/libparams_libconfig.so
-#RUN ldd /usr/local/lib/libdfts.so
-#RUN ldd /usr/local/lib/libldpc.so
-#RUN ldd /usr/local/lib/libldpc_optim.so
-#RUN ldd /usr/local/lib/libldpc_optim8seg.so
-#RUN ldd /usr/local/lib/libldpc_orig.so
 
 # Copy the relevant configuration files for eNB
 WORKDIR /opt/oai-nr-ue/etc
 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"]
+CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue-sim.conf"]
+ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
diff --git a/docker/Dockerfile.nrUE.ubuntu18 b/docker/Dockerfile.nrUE.ubuntu18
index c96bcf80ef106613c06080574455f09f724cb42a..fc30af7286f9f93af74f2762fba9ad7fac164d28 100644
--- a/docker/Dockerfile.nrUE.ubuntu18
+++ b/docker/Dockerfile.nrUE.ubuntu18
@@ -25,7 +25,7 @@
 #
 #---------------------------------------------------------------------
 
-FROM ran-build:latest AS nr-ue-build 
+FROM ran-build:latest AS nr-ue-build
 
 RUN rm -Rf /oai-ran
 WORKDIR /oai-ran
@@ -37,23 +37,18 @@ RUN /bin/sh oaienv && \
     mkdir -p log && \
     ./build_oai --nrUE --ninja -w USRP --verbose-ci
 
-# debug
-#RUN ldconfig -v
-#RUN ldd /oai-ran/targets/bin/nr-uesoftmodem.Rel15
-#RUN ls -lst /oai-ran/targets/bin
-#RUN ls -lst /oai-ran/cmake_targets/ran_build/build/*.so
-
 #start from scratch for target executable
 FROM ubuntu:bionic as oai-nr-ue
 ENV DEBIAN_FRONTEND=noninteractive
-ENV TZ=Europe
-RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
+ENV TZ=Europe/Paris
 
 RUN apt-get update && \
     DEBIAN_FRONTEND=noninteractive apt-get upgrade --yes && \
     DEBIAN_FRONTEND=noninteractive apt-get install --yes \
         software-properties-common \
         libsctp1 \
+        procps \
+        tzdata \
         libnettle6 \
         liblapacke \
         libatlas3-base \
@@ -62,6 +57,7 @@ RUN apt-get update && \
         net-tools \
         iputils-ping \
         iproute2 \
+        iperf \
         libyaml-0-2 && \
     # Install UHD driver from ettus ppa 
     # At time of writing, it is 3.14
@@ -76,6 +72,10 @@ RUN apt-get update && \
 
 WORKDIR /opt/oai-nr-ue/bin
 COPY --from=nr-ue-build /oai-ran/targets/bin/nr-uesoftmodem.Rel15 .
+COPY --from=nr-ue-build /oai-ran/docker/scripts/nr_ue_entrypoint.sh entrypoint.sh
+
+WORKDIR /opt/oai-nr-ue/etc
+COPY --from=nr-ue-build /oai-ran/ci-scripts/conf_files/nr-ue-sim.conf .
 
 WORKDIR /usr/local/lib/
 COPY --from=nr-ue-build /oai-ran/targets/bin/liboai_eth_transpro.so.Rel15 .
@@ -96,25 +96,7 @@ RUN /bin/bash -c "ln -s /usr/local/lib/librfsimulator.so.Rel15 /usr/local/lib/li
 COPY --from=nr-ue-build /usr/local/lib/libprotobuf-c.so.1 .
 
 RUN ldconfig
-#debug
-#RUN ldd /opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15
-#RUN ldd /usr/local/lib/liboai_eth_transpro.so.Rel15
-#RUN ldd /usr/local/lib/libtcp_bridge_oai.so.Rel15
-#RUN ldd /usr/local/lib/librfsimulator.so.Rel15
-#RUN ldd /usr/local/lib/liboai_usrpdevif.so.Rel15
-#RUN ldd /usr/local/lib/libcoding.so
-#RUN ldd /usr/local/lib/libparams_libconfig.so
-#RUN ldd /usr/local/lib/libdfts.so
-#RUN ldd /usr/local/lib/libldpc.so
-#RUN ldd /usr/local/lib/libldpc_optim.so
-#RUN ldd /usr/local/lib/libldpc_optim8seg.so
-#RUN ldd /usr/local/lib/libldpc_orig.so
-
-# Copy the relevant configuration files for eNB
-WORKDIR /opt/oai-nr-ue/etc
-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"]
+CMD ["/opt/oai-nr-ue/bin/nr-uesoftmodem.Rel15", "-O", "/opt/oai-nr-ue/etc/nr-ue-sim.conf"]
+ENTRYPOINT ["/opt/oai-nr-ue/bin/entrypoint.sh"]
diff --git a/docker/Dockerfile.phySim.rhel8.2 b/docker/Dockerfile.phySim.rhel8.2
index 4472ece36313de139ff26710dc253f19fb4f9585..2333098bd715a4b44c3ec3e07f00395c96f383dd 100644
--- a/docker/Dockerfile.phySim.rhel8.2
+++ b/docker/Dockerfile.phySim.rhel8.2
@@ -25,7 +25,7 @@
 #
 #---------------------------------------------------------------------
 
-FROM localhost/ran-build:develop AS phy-sim-build
+FROM ran-build:develop AS phy-sim-build
 
 RUN rm -Rf /oai-ran
 WORKDIR /oai-ran
diff --git a/docker/Dockerfile.ran.rhel8.2 b/docker/Dockerfile.ran.rhel8.2
index 2e4bd586bfdc19de44b3470e63b8a274672cdbd5..3972fd0c35ffb054a5af11a9479753d68f077368 100644
--- a/docker/Dockerfile.ran.rhel8.2
+++ b/docker/Dockerfile.ran.rhel8.2
@@ -44,8 +44,11 @@ RUN rm -f /etc/rhsm-host && \
        file \
        psmisc \
        git \
+       # python3-pip and pyyaml are used for conf template generation
+       python3-pip \
        #unzip is needed for protobuf
        unzip && \
+    pip3 install --ignore-installed pyyaml && \
     echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf && \
     echo "/usr/local/lib64" >> /etc/ld.so.conf.d/local-lib.conf
 
diff --git a/docker/Dockerfile.ran.ubuntu18 b/docker/Dockerfile.ran.ubuntu18
index 730366da74cc008a761589199a8b65a3bda4450d..4b296408fd8d5747533e02e55ca13ebd2308290f 100644
--- a/docker/Dockerfile.ran.ubuntu18
+++ b/docker/Dockerfile.ran.ubuntu18
@@ -42,7 +42,10 @@ RUN apt-get update && \
        git \
        xxd \
        #unzip is needed for protobuf
-       unzip
+       unzip \
+       # python3-pip for conf template generation
+       python3-pip && \
+    pip3 install --ignore-installed pyyaml
 
 # In some network environments, GIT proxy is required
 RUN /bin/bash -c "if [[ -v NEEDED_GIT_PROXY ]]; then git config --global http.proxy $NEEDED_GIT_PROXY; fi"
@@ -56,4 +59,3 @@ RUN /bin/sh oaienv && \
     cd cmake_targets && \
     mkdir -p log && \
     ./build_oai -I -w USRP
-
diff --git a/docker/scripts/enb_entrypoint.sh b/docker/scripts/enb_entrypoint.sh
index 6810a86416255dec22baf665ed6ee461be6c2193..2e8886e8558071a79482a439ef726af5b7a69b87 100755
--- a/docker/scripts/enb_entrypoint.sh
+++ b/docker/scripts/enb_entrypoint.sh
@@ -4,6 +4,9 @@ set -euo pipefail
 
 PREFIX=/opt/oai-enb
 RRC_INACTIVITY_THRESHOLD=${RRC_INACTIVITY_THRESHOLD:-0}
+ENABLE_MEASUREMENT_REPORTS=${ENABLE_MEASUREMENT_REPORTS:-no}
+ENABLE_X2=${ENABLE_X2:-no}
+THREAD_PARALLEL_CONFIG=${THREAD_PARALLEL_CONFIG:-PARALLEL_SINGLE_THREAD}
 
 # Based another env var, pick one template to use
 if [[ -v USE_FDD_CU ]]; then ln -s $PREFIX/etc/cu.fdd.conf $PREFIX/etc/enb.conf; fi
diff --git a/docker/scripts/enb_parameters.yaml b/docker/scripts/enb_parameters.yaml
index 749600f47d7e8cfe1234415179ff0c889ef1cce8..07bba4479b95417e58cabb7866f83e7d2de9a955 100644
--- a/docker/scripts/enb_parameters.yaml
+++ b/docker/scripts/enb_parameters.yaml
@@ -98,6 +98,8 @@
       env: "@NID_CELL@"
     - key: N_RB_DL
       env: "@NB_PRB@"
+    - key: parallel_config
+      env: "@THREAD_PARALLEL_CONFIG@"
       
   - filePrefix: rru.fdd
     outputfilename: "rru.fdd.conf"
@@ -110,6 +112,8 @@
       env: "@RRU_LOCAL_IP_ADDRESS@"
     - key: bands
       env: "@UTRA_BAND_ID@"
+    - key: parallel_config
+      env: "@THREAD_PARALLEL_CONFIG@"
       
   - filePrefix: rru.tdd
     outputfilename: "rru.tdd.conf"
@@ -122,8 +126,10 @@
       env: "@RRU_LOCAL_IP_ADDRESS@"
     - key: bands
       env: "@UTRA_BAND_ID@"
+    - key: parallel_config
+      env: "@THREAD_PARALLEL_CONFIG@"
       
-  - filePrefix: enb.band7.tm1.25PRB.usrpb210
+  - filePrefix: enb.band7.tm1.fr1.25PRB.usrpb210.conf
     outputfilename: "enb.fdd.conf"
     config:
     - key: Active_eNBs
@@ -147,6 +153,10 @@
       env: "@NID_CELL@"
     - key: N_RB_DL
       env: "@NB_PRB@"
+    - key: enable_measurement_reports
+      env: "@ENABLE_MEASUREMENT_REPORTS@"
+    - key: enable_x2
+      env: "@ENABLE_X2@"
     - key: ipv4
       env: "@MME_S1C_IP_ADDRESS@"
     - key: ENB_INTERFACE_NAME_FOR_S1_MME
@@ -167,6 +177,8 @@
       env: "@FLEXRAN_INTERFACE_NAME@"
     - key: FLEXRAN_IPV4_ADDRESS
       env: "@FLEXRAN_IPV4_ADDRESS@"
+    - key: parallel_config
+      env: "@THREAD_PARALLEL_CONFIG@"
       
   - filePrefix: enb.band40.tm1.25PRB.FairScheduler.usrpb210
     outputfilename: "enb.tdd.conf"
@@ -204,6 +216,8 @@
       env: "@F1_CU_IP_ADDRESS@"
     - key: ENB_IPV4_ADDRESS_FOR_X2C
       env: "@F1_CU_IP_ADDRESS@"
+    - key: parallel_config
+      env: "@THREAD_PARALLEL_CONFIG@"
       
   - filePrefix: "rcc.band7.tm1.nfapi"
     outputfilename: "rcc.nfapi.fdd.conf"
@@ -247,6 +261,8 @@
       env: "@F1_CU_IP_ADDRESS@"
     - key: ENB_IPV4_ADDRESS_FOR_X2C
       env: "@F1_CU_IP_ADDRESS@"
+    - key: parallel_config
+      env: "@THREAD_PARALLEL_CONFIG@"
 
   - filePrefix: "rcc.band7.tm1.if4p5.lo.25PRB"
     outputfilename: "rcc.if4p5.fdd.conf"
@@ -290,6 +306,8 @@
       env: "@IF4P5_RRU_IP_ADDRESS@"
     - key: local_address
       env: "@IF4P5_RCC_IP_ADDRESS@"
+    - key: parallel_config
+      env: "@THREAD_PARALLEL_CONFIG@"
 
   - filePrefix: "rcc.band40.tm1.25PRB"
     outputfilename: "rcc.if4p5.tdd.conf"
@@ -333,4 +351,6 @@
       env: "@IF4P5_RRU_IP_ADDRESS@"
     - key: local_address
       env: "@IF4P5_RCC_IP_ADDRESS@"
+    - key: parallel_config
+      env: "@THREAD_PARALLEL_CONFIG@"
 
diff --git a/docker/scripts/generateTemplate.py b/docker/scripts/generateTemplate.py
index 5ce0d146e59682ddd7fac4a927a7c5290ca6ba60..cc4b72a7035159ebbae7e77767cfc150bfeb106b 100644
--- a/docker/scripts/generateTemplate.py
+++ b/docker/scripts/generateTemplate.py
@@ -48,18 +48,20 @@ def main():
                              "du.band7.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "rru.fdd": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "rru.tdd": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
-                             "enb.band7.tm1.25PRB.usrpb210": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
+                             "enb.band7.tm1.fr1.25PRB.usrpb210.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "enb.band40.tm1.25PRB.FairScheduler.usrpb210": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "rcc.band7.tm1.nfapi": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "rcc.band7.tm1.if4p5.lo.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "rcc.band40.tm1.25PRB": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
+                             "gnb.band78.tm1.fr1.106PRB.usrpb210.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
+                             "gnb.band78.sa.fr1.106PRB.usrpn310.conf": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "ue.nfapi": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}',
                              "ue_sim_ci": f'{data[0]["paths"]["dest_dir"]}/{outputfilename}'
                              }
         print('inputfile = ' + inputfile)
         if filePrefix in prefix_outputfile:
           outputfile1 = prefix_outputfile[filePrefix]  
-      
+
         directory = f'{data[0]["paths"]["dest_dir"]}'
         if not os.path.exists(directory):
           os.makedirs(directory, exist_ok=True)
@@ -71,11 +73,21 @@ def main():
             if re.search(r'EHPLMN_LIST', line):
               outputfile.write(line)
               continue
+            if re.search(r'sd  = 0x1;', line):
+              templine = re.sub(r'sd  = 0x1;', 'sd  = 0x@NSSAI_SD0@;', line)
+              outputfile.write(templine)
+              continue
+            if re.search(r'sd  = 0x112233;', line):
+              templine = re.sub(r'sd  = 0x112233;', 'sd  = 0x@NSSAI_SD1@;', line)
+              outputfile.write(templine)
+              continue
             for key in config["config"]:
               if line.find(key["key"]) >= 0:
                 count += 1
                 if re.search(r'preference', line):
                   templine = line
+                elif re.search(r'mnc_length', line) and key["key"] == "mnc":
+                  continue
                 elif re.search(r'plmn_list', line):
                   templine = re.sub(r'[0-9]+', '""', line)
                   templine = re.sub(r'\"\"', key["env"]["mcc"], templine, 1)
diff --git a/docker/scripts/gnb_entrypoint.sh b/docker/scripts/gnb_entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..678ec6cb1bd0e5ca00bac201fd0b5dfdafa3fca1
--- /dev/null
+++ b/docker/scripts/gnb_entrypoint.sh
@@ -0,0 +1,64 @@
+#!/bin/bash
+
+set -euo pipefail
+
+PREFIX=/opt/oai-gnb
+ENABLE_X2=${ENABLE_X2:-yes}
+THREAD_PARALLEL_CONFIG=${THREAD_PARALLEL_CONFIG:-PARALLEL_SINGLE_THREAD}
+
+# Based another env var, pick one template to use
+if [[ -v USE_NSA_TDD_MONO ]]; then ln -s $PREFIX/etc/gnb.nsa.tdd.conf $PREFIX/etc/gnb.conf; fi
+if [[ -v USE_SA_TDD_MONO ]]; then ln -s $PREFIX/etc/gnb.sa.tdd.conf $PREFIX/etc/gnb.conf; fi
+
+# Only this template will be manipulated
+CONFIG_FILES=`ls $PREFIX/etc/gnb.conf || true`
+
+for c in ${CONFIG_FILES}; do
+    # grep variable names (format: ${VAR}) from template to be rendered
+    VARS=$(grep -oP '@[a-zA-Z0-9_]+@' ${c} | sort | uniq | xargs)
+
+    # create sed expressions for substituting each occurrence of ${VAR}
+    # with the value of the environment variable "VAR"
+    EXPRESSIONS=""
+    for v in ${VARS}; do
+        NEW_VAR=`echo $v | sed -e "s#@##g"`
+        if [[ "${!NEW_VAR}x" == "x" ]]; then
+            echo "Error: Environment variable '${NEW_VAR}' is not set." \
+                "Config file '$(basename $c)' requires all of $VARS."
+            exit 1
+        fi
+        EXPRESSIONS="${EXPRESSIONS};s|${v}|${!NEW_VAR}|g"
+    done
+    EXPRESSIONS="${EXPRESSIONS#';'}"
+
+    # render template and inline replace config file
+    sed -i "${EXPRESSIONS}" ${c}
+done
+
+# Load the USRP binaries
+if [[ -v USE_B2XX ]]; then
+    /usr/lib/uhd/utils/uhd_images_downloader.py -t b2xx
+elif [[ -v USE_X3XX ]]; then
+    /usr/lib/uhd/utils/uhd_images_downloader.py -t x3xx
+elif [[ -v USE_N3XX ]]; then
+    /usr/lib/uhd/utils/uhd_images_downloader.py -t n3xx
+fi
+
+echo "=================================="
+echo "== Starting gNB soft modem"
+if [[ -v USE_ADDITIONAL_OPTIONS ]]; then
+    echo "Additional option(s): ${USE_ADDITIONAL_OPTIONS}"
+    new_args=()
+    while [[ $# -gt 0 ]]; do
+        new_args+=("$1")
+        shift
+    done
+    for word in ${USE_ADDITIONAL_OPTIONS}; do
+        new_args+=("$word")
+    done
+    echo "${new_args[@]}"
+    exec "${new_args[@]}"
+else
+    echo "$@"
+    exec "$@"
+fi
diff --git a/docker/scripts/gnb_parameters.yaml b/docker/scripts/gnb_parameters.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ac5a6cb971629cbc69d0c6959625c83c18b1c518
--- /dev/null
+++ b/docker/scripts/gnb_parameters.yaml
@@ -0,0 +1,96 @@
+#/*
+# * 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
+# */
+
+---
+- paths:
+    source_dir: "ci-scripts/conf_files/"
+    dest_dir: docker/etc
+
+- configurations:
+  - filePrefix: gnb.band78.tm1.fr1.106PRB.usrpb210.conf
+    outputfilename: "gnb.nsa.tdd.conf"
+    config:
+    - key: Active_gNBs
+      env: "@GNB_NAME@"
+    - key: gNB_name
+      env: "@GNB_NAME@"
+    - key: plmn_list
+      env:
+        mcc: "@MCC@"
+        mnc: "@MNC@"
+        mnc_length: "@MNC_LENGTH@"
+    - key: tracking_area_code
+      env: "@TAC@"
+    - key: enable_x2
+      env: "@ENABLE_X2@"
+    - key: ipv4
+      env: "@ENB_X2_IP_ADDRESS@"
+    - key: GNB_INTERFACE_NAME_FOR_S1_MME
+      env: "@GNB_S1C_IF_NAME@"
+    - key: GNB_IPV4_ADDRESS_FOR_S1_MME
+      env: "@GNB_S1C_IP_ADDRESS@"
+    - key: GNB_INTERFACE_NAME_FOR_S1U
+      env: "@GNB_S1U_IF_NAME@"
+    - key: GNB_IPV4_ADDRESS_FOR_S1U
+      env: "@GNB_S1U_IP_ADDRESS@"
+    - key: GNB_IPV4_ADDRESS_FOR_X2C
+      env: "@GNB_X2_IP_ADDRESS@"
+    - key: rrc_inactivity_threshold
+      env: "@RRC_INACTIVITY_THRESHOLD@"
+    - key: FLEXRAN_ENABLED
+      env: "@FLEXRAN_ENABLED@"
+    - key: FLEXRAN_INTERFACE_NAME
+      env: "@FLEXRAN_INTERFACE_NAME@"
+    - key: FLEXRAN_IPV4_ADDRESS
+      env: "@FLEXRAN_IPV4_ADDRESS@"
+    - key: parallel_config
+      env: "@THREAD_PARALLEL_CONFIG@"
+
+  - filePrefix: gnb.band78.sa.fr1.106PRB.usrpn310.conf
+    outputfilename: "gnb.sa.tdd.conf"
+    config:
+    - key: Active_gNBs
+      env: "@GNB_NAME@"
+    - key: gNB_name
+      env: "@GNB_NAME@"
+    - key: mcc
+      env: "@MCC@"
+    - key: mnc
+      env: "@MNC@"
+    - key: mnc_length
+      env: "@MNC_LENGTH@"
+    - key: tracking_area_code
+      env: "@TAC@"
+    - key: sst
+      env: "@NSSAI_SST@"
+    - key: ipv4
+      env: "@AMF_IP_ADDRESS@"
+    - key: GNB_INTERFACE_NAME_FOR_NG_AMF
+      env: "@GNB_NGA_IF_NAME@"
+    - key: GNB_IPV4_ADDRESS_FOR_NG_AMF
+      env: "@GNB_NGA_IP_ADDRESS@"
+    - key: GNB_INTERFACE_NAME_FOR_NGU
+      env: "@GNB_NGU_IF_NAME@"
+    - key: GNB_IPV4_ADDRESS_FOR_NGU
+      env: "@GNB_NGU_IP_ADDRESS@"
+    - key: parallel_config
+      env: "@THREAD_PARALLEL_CONFIG@"
+
diff --git a/docker/scripts/nr_ue_entrypoint.sh b/docker/scripts/nr_ue_entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..691258b8fa9e30a732a1c6904a4404cd82934913
--- /dev/null
+++ b/docker/scripts/nr_ue_entrypoint.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+
+set -euo pipefail
+
+PREFIX=/opt/oai-nr-ue
+
+# Based another env var, pick one template to use
+#if [[ -v USE_NFAPI ]]; then ln -s $PREFIX/etc/ue.nfapi.conf $PREFIX/etc/ue.conf; fi
+
+# Only this template will be manipulated and the USIM one!
+CONFIG_FILES=`ls $PREFIX/etc/ue.conf $PREFIX/etc/nr-ue-sim.conf || true`
+
+for c in ${CONFIG_FILES}; do
+    # grep variable names (format: ${VAR}) from template to be rendered
+    VARS=$(grep -oP '@[a-zA-Z0-9_]+@' ${c} | sort | uniq | xargs)
+
+    # create sed expressions for substituting each occurrence of ${VAR}
+    # with the value of the environment variable "VAR"
+    EXPRESSIONS=""
+    for v in ${VARS}; do
+        NEW_VAR=`echo $v | sed -e "s#@##g"`
+        if [[ "${!NEW_VAR}x" == "x" ]]; then
+            echo "Error: Environment variable '${NEW_VAR}' is not set." \
+                "Config file '$(basename $c)' requires all of $VARS."
+            exit 1
+        fi
+        EXPRESSIONS="${EXPRESSIONS};s|${v}|${!NEW_VAR}|g"
+    done
+    EXPRESSIONS="${EXPRESSIONS#';'}"
+
+    # render template and inline replace config file
+    sed -i "${EXPRESSIONS}" ${c}
+done
+
+# Load the USRP binaries
+if [[ -v USE_B2XX ]]; then
+    /usr/lib/uhd/utils/uhd_images_downloader.py -t b2xx
+elif [[ -v USE_X3XX ]]; then
+    /usr/lib/uhd/utils/uhd_images_downloader.py -t x3xx
+elif [[ -v USE_N3XX ]]; then
+    /usr/lib/uhd/utils/uhd_images_downloader.py -t n3xx
+fi
+
+# in case we have conf file, append
+new_args=()
+while [[ $# -gt 0 ]]; do
+  new_args+=("$1")
+  shift
+done
+
+echo "=================================="
+echo "== Starting NR UE soft modem"
+if [[ -v USE_ADDITIONAL_OPTIONS ]]; then
+    echo "Additional option(s): ${USE_ADDITIONAL_OPTIONS}"
+    for word in ${USE_ADDITIONAL_OPTIONS}; do
+        new_args+=("$word")
+    done
+    echo "${new_args[@]}"
+    exec "${new_args[@]}"
+else
+    echo "${new_args[@]}"
+    exec "${new_args[@]}"
+fi
diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index 4273878ef531b3407419120e2291f4a257671a5e..05cccdbada6a6d20122baeb718faecb6d9c70979 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -86,6 +86,7 @@
 
 #include "T.h"
 #include "nfapi/oai_integration/vendor_ext.h"
+#include "executables/softmodem-common.h"
 #include <nfapi/oai_integration/nfapi_pnf.h>
 #include <openair1/PHY/NR_TRANSPORT/nr_ulsch.h>
 #include <PHY/NR_ESTIMATION/nr_ul_estimation.h>
@@ -164,15 +165,12 @@ void rx_func(void *param) {
   start_meas(&softmodem_stats_rxtx_sf);
 
   // *******************************************************************
-  // NFAPI not yet supported for NR - this code has to be revised
+
   if (NFAPI_MODE == NFAPI_MODE_PNF) {
     // I am a PNF and I need to let nFAPI know that we have a (sub)frame tick
-    //add_subframe(&frame, &subframe, 4);
-    //oai_subframe_ind(proc->frame_tx, proc->subframe_tx);
-    //LOG_D(PHY, "oai_subframe_ind(frame:%u, subframe:%d) - NOT CALLED ********\n", frame, subframe);
+    //LOG_D(PHY, "oai_nfapi_slot_ind(frame:%u, slot:%d) ********\n", frame_rx, slot_rx);
     start_meas(&nfapi_meas);
-    // oai_subframe_ind(frame_rx, slot_rx);
-    oai_slot_ind(frame_rx, slot_rx);
+    handle_nr_slot_ind(frame_rx, slot_rx);
     stop_meas(&nfapi_meas);
 
     /*if (gNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus||
@@ -486,6 +484,8 @@ void init_eNB_afterRU(void) {
   PHY_VARS_gNB *gNB;
   LOG_I(PHY,"%s() RC.nb_nr_inst:%d\n", __FUNCTION__, RC.nb_nr_inst);
 
+  if(NFAPI_MODE == NFAPI_MODE_PNF)
+    RC.nb_nr_inst = 1;
   for (inst=0; inst<RC.nb_nr_inst; inst++) {
     LOG_I(PHY,"RC.nb_nr_CC[inst:%d]:%p\n", inst, RC.gNB[inst]);
     gNB                                  =  RC.gNB[inst];
@@ -570,6 +570,7 @@ void init_gNB(int single_thread_flag,int wait_for_sync) {
     gNB->UL_INFO.cqi_ind.cqi_raw_pdu_list = gNB->cqi_raw_pdu_list;*/
 
     gNB->prach_energy_counter = 0;
+    gNB->prb_interpolation = get_softmodem_params()->prb_interpolation;
   }
   
 
diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index 40acf9728579706aa234bf8fbce8200726cbbb0f..9bbe1b43bff2644ae66a1b133492dbdf954b5cc6 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -114,8 +114,7 @@ extern int numerology;
 
 extern void wait_gNBs(void);
 
-int attach_rru(RU_t *ru)
-{
+int attach_rru(RU_t *ru) {
   ssize_t      msg_len,len;
   RRU_CONFIG_msg_t rru_config_msg;
   int received_capabilities=0;
@@ -183,8 +182,7 @@ int attach_rru(RU_t *ru)
   return 0;
 }
 
-int connect_rau(RU_t *ru)
-{
+int connect_rau(RU_t *ru) {
   RRU_CONFIG_msg_t   rru_config_msg;
   ssize_t            msg_len;
   int                tick_received          = 0;
@@ -281,22 +279,20 @@ int connect_rau(RU_t *ru)
 /* Southbound Fronthaul functions, RCC/RAU                   */
 
 // southbound IF5 fronthaul for 16-bit OAI format
-void fh_if5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp)
-{
+void fh_if5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp) {
   if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff );
 
   send_IF5(ru, timestamp, slot, &ru->seqno, IF5_RRH_GW_DL);
 }
 
 // southbound IF4p5 fronthaul
-void fh_if4p5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp)
-{
+void fh_if4p5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp) {
   nfapi_nr_config_request_scf_t *cfg = &ru->config;
+
   if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff );
 
   LOG_D(PHY,"Sending IF4p5 for frame %d subframe %d\n",ru->proc.frame_tx,ru->proc.tti_tx);
 
-
   if ((nr_slot_select(cfg,ru->proc.frame_tx,ru->proc.tti_tx)&NR_DOWNLINK_SLOT) > 0)
     send_IF4p5(ru,frame, slot, IF4p5_PDLFFT);
 }
@@ -307,8 +303,7 @@ void fh_if4p5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp)
 // Synchronous if5 from south
 void fh_if5_south_in(RU_t *ru,
                      int *frame,
-                     int *tti)
-{
+                     int *tti) {
   NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
   RU_proc_t *proc = &ru->proc;
   recv_IF5(ru, &proc->timestamp_rx, *tti, IF5_RRH_GW_UL);
@@ -338,8 +333,7 @@ void fh_if5_south_in(RU_t *ru,
 // Synchronous if4p5 from south
 void fh_if4p5_south_in(RU_t *ru,
                        int *frame,
-                       int *slot)
-{
+                       int *slot) {
   NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
   RU_proc_t *proc = &ru->proc;
   int f,sl;
@@ -636,7 +630,6 @@ void rx_rf(RU_t *ru,int *frame,int *slot) {
                                      ru->nb_rx);
   }
 
-
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 );
   proc->timestamp_rx = ts-ru->ts_offset;
 
@@ -649,6 +642,7 @@ void rx_rf(RU_t *ru,int *frame,int *slot) {
     proc->timestamp_rx = 0;
   } else {
     samples_per_slot_prev = fp->get_samples_per_slot((*slot-1)%fp->slots_per_frame,fp);
+
     if (proc->timestamp_rx - old_ts != samples_per_slot_prev) {
       LOG_D(PHY,"rx_rf: rfdevice timing drift of %"PRId64" samples (ts_off %"PRId64")\n",proc->timestamp_rx - old_ts - samples_per_slot_prev,ru->ts_offset);
       ru->ts_offset += (proc->timestamp_rx - old_ts - samples_per_slot_prev);
@@ -678,7 +672,8 @@ void rx_rf(RU_t *ru,int *frame,int *slot) {
     }
 
     if (proc->frame_rx != *frame) {
-      LOG_E(PHY,"Received Timestamp (%llu) doesn't correspond to the time we think it is (proc->frame_rx %d frame %d, proc->tti_rx %d, slot %d)\n",(long long unsigned int)proc->timestamp_rx,proc->frame_rx,*frame,proc->tti_rx,*slot);
+      LOG_E(PHY,"Received Timestamp (%llu) doesn't correspond to the time we think it is (proc->frame_rx %d frame %d, proc->tti_rx %d, slot %d)\n",(long long unsigned int)proc->timestamp_rx,proc->frame_rx,
+            *frame,proc->tti_rx,*slot);
       exit_fun("Exiting");
     }
   } else {
@@ -706,7 +701,6 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
   int i,txsymb;
   T(T_ENB_PHY_OUTPUT_SIGNAL, T_INT(0), T_INT(0), T_INT(frame), T_INT(slot),
     T_INT(0), T_BUFFER(&ru->common.txdata[0][fp->get_samples_slot_timestamp(slot,fp,0)], fp->samples_per_subframe * 4));
-
   int slot_type         = nr_slot_select(cfg,frame,slot%fp->slots_per_frame);
   int prevslot_type     = nr_slot_select(cfg,frame,(slot+(fp->slots_per_frame-1))%fp->slots_per_frame);
   int nextslot_type     = nr_slot_select(cfg,frame,(slot+1)%fp->slots_per_frame);
@@ -716,20 +710,23 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
 
   //nr_subframe_t SF_type     = nr_slot_select(cfg,slot%fp->slots_per_frame);
   if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT || IS_SOFTMODEM_RFSIM) {
-
-    if (cfg->cell_config.frame_duplex_type.value == TDD){
+    if (cfg->cell_config.frame_duplex_type.value == TDD) {
       if(slot_type == NR_MIXED_SLOT) {
         txsymb = 0;
+
         for(int symbol_count = 0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
           if (cfg->tdd_table.max_tdd_periodicity_list[slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value == 0)
             txsymb++;
         }
+
         AssertFatal(txsymb>0,"illegal txsymb %d\n",txsymb);
+
         if(slot%(fp->slots_per_subframe/2))
           siglen = txsymb * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
         else
           siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
-                 //+ ru->end_of_burst_delay;
+
+        //+ ru->end_of_burst_delay;
         flags = 3; // end of burst
       }
 
@@ -745,11 +742,13 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
       // bit 11 enables the gpio programming
       // currently we switch beams every 10 slots (should = 1 TDD period in FR2) and we take the beam index of the first symbol of the first slot of this period
       int beam=0;
+
       if (slot%10==0) {
         if ( ru->common.beam_id && (ru->common.beam_id[0][slot*fp->symbols_per_slot] < 8)) {
           beam = ru->common.beam_id[0][slot*fp->symbols_per_slot] | 8;
         }
       }
+
       /*
       if (slot==0 || slot==40) beam=0|8;
       if (slot==10 || slot==50) beam=1|8;
@@ -757,30 +756,29 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
       if (slot==30 || slot==70) beam=3|8;
       */
       flags |= beam<<8;
-
       LOG_D(HW,"slot %d, beam %d\n",slot,ru->common.beam_id[0][slot*fp->symbols_per_slot]);
-
     }
-    
-    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_WRITE_FLAGS, flags ); 
+
+    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_WRITE_FLAGS, flags );
     VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_RU, frame );
     VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TTI_NUMBER_TX0_RU, slot );
+
     for (i=0; i<ru->nb_tx; i++)
       txp[i] = (void *)&ru->common.txdata[i][fp->get_samples_slot_timestamp(slot,fp,0)-sf_extension];
-    
-      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (timestamp-ru->openair0_cfg.tx_sample_advance)&0xffffffff );
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
-      // prepare tx buffer pointers
-      txs = ru->rfdevice.trx_write_func(&ru->rfdevice,
-					timestamp+ru->ts_offset-ru->openair0_cfg.tx_sample_advance-sf_extension,
-					txp,
-					siglen+sf_extension,
-					ru->nb_tx,
-					flags);
-      LOG_D(PHY,"[TXPATH] RU %d tx_rf, writing to TS %llu, frame %d, unwrapped_frame %d, slot %di, returned %d\n",ru->idx,
-	    (long long unsigned int)timestamp,frame,proc->frame_tx_unwrap,slot, txs);
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
-      //AssertFatal(txs == 0,"trx write function error %d\n", txs);
+
+    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (timestamp-ru->openair0_cfg.tx_sample_advance)&0xffffffff );
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
+    // prepare tx buffer pointers
+    txs = ru->rfdevice.trx_write_func(&ru->rfdevice,
+                                      timestamp+ru->ts_offset-ru->openair0_cfg.tx_sample_advance-sf_extension,
+                                      txp,
+                                      siglen+sf_extension,
+                                      ru->nb_tx,
+                                      flags);
+    LOG_D(PHY,"[TXPATH] RU %d tx_rf, writing to TS %llu, frame %d, unwrapped_frame %d, slot %di, returned %d\n",ru->idx,
+          (long long unsigned int)timestamp,frame,proc->frame_tx_unwrap,slot, txs);
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
+    //AssertFatal(txs == 0,"trx write function error %d\n", txs);
   }
 }
 
@@ -795,78 +793,83 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
 
   if (mu == NR_MU_0) {
     switch(N_RB) {
-    case 270:
-      if (fp->threequarter_fs) {
-        cfg->sample_rate=92.16e6;
-        cfg->samples_per_frame = 921600;
-        cfg->tx_bw = 50e6;
-        cfg->rx_bw = 50e6;
-      } else {
-        cfg->sample_rate=61.44e6;
-        cfg->samples_per_frame = 614400;
-        cfg->tx_bw = 50e6;
-        cfg->rx_bw = 50e6;
-      }
-    case 216:
-      if (fp->threequarter_fs) {
-        cfg->sample_rate=46.08e6;
-        cfg->samples_per_frame = 460800;
-        cfg->tx_bw = 40e6;
-        cfg->rx_bw = 40e6;
-      }
-      else {
-        cfg->sample_rate=61.44e6;
-        cfg->samples_per_frame = 614400;
-        cfg->tx_bw = 40e6;
-        cfg->rx_bw = 40e6;
-      }
-      break;
-    case 106:
-      if (fp->threequarter_fs) {
-        cfg->sample_rate=23.04e6;
-        cfg->samples_per_frame = 230400;
-        cfg->tx_bw = 20e6;
-        cfg->rx_bw = 20e6;
-      }
-      else {
-        cfg->sample_rate=30.72e6;
-        cfg->samples_per_frame = 307200;
-        cfg->tx_bw = 20e6;
-        cfg->rx_bw = 20e6;
-      }
-      break;
-    case 52:
-      if (fp->threequarter_fs) {
-        cfg->sample_rate=11.52e6;
-        cfg->samples_per_frame = 115200;
-        cfg->tx_bw = 10e6;
-        cfg->rx_bw = 10e6;
-      }
-      else {
-        cfg->sample_rate=15.36e6;
-        cfg->samples_per_frame = 153600;
-        cfg->tx_bw = 10e6;
-        cfg->rx_bw = 10e6;
-      }
-    case 25:
-      if (fp->threequarter_fs) {
-        cfg->sample_rate=5.76e6;
-        cfg->samples_per_frame = 57600;
-        cfg->tx_bw = 5e6;
-        cfg->rx_bw = 5e6;
-      }
-      else {
-        cfg->sample_rate=7.68e6;
-        cfg->samples_per_frame = 76800;
-        cfg->tx_bw = 5e6;
-        cfg->rx_bw = 5e6;
-      }
-      break;
-    default:
-      AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
+      case 270:
+        if (fp->threequarter_fs) {
+          cfg->sample_rate=92.16e6;
+          cfg->samples_per_frame = 921600;
+          cfg->tx_bw = 50e6;
+          cfg->rx_bw = 50e6;
+        } else {
+          cfg->sample_rate=61.44e6;
+          cfg->samples_per_frame = 614400;
+          cfg->tx_bw = 50e6;
+          cfg->rx_bw = 50e6;
+        }
+
+      case 216:
+        if (fp->threequarter_fs) {
+          cfg->sample_rate=46.08e6;
+          cfg->samples_per_frame = 460800;
+          cfg->tx_bw = 40e6;
+          cfg->rx_bw = 40e6;
+        } else {
+          cfg->sample_rate=61.44e6;
+          cfg->samples_per_frame = 614400;
+          cfg->tx_bw = 40e6;
+          cfg->rx_bw = 40e6;
+        }
+
+        break;
+
+      case 106:
+        if (fp->threequarter_fs) {
+          cfg->sample_rate=23.04e6;
+          cfg->samples_per_frame = 230400;
+          cfg->tx_bw = 20e6;
+          cfg->rx_bw = 20e6;
+        } else {
+          cfg->sample_rate=30.72e6;
+          cfg->samples_per_frame = 307200;
+          cfg->tx_bw = 20e6;
+          cfg->rx_bw = 20e6;
+        }
+
+        break;
+
+      case 52:
+        if (fp->threequarter_fs) {
+          cfg->sample_rate=11.52e6;
+          cfg->samples_per_frame = 115200;
+          cfg->tx_bw = 10e6;
+          cfg->rx_bw = 10e6;
+        } else {
+          cfg->sample_rate=15.36e6;
+          cfg->samples_per_frame = 153600;
+          cfg->tx_bw = 10e6;
+          cfg->rx_bw = 10e6;
+        }
+
+      case 25:
+        if (fp->threequarter_fs) {
+          cfg->sample_rate=5.76e6;
+          cfg->samples_per_frame = 57600;
+          cfg->tx_bw = 5e6;
+          cfg->rx_bw = 5e6;
+        } else {
+          cfg->sample_rate=7.68e6;
+          cfg->samples_per_frame = 76800;
+          cfg->tx_bw = 5e6;
+          cfg->rx_bw = 5e6;
+        }
+
+        break;
+
+      default:
+        AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
     }
   } else if (mu == NR_MU_1) {
     switch(N_RB) {
+
     case 273:
       if (fp->threequarter_fs) {
         cfg->sample_rate=184.32e6;
@@ -952,34 +955,38 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
     }
   } else if (mu == NR_MU_3) {
     switch(N_RB) {
-    case 66:
-      if (fp->threequarter_fs) {
-        cfg->sample_rate=184.32e6;
-        cfg->samples_per_frame = 1843200;
-        cfg->tx_bw = 100e6;
-        cfg->rx_bw = 100e6;
-      } else {
-        cfg->sample_rate = 122.88e6;
-        cfg->samples_per_frame = 1228800;
-        cfg->tx_bw = 100e6;
-        cfg->rx_bw = 100e6;
-      }
-      break;
-    case 32:
-      if (fp->threequarter_fs) {
-        cfg->sample_rate=92.16e6;
-        cfg->samples_per_frame = 921600;
-        cfg->tx_bw = 50e6;
-        cfg->rx_bw = 50e6;
-      } else {
-        cfg->sample_rate=61.44e6;
-        cfg->samples_per_frame = 614400;
-        cfg->tx_bw = 50e6;
-        cfg->rx_bw = 50e6;
-      }
-      break;
-    default:
-      AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
+      case 66:
+        if (fp->threequarter_fs) {
+          cfg->sample_rate=184.32e6;
+          cfg->samples_per_frame = 1843200;
+          cfg->tx_bw = 100e6;
+          cfg->rx_bw = 100e6;
+        } else {
+          cfg->sample_rate = 122.88e6;
+          cfg->samples_per_frame = 1228800;
+          cfg->tx_bw = 100e6;
+          cfg->rx_bw = 100e6;
+        }
+
+        break;
+
+      case 32:
+        if (fp->threequarter_fs) {
+          cfg->sample_rate=92.16e6;
+          cfg->samples_per_frame = 921600;
+          cfg->tx_bw = 50e6;
+          cfg->rx_bw = 50e6;
+        } else {
+          cfg->sample_rate=61.44e6;
+          cfg->samples_per_frame = 614400;
+          cfg->tx_bw = 50e6;
+          cfg->rx_bw = 50e6;
+        }
+
+        break;
+
+      default:
+        AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
     }
   } else {
     AssertFatal(0 == 1,"Numerology %d not supported for the moment\n",mu);
@@ -999,7 +1006,7 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
     if (ru->if_frequency == 0) {
       cfg->tx_freq[i] = (double)fp->dl_CarrierFreq;
       cfg->rx_freq[i] = (double)fp->ul_CarrierFreq;
-    } else if (ru->if_freq_offset){
+    } else if (ru->if_freq_offset) {
       cfg->tx_freq[i] = (double)(ru->if_frequency);
       cfg->rx_freq[i] = (double)(ru->if_frequency + ru->if_freq_offset);
       LOG_I(PHY, "Setting IF TX frequency to %lu Hz with IF RX frequency offset %d Hz\n", ru->if_frequency, ru->if_freq_offset);
@@ -1007,14 +1014,15 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
       cfg->tx_freq[i] = (double)ru->if_frequency;
       cfg->rx_freq[i] = (double)(ru->if_frequency+fp->ul_CarrierFreq-fp->dl_CarrierFreq);
     }
+
     cfg->tx_gain[i] = ru->att_tx;
     cfg->rx_gain[i] = ru->max_rxgain-ru->att_rx;
     cfg->configFilename = rf_config_file;
     LOG_I(PHY, "Channel %d: setting tx_gain offset %f, rx_gain offset %f, tx_freq %lu Hz, rx_freq %lu Hz\n",
-           i, cfg->tx_gain[i],
-           cfg->rx_gain[i],
-           (unsigned long)cfg->tx_freq[i],
-           (unsigned long)cfg->rx_freq[i]);
+          i, cfg->tx_gain[i],
+          cfg->rx_gain[i],
+          (unsigned long)cfg->tx_freq[i],
+          (unsigned long)cfg->rx_freq[i]);
   }
 }
 
@@ -1042,40 +1050,42 @@ int setup_RU_buffers(RU_t *ru) {
 
   if (config->cell_config.frame_duplex_type.value == TDD) {
     int N_TA_offset =  config->carrier_config.uplink_frequency.value < 6000000 ? 400 : 431; // reference samples  for 25600Tc @ 30.72 Ms/s for FR1, same @ 61.44 Ms/s for FR2
-
     double factor=1;
+
     switch (mu) {
       case 0: //15 kHz scs
         AssertFatal(N_TA_offset == 400, "scs_common 15kHz only for FR1\n");
         factor = fp->samples_per_subframe / 30720.0;
         break;
+
       case 1: //30 kHz sc
         AssertFatal(N_TA_offset == 400, "scs_common 30kHz only for FR1\n");
         factor = fp->samples_per_subframe / 30720.0;
         break;
+
       case 2: //60 kHz scs
         AssertFatal(1==0, "scs_common should not be 60 kHz\n");
         break;
+
       case 3: //120 kHz scs
         AssertFatal(N_TA_offset == 431, "scs_common 120kHz only for FR2\n");
         factor = fp->samples_per_subframe / 61440.0;
         break;
+
       case 4: //240 kHz scs
         AssertFatal(N_TA_offset == 431, "scs_common 240kHz only for FR2\n");
         factor = fp->samples_per_subframe / 61440.0;
         break;
+
       default:
         AssertFatal(1==0, "Invalid scs_common!\n");
     }
 
     ru->N_TA_offset = (int)(N_TA_offset * factor);
-
     LOG_I(PHY,"RU %d Setting N_TA_offset to %d samples (factor %f, UL Freq %d, N_RB %d, mu %d)\n",ru->idx,ru->N_TA_offset,factor,
-	  config->carrier_config.uplink_frequency.value, N_RB, mu);
-  }
-  else ru->N_TA_offset = 0;
+          config->carrier_config.uplink_frequency.value, N_RB, mu);
+  } else ru->N_TA_offset = 0;
 
-  
   if (ru->openair0_cfg.mmapped_dma == 1) {
     // replace RX signal buffers with mmaped HW versions
     for (i=0; i<ru->nb_rx; i++) {
@@ -1120,7 +1130,6 @@ void *ru_stats_thread(void *param) {
     sleep(1);
 
     if (opp_enabled == 1) {
-
       if (ru->feprx) print_meas(&ru->ofdm_demod_stats,"feprx",NULL,NULL);
 
       if (ru->feptx_ofdm) {
@@ -1133,6 +1142,7 @@ void *ru_stats_thread(void *param) {
       if (ru->fh_north_asynch_in) print_meas(&ru->rx_fhaul,"rx_fhaul",NULL,NULL);
 
       print_meas(&ru->tx_fhaul,"tx_fhaul",NULL,NULL);
+
       if (ru->fh_north_out) {
         print_meas(&ru->compression,"compression",NULL,NULL);
         print_meas(&ru->transport,"transport",NULL,NULL);
@@ -1144,7 +1154,6 @@ void *ru_stats_thread(void *param) {
 }
 
 void ru_tx_func(void *param) {
-
   processingData_RU_t *info = (processingData_RU_t *) param;
   RU_t *ru = info->ru;
   NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
@@ -1167,14 +1176,11 @@ void ru_tx_func(void *param) {
   } else {
     if(frame_tx == print_frame) {
       for (int i=0; i<ru->nb_tx; i++) {
-
         if(slot_tx == 0) {
           sprintf(filename,"gNBdataF_frame%d_sl%d.m", print_frame, slot_tx);
           LOG_M(filename,"txdataF_frame",&ru->gNB_list[0]->common_vars.txdataF[i][0],fp->samples_per_frame_wCP, 1, 1);
-
           sprintf(filename,"tx%ddataF_frame%d_sl%d.m", i, print_frame, slot_tx);
           LOG_M(filename,"txdataF_frame",&ru->common.txdataF[i][0],fp->samples_per_frame_wCP, 1, 1);
-
           sprintf(filename,"tx%ddataF_BF_frame%d_sl%d.m", i, print_frame, slot_tx);
           LOG_M(filename,"txdataF_BF_frame",&ru->common.txdataF_BF[i][0],fp->samples_per_subframe_wCP, 1, 1);
         }
@@ -1211,18 +1217,13 @@ void *ru_thread( void *param ) {
   int                frame    = 1023;
   char               threadname[40];
   int                aa;
-
   nfapi_nr_config_request_scf_t *cfg = &ru->config;
-  
   // set default return value
   ru_thread_status = 0;
   // set default return value
   sprintf(threadname,"ru_thread %u",ru->idx);
-
-
   LOG_I(PHY,"Starting RU %d (%s,%s),\n",ru->idx,NB_functions[ru->function],NB_timing[ru->if_timing]);
-
-  memcpy((void*)&ru->config,(void*)&RC.gNB[0]->gNB_config,sizeof(ru->config));
+  memcpy((void *)&ru->config,(void *)&RC.gNB[0]->gNB_config,sizeof(ru->config));
 
   if(emulate_rf) {
     fill_rf_config(ru,ru->rf_config_file);
@@ -1281,12 +1282,11 @@ void *ru_thread( void *param ) {
     } else LOG_I(PHY,"RU %d no rf device\n",ru->idx);
 
     // start trx write thread
-    if(usrp_tx_thread == 1){
-      if (ru->start_write_thread){
-        if(ru->start_write_thread(ru) != 0){
+    if(usrp_tx_thread == 1) {
+      if (ru->start_write_thread) {
+        if(ru->start_write_thread(ru) != 0) {
           LOG_E(HW,"Could not start tx write thread\n");
-        }
-        else{
+        } else {
           LOG_I(PHY,"tx write thread ready\n");
         }
       }
@@ -1307,76 +1307,75 @@ void *ru_thread( void *param ) {
 
     // synchronization on input FH interface, acquire signals/data and block
     LOG_D(PHY,"[RU_thread] read data: frame_rx = %d, tti_rx = %d\n", frame, slot);
+
     if (ru->fh_south_in) ru->fh_south_in(ru,&frame,&slot);
     else AssertFatal(1==0, "No fronthaul interface at south port");
 
     proc->timestamp_tx = proc->timestamp_rx + (sf_ahead*fp->samples_per_subframe);
     proc->frame_tx     = (proc->tti_rx > (fp->slots_per_frame-1-(fp->slots_per_subframe*sf_ahead))) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
     proc->tti_tx      = (proc->tti_rx + (fp->slots_per_subframe*sf_ahead))%fp->slots_per_frame;
-
     LOG_D(PHY,"AFTER fh_south_in - SFN/SL:%d%d RU->proc[RX:%d.%d TX:%d.%d] RC.gNB[0]:[RX:%d%d TX(SFN):%d]\n",
           frame,slot,
           proc->frame_rx,proc->tti_rx,
           proc->frame_tx,proc->tti_tx,
           RC.gNB[0]->proc.frame_rx,RC.gNB[0]->proc.slot_rx,
-	  RC.gNB[0]->proc.frame_tx);
+          RC.gNB[0]->proc.frame_tx);
 
     if (ru->idx!=0) proc->frame_tx = (proc->frame_tx+proc->frame_offset)&1023;
 
     // do RX front-end processing (frequency-shift, dft) if needed
-
     int slot_type = nr_slot_select(cfg,proc->frame_rx,proc->tti_rx);
-    if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) {
 
+    if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) {
       if (ru->feprx) {
-      ru->feprx(ru,proc->tti_rx);
-      //LOG_M("rxdata.m","rxs",ru->common.rxdata[0],1228800,1,1);
-
-      LOG_D(PHY,"RU proc: frame_rx = %d, tti_rx = %d\n", proc->frame_rx, proc->tti_rx);
-      LOG_D(PHY,"Copying rxdataF from RU to gNB\n");
-      
-      for (aa=0;aa<ru->nb_rx;aa++)
-	memcpy((void*)RC.gNB[0]->common_vars.rxdataF[aa],
-	       (void*)ru->common.rxdataF[aa], fp->symbols_per_slot*fp->ofdm_symbol_size*sizeof(int32_t));
-      if (IS_SOFTMODEM_DOSCOPE && RC.gNB[0]->scopeData) 
-         ((scopeData_t*)RC.gNB[0]->scopeData)->slotFunc(ru->common.rxdataF[0],proc->tti_rx, RC.gNB[0]->scopeData);
-      // Do PRACH RU processing
-
-      int prach_id=find_nr_prach_ru(ru,proc->frame_rx,proc->tti_rx,SEARCH_EXIST);
-      uint8_t prachStartSymbol,N_dur;
-      if (prach_id>=0) {
-
-	T(T_GNB_PHY_PRACH_INPUT_SIGNAL, T_INT(proc->frame_rx), T_INT(proc->tti_rx), T_INT(0),
-	  T_BUFFER(&ru->common.rxdata[0][fp->get_samples_slot_timestamp(proc->tti_rx-1,fp,0)]/*-ru->N_TA_offset*/, fp->get_samples_per_slot(proc->tti_rx,fp)*4*2));
-
-	N_dur = get_nr_prach_duration(ru->prach_list[prach_id].fmt);
-	/*
-	get_nr_prach_info_from_index(ru->config.prach_config.prach_ConfigurationIndex.value,
-				     proc->frame_rx,proc->tti_rx,
-				     ru->config.carrier_config.dl_frequency.value,
-				     fp->numerology_index,
-				     fp->frame_type,
-				     &format,
-				     &start_symbol,
-				     &N_t_slot,
-				     &N_dur,
-				     &RA_sfn_index,
-				     &N_RA_slot,
-				     &config_period);
-	*/			     
-	for (int prach_oc = 0; prach_oc<ru->prach_list[prach_id].num_prach_ocas; prach_oc++) {
-	  prachStartSymbol = ru->prach_list[prach_id].prachStartSymbol+prach_oc*N_dur;
-	  //comment FK: the standard 38.211 section 5.3.2 has one extra term +14*N_RA_slot. This is because there prachStartSymbol is given wrt to start of the 15kHz slot or 60kHz slot. Here we work slot based, so this function is anyway only called in slots where there is PRACH. Its up to the MAC to schedule another PRACH PDU in the case there are there N_RA_slot \in {0,1}. 
-
-	  rx_nr_prach_ru(ru,
-			 ru->prach_list[prach_id].fmt, //could also use format
-			 ru->prach_list[prach_id].numRA,
-			 prachStartSymbol,
-			 prach_oc,
-			 proc->frame_rx,proc->tti_rx);
-	}
-	free_nr_ru_prach_entry(ru,prach_id);
-      }
+        ru->feprx(ru,proc->tti_rx);
+        //LOG_M("rxdata.m","rxs",ru->common.rxdata[0],1228800,1,1);
+        LOG_D(PHY,"RU proc: frame_rx = %d, tti_rx = %d\n", proc->frame_rx, proc->tti_rx);
+        LOG_D(PHY,"Copying rxdataF from RU to gNB\n");
+
+        for (aa=0; aa<ru->nb_rx; aa++)
+          memcpy((void *)RC.gNB[0]->common_vars.rxdataF[aa],
+                 (void *)ru->common.rxdataF[aa], fp->symbols_per_slot*fp->ofdm_symbol_size*sizeof(int32_t));
+
+        if (IS_SOFTMODEM_DOSCOPE && RC.gNB[0]->scopeData)
+          ((scopeData_t *)RC.gNB[0]->scopeData)->slotFunc(ru->common.rxdataF[0],proc->tti_rx, RC.gNB[0]->scopeData);
+
+        // Do PRACH RU processing
+        int prach_id=find_nr_prach_ru(ru,proc->frame_rx,proc->tti_rx,SEARCH_EXIST);
+        uint8_t prachStartSymbol,N_dur;
+
+        if (prach_id>=0) {
+          T(T_GNB_PHY_PRACH_INPUT_SIGNAL, T_INT(proc->frame_rx), T_INT(proc->tti_rx), T_INT(0),
+            T_BUFFER(&ru->common.rxdata[0][fp->get_samples_slot_timestamp(proc->tti_rx-1,fp,0)]/*-ru->N_TA_offset*/, fp->get_samples_per_slot(proc->tti_rx,fp)*4*2));
+          N_dur = get_nr_prach_duration(ru->prach_list[prach_id].fmt);
+
+          /*
+          get_nr_prach_info_from_index(ru->config.prach_config.prach_ConfigurationIndex.value,
+                     proc->frame_rx,proc->tti_rx,
+                     ru->config.carrier_config.dl_frequency.value,
+                     fp->numerology_index,
+                     fp->frame_type,
+                     &format,
+                     &start_symbol,
+                     &N_t_slot,
+                     &N_dur,
+                     &RA_sfn_index,
+                     &N_RA_slot,
+                     &config_period);
+          */
+          for (int prach_oc = 0; prach_oc<ru->prach_list[prach_id].num_prach_ocas; prach_oc++) {
+            prachStartSymbol = ru->prach_list[prach_id].prachStartSymbol+prach_oc*N_dur;
+            //comment FK: the standard 38.211 section 5.3.2 has one extra term +14*N_RA_slot. This is because there prachStartSymbol is given wrt to start of the 15kHz slot or 60kHz slot. Here we work slot based, so this function is anyway only called in slots where there is PRACH. Its up to the MAC to schedule another PRACH PDU in the case there are there N_RA_slot \in {0,1}.
+            rx_nr_prach_ru(ru,
+                           ru->prach_list[prach_id].fmt, //could also use format
+                           ru->prach_list[prach_id].numRA,
+                           prachStartSymbol,
+                           prach_oc,
+                           proc->frame_rx,proc->tti_rx);
+          }
+
+          free_nr_ru_prach_entry(ru,prach_id);
+        }
       }
     }
 
@@ -1391,7 +1390,6 @@ void *ru_thread( void *param ) {
     syncMsg->timestamp_tx = proc->timestamp_tx;
     res->key = proc->tti_rx;
     pushTpool(gNB->threadPool, res);
-
   }
 
   printf( "Exiting ru_thread \n");
@@ -1501,8 +1499,7 @@ void kill_NR_RU_proc(int inst) {
   }
 }
 
-int check_capabilities(RU_t *ru,RRU_capabilities_t *cap)
-{
+int check_capabilities(RU_t *ru,RRU_capabilities_t *cap) {
   FH_fmt_options_t fmt = cap->FH_fmt;
   int i;
   int found_band=0;
@@ -1558,8 +1555,7 @@ char rru_formats[3][20] = {"OAI_IF5","MBP_IF5","OAI_IF4p5"};
 char ru_if_formats[4][20] = {"LOCAL_RF","REMOTE_OAI_IF5","REMOTE_MBP_IF5","REMOTE_OAI_IF4p5"};
 
 void configure_ru(int idx,
-                  void *arg)
-{
+                  void *arg) {
   RU_t               *ru           = RC.ru[idx];
   RRU_config_t       *config       = (RRU_config_t *)arg;
   RRU_capabilities_t *capabilities = (RRU_capabilities_t *)arg;
@@ -1732,26 +1728,25 @@ void set_function_spec_param(RU_t *ru) {
         ru->fh_north_out         = NULL;                    // no outgoing fronthaul to north
         ru->nr_start_if          = NULL;                    // no if interface
         ru->rfdevice.host_type   = RAU_HOST;
-
-	ru->fh_south_in            = rx_rf;                 // local synchronous RF RX
-	ru->fh_south_out           = tx_rf;                 // local synchronous RF TX
-	ru->start_rf               = start_rf;              // need to start the local RF interface
-	ru->stop_rf                = stop_rf;
-	ru->start_write_thread     = start_write_thread;                  // starting RF TX in different thread
-	printf("configuring ru_id %u (start_rf %p)\n", ru->idx, start_rf);
+        ru->fh_south_in            = rx_rf;                 // local synchronous RF RX
+        ru->fh_south_out           = tx_rf;                 // local synchronous RF TX
+        ru->start_rf               = start_rf;              // need to start the local RF interface
+        ru->stop_rf                = stop_rf;
+        ru->start_write_thread     = start_write_thread;                  // starting RF TX in different thread
+        printf("configuring ru_id %u (start_rf %p)\n", ru->idx, start_rf);
       }
 
       /*
-	printf("configuring ru_id %u (start_rf %p)\n", ru->idx, start_rf);
-	fill_rf_config(ru,rf_config_file);
-	init_frame_parms(&ru->frame_parms,1);
-	nr_phy_init_RU(ru);
-
-	ret = openair0_device_load(&ru->rfdevice,&ru->openair0_cfg);
-	if (setup_RU_buffers(ru)!=0) {
-	   printf("Exiting, cannot initialize RU Buffers\n");
-	   exit(-1);
-	}
+      printf("configuring ru_id %u (start_rf %p)\n", ru->idx, start_rf);
+      fill_rf_config(ru,rf_config_file);
+      init_frame_parms(&ru->frame_parms,1);
+      nr_phy_init_RU(ru);
+
+      ret = openair0_device_load(&ru->rfdevice,&ru->openair0_cfg);
+      if (setup_RU_buffers(ru)!=0) {
+      printf("Exiting, cannot initialize RU Buffers\n");
+      exit(-1);
+      }
       */
       break;
 
@@ -1807,9 +1802,12 @@ void set_function_spec_param(RU_t *ru) {
 
       if (ru->ifdevice.get_internal_parameter != NULL) {
         void *t = ru->ifdevice.get_internal_parameter("fh_if4p5_south_in");
+
         if (t != NULL)
           ru->fh_south_in = t;
+
         t = ru->ifdevice.get_internal_parameter("fh_if4p5_south_out");
+
         if (t != NULL)
           ru->fh_south_out = t;
       }
@@ -1823,8 +1821,7 @@ void set_function_spec_param(RU_t *ru) {
   } // switch on interface type
 }
 
-void init_NR_RU(char *rf_config_file)
-{
+void init_NR_RU(char *rf_config_file) {
   int ru_id;
   RU_t *ru;
   PHY_VARS_gNB *gNB_RC;
@@ -1839,7 +1836,6 @@ void init_NR_RU(char *rf_config_file)
   printf("configuring RU from file\n");
   NRRCconfig_RU();
   LOG_I(PHY,"number of L1 instances %d, number of RU %d, number of CPU cores %d\n",RC.nb_nr_L1_inst,RC.nb_RU,get_nprocs());
-
   LOG_D(PHY,"Process RUs RC.nb_RU:%d\n",RC.nb_RU);
 
   for (ru_id=0; ru_id<RC.nb_RU; ru_id++) {
@@ -1901,8 +1897,7 @@ void init_NR_RU(char *rf_config_file)
 }
 
 
-void stop_RU(int nb_ru)
-{
+void stop_RU(int nb_ru) {
   for (int inst = 0; inst < nb_ru; inst++) {
     LOG_I(PHY, "Stopping RU %d processing threads\n", inst);
     kill_NR_RU_proc(inst);
@@ -1912,8 +1907,7 @@ void stop_RU(int nb_ru)
 
 /* --------------------------------------------------------*/
 /* from here function to use configuration module          */
-static void NRRCconfig_RU(void)
-{
+static void NRRCconfig_RU(void) {
   int i = 0, j = 0;
   paramdef_t RUParams[] = RUPARAMS_DESC;
   paramlist_def_t RUParamList = {CONFIG_STRING_RU_LIST,NULL,0};
@@ -1957,8 +1951,7 @@ static void NRRCconfig_RU(void)
         } else {
           LOG_E(PHY, "Erroneous RU clock source in the provided configuration file: '%s'\n", *(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr));
         }
-      }
-      else {
+      } else {
         LOG_I(PHY,"Setting clock source to internal\n");
         RC.ru[j]->openair0_cfg.clock_source = internal;
       }
@@ -1976,10 +1969,9 @@ static void NRRCconfig_RU(void)
         } else {
           LOG_E(PHY, "Erroneous RU time source in the provided configuration file: '%s'\n", *(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr));
         }
-      }
-      else {
+      } else {
         LOG_I(PHY,"Setting time source to internal\n");
-	      RC.ru[j]->openair0_cfg.time_source = internal;
+        RC.ru[j]->openair0_cfg.time_source = internal;
       }
 
       if (strcmp(*(RUParamList.paramarray[j][RU_LOCAL_RF_IDX].strptr), "yes") == 0) {
@@ -2064,8 +2056,10 @@ static void NRRCconfig_RU(void)
 
       if (config_isparamset(RUParamList.paramarray[j], RU_BF_WEIGHTS_LIST_IDX)) {
         RC.ru[j]->nb_bfw = RUParamList.paramarray[j][RU_BF_WEIGHTS_LIST_IDX].numelt;
+
         for (i=0; i<RC.ru[j]->num_gNB; i++)  {
           RC.ru[j]->bw_list[i] = (int32_t *)malloc16_clear((RC.ru[j]->nb_bfw)*sizeof(int32_t));
+
           for (int b=0; b<RC.ru[j]->nb_bfw; b++) RC.ru[j]->bw_list[i][b] = RUParamList.paramarray[j][RU_BF_WEIGHTS_LIST_IDX].iptr[b];
         }
       }
diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h
index 00f786dfdcfd6d0459a47357431a1595bc4c7e59..5b6d21d177d603021b84c916d11683641fd53279 100644
--- a/executables/nr-softmodem-common.h
+++ b/executables/nr-softmodem-common.h
@@ -64,6 +64,7 @@
 #define CONFIG_HLP_NOSNGLT       "Disables single-thread mode in lte-softmodem\n"
 #define CONFIG_HLP_TADV          "Set timing_advance\n"
 #define CONFIG_HLP_DLF           "Set the downlink frequency for all component carriers\n"
+#define CONFIG_HLP_ULOFF         "Set the uplink frequnecy offset for all component carriers\n"
 #define CONFIG_HLP_CHOFF         "Channel id offset\n"
 #define CONFIG_HLP_SOFTS         "Enable soft scope and L1 and L2 stats (Xforms)\n"
 #define CONFIG_HLP_EXMCAL        "Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime \n"
@@ -71,13 +72,14 @@
 #define CONFIG_HLP_DLMCS_PHYTEST "Set the downlink MCS for PHYTEST mode\n"
 #define CONFIG_HLP_DLNL_PHYTEST "Set the downlink nrOfLayers for PHYTEST mode\n"
 #define CONFIG_HLP_STMON         "Enable processing timing measurement of lte softmodem on per subframe basis \n"
-#define CONFIG_HLP_PRB           "Set the PRB, valid values: 6, 25, 50, 100  \n"
 #define CONFIG_HLP_MSLOTS        "Skip the missed slots/subframes \n"
 #define CONFIG_HLP_ULMCS_PHYTEST "Set the uplink MCS for PHYTEST mode\n"
 #define CONFIG_HLP_DLBW_PHYTEST  "Set the number of PRBs used for DLSCH in PHYTEST mode\n"
 #define CONFIG_HLP_ULBW_PHYTEST  "Set the number of PRBs used for ULSCH in PHYTEST mode\n"
+#define CONFIG_HLP_PRB_SA        "Set the number of PRBs for SA\n"
 #define CONFIG_HLP_DLBM_PHYTEST  "Bitmap for DLSCH slots (slot 0 starts at LSB)\n"
 #define CONFIG_HLP_ULBM_PHYTEST  "Bitmap for ULSCH slots (slot 0 starts at LSB)\n"
+#define CONFIG_HLP_SSC           "Set the start subcarrier \n"
 #define CONFIG_HLP_TDD           "Set hardware to TDD mode (default: FDD). Used only with -U (otherwise set in config file).\n"
 #define CONFIG_HLP_UE            "Set the lte softmodem as a UE\n"
 #define CONFIG_HLP_L2MONW        "Enable L2 wireshark messages on localhost \n"
@@ -119,7 +121,7 @@
     {"g" ,           CONFIG_HLP_LOGL, 0,                  uptr:&glog_level,          defintval:0,         TYPE_UINT,     0},       \
     {"G" ,           CONFIG_HLP_LOGV, 0,                  uptr:&glog_verbosity,      defintval:0,         TYPE_UINT16,   0},       \
     {"telnetsrv",    CONFIG_HLP_TELN, PARAMFLAG_BOOL,     uptr:&start_telnetsrv,     defintval:0,         TYPE_UINT,     0},       \
-	{"msc",          CONFIG_HLP_MSC,  PARAMFLAG_BOOL,     uptr:&START_MSC,           defintval:0,         TYPE_UINT,     0},       \
+    {"msc",          CONFIG_HLP_MSC,  PARAMFLAG_BOOL,     uptr:&START_MSC,           defintval:0,         TYPE_UINT,     0},       \
   }
 
 #define CMDLINE_ONLINELOG_IDX     0
@@ -155,7 +157,4 @@ extern int emulate_rf;
 extern int numerology;
 extern int usrp_tx_thread;
 
-extern volatile int start_eNB;
-extern volatile int start_UE;
-
 #endif
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index 4727d09b043290dcc4f66a98f14fe1caefef8e4f..1b33667b1396811eaeaf23e3c68fa8bb40039bcf 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -53,6 +53,7 @@
 #include "PHY_INTERFACE/phy_interface_vars.h"
 #include "gnb_config.h"
 #include "SIMULATION/TOOLS/sim.h"
+#include <targets/RT/USER/lte-softmodem.h>
 
 #ifdef SMBV
 #include "PHY/TOOLS/smbv.h"
@@ -170,15 +171,15 @@ int split73=0;
 void sendFs6Ul(PHY_VARS_eNB *eNB, int UE_id, int harq_pid, int segmentID, int16_t *data, int dataLen, int r_offset) {
   AssertFatal(false, "Must not be called in this context\n");
 }
-void sendFs6Ulharq(enum pckType type, int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, int frame, int subframe, uint8_t *harq_ack, uint8_t tdd_mapping_mode, uint16_t tdd_multiplexing_mask, uint16_t rnti, int32_t stat) {
-    AssertFatal(false, "Must not be called in this context\n");
+void sendFs6Ulharq(enum pckType type, int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, int frame, int subframe, uint8_t *harq_ack, uint8_t tdd_mapping_mode, uint16_t tdd_multiplexing_mask,
+                   uint16_t rnti, int32_t stat) {
+  AssertFatal(false, "Must not be called in this context\n");
 }
 
 
 extern void reset_opp_meas(void);
 extern void print_opp_meas(void);
 
-extern void init_eNB_afterRU(void);
 extern void *udp_eNB_task(void *args_p);
 
 int transmission_mode=1;
@@ -307,44 +308,40 @@ int create_gNB_tasks(uint32_t gnb_nb) {
   LOG_D(GNB_APP, "%s(gnb_nb:%d)\n", __FUNCTION__, gnb_nb);
   itti_wait_ready(1);
 
-
   if (gnb_nb > 0) {
     /* Last task to create, others task must be ready before its start */
     /*if (itti_create_task (TASK_GNB_APP, gNB_app_task, NULL) < 0) {
       LOG_E(GNB_APP, "Create task for gNB APP failed\n");
       return -1;
     }*/
-    if(itti_create_task(TASK_SCTP, sctp_eNB_task, NULL) < 0){
+    if(itti_create_task(TASK_SCTP, sctp_eNB_task, NULL) < 0) {
       LOG_E(SCTP, "Create task for SCTP failed\n");
       return -1;
     }
+
     if (is_x2ap_enabled()) {
-    if(itti_create_task(TASK_X2AP, x2ap_task, NULL) < 0){
-      LOG_E(X2AP, "Create task for X2AP failed\n");
-    }
-    }
-    else {
+      if(itti_create_task(TASK_X2AP, x2ap_task, NULL) < 0) {
+        LOG_E(X2AP, "Create task for X2AP failed\n");
+      }
+    } else {
       LOG_I(X2AP, "X2AP is disabled.\n");
     }
   }
-  
+
   paramdef_t NETParams[]  =  GNBNETPARAMS_DESC;
   char aprefix[MAX_OPTNAME_SIZE*2 + 8];
   sprintf(aprefix,"%s.[%i].%s",GNB_CONFIG_STRING_GNB_LIST,0,GNB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
-  config_get( NETParams,sizeof(NETParams)/sizeof(paramdef_t),aprefix); 
+  config_get( NETParams,sizeof(NETParams)/sizeof(paramdef_t),aprefix);
 
-  for(int i = GNB_INTERFACE_NAME_FOR_NG_AMF_IDX; i <= GNB_IPV4_ADDRESS_FOR_NG_AMF_IDX; i++){
-    if( NETParams[i].strptr == NULL){
+  for(int i = GNB_INTERFACE_NAME_FOR_NG_AMF_IDX; i <= GNB_IPV4_ADDRESS_FOR_NG_AMF_IDX; i++) {
+    if( NETParams[i].strptr == NULL) {
       LOG_E(NGAP, "No configuration in the file.\n");
-	  NGAP_CONF_MODE = 0;
-	}
-    else {
+      NGAP_CONF_MODE = 0;
+    } else {
       LOG_D(NGAP, "Configuration in the file: %s.\n",*NETParams[i].strptr);
     }
-  
   }
 
-
   if (AMF_MODE_ENABLED) {
     if (gnb_nb > 0) {
       /*
@@ -353,17 +350,16 @@ int create_gNB_tasks(uint32_t gnb_nb) {
         return -1;
       }
       */
-      if(NGAP_CONF_MODE){
+      if(NGAP_CONF_MODE) {
         if (itti_create_task (TASK_NGAP, ngap_gNB_task, NULL) < 0) {
           LOG_E(NGAP, "Create task for NGAP failed\n");
           return -1;
         }
       } else {
-          LOG_E(NGAP, "Ngap task not created\n");
+        LOG_E(NGAP, "Ngap task not created\n");
       }
 
-
-      if(!emulate_rf){
+      if(!emulate_rf) {
         if (itti_create_task (TASK_UDP, udp_eNB_task, NULL) < 0) {
           LOG_E(UDP_, "Create task for UDP failed\n");
           return -1;
@@ -384,12 +380,14 @@ int create_gNB_tasks(uint32_t gnb_nb) {
     }
 
     LOG_I(NR_RRC,"Creating NR RRC gNB Task\n");
+
     if (itti_create_task (TASK_RRC_GNB, rrc_gnb_task, NULL) < 0) {
       LOG_E(NR_RRC, "Create task for NR RRC gNB failed\n");
       return -1;
     }
-    //Use check on x2ap to consider the NSA scenario and check on AMF_MODE_ENABLED for the SA scenario 
-    if(is_x2ap_enabled() || AMF_MODE_ENABLED){
+
+    //Use check on x2ap to consider the NSA scenario and check on AMF_MODE_ENABLED for the SA scenario
+    if(is_x2ap_enabled() || AMF_MODE_ENABLED) {
       if (itti_create_task (TASK_GTPV1_U, &nr_gtpv1u_gNB_task, NULL) < 0) {
         LOG_E(GTPU, "Create task for GTPV1U failed\n");
         return -1;
@@ -402,18 +400,12 @@ int create_gNB_tasks(uint32_t gnb_nb) {
 
 
 static void get_options(void) {
-
-
   paramdef_t cmdline_params[] = CMDLINE_PARAMS_DESC_GNB ;
-
   CONFIG_SETRTFLAG(CONFIG_NOEXITONHELP);
   get_common_options(SOFTMODEM_GNB_BIT );
   config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL);
   CONFIG_CLEARRTFLAG(CONFIG_NOEXITONHELP);
 
-
-
-
   if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) ) {
     memset((void *)&RC,0,sizeof(RC));
     /* Read RC configuration file */
@@ -426,13 +418,11 @@ static void get_options(void) {
   if(parallel_config != NULL) set_parallel_conf(parallel_config);
 
   if(worker_config != NULL) set_worker_conf(worker_config);
-
 }
 
 
 void set_default_frame_parms(nfapi_nr_config_request_scf_t *config[MAX_NUM_CCs],
-		             NR_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs])
-{
+                             NR_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) {
   for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
     frame_parms[CC_id] = (NR_DL_FRAME_PARMS *) malloc(sizeof(NR_DL_FRAME_PARMS));
     config[CC_id] = (nfapi_nr_config_request_scf_t *) malloc(sizeof(nfapi_nr_config_request_scf_t));
@@ -507,10 +497,9 @@ void wait_gNBs(void) {
     waiting=0;
 
     for (i=0; i<RC.nb_nr_L1_inst; i++) {
-
       if (RC.gNB[i]->configured==0) {
-	waiting=1;
-	break;
+        waiting=1;
+        break;
       }
     }
   }
@@ -567,11 +556,8 @@ int stop_L1L2(module_id_t gnb_id) {
   LOG_I(GNB_APP, "calling kill_NR_RU_proc() for instance %d\n", gnb_id);
   kill_NR_RU_proc(gnb_id);
   oai_exit = 0;
-
-    //free_transport(RC.gNB[gnb_id]);
+  //free_transport(RC.gNB[gnb_id]);
   phy_free_nr_gNB(RC.gNB[gnb_id]);
-
-
   nr_phy_free_RU(RC.ru[gnb_id]);
   free_lte_top();
   return 0;
@@ -586,17 +572,13 @@ int restart_L1L2(module_id_t gnb_id) {
   LOG_W(GNB_APP, "restarting nr-softmodem\n");
   /* block threads */
   sync_var = -1;
-
   RC.gNB[gnb_id]->configured = 0;
-  
-
   RC.ru_mask |= (1 << ru->idx);
   set_function_spec_param(RC.ru[gnb_id]);
   LOG_I(GNB_APP, "attempting to create ITTI tasks\n");
   // No more rrc thread, as many race conditions are hidden behind
   rrc_enb_init();
   itti_mark_task_ready(TASK_RRC_ENB);
-
   /* pass a reconfiguration request which will configure everything down to
    * RC.eNB[i][j]->frame_parms, too */
   msg_p = itti_alloc_new_message(TASK_ENB_APP, 0, RRC_CONFIGURATION_REQ);
@@ -633,7 +615,8 @@ void init_pdcp(void) {
   if (!NODE_IS_DU(RC.nrrrc[0]->node_type)) {
     // pdcp_layer_init();
     uint32_t pdcp_initmask = (IS_SOFTMODEM_NOS1) ?
-                            (PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT;
+                             (PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT;
+
     if (IS_SOFTMODEM_NOS1) {
       printf("IS_SOFTMODEM_NOS1 option enabled \n");
       pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT;
@@ -656,16 +639,15 @@ void init_pdcp(void) {
 }
 
 
-int main( int argc, char **argv )
-{
+int main( int argc, char **argv ) {
   int ru_id, CC_id = 0;
-
   start_background_system();
 
   ///static configuration for NR at the moment
   if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == NULL) {
     exit_fun("[SOFTMODEM] Error, configuration module init failed\n");
   }
+
   set_softmodem_sighandler();
 #ifdef DEBUG_CONSOLE
   setvbuf(stdout, NULL, _IONBF, 0);
@@ -709,19 +691,16 @@ int main( int argc, char **argv )
   itti_init(TASK_MAX, tasks_info);
   // initialize mscgen log after ITTI
   MSC_INIT(MSC_E_UTRAN, ADDED_QUEUES_MAX+TASK_MAX);
-
-
   init_opt();
+#ifdef PDCP_USE_NETLINK
 
+  if(!IS_SOFTMODEM_NOS1)
+    netlink_init();
 
-#ifdef PDCP_USE_NETLINK
-if(!IS_SOFTMODEM_NOS1)
-  netlink_init();
 #if defined(PDCP_USE_NETLINK_QUEUES)
   pdcp_netlink_init();
 #endif
 #endif
-
 #ifndef PACKAGE_VERSION
 #  define PACKAGE_VERSION "UNKNOWN-EXPERIMENTAL"
 #endif
@@ -730,9 +709,8 @@ if(!IS_SOFTMODEM_NOS1)
   if (RC.nb_nr_L1_inst > 0)
     RCconfig_NR_L1();
 
-    // don't create if node doesn't connect to RRC/S1/GTP
-    AssertFatal(create_gNB_tasks(1) == 0,"cannot create ITTI tasks\n");
-
+  // don't create if node doesn't connect to RRC/S1/GTP
+  AssertFatal(create_gNB_tasks(1) == 0,"cannot create ITTI tasks\n");
   /* Start the agent. If it is turned off in the configuration, it won't start */
   /*
   RCconfig_nr_flexran();
@@ -740,15 +718,13 @@ if(!IS_SOFTMODEM_NOS1)
   for (i = 0; i < RC.nb_nr_L1_inst; i++) {
     flexran_agent_start(i);
   }
-*/
-
+  */
   // init UE_PF_PO and mutex lock
   pthread_mutex_init(&ue_pf_po_mutex, NULL);
   memset (&UE_PF_PO[0][0], 0, sizeof(UE_PF_PO_t)*NUMBER_OF_UE_MAX*MAX_NUM_CCs);
   mlockall(MCL_CURRENT | MCL_FUTURE);
   pthread_cond_init(&sync_cond,NULL);
   pthread_mutex_init(&sync_mutex, NULL);
-
   usleep(1000);
 
   if (NFAPI_MODE) {
@@ -819,6 +795,7 @@ if(!IS_SOFTMODEM_NOS1)
     printf("RC.nb_RU:%d\n", RC.nb_RU);
     // once all RUs are ready initialize the rest of the gNBs ((dependence on final RU parameters after configuration)
     printf("ALL RUs ready - init gNBs\n");
+
     if(IS_SOFTMODEM_DOSCOPE) {
       sleep(1);
       scopeParms_t p;
@@ -844,8 +821,10 @@ if(!IS_SOFTMODEM_NOS1)
     pthread_cond_broadcast(&sync_cond);
     pthread_mutex_unlock(&sync_mutex);
   }
+
   printf("About to call end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
-  end_configmodule();
+  // We have to set PARAMFLAG_NOFREE on right paramters before re-enabling end_configmodule()
+  //end_configmodule();
   printf("Called end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
   // wait for end of program
   printf("TYPE <CTRL-C> TO TERMINATE\n");
@@ -855,7 +834,6 @@ if(!IS_SOFTMODEM_NOS1)
   printf("Returned from ITTI signal handler\n");
   oai_exit=1;
   printf("oai_exit=%d\n",oai_exit);
-
   // stop threads
   /*#ifdef XFORMS
 
@@ -889,8 +867,8 @@ if(!IS_SOFTMODEM_NOS1)
   /* release memory used by the RU/gNB threads (incomplete), after all
    * threads have been stopped (they partially use the same memory) */
   for (int inst = 0; inst < NB_gNB_INST; inst++) {
-      //free_transport(RC.gNB[inst]);
-      phy_free_nr_gNB(RC.gNB[inst]);
+    //free_transport(RC.gNB[inst]);
+    phy_free_nr_gNB(RC.gNB[inst]);
   }
 
   for (int inst = 0; inst < NB_RU; inst++) {
@@ -914,7 +892,6 @@ if(!IS_SOFTMODEM_NOS1)
       RC.ru[ru_id]->ifdevice.trx_end_func(&RC.ru[ru_id]->ifdevice);
   }
 
-
   logClean();
   printf("Bye.\n");
   return 0;
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index 53ec70330c0c9c1ced9481f1146286a2a1ef4153..92fe5174c28f54bb0bf6811797a7a583511d7fe1 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -220,17 +220,16 @@ static void UE_synch(void *arg) {
       LOG_I(PHY, "[UE thread Synch] Running Initial Synch (mode %d)\n",UE->mode);
 
       uint64_t dl_carrier, ul_carrier;
-      double rx_gain_off = 0;
       nr_get_carrier_frequencies(&UE->frame_parms, &dl_carrier, &ul_carrier);
 
-      if (nr_initial_sync(&syncD->proc, UE, 2) == 0) {
+      if (nr_initial_sync(&syncD->proc, UE, 2, get_softmodem_params()->sa, get_nrUE_params()->nr_dlsch_parallel) == 0) {
         freq_offset = UE->common_vars.freq_offset; // frequency offset computed with pss in initial sync
         hw_slot_offset = ((UE->rx_offset<<1) / UE->frame_parms.samples_per_subframe * UE->frame_parms.slots_per_subframe) +
                          round((float)((UE->rx_offset<<1) % UE->frame_parms.samples_per_subframe)/UE->frame_parms.samples_per_slot0);
 
         // rerun with new cell parameters and frequency-offset
         // todo: the freq_offset computed on DL shall be scaled before being applied to UL
-        nr_rf_card_config(&openair0_cfg[UE->rf_map.card], rx_gain_off, ul_carrier, dl_carrier, freq_offset);
+        nr_rf_card_config_freq(&openair0_cfg[UE->rf_map.card], ul_carrier, dl_carrier, freq_offset);
 
         LOG_I(PHY,"Got synch: hw_slot_offset %d, carrier off %d Hz, rxgain %f (DL %f Hz, UL %f Hz)\n",
               hw_slot_offset,
@@ -264,7 +263,7 @@ static void UE_synch(void *arg) {
 
           freq_offset *= -1;
 
-          nr_rf_card_config(&openair0_cfg[UE->rf_map.card], rx_gain_off, ul_carrier, dl_carrier, freq_offset);
+          nr_rf_card_config_freq(&openair0_cfg[UE->rf_map.card], ul_carrier, dl_carrier, freq_offset);
 
           LOG_I(PHY, "Initial sync failed: trying carrier off %d Hz\n", freq_offset);
 
@@ -307,11 +306,12 @@ void processSlotTX(void *arg) {
       ul_indication.frame_tx  = proc->frame_tx;
       ul_indication.slot_tx   = proc->nr_slot_tx;
       ul_indication.thread_id = proc->thread_id;
+      ul_indication.ue_sched_mode = rxtxD->ue_sched_mode;
 
       UE->if_inst->ul_indication(&ul_indication);
     }
 
-    if (UE->mode != loop_through_memory) {
+    if ((UE->mode != loop_through_memory) && (rxtxD->ue_sched_mode != NOT_PUSCH)) {
       phy_procedures_nrUE_TX(UE,proc,0);
     }
   }
@@ -358,6 +358,9 @@ void processSlotRX(void *arg) {
         nr_pdcp_tick(proc->frame_rx, proc->nr_slot_rx / UE->frame_parms.slots_per_subframe);
       }
     }
+    // calling UL_indication to schedule things other than PUSCH (eg, PUCCH)
+    rxtxD->ue_sched_mode = NOT_PUSCH;
+    processSlotTX(rxtxD);
 
     // Wait for PUSCH processing to finish
     notifiedFIFO_elt_t *res;
@@ -365,6 +368,7 @@ void processSlotRX(void *arg) {
     delNotifiedFIFO_elt(res);
 
   } else {
+    rxtxD->ue_sched_mode = SCHED_ALL;
     processSlotTX(rxtxD);
   }
 
@@ -373,8 +377,7 @@ void processSlotRX(void *arg) {
       if (get_softmodem_params()->usim_test==0) {
         pucch_procedures_ue_nr(UE,
                                gNB_id,
-                               proc,
-                               FALSE);
+                               proc);
       }
 
       LOG_D(PHY, "Sending Uplink data \n");
@@ -714,15 +717,18 @@ void *UE_thread(void *arg) {
 
     if (openair0_cfg[0].duplex_mode == duplex_mode_TDD) {
 
-      uint8_t    tdd_period = mac->phy_config.config_req.tdd_table.tdd_period_in_slots;
-
-      int   nrofUplinkSlots = 0;
-      if (mac->scc_SIB)
-	      nrofUplinkSlots = mac->scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
-      else if (mac->scc)
-	      nrofUplinkSlots = mac->scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
+      uint8_t tdd_period = mac->phy_config.config_req.tdd_table.tdd_period_in_slots;
+      int nrofUplinkSlots, nrofUplinkSymbols;
+      if (mac->scc) {
+        nrofUplinkSlots = mac->scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
+        nrofUplinkSymbols = mac->scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols;
+      }
+      else {
+        nrofUplinkSlots = mac->scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
+        nrofUplinkSymbols = mac->scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols;
+      }
+      uint8_t  num_UL_slots = nrofUplinkSlots + (nrofUplinkSymbols != 0);
 
-      uint8_t  num_UL_slots = nrofUplinkSlots + (nrofUplinkSlots != 0);
       uint8_t first_tx_slot = tdd_period - num_UL_slots;
 
       if (slot_tx_usrp % tdd_period == first_tx_slot)
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 23982c6bc33ffc579b4cf589a00cafc8a5fea007..76049db8ce8e64b0597830a15b215dcd9dfd8123 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -33,6 +33,7 @@
 //#include "common/utils/threadPool/thread-pool.h"
 #include "common/utils/load_module_shlib.h"
 //#undef FRAME_LENGTH_COMPLEX_SAMPLES //there are two conflicting definitions, so we better make sure we don't use it at all
+#include "common/utils/nr/nr_common.h"
 
 #include "../../ARCH/COMMON/common_lib.h"
 #include "../../ARCH/ETHERNET/USERSPACE/LIB/if_defs.h"
@@ -105,8 +106,6 @@ int config_sync_var=-1;
 
 
 RAN_CONTEXT_t RC;
-volatile int             start_eNB = 0;
-volatile int             start_UE = 0;
 volatile int             oai_exit = 0;
 
 
@@ -254,6 +253,7 @@ void init_tpools(uint8_t nun_dlsch_threads) {
 }
 static void get_options(void) {
 
+  nrUE_params.ofdm_offset_divisor = 8;
   paramdef_t cmdline_params[] =CMDLINE_NRUEPARAMS_DESC ;
   int numparams = sizeof(cmdline_params)/sizeof(paramdef_t);
   config_process_cmdline( cmdline_params,numparams,NULL);
@@ -280,7 +280,7 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){
 
   UE->mode = normal_txrx;
 
-  config_process_cmdline( cmdline_params,numparams,NULL);
+  config_get(cmdline_params,numparams,NULL);
 
   int pindex = config_paramidx_fromname(cmdline_params,numparams, CALIBRX_OPT);
   if ( (cmdline_params[pindex].paramflags &  PARAMFLAG_PARAMSET) != 0) UE->mode = rx_calib_ue;
@@ -319,24 +319,20 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){
   UE->rf_map.card          = card_offset;
   UE->rf_map.chain         = CC_id + chain_offset;
 
-
-  LOG_I(PHY,"Set UE mode %d, UE_fo_compensation %d, UE_scan_carrier %d, UE_no_timing_correction %d \n", 
-  	   UE->mode, UE->UE_fo_compensation, UE->UE_scan_carrier, UE->no_timing_correction);
+  LOG_I(PHY,"Set UE mode %d, UE_fo_compensation %d, UE_scan_carrier %d, UE_no_timing_correction %d \n, do_prb_interpolation %d\n", 
+  	UE->mode, UE->UE_fo_compensation, UE->UE_scan_carrier, UE->no_timing_correction, UE->prb_interpolation);
 
   // Set FP variables
 
-
-  
   if (tddflag){
     fp->frame_type = TDD;
     LOG_I(PHY, "Set UE frame_type %d\n", fp->frame_type);
   }
 
-  fp->N_RB_DL = N_RB_DL;
-
-  LOG_I(PHY, "Set UE N_RB_DL %d\n", N_RB_DL);
   LOG_I(PHY, "Set UE nb_rx_antenna %d, nb_tx_antenna %d, threequarter_fs %d\n", fp->nb_antennas_rx, fp->nb_antennas_tx, fp->threequarter_fs);
 
+  fp->ofdm_offset_divisor = nrUE_params.ofdm_offset_divisor;
+
 }
 
 void init_openair0(void) {
@@ -372,7 +368,8 @@ void init_openair0(void) {
 
     nr_get_carrier_frequencies(frame_parms, &dl_carrier, &ul_carrier);
 
-    nr_rf_card_config(&openair0_cfg[card], rx_gain_off, ul_carrier, dl_carrier, freq_off);
+    nr_rf_card_config_freq(&openair0_cfg[card], ul_carrier, dl_carrier, freq_off);
+    nr_rf_card_config_gain(&openair0_cfg[card], rx_gain_off);
 
     openair0_cfg[card].configFilename = get_softmodem_params()->rf_config_file;
 
@@ -467,36 +464,33 @@ int main( int argc, char **argv ) {
 
   for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
 
-
     PHY_vars_UE_g[0][CC_id] = (PHY_VARS_NR_UE *)malloc(sizeof(PHY_VARS_NR_UE));
     UE[CC_id] = PHY_vars_UE_g[0][CC_id];
     memset(UE[CC_id],0,sizeof(PHY_VARS_NR_UE));
 
     set_options(CC_id, UE[CC_id]);
-
     NR_UE_MAC_INST_t *mac = get_mac_inst(0);
-    if(mac->if_module != NULL && mac->if_module->phy_config_request != NULL)
-      mac->if_module->phy_config_request(&mac->phy_config);
-
-    fapi_nr_config_request_t *nrUE_config = &UE[CC_id]->nrUE_config;
-    if (get_softmodem_params()->sa) { // set frame config to initial values from command line and assume that the SSB is centered on the grid
-      nrUE_config->ssb_config.scs_common = get_softmodem_params()->numerology;
-      nrUE_config->carrier_config.dl_grid_size[nrUE_config->ssb_config.scs_common] = UE[CC_id]->frame_parms.N_RB_DL;
-      nrUE_config->carrier_config.ul_grid_size[nrUE_config->ssb_config.scs_common] = UE[CC_id]->frame_parms.N_RB_DL;
-      nrUE_config->carrier_config.dl_frequency =  (downlink_frequency[0][0] -(6*UE[CC_id]->frame_parms.N_RB_DL*(15000<<nrUE_config->ssb_config.scs_common)))/1000;
-      nrUE_config->carrier_config.uplink_frequency =  (downlink_frequency[0][0] -(6*UE[CC_id]->frame_parms.N_RB_DL*(15000<<nrUE_config->ssb_config.scs_common)))/1000;
-      nrUE_config->ssb_table.ssb_offset_point_a = (UE[CC_id]->frame_parms.N_RB_DL - 20)>>1;
-
-      // Initialize values, will be updated upon SIB1 reception
-      nrUE_config->cell_config.frame_duplex_type = TDD;
-      nrUE_config->ssb_table.ssb_mask_list[0].ssb_mask = 0xFFFFFFFF;
-      nrUE_config->ssb_table.ssb_period = 1;
+
+    if (get_softmodem_params()->sa) {
+      uint16_t nr_band = get_band(downlink_frequency[CC_id][0],uplink_frequency_offset[CC_id][0]);
+      mac->nr_band = nr_band;
+      nr_init_frame_parms_ue_sa(&UE[CC_id]->frame_parms,
+                                downlink_frequency[CC_id][0],
+                                uplink_frequency_offset[CC_id][0],
+                                get_softmodem_params()->numerology,
+                                nr_band);
+    }
+    else{
+      if(mac->if_module != NULL && mac->if_module->phy_config_request != NULL)
+        mac->if_module->phy_config_request(&mac->phy_config);
+
+      fapi_nr_config_request_t *nrUE_config = &UE[CC_id]->nrUE_config;
+
+      nr_init_frame_parms_ue(&UE[CC_id]->frame_parms, nrUE_config, *mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]);
     }
-    
-    nr_init_frame_parms_ue(&UE[CC_id]->frame_parms, nrUE_config, 
-			   mac->scc == NULL ? 78 : *mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]);
 
     init_symbol_rotation(&UE[CC_id]->frame_parms);
+    init_timeshift_rotation(&UE[CC_id]->frame_parms);
     init_nr_ue_vars(UE[CC_id], 0, abstraction_flag);
 
     #ifdef FR2_TEST
diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h
index be3ca2d1a27ad4c7920d12d513814e38238ab2f9..9f2a48d6a151e8a1beb26265b3038d133e41e655 100644
--- a/executables/nr-uesoftmodem.h
+++ b/executables/nr-uesoftmodem.h
@@ -8,7 +8,8 @@
 
 
 
-#define  CONFIG_HLP_DLSCH_PARA             "number of threads for dlsch processing 0 for no parallelization"
+#define  CONFIG_HLP_DLSCH_PARA             "number of threads for dlsch processing 0 for no parallelization\n"
+#define  CONFIG_HLP_OFFSET_DIV             "Divisor for computing OFDM symbol offset in Rx chain (num samples in CP/<the value>). Default value is 8. To set the sample offset to 0, set this value ~ 10e6\n"
 /***************************************************************************************************************************************/
 /* command line options definitions, CMDLINE_XXXX_DESC macros are used to initialize paramdef_t arrays which are then used as argument
    when calling config_get or config_getlist functions                                                                                 */
@@ -29,6 +30,7 @@
     {"usrp-args",                CONFIG_HLP_USRP_ARGS,   0,               strptr:(char **)&usrp_args,         defstrval:"type=b200", TYPE_STRING,   0},    \
     {"single-thread-disable",    CONFIG_HLP_NOSNGLT,     PARAMFLAG_BOOL,  iptr:&single_thread_flag,           defintval:1,           TYPE_INT,    0}, \
     {"dlsch-parallel",           CONFIG_HLP_DLSCH_PARA,  0,               iptr:(int32_t *)&nrUE_params.nr_dlsch_parallel,       defintval:0,           TYPE_UINT8,  0}, \
+    {"offset-divisor",           CONFIG_HLP_OFFSET_DIV,  0,               uptr:(uint32_t *)&nrUE_params.ofdm_offset_divisor,    defuintval:UINT_MAX,           TYPE_UINT32,  0}, \
     {"nr-dlsch-demod-shift",     CONFIG_HLP_DLSHIFT,     0,               iptr:(int32_t *)&nr_dlsch_demod_shift,    defintval:0,     TYPE_INT,    0}, \
     {"V" ,                       CONFIG_HLP_VCD,         PARAMFLAG_BOOL,  iptr:&vcdflag,                            defintval:0,     TYPE_INT,    0}, \
     {"rrc_config_path",          CONFIG_HLP_RRC_CFG_PATH,0,               strptr:(char **)&rrc_config_path,         defstrval:"./",  TYPE_STRING, 0} \
@@ -40,31 +42,34 @@
 /*   optname                     helpstr                paramflags                      XXXptr        defXXXval         type       numelt   */
 /*------------------------------------------------------------------------------------------------------------------------------------------*/
 #define CMDLINE_NRUE_PHYPARAMS_DESC {  \
-    { CALIBRX_OPT,               CONFIG_HLP_CALUER,     0,                iptr:&rx_input_level_dBm,           defintval:0,           TYPE_INT,   0},    \
-    { CALIBRXMED_OPT,            CONFIG_HLP_CALUERM,    0,                iptr:&rx_input_level_dBm,           defintval:0,           TYPE_INT,   0},    \
-    { CALIBRXBYP_OPT,            CONFIG_HLP_CALUERB,    0,                iptr:&rx_input_level_dBm,           defintval:0,           TYPE_INT,   0},    \
-    { DBGPRACH_OPT,              CONFIG_HLP_DBGUEPR,    PARAMFLAG_BOOL,   uptr:NULL,                          defuintval:1,          TYPE_INT,   0},    \
-    { NOL2CONNECT_OPT,           CONFIG_HLP_NOL2CN,     PARAMFLAG_BOOL,   uptr:NULL,                          defuintval:1,          TYPE_INT,   0},    \
-    {CALIBPRACH_OPT,             CONFIG_HLP_CALPRACH,   PARAMFLAG_BOOL,   uptr:NULL,                          defuintval:1,          TYPE_INT,   0},    \
-    { DUMPFRAME_OPT,             CONFIG_HLP_DUMPFRAME,  PARAMFLAG_BOOL,   iptr:&dumpframe,                    defintval:0,           TYPE_INT,   0},    \
-    {"ue-rxgain",                CONFIG_HLP_UERXG,       0,               dblptr:&(rx_gain[0][0]),            defdblval:0,           TYPE_DOUBLE,   0},     \
-    {"ue-rxgain-off",            CONFIG_HLP_UERXGOFF,    0,               dblptr:&rx_gain_off,                defdblval:0,           TYPE_DOUBLE,   0},     \
-    {"ue-txgain",                CONFIG_HLP_UETXG,       0,               dblptr:&(tx_gain[0][0]),            defdblval:0,           TYPE_DOUBLE,   0},     \
-    {"ue-nb-ant-rx",             CONFIG_HLP_UENANTR,     0,               u8ptr:&(fp->nb_antennas_rx),        defuintval:1,          TYPE_UINT8,    0},     \
-    {"ue-nb-ant-tx",             CONFIG_HLP_UENANTT,     0,               u8ptr:&(fp->nb_antennas_tx),        defuintval:1,          TYPE_UINT8,    0},     \
-    {"ue-scan-carrier",          CONFIG_HLP_UESCAN,      PARAMFLAG_BOOL,  iptr:&(UE->UE_scan_carrier),        defintval:0,           TYPE_INT,      0},     \
-    {"ue-fo-compensation",       CONFIG_HLP_UEFO,        PARAMFLAG_BOOL,  iptr:&(UE->UE_fo_compensation),     defintval:0,           TYPE_INT,      0},     \
-    {"ue-max-power",             NULL,                   0,               iptr:&(tx_max_power[0]),            defintval:90,          TYPE_INT,      0},     \
-    {"r"  ,                      CONFIG_HLP_PRB,         0,               uptr:&(N_RB_DL),                    defuintval:160,         TYPE_UINT,     0},     \
-    {"A" ,                       CONFIG_HLP_TADV,        0,               iptr:&(UE->timing_advance),         defintval:0,           TYPE_INT,      0}, \
-    {"E" ,                       CONFIG_HLP_TQFS,        PARAMFLAG_BOOL,  u8ptr:&(fp->threequarter_fs),       defintval:0,           TYPE_UINT8,    0}, \
-    {"T" ,                       CONFIG_HLP_TDD,         PARAMFLAG_BOOL,  iptr:&tddflag,                      defintval:0,           TYPE_INT,      0}, \
-    {"ue-timing-correction-disable", CONFIG_HLP_DISABLETIMECORR, PARAMFLAG_BOOL, iptr:&(UE->no_timing_correction), defintval:0,         TYPE_INT,    0}, \
+    { CALIBRX_OPT,               CONFIG_HLP_CALUER,     0,                iptr:&rx_input_level_dBm,           defintval:0,           TYPE_INT,   0}, \
+    { CALIBRXMED_OPT,            CONFIG_HLP_CALUERM,    0,                iptr:&rx_input_level_dBm,           defintval:0,           TYPE_INT,   0}, \
+    { CALIBRXBYP_OPT,            CONFIG_HLP_CALUERB,    0,                iptr:&rx_input_level_dBm,           defintval:0,           TYPE_INT,   0}, \
+    { DBGPRACH_OPT,              CONFIG_HLP_DBGUEPR,    PARAMFLAG_BOOL,   uptr:NULL,                          defuintval:1,          TYPE_INT,   0}, \
+    { NOL2CONNECT_OPT,           CONFIG_HLP_NOL2CN,     PARAMFLAG_BOOL,   uptr:NULL,                          defuintval:1,          TYPE_INT,   0}, \
+    { CALIBPRACH_OPT,            CONFIG_HLP_CALPRACH,   PARAMFLAG_BOOL,   uptr:NULL,                          defuintval:1,          TYPE_INT,   0}, \
+    { DUMPFRAME_OPT,             CONFIG_HLP_DUMPFRAME,  PARAMFLAG_BOOL,   iptr:&dumpframe,                    defintval:0,           TYPE_INT,   0}, \
+    {"ue-rxgain",                CONFIG_HLP_UERXG,       0,               dblptr:&(rx_gain[0][0]),            defdblval:0,           TYPE_DOUBLE,0}, \
+    {"ue-rxgain-off",            CONFIG_HLP_UERXGOFF,    0,               dblptr:&rx_gain_off,                defdblval:0,           TYPE_DOUBLE,0}, \
+    {"ue-txgain",                CONFIG_HLP_UETXG,       0,               dblptr:&(tx_gain[0][0]),            defdblval:0,           TYPE_DOUBLE,0}, \
+    {"ue-nb-ant-rx",             CONFIG_HLP_UENANTR,     0,               u8ptr:&(fp->nb_antennas_rx),        defuintval:1,          TYPE_UINT8, 0}, \
+    {"ue-nb-ant-tx",             CONFIG_HLP_UENANTT,     0,               u8ptr:&(fp->nb_antennas_tx),        defuintval:1,          TYPE_UINT8, 0}, \
+    {"ue-scan-carrier",          CONFIG_HLP_UESCAN,      PARAMFLAG_BOOL,  iptr:&(UE->UE_scan_carrier),        defintval:0,           TYPE_INT,   0}, \
+    {"ue-fo-compensation",       CONFIG_HLP_UEFO,        PARAMFLAG_BOOL,  iptr:&(UE->UE_fo_compensation),     defintval:0,           TYPE_INT,   0}, \
+    {"ue-max-power",             NULL,                   0,               iptr:&(tx_max_power[0]),            defintval:90,          TYPE_INT,   0}, \
+    {"A" ,                       CONFIG_HLP_TADV,        0,               iptr:&(UE->timing_advance),         defintval:0,           TYPE_INT,   0}, \
+    {"E" ,                       CONFIG_HLP_TQFS,        PARAMFLAG_BOOL,  u8ptr:&(fp->threequarter_fs),       defintval:0,           TYPE_UINT8, 0}, \
+    {"r"  ,                      CONFIG_HLP_PRB_SA,      0,               iptr:&(fp->N_RB_DL),                defintval:106,         TYPE_UINT,  0}, \
+    {"s"  ,                      CONFIG_HLP_SSC,         0,               u16ptr:&(fp->ssb_start_subcarrier), defintval:516,         TYPE_UINT16,0}, \
+    {"T" ,                       CONFIG_HLP_TDD,         PARAMFLAG_BOOL,  iptr:&tddflag,                      defintval:0,           TYPE_INT,   0}, \
+    {"do-prb-interpolation",     CONFIG_HLP_PRBINTER,    PARAMFLAG_BOOL,  iptr:&(UE->prb_interpolation),      defintval:0,           TYPE_INT,   0}, \
+    {"ue-timing-correction-disable", CONFIG_HLP_DISABLETIMECORR, PARAMFLAG_BOOL, iptr:&(UE->no_timing_correction), defintval:0,      TYPE_INT,   0}, \
 }
 
 
 typedef struct {
   uint64_t       optmask;   //mask to store boolean config options
+  uint32_t       ofdm_offset_divisor; // Divisor for sample offset computation for each OFDM symbol
   uint8_t        nr_dlsch_parallel; // number of threads for dlsch decoding, 0 means no parallelization
   tpool_t        Tpool;             // thread pool 
 } nrUE_params_t;
diff --git a/executables/softmodem-common.c b/executables/softmodem-common.c
index fa6b6747652c18dc5eb4d541d06e3133b3722a0f..e10515ea1acab5330d18e23a0ded937459d23965 100644
--- a/executables/softmodem-common.c
+++ b/executables/softmodem-common.c
@@ -89,7 +89,7 @@ void get_common_options(uint32_t execmask) {
   uint32_t online_log_messages=0;
   uint32_t glog_level=0 ;
   uint32_t start_telnetsrv = 0, start_telnetclt = 0;
-  uint32_t noS1 = 0, nokrnmod = 0, nonbiot = 0;
+  uint32_t noS1 = 0, nokrnmod = 1, nonbiot = 0;
   uint32_t rfsim = 0, basicsim = 0, do_forms = 0;
   char *logmem_filename = NULL;
   paramdef_t cmdline_params[] =CMDLINE_PARAMS_DESC ;
diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h
index b6a2b18215ab51b617b86a655f40e9ef6dc06f30..c6a1eb44e4959f0f4de21f4f949fa5d456b22541 100644
--- a/executables/softmodem-common.h
+++ b/executables/softmodem-common.h
@@ -72,6 +72,7 @@ extern "C"
 #define CONFIG_HLP_DLMCS         "Set the maximum downlink MCS\n"
 #define CONFIG_HLP_STMON         "Enable processing timing measurement of lte softmodem on per subframe basis \n"
 #define CONFIG_HLP_256QAM        "Use the 256 QAM mcs table for PDSCH\n"
+#define CONFIG_HLP_PRBINTER       "Do PRB based averaging of channel estimates. Frequency domain linear interpolation by default\n"
 
 #define CONFIG_HLP_NONSTOP       "Go back to frame sync mode after 100 consecutive PBCH failures\n"
 //#define CONFIG_HLP_NUMUES        "Set the number of UEs for the emulation"
@@ -119,6 +120,7 @@ extern "C"
 #define SEND_DMRSSYNC       softmodem_params.send_dmrs_sync
 #define USIM_TEST           softmodem_params.usim_test
 #define USE_256QAM_TABLE    softmodem_params.use_256qam_table
+#define PRB_INTERPOLATION   softmodem_params.prb_interpolation
 #define NFAPI               softmodem_params.nfapi
 #define NON_STOP            softmodem_params.non_stop
 
@@ -137,8 +139,8 @@ extern int usrp_tx_thread;
     {"time-source",          CONFIG_HLP_TME,          0,              uptr:&TIMING_SOURCE,                defintval:0,           TYPE_UINT,   0},                     \
     {"wait-for-sync",        NULL,                    PARAMFLAG_BOOL, iptr:&WAIT_FOR_SYNC,                defintval:0,           TYPE_INT,    0},                     \
     {"single-thread-enable", CONFIG_HLP_NOSNGLT,      PARAMFLAG_BOOL, iptr:&SINGLE_THREAD_FLAG,           defintval:0,           TYPE_INT,    0},                     \
-    {"C" ,                   CONFIG_HLP_DLF,          0,              u64ptr:&(downlink_frequency[0][0]),     defuintval:3619200000,  TYPE_UINT64,   0},              \
-    {"CO" ,                  CONFIG_HLP_ULF,          0,              iptr:&(uplink_frequency_offset[0][0]),  defintval:0,   TYPE_INT,      0},              \
+    {"C" ,                   CONFIG_HLP_DLF,          0,              u64ptr:&(downlink_frequency[0][0]), defuintval:0,          TYPE_UINT64, 0},                     \
+    {"CO" ,                  CONFIG_HLP_ULF,          0,              iptr:&(uplink_frequency_offset[0][0]), defintval:0,        TYPE_INT,    0},                     \
     {"a" ,                   CONFIG_HLP_CHOFF,        0,              iptr:&CHAIN_OFFSET,                 defintval:0,           TYPE_INT,    0},                     \
     {"d" ,                   CONFIG_HLP_SOFTS,        PARAMFLAG_BOOL, uptr:(uint32_t *)&do_forms,         defintval:0,           TYPE_INT8,   0},                     \
     {"q" ,                   CONFIG_HLP_STMON,        PARAMFLAG_BOOL, iptr:&opp_enabled,                  defintval:0,           TYPE_INT,    0},                     \
@@ -153,9 +155,10 @@ extern int usrp_tx_thread;
     {"nokrnmod",             CONFIG_HLP_NOKRNMOD,     PARAMFLAG_BOOL, uptr:&nokrnmod,                     defintval:0,           TYPE_INT,    0},                     \
     {"nbiot-disable",        CONFIG_HLP_DISABLNBIOT,  PARAMFLAG_BOOL, uptr:&nonbiot,                      defuintval:0,          TYPE_INT,    0},                     \
     {"use-256qam-table",     CONFIG_HLP_256QAM,       PARAMFLAG_BOOL, iptr:&USE_256QAM_TABLE,             defintval:0,           TYPE_INT,    0},                     \
-    {"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0,              iptr:&usrp_tx_thread,               defstrval:0,           TYPE_INT,    0},                     \
+    {"do-prb-interpolation", CONFIG_HLP_PRBINTER,     PARAMFLAG_BOOL, iptr:&PRB_INTERPOLATION,            defintval:0,           TYPE_INT,    0},                     \
+    {"usrp-tx-thread-config",CONFIG_HLP_USRP_THREAD,  0,              iptr:&usrp_tx_thread,               defstrval:0,           TYPE_INT,    0},                     \
     {"nfapi",                CONFIG_HLP_NFAPI,        0,              u8ptr:&nfapi_mode,                  defintval:0,           TYPE_UINT8,  0},                     \
-    {"non-stop",            CONFIG_HLP_NONSTOP,      PARAMFLAG_BOOL, iptr:&NON_STOP,                      defintval:0,           TYPE_INT,    0},                     \
+    {"non-stop",             CONFIG_HLP_NONSTOP,      PARAMFLAG_BOOL, iptr:&NON_STOP,                     defintval:0,           TYPE_INT,    0},                     \
   }
 
   
@@ -246,6 +249,7 @@ typedef struct {
   int            hw_timing_advance;
   uint32_t       send_dmrs_sync;
   int            use_256qam_table;
+  int            prb_interpolation;
   uint8_t        nfapi;
   int            non_stop;
 } softmodem_params_t;
diff --git a/nfapi/nrNFAPI.md b/nfapi/nrNFAPI.md
deleted file mode 100644
index 299a43fd9320c807fcafe5cee6ea1989e75778f8..0000000000000000000000000000000000000000
--- a/nfapi/nrNFAPI.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# Procedure to run nFAPI in 5G NR
-
-## Conributed by 5G Testbed IISC 
-### Developers: Sudhakar B,Mahesh K,Gokul S,Aniq U.R
-
-## Procedure to Build gNB and UE
-
-The regular commands to build gNB and UE can be used
-```
-sudo ./build_oai --gNB --UE
-
-```
-## Procedure to run NR nFAPI using RF-Simulator
-
-### VNF command
-```
-sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf --nfapi 2 --noS1 --phy-test
-
-```
-### PNF command
-```
-sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf --nfapi 1 --rfsim --phy-test --rfsimulator.serveraddr server
-
-```
-### UE command
-```
-sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem --rfsim --phy-test --rrc_config_path . -d
-
-```
-## Procedure to run NR nFAPI using Hardware
-Will be updated as we have not yet currently tested on hardware
-
-## Notes
-* In order to acheive the synchronization between VNF and PNF and receive the P7 messages within the timing window the order in which we should run the modules on different terminals is UE->VNF->PNF
-* Currently only downlink is functional and working as we are still working on uplink functionality
diff --git a/nfapi/oai_integration/nfapi_pnf.c b/nfapi/oai_integration/nfapi_pnf.c
index b8912f01993bf30f4bba4f727774c9246b5c90c5..68f9630a49e93897834637dbdfff931e34369b1c 100644
--- a/nfapi/oai_integration/nfapi_pnf.c
+++ b/nfapi/oai_integration/nfapi_pnf.c
@@ -37,8 +37,6 @@
 #include "nfapi_pnf.h"
 #include "common/ran_context.h"
 #include "openair2/PHY_INTERFACE/phy_stub_UE.h"
-//#include "openair1/PHY/vars.h"
-extern RAN_CONTEXT_t RC;
 
 #include <sys/socket.h>
 #include <sys/time.h>
@@ -50,7 +48,7 @@ extern RAN_CONTEXT_t RC;
 
 #include <vendor_ext.h>
 #include "fapi_stub.h"
-//#include "fapi_l1.h"
+
 #include "common/utils/LOG/log.h"
 
 #include "PHY/INIT/phy_init.h"
@@ -59,7 +57,10 @@ extern RAN_CONTEXT_t RC;
 #include "openair1/SCHED_NR/fapi_nr_l1.h"
 #include "openair1/PHY/NR_TRANSPORT/nr_dlsch.h"
 #include "openair1/PHY/defs_gNB.h"
-
+#include <openair1/SCHED/fapi_l1.h>
+#include <openair1/PHY/NR_TRANSPORT/nr_transport_proto.h>
+#include <targets/RT/USER/lte-softmodem.h>
+#include "nfapi/open-nFAPI/pnf/inc/pnf_p7.h"
 
 #define NUM_P5_PHY 2
 
@@ -67,6 +68,7 @@ extern RAN_CONTEXT_t RC;
 
 extern void phy_init_RU(RU_t *);
 extern int config_sync_var;
+extern RAN_CONTEXT_t RC;
 
 extern pthread_cond_t nfapi_sync_cond;
 extern pthread_mutex_t nfapi_sync_mutex;
@@ -74,45 +76,6 @@ extern int nfapi_sync_var;
 
 extern int sync_var;
 
-extern void init_eNB_afterRU(void);
-extern void init_UE_stub(int nb_inst,int,int);
-extern void handle_nfapi_dci_dl_pdu(PHY_VARS_eNB *eNB, int frame, int subframe, L1_rxtx_proc_t *proc, nfapi_dl_config_request_pdu_t *dl_config_pdu);
-extern void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc, nfapi_ul_config_request_pdu_t *ul_config_pdu, uint16_t frame,uint8_t subframe,uint8_t srs_present);
-extern void handle_nfapi_dlsch_pdu(PHY_VARS_eNB *eNB,int frame, int subframe, L1_rxtx_proc_t *proc,  nfapi_dl_config_request_pdu_t *dl_config_pdu, uint8_t codeword_index, uint8_t *sdu);
-extern void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame, int subframe, L1_rxtx_proc_t *proc, nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
-extern void handle_nfapi_hi_dci0_hi_pdu(PHY_VARS_eNB *eNB,int frame, int subframe, L1_rxtx_proc_t *proc, nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
-extern void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc, nfapi_dl_config_request_pdu_t *dl_config_pdu, uint8_t *sdu);
-extern void handle_nfapi_nr_ul_dci_pdu(PHY_VARS_gNB *gNB,
-			       int frame, int slot,
-			       nfapi_nr_ul_dci_request_pdus_t *ul_dci_request_pdu);
-extern void handle_nfapi_nr_pdcch_pdu(PHY_VARS_gNB *gNB,
-			       int frame, int slot,
-			       nfapi_nr_dl_tti_pdcch_pdu *pdcch_pdu);
-extern void handle_nr_nfapi_pdsch_pdu(processingData_L1tx_t *msgTx,
-                            nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
-                            uint8_t *sdu);
-extern void handle_nr_nfapi_ssb_pdu(processingData_L1tx_t *msgTx,int frame,int slot,
-                             nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdu);
-extern void nr_fill_ulsch(PHY_VARS_gNB *gNB,
-                   int frame,
-                   int slot,
-                   nfapi_nr_pusch_pdu_t *ulsch_pdu);
-extern void nr_fill_pucch(PHY_VARS_gNB *gNB,
-                   int frame,
-                   int slot,
-                   nfapi_nr_pucch_pdu_t *pucch_pdu);
-extern void nr_fill_prach(PHY_VARS_gNB *gNB,
-                   int SFN,
-                   int Slot,
-                   nfapi_nr_prach_pdu_t *prach_pdu);
-extern void nr_fill_prach_ru(RU_t *ru,
-                      int SFN,
-                      int Slot,
-                      nfapi_nr_prach_pdu_t *prach_pdu);
-
-
-
-
 nfapi_tx_request_pdu_t *tx_request_pdu[1023][10][10]; // [frame][subframe][max_num_pdus]
 uint8_t nr_tx_pdus[32][16][4096];
 nfapi_nr_pdu_t *tx_data_request[1023][20][10]; //[frame][slot][max_num_pdus]
@@ -1146,18 +1109,14 @@ int pnf_phy_ul_dci_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7,
   
   //   LOG_D(PHY,"[PNF] HI_DCI0_REQUEST SFN/SF:%05d dci:%d hi:%d\n", NFAPI_SFNSF2DEC(req->sfn_sf), req->hi_dci0_request_body.number_of_dci, req->hi_dci0_request_body.number_of_hi);
 
-  //phy_info* phy = (phy_info*)(pnf_p7->user_data);
   struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
   if (proc ==NULL) 
     proc = &gNB->proc.L1_proc;
 
   for (int i=0; i<req->numPdus; i++) {
-    //LOG_D(PHY,"[PNF] HI_DCI0_REQ sfn_sf:%d PDU[%d]\n", NFAPI_SFNSF2DEC(req->sfn_sf), i);
     if (req->ul_dci_pdu_list[i].PDUType == 0) {
-      //LOG_D(PHY,"[PNF] HI_DCI0_REQ sfn_sf:%d PDU[%d] - NFAPI_HI_DCI0_DCI_PDU_TYPE\n", NFAPI_SFNSF2DEC(req->sfn_sf), i);
-       nfapi_nr_ul_dci_request_pdus_t *ul_dci_req_pdu = &req->ul_dci_pdu_list[i]; 
-       int SFN=req->SFN+2;
-      //handle_nfapi_nr_ul_dci_pdu(gNB, SFN, req->Slot, ul_dci_req_pdu); 
+      nfapi_nr_ul_dci_request_pdus_t *ul_dci_req_pdu = &req->ul_dci_pdu_list[i]; 
+      handle_nfapi_nr_ul_dci_pdu(gNB, req->SFN, req->Slot, ul_dci_req_pdu); 
     } 
     else {
       LOG_E(PHY,"[PNF] UL_DCI_REQ sfn_slot:%d PDU[%d] - unknown pdu type:%d\n", NFAPI_SFNSLOT2DEC(req->SFN, req->Slot), i, req->ul_dci_pdu_list[i].PDUType);
@@ -1217,45 +1176,37 @@ int pnf_phy_dl_tti_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7,
 
   int sfn = req->SFN;
   int slot =  req->Slot;
-
   struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
   if (proc==NULL)
      proc = &gNB->proc.L1_proc;
   nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdu_list = req->dl_tti_request_body.dl_tti_pdu_list;
 
-  if (req->dl_tti_request_body.nPDUs)
-    NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() TX:%d/%d RX:%d/%d; sfn:%d, slot:%d, nGroup:%u, nPDUs: %u, nUE: %u, PduIdx: %u,\n",
-                __FUNCTION__, proc->frame_tx, proc->slot_tx, proc->frame_rx, proc->slot_rx, // TODO: change subframes to slot
-                req->SFN,
-                req->Slot,
-                req->dl_tti_request_body.nGroup,
-                req->dl_tti_request_body.nPDUs,
-                req->dl_tti_request_body.nUe,
-                req->dl_tti_request_body.PduIdx);
+    //if (req->dl_tti_request_body.nPDUs)
+    // NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() TX:%d/%d RX:%d/%d; sfn:%d, slot:%d, nGroup:%u, nPDUs: %u, nUE: %u, PduIdx: %u,\n",
+    //             __FUNCTION__, proc->frame_tx, proc->slot_tx, proc->frame_rx, proc->slot_rx, // TODO: change subframes to slot
+    //             req->SFN,
+    //             req->Slot,
+    //             req->dl_tti_request_body.nGroup,
+    //             req->dl_tti_request_body.nPDUs,
+    //             req->dl_tti_request_body.nUe,
+    //             req->dl_tti_request_body.PduIdx);
 
   for (int i=0; i<req->dl_tti_request_body.nPDUs; i++) {
-    // TODO: enable after adding gNB PDCCH:
     // NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sfn/sf:%d PDU[%d] size:%d pdcch_vars->num_dci:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), i, dl_config_pdu_list[i].pdu_size,pdcch_vars->num_dci);
 
     if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE) {
       nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdu=&dl_tti_pdu_list[i];
-      memcpy(dl_tti_pdu,&dl_tti_pdu_list[i],sizeof(nfapi_nr_dl_tti_request_pdu_t));
-      int SFN=sfn+2;
-      //handle_nfapi_nr_pdcch_pdu(gNB, SFN, slot, &dl_tti_pdu->pdcch_pdu);
-      //dl_tti_pdu_list[i].pdcch_pdu.pdcch_pdu_rel15.numDlDci++; // ?
-      // NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() pdcch_vars->num_dci:%d\n", __FUNCTION__, pdcch_vars->num_dci);
-    } else if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_SSB_PDU_TYPE) {
-        //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() PDU:%d BCH: pdu_index:%u pdu_length:%d sdu_length:%d BCH_SDU:%x,%x,%x\n", __FUNCTION__, i, pdu_index, bch_pdu->bch_pdu_rel8.length, tx_request_pdu[sfn][sf][pdu_index]->segments[0].segment_length, sdu[0], sdu[1], sdu[2]);
-        //handle_nr_nfapi_ssb_pdu(gNB, sfn, slot, &dl_tti_pdu_list[i]);
-        gNB->pbch_configured=1;
-      //} else {
-        // NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() BCH NULL TX PDU SFN/SF:%d PDU_INDEX:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pdu_index);
-      //}
-    } else if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE) {
+      handle_nfapi_nr_pdcch_pdu(gNB, sfn, slot, &dl_tti_pdu->pdcch_pdu);
+    } 
+    else if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_SSB_PDU_TYPE) {
+      //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() PDU:%d BCH: pdu_index:%u pdu_length:%d sdu_length:%d BCH_SDU:%x,%x,%x\n", __FUNCTION__, i, pdu_index, bch_pdu->bch_pdu_rel8.length, tx_request_pdu[sfn][sf][pdu_index]->segments[0].segment_length, sdu[0], sdu[1], sdu[2]);
+      handle_nr_nfapi_ssb_pdu(gNB, sfn, slot, &dl_tti_pdu_list[i]);
+      gNB->pbch_configured=1;
+    } 
+    else if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE) {
       nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu = &dl_tti_pdu_list[i].pdsch_pdu;
-      nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15_pdu = &pdsch_pdu->pdsch_pdu_rel15;
-      //nfapi_nr_tx_data_request_t *tx_data = tx_data_request[sfn][slot][rel15_pdu->pduIndex];
-      nfapi_nr_pdu_t *tx_data = tx_data_request[sfn][slot][0];
+      nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15_pdu = &pdsch_pdu->pdsch_pdu_rel15;     
+      nfapi_nr_pdu_t *tx_data = tx_data_request[sfn][slot][rel15_pdu->pduIndex];
 
       if (tx_data != NULL) {
         int UE_id = 0;//find_nr_dlsch(rel15_pdu->rnti,gNB,SEARCH_EXIST_OR_FREE);
@@ -1268,14 +1219,21 @@ int pnf_phy_dl_tti_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7,
           LOG_E(PHY,"pnf_phy_dl_config_req illegal harq_pid %d\n", harq_pid);
           return(-1);
         }
-        //uint8_t *dlsch_sdu = (uint8_t *)tx_data->TLVs[0].value.direct;
+
         uint8_t *dlsch_sdu = nr_tx_pdus[UE_id][harq_pid];
-       memcpy(dlsch_sdu, tx_data->TLVs[0].value.direct,tx_data->PDU_length);//TODO: Check if required
+        memcpy(dlsch_sdu, tx_data->TLVs[0].value.direct,tx_data->PDU_length);
         //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() DLSCH:pdu_index:%d handle_nfapi_dlsch_pdu(eNB, proc_rxtx, dlsch_pdu, transport_blocks:%d sdu:%p) eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols:%d\n", __FUNCTION__, rel8_pdu->pdu_index, rel8_pdu->transport_blocks, dlsch_sdu, eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols);
-        //handle_nr_nfapi_pdsch_pdu(gNB, sfn, slot,pdsch_pdu, dlsch_sdu);
-       } else {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() DLSCH NULL TX PDU SFN/SF:%d PDU_INDEX:%d\n", __FUNCTION__, NFAPI_SFNSLOT2DEC(sfn,slot), rel15_pdu->pduIndex);     }
-    } else {
+        handle_nr_nfapi_pdsch_pdu(gNB, sfn, slot,pdsch_pdu, dlsch_sdu);
+      } 
+      else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() DLSCH NULL TX PDU SFN/SF:%d PDU_INDEX:%d\n", __FUNCTION__, NFAPI_SFNSLOT2DEC(sfn,slot), rel15_pdu->pduIndex);     
+      }
+    }
+    else if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE) {
+      nfapi_nr_dl_tti_csi_rs_pdu *csi_rs_pdu = &dl_tti_pdu_list[i].csi_rs_pdu;
+      handle_nfapi_nr_csirs_pdu(gNB, sfn, slot, csi_rs_pdu);
+    }
+    else {
       NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() UNKNOWN:%d\n", __FUNCTION__, dl_tti_pdu_list[i].PDUType);
     }
   }
@@ -1435,13 +1393,10 @@ int pnf_phy_tx_req(nfapi_pnf_p7_config_t *pnf_p7, nfapi_tx_request_t *req) {
 
 
 int pnf_phy_ul_tti_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_ul_tti_request_t *req) {
-  // if (0)LOG_D(PHY,"[PNF] UL_CONFIG_REQ %s() sfn_sf:%d pdu:%d rach_prach_frequency_resources:%d srs_present:%u\n",
-  //               __FUNCTION__,
-  //               NFAPI_SFNSF2DEC(req->sfn_sf),
-  //               req->ul_config_request_body.number_of_pdus,
-  //               req->ul_config_request_body.rach_prach_frequency_resources,
-  //               req->ul_config_request_body.srs_present
-  //              );
+  LOG_D(PHY,"[PNF] UL_TTI_REQ recvd, writing into structs, SFN/slot:%d.%d pdu:%d \n",
+                req->SFN,req->Slot,
+                req->n_pdus
+               );
 
   if (RC.ru == 0) {
     return -1;
@@ -2198,7 +2153,7 @@ void configure_nr_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_add
   pnf.phys[0].udp.tx_port = vnf_p7_port;
   strcpy(pnf.phys[0].udp.tx_addr, vnf_ip_addr);
   strcpy(pnf.phys[0].local_addr, pnf_ip_addr);
-  printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%u rx:%u]\n",
+  printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%d rx:%d]\n",
          __FUNCTION__,config->vnf_ip_addr, config->vnf_p5_port,
          pnf.phys[0].local_addr,
          pnf.phys[0].udp.tx_addr, pnf.phys[0].udp.tx_port,
@@ -2249,7 +2204,7 @@ void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr,
   pnf.phys[0].udp.tx_port = vnf_p7_port;
   strcpy(pnf.phys[0].udp.tx_addr, vnf_ip_addr);
   strcpy(pnf.phys[0].local_addr, pnf_ip_addr);
-  printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%u rx:%u]\n",
+  printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%d rx:%d]\n",
          __FUNCTION__,
          config->vnf_ip_addr, config->vnf_p5_port,
          pnf.phys[0].local_addr,
@@ -2308,50 +2263,24 @@ void oai_subframe_ind(uint16_t sfn, uint16_t sf) {
   }
 }
 
+void handle_nr_slot_ind(uint16_t sfn, uint16_t slot) {
 
-long shift_ns,prev_ts_nsec,shift_us;
-void oai_slot_ind(uint16_t sfn, uint16_t slot) {
-  
-  //slow down PNF
-  
-  LOG_D(PHY,"%s(sfn:%d, slot:%d)\n", __FUNCTION__, sfn, slot);
-  struct timespec ts;
-      clock_gettime(CLOCK_MONOTONIC, &ts);
-  
-  // if (!(sfn == 0 && slot == 0) && ts.tv_nsec > prev_ts_nsec){
-  //   shift_ns = ts.tv_nsec - prev_ts_nsec;
-  //   shift_us = shift_ns/1000;
-  //   printf("previous: %d, current: %d, shift: %d", prev_ts_nsec, ts.tv_nsec, shift_us);
-  //   if(500-shift_us > 0)
-  //     usleep(500-shift_us);
-  //  // usleep(50);
-  // }
-  prev_ts_nsec = ts.tv_nsec;
-  
-  
-//NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] %s %d.%d (sfn:%u slot:%u) SFN/SLOT(TX):%u\n", __FUNCTION__, ts.tv_sec, ts.tv_nsec, sfn, slot, NFAPI_SFNSLOT2DEC(sfn, slot));
-  //TODO FIXME - HACK - DJP - using a global to bodge it in
-  if (p7_config_g != NULL && sync_var==0) {
-    // DONE: changed for NR  x x   x x x x   x x x x  x x x x  - - - - - - : x (Frame), - (Slot) (max_numer =2)
-    uint16_t sfn_slot_tx = sfn<<6 | slot; 
-    // if ((sfn % 100 == 0) && slot==0) { // DOUBT: Why 100?
-    //   struct timespec ts;
-    //   clock_gettime(CLOCK_MONOTONIC, &ts);
-    //   NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] %s %d.%d (sfn:%u slot:%u) SFN/SLOT(TX):%u\n", __FUNCTION__, ts.tv_sec, ts.tv_nsec, sfn, slot, NFAPI_SFNSLOT2DEC(sfn, slot));
-    // }
-    
-    //TODO: send p7_config instead of p7_config_g
-    int slot_ret = nfapi_pnf_p7_slot_ind(p7_config_g, p7_config_g->phy_id, sfn, slot); 
+    //send VNF slot indication, which is aligned with TX thread, so that it can call the scheduler
+    nfapi_nr_slot_indication_scf_t *ind;
+    ind = (nfapi_nr_slot_indication_scf_t *) malloc(sizeof(nfapi_nr_slot_indication_scf_t));
+    uint8_t slot_ahead = 6;
+    uint32_t sfn_slot_tx = sfnslot_add_slot(sfn, slot, slot_ahead);
+    uint16_t sfn_tx = NFAPI_SFNSLOT2SFN(sfn_slot_tx);
+    uint8_t slot_tx = NFAPI_SFNSLOT2SLOT(sfn_slot_tx);
 
-    // if (subframe_ret) {
-    if (slot_ret) { 
-      NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] %s(frame:%u slot:%u) SFN/SLOT(TX):%u - PROBLEM with pnf_p7_slot_ind()\n", __FUNCTION__, sfn, slot, sfn_slot_tx, NFAPI_SFNSLOT2DEC(sfn, slot));
-      // printing anything causes error: probably because there isn't enough time to accomodate a print statement
-    } else {
-      //NFAPI_TRACE(NFAPI_TRACE_INFO, "***NFAPI subframe handler finished *** \n");
-    }
-  } else {
-  }
+    ind->sfn = sfn_tx;
+    ind->slot = slot_tx;
+    oai_nfapi_nr_slot_indication(ind); 
+
+    //copy data from appropriate p7 slot buffers into channel structures for PHY processing
+    nfapi_pnf_p7_slot_ind(p7_config_g, p7_config_g->phy_id, sfn, slot); 
+
+    return;
 }
 
 int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind) {
@@ -2402,3 +2331,42 @@ int oai_nfapi_sr_indication(nfapi_sr_indication_t *ind) {
   //free(ind.rx_indication_body.rx_pdu_list);
   return retval;
 }
+
+//NR UPLINK INDICATION
+
+int oai_nfapi_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind) {
+  ind->header.phy_id = 1;
+  ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION;
+  return nfapi_pnf_p7_nr_slot_ind(p7_config_g, ind);
+}
+
+int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) {
+  ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
+  ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION;
+  return nfapi_pnf_p7_nr_rx_data_ind(p7_config_g, ind);
+}
+
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind) {
+  ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
+  ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION;
+  return nfapi_pnf_p7_nr_crc_ind(p7_config_g, ind);
+}
+
+int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind) {
+  ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
+  ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION;
+  return nfapi_pnf_p7_nr_srs_ind(p7_config_g, ind);
+}
+
+int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind) {
+  ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
+  ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION;
+  return nfapi_pnf_p7_nr_uci_ind(p7_config_g, ind);
+}
+
+int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind) {
+  ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
+  ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION;
+  return nfapi_pnf_p7_nr_rach_ind(p7_config_g, ind);
+}
+
diff --git a/nfapi/oai_integration/nfapi_pnf.h b/nfapi/oai_integration/nfapi_pnf.h
index 61d4847ebab2a70196366753135a846d6efb96f5..b7ebdb36eae1d22befc314098078ab7618cc51db 100644
--- a/nfapi/oai_integration/nfapi_pnf.h
+++ b/nfapi/oai_integration/nfapi_pnf.h
@@ -19,13 +19,20 @@
  *      contact@openairinterface.org
  */
 
-#if !defined(NFAPI_PNF_H__)
-#define NFAPI_PNF_H__
+
 extern nfapi_ue_release_request_body_t release_rntis;
 int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind);
 void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port);
 void configure_nr_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port);
 
 void oai_subframe_ind(uint16_t sfn, uint16_t sf);
-void oai_slot_ind(uint16_t sfn, uint16_t slot);
-#endif
+void handle_nr_slot_ind(uint16_t sfn, uint16_t slot);
+uint32_t sfnslot_add_slot(uint16_t sfn, uint16_t slot, int offset);
+
+int oai_nfapi_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind);
+int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind);
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind);
+int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind);
+int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind);
+int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind);
+
diff --git a/nfapi/oai_integration/nfapi_vnf.c b/nfapi/oai_integration/nfapi_vnf.c
index 485f17922fed1584dca1aca2b574c7b952b50ad4..d96829e127756976157f746ea5176fd7b35378bf 100644
--- a/nfapi/oai_integration/nfapi_vnf.c
+++ b/nfapi/oai_integration/nfapi_vnf.c
@@ -33,13 +33,14 @@
 
 #include "nfapi_nr_interface_scf.h"
 #include "nfapi_vnf_interface.h"
+#include "nfapi_vnf.h"
 #include "nfapi.h"
 #include "vendor_ext.h"
 
-#include "nfapi_vnf.h"
 #include "PHY/defs_eNB.h"
 #include "PHY/LTE_TRANSPORT/transport_proto.h"
 #include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
+#include <targets/RT/USER/lte-softmodem.h>
 
 #include "common/ran_context.h"
 
@@ -196,7 +197,6 @@ int vnf_unpack_vendor_extension_tlv(nfapi_tl_t *tl, uint8_t **ppReadPackedMessag
 void install_nr_schedule_handlers(NR_IF_Module_t *if_inst);
 void install_schedule_handlers(IF_Module_t *if_inst);
 extern int single_thread_flag;
-extern void init_eNB_afterRU(void);
 extern uint16_t sf_ahead;
 extern uint16_t slot_ahead;
 
@@ -239,6 +239,18 @@ void oai_enb_init(void) {
 
 void oai_create_gnb(void) {
   int bodge_counter=0;
+
+  if (RC.gNB == NULL) {
+    RC.gNB = (PHY_VARS_gNB **) calloc(1, sizeof(PHY_VARS_gNB *));
+    LOG_I(PHY,"gNB L1 structure RC.gNB allocated @ %p\n",RC.gNB);
+  }
+
+
+  if (RC.gNB[0] == NULL) {
+    RC.gNB[0] = (PHY_VARS_gNB *) calloc(1, sizeof(PHY_VARS_gNB));
+    LOG_I(PHY,"[nr-gnb.c] gNB structure RC.gNB[%d] allocated @ %p\n",0,RC.gNB[0]);
+  }
+  
   PHY_VARS_gNB *gNB = RC.gNB[0];
   RC.nb_nr_CC = (int *)malloc(sizeof(int)); // TODO: find a better function to place this in
   
@@ -584,7 +596,7 @@ extern pthread_mutex_t nfapi_sync_mutex;
 extern int nfapi_sync_var;
 
 int phy_sync_indication(struct nfapi_vnf_p7_config *config, uint8_t sync) {
-  printf("[VNF] SYNC %s\n", sync==1 ? "ACHIEVED" : "LOST");
+  //printf("[VNF] SYNC %s\n", sync==1 ? "ACHIEVED" : "LOST");
 
   if (sync==1 && nfapi_sync_var!=0) {
     
@@ -1002,6 +1014,124 @@ int phy_cqi_indication(struct nfapi_vnf_p7_config *config, nfapi_cqi_indication_
   return 1;
 }
 
+//NR phy indication
+
+int phy_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind) {
+  
+  uint8_t vnf_slot_ahead = 2;
+  uint32_t vnf_sfn_slot = sfnslot_add_slot(ind->sfn, ind->slot, vnf_slot_ahead);
+	uint16_t vnf_sfn = NFAPI_SFNSLOT2SFN(vnf_sfn_slot);
+	uint8_t vnf_slot = NFAPI_SFNSLOT2SLOT(vnf_sfn_slot); //offsetting the vnf from pnf by vnf_slot_head slots
+  struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
+  pthread_mutex_lock(&gNB->UL_INFO_mutex);
+  gNB->UL_INFO.frame     = vnf_sfn;
+	gNB->UL_INFO.slot      = vnf_slot;	
+  pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+  LOG_D(MAC, "VNF SFN/Slot %d.%d \n", gNB->UL_INFO.frame, gNB->UL_INFO.slot);
+
+  return 1;
+}
+
+int phy_nr_crc_indication(nfapi_nr_crc_indication_t *ind) {
+  struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
+  pthread_mutex_lock(&gNB->UL_INFO_mutex);
+
+  gNB->UL_INFO.crc_ind = *ind;
+
+  if (ind->number_crcs > 0)
+    gNB->UL_INFO.crc_ind.crc_list = malloc(sizeof(nfapi_nr_crc_t)*ind->number_crcs);
+
+  for (int i=0; i<ind->number_crcs; i++)
+    memcpy(&gNB->UL_INFO.crc_ind.crc_list[i], &ind->crc_list[i], sizeof(ind->crc_list[0]));
+
+  pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+
+  return 1;
+}
+
+int phy_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) {
+  struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
+  pthread_mutex_lock(&gNB->UL_INFO_mutex);
+
+  gNB->UL_INFO.rx_ind = *ind;
+
+  if (ind->number_of_pdus > 0)
+    gNB->UL_INFO.rx_ind.pdu_list = malloc(sizeof(nfapi_nr_rx_data_pdu_t)*ind->number_of_pdus);
+
+  for (int i=0; i<ind->number_of_pdus; i++) 
+    memcpy(&gNB->UL_INFO.rx_ind.pdu_list[i], &ind->pdu_list[i], sizeof(ind->pdu_list[0]));
+
+
+  pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+
+  return 1;
+}
+
+int phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind) {
+  struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
+  pthread_mutex_lock(&gNB->UL_INFO_mutex);
+
+  gNB->UL_INFO.uci_ind = *ind;
+
+  if (ind->num_ucis > 0)
+    gNB->UL_INFO.uci_ind.uci_list = malloc(sizeof(nfapi_nr_uci_t)*ind->num_ucis);
+
+  for (int i=0; i<ind->num_ucis; i++)
+    memcpy(&gNB->UL_INFO.uci_ind.uci_list[i], &ind->uci_list[i], sizeof(ind->uci_list[0]));
+  //printf("UCI ind written to UL_info: num_ucis: %d, PDU_type : %d. \n", ind->num_ucis, ind->uci_list[0].pdu_type);
+  pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+
+  return 1;
+}
+
+int phy_nr_srs_indication(nfapi_nr_srs_indication_t *ind) {
+  struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
+  pthread_mutex_lock(&gNB->UL_INFO_mutex);
+
+  gNB->UL_INFO.srs_ind = *ind;
+
+  if (ind->number_of_pdus > 0)
+    gNB->UL_INFO.srs_ind.pdu_list = malloc(sizeof(nfapi_nr_srs_indication_pdu_t)*ind->number_of_pdus);
+
+  for (int i=0; i<ind->number_of_pdus; i++) {
+    memcpy(&gNB->UL_INFO.srs_ind.pdu_list[i], &ind->pdu_list[i], sizeof(ind->pdu_list[0]));
+
+    LOG_D(MAC, "%s() NFAPI SFN/Slot:%d.%d SRS_IND:number_of_pdus:%d UL_INFO:pdus:%d\n",
+        __FUNCTION__,
+        ind->sfn,ind->slot, ind->number_of_pdus, gNB->UL_INFO.srs_ind.number_of_pdus
+        );
+  }
+
+  pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+
+  return 1;
+}
+
+int phy_nr_rach_indication(nfapi_nr_rach_indication_t *ind) {
+  struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
+  pthread_mutex_lock(&gNB->UL_INFO_mutex);
+
+  gNB->UL_INFO.rach_ind = *ind;
+
+  if (ind->number_of_pdus > 0)
+    gNB->UL_INFO.rach_ind.pdu_list = malloc(sizeof(nfapi_nr_prach_indication_pdu_t)*ind->number_of_pdus);
+
+  for (int i=0; i<ind->number_of_pdus; i++) {
+    memcpy(&gNB->UL_INFO.rach_ind.pdu_list[i], &ind->pdu_list[i], sizeof(ind->pdu_list[0]));
+
+    LOG_D(MAC, "%s() NFAPI SFN/Slot:%d.%d RACH_IND:number_of_pdus:%d UL_INFO:pdus:%d\n",
+        __FUNCTION__,
+        ind->sfn,ind->slot, ind->number_of_pdus, gNB->UL_INFO.rach_ind.number_of_pdus
+        );
+  }
+
+  pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+
+  return 1;
+}
+
+//end NR phy indication
+
 int phy_lbt_dl_indication(struct nfapi_vnf_p7_config *config, nfapi_lbt_dl_indication_t *ind) {
   // vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data);
   //mac_lbt_dl_ind(p7_vnf->mac, ind);
@@ -1167,6 +1297,12 @@ void *vnf_nr_p7_thread_start(void *ptr) {
   p7_vnf->config->lbt_dl_indication = &phy_lbt_dl_indication;
   p7_vnf->config->nb_harq_indication = &phy_nb_harq_indication;
   p7_vnf->config->nrach_indication = &phy_nrach_indication;
+  p7_vnf->config->nr_crc_indication = &phy_nr_crc_indication;
+  p7_vnf->config->nr_slot_indication = &phy_nr_slot_indication;  
+  p7_vnf->config->nr_rx_data_indication = &phy_nr_rx_data_indication;
+  p7_vnf->config->nr_uci_indication = &phy_nr_uci_indication;
+  p7_vnf->config->nr_rach_indication = &phy_nr_rach_indication;
+  p7_vnf->config->nr_srs_indication = &phy_nr_srs_indication;
   p7_vnf->config->malloc = &vnf_allocate;
   p7_vnf->config->free = &vnf_deallocate;
   p7_vnf->config->trace = &vnf_trace;
@@ -1501,8 +1637,8 @@ void configure_nr_nfapi_vnf(char *vnf_addr, int vnf_p5_port) {
   nfapi_setmode(NFAPI_MODE_VNF);
   memset(&vnf, 0, sizeof(vnf));
   memset(vnf.p7_vnfs, 0, sizeof(vnf.p7_vnfs));
-  vnf.p7_vnfs[0].timing_window = 32;
-  vnf.p7_vnfs[0].periodic_timing_enabled = 1;
+  vnf.p7_vnfs[0].timing_window = 30;
+  vnf.p7_vnfs[0].periodic_timing_enabled = 0;
   vnf.p7_vnfs[0].aperiodic_timing_enabled = 0;
   vnf.p7_vnfs[0].periodic_timing_period = 10;
   vnf.p7_vnfs[0].config = nfapi_vnf_p7_config_create();
@@ -1620,7 +1756,7 @@ int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req)
   //LOG_I(PHY, "sfn:%d,slot:%d\n",dl_config_req->SFN,dl_config_req->Slot);
   //printf("\nEntering oai_nfapi_nr_dl_config_req sfn:%d,slot:%d\n",dl_config_req->SFN,dl_config_req->Slot);
   nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
-   dl_config_req->header.message_id= NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST;
+  dl_config_req->header.message_id= NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST;
   dl_config_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
 
   int retval = nfapi_vnf_p7_nr_dl_config_req(p7_config, dl_config_req);
diff --git a/nfapi/oai_integration/nfapi_vnf.h b/nfapi/oai_integration/nfapi_vnf.h
index f4fd6a2bf9a221460cab3b2992bda0856a268fe0..478956f75cd8476a97028a409c839b6af3c4afa8 100644
--- a/nfapi/oai_integration/nfapi_vnf.h
+++ b/nfapi/oai_integration/nfapi_vnf.h
@@ -19,9 +19,9 @@
  *      contact@openairinterface.org
  */
 
-#if !defined(NFAPI_VNF_H__)
-#define NFAPI_VNF_H__
 
 void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port);
 void configure_nr_nfapi_vnf(char *vnf_addr, int vnf_p5_port);
-#endif
+
+uint32_t sfnslot_add_slot(uint16_t sfn, uint16_t slot, int offset);
+
diff --git a/nfapi/open-nFAPI/common/src/debug.c b/nfapi/open-nFAPI/common/src/debug.c
index f53be43223f132a2f43bc3c3d69e2f0760f730e5..a45d41d7d7218f806869f6fda7dd9c628b893d9a 100644
--- a/nfapi/open-nFAPI/common/src/debug.c
+++ b/nfapi/open-nFAPI/common/src/debug.c
@@ -1,76 +1,76 @@
-/*
- * Copyright 2017 Cisco Systems, Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- * 
- * 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.
- */
-
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <pthread.h>
-#include <syslog.h>
-
-#include <debug.h>
-
-#define MAX_MSG_LENGTH 			2096
-#define TRACE_HEADER_LENGTH		44
-
-void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...);
-
-// initialize the trace function to 0
-void (*nfapi_trace_g)(nfapi_trace_level_t level, const char* format, ...) = &nfapi_trace_dbg;
-
-nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_INFO;
-//nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_WARN;
-
-void nfapi_set_trace_level(nfapi_trace_level_t new_level)
-{
-	nfapi_trace_level_g = new_level;
-}
-
-void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...)
-{
-	char trace_buff[MAX_MSG_LENGTH + TRACE_HEADER_LENGTH];
-	uint32_t num_chars;
-	va_list p_args;
-	struct timeval tv;
-	pthread_t tid = pthread_self();
-
-	(void)gettimeofday(&tv, NULL);
-
-	num_chars = (uint32_t)snprintf(trace_buff, TRACE_HEADER_LENGTH, "%04u.%06u: 0x%02x: %10u: ", ((uint32_t)tv.tv_sec) & 0x1FFF, (uint32_t)tv.tv_usec, (uint32_t)level, (uint32_t)tid);
-
-	if (num_chars > TRACE_HEADER_LENGTH)
-	{
-		printf("trace_dbg: Error, num_chars is too large: %u", num_chars);
-		return;
-	}
-
-	va_start(p_args, format);
-	if ((num_chars = (uint32_t)vsnprintf(&trace_buff[num_chars], MAX_MSG_LENGTH, format, p_args)))
-	{
-		if (level <= NFAPI_TRACE_WARN)
-		{
-			printf("%s", trace_buff);
-		}
-		printf("%s", trace_buff);
-	}
-	va_end(p_args);
-}
+/*
+ * Copyright 2017 Cisco Systems, Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ * 
+ * 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.
+ */
+
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <pthread.h>
+#include <syslog.h>
+
+#include <debug.h>
+
+#define MAX_MSG_LENGTH 			2096
+#define TRACE_HEADER_LENGTH		44
+
+void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...);
+
+// initialize the trace function to 0
+void (*nfapi_trace_g)(nfapi_trace_level_t level, const char* format, ...) = &nfapi_trace_dbg;
+
+nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_INFO;
+//nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_WARN;
+
+void nfapi_set_trace_level(nfapi_trace_level_t new_level)
+{
+	nfapi_trace_level_g = new_level;
+}
+
+void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...)
+{
+	char trace_buff[MAX_MSG_LENGTH + TRACE_HEADER_LENGTH];
+	uint32_t num_chars;
+	va_list p_args;
+	struct timeval tv;
+	pthread_t tid = pthread_self();
+
+	(void)gettimeofday(&tv, NULL);
+
+	num_chars = (uint32_t)snprintf(trace_buff, TRACE_HEADER_LENGTH, "%04u.%06u: 0x%02x: %10u: ", ((uint32_t)tv.tv_sec) & 0x1FFF, (uint32_t)tv.tv_usec, (uint32_t)level, (uint32_t)tid);
+
+	if (num_chars > TRACE_HEADER_LENGTH)
+	{
+		printf("trace_dbg: Error, num_chars is too large: %d", num_chars);
+		return;
+	}
+
+	va_start(p_args, format);
+	if ((num_chars = (uint32_t)vsnprintf(&trace_buff[num_chars], MAX_MSG_LENGTH, format, p_args)))
+	{
+		if (level <= NFAPI_TRACE_WARN)
+		{
+			printf("%s", trace_buff);
+		}
+		printf("%s", trace_buff);
+	}
+	va_end(p_args);
+}
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
index c0abf6acb041f7cfa4d0358c5e3daf0ffcdfabbf..e1bb2579eb056cfb686307bea53ddf7a893890ba 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
@@ -101,6 +101,8 @@ typedef struct {
 
 
 typedef struct {
+  uint8_t harq_pid;
+  uint8_t ack_nack;
   uint32_t pdu_length;
   uint8_t* pdu;
 } fapi_nr_pdsch_pdu_t;
@@ -112,20 +114,14 @@ typedef struct {
   uint8_t ssb_length;
   uint16_t cell_id;
   uint16_t ssb_start_subcarrier;
+  short rsrp_dBm;
 } fapi_nr_ssb_pdu_t;
 
-typedef struct {
-  uint32_t pdu_length;
-  uint8_t* pdu;
-  uint32_t sibs_mask;
-} fapi_nr_sib_pdu_t;
-
 typedef struct {
   uint8_t pdu_type;
   union {
     fapi_nr_pdsch_pdu_t pdsch_pdu;
     fapi_nr_ssb_pdu_t ssb_pdu;
-    fapi_nr_sib_pdu_t sib_pdu;
   };
 } fapi_nr_rx_indication_body_t;
 
@@ -187,87 +183,33 @@ typedef struct {
 } fapi_nr_ul_config_prach_pdu;
 
 typedef struct {
-
-        pucch_format_nr_t      format;              /* format   0    1    2    3    4    */
-        uint8_t                initialCyclicShift;  /*          x    x                   */
-        uint8_t                nrofSymbols;         /*          x    x    x    x    x    */
-        uint8_t                startingSymbolIndex; /*          x    x    x    x    x    */
-        uint8_t                timeDomainOCC;       /*               x                   */
-        uint8_t                nrofPRBs;            /*                    x    x         */
-        uint16_t               startingPRB;         /*                                     maxNrofPhysicalResourceBlocks  = 275 */
-        uint8_t                occ_length;          /*                              x    */
-        uint8_t                occ_Index;           /*                              x    */
-
-        feature_status_t       intraSlotFrequencyHopping;
-        uint16_t               secondHopPRB;
-
-        /*
-         -- Enabling inter-slot frequency hopping when PUCCH Format 1, 3 or 4 is repeated over multiple slots.
-         -- The field is not applicable for format 2.
-         */
-        feature_status_t       interslotFrequencyHopping;
-        /*
-            -- Enabling 2 DMRS symbols per hop of a PUCCH Format 3 or 4 if both hops are more than X symbols when FH is enabled (X=4).
-            -- Enabling 4 DMRS sybmols for a PUCCH Format 3 or 4 with more than 2X+1 symbols when FH is disabled (X=4).
-            -- Corresponds to L1 parameter 'PUCCH-F3-F4-additional-DMRS' (see 38.213, section 9.2.1)
-            -- The field is not applicable for format 1 and 2.
-        */
-        enable_feature_t       additionalDMRS;
-        /*
-            -- Max coding rate to determine how to feedback UCI on PUCCH for format 2, 3 or 4
-            -- Corresponds to L1 parameter 'PUCCH-F2-maximum-coderate', 'PUCCH-F3-maximum-coderate' and 'PUCCH-F4-maximum-coderate'
-            -- (see 38.213, section 9.2.5)
-            -- The field is not applicable for format 1.
-         */
-        PUCCH_MaxCodeRate_t    maxCodeRate;
-        /*
-            -- Number of slots with the same PUCCH F1, F3 or F4. When the field is absent the UE applies the value n1.
-            -- Corresponds to L1 parameter 'PUCCH-F1-number-of-slots', 'PUCCH-F3-number-of-slots' and 'PUCCH-F4-number-of-slots'
-            -- (see 38.213, section 9.2.6)
-            -- The field is not applicable for format 2.
-         */
-        uint8_t                nrofSlots;
-        /*
-            -- Enabling pi/2 BPSK for UCI symbols instead of QPSK for PUCCH.
-            -- Corresponds to L1 parameter 'PUCCH-PF3-PF4-pi/2PBSK' (see 38.213, section 9.2.5)
-            -- The field is not applicable for format 1 and 2.
-         */
-        feature_status_t       pi2PBSK;
-        /*
-            -- Enabling simultaneous transmission of CSI and HARQ-ACK feedback with or without SR with PUCCH Format 2, 3 or 4
-            -- Corresponds to L1 parameter 'PUCCH-F2-Simultaneous-HARQ-ACK-CSI', 'PUCCH-F3-Simultaneous-HARQ-ACK-CSI' and
-            -- 'PUCCH-F4-Simultaneous-HARQ-ACK-CSI' (see 38.213, section 9.2.5)
-            -- When the field is absent the UE applies the value OFF
-            -- The field is not applicable for format 1.
-         */
-        enable_feature_t       simultaneousHARQ_ACK_CSI;
-        /*
-              -- Configuration of group- and sequence hopping for all the PUCCH formats 0, 1, 3 and 4. "neither" implies neither group
-              -- or sequence hopping is enabled. "enable" enables group hopping and disables sequence hopping. "disable"” disables group
-              -- hopping and enables sequence hopping. Corresponds to L1 parameter 'PUCCH-GroupHopping' (see 38.211, section 6.4.1.3)
-              pucch-GroupHopping            ENUMERATED { neither, enable, disable },
-         */
-        pucch_GroupHopping_t   pucch_GroupHopping;
-        /*
-              -- Cell-Specific scrambling ID for group hoppping and sequence hopping if enabled.
-              -- Corresponds to L1 parameter 'HoppingID' (see 38.211, section 6.3.2.2)
-              hoppingId               BIT STRING (SIZE (10))                              OPTIONAL,   -- Need R
-         */
-        uint16_t               hoppingId;
-        /*
-              -- Power control parameter P0 for PUCCH transmissions. Value in dBm. Only even values (step size 2) allowed.
-              -- Corresponds to L1 parameter 'p0-nominal-pucch' (see 38.213, section 7.2)
-              p0-nominal                INTEGER (-202..24)                                OPTIONAL,   -- Need R
-         */
-        int8_t                 p0_nominal;
-
-        int8_t                 deltaF_PUCCH_f[NUMBER_PUCCH_FORMAT_NR];
-        uint8_t                p0_PUCCH_Id;     /* INTEGER (1..8)     */
-        int8_t                 p0_PUCCH_Value;
-        // pathlossReferenceRSs        SEQUENCE (SIZE (1..maxNrofPUCCH-PathlossReferenceRSs)) OF PUCCH-PathlossReferenceRS OPTIONAL, -- Need M
-        int8_t                 twoPUCCH_PC_AdjustmentStates;
-
-    } fapi_nr_ul_config_pucch_pdu;
+  uint16_t rnti;
+  uint16_t bwp_size;
+  uint16_t bwp_start;
+  uint8_t format_type;
+  uint8_t start_symbol_index;
+  uint8_t nr_of_symbols;
+  uint16_t prb_start;
+  uint16_t prb_size;
+  uint32_t hopping_id;
+  uint8_t freq_hop_flag;
+  uint8_t group_hop_flag;
+  uint8_t sequence_hop_flag;
+  uint16_t second_hop_prb;
+  uint16_t initial_cyclic_shift;
+  uint8_t time_domain_occ_idx;
+  uint8_t add_dmrs_flag;
+  uint16_t dmrs_scrambling_id;
+  uint16_t data_scrambling_id;
+  uint8_t dmrs_cyclic_shift;
+  uint8_t pi_2bpsk;
+  uint8_t mcs;
+  uint8_t pre_dft_occ_idx;
+  uint8_t pre_dft_occ_len;
+  int16_t pucch_tx_power;
+  uint32_t n_bit;
+  uint64_t payload;
+} fapi_nr_ul_config_pucch_pdu;
 
 typedef struct
 {
@@ -459,11 +401,8 @@ typedef struct {
   uint8_t tb2_rv;
   uint8_t harq_process_nbr;
   vrb_to_prb_mapping_t vrb_to_prb_mapping;
-  uint8_t dai;
   double scaling_factor_S;
   int8_t accumulated_delta_PUCCH;
-  uint8_t pucch_resource_id;
-  uint8_t pdsch_to_harq_feedback_time_ind;
   uint8_t n_dmrs_cdm_groups;
   uint8_t dmrs_ports[10];
   uint8_t n_front_load_symb;
@@ -510,437 +449,6 @@ typedef struct {
 } fapi_nr_dl_config_request_t;
 
 
-//
-// P5
-//
-
-    
-
-typedef struct {
-  fapi_nr_coreset_t coreset;
-
-  uint8_t monitoring_slot_peridicity;
-  uint8_t monitoring_slot_offset;
-  uint16_t duration;
-  uint16_t monitoring_symbols_within_slot;
-  uint8_t number_of_candidates[5];            //  aggregation level 1, 2, 4, 8, 16
-
-  uint8_t dci_2_0_number_of_candidates[5];    //  aggregation level 1, 2, 4, 8, 16
-  uint8_t dci_2_3_monitorying_periodicity;
-  uint8_t dci_2_3_number_of_candidates;
-        
-} fapi_nr_search_space_t;
-
-typedef struct {
-  fapi_nr_search_space_t search_space_sib1;
-  fapi_nr_search_space_t search_space_others_sib;
-  fapi_nr_search_space_t search_space_paging;
-  //fapi_nr_coreset_t      coreset_ra;         //  common coreset
-  fapi_nr_search_space_t search_space_ra;    
-} fapi_nr_pdcch_config_common_t;
-
-typedef struct {
-  uint8_t k0;
-  uint8_t mapping_type;
-  uint8_t symbol_starting;
-  uint8_t symbol_length;
-} fapi_nr_pdsch_time_domain_resource_allocation_t;
-
-typedef struct {
-  fapi_nr_pdsch_time_domain_resource_allocation_t allocation_list[FAPI_NR_MAX_NUM_DL_ALLOCATIONS];
-} fapi_nr_pdsch_config_common_t;
-
-typedef struct {
-  uint8_t prach_configuration_index;
-  uint8_t msg1_fdm;
-  uint8_t msg1_frequency_start;
-  uint8_t zero_correlation_zone_config;
-  uint8_t preamble_received_target_power;
-  uint8_t preamble_transmission_max;
-  uint8_t power_ramping_step;
-  uint8_t ra_window_size;
-
-  uint8_t total_number_of_preamble;
-  uint8_t ssb_occasion_per_rach;
-  uint8_t cb_preamble_per_ssb;
-
-  uint8_t group_a_msg3_size;
-  uint8_t group_a_number_of_preamble;
-  uint8_t group_b_power_offset;
-  uint8_t contention_resolution_timer;
-  uint8_t rsrp_threshold_ssb;
-  uint8_t rsrp_threshold_ssb_sul;
-  uint8_t prach_length;   //  l839, l139
-  uint8_t prach_root_sequence_index;  //  0 - 837 for l839, 0 - 137 for l139
-  uint8_t msg1_subcarrier_spacing;
-  uint8_t restrictedset_config;
-  uint8_t msg3_transform_precoding;
-} fapi_nr_rach_config_common_t;
-
-typedef struct {
-  uint8_t k2;
-  uint8_t mapping_type;
-  uint8_t symbol_starting;
-  uint8_t symbol_length;
-} fapi_nr_pusch_time_domain_resource_allocation_t;
-      
-typedef struct {
-  uint8_t group_hopping_enabled_transform_precoding;
-  fapi_nr_pusch_time_domain_resource_allocation_t allocation_list[FAPI_NR_MAX_NUM_UL_ALLOCATIONS];
-  uint8_t msg3_delta_preamble;
-  uint8_t p0_nominal_with_grant;
-} fapi_nr_pusch_config_common_t;
-
-typedef struct {
-  uint8_t pucch_resource_common;
-  uint8_t pucch_group_hopping;
-  uint8_t hopping_id;
-  uint8_t p0_nominal;
-} fapi_nr_pucch_config_common_t;
-
-typedef struct {
-        
-  fapi_nr_pdcch_config_common_t pdcch_config_common;
-  fapi_nr_pdsch_config_common_t pdsch_config_common;
-        
-} fapi_nr_dl_bwp_common_config_t;
-
-
-
-typedef struct {
-  uint16_t int_rnti;
-  uint8_t time_frequency_set;
-  uint8_t dci_payload_size;
-  uint8_t serving_cell_id[FAPI_NR_MAX_NUM_SERVING_CELLS];    //  interrupt configuration per serving cell
-  uint8_t position_in_dci[FAPI_NR_MAX_NUM_SERVING_CELLS];    //  interrupt configuration per serving cell
-} fapi_nr_downlink_preemption_t;
-
-typedef struct {
-  uint8_t tpc_index;
-  uint8_t tpc_index_sul;
-  uint8_t target_cell;
-} fapi_nr_pusch_tpc_command_config_t;
-
-typedef struct {
-  uint8_t tpc_index_pcell;
-  uint8_t tpc_index_pucch_scell;
-} fapi_nr_pucch_tpc_command_config_t;
-
-typedef struct {
-  uint8_t starting_bit_of_format_2_3;
-  uint8_t feild_type_format_2_3;
-} fapi_nr_srs_tpc_command_config_t;
-
-typedef struct {
-  fapi_nr_downlink_preemption_t downlink_preemption;
-  fapi_nr_pusch_tpc_command_config_t tpc_pusch;
-  fapi_nr_pucch_tpc_command_config_t tpc_pucch;
-  fapi_nr_srs_tpc_command_config_t tpc_srs;
-} fapi_nr_pdcch_config_dedicated_t;
-
-typedef struct {
-  uint8_t dmrs_type;
-  uint8_t dmrs_addition_position;
-  uint8_t max_length;
-  uint16_t scrambling_id0;
-  uint16_t scrambling_id1;
-  uint8_t ptrs_frequency_density[2];      //  phase tracking rs
-  uint8_t ptrs_time_density[3];           //  phase tracking rs
-  uint8_t ptrs_epre_ratio;                //  phase tracking rs
-  uint8_t ptrs_resource_element_offset;   //  phase tracking rs
-} fapi_nr_dmrs_downlink_config_t;
-
-typedef struct {
-  uint8_t bwp_or_cell_level;
-  uint8_t pattern_type;
-  uint32_t resource_blocks[9];        //  bitmaps type 275 bits
-  uint8_t slot_type;                  //  bitmaps type one/two slot(s)
-  uint32_t symbols_in_resouece_block; //  bitmaps type 14/28 bits
-  uint8_t periodic;                   //  bitmaps type 
-  uint32_t pattern[2];                //  bitmaps type 2/4/5/8/10/20/40 bits
-
-  fapi_nr_coreset_t coreset;         //  coreset
-
-  uint8_t subcarrier_spacing;
-  uint8_t mode;
-} fapi_nr_rate_matching_pattern_group_t;
-
-typedef struct {
-  //  resource mapping
-  uint8_t row;    //  row1/row2/row4/other
-  uint16_t frequency_domain_allocation; //    4/12/3/6 bits
-  uint8_t number_of_ports;
-  uint8_t first_ofdm_symbol_in_time_domain;
-  uint8_t first_ofdm_symbol_in_time_domain2;
-  uint8_t cdm_type;
-  uint8_t density;            //  .5/1/3
-  uint8_t density_dot5_type;  //  even/odd PRBs
-        
-  uint8_t frequency_band_starting_rb;     //  freqBand
-  uint8_t frequency_band_number_of_rb;    //  freqBand
-
-  //  periodicityAndOffset
-  uint8_t periodicity;    //  slot4/5/8/10/16/20/32/40/64/80/160/320/640
-  uint32_t offset;        //  0..639 bits
-} fapi_nr_zp_csi_rs_resource_t;
-
-typedef struct {
-  uint16_t data_scrambling_id_pdsch;
-  fapi_nr_dmrs_downlink_config_t dmrs_dl_for_pdsch_mapping_type_a;
-  fapi_nr_dmrs_downlink_config_t dmrs_dl_for_pdsch_mapping_type_b; 
-  uint8_t vrb_to_prb_interleaver;
-  uint8_t resource_allocation;
-  fapi_nr_pdsch_time_domain_resource_allocation_t allocation_list[FAPI_NR_MAX_NUM_DL_ALLOCATIONS];
-  uint8_t pdsch_aggregation_factor;
-  fapi_nr_rate_matching_pattern_group_t rate_matching_pattern_group1;
-  fapi_nr_rate_matching_pattern_group_t rate_matching_pattern_group2;
-  uint8_t rbg_size;
-  uint8_t mcs_table;
-  uint8_t max_num_of_code_word_scheduled_by_dci;
-  uint8_t bundle_size;        //  prb_bundling static
-  uint8_t bundle_size_set1;   //  prb_bundling dynamic 
-  uint8_t bundle_size_set2;   //  prb_bundling dynamic
-  fapi_nr_zp_csi_rs_resource_t periodically_zp_csi_rs_resource_set[FAPI_NR_MAX_NUM_ZP_CSI_RS_RESOURCE_PER_SET];
-} fapi_nr_pdsch_config_dedicated_t;
-
-typedef struct {
-  uint16_t starting_prb;
-  uint8_t intra_slot_frequency_hopping;
-  uint16_t second_hop_prb;
-  uint8_t format;                 //  pucch format 0..4
-  uint8_t initial_cyclic_shift;
-  uint8_t number_of_symbols;
-  uint8_t starting_symbol_index;
-  uint8_t time_domain_occ;
-  uint8_t number_of_prbs;
-  uint8_t occ_length;
-  uint8_t occ_index;
-} fapi_nr_pucch_resource_t;
-
-typedef struct {
-  uint8_t periodicity;
-  uint8_t number_of_harq_process;
-  fapi_nr_pucch_resource_t n1_pucch_an;
-} fapi_nr_sps_config_t;
-
-typedef struct {
-  uint8_t beam_failure_instance_max_count;
-  uint8_t beam_failure_detection_timer;
-} fapi_nr_radio_link_monitoring_config_t;
-
-typedef struct {
-  fapi_nr_pdcch_config_dedicated_t pdcch_config_dedicated;
-  fapi_nr_pdsch_config_dedicated_t pdsch_config_dedicated;
-  fapi_nr_sps_config_t sps_config;
-  fapi_nr_radio_link_monitoring_config_t radio_link_monitoring_config;
-
-} fapi_nr_dl_bwp_dedicated_config_t;
-
-typedef struct {
-  fapi_nr_rach_config_common_t  rach_config_common;
-  fapi_nr_pusch_config_common_t pusch_config_common;
-  fapi_nr_pucch_config_common_t pucch_config_common;
-
-} fapi_nr_ul_bwp_common_config_t;
-        
-typedef struct {
-  uint8_t inter_slot_frequency_hopping;
-  uint8_t additional_dmrs;
-  uint8_t max_code_rate;
-  uint8_t number_of_slots;
-  uint8_t pi2bpsk;
-  uint8_t simultaneous_harq_ack_csi;
-} fapi_nr_pucch_format_config_t;
-
-typedef struct {
-  fapi_nr_pucch_format_config_t format1;
-  fapi_nr_pucch_format_config_t format2;
-  fapi_nr_pucch_format_config_t format3;
-  fapi_nr_pucch_format_config_t format4;
-  fapi_nr_pucch_resource_t multi_csi_pucch_resources[2];
-  uint8_t dl_data_to_ul_ack[8];
-  //  pucch power control
-  uint8_t deltaF_pucch_f0;
-  uint8_t deltaF_pucch_f1;
-  uint8_t deltaF_pucch_f2;
-  uint8_t deltaF_pucch_f3;
-  uint8_t deltaF_pucch_f4;
-  uint8_t two_pucch_pc_adjusment_states;
-} fapi_nr_pucch_config_dedicated_t;
-
-typedef struct {
-  uint8_t dmrs_type;
-  uint8_t dmrs_addition_position;
-  uint8_t ptrs_uplink_config; // to indicate if PTRS Uplink is configured of not
-  uint8_t ptrs_type;  //cp-OFDM, dft-S-OFDM
-  uint16_t ptrs_frequency_density[2];
-  uint8_t ptrs_time_density[3];
-  uint8_t ptrs_max_number_of_ports;
-  uint8_t ptrs_resource_element_offset;
-  uint8_t ptrs_power;
-  uint16_t ptrs_sample_density[5];
-  uint8_t ptrs_time_density_transform_precoding;
-
-  uint8_t max_length;
-  uint16_t scrambling_id0;
-  uint16_t scrambling_id1;
-  uint8_t npusch_identity;
-  uint8_t disable_sequence_group_hopping;
-  uint8_t sequence_hopping_enable;
-} fapi_nr_dmrs_uplink_config_t;
-
-typedef struct {
-  uint8_t tpc_accmulation;
-  uint8_t msg3_alpha;
-  uint8_t p0_nominal_with_grant;
-  uint8_t two_pusch_pc_adjustments_states;
-  uint8_t delta_mcs;
-} fapi_nr_pusch_power_control_t;
-
-typedef enum {tx_config_codebook = 1, tx_config_nonCodebook = 2} tx_config_t;
-typedef enum {transform_precoder_enabled = 0, transform_precoder_disabled = 1} transform_precoder_t;
-typedef enum {
-  codebook_subset_fullyAndPartialAndNonCoherent = 1,
-  codebook_subset_partialAndNonCoherent = 2,
-  codebook_subset_nonCoherent = 3} codebook_subset_t;
-typedef struct {
-  uint16_t data_scrambling_identity;
-  tx_config_t tx_config;
-  fapi_nr_dmrs_uplink_config_t dmrs_ul_for_pusch_mapping_type_a;
-  fapi_nr_dmrs_uplink_config_t dmrs_ul_for_pusch_mapping_type_b;
-  fapi_nr_pusch_power_control_t pusch_power_control;
-  uint8_t frequency_hopping;
-  uint16_t frequency_hopping_offset_lists[4];
-  uint8_t resource_allocation;
-  fapi_nr_pusch_time_domain_resource_allocation_t allocation_list[FAPI_NR_MAX_NUM_UL_ALLOCATIONS];
-  uint8_t pusch_aggregation_factor;
-  uint8_t mcs_table;
-  uint8_t mcs_table_transform_precoder;
-  transform_precoder_t transform_precoder;
-  codebook_subset_t codebook_subset;
-  uint8_t max_rank;
-  uint8_t rbg_size;
-
-  //uci-OnPUSCH
-  uint8_t uci_on_pusch_type;  //dynamic, semi-static
-  uint8_t beta_offset_ack_index1[4];
-  uint8_t beta_offset_ack_index2[4];
-  uint8_t beta_offset_ack_index3[4];
-  uint8_t beta_offset_csi_part1_index1[4];
-  uint8_t beta_offset_csi_part1_index2[4];
-  uint8_t beta_offset_csi_part2_index1[4];
-  uint8_t beta_offset_csi_part2_index2[4];
-
-  uint8_t tp_pi2BPSK;
-} fapi_nr_pusch_config_dedicated_t;
-
-typedef struct {
-  uint8_t frequency_hopping;
-  fapi_nr_dmrs_uplink_config_t cg_dmrs_configuration;
-  uint8_t mcs_table;
-  uint8_t mcs_table_transform_precoder;
-
-  //uci-OnPUSCH
-  uint8_t uci_on_pusch_type;  //dynamic, semi-static
-  uint8_t beta_offset_ack_index1[4];
-  uint8_t beta_offset_ack_index2[4];
-  uint8_t beta_offset_ack_index3[4];
-  uint8_t beta_offset_csi_part1_index1[4];
-  uint8_t beta_offset_csi_part1_index2[4];
-  uint8_t beta_offset_csi_part2_index1[4];
-  uint8_t beta_offset_csi_part2_index2[4];
-
-  uint8_t resource_allocation;
-  //  rgb-Size structure missing in spec.
-  uint8_t power_control_loop_to_use;
-  //  p0-PUSCH-Alpha
-  uint8_t p0;
-  uint8_t alpha;
-
-  uint8_t transform_precoder;
-  uint8_t number_of_harq_process;
-  uint8_t rep_k;
-  uint8_t rep_k_rv;
-  uint8_t periodicity;
-  uint8_t configured_grant_timer;
-  //  rrc-ConfiguredUplinkGrant
-  uint16_t time_domain_offset;
-  uint8_t time_domain_allocation;
-  uint32_t frequency_domain_allocation;
-  uint8_t antenna_ports;
-  uint8_t dmrs_seq_initialization;
-  uint8_t precoding_and_number_of_layers;
-  uint8_t srs_resource_indicator;
-  uint8_t mcs_and_tbs;
-  uint8_t frequency_hopping_offset;
-  uint8_t path_loss_reference_index;
-
-} fapi_nr_configured_grant_config_t;
-
-typedef struct {
-  uint8_t qcl_type1_serving_cell_index;
-  uint8_t qcl_type1_bwp_id;
-  uint8_t qcl_type1_rs_type;  //  csi-rs or ssb
-  uint8_t qcl_type1_nzp_csi_rs_resource_id;
-  uint8_t qcl_type1_ssb_index;
-  uint8_t qcl_type1_type;
-        
-  uint8_t qcl_type2_serving_cell_index;
-  uint8_t qcl_type2_bwp_id;
-  uint8_t qcl_type2_rs_type;  //  csi-rs or ssb
-  uint8_t qcl_type2_nzp_csi_rs_resource_id;
-  uint8_t qcl_type2_ssb_index;
-  uint8_t qcl_type2_type;
-
-} fapi_nr_tci_state_t;
-
-typedef struct {
-  uint8_t root_sequence_index;
-  //  rach genertic
-  uint8_t prach_configuration_index;
-  uint8_t msg1_fdm;
-  uint8_t msg1_frequency_start;
-  uint8_t zero_correlation_zone_config;
-  uint8_t preamble_received_target_power;
-  uint8_t preamble_transmission_max;
-  uint8_t power_ramping_step;
-  uint8_t ra_window_size;
-
-  uint8_t rsrp_threshold_ssb;
-  //  PRACH-ResourceDedicatedBFR
-  uint8_t bfr_ssb_index[FAPI_NR_MAX_NUM_CANDIDATE_BEAMS];
-  uint8_t bfr_ssb_ra_preamble_index[FAPI_NR_MAX_NUM_CANDIDATE_BEAMS];
-  // NZP-CSI-RS-Resource
-  uint8_t bfr_csi_rs_nzp_resource_mapping[FAPI_NR_MAX_NUM_CANDIDATE_BEAMS];
-  uint8_t bfr_csi_rs_power_control_offset[FAPI_NR_MAX_NUM_CANDIDATE_BEAMS];
-  uint8_t bfr_csi_rs_power_control_offset_ss[FAPI_NR_MAX_NUM_CANDIDATE_BEAMS];
-  uint16_t bfr_csi_rs_scrambling_id[FAPI_NR_MAX_NUM_CANDIDATE_BEAMS];
-  uint8_t bfr_csi_rs_resource_periodicity[FAPI_NR_MAX_NUM_CANDIDATE_BEAMS];
-  uint16_t bfr_csi_rs_resource_offset[FAPI_NR_MAX_NUM_CANDIDATE_BEAMS];
-  fapi_nr_tci_state_t qcl_infomation_periodic_csi_rs[FAPI_NR_MAX_NUM_CANDIDATE_BEAMS];
-
-  uint8_t bfr_csirs_ra_occasions[FAPI_NR_MAX_NUM_CANDIDATE_BEAMS];
-  uint8_t bfr_csirs_ra_preamble_index[FAPI_NR_MAX_NUM_CANDIDATE_BEAMS][FAPI_NR_MAX_RA_OCCASION_PER_CSIRS];
-
-  uint8_t ssb_per_rach_occasion;
-  uint8_t ra_ssb_occasion_mask_index;
-  fapi_nr_search_space_t recovery_search_space;
-  //  RA-Prioritization
-  uint8_t power_ramping_step_high_priority;
-  uint8_t scaling_factor_bi;
-  uint8_t beam_failure_recovery_timer;
-} fapi_nr_beam_failure_recovery_config_t;
-
-typedef struct {
-  fapi_nr_pucch_config_dedicated_t pucch_config_dedicated;
-  fapi_nr_pusch_config_dedicated_t pusch_config_dedicated;
-  fapi_nr_configured_grant_config_t configured_grant_config;
-  //  SRS-Config
-  uint8_t srs_tpc_accumulation;
-  fapi_nr_beam_failure_recovery_config_t beam_failure_recovery_config;
-        
-} fapi_nr_ul_bwp_dedicated_config_t;
-
 #define FAPI_NR_CONFIG_REQUEST_MASK_PBCH                0x01
 #define FAPI_NR_CONFIG_REQUEST_MASK_DL_BWP_COMMON       0x02
 #define FAPI_NR_CONFIG_REQUEST_MASK_UL_BWP_COMMON       0x04
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h
index 0eb77a9d262d0c1a64c7d26bd9e0f718bfb69c6b..ea459138e1e00aff374b50d0081ff07e9d476132 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h
@@ -2727,7 +2727,7 @@ typedef struct {
 } nfapi_cqi_indication_rel8_t;
 #define NFAPI_CQI_INDICATION_REL8_TAG 0x202f
 
-#define NFAPI_CC_MAX 4
+#define NFAPI_CC_MAX MAX_NUM_CCs
 typedef struct {
 	nfapi_tl_t tl;
 	uint16_t length;
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf
deleted file mode 100644
index 6ee4ec840431454c5429456810abaa7a2f29fb59..0000000000000000000000000000000000000000
Binary files a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf and /dev/null differ
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 be6f92b2b992038a35a0534784ef005b1a8a60ea..9d245446c86d00283f5ce6f678aeac630ce1e8bd 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
@@ -673,6 +673,7 @@ typedef struct {
 #define NFAPI_NR_SLOT_INDICATION_PERIOD_NUMEROLOGY_3 125 //us
 
 typedef struct {
+  nfapi_p7_message_header_t header;
 	uint16_t sfn; //0->1023   
   uint16_t slot;//0->319
   
@@ -1492,10 +1493,11 @@ typedef struct
 
 typedef struct
 {
+  nfapi_p7_message_header_t header;
   uint16_t sfn;
   uint16_t slot;
   uint16_t number_of_pdus;
-  nfapi_nr_rx_data_pdu_t* pdu_list;
+  nfapi_nr_rx_data_pdu_t *pdu_list; 
 
 } nfapi_nr_rx_data_indication_t;
 
@@ -1518,6 +1520,7 @@ typedef struct
 
 typedef struct
 {
+  nfapi_p7_message_header_t header;
   uint16_t sfn;
   uint16_t slot;
   uint16_t number_crcs;
@@ -1653,6 +1656,7 @@ typedef struct
 
 typedef struct
 {
+  nfapi_p7_message_header_t header;
   uint16_t sfn;
   uint16_t slot;
   uint16_t num_ucis;
@@ -1689,6 +1693,7 @@ typedef struct
 
 typedef struct
 {
+  nfapi_p7_message_header_t header;
   uint16_t sfn;
   uint16_t slot;
   uint8_t number_of_pdus;
@@ -1721,6 +1726,7 @@ typedef struct{
 
 typedef struct
 {
+  nfapi_p7_message_header_t header;
   uint16_t sfn;
   uint16_t slot;
   uint8_t number_of_pdus;
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi.c b/nfapi/open-nFAPI/nfapi/src/nfapi.c
index ba800c36348ca16dc50d91b0cf02d90ff692bdf2..63dd8a16ae81489f3fd655ec469766a23461651d 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi.c
@@ -1,969 +1,783 @@
-/*
- * Copyright (c) 2001-2016, Cisco Systems, Inc.
- * All rights reserved.
- *  
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *  
- * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 
- * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- *  
- * Neither the name of the Cisco Systems, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <signal.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sched.h>
-#include <time.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <pthread.h>
-
-#include <nfapi_interface.h>
-#include <nfapi.h>
-#include <debug.h>
-
-
-// Fundamental routines
-
-uint8_t push8(uint8_t in, uint8_t **out, uint8_t *end)
-{
-	uint8_t *pOut = *out;
-
-	if((end - pOut) >= 1)
-	{
-		pOut[0] = in;
-
-		(*out)+=1;
-
-		return 1;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-
-}
-
-uint8_t pushs8(int8_t in, uint8_t **out, uint8_t *end)
-{
-	uint8_t *pOut = *out;
-
-	if((end - pOut) >= 1)
-	{
-		pOut[0] = in;
-
-		(*out)+=1;
-
-		return 1;
-	}
-	else 
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-
-uint8_t push16(uint16_t in, uint8_t **out, uint8_t *end)
-{
-	uint8_t *pOut = *out;
-	
-	if((end - pOut) >= 2)
-	{
-		pOut[0] = (in & 0xFF00) >> 8;
-		pOut[1] = (in & 0xFF);
-
-		(*out)+=2;
-
-		return 2;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-
-uint8_t pushs16(int16_t in, uint8_t **out, uint8_t *end)
-{
-	uint8_t *pOut = *out;
-
-	if((end - pOut) >= 2)
-	{
-		pOut[0] = (in & 0xFF00) >> 8;
-		pOut[1] = (in & 0xFF);
-
-		(*out)+=2;
-
-		return 2;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-
-uint8_t push32(uint32_t in, uint8_t **out, uint8_t *end)
-{
-	uint8_t *pOut = *out;
-	if((end - pOut) >= 4)
-	{
-		pOut[0] = (in & 0xFF000000) >> 24;
-		pOut[1] = (in & 0xFF0000) >> 16;
-		pOut[2] = (in & 0xFF00) >> 8;
-		pOut[3] = (in & 0xFF);
-
-		(*out)+=4;
-
-		return 4;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-
-uint8_t pushs32(int32_t in, uint8_t **out, uint8_t *end)
-{
-	uint8_t *pOut = *out;
-
-	if((end - pOut) >= 4)
-	{
-		pOut[0] = (in & 0xFF000000) >> 24;
-		pOut[1] = (in & 0xFF0000) >> 16;
-		pOut[2] = (in & 0xFF00) >> 8;
-		pOut[3] = (in & 0xFF);
-
-		(*out)+=4;
-
-		return 4;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-
-uint8_t pull8(uint8_t **in, uint8_t *out, uint8_t *end)
-{
-	uint8_t *pIn = *in;
-
-	if((end - pIn) >= 1 )
-	{
-		*out = *pIn;
-
-		(*in)+=1;
-
-		return 1;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-
-uint8_t pulls8(uint8_t **in, int8_t *out, uint8_t *end)
-{
-	uint8_t *pIn = *in;
-
-	if((end - pIn) >= 1 )
-	{
-		*out = *pIn;
-
-		(*in)+=1;
-
-		return 1;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-
-uint8_t pull16(uint8_t **in, uint16_t *out, uint8_t *end)
-{
-	uint8_t *pIn = *in;
-
-	if((end - pIn) >=2 )
-	{
-		*out = ((pIn[0]) << 8) | pIn[1];
-		(*in)+=2;
-
-		return 2;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-
-uint8_t pulls16(uint8_t **in, int16_t *out, uint8_t *end)
-{
-	uint8_t *pIn = *in;
-
-	if((end - pIn) >=2 )
-	{
-		*out = ((pIn[0]) << 8) | pIn[1];
-
-		(*in)+=2;
-
-		return 2;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-
-uint8_t pull32(uint8_t **in, uint32_t *out, uint8_t *end)
-{
-	uint8_t *pIn = *in;
-
-	if((end - pIn) >=4 )
-	{
-		*out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3];
-
-		(*in)+=4;
-
-		return 4;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n",  __FUNCTION__);
-		return 0;
-	}
-}
-
-uint8_t pulls32(uint8_t **in, int32_t *out, uint8_t *end)
-{
-	uint8_t *pIn = *in;
-
-	if((end - pIn) >=4 )
-	{
-		*out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3];
-
-		(*in)+=4;
-
-		return 4;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-
-/*
-inline void pusharray16(uint8_t **, uint16_t, uint32_t len)
-{
-}
-*/
-
-uint32_t pullarray16(uint8_t **in, uint16_t out[], uint32_t max_len, uint32_t len, uint8_t *end)
-{
-	if(len == 0)
-		return 1;
-
-	if(len > max_len)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-		return 0;
-	}
-
-	if((end - (*in)) >= sizeof(uint16_t) * len)
-	{
-		uint32_t idx;
-		for(idx = 0; idx < len; ++idx)
-		{
-			if(!pull16(in, &out[idx], end))
-				return 0;
-		}
-
-		return sizeof(uint16_t) * len;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-
-uint32_t pullarrays16(uint8_t **in, int16_t out[], uint32_t max_len, uint32_t len, uint8_t *end)
-{
-	if(len == 0)
-		return 1;
-
-	if(len > max_len)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-		return 0;
-	}
-
-	if((end - (*in)) >= sizeof(uint16_t) * len)
-	{
-		uint32_t idx;
-		for(idx = 0; idx < len; ++idx)
-		{
-			if(!pulls16(in, &out[idx], end))
-			return 0;
-		}
-
-		return sizeof(uint16_t) * len;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end)
-{
-	if(len == 0)
-		return 1;
-
-	if(len > max_len)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-		return 0;
-	}
-
-	if((end - (*out)) >= sizeof(uint16_t) * len)
-	{
-		uint32_t idx;
-		for(idx = 0; idx < len; ++idx)
-		{
-			if(!push16(in[idx], out, end))
-				return 0;
-		}
-		return sizeof(uint16_t) * len;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end)
-{
-	if(len == 0)
-		return 1;
-
-	if(len > max_len)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-		return 0;
-	}
-
-	if((end - (*out)) >= sizeof(uint16_t) * len)
-	{
-		uint32_t idx;
-		for(idx = 0; idx < len; ++idx)
-		{
-			pushs16(in[idx], out, end);
-		}
-		return sizeof(uint16_t) * len;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-uint32_t pullarray32(uint8_t **in, uint32_t out[], uint32_t max_len, uint32_t len, uint8_t *end)
-{
-       if(len == 0)
-               return 1;
-
-       if(len > max_len)
-       {
-               NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-               return 0;
-       }
-
-       if((end - (*in)) >= sizeof(uint32_t) * len)
-       {
-               uint32_t idx;
-               for(idx = 0; idx < len; ++idx)
-               {
-                       if(!pull32(in, &out[idx], end))
-                               return 0;
-               }
-
-               return sizeof(uint32_t) * len;
-       }
-       else
-       {
-               NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-               return 0;
-       }
-}
-
-uint32_t pullarrays32(uint8_t **in, int32_t out[], uint32_t max_len, uint32_t len, uint8_t *end)
-{
-       if(len == 0)
-               return 1;
-
-       if(len > max_len)
-       {
-               NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-               return 0;
-       }
-
-       if((end - (*in)) >= sizeof(uint32_t) * len)
-       {
-               uint32_t idx;
-               for(idx = 0; idx < len; ++idx)
-               {
-                       if(!pulls32(in, &out[idx], end))
-                       return 0;
-               }
-
-               return sizeof(uint32_t) * len;
-       }
-       else
-       {
-               NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-               return 0;
-       }
-}
-uint32_t pusharray32(uint32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end)
-{
-       if(len == 0)
-               return 1;
-
-       if(len > max_len)
-       {
-               NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-               return 0;
-       }
-
-       if((end - (*out)) >= sizeof(uint32_t) * len)
-       {
-               uint32_t idx;
-               for(idx = 0; idx < len; ++idx)
-               {
-                       if(!push32(in[idx], out, end))
-                               return 0;
-               }
-               return sizeof(uint32_t) * len;
-       }
-       else
-       {
-               NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-               return 0;
-       }
-}
-uint32_t pusharrays32(int32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end)
-{
-       if(len == 0)
-               return 1;
-
-       if(len > max_len)
-       {
-               NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-               return 0;
-       }
-
-       if((end - (*out)) >= sizeof(uint32_t) * len)
-       {
-               uint32_t idx;
-               for(idx = 0; idx < len; ++idx)
-               {
-                       pushs32(in[idx], out, end);
-               }
-               return sizeof(uint32_t) * len;
-       }
-       else
-       {
-               NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-               return 0;
-       }
-}
-uint32_t pullarray8(uint8_t **in, uint8_t out[], uint32_t max_len, uint32_t len, uint8_t *end)
-{
-	if(len == 0)
-		return 1;
-
-	if(len > max_len)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-		return 0;
-	}
-
-	if((end - (*in)) >= sizeof(uint8_t) * len)
-	{
-		memcpy(out, (*in), len);
-		(*in)+=len;
-
-		return sizeof(uint8_t) * len;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-
-uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end)
-{
-	if(len == 0)
-		return 1;
-
-	if(len > max_len)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
-		return 0;
-	}
-
-	if((end - (*out)) >= sizeof(uint8_t) * len)
-	{
-		memcpy((*out), in, len);
-		(*out)+=len;
-
-		return sizeof(uint8_t) * len;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
-		return 0;
-	}
-}
-
-uint8_t packarray(void* array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t **ppwritepackedmsg, uint8_t *end, pack_array_elem_fn fn)
-{
-	if(count > max_count)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count);
-		return 0;
-	}
-
-	uint16_t i = 0;
-	for(i = 0; i < count; ++i)
-	{
-		if((fn)(array, ppwritepackedmsg, end) == 0)
-			return 0;
-
-		array += array_element_size;
-	}
-
-	return 1;
-}
-
-uint8_t unpackarray(uint8_t **ppReadPackedMsg, void* array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t *end, unpack_array_elem_fn fn)
-{
-	if(count > max_count)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count);
-		return 0;
-	}
-
-	uint16_t i = 0;
-	for(i = 0; i < count; ++i)
-	{
-		if((fn)(array, ppReadPackedMsg, end) == 0)
-			return 0;
-
-		array += array_element_size;
-	}
-
-	return 1;
-}
-
-
-uint32_t pack_vendor_extension_tlv(nfapi_tl_t* ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	if(ve != 0 && config != 0)
-	{
-		if(config->pack_vendor_extension_tlv)
-		{
-
-			uint8_t* pStartOfTlv = *ppWritePackedMsg;
-			if(pack_tl(ve, ppWritePackedMsg, end) == 0)
-				return 0;
-
-			uint8_t* pStartOfValue = *ppWritePackedMsg;
-			if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0)
-				return 0;
-
-			ve->length = (*ppWritePackedMsg) - pStartOfValue;
-
-			pack_tl(ve, &pStartOfTlv, end);
-
-			return 1;
-
-		}
-	}
-	return 1;
-}
-
-uint32_t unpack_vendor_extension_tlv(nfapi_tl_t* tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config, nfapi_tl_t** ve_tlv)
-{
-	if(ve_tlv != 0 && config != 0)
-	{
-		if(config->unpack_vendor_extension_tlv)
-		{
-			return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void**)ve_tlv, config);
-		}
-	}
-	return 1;
-}
-
-uint32_t pack_p7_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end ,nfapi_p7_codec_config_t* config)
-{
-	if(ve != 0 && config != 0)
-	{
-		if(config->pack_vendor_extension_tlv)
-		{
-			uint8_t* pStartOfTlv = *ppWritePackedMsg;
-			if(pack_tl(ve, ppWritePackedMsg, end) == 0)
-				return 0;
-
-			uint8_t* pStartOfValue = *ppWritePackedMsg;
-			if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0)
-				return 0;
-
-			ve->length = (*ppWritePackedMsg) - pStartOfValue;
-
-			pack_tl(ve, &pStartOfTlv, end);
-
-			return 1;
-			
-		}
-	}
-	return 1;
-}
-
-int unpack_p7_vendor_extension_tlv(nfapi_tl_t* tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config, nfapi_tl_t** ve_tlv)
-{
-	if(ve_tlv != 0 && config != 0)
-	{
-		if(config->unpack_vendor_extension_tlv)
-		{
-			return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void**)ve_tlv, config);
-		}
-	}
-	return 1;
-}
-
-
-uint8_t pack_tl(nfapi_tl_t *tl, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return (push16(tl->tag, ppWritePackedMsg, end) &&
-			push16(tl->length, ppWritePackedMsg, end));
-}
-
-uint8_t unpack_tl(uint8_t **ppReadPackedMsg, nfapi_tl_t *tl, uint8_t *end)
-{
-	return (pull16(ppReadPackedMsg, &tl->tag, end) &&
-			pull16(ppReadPackedMsg, &tl->length, end));
-}
-
-int unpack_tlv_list(unpack_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config, nfapi_tl_t** ve)
-{
-	nfapi_tl_t generic_tl;
-	uint8_t numBadTags = 0;
-	uint16_t idx = 0;
-
-	while ((uint8_t*)(*ppReadPackedMsg) < end)
-	{
-		// unpack the tl and process the values accordingly
-		if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-			return 0;
-
-		uint8_t tagMatch = 0;
-
-		uint8_t* pStartOfValue = *ppReadPackedMsg;
-
-		for(idx = 0; idx < size; ++idx)
-		{
-			if(unpack_fns[idx].tag == generic_tl.tag) // match the extracted tag value with all the tags in unpack_fn list
-			{
-				tagMatch = 1;
-				nfapi_tl_t* tl = (nfapi_tl_t*)(unpack_fns[idx].tlv);
-				tl->tag = generic_tl.tag;
-				tl->length = generic_tl.length;
-
-				int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end);
-
-				if(result == 0)
-				{
-					return 0;
-				}
-
-				// check if the length was right;
-				if(tl->length != (*ppReadPackedMsg - pStartOfValue))
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %d\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue));
-				}
-			}
-		}
-
-		if(tagMatch == 0)
-		{
-
-			if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE && 
-			   generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE)
-			{
-				int result = unpack_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve);
-				if(result == 0)
-				{
-					// got tot the end.
-					return 0;
-				}
-				else if(result < 0)
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown VE TAG value: 0x%04x\n", generic_tl.tag);
-
-					if (++numBadTags > MAX_BAD_TAG)
-					{
-						NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
-						return 0;
-					}
-
-					if((end - *ppReadPackedMsg) >= generic_tl.length)
-					{
-						// Advance past the unknown TLV
-						(*ppReadPackedMsg) += generic_tl.length;
-					}
-					else
-					{
-						// go to the end
-						return 0;
-					}
-				}
-			}
-			else
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
-
-				if (++numBadTags > MAX_BAD_TAG)
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
-					return 0;
-				}
-
-				if((end - *ppReadPackedMsg) >= generic_tl.length)
-				{
-					// Advance past the unknown TLV
-					(*ppReadPackedMsg) += generic_tl.length;
-				}
-				else
-				{
-					// go to the end
-					return 0;
-				}
-			}
-
-		}
-	}
-
-	return 1;
-}
-int unpack_p7_tlv_list(unpack_p7_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t* end, nfapi_p7_codec_config_t* config, nfapi_tl_t** ve)
-{
-	nfapi_tl_t generic_tl;
-	uint8_t numBadTags = 0;
-	uint16_t idx = 0;
-
-	while ((uint8_t*)(*ppReadPackedMsg) < end)
-	{
-		// unpack the tl and process the values accordingly
-		if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-			return 0;
-
-		uint8_t tagMatch = 0;
-
-		uint8_t* pStartOfValue = *ppReadPackedMsg;
-
-		for(idx = 0; idx < size; ++idx)
-		{
-			if(unpack_fns[idx].tag == generic_tl.tag)
-			{
-				tagMatch = 1;
-				nfapi_tl_t* tl = (nfapi_tl_t*)(unpack_fns[idx].tlv);
-				tl->tag = generic_tl.tag;
-				tl->length = generic_tl.length;
-
-				int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end , config);
-
-				if(result == 0)
-				{
-					return  0;
-				}
-
-				// check if the length was right;
-				if(tl->length != (*ppReadPackedMsg - pStartOfValue))
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %d\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue));
-				}
-			}
-		}
-
-		if(tagMatch == 0)
-		{
-
-			if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE && 
-			   generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE)
-			{
-				int result = unpack_p7_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve);
-				if(result == 0)
-				{
-					// got to end
-					return 0;
-				}
-				else if(result < 0)
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
-
-					if (++numBadTags > MAX_BAD_TAG)
-					{
-						NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
-						return -1;
-					}
-
-					if((end - *ppReadPackedMsg) >= generic_tl.length)
-					{
-						// Advance past the unknown TLV
-						(*ppReadPackedMsg) += generic_tl.length;
-					}
-					else
-					{
-						// got ot the dn
-						return 0;
-					}
-				}
-			}
-			else
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
-
-				if (++numBadTags > MAX_BAD_TAG)
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
-					return -1;
-				}
-
-				if((end - *ppReadPackedMsg) >= generic_tl.length)
-				{
-					// Advance past the unknown TLV
-					(*ppReadPackedMsg) += generic_tl.length;
-				}
-				else
-				{
-					// got ot the dn
-					return 0;
-				}
-
-			}
-
-		}
-	}
-
-	return 1;
-}
-
-// This intermediate function deals with calculating the length of the value
-// and writing into the tlv header.
-uint8_t pack_tlv(uint16_t tag, void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end, pack_tlv_fn fn)
-{
-	nfapi_tl_t* tl = (nfapi_tl_t*)tlv;
-
-	// If the tag is defined
-	if(tl->tag == tag)
-	{
-		uint8_t* pStartOfTlv = *ppWritePackedMsg;
-
-		// write a dumy tlv header
-		if(pack_tl(tl, ppWritePackedMsg, end) == 0)
-			return 0;
-
-		// Record the start of the value
-		uint8_t* pStartOfValue = *ppWritePackedMsg;
-
-		// pack the tlv value
-		if(fn(tlv, ppWritePackedMsg, end) == 0)
-			return 0;
-
-		// calculate the length of the value and rewrite the tl header
-		tl->length = (*ppWritePackedMsg) - pStartOfValue;
-
-		// rewrite the header with the correct length
-		pack_tl(tl, &pStartOfTlv, end);
-	}
-	else
-	{
-		if(tl->tag != 0)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_WARN, "Warning pack_tlv tag 0x%x does not match expected 0x%x\n", tl->tag, tag);
-		}
-                else
-                {
-			//NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning pack_tlv tag 0x%x ZERO does not match expected 0x%x\n", tl->tag, tag);
-                }
-	}
-
-	return 1;
-}
-
-const char* nfapi_error_code_to_str(nfapi_error_code_e value)
-{
-	switch(value)
-	{
-		case NFAPI_MSG_OK:
-			return "NFAPI_MSG_OK";
-		case NFAPI_MSG_INVALID_STATE:
-			return "NFAPI_MSG_INVALID_STATE";
-		case NFAPI_MSG_INVALID_CONFIG:
-			return "NFAPI_MSG_INVALID_CONFIG";
-		case NFAPI_SFN_OUT_OF_SYNC:
-			return "NFAPI_SFN_OUT_OF_SYNC";
-		case NFAPI_MSG_SUBFRAME_ERR:
-			return "NFAPI_MSG_SUBFRAME_ERR";
-		case NFAPI_MSG_BCH_MISSING:
-			return "NFAPI_MSG_BCH_MISSING";
-		case NFAPI_MSG_INVALID_SFN:
-			return "NFAPI_MSG_INVALID_SFN";
-		case NFAPI_MSG_HI_ERR:
-			return "NFAPI_MSG_HI_ERR";
-		case NFAPI_MSG_TX_ERR:
-			return "NFAPI_MSG_TX_ERR";
-		default:
-			return "UNKNOWN";
-	}
-}
+/*
+ * Copyright (c) 2001-2016, Cisco Systems, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of the Cisco Systems, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <signal.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sched.h>
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <pthread.h>
+
+#include <nfapi_interface.h>
+#include <nfapi.h>
+#include <debug.h>
+
+
+// Fundamental routines
+
+uint8_t push8(uint8_t in, uint8_t **out, uint8_t *end) {
+  uint8_t *pOut = *out;
+
+  if((end - pOut) >= 1) {
+    pOut[0] = in;
+    (*out)+=1;
+    return 1;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+
+uint8_t pushs8(int8_t in, uint8_t **out, uint8_t *end) {
+  uint8_t *pOut = *out;
+
+  if((end - pOut) >= 1) {
+    pOut[0] = in;
+    (*out)+=1;
+    return 1;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+
+uint8_t push16(uint16_t in, uint8_t **out, uint8_t *end) {
+  uint8_t *pOut = *out;
+
+  if((end - pOut) >= 2) {
+    pOut[0] = (in & 0xFF00) >> 8;
+    pOut[1] = (in & 0xFF);
+    (*out)+=2;
+    return 2;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+
+uint8_t pushs16(int16_t in, uint8_t **out, uint8_t *end) {
+  uint8_t *pOut = *out;
+
+  if((end - pOut) >= 2) {
+    pOut[0] = (in & 0xFF00) >> 8;
+    pOut[1] = (in & 0xFF);
+    (*out)+=2;
+    return 2;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+
+uint8_t push32(uint32_t in, uint8_t **out, uint8_t *end) {
+  uint8_t *pOut = *out;
+
+  if((end - pOut) >= 4) {
+    pOut[0] = (in & 0xFF000000) >> 24;
+    pOut[1] = (in & 0xFF0000) >> 16;
+    pOut[2] = (in & 0xFF00) >> 8;
+    pOut[3] = (in & 0xFF);
+    (*out)+=4;
+    return 4;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+
+uint8_t pushs32(int32_t in, uint8_t **out, uint8_t *end) {
+  uint8_t *pOut = *out;
+
+  if((end - pOut) >= 4) {
+    pOut[0] = (in & 0xFF000000) >> 24;
+    pOut[1] = (in & 0xFF0000) >> 16;
+    pOut[2] = (in & 0xFF00) >> 8;
+    pOut[3] = (in & 0xFF);
+    (*out)+=4;
+    return 4;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+
+uint8_t pull8(uint8_t **in, uint8_t *out, uint8_t *end) {
+  uint8_t *pIn = *in;
+
+  if((end - pIn) >= 1 ) {
+    *out = *pIn;
+    (*in)+=1;
+    return 1;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+
+uint8_t pulls8(uint8_t **in, int8_t *out, uint8_t *end) {
+  uint8_t *pIn = *in;
+
+  if((end - pIn) >= 1 ) {
+    *out = *pIn;
+    (*in)+=1;
+    return 1;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+
+uint8_t pull16(uint8_t **in, uint16_t *out, uint8_t *end) {
+  uint8_t *pIn = *in;
+
+  if((end - pIn) >=2 ) {
+    *out = ((pIn[0]) << 8) | pIn[1];
+    (*in)+=2;
+    return 2;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+
+uint8_t pulls16(uint8_t **in, int16_t *out, uint8_t *end) {
+  uint8_t *pIn = *in;
+
+  if((end - pIn) >=2 ) {
+    *out = ((pIn[0]) << 8) | pIn[1];
+    (*in)+=2;
+    return 2;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+
+uint8_t pull32(uint8_t **in, uint32_t *out, uint8_t *end) {
+  uint8_t *pIn = *in;
+
+  if((end - pIn) >=4 ) {
+    *out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3];
+    (*in)+=4;
+    return 4;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n",  __FUNCTION__);
+    return 0;
+  }
+}
+
+uint8_t pulls32(uint8_t **in, int32_t *out, uint8_t *end) {
+  uint8_t *pIn = *in;
+
+  if((end - pIn) >=4 ) {
+    *out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3];
+    (*in)+=4;
+    return 4;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+
+/*
+inline void pusharray16(uint8_t **, uint16_t, uint32_t len)
+{
+}
+*/
+
+uint32_t pullarray16(uint8_t **in, uint16_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    return 0;
+  }
+
+  if((end - (*in)) >= sizeof(uint16_t) * len) {
+    uint32_t idx;
+
+    for(idx = 0; idx < len; ++idx) {
+      if(!pull16(in, &out[idx], end))
+        return 0;
+    }
+
+    return sizeof(uint16_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+
+uint32_t pullarrays16(uint8_t **in, int16_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    return 0;
+  }
+
+  if((end - (*in)) >= sizeof(uint16_t) * len) {
+    uint32_t idx;
+
+    for(idx = 0; idx < len; ++idx) {
+      if(!pulls16(in, &out[idx], end))
+        return 0;
+    }
+
+    return sizeof(uint16_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    return 0;
+  }
+
+  if((end - (*out)) >= sizeof(uint16_t) * len) {
+    uint32_t idx;
+
+    for(idx = 0; idx < len; ++idx) {
+      if(!push16(in[idx], out, end))
+        return 0;
+    }
+
+    return sizeof(uint16_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    return 0;
+  }
+
+  if((end - (*out)) >= sizeof(uint16_t) * len) {
+    uint32_t idx;
+
+    for(idx = 0; idx < len; ++idx) {
+      pushs16(in[idx], out, end);
+    }
+
+    return sizeof(uint16_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+uint32_t pullarray32(uint8_t **in, uint32_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    return 0;
+  }
+
+  if((end - (*in)) >= sizeof(uint32_t) * len) {
+    uint32_t idx;
+
+    for(idx = 0; idx < len; ++idx) {
+      if(!pull32(in, &out[idx], end))
+        return 0;
+    }
+
+    return sizeof(uint32_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+
+uint32_t pullarrays32(uint8_t **in, int32_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    return 0;
+  }
+
+  if((end - (*in)) >= sizeof(uint32_t) * len) {
+    uint32_t idx;
+
+    for(idx = 0; idx < len; ++idx) {
+      if(!pulls32(in, &out[idx], end))
+        return 0;
+    }
+
+    return sizeof(uint32_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+uint32_t pusharray32(uint32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    return 0;
+  }
+
+  if((end - (*out)) >= sizeof(uint32_t) * len) {
+    uint32_t idx;
+
+    for(idx = 0; idx < len; ++idx) {
+      if(!push32(in[idx], out, end))
+        return 0;
+    }
+
+    return sizeof(uint32_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+uint32_t pusharrays32(int32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    return 0;
+  }
+
+  if((end - (*out)) >= sizeof(uint32_t) * len) {
+    uint32_t idx;
+
+    for(idx = 0; idx < len; ++idx) {
+      pushs32(in[idx], out, end);
+    }
+
+    return sizeof(uint32_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+uint32_t pullarray8(uint8_t **in, uint8_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    return 0;
+  }
+
+  if((end - (*in)) >= sizeof(uint8_t) * len) {
+    memcpy(out, (*in), len);
+    (*in)+=len;
+    return sizeof(uint8_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+
+uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
+  if(len == 0)
+    return 1;
+
+  if(len > max_len) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
+    return 0;
+  }
+
+  if((end - (*out)) >= sizeof(uint8_t) * len) {
+    memcpy((*out), in, len);
+    (*out)+=len;
+    return sizeof(uint8_t) * len;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
+    return 0;
+  }
+}
+
+uint8_t packarray(void *array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t **ppwritepackedmsg, uint8_t *end, pack_array_elem_fn fn) {
+  if(count > max_count) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count);
+    return 0;
+  }
+
+  uint16_t i = 0;
+
+  for(i = 0; i < count; ++i) {
+    if((fn)(array, ppwritepackedmsg, end) == 0)
+      return 0;
+
+    array += array_element_size;
+  }
+
+  return 1;
+}
+
+uint8_t unpackarray(uint8_t **ppReadPackedMsg, void *array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t *end, unpack_array_elem_fn fn) {
+  if(count > max_count) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count);
+    return 0;
+  }
+
+  uint16_t i = 0;
+
+  for(i = 0; i < count; ++i) {
+    if((fn)(array, ppReadPackedMsg, end) == 0)
+      return 0;
+
+    array += array_element_size;
+  }
+
+  return 1;
+}
+
+
+uint32_t pack_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  if(ve != 0 && config != 0) {
+    if(config->pack_vendor_extension_tlv) {
+      uint8_t *pStartOfTlv = *ppWritePackedMsg;
+
+      if(pack_tl(ve, ppWritePackedMsg, end) == 0)
+        return 0;
+
+      uint8_t *pStartOfValue = *ppWritePackedMsg;
+
+      if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0)
+        return 0;
+
+      ve->length = (*ppWritePackedMsg) - pStartOfValue;
+      pack_tl(ve, &pStartOfTlv, end);
+      return 1;
+    }
+  }
+
+  return 1;
+}
+
+uint32_t unpack_vendor_extension_tlv(nfapi_tl_t *tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config, nfapi_tl_t **ve_tlv) {
+  if(ve_tlv != 0 && config != 0) {
+    if(config->unpack_vendor_extension_tlv) {
+      return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void **)ve_tlv, config);
+    }
+  }
+
+  return 1;
+}
+
+uint32_t pack_p7_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end,nfapi_p7_codec_config_t *config) {
+  if(ve != 0 && config != 0) {
+    if(config->pack_vendor_extension_tlv) {
+      uint8_t *pStartOfTlv = *ppWritePackedMsg;
+
+      if(pack_tl(ve, ppWritePackedMsg, end) == 0)
+        return 0;
+
+      uint8_t *pStartOfValue = *ppWritePackedMsg;
+
+      if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0)
+        return 0;
+
+      ve->length = (*ppWritePackedMsg) - pStartOfValue;
+      pack_tl(ve, &pStartOfTlv, end);
+      return 1;
+    }
+  }
+
+  return 1;
+}
+
+int unpack_p7_vendor_extension_tlv(nfapi_tl_t *tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config, nfapi_tl_t **ve_tlv) {
+  if(ve_tlv != 0 && config != 0) {
+    if(config->unpack_vendor_extension_tlv) {
+      return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void **)ve_tlv, config);
+    }
+  }
+
+  return 1;
+}
+
+
+uint8_t pack_tl(nfapi_tl_t *tl, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return (push16(tl->tag, ppWritePackedMsg, end) &&
+          push16(tl->length, ppWritePackedMsg, end));
+}
+
+uint8_t unpack_tl(uint8_t **ppReadPackedMsg, nfapi_tl_t *tl, uint8_t *end) {
+  return (pull16(ppReadPackedMsg, &tl->tag, end) &&
+          pull16(ppReadPackedMsg, &tl->length, end));
+}
+
+int unpack_tlv_list(unpack_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config, nfapi_tl_t **ve) {
+  nfapi_tl_t generic_tl;
+  uint8_t numBadTags = 0;
+  uint16_t idx = 0;
+
+  while ((uint8_t *)(*ppReadPackedMsg) < end) {
+    // unpack the tl and process the values accordingly
+    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+      return 0;
+
+    uint8_t tagMatch = 0;
+    uint8_t *pStartOfValue = *ppReadPackedMsg;
+
+    for(idx = 0; idx < size; ++idx) {
+      if(unpack_fns[idx].tag == generic_tl.tag) { // match the extracted tag value with all the tags in unpack_fn list
+        tagMatch = 1;
+        nfapi_tl_t *tl = (nfapi_tl_t *)(unpack_fns[idx].tlv);
+        tl->tag = generic_tl.tag;
+        tl->length = generic_tl.length;
+        int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end);
+
+        if(result == 0) {
+          return 0;
+        }
+
+        // check if the length was right;
+        if(tl->length != (*ppReadPackedMsg - pStartOfValue)) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %d\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue));
+        }
+      }
+    }
+
+    if(tagMatch == 0) {
+      if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE &&
+          generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE) {
+        int result = unpack_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve);
+
+        if(result == 0) {
+          // got tot the end.
+          return 0;
+        } else if(result < 0) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown VE TAG value: 0x%04x\n", generic_tl.tag);
+
+          if (++numBadTags > MAX_BAD_TAG) {
+            NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
+            return 0;
+          }
+
+          if((end - *ppReadPackedMsg) >= generic_tl.length) {
+            // Advance past the unknown TLV
+            (*ppReadPackedMsg) += generic_tl.length;
+          } else {
+            // go to the end
+            return 0;
+          }
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
+
+        if (++numBadTags > MAX_BAD_TAG) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
+          return 0;
+        }
+
+        if((end - *ppReadPackedMsg) >= generic_tl.length) {
+          // Advance past the unknown TLV
+          (*ppReadPackedMsg) += generic_tl.length;
+        } else {
+          // go to the end
+          return 0;
+        }
+      }
+    }
+  }
+
+  return 1;
+}
+int unpack_p7_tlv_list(unpack_p7_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config, nfapi_tl_t **ve) {
+  nfapi_tl_t generic_tl;
+  uint8_t numBadTags = 0;
+  uint16_t idx = 0;
+
+  while ((uint8_t *)(*ppReadPackedMsg) < end) {
+    // unpack the tl and process the values accordingly
+    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+      return 0;
+
+    uint8_t tagMatch = 0;
+    uint8_t *pStartOfValue = *ppReadPackedMsg;
+
+    for(idx = 0; idx < size; ++idx) {
+      if(unpack_fns[idx].tag == generic_tl.tag) {
+        tagMatch = 1;
+        nfapi_tl_t *tl = (nfapi_tl_t *)(unpack_fns[idx].tlv);
+        tl->tag = generic_tl.tag;
+        tl->length = generic_tl.length;
+        int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end, config);
+
+        if(result == 0) {
+          return  0;
+        }
+
+        // check if the length was right;
+        if(tl->length != (*ppReadPackedMsg - pStartOfValue)) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %d\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue));
+        }
+      }
+    }
+
+    if(tagMatch == 0) {
+      if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE &&
+          generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE) {
+        int result = unpack_p7_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve);
+
+        if(result == 0) {
+          // got to end
+          return 0;
+        } else if(result < 0) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
+
+          if (++numBadTags > MAX_BAD_TAG) {
+            NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
+            return -1;
+          }
+
+          if((end - *ppReadPackedMsg) >= generic_tl.length) {
+            // Advance past the unknown TLV
+            (*ppReadPackedMsg) += generic_tl.length;
+          } else {
+            // got ot the dn
+            return 0;
+          }
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
+
+        if (++numBadTags > MAX_BAD_TAG) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
+          return -1;
+        }
+
+        if((end - *ppReadPackedMsg) >= generic_tl.length) {
+          // Advance past the unknown TLV
+          (*ppReadPackedMsg) += generic_tl.length;
+        } else {
+          // got ot the dn
+          return 0;
+        }
+      }
+    }
+  }
+
+  return 1;
+}
+
+// This intermediate function deals with calculating the length of the value
+// and writing into the tlv header.
+uint8_t pack_tlv(uint16_t tag, void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end, pack_tlv_fn fn) {
+  nfapi_tl_t *tl = (nfapi_tl_t *)tlv;
+
+  // If the tag is defined
+  if(tl->tag == tag) {
+    uint8_t *pStartOfTlv = *ppWritePackedMsg;
+
+    // write a dumy tlv header
+    if(pack_tl(tl, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Record the start of the value
+    uint8_t *pStartOfValue = *ppWritePackedMsg;
+
+    // pack the tlv value
+    if(fn(tlv, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // calculate the length of the value and rewrite the tl header
+    tl->length = (*ppWritePackedMsg) - pStartOfValue;
+    // rewrite the header with the correct length
+    pack_tl(tl, &pStartOfTlv, end);
+  } else {
+    if(tl->tag != 0) {
+      NFAPI_TRACE(NFAPI_TRACE_WARN, "Warning pack_tlv tag 0x%x does not match expected 0x%x\n", tl->tag, tag);
+    } else {
+      //NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning pack_tlv tag 0x%x ZERO does not match expected 0x%x\n", tl->tag, tag);
+    }
+  }
+
+  return 1;
+}
+
+const char *nfapi_error_code_to_str(nfapi_error_code_e value) {
+  switch(value) {
+    case NFAPI_MSG_OK:
+      return "NFAPI_MSG_OK";
+
+    case NFAPI_MSG_INVALID_STATE:
+      return "NFAPI_MSG_INVALID_STATE";
+
+    case NFAPI_MSG_INVALID_CONFIG:
+      return "NFAPI_MSG_INVALID_CONFIG";
+
+    case NFAPI_SFN_OUT_OF_SYNC:
+      return "NFAPI_SFN_OUT_OF_SYNC";
+
+    case NFAPI_MSG_SUBFRAME_ERR:
+      return "NFAPI_MSG_SUBFRAME_ERR";
+
+    case NFAPI_MSG_BCH_MISSING:
+      return "NFAPI_MSG_BCH_MISSING";
+
+    case NFAPI_MSG_INVALID_SFN:
+      return "NFAPI_MSG_INVALID_SFN";
+
+    case NFAPI_MSG_HI_ERR:
+      return "NFAPI_MSG_HI_ERR";
+
+    case NFAPI_MSG_TX_ERR:
+      return "NFAPI_MSG_TX_ERR";
+
+    default:
+      return "UNKNOWN";
+  }
+}
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p4.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p4.c
index b429e0a6ce586b1efd943e7f337464e7852e26a2..dbaa4347d33313ce4957b106c623d02ddf28c858 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p4.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p4.c
@@ -1,12 +1,12 @@
 /*
  * Copyright 2017 Cisco Systems, Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * 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.
@@ -27,2059 +27,1804 @@
 #include <nfapi.h>
 #include <debug.h>
 
-static uint32_t get_packed_msg_len(uintptr_t msgHead, uintptr_t msgEnd)
-{
-	if (msgEnd < msgHead)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "get_packed_msg_len: Error in pointers supplied %d, %d\n", msgHead, msgEnd);
-		return 0;
-	}
-
-	return (msgEnd - msgHead);
+static uint32_t get_packed_msg_len(uintptr_t msgHead, uintptr_t msgEnd) {
+  if (msgEnd < msgHead) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "get_packed_msg_len: Error in pointers supplied %d, %d\n", msgHead, msgEnd);
+    return 0;
+  }
+
+  return (msgEnd - msgHead);
 }
 
-static uint8_t pack_opaque_data_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_opaqaue_data_t* value = (nfapi_opaqaue_data_t*)tlv;
-	return pusharray8(value->value, NFAPI_MAX_OPAQUE_DATA, value->length, ppWritePackedMsg, end);
+static uint8_t pack_opaque_data_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_opaqaue_data_t *value = (nfapi_opaqaue_data_t *)tlv;
+  return pusharray8(value->value, NFAPI_MAX_OPAQUE_DATA, value->length, ppWritePackedMsg, end);
 }
 
-static uint8_t unpack_opaque_data_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_opaqaue_data_t* value = (nfapi_opaqaue_data_t*)tlv;
-	value->length = value->tl.length;
-	if(value->length <= NFAPI_MAX_OPAQUE_DATA)
-	{
-		if(!pullarray8(ppReadPackedMsg, value->value, NFAPI_MAX_OPAQUE_DATA, value->length, end))
-			return 0;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Opaque date to long %d \n", value->length);
-		return 0;
-	}
-
-	return 1;
-
-}
-
-static uint8_t pack_lte_rssi_request_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_lte_rssi_request_t* value = (nfapi_lte_rssi_request_t*)tlv;
-
-	return (push8(value->frequency_band_indicator, ppWritePackedMsg, end) &&
-			push16(value->measurement_period, ppWritePackedMsg, end) &&
-			push8(value->bandwidth, ppWritePackedMsg, end) &&
-			push32(value->timeout, ppWritePackedMsg, end) &&
-			push8(value->number_of_earfcns, ppWritePackedMsg, end) &&
-			pusharray16(value->earfcn, NFAPI_MAX_CARRIER_LIST, value->number_of_earfcns, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_utran_rssi_request_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_utran_rssi_request_t* value = (nfapi_utran_rssi_request_t*)tlv;
-
-	return (push8(value->frequency_band_indicator, ppWritePackedMsg, end) &&
-			push16(value->measurement_period, ppWritePackedMsg, end) &&
-			push32(value->timeout, ppWritePackedMsg, end) &&
-			push8(value->number_of_uarfcns, ppWritePackedMsg, end) &&
-			pusharray16(value->uarfcn, NFAPI_MAX_CARRIER_LIST, value->number_of_uarfcns, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_geran_rssi_request_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_geran_rssi_request_t* value = (nfapi_geran_rssi_request_t*)tlv;
-	uint16_t idx = 0;
-
-	if(!(push8(value->frequency_band_indicator, ppWritePackedMsg, end) &&
-		 push16(value->measurement_period, ppWritePackedMsg, end) &&
-		 push32(value->timeout, ppWritePackedMsg, end) &&
-		 push8(value->number_of_arfcns, ppWritePackedMsg, end)))
-		return 0;
+static uint8_t unpack_opaque_data_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_opaqaue_data_t *value = (nfapi_opaqaue_data_t *)tlv;
+  value->length = value->tl.length;
+
+  if(value->length <= NFAPI_MAX_OPAQUE_DATA) {
+    if(!pullarray8(ppReadPackedMsg, value->value, NFAPI_MAX_OPAQUE_DATA, value->length, end))
+      return 0;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Opaque date to long %d \n", value->length);
+    return 0;
+  }
+
+  return 1;
+}
 
-	for(;idx < value->number_of_arfcns; ++idx)
-	{
-		if(!(push16(value->arfcn[idx].arfcn, ppWritePackedMsg, end) &&
-			push8(value->arfcn[idx].direction, ppWritePackedMsg, end)))
-			return 0;
-	}
+static uint8_t pack_lte_rssi_request_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lte_rssi_request_t *value = (nfapi_lte_rssi_request_t *)tlv;
+  return (push8(value->frequency_band_indicator, ppWritePackedMsg, end) &&
+          push16(value->measurement_period, ppWritePackedMsg, end) &&
+          push8(value->bandwidth, ppWritePackedMsg, end) &&
+          push32(value->timeout, ppWritePackedMsg, end) &&
+          push8(value->number_of_earfcns, ppWritePackedMsg, end) &&
+          pusharray16(value->earfcn, NFAPI_MAX_CARRIER_LIST, value->number_of_earfcns, ppWritePackedMsg, end));
+}
 
-	return 1;
+static uint8_t pack_utran_rssi_request_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_utran_rssi_request_t *value = (nfapi_utran_rssi_request_t *)tlv;
+  return (push8(value->frequency_band_indicator, ppWritePackedMsg, end) &&
+          push16(value->measurement_period, ppWritePackedMsg, end) &&
+          push32(value->timeout, ppWritePackedMsg, end) &&
+          push8(value->number_of_uarfcns, ppWritePackedMsg, end) &&
+          pusharray16(value->uarfcn, NFAPI_MAX_CARRIER_LIST, value->number_of_uarfcns, ppWritePackedMsg, end));
 }
 
-static uint8_t pack_nb_iot_rssi_request_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_rssi_request_t* value = (nfapi_nb_iot_rssi_request_t*)tlv;
-	uint16_t idx = 0;
+static uint8_t pack_geran_rssi_request_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_geran_rssi_request_t *value = (nfapi_geran_rssi_request_t *)tlv;
+  uint16_t idx = 0;
+
+  if(!(push8(value->frequency_band_indicator, ppWritePackedMsg, end) &&
+       push16(value->measurement_period, ppWritePackedMsg, end) &&
+       push32(value->timeout, ppWritePackedMsg, end) &&
+       push8(value->number_of_arfcns, ppWritePackedMsg, end)))
+    return 0;
+
+  for(; idx < value->number_of_arfcns; ++idx) {
+    if(!(push16(value->arfcn[idx].arfcn, ppWritePackedMsg, end) &&
+         push8(value->arfcn[idx].direction, ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_nb_iot_rssi_request_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nb_iot_rssi_request_t *value = (nfapi_nb_iot_rssi_request_t *)tlv;
+  uint16_t idx = 0;
+
+  if(!(push8(value->frequency_band_indicator, ppWritePackedMsg, end) &&
+       push16(value->measurement_period, ppWritePackedMsg, end) &&
+       push32(value->timeout, ppWritePackedMsg, end) &&
+       push8(value->number_of_earfcns, ppWritePackedMsg, end)))
+    return 0;
 
-	if(!(push8(value->frequency_band_indicator, ppWritePackedMsg, end) &&
-		 push16(value->measurement_period, ppWritePackedMsg, end) &&
-		 push32(value->timeout, ppWritePackedMsg, end) &&
-		 push8(value->number_of_earfcns, ppWritePackedMsg, end)))
-		return 0;
+  for(; idx < value->number_of_earfcns; ++idx) {
+    if(!(push16(value->earfcn[idx].earfcn, ppWritePackedMsg, end) &&
+         push8(value->earfcn[idx].number_of_ro_dl, ppWritePackedMsg, end)))
+      return 0;
 
-	for(;idx < value->number_of_earfcns; ++idx)
-	{
-		if(!(push16(value->earfcn[idx].earfcn, ppWritePackedMsg, end) &&
-			 push8(value->earfcn[idx].number_of_ro_dl, ppWritePackedMsg, end)))
-			return 0;
-			
-		uint8_t ro_dl_idx = 0;
-		for(ro_dl_idx = 0; ro_dl_idx < value->earfcn[idx].number_of_ro_dl; ++ro_dl_idx)
-		{
-			if(!push8(value->earfcn[idx].ro_dl[ro_dl_idx], ppWritePackedMsg, end))
-				return 0;
-		}
-	}
+    uint8_t ro_dl_idx = 0;
 
-	return 1;
+    for(ro_dl_idx = 0; ro_dl_idx < value->earfcn[idx].number_of_ro_dl; ++ro_dl_idx) {
+      if(!push8(value->earfcn[idx].ro_dl[ro_dl_idx], ppWritePackedMsg, end))
+        return 0;
+    }
+  }
+
+  return 1;
 }
 
 
 
-static uint8_t pack_rssi_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_rssi_request_t *pNfapiMsg = (nfapi_rssi_request_t*)msg;
+static uint8_t pack_rssi_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_rssi_request_t *pNfapiMsg = (nfapi_rssi_request_t *)msg;
+
+  if(push8(pNfapiMsg->rat_type, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  switch(pNfapiMsg->rat_type) {
+    case NFAPI_RAT_TYPE_LTE:
+      if(pack_tlv(NFAPI_LTE_RSSI_REQUEST_TAG, &pNfapiMsg->lte_rssi_request, ppWritePackedMsg, end, &pack_lte_rssi_request_value) == 0)
+        return 0;
+
+      break;
+
+    case NFAPI_RAT_TYPE_UTRAN:
+      if(pack_tlv(NFAPI_UTRAN_RSSI_REQUEST_TAG, &pNfapiMsg->utran_rssi_request, ppWritePackedMsg, end, &pack_utran_rssi_request_value) == 0)
+        return 0;
+
+      break;
 
-	if(push8(pNfapiMsg->rat_type, ppWritePackedMsg, end) == 0)
-		return 0;
+    case NFAPI_RAT_TYPE_GERAN:
+      if(pack_tlv(NFAPI_GERAN_RSSI_REQUEST_TAG, &pNfapiMsg->geran_rssi_request, ppWritePackedMsg, end, &pack_geran_rssi_request_value) == 0)
+        return 0;
 
-	switch(pNfapiMsg->rat_type)
-	{
-		case NFAPI_RAT_TYPE_LTE:
-			if(pack_tlv(NFAPI_LTE_RSSI_REQUEST_TAG, &pNfapiMsg->lte_rssi_request, ppWritePackedMsg, end, &pack_lte_rssi_request_value) == 0)
-				return 0;
-			break;
-		case NFAPI_RAT_TYPE_UTRAN:
-			if(pack_tlv(NFAPI_UTRAN_RSSI_REQUEST_TAG, &pNfapiMsg->utran_rssi_request, ppWritePackedMsg, end, &pack_utran_rssi_request_value) == 0)
-				return 0;
-			break;
-		case NFAPI_RAT_TYPE_GERAN:
-			if(pack_tlv(NFAPI_GERAN_RSSI_REQUEST_TAG, &pNfapiMsg->geran_rssi_request, ppWritePackedMsg, end, &pack_geran_rssi_request_value) == 0)
-				return 0;
-			break;
-		case NFAPI_RAT_TYPE_NB_IOT:
-			if(pack_tlv(NFAPI_NB_IOT_RSSI_REQUEST_TAG, &pNfapiMsg->nb_iot_rssi_request, ppWritePackedMsg, end, &pack_nb_iot_rssi_request_value) == 0)
-				return 0;
-			break;
-	}
-
-	return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-}
-
-static uint8_t pack_rssi_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_rssi_response_t *pNfapiMsg = (nfapi_rssi_response_t*)msg;
-	
-	return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_rssi_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_rssi_indication_body_t* value = (nfapi_rssi_indication_body_t*)tlv;
-
-	return (push16(value->number_of_rssi, ppWritePackedMsg, end) &&
-			pusharrays16(value->rssi, NFAPI_MAX_RSSI, value->number_of_rssi, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_rssi_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_rssi_indication_t *pNfapiMsg = (nfapi_rssi_indication_t*)msg;
-
-	return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			pack_tlv(NFAPI_RSSI_INDICATION_TAG, &pNfapiMsg->rssi_indication_body, ppWritePackedMsg, end, &pack_rssi_indication_body_value) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_lte_cell_search_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_lte_cell_search_request_t* value = (nfapi_lte_cell_search_request_t*)msg;
-
-	return (push16(value->earfcn, ppWritePackedMsg, end) &&
-			push8(value->measurement_bandwidth,  ppWritePackedMsg, end) &&
-			push8(value->exhaustive_search, ppWritePackedMsg, end) &&
-			push32(value->timeout, ppWritePackedMsg, end) &&
-			push8(value->number_of_pci, ppWritePackedMsg, end) &&
-			pusharray16(value->pci, NFAPI_MAX_PCI_LIST, value->number_of_pci, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_utran_cell_search_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_utran_cell_search_request_t* value = (nfapi_utran_cell_search_request_t*)msg;
-
-	return (push16(value->uarfcn, ppWritePackedMsg, end) &&
-			push8(value->exhaustive_search, ppWritePackedMsg, end) &&
-			push32(value->timeout, ppWritePackedMsg, end) &&
-			push8(value->number_of_psc, ppWritePackedMsg, end) &&
-			pusharray16(value->psc, NFAPI_MAX_PSC_LIST, value->number_of_psc, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_geran_cell_search_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_geran_cell_search_request_t* value = (nfapi_geran_cell_search_request_t*)msg;
-
-	return (push32(value->timeout, ppWritePackedMsg, end) &&
-			push8(value->number_of_arfcn, ppWritePackedMsg, end) &&
-			pusharray16(value->arfcn, NFAPI_MAX_ARFCN_LIST, value->number_of_arfcn, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_nb_iot_cell_search_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_cell_search_request_t* value = (nfapi_nb_iot_cell_search_request_t*)msg;
-
-	return (push16(value->earfcn, ppWritePackedMsg, end) &&
-			push8(value->ro_dl, ppWritePackedMsg, end) &&
-			push8(value->exhaustive_search, ppWritePackedMsg, end) &&
-			push32(value->timeout, ppWritePackedMsg, end) &&
-			push8(value->number_of_pci, ppWritePackedMsg, end) &&
-			pusharray16(value->pci, NFAPI_MAX_PCI_LIST, value->number_of_pci, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_cell_search_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_cell_search_request_t *pNfapiMsg = (nfapi_cell_search_request_t*)msg;
-
-	if(push8(pNfapiMsg->rat_type, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	switch(pNfapiMsg->rat_type)
-	{
-		case NFAPI_RAT_TYPE_LTE:
-			{
-				if(pack_tlv(NFAPI_LTE_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->lte_cell_search_request, ppWritePackedMsg, end, &pack_lte_cell_search_request_value) == 0)
-					return 0;
-			}
-			break;
-		case NFAPI_RAT_TYPE_UTRAN:
-			{
-				if(pack_tlv(NFAPI_UTRAN_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->utran_cell_search_request, ppWritePackedMsg, end, &pack_utran_cell_search_request_value) == 0)
-					return 0;
-			}
-			break;
-		case NFAPI_RAT_TYPE_GERAN:
-			{
-				if(pack_tlv(NFAPI_GERAN_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->geran_cell_search_request, ppWritePackedMsg, end, &pack_geran_cell_search_request_value) == 0)
-					return 0;
-			}
-			break;
-		case NFAPI_RAT_TYPE_NB_IOT:
-			{
-				if(pack_tlv(NFAPI_NB_IOT_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->nb_iot_cell_search_request, ppWritePackedMsg, end, &pack_nb_iot_cell_search_request_value) == 0)
-					return 0;
-			}
-			break;
-	};
-	
-	return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_cell_search_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_cell_search_response_t *pNfapiMsg = (nfapi_cell_search_response_t*)msg;
-	
-	return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_lte_cell_search_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_lte_cell_search_indication_t* value = (nfapi_lte_cell_search_indication_t*)msg;
-	uint16_t idx = 0;
-
-	if(push16(value->number_of_lte_cells_found, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	for(idx = 0; idx < value->number_of_lte_cells_found; ++idx)
-	{
-		if(!(push16(value->lte_found_cells[idx].pci, ppWritePackedMsg, end) &&
-			 push8(value->lte_found_cells[idx].rsrp, ppWritePackedMsg, end) &&
-			 push8(value->lte_found_cells[idx].rsrq, ppWritePackedMsg, end) &&
-			 pushs16(value->lte_found_cells[idx].frequency_offset, ppWritePackedMsg, end)))
-			return 0;
-	}
-	return 1;
-}
-
-static uint8_t pack_utran_cell_search_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_utran_cell_search_indication_t* value = (nfapi_utran_cell_search_indication_t*)msg;
-	uint16_t idx = 0;
-
-	if(push16(value->number_of_utran_cells_found, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	for(idx = 0; idx < value->number_of_utran_cells_found; ++idx)
-	{
-		if(!(push16(value->utran_found_cells[idx].psc, ppWritePackedMsg, end) &&
-			 push8(value->utran_found_cells[idx].rscp, ppWritePackedMsg, end) &&
-			 push8(value->utran_found_cells[idx].ecno, ppWritePackedMsg, end) &&
-			 pushs16(value->utran_found_cells[idx].frequency_offset, ppWritePackedMsg, end)))
-			return 0;
-	}
-
-	return 1;
-}
-
-static uint8_t pack_geran_cell_search_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_geran_cell_search_indication_t* value = (nfapi_geran_cell_search_indication_t*)msg;
-	uint16_t idx = 0;
-
-	if(push16(value->number_of_gsm_cells_found, ppWritePackedMsg, end) == 0)
-		return 0;
- 
-	for(idx = 0; idx < value->number_of_gsm_cells_found; ++idx)
-	{
-		if(!(push16(value->gsm_found_cells[idx].arfcn, ppWritePackedMsg, end) &&
-			 push8(value->gsm_found_cells[idx].bsic, ppWritePackedMsg, end) &&
-			 push8(value->gsm_found_cells[idx].rxlev, ppWritePackedMsg, end) &&
-			 push8(value->gsm_found_cells[idx].rxqual, ppWritePackedMsg, end) &&
-			 pushs16(value->gsm_found_cells[idx].frequency_offset, ppWritePackedMsg, end) &&
-			 push32(value->gsm_found_cells[idx].sfn_offset, ppWritePackedMsg, end)))
-			return 0;
-	}
-
-	return 1;
-}
-
-static uint8_t pack_nb_iot_cell_search_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_cell_search_indication_t* value = (nfapi_nb_iot_cell_search_indication_t*)msg;
-	uint16_t idx = 0;
-
-	if(push16(value->number_of_nb_iot_cells_found, ppWritePackedMsg, end) == 0)
-		return 0;
- 
-	for(idx = 0; idx < value->number_of_nb_iot_cells_found; ++idx)
-	{
-		if(!(push16(value->nb_iot_found_cells[idx].pci, ppWritePackedMsg, end) &&
-			 push8(value->nb_iot_found_cells[idx].rsrp, ppWritePackedMsg, end) &&
-			 push8(value->nb_iot_found_cells[idx].rsrq, ppWritePackedMsg, end) &&
-			 pushs16(value->nb_iot_found_cells[idx].frequency_offset, ppWritePackedMsg, end)))
-			return 0;
-	}
-
-	return 1;
-}
-static uint8_t pack_cell_search_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_cell_search_indication_t *pNfapiMsg = (nfapi_cell_search_indication_t*)msg;
-
-	return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			pack_tlv(NFAPI_LTE_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->lte_cell_search_indication, ppWritePackedMsg, end, &pack_lte_cell_search_indication_value) &&
-			pack_tlv(NFAPI_UTRAN_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->utran_cell_search_indication, ppWritePackedMsg, end, &pack_utran_cell_search_indication_value) &&
-			pack_tlv(NFAPI_GERAN_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->geran_cell_search_indication, ppWritePackedMsg, end, &pack_geran_cell_search_indication_value) &&
-			pack_tlv(NFAPI_PNF_CELL_SEARCH_STATE_TAG, &pNfapiMsg->pnf_cell_search_state, ppWritePackedMsg, end, &pack_opaque_data_value) &&
-			pack_tlv(NFAPI_NB_IOT_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->nb_iot_cell_search_indication, ppWritePackedMsg, end, &pack_nb_iot_cell_search_indication_value) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-
-}
-
-static uint8_t pack_lte_broadcast_detect_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_lte_broadcast_detect_request_t* value = (nfapi_lte_broadcast_detect_request_t*)msg;
-
-	return (push16(value->earfcn, ppWritePackedMsg, end) &&
-			push16(value->pci, ppWritePackedMsg, end) &&
-			push32(value->timeout, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_utran_broadcast_detect_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_utran_broadcast_detect_request_t* value = (nfapi_utran_broadcast_detect_request_t*)msg;
-
-	return (push16(value->uarfcn, ppWritePackedMsg, end) &&
-			push16(value->psc, ppWritePackedMsg, end) &&
-			push32(value->timeout, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_nb_iot_broadcast_detect_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_broadcast_detect_request_t* value = (nfapi_nb_iot_broadcast_detect_request_t*)msg;
+      break;
 
-	return (push16(value->earfcn, ppWritePackedMsg, end) &&
-			push8(value->ro_dl, ppWritePackedMsg, end) &&
-			push16(value->pci, ppWritePackedMsg, end) &&
-			push32(value->timeout, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_broadcast_detect_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t * end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_broadcast_detect_request_t *pNfapiMsg = (nfapi_broadcast_detect_request_t*)msg;
+    case NFAPI_RAT_TYPE_NB_IOT:
+      if(pack_tlv(NFAPI_NB_IOT_RSSI_REQUEST_TAG, &pNfapiMsg->nb_iot_rssi_request, ppWritePackedMsg, end, &pack_nb_iot_rssi_request_value) == 0)
+        return 0;
 
-	if(push8(pNfapiMsg->rat_type, ppWritePackedMsg, end) == 0)
-		return 0;
+      break;
+  }
 
-	switch(pNfapiMsg->rat_type)
-	{
-		case NFAPI_RAT_TYPE_LTE:
-			if(pack_tlv(NFAPI_LTE_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->lte_broadcast_detect_request, ppWritePackedMsg, end ,&pack_lte_broadcast_detect_request_value) == 0)
-				return 0;
-			break;
-		case NFAPI_RAT_TYPE_UTRAN:
-			if(pack_tlv(NFAPI_UTRAN_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->utran_broadcast_detect_request, ppWritePackedMsg, end, &pack_utran_broadcast_detect_request_value) == 0)
-				return 0;
-			break;
-		case NFAPI_RAT_TYPE_NB_IOT:
-			if(pack_tlv(NFAPI_NB_IOT_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->nb_iot_broadcast_detect_request, ppWritePackedMsg, end, &pack_nb_iot_broadcast_detect_request_value) == 0)
-				return 0;
-			break;
-			
-	}
-
-	return (pack_tlv(NFAPI_PNF_CELL_SEARCH_STATE_TAG, &pNfapiMsg->pnf_cell_search_state, ppWritePackedMsg, end, &pack_opaque_data_value) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
 }
 
-static uint8_t pack_broadcast_detect_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_broadcast_detect_response_t *pNfapiMsg = (nfapi_broadcast_detect_response_t*)msg;
-	
-	return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_rssi_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_rssi_response_t *pNfapiMsg = (nfapi_rssi_response_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
-static uint8_t pack_lte_broadcast_detect_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_lte_broadcast_detect_indication_t* value = (nfapi_lte_broadcast_detect_indication_t*)msg;
+static uint8_t pack_rssi_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rssi_indication_body_t *value = (nfapi_rssi_indication_body_t *)tlv;
+  return (push16(value->number_of_rssi, ppWritePackedMsg, end) &&
+          pusharrays16(value->rssi, NFAPI_MAX_RSSI, value->number_of_rssi, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_rssi_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_rssi_indication_t *pNfapiMsg = (nfapi_rssi_indication_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_RSSI_INDICATION_TAG, &pNfapiMsg->rssi_indication_body, ppWritePackedMsg, end, &pack_rssi_indication_body_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_lte_cell_search_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lte_cell_search_request_t *value = (nfapi_lte_cell_search_request_t *)msg;
+  return (push16(value->earfcn, ppWritePackedMsg, end) &&
+          push8(value->measurement_bandwidth,  ppWritePackedMsg, end) &&
+          push8(value->exhaustive_search, ppWritePackedMsg, end) &&
+          push32(value->timeout, ppWritePackedMsg, end) &&
+          push8(value->number_of_pci, ppWritePackedMsg, end) &&
+          pusharray16(value->pci, NFAPI_MAX_PCI_LIST, value->number_of_pci, ppWritePackedMsg, end));
+}
 
-	return (push8(value->number_of_tx_antenna, ppWritePackedMsg, end) &&
-			push16(value->mib_length, ppWritePackedMsg, end) &&
-			pusharray8(value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, ppWritePackedMsg, end) &&
-			push32(value->sfn_offset, ppWritePackedMsg, end));
+static uint8_t pack_utran_cell_search_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_utran_cell_search_request_t *value = (nfapi_utran_cell_search_request_t *)msg;
+  return (push16(value->uarfcn, ppWritePackedMsg, end) &&
+          push8(value->exhaustive_search, ppWritePackedMsg, end) &&
+          push32(value->timeout, ppWritePackedMsg, end) &&
+          push8(value->number_of_psc, ppWritePackedMsg, end) &&
+          pusharray16(value->psc, NFAPI_MAX_PSC_LIST, value->number_of_psc, ppWritePackedMsg, end));
 }
 
-static uint8_t pack_utran_broadcast_detect_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_utran_broadcast_detect_indication_t* value = (nfapi_utran_broadcast_detect_indication_t*)msg;
+static uint8_t pack_geran_cell_search_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_geran_cell_search_request_t *value = (nfapi_geran_cell_search_request_t *)msg;
+  return (push32(value->timeout, ppWritePackedMsg, end) &&
+          push8(value->number_of_arfcn, ppWritePackedMsg, end) &&
+          pusharray16(value->arfcn, NFAPI_MAX_ARFCN_LIST, value->number_of_arfcn, ppWritePackedMsg, end));
+}
 
-	return (push16(value->mib_length, ppWritePackedMsg, end) &&
-			pusharray8(value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, ppWritePackedMsg, end) &&
-			push32(value->sfn_offset, ppWritePackedMsg, end));
+static uint8_t pack_nb_iot_cell_search_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nb_iot_cell_search_request_t *value = (nfapi_nb_iot_cell_search_request_t *)msg;
+  return (push16(value->earfcn, ppWritePackedMsg, end) &&
+          push8(value->ro_dl, ppWritePackedMsg, end) &&
+          push8(value->exhaustive_search, ppWritePackedMsg, end) &&
+          push32(value->timeout, ppWritePackedMsg, end) &&
+          push8(value->number_of_pci, ppWritePackedMsg, end) &&
+          pusharray16(value->pci, NFAPI_MAX_PCI_LIST, value->number_of_pci, ppWritePackedMsg, end));
 }
 
-static uint8_t pack_nb_iot_broadcast_detect_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_broadcast_detect_indication_t* value = (nfapi_nb_iot_broadcast_detect_indication_t*)msg;
 
-	return (push8(value->number_of_tx_antenna, ppWritePackedMsg, end) &&
-			push16(value->mib_length, ppWritePackedMsg, end) &&
-			pusharray8(value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, ppWritePackedMsg, end) &&
-			push32(value->sfn_offset, ppWritePackedMsg, end));
+static uint8_t pack_cell_search_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_cell_search_request_t *pNfapiMsg = (nfapi_cell_search_request_t *)msg;
+
+  if(push8(pNfapiMsg->rat_type, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  switch(pNfapiMsg->rat_type) {
+    case NFAPI_RAT_TYPE_LTE: {
+      if(pack_tlv(NFAPI_LTE_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->lte_cell_search_request, ppWritePackedMsg, end, &pack_lte_cell_search_request_value) == 0)
+        return 0;
+    }
+    break;
+
+    case NFAPI_RAT_TYPE_UTRAN: {
+      if(pack_tlv(NFAPI_UTRAN_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->utran_cell_search_request, ppWritePackedMsg, end, &pack_utran_cell_search_request_value) == 0)
+        return 0;
+    }
+    break;
+
+    case NFAPI_RAT_TYPE_GERAN: {
+      if(pack_tlv(NFAPI_GERAN_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->geran_cell_search_request, ppWritePackedMsg, end, &pack_geran_cell_search_request_value) == 0)
+        return 0;
+    }
+    break;
+
+    case NFAPI_RAT_TYPE_NB_IOT: {
+      if(pack_tlv(NFAPI_NB_IOT_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->nb_iot_cell_search_request, ppWritePackedMsg, end, &pack_nb_iot_cell_search_request_value) == 0)
+        return 0;
+    }
+    break;
+  };
+
+  return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
-static uint8_t pack_broadcast_detect_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_broadcast_detect_indication_t *pNfapiMsg = (nfapi_broadcast_detect_indication_t*)msg;
+static uint8_t pack_cell_search_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_cell_search_response_t *pNfapiMsg = (nfapi_cell_search_response_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_lte_cell_search_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lte_cell_search_indication_t *value = (nfapi_lte_cell_search_indication_t *)msg;
+  uint16_t idx = 0;
+
+  if(push16(value->number_of_lte_cells_found, ppWritePackedMsg, end) == 0)
+    return 0;
 
-	return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			pack_tlv(NFAPI_LTE_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->lte_broadcast_detect_indication, ppWritePackedMsg, end, &pack_lte_broadcast_detect_indication_value) &&
-			pack_tlv(NFAPI_UTRAN_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->utran_broadcast_detect_indication, ppWritePackedMsg, end, &pack_utran_broadcast_detect_indication_value) &&
-			pack_tlv(NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, ppWritePackedMsg, end, &pack_opaque_data_value) &&
-			pack_tlv(NFAPI_NB_IOT_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->nb_iot_broadcast_detect_indication, ppWritePackedMsg, end, &pack_nb_iot_broadcast_detect_indication_value) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+  for(idx = 0; idx < value->number_of_lte_cells_found; ++idx) {
+    if(!(push16(value->lte_found_cells[idx].pci, ppWritePackedMsg, end) &&
+         push8(value->lte_found_cells[idx].rsrp, ppWritePackedMsg, end) &&
+         push8(value->lte_found_cells[idx].rsrq, ppWritePackedMsg, end) &&
+         pushs16(value->lte_found_cells[idx].frequency_offset, ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  return 1;
 }
 
-static uint8_t pack_lte_system_information_schedule_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_lte_system_information_schedule_request_t* value = (nfapi_lte_system_information_schedule_request_t*)msg;
+static uint8_t pack_utran_cell_search_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_utran_cell_search_indication_t *value = (nfapi_utran_cell_search_indication_t *)msg;
+  uint16_t idx = 0;
+
+  if(push16(value->number_of_utran_cells_found, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  for(idx = 0; idx < value->number_of_utran_cells_found; ++idx) {
+    if(!(push16(value->utran_found_cells[idx].psc, ppWritePackedMsg, end) &&
+         push8(value->utran_found_cells[idx].rscp, ppWritePackedMsg, end) &&
+         push8(value->utran_found_cells[idx].ecno, ppWritePackedMsg, end) &&
+         pushs16(value->utran_found_cells[idx].frequency_offset, ppWritePackedMsg, end)))
+      return 0;
+  }
 
-	return (push16(value->earfcn, ppWritePackedMsg, end) &&
-			push16(value->pci, ppWritePackedMsg, end) &&
-			push16(value->downlink_channel_bandwidth, ppWritePackedMsg, end) &&
-			push8(value->phich_configuration, ppWritePackedMsg, end) &&
-			push8(value->number_of_tx_antenna, ppWritePackedMsg, end) &&
-			push8(value->retry_count, ppWritePackedMsg, end) &&
-			push32(value->timeout, ppWritePackedMsg, end));
+  return 1;
 }
 
-static uint8_t pack_nb_iot_system_information_schedule_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_system_information_schedule_request_t* value = (nfapi_nb_iot_system_information_schedule_request_t*)msg;
+static uint8_t pack_geran_cell_search_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_geran_cell_search_indication_t *value = (nfapi_geran_cell_search_indication_t *)msg;
+  uint16_t idx = 0;
 
-	return (push16(value->earfcn, ppWritePackedMsg, end) &&
-			push8(value->ro_dl, ppWritePackedMsg, end) &&
-			push16(value->pci, ppWritePackedMsg, end) &&
-			push8(value->scheduling_info_sib1_nb, ppWritePackedMsg, end) &&
-			push32(value->timeout, ppWritePackedMsg, end));
+  if(push16(value->number_of_gsm_cells_found, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  for(idx = 0; idx < value->number_of_gsm_cells_found; ++idx) {
+    if(!(push16(value->gsm_found_cells[idx].arfcn, ppWritePackedMsg, end) &&
+         push8(value->gsm_found_cells[idx].bsic, ppWritePackedMsg, end) &&
+         push8(value->gsm_found_cells[idx].rxlev, ppWritePackedMsg, end) &&
+         push8(value->gsm_found_cells[idx].rxqual, ppWritePackedMsg, end) &&
+         pushs16(value->gsm_found_cells[idx].frequency_offset, ppWritePackedMsg, end) &&
+         push32(value->gsm_found_cells[idx].sfn_offset, ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  return 1;
 }
 
+static uint8_t pack_nb_iot_cell_search_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nb_iot_cell_search_indication_t *value = (nfapi_nb_iot_cell_search_indication_t *)msg;
+  uint16_t idx = 0;
 
-static uint8_t pack_system_information_schedule_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_system_information_schedule_request_t *pNfapiMsg = (nfapi_system_information_schedule_request_t*)msg;
+  if(push16(value->number_of_nb_iot_cells_found, ppWritePackedMsg, end) == 0)
+    return 0;
 
-	if(push8(pNfapiMsg->rat_type, ppWritePackedMsg, end) == 0)
-		return 0;
+  for(idx = 0; idx < value->number_of_nb_iot_cells_found; ++idx) {
+    if(!(push16(value->nb_iot_found_cells[idx].pci, ppWritePackedMsg, end) &&
+         push8(value->nb_iot_found_cells[idx].rsrp, ppWritePackedMsg, end) &&
+         push8(value->nb_iot_found_cells[idx].rsrq, ppWritePackedMsg, end) &&
+         pushs16(value->nb_iot_found_cells[idx].frequency_offset, ppWritePackedMsg, end)))
+      return 0;
+  }
 
-	switch(pNfapiMsg->rat_type)
-	{
-		case NFAPI_RAT_TYPE_LTE:
-			if(pack_tlv(NFAPI_LTE_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG, &pNfapiMsg->lte_system_information_schedule_request, ppWritePackedMsg, end, &pack_lte_system_information_schedule_request_value) == 0)
-				return 0;
-			break;
-		case NFAPI_RAT_TYPE_NB_IOT:
-			if(pack_tlv(NFAPI_NB_IOT_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG, &pNfapiMsg->nb_iot_system_information_schedule_request, ppWritePackedMsg, end, &pack_nb_iot_system_information_schedule_request_value) == 0)
-				return 0;
-			break;
-	}
+  return 1;
+}
+static uint8_t pack_cell_search_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_cell_search_indication_t *pNfapiMsg = (nfapi_cell_search_indication_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_LTE_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->lte_cell_search_indication, ppWritePackedMsg, end, &pack_lte_cell_search_indication_value) &&
+          pack_tlv(NFAPI_UTRAN_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->utran_cell_search_indication, ppWritePackedMsg, end, &pack_utran_cell_search_indication_value) &&
+          pack_tlv(NFAPI_GERAN_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->geran_cell_search_indication, ppWritePackedMsg, end, &pack_geran_cell_search_indication_value) &&
+          pack_tlv(NFAPI_PNF_CELL_SEARCH_STATE_TAG, &pNfapiMsg->pnf_cell_search_state, ppWritePackedMsg, end, &pack_opaque_data_value) &&
+          pack_tlv(NFAPI_NB_IOT_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->nb_iot_cell_search_indication, ppWritePackedMsg, end, &pack_nb_iot_cell_search_indication_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
 
-	return (pack_tlv(NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, ppWritePackedMsg, end, &pack_opaque_data_value) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_lte_broadcast_detect_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lte_broadcast_detect_request_t *value = (nfapi_lte_broadcast_detect_request_t *)msg;
+  return (push16(value->earfcn, ppWritePackedMsg, end) &&
+          push16(value->pci, ppWritePackedMsg, end) &&
+          push32(value->timeout, ppWritePackedMsg, end));
+}
 
+static uint8_t pack_utran_broadcast_detect_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_utran_broadcast_detect_request_t *value = (nfapi_utran_broadcast_detect_request_t *)msg;
+  return (push16(value->uarfcn, ppWritePackedMsg, end) &&
+          push16(value->psc, ppWritePackedMsg, end) &&
+          push32(value->timeout, ppWritePackedMsg, end));
 }
 
-static uint8_t pack_system_information_schedule_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_system_information_schedule_response_t *pNfapiMsg = (nfapi_system_information_schedule_response_t*)msg;
-	
-	return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_nb_iot_broadcast_detect_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nb_iot_broadcast_detect_request_t *value = (nfapi_nb_iot_broadcast_detect_request_t *)msg;
+  return (push16(value->earfcn, ppWritePackedMsg, end) &&
+          push8(value->ro_dl, ppWritePackedMsg, end) &&
+          push16(value->pci, ppWritePackedMsg, end) &&
+          push32(value->timeout, ppWritePackedMsg, end));
 }
 
-static uint8_t pack_lte_system_information_indication_value(void* msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_lte_system_information_indication_t* value = (nfapi_lte_system_information_indication_t*)msg;
+static uint8_t pack_broadcast_detect_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_broadcast_detect_request_t *pNfapiMsg = (nfapi_broadcast_detect_request_t *)msg;
+
+  if(push8(pNfapiMsg->rat_type, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  switch(pNfapiMsg->rat_type) {
+    case NFAPI_RAT_TYPE_LTE:
+      if(pack_tlv(NFAPI_LTE_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->lte_broadcast_detect_request, ppWritePackedMsg, end,&pack_lte_broadcast_detect_request_value) == 0)
+        return 0;
+
+      break;
 
-	return (push8(value->sib_type, ppWritePackedMsg, end) &&
-			push16(value->sib_length, ppWritePackedMsg, end) &&
-			pusharray8(value->sib, NFAPI_MAX_SIB_LENGTH, value->sib_length, ppWritePackedMsg, end));
+    case NFAPI_RAT_TYPE_UTRAN:
+      if(pack_tlv(NFAPI_UTRAN_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->utran_broadcast_detect_request, ppWritePackedMsg, end, &pack_utran_broadcast_detect_request_value) == 0)
+        return 0;
+
+      break;
+
+    case NFAPI_RAT_TYPE_NB_IOT:
+      if(pack_tlv(NFAPI_NB_IOT_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->nb_iot_broadcast_detect_request, ppWritePackedMsg, end, &pack_nb_iot_broadcast_detect_request_value) == 0)
+        return 0;
+
+      break;
+  }
+
+  return (pack_tlv(NFAPI_PNF_CELL_SEARCH_STATE_TAG, &pNfapiMsg->pnf_cell_search_state, ppWritePackedMsg, end, &pack_opaque_data_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
-static uint8_t pack_nb_iot_system_information_indication_value(void* msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_system_information_indication_t* value = (nfapi_nb_iot_system_information_indication_t*)msg;
-
-	return (push8(value->sib_type, ppWritePackedMsg, end) &&
-			push16(value->sib_length, ppWritePackedMsg, end) &&
-			pusharray8(value->sib, NFAPI_MAX_SIB_LENGTH, value->sib_length, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_system_information_schedule_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_system_information_schedule_indication_t *pNfapiMsg = (nfapi_system_information_schedule_indication_t*)msg;
-
-	return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			pack_tlv(NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->lte_system_information_indication, ppWritePackedMsg, end, &pack_lte_system_information_indication_value) &&
-			pack_tlv(NFAPI_NB_IOT_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->nb_iot_system_information_indication, ppWritePackedMsg, end, &pack_nb_iot_system_information_indication_value) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_lte_system_information_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_lte_system_information_request_t* value = (nfapi_lte_system_information_request_t*)msg;
-	uint16_t idx = 0;
-
-	if(!(push16(value->earfcn, ppWritePackedMsg, end) &&
-		 push16(value->pci, ppWritePackedMsg, end) &&
-		 push16(value->downlink_channel_bandwidth, ppWritePackedMsg, end) &&
-		 push8(value->phich_configuration, ppWritePackedMsg, end) &&
-		 push8(value->number_of_tx_antenna, ppWritePackedMsg, end) &&
-		 push8(value->number_of_si_periodicity, ppWritePackedMsg, end)))
-		return 0;
-
-	for(idx = 0; idx < value->number_of_si_periodicity; ++idx)
-	{
-		if(!(push8(value->si_periodicity[idx].si_periodicity, ppWritePackedMsg, end) &&
-			 push8(value->si_periodicity[idx].si_index, ppWritePackedMsg, end)))
-			return 0;
-	}
-
-	return (push8(value->si_window_length, ppWritePackedMsg, end) &&
-			push32(value->timeout, ppWritePackedMsg, end));
-}
-static uint8_t pack_utran_system_information_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_utran_system_information_request_t* value = (nfapi_utran_system_information_request_t*)msg;
-
-	return (push16(value->uarfcn, ppWritePackedMsg, end) &&
-			push16(value->psc, ppWritePackedMsg, end) &&
-			push32(value->timeout, ppWritePackedMsg, end));
-}
-static uint8_t pack_geran_system_information_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_geran_system_information_request_t* value = (nfapi_geran_system_information_request_t*)msg;
-
-	return (push16(value->arfcn, ppWritePackedMsg, end) &&
-			push8(value->bsic, ppWritePackedMsg, end) &&
-			push32(value->timeout, ppWritePackedMsg, end));
-}
-static uint8_t pack_nb_iot_system_information_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_system_information_request_t* value = (nfapi_nb_iot_system_information_request_t*)msg;
-	uint16_t idx = 0;
-
-	if(!(push16(value->earfcn, ppWritePackedMsg, end) &&
-		 push8(value->ro_dl, ppWritePackedMsg, end) &&
-		 push16(value->pci, ppWritePackedMsg, end) &&
-		 push8(value->number_of_si_periodicity, ppWritePackedMsg, end)))
-		return 0;
-
-	for(idx = 0; idx < value->number_of_si_periodicity; ++idx)
-	{
-		if(!(push8(value->si_periodicity[idx].si_periodicity, ppWritePackedMsg, end) &&
-			 push8(value->si_periodicity[idx].si_repetition_pattern, ppWritePackedMsg, end) &&
-			 push8(value->si_periodicity[idx].si_tb_size, ppWritePackedMsg, end) &&
-			 push8(value->si_periodicity[idx].number_of_si_index, ppWritePackedMsg, end)))
-			return 0;
-			
-		uint8_t si_idx;	
-		for(si_idx = 0; si_idx < value->si_periodicity[idx].number_of_si_index; ++si_idx)
-		{
-			if(!(push8(value->si_periodicity[idx].si_index[si_idx], ppWritePackedMsg, end)))
-				return 0;
-		}
-	}
-
-	return (push8(value->si_window_length, ppWritePackedMsg, end) &&
-			push32(value->timeout, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_system_information_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_system_information_request_t *pNfapiMsg = (nfapi_system_information_request_t*)msg;
-
-	if(push8(pNfapiMsg->rat_type, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	switch(pNfapiMsg->rat_type)
-	{
-		case NFAPI_RAT_TYPE_LTE:
-			if(pack_tlv(NFAPI_LTE_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->lte_system_information_request, ppWritePackedMsg, end, &pack_lte_system_information_request_value) == 0)
-				return 0;
-			break;
-		case NFAPI_RAT_TYPE_UTRAN:
-			if(pack_tlv(NFAPI_UTRAN_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->utran_system_information_request, ppWritePackedMsg, end, &pack_utran_system_information_request_value) == 0)
-				return 0;
-			break;
-		case NFAPI_RAT_TYPE_GERAN:
-			if(pack_tlv(NFAPI_GERAN_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->geran_system_information_request, ppWritePackedMsg, end, &pack_geran_system_information_request_value) == 0)
-				return 0;
-			break;
-		case NFAPI_RAT_TYPE_NB_IOT:
-			if(pack_tlv(NFAPI_NB_IOT_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->nb_iot_system_information_request, ppWritePackedMsg, end, &pack_nb_iot_system_information_request_value) == 0)
-				return 0;
-			break;
-	}
-
-	return (pack_tlv(NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, ppWritePackedMsg, end, &pack_opaque_data_value) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_system_information_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end,  nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_system_information_response_t *pNfapiMsg = (nfapi_system_information_response_t*)msg;
-	
-	return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_utran_system_information_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_utran_system_information_indication_t* value = (nfapi_utran_system_information_indication_t*)msg;
-	
-	return (push16(value->sib_length, ppWritePackedMsg, end) &&
-			pusharray8(value->sib, NFAPI_MAX_SIB_LENGTH, value->sib_length, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_geran_system_information_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_geran_system_information_indication_t* value = (nfapi_geran_system_information_indication_t*)msg;
-
-	return (push16(value->si_length, ppWritePackedMsg, end) &&
-			pusharray8(value->si, NFAPI_MAX_SIB_LENGTH, value->si_length, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_system_information_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_system_information_indication_t *pNfapiMsg = (nfapi_system_information_indication_t*)msg;
-	
-	return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			pack_tlv(NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->lte_system_information_indication, ppWritePackedMsg, end, &pack_lte_system_information_indication_value) &&
-			pack_tlv(NFAPI_UTRAN_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->utran_system_information_indication, ppWritePackedMsg, end, &pack_utran_system_information_indication_value) &&
-			pack_tlv(NFAPI_GERAN_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->geran_system_information_indication, ppWritePackedMsg, end, &pack_geran_system_information_indication_value) &&
-			pack_tlv(NFAPI_NB_IOT_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->nb_iot_system_information_indication, ppWritePackedMsg, end, &pack_nb_iot_system_information_indication_value) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-	
-static uint8_t pack_nmm_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nmm_stop_request_t *pNfapiMsg = (nfapi_nmm_stop_request_t*)msg;
-
-	return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nmm_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nmm_stop_response_t *pNfapiMsg = (nfapi_nmm_stop_response_t*)msg;
-	
-	return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t unpack_lte_rssi_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	//int result = 0;
-	nfapi_lte_rssi_request_t* value = (nfapi_lte_rssi_request_t*)tlv;
-
-	if(!(pull8(ppReadPackedMsg, &value->frequency_band_indicator, end) &&
-		 pull16(ppReadPackedMsg, &value->measurement_period, end) &&
-		 pull8(ppReadPackedMsg, &value->bandwidth, end) &&
-		 pull32(ppReadPackedMsg, &value->timeout, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_earfcns, end)))
-		return 0;
-
-	if(value->number_of_earfcns <= NFAPI_MAX_CARRIER_LIST)
-	{
-		if(pullarray16(ppReadPackedMsg, value->earfcn, NFAPI_MAX_CARRIER_LIST, value->number_of_earfcns, end) == 0)
-			return 0;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "More EARFCN's than we can decode %d \n", value->number_of_earfcns);
-		return 0;
-	}
-
-	return 1;
-
-}
-
-static uint8_t unpack_utran_rssi_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_utran_rssi_request_t* value = (nfapi_utran_rssi_request_t*)tlv;
-
-	if(!(pull8(ppReadPackedMsg, &value->frequency_band_indicator, end) &&
-		 pull16(ppReadPackedMsg, &value->measurement_period, end) &&
-		 pull32(ppReadPackedMsg, &value->timeout, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_uarfcns, end)))
-		return 0;
-
-	if(value->number_of_uarfcns <= NFAPI_MAX_CARRIER_LIST)
-	{
-		if(pullarray16(ppReadPackedMsg, value->uarfcn, NFAPI_MAX_CARRIER_LIST, value->number_of_uarfcns, end) == 0)
-			return 0;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "More UARFCN's than we can decode %d \n", value->number_of_uarfcns);
-		return 0;
-	}
-
-	return 1;
-}
-
-static uint8_t unpack_geran_rssi_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_geran_rssi_request_t* value = (nfapi_geran_rssi_request_t*)tlv;
-	uint16_t idx = 0;
-
-	if(!(pull8(ppReadPackedMsg, &value->frequency_band_indicator, end) &&
-	 	 pull16(ppReadPackedMsg, &value->measurement_period, end) &&
-		 pull32(ppReadPackedMsg, &value->timeout, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_arfcns, end)))
-		return 0;
-
-	if(value->number_of_arfcns <= NFAPI_MAX_CARRIER_LIST)
-	{
-		for(idx = 0; idx < value->number_of_arfcns; ++idx)
-		{
-			if(!(pull16(ppReadPackedMsg, &value->arfcn[idx].arfcn, end) &&
-			 	 pull8(ppReadPackedMsg, &value->arfcn[idx].direction, end)))
-				return 0;
-		}
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "More ARFCN's than we can decode %d \n", value->number_of_arfcns);
-		return 0;
-	}
-
-	return 1;
-}
-
-static uint8_t unpack_nb_iot_rssi_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_rssi_request_t* value = (nfapi_nb_iot_rssi_request_t*)tlv;
-	uint16_t idx = 0;
-
-	if(!(pull8(ppReadPackedMsg, &value->frequency_band_indicator, end) &&
-	 	 pull16(ppReadPackedMsg, &value->measurement_period, end) &&
-		 pull32(ppReadPackedMsg, &value->timeout, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_earfcns, end)))
-		return 0;
-
-	if(value->number_of_earfcns <= NFAPI_MAX_CARRIER_LIST)
-	{
-		for(idx = 0; idx < value->number_of_earfcns; ++idx)
-		{
-			if(!(pull16(ppReadPackedMsg, &value->earfcn[idx].earfcn, end) &&
-			 	 pull8(ppReadPackedMsg, &value->earfcn[idx].number_of_ro_dl, end)))
-				return 0;
-				
-			if(value->earfcn[idx].number_of_ro_dl <= NFAPI_MAX_RO_DL)
-			{
-				uint8_t ro_dl_idx = 0;
-				for(ro_dl_idx = 0; ro_dl_idx < value->earfcn[idx].number_of_ro_dl; ++ro_dl_idx)
-				{
-					if(!pull8(ppReadPackedMsg, &value->earfcn[idx].ro_dl[ro_dl_idx], end))
-						return 0;
-				}
-			}
-			else
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "More ROdl's than we can decode %d \n", value->earfcn[idx].number_of_ro_dl);
-				return 0;
-			}
-			
-		}
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "More EARFCN's than we can decode %d \n", value->number_of_earfcns);
-		return 0;
-	}
-
-	return 1;
-}
-
-static uint8_t unpack_rssi_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_rssi_request_t *pNfapiMsg = (nfapi_rssi_request_t*)msg;
-
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_LTE_RSSI_REQUEST_TAG, &pNfapiMsg->lte_rssi_request, &unpack_lte_rssi_request_value},
-		{ NFAPI_UTRAN_RSSI_REQUEST_TAG, &pNfapiMsg->utran_rssi_request, &unpack_utran_rssi_request_value},
-		{ NFAPI_GERAN_RSSI_REQUEST_TAG, &pNfapiMsg->geran_rssi_request, &unpack_geran_rssi_request_value},
-		{ NFAPI_NB_IOT_RSSI_REQUEST_TAG, &pNfapiMsg->nb_iot_rssi_request, &unpack_nb_iot_rssi_request_value},
-	};
-
-	int result = 0;
-
-	result = (pull8(ppReadPackedMsg, &pNfapiMsg->rat_type, end) &&
-			  unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-
-
-	// Verify that the rat type and the tlv match
-	if(result == 1 &&
-	   !((pNfapiMsg->rat_type == NFAPI_RAT_TYPE_LTE && pNfapiMsg->lte_rssi_request.tl.tag == NFAPI_LTE_RSSI_REQUEST_TAG) ||
-	    (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_UTRAN && pNfapiMsg->utran_rssi_request.tl.tag == NFAPI_UTRAN_RSSI_REQUEST_TAG) ||
-	    (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_GERAN && pNfapiMsg->geran_rssi_request.tl.tag == NFAPI_GERAN_RSSI_REQUEST_TAG) ||
-	    (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_NB_IOT && pNfapiMsg->nb_iot_rssi_request.tl.tag == NFAPI_NB_IOT_RSSI_REQUEST_TAG)))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Mismatch RAT Type: %d and TAG value: 0x%04x \n", pNfapiMsg->rat_type, pNfapiMsg->lte_rssi_request.tl.tag);
-		result = 0;
-	}
-	
-	return result;
-}
-
-static uint8_t unpack_rssi_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_rssi_response_t *pNfapiMsg = (nfapi_rssi_response_t*)msg;
-
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
-
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_rssi_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_rssi_indication_body_t* value = (nfapi_rssi_indication_body_t*)tlv;
-
-	if(pull16(ppReadPackedMsg, &value->number_of_rssi, end) == 0)
-		return 0;
-
-	if(value->number_of_rssi <= NFAPI_MAX_RSSI)
-	{
-		if(pullarrays16(ppReadPackedMsg, value->rssi, NFAPI_MAX_RSSI, value->number_of_rssi, end) == 0)
-			return 0;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "More RSSI's than we can decode %d \n", value->number_of_rssi);
-		return 0;
-	}
-
-	return 1;
-}
-
-static uint8_t unpack_rssi_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_rssi_indication_t *pNfapiMsg = (nfapi_rssi_indication_t*)msg;
-
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_RSSI_INDICATION_TAG, &pNfapiMsg->rssi_indication_body, &unpack_rssi_indication_value},
-	};
-
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-		    unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_lte_cell_search_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_lte_cell_search_request_t* value = (nfapi_lte_cell_search_request_t*)tlv;
-
-	if(!(pull16(ppReadPackedMsg, &value->earfcn, end) &&
-		 pull8(ppReadPackedMsg, &value->measurement_bandwidth, end) &&
-		 pull8(ppReadPackedMsg, &value->exhaustive_search, end) &&
-		 pull32(ppReadPackedMsg, &value->timeout, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_pci, end)))
-		return 0;
-
-	if(value->number_of_pci <= NFAPI_MAX_PCI_LIST)
-	{
-		if(pullarray16(ppReadPackedMsg, value->pci, NFAPI_MAX_PCI_LIST, value->number_of_pci, end) == 0)
-			return 0;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "More PCI's than we can decode %d \n", value->number_of_pci);
-		return 0;
-	}
-	return 1;
-}
-
-static uint8_t unpack_utran_cell_search_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_utran_cell_search_request_t* value = (nfapi_utran_cell_search_request_t*)tlv;
-
-	if(!(pull16(ppReadPackedMsg, &value->uarfcn, end) &&
-		 pull8(ppReadPackedMsg, &value->exhaustive_search, end) &&
-		 pull32(ppReadPackedMsg, &value->timeout, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_psc, end)))
-		return 0;
-
-	if(value->number_of_psc <= NFAPI_MAX_PSC_LIST)
-	{
-		if(pullarray16(ppReadPackedMsg, value->psc, NFAPI_MAX_PSC_LIST, value->number_of_psc, end) == 0)
-			return 0;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "More PSC's than we can decode %d \n", value->number_of_psc);
-		return 0;
-	}
-	return 1;
-}
-
-static uint8_t unpack_geran_cell_search_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_geran_cell_search_request_t* value = (nfapi_geran_cell_search_request_t*)tlv;
-
-	if(!(pull32(ppReadPackedMsg, &value->timeout, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_arfcn, end)))
-		return 0;
-
-	if(value->number_of_arfcn <= NFAPI_MAX_ARFCN_LIST)
-	{
-		if(pullarray16(ppReadPackedMsg, value->arfcn, NFAPI_MAX_ARFCN_LIST, value->number_of_arfcn, end) == 0)
-			return 0;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "More ARFCN's than we can decode %d \n", value->number_of_arfcn);
-		return 0;
-	}
-	return 1;
-}
-
-static uint8_t unpack_nb_iot_cell_search_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_cell_search_request_t* value = (nfapi_nb_iot_cell_search_request_t*)tlv;
-
-	if(!(pull16(ppReadPackedMsg, &value->earfcn, end) &&
-		 pull8(ppReadPackedMsg, &value->ro_dl, end) &&
-		 pull8(ppReadPackedMsg, &value->exhaustive_search, end) &&
-		 pull32(ppReadPackedMsg, &value->timeout, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_pci, end)))
-		return 0;
-
-	if(value->number_of_pci <= NFAPI_MAX_PCI_LIST)
-	{
-		if(pullarray16(ppReadPackedMsg, value->pci, NFAPI_MAX_PCI_LIST, value->number_of_pci, end) == 0)
-			return 0;
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "More PCI's than we can decode %d \n", value->number_of_pci);
-		return 0;
-	}
-	return 1;
-}
-
-static uint8_t unpack_cell_search_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_cell_search_request_t *pNfapiMsg = (nfapi_cell_search_request_t*)msg;
-
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_LTE_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->lte_cell_search_request, &unpack_lte_cell_search_request_value},
-		{ NFAPI_UTRAN_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->utran_cell_search_request, &unpack_utran_cell_search_request_value},
-		{ NFAPI_GERAN_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->geran_cell_search_request, &unpack_geran_cell_search_request_value},
-		{ NFAPI_NB_IOT_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->nb_iot_cell_search_request, &unpack_nb_iot_cell_search_request_value},
-	};
-
-	int result = (pull8(ppReadPackedMsg, &pNfapiMsg->rat_type, end) &&
-			  unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-
-	// Verify that the rat type and the tlv match
-	if(result == 1 &&
-	   !((pNfapiMsg->rat_type == NFAPI_RAT_TYPE_LTE && pNfapiMsg->lte_cell_search_request.tl.tag == NFAPI_LTE_CELL_SEARCH_REQUEST_TAG) ||
-	    (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_UTRAN && pNfapiMsg->utran_cell_search_request.tl.tag == NFAPI_UTRAN_CELL_SEARCH_REQUEST_TAG) ||
-	    (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_GERAN && pNfapiMsg->geran_cell_search_request.tl.tag == NFAPI_GERAN_CELL_SEARCH_REQUEST_TAG) ||
-	    (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_NB_IOT && pNfapiMsg->nb_iot_cell_search_request.tl.tag == NFAPI_NB_IOT_CELL_SEARCH_REQUEST_TAG)))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Mismatch RAT Type: %d and TAG value: 0x%04x \n", pNfapiMsg->rat_type, pNfapiMsg->lte_cell_search_request.tl.tag);
-		result = 0;
-	}
-	
-	return result;
-}
-
-static uint8_t unpack_cell_search_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_cell_search_response_t *pNfapiMsg = (nfapi_cell_search_response_t*)msg;
-
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
-
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_lte_cell_search_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_lte_cell_search_indication_t* value = (nfapi_lte_cell_search_indication_t*)tlv;
-
-	uint16_t idx = 0;
-	if(pull16(ppReadPackedMsg, &value->number_of_lte_cells_found, end) == 0)
-		return 0;
-
-	if(value->number_of_lte_cells_found <= NFAPI_MAX_LTE_CELLS_FOUND)
-	{
-		for(idx = 0; idx < value->number_of_lte_cells_found; ++idx)
-		{
-			if(!(pull16(ppReadPackedMsg, &value->lte_found_cells[idx].pci, end) &&
-				 pull8(ppReadPackedMsg, &value->lte_found_cells[idx].rsrp, end) &&
-				 pull8(ppReadPackedMsg, &value->lte_found_cells[idx].rsrq, end) &&
-				 pulls16(ppReadPackedMsg, &value->lte_found_cells[idx].frequency_offset, end)))
-				return 0;
-		}
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found LTE cells than we can decode %d \n", value->number_of_lte_cells_found);
-		return 0;
-	}
-	return 1;
-}
-
-static uint8_t unpack_utran_cell_search_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_utran_cell_search_indication_t* value = (nfapi_utran_cell_search_indication_t*)tlv;
-
-	uint16_t idx = 0;
-	if(pull16(ppReadPackedMsg, &value->number_of_utran_cells_found, end) == 0)
-		return 0;
-
-	if(value->number_of_utran_cells_found <= NFAPI_MAX_UTRAN_CELLS_FOUND)
-	{
-		for(idx = 0; idx < value->number_of_utran_cells_found; ++idx)
-		{
-			if(!(pull16(ppReadPackedMsg, &value->utran_found_cells[idx].psc, end) &&
-				 pull8(ppReadPackedMsg, &value->utran_found_cells[idx].rscp, end) &&
-				 pull8(ppReadPackedMsg, &value->utran_found_cells[idx].ecno, end) &&
-				 pulls16(ppReadPackedMsg, &value->utran_found_cells[idx].frequency_offset, end)))
-				return 0;
-		}
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found UTRAN cells than we can decode %d \n", value->number_of_utran_cells_found);
-		return 0;
-	}
-	return 1;
-}
-
-static uint8_t unpack_geran_cell_search_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_geran_cell_search_indication_t* value = (nfapi_geran_cell_search_indication_t*)tlv;
-
-	uint16_t idx = 0;
-	if(pull16(ppReadPackedMsg, &value->number_of_gsm_cells_found, end) == 0)
-		return 0;
-
-	if(value->number_of_gsm_cells_found <= NFAPI_MAX_GSM_CELLS_FOUND)
-	{
-		for(idx = 0; idx < value->number_of_gsm_cells_found; ++idx)
-		{
-			if(!(pull16(ppReadPackedMsg, &value->gsm_found_cells[idx].arfcn, end) &&
-				 pull8(ppReadPackedMsg, &value->gsm_found_cells[idx].bsic, end) &&
-				 pull8(ppReadPackedMsg, &value->gsm_found_cells[idx].rxlev, end) &&
-				 pull8(ppReadPackedMsg, &value->gsm_found_cells[idx].rxqual, end) &&
-				 pulls16(ppReadPackedMsg, &value->gsm_found_cells[idx].frequency_offset, end) &&
-				 pull32(ppReadPackedMsg, &value->gsm_found_cells[idx].sfn_offset, end)))
-				return 0;
-		}
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found GSM cells than we can decode %d \n", value->number_of_gsm_cells_found);
-		return 0;
-	}
-	return 1;
-}
-
-static uint8_t unpack_nb_iot_cell_search_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_cell_search_indication_t* value = (nfapi_nb_iot_cell_search_indication_t*)tlv;
-
-	uint16_t idx = 0;
-	if(pull16(ppReadPackedMsg, &value->number_of_nb_iot_cells_found, end) == 0)
-		return 0;
-
-	if(value->number_of_nb_iot_cells_found <= NFAPI_MAX_NB_IOT_CELLS_FOUND)
-	{
-		for(idx = 0; idx < value->number_of_nb_iot_cells_found; ++idx)
-		{
-			if(!(pull16(ppReadPackedMsg, &value->nb_iot_found_cells[idx].pci, end) &&
-				 pull8(ppReadPackedMsg, &value->nb_iot_found_cells[idx].rsrp, end) &&
-				 pull8(ppReadPackedMsg, &value->nb_iot_found_cells[idx].rsrq, end) &&
-				 pulls16(ppReadPackedMsg, &value->nb_iot_found_cells[idx].frequency_offset, end)))
-				return 0;
-		}
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found NB_IOT cells than we can decode %d \n", value->number_of_nb_iot_cells_found);
-		return 0;
-	}
-	return 1;
-}
-
-static uint8_t unpack_cell_search_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_cell_search_indication_t *pNfapiMsg = (nfapi_cell_search_indication_t*)msg;
-
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_LTE_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->lte_cell_search_indication, &unpack_lte_cell_search_indication_value},
-		{ NFAPI_UTRAN_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->utran_cell_search_indication, &unpack_utran_cell_search_indication_value},
-		{ NFAPI_GERAN_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->geran_cell_search_indication, &unpack_geran_cell_search_indication_value},
-		{ NFAPI_PNF_CELL_SEARCH_STATE_TAG, &pNfapiMsg->pnf_cell_search_state, &unpack_opaque_data_value},
-		{ NFAPI_NB_IOT_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->nb_iot_cell_search_indication, &unpack_nb_iot_cell_search_indication_value},
-	};
-
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-		
-}
-
-static uint8_t unpack_lte_broadcast_detect_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_lte_broadcast_detect_request_t* value = (nfapi_lte_broadcast_detect_request_t*)tlv;
-
-	return (pull16(ppReadPackedMsg, &value->earfcn, end) &&
-			pull16(ppReadPackedMsg, &value->pci, end) &&
-			pull32(ppReadPackedMsg, &value->timeout, end));
-}
-
-static uint8_t unpack_utran_broadcast_detect_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_utran_broadcast_detect_request_t* value = (nfapi_utran_broadcast_detect_request_t*)tlv;
-
-	return (pull16(ppReadPackedMsg, &value->uarfcn, end) &&
-			pull16(ppReadPackedMsg, &value->psc, end) &&
-			pull32(ppReadPackedMsg, &value->timeout, end));
-}
-
-static uint8_t unpack_nb_iot_broadcast_detect_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_broadcast_detect_request_t* value = (nfapi_nb_iot_broadcast_detect_request_t*)tlv;
-
-	return (pull16(ppReadPackedMsg, &value->earfcn, end) &&
-			pull8(ppReadPackedMsg, &value->ro_dl, end) &&
-			pull16(ppReadPackedMsg, &value->pci, end) &&
-			pull32(ppReadPackedMsg, &value->timeout, end));
-}
-
-static uint8_t unpack_broadcast_detect_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_broadcast_detect_request_t *pNfapiMsg = (nfapi_broadcast_detect_request_t*)msg;
-
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_LTE_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->lte_broadcast_detect_request, &unpack_lte_broadcast_detect_request_value},
-		{ NFAPI_UTRAN_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->utran_broadcast_detect_request, &unpack_utran_broadcast_detect_request_value},
-		{ NFAPI_PNF_CELL_SEARCH_STATE_TAG, &pNfapiMsg->pnf_cell_search_state, &unpack_opaque_data_value},
-		{ NFAPI_NB_IOT_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->nb_iot_broadcast_detect_request, &unpack_nb_iot_broadcast_detect_request_value}
-	};
-
-	return (pull8(ppReadPackedMsg, &pNfapiMsg->rat_type, end) &&	
-			unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_broadcast_detect_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_broadcast_detect_response_t *pNfapiMsg = (nfapi_broadcast_detect_response_t*)msg;
+static uint8_t pack_broadcast_detect_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_broadcast_detect_response_t *pNfapiMsg = (nfapi_broadcast_detect_response_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
 
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
+static uint8_t pack_lte_broadcast_detect_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lte_broadcast_detect_indication_t *value = (nfapi_lte_broadcast_detect_indication_t *)msg;
+  return (push8(value->number_of_tx_antenna, ppWritePackedMsg, end) &&
+          push16(value->mib_length, ppWritePackedMsg, end) &&
+          pusharray8(value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, ppWritePackedMsg, end) &&
+          push32(value->sfn_offset, ppWritePackedMsg, end));
+}
 
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+static uint8_t pack_utran_broadcast_detect_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_utran_broadcast_detect_indication_t *value = (nfapi_utran_broadcast_detect_indication_t *)msg;
+  return (push16(value->mib_length, ppWritePackedMsg, end) &&
+          pusharray8(value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, ppWritePackedMsg, end) &&
+          push32(value->sfn_offset, ppWritePackedMsg, end));
 }
 
-static uint8_t unpack_lte_broadcast_detect_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_lte_broadcast_detect_indication_t* value = (nfapi_lte_broadcast_detect_indication_t*)tlv;
+static uint8_t pack_nb_iot_broadcast_detect_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nb_iot_broadcast_detect_indication_t *value = (nfapi_nb_iot_broadcast_detect_indication_t *)msg;
+  return (push8(value->number_of_tx_antenna, ppWritePackedMsg, end) &&
+          push16(value->mib_length, ppWritePackedMsg, end) &&
+          pusharray8(value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, ppWritePackedMsg, end) &&
+          push32(value->sfn_offset, ppWritePackedMsg, end));
+}
 
-	if(!(pull8(ppReadPackedMsg, &value->number_of_tx_antenna, end) &&
-	 	 pull16(ppReadPackedMsg, &value->mib_length, end)))
-		return 0;
+static uint8_t pack_broadcast_detect_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_broadcast_detect_indication_t *pNfapiMsg = (nfapi_broadcast_detect_indication_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_LTE_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->lte_broadcast_detect_indication, ppWritePackedMsg, end, &pack_lte_broadcast_detect_indication_value) &&
+          pack_tlv(NFAPI_UTRAN_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->utran_broadcast_detect_indication, ppWritePackedMsg, end, &pack_utran_broadcast_detect_indication_value) &&
+          pack_tlv(NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, ppWritePackedMsg, end, &pack_opaque_data_value) &&
+          pack_tlv(NFAPI_NB_IOT_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->nb_iot_broadcast_detect_indication, ppWritePackedMsg, end, &pack_nb_iot_broadcast_detect_indication_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
 
-	if(value->mib_length > NFAPI_MAX_MIB_LENGTH)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "MIB too long %d \n", value->mib_length);
-		return 0;
-	}
-	
-	return (pullarray8(ppReadPackedMsg, value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, end) &&
-			pull32(ppReadPackedMsg, &value->sfn_offset, end));
+static uint8_t pack_lte_system_information_schedule_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lte_system_information_schedule_request_t *value = (nfapi_lte_system_information_schedule_request_t *)msg;
+  return (push16(value->earfcn, ppWritePackedMsg, end) &&
+          push16(value->pci, ppWritePackedMsg, end) &&
+          push16(value->downlink_channel_bandwidth, ppWritePackedMsg, end) &&
+          push8(value->phich_configuration, ppWritePackedMsg, end) &&
+          push8(value->number_of_tx_antenna, ppWritePackedMsg, end) &&
+          push8(value->retry_count, ppWritePackedMsg, end) &&
+          push32(value->timeout, ppWritePackedMsg, end));
 }
 
-static uint8_t unpack_utran_broadcast_detect_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_utran_broadcast_detect_indication_t* value = (nfapi_utran_broadcast_detect_indication_t*)tlv;
+static uint8_t pack_nb_iot_system_information_schedule_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nb_iot_system_information_schedule_request_t *value = (nfapi_nb_iot_system_information_schedule_request_t *)msg;
+  return (push16(value->earfcn, ppWritePackedMsg, end) &&
+          push8(value->ro_dl, ppWritePackedMsg, end) &&
+          push16(value->pci, ppWritePackedMsg, end) &&
+          push8(value->scheduling_info_sib1_nb, ppWritePackedMsg, end) &&
+          push32(value->timeout, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_system_information_schedule_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_system_information_schedule_request_t *pNfapiMsg = (nfapi_system_information_schedule_request_t *)msg;
 
-	if(pull16(ppReadPackedMsg, &value->mib_length, end) == 0)
-		return 0;
+  if(push8(pNfapiMsg->rat_type, ppWritePackedMsg, end) == 0)
+    return 0;
 
-	if(value->mib_length > NFAPI_MAX_MIB_LENGTH)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "MIB too long %d \n", value->mib_length);
-		return 0;
-	}
+  switch(pNfapiMsg->rat_type) {
+    case NFAPI_RAT_TYPE_LTE:
+      if(pack_tlv(NFAPI_LTE_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG, &pNfapiMsg->lte_system_information_schedule_request, ppWritePackedMsg, end, &pack_lte_system_information_schedule_request_value) == 0)
+        return 0;
 
-	return (pullarray8(ppReadPackedMsg, value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, end) &&
-			pull32(ppReadPackedMsg, &value->sfn_offset, end));
+      break;
+
+    case NFAPI_RAT_TYPE_NB_IOT:
+      if(pack_tlv(NFAPI_NB_IOT_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG, &pNfapiMsg->nb_iot_system_information_schedule_request, ppWritePackedMsg, end,
+                  &pack_nb_iot_system_information_schedule_request_value) == 0)
+        return 0;
+
+      break;
+  }
+
+  return (pack_tlv(NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, ppWritePackedMsg, end, &pack_opaque_data_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
-static uint8_t unpack_nb_iot_broadcast_detect_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_broadcast_detect_indication_t* value = (nfapi_nb_iot_broadcast_detect_indication_t*)tlv;
+static uint8_t pack_system_information_schedule_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_system_information_schedule_response_t *pNfapiMsg = (nfapi_system_information_schedule_response_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
 
-	if(!(pull8(ppReadPackedMsg, &value->number_of_tx_antenna, end) && 
-		 pull16(ppReadPackedMsg, &value->mib_length, end)))
-		return 0;
+static uint8_t pack_lte_system_information_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lte_system_information_indication_t *value = (nfapi_lte_system_information_indication_t *)msg;
+  return (push8(value->sib_type, ppWritePackedMsg, end) &&
+          push16(value->sib_length, ppWritePackedMsg, end) &&
+          pusharray8(value->sib, NFAPI_MAX_SIB_LENGTH, value->sib_length, ppWritePackedMsg, end));
+}
 
-	if(value->mib_length > NFAPI_MAX_MIB_LENGTH)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "MIB too long %d \n", value->mib_length);
-		return 0;
-	}
+static uint8_t pack_nb_iot_system_information_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nb_iot_system_information_indication_t *value = (nfapi_nb_iot_system_information_indication_t *)msg;
+  return (push8(value->sib_type, ppWritePackedMsg, end) &&
+          push16(value->sib_length, ppWritePackedMsg, end) &&
+          pusharray8(value->sib, NFAPI_MAX_SIB_LENGTH, value->sib_length, ppWritePackedMsg, end));
+}
 
-	return (pullarray8(ppReadPackedMsg, value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, end) &&
-			pull32(ppReadPackedMsg, &value->sfn_offset, end));
+static uint8_t pack_system_information_schedule_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_system_information_schedule_indication_t *pNfapiMsg = (nfapi_system_information_schedule_indication_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->lte_system_information_indication, ppWritePackedMsg, end, &pack_lte_system_information_indication_value) &&
+          pack_tlv(NFAPI_NB_IOT_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->nb_iot_system_information_indication, ppWritePackedMsg, end, &pack_nb_iot_system_information_indication_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
-static uint8_t unpack_broadcast_detect_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_broadcast_detect_indication_t *pNfapiMsg = (nfapi_broadcast_detect_indication_t*)msg;
+static uint8_t pack_lte_system_information_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lte_system_information_request_t *value = (nfapi_lte_system_information_request_t *)msg;
+  uint16_t idx = 0;
 
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_LTE_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->lte_broadcast_detect_indication, &unpack_lte_broadcast_detect_indication_value},
-		{ NFAPI_UTRAN_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->utran_broadcast_detect_indication, &unpack_utran_broadcast_detect_indication_value},
-		{ NFAPI_NB_IOT_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->nb_iot_broadcast_detect_indication, &unpack_nb_iot_broadcast_detect_indication_value},
-		{ NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, &unpack_opaque_data_value}
-	};
+  if(!(push16(value->earfcn, ppWritePackedMsg, end) &&
+       push16(value->pci, ppWritePackedMsg, end) &&
+       push16(value->downlink_channel_bandwidth, ppWritePackedMsg, end) &&
+       push8(value->phich_configuration, ppWritePackedMsg, end) &&
+       push8(value->number_of_tx_antenna, ppWritePackedMsg, end) &&
+       push8(value->number_of_si_periodicity, ppWritePackedMsg, end)))
+    return 0;
 
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+  for(idx = 0; idx < value->number_of_si_periodicity; ++idx) {
+    if(!(push8(value->si_periodicity[idx].si_periodicity, ppWritePackedMsg, end) &&
+         push8(value->si_periodicity[idx].si_index, ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  return (push8(value->si_window_length, ppWritePackedMsg, end) &&
+          push32(value->timeout, ppWritePackedMsg, end));
+}
+static uint8_t pack_utran_system_information_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_utran_system_information_request_t *value = (nfapi_utran_system_information_request_t *)msg;
+  return (push16(value->uarfcn, ppWritePackedMsg, end) &&
+          push16(value->psc, ppWritePackedMsg, end) &&
+          push32(value->timeout, ppWritePackedMsg, end));
+}
+static uint8_t pack_geran_system_information_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_geran_system_information_request_t *value = (nfapi_geran_system_information_request_t *)msg;
+  return (push16(value->arfcn, ppWritePackedMsg, end) &&
+          push8(value->bsic, ppWritePackedMsg, end) &&
+          push32(value->timeout, ppWritePackedMsg, end));
 }
+static uint8_t pack_nb_iot_system_information_request_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nb_iot_system_information_request_t *value = (nfapi_nb_iot_system_information_request_t *)msg;
+  uint16_t idx = 0;
+
+  if(!(push16(value->earfcn, ppWritePackedMsg, end) &&
+       push8(value->ro_dl, ppWritePackedMsg, end) &&
+       push16(value->pci, ppWritePackedMsg, end) &&
+       push8(value->number_of_si_periodicity, ppWritePackedMsg, end)))
+    return 0;
+
+  for(idx = 0; idx < value->number_of_si_periodicity; ++idx) {
+    if(!(push8(value->si_periodicity[idx].si_periodicity, ppWritePackedMsg, end) &&
+         push8(value->si_periodicity[idx].si_repetition_pattern, ppWritePackedMsg, end) &&
+         push8(value->si_periodicity[idx].si_tb_size, ppWritePackedMsg, end) &&
+         push8(value->si_periodicity[idx].number_of_si_index, ppWritePackedMsg, end)))
+      return 0;
 
-static uint8_t unpack_lte_system_information_schedule_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_lte_system_information_schedule_request_t* value = (nfapi_lte_system_information_schedule_request_t*)tlv;
+    uint8_t si_idx;
 
-	return (pull16(ppReadPackedMsg, &value->earfcn, end) &&
-			pull16(ppReadPackedMsg, &value->pci, end) &&
-			pull16(ppReadPackedMsg, &value->downlink_channel_bandwidth, end) &&
-			pull8(ppReadPackedMsg, &value->phich_configuration, end) &&
-			pull8(ppReadPackedMsg, &value->number_of_tx_antenna, end) &&
-			pull8(ppReadPackedMsg, &value->retry_count, end) &&
-			pull32(ppReadPackedMsg, &value->timeout, end));
+    for(si_idx = 0; si_idx < value->si_periodicity[idx].number_of_si_index; ++si_idx) {
+      if(!(push8(value->si_periodicity[idx].si_index[si_idx], ppWritePackedMsg, end)))
+        return 0;
+    }
+  }
+
+  return (push8(value->si_window_length, ppWritePackedMsg, end) &&
+          push32(value->timeout, ppWritePackedMsg, end));
 }
 
-static uint8_t unpack_nb_iot_system_information_schedule_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_system_information_schedule_request_t* value = (nfapi_nb_iot_system_information_schedule_request_t*)tlv;
 
-	return (pull16(ppReadPackedMsg, &value->earfcn, end) &&
-			pull8(ppReadPackedMsg, &value->ro_dl, end) &&	
-			pull16(ppReadPackedMsg, &value->pci, end) &&
-			pull8(ppReadPackedMsg, &value->scheduling_info_sib1_nb, end) &&
-			pull32(ppReadPackedMsg, &value->timeout, end));
+static uint8_t pack_system_information_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_system_information_request_t *pNfapiMsg = (nfapi_system_information_request_t *)msg;
+
+  if(push8(pNfapiMsg->rat_type, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  switch(pNfapiMsg->rat_type) {
+    case NFAPI_RAT_TYPE_LTE:
+      if(pack_tlv(NFAPI_LTE_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->lte_system_information_request, ppWritePackedMsg, end, &pack_lte_system_information_request_value) == 0)
+        return 0;
+
+      break;
+
+    case NFAPI_RAT_TYPE_UTRAN:
+      if(pack_tlv(NFAPI_UTRAN_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->utran_system_information_request, ppWritePackedMsg, end, &pack_utran_system_information_request_value) == 0)
+        return 0;
+
+      break;
+
+    case NFAPI_RAT_TYPE_GERAN:
+      if(pack_tlv(NFAPI_GERAN_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->geran_system_information_request, ppWritePackedMsg, end, &pack_geran_system_information_request_value) == 0)
+        return 0;
+
+      break;
+
+    case NFAPI_RAT_TYPE_NB_IOT:
+      if(pack_tlv(NFAPI_NB_IOT_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->nb_iot_system_information_request, ppWritePackedMsg, end, &pack_nb_iot_system_information_request_value) == 0)
+        return 0;
+
+      break;
+  }
+
+  return (pack_tlv(NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, ppWritePackedMsg, end, &pack_opaque_data_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
-static uint8_t unpack_system_information_schedule_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_system_information_schedule_request_t *pNfapiMsg = (nfapi_system_information_schedule_request_t*)msg;
+static uint8_t pack_system_information_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end,  nfapi_p4_p5_codec_config_t *config) {
+  nfapi_system_information_response_t *pNfapiMsg = (nfapi_system_information_response_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
 
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_LTE_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG, &pNfapiMsg->lte_system_information_schedule_request, &unpack_lte_system_information_schedule_request_value},
-		{ NFAPI_NB_IOT_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG, &pNfapiMsg->nb_iot_system_information_schedule_request, &unpack_nb_iot_system_information_schedule_request_value},
-		{ NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, &unpack_opaque_data_value}
-	};
+static uint8_t pack_utran_system_information_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_utran_system_information_indication_t *value = (nfapi_utran_system_information_indication_t *)msg;
+  return (push16(value->sib_length, ppWritePackedMsg, end) &&
+          pusharray8(value->sib, NFAPI_MAX_SIB_LENGTH, value->sib_length, ppWritePackedMsg, end));
+}
 
-	return (pull8(ppReadPackedMsg, &pNfapiMsg->rat_type, end) &&
-			unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+static uint8_t pack_geran_system_information_indication_value(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_geran_system_information_indication_t *value = (nfapi_geran_system_information_indication_t *)msg;
+  return (push16(value->si_length, ppWritePackedMsg, end) &&
+          pusharray8(value->si, NFAPI_MAX_SIB_LENGTH, value->si_length, ppWritePackedMsg, end));
 }
 
-static uint8_t unpack_system_information_schedule_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_system_information_schedule_response_t *pNfapiMsg = (nfapi_system_information_schedule_response_t*)msg;
+static uint8_t pack_system_information_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_system_information_indication_t *pNfapiMsg = (nfapi_system_information_indication_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->lte_system_information_indication, ppWritePackedMsg, end, &pack_lte_system_information_indication_value) &&
+          pack_tlv(NFAPI_UTRAN_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->utran_system_information_indication, ppWritePackedMsg, end, &pack_utran_system_information_indication_value) &&
+          pack_tlv(NFAPI_GERAN_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->geran_system_information_indication, ppWritePackedMsg, end, &pack_geran_system_information_indication_value) &&
+          pack_tlv(NFAPI_NB_IOT_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->nb_iot_system_information_indication, ppWritePackedMsg, end, &pack_nb_iot_system_information_indication_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
 
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
+static uint8_t pack_nmm_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nmm_stop_request_t *pNfapiMsg = (nfapi_nmm_stop_request_t *)msg;
+  return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
 
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+static uint8_t pack_nmm_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nmm_stop_response_t *pNfapiMsg = (nfapi_nmm_stop_response_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
-static uint8_t unpack_lte_system_information_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_lte_system_information_indication_t* value = (nfapi_lte_system_information_indication_t*)tlv;
+static uint8_t unpack_lte_rssi_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  //int result = 0;
+  nfapi_lte_rssi_request_t *value = (nfapi_lte_rssi_request_t *)tlv;
 
-	if(!(pull8(ppReadPackedMsg, &value->sib_type, end) &&
-		 pull16(ppReadPackedMsg, &value->sib_length, end)))
-		return 0;
+  if(!(pull8(ppReadPackedMsg, &value->frequency_band_indicator, end) &&
+       pull16(ppReadPackedMsg, &value->measurement_period, end) &&
+       pull8(ppReadPackedMsg, &value->bandwidth, end) &&
+       pull32(ppReadPackedMsg, &value->timeout, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_earfcns, end)))
+    return 0;
 
-	if(value->sib_length > NFAPI_MAX_SIB_LENGTH)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "SIB too long %d \n", value->sib_length);
-		return 0;
-	}
-	
-	if(pullarray8(ppReadPackedMsg, value->sib, NFAPI_MAX_SIB_LENGTH,  value->sib_length, end) == 0)
-		return 0;
+  if(value->number_of_earfcns <= NFAPI_MAX_CARRIER_LIST) {
+    if(pullarray16(ppReadPackedMsg, value->earfcn, NFAPI_MAX_CARRIER_LIST, value->number_of_earfcns, end) == 0)
+      return 0;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "More EARFCN's than we can decode %d \n", value->number_of_earfcns);
+    return 0;
+  }
 
-	return 1;
+  return 1;
 }
 
-static uint8_t unpack_nb_iot_system_information_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_system_information_indication_t* value = (nfapi_nb_iot_system_information_indication_t*)tlv;
+static uint8_t unpack_utran_rssi_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_utran_rssi_request_t *value = (nfapi_utran_rssi_request_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->frequency_band_indicator, end) &&
+       pull16(ppReadPackedMsg, &value->measurement_period, end) &&
+       pull32(ppReadPackedMsg, &value->timeout, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_uarfcns, end)))
+    return 0;
+
+  if(value->number_of_uarfcns <= NFAPI_MAX_CARRIER_LIST) {
+    if(pullarray16(ppReadPackedMsg, value->uarfcn, NFAPI_MAX_CARRIER_LIST, value->number_of_uarfcns, end) == 0)
+      return 0;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "More UARFCN's than we can decode %d \n", value->number_of_uarfcns);
+    return 0;
+  }
 
-	if(!(pull8(ppReadPackedMsg, &value->sib_type, end) &&
-		 pull16(ppReadPackedMsg, &value->sib_length, end)))
-		return 0;
+  return 1;
+}
 
-	if(value->sib_length > NFAPI_MAX_SIB_LENGTH)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "SIB too long %d \n", value->sib_length);
-		return 0;
-	}
-	
-	if(pullarray8(ppReadPackedMsg, value->sib, NFAPI_MAX_SIB_LENGTH,  value->sib_length, end) == 0)
-		return 0;
-
-	return 1;
-}
-
-static uint8_t unpack_system_information_schedule_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_system_information_schedule_indication_t *pNfapiMsg = (nfapi_system_information_schedule_indication_t*)msg;
-
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->lte_system_information_indication, &unpack_lte_system_information_indication_value},
-		{ NFAPI_NB_IOT_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->nb_iot_system_information_indication, &unpack_nb_iot_system_information_indication_value},
-	};
-
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_lte_system_information_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_lte_system_information_request_t* value = (nfapi_lte_system_information_request_t*)tlv;
-	uint16_t idx = 0;
-
-	if(!(pull16(ppReadPackedMsg, &value->earfcn, end) &&
-		 pull16(ppReadPackedMsg, &value->pci, end) &&
-		 pull16(ppReadPackedMsg, &value->downlink_channel_bandwidth, end) &&
-		 pull8(ppReadPackedMsg, &value->phich_configuration, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_tx_antenna, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_si_periodicity, end)))
-		return 0;
-
-	if(value->number_of_si_periodicity > NFAPI_MAX_SI_PERIODICITY)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found SI periodicity than we can decode %d \n", value->number_of_si_periodicity);
-		return 0;
-	}
-
-	for(idx = 0; idx < value->number_of_si_periodicity; ++idx)
-	{
-		if(!(pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_periodicity, end) &&
-			 pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_index, end)))
-			return 0;
-	}
-
-	if(!(pull8(ppReadPackedMsg, &value->si_window_length, end) &&
-	 	 pull32(ppReadPackedMsg, &value->timeout, end)))
-		return 0;
-
-	return 1;
-}
-
-static uint8_t unpack_utran_system_information_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_utran_system_information_request_t* value = (nfapi_utran_system_information_request_t*)tlv;
-
-	return (pull16(ppReadPackedMsg, &value->uarfcn, end) &&
-			pull16(ppReadPackedMsg, &value->psc, end) &&
-			pull32(ppReadPackedMsg, &value->timeout, end));
-}
-
-static uint8_t unpack_geran_system_information_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_geran_system_information_request_t* value = (nfapi_geran_system_information_request_t*)tlv;
-
-	return (pull16(ppReadPackedMsg, &value->arfcn, end) &&
-			pull8(ppReadPackedMsg, &value->bsic, end) &&
-			pull32(ppReadPackedMsg, &value->timeout, end));
-}
-
-static uint8_t unpack_nb_iot_system_information_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nb_iot_system_information_request_t* value = (nfapi_nb_iot_system_information_request_t*)tlv;
-	uint16_t idx = 0;
-
-	if(!(pull16(ppReadPackedMsg, &value->earfcn, end) &&
-		 pull8(ppReadPackedMsg, &value->ro_dl, end) &&
-		 pull16(ppReadPackedMsg, &value->pci, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_si_periodicity, end)))
-		return 0;
-
-	if(value->number_of_si_periodicity > NFAPI_MAX_SI_PERIODICITY)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found SI periodicity than we can decode %d \n", value->number_of_si_periodicity);
-		return 0;
-	}
-
-	for(idx = 0; idx < value->number_of_si_periodicity; ++idx)
-	{
-		if(!(pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_periodicity, end) &&
-			 pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_repetition_pattern, end) &&
-			 pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_tb_size, end) &&
-			 pull8(ppReadPackedMsg, &value->si_periodicity[idx].number_of_si_index, end)))
-			return 0;
-			
-		uint8_t si_idx;
-		for(si_idx = 0; si_idx < value->si_periodicity[idx].number_of_si_index; ++si_idx)
-		{
-			if(!(pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_index[si_idx], end)))
-				return 0;
-			
-		}
-	}
-
-	if(!(pull8(ppReadPackedMsg, &value->si_window_length, end) &&
-	 	 pull32(ppReadPackedMsg, &value->timeout, end)))
-		return 0;
+static uint8_t unpack_geran_rssi_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_geran_rssi_request_t *value = (nfapi_geran_rssi_request_t *)tlv;
+  uint16_t idx = 0;
+
+  if(!(pull8(ppReadPackedMsg, &value->frequency_band_indicator, end) &&
+       pull16(ppReadPackedMsg, &value->measurement_period, end) &&
+       pull32(ppReadPackedMsg, &value->timeout, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_arfcns, end)))
+    return 0;
+
+  if(value->number_of_arfcns <= NFAPI_MAX_CARRIER_LIST) {
+    for(idx = 0; idx < value->number_of_arfcns; ++idx) {
+      if(!(pull16(ppReadPackedMsg, &value->arfcn[idx].arfcn, end) &&
+           pull8(ppReadPackedMsg, &value->arfcn[idx].direction, end)))
+        return 0;
+    }
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "More ARFCN's than we can decode %d \n", value->number_of_arfcns);
+    return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_nb_iot_rssi_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nb_iot_rssi_request_t *value = (nfapi_nb_iot_rssi_request_t *)tlv;
+  uint16_t idx = 0;
+
+  if(!(pull8(ppReadPackedMsg, &value->frequency_band_indicator, end) &&
+       pull16(ppReadPackedMsg, &value->measurement_period, end) &&
+       pull32(ppReadPackedMsg, &value->timeout, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_earfcns, end)))
+    return 0;
+
+  if(value->number_of_earfcns <= NFAPI_MAX_CARRIER_LIST) {
+    for(idx = 0; idx < value->number_of_earfcns; ++idx) {
+      if(!(pull16(ppReadPackedMsg, &value->earfcn[idx].earfcn, end) &&
+           pull8(ppReadPackedMsg, &value->earfcn[idx].number_of_ro_dl, end)))
+        return 0;
+
+      if(value->earfcn[idx].number_of_ro_dl <= NFAPI_MAX_RO_DL) {
+        uint8_t ro_dl_idx = 0;
+
+        for(ro_dl_idx = 0; ro_dl_idx < value->earfcn[idx].number_of_ro_dl; ++ro_dl_idx) {
+          if(!pull8(ppReadPackedMsg, &value->earfcn[idx].ro_dl[ro_dl_idx], end))
+            return 0;
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "More ROdl's than we can decode %d \n", value->earfcn[idx].number_of_ro_dl);
+        return 0;
+      }
+    }
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "More EARFCN's than we can decode %d \n", value->number_of_earfcns);
+    return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_rssi_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_rssi_request_t *pNfapiMsg = (nfapi_rssi_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_LTE_RSSI_REQUEST_TAG, &pNfapiMsg->lte_rssi_request, &unpack_lte_rssi_request_value},
+    { NFAPI_UTRAN_RSSI_REQUEST_TAG, &pNfapiMsg->utran_rssi_request, &unpack_utran_rssi_request_value},
+    { NFAPI_GERAN_RSSI_REQUEST_TAG, &pNfapiMsg->geran_rssi_request, &unpack_geran_rssi_request_value},
+    { NFAPI_NB_IOT_RSSI_REQUEST_TAG, &pNfapiMsg->nb_iot_rssi_request, &unpack_nb_iot_rssi_request_value},
+  };
+  int result = 0;
+  result = (pull8(ppReadPackedMsg, &pNfapiMsg->rat_type, end) &&
+            unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+
+  // Verify that the rat type and the tlv match
+  if(result == 1 &&
+      !((pNfapiMsg->rat_type == NFAPI_RAT_TYPE_LTE && pNfapiMsg->lte_rssi_request.tl.tag == NFAPI_LTE_RSSI_REQUEST_TAG) ||
+        (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_UTRAN && pNfapiMsg->utran_rssi_request.tl.tag == NFAPI_UTRAN_RSSI_REQUEST_TAG) ||
+        (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_GERAN && pNfapiMsg->geran_rssi_request.tl.tag == NFAPI_GERAN_RSSI_REQUEST_TAG) ||
+        (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_NB_IOT && pNfapiMsg->nb_iot_rssi_request.tl.tag == NFAPI_NB_IOT_RSSI_REQUEST_TAG))) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Mismatch RAT Type: %d and TAG value: 0x%04x \n", pNfapiMsg->rat_type, pNfapiMsg->lte_rssi_request.tl.tag);
+    result = 0;
+  }
+
+  return result;
+}
+
+static uint8_t unpack_rssi_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_rssi_response_t *pNfapiMsg = (nfapi_rssi_response_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+          unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_rssi_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rssi_indication_body_t *value = (nfapi_rssi_indication_body_t *)tlv;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_rssi, end) == 0)
+    return 0;
+
+  if(value->number_of_rssi <= NFAPI_MAX_RSSI) {
+    if(pullarrays16(ppReadPackedMsg, value->rssi, NFAPI_MAX_RSSI, value->number_of_rssi, end) == 0)
+      return 0;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "More RSSI's than we can decode %d \n", value->number_of_rssi);
+    return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_rssi_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_rssi_indication_t *pNfapiMsg = (nfapi_rssi_indication_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_RSSI_INDICATION_TAG, &pNfapiMsg->rssi_indication_body, &unpack_rssi_indication_value},
+  };
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+          unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_lte_cell_search_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lte_cell_search_request_t *value = (nfapi_lte_cell_search_request_t *)tlv;
+
+  if(!(pull16(ppReadPackedMsg, &value->earfcn, end) &&
+       pull8(ppReadPackedMsg, &value->measurement_bandwidth, end) &&
+       pull8(ppReadPackedMsg, &value->exhaustive_search, end) &&
+       pull32(ppReadPackedMsg, &value->timeout, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_pci, end)))
+    return 0;
+
+  if(value->number_of_pci <= NFAPI_MAX_PCI_LIST) {
+    if(pullarray16(ppReadPackedMsg, value->pci, NFAPI_MAX_PCI_LIST, value->number_of_pci, end) == 0)
+      return 0;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "More PCI's than we can decode %d \n", value->number_of_pci);
+    return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_utran_cell_search_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_utran_cell_search_request_t *value = (nfapi_utran_cell_search_request_t *)tlv;
+
+  if(!(pull16(ppReadPackedMsg, &value->uarfcn, end) &&
+       pull8(ppReadPackedMsg, &value->exhaustive_search, end) &&
+       pull32(ppReadPackedMsg, &value->timeout, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_psc, end)))
+    return 0;
+
+  if(value->number_of_psc <= NFAPI_MAX_PSC_LIST) {
+    if(pullarray16(ppReadPackedMsg, value->psc, NFAPI_MAX_PSC_LIST, value->number_of_psc, end) == 0)
+      return 0;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "More PSC's than we can decode %d \n", value->number_of_psc);
+    return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_geran_cell_search_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_geran_cell_search_request_t *value = (nfapi_geran_cell_search_request_t *)tlv;
+
+  if(!(pull32(ppReadPackedMsg, &value->timeout, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_arfcn, end)))
+    return 0;
+
+  if(value->number_of_arfcn <= NFAPI_MAX_ARFCN_LIST) {
+    if(pullarray16(ppReadPackedMsg, value->arfcn, NFAPI_MAX_ARFCN_LIST, value->number_of_arfcn, end) == 0)
+      return 0;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "More ARFCN's than we can decode %d \n", value->number_of_arfcn);
+    return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_nb_iot_cell_search_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nb_iot_cell_search_request_t *value = (nfapi_nb_iot_cell_search_request_t *)tlv;
+
+  if(!(pull16(ppReadPackedMsg, &value->earfcn, end) &&
+       pull8(ppReadPackedMsg, &value->ro_dl, end) &&
+       pull8(ppReadPackedMsg, &value->exhaustive_search, end) &&
+       pull32(ppReadPackedMsg, &value->timeout, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_pci, end)))
+    return 0;
+
+  if(value->number_of_pci <= NFAPI_MAX_PCI_LIST) {
+    if(pullarray16(ppReadPackedMsg, value->pci, NFAPI_MAX_PCI_LIST, value->number_of_pci, end) == 0)
+      return 0;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "More PCI's than we can decode %d \n", value->number_of_pci);
+    return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_cell_search_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_cell_search_request_t *pNfapiMsg = (nfapi_cell_search_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_LTE_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->lte_cell_search_request, &unpack_lte_cell_search_request_value},
+    { NFAPI_UTRAN_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->utran_cell_search_request, &unpack_utran_cell_search_request_value},
+    { NFAPI_GERAN_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->geran_cell_search_request, &unpack_geran_cell_search_request_value},
+    { NFAPI_NB_IOT_CELL_SEARCH_REQUEST_TAG, &pNfapiMsg->nb_iot_cell_search_request, &unpack_nb_iot_cell_search_request_value},
+  };
+  int result = (pull8(ppReadPackedMsg, &pNfapiMsg->rat_type, end) &&
+                unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+
+  // Verify that the rat type and the tlv match
+  if(result == 1 &&
+      !((pNfapiMsg->rat_type == NFAPI_RAT_TYPE_LTE && pNfapiMsg->lte_cell_search_request.tl.tag == NFAPI_LTE_CELL_SEARCH_REQUEST_TAG) ||
+        (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_UTRAN && pNfapiMsg->utran_cell_search_request.tl.tag == NFAPI_UTRAN_CELL_SEARCH_REQUEST_TAG) ||
+        (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_GERAN && pNfapiMsg->geran_cell_search_request.tl.tag == NFAPI_GERAN_CELL_SEARCH_REQUEST_TAG) ||
+        (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_NB_IOT && pNfapiMsg->nb_iot_cell_search_request.tl.tag == NFAPI_NB_IOT_CELL_SEARCH_REQUEST_TAG))) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Mismatch RAT Type: %d and TAG value: 0x%04x \n", pNfapiMsg->rat_type, pNfapiMsg->lte_cell_search_request.tl.tag);
+    result = 0;
+  }
+
+  return result;
+}
+
+static uint8_t unpack_cell_search_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_cell_search_response_t *pNfapiMsg = (nfapi_cell_search_response_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+          unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_lte_cell_search_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lte_cell_search_indication_t *value = (nfapi_lte_cell_search_indication_t *)tlv;
+  uint16_t idx = 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_lte_cells_found, end) == 0)
+    return 0;
+
+  if(value->number_of_lte_cells_found <= NFAPI_MAX_LTE_CELLS_FOUND) {
+    for(idx = 0; idx < value->number_of_lte_cells_found; ++idx) {
+      if(!(pull16(ppReadPackedMsg, &value->lte_found_cells[idx].pci, end) &&
+           pull8(ppReadPackedMsg, &value->lte_found_cells[idx].rsrp, end) &&
+           pull8(ppReadPackedMsg, &value->lte_found_cells[idx].rsrq, end) &&
+           pulls16(ppReadPackedMsg, &value->lte_found_cells[idx].frequency_offset, end)))
+        return 0;
+    }
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found LTE cells than we can decode %d \n", value->number_of_lte_cells_found);
+    return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_utran_cell_search_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_utran_cell_search_indication_t *value = (nfapi_utran_cell_search_indication_t *)tlv;
+  uint16_t idx = 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_utran_cells_found, end) == 0)
+    return 0;
+
+  if(value->number_of_utran_cells_found <= NFAPI_MAX_UTRAN_CELLS_FOUND) {
+    for(idx = 0; idx < value->number_of_utran_cells_found; ++idx) {
+      if(!(pull16(ppReadPackedMsg, &value->utran_found_cells[idx].psc, end) &&
+           pull8(ppReadPackedMsg, &value->utran_found_cells[idx].rscp, end) &&
+           pull8(ppReadPackedMsg, &value->utran_found_cells[idx].ecno, end) &&
+           pulls16(ppReadPackedMsg, &value->utran_found_cells[idx].frequency_offset, end)))
+        return 0;
+    }
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found UTRAN cells than we can decode %d \n", value->number_of_utran_cells_found);
+    return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_geran_cell_search_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_geran_cell_search_indication_t *value = (nfapi_geran_cell_search_indication_t *)tlv;
+  uint16_t idx = 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_gsm_cells_found, end) == 0)
+    return 0;
+
+  if(value->number_of_gsm_cells_found <= NFAPI_MAX_GSM_CELLS_FOUND) {
+    for(idx = 0; idx < value->number_of_gsm_cells_found; ++idx) {
+      if(!(pull16(ppReadPackedMsg, &value->gsm_found_cells[idx].arfcn, end) &&
+           pull8(ppReadPackedMsg, &value->gsm_found_cells[idx].bsic, end) &&
+           pull8(ppReadPackedMsg, &value->gsm_found_cells[idx].rxlev, end) &&
+           pull8(ppReadPackedMsg, &value->gsm_found_cells[idx].rxqual, end) &&
+           pulls16(ppReadPackedMsg, &value->gsm_found_cells[idx].frequency_offset, end) &&
+           pull32(ppReadPackedMsg, &value->gsm_found_cells[idx].sfn_offset, end)))
+        return 0;
+    }
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found GSM cells than we can decode %d \n", value->number_of_gsm_cells_found);
+    return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_nb_iot_cell_search_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nb_iot_cell_search_indication_t *value = (nfapi_nb_iot_cell_search_indication_t *)tlv;
+  uint16_t idx = 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_nb_iot_cells_found, end) == 0)
+    return 0;
+
+  if(value->number_of_nb_iot_cells_found <= NFAPI_MAX_NB_IOT_CELLS_FOUND) {
+    for(idx = 0; idx < value->number_of_nb_iot_cells_found; ++idx) {
+      if(!(pull16(ppReadPackedMsg, &value->nb_iot_found_cells[idx].pci, end) &&
+           pull8(ppReadPackedMsg, &value->nb_iot_found_cells[idx].rsrp, end) &&
+           pull8(ppReadPackedMsg, &value->nb_iot_found_cells[idx].rsrq, end) &&
+           pulls16(ppReadPackedMsg, &value->nb_iot_found_cells[idx].frequency_offset, end)))
+        return 0;
+    }
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found NB_IOT cells than we can decode %d \n", value->number_of_nb_iot_cells_found);
+    return 0;
+  }
 
-	return 1;
-}
-
-static uint8_t unpack_system_information_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_system_information_request_t *pNfapiMsg = (nfapi_system_information_request_t*)msg;
+  return 1;
+}
 
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_LTE_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->lte_system_information_request, &unpack_lte_system_information_request_value},
-		{ NFAPI_UTRAN_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->utran_system_information_request, &unpack_utran_system_information_request_value},
-		{ NFAPI_GERAN_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->geran_system_information_request, &unpack_geran_system_information_request_value},
-		{ NFAPI_NB_IOT_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->nb_iot_system_information_request, &unpack_nb_iot_system_information_request_value},
-		{ NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, &unpack_opaque_data_value}
-	};
+static uint8_t unpack_cell_search_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_cell_search_indication_t *pNfapiMsg = (nfapi_cell_search_indication_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_LTE_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->lte_cell_search_indication, &unpack_lte_cell_search_indication_value},
+    { NFAPI_UTRAN_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->utran_cell_search_indication, &unpack_utran_cell_search_indication_value},
+    { NFAPI_GERAN_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->geran_cell_search_indication, &unpack_geran_cell_search_indication_value},
+    { NFAPI_PNF_CELL_SEARCH_STATE_TAG, &pNfapiMsg->pnf_cell_search_state, &unpack_opaque_data_value},
+    { NFAPI_NB_IOT_CELL_SEARCH_INDICATION_TAG, &pNfapiMsg->nb_iot_cell_search_indication, &unpack_nb_iot_cell_search_indication_value},
+  };
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+          unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_lte_broadcast_detect_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lte_broadcast_detect_request_t *value = (nfapi_lte_broadcast_detect_request_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->earfcn, end) &&
+          pull16(ppReadPackedMsg, &value->pci, end) &&
+          pull32(ppReadPackedMsg, &value->timeout, end));
+}
+
+static uint8_t unpack_utran_broadcast_detect_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_utran_broadcast_detect_request_t *value = (nfapi_utran_broadcast_detect_request_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->uarfcn, end) &&
+          pull16(ppReadPackedMsg, &value->psc, end) &&
+          pull32(ppReadPackedMsg, &value->timeout, end));
+}
+
+static uint8_t unpack_nb_iot_broadcast_detect_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nb_iot_broadcast_detect_request_t *value = (nfapi_nb_iot_broadcast_detect_request_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->earfcn, end) &&
+          pull8(ppReadPackedMsg, &value->ro_dl, end) &&
+          pull16(ppReadPackedMsg, &value->pci, end) &&
+          pull32(ppReadPackedMsg, &value->timeout, end));
+}
+
+static uint8_t unpack_broadcast_detect_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_broadcast_detect_request_t *pNfapiMsg = (nfapi_broadcast_detect_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_LTE_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->lte_broadcast_detect_request, &unpack_lte_broadcast_detect_request_value},
+    { NFAPI_UTRAN_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->utran_broadcast_detect_request, &unpack_utran_broadcast_detect_request_value},
+    { NFAPI_PNF_CELL_SEARCH_STATE_TAG, &pNfapiMsg->pnf_cell_search_state, &unpack_opaque_data_value},
+    { NFAPI_NB_IOT_BROADCAST_DETECT_REQUEST_TAG, &pNfapiMsg->nb_iot_broadcast_detect_request, &unpack_nb_iot_broadcast_detect_request_value}
+  };
+  return (pull8(ppReadPackedMsg, &pNfapiMsg->rat_type, end) &&
+          unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_broadcast_detect_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_broadcast_detect_response_t *pNfapiMsg = (nfapi_broadcast_detect_response_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+          unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_lte_broadcast_detect_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lte_broadcast_detect_indication_t *value = (nfapi_lte_broadcast_detect_indication_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->number_of_tx_antenna, end) &&
+       pull16(ppReadPackedMsg, &value->mib_length, end)))
+    return 0;
+
+  if(value->mib_length > NFAPI_MAX_MIB_LENGTH) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "MIB too long %d \n", value->mib_length);
+    return 0;
+  }
+
+  return (pullarray8(ppReadPackedMsg, value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, end) &&
+          pull32(ppReadPackedMsg, &value->sfn_offset, end));
+}
+
+static uint8_t unpack_utran_broadcast_detect_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_utran_broadcast_detect_indication_t *value = (nfapi_utran_broadcast_detect_indication_t *)tlv;
 
+  if(pull16(ppReadPackedMsg, &value->mib_length, end) == 0)
+    return 0;
 
-	int result = (pull8(ppReadPackedMsg, &pNfapiMsg->rat_type, end) &&
-				  unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+  if(value->mib_length > NFAPI_MAX_MIB_LENGTH) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "MIB too long %d \n", value->mib_length);
+    return 0;
+  }
 
-	// Verify that the rat type and the tlv match
-	if(result == 1 &&
-	   !((pNfapiMsg->rat_type == NFAPI_RAT_TYPE_LTE && pNfapiMsg->lte_system_information_request.tl.tag == NFAPI_LTE_SYSTEM_INFORMATION_REQUEST_TAG) ||
-	    (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_UTRAN && pNfapiMsg->utran_system_information_request.tl.tag == NFAPI_UTRAN_SYSTEM_INFORMATION_REQUEST_TAG) ||
-	    (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_GERAN && pNfapiMsg->geran_system_information_request.tl.tag == NFAPI_GERAN_SYSTEM_INFORMATION_REQUEST_TAG)))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Mismatch RAT Type: %d and TAG value: 0x%04x \n", pNfapiMsg->rat_type, pNfapiMsg->lte_system_information_request.tl.tag);
-		result = 0;
-	}
-	
-	return result;
+  return (pullarray8(ppReadPackedMsg, value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, end) &&
+          pull32(ppReadPackedMsg, &value->sfn_offset, end));
 }
 
-static uint8_t unpack_system_information_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_system_information_response_t *pNfapiMsg = (nfapi_system_information_response_t*)msg;
+static uint8_t unpack_nb_iot_broadcast_detect_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nb_iot_broadcast_detect_indication_t *value = (nfapi_nb_iot_broadcast_detect_indication_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->number_of_tx_antenna, end) &&
+       pull16(ppReadPackedMsg, &value->mib_length, end)))
+    return 0;
 
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
+  if(value->mib_length > NFAPI_MAX_MIB_LENGTH) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "MIB too long %d \n", value->mib_length);
+    return 0;
+  }
 
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+  return (pullarray8(ppReadPackedMsg, value->mib, NFAPI_MAX_MIB_LENGTH, value->mib_length, end) &&
+          pull32(ppReadPackedMsg, &value->sfn_offset, end));
 }
 
-static uint8_t unpack_utran_system_information_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_utran_system_information_indication_t* value = (nfapi_utran_system_information_indication_t*)tlv;
+static uint8_t unpack_broadcast_detect_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_broadcast_detect_indication_t *pNfapiMsg = (nfapi_broadcast_detect_indication_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_LTE_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->lte_broadcast_detect_indication, &unpack_lte_broadcast_detect_indication_value},
+    { NFAPI_UTRAN_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->utran_broadcast_detect_indication, &unpack_utran_broadcast_detect_indication_value},
+    { NFAPI_NB_IOT_BROADCAST_DETECT_INDICATION_TAG, &pNfapiMsg->nb_iot_broadcast_detect_indication, &unpack_nb_iot_broadcast_detect_indication_value},
+    { NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, &unpack_opaque_data_value}
+  };
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+          unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
 
-	if(pull16(ppReadPackedMsg, &value->sib_length, end) == 0)
-		return 0;
+static uint8_t unpack_lte_system_information_schedule_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lte_system_information_schedule_request_t *value = (nfapi_lte_system_information_schedule_request_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->earfcn, end) &&
+          pull16(ppReadPackedMsg, &value->pci, end) &&
+          pull16(ppReadPackedMsg, &value->downlink_channel_bandwidth, end) &&
+          pull8(ppReadPackedMsg, &value->phich_configuration, end) &&
+          pull8(ppReadPackedMsg, &value->number_of_tx_antenna, end) &&
+          pull8(ppReadPackedMsg, &value->retry_count, end) &&
+          pull32(ppReadPackedMsg, &value->timeout, end));
+}
 
-	if(value->sib_length > NFAPI_MAX_SIB_LENGTH)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "SIB too long %d \n", value->sib_length);
-		return 0;
-	}
-	
-	if(pullarray8(ppReadPackedMsg, value->sib, NFAPI_MAX_SIB_LENGTH, value->sib_length, end) == 0)
-		return 0;
+static uint8_t unpack_nb_iot_system_information_schedule_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nb_iot_system_information_schedule_request_t *value = (nfapi_nb_iot_system_information_schedule_request_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->earfcn, end) &&
+          pull8(ppReadPackedMsg, &value->ro_dl, end) &&
+          pull16(ppReadPackedMsg, &value->pci, end) &&
+          pull8(ppReadPackedMsg, &value->scheduling_info_sib1_nb, end) &&
+          pull32(ppReadPackedMsg, &value->timeout, end));
+}
+
+static uint8_t unpack_system_information_schedule_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_system_information_schedule_request_t *pNfapiMsg = (nfapi_system_information_schedule_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_LTE_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG, &pNfapiMsg->lte_system_information_schedule_request, &unpack_lte_system_information_schedule_request_value},
+    { NFAPI_NB_IOT_SYSTEM_INFORMATION_SCHEDULE_REQUEST_TAG, &pNfapiMsg->nb_iot_system_information_schedule_request, &unpack_nb_iot_system_information_schedule_request_value},
+    { NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, &unpack_opaque_data_value}
+  };
+  return (pull8(ppReadPackedMsg, &pNfapiMsg->rat_type, end) &&
+          unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_system_information_schedule_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_system_information_schedule_response_t *pNfapiMsg = (nfapi_system_information_schedule_response_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+          unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_lte_system_information_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lte_system_information_indication_t *value = (nfapi_lte_system_information_indication_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->sib_type, end) &&
+       pull16(ppReadPackedMsg, &value->sib_length, end)))
+    return 0;
+
+  if(value->sib_length > NFAPI_MAX_SIB_LENGTH) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "SIB too long %d \n", value->sib_length);
+    return 0;
+  }
+
+  if(pullarray8(ppReadPackedMsg, value->sib, NFAPI_MAX_SIB_LENGTH,  value->sib_length, end) == 0)
+    return 0;
+
+  return 1;
+}
 
-	return 1;
-}
-
-static uint8_t unpack_geran_system_information_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_geran_system_information_indication_t* value = (nfapi_geran_system_information_indication_t*)tlv;
-
-	if(pull16(ppReadPackedMsg, &value->si_length, end) == 0)
-		return 0;
+static uint8_t unpack_nb_iot_system_information_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nb_iot_system_information_indication_t *value = (nfapi_nb_iot_system_information_indication_t *)tlv;
 
-	if(value->si_length > NFAPI_MAX_SI_LENGTH)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "SIB too long %d \n", value->si_length);
-		return 0;
-	}
+  if(!(pull8(ppReadPackedMsg, &value->sib_type, end) &&
+       pull16(ppReadPackedMsg, &value->sib_length, end)))
+    return 0;
 
-	if(pullarray8(ppReadPackedMsg, value->si, NFAPI_MAX_SI_LENGTH, value->si_length, end) == 0)
-		return 0;
+  if(value->sib_length > NFAPI_MAX_SIB_LENGTH) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "SIB too long %d \n", value->sib_length);
+    return 0;
+  }
 
-	return 1;
+  if(pullarray8(ppReadPackedMsg, value->sib, NFAPI_MAX_SIB_LENGTH,  value->sib_length, end) == 0)
+    return 0;
+
+  return 1;
+}
+
+static uint8_t unpack_system_information_schedule_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_system_information_schedule_indication_t *pNfapiMsg = (nfapi_system_information_schedule_indication_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->lte_system_information_indication, &unpack_lte_system_information_indication_value},
+    { NFAPI_NB_IOT_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->nb_iot_system_information_indication, &unpack_nb_iot_system_information_indication_value},
+  };
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+          unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_lte_system_information_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lte_system_information_request_t *value = (nfapi_lte_system_information_request_t *)tlv;
+  uint16_t idx = 0;
+
+  if(!(pull16(ppReadPackedMsg, &value->earfcn, end) &&
+       pull16(ppReadPackedMsg, &value->pci, end) &&
+       pull16(ppReadPackedMsg, &value->downlink_channel_bandwidth, end) &&
+       pull8(ppReadPackedMsg, &value->phich_configuration, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_tx_antenna, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_si_periodicity, end)))
+    return 0;
+
+  if(value->number_of_si_periodicity > NFAPI_MAX_SI_PERIODICITY) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found SI periodicity than we can decode %d \n", value->number_of_si_periodicity);
+    return 0;
+  }
+
+  for(idx = 0; idx < value->number_of_si_periodicity; ++idx) {
+    if(!(pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_periodicity, end) &&
+         pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_index, end)))
+      return 0;
+  }
+
+  if(!(pull8(ppReadPackedMsg, &value->si_window_length, end) &&
+       pull32(ppReadPackedMsg, &value->timeout, end)))
+    return 0;
+
+  return 1;
 }
 
-static uint8_t unpack_system_information_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_system_information_indication_t *pNfapiMsg = (nfapi_system_information_indication_t*)msg;
+static uint8_t unpack_utran_system_information_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_utran_system_information_request_t *value = (nfapi_utran_system_information_request_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->uarfcn, end) &&
+          pull16(ppReadPackedMsg, &value->psc, end) &&
+          pull32(ppReadPackedMsg, &value->timeout, end));
+}
+
+static uint8_t unpack_geran_system_information_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_geran_system_information_request_t *value = (nfapi_geran_system_information_request_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->arfcn, end) &&
+          pull8(ppReadPackedMsg, &value->bsic, end) &&
+          pull32(ppReadPackedMsg, &value->timeout, end));
+}
+
+static uint8_t unpack_nb_iot_system_information_request_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nb_iot_system_information_request_t *value = (nfapi_nb_iot_system_information_request_t *)tlv;
+  uint16_t idx = 0;
+
+  if(!(pull16(ppReadPackedMsg, &value->earfcn, end) &&
+       pull8(ppReadPackedMsg, &value->ro_dl, end) &&
+       pull16(ppReadPackedMsg, &value->pci, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_si_periodicity, end)))
+    return 0;
 
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->lte_system_information_indication, &unpack_lte_system_information_indication_value},
-		{ NFAPI_UTRAN_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->utran_system_information_indication, &unpack_utran_system_information_indication_value},
-		{ NFAPI_GERAN_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->geran_system_information_indication, &unpack_geran_system_information_indication_value},
-		{ NFAPI_NB_IOT_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->nb_iot_system_information_indication, &unpack_nb_iot_system_information_indication_value},
-	};
+  if(value->number_of_si_periodicity > NFAPI_MAX_SI_PERIODICITY) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "More found SI periodicity than we can decode %d \n", value->number_of_si_periodicity);
+    return 0;
+  }
 
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+  for(idx = 0; idx < value->number_of_si_periodicity; ++idx) {
+    if(!(pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_periodicity, end) &&
+         pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_repetition_pattern, end) &&
+         pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_tb_size, end) &&
+         pull8(ppReadPackedMsg, &value->si_periodicity[idx].number_of_si_index, end)))
+      return 0;
 
+    uint8_t si_idx;
+
+    for(si_idx = 0; si_idx < value->si_periodicity[idx].number_of_si_index; ++si_idx) {
+      if(!(pull8(ppReadPackedMsg, &value->si_periodicity[idx].si_index[si_idx], end)))
+        return 0;
+    }
+  }
+
+  if(!(pull8(ppReadPackedMsg, &value->si_window_length, end) &&
+       pull32(ppReadPackedMsg, &value->timeout, end)))
+    return 0;
+
+  return 1;
 }
 
-static uint8_t unpack_nmm_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nmm_stop_request_t *pNfapiMsg = (nfapi_nmm_stop_request_t*)msg;
+static uint8_t unpack_system_information_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_system_information_request_t *pNfapiMsg = (nfapi_system_information_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_LTE_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->lte_system_information_request, &unpack_lte_system_information_request_value},
+    { NFAPI_UTRAN_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->utran_system_information_request, &unpack_utran_system_information_request_value},
+    { NFAPI_GERAN_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->geran_system_information_request, &unpack_geran_system_information_request_value},
+    { NFAPI_NB_IOT_SYSTEM_INFORMATION_REQUEST_TAG, &pNfapiMsg->nb_iot_system_information_request, &unpack_nb_iot_system_information_request_value},
+    { NFAPI_PNF_CELL_BROADCAST_STATE_TAG, &pNfapiMsg->pnf_cell_broadcast_state, &unpack_opaque_data_value}
+  };
+  int result = (pull8(ppReadPackedMsg, &pNfapiMsg->rat_type, end) &&
+                unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
 
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
+  // Verify that the rat type and the tlv match
+  if(result == 1 &&
+      !((pNfapiMsg->rat_type == NFAPI_RAT_TYPE_LTE && pNfapiMsg->lte_system_information_request.tl.tag == NFAPI_LTE_SYSTEM_INFORMATION_REQUEST_TAG) ||
+        (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_UTRAN && pNfapiMsg->utran_system_information_request.tl.tag == NFAPI_UTRAN_SYSTEM_INFORMATION_REQUEST_TAG) ||
+        (pNfapiMsg->rat_type == NFAPI_RAT_TYPE_GERAN && pNfapiMsg->geran_system_information_request.tl.tag == NFAPI_GERAN_SYSTEM_INFORMATION_REQUEST_TAG))) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Mismatch RAT Type: %d and TAG value: 0x%04x \n", pNfapiMsg->rat_type, pNfapiMsg->lte_system_information_request.tl.tag);
+    result = 0;
+  }
 
-	return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension);
+  return result;
 }
 
-static uint8_t unpack_nmm_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nmm_stop_response_t *pNfapiMsg = (nfapi_nmm_stop_response_t*)msg;
+static uint8_t unpack_system_information_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_system_information_response_t *pNfapiMsg = (nfapi_system_information_response_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+          unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_utran_system_information_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_utran_system_information_indication_t *value = (nfapi_utran_system_information_indication_t *)tlv;
+
+  if(pull16(ppReadPackedMsg, &value->sib_length, end) == 0)
+    return 0;
 
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
+  if(value->sib_length > NFAPI_MAX_SIB_LENGTH) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "SIB too long %d \n", value->sib_length);
+    return 0;
+  }
 
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+  if(pullarray8(ppReadPackedMsg, value->sib, NFAPI_MAX_SIB_LENGTH, value->sib_length, end) == 0)
+    return 0;
+
+  return 1;
 }
 
+static uint8_t unpack_geran_system_information_indication_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_geran_system_information_indication_t *value = (nfapi_geran_system_information_indication_t *)tlv;
+
+  if(pull16(ppReadPackedMsg, &value->si_length, end) == 0)
+    return 0;
 
-static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen)
-{
-	int retLen = 0;
+  if(value->si_length > NFAPI_MAX_SI_LENGTH) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "SIB too long %d \n", value->si_length);
+    return 0;
+  }
 
-	switch (msgId)
-	{
-		case NFAPI_RSSI_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_rssi_request_t))
-				retLen = sizeof(nfapi_rssi_request_t);
-			break;
+  if(pullarray8(ppReadPackedMsg, value->si, NFAPI_MAX_SI_LENGTH, value->si_length, end) == 0)
+    return 0;
 
-		case NFAPI_RSSI_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_rssi_response_t))
-				retLen = sizeof(nfapi_rssi_response_t);
-			break;
+  return 1;
+}
+
+static uint8_t unpack_system_information_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_system_information_indication_t *pNfapiMsg = (nfapi_system_information_indication_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_LTE_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->lte_system_information_indication, &unpack_lte_system_information_indication_value},
+    { NFAPI_UTRAN_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->utran_system_information_indication, &unpack_utran_system_information_indication_value},
+    { NFAPI_GERAN_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->geran_system_information_indication, &unpack_geran_system_information_indication_value},
+    { NFAPI_NB_IOT_SYSTEM_INFORMATION_INDICATION_TAG, &pNfapiMsg->nb_iot_system_information_indication, &unpack_nb_iot_system_information_indication_value},
+  };
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+          unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
 
-		case NFAPI_RSSI_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_rssi_indication_t))
-				retLen = sizeof(nfapi_rssi_indication_t);
-			break;
-
-		case NFAPI_CELL_SEARCH_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_cell_search_request_t))
-				retLen = sizeof(nfapi_cell_search_request_t);
-			break;
-
-		case NFAPI_CELL_SEARCH_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_cell_search_response_t))
-				retLen = sizeof(nfapi_cell_search_response_t);
-			break;
-
-		case NFAPI_CELL_SEARCH_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_cell_search_indication_t))
-				retLen = sizeof(nfapi_cell_search_indication_t);
-			break;
-
-		case NFAPI_BROADCAST_DETECT_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_broadcast_detect_request_t))
-				retLen = sizeof(nfapi_broadcast_detect_request_t);
-			break;
-
-		case NFAPI_BROADCAST_DETECT_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_broadcast_detect_response_t))
-				retLen = sizeof(nfapi_broadcast_detect_response_t);
-			break;
-
-		case NFAPI_BROADCAST_DETECT_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_broadcast_detect_indication_t))
-				retLen = sizeof(nfapi_broadcast_detect_indication_t);
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_system_information_schedule_request_t))
-				retLen = sizeof(nfapi_system_information_schedule_request_t);
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_system_information_schedule_response_t))
-				retLen = sizeof(nfapi_system_information_schedule_response_t);
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_system_information_schedule_indication_t))
-				retLen = sizeof(nfapi_system_information_schedule_indication_t);
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_system_information_request_t))
-				retLen = sizeof(nfapi_system_information_request_t);
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_system_information_response_t))
-				retLen = sizeof(nfapi_system_information_response_t);
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_system_information_indication_t))
-				retLen = sizeof(nfapi_system_information_indication_t);
-			break;
-
-		case NFAPI_NMM_STOP_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_nmm_stop_request_t))
-				retLen = sizeof(nfapi_nmm_stop_request_t);
-			break;
-
-		case NFAPI_NMM_STOP_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_nmm_stop_response_t))
-				retLen = sizeof(nfapi_nmm_stop_response_t);
-			break;
-
-		default:
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
-			break;
-	}
-
-	return retLen;
-}
-
-int nfapi_p4_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf;
-	uint8_t *end = pPackedBuf + packedBufLen;
-	uint8_t *pWritePackedMessage = pPackedBuf;
-	uint8_t *pPackedLengthField = &pWritePackedMessage[4];
-	uint32_t packedMsgLen;
-	uint16_t packedMsgLen16;
-
-	if (pMessageBuf == NULL || pPackedBuf == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P4 Pack supplied pointers are null\n");
-		return -1;
-	}
-
-	// process the header
-	if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
-		 push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
-		 push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
-		 push16(pMessageHeader->spare, &pWritePackedMessage, end)))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to pack p4 message header\n");
-		return -1;
-	}
-
-	// look for the specific message
-	uint8_t result = 0;
-	switch (pMessageHeader->message_id)
-	{
-		case NFAPI_RSSI_REQUEST:
-			result = pack_rssi_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_RSSI_RESPONSE:
-			result = pack_rssi_response(pMessageHeader, &pWritePackedMessage,  end,config);
-			break;
-
-		case NFAPI_RSSI_INDICATION:
-			result = pack_rssi_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_CELL_SEARCH_REQUEST:
-			result = pack_cell_search_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_CELL_SEARCH_RESPONSE:
-			result = pack_cell_search_response(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_CELL_SEARCH_INDICATION:
-			result = pack_cell_search_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_BROADCAST_DETECT_REQUEST:
-			result = pack_broadcast_detect_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_BROADCAST_DETECT_RESPONSE:
-			result = pack_broadcast_detect_response(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_BROADCAST_DETECT_INDICATION:
-			result = pack_broadcast_detect_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST:
-			result = pack_system_information_schedule_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE:
-			result = pack_system_information_schedule_response(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION:
-			result = pack_system_information_schedule_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_REQUEST:
-			result = pack_system_information_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_RESPONSE:
-			result = pack_system_information_response(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_INDICATION:
-			result = pack_system_information_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NMM_STOP_REQUEST:
-			result = pack_nmm_stop_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NMM_STOP_RESPONSE:
-			result = pack_nmm_stop_response(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		default:
-			{
-				if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-				   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MIN)
-				{
-					if(config && config->pack_p4_p5_vendor_extension)
-					{
-						result =(config->pack_p4_p5_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
-					}
-					else
-					{
-						NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve encoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-					}
-				}
-				else
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-				}
-			}
-			break;
-	}	
-	
-	// return the packed length
-	if(result == 0)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Result is 0\n");
-		return -1;
-	}
-
-
-	// check for a valid message length
-	packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage);
-	if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
-		return -1;
-	}
-	else
-	{
-		packedMsgLen16 = (uint16_t)packedMsgLen;
-	}
-
-	// Update the message length in the header
-	if(push16(packedMsgLen16, &pPackedLengthField, end) == 0)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to pack p4 message header lengt\n");
-		return -1;
-	}
-
-	return (packedMsgLen);
+static uint8_t unpack_nmm_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nmm_stop_request_t *pNfapiMsg = (nfapi_nmm_stop_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension);
+}
 
+static uint8_t unpack_nmm_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nmm_stop_response_t *pNfapiMsg = (nfapi_nmm_stop_response_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+          unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen) {
+  int retLen = 0;
+
+  switch (msgId) {
+    case NFAPI_RSSI_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_rssi_request_t))
+        retLen = sizeof(nfapi_rssi_request_t);
+
+      break;
+
+    case NFAPI_RSSI_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_rssi_response_t))
+        retLen = sizeof(nfapi_rssi_response_t);
+
+      break;
+
+    case NFAPI_RSSI_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_rssi_indication_t))
+        retLen = sizeof(nfapi_rssi_indication_t);
+
+      break;
+
+    case NFAPI_CELL_SEARCH_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_cell_search_request_t))
+        retLen = sizeof(nfapi_cell_search_request_t);
+
+      break;
+
+    case NFAPI_CELL_SEARCH_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_cell_search_response_t))
+        retLen = sizeof(nfapi_cell_search_response_t);
+
+      break;
+
+    case NFAPI_CELL_SEARCH_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_cell_search_indication_t))
+        retLen = sizeof(nfapi_cell_search_indication_t);
+
+      break;
+
+    case NFAPI_BROADCAST_DETECT_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_broadcast_detect_request_t))
+        retLen = sizeof(nfapi_broadcast_detect_request_t);
+
+      break;
+
+    case NFAPI_BROADCAST_DETECT_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_broadcast_detect_response_t))
+        retLen = sizeof(nfapi_broadcast_detect_response_t);
+
+      break;
+
+    case NFAPI_BROADCAST_DETECT_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_broadcast_detect_indication_t))
+        retLen = sizeof(nfapi_broadcast_detect_indication_t);
+
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_system_information_schedule_request_t))
+        retLen = sizeof(nfapi_system_information_schedule_request_t);
+
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_system_information_schedule_response_t))
+        retLen = sizeof(nfapi_system_information_schedule_response_t);
+
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_system_information_schedule_indication_t))
+        retLen = sizeof(nfapi_system_information_schedule_indication_t);
+
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_system_information_request_t))
+        retLen = sizeof(nfapi_system_information_request_t);
+
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_system_information_response_t))
+        retLen = sizeof(nfapi_system_information_response_t);
+
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_system_information_indication_t))
+        retLen = sizeof(nfapi_system_information_indication_t);
+
+      break;
+
+    case NFAPI_NMM_STOP_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nmm_stop_request_t))
+        retLen = sizeof(nfapi_nmm_stop_request_t);
+
+      break;
+
+    case NFAPI_NMM_STOP_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nmm_stop_response_t))
+        retLen = sizeof(nfapi_nmm_stop_response_t);
+
+      break;
+
+    default:
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
+      break;
+  }
+
+  return retLen;
+}
+
+int nfapi_p4_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf;
+  uint8_t *end = pPackedBuf + packedBufLen;
+  uint8_t *pWritePackedMessage = pPackedBuf;
+  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
+  uint32_t packedMsgLen;
+  uint16_t packedMsgLen16;
+
+  if (pMessageBuf == NULL || pPackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P4 Pack supplied pointers are null\n");
+    return -1;
+  }
+
+  // process the header
+  if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
+       push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
+       push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
+       push16(pMessageHeader->spare, &pWritePackedMessage, end))) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to pack p4 message header\n");
+    return -1;
+  }
+
+  // look for the specific message
+  uint8_t result = 0;
+
+  switch (pMessageHeader->message_id) {
+    case NFAPI_RSSI_REQUEST:
+      result = pack_rssi_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_RSSI_RESPONSE:
+      result = pack_rssi_response(pMessageHeader, &pWritePackedMessage,  end,config);
+      break;
+
+    case NFAPI_RSSI_INDICATION:
+      result = pack_rssi_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_CELL_SEARCH_REQUEST:
+      result = pack_cell_search_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_CELL_SEARCH_RESPONSE:
+      result = pack_cell_search_response(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_CELL_SEARCH_INDICATION:
+      result = pack_cell_search_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_BROADCAST_DETECT_REQUEST:
+      result = pack_broadcast_detect_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_BROADCAST_DETECT_RESPONSE:
+      result = pack_broadcast_detect_response(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_BROADCAST_DETECT_INDICATION:
+      result = pack_broadcast_detect_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST:
+      result = pack_system_information_schedule_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE:
+      result = pack_system_information_schedule_response(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION:
+      result = pack_system_information_schedule_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_REQUEST:
+      result = pack_system_information_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_RESPONSE:
+      result = pack_system_information_response(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_INDICATION:
+      result = pack_system_information_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_NMM_STOP_REQUEST:
+      result = pack_nmm_stop_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_NMM_STOP_RESPONSE:
+      result = pack_nmm_stop_response(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    default: {
+      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MIN) {
+        if(config && config->pack_p4_p5_vendor_extension) {
+          result =(config->pack_p4_p5_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve encoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+      }
+    }
+    break;
+  }
+
+  // return the packed length
+  if(result == 0) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Result is 0\n");
+    return -1;
+  }
+
+  // check for a valid message length
+  packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage);
+
+  if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
+    return -1;
+  } else {
+    packedMsgLen16 = (uint16_t)packedMsgLen;
+  }
+
+  // Update the message length in the header
+  if(push16(packedMsgLen16, &pPackedLengthField, end) == 0) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to pack p4 message header lengt\n");
+    return -1;
+  }
+
+  return (packedMsgLen);
 }
 
 // Main unpack functions - public
 
-int nfapi_p4_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
-	uint8_t *pReadPackedMessage = pMessageBuf;
-	uint8_t *end = pMessageBuf + messageBufLen;
-
-	if (pMessageBuf == NULL || pUnpackedBuf == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P4 header unpack supplied pointers are null\n");
-		return -1;
-	}
-
-	if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-		return -1;
-	}
-
-	// process the headei
-	if (pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
-		pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-		pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-		pull16(&pReadPackedMessage, &pMessageHeader->spare, end))
-		return -1;
-
-	return 0;
-}
-
-int nfapi_p4_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config)
-{
-	int result = 0;
-	nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
-	uint8_t *pReadPackedMessage = pMessageBuf;
-	uint8_t *end = pMessageBuf + messageBufLen;
-
-	if (pMessageBuf == NULL || pUnpackedBuf == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P4 unpack supplied pointers are null\n");
-		return -1;
-	}
-
-	if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P4 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-		return -1;
-	}
-
-	// clean the supplied buffer for - tag value blanking
-	(void)memset(pUnpackedBuf, 0, unpackedBufLen);
-
-	// process the header
-	if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
-	 	 pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-		 pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-		 pull16(&pReadPackedMessage, &pMessageHeader->spare, end)))
-		return -1;
-
-	// look for the specific message
-	switch (pMessageHeader->message_id)
-	{
-		case NFAPI_RSSI_REQUEST:
-			if (check_unpack_length(NFAPI_RSSI_REQUEST, unpackedBufLen))
-				result = unpack_rssi_request(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result = -1;
-			break;
-
-		case NFAPI_RSSI_RESPONSE:
-			if (check_unpack_length(NFAPI_RSSI_RESPONSE, unpackedBufLen))
-				result = unpack_rssi_response(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result = -1;
-			break;
-
-		case NFAPI_RSSI_INDICATION:
-			if (check_unpack_length(NFAPI_RSSI_INDICATION, unpackedBufLen))
-				result = unpack_rssi_indication(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result = -1;
-			break;
-
-		case NFAPI_CELL_SEARCH_REQUEST:
-			if (check_unpack_length(NFAPI_CELL_SEARCH_REQUEST, unpackedBufLen))
-				result = unpack_cell_search_request(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result = -1;
-			break;
-
-		case NFAPI_CELL_SEARCH_RESPONSE:
-			if (check_unpack_length(NFAPI_CELL_SEARCH_RESPONSE, unpackedBufLen))
-				result = unpack_cell_search_response(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result = -1;
-			break;
-
-		case NFAPI_CELL_SEARCH_INDICATION:
-			if (check_unpack_length(NFAPI_CELL_SEARCH_INDICATION, unpackedBufLen))
-				result = unpack_cell_search_indication(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result = -1;
-			break;
-
-		case NFAPI_BROADCAST_DETECT_REQUEST:
-			if (check_unpack_length(NFAPI_BROADCAST_DETECT_REQUEST, unpackedBufLen))
-				result = unpack_broadcast_detect_request(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result = -1;
-			break;
-
-		case NFAPI_BROADCAST_DETECT_RESPONSE:
-			if (check_unpack_length(NFAPI_BROADCAST_DETECT_RESPONSE, unpackedBufLen))
-				result = unpack_broadcast_detect_response(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result = -1;
-			break;
-
-		case NFAPI_BROADCAST_DETECT_INDICATION:
-			if (check_unpack_length(NFAPI_BROADCAST_DETECT_INDICATION, unpackedBufLen))
-				result = unpack_broadcast_detect_indication(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result = -1;
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST:
-			if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST, unpackedBufLen))
-				result = unpack_system_information_schedule_request(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result = -1;
-			break;
-			
-		case NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE:
-			if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE, unpackedBufLen))
-				result = unpack_system_information_schedule_response(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result = -1;
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION:
-			if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION, unpackedBufLen))
-				result = unpack_system_information_schedule_indication(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result = -1;
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_REQUEST:
-			if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_REQUEST, unpackedBufLen))
-				result = unpack_system_information_request(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result = -1;
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_RESPONSE:
-			if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_RESPONSE, unpackedBufLen))
-				result = unpack_system_information_response(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result =  -1;
-			break;
-
-		case NFAPI_SYSTEM_INFORMATION_INDICATION:
-			if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_INDICATION, unpackedBufLen))
-				result = unpack_system_information_indication(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result =  -1;
-			break;
-
-		case NFAPI_NMM_STOP_REQUEST:
-			if (check_unpack_length(NFAPI_NMM_STOP_REQUEST, unpackedBufLen))
-				result = unpack_nmm_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				result = -1;
-			break;
-
-		case NFAPI_NMM_STOP_RESPONSE:
-			if (check_unpack_length(NFAPI_NMM_STOP_RESPONSE, unpackedBufLen))
-				result = unpack_nmm_stop_response(&pReadPackedMessage, end , pMessageHeader, config);
-			else
-				result = -1;
-			break;
-
-		default:
-			if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN && 
-			   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
-			{
-				if(config && config->unpack_p4_p5_vendor_extension)
-				{
-					result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
-				}
-				else
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-				}
-			}
-			else
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P4 message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-			}
-			break;
-	}
-
-	if(result == 0)
-		return -1;
-
-	return result;
+int nfapi_p4_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P4 header unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  // process the headei
+  if (pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+      pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+      pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+      pull16(&pReadPackedMessage, &pMessageHeader->spare, end))
+    return -1;
+
+  return 0;
+}
+
+int nfapi_p4_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  int result = 0;
+  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P4 unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P4 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  // clean the supplied buffer for - tag value blanking
+  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
+
+  // process the header
+  if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->spare, end)))
+    return -1;
+
+  // look for the specific message
+  switch (pMessageHeader->message_id) {
+    case NFAPI_RSSI_REQUEST:
+      if (check_unpack_length(NFAPI_RSSI_REQUEST, unpackedBufLen))
+        result = unpack_rssi_request(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result = -1;
+
+      break;
+
+    case NFAPI_RSSI_RESPONSE:
+      if (check_unpack_length(NFAPI_RSSI_RESPONSE, unpackedBufLen))
+        result = unpack_rssi_response(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result = -1;
+
+      break;
+
+    case NFAPI_RSSI_INDICATION:
+      if (check_unpack_length(NFAPI_RSSI_INDICATION, unpackedBufLen))
+        result = unpack_rssi_indication(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result = -1;
+
+      break;
+
+    case NFAPI_CELL_SEARCH_REQUEST:
+      if (check_unpack_length(NFAPI_CELL_SEARCH_REQUEST, unpackedBufLen))
+        result = unpack_cell_search_request(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result = -1;
+
+      break;
+
+    case NFAPI_CELL_SEARCH_RESPONSE:
+      if (check_unpack_length(NFAPI_CELL_SEARCH_RESPONSE, unpackedBufLen))
+        result = unpack_cell_search_response(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result = -1;
+
+      break;
+
+    case NFAPI_CELL_SEARCH_INDICATION:
+      if (check_unpack_length(NFAPI_CELL_SEARCH_INDICATION, unpackedBufLen))
+        result = unpack_cell_search_indication(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result = -1;
+
+      break;
+
+    case NFAPI_BROADCAST_DETECT_REQUEST:
+      if (check_unpack_length(NFAPI_BROADCAST_DETECT_REQUEST, unpackedBufLen))
+        result = unpack_broadcast_detect_request(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result = -1;
+
+      break;
+
+    case NFAPI_BROADCAST_DETECT_RESPONSE:
+      if (check_unpack_length(NFAPI_BROADCAST_DETECT_RESPONSE, unpackedBufLen))
+        result = unpack_broadcast_detect_response(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result = -1;
+
+      break;
+
+    case NFAPI_BROADCAST_DETECT_INDICATION:
+      if (check_unpack_length(NFAPI_BROADCAST_DETECT_INDICATION, unpackedBufLen))
+        result = unpack_broadcast_detect_indication(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result = -1;
+
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST:
+      if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST, unpackedBufLen))
+        result = unpack_system_information_schedule_request(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result = -1;
+
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE:
+      if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE, unpackedBufLen))
+        result = unpack_system_information_schedule_response(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result = -1;
+
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION:
+      if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION, unpackedBufLen))
+        result = unpack_system_information_schedule_indication(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result = -1;
+
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_REQUEST:
+      if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_REQUEST, unpackedBufLen))
+        result = unpack_system_information_request(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result = -1;
+
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_RESPONSE:
+      if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_RESPONSE, unpackedBufLen))
+        result = unpack_system_information_response(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result =  -1;
+
+      break;
+
+    case NFAPI_SYSTEM_INFORMATION_INDICATION:
+      if (check_unpack_length(NFAPI_SYSTEM_INFORMATION_INDICATION, unpackedBufLen))
+        result = unpack_system_information_indication(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result =  -1;
+
+      break;
+
+    case NFAPI_NMM_STOP_REQUEST:
+      if (check_unpack_length(NFAPI_NMM_STOP_REQUEST, unpackedBufLen))
+        result = unpack_nmm_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result = -1;
+
+      break;
+
+    case NFAPI_NMM_STOP_RESPONSE:
+      if (check_unpack_length(NFAPI_NMM_STOP_RESPONSE, unpackedBufLen))
+        result = unpack_nmm_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        result = -1;
+
+      break;
+
+    default:
+      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->unpack_p4_p5_vendor_extension) {
+          result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P4 message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+      }
+
+      break;
+  }
+
+  if(result == 0)
+    return -1;
+
+  return result;
 }
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p5.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p5.c
index 8aea9f590c91f8142884c0bcc8bd554780f9119d..23d19482ea6bd45a8048a684b24c310e031a22ff 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p5.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p5.c
@@ -1,12 +1,12 @@
 /*
  * Copyright 2017 Cisco Systems, Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * 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.
@@ -40,481 +40,394 @@
 
 // Pack routines
 //TODO: Add pacl/unpack fns for uint32 and uint64
-static uint8_t pack_nr_pnf_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_pnf_param_request_t* request = (nfapi_nr_pnf_param_request_t*)msg;
-	return pack_vendor_extension_tlv(request->vendor_extension, ppWritePackedMsg, end, config);
-}
-
-static uint8_t pack_pnf_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_param_request_t* request = (nfapi_pnf_param_request_t*)msg;
-	return pack_vendor_extension_tlv(request->vendor_extension, ppWritePackedMsg, end, config);
-}
-
-static uint8_t pack_pnf_param_general_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_pnf_param_general_t* value = (nfapi_pnf_param_general_t*)tlv;
-
-	return ( push8(value->nfapi_sync_mode, ppWritePackedMsg, end) &&
-			 push8(value->location_mode, ppWritePackedMsg, end) &&
-			 push16(value->location_coordinates_length, ppWritePackedMsg, end) &&
-			 pusharray8(value->location_coordinates, NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH, value->location_coordinates_length, ppWritePackedMsg, end) &&
-			 push32(value->dl_config_timing, ppWritePackedMsg, end) &&
-			 push32(value->tx_timing, ppWritePackedMsg, end) &&
-			 push32(value->ul_config_timing, ppWritePackedMsg, end) &&
-			 push32(value->hi_dci0_timing, ppWritePackedMsg, end) &&
-			 push16(value->maximum_number_phys, ppWritePackedMsg, end) &&
-			 push16(value->maximum_total_bandwidth, ppWritePackedMsg, end) &&
-			 push8(value->maximum_total_number_dl_layers, ppWritePackedMsg, end) &&
-			 push8(value->maximum_total_number_ul_layers, ppWritePackedMsg, end) &&
-			 push8(value->shared_bands, ppWritePackedMsg, end) &&
-			 push8(value->shared_pa, ppWritePackedMsg, end) &&
-			 pushs16(value->maximum_total_power, ppWritePackedMsg, end) &&
-			 pusharray8(value->oui, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_rf_config_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_rf_config_info_t* rf = (nfapi_rf_config_info_t*)elem;
-
-	return (push16(rf->rf_config_index, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_pnf_phy_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t* end)
-{
-	nfapi_pnf_phy_info_t* phy = (nfapi_pnf_phy_info_t*)elem;
-
-	return (  push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-			  push16(phy->number_of_rfs, ppWritePackedMsg, end) &&
-			  packarray(phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, ppWritePackedMsg, end, &pack_rf_config_info) &&
-			  push16(phy->number_of_rf_exclusions, ppWritePackedMsg, end) &&
-			  packarray(phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, ppWritePackedMsg, end, &pack_rf_config_info) &&
-			  push16(phy->downlink_channel_bandwidth_supported, ppWritePackedMsg, end) &&
-			  push16(phy->uplink_channel_bandwidth_supported, ppWritePackedMsg, end) &&
-			  push8(phy->number_of_dl_layers_supported, ppWritePackedMsg, end) &&
-			  push8(phy->number_of_ul_layers_supported, ppWritePackedMsg, end) &&
-			  push16(phy->maximum_3gpp_release_supported, ppWritePackedMsg, end) &&
-			  push8(phy->nmm_modes_supported, ppWritePackedMsg, end));
-
-
-}
-
-static uint8_t pack_pnf_phy_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_t* value = (nfapi_pnf_phy_t*)tlv;
-
-	return ( push16(value->number_of_phys, ppWritePackedMsg, end) &&
-			 packarray(value->phy, sizeof(nfapi_pnf_phy_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_info));
-}
-
-static uint8_t pack_pnf_rf_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_pnf_rf_t* value = (nfapi_pnf_rf_t*)tlv;
-	uint16_t rf_index = 0;
-
-	if(push16(value->number_of_rfs, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	for(; rf_index < value->number_of_rfs; ++rf_index)
-	{
-		if( !(push16(value->rf[rf_index].rf_config_index, ppWritePackedMsg, end) &&
-			  push16(value->rf[rf_index].band, ppWritePackedMsg, end) &&
-			  pushs16(value->rf[rf_index].maximum_transmit_power, ppWritePackedMsg, end) &&
-			  pushs16(value->rf[rf_index].minimum_transmit_power, ppWritePackedMsg, end) &&
-			  push8(value->rf[rf_index].number_of_antennas_suppported, ppWritePackedMsg, end) &&
-			  push32(value->rf[rf_index].minimum_downlink_frequency, ppWritePackedMsg, end) &&
-			  push32(value->rf[rf_index].maximum_downlink_frequency, ppWritePackedMsg, end) &&
-			  push32(value->rf[rf_index].minimum_uplink_frequency, ppWritePackedMsg, end) &&
-			  push32(value->rf[rf_index].maximum_uplink_frequency, ppWritePackedMsg, end)))
-			return 0;
-	}
-
-	return 1;
-}
-static uint8_t pack_pnf_phy_rel10_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel10_info_t* phy = (nfapi_pnf_phy_rel10_info_t*)elem;
-
-	return(push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-		   push16(phy->transmission_mode_7_supported, ppWritePackedMsg, end) &&
-		   push16(phy->transmission_mode_8_supported, ppWritePackedMsg, end) &&
-		   push16(phy->two_antenna_ports_for_pucch, ppWritePackedMsg, end) &&
-		   push16(phy->transmission_mode_9_supported, ppWritePackedMsg, end) &&
-		   push16(phy->simultaneous_pucch_pusch, ppWritePackedMsg, end) &&
-		   push16(phy->four_layer_tx_with_tm3_and_tm4, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_pnf_phy_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel10_t* value = (nfapi_pnf_phy_rel10_t*)tlv;
-
-	return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
-			packarray(value->phy, sizeof(nfapi_pnf_phy_rel10_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel10_info));
-
-}
-
-static uint8_t pack_pnf_phy_rel11_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel11_info_t* phy = (nfapi_pnf_phy_rel11_info_t*)elem;
-		
-	return (push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-			push16(phy->edpcch_supported, ppWritePackedMsg, end) &&
-			push16(phy->multi_ack_csi_reporting, ppWritePackedMsg, end) &&
-			push16(phy->pucch_tx_diversity, ppWritePackedMsg, end) &&
-			push16(phy->ul_comp_supported, ppWritePackedMsg, end) &&
-			push16(phy->transmission_mode_5_supported, ppWritePackedMsg, end ));
-}
-static uint8_t pack_pnf_phy_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel11_t* value = (nfapi_pnf_phy_rel11_t*)tlv;
-
-	return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
-			packarray(value->phy, sizeof(nfapi_pnf_phy_rel11_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel11_info));
-}
-static uint8_t pack_pnf_phy_rel12_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel12_info_t* phy = (nfapi_pnf_phy_rel12_info_t*)elem;
-
-	return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-			push16(phy->csi_subframe_set, ppWritePackedMsg, end) &&
-			push16(phy->enhanced_4tx_codebook, ppWritePackedMsg, end) &&
-			push16(phy->drs_supported, ppWritePackedMsg, end) &&
-			push16(phy->ul_64qam_supported, ppWritePackedMsg, end) &&
-			push16(phy->transmission_mode_10_supported, ppWritePackedMsg, end) &&
-			push16(phy->alternative_bts_indices, ppWritePackedMsg, end));
-}
-static uint8_t pack_pnf_phy_rel12_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel12_t* value = (nfapi_pnf_phy_rel12_t*)tlv;
-
-	return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
-			packarray(value->phy, sizeof(nfapi_pnf_phy_rel12_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel12_info));
-
-}
-
-static uint8_t pack_pnf_phy_rel13_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel13_info_t* phy = (nfapi_pnf_phy_rel13_info_t*)elem;
-		
-	return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-			push16(phy->pucch_format4_supported, ppWritePackedMsg, end) &&
-			push16(phy->pucch_format5_supported, ppWritePackedMsg, end) &&
-			push16(phy->more_than_5_ca_support, ppWritePackedMsg, end) &&
-			push16(phy->laa_supported, ppWritePackedMsg, end) &&
-			push16(phy->laa_ending_in_dwpts_supported, ppWritePackedMsg, end) &&
-			push16(phy->laa_starting_in_second_slot_supported, ppWritePackedMsg, end) &&
-			push16(phy->beamforming_supported, ppWritePackedMsg, end) &&
-			push16(phy->csi_rs_enhancement_supported, ppWritePackedMsg, end) &&
-			push16(phy->drms_enhancement_supported, ppWritePackedMsg, end) &&
-			push16(phy->srs_enhancement_supported, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_pnf_phy_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel13_t* value = (nfapi_pnf_phy_rel13_t*)tlv;
-
-	return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
-	        packarray(value->phy, sizeof(nfapi_pnf_phy_rel13_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel13_info));
-}
-
-static uint8_t pack_pnf_phy_rel13_nb_iot_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel13_nb_iot_info_t* phy = (nfapi_pnf_phy_rel13_nb_iot_info_t*)elem;
-		
-	return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-			push16(phy->number_of_rfs, ppWritePackedMsg, end) &&
-			packarray(phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, ppWritePackedMsg, end, &pack_rf_config_info) &&
-			push16(phy->number_of_rf_exclusions, ppWritePackedMsg, end) &&
-			packarray(phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, ppWritePackedMsg, end, &pack_rf_config_info) &&
-			push8(phy->number_of_dl_layers_supported, ppWritePackedMsg, end) &&
-			push8(phy->number_of_ul_layers_supported, ppWritePackedMsg, end) &&
-			push16(phy->maximum_3gpp_release_supported, ppWritePackedMsg, end) &&
-			push8(phy->nmm_modes_supported, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_pnf_phy_rel13_nb_iot_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel13_nb_iot_t* value = (nfapi_pnf_phy_rel13_nb_iot_t*)tlv;
-
-	return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
-	        packarray(value->phy, sizeof(nfapi_pnf_phy_rel13_nb_iot_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel13_nb_iot_info));
+static uint8_t pack_nr_pnf_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_param_request_t *request = (nfapi_nr_pnf_param_request_t *)msg;
+  return pack_vendor_extension_tlv(request->vendor_extension, ppWritePackedMsg, end, config);
+}
+
+static uint8_t pack_pnf_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_param_request_t *request = (nfapi_pnf_param_request_t *)msg;
+  return pack_vendor_extension_tlv(request->vendor_extension, ppWritePackedMsg, end, config);
+}
+
+static uint8_t pack_pnf_param_general_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_param_general_t *value = (nfapi_pnf_param_general_t *)tlv;
+  return ( push8(value->nfapi_sync_mode, ppWritePackedMsg, end) &&
+           push8(value->location_mode, ppWritePackedMsg, end) &&
+           push16(value->location_coordinates_length, ppWritePackedMsg, end) &&
+           pusharray8(value->location_coordinates, NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH, value->location_coordinates_length, ppWritePackedMsg, end) &&
+           push32(value->dl_config_timing, ppWritePackedMsg, end) &&
+           push32(value->tx_timing, ppWritePackedMsg, end) &&
+           push32(value->ul_config_timing, ppWritePackedMsg, end) &&
+           push32(value->hi_dci0_timing, ppWritePackedMsg, end) &&
+           push16(value->maximum_number_phys, ppWritePackedMsg, end) &&
+           push16(value->maximum_total_bandwidth, ppWritePackedMsg, end) &&
+           push8(value->maximum_total_number_dl_layers, ppWritePackedMsg, end) &&
+           push8(value->maximum_total_number_ul_layers, ppWritePackedMsg, end) &&
+           push8(value->shared_bands, ppWritePackedMsg, end) &&
+           push8(value->shared_pa, ppWritePackedMsg, end) &&
+           pushs16(value->maximum_total_power, ppWritePackedMsg, end) &&
+           pusharray8(value->oui, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_rf_config_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rf_config_info_t *rf = (nfapi_rf_config_info_t *)elem;
+  return (push16(rf->rf_config_index, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_pnf_phy_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_info_t *phy = (nfapi_pnf_phy_info_t *)elem;
+  return (  push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+            push16(phy->number_of_rfs, ppWritePackedMsg, end) &&
+            packarray(phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, ppWritePackedMsg, end, &pack_rf_config_info) &&
+            push16(phy->number_of_rf_exclusions, ppWritePackedMsg, end) &&
+            packarray(phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, ppWritePackedMsg, end, &pack_rf_config_info) &&
+            push16(phy->downlink_channel_bandwidth_supported, ppWritePackedMsg, end) &&
+            push16(phy->uplink_channel_bandwidth_supported, ppWritePackedMsg, end) &&
+            push8(phy->number_of_dl_layers_supported, ppWritePackedMsg, end) &&
+            push8(phy->number_of_ul_layers_supported, ppWritePackedMsg, end) &&
+            push16(phy->maximum_3gpp_release_supported, ppWritePackedMsg, end) &&
+            push8(phy->nmm_modes_supported, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_pnf_phy_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_t *value = (nfapi_pnf_phy_t *)tlv;
+  return ( push16(value->number_of_phys, ppWritePackedMsg, end) &&
+           packarray(value->phy, sizeof(nfapi_pnf_phy_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_info));
+}
+
+static uint8_t pack_pnf_rf_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_rf_t *value = (nfapi_pnf_rf_t *)tlv;
+  uint16_t rf_index = 0;
+
+  if(push16(value->number_of_rfs, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  for(; rf_index < value->number_of_rfs; ++rf_index) {
+    if( !(push16(value->rf[rf_index].rf_config_index, ppWritePackedMsg, end) &&
+          push16(value->rf[rf_index].band, ppWritePackedMsg, end) &&
+          pushs16(value->rf[rf_index].maximum_transmit_power, ppWritePackedMsg, end) &&
+          pushs16(value->rf[rf_index].minimum_transmit_power, ppWritePackedMsg, end) &&
+          push8(value->rf[rf_index].number_of_antennas_suppported, ppWritePackedMsg, end) &&
+          push32(value->rf[rf_index].minimum_downlink_frequency, ppWritePackedMsg, end) &&
+          push32(value->rf[rf_index].maximum_downlink_frequency, ppWritePackedMsg, end) &&
+          push32(value->rf[rf_index].minimum_uplink_frequency, ppWritePackedMsg, end) &&
+          push32(value->rf[rf_index].maximum_uplink_frequency, ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  return 1;
+}
+static uint8_t pack_pnf_phy_rel10_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel10_info_t *phy = (nfapi_pnf_phy_rel10_info_t *)elem;
+  return(push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+         push16(phy->transmission_mode_7_supported, ppWritePackedMsg, end) &&
+         push16(phy->transmission_mode_8_supported, ppWritePackedMsg, end) &&
+         push16(phy->two_antenna_ports_for_pucch, ppWritePackedMsg, end) &&
+         push16(phy->transmission_mode_9_supported, ppWritePackedMsg, end) &&
+         push16(phy->simultaneous_pucch_pusch, ppWritePackedMsg, end) &&
+         push16(phy->four_layer_tx_with_tm3_and_tm4, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_pnf_phy_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel10_t *value = (nfapi_pnf_phy_rel10_t *)tlv;
+  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
+          packarray(value->phy, sizeof(nfapi_pnf_phy_rel10_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel10_info));
+}
+
+static uint8_t pack_pnf_phy_rel11_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel11_info_t *phy = (nfapi_pnf_phy_rel11_info_t *)elem;
+  return (push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+          push16(phy->edpcch_supported, ppWritePackedMsg, end) &&
+          push16(phy->multi_ack_csi_reporting, ppWritePackedMsg, end) &&
+          push16(phy->pucch_tx_diversity, ppWritePackedMsg, end) &&
+          push16(phy->ul_comp_supported, ppWritePackedMsg, end) &&
+          push16(phy->transmission_mode_5_supported, ppWritePackedMsg, end ));
+}
+static uint8_t pack_pnf_phy_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel11_t *value = (nfapi_pnf_phy_rel11_t *)tlv;
+  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
+          packarray(value->phy, sizeof(nfapi_pnf_phy_rel11_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel11_info));
+}
+static uint8_t pack_pnf_phy_rel12_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel12_info_t *phy = (nfapi_pnf_phy_rel12_info_t *)elem;
+  return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+          push16(phy->csi_subframe_set, ppWritePackedMsg, end) &&
+          push16(phy->enhanced_4tx_codebook, ppWritePackedMsg, end) &&
+          push16(phy->drs_supported, ppWritePackedMsg, end) &&
+          push16(phy->ul_64qam_supported, ppWritePackedMsg, end) &&
+          push16(phy->transmission_mode_10_supported, ppWritePackedMsg, end) &&
+          push16(phy->alternative_bts_indices, ppWritePackedMsg, end));
+}
+static uint8_t pack_pnf_phy_rel12_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel12_t *value = (nfapi_pnf_phy_rel12_t *)tlv;
+  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
+          packarray(value->phy, sizeof(nfapi_pnf_phy_rel12_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel12_info));
+}
+
+static uint8_t pack_pnf_phy_rel13_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_info_t *phy = (nfapi_pnf_phy_rel13_info_t *)elem;
+  return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+          push16(phy->pucch_format4_supported, ppWritePackedMsg, end) &&
+          push16(phy->pucch_format5_supported, ppWritePackedMsg, end) &&
+          push16(phy->more_than_5_ca_support, ppWritePackedMsg, end) &&
+          push16(phy->laa_supported, ppWritePackedMsg, end) &&
+          push16(phy->laa_ending_in_dwpts_supported, ppWritePackedMsg, end) &&
+          push16(phy->laa_starting_in_second_slot_supported, ppWritePackedMsg, end) &&
+          push16(phy->beamforming_supported, ppWritePackedMsg, end) &&
+          push16(phy->csi_rs_enhancement_supported, ppWritePackedMsg, end) &&
+          push16(phy->drms_enhancement_supported, ppWritePackedMsg, end) &&
+          push16(phy->srs_enhancement_supported, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_pnf_phy_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_t *value = (nfapi_pnf_phy_rel13_t *)tlv;
+  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
+          packarray(value->phy, sizeof(nfapi_pnf_phy_rel13_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel13_info));
+}
+
+static uint8_t pack_pnf_phy_rel13_nb_iot_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_nb_iot_info_t *phy = (nfapi_pnf_phy_rel13_nb_iot_info_t *)elem;
+  return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+          push16(phy->number_of_rfs, ppWritePackedMsg, end) &&
+          packarray(phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, ppWritePackedMsg, end, &pack_rf_config_info) &&
+          push16(phy->number_of_rf_exclusions, ppWritePackedMsg, end) &&
+          packarray(phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, ppWritePackedMsg, end, &pack_rf_config_info) &&
+          push8(phy->number_of_dl_layers_supported, ppWritePackedMsg, end) &&
+          push8(phy->number_of_ul_layers_supported, ppWritePackedMsg, end) &&
+          push16(phy->maximum_3gpp_release_supported, ppWritePackedMsg, end) &&
+          push8(phy->nmm_modes_supported, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_pnf_phy_rel13_nb_iot_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_nb_iot_t *value = (nfapi_pnf_phy_rel13_nb_iot_t *)tlv;
+  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
+          packarray(value->phy, sizeof(nfapi_pnf_phy_rel13_nb_iot_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel13_nb_iot_info));
 }
 /*
 static uint8_t pack_nr_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
 {
-	nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t*)msg;
+  nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t*)msg;
 
-	return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
-			pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+      pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
+      pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
+      pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 */
-static uint8_t pack_nr_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t*)msg;
-
-	return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
-			pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_nr_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
+          pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
 
-static uint8_t pack_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_param_response_t *pNfapiMsg = (nfapi_pnf_param_response_t*)msg;
-
-	return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
-			pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
-			pack_tlv(NFAPI_PNF_RF_TAG, &pNfapiMsg->pnf_rf, ppWritePackedMsg, end, &pack_pnf_rf_value) &&
-			pack_tlv(NFAPI_PNF_PHY_REL10_TAG, &pNfapiMsg->pnf_phy_rel10, ppWritePackedMsg, end, &pack_pnf_phy_rel10_value) &&
-			pack_tlv(NFAPI_PNF_PHY_REL11_TAG, &pNfapiMsg->pnf_phy_rel11, ppWritePackedMsg, end, &pack_pnf_phy_rel11_value) &&
-			pack_tlv(NFAPI_PNF_PHY_REL12_TAG, &pNfapiMsg->pnf_phy_rel12, ppWritePackedMsg, end, &pack_pnf_phy_rel12_value) &&
-			pack_tlv(NFAPI_PNF_PHY_REL13_TAG, &pNfapiMsg->pnf_phy_rel13, ppWritePackedMsg, end, &pack_pnf_phy_rel13_value) &&
-			pack_tlv(NFAPI_PNF_PHY_REL13_NB_IOT_TAG, &pNfapiMsg->pnf_phy_rel13_nb_iot, ppWritePackedMsg, end, &pack_pnf_phy_rel13_nb_iot_value) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_param_response_t *pNfapiMsg = (nfapi_pnf_param_response_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
+          pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
+          pack_tlv(NFAPI_PNF_RF_TAG, &pNfapiMsg->pnf_rf, ppWritePackedMsg, end, &pack_pnf_rf_value) &&
+          pack_tlv(NFAPI_PNF_PHY_REL10_TAG, &pNfapiMsg->pnf_phy_rel10, ppWritePackedMsg, end, &pack_pnf_phy_rel10_value) &&
+          pack_tlv(NFAPI_PNF_PHY_REL11_TAG, &pNfapiMsg->pnf_phy_rel11, ppWritePackedMsg, end, &pack_pnf_phy_rel11_value) &&
+          pack_tlv(NFAPI_PNF_PHY_REL12_TAG, &pNfapiMsg->pnf_phy_rel12, ppWritePackedMsg, end, &pack_pnf_phy_rel12_value) &&
+          pack_tlv(NFAPI_PNF_PHY_REL13_TAG, &pNfapiMsg->pnf_phy_rel13, ppWritePackedMsg, end, &pack_pnf_phy_rel13_value) &&
+          pack_tlv(NFAPI_PNF_PHY_REL13_NB_IOT_TAG, &pNfapiMsg->pnf_phy_rel13_nb_iot, ppWritePackedMsg, end, &pack_pnf_phy_rel13_nb_iot_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
 
-static uint8_t pack_phy_rf_config_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_phy_rf_config_info_t* rf = (nfapi_phy_rf_config_info_t*)elem;
-		
-	return (push16(rf->phy_id, ppWritePackedMsg, end) &&
-			push16(rf->phy_config_index, ppWritePackedMsg, end) &&
-			push16(rf->rf_config_index, ppWritePackedMsg, end));
+static uint8_t pack_phy_rf_config_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_phy_rf_config_info_t *rf = (nfapi_phy_rf_config_info_t *)elem;
+  return (push16(rf->phy_id, ppWritePackedMsg, end) &&
+          push16(rf->phy_config_index, ppWritePackedMsg, end) &&
+          push16(rf->rf_config_index, ppWritePackedMsg, end));
 }
-		
-
-static uint8_t pack_pnf_phy_rf_config_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rf_config_t *value = (nfapi_pnf_phy_rf_config_t*)tlv;
 
-	return(push16(value->number_phy_rf_config_info, ppWritePackedMsg, end) &&
-		   packarray(value->phy_rf_config, sizeof(nfapi_phy_rf_config_info_t), NFAPI_MAX_PHY_RF_INSTANCES, value->number_phy_rf_config_info, ppWritePackedMsg, end, &pack_phy_rf_config_info));
 
+static uint8_t pack_pnf_phy_rf_config_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rf_config_t *value = (nfapi_pnf_phy_rf_config_t *)tlv;
+  return(push16(value->number_phy_rf_config_info, ppWritePackedMsg, end) &&
+         packarray(value->phy_rf_config, sizeof(nfapi_phy_rf_config_info_t), NFAPI_MAX_PHY_RF_INSTANCES, value->number_phy_rf_config_info, ppWritePackedMsg, end, &pack_phy_rf_config_info));
 }
 
-static uint8_t pack_nr_pnf_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_pnf_config_request_t *pNfapiMsg = (nfapi_nr_pnf_config_request_t*)msg;
-	return (pack_tlv(NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, ppWritePackedMsg, end, &pack_pnf_phy_rf_config_value) && 
-			//push8(pNfapiMsg->num_tlvs,ppWritePackedMsg,end) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end , config));
+static uint8_t pack_nr_pnf_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_config_request_t *pNfapiMsg = (nfapi_nr_pnf_config_request_t *)msg;
+  return (pack_tlv(NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, ppWritePackedMsg, end, &pack_pnf_phy_rf_config_value) &&
+          //push8(pNfapiMsg->num_tlvs,ppWritePackedMsg,end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
-static uint8_t pack_pnf_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_config_request_t *pNfapiMsg = (nfapi_pnf_config_request_t*)msg;
-	return (pack_tlv(NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, ppWritePackedMsg, end, &pack_pnf_phy_rf_config_value) && 
-			push8(pNfapiMsg->num_tlvs,ppWritePackedMsg,end) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end , config));
+static uint8_t pack_pnf_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_config_request_t *pNfapiMsg = (nfapi_pnf_config_request_t *)msg;
+  return (pack_tlv(NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, ppWritePackedMsg, end, &pack_pnf_phy_rf_config_value) &&
+          push8(pNfapiMsg->num_tlvs,ppWritePackedMsg,end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
 
-static uint8_t pack_nr_pnf_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_pnf_config_response_t *pNfapiMsg = (nfapi_nr_pnf_config_response_t*)msg;
-
-	return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			 pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_nr_pnf_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_config_response_t *pNfapiMsg = (nfapi_nr_pnf_config_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
 
-static uint8_t pack_pnf_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_config_response_t *pNfapiMsg = (nfapi_pnf_config_response_t*)msg;
-
-	return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			 pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_pnf_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_config_response_t *pNfapiMsg = (nfapi_pnf_config_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
-static uint8_t pack_nr_pnf_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_pnf_start_request_t *pNfapiMsg = (nfapi_nr_pnf_start_request_t*)msg;
-	return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_nr_pnf_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_start_request_t *pNfapiMsg = (nfapi_nr_pnf_start_request_t *)msg;
+  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
-static uint8_t pack_pnf_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_start_request_t *pNfapiMsg = (nfapi_pnf_start_request_t*)msg;
-	return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_pnf_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_start_request_t *pNfapiMsg = (nfapi_pnf_start_request_t *)msg;
+  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
 
-static uint8_t pack_nr_pnf_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_pnf_start_response_t *pNfapiMsg = (nfapi_nr_pnf_start_response_t*)msg;
-
-	return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && 
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_nr_pnf_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_start_response_t *pNfapiMsg = (nfapi_nr_pnf_start_response_t *)msg;
+  return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
 
-static uint8_t pack_pnf_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_start_response_t *pNfapiMsg = (nfapi_pnf_start_response_t*)msg;
-
-	return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) && 
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_pnf_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_start_response_t *pNfapiMsg = (nfapi_pnf_start_response_t *)msg;
+  return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
 
-static uint8_t pack_nr_pnf_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_pnf_stop_request_t *pNfapiMsg = (nfapi_nr_pnf_stop_request_t*)msg;
-	return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+static uint8_t pack_nr_pnf_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_stop_request_t *pNfapiMsg = (nfapi_nr_pnf_stop_request_t *)msg;
+  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
 }
 
 
 
-static uint8_t pack_pnf_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_stop_request_t *pNfapiMsg = (nfapi_pnf_stop_request_t*)msg;
-	return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+static uint8_t pack_pnf_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_stop_request_t *pNfapiMsg = (nfapi_pnf_stop_request_t *)msg;
+  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
 }
 
 
-static uint8_t pack_nr_pnf_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_pnf_stop_response_t *pNfapiMsg = (nfapi_nr_pnf_stop_response_t*)msg;
-
-	return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-		 	 pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_nr_pnf_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_stop_response_t *pNfapiMsg = (nfapi_nr_pnf_stop_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
 
-static uint8_t pack_pnf_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_stop_response_t *pNfapiMsg = (nfapi_pnf_stop_response_t*)msg;
-
-	return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-		 	 pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_pnf_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_stop_response_t *pNfapiMsg = (nfapi_pnf_stop_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
-static uint8_t pack_nr_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config)
-{	
-	nfapi_nr_param_request_scf_t *pNfapiMsg = (nfapi_nr_param_request_scf_t*)msg;
-	return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_nr_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_param_request_scf_t *pNfapiMsg = (nfapi_nr_param_request_scf_t *)msg;
+  return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
-static uint8_t pack_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config)
-{	
-	nfapi_param_request_t *pNfapiMsg = (nfapi_param_request_t*)msg;
-	return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_param_request_t *pNfapiMsg = (nfapi_param_request_t *)msg;
+  return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
-static uint8_t pack_uint32_tlv_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_uint32_tlv_t* value = (nfapi_uint32_tlv_t*)tlv;
-	return push32(value->value, ppWritePackedMsg, end);
+static uint8_t pack_uint32_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_uint32_tlv_t *value = (nfapi_uint32_tlv_t *)tlv;
+  return push32(value->value, ppWritePackedMsg, end);
 }
 
-static uint8_t unpack_uint32_tlv_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_uint32_tlv_t* value = (nfapi_uint32_tlv_t*)tlv;
-	return pull32(ppReadPackedMsg, &value->value, end);
+static uint8_t unpack_uint32_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_uint32_tlv_t *value = (nfapi_uint32_tlv_t *)tlv;
+  return pull32(ppReadPackedMsg, &value->value, end);
 }
 
 
-static uint8_t pack_uint16_tlv_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_uint16_tlv_t* value = (nfapi_uint16_tlv_t*)tlv;
-	return push16(value->value, ppWritePackedMsg, end);
+static uint8_t pack_uint16_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_uint16_tlv_t *value = (nfapi_uint16_tlv_t *)tlv;
+  return push16(value->value, ppWritePackedMsg, end);
 }
 
-static uint8_t unpack_uint16_tlv_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_uint16_tlv_t* value = (nfapi_uint16_tlv_t*)tlv;
-	return pull16(ppReadPackedMsg, &value->value, end);
+static uint8_t unpack_uint16_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_uint16_tlv_t *value = (nfapi_uint16_tlv_t *)tlv;
+  return pull16(ppReadPackedMsg, &value->value, end);
 }
 
-static uint8_t pack_int16_tlv_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_int16_tlv_t* value = (nfapi_int16_tlv_t*)tlv;
-	return pushs16(value->value, ppWritePackedMsg, end);
+static uint8_t pack_int16_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_int16_tlv_t *value = (nfapi_int16_tlv_t *)tlv;
+  return pushs16(value->value, ppWritePackedMsg, end);
 }
 
-static uint8_t unpack_int16_tlv_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_int16_tlv_t* value = (nfapi_int16_tlv_t*)tlv;
-	return pulls16(ppReadPackedMsg, &value->value, end);
+static uint8_t unpack_int16_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_int16_tlv_t *value = (nfapi_int16_tlv_t *)tlv;
+  return pulls16(ppReadPackedMsg, &value->value, end);
 }
 
-static uint8_t pack_uint8_tlv_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_uint8_tlv_t* value = (nfapi_uint8_tlv_t*)tlv;
-	return push8(value->value, ppWritePackedMsg, end);
+static uint8_t pack_uint8_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_uint8_tlv_t *value = (nfapi_uint8_tlv_t *)tlv;
+  return push8(value->value, ppWritePackedMsg, end);
 }
-static uint8_t unpack_uint8_tlv_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_uint8_tlv_t* value = (nfapi_uint8_tlv_t*)tlv;
-	return pull8(ppReadPackedMsg, &value->value, end);
+static uint8_t unpack_uint8_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_uint8_tlv_t *value = (nfapi_uint8_tlv_t *)tlv;
+  return pull8(ppReadPackedMsg, &value->value, end);
 }
 
-static uint8_t pack_ipv4_address_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ipv4_address_t* value = (nfapi_ipv4_address_t*)tlv;
-	return pusharray8(value->address, NFAPI_IPV4_ADDRESS_LENGTH, NFAPI_IPV4_ADDRESS_LENGTH, ppWritePackedMsg, end);
+static uint8_t pack_ipv4_address_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ipv4_address_t *value = (nfapi_ipv4_address_t *)tlv;
+  return pusharray8(value->address, NFAPI_IPV4_ADDRESS_LENGTH, NFAPI_IPV4_ADDRESS_LENGTH, ppWritePackedMsg, end);
 }
-static uint8_t unpack_ipv4_address_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ipv4_address_t* value = (nfapi_ipv4_address_t*)tlv;
-	return pullarray8(ppReadPackedMsg, value->address, NFAPI_IPV4_ADDRESS_LENGTH, NFAPI_IPV4_ADDRESS_LENGTH, end);
+static uint8_t unpack_ipv4_address_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ipv4_address_t *value = (nfapi_ipv4_address_t *)tlv;
+  return pullarray8(ppReadPackedMsg, value->address, NFAPI_IPV4_ADDRESS_LENGTH, NFAPI_IPV4_ADDRESS_LENGTH, end);
 }
-static uint8_t pack_ipv6_address_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ipv6_address_t* value = (nfapi_ipv6_address_t*)tlv;
-	return pusharray8(value->address, NFAPI_IPV6_ADDRESS_LENGTH, NFAPI_IPV6_ADDRESS_LENGTH, ppWritePackedMsg, end);
+static uint8_t pack_ipv6_address_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ipv6_address_t *value = (nfapi_ipv6_address_t *)tlv;
+  return pusharray8(value->address, NFAPI_IPV6_ADDRESS_LENGTH, NFAPI_IPV6_ADDRESS_LENGTH, ppWritePackedMsg, end);
 }
-static uint8_t unpack_ipv6_address_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ipv4_address_t* value = (nfapi_ipv4_address_t*)tlv;
-	return pullarray8(ppReadPackedMsg, value->address, NFAPI_IPV6_ADDRESS_LENGTH, NFAPI_IPV6_ADDRESS_LENGTH, end);
+static uint8_t unpack_ipv6_address_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ipv4_address_t *value = (nfapi_ipv4_address_t *)tlv;
+  return pullarray8(ppReadPackedMsg, value->address, NFAPI_IPV6_ADDRESS_LENGTH, NFAPI_IPV6_ADDRESS_LENGTH, end);
 }
 
-static uint8_t pack_rf_bands_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_rf_bands_t* value = (nfapi_rf_bands_t*)tlv;
-	
-	return ( push16(value->number_rf_bands, ppWritePackedMsg, end) &&
-			 pusharray16(value->rf_band, NFAPI_MAX_NUM_RF_BANDS, value->number_rf_bands, ppWritePackedMsg, end));
+static uint8_t pack_rf_bands_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rf_bands_t *value = (nfapi_rf_bands_t *)tlv;
+  return ( push16(value->number_rf_bands, ppWritePackedMsg, end) &&
+           pusharray16(value->rf_band, NFAPI_MAX_NUM_RF_BANDS, value->number_rf_bands, ppWritePackedMsg, end));
 }
-static uint8_t unpack_rf_bands_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t* end)
-{
-	nfapi_rf_bands_t* value = (nfapi_rf_bands_t*)tlv;
-
-	return ( pull16(ppReadPackedMsg, &value->number_rf_bands, end) &&
-			 pullarray16(ppReadPackedMsg, value->rf_band, NFAPI_MAX_NUM_RF_BANDS, value->number_rf_bands, end));
+static uint8_t unpack_rf_bands_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rf_bands_t *value = (nfapi_rf_bands_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_rf_bands, end) &&
+           pullarray16(ppReadPackedMsg, value->rf_band, NFAPI_MAX_NUM_RF_BANDS, value->number_rf_bands, end));
 }
 
-static uint8_t pack_nmm_frequency_bands_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nmm_frequency_bands_t* value = (nfapi_nmm_frequency_bands_t*)tlv;
-	
-	return( push16(value->number_of_rf_bands, ppWritePackedMsg, end) &&
-			pusharray16(value->bands, NFAPI_MAX_NMM_FREQUENCY_BANDS, value->number_of_rf_bands, ppWritePackedMsg, end));
+static uint8_t pack_nmm_frequency_bands_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nmm_frequency_bands_t *value = (nfapi_nmm_frequency_bands_t *)tlv;
+  return( push16(value->number_of_rf_bands, ppWritePackedMsg, end) &&
+          pusharray16(value->bands, NFAPI_MAX_NMM_FREQUENCY_BANDS, value->number_of_rf_bands, ppWritePackedMsg, end));
 }
-static uint8_t unpack_nmm_frequency_bands_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nmm_frequency_bands_t* value = (nfapi_nmm_frequency_bands_t*)tlv;
-	
-	return ( pull16(ppReadPackedMsg, &value->number_of_rf_bands, end) &&
-			 pullarray16(ppReadPackedMsg, value->bands, NFAPI_MAX_NMM_FREQUENCY_BANDS, value->number_of_rf_bands, end));
+static uint8_t unpack_nmm_frequency_bands_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nmm_frequency_bands_t *value = (nfapi_nmm_frequency_bands_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_rf_bands, end) &&
+           pullarray16(ppReadPackedMsg, value->bands, NFAPI_MAX_NMM_FREQUENCY_BANDS, value->number_of_rf_bands, end));
 }
-static uint8_t pack_embms_mbsfn_config_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-       nfapi_embms_mbsfn_config_t* value = (nfapi_embms_mbsfn_config_t*)tlv;
-       
-       return ( push16(value->num_mbsfn_config, ppWritePackedMsg, end) &&
-                pusharray16(value->radioframe_allocation_period, 8,value->num_mbsfn_config ,ppWritePackedMsg, end) &&
-                pusharray16(value->radioframe_allocation_offset, 8,value->num_mbsfn_config ,ppWritePackedMsg, end) &&
-                pusharray8(value->fourframes_flag, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
-                pusharrays32(value->mbsfn_subframeconfig, 8, value->num_mbsfn_config, ppWritePackedMsg, end));
+static uint8_t pack_embms_mbsfn_config_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_embms_mbsfn_config_t *value = (nfapi_embms_mbsfn_config_t *)tlv;
+  return ( push16(value->num_mbsfn_config, ppWritePackedMsg, end) &&
+           pusharray16(value->radioframe_allocation_period, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
+           pusharray16(value->radioframe_allocation_offset, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
+           pusharray8(value->fourframes_flag, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
+           pusharrays32(value->mbsfn_subframeconfig, 8, value->num_mbsfn_config, ppWritePackedMsg, end));
 }
 // static uint8_t unpack_embms_mbsfn_config_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t* end)
 // {
@@ -527,342 +440,288 @@ static uint8_t pack_embms_mbsfn_config_value(void* tlv, uint8_t **ppWritePackedM
 //                      pullarrays32(ppReadPackedMsg, value->mbsfn_subframeconfig, 8, value->num_mbsfn_config, end));
 // }
 
-static uint8_t pack_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config)
-{	
-	nfapi_param_response_t *pNfapiMsg = (nfapi_param_response_t*)msg;
-
-	return( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
-			pack_tlv(NFAPI_L1_STATUS_PHY_STATE_TAG,  &pNfapiMsg->l1_status.phy_state, ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			// Do we check the phy state and then just fill those sepecified, however
-			// we do not know the duplex mode, so just attempt to pack all and assumme
-			// that the callee has set the right tlvs
-
-			pack_tlv(NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.dl_bandwidth_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) && 
-			pack_tlv(NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.ul_bandwidth_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.dl_modulation_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) && 
-			pack_tlv(NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.ul_modulation_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.phy_antenna_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.release_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.mbsfn_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			// laa capability
-
-			pack_tlv(NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &(pNfapiMsg->subframe_config.duplex_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &(pNfapiMsg->subframe_config.pcfich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value)&&
-			pack_tlv(NFAPI_SUBFRAME_CONFIG_PB_TAG, &(pNfapiMsg->subframe_config.pb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.dl_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.ul_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			pack_tlv(NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.dl_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.ul_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &(pNfapiMsg->rf_config.reference_signal_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) && 
-			pack_tlv(NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.tx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.rx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			pack_tlv(NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &(pNfapiMsg->phich_config.phich_resource), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &(pNfapiMsg->phich_config.phich_duration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &(pNfapiMsg->phich_config.phich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			pack_tlv(NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &(pNfapiMsg->sch_config.physical_cell_id), ppWritePackedMsg, end ,&pack_uint16_tlv_value) &&
-
-			pack_tlv(NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->prach_config.configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->prach_config.zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &(pNfapiMsg->prach_config.high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->prach_config.frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &(pNfapiMsg->pusch_config.hopping_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &(pNfapiMsg->pusch_config.hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &(pNfapiMsg->pusch_config.number_of_subbands), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			pack_tlv(NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &(pNfapiMsg->pucch_config.delta_pucch_shift), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &(pNfapiMsg->pucch_config.n_cqi_rb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &(pNfapiMsg->pucch_config.n_an_cs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &(pNfapiMsg->pucch_config.n1_pucch_an), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-                       pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_AREA_IDX_TAG, &(pNfapiMsg->embms_sib13_config.mbsfn_area_idx), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-                       pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_AREA_IDR9_TAG, &(pNfapiMsg->embms_sib13_config.mbsfn_area_id_r9), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-                       pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_TAG, &(pNfapiMsg->embms_mbsfn_config), ppWritePackedMsg, end, &pack_embms_mbsfn_config_value) &&
-
-                       pack_tlv(NFAPI_FEMBMS_CONFIG_RADIOFRAME_ALLOCATION_PERIOD_TAG, &(pNfapiMsg->fembms_config.radioframe_allocation_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-                       pack_tlv(NFAPI_FEMBMS_CONFIG_RADIOFRAME_ALLOCATION_OFFSET_TAG, &(pNfapiMsg->fembms_config.radioframe_allocation_offset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-                       pack_tlv(NFAPI_FEMBMS_CONFIG_NON_MBSFN_FLAG_TAG, &(pNfapiMsg->fembms_config.non_mbsfn_config_flag), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-                       pack_tlv(NFAPI_FEMBMS_CONFIG_NON_MBSFN_SUBFRAMECONFIG_TAG, &(pNfapiMsg->fembms_config.non_mbsfn_subframeconfig), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-
-			pack_tlv(NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.bandwidth_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &(pNfapiMsg->srs_config.max_up_pts), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.srs_subframe_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &(pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &(pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &(pNfapiMsg->uplink_reference_signal_config.group_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &(pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &(pNfapiMsg->tdd_frame_structure_config.subframe_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &(pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			pack_tlv(NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &(pNfapiMsg->l23_config.data_report_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_L23_CONFIG_SFNSF_TAG, &(pNfapiMsg->l23_config.sfnsf), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-			pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-
-			pack_tlv(NFAPI_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-			pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-
-			pack_tlv(NFAPI_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			pack_tlv(NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-
-			pack_tlv(NFAPI_NFAPI_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
-
-			pack_tlv(NFAPI_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-
-			pack_tlv(NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NFAPI_EARFCN_TAG, &(pNfapiMsg->nfapi_config.earfcn), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-
-			pack_tlv(NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-			pack_tlv(NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_umts_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-			pack_tlv(NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_lte_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-			pack_tlv(NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &(pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-
-}
-
-static uint8_t pack_nr_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	printf("\nRUNNING pack_param_response\n");
-	nfapi_nr_param_response_scf_t *pNfapiMsg = (nfapi_nr_param_response_scf_t*)msg;
-	
-	return (push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->cell_param.release_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PHY_STATE_TAG, &(pNfapiMsg->cell_param.phy_state), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_SKIP_BLANK_DL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_dl_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_SKIP_BLANK_UL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_ul_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_NUM_CONFIG_TLVS_TO_REPORT_TAG, &(pNfapiMsg->cell_param.num_config_tlvs_to_report ), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			
-			pack_tlv(NFAPI_NR_PARAM_TLV_CYCLIC_PREFIX_TAG, &(pNfapiMsg->carrier_param.cyclic_prefix), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_DL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_dl), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_DL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_dl), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_UL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_UL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_ul), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			pack_tlv(NFAPI_NR_PARAM_TLV_CCE_MAPPING_TYPE_TAG, &(pNfapiMsg->pdcch_param.cce_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG, &(pNfapiMsg->pdcch_param.coreset_outside_first_3_of_ofdm_syms_of_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PRECODER_GRANULARITY_CORESET_TAG, &(pNfapiMsg->pdcch_param.coreset_precoder_granularity_coreset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PDCCH_MU_MIMO_TAG, &(pNfapiMsg->pdcch_param.pdcch_mu_mimo), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PDCCH_PRECODER_CYCLING_TAG, &(pNfapiMsg->pdcch_param.pdcch_precoder_cycling), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDCCHS_PER_SLOT_TAG, &(pNfapiMsg->pdcch_param.max_pdcch_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			
-			pack_tlv(NFAPI_NR_PARAM_TLV_PUCCH_FORMATS_TAG, &(pNfapiMsg->pucch_param.pucch_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PUCCHS_PER_SLOT_TAG, &(pNfapiMsg->pucch_param.max_pucchs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			
-			pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pdsch_param.pdsch_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_allocation_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pdsch_param.pdsch_vrb_to_prb_mapping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_CBG_TAG, &(pNfapiMsg->pdsch_param.pdsch_cbg), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_config_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_MAX_LENGTH_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_max_length), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_additional_pos), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDSCH_S_YBS_PER_SLOT_TAG, &(pNfapiMsg->pdsch_param.max_pdsch_tbs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG, &(pNfapiMsg->pdsch_param.max_number_mimo_layers_pdsch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_DL_TAG, &(pNfapiMsg->pdsch_param.max_mu_mimo_users_dl), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG, &(pNfapiMsg->pdsch_param.pdsch_data_in_dmrs_symbols), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PREMPTION_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.premption_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_NON_SLOT_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.pdsch_non_slot_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-
-			pack_tlv(NFAPI_NR_PARAM_TLV_UCI_MUX_ULSCH_IN_PUSCH_TAG, &(pNfapiMsg->pusch_param.uci_mux_ulsch_in_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_UCI_ONLY_PUSCH_TAG, &(pNfapiMsg->pusch_param.uci_only_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_FREQUENCY_HOPPING_TAG, &(pNfapiMsg->pusch_param.pusch_frequency_hopping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_config_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_MAX_LEN_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_max_len), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_additional_pos), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_CBG_TAG, &(pNfapiMsg->pusch_param.pusch_cbg), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pusch_param.pusch_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pusch_param.pusch_allocation_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pusch_param.pusch_vrb_to_prb_mapping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_MAX_PTRS_PORTS_TAG, &(pNfapiMsg->pusch_param.pusch_max_ptrs_ports), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDUSCHS_TBS_PER_SLOT_TAG, &(pNfapiMsg->pusch_param.max_pduschs_tbs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG, &(pNfapiMsg->pusch_param.max_number_mimo_layers_non_cb_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_MODULATION_ORDER_UL_TAG, &(pNfapiMsg->pusch_param.supported_modulation_order_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_UL_TAG, &(pNfapiMsg->pusch_param.max_mu_mimo_users_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_DFTS_OFDM_SUPPORT_TAG, &(pNfapiMsg->pusch_param.dfts_ofdm_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_AGGREGATION_FACTOR_TAG, &(pNfapiMsg->pusch_param.pusch_aggregation_factor), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-
-            pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_LONG_FORMATS_TAG, &(pNfapiMsg->prach_param.prach_long_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_SHORT_FORMATS_TAG, &(pNfapiMsg->prach_param.prach_short_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_RESTRICTED_SETS_TAG, &(pNfapiMsg->prach_param.prach_restricted_sets), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG, &(pNfapiMsg->prach_param.max_prach_fd_occasions_in_a_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-
-			pack_tlv(NFAPI_NR_PARAM_TLV_RSSI_MEASUREMENT_SUPPORT_TAG, &(pNfapiMsg->measurement_param.rssi_measurement_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-            
-			// config:
-			
-			pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-			pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-
-			pack_tlv(NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-			pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-
-			pack_tlv(NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-    	
-}
-
-static uint8_t pack_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_config_request_t *pNfapiMsg = (nfapi_config_request_t*)msg;
-
-	return ( push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
-
-			 // Do we check the phy state and then just fill those sepecified, however
-			 // we do not know the duplex mode, so just attempt to pack all and assumme
-			 // that the callee has set the right tlvs
-
-			 pack_tlv(NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &(pNfapiMsg->subframe_config.duplex_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &(pNfapiMsg->subframe_config.pcfich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_SUBFRAME_CONFIG_PB_TAG, &(pNfapiMsg->subframe_config.pb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.dl_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.ul_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			 pack_tlv(NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.dl_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.ul_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &(pNfapiMsg->rf_config.reference_signal_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.tx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.rx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			 pack_tlv(NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &(pNfapiMsg->phich_config.phich_resource), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &(pNfapiMsg->phich_config.phich_duration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &(pNfapiMsg->phich_config.phich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			 pack_tlv(NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &(pNfapiMsg->sch_config.physical_cell_id), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			 pack_tlv(NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->prach_config.configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->prach_config.zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &(pNfapiMsg->prach_config.high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->prach_config.frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			 pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &(pNfapiMsg->pusch_config.hopping_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &(pNfapiMsg->pusch_config.hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &(pNfapiMsg->pusch_config.number_of_subbands), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			 pack_tlv(NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &(pNfapiMsg->pucch_config.delta_pucch_shift), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &(pNfapiMsg->pucch_config.n_cqi_rb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &(pNfapiMsg->pucch_config.n_an_cs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &(pNfapiMsg->pucch_config.n1_pucch_an), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			 pack_tlv(NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.bandwidth_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &(pNfapiMsg->srs_config.max_up_pts), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.srs_subframe_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &(pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			 pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &(pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &(pNfapiMsg->uplink_reference_signal_config.group_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &(pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			 pack_tlv(NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG, &(pNfapiMsg->laa_config.ed_threshold_lbt_pdsch), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG, &(pNfapiMsg->laa_config.ed_threshold_lbt_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG, &(pNfapiMsg->laa_config.pd_threshold), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG, &(pNfapiMsg->laa_config.multi_carrier_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG, &(pNfapiMsg->laa_config.multi_carrier_tx), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG, &(pNfapiMsg->laa_config.multi_carrier_freeze), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG, &(pNfapiMsg->laa_config.tx_antenna_ports_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG, &(pNfapiMsg->laa_config.tx_power_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			 pack_tlv(NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG, &(pNfapiMsg->emtc_config.pbch_repetitions_enable_r13), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_catm_root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->emtc_config.prach_catm_zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG, &(pNfapiMsg->emtc_config.prach_catm_high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_starting_subframe_periodicity), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_starting_subframe_periodicity), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_starting_subframe_periodicity), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_starting_subframe_periodicity), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG, &(pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodea), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG, &(pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodeb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			 pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &(pNfapiMsg->tdd_frame_structure_config.subframe_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &(pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-			 pack_tlv(NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &(pNfapiMsg->l23_config.data_report_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_L23_CONFIG_SFNSF_TAG, &(pNfapiMsg->l23_config.sfnsf), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-
-			 pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-			 pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-			 pack_tlv(NFAPI_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-			 pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-			 pack_tlv(NFAPI_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			 pack_tlv(NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-
-			 pack_tlv(NFAPI_PHY_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
-
-			 pack_tlv(NFAPI_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			 pack_tlv(NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			 pack_tlv(NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-
-			 pack_tlv(NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			 pack_tlv(NFAPI_NFAPI_EARFCN_TAG, &(pNfapiMsg->nfapi_config.earfcn), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-
-
-			 pack_tlv(NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-			 pack_tlv(NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_umts_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-			 pack_tlv(NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_lte_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-			 pack_tlv(NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &(pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-
-			 pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+static uint8_t pack_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_param_response_t *pNfapiMsg = (nfapi_param_response_t *)msg;
+  return( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_L1_STATUS_PHY_STATE_TAG,  &pNfapiMsg->l1_status.phy_state, ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          // Do we check the phy state and then just fill those sepecified, however
+          // we do not know the duplex mode, so just attempt to pack all and assumme
+          // that the callee has set the right tlvs
+          pack_tlv(NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.dl_bandwidth_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.ul_bandwidth_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.dl_modulation_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.ul_modulation_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.phy_antenna_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.release_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.mbsfn_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          // laa capability
+          pack_tlv(NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &(pNfapiMsg->subframe_config.duplex_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &(pNfapiMsg->subframe_config.pcfich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value)&&
+          pack_tlv(NFAPI_SUBFRAME_CONFIG_PB_TAG, &(pNfapiMsg->subframe_config.pb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.dl_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.ul_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.dl_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.ul_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &(pNfapiMsg->rf_config.reference_signal_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.tx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.rx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &(pNfapiMsg->phich_config.phich_resource), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &(pNfapiMsg->phich_config.phich_duration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &(pNfapiMsg->phich_config.phich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &(pNfapiMsg->sch_config.physical_cell_id), ppWritePackedMsg, end,&pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->prach_config.configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->prach_config.zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &(pNfapiMsg->prach_config.high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->prach_config.frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &(pNfapiMsg->pusch_config.hopping_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &(pNfapiMsg->pusch_config.hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &(pNfapiMsg->pusch_config.number_of_subbands), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &(pNfapiMsg->pucch_config.delta_pucch_shift), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &(pNfapiMsg->pucch_config.n_cqi_rb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &(pNfapiMsg->pucch_config.n_an_cs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &(pNfapiMsg->pucch_config.n1_pucch_an), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_AREA_IDX_TAG, &(pNfapiMsg->embms_sib13_config.mbsfn_area_idx), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_AREA_IDR9_TAG, &(pNfapiMsg->embms_sib13_config.mbsfn_area_id_r9), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_TAG, &(pNfapiMsg->embms_mbsfn_config), ppWritePackedMsg, end, &pack_embms_mbsfn_config_value) &&
+          pack_tlv(NFAPI_FEMBMS_CONFIG_RADIOFRAME_ALLOCATION_PERIOD_TAG, &(pNfapiMsg->fembms_config.radioframe_allocation_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_FEMBMS_CONFIG_RADIOFRAME_ALLOCATION_OFFSET_TAG, &(pNfapiMsg->fembms_config.radioframe_allocation_offset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_FEMBMS_CONFIG_NON_MBSFN_FLAG_TAG, &(pNfapiMsg->fembms_config.non_mbsfn_config_flag), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_FEMBMS_CONFIG_NON_MBSFN_SUBFRAMECONFIG_TAG, &(pNfapiMsg->fembms_config.non_mbsfn_subframeconfig), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.bandwidth_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &(pNfapiMsg->srs_config.max_up_pts), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.srs_subframe_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &(pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &(pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &(pNfapiMsg->uplink_reference_signal_config.group_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &(pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &(pNfapiMsg->tdd_frame_structure_config.subframe_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &(pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &(pNfapiMsg->l23_config.data_report_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_L23_CONFIG_SFNSF_TAG, &(pNfapiMsg->l23_config.sfnsf), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
+          pack_tlv(NFAPI_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_EARFCN_TAG, &(pNfapiMsg->nfapi_config.earfcn), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+          pack_tlv(NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_umts_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+          pack_tlv(NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_lte_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+          pack_tlv(NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &(pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+static uint8_t pack_nr_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  printf("\nRUNNING pack_param_response\n");
+  nfapi_nr_param_response_scf_t *pNfapiMsg = (nfapi_nr_param_response_scf_t *)msg;
+  return (push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->cell_param.release_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PHY_STATE_TAG, &(pNfapiMsg->cell_param.phy_state), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SKIP_BLANK_DL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_dl_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SKIP_BLANK_UL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_ul_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_NUM_CONFIG_TLVS_TO_REPORT_TAG, &(pNfapiMsg->cell_param.num_config_tlvs_to_report ), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_CYCLIC_PREFIX_TAG, &(pNfapiMsg->carrier_param.cyclic_prefix), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_DL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_dl), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_DL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_dl), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_UL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_UL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_ul), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_CCE_MAPPING_TYPE_TAG, &(pNfapiMsg->pdcch_param.cce_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG, &(pNfapiMsg->pdcch_param.coreset_outside_first_3_of_ofdm_syms_of_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PRECODER_GRANULARITY_CORESET_TAG, &(pNfapiMsg->pdcch_param.coreset_precoder_granularity_coreset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDCCH_MU_MIMO_TAG, &(pNfapiMsg->pdcch_param.pdcch_mu_mimo), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDCCH_PRECODER_CYCLING_TAG, &(pNfapiMsg->pdcch_param.pdcch_precoder_cycling), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDCCHS_PER_SLOT_TAG, &(pNfapiMsg->pdcch_param.max_pdcch_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUCCH_FORMATS_TAG, &(pNfapiMsg->pucch_param.pucch_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PUCCHS_PER_SLOT_TAG, &(pNfapiMsg->pucch_param.max_pucchs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pdsch_param.pdsch_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_allocation_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pdsch_param.pdsch_vrb_to_prb_mapping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_CBG_TAG, &(pNfapiMsg->pdsch_param.pdsch_cbg), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_config_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_MAX_LENGTH_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_max_length), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_additional_pos), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDSCH_S_YBS_PER_SLOT_TAG, &(pNfapiMsg->pdsch_param.max_pdsch_tbs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG, &(pNfapiMsg->pdsch_param.max_number_mimo_layers_pdsch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_DL_TAG, &(pNfapiMsg->pdsch_param.max_mu_mimo_users_dl), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG, &(pNfapiMsg->pdsch_param.pdsch_data_in_dmrs_symbols), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PREMPTION_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.premption_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_NON_SLOT_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.pdsch_non_slot_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_UCI_MUX_ULSCH_IN_PUSCH_TAG, &(pNfapiMsg->pusch_param.uci_mux_ulsch_in_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_UCI_ONLY_PUSCH_TAG, &(pNfapiMsg->pusch_param.uci_only_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_FREQUENCY_HOPPING_TAG, &(pNfapiMsg->pusch_param.pusch_frequency_hopping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_config_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_MAX_LEN_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_max_len), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_additional_pos), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_CBG_TAG, &(pNfapiMsg->pusch_param.pusch_cbg), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pusch_param.pusch_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pusch_param.pusch_allocation_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pusch_param.pusch_vrb_to_prb_mapping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_MAX_PTRS_PORTS_TAG, &(pNfapiMsg->pusch_param.pusch_max_ptrs_ports), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDUSCHS_TBS_PER_SLOT_TAG, &(pNfapiMsg->pusch_param.max_pduschs_tbs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG, &(pNfapiMsg->pusch_param.max_number_mimo_layers_non_cb_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_MODULATION_ORDER_UL_TAG, &(pNfapiMsg->pusch_param.supported_modulation_order_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_UL_TAG, &(pNfapiMsg->pusch_param.max_mu_mimo_users_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_DFTS_OFDM_SUPPORT_TAG, &(pNfapiMsg->pusch_param.dfts_ofdm_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_AGGREGATION_FACTOR_TAG, &(pNfapiMsg->pusch_param.pusch_aggregation_factor), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_LONG_FORMATS_TAG, &(pNfapiMsg->prach_param.prach_long_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_SHORT_FORMATS_TAG, &(pNfapiMsg->prach_param.prach_short_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_RESTRICTED_SETS_TAG, &(pNfapiMsg->prach_param.prach_restricted_sets), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG, &(pNfapiMsg->prach_param.max_prach_fd_occasions_in_a_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_RSSI_MEASUREMENT_SUPPORT_TAG, &(pNfapiMsg->measurement_param.rssi_measurement_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          // config:
+          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_config_request_t *pNfapiMsg = (nfapi_config_request_t *)msg;
+  return ( push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
+           // Do we check the phy state and then just fill those sepecified, however
+           // we do not know the duplex mode, so just attempt to pack all and assumme
+           // that the callee has set the right tlvs
+           pack_tlv(NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &(pNfapiMsg->subframe_config.duplex_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &(pNfapiMsg->subframe_config.pcfich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SUBFRAME_CONFIG_PB_TAG, &(pNfapiMsg->subframe_config.pb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.dl_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.ul_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.dl_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.ul_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &(pNfapiMsg->rf_config.reference_signal_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.tx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.rx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &(pNfapiMsg->phich_config.phich_resource), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &(pNfapiMsg->phich_config.phich_duration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &(pNfapiMsg->phich_config.phich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &(pNfapiMsg->sch_config.physical_cell_id), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->prach_config.configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->prach_config.zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &(pNfapiMsg->prach_config.high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->prach_config.frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &(pNfapiMsg->pusch_config.hopping_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &(pNfapiMsg->pusch_config.hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &(pNfapiMsg->pusch_config.number_of_subbands), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &(pNfapiMsg->pucch_config.delta_pucch_shift), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &(pNfapiMsg->pucch_config.n_cqi_rb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &(pNfapiMsg->pucch_config.n_an_cs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &(pNfapiMsg->pucch_config.n1_pucch_an), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.bandwidth_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &(pNfapiMsg->srs_config.max_up_pts), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.srs_subframe_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &(pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &(pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &(pNfapiMsg->uplink_reference_signal_config.group_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &(pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG, &(pNfapiMsg->laa_config.ed_threshold_lbt_pdsch), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG, &(pNfapiMsg->laa_config.ed_threshold_lbt_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG, &(pNfapiMsg->laa_config.pd_threshold), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG, &(pNfapiMsg->laa_config.multi_carrier_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG, &(pNfapiMsg->laa_config.multi_carrier_tx), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG, &(pNfapiMsg->laa_config.multi_carrier_freeze), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG, &(pNfapiMsg->laa_config.tx_antenna_ports_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG, &(pNfapiMsg->laa_config.tx_power_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG, &(pNfapiMsg->emtc_config.pbch_repetitions_enable_r13), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_catm_root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->emtc_config.prach_catm_zero_correlation_zone_configuration), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG, &(pNfapiMsg->emtc_config.prach_catm_high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_starting_subframe_periodicity), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_starting_subframe_periodicity), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_starting_subframe_periodicity), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_starting_subframe_periodicity), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG, &(pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodea), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG, &(pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodeb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &(pNfapiMsg->tdd_frame_structure_config.subframe_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &(pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &(pNfapiMsg->l23_config.data_report_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_L23_CONFIG_SFNSF_TAG, &(pNfapiMsg->l23_config.sfnsf), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_tlv(NFAPI_PHY_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
+           pack_tlv(NFAPI_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_EARFCN_TAG, &(pNfapiMsg->nfapi_config.earfcn), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+           pack_tlv(NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_umts_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+           pack_tlv(NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_lte_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+           pack_tlv(NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &(pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
 }
 
 
 static uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
 {
-	printf("\n\nEntering pack_config_request\n");
+
 	nfapi_nr_config_request_scf_t *pNfapiMsg = (nfapi_nr_config_request_scf_t*)msg;
 
+	for(int i = 0; i<40; i++){ //packing tdd slot config
+		for(int symbol = 0; symbol<14;symbol++){
+			push8(pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[symbol].slot_config.value, ppWritePackedMsg,end);
+		}
+	}
 
 	return (push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
 		    pack_tlv(NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG, &(pNfapiMsg->carrier_config.dl_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
@@ -884,10 +743,10 @@ static uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uin
 			pack_tlv(NFAPI_NR_CONFIG_RESTRICTED_SET_CONFIG_TAG, &(pNfapiMsg->prach_config.restricted_set_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
 			pack_tlv(NFAPI_NR_CONFIG_SSB_PER_RACH_TAG, &(pNfapiMsg->prach_config.ssb_per_rach), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
             pack_tlv(NFAPI_NR_CONFIG_PRACH_SUB_C_SPACING_TAG, &(pNfapiMsg->prach_config.prach_sub_c_spacing), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-             pack_tlv(NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-             pack_tlv(NFAPI_NR_CONFIG_K1_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].k1), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-             pack_tlv(NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_zero_corr_conf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			 pack_tlv(NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].num_root_sequences), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+            pack_tlv(NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+            pack_tlv(NFAPI_NR_CONFIG_K1_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].k1), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+            pack_tlv(NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_zero_corr_conf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].num_root_sequences), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
 
 
 			pack_tlv(NFAPI_NR_CONFIG_SCS_COMMON_TAG, &(pNfapiMsg->ssb_config.scs_common), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
@@ -903,11 +762,6 @@ static uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uin
 			pack_tlv(NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG, &(pNfapiMsg->ssb_table.ssb_subcarrier_offset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
 
 			pack_tlv(NFAPI_NR_CONFIG_TDD_PERIOD_TAG, &(pNfapiMsg->tdd_table.tdd_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-		   	pack_tlv(NFAPI_NR_CONFIG_SLOT_CONFIG_TAG, &(pNfapiMsg->tdd_table.max_tdd_periodicity_list[0].max_num_of_symbol_per_slot_list[0].slot_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-
-			//pack_tlv(NFAPI_NR_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-			//pack_tlv(NFAPI_NR_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			//pack_tlv(NFAPI_NR_NFAPI_NRARFCN_TAG, &(pNfapiMsg->nfapi_config.nrarfcn), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
 			pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
 			pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
 			pack_tlv(NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
@@ -923,1159 +777,968 @@ static uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uin
 			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
 }
 
-static uint8_t pack_nr_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_config_response_scf_t *pNfapiMsg = (nfapi_nr_config_response_scf_t*)msg;
-
-	return ( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			 pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+static uint8_t pack_nr_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_config_response_scf_t *pNfapiMsg = (nfapi_nr_config_response_scf_t *)msg;
+  return ( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
 }
 
-static uint8_t pack_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_config_response_t *pNfapiMsg = (nfapi_config_response_t*)msg;
-
-	return ( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			 pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+static uint8_t pack_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_config_response_t *pNfapiMsg = (nfapi_config_response_t *)msg;
+  return ( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
 }
 
-static uint8_t pack_nr_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_start_request_scf_t *pNfapiMsg = (nfapi_nr_start_request_scf_t*)msg;
-	return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+static uint8_t pack_nr_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_start_request_scf_t *pNfapiMsg = (nfapi_nr_start_request_scf_t *)msg;
+  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
 }
 
-static uint8_t pack_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_start_request_t *pNfapiMsg = (nfapi_start_request_t*)msg;
-	return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+static uint8_t pack_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_start_request_t *pNfapiMsg = (nfapi_start_request_t *)msg;
+  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
 }
 
-static uint8_t pack_nr_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_start_response_scf_t *pNfapiMsg = (nfapi_nr_start_response_scf_t*)msg;
-
-	return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end ) &&
-			 pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+static uint8_t pack_nr_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_start_response_scf_t *pNfapiMsg = (nfapi_nr_start_response_scf_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end ) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
 }
 
-static uint8_t pack_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_start_response_t *pNfapiMsg = (nfapi_start_response_t*)msg;
-
-	return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end ) &&
-			 pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+static uint8_t pack_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_start_response_t *pNfapiMsg = (nfapi_start_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end ) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
 }
 
 
-static uint8_t pack_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_stop_request_t *pNfapiMsg = (nfapi_stop_request_t*)msg;
-	return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+static uint8_t pack_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_stop_request_t *pNfapiMsg = (nfapi_stop_request_t *)msg;
+  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
 }
 
-static uint8_t pack_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_stop_response_t *pNfapiMsg = (nfapi_stop_response_t*)msg;
-
-	return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			 pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+static uint8_t pack_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_stop_response_t *pNfapiMsg = (nfapi_stop_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
 }
 
-static uint8_t pack_measurement_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_measurement_request_t *pNfapiMsg = (nfapi_measurement_request_t*)msg;
-
-	return( pack_tlv(NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG, &(pNfapiMsg->dl_rs_tx_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG, &(pNfapiMsg->received_interference_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_tlv(NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG, &(pNfapiMsg->thermal_noise_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_measurement_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_measurement_request_t *pNfapiMsg = (nfapi_measurement_request_t *)msg;
+  return( pack_tlv(NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG, &(pNfapiMsg->dl_rs_tx_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG, &(pNfapiMsg->received_interference_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG, &(pNfapiMsg->thermal_noise_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
-static uint8_t pack_recevied_interference_power_measurement_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_received_interference_power_measurement_t* value = (nfapi_received_interference_power_measurement_t*)tlv;
-	
-	return  ( push16(value->number_of_resource_blocks, ppWritePackedMsg, end) &&
-			  pusharrays16(value->received_interference_power, NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS, value->number_of_resource_blocks, ppWritePackedMsg, end));
+static uint8_t pack_recevied_interference_power_measurement_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_received_interference_power_measurement_t *value = (nfapi_received_interference_power_measurement_t *)tlv;
+  return  ( push16(value->number_of_resource_blocks, ppWritePackedMsg, end) &&
+            pusharrays16(value->received_interference_power, NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS, value->number_of_resource_blocks, ppWritePackedMsg, end));
 }
 
-static uint8_t pack_measurement_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_measurement_response_t *pNfapiMsg = (nfapi_measurement_response_t*)msg;
-
-	return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-			pack_tlv(NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG, &(pNfapiMsg->dl_rs_tx_power_measurement), ppWritePackedMsg, end, &pack_int16_tlv_value) &&
-			pack_tlv(NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG, &(pNfapiMsg->received_interference_power_measurement), ppWritePackedMsg, end, &pack_recevied_interference_power_measurement_value) &&
-			pack_tlv(NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG, &(pNfapiMsg->thermal_noise_power_measurement), ppWritePackedMsg, end, &pack_uint16_tlv_value) && 
-			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+static uint8_t pack_measurement_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_measurement_response_t *pNfapiMsg = (nfapi_measurement_response_t *)msg;
+  return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG, &(pNfapiMsg->dl_rs_tx_power_measurement), ppWritePackedMsg, end, &pack_int16_tlv_value) &&
+          pack_tlv(NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG, &(pNfapiMsg->received_interference_power_measurement), ppWritePackedMsg, end,
+                   &pack_recevied_interference_power_measurement_value) &&
+          pack_tlv(NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG, &(pNfapiMsg->thermal_noise_power_measurement), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
 }
 
-static uint8_t pack_nr_p5_message_body(nfapi_p4_p5_message_header_t *header, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	uint8_t result = 0;
-	// look for the specific message
-	switch (header->message_id)
-	{
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
-			result = pack_nr_pnf_param_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_PNF_PARAM_RESPONSE:
-			result = pack_nr_pnf_param_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
-			result = pack_nr_pnf_config_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
-			result = pack_nr_pnf_config_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
-			result = pack_nr_pnf_start_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
-			result = pack_nr_pnf_start_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
-			result = pack_nr_pnf_stop_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_PNF_STOP_RESPONSE:
-			result = pack_nr_pnf_stop_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
-			result = pack_nr_param_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
-			result = pack_nr_param_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
-			result = pack_nr_config_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
-			result = pack_nr_config_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
-			result = pack_nr_start_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
-			result = pack_nr_start_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
-			result = pack_stop_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
-			result = pack_stop_response(header, ppWritePackedMsg, end, config);
-			break;
-		default:
-			{
-				if(header->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-				   header->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
-				{
-					if(config && config->pack_p4_p5_vendor_extension)
-					{
-						result = (config->pack_p4_p5_vendor_extension)(header, ppWritePackedMsg, end, config);
-					}
-					else
-					{
-						NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, header->message_id);
-					}
-				}
-				else
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, header->message_id);
-				}
-			}
-			break;
-	}
+static uint8_t pack_nr_p5_message_body(nfapi_p4_p5_message_header_t *header, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  uint8_t result = 0;
 
-	return result;
-}
+  // look for the specific message
+  switch (header->message_id) {
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
+      result = pack_nr_pnf_param_request(header, ppWritePackedMsg, end, config);
+      break;
 
+    case NFAPI_PNF_PARAM_RESPONSE:
+      result = pack_nr_pnf_param_response(header, ppWritePackedMsg, end, config);
+      break;
 
-static uint8_t pack_p5_message_body(nfapi_p4_p5_message_header_t *header, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-	uint8_t result = 0;
-	// look for the specific message
-	switch (header->message_id)
-	{
-		case NFAPI_PNF_PARAM_REQUEST:
-			result = pack_pnf_param_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_PNF_PARAM_RESPONSE:
-			result = pack_pnf_param_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_PNF_CONFIG_REQUEST:
-			result = pack_pnf_config_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_PNF_CONFIG_RESPONSE:
-			result = pack_pnf_config_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_PNF_START_REQUEST:
-			result = pack_pnf_start_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_PNF_START_RESPONSE:
-			result = pack_pnf_start_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_PNF_STOP_REQUEST:
-			result = pack_pnf_stop_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_PNF_STOP_RESPONSE:
-			result = pack_pnf_stop_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_PARAM_REQUEST:
-			result = pack_param_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_PARAM_RESPONSE:
-			result = pack_param_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_CONFIG_REQUEST:
-			result = pack_config_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_CONFIG_RESPONSE:
-			result = pack_config_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_START_REQUEST:
-			result = pack_start_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_START_RESPONSE:
-			result = pack_start_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_STOP_REQUEST:
-			result = pack_stop_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_STOP_RESPONSE:
-			result = pack_stop_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_MEASUREMENT_REQUEST:
-			result = pack_measurement_request(header, ppWritePackedMsg, end, config);
-			break;
-
-		case NFAPI_MEASUREMENT_RESPONSE:
-			result = pack_measurement_response(header, ppWritePackedMsg, end, config);
-			break;
-
-		default:
-			{
-				if(header->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-				   header->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
-				{
-					if(config && config->pack_p4_p5_vendor_extension)
-					{
-						result = (config->pack_p4_p5_vendor_extension)(header, ppWritePackedMsg, end, config);
-					}
-					else
-					{
-						NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, header->message_id);
-					}
-				}
-				else
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, header->message_id);
-				}
-			}
-			break;
-	}
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
+      result = pack_nr_pnf_config_request(header, ppWritePackedMsg, end, config);
+      break;
 
-	return result;
-}
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
+      result = pack_nr_pnf_config_response(header, ppWritePackedMsg, end, config);
+      break;
 
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
+      result = pack_nr_pnf_start_request(header, ppWritePackedMsg, end, config);
+      break;
 
-// helper function for message length calculation -
-// takes the pointers to the start of message to end of message
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
+      result = pack_nr_pnf_start_response(header, ppWritePackedMsg, end, config);
+      break;
 
-static uint32_t get_packed_msg_len(uintptr_t msgHead, uintptr_t msgEnd)
-{
-	if (msgEnd < msgHead)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "get_packed_msg_len: Error in pointers supplied %d, %d\n", msgHead, msgEnd);
-		return 0;
-	}
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
+      result = pack_nr_pnf_stop_request(header, ppWritePackedMsg, end, config);
+      break;
 
-	return (msgEnd - msgHead);
-}
+    case NFAPI_PNF_STOP_RESPONSE:
+      result = pack_nr_pnf_stop_response(header, ppWritePackedMsg, end, config);
+      break;
 
-// Main pack function - public
-int nfapi_nr_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf;
-	uint8_t *pWritePackedMessage = pPackedBuf;
-	uint8_t *pPackMessageEnd = pPackedBuf + packedBufLen;
-	uint8_t *pPackedLengthField = &pWritePackedMessage[4];
-	uint32_t packedMsgLen;
-	uint16_t packedMsgLen16;
-
-	if (pMessageBuf == NULL || pPackedBuf == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Pack supplied pointers are null\n");
-		return -1;
-	}
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
+      result = pack_nr_param_request(header, ppWritePackedMsg, end, config);
+      break;
 
-	// pack the message
-	if(push16(pMessageHeader->phy_id, &pWritePackedMessage, pPackMessageEnd) &&
-	   push16(pMessageHeader->message_id, &pWritePackedMessage, pPackMessageEnd) &&
-	   push16(0, &pWritePackedMessage, pPackMessageEnd) &&
-	   push16(pMessageHeader->spare, &pWritePackedMessage, pPackMessageEnd) &&
-	   pack_nr_p5_message_body(pMessageHeader, &pWritePackedMessage, pPackMessageEnd, config))
-	{
-		// check for a valid message length
-		packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage);
-		if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
-			return -1;
-		}
-		else
-		{
-			packedMsgLen16 = (uint16_t)packedMsgLen;
-		}
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
+      result = pack_nr_param_response(header, ppWritePackedMsg, end, config);
+      break;
 
-		// Update the message length in the header
-		if(!push16(packedMsgLen16, &pPackedLengthField, pPackMessageEnd))
-			return -1;
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
+      result = pack_nr_config_request(header, ppWritePackedMsg, end, config);
+      break;
 
-		// return the packed length
-		return (packedMsgLen);
-	}
-	else
-	{
-		// Failed to pack the meassage
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Failed to pack message\n");
-		return -1;
-    }
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
+      result = pack_nr_config_response(header, ppWritePackedMsg, end, config);
+      break;
 
-}
-
-int nfapi_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf;
-	uint8_t *pWritePackedMessage = pPackedBuf;
-	uint8_t *pPackMessageEnd = pPackedBuf + packedBufLen;
-	uint8_t *pPackedLengthField = &pWritePackedMessage[4];
-	uint32_t packedMsgLen;
-	uint16_t packedMsgLen16;
-
-	if (pMessageBuf == NULL || pPackedBuf == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Pack supplied pointers are null\n");
-		return -1;
-	}
+    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
+      result = pack_nr_start_request(header, ppWritePackedMsg, end, config);
+      break;
 
-	// pack the message
-	if(push16(pMessageHeader->phy_id, &pWritePackedMessage, pPackMessageEnd) &&
-	   push16(pMessageHeader->message_id, &pWritePackedMessage, pPackMessageEnd) &&
-	   push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, pPackMessageEnd) &&
-	   push16(pMessageHeader->spare, &pWritePackedMessage, pPackMessageEnd) &&
-	   pack_p5_message_body(pMessageHeader, &pWritePackedMessage, pPackMessageEnd, config))
-	{
-		// check for a valid message length
-		packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage);
-		if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
-			return -1;
-		}
-		else
-		{
-			packedMsgLen16 = (uint16_t)packedMsgLen;
-		}
+    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
+      result = pack_nr_start_response(header, ppWritePackedMsg, end, config);
+      break;
 
-		// Update the message length in the header
-		if(!push16(packedMsgLen16, &pPackedLengthField, pPackMessageEnd))
-			return -1;
-
-		// return the packed length
-		return (packedMsgLen);
-	}
-	else
-	{
-		// Failed to pack the meassage
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Failed to pack message\n");
-		return -1;
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
+      result = pack_stop_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
+      result = pack_stop_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    default: {
+      if(header->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          header->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->pack_p4_p5_vendor_extension) {
+          result = (config->pack_p4_p5_vendor_extension)(header, ppWritePackedMsg, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, header->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, header->message_id);
+      }
     }
+    break;
+  }
 
+  return result;
 }
 
 
+static uint8_t pack_p5_message_body(nfapi_p4_p5_message_header_t *header, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  uint8_t result = 0;
 
-// Unpack routines
+  // look for the specific message
+  switch (header->message_id) {
+    case NFAPI_PNF_PARAM_REQUEST:
+      result = pack_pnf_param_request(header, ppWritePackedMsg, end, config);
+      break;
 
+    case NFAPI_PNF_PARAM_RESPONSE:
+      result = pack_pnf_param_response(header, ppWritePackedMsg, end, config);
+      break;
 
-static uint8_t  unpack_nr_pnf_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_pnf_param_request_t *pNfapiMsg = (nfapi_nr_pnf_param_request_t*)msg;
-	
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
-	
-	return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
+    case NFAPI_PNF_CONFIG_REQUEST:
+      result = pack_pnf_config_request(header, ppWritePackedMsg, end, config);
+      break;
 
+    case NFAPI_PNF_CONFIG_RESPONSE:
+      result = pack_pnf_config_response(header, ppWritePackedMsg, end, config);
+      break;
 
-static uint8_t  unpack_pnf_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_param_request_t *pNfapiMsg = (nfapi_pnf_param_request_t*)msg;
-	
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
-	
-	return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
+    case NFAPI_PNF_START_REQUEST:
+      result = pack_pnf_start_request(header, ppWritePackedMsg, end, config);
+      break;
 
-static uint8_t unpack_pnf_param_general_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_param_general_t* value = (nfapi_pnf_param_general_t*)tlv;
-	
-	return( pull8(ppReadPackedMsg, &value->nfapi_sync_mode, end) &&
-			pull8(ppReadPackedMsg, &value->location_mode, end) &&
-			pull16(ppReadPackedMsg, &value->location_coordinates_length, end) &&
-			pullarray8(ppReadPackedMsg, value->location_coordinates, NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH, value->location_coordinates_length, end) &&
-			pull32(ppReadPackedMsg, &value->dl_config_timing, end) &&
-			pull32(ppReadPackedMsg, &value->tx_timing, end) &&
-			pull32(ppReadPackedMsg, &value->ul_config_timing, end) &&
-			pull32(ppReadPackedMsg, &value->hi_dci0_timing, end) &&
-			pull16(ppReadPackedMsg, &value->maximum_number_phys, end) &&
-			pull16(ppReadPackedMsg, &value->maximum_total_bandwidth, end) &&
-			pull8(ppReadPackedMsg, &value->maximum_total_number_dl_layers, end) &&
-			pull8(ppReadPackedMsg, &value->maximum_total_number_ul_layers, end) &&
-			pull8(ppReadPackedMsg, &value->shared_bands, end) &&
-			pull8(ppReadPackedMsg, &value->shared_pa, end) &&
-			pulls16(ppReadPackedMsg, &value->maximum_total_power, end) &&
-			pullarray8(ppReadPackedMsg, value->oui, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, end));
-}
-
-static uint8_t unpack_rf_config_info(void* elem, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_rf_config_info_t* info = (nfapi_rf_config_info_t*)elem;
-	return pull16(ppReadPackedMsg, &info->rf_config_index, end);
-}
+    case NFAPI_PNF_START_RESPONSE:
+      result = pack_pnf_start_response(header, ppWritePackedMsg, end, config);
+      break;
 
-static uint8_t unpack_pnf_phy_info(void* elem, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_info_t* phy = (nfapi_pnf_phy_info_t*)elem;
+    case NFAPI_PNF_STOP_REQUEST:
+      result = pack_pnf_stop_request(header, ppWritePackedMsg, end, config);
+      break;
 
-	return ( pull16(ppReadPackedMsg, &phy->phy_config_index, end) && 
-			 pull16(ppReadPackedMsg, &phy->number_of_rfs, end) &&
-			 unpackarray(ppReadPackedMsg, phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, end, &unpack_rf_config_info) &&
-			 pull16(ppReadPackedMsg, &phy->number_of_rf_exclusions, end) &&
-			 unpackarray(ppReadPackedMsg, phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, end, &unpack_rf_config_info) &&
-			 pull16(ppReadPackedMsg, &phy->downlink_channel_bandwidth_supported, end) &&
-			 pull16(ppReadPackedMsg, &phy->uplink_channel_bandwidth_supported, end) &&
-			 pull8(ppReadPackedMsg, &phy->number_of_dl_layers_supported, end) &&
-			 pull8(ppReadPackedMsg, &phy->number_of_ul_layers_supported, end) &&
-			 pull16(ppReadPackedMsg, &phy->maximum_3gpp_release_supported, end) &&
-			 pull8(ppReadPackedMsg, &phy->nmm_modes_supported, end));
-}
+    case NFAPI_PNF_STOP_RESPONSE:
+      result = pack_pnf_stop_response(header, ppWritePackedMsg, end, config);
+      break;
 
+    case NFAPI_PARAM_REQUEST:
+      result = pack_param_request(header, ppWritePackedMsg, end, config);
+      break;
 
-static uint8_t unpack_pnf_phy_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_t* value = (nfapi_pnf_phy_t*)tlv;
-	return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) && 
-			 unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_info));
-}
+    case NFAPI_PARAM_RESPONSE:
+      result = pack_param_response(header, ppWritePackedMsg, end, config);
+      break;
 
-static uint8_t unpack_pnf_rf_info(void* elem, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_rf_info_t* rf = (nfapi_pnf_rf_info_t*)elem;
-		
-	return( pull16(ppReadPackedMsg, &rf->rf_config_index, end) &&
-			pull16(ppReadPackedMsg, &rf->band, end) &&
-			pulls16(ppReadPackedMsg, &rf->maximum_transmit_power, end) &&
-			pulls16(ppReadPackedMsg, &rf->minimum_transmit_power, end) &&
-			pull8(ppReadPackedMsg, &rf->number_of_antennas_suppported, end) &&
-			pull32(ppReadPackedMsg, &rf->minimum_downlink_frequency, end) &&
-			pull32(ppReadPackedMsg, &rf->maximum_downlink_frequency, end) &&
-			pull32(ppReadPackedMsg, &rf->minimum_uplink_frequency, end) &&
-			pull32(ppReadPackedMsg, &rf->maximum_uplink_frequency, end));
-
-}
-static uint8_t unpack_pnf_rf_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_rf_t* value = (nfapi_pnf_rf_t*)tlv;
+    case NFAPI_CONFIG_REQUEST:
+      result = pack_config_request(header, ppWritePackedMsg, end, config);
+      break;
 
-	return ( pull16(ppReadPackedMsg, &value->number_of_rfs, end) &&
-		     unpackarray(ppReadPackedMsg, value->rf, sizeof(nfapi_pnf_rf_info_t), NFAPI_MAX_PNF_RF, value->number_of_rfs, end, &unpack_pnf_rf_info));
-}
+    case NFAPI_CONFIG_RESPONSE:
+      result = pack_config_response(header, ppWritePackedMsg, end, config);
+      break;
 
-static uint8_t unpack_pnf_phy_rel10_info(void* elem, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel10_info_t* phy = (nfapi_pnf_phy_rel10_info_t*)elem;
-		
-	return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-			pull16(ppReadPackedMsg, &phy->transmission_mode_7_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->transmission_mode_8_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->two_antenna_ports_for_pucch, end) &&
-			pull16(ppReadPackedMsg, &phy->transmission_mode_9_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->simultaneous_pucch_pusch, end) &&
-			pull16(ppReadPackedMsg, &phy->four_layer_tx_with_tm3_and_tm4, end));
+    case NFAPI_START_REQUEST:
+      result = pack_start_request(header, ppWritePackedMsg, end, config);
+      break;
 
+    case NFAPI_START_RESPONSE:
+      result = pack_start_response(header, ppWritePackedMsg, end, config);
+      break;
 
-}
-static uint8_t unpack_pnf_phy_rel10_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel10_t* value = (nfapi_pnf_phy_rel10_t*)tlv;
+    case NFAPI_STOP_REQUEST:
+      result = pack_stop_request(header, ppWritePackedMsg, end, config);
+      break;
 
-	return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-			 unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel10_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel10_info));
+    case NFAPI_STOP_RESPONSE:
+      result = pack_stop_response(header, ppWritePackedMsg, end, config);
+      break;
 
-}
+    case NFAPI_MEASUREMENT_REQUEST:
+      result = pack_measurement_request(header, ppWritePackedMsg, end, config);
+      break;
 
+    case NFAPI_MEASUREMENT_RESPONSE:
+      result = pack_measurement_response(header, ppWritePackedMsg, end, config);
+      break;
 
-static uint8_t unpack_pnf_phy_rel11_info(void* elem, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel11_info_t* phy = (nfapi_pnf_phy_rel11_info_t*)elem;
+    default: {
+      if(header->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          header->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->pack_p4_p5_vendor_extension) {
+          result = (config->pack_p4_p5_vendor_extension)(header, ppWritePackedMsg, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, header->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, header->message_id);
+      }
+    }
+    break;
+  }
 
-	return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-			pull16(ppReadPackedMsg, &phy->edpcch_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->multi_ack_csi_reporting, end ) &&
-			pull16(ppReadPackedMsg, &phy->pucch_tx_diversity, end) &&
-			pull16(ppReadPackedMsg, &phy->ul_comp_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->transmission_mode_5_supported, end));
+  return result;
 }
 
-static uint8_t unpack_pnf_phy_rel11_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel11_t* value = (nfapi_pnf_phy_rel11_t*)tlv;
-
-	return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-			 unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel11_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel11_info));
 
-}
+// helper function for message length calculation -
+// takes the pointers to the start of message to end of message
 
-static uint8_t unpack_phy_phy_rel12_info(void* elem, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel12_info_t* phy = (nfapi_pnf_phy_rel12_info_t*)elem;
+static uint32_t get_packed_msg_len(uintptr_t msgHead, uintptr_t msgEnd) {
+  if (msgEnd < msgHead) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "get_packed_msg_len: Error in pointers supplied %d, %d\n", msgHead, msgEnd);
+    return 0;
+  }
 
-	return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-			pull16(ppReadPackedMsg, &phy->csi_subframe_set, end) &&
-			pull16(ppReadPackedMsg, &phy->enhanced_4tx_codebook, end) &&
-			pull16(ppReadPackedMsg, &phy->drs_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->ul_64qam_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->transmission_mode_10_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->alternative_bts_indices, end));
+  return (msgEnd - msgHead);
 }
 
-static uint8_t unpack_pnf_phy_rel12_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel12_t* value = (nfapi_pnf_phy_rel12_t*)tlv;
+// Main pack function - public
+int nfapi_nr_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf;
+  uint8_t *pWritePackedMessage = pPackedBuf;
+  uint8_t *pPackMessageEnd = pPackedBuf + packedBufLen;
+  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
+  uint32_t packedMsgLen;
+  uint16_t packedMsgLen16;
+
+  if (pMessageBuf == NULL || pPackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Pack supplied pointers are null\n");
+    return -1;
+  }
+
+  // pack the message
+  if(push16(pMessageHeader->phy_id, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(pMessageHeader->message_id, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(0, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(pMessageHeader->spare, &pWritePackedMessage, pPackMessageEnd) &&
+      pack_nr_p5_message_body(pMessageHeader, &pWritePackedMessage, pPackMessageEnd, config)) {
+    // check for a valid message length
+    packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage);
+
+    if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
+      return -1;
+    } else {
+      packedMsgLen16 = (uint16_t)packedMsgLen;
+    }
 
-	return (pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-			unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel12_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_phy_phy_rel12_info));
+    // Update the message length in the header
+    if(!push16(packedMsgLen16, &pPackedLengthField, pPackMessageEnd))
+      return -1;
+
+    // return the packed length
+    return (packedMsgLen);
+  } else {
+    // Failed to pack the meassage
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Failed to pack message\n");
+    return -1;
+  }
+}
+
+int nfapi_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf;
+  uint8_t *pWritePackedMessage = pPackedBuf;
+  uint8_t *pPackMessageEnd = pPackedBuf + packedBufLen;
+  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
+  uint32_t packedMsgLen;
+  uint16_t packedMsgLen16;
+
+  if (pMessageBuf == NULL || pPackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Pack supplied pointers are null\n");
+    return -1;
+  }
+
+  // pack the message
+  if(push16(pMessageHeader->phy_id, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(pMessageHeader->message_id, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(pMessageHeader->spare, &pWritePackedMessage, pPackMessageEnd) &&
+      pack_p5_message_body(pMessageHeader, &pWritePackedMessage, pPackMessageEnd, config)) {
+    // check for a valid message length
+    packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage);
+
+    if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
+      return -1;
+    } else {
+      packedMsgLen16 = (uint16_t)packedMsgLen;
+    }
 
-}
+    // Update the message length in the header
+    if(!push16(packedMsgLen16, &pPackedLengthField, pPackMessageEnd))
+      return -1;
 
-static uint8_t unpack_pnf_phy_rel13_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel13_info_t* phy = (nfapi_pnf_phy_rel13_info_t*)elem;
-
-	return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-			pull16(ppReadPackedMsg, &phy->pucch_format4_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->pucch_format5_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->more_than_5_ca_support, end) &&
-			pull16(ppReadPackedMsg, &phy->laa_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->laa_ending_in_dwpts_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->laa_starting_in_second_slot_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->beamforming_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->csi_rs_enhancement_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->drms_enhancement_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->srs_enhancement_supported, end));
-}
-
-static uint8_t unpack_pnf_phy_rel13_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel13_t* value = (nfapi_pnf_phy_rel13_t*)tlv;
-	
-	return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-			 unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel13_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel13_info));
+    // return the packed length
+    return (packedMsgLen);
+  } else {
+    // Failed to pack the meassage
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Failed to pack message\n");
+    return -1;
+  }
 }
 
-static uint8_t unpack_pnf_phy_rel13_nb_info_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel13_nb_iot_info_t* phy = (nfapi_pnf_phy_rel13_nb_iot_info_t*)elem;
 
-	return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-			pull16(ppReadPackedMsg, &phy->number_of_rfs, end) &&
-			unpackarray(ppReadPackedMsg, phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, end, &unpack_rf_config_info) &&
-			pull16(ppReadPackedMsg, &phy->number_of_rf_exclusions, end) &&
-			unpackarray(ppReadPackedMsg, phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, end, &unpack_rf_config_info) &&
-			pull8(ppReadPackedMsg, &phy->number_of_dl_layers_supported, end) &&
-			pull8(ppReadPackedMsg, &phy->number_of_ul_layers_supported, end) &&
-			pull16(ppReadPackedMsg, &phy->maximum_3gpp_release_supported, end) &&
-			pull8(ppReadPackedMsg, &phy->nmm_modes_supported, end));
-}
 
-static uint8_t unpack_pnf_phy_rel13_nb_iot_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rel13_nb_iot_t* value = (nfapi_pnf_phy_rel13_nb_iot_t*)tlv;
-	
-	return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-			 unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel13_nb_iot_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel13_nb_info_info));
-}
+// Unpack routines
 
-static uint8_t unpack_nr_pnf_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t*)msg;
-	
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, &unpack_pnf_param_general_value},
-		{ NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, &unpack_pnf_phy_value},
-	};
 
-	return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+static uint8_t  unpack_nr_pnf_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_param_request_t *pNfapiMsg = (nfapi_nr_pnf_param_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t  unpack_pnf_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_param_request_t *pNfapiMsg = (nfapi_pnf_param_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_pnf_param_general_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_param_general_t *value = (nfapi_pnf_param_general_t *)tlv;
+  return( pull8(ppReadPackedMsg, &value->nfapi_sync_mode, end) &&
+          pull8(ppReadPackedMsg, &value->location_mode, end) &&
+          pull16(ppReadPackedMsg, &value->location_coordinates_length, end) &&
+          pullarray8(ppReadPackedMsg, value->location_coordinates, NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH, value->location_coordinates_length, end) &&
+          pull32(ppReadPackedMsg, &value->dl_config_timing, end) &&
+          pull32(ppReadPackedMsg, &value->tx_timing, end) &&
+          pull32(ppReadPackedMsg, &value->ul_config_timing, end) &&
+          pull32(ppReadPackedMsg, &value->hi_dci0_timing, end) &&
+          pull16(ppReadPackedMsg, &value->maximum_number_phys, end) &&
+          pull16(ppReadPackedMsg, &value->maximum_total_bandwidth, end) &&
+          pull8(ppReadPackedMsg, &value->maximum_total_number_dl_layers, end) &&
+          pull8(ppReadPackedMsg, &value->maximum_total_number_ul_layers, end) &&
+          pull8(ppReadPackedMsg, &value->shared_bands, end) &&
+          pull8(ppReadPackedMsg, &value->shared_pa, end) &&
+          pulls16(ppReadPackedMsg, &value->maximum_total_power, end) &&
+          pullarray8(ppReadPackedMsg, value->oui, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, end));
+}
+
+static uint8_t unpack_rf_config_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rf_config_info_t *info = (nfapi_rf_config_info_t *)elem;
+  return pull16(ppReadPackedMsg, &info->rf_config_index, end);
+}
+
+static uint8_t unpack_pnf_phy_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_info_t *phy = (nfapi_pnf_phy_info_t *)elem;
+  return ( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+           pull16(ppReadPackedMsg, &phy->number_of_rfs, end) &&
+           unpackarray(ppReadPackedMsg, phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, end, &unpack_rf_config_info) &&
+           pull16(ppReadPackedMsg, &phy->number_of_rf_exclusions, end) &&
+           unpackarray(ppReadPackedMsg, phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, end, &unpack_rf_config_info) &&
+           pull16(ppReadPackedMsg, &phy->downlink_channel_bandwidth_supported, end) &&
+           pull16(ppReadPackedMsg, &phy->uplink_channel_bandwidth_supported, end) &&
+           pull8(ppReadPackedMsg, &phy->number_of_dl_layers_supported, end) &&
+           pull8(ppReadPackedMsg, &phy->number_of_ul_layers_supported, end) &&
+           pull16(ppReadPackedMsg, &phy->maximum_3gpp_release_supported, end) &&
+           pull8(ppReadPackedMsg, &phy->nmm_modes_supported, end));
+}
+
+
+static uint8_t unpack_pnf_phy_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_t *value = (nfapi_pnf_phy_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_info));
+}
+
+static uint8_t unpack_pnf_rf_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_rf_info_t *rf = (nfapi_pnf_rf_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &rf->rf_config_index, end) &&
+          pull16(ppReadPackedMsg, &rf->band, end) &&
+          pulls16(ppReadPackedMsg, &rf->maximum_transmit_power, end) &&
+          pulls16(ppReadPackedMsg, &rf->minimum_transmit_power, end) &&
+          pull8(ppReadPackedMsg, &rf->number_of_antennas_suppported, end) &&
+          pull32(ppReadPackedMsg, &rf->minimum_downlink_frequency, end) &&
+          pull32(ppReadPackedMsg, &rf->maximum_downlink_frequency, end) &&
+          pull32(ppReadPackedMsg, &rf->minimum_uplink_frequency, end) &&
+          pull32(ppReadPackedMsg, &rf->maximum_uplink_frequency, end));
+}
+static uint8_t unpack_pnf_rf_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_rf_t *value = (nfapi_pnf_rf_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_rfs, end) &&
+           unpackarray(ppReadPackedMsg, value->rf, sizeof(nfapi_pnf_rf_info_t), NFAPI_MAX_PNF_RF, value->number_of_rfs, end, &unpack_pnf_rf_info));
+}
+
+static uint8_t unpack_pnf_phy_rel10_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel10_info_t *phy = (nfapi_pnf_phy_rel10_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &phy->transmission_mode_7_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->transmission_mode_8_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->two_antenna_ports_for_pucch, end) &&
+          pull16(ppReadPackedMsg, &phy->transmission_mode_9_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->simultaneous_pucch_pusch, end) &&
+          pull16(ppReadPackedMsg, &phy->four_layer_tx_with_tm3_and_tm4, end));
+}
+static uint8_t unpack_pnf_phy_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel10_t *value = (nfapi_pnf_phy_rel10_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel10_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel10_info));
+}
+
+
+static uint8_t unpack_pnf_phy_rel11_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel11_info_t *phy = (nfapi_pnf_phy_rel11_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &phy->edpcch_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->multi_ack_csi_reporting, end ) &&
+          pull16(ppReadPackedMsg, &phy->pucch_tx_diversity, end) &&
+          pull16(ppReadPackedMsg, &phy->ul_comp_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->transmission_mode_5_supported, end));
+}
+
+static uint8_t unpack_pnf_phy_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel11_t *value = (nfapi_pnf_phy_rel11_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel11_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel11_info));
+}
+
+static uint8_t unpack_phy_phy_rel12_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel12_info_t *phy = (nfapi_pnf_phy_rel12_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &phy->csi_subframe_set, end) &&
+          pull16(ppReadPackedMsg, &phy->enhanced_4tx_codebook, end) &&
+          pull16(ppReadPackedMsg, &phy->drs_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->ul_64qam_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->transmission_mode_10_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->alternative_bts_indices, end));
+}
+
+static uint8_t unpack_pnf_phy_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel12_t *value = (nfapi_pnf_phy_rel12_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+          unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel12_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_phy_phy_rel12_info));
+}
+
+static uint8_t unpack_pnf_phy_rel13_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_info_t *phy = (nfapi_pnf_phy_rel13_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &phy->pucch_format4_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->pucch_format5_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->more_than_5_ca_support, end) &&
+          pull16(ppReadPackedMsg, &phy->laa_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->laa_ending_in_dwpts_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->laa_starting_in_second_slot_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->beamforming_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->csi_rs_enhancement_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->drms_enhancement_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->srs_enhancement_supported, end));
 }
 
-
-
-static uint8_t unpack_pnf_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_param_response_t *pNfapiMsg = (nfapi_pnf_param_response_t*)msg;
-	
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, &unpack_pnf_param_general_value},
-		{ NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, &unpack_pnf_phy_value},
-		{ NFAPI_PNF_RF_TAG, &pNfapiMsg->pnf_rf, &unpack_pnf_rf_value},
-		{ NFAPI_PNF_PHY_REL10_TAG, &pNfapiMsg->pnf_phy_rel10, &unpack_pnf_phy_rel10_value},
-		{ NFAPI_PNF_PHY_REL11_TAG, &pNfapiMsg->pnf_phy_rel11, &unpack_pnf_phy_rel11_value},
-		{ NFAPI_PNF_PHY_REL12_TAG, &pNfapiMsg->pnf_phy_rel12, &unpack_pnf_phy_rel12_value},
-		{ NFAPI_PNF_PHY_REL13_TAG, &pNfapiMsg->pnf_phy_rel13, &unpack_pnf_phy_rel13_value},
-		{ NFAPI_PNF_PHY_REL13_NB_IOT_TAG, &pNfapiMsg->pnf_phy_rel13_nb_iot, &unpack_pnf_phy_rel13_nb_iot_value},
-	
-	};
-
-	return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+static uint8_t unpack_pnf_phy_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_t *value = (nfapi_pnf_phy_rel13_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel13_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel13_info));
 }
 
-
-static uint8_t unpack_phy_rf_config_info(void* elem, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_phy_rf_config_info_t* rf = (nfapi_phy_rf_config_info_t*)elem;
-		
-	return( pull16(ppReadPackedMsg, &rf->phy_id, end) &&
-			pull16(ppReadPackedMsg, &rf->phy_config_index, end) &&
-			pull16(ppReadPackedMsg, &rf->rf_config_index, end));
-
+static uint8_t unpack_pnf_phy_rel13_nb_info_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_nb_iot_info_t *phy = (nfapi_pnf_phy_rel13_nb_iot_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &phy->number_of_rfs, end) &&
+          unpackarray(ppReadPackedMsg, phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, end, &unpack_rf_config_info) &&
+          pull16(ppReadPackedMsg, &phy->number_of_rf_exclusions, end) &&
+          unpackarray(ppReadPackedMsg, phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, end, &unpack_rf_config_info) &&
+          pull8(ppReadPackedMsg, &phy->number_of_dl_layers_supported, end) &&
+          pull8(ppReadPackedMsg, &phy->number_of_ul_layers_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->maximum_3gpp_release_supported, end) &&
+          pull8(ppReadPackedMsg, &phy->nmm_modes_supported, end));
 }
 
-static uint8_t unpack_pnf_phy_rf_config_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_pnf_phy_rf_config_t* value = (nfapi_pnf_phy_rf_config_t*)tlv;
-
-	return ( pull16(ppReadPackedMsg, &value->number_phy_rf_config_info, end) &&
-			 unpackarray(ppReadPackedMsg, value->phy_rf_config, sizeof(nfapi_phy_rf_config_info_t), NFAPI_MAX_PHY_RF_INSTANCES, value->number_phy_rf_config_info, end, &unpack_phy_rf_config_info));
+static uint8_t unpack_pnf_phy_rel13_nb_iot_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_nb_iot_t *value = (nfapi_pnf_phy_rel13_nb_iot_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel13_nb_iot_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel13_nb_info_info));
 }
 
-static uint8_t unpack_nr_pnf_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_pnf_config_request_t *pNfapiMsg = (nfapi_nr_pnf_config_request_t*)msg;
-	
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, &unpack_pnf_phy_rf_config_value},
-	};
-
-	return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension);
+static uint8_t unpack_nr_pnf_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, &unpack_pnf_param_general_value},
+    { NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, &unpack_pnf_phy_value},
+  };
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
 }
 
 
 
-static uint8_t unpack_pnf_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_config_request_t *pNfapiMsg = (nfapi_pnf_config_request_t*)msg;
-	
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, &unpack_pnf_phy_rf_config_value},
-	};
+static uint8_t unpack_pnf_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_param_response_t *pNfapiMsg = (nfapi_pnf_param_response_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, &unpack_pnf_param_general_value},
+    { NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, &unpack_pnf_phy_value},
+    { NFAPI_PNF_RF_TAG, &pNfapiMsg->pnf_rf, &unpack_pnf_rf_value},
+    { NFAPI_PNF_PHY_REL10_TAG, &pNfapiMsg->pnf_phy_rel10, &unpack_pnf_phy_rel10_value},
+    { NFAPI_PNF_PHY_REL11_TAG, &pNfapiMsg->pnf_phy_rel11, &unpack_pnf_phy_rel11_value},
+    { NFAPI_PNF_PHY_REL12_TAG, &pNfapiMsg->pnf_phy_rel12, &unpack_pnf_phy_rel12_value},
+    { NFAPI_PNF_PHY_REL13_TAG, &pNfapiMsg->pnf_phy_rel13, &unpack_pnf_phy_rel13_value},
+    { NFAPI_PNF_PHY_REL13_NB_IOT_TAG, &pNfapiMsg->pnf_phy_rel13_nb_iot, &unpack_pnf_phy_rel13_nb_iot_value},
 
-	return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension);
+  };
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
 }
 
 
-static uint8_t unpack_nr_pnf_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_pnf_config_response_t *pNfapiMsg = (nfapi_nr_pnf_config_response_t*)msg;
-	
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
-
-	return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-
+static uint8_t unpack_phy_rf_config_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_phy_rf_config_info_t *rf = (nfapi_phy_rf_config_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &rf->phy_id, end) &&
+          pull16(ppReadPackedMsg, &rf->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &rf->rf_config_index, end));
 }
 
-static uint8_t unpack_pnf_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_config_response_t *pNfapiMsg = (nfapi_pnf_config_response_t*)msg;
-	
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
-
-	return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-
+static uint8_t unpack_pnf_phy_rf_config_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rf_config_t *value = (nfapi_pnf_phy_rf_config_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_phy_rf_config_info, end) &&
+           unpackarray(ppReadPackedMsg, value->phy_rf_config, sizeof(nfapi_phy_rf_config_info_t), NFAPI_MAX_PHY_RF_INSTANCES, value->number_phy_rf_config_info, end, &unpack_phy_rf_config_info));
 }
 
-static uint8_t unpack_nr_pnf_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_pnf_start_request_t *pNfapiMsg = (nfapi_nr_pnf_start_request_t*)msg;
-	
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
-
-	return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+static uint8_t unpack_nr_pnf_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_config_request_t *pNfapiMsg = (nfapi_nr_pnf_config_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, &unpack_pnf_phy_rf_config_value},
+  };
+  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension);
 }
 
 
-static uint8_t unpack_pnf_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_start_request_t *pNfapiMsg = (nfapi_pnf_start_request_t*)msg;
-	
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
 
-	return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+static uint8_t unpack_pnf_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_config_request_t *pNfapiMsg = (nfapi_pnf_config_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, &unpack_pnf_phy_rf_config_value},
+  };
+  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension);
 }
 
 
-static uint8_t unpack_pnf_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_start_response_t *pNfapiMsg = (nfapi_pnf_start_response_t*)msg;
-
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
-
-	return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end ) &&
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+static uint8_t unpack_nr_pnf_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_config_response_t *pNfapiMsg = (nfapi_nr_pnf_config_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
 }
 
-static uint8_t unpack_nr_pnf_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_pnf_start_response_t *pNfapiMsg = (nfapi_nr_pnf_start_response_t*)msg;
-
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
-
-	return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end ) &&
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+static uint8_t unpack_pnf_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_config_response_t *pNfapiMsg = (nfapi_pnf_config_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
 }
 
-
-static uint8_t unpack_pnf_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_stop_request_t *pNfapiMsg = (nfapi_pnf_stop_request_t*)msg;
-
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
-
-	return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+static uint8_t unpack_nr_pnf_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_start_request_t *pNfapiMsg = (nfapi_nr_pnf_start_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
 }
 
-static uint8_t unpack_pnf_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_pnf_stop_response_t *pNfapiMsg = (nfapi_pnf_stop_response_t*)msg;
-
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
-
-	return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
 
+static uint8_t unpack_pnf_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_start_request_t *pNfapiMsg = (nfapi_pnf_start_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
 }
 
-static uint8_t unpack_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_param_request_t *pNfapiMsg = (nfapi_param_request_t*)msg;
 
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
-
-	return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+static uint8_t unpack_pnf_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_start_response_t *pNfapiMsg = (nfapi_pnf_start_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end ) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
 }
 
-static uint8_t unpack_nr_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_param_request_scf_t *pNfapiMsg = (nfapi_nr_param_request_scf_t*)msg;
-
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
-
-	return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+static uint8_t unpack_nr_pnf_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_start_response_t *pNfapiMsg = (nfapi_nr_pnf_start_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end ) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
 }
 
-static uint8_t unpack_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_param_response_t *pNfapiMsg = (nfapi_param_response_t*)msg;
-
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_L1_STATUS_PHY_STATE_TAG, &pNfapiMsg->l1_status.phy_state, &unpack_uint16_tlv_value},
-
-		{ NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.dl_bandwidth_support, &unpack_uint16_tlv_value},
-		{ NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.ul_bandwidth_support, &unpack_uint16_tlv_value},
-		{ NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.dl_modulation_support, &unpack_uint16_tlv_value},
-		{ NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.ul_modulation_support, &unpack_uint16_tlv_value},
-		{ NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.phy_antenna_capability, &unpack_uint16_tlv_value},
-		{ NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.release_capability, &unpack_uint16_tlv_value},
-		{ NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.mbsfn_capability, &unpack_uint16_tlv_value},
-
-		{ NFAPI_LAA_CAPABILITY_LAA_SUPPORT_TAG, &pNfapiMsg->laa_capability.laa_support, &unpack_uint16_tlv_value},
-		{ NFAPI_LAA_CAPABILITY_PD_SENSING_LBT_SUPPORT_TAG, &pNfapiMsg->laa_capability.pd_sensing_lbt_support, &unpack_uint16_tlv_value},
-		{ NFAPI_LAA_CAPABILITY_MULTI_CARRIER_LBT_SUPPORT_TAG, &pNfapiMsg->laa_capability.multi_carrier_lbt_support, &unpack_uint16_tlv_value},
-		{ NFAPI_LAA_CAPABILITY_PARTIAL_SF_SUPPORT_TAG, &pNfapiMsg->laa_capability.partial_sf_support, &unpack_uint16_tlv_value},
-
-		{ NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &pNfapiMsg->subframe_config.duplex_mode, &unpack_uint16_tlv_value},
-		{ NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &pNfapiMsg->subframe_config.pcfich_power_offset, &unpack_uint16_tlv_value},
-		{ NFAPI_SUBFRAME_CONFIG_PB_TAG, &pNfapiMsg->subframe_config.pb, &unpack_uint16_tlv_value},
-		{ NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.dl_cyclic_prefix_type, &unpack_uint16_tlv_value},
-		{ NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.ul_cyclic_prefix_type, &unpack_uint16_tlv_value},
-
-		{ NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.dl_channel_bandwidth, &unpack_uint16_tlv_value},
-		{ NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.ul_channel_bandwidth, &unpack_uint16_tlv_value},
-		{ NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &pNfapiMsg->rf_config.reference_signal_power, &unpack_uint16_tlv_value},
-		{ NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.tx_antenna_ports, &unpack_uint16_tlv_value},
-		{ NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.rx_antenna_ports, &unpack_uint16_tlv_value},
-
-		{ NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &pNfapiMsg->phich_config.phich_resource, &unpack_uint16_tlv_value},
-		{ NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &pNfapiMsg->phich_config.phich_duration, &unpack_uint16_tlv_value},
-		{ NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &pNfapiMsg->phich_config.phich_power_offset, &unpack_uint16_tlv_value},
-
-		{ NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
-		{ NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
-		{ NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &pNfapiMsg->sch_config.physical_cell_id, &unpack_uint16_tlv_value},
-
-		{ NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &pNfapiMsg->prach_config.configuration_index, &unpack_uint16_tlv_value},
-		{ NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->prach_config.root_sequence_index, &unpack_uint16_tlv_value},
-		{ NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->prach_config.zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
-		{ NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &pNfapiMsg->prach_config.high_speed_flag, &unpack_uint16_tlv_value},
-		{ NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &pNfapiMsg->prach_config.frequency_offset, &unpack_uint16_tlv_value},
-
-		{ NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &pNfapiMsg->pusch_config.hopping_mode, &unpack_uint16_tlv_value},
-		{ NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &pNfapiMsg->pusch_config.hopping_offset, &unpack_uint16_tlv_value},
-		{ NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &pNfapiMsg->pusch_config.number_of_subbands, &unpack_uint16_tlv_value},
-
-		{ NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &pNfapiMsg->pucch_config.delta_pucch_shift, &unpack_uint16_tlv_value},
-		{ NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &pNfapiMsg->pucch_config.n_cqi_rb, &unpack_uint16_tlv_value},
-		{ NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &pNfapiMsg->pucch_config.n_an_cs, &unpack_uint16_tlv_value},
-		{ NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &pNfapiMsg->pucch_config.n1_pucch_an, &unpack_uint16_tlv_value},
-
-		{ NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &pNfapiMsg->srs_config.bandwidth_configuration, &unpack_uint16_tlv_value},
-		{ NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &pNfapiMsg->srs_config.max_up_pts, &unpack_uint16_tlv_value},
-		{ NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &pNfapiMsg->srs_config.srs_subframe_configuration, &unpack_uint16_tlv_value},
-		{ NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission, &unpack_uint16_tlv_value},
-
-		{ NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping, &unpack_uint16_tlv_value},
-		{ NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &pNfapiMsg->uplink_reference_signal_config.group_assignment, &unpack_uint16_tlv_value},
-		{ NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms, &unpack_uint16_tlv_value},
-
-		{ NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &pNfapiMsg->tdd_frame_structure_config.subframe_assignment, &unpack_uint16_tlv_value},
-		{ NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns, &unpack_uint16_tlv_value},
-
-		{ NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &pNfapiMsg->l23_config.data_report_mode, &unpack_uint16_tlv_value},
-		{ NFAPI_L23_CONFIG_SFNSF_TAG, &pNfapiMsg->l23_config.sfnsf, &unpack_uint16_tlv_value},
-
-		{ NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
-		{ NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
-		{ NFAPI_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
-		{ NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
-		{ NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
-		{ NFAPI_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
-		{ NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.dl_ue_per_sf, &unpack_uint8_tlv_value},
-		{ NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.ul_ue_per_sf, &unpack_uint8_tlv_value},
-		{ NFAPI_NFAPI_RF_BANDS_TAG, &pNfapiMsg->nfapi_config.rf_bands, &unpack_rf_bands_value},
-		{ NFAPI_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
-		{ NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
-		{ NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
-		{ NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &pNfapiMsg->nfapi_config.max_transmit_power, &unpack_uint16_tlv_value},
-		{ NFAPI_NFAPI_EARFCN_TAG, &pNfapiMsg->nfapi_config.earfcn, &unpack_uint16_tlv_value},
-		{ NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands, &unpack_nmm_frequency_bands_value},
-		{ NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_umts_frequency_bands, &unpack_nmm_frequency_bands_value},
-		{ NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_lte_frequency_bands, &unpack_nmm_frequency_bands_value},
-		{ NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported, &unpack_uint8_tlv_value},
-
-	};
-
-	return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			 pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
 
+static uint8_t unpack_pnf_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_stop_request_t *pNfapiMsg = (nfapi_pnf_stop_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
 }
 
-static uint8_t unpack_nr_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_param_response_scf_t *pNfapiMsg = (nfapi_nr_param_response_scf_t*)msg;
-
-	unpack_tlv_t unpack_fns[] =
-	{   
-		{ NFAPI_NR_PARAM_TLV_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->cell_param.release_capability), &unpack_uint16_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PHY_STATE_TAG, &(pNfapiMsg->cell_param.phy_state),&unpack_uint16_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_SKIP_BLANK_DL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_dl_config), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_SKIP_BLANK_UL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_ul_config), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_NUM_CONFIG_TLVS_TO_REPORT_TAG, &(pNfapiMsg->cell_param.num_config_tlvs_to_report ), &unpack_uint16_tlv_value},
-		
-		{ NFAPI_NR_PARAM_TLV_CYCLIC_PREFIX_TAG, &(pNfapiMsg->carrier_param.cyclic_prefix), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_DL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_dl), &unpack_uint16_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_DL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_dl), &unpack_uint16_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_UL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_ul), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_UL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_ul), &unpack_uint16_tlv_value},
-
-
-		{ NFAPI_NR_PARAM_TLV_CCE_MAPPING_TYPE_TAG, &(pNfapiMsg->pdcch_param.cce_mapping_type), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG, &(pNfapiMsg->pdcch_param.coreset_outside_first_3_of_ofdm_syms_of_slot), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PRECODER_GRANULARITY_CORESET_TAG, &(pNfapiMsg->pdcch_param.coreset_precoder_granularity_coreset), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PDCCH_MU_MIMO_TAG, &(pNfapiMsg->pdcch_param.pdcch_mu_mimo), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PDCCH_PRECODER_CYCLING_TAG, &(pNfapiMsg->pdcch_param.pdcch_precoder_cycling), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_MAX_PDCCHS_PER_SLOT_TAG, &(pNfapiMsg->pdcch_param.max_pdcch_per_slot), &unpack_uint8_tlv_value},
-		
-		{ NFAPI_NR_PARAM_TLV_PUCCH_FORMATS_TAG, &(pNfapiMsg->pucch_param.pucch_formats), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_MAX_PUCCHS_PER_SLOT_TAG, &(pNfapiMsg->pucch_param.max_pucchs_per_slot), &unpack_uint8_tlv_value},
-		
-		{ NFAPI_NR_PARAM_TLV_PDSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pdsch_param.pdsch_mapping_type), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PDSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_allocation_types), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PDSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pdsch_param.pdsch_vrb_to_prb_mapping), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PDSCH_CBG_TAG, &(pNfapiMsg->pdsch_param.pdsch_cbg), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PDSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_config_types), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PDSCH_DMRS_MAX_LENGTH_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_max_length), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PDSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_additional_pos), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_MAX_PDSCH_S_YBS_PER_SLOT_TAG, &(pNfapiMsg->pdsch_param.max_pdsch_tbs_per_slot), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG, &(pNfapiMsg->pdsch_param.max_number_mimo_layers_pdsch), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_DL_TAG, &(pNfapiMsg->pdsch_param.max_mu_mimo_users_dl), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG, &(pNfapiMsg->pdsch_param.pdsch_data_in_dmrs_symbols), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PREMPTION_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.premption_support), &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PDSCH_NON_SLOT_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.pdsch_non_slot_support), &unpack_uint8_tlv_value},
-
-		{ NFAPI_NR_PARAM_TLV_UCI_MUX_ULSCH_IN_PUSCH_TAG,  &(pNfapiMsg->pusch_param.uci_mux_ulsch_in_pusch),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_UCI_ONLY_PUSCH_TAG,  &(pNfapiMsg->pusch_param.uci_only_pusch),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PUSCH_FREQUENCY_HOPPING_TAG,  &(pNfapiMsg->pusch_param.pusch_frequency_hopping),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PUSCH_DMRS_CONFIG_TYPES_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_config_types),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PUSCH_DMRS_MAX_LEN_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_max_len),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PUSCH_DMRS_ADDITIONAL_POS_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_additional_pos),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PUSCH_CBG_TAG,  &(pNfapiMsg->pusch_param.pusch_cbg),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PUSCH_MAPPING_TYPE_TAG,  &(pNfapiMsg->pusch_param.pusch_mapping_type),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PUSCH_ALLOCATION_TYPES_TAG,  &(pNfapiMsg->pusch_param.pusch_allocation_types),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PUSCH_VRB_TO_PRB_MAPPING_TAG,  &(pNfapiMsg->pusch_param.pusch_vrb_to_prb_mapping),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PUSCH_MAX_PTRS_PORTS_TAG,  &(pNfapiMsg->pusch_param.pusch_max_ptrs_ports),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_MAX_PDUSCHS_TBS_PER_SLOT_TAG,  &(pNfapiMsg->pusch_param.max_pduschs_tbs_per_slot),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG,  &(pNfapiMsg->pusch_param.max_number_mimo_layers_non_cb_pusch),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_SUPPORTED_MODULATION_ORDER_UL_TAG,  &(pNfapiMsg->pusch_param.supported_modulation_order_ul),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_UL_TAG,  &(pNfapiMsg->pusch_param.max_mu_mimo_users_ul),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_DFTS_OFDM_SUPPORT_TAG,  &(pNfapiMsg->pusch_param.dfts_ofdm_support),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PUSCH_AGGREGATION_FACTOR_TAG,  &(pNfapiMsg->pusch_param.pusch_aggregation_factor),  &unpack_uint8_tlv_value},
-		
-		{ NFAPI_NR_PARAM_TLV_PRACH_LONG_FORMATS_TAG,  &(pNfapiMsg->prach_param.prach_long_formats),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PRACH_SHORT_FORMATS_TAG,  &(pNfapiMsg->prach_param.prach_short_formats),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_PRACH_RESTRICTED_SETS_TAG,  &(pNfapiMsg->prach_param.prach_restricted_sets),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_PARAM_TLV_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG,  &(pNfapiMsg->prach_param.max_prach_fd_occasions_in_a_slot),  &unpack_uint8_tlv_value},
-		
-		{ NFAPI_NR_PARAM_TLV_RSSI_MEASUREMENT_SUPPORT_TAG,  &(pNfapiMsg->measurement_param.rssi_measurement_support),  &unpack_uint8_tlv_value},
-		//config
-		{ NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
-		{ NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
-		{ NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
-		{ NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
-		{ NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
-		{ NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
-		{ NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
-		{ NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
-		{ NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
-	};
-	// print ppReadPackedMsg
-	uint8_t *ptr = *ppReadPackedMsg;
-	printf("\n Read message unpack_param_response: ");
-	while(ptr < end){
-		printf(" %d ", *ptr);
-		ptr++;
-	}
-	printf("\n");
-
+static uint8_t unpack_pnf_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_stop_response_t *pNfapiMsg = (nfapi_pnf_stop_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
 
-	return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			 pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+static uint8_t unpack_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_param_request_t *pNfapiMsg = (nfapi_param_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
 
+static uint8_t unpack_nr_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_param_request_scf_t *pNfapiMsg = (nfapi_nr_param_request_scf_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
 }
 
-static uint8_t unpack_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_config_request_t *pNfapiMsg = (nfapi_config_request_t*)msg;
+static uint8_t unpack_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_param_response_t *pNfapiMsg = (nfapi_param_response_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_L1_STATUS_PHY_STATE_TAG, &pNfapiMsg->l1_status.phy_state, &unpack_uint16_tlv_value},
 
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &pNfapiMsg->subframe_config.duplex_mode, &unpack_uint16_tlv_value},
-		{ NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &pNfapiMsg->subframe_config.pcfich_power_offset, &unpack_uint16_tlv_value},
-		{ NFAPI_SUBFRAME_CONFIG_PB_TAG, &pNfapiMsg->subframe_config.pb, &unpack_uint16_tlv_value},
-		{ NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.dl_cyclic_prefix_type, &unpack_uint16_tlv_value},
-		{ NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.ul_cyclic_prefix_type, &unpack_uint16_tlv_value},
-
-		{ NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.dl_channel_bandwidth, &unpack_uint16_tlv_value},
-		{ NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.ul_channel_bandwidth, &unpack_uint16_tlv_value},
-		{ NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &pNfapiMsg->rf_config.reference_signal_power, &unpack_uint16_tlv_value},
-		{ NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.tx_antenna_ports, &unpack_uint16_tlv_value},
-		{ NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.rx_antenna_ports, &unpack_uint16_tlv_value},
-
-		{ NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &pNfapiMsg->phich_config.phich_resource, &unpack_uint16_tlv_value},
-		{ NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &pNfapiMsg->phich_config.phich_duration, &unpack_uint16_tlv_value},
-		{ NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &pNfapiMsg->phich_config.phich_power_offset, &unpack_uint16_tlv_value},
-
-		{ NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
-		{ NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
-		{ NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &pNfapiMsg->sch_config.physical_cell_id, &unpack_uint16_tlv_value},
-
-		{ NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &pNfapiMsg->prach_config.configuration_index, &unpack_uint16_tlv_value},
-		{ NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->prach_config.root_sequence_index, &unpack_uint16_tlv_value},
-		{ NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->prach_config.zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
-		{ NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &pNfapiMsg->prach_config.high_speed_flag, &unpack_uint16_tlv_value},
-		{ NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &pNfapiMsg->prach_config.frequency_offset, &unpack_uint16_tlv_value},
-
-		{ NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &pNfapiMsg->pusch_config.hopping_mode, &unpack_uint16_tlv_value},
-		{ NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &pNfapiMsg->pusch_config.hopping_offset, &unpack_uint16_tlv_value},
-		{ NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &pNfapiMsg->pusch_config.number_of_subbands, &unpack_uint16_tlv_value},
-
-		{ NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &pNfapiMsg->pucch_config.delta_pucch_shift, &unpack_uint16_tlv_value},
-		{ NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &pNfapiMsg->pucch_config.n_cqi_rb, &unpack_uint16_tlv_value},
-		{ NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &pNfapiMsg->pucch_config.n_an_cs, &unpack_uint16_tlv_value},
-		{ NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &pNfapiMsg->pucch_config.n1_pucch_an, &unpack_uint16_tlv_value},
-
-		{ NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &pNfapiMsg->srs_config.bandwidth_configuration, &unpack_uint16_tlv_value},
-		{ NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &pNfapiMsg->srs_config.max_up_pts, &unpack_uint16_tlv_value},
-		{ NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &pNfapiMsg->srs_config.srs_subframe_configuration, &unpack_uint16_tlv_value},
-		{ NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission, &unpack_uint16_tlv_value},
-
-		{ NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping, &unpack_uint16_tlv_value},
-		{ NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &pNfapiMsg->uplink_reference_signal_config.group_assignment, &unpack_uint16_tlv_value},
-		{ NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms, &unpack_uint16_tlv_value},
-
-
-		{ NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG, &pNfapiMsg->laa_config.ed_threshold_lbt_pdsch, &unpack_uint16_tlv_value},
-		{ NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG, &pNfapiMsg->laa_config.ed_threshold_lbt_drs, &unpack_uint16_tlv_value},
-		{ NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG, &pNfapiMsg->laa_config.pd_threshold, &unpack_uint16_tlv_value},
-		{ NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG, &pNfapiMsg->laa_config.multi_carrier_type, &unpack_uint16_tlv_value},
-		{ NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG, &pNfapiMsg->laa_config.multi_carrier_tx, &unpack_uint16_tlv_value},
-		{ NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG, &pNfapiMsg->laa_config.multi_carrier_freeze, &unpack_uint16_tlv_value},
-		{ NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG, &pNfapiMsg->laa_config.tx_antenna_ports_drs, &unpack_uint16_tlv_value},
-		{ NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG, &pNfapiMsg->laa_config.tx_power_drs, &unpack_uint16_tlv_value},
-
-		{ NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG, &pNfapiMsg->emtc_config.pbch_repetitions_enable_r13, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->emtc_config.prach_catm_root_sequence_index, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->emtc_config.prach_catm_zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG, &pNfapiMsg->emtc_config.prach_catm_high_speed_flag, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_enable, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_configuration_index, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_frequency_offset, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_starting_subframe_periodicity, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_hopping_enable, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_hopping_offset, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_enable, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_configuration_index, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_frequency_offset, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_starting_subframe_periodicity, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_hopping_enable, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_hopping_offset, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_enable, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_configuration_index, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_frequency_offset, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_starting_subframe_periodicity, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_hopping_enable, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_hopping_offset, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_enable, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_configuration_index, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_frequency_offset, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_starting_subframe_periodicity, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_hopping_enable, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_hopping_offset, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG, &pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodea, &unpack_uint16_tlv_value},
-		{ NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG, &pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodeb, &unpack_uint16_tlv_value},
-
-		{ NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &pNfapiMsg->tdd_frame_structure_config.subframe_assignment, &unpack_uint16_tlv_value},
-		{ NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns, &unpack_uint16_tlv_value},
-
-		{ NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &pNfapiMsg->l23_config.data_report_mode, &unpack_uint16_tlv_value},
-		{ NFAPI_L23_CONFIG_SFNSF_TAG, &pNfapiMsg->l23_config.sfnsf, &unpack_uint16_tlv_value},
-
-		{ NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
-		{ NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
-		{ NFAPI_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
-		{ NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
-		{ NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
-		{ NFAPI_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
-		{ NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.dl_ue_per_sf, &unpack_uint8_tlv_value},
-		{ NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.ul_ue_per_sf, &unpack_uint8_tlv_value},
-		{ NFAPI_NFAPI_RF_BANDS_TAG, &pNfapiMsg->nfapi_config.rf_bands, &unpack_rf_bands_value},
-		{ NFAPI_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
-		{ NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
-		{ NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
-		{ NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &pNfapiMsg->nfapi_config.max_transmit_power, &unpack_uint16_tlv_value},
-		{ NFAPI_NFAPI_EARFCN_TAG, &pNfapiMsg->nfapi_config.earfcn, &unpack_uint16_tlv_value},
-		{ NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands, &unpack_nmm_frequency_bands_value},
-		{ NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_umts_frequency_bands, &unpack_nmm_frequency_bands_value},
-		{ NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_lte_frequency_bands, &unpack_nmm_frequency_bands_value},
-		{ NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported, &unpack_uint8_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.dl_bandwidth_support, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.ul_bandwidth_support, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.dl_modulation_support, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.ul_modulation_support, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.phy_antenna_capability, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.release_capability, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.mbsfn_capability, &unpack_uint16_tlv_value},
 
-	};
+    { NFAPI_LAA_CAPABILITY_LAA_SUPPORT_TAG, &pNfapiMsg->laa_capability.laa_support, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CAPABILITY_PD_SENSING_LBT_SUPPORT_TAG, &pNfapiMsg->laa_capability.pd_sensing_lbt_support, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CAPABILITY_MULTI_CARRIER_LBT_SUPPORT_TAG, &pNfapiMsg->laa_capability.multi_carrier_lbt_support, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CAPABILITY_PARTIAL_SF_SUPPORT_TAG, &pNfapiMsg->laa_capability.partial_sf_support, &unpack_uint16_tlv_value},
 
-	return ( pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
-		     unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+    { NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &pNfapiMsg->subframe_config.duplex_mode, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &pNfapiMsg->subframe_config.pcfich_power_offset, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_PB_TAG, &pNfapiMsg->subframe_config.pb, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.dl_cyclic_prefix_type, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.ul_cyclic_prefix_type, &unpack_uint16_tlv_value},
+
+    { NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.dl_channel_bandwidth, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.ul_channel_bandwidth, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &pNfapiMsg->rf_config.reference_signal_power, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.tx_antenna_ports, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.rx_antenna_ports, &unpack_uint16_tlv_value},
 
+    { NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &pNfapiMsg->phich_config.phich_resource, &unpack_uint16_tlv_value},
+    { NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &pNfapiMsg->phich_config.phich_duration, &unpack_uint16_tlv_value},
+    { NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &pNfapiMsg->phich_config.phich_power_offset, &unpack_uint16_tlv_value},
+
+    { NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
+    { NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
+    { NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &pNfapiMsg->sch_config.physical_cell_id, &unpack_uint16_tlv_value},
+
+    { NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &pNfapiMsg->prach_config.configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->prach_config.root_sequence_index, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->prach_config.zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &pNfapiMsg->prach_config.high_speed_flag, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &pNfapiMsg->prach_config.frequency_offset, &unpack_uint16_tlv_value},
+
+    { NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &pNfapiMsg->pusch_config.hopping_mode, &unpack_uint16_tlv_value},
+    { NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &pNfapiMsg->pusch_config.hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &pNfapiMsg->pusch_config.number_of_subbands, &unpack_uint16_tlv_value},
+
+    { NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &pNfapiMsg->pucch_config.delta_pucch_shift, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &pNfapiMsg->pucch_config.n_cqi_rb, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &pNfapiMsg->pucch_config.n_an_cs, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &pNfapiMsg->pucch_config.n1_pucch_an, &unpack_uint16_tlv_value},
+
+    { NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &pNfapiMsg->srs_config.bandwidth_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &pNfapiMsg->srs_config.max_up_pts, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &pNfapiMsg->srs_config.srs_subframe_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission, &unpack_uint16_tlv_value},
+
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping, &unpack_uint16_tlv_value},
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &pNfapiMsg->uplink_reference_signal_config.group_assignment, &unpack_uint16_tlv_value},
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms, &unpack_uint16_tlv_value},
+
+    { NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &pNfapiMsg->tdd_frame_structure_config.subframe_assignment, &unpack_uint16_tlv_value},
+    { NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns, &unpack_uint16_tlv_value},
+
+    { NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &pNfapiMsg->l23_config.data_report_mode, &unpack_uint16_tlv_value},
+    { NFAPI_L23_CONFIG_SFNSF_TAG, &pNfapiMsg->l23_config.sfnsf, &unpack_uint16_tlv_value},
+
+    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.dl_ue_per_sf, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.ul_ue_per_sf, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_RF_BANDS_TAG, &pNfapiMsg->nfapi_config.rf_bands, &unpack_rf_bands_value},
+    { NFAPI_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &pNfapiMsg->nfapi_config.max_transmit_power, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_EARFCN_TAG, &pNfapiMsg->nfapi_config.earfcn, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_umts_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_lte_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported, &unpack_uint8_tlv_value},
+
+  };
+  return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nr_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_param_response_scf_t *pNfapiMsg = (nfapi_nr_param_response_scf_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_NR_PARAM_TLV_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->cell_param.release_capability), &unpack_uint16_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PHY_STATE_TAG, &(pNfapiMsg->cell_param.phy_state),&unpack_uint16_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SKIP_BLANK_DL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_dl_config), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SKIP_BLANK_UL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_ul_config), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_NUM_CONFIG_TLVS_TO_REPORT_TAG, &(pNfapiMsg->cell_param.num_config_tlvs_to_report ), &unpack_uint16_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_CYCLIC_PREFIX_TAG, &(pNfapiMsg->carrier_param.cyclic_prefix), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_DL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_dl), &unpack_uint16_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_DL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_dl), &unpack_uint16_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_UL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_ul), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_UL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_ul), &unpack_uint16_tlv_value},
+
+
+    { NFAPI_NR_PARAM_TLV_CCE_MAPPING_TYPE_TAG, &(pNfapiMsg->pdcch_param.cce_mapping_type), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG, &(pNfapiMsg->pdcch_param.coreset_outside_first_3_of_ofdm_syms_of_slot), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PRECODER_GRANULARITY_CORESET_TAG, &(pNfapiMsg->pdcch_param.coreset_precoder_granularity_coreset), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDCCH_MU_MIMO_TAG, &(pNfapiMsg->pdcch_param.pdcch_mu_mimo), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDCCH_PRECODER_CYCLING_TAG, &(pNfapiMsg->pdcch_param.pdcch_precoder_cycling), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_PDCCHS_PER_SLOT_TAG, &(pNfapiMsg->pdcch_param.max_pdcch_per_slot), &unpack_uint8_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_PUCCH_FORMATS_TAG, &(pNfapiMsg->pucch_param.pucch_formats), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_PUCCHS_PER_SLOT_TAG, &(pNfapiMsg->pucch_param.max_pucchs_per_slot), &unpack_uint8_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_PDSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pdsch_param.pdsch_mapping_type), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_allocation_types), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pdsch_param.pdsch_vrb_to_prb_mapping), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_CBG_TAG, &(pNfapiMsg->pdsch_param.pdsch_cbg), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_config_types), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_DMRS_MAX_LENGTH_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_max_length), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_additional_pos), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_PDSCH_S_YBS_PER_SLOT_TAG, &(pNfapiMsg->pdsch_param.max_pdsch_tbs_per_slot), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG, &(pNfapiMsg->pdsch_param.max_number_mimo_layers_pdsch), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_DL_TAG, &(pNfapiMsg->pdsch_param.max_mu_mimo_users_dl), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG, &(pNfapiMsg->pdsch_param.pdsch_data_in_dmrs_symbols), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PREMPTION_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.premption_support), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_NON_SLOT_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.pdsch_non_slot_support), &unpack_uint8_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_UCI_MUX_ULSCH_IN_PUSCH_TAG,  &(pNfapiMsg->pusch_param.uci_mux_ulsch_in_pusch),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_UCI_ONLY_PUSCH_TAG,  &(pNfapiMsg->pusch_param.uci_only_pusch),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_FREQUENCY_HOPPING_TAG,  &(pNfapiMsg->pusch_param.pusch_frequency_hopping),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_DMRS_CONFIG_TYPES_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_config_types),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_DMRS_MAX_LEN_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_max_len),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_DMRS_ADDITIONAL_POS_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_additional_pos),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_CBG_TAG,  &(pNfapiMsg->pusch_param.pusch_cbg),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_MAPPING_TYPE_TAG,  &(pNfapiMsg->pusch_param.pusch_mapping_type),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_ALLOCATION_TYPES_TAG,  &(pNfapiMsg->pusch_param.pusch_allocation_types),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_VRB_TO_PRB_MAPPING_TAG,  &(pNfapiMsg->pusch_param.pusch_vrb_to_prb_mapping),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_MAX_PTRS_PORTS_TAG,  &(pNfapiMsg->pusch_param.pusch_max_ptrs_ports),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_PDUSCHS_TBS_PER_SLOT_TAG,  &(pNfapiMsg->pusch_param.max_pduschs_tbs_per_slot),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG,  &(pNfapiMsg->pusch_param.max_number_mimo_layers_non_cb_pusch),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SUPPORTED_MODULATION_ORDER_UL_TAG,  &(pNfapiMsg->pusch_param.supported_modulation_order_ul),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_UL_TAG,  &(pNfapiMsg->pusch_param.max_mu_mimo_users_ul),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_DFTS_OFDM_SUPPORT_TAG,  &(pNfapiMsg->pusch_param.dfts_ofdm_support),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_AGGREGATION_FACTOR_TAG,  &(pNfapiMsg->pusch_param.pusch_aggregation_factor),  &unpack_uint8_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_PRACH_LONG_FORMATS_TAG,  &(pNfapiMsg->prach_param.prach_long_formats),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PRACH_SHORT_FORMATS_TAG,  &(pNfapiMsg->prach_param.prach_short_formats),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PRACH_RESTRICTED_SETS_TAG,  &(pNfapiMsg->prach_param.prach_restricted_sets),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG,  &(pNfapiMsg->prach_param.max_prach_fd_occasions_in_a_slot),  &unpack_uint8_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_RSSI_MEASUREMENT_SUPPORT_TAG,  &(pNfapiMsg->measurement_param.rssi_measurement_support),  &unpack_uint8_tlv_value},
+    //config
+    { NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
+    { NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
+    { NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
+  };
+  // print ppReadPackedMsg
+  uint8_t *ptr = *ppReadPackedMsg;
+  printf("\n Read message unpack_param_response: ");
+
+  while(ptr < end) {
+    printf(" %d ", *ptr);
+    ptr++;
+  }
+
+  printf("\n");
+  return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_config_request_t *pNfapiMsg = (nfapi_config_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &pNfapiMsg->subframe_config.duplex_mode, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &pNfapiMsg->subframe_config.pcfich_power_offset, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_PB_TAG, &pNfapiMsg->subframe_config.pb, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.dl_cyclic_prefix_type, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.ul_cyclic_prefix_type, &unpack_uint16_tlv_value},
+
+    { NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.dl_channel_bandwidth, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.ul_channel_bandwidth, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &pNfapiMsg->rf_config.reference_signal_power, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.tx_antenna_ports, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.rx_antenna_ports, &unpack_uint16_tlv_value},
+
+    { NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &pNfapiMsg->phich_config.phich_resource, &unpack_uint16_tlv_value},
+    { NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &pNfapiMsg->phich_config.phich_duration, &unpack_uint16_tlv_value},
+    { NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &pNfapiMsg->phich_config.phich_power_offset, &unpack_uint16_tlv_value},
+
+    { NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
+    { NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
+    { NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &pNfapiMsg->sch_config.physical_cell_id, &unpack_uint16_tlv_value},
+
+    { NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &pNfapiMsg->prach_config.configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->prach_config.root_sequence_index, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->prach_config.zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &pNfapiMsg->prach_config.high_speed_flag, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &pNfapiMsg->prach_config.frequency_offset, &unpack_uint16_tlv_value},
+
+    { NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &pNfapiMsg->pusch_config.hopping_mode, &unpack_uint16_tlv_value},
+    { NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &pNfapiMsg->pusch_config.hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &pNfapiMsg->pusch_config.number_of_subbands, &unpack_uint16_tlv_value},
+
+    { NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &pNfapiMsg->pucch_config.delta_pucch_shift, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &pNfapiMsg->pucch_config.n_cqi_rb, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &pNfapiMsg->pucch_config.n_an_cs, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &pNfapiMsg->pucch_config.n1_pucch_an, &unpack_uint16_tlv_value},
+
+    { NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &pNfapiMsg->srs_config.bandwidth_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &pNfapiMsg->srs_config.max_up_pts, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &pNfapiMsg->srs_config.srs_subframe_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission, &unpack_uint16_tlv_value},
+
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping, &unpack_uint16_tlv_value},
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &pNfapiMsg->uplink_reference_signal_config.group_assignment, &unpack_uint16_tlv_value},
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms, &unpack_uint16_tlv_value},
+
+
+    { NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG, &pNfapiMsg->laa_config.ed_threshold_lbt_pdsch, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG, &pNfapiMsg->laa_config.ed_threshold_lbt_drs, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG, &pNfapiMsg->laa_config.pd_threshold, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG, &pNfapiMsg->laa_config.multi_carrier_type, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG, &pNfapiMsg->laa_config.multi_carrier_tx, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG, &pNfapiMsg->laa_config.multi_carrier_freeze, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG, &pNfapiMsg->laa_config.tx_antenna_ports_drs, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG, &pNfapiMsg->laa_config.tx_power_drs, &unpack_uint16_tlv_value},
+
+    { NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG, &pNfapiMsg->emtc_config.pbch_repetitions_enable_r13, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->emtc_config.prach_catm_root_sequence_index, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->emtc_config.prach_catm_zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG, &pNfapiMsg->emtc_config.prach_catm_high_speed_flag, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_frequency_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_starting_subframe_periodicity, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_hopping_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_frequency_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_starting_subframe_periodicity, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_hopping_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_frequency_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_starting_subframe_periodicity, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_hopping_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_frequency_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_starting_subframe_periodicity, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_hopping_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG, &pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodea, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG, &pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodeb, &unpack_uint16_tlv_value},
+
+    { NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &pNfapiMsg->tdd_frame_structure_config.subframe_assignment, &unpack_uint16_tlv_value},
+    { NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns, &unpack_uint16_tlv_value},
+
+    { NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &pNfapiMsg->l23_config.data_report_mode, &unpack_uint16_tlv_value},
+    { NFAPI_L23_CONFIG_SFNSF_TAG, &pNfapiMsg->l23_config.sfnsf, &unpack_uint16_tlv_value},
+
+    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.dl_ue_per_sf, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.ul_ue_per_sf, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_RF_BANDS_TAG, &pNfapiMsg->nfapi_config.rf_bands, &unpack_rf_bands_value},
+    { NFAPI_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &pNfapiMsg->nfapi_config.max_transmit_power, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_EARFCN_TAG, &pNfapiMsg->nfapi_config.earfcn, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_umts_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_lte_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported, &unpack_uint8_tlv_value},
+
+  };
+  return ( pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
 }
 static uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
 {
 	nfapi_nr_config_request_scf_t *pNfapiMsg = (nfapi_nr_config_request_scf_t*)msg;
 
-	pNfapiMsg->tdd_table.max_tdd_periodicity_list = (nfapi_nr_max_tdd_periodicity_t*) malloc(20*sizeof(nfapi_nr_max_tdd_periodicity_t));
+	pNfapiMsg->tdd_table.max_tdd_periodicity_list = (nfapi_nr_max_tdd_periodicity_t*) malloc(40*sizeof(nfapi_nr_max_tdd_periodicity_t));
+
 	for(int i=0;i<40;i++)
-	pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list = (nfapi_nr_max_num_of_symbol_per_slot_t*) malloc(14*sizeof(nfapi_nr_max_num_of_symbol_per_slot_t));
+		pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list = (nfapi_nr_max_num_of_symbol_per_slot_t*) malloc(14*sizeof(nfapi_nr_max_num_of_symbol_per_slot_t));
 
     pNfapiMsg->prach_config.num_prach_fd_occasions_list=(nfapi_nr_num_prach_fd_occasions_t *) malloc(sizeof(nfapi_nr_num_prach_fd_occasions_t));
 
+	for(int i = 0; i < 40; i++){ //unpacking tdd slot config
+		for(int symbol = 0; symbol<14;symbol++){
+			pull8(ppReadPackedMsg,&pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[symbol].slot_config.value, end);
+		}
+	}
 	unpack_tlv_t unpack_fns[] =
 	{
 		{ NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG,  &(pNfapiMsg->carrier_config.dl_bandwidth),  &unpack_uint16_tlv_value},
@@ -2111,8 +1774,6 @@ static uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end,
 		{ NFAPI_NR_CONFIG_SSB_PERIOD_TAG,  &(pNfapiMsg->ssb_table.ssb_period),  &unpack_uint8_tlv_value},
 		{ NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG,  &(pNfapiMsg->ssb_table.ssb_subcarrier_offset),  &unpack_uint8_tlv_value},
 		{ NFAPI_NR_CONFIG_TDD_PERIOD_TAG,  &(pNfapiMsg->tdd_table.tdd_period),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_CONFIG_SLOT_CONFIG_TAG,  &(pNfapiMsg->tdd_table.max_tdd_periodicity_list[0].max_num_of_symbol_per_slot_list[0].slot_config),  &unpack_uint8_tlv_value},
-		{ NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG,  &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4),  &unpack_ipv4_address_value},
 		{ NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG,  &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6),  &unpack_ipv6_address_value},
 		{ NFAPI_NR_NFAPI_P7_PNF_PORT_TAG,  &(pNfapiMsg->nfapi_config.p7_pnf_port),  &unpack_uint16_tlv_value},
 		{ NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG,  &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4),  &unpack_ipv4_address_value},
@@ -2122,664 +1783,607 @@ static uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end,
 		{ NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG,  &(pNfapiMsg->nfapi_config.timing_info_period),  &unpack_uint8_tlv_value},
 		{ NFAPI_NR_NFAPI_TIMING_WINDOW_TAG,  &(pNfapiMsg->nfapi_config.timing_window),  &unpack_uint8_tlv_value},
 	};
+
 	return ( pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
 			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+		
+}
 
+static uint8_t unpack_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_config_response_t *pNfapiMsg = (nfapi_config_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
 }
 
-static uint8_t unpack_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_config_response_t *pNfapiMsg = (nfapi_config_response_t*)msg;
+static uint8_t unpack_nr_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_config_response_scf_t *pNfapiMsg = (nfapi_nr_config_response_scf_t *)msg;
+  return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
 
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
+static uint8_t unpack_nr_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_start_request_scf_t *pNfapiMsg = ( nfapi_nr_start_request_scf_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
 
-	return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) && 
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+static uint8_t unpack_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_start_request_t *pNfapiMsg = ( nfapi_start_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
 }
 
-static uint8_t unpack_nr_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_config_response_scf_t *pNfapiMsg = (nfapi_nr_config_response_scf_t*)msg;
+static uint8_t unpack_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_start_response_t *pNfapiMsg = (nfapi_start_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
 
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
+static uint8_t unpack_nr_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_start_response_scf_t *pNfapiMsg = (nfapi_nr_start_response_scf_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
 
-	return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) && 
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+static uint8_t unpack_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_stop_request_t *pNfapiMsg = (nfapi_stop_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
 }
 
-static uint8_t unpack_nr_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	 nfapi_nr_start_request_scf_t *pNfapiMsg = ( nfapi_nr_start_request_scf_t*)msg;
+static uint8_t unpack_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_stop_response_t *pNfapiMsg = (nfapi_stop_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+static uint8_t unpack_measurement_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_measurement_request_t *pNfapiMsg = (nfapi_measurement_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG, &pNfapiMsg->dl_rs_tx_power, &unpack_uint16_tlv_value},
+    { NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG, &pNfapiMsg->received_interference_power, &unpack_uint16_tlv_value},
+    { NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG, &pNfapiMsg->thermal_noise_power, &unpack_uint16_tlv_value},
+  };
+  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_received_interference_power_measurement_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_received_interference_power_measurement_t *value = (nfapi_received_interference_power_measurement_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_resource_blocks, end) &&
+           pullarrays16(ppReadPackedMsg, value->received_interference_power,  NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS, value->number_of_resource_blocks, end));
+}
 
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
 
-	return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+static uint8_t unpack_measurement_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_measurement_response_t *pNfapiMsg = (nfapi_measurement_response_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG, &pNfapiMsg->dl_rs_tx_power_measurement, &unpack_int16_tlv_value},
+    { NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG, &pNfapiMsg->received_interference_power_measurement, &unpack_received_interference_power_measurement_value},
+    { NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG, &pNfapiMsg->thermal_noise_power_measurement, &unpack_int16_tlv_value},
+  };
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
 }
 
-static uint8_t unpack_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	 nfapi_start_request_t *pNfapiMsg = ( nfapi_start_request_t*)msg;
+// unpack length check
 
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
+static int check_nr_unpack_length(nfapi_nr_phy_msg_type_e msgId, uint32_t unpackedBufLen) {
+  int retLen = 0;
 
-	return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
+  switch (msgId) {
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_param_request_t))
+        retLen = sizeof(nfapi_pnf_param_request_t);
 
-static uint8_t unpack_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_start_response_t *pNfapiMsg = (nfapi_start_response_t*)msg;
+      break;
 
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_param_response_t))
+        retLen = sizeof(nfapi_nr_pnf_param_response_t);
 
-	return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+      break;
 
-}
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_config_request_t))
+        retLen = sizeof(nfapi_nr_pnf_config_request_t);
 
-static uint8_t unpack_nr_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_nr_start_response_scf_t *pNfapiMsg = (nfapi_nr_start_response_scf_t*)msg;
+      break;
 
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_config_response_t))
+        retLen = sizeof(nfapi_nr_pnf_config_response_t);
 
-	return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+      break;
 
-}
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_start_request_t))
+        retLen = sizeof(nfapi_nr_pnf_start_request_t);
 
-static uint8_t unpack_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_stop_request_t *pNfapiMsg = (nfapi_stop_request_t*)msg;
+      break;
 
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_start_response_t))
+        retLen = sizeof(nfapi_nr_pnf_start_response_t);
 
-	return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
+      break;
 
-static uint8_t unpack_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_stop_response_t *pNfapiMsg = (nfapi_stop_response_t*)msg;
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_stop_request_t))
+        retLen = sizeof(nfapi_nr_pnf_stop_request_t);
 
-	unpack_tlv_t unpack_fns[] =
-	{
-	};
+      break;
 
-	return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_stop_response_t))
+        retLen = sizeof(nfapi_nr_pnf_stop_response_t);
 
-}
-static uint8_t unpack_measurement_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_measurement_request_t *pNfapiMsg = (nfapi_measurement_request_t*)msg;
+      break;
 
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG, &pNfapiMsg->dl_rs_tx_power, &unpack_uint16_tlv_value},
-		{ NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG, &pNfapiMsg->received_interference_power, &unpack_uint16_tlv_value},
-		{ NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG, &pNfapiMsg->thermal_noise_power, &unpack_uint16_tlv_value},
-	};
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nr_param_request_scf_t))
+        retLen = sizeof(nfapi_nr_param_request_scf_t);
 
-	return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+      break;
 
-}
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_param_response_scf_t))
+        retLen = sizeof(nfapi_nr_param_response_scf_t);
 
-static uint8_t unpack_received_interference_power_measurement_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_received_interference_power_measurement_t* value = (nfapi_received_interference_power_measurement_t*)tlv;
+      break;
 
-	return ( pull16(ppReadPackedMsg, &value->number_of_resource_blocks, end) &&
-			 pullarrays16(ppReadPackedMsg, value->received_interference_power,  NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS, value->number_of_resource_blocks, end)); 
-}
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nr_config_request_scf_t))
+        retLen = sizeof(nfapi_nr_config_request_scf_t);
 
+      break;
 
-static uint8_t unpack_measurement_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_measurement_response_t *pNfapiMsg = (nfapi_measurement_response_t*)msg;
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_config_response_scf_t))
+        retLen = sizeof(nfapi_nr_config_response_scf_t);
 
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG, &pNfapiMsg->dl_rs_tx_power_measurement, &unpack_int16_tlv_value},
-		{ NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG, &pNfapiMsg->received_interference_power_measurement, &unpack_received_interference_power_measurement_value},
-		{ NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG, &pNfapiMsg->thermal_noise_power_measurement, &unpack_int16_tlv_value},
-	};
+      break;
 
-	return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
+      if (unpackedBufLen >= sizeof( nfapi_nr_start_request_scf_t))
+        retLen = sizeof( nfapi_nr_start_request_scf_t);
 
-}
+      break;
 
-// unpack length check
+    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_start_response_scf_t))
+        retLen = sizeof(nfapi_nr_start_response_scf_t);
 
-static int check_nr_unpack_length(nfapi_nr_phy_msg_type_e msgId, uint32_t unpackedBufLen)
-{
-	int retLen = 0;
+      break;
 
-	switch (msgId)
-	{
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_pnf_param_request_t))
-				retLen = sizeof(nfapi_pnf_param_request_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_nr_pnf_param_response_t))
-				retLen = sizeof(nfapi_nr_pnf_param_response_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_nr_pnf_config_request_t))
-				retLen = sizeof(nfapi_nr_pnf_config_request_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_nr_pnf_config_response_t))
-				retLen = sizeof(nfapi_nr_pnf_config_response_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_nr_pnf_start_request_t))
-				retLen = sizeof(nfapi_nr_pnf_start_request_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_nr_pnf_start_response_t))
-				retLen = sizeof(nfapi_nr_pnf_start_response_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_nr_pnf_stop_request_t))
-				retLen = sizeof(nfapi_nr_pnf_stop_request_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_nr_pnf_stop_response_t))
-				retLen = sizeof(nfapi_nr_pnf_stop_response_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_nr_param_request_scf_t))
-				retLen = sizeof(nfapi_nr_param_request_scf_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_nr_param_response_scf_t))
-				retLen = sizeof(nfapi_nr_param_response_scf_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_nr_config_request_scf_t))
-				retLen = sizeof(nfapi_nr_config_request_scf_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_nr_config_response_scf_t))
-				retLen = sizeof(nfapi_nr_config_response_scf_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
-			if (unpackedBufLen >= sizeof( nfapi_nr_start_request_scf_t))
-				retLen = sizeof( nfapi_nr_start_request_scf_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_nr_start_response_scf_t))
-				retLen = sizeof(nfapi_nr_start_response_scf_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_stop_request_t))
-				retLen = sizeof(nfapi_stop_request_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_stop_response_t))
-				retLen = sizeof(nfapi_stop_response_t);
-			break;
-		default:
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s Unknown message ID %d\n", __FUNCTION__, msgId);
-			break;
-	}
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_stop_request_t))
+        retLen = sizeof(nfapi_stop_request_t);
 
-	return retLen;
-}
+      break;
 
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_stop_response_t))
+        retLen = sizeof(nfapi_stop_response_t);
 
-static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen)
-{
-	int retLen = 0;
+      break;
 
-	switch (msgId)
-	{
-		case NFAPI_PNF_PARAM_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_pnf_param_request_t))
-				retLen = sizeof(nfapi_pnf_param_request_t);
-			break;
-
-		case NFAPI_PNF_PARAM_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_pnf_param_response_t))
-				retLen = sizeof(nfapi_pnf_param_response_t);
-			break;
-
-		case NFAPI_PNF_CONFIG_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_pnf_config_request_t))
-				retLen = sizeof(nfapi_pnf_config_request_t);
-			break;
-
-		case NFAPI_PNF_CONFIG_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_pnf_config_response_t))
-				retLen = sizeof(nfapi_pnf_config_response_t);
-			break;
-
-		case NFAPI_PNF_START_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_pnf_start_request_t))
-				retLen = sizeof(nfapi_pnf_start_request_t);
-			break;
-
-		case NFAPI_PNF_START_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_pnf_start_response_t))
-				retLen = sizeof(nfapi_pnf_start_response_t);
-			break;
-
-		case NFAPI_PNF_STOP_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_pnf_stop_request_t))
-				retLen = sizeof(nfapi_pnf_stop_request_t);
-			break;
-
-		case NFAPI_PNF_STOP_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_pnf_stop_response_t))
-				retLen = sizeof(nfapi_pnf_stop_response_t);
-			break;
-
-		case NFAPI_PARAM_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_param_request_t))
-				retLen = sizeof(nfapi_param_request_t);
-			break;
-
-		case NFAPI_PARAM_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_param_response_t))
-				retLen = sizeof(nfapi_param_response_t);
-			break;
-
-		case NFAPI_CONFIG_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_config_request_t))
-				retLen = sizeof(nfapi_config_request_t);
-			break;
-
-		case NFAPI_CONFIG_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_config_response_t))
-				retLen = sizeof(nfapi_config_response_t);
-			break;
-
-		case NFAPI_START_REQUEST:
-			if (unpackedBufLen >= sizeof( nfapi_start_request_t))
-				retLen = sizeof( nfapi_start_request_t);
-			break;
-
-		case NFAPI_START_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_start_response_t))
-				retLen = sizeof(nfapi_start_response_t);
-			break;
-
-		case NFAPI_STOP_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_stop_request_t))
-				retLen = sizeof(nfapi_stop_request_t);
-			break;
-
-		case NFAPI_STOP_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_stop_response_t))
-				retLen = sizeof(nfapi_stop_response_t);
-			break;
-
-		case NFAPI_MEASUREMENT_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_measurement_request_t))
-				retLen = sizeof(nfapi_measurement_request_t);
-			break;
-
-		case NFAPI_MEASUREMENT_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_measurement_response_t))
-				retLen = sizeof(nfapi_measurement_response_t);
-			break;
-
-		default:
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s Unknown message ID %d\n", __FUNCTION__, msgId);
-			break;
-	}
+    default:
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s Unknown message ID %d\n", __FUNCTION__, msgId);
+      break;
+  }
 
-	return retLen;
+  return retLen;
 }
 
 
-// Main unpack functions - public
+static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen) {
+  int retLen = 0;
 
-int nfapi_p5_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
-	uint8_t *pReadPackedMessage = pMessageBuf;
-	uint8_t *end = pMessageBuf + messageBufLen;
+  switch (msgId) {
+    case NFAPI_PNF_PARAM_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_param_request_t))
+        retLen = sizeof(nfapi_pnf_param_request_t);
 
-	if (pMessageBuf == NULL || pUnpackedBuf == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied pointers are null\n");
-		return -1;
-	}
+      break;
 
-	if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-		return -1;
-	}
+    case NFAPI_PNF_PARAM_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_param_response_t))
+        retLen = sizeof(nfapi_pnf_param_response_t);
 
-	// process the header
-	return ( pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
-			 pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-			 pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-			 pull16(&pReadPackedMessage, &pMessageHeader->spare, end) );
+      break;
 
-}
+    case NFAPI_PNF_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_config_request_t))
+        retLen = sizeof(nfapi_pnf_config_request_t);
 
-int nfapi_nr_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
-	uint8_t *pReadPackedMessage = pMessageBuf;
-	uint8_t *end = pMessageBuf + messageBufLen;
+      break;
 
-	if (pMessageBuf == NULL || pUnpackedBuf == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied pointers are null\n");
-		return -1;
-	}
+    case NFAPI_PNF_CONFIG_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_config_response_t))
+        retLen = sizeof(nfapi_pnf_config_response_t);
 
-	if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-		return -1;
-	}
+      break;
 
-	uint8_t *ptr = pReadPackedMessage;
-	printf("\n Read message unpack: ");
-	while(ptr < end){
-		printf(" %d ", *ptr);
-		ptr++;
-	}
-	printf("\n");
-	
-	// clean the supplied buffer for - tag value blanking
-	(void)memset(pUnpackedBuf, 0, unpackedBufLen);
-
-	// process the header
-	if( !(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end ) && 
-		  pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-		  pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-		  pull16(&pReadPackedMessage, &pMessageHeader->spare, end)))
-	{
-		// failed to read the header
-		return -1;
-	}
+    case NFAPI_PNF_START_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_start_request_t))
+        retLen = sizeof(nfapi_pnf_start_request_t);
 
-	int result = -1;
+      break;
 
+    case NFAPI_PNF_START_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_start_response_t))
+        retLen = sizeof(nfapi_pnf_start_response_t);
 
-	if(check_nr_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
-	{
-		// the unpack buffer is not big enough for the struct 
-		return -1;
-	}
+      break;
 
-	// look for the specific message
-	switch (pMessageHeader->message_id)
-	{
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
-			result = unpack_nr_pnf_param_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE:
-			result = unpack_nr_pnf_param_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
-			result = unpack_nr_pnf_config_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
-			result = unpack_nr_pnf_config_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
-			result = unpack_nr_pnf_start_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
-			result = unpack_nr_pnf_start_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
-			result = unpack_pnf_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE:
-			result = unpack_pnf_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
-			result = unpack_nr_param_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
-			result = unpack_nr_param_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
-			result = unpack_nr_config_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
-			result = unpack_nr_config_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
-			result = unpack_nr_start_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
-			result = unpack_nr_start_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
-			result = unpack_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
-			result = unpack_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_MEASUREMENT_REQUEST:
-			result = unpack_measurement_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_MEASUREMENT_RESPONSE:
-			result = unpack_measurement_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		default:
-			if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN && 
-			   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
-			{
-				if(config && config->unpack_p4_p5_vendor_extension)
-				{
-					result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
-				}
-				else
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-				}
-			}
-			else
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P5 message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-			}
-			break;
-	}
+    case NFAPI_PNF_STOP_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_stop_request_t))
+        retLen = sizeof(nfapi_pnf_stop_request_t);
 
-	return result;
-}
+      break;
 
-int nfapi_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t* config)
-{
-	nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
-	uint8_t *pReadPackedMessage = pMessageBuf;
-	uint8_t *end = pMessageBuf + messageBufLen;
+    case NFAPI_PNF_STOP_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_stop_response_t))
+        retLen = sizeof(nfapi_pnf_stop_response_t);
 
-	if (pMessageBuf == NULL || pUnpackedBuf == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied pointers are null\n");
-		return -1;
-	}
+      break;
 
-	if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-		return -1;
-	}
+    case NFAPI_PARAM_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_param_request_t))
+        retLen = sizeof(nfapi_param_request_t);
 
-	uint8_t *ptr = pReadPackedMessage;
-	printf("\n Read message unpack: ");
-	while(ptr < end){
-		printf(" %d ", *ptr);
-		ptr++;
-	}
-	printf("\n");
-	
-	// clean the supplied buffer for - tag value blanking
-	(void)memset(pUnpackedBuf, 0, unpackedBufLen);
-
-	// process the header
-	if( !(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end ) && 
-		  pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-		  pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-		  pull16(&pReadPackedMessage, &pMessageHeader->spare, end)))
-	{
-		// failed to read the header
-		return -1;
-	}
+      break;
 
-	int result = -1;
+    case NFAPI_PARAM_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_param_response_t))
+        retLen = sizeof(nfapi_param_response_t);
 
+      break;
 
-	if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
-	{
-		// the unpack buffer is not big enough for the struct 
-		return -1;
-	}
+    case NFAPI_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_config_request_t))
+        retLen = sizeof(nfapi_config_request_t);
 
-	// look for the specific message
-	switch (pMessageHeader->message_id)
-	{
-		case NFAPI_PNF_PARAM_REQUEST:
-			result = unpack_pnf_param_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_PNF_PARAM_RESPONSE:
-			result = unpack_pnf_param_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_PNF_CONFIG_REQUEST:
-			result = unpack_pnf_config_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_PNF_CONFIG_RESPONSE:
-			result = unpack_pnf_config_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_PNF_START_REQUEST:
-			result = unpack_pnf_start_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_PNF_START_RESPONSE:
-			result = unpack_pnf_start_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_PNF_STOP_REQUEST:
-			result = unpack_pnf_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_PNF_STOP_RESPONSE:
-			result = unpack_pnf_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_PARAM_REQUEST:
-			result = unpack_param_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_PARAM_RESPONSE:
-			result = unpack_param_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_CONFIG_REQUEST:
-			result = unpack_config_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_CONFIG_RESPONSE:
-			result = unpack_config_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_START_REQUEST:
-			result = unpack_start_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_START_RESPONSE:
-			result = unpack_start_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_STOP_REQUEST:
-			result = unpack_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_STOP_RESPONSE:
-			result = unpack_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_MEASUREMENT_REQUEST:
-			result = unpack_measurement_request(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		case NFAPI_MEASUREMENT_RESPONSE:
-			result = unpack_measurement_response(&pReadPackedMessage, end, pMessageHeader, config);
-			break;
-
-		default:
-			if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN && 
-			   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
-			{
-				if(config && config->unpack_p4_p5_vendor_extension)
-				{
-					result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
-				}
-				else
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-				}
-			}
-			else
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P5 message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-			}
-			break;
-	}
+      break;
+
+    case NFAPI_CONFIG_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_config_response_t))
+        retLen = sizeof(nfapi_config_response_t);
+
+      break;
+
+    case NFAPI_START_REQUEST:
+      if (unpackedBufLen >= sizeof( nfapi_start_request_t))
+        retLen = sizeof( nfapi_start_request_t);
+
+      break;
+
+    case NFAPI_START_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_start_response_t))
+        retLen = sizeof(nfapi_start_response_t);
+
+      break;
+
+    case NFAPI_STOP_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_stop_request_t))
+        retLen = sizeof(nfapi_stop_request_t);
+
+      break;
+
+    case NFAPI_STOP_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_stop_response_t))
+        retLen = sizeof(nfapi_stop_response_t);
+
+      break;
+
+    case NFAPI_MEASUREMENT_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_measurement_request_t))
+        retLen = sizeof(nfapi_measurement_request_t);
+
+      break;
+
+    case NFAPI_MEASUREMENT_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_measurement_response_t))
+        retLen = sizeof(nfapi_measurement_response_t);
+
+      break;
+
+    default:
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s Unknown message ID %d\n", __FUNCTION__, msgId);
+      break;
+  }
+
+  return retLen;
+}
+
+
+// Main unpack functions - public
 
-	return result;
+int nfapi_p5_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  // process the header
+  return ( pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+           pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+           pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+           pull16(&pReadPackedMessage, &pMessageHeader->spare, end) );
+}
+
+int nfapi_nr_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  uint8_t *ptr = pReadPackedMessage;
+  printf("\n Read message unpack: ");
+
+  while(ptr < end) {
+    printf(" %d ", *ptr);
+    ptr++;
+  }
+
+  printf("\n");
+  // clean the supplied buffer for - tag value blanking
+  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
+
+  // process the header
+  if( !(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end ) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->spare, end))) {
+    // failed to read the header
+    return -1;
+  }
+
+  int result = -1;
+
+  if(check_nr_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0) {
+    // the unpack buffer is not big enough for the struct
+    return -1;
+  }
+
+  // look for the specific message
+  switch (pMessageHeader->message_id) {
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
+      result = unpack_nr_pnf_param_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE:
+      result = unpack_nr_pnf_param_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
+      result = unpack_nr_pnf_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
+      result = unpack_nr_pnf_config_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
+      result = unpack_nr_pnf_start_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
+      result = unpack_nr_pnf_start_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
+      result = unpack_pnf_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE:
+      result = unpack_pnf_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
+      result = unpack_nr_param_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
+      result = unpack_nr_param_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
+      result = unpack_nr_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
+      result = unpack_nr_config_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
+      result = unpack_nr_start_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
+      result = unpack_nr_start_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
+      result = unpack_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
+      result = unpack_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_MEASUREMENT_REQUEST:
+      result = unpack_measurement_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_MEASUREMENT_RESPONSE:
+      result = unpack_measurement_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    default:
+      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->unpack_p4_p5_vendor_extension) {
+          result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P5 message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+      }
+
+      break;
+  }
+
+  return result;
+}
+
+int nfapi_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  uint8_t *ptr = pReadPackedMessage;
+  printf("\n Read message unpack: ");
+
+  while(ptr < end) {
+    printf(" %d ", *ptr);
+    ptr++;
+  }
+
+  printf("\n");
+  // clean the supplied buffer for - tag value blanking
+  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
+
+  // process the header
+  if( !(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end ) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->spare, end))) {
+    // failed to read the header
+    return -1;
+  }
+
+  int result = -1;
+
+  if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0) {
+    // the unpack buffer is not big enough for the struct
+    return -1;
+  }
+
+  // look for the specific message
+  switch (pMessageHeader->message_id) {
+    case NFAPI_PNF_PARAM_REQUEST:
+      result = unpack_pnf_param_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_PARAM_RESPONSE:
+      result = unpack_pnf_param_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_CONFIG_REQUEST:
+      result = unpack_pnf_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_CONFIG_RESPONSE:
+      result = unpack_pnf_config_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_START_REQUEST:
+      result = unpack_pnf_start_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_START_RESPONSE:
+      result = unpack_pnf_start_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_STOP_REQUEST:
+      result = unpack_pnf_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_STOP_RESPONSE:
+      result = unpack_pnf_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PARAM_REQUEST:
+      result = unpack_param_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PARAM_RESPONSE:
+      result = unpack_param_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_CONFIG_REQUEST:
+      result = unpack_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_CONFIG_RESPONSE:
+      result = unpack_config_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_START_REQUEST:
+      result = unpack_start_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_START_RESPONSE:
+      result = unpack_start_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_STOP_REQUEST:
+      result = unpack_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_STOP_RESPONSE:
+      result = unpack_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_MEASUREMENT_REQUEST:
+      result = unpack_measurement_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_MEASUREMENT_RESPONSE:
+      result = unpack_measurement_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    default:
+      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->unpack_p4_p5_vendor_extension) {
+          result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P5 message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+      }
+
+      break;
+  }
+
+  return result;
 }
 
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
old mode 100755
new mode 100644
index ec59ba39b2681dbee3506343a5fae49bcca84d67..ecd8e3dbfe6b7fee43ee0b64ccf2dae949ee2678
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
@@ -1,8269 +1,7948 @@
-/*
- * Copyright 2017 Cisco Systems, Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- * 
- * 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.
- */
-
-
-#include <assert.h>
-#include <signal.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <zlib.h>
-#include <sched.h>
-#include <time.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <pthread.h>
-#include <stdint.h>
-
-#include <nfapi_interface.h>
-#include <nfapi.h>
-#include <debug.h>
-#include "nfapi_nr_interface_scf.h"
-
-extern int nfapi_unpack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t **ppReadPackedMsg, void* user_data);
-extern int nfapi_pack_p7_vendor_extension(nfapi_p7_message_header_t* header, uint8_t **ppWritePackedMsg, void* user_data);
-
-uint32_t nfapi_calculate_checksum(uint8_t* buffer, uint16_t len)
-{
-	uint32_t chksum = 0;
-	// calcaulte upto the checksum
-	chksum = crc32(chksum, buffer, 8);
-	
-	// skip the checksum
-	uint8_t zeros[4] = {0, 0, 0, 0};
-	chksum = crc32(chksum, zeros, 4);
-	
-	// continu with the rest of the mesage
-	chksum = crc32(chksum, &buffer[NFAPI_P7_HEADER_LENGTH], len - NFAPI_P7_HEADER_LENGTH);
-	
-	// return the inverse
-	return ~(chksum);
-}
-
-int nfapi_p7_update_checksum(uint8_t* buffer, uint32_t len)
-{
-	uint32_t checksum = nfapi_calculate_checksum(buffer, len);
-
-	uint8_t* p_write = &buffer[8];
-	return (push32(checksum, &p_write, buffer + len) > 0 ? 0 : -1);
-}
-
-int nfapi_p7_update_transmit_timestamp(uint8_t* buffer, uint32_t timestamp)
-{
-	uint8_t* p_write = &buffer[12];
-	return (push32(timestamp, &p_write, buffer + 16) > 0 ? 0 : -1);
-}
-
-uint32_t nfapi_p7_calculate_checksum(uint8_t* buffer, uint32_t len)
-{
-	return nfapi_calculate_checksum(buffer, len);
-}
-
-void* nfapi_p7_allocate(size_t size, nfapi_p7_codec_config_t* config)
-{
-	if(size == 0)
-		return 0;
-
-       void* buffer_p = NULL;
-	if(config && config->allocate)
-	{
-               buffer_p = (config->allocate)(size);
-               if(buffer_p != NULL){
-               memset(buffer_p,0,size);
-               }
-               return buffer_p;
-	}
-	else
-	{
-               buffer_p = calloc(1, size);
-               return buffer_p;
-	}
-}
-
-void nfapi_p7_deallocate(void* ptr, nfapi_p7_codec_config_t* config)
-{
-	if(ptr == NULL)
-		return;
-
-	if(config && config->deallocate)
-	{
-		return (config->deallocate)(ptr);
-	}
-	else
-	{
-		return free(ptr);
-	}
-}
-// Pack routines
-
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dci_dl_pdu_rel8_t* value = (nfapi_dl_config_dci_dl_pdu_rel8_t*)tlv;
-	
-        //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci_format:%u\n", __FUNCTION__, value->dci_format);
-
-	return ( push8(value->dci_format, ppWritePackedMsg, end) &&
-			 push8(value->cce_idx, ppWritePackedMsg, end) &&
-			 push8(value->aggregation_level, ppWritePackedMsg, end) &&
-			 push16(value->rnti, ppWritePackedMsg, end) &&
-			 push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
-			 push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
-			 push32(value->resource_block_coding, ppWritePackedMsg, end) &&
-			 push8(value->mcs_1, ppWritePackedMsg, end) &&
-			 push8(value->redundancy_version_1, ppWritePackedMsg, end) &&
-			 push8(value->new_data_indicator_1, ppWritePackedMsg, end) &&
-			 push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
-			 push8(value->mcs_2, ppWritePackedMsg, end) &&
-			 push8(value->redundancy_version_2, ppWritePackedMsg, end) &&
-			 push8(value->new_data_indicator_2, ppWritePackedMsg, end) &&
-			 push8(value->harq_process, ppWritePackedMsg, end) &&
-			 push8(value->tpmi, ppWritePackedMsg, end) &&
-			 push8(value->pmi, ppWritePackedMsg, end) &&
-			 push8(value->precoding_information, ppWritePackedMsg, end) &&
-			 push8(value->tpc, ppWritePackedMsg, end) &&
-			 push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
-			 push8(value->ngap, ppWritePackedMsg, end) &&
-			 push8(value->transport_block_size_index, ppWritePackedMsg, end) &&
-			 push8(value->downlink_power_offset, ppWritePackedMsg, end) &&
-			 push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
-			 push8(value->preamble_index, ppWritePackedMsg, end) &&
-			 push8(value->prach_mask_index, ppWritePackedMsg, end) &&
-			 push8(value->rnti_type, ppWritePackedMsg, end) &&
-			 push16(value->transmission_power, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dci_dl_pdu_rel9_t* value = (nfapi_dl_config_dci_dl_pdu_rel9_t*)tlv;
-
-	return( push8(value->mcch_flag, ppWritePackedMsg, end) &&
-			push8(value->mcch_change_notification, ppWritePackedMsg, end) &&
-			push8(value->scrambling_identity, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dci_dl_pdu_rel10_t* value = (nfapi_dl_config_dci_dl_pdu_rel10_t*)tlv;
-	
-	return ( push8(value->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
-			 push8(value->carrier_indicator, ppWritePackedMsg, end) &&
-			 push8(value->srs_flag, ppWritePackedMsg, end) &&
-			 push8(value->srs_request, ppWritePackedMsg, end) &&
-			 push8(value->antenna_ports_scrambling_and_layers, ppWritePackedMsg, end) &&
-			 push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) && 
-			 push8(value->n_dl_rb, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dci_dl_pdu_rel11_t* value = (nfapi_dl_config_dci_dl_pdu_rel11_t*)tlv;
-	
-	return ( push8(value->harq_ack_resource_offset, ppWritePackedMsg, end) &&
-		 	 push8(value->pdsch_re_mapping_quasi_co_location_indicator, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel12_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dci_dl_pdu_rel12_t* value = (nfapi_dl_config_dci_dl_pdu_rel12_t*)tlv;
-	
-	return ( push8(value->primary_cell_type, ppWritePackedMsg, end) &&
-			 push8(value->ul_dl_configuration_flag, ppWritePackedMsg, end) &&
-			 push8(value->number_ul_dl_configurations, ppWritePackedMsg, end) &&
-			 pusharray8(value->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, value->number_ul_dl_configurations, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_tpm_value(nfapi_dl_config_dci_dl_tpm_t* value, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	if (!( push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
-	       push8(value->number_of_subbands, ppWritePackedMsg, end) &&
-	       push8(value->num_antennas, ppWritePackedMsg, end)))
-		return 0;
-	
-	uint8_t idx = 0;
-	for(idx = 0; idx < value->number_of_subbands; ++idx)
-	{
-		nfapi_dl_config_dci_dl_tpm_subband_info_t* subband_info = &(value->subband_info[idx]);
-		
-		if(!(push8(subband_info->subband_index, ppWritePackedMsg, end) &&
-			 push8(subband_info->scheduled_ues, ppWritePackedMsg, end)))
-			return 0;	
-		
-
-		uint8_t antenna_idx = 0;
-		uint8_t scheduled_ue_idx = 0;
-		
-		for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx)
-		{
-			for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx)
-			{
-				if(!push16(subband_info->precoding_value[antenna_idx][scheduled_ue_idx], ppWritePackedMsg, end))
-					return 0;
-			}
-		}
-
-	}
-	
-	
-	return 1;			
-	
-}
-
-
-static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nr_dl_tti_csi_rs_pdu_rel15_t* value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t*)tlv;
-
-	return(
-		push16(value->bwp_size, ppWritePackedMsg, end) &&
-		push16(value->bwp_start, ppWritePackedMsg, end) &&
-
-		push8(value->subcarrier_spacing, ppWritePackedMsg, end) &&
-		push8(value->cyclic_prefix, ppWritePackedMsg, end) &&
-
-		push16(value->start_rb, ppWritePackedMsg, end) &&
-		push16(value->nr_of_rbs, ppWritePackedMsg, end) &&
-
-		push8(value->csi_type, ppWritePackedMsg, end) &&
-		push8(value->row, ppWritePackedMsg, end) &&
-
-		push16(value->freq_domain, ppWritePackedMsg, end) &&
-		push8(value->symb_l0, ppWritePackedMsg, end) &&
-
-		push8(value->symb_l1, ppWritePackedMsg, end) &&
-		push8(value->cdm_type, ppWritePackedMsg, end) &&
-
-		push8(value->freq_density, ppWritePackedMsg, end) &&
-		push16(value->scramb_id, ppWritePackedMsg, end) &&
-
-		push8(value->power_control_offset, ppWritePackedMsg, end) &&
-		push8(value->power_control_offset_ss, ppWritePackedMsg, end)
-	);
-
-}
-
-
-static uint8_t pack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nr_dl_tti_pdcch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t*)tlv;
-	
-	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
-	{
-		if(!push16(value->dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
-		push16(value->dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
-
-		push16(value->dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
-		push8(value->dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
-		push8(value->dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
-		push8(value->dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
-
-		push8(value->dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
-		push16(value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
-		pusharray8(value->dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end));
-
-		return 0;
-	}
-
-	// TODO: resolve the packaging of array (currently sending a single element)
-	return(
-		push16(value->BWPSize, ppWritePackedMsg, end) &&
-		push16(value->BWPStart, ppWritePackedMsg, end) &&
-		push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
-		push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
-
-		push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
-		push8(value->DurationSymbols, ppWritePackedMsg, end) &&
-		pusharray8(value->FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
-		push8(value->CceRegMappingType, ppWritePackedMsg, end) &&
-
-		push8(value->RegBundleSize, ppWritePackedMsg, end) &&
-		push8(value->InterleaverSize, ppWritePackedMsg, end) &&
-		push8(value->CoreSetType, ppWritePackedMsg, end) &&
-		push16(value->ShiftIndex, ppWritePackedMsg, end) &&
-
-		push8(value->precoderGranularity, ppWritePackedMsg, end) &&
-		push16(value->numDlDci, ppWritePackedMsg, end));
-
-}
-
-
-static uint8_t pack_dl_tti_pdsch_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nr_dl_tti_pdsch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t*)tlv;
-
-	// TODO: resolve the packaging of array (currently sending a single element)
-	return(
-		push16(value->pduBitmap, ppWritePackedMsg, end) &&
-		push16(value->rnti, ppWritePackedMsg, end) &&
-		push16(value->pduIndex, ppWritePackedMsg, end) &&
-		push16(value->BWPSize, ppWritePackedMsg, end) &&
-		
-		push16(value->BWPStart, ppWritePackedMsg, end) &&
-		push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
-		push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
-		push8(value->NrOfCodewords, ppWritePackedMsg, end) &&
-		
-		pusharray16(value->targetCodeRate, 2, 1, ppWritePackedMsg, end) &&
-		pusharray8(value->qamModOrder, 2, 1, ppWritePackedMsg, end) &&
-		pusharray8(value->mcsIndex, 2, 1, ppWritePackedMsg, end) &&
-        pusharray8(value->mcsTable, 2, 1, ppWritePackedMsg, end) &&
-		
-		pusharray8(value->rvIndex, 2, 1, ppWritePackedMsg, end) &&
-	    pusharray32(value->TBSize, 2, 1, ppWritePackedMsg, end) &&
-	    push16(value->dataScramblingId, ppWritePackedMsg, end) &&
-		push8(value->nrOfLayers, ppWritePackedMsg, end) &&
-		
-		push8(value->transmissionScheme, ppWritePackedMsg, end) &&
-		push8(value->refPoint, ppWritePackedMsg, end) &&
-		push16(value->dlDmrsSymbPos, ppWritePackedMsg, end) &&
-		push8(value->dmrsConfigType, ppWritePackedMsg, end) &&
-		
-		push16(value->dlDmrsScramblingId, ppWritePackedMsg, end) &&
-		push8(value->SCID, ppWritePackedMsg, end) &&
-		push8(value->numDmrsCdmGrpsNoData, ppWritePackedMsg, end) &&
-		push16(value->dmrsPorts, ppWritePackedMsg, end) &&
-
-		push8(value->resourceAlloc, ppWritePackedMsg, end) &&
-		push16(value->rbStart, ppWritePackedMsg, end) &&
-		push16(value->rbSize, ppWritePackedMsg, end) &&
-
-		push8(value->VRBtoPRBMapping, ppWritePackedMsg, end) &&
-		push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
-		push8(value->NrOfSymbols, ppWritePackedMsg, end) &&
-		push8(value->PTRSPortIndex, ppWritePackedMsg, end) &&
-
-		push8(value->PTRSTimeDensity, ppWritePackedMsg, end) &&
-		push8(value->PTRSFreqDensity, ppWritePackedMsg, end) &&
-		push8(value->PTRSReOffset, ppWritePackedMsg, end) 	
-	);
-
-}
-
-
-static uint8_t pack_dl_tti_ssb_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nr_dl_tti_ssb_pdu_rel15_t* value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t*)tlv;
-
-	return(
-		push16(value->PhysCellId, ppWritePackedMsg, end) &&
-		push8(value->BetaPss, ppWritePackedMsg, end) &&
-		push8(value->SsbBlockIndex, ppWritePackedMsg, end) &&
-		push8(value->SsbSubcarrierOffset, ppWritePackedMsg, end) &&
-		push16(value->ssbOffsetPointA, ppWritePackedMsg, end) &&
-		push8(value->bchPayloadFlag, ppWritePackedMsg, end) &&
-		push32(value->bchPayload, ppWritePackedMsg, end)	
-		// TODO: pack precoding_and_beamforming too
-	);
-
-}
-
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dci_dl_pdu_rel13_t* value = (nfapi_dl_config_dci_dl_pdu_rel13_t*)tlv;
-
-	return( push8(value->laa_end_partial_sf_flag, ppWritePackedMsg, end) &&
-			push8(value->laa_end_partial_sf_configuration, ppWritePackedMsg, end) &&
-			push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
-			push8(value->codebook_size_determination, ppWritePackedMsg, end) &&
-			push8(value->drms_table_flag, ppWritePackedMsg, end) &&
-			push8(value->tpm_struct_flag, ppWritePackedMsg, end) &&
-			(value->tpm_struct_flag == 1 ? pack_tpm_value(&(value->tpm), ppWritePackedMsg, end) : 1));
-}
-
-static uint8_t pack_dl_config_bch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_bch_pdu_rel8_t* value = (nfapi_dl_config_bch_pdu_rel8_t*)tlv;
-	
-        //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s()\n", __FUNCTION__);
-
-	return( push16(value->length, ppWritePackedMsg, end) &&
-			push16(value->pdu_index, ppWritePackedMsg, end) &&
-			push16(value->transmission_power, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_mch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_mch_pdu_rel8_t* value = (nfapi_dl_config_mch_pdu_rel8_t*)tlv;
-
-	return ( push16(value->length, ppWritePackedMsg, end) &&
-			 push16(value->pdu_index, ppWritePackedMsg, end) &&
-			 push16(value->rnti, ppWritePackedMsg, end) &&
-			 push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
-			 push32(value->resource_block_coding, ppWritePackedMsg, end) &&
-			 push8(value->modulation, ppWritePackedMsg, end) &&
-			 push16(value->transmission_power, ppWritePackedMsg, end) &&
-			 push16(value->mbsfn_area_id, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_bf_vector_info(void* elem, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_bf_vector_t* bf = (nfapi_bf_vector_t*)elem;
-
-	return ( push8(bf->subband_index, ppWritePackedMsg, end) &&
-			 push8(bf->num_antennas, ppWritePackedMsg, end) &&
-			 pusharray16(bf->bf_value, NFAPI_MAX_NUM_ANTENNAS, bf->num_antennas, ppWritePackedMsg, end));
-
-	
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dlsch_pdu_rel8_t* value = (nfapi_dl_config_dlsch_pdu_rel8_t*)tlv;
-
-	return ( push16(value->length, ppWritePackedMsg, end) && 
-			 push16(value->pdu_index, ppWritePackedMsg, end) &&
-			 push16(value->rnti, ppWritePackedMsg, end) &&
-			 push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
-			 push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
-			 push32(value->resource_block_coding, ppWritePackedMsg, end) &&
-			 push8(value->modulation, ppWritePackedMsg, end) &&
-			 push8(value->redundancy_version, ppWritePackedMsg, end) &&
-			 push8(value->transport_blocks, ppWritePackedMsg, end) &&
-			 push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
-			 push8(value->transmission_scheme, ppWritePackedMsg, end) &&
-			 push8(value->number_of_layers, ppWritePackedMsg, end) &&
-			 push8(value->number_of_subbands, ppWritePackedMsg, end) &&
-			 pusharray8(value->codebook_index, NFAPI_MAX_NUM_SUBBANDS, value->number_of_subbands, ppWritePackedMsg, end) &&
-			 push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
-			 push8(value->pa, ppWritePackedMsg, end) &&
-			 push8(value->delta_power_offset_index, ppWritePackedMsg, end) &&
-			 push8(value->ngap, ppWritePackedMsg, end) &&
-			 push8(value->nprb, ppWritePackedMsg, end) &&
-			 push8(value->transmission_mode, ppWritePackedMsg, end) &&
-			 push8(value->num_bf_prb_per_subband, ppWritePackedMsg, end) &&
-			 push8(value->num_bf_vector, ppWritePackedMsg, end) &&
-			 packarray(value->bf_vector, sizeof(nfapi_bf_vector_t), NFAPI_MAX_BF_VECTORS, value->num_bf_vector, ppWritePackedMsg, end, &pack_bf_vector_info));
-
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dlsch_pdu_rel9_t* value = (nfapi_dl_config_dlsch_pdu_rel9_t*)tlv;
-	return ( push8(value->nscid, ppWritePackedMsg, end) );
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dlsch_pdu_rel10_t* value = (nfapi_dl_config_dlsch_pdu_rel10_t*)tlv;
-	
-	return ( push8(value->csi_rs_flag, ppWritePackedMsg, end) &&
-			 push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
-			 push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
-			 push8(value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
-			 pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
-			 push8(value->pdsch_start, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dlsch_pdu_rel11_t* value = (nfapi_dl_config_dlsch_pdu_rel11_t*)tlv;
-	
-	return( push8(value->drms_config_flag, ppWritePackedMsg, end) &&
-			push16(value->drms_scrambling, ppWritePackedMsg, end) &&
-			push8(value->csi_config_flag, ppWritePackedMsg, end) &&
-			push16(value->csi_scrambling, ppWritePackedMsg, end) &&
-			push8(value->pdsch_re_mapping_flag, ppWritePackedMsg, end) &&
-			push8(value->pdsch_re_mapping_atenna_ports, ppWritePackedMsg, end) &&
-			push8(value->pdsch_re_mapping_freq_shift, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel12_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dlsch_pdu_rel12_t* value = (nfapi_dl_config_dlsch_pdu_rel12_t*)tlv;
-
-	return( push8(value->altcqi_table_r12, ppWritePackedMsg, end) &&
-			push8(value->maxlayers, ppWritePackedMsg, end) &&
-			push8(value->n_dl_harq, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dlsch_pdu_rel13_t* value = (nfapi_dl_config_dlsch_pdu_rel13_t*)tlv;
-	
-	return( push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
-			push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
-			push8(value->ue_type, ppWritePackedMsg, end) &&
-			push8(value->pdsch_payload_type, ppWritePackedMsg, end) &&
-			push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
-			push8(value->drms_table_flag, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_pch_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_pch_pdu_rel8_t* value = (nfapi_dl_config_pch_pdu_rel8_t*)tlv;
-	
-	return( push16(value->length, ppWritePackedMsg, end) &&
-			push16(value->pdu_index, ppWritePackedMsg, end) &&
-			push16(value->p_rnti, ppWritePackedMsg, end) &&
-			push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
-			push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
-			push32(value->resource_block_coding, ppWritePackedMsg, end) &&
-			push8(value->mcs, ppWritePackedMsg, end) &&
-			push8(value->redundancy_version, ppWritePackedMsg, end) &&
-			push8(value->number_of_transport_blocks, ppWritePackedMsg, end) &&
-			push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
-			push8(value->transmission_scheme, ppWritePackedMsg, end) &&
-			push8(value->number_of_layers, ppWritePackedMsg, end) &&
-			push8(value->codebook_index, ppWritePackedMsg, end) &&
-			push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
-			push8(value->pa, ppWritePackedMsg, end) &&
-			push16(value->transmission_power, ppWritePackedMsg, end) &&
-			push8(value->nprb, ppWritePackedMsg, end) &&
-			push8(value->ngap, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_pch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_pch_pdu_rel13_t* value = (nfapi_dl_config_pch_pdu_rel13_t*)tlv;
-
-	return ( push8(value->ue_mode, ppWritePackedMsg, end) &&
-		 	 push16(value->initial_transmission_sf_io, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_prs_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_prs_pdu_rel9_t* value = (nfapi_dl_config_prs_pdu_rel9_t*)tlv;
-
-	return( push16(value->transmission_power, ppWritePackedMsg, end) &&
-			push8(value->prs_bandwidth, ppWritePackedMsg, end) &&
-			push8(value->prs_cyclic_prefix_type, ppWritePackedMsg, end) &&
-			push8(value->prs_muting, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_csi_rs_pdu_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_csi_rs_pdu_rel10_t* value = (nfapi_dl_config_csi_rs_pdu_rel10_t*)tlv;
-
-	return( push8(value->csi_rs_antenna_port_count_r10, ppWritePackedMsg, end) &&
-			push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
-			push16(value->transmission_power, ppWritePackedMsg, end) &&
-			push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
-			push8(value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end) &&
-			pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_csi_rs_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_csi_rs_pdu_rel13_t* value = (nfapi_dl_config_csi_rs_pdu_rel13_t*)tlv;
-
-	if(!(push8(value->csi_rs_class, ppWritePackedMsg, end) &&
-		 	 push8(value->cdm_type, ppWritePackedMsg, end) &&
-		 	 push8(value->num_bf_vector, ppWritePackedMsg, end)))
-	{
-		return 0;
-	}
-
-	uint16_t i; 
-	for(i = 0; i < value->num_bf_vector; ++i)
-	{
-		if(!(push8(value->bf_vector[i].csi_rs_resource_index, ppWritePackedMsg, end) &&
-		     pusharray16(value->bf_vector[i].bf_value, NFAPI_MAX_ANTENNA_PORT_COUNT, NFAPI_MAX_ANTENNA_PORT_COUNT, ppWritePackedMsg, end)))
-			return 0;
-	}
-
-	return 1;
-}
-static uint8_t pack_bf_vector(nfapi_bf_vector_t* vector, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return ( push8(vector->subband_index, ppWritePackedMsg, end) &&
-			 push8(vector->num_antennas, ppWritePackedMsg, end) &&
-		 	 pusharray16(vector->bf_value, NFAPI_MAX_NUM_ANTENNAS, vector->num_antennas, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_epdcch_parameters_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_epdcch_parameters_rel11_t* value = (nfapi_dl_config_epdcch_parameters_rel11_t*)tlv;
-
-	return ( push8(value->epdcch_resource_assignment_flag, ppWritePackedMsg, end) &&
-			push16(value->epdcch_id, ppWritePackedMsg, end) &&
-			push8(value->epdcch_start_symbol, ppWritePackedMsg, end) &&
-			push8(value->epdcch_num_prb, ppWritePackedMsg, end) &&
-			pusharray8(value->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, value->epdcch_num_prb, ppWritePackedMsg, end) &&
-			pack_bf_vector(&value->bf_vector, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_epdcch_parameters_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_epdcch_parameters_rel13_t* value = (nfapi_dl_config_epdcch_parameters_rel13_t*)tlv;
-	
-	return (push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
-		 	push8(value->initial_lbt_sf, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_mpdcch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_mpdcch_pdu_rel13_t* value = (nfapi_dl_config_mpdcch_pdu_rel13_t*)tlv;
-	
-	return ( push8(value->mpdcch_narrow_band, ppWritePackedMsg, end) &&
-			 push8(value->number_of_prb_pairs, ppWritePackedMsg, end) &&
-			 push8(value->resource_block_assignment, ppWritePackedMsg, end) &&
-			 push8(value->mpdcch_tansmission_type, ppWritePackedMsg, end) &&
-			 push8(value->start_symbol, ppWritePackedMsg, end) &&
-			 push8(value->ecce_index, ppWritePackedMsg, end) &&
-			 push8(value->aggregation_level, ppWritePackedMsg, end) &&
-			 push8(value->rnti_type, ppWritePackedMsg, end) &&
-			 push16(value->rnti, ppWritePackedMsg, end) &&
-			 push8(value->ce_mode, ppWritePackedMsg, end) &&
-			 push16(value->drms_scrambling_init, ppWritePackedMsg, end) &&
-			 push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
-			 push16(value->transmission_power, ppWritePackedMsg, end) &&
-			 push8(value->dci_format, ppWritePackedMsg, end) &&
-			 push16(value->resource_block_coding, ppWritePackedMsg, end) &&
-			 push8(value->mcs, ppWritePackedMsg, end) &&
-			 push8(value->pdsch_reptition_levels, ppWritePackedMsg, end) &&
-			 push8(value->redundancy_version, ppWritePackedMsg, end) &&
-			 push8(value->new_data_indicator, ppWritePackedMsg, end) &&
-			 push8(value->harq_process, ppWritePackedMsg, end) &&
-			 push8(value->tpmi_length, ppWritePackedMsg, end) &&
-			 push8(value->tpmi, ppWritePackedMsg, end) &&
-			 push8(value->pmi_flag, ppWritePackedMsg, end) &&
-			 push8(value->pmi, ppWritePackedMsg, end) &&
-			 push8(value->harq_resource_offset, ppWritePackedMsg, end) &&
-			 push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
-			 push8(value->tpc, ppWritePackedMsg, end) &&
-			 push8(value->downlink_assignment_index_length, ppWritePackedMsg, end) &&
-			 push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
-			 push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
-			 push8(value->preamble_index, ppWritePackedMsg, end) &&
-			 push8(value->prach_mask_index, ppWritePackedMsg, end) &&
-			 push8(value->starting_ce_level, ppWritePackedMsg, end) &&
-			 push8(value->srs_request, ppWritePackedMsg, end) &&
-			 push8(value->antenna_ports_and_scrambling_identity_flag, ppWritePackedMsg, end) &&
-			 push8(value->antenna_ports_and_scrambling_identity, ppWritePackedMsg, end) &&
-			 push8(value->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
-			 push8(value->paging_direct_indication_differentiation_flag, ppWritePackedMsg, end) &&
-			 push8(value->direct_indication, ppWritePackedMsg, end) &&
-			 push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) &&
-			 push8(value->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
-			 pusharray16(value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_dl_config_nbch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_nbch_pdu_rel13_t* value = (nfapi_dl_config_nbch_pdu_rel13_t*)tlv;
-	
-	return (push16(value->length, ppWritePackedMsg, end) &&
-		 	push16(value->pdu_index, ppWritePackedMsg, end) &&
-		 	push16(value->transmission_power, ppWritePackedMsg, end) &&
-		 	push16(value->hyper_sfn_2_lsbs, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_dl_config_npdcch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_npdcch_pdu_rel13_t* value = (nfapi_dl_config_npdcch_pdu_rel13_t*)tlv;
-	
-	return (push16(value->length, ppWritePackedMsg, end) &&
-			push16(value->pdu_index, ppWritePackedMsg, end) &&
-			push8(value->ncce_index, ppWritePackedMsg, end) &&
-			push8(value->aggregation_level, ppWritePackedMsg, end) &&
-			push8(value->start_symbol, ppWritePackedMsg, end) &&
-			push8(value->rnti_type, ppWritePackedMsg, end) &&
-			push16(value->rnti, ppWritePackedMsg, end) &&
-			push8(value->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
-			push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
-			push8(value->dci_format, ppWritePackedMsg, end) &&
-			push8(value->scheduling_delay, ppWritePackedMsg, end) &&
-			push8(value->resource_assignment, ppWritePackedMsg, end) &&
-			push8(value->repetition_number, ppWritePackedMsg, end) &&
-			push8(value->mcs, ppWritePackedMsg, end) &&
-			push8(value->new_data_indicator, ppWritePackedMsg, end) &&
-			push8(value->harq_ack_resource, ppWritePackedMsg, end) &&
-			push8(value->npdcch_order_indication, ppWritePackedMsg, end) &&
-			push8(value->starting_number_of_nprach_repetitions, ppWritePackedMsg, end) &&
-			push8(value->subcarrier_indication_of_nprach, ppWritePackedMsg, end) &&
-			push8(value->paging_direct_indication_differentation_flag, ppWritePackedMsg, end) &&
-			push8(value->direct_indication, ppWritePackedMsg, end) &&
-			push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
-			push8(value->total_dci_length_including_padding, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_ndlsch_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_ndlsch_pdu_rel13_t* value = (nfapi_dl_config_ndlsch_pdu_rel13_t*)tlv;
-	
-	return (push16(value->length, ppWritePackedMsg, end) &&
-			push16(value->pdu_index, ppWritePackedMsg, end) &&
-			push8(value->start_symbol, ppWritePackedMsg, end) &&
-			push8(value->rnti_type, ppWritePackedMsg, end) &&
-			push16(value->rnti, ppWritePackedMsg, end) &&
-			push16(value->resource_assignment, ppWritePackedMsg, end) &&
-			push16(value->repetition_number, ppWritePackedMsg, end) &&
-			push8(value->modulation, ppWritePackedMsg, end) &&
-			push8(value->number_of_subframes_for_resource_assignment, ppWritePackedMsg, end) &&
-			push8(value->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
-			push16(value->sf_idx, ppWritePackedMsg, end) &&
-			push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_dl_tti_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nr_dl_tti_request_pdu_t* value = (nfapi_nr_dl_tti_request_pdu_t*)tlv;
-
-	if(!(push16(value->PDUSize, ppWritePackedMsg, end) &&
-	 	 push16(value->PDUType, ppWritePackedMsg, end) ))
-		  return 0;
-
-
-	// first match the pdu type, then call the respective function
-	switch(value->PDUType)
-	{
-		case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
-		{
-			if(!(pack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppWritePackedMsg,end)))
-				return 0;
-		}
-		break;
-
-		case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
-		{
-			if(!(pack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppWritePackedMsg,end)))
-				return 0;
-		}
-		break;
-		case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
-		{
-			if(!(pack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppWritePackedMsg,end)))
-				return 0;
-		}
-		break;
-		case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
-		{
-			if(!(pack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppWritePackedMsg,end)))
-				return 0;
-		}
-		break;
-
-		default:
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
-		}
-		break;
-	}
-
-	return 1;
-}
-
-static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_request_body_t* value = (nfapi_dl_config_request_body_t*)tlv;
-
-        //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci:%u pdu:%u pdsch:%u rnti:%u pcfich:%u\n", __FUNCTION__, value->number_dci, value->number_pdu, value->number_pdsch_rnti, value->transmission_power_pcfich);
-
-	if(!(push8(value->number_pdcch_ofdm_symbols, ppWritePackedMsg, end) &&
-		 push8(value->number_dci, ppWritePackedMsg, end) &&
-		 push16(value->number_pdu, ppWritePackedMsg, end) &&
-		 push8(value->number_pdsch_rnti, ppWritePackedMsg, end) &&
-		 push16(value->transmission_power_pcfich, ppWritePackedMsg, end)))
-	{
-		return 0;
-	}
-
-	uint16_t i = 0;
-	uint16_t total_number_of_pdus = value->number_pdu;
-	for(; i < total_number_of_pdus; ++i)
-	{
-		nfapi_dl_config_request_pdu_t* pdu = &(value->dl_config_pdu_list[i]);
-
-		if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
-			return 0;
-
-		// Put a 0 size in and then determine the size after the pdu 
-		// has been writen and write the calculated size
-		uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg;
-		pdu->pdu_size = 0;
-		if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
-			return 0;
-
-		switch(pdu->pdu_type)
-		{
-			case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE:
-				{
-                                  //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE\n", __FUNCTION__);
-
-					if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) &&
-					pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) &&
-					pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) &&
-					pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
-					pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
-					pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value)))
-					{
-						return 0;
-					}
-				}
-				break;
-			case NFAPI_DL_CONFIG_BCH_PDU_TYPE:
-				{
-                                  //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_BCH_PDU_TYPE\n", __FUNCTION__);
-
-					if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_bch_pdu_rel8_value)))
-						return 0;
-				}
-				break;
-			case NFAPI_DL_CONFIG_MCH_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_mch_pdu_rel8_value)))
-						return 0;
-				}
-				break;
-			case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel8_value) &&
-					pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel9_value) &&
-					pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel10_value) &&
-					pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel11_value) &&
-					pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel12_value) &&
-					pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel13_value)))
-						return 0;
-				}
-				break;
-			case NFAPI_DL_CONFIG_PCH_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel8_value) &&
-					pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel13_value)))
-						return 0;
-				}
-				break;
-			case NFAPI_DL_CONFIG_PRS_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_prs_pdu_rel9_value)))
-						return 0;
-				}
-				break;
-			case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, ppWritePackedMsg, end,  &pack_dl_config_csi_rs_pdu_rel10_value) &&
-						 pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, ppWritePackedMsg, end,  &pack_dl_config_csi_rs_pdu_rel13_value)))
-						return 0;
-				}
-				break;
-			case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) &&
-						 pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) &&
-						 pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) &&
-						 pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
-						 pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
-						 pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value) &&
-						 pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel11_value) &
-						 pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel13_value)))
-						return 0;
-				}
-				break;
-			case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_mpdcch_pdu_rel13_value)))
-						return 0;
-				}
-				break;
-			case NFAPI_DL_CONFIG_NBCH_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_nbch_pdu_rel13_value)))
-						return 0;
-				}
-				break;
-			case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_npdcch_pdu_rel13_value)))
-						return 0;
-				}
-				break;
-			case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_ndlsch_pdu_rel13_value)))
-						return 0;
-				}
-				break;
-			default:
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
-				}
-				break;
-		};
-
-		// add 1 for the pdu_type. The delta will include the pdu_size
-		pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
-		push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-	}
-
-	return 1;
-}
-
-
-static uint8_t pack_dl_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t*)msg;
-
-	if (!(push16(pNfapiMsg->SFN , ppWritePackedMsg, end) &&
-		push16(pNfapiMsg->Slot , ppWritePackedMsg, end) &&
-		push8(pNfapiMsg->dl_tti_request_body.nGroup , ppWritePackedMsg, end) &&
-		push8(pNfapiMsg->dl_tti_request_body.nPDUs , ppWritePackedMsg, end) &&
-		pusharray8(pNfapiMsg->dl_tti_request_body.nUe ,256,pNfapiMsg->dl_tti_request_body.nGroup, ppWritePackedMsg, end)
-		//pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
-		))
-			return 0;
-
-	int arr[12];
-	for(int i=0;i<pNfapiMsg->dl_tti_request_body.nGroup;i++)
-	{
-		for(int j=0;j<pNfapiMsg->dl_tti_request_body.nUe[i];j++)
-		{
-			arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
-		}
-		if(!(pusharrays32(arr,12,pNfapiMsg->dl_tti_request_body.nUe[i],ppWritePackedMsg, end)))
-		return 0;
-	}
-
-	for(int i=0;i<pNfapiMsg->dl_tti_request_body.nPDUs;i++)	
-	{
-		if(!pack_dl_tti_request_body_value(&pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i],ppWritePackedMsg,end))
-		return 0;
-	}
-
-return 1;
-}
-
-
-static uint8_t pack_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t*)msg;
-	
-	//return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-			 //pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value) &&
-			 //pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-        { 
-          uint8_t x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
-          uint8_t y = pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value);
-          uint8_t z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-
-          if (!x || !y || !z)
-          {
-            NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST x:%u y:%u z:%u \n", __FUNCTION__,x,y,z);
-          }
-
-          return x && y && z;
-        }
-}
-
-
-
-
-static uint8_t pack_ul_config_request_ulsch_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t * end)
-{
-	nfapi_ul_config_ulsch_pdu_rel8_t* ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t*)tlv;
-	
-	return( push32(ulsch_pdu_rel8->handle, ppWritePackedMsg, end) &&
-			push16(ulsch_pdu_rel8->size, ppWritePackedMsg, end) &&
-			push16(ulsch_pdu_rel8->rnti, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel8->modulation_type, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel8->new_data_indication, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel8->redundancy_version, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel8->harq_process_number, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel8->ul_tx_mode, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel8->current_tx_nb, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel8->n_srs, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ulsch_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ulsch_pdu_rel10_t* ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t*)tlv;
-	
-	return (push8(ulsch_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
-			push32(ulsch_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel10->transport_blocks, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel10->transmission_scheme, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel10->number_of_layers, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel10->codebook_index, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel10->disable_sequence_hopping_flag, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ulsch_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ulsch_pdu_rel11_t* ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t*)tlv;
-	
-	return (push8(ulsch_pdu_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
-			push16(ulsch_pdu_rel11->npusch_identity, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel11->dmrs_config_flag, ppWritePackedMsg, end) &&
-			push16(ulsch_pdu_rel11->ndmrs_csh_identity, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ulsch_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ulsch_pdu_rel13_t* ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t*)tlv;
-
-	return (push8(ulsch_pdu_rel13->ue_type, ppWritePackedMsg, end) &&
-			push16(ulsch_pdu_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
-			push16(ulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
-			push16(ulsch_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
-			push8(ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, ppWritePackedMsg, end));
-}
-
-//Pack fns for ul_tti PDUS
-
-
-static uint8_t pack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t* prach_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return(
-		push16(prach_pdu->phys_cell_id, ppWritePackedMsg, end) &&
-		push8(prach_pdu->num_prach_ocas, ppWritePackedMsg, end) &&
-		push8(prach_pdu->prach_format, ppWritePackedMsg, end) &&
-		push8(prach_pdu->num_ra, ppWritePackedMsg, end) &&
-		push8(prach_pdu->prach_start_symbol, ppWritePackedMsg, end) &&
-		push16(prach_pdu->num_cs, ppWritePackedMsg, end)
-		// TODO: ignoring beamforming tlv for now
-	);
-	
-}
-
-static uint8_t pack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t* pucch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return(
-		push16(pucch_pdu->rnti, ppWritePackedMsg, end) &&
-		push32(pucch_pdu->handle, ppWritePackedMsg, end) &&
-		push16(pucch_pdu->bwp_size, ppWritePackedMsg, end) &&
-		push16(pucch_pdu->bwp_start, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->format_type, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->multi_slot_tx_indicator, ppWritePackedMsg, end) &&
-		push16(pucch_pdu->prb_start, ppWritePackedMsg, end) &&
-		push16(pucch_pdu->prb_size, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->nr_of_symbols, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->freq_hop_flag, ppWritePackedMsg, end) &&
-		push16(pucch_pdu->second_hop_prb, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->group_hop_flag, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->sequence_hop_flag, ppWritePackedMsg, end) &&
-		push16(pucch_pdu->hopping_id, ppWritePackedMsg, end) &&
-		push16(pucch_pdu->initial_cyclic_shift, ppWritePackedMsg, end) &&
-		push16(pucch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->time_domain_occ_idx, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->pre_dft_occ_idx, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->pre_dft_occ_len, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->add_dmrs_flag, ppWritePackedMsg, end) &&
-		push16(pucch_pdu->dmrs_scrambling_id, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->dmrs_cyclic_shift, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->sr_flag, ppWritePackedMsg, end) &&
-		push8(pucch_pdu->bit_len_harq, ppWritePackedMsg, end) &&
-		push16(pucch_pdu->bit_len_csi_part1, ppWritePackedMsg, end) &&
-		push16(pucch_pdu->bit_len_csi_part2, ppWritePackedMsg, end) 
-		// TODO: ignoring beamforming tlv for now
-	);
-	
-}
-
-
-static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t* pusch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
-{ 
-	
-	if (!(
-	push16(pusch_pdu->pdu_bit_map, ppWritePackedMsg, end) &&
-	push16(pusch_pdu->rnti, ppWritePackedMsg, end) &&
-	push32(pusch_pdu->handle, ppWritePackedMsg, end) &&
-	push16(pusch_pdu->bwp_size, ppWritePackedMsg, end) &&
-	push16(pusch_pdu->bwp_start, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
-	push16(pusch_pdu->target_code_rate, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->qam_mod_order, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->mcs_index, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->mcs_table, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->transform_precoding, ppWritePackedMsg, end) &&
-	push16(pusch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->nrOfLayers, ppWritePackedMsg, end) &&
-	push16(pusch_pdu->ul_dmrs_symb_pos, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->dmrs_config_type, ppWritePackedMsg, end) &&
-	push16(pusch_pdu->ul_dmrs_scrambling_id, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->scid, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->num_dmrs_cdm_grps_no_data, ppWritePackedMsg, end) &&
-	push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->resource_alloc, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->resource_alloc,ppWritePackedMsg, end) &&
-	push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
-	push16(pusch_pdu->rb_start, ppWritePackedMsg, end) &&
-	push16(pusch_pdu->rb_size, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->vrb_to_prb_mapping, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->frequency_hopping, ppWritePackedMsg, end) &&
-	push16(pusch_pdu->tx_direct_current_location, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->uplink_frequency_shift_7p5khz, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
-	push8(pusch_pdu->nr_of_symbols, ppWritePackedMsg, end) 
-	// TODO: ignoring beamforming tlv for now 
-	))
-		return 0;
-
-
-	//Pack Optional Data only included if indicated in pduBitmap
-	switch(pusch_pdu->pdu_bit_map){
-		case PUSCH_PDU_BITMAP_PUSCH_DATA:
-		{
-			// pack optional TLVs
-			return(
-				push8(pusch_pdu->pusch_data.rv_index, ppWritePackedMsg, end) &&
-				push8(pusch_pdu->pusch_data.harq_process_id, ppWritePackedMsg, end) &&
-				push32(pusch_pdu->pusch_data.tb_size, ppWritePackedMsg, end) &&
-				push16(pusch_pdu->pusch_data.num_cb, ppWritePackedMsg, end) &&
-				pusharray8(pusch_pdu->pusch_data.cb_present_and_position,1,1,ppWritePackedMsg, end)
-			);
-		}
-		break;
-
-		case PUSCH_PDU_BITMAP_PUSCH_UCI:
-		{
-			return(
-				push16(pusch_pdu->pusch_uci.harq_ack_bit_length, ppWritePackedMsg, end) &&
-				push16(pusch_pdu->pusch_uci.csi_part1_bit_length, ppWritePackedMsg, end) &&
-				push16(pusch_pdu->pusch_uci.csi_part2_bit_length, ppWritePackedMsg, end) &&
-				push8(pusch_pdu->pusch_uci.alpha_scaling, ppWritePackedMsg, end) &&
-				push8(pusch_pdu->pusch_uci.beta_offset_harq_ack, ppWritePackedMsg, end) &&
-				push8(pusch_pdu->pusch_uci.beta_offset_csi1, ppWritePackedMsg, end) &&
-				push8(pusch_pdu->pusch_uci.beta_offset_csi2, ppWritePackedMsg, end)
-			);
-		}
-		break;
-
-		case PUSCH_PDU_BITMAP_PUSCH_PTRS:
-		{
-			return(
-				push8(pusch_pdu->pusch_ptrs.num_ptrs_ports, ppWritePackedMsg, end) &&
-				push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, ppWritePackedMsg, end) &&
-				push16(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, ppWritePackedMsg, end) &&
-				push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, ppWritePackedMsg, end) &&
-				push8(pusch_pdu->pusch_ptrs.ptrs_time_density, ppWritePackedMsg, end) &&
-				push8(pusch_pdu->pusch_ptrs.ptrs_freq_density, ppWritePackedMsg, end) &&
-				push8(pusch_pdu->pusch_ptrs.ul_ptrs_power, ppWritePackedMsg, end)
-			);
-		}
-		break;
-
-		case PUSCH_PDU_BITMAP_DFTS_OFDM:
-		{
-			return(
-				push8(pusch_pdu->dfts_ofdm.low_papr_group_number, ppWritePackedMsg, end) &&
-				push16(pusch_pdu->dfts_ofdm.low_papr_sequence_number, ppWritePackedMsg, end) &&
-				push8(pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, ppWritePackedMsg, end) &&
-				push8(pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, ppWritePackedMsg, end)
-			);
-		}
-		break;
-
-		default:
-		{
-			NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
-		}
-	}
-
-	return 1;
-}
-
-static uint8_t pack_ul_tti_request_srs_pdu(nfapi_nr_srs_pdu_t* srs_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return(
-		push16(srs_pdu->rnti, ppWritePackedMsg, end) &&
-		push32(srs_pdu->handle, ppWritePackedMsg, end) &&
-		push16(srs_pdu->bwp_size, ppWritePackedMsg, end) &&
-		push16(srs_pdu->bwp_start, ppWritePackedMsg, end) &&
-		push8(srs_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
-		push8(srs_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
-		push8(srs_pdu->num_ant_ports, ppWritePackedMsg, end) &&
-		push8(srs_pdu->num_symbols, ppWritePackedMsg, end) &&
-		push8(srs_pdu->num_repetitions, ppWritePackedMsg, end) &&
-		push8(srs_pdu->time_start_position, ppWritePackedMsg, end) &&
-		push8(srs_pdu->config_index, ppWritePackedMsg, end) &&
-		push16(srs_pdu->sequence_id, ppWritePackedMsg, end) &&
-		push8(srs_pdu->bandwidth_index, ppWritePackedMsg, end) &&
-		push8(srs_pdu->comb_size, ppWritePackedMsg, end) &&
-		push8(srs_pdu->comb_offset, ppWritePackedMsg, end) &&
-		push8(srs_pdu->cyclic_shift, ppWritePackedMsg, end) &&
-		push8(srs_pdu->frequency_position, ppWritePackedMsg, end) &&
-		push8(srs_pdu->frequency_shift, ppWritePackedMsg, end) &&
-		push8(srs_pdu->frequency_hopping, ppWritePackedMsg, end) &&
-		push8(srs_pdu->group_or_sequence_hopping, ppWritePackedMsg, end) &&
-		push8(srs_pdu->resource_type, ppWritePackedMsg, end) &&
-		push16(srs_pdu->t_srs, ppWritePackedMsg, end) &&
-		push16(srs_pdu->t_offset, ppWritePackedMsg, end) 
-
-		// TODO: ignoring beamforming tlv for now
-	);
-	
-}
-
-static uint8_t pack_ul_config_request_ulsch_pdu(nfapi_ul_config_ulsch_pdu* ulsch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &ulsch_pdu->ulsch_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel8_value) &&
-			pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &ulsch_pdu->ulsch_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel10_value) &&
-			pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &ulsch_pdu->ulsch_pdu_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel11_value) &&
-			pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &ulsch_pdu->ulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_cqi_ri_information_rel8_t* cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t*)tlv;
-
-	return ( push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, ppWritePackedMsg, end) &&
-			 push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, ppWritePackedMsg, end) &&
-			 push8(cqi_ri_info_rel8->ri_size, ppWritePackedMsg, end) &&
-			 push8(cqi_ri_info_rel8->delta_offset_cqi, ppWritePackedMsg, end) &&
-			 push8(cqi_ri_info_rel8->delta_offset_ri, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_cqi_ri_information_rel9_t* cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t*)tlv;
-
-	if(!(push8(cqi_ri_info_rel9->report_type, ppWritePackedMsg, end) &&
-		 push8(cqi_ri_info_rel9->delta_offset_cqi, ppWritePackedMsg, end) &&
-		 push8(cqi_ri_info_rel9->delta_offset_ri, ppWritePackedMsg, end)))
-	{
-		return 0;
-	}
-
-	switch(cqi_ri_info_rel9->report_type)
-	{
-		case NFAPI_CSI_REPORT_TYPE_PERIODIC:
-			{
-				if(!(push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, ppWritePackedMsg, end) &&
-					 push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, ppWritePackedMsg, end)))
-				{
-					return 0;
-				}
-			}
-			break;
-		case NFAPI_CSI_REPORT_TYPE_APERIODIC:
-			{
-				if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, ppWritePackedMsg, end) == 0)
-					return 0;
-
-				uint8_t i;
-				for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i)
-				{
-					if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, ppWritePackedMsg, end) == 0)
-						return 0;
-
-                                        uint8_t j;
-                                        for(j = 0; j < 8; ++j)
-					{
-                                              if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], ppWritePackedMsg, end) == 0)
-							return 0;
-					}
-				}
-			}
-			break;
-		default:
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
-			}
-			break;
-	};
-
-	return 1;
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_cqi_ri_information_rel13_t* cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t*)tlv;
-
-	switch(cqi_ri_info_rel13->report_type)
-	{
-		case NFAPI_CSI_REPORT_TYPE_PERIODIC:
-			{
-				if(push16(cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, ppWritePackedMsg, end) == 0)
-					return 0;
-			}
-			break;
-		case NFAPI_CSI_REPORT_TYPE_APERIODIC:
-			{
-				// No parameters
-			}
-			break;
-		default:
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel13->report_type );
-			}
-			break;
-	};
-
-	return 1;
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_information(nfapi_ul_config_cqi_ri_information* cqi_ri_info, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return (pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &cqi_ri_info->cqi_ri_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel8_value) &&
-			pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &cqi_ri_info->cqi_ri_information_rel9, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel9_value) &&
-			pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &cqi_ri_info->cqi_ri_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel13_value));
-
-}
-
-static uint8_t pack_ul_config_request_init_tx_params_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_initial_transmission_parameters_rel8_t* init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t*)tlv;
-	
-	return (push8(init_tx_params_rel8->n_srs_initial, ppWritePackedMsg, end) &&
-		 	push8(init_tx_params_rel8->initial_number_of_resource_blocks, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_initial_transmission_parameters(nfapi_ul_config_initial_transmission_parameters* init_tx_params, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return pack_tlv(NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &init_tx_params->initial_transmission_parameters_rel8, ppWritePackedMsg, end, &pack_ul_config_request_init_tx_params_rel8_value);
-}
-
-static uint8_t pack_ul_config_request_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ulsch_harq_information_rel10_t* harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t*)tlv;
-	
-	return (push8(harq_info_rel10->harq_size, ppWritePackedMsg, end) &&
-			push8(harq_info_rel10->delta_offset_harq, ppWritePackedMsg, end) &&
-			push8(harq_info_rel10->ack_nack_mode, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ulsch_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t*)tlv;
-	
-	return (push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
-		 	push8(harq_info_rel13->delta_offset_harq_2, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ulsch_harq_information(nfapi_ul_config_ulsch_harq_information* harq_info, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &harq_info->harq_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel10_value) &&
-			 pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_ue_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ue_information_rel8_t* ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t*)tlv;
-	
-	return ( push32(ue_info_rel8->handle, ppWritePackedMsg, end) &&
-		 	 push16(ue_info_rel8->rnti, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ue_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ue_information_rel11_t* ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t*)tlv;
-
-	return ( push8(ue_info_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
-		 	 push16(ue_info_rel11->npusch_identity, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ue_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ue_information_rel13_t* ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t*)tlv;
-
-	return ( push8(ue_info_rel13->ue_type, ppWritePackedMsg, end) &&
-			 push8(ue_info_rel13->empty_symbols, ppWritePackedMsg, end) &&
-			 push16(ue_info_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
-			 push16(ue_info_rel13->repetition_number, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ue_information(nfapi_ul_config_ue_information* ue_info, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &ue_info->ue_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel8_value) &&
-	pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &ue_info->ue_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel11_value) &&
-	pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &ue_info->ue_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_harq_information_rel10_tdd_t* harq_info_rel10_tdd = (nfapi_ul_config_harq_information_rel10_tdd_t*)tlv;
-
-	return ( push8(harq_info_rel10_tdd->harq_size, ppWritePackedMsg, end) &&
-			push8(harq_info_rel10_tdd->ack_nack_mode, ppWritePackedMsg, end) &&
-			push8(harq_info_rel10_tdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
-			push16(harq_info_rel10_tdd->n_pucch_1_0, ppWritePackedMsg, end) &&
-			push16(harq_info_rel10_tdd->n_pucch_1_1, ppWritePackedMsg, end) &&
-			push16(harq_info_rel10_tdd->n_pucch_1_2, ppWritePackedMsg, end) &&
-			push16(harq_info_rel10_tdd->n_pucch_1_3, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_harq_information_rel8_fdd_t* harq_info_rel8_fdd = (nfapi_ul_config_harq_information_rel8_fdd_t*)tlv;
-
-	return ( push16(harq_info_rel8_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
-			push8(harq_info_rel8_fdd->harq_size, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_harq_information_rel9_fdd_t* harq_info_rel9_fdd = (nfapi_ul_config_harq_information_rel9_fdd_t*)tlv;
-	
-	return ( push8(harq_info_rel9_fdd->harq_size, ppWritePackedMsg, end) &&
-			push8(harq_info_rel9_fdd->ack_nack_mode, ppWritePackedMsg, end) &&
-			push8(harq_info_rel9_fdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
-			push16(harq_info_rel9_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
-			push16(harq_info_rel9_fdd->n_pucch_1_1, ppWritePackedMsg, end) &&
-			push16(harq_info_rel9_fdd->n_pucch_1_2, ppWritePackedMsg, end) &&
-			push16(harq_info_rel9_fdd->n_pucch_1_3, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_harq_information_rel11_t* harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t*)tlv;
-	
-	return ( push8(harq_info_rel11->num_ant_ports, ppWritePackedMsg, end) &&
-			push16(harq_info_rel11->n_pucch_2_0, ppWritePackedMsg, end) &&
-			push16(harq_info_rel11->n_pucch_2_1, ppWritePackedMsg, end) &&
-			push16(harq_info_rel11->n_pucch_2_2, ppWritePackedMsg, end) &&
-			push16(harq_info_rel11->n_pucch_2_3, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t*)tlv;
-	
-	return ( push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
-			push8(harq_info_rel13->starting_prb, ppWritePackedMsg, end) &&
-			push8(harq_info_rel13->n_prb, ppWritePackedMsg, end) &&
-			push8(harq_info_rel13->cdm_index, ppWritePackedMsg, end) &&
-			push8(harq_info_rel13->n_srs, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_harq_information(nfapi_ul_config_harq_information* harq_info, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &harq_info->harq_information_rel10_tdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel10_tdd_value) &&
-	pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &harq_info->harq_information_rel8_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel8_fdd_value) &&
-	pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &harq_info->harq_information_rel9_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel9_fdd_value) &&
-	pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &harq_info->harq_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel11_value) &&
-	pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel13_value));
-
-}
-
-static uint8_t pack_ul_config_request_cqi_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_cqi_information_rel8_t* cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t*)tlv;
-
-	return ( push16(cqi_info_rel8->pucch_index, ppWritePackedMsg, end) &&
-			 push8(cqi_info_rel8->dl_cqi_pmi_size, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_cqi_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_cqi_information_rel10_t* cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t*)tlv;
-	
-	return ( push8(cqi_info_rel10->number_of_pucch_resource, ppWritePackedMsg, end) &&
-			 push16(cqi_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_cqi_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_cqi_information_rel13_t* cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t*)tlv;
-	
-	return ( push8(cqi_info_rel13->csi_mode, ppWritePackedMsg, end) &&
-			push16(cqi_info_rel13->dl_cqi_pmi_size_2, ppWritePackedMsg, end) &&
-			push8(cqi_info_rel13->starting_prb, ppWritePackedMsg, end) &&
-			push8(cqi_info_rel13->n_prb, ppWritePackedMsg, end) &&
-			push8(cqi_info_rel13->cdm_index, ppWritePackedMsg, end) &&
-			push8(cqi_info_rel13->n_srs, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_cqi_information(nfapi_ul_config_cqi_information* cqi_info, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &cqi_info->cqi_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel8_value) && 
-	pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &cqi_info->cqi_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel10_value) &&
-	pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &cqi_info->cqi_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel13_value));
-
-}
-
-static uint8_t pack_ul_config_request_sr_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_sr_information_rel8_t* sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t*)tlv;
-	return push16(sr_info_rel8->pucch_index, ppWritePackedMsg, end);
-}
-static uint8_t pack_ul_config_request_sr_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_sr_information_rel10_t* sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t*)tlv;
-
-	return ( push8(sr_info_rel10->number_of_pucch_resources, ppWritePackedMsg, end) &&
-		 	 push16(sr_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_sr_information(nfapi_ul_config_sr_information* sr_info, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &sr_info->sr_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel8_value) &&
-	pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &sr_info->sr_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel10_value));
-}
-
-static uint8_t pack_ul_config_request_srs_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_srs_pdu_rel8_t* srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t*)tlv;
-	
-	return (push32(srs_pdu_rel8->handle, ppWritePackedMsg, end) &&
-			push16(srs_pdu_rel8->size, ppWritePackedMsg, end) &&
-			push16(srs_pdu_rel8->rnti, ppWritePackedMsg, end) &&
-			push8(srs_pdu_rel8->srs_bandwidth, ppWritePackedMsg, end) &&
-			push8(srs_pdu_rel8->frequency_domain_position, ppWritePackedMsg, end) &&
-			push8(srs_pdu_rel8->srs_hopping_bandwidth, ppWritePackedMsg, end) &&
-			push8(srs_pdu_rel8->transmission_comb, ppWritePackedMsg, end) &&
-			push16(srs_pdu_rel8->i_srs, ppWritePackedMsg, end) &&
-			push8(srs_pdu_rel8->sounding_reference_cyclic_shift, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_srs_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_srs_pdu_rel10_t* srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t*)tlv;
-	return push8(srs_pdu_rel10->antenna_port, ppWritePackedMsg, end);
-}
-
-static uint8_t pack_ul_config_request_srs_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_srs_pdu_rel13_t* srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t*)tlv;
-	
-	return ( push8(srs_pdu_rel13->number_of_combs, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_nb_harq_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_nb_harq_information_rel13_fdd_t* nb_harq_pdu_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t*)tlv;
-	
-	return ( push8(nb_harq_pdu_rel13->harq_ack_resource, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_nulsch_pdu_rel13_t* nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t*)tlv;
-	
-	return (push8(nulsch_pdu_rel13->nulsch_format, ppWritePackedMsg, end) &&
-		    push32(nulsch_pdu_rel13->handle, ppWritePackedMsg, end) &&
-		    push16(nulsch_pdu_rel13->size, ppWritePackedMsg, end) &&
-		    push16(nulsch_pdu_rel13->rnti, ppWritePackedMsg, end) &&
-		    push8(nulsch_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
-		    push8(nulsch_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
-		    push8(nulsch_pdu_rel13->mcs, ppWritePackedMsg, end) &&
-		    push8(nulsch_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
-		    push8(nulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
-		    push8(nulsch_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
-		    push8(nulsch_pdu_rel13->n_srs, ppWritePackedMsg, end) &&
-		    push16(nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
-		    push16(nulsch_pdu_rel13->sf_idx, ppWritePackedMsg, end) && 
-		    pack_ul_config_request_ue_information(&(nulsch_pdu_rel13->ue_information), ppWritePackedMsg, end) &&
-		    pack_tlv(NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, ppWritePackedMsg, end, &pack_ul_config_request_nb_harq_rel13_value));
-}
-static uint8_t pack_ul_config_request_nrach_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_nrach_pdu_rel13_t* nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t*)tlv;
-	
-	return ( push8(nrach_pdu_rel13->nprach_config_0, ppWritePackedMsg, end) &&
-			 push8(nrach_pdu_rel13->nprach_config_1, ppWritePackedMsg, end) &&
-			 push8(nrach_pdu_rel13->nprach_config_2, ppWritePackedMsg, end));
-	
-}
-
-
-
-static uint8_t pack_ul_tti_pdu_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nr_ul_tti_request_number_of_pdus_t* value = (nfapi_nr_ul_tti_request_number_of_pdus_t*)tlv;
-
-	if(!(push16(value->pdu_size, ppWritePackedMsg, end) &&
-	 	 push16(value->pdu_type, ppWritePackedMsg, end) ))
-		  return 0;
-
-
-	// first match the pdu type, then call the respective function
-	switch(value->pdu_type)
-	{
-		case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
-		{
-			if(!pack_ul_tti_request_prach_pdu(&value->prach_pdu, ppWritePackedMsg, end))
-				return 0;
-		}
-		break;
-
-		case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
-		{
-			if(!pack_ul_tti_request_pucch_pdu(&value->pucch_pdu, ppWritePackedMsg, end))
-				return 0;
-		}
-		break;
-		case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
-		{
-			if(!pack_ul_tti_request_pusch_pdu(&value->pusch_pdu, ppWritePackedMsg, end))
-				return 0;
-		}
-		break;
-		case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE:
-		{
-			if(!pack_ul_tti_request_srs_pdu(&value->srs_pdu, ppWritePackedMsg, end))
-				return 0;
-		}
-		break;
-
-		default:
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", value->pdu_type );
-		}
-		break;
-	}
-
-	return 1;
-}
-
-static uint8_t pack_ul_tti_groups_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nr_ul_tti_request_number_of_groups_t* value = (nfapi_nr_ul_tti_request_number_of_groups_t*)tlv;
-
-	if(!push8(value->n_ue, ppWritePackedMsg, end))
-		return 0;
-	for(int i=0; i<value->n_ue;i++)
-	{
-		if(!push8(value->ue_list[i].pdu_idx, ppWritePackedMsg, end))
-		return 0;
-	}
-	return 1;
-}
-
-static uint8_t pack_ul_config_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_request_body_t* value = (nfapi_ul_config_request_body_t*)tlv;
-
-	if(!(push8(value->number_of_pdus, ppWritePackedMsg, end) &&
-	 	 push8(value->rach_prach_frequency_resources, ppWritePackedMsg, end) &&
-		 push8(value->srs_present, ppWritePackedMsg, end)))
-		return 0;
-
-	uint16_t i = 0;
-	for(i = 0; i < value->number_of_pdus; ++i)
-	{
-		nfapi_ul_config_request_pdu_t* pdu = &(value->ul_config_pdu_list[i]);
-
-		if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
-			return 0;
-
-		// Put a 0 size in and then determine the size after the pdu 
-		// has been writen and write the calculated size
-		uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg;
-		pdu->pdu_size = 0;
-		if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
-			return 0;
-
-		switch(pdu->pdu_type)
-		{
-			case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE:
-				{
-					if(!pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_pdu), ppWritePackedMsg, end))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE:
-				{
-					if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE:
-				{
-					if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_harq_pdu.harq_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_harq_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE:
-				{
-					if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_cqi_harq_ri_pdu.harq_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE:
-				{
-					if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_pdu.ue_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_cqi_information(&(pdu->uci_cqi_pdu.cqi_information), ppWritePackedMsg, end)))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE:
-				{
-					if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_pdu.ue_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_sr_information(&(pdu->uci_sr_pdu.sr_information), ppWritePackedMsg, end)))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE:
-				{
-					if(!(pack_ul_config_request_ue_information(&(pdu->uci_harq_pdu.ue_information), ppWritePackedMsg, end) &&
-	 					 pack_ul_config_request_harq_information(&(pdu->uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE:
-				{
-					if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_sr_information(&(pdu->uci_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_harq_information(&(pdu->uci_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE:
-				{
-					if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_harq_pdu.ue_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_cqi_information(&(pdu->uci_cqi_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_harq_information(&(pdu->uci_cqi_harq_pdu.harq_information), ppWritePackedMsg, end)))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE:
-				{
-					if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_pdu.ue_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_pdu.cqi_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_pdu.sr_information), ppWritePackedMsg, end)))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE:
-				{
-					if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_harq_information(&(pdu->uci_cqi_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_SRS_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &pdu->srs_pdu.srs_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel8_value) &&
-						 pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &pdu->srs_pdu.srs_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel10_value) &&
-						 pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &pdu->srs_pdu.srs_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel13_value)))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE:
-				{
-					if(!(pack_ul_config_request_ue_information(&(pdu->harq_buffer_pdu.ue_information), ppWritePackedMsg, end)))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE:
-				{
-					if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_csi_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_cqi_information(&(pdu->ulsch_uci_csi_pdu.csi_information), ppWritePackedMsg, end)))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE:
-				{
-					if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_harq_information(&(pdu->ulsch_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE:
-				{
-					if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_cqi_information(&(pdu->ulsch_csi_uci_harq_pdu.csi_information), ppWritePackedMsg, end) &&
-						 pack_ul_config_request_harq_information(&(pdu->ulsch_csi_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &pdu->nulsch_pdu.nulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nulsch_pdu_rel13_value)))	
-						return 0;
-				}
-				break;
-			case NFAPI_UL_CONFIG_NRACH_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &pdu->nrach_pdu.nrach_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nrach_pdu_rel13_value)))
-						return 0;
-				}
-				break;				
-			default:
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
-				}
-				break;
-		};
-
-		// add 1 for the pdu_type. The delta will include the pdu_size
-		pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
-		push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-		
-	}
-	return 1;
-}
-
-
-static uint8_t pack_ul_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t*)msg;
-
-	if (!(push16(pNfapiMsg->SFN , ppWritePackedMsg, end) &&
-		push16(pNfapiMsg->Slot , ppWritePackedMsg, end) &&
-		push8(pNfapiMsg->n_pdus , ppWritePackedMsg, end) &&
-		push8(pNfapiMsg->rach_present, ppWritePackedMsg, end) &&
-		push8(pNfapiMsg->n_ulsch, ppWritePackedMsg, end) &&
-		push8(pNfapiMsg->n_ulcch, ppWritePackedMsg, end) &&
-		push8(pNfapiMsg->n_group, ppWritePackedMsg, end) ))
-			return 0;
-		
-	for(int i=0; i<pNfapiMsg->n_pdus; i++)
-	{
-		if(!pack_ul_tti_pdu_list_value(&pNfapiMsg->pdus_list[i], ppWritePackedMsg, end))
-			return 0;
-	}
-
-	for(int i=0; i<pNfapiMsg->n_group; i++)
-	{
-		if(!pack_ul_tti_groups_list_value(&pNfapiMsg->groups_list[i], ppWritePackedMsg, end))
-			return 0;
-
-	}
-
-	return 1;
-}
-
-
-static uint8_t pack_ul_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t*)msg;
-	
-	return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-			 pack_tlv(NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, ppWritePackedMsg, end, &pack_ul_config_request_body_value) &&
-			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)) ;
-}
-
-static uint8_t pack_hi_dci0_hi_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_hi_dci0_hi_pdu_rel8_t* hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t*)tlv;
-	
-	return ( push8(hi_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
-			 push8(hi_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
-			 push8(hi_pdu_rel8->hi_value, ppWritePackedMsg, end) &&
-			 push8(hi_pdu_rel8->i_phich, ppWritePackedMsg, end) &&
-			 push16(hi_pdu_rel8->transmission_power, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_hi_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_hi_dci0_hi_pdu_rel10_t* hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t*)tlv;
-	
-	return ( push8(hi_pdu_rel10->flag_tb2, ppWritePackedMsg, end) &&
-			 push8(hi_pdu_rel10->hi_value_2, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_dci_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_hi_dci0_dci_pdu_rel8_t* dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t*)tlv;
-	
-	return ( push8(dci_pdu_rel8->dci_format, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel8->cce_index, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel8->aggregation_level, ppWritePackedMsg, end) &&
-			 push16(dci_pdu_rel8->rnti, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel8->number_of_resource_block, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel8->mcs_1, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel8->new_data_indication_1, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel8->ue_tx_antenna_seleciton, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel8->tpc, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel8->cqi_csi_request, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel8->ul_index, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel8->dl_assignment_index, ppWritePackedMsg, end) &&
-			 push32(dci_pdu_rel8->tpc_bitmap, ppWritePackedMsg, end) &&
-			 push16(dci_pdu_rel8->transmission_power, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_dci_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_hi_dci0_dci_pdu_rel10_t* dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t*)tlv;
-	
-	return ( push8(dci_pdu_rel10->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel10->carrier_indicator, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel10->size_of_cqi_csi_feild, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel10->srs_flag, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel10->srs_request, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel10->resource_allocation_flag, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
-			 push32(dci_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel10->mcs_2, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel10->new_data_indication_2, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel10->number_of_antenna_ports, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel10->tpmi, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel10->total_dci_length_including_padding, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel10->n_ul_rb, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_dci_rel12_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_hi_dci0_dci_pdu_rel12_t* dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t*)tlv;
-	
-	return ( push8(dci_pdu_rel12->pscch_resource, ppWritePackedMsg, end) &&
-			 push8(dci_pdu_rel12->time_resource_pattern, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_mpdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t* mpdcch_dci_pdu_rel13 = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t*)tlv;
-	
-	return ( push8(mpdcch_dci_pdu_rel13->mpdcch_narrowband, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->number_of_prb_pairs, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->resource_block_assignment, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->mpdcch_transmission_type, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->ecce_index, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->aggreagation_level, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->rnti_type, ppWritePackedMsg, end) &&
-			 push16(mpdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->ce_mode, ppWritePackedMsg, end) &&
-			 push16(mpdcch_dci_pdu_rel13->drms_scrambling_init, ppWritePackedMsg, end) &&
-			 push16(mpdcch_dci_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
-			 push16(mpdcch_dci_pdu_rel13->transmission_power, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->dci_format, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->resource_block_start, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->number_of_resource_blocks, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->pusch_repetition_levels, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->frequency_hopping_flag, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->harq_process, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->redudency_version, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->tpc, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->csi_request, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->ul_inex, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->dai_presence_flag, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->dl_assignment_index, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->srs_request, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
-			 push32(mpdcch_dci_pdu_rel13->tcp_bitmap, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->total_dci_length_include_padding, ppWritePackedMsg, end) &&
-			 push8(mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
-			 pusharray16(mpdcch_dci_pdu_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end));
-	
-}
-
-static uint8_t pack_hi_dci0_npdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_hi_dci0_npdcch_dci_pdu_rel13_t* npdcch_dci_pdu_rel13 = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t*)tlv;
-	
-	return ( push8(npdcch_dci_pdu_rel13->ncce_index, ppWritePackedMsg, end) &&
-			 push8(npdcch_dci_pdu_rel13->aggregation_level, ppWritePackedMsg, end) &&
-			 push8(npdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
-			 push16(npdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
-			 push8(npdcch_dci_pdu_rel13->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
-			 push8(npdcch_dci_pdu_rel13->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
-			 push8(npdcch_dci_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
-			 push8(npdcch_dci_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
-			 push8(npdcch_dci_pdu_rel13->scheduling_delay, ppWritePackedMsg, end) &&
-			 push8(npdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
-			 push8(npdcch_dci_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
-			 push8(npdcch_dci_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
-			 push8(npdcch_dci_pdu_rel13->new_data_indicator, ppWritePackedMsg, end) &&
-			 push8(npdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_hi_dci0_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_hi_dci0_request_body_t* value = (nfapi_hi_dci0_request_body_t*)tlv;
-
-	if(!(push16(value->sfnsf, ppWritePackedMsg, end) &&
-		 push8(value->number_of_dci, ppWritePackedMsg, end) &&
-		 push8(value->number_of_hi, ppWritePackedMsg, end)))
-		return 0;
-
-	uint16_t i = 0;
-	uint16_t total_number_of_pdus = value->number_of_dci + value->number_of_hi;
-	for(i = 0; i < total_number_of_pdus; ++i)
-	{
-		nfapi_hi_dci0_request_pdu_t* pdu = &(value->hi_dci0_pdu_list[i]);
-
-		if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
-			return 0;
-
-		// Put a 0 size in and then determine the size after the pdu 
-		// has been writen and write the calculated size
-		uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg;
-		pdu->pdu_size = 0;
-		if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
-			return 0;
-
-		switch(pdu->pdu_type)
-		{
-			case NFAPI_HI_DCI0_HI_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_hi_rel8_pdu_value) &&
-						 pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_hi_rel10_pdu_value)))
-						return 0;
-				}
-				break;
-			case NFAPI_HI_DCI0_DCI_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
-						 pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
-						 pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, ppWritePackedMsg, end, pack_hi_dci0_dci_rel12_pdu_value)))
-						return 0;
-				}
-				break;
-			case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
-						 pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
-						 pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, ppWritePackedMsg, end, pack_dl_config_epdcch_parameters_rel11_value)))
-						return 0;
-				}
-				break;
-			case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_mpdcch_dci_rel13_pdu_value)))
-						return 0;
-				}
-				break;
-			case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE:
-				{
-					if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_npdcch_dci_rel13_pdu_value)))
-						return 0;
-				}
-				break;				
-			default:
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
-				}
-				break;
-		};
-
-		// add 1 for the pdu_type. The delta will include the pdu_size
-		pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
-		push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-		
-	}
-
-	return 1;
-}
-
-static uint8_t pack_ul_dci_pdu_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nr_ul_dci_request_pdus_t* value = (nfapi_nr_ul_dci_request_pdus_t*)tlv;
-	
-	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
-	{
-		if(!push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
-		push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
-
-		push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
-		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
-		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
-		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
-
-		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
-		push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
-		
-		pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end));
-
-		return 0;
-	}
-
-	return (push16(value->PDUType, ppWritePackedMsg, end) &&
-	   	    push16(value->PDUSize, ppWritePackedMsg, end) &&
-			push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, ppWritePackedMsg, end) &&
-			push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, ppWritePackedMsg, end) &&
-			push8(value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, ppWritePackedMsg, end) &&
-			push8(value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, ppWritePackedMsg, end) &&
-
-			push8(value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, ppWritePackedMsg, end) &&
-			push8(value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, ppWritePackedMsg, end) &&
-			pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
-			push8(value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, ppWritePackedMsg, end) &&
-
-			push8(value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, ppWritePackedMsg, end) &&
-			push8(value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, ppWritePackedMsg, end) &&
-			push8(value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, ppWritePackedMsg, end) &&
-			push16(value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, ppWritePackedMsg, end));
-
-}
-
-static uint8_t pack_ul_dci_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t*)msg;
-	
-	if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
-		     push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
-			 push8(pNfapiMsg->numPdus, ppWritePackedMsg, end)
-        ))
-		return 0;
-
-	for(int i=0; i<pNfapiMsg->numPdus; i++)
-	{
-		if(!pack_ul_dci_pdu_list_value(&pNfapiMsg->ul_dci_pdu_list[i], ppWritePackedMsg, end))
-			return 0;
-	}
-	return 1;
-
-
-}
-
-
-
-static uint8_t pack_hi_dci0_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t*)msg;
-	
-	return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-			 pack_tlv(NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, ppWritePackedMsg, end, &pack_hi_dci0_request_body_value) &&
-			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-//pack_tx_data_pdu_list_value
-static uint8_t pack_tx_data_pdu_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nr_pdu_t* value = (nfapi_nr_pdu_t*)tlv;
-	
-	if(!(push32(value->num_TLV, ppWritePackedMsg, end) &&
-	    push16(value->PDU_index, ppWritePackedMsg, end) &&
-		push16(value->PDU_length, ppWritePackedMsg, end)
-	 ))
-		return 0;
-
-	uint16_t i = 0;
-	uint16_t total_number_of_tlvs = value->num_TLV;
-	for(; i < total_number_of_tlvs; ++i)
-	{
-		
-		if (!(push16(value->TLVs[i].length, ppWritePackedMsg, end) &&
-			push16(value->TLVs[i].tag, ppWritePackedMsg, end)))
-			return 0;
-
-		switch(value->TLVs[i].tag)
-		{
-			case 0:
-			{
-				if(!pusharray32(value->TLVs[i].value.direct, 16384, value->TLVs[i].length, ppWritePackedMsg, end))
-					return 0;
-				break;
-
-			}
-
-			case 1:
-			{
-				if(!pusharray32(value->TLVs[i].value.ptr, value->TLVs[i].length , value->TLVs[i].length, ppWritePackedMsg, end))
-					return 0;
-				break;
-
-			}
-				
-			default:
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", value->TLVs[i].tag );
-				break;
-			}
-				
-		}		
-	}
-	return 1;
-}
-
-static uint8_t pack_tx_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_tx_request_body_t* value = (nfapi_tx_request_body_t*)tlv;
-	
-	if(push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	uint16_t i = 0;
-	uint16_t total_number_of_pdus = value->number_of_pdus;
-	for(; i < total_number_of_pdus; ++i)
-	{
-		nfapi_tx_request_pdu_t* pdu = &(value->tx_pdu_list[i]);
-				
-		if(!(push16(pdu->pdu_length, ppWritePackedMsg, end) &&
-			 push16(pdu->pdu_index, ppWritePackedMsg, end)))
-			return 0;
-
-		uint8_t j;
-		for(j = 0; j < pdu->num_segments; ++j)
-		{
-			// Use -1 as it is unbounded 
-			// DJP - does not handle -1
-                        // DJP - if(pusharray8(pdu->segments[j].segment_data, (uint32_t)(-1), pdu->segments[j].segment_length, ppWritePackedMsg, end) == 0)
-			int push_ret = pusharray8(pdu->segments[j].segment_data, 65535, pdu->segments[j].segment_length, ppWritePackedMsg, end);
-                        
-                        if (pdu->segments[j].segment_length == 3)
-                        {
-                          NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__, 
-                          pdu->segments[j].segment_data[0], 
-                          pdu->segments[j].segment_data[1], 
-                          pdu->segments[j].segment_data[2]
-                          );
-                        }
-                        //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() segment_data:%p segment_length:%u pusharray8()=%d\n", __FUNCTION__, pdu->segments[j].segment_data, pdu->segments[j].segment_length, push_ret);
-
-                        if (push_ret == 0)
-			{
-				return 0;
-			}
-		}
-	}
-
-	return 1;
-}
-
-static uint8_t pack_tx_data_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t*)msg;
-	
-	if (!(
-	 push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
-	 push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
-	 push16(pNfapiMsg->Number_of_PDUs, ppWritePackedMsg, end)
-	))
-	return 0;
-
-	for(int i=0; i<pNfapiMsg->Number_of_PDUs; i++)
-	{
-		if(!pack_tx_data_pdu_list_value(&pNfapiMsg->pdu_list[i], ppWritePackedMsg, end))
-			return 0;
-	}
-
-    return 1;
-}
-
-static uint8_t pack_tx_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t*)msg;
-	
-	int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
-        int y = pack_tlv(NFAPI_TX_REQUEST_BODY_TAG, &pNfapiMsg->tx_request_body, ppWritePackedMsg, end, &pack_tx_request_body_value);
-        int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-
-        //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() x:%d y:%d z:%d\n", __FUNCTION__, x, y, z);
-
-        return x && y && z;
-}
-
-static uint8_t pack_release_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-  nfapi_ue_release_request_body_t* value = (nfapi_ue_release_request_body_t*)tlv;
-  if(push16(value->number_of_TLVs, ppWritePackedMsg, end) == 0){
-    return 0;
-  }
-
-  uint8_t j;
-  uint16_t num = value->number_of_TLVs;
-  for(j = 0; j < num; ++j){
-    if(push16(value->ue_release_request_TLVs_list[j].rnti, ppWritePackedMsg, end) == 0){
-      return 0;
-    }
-  }
-  return 1;
-}
-
-static uint8_t pack_ue_release_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-  nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t*)msg;
-  int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
-  int y = pack_tlv(NFAPI_UE_RELEASE_BODY_TAG, &pNfapiMsg->ue_release_request_body, ppWritePackedMsg, end, &pack_release_request_body_value);
-  int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-  return x && y && z;
-}
-
-static uint8_t pack_ue_release_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-
-	nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t*)msg;
-
-	int x = push32(pNfapiMsg->error_code, ppWritePackedMsg, end);
-	int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-	return x && z;
-}
-
-static uint8_t pack_rx_ue_information_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_rx_ue_information* value = (nfapi_rx_ue_information*)tlv;
-	
-	return ( push32(value->handle, ppWritePackedMsg, end) &&
-			 push16(value->rnti, ppWritePackedMsg, end) );
-}
-
-static uint8_t unpack_rx_ue_information_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_rx_ue_information* value = (nfapi_rx_ue_information*)tlv;
-	
-	return ( pull32(ppReadPackedMsg, &value->handle, end) &&
-			 pull16(ppReadPackedMsg, &value->rnti, end));
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data_bundling(nfapi_harq_indication_tdd_harq_data_bundling_t* data, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return ( push8(data->value_0, ppWritePackedMsg, end) &&
-			 push8(data->value_1, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data_multiplexing(nfapi_harq_indication_tdd_harq_data_multiplexing_t* data, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return ( push8(data->value_0, ppWritePackedMsg, end) &&
-			 push8(data->value_1, ppWritePackedMsg, end) &&
-			 push8(data->value_2, ppWritePackedMsg, end) &&
-			 push8(data->value_3, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data_special_bundling(nfapi_harq_indication_tdd_harq_data_special_bundling_t* data, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return ( push8(data->value_0, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data(nfapi_harq_indication_tdd_harq_data_t* data, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	return ( push8(data->value_0, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_harq_indication_tdd_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_tdd_rel8_t* harq_indication_tdd_rel8 = (nfapi_harq_indication_tdd_rel8_t*)tlv;
-	
-	if(!(push8(harq_indication_tdd_rel8->mode, ppWritePackedMsg, end) &&
-		 push8(harq_indication_tdd_rel8->number_of_ack_nack, ppWritePackedMsg, end)))
-			return 0;
-
-	uint8_t result = 0;
-	switch(harq_indication_tdd_rel8->mode)
-	{
-		case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-			result = pack_harq_indication_tdd_harq_data_bundling(&harq_indication_tdd_rel8->harq_data.bundling, ppWritePackedMsg, end);
-			break;
-		case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-			result = pack_harq_indication_tdd_harq_data_multiplexing(&harq_indication_tdd_rel8->harq_data.multiplex, ppWritePackedMsg, end);
-			break;
-		case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-			result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel8->harq_data.special_bundling, ppWritePackedMsg, end);
-			break;
-		case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-		case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-			result = 1;
-			break;			
-		default:
-			// err....
-			break;
-	}
-
-	return result;
-	
-}
-
-static uint8_t pack_harq_indication_tdd_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_tdd_rel9_t* harq_indication_tdd_rel9 = (nfapi_harq_indication_tdd_rel9_t*)tlv;
-	
-	if(!(push8(harq_indication_tdd_rel9->mode, ppWritePackedMsg, end) &&
-		 push8(harq_indication_tdd_rel9->number_of_ack_nack, ppWritePackedMsg, end)))
-		return 0;
-
-	uint8_t idx; 
-	for(idx = 0; idx < harq_indication_tdd_rel9->number_of_ack_nack; ++idx)
-	{
-		uint8_t result = 0;
-
-		switch(harq_indication_tdd_rel9->mode)
-		{
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-				result = pack_harq_indication_tdd_harq_data(&(harq_indication_tdd_rel9->harq_data[idx].bundling), ppWritePackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-				result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].multiplex, ppWritePackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-				result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel9->harq_data[idx].special_bundling, ppWritePackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-				result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].channel_selection, ppWritePackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-				result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].format_3, ppWritePackedMsg, end);
-				break;
-			default:
-				// err....
-				break;
-		}
-
-		if(result == 0)
-			return 0;
-	}
-
-	return 1;
-}
-
-static uint8_t pack_harq_indication_tdd_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_tdd_rel13_t* harq_indication_tdd_rel13 = (nfapi_harq_indication_tdd_rel13_t*)tlv;
-	
-	if(!(push8(harq_indication_tdd_rel13->mode, ppWritePackedMsg, end) &&
-		 push16(harq_indication_tdd_rel13->number_of_ack_nack, ppWritePackedMsg, end)))
-		return 0;
-
-	uint8_t idx; 
-	for(idx = 0; idx < harq_indication_tdd_rel13->number_of_ack_nack; ++idx)
-	{
-		uint8_t result = 0;
-		switch(harq_indication_tdd_rel13->mode)
-		{
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-				result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].bundling, ppWritePackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-				result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].multiplex, ppWritePackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-				result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel13->harq_data[idx].special_bundling, ppWritePackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-				result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].channel_selection, ppWritePackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-				result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_3, ppWritePackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
-				result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_4, ppWritePackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
-				result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_5, ppWritePackedMsg, end);
-				break;
-			default:
-				// err....
-				break;
-		}
-
-		if(result == 0)
-			return 0;
-	}
-
-	return 1;
-}
-
-static uint8_t pack_harq_indication_fdd_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_fdd_rel8_t* harq_indication_fdd_rel8 = (nfapi_harq_indication_fdd_rel8_t*)tlv;
-	
-	return ( push8(harq_indication_fdd_rel8->harq_tb1, ppWritePackedMsg, end) &&
-			 push8(harq_indication_fdd_rel8->harq_tb2, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_fdd_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_fdd_rel9_t* harq_indication_fdd_rel9 = (nfapi_harq_indication_fdd_rel9_t*)tlv;
-	
-	return ( push8(harq_indication_fdd_rel9->mode, ppWritePackedMsg, end) &&
-			 push8(harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end) &&
-			 pusharray8(harq_indication_fdd_rel9->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_fdd_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_fdd_rel13_t* harq_indication_fdd_rel13 = (nfapi_harq_indication_fdd_rel13_t*)tlv;
-	
-	return ( push8(harq_indication_fdd_rel13->mode, ppWritePackedMsg, end) &&
-			 push16(harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end) &&
-			 pusharray8(harq_indication_fdd_rel13->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_cqi_information_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_ul_cqi_information_t* value = (nfapi_ul_cqi_information_t*)tlv;
-	
-	return ( push8(value->ul_cqi, ppWritePackedMsg, end) &&
-			 push8(value->channel, ppWritePackedMsg, end));
-
-}
-
-static uint8_t pack_harq_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_body_t* value = (nfapi_harq_indication_body_t*)tlv;
-	
-	if(push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	uint16_t i = 0;
-	uint16_t total_number_of_pdus = value->number_of_harqs;
-	for(; i < total_number_of_pdus; ++i)
-	{
-		nfapi_harq_indication_pdu_t* pdu = &(value->harq_pdu_list[i]);
-
-		uint8_t* instance_length_p = *ppWritePackedMsg;
-		if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-			return 0;
-
-		if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
-			 pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, ppWritePackedMsg, end, pack_harq_indication_tdd_rel8_value) &&
-			 pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, ppWritePackedMsg, end, pack_harq_indication_tdd_rel9_value) &&
-			 pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, ppWritePackedMsg, end, pack_harq_indication_tdd_rel13_value) &&
-			 pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, ppWritePackedMsg, end, pack_harq_indication_fdd_rel8_value) &&
-			 pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, ppWritePackedMsg, end, pack_harq_indication_fdd_rel9_value) &&
-			 pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_harq_indication_fdd_rel13_value) &&
-			 pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
-			return 0;
-
-		// calculate the instance length subtracting the size of the instance
-		// length feild
-		uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-		push16(instance_length, &instance_length_p, end);
-	}
-
-	return 1;
-}
-
-static uint8_t pack_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t*)msg;
-	
-	return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-			 pack_tlv(NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, ppWritePackedMsg, end, pack_harq_indication_body_value) &&
-			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_crc_indication_rel8_body(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_crc_indication_rel8_t* crc_indication_rel8 = (nfapi_crc_indication_rel8_t*)tlv;
-	
-	return ( push8(crc_indication_rel8->crc_flag, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_crc_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_crc_indication_body_t* value = (nfapi_crc_indication_body_t*)tlv;
-	
-	if(push16(value->number_of_crcs, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	uint16_t i = 0;
-	uint16_t total_number_of_pdus = value->number_of_crcs;
-	for(; i < total_number_of_pdus; ++i)
-	{
-		nfapi_crc_indication_pdu_t* pdu = &(value->crc_pdu_list[i]);
-		
-		uint8_t* instance_length_p = *ppWritePackedMsg;
-		if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-			return 0;
-		
-		if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
-			 pack_tlv(NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, ppWritePackedMsg, end, pack_crc_indication_rel8_body)))
-			return 0;
-
-		// calculate the instance length subtracting the size of the instance
-		// length feild
-		uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-		push16(instance_length, &instance_length_p, end);
-	}
-	return 1;
-}
-
-static uint8_t pack_crc_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t*)msg;
-	
-	return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-			 pack_tlv(NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, ppWritePackedMsg, end, &pack_crc_indication_body_value) &&
-			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-
-}
-static uint8_t pack_rx_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_rx_indication_rel8_t* value = (nfapi_rx_indication_rel8_t*)tlv;
-	
-	return ( push16(value->length, ppWritePackedMsg, end) &&
-			 push16(value->offset, ppWritePackedMsg, end) &&
-			 push8(value->ul_cqi, ppWritePackedMsg, end) &&
-			 push16(value->timing_advance, ppWritePackedMsg, end));
-}
-static uint8_t pack_rx_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_rx_indication_rel9_t* value = (nfapi_rx_indication_rel9_t*)tlv;
-	
-	return ( push16(value->timing_advance_r9, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_rx_indication_body_t* value = (nfapi_rx_indication_body_t*)tlv;
-
-        //printf("RX ULSCH BODY\n");
-
-	if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	// need to calculate the data offset's. 
-	uint16_t i = 0;
-	uint16_t offset = 2; // taking into account the number_of_pdus
-	uint16_t total_number_of_pdus = value->number_of_pdus;
-        //printf("ULSCH:pdus:%d\n", total_number_of_pdus);
-
-	for(i = 0; i < total_number_of_pdus; ++i)
-	{
-		nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]);
-		if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG)
-		{
-                  //printf("NFAPI_RX_UE_INFORMATION_TAG\n");
-			offset += 4 + 6; 
-		}
-				
-		if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG)
-		{
-                  //printf("NFAPI_RX_INDICATION_REL8_TAG\n");
-			offset += 4 + 7;
-		}
-
-		if(pdu->rx_indication_rel9.tl.tag == NFAPI_RX_INDICATION_REL9_TAG)
-		{
-                  //printf("NFAPI_RX_INDICATION_REL9_TAG\n");
-			offset += 4 + 2;
-		}
-	}
-
-	// Now update the structure to include the offset
-	for(i =0; i < total_number_of_pdus; ++i)
-	{
-		nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]);
-				
-		if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG)
-		{
-			if(pdu->rx_indication_rel8.offset == 1)
-			{
-				pdu->rx_indication_rel8.offset = offset;
-				offset += pdu->rx_indication_rel8.length;
-			}
-		}
-	}
-	
-	// Write out the pdu
-	for(i = 0; i < total_number_of_pdus; ++i)
-	{
-		nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]);
-		if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
-			 pack_tlv(NFAPI_RX_INDICATION_REL8_TAG, &pdu->rx_indication_rel8, ppWritePackedMsg, end, pack_rx_indication_rel8_value) &&
-			 pack_tlv(NFAPI_RX_INDICATION_REL9_TAG, &pdu->rx_indication_rel9, ppWritePackedMsg, end, pack_rx_indication_rel9_value)))
-			return 0;
-	}
-
-	// Write out the pdu data
-	for(i = 0; i < total_number_of_pdus; ++i)
-	{
-		uint16_t length = 0;
-		nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]);
-
-		if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG)
-		{
-			length = pdu->rx_indication_rel8.length;
-		}
-
-		if( pusharray8(value->rx_pdu_list[i].data, length, length, ppWritePackedMsg, end) == 0)
-			return 0;
-	}
-	return 1;
-}
-
-
-static uint8_t pack_rx_ulsch_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t*)msg;
-	
-	return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-			 pack_tlv(NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, ppWritePackedMsg, end, pack_rx_ulsch_indication_body_value) &&
-			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_preamble_pdu_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_preamble_pdu_rel8_t* preamble_rel8 = (nfapi_preamble_pdu_rel8_t*)tlv;
-	
-	return ( push16(preamble_rel8->rnti, ppWritePackedMsg, end) &&
-			 push8(preamble_rel8->preamble, ppWritePackedMsg, end) &&
-			 push16(preamble_rel8->timing_advance, ppWritePackedMsg, end));
-}
-static uint8_t pack_preamble_pdu_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_preamble_pdu_rel9_t* preamble_rel9 = (nfapi_preamble_pdu_rel9_t*)tlv;
-	
-	return ( push16(preamble_rel9->timing_advance_r9, ppWritePackedMsg, end) );
-}
-static uint8_t pack_preamble_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_preamble_pdu_rel13_t* preamble_rel13 = (nfapi_preamble_pdu_rel13_t*)tlv;
-	
-	return ( push8(preamble_rel13->rach_resource_type, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_rach_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_rach_indication_body_t* value = (nfapi_rach_indication_body_t*)tlv;
-	
-	if( push16(value->number_of_preambles, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	uint16_t i = 0;
-	uint16_t total_number_of_pdus = value->number_of_preambles;
-	for(; i < total_number_of_pdus; ++i)
-	{
-		nfapi_preamble_pdu_t* pdu = &(value->preamble_list[i]);
-		
-		uint8_t* instance_length_p = *ppWritePackedMsg;
-		if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-			return 0;
-		
-		if(!(pack_tlv(NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, ppWritePackedMsg, end, pack_preamble_pdu_rel8_value) &&
-			 pack_tlv(NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, ppWritePackedMsg, end, pack_preamble_pdu_rel9_value) &&
-			 pack_tlv(NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, ppWritePackedMsg, end, pack_preamble_pdu_rel13_value)))
-			return 0;
-
-		// calculate the instance length subtracting the size of the instance
-		// length feild
-		uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-		push16(instance_length, &instance_length_p, end);
-	}
-
-	return 1;
-}
-
-static uint8_t pack_rach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t*)msg;
-	
-	return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-			 pack_tlv(NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, ppWritePackedMsg, end, pack_rach_indication_body_value) &&
-			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_srs_indication_fdd_rel8_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_srs_indication_fdd_rel8_t* srs_pdu_rel8 = (nfapi_srs_indication_fdd_rel8_t*)tlv;
-	
-	return ( push16(srs_pdu_rel8->doppler_estimation, ppWritePackedMsg, end) &&
-			 push16(srs_pdu_rel8->timing_advance, ppWritePackedMsg, end) &&
-			 push8(srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
-			 push8(srs_pdu_rel8->rb_start, ppWritePackedMsg, end) &&
-			 pusharray8(srs_pdu_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_srs_indication_fdd_rel9_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_srs_indication_fdd_rel9_t* srs_pdu_rel9 = (nfapi_srs_indication_fdd_rel9_t*)tlv;
-	
-	return ( push16(srs_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_srs_indication_tdd_rel10_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_srs_indication_ttd_rel10_t* srs_pdu_rel10 = (nfapi_srs_indication_ttd_rel10_t*)tlv;
-	
-	return ( push8(srs_pdu_rel10->uppts_symbol, ppWritePackedMsg, end) );
-	
-}
-
-static uint8_t pack_srs_indication_fdd_rel11_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_srs_indication_fdd_rel11_t* srs_pdu_rel11 = (nfapi_srs_indication_fdd_rel11_t*)tlv;
-	
-	return ( push16(srs_pdu_rel11->ul_rtoa, ppWritePackedMsg, end) ) ;
-}
-
-static uint8_t pack_tdd_channel_measurement_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_tdd_channel_measurement_t* value = (nfapi_tdd_channel_measurement_t*)tlv;
-
-	if(!(push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
-		 push8(value->number_of_subbands, ppWritePackedMsg, end) &&
-		 push8(value->num_atennas, ppWritePackedMsg, end)))
-		return 0;
-
-	uint8_t idx = 0;
-	for(idx = 0; idx < value->number_of_subbands; ++idx)
-	{
-		if(!(push8(value->subands[idx].subband_index, ppWritePackedMsg, end) &&
-			 pusharray16(value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, ppWritePackedMsg, end)))
-			return 0;
-	}
-
-	return 1;
-}
-
-static uint8_t pack_srs_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg,  uint8_t *end)
-{
-	nfapi_srs_indication_body_t *value = (nfapi_srs_indication_body_t*)tlv;
-
-	if( push8(value->number_of_ues, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	uint16_t i = 0;
-	uint16_t total_number_of_pdus = value->number_of_ues;
-	for(; i < total_number_of_pdus; ++i)
-	{
-		nfapi_srs_indication_pdu_t* pdu = &(value->srs_pdu_list[i]);
-		
-		uint8_t* instance_length_p = *ppWritePackedMsg;
-		if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-			return 0;
-		
-		if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, &pack_rx_ue_information_value) &&
-			 pack_tlv(NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel8_value) &&
-			 pack_tlv(NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel9_value) &&
-			 pack_tlv(NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, ppWritePackedMsg, end, &pack_srs_indication_tdd_rel10_value) &&
-			 pack_tlv(NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel11_value) &&
-			 pack_tlv(NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, ppWritePackedMsg, end, &pack_tdd_channel_measurement_value)))
-			return 0;
-
-		// calculate the instance length subtracting the size of the instance
-		// length feild
-		uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-		push16(instance_length, &instance_length_p, end);
-	}
-
-	return 1;
-}
-
-static uint8_t pack_srs_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t*)msg;
-	
-	return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-			 pack_tlv(NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, ppWritePackedMsg, end, &pack_srs_indication_body_value) &&
-			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-
-}
-
-static uint8_t pack_sr_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_sr_indication_body_t* value = (nfapi_sr_indication_body_t*)tlv;
-
-	if(push16(value->number_of_srs, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	uint16_t i = 0;
-	uint16_t total_number_of_pdus = value->number_of_srs;
-	for(; i < total_number_of_pdus; ++i)
-	{
-		nfapi_sr_indication_pdu_t* pdu = &(value->sr_pdu_list[i]);
-
-		uint8_t* instance_length_p = *ppWritePackedMsg;
-		if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-			return 0;
-
-		if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
-			 pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
-			return 0;
-
-		// calculate the instance length subtracting the size of the instance
-		// length feild
-		uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-		push16(instance_length, &instance_length_p, end);
-	}
-	return 1;
-}
-
-static uint8_t pack_sr_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t*)msg;
-	
-	return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-			 pack_tlv(NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, ppWritePackedMsg, end, &pack_sr_indication_body_value) &&
-			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-
-}
-
-static uint8_t pack_cqi_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_cqi_indication_rel8_t* cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t*)tlv;
-	
-	return ( push16(cqi_pdu_rel8->length, ppWritePackedMsg, end) &&
-			 push16(cqi_pdu_rel8->data_offset, ppWritePackedMsg, end) &&
-			 push8(cqi_pdu_rel8->ul_cqi, ppWritePackedMsg, end) &&
-			 push8(cqi_pdu_rel8->ri, ppWritePackedMsg, end) &&
-			 push16(cqi_pdu_rel8->timing_advance, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_cqi_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_cqi_indication_rel9_t* cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t*)tlv;
-	
-	return  ( push16(cqi_pdu_rel9->length, ppWritePackedMsg, end) &&
-			  push16(cqi_pdu_rel9->data_offset, ppWritePackedMsg, end) &&
-			  push8(cqi_pdu_rel9->ul_cqi, ppWritePackedMsg, end) &&
-			  push8(cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
-			  pusharray8(cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
-			  push16(cqi_pdu_rel9->timing_advance, ppWritePackedMsg, end) &&
-			  push16(cqi_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_cqi_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_cqi_indication_body_t* value = (nfapi_cqi_indication_body_t*)tlv;
-
-	if( push16(value->number_of_cqis, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	// need to calculate the data offset's. This very bittle due the hardcoding
-	// of the sizes. can not use the sizeof as we have an array for the Rel9
-	// info
-	uint16_t i = 0;
-	uint16_t offset = 2; // taking into account the number_of_cqis
-	uint16_t total_number_of_pdus = value->number_of_cqis;
-	for(i = 0; i < total_number_of_pdus; ++i)
-	{
-		nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]);
-		
-		offset += 2; // for the instance length
-		
-		if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG)
-		{
-			offset += 4 + 6; // sizeof(nfapi_rx_ue_information) - sizeof(nfapi_tl_t)
-		}
-				
-		if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG)
-		{
-			offset += 4 + 8;
-		}
-
-		if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG)
-		{
-			offset += 4 + 10 + pdu->cqi_indication_rel9.number_of_cc_reported;
-		}
-
-		if(pdu->ul_cqi_information.tl.tag == NFAPI_UL_CQI_INFORMATION_TAG)
-		{
-			offset += 4 + 2;
-		}
-	}
-
-	// Now update the structure to include the offset
-	for(i =0; i < total_number_of_pdus; ++i)
-	{
-		nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]);
-				
-		if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG)
-		{
-			if(pdu->cqi_indication_rel8.data_offset == 1)
-			{
-				pdu->cqi_indication_rel8.data_offset = offset;
-				offset += pdu->cqi_indication_rel8.length;
-			}
-		}
-
-		if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG)
-		{
-			if(pdu->cqi_indication_rel9.data_offset == 1)
-			{
-				pdu->cqi_indication_rel9.data_offset = offset;
-				offset += pdu->cqi_indication_rel9.length;
-			}
-		}
-
-	}
-	
-	// Write out the cqi information
-	for(i = 0; i < total_number_of_pdus; ++i)
-	{
-		nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]);
-
-		uint8_t* instance_length_p = *ppWritePackedMsg;
-		if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-			return 0;
-		
-		if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end ,pack_rx_ue_information_value) &&
-			 pack_tlv(NFAPI_CQI_INDICATION_REL8_TAG, &pdu->cqi_indication_rel8, ppWritePackedMsg, end, pack_cqi_indication_rel8_value) &&
-			 pack_tlv(NFAPI_CQI_INDICATION_REL9_TAG, &pdu->cqi_indication_rel9, ppWritePackedMsg, end, pack_cqi_indication_rel9_value) &&
-			 pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
-			return 0;
-
-		// calculate the instance length subtracting the size of the instance
-		// length feild
-		uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-		push16(instance_length, &instance_length_p, end);
-		
-	}
-
-	// Write out the cqi raw data
-	for(i = 0; i < total_number_of_pdus; ++i)
-	{
-		uint16_t length = 0;
-		nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]);
-
-		if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG)
-		{
-			length = pdu->cqi_indication_rel8.length;
-		}
-
-		if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG)
-		{
-			length = pdu->cqi_indication_rel9.length;
-		}
-
-		if( pusharray8(value->cqi_raw_pdu_list[i].pdu, NFAPI_CQI_RAW_MAX_LEN, length, ppWritePackedMsg, end) == 0)
-			return 0;
-	}
-
-	return 1; 
-}
-
-static uint8_t pack_cqi_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t*)msg;
-	
-	return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-			 pack_tlv(NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, ppWritePackedMsg, end, pack_cqi_indication_body_value) &&
-			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-
-}
-
-static uint8_t pack_lbt_pdsch_req_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_lbt_pdsch_req_pdu_rel13_t* value = (nfapi_lbt_pdsch_req_pdu_rel13_t*)tlv;
-	
-	return ( push32(value->handle, ppWritePackedMsg, end) &&
-			 push32(value->mp_cca, ppWritePackedMsg, end) &&
-			 push32(value->n_cca, ppWritePackedMsg, end) &&
-			 push32(value->offset, ppWritePackedMsg, end) &&
-			 push32(value->lte_txop_sf, ppWritePackedMsg, end) &&
-			 push16(value->txop_sfn_sf_end, ppWritePackedMsg, end) &&
-			 push32(value->lbt_mode, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_drs_req_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_lbt_drs_req_pdu_rel13_t* value = (nfapi_lbt_drs_req_pdu_rel13_t*)tlv;
-	
-	return ( push32(value->handle, ppWritePackedMsg, end) &&
-			 push32(value->offset, ppWritePackedMsg, end) &&
-			 push16(value->sfn_sf_end, ppWritePackedMsg, end) &&
-			 push32(value->lbt_mode, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_dl_config_request_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_lbt_dl_config_request_body_t* value = (nfapi_lbt_dl_config_request_body_t*)tlv;
-	
-	if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	uint16_t i = 0;
-	uint16_t total_number_of_pdus = value->number_of_pdus;
-	for(; i < total_number_of_pdus; ++i)
-	{
-		nfapi_lbt_dl_config_request_pdu_t* pdu = &(value->lbt_dl_config_req_pdu_list[i]);
-		
-		if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
-			return 0;
-
-		// Put a 0 size in and then determine the size after the pdu 
-		// has been writen and write the calculated size
-		uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg;
-		pdu->pdu_size = 0;
-		if( push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
-			return 0;
-
-		switch(pdu->pdu_type)
-		{
-			case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE:
-				{
-					if( pack_tlv(NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_req_pdu_rel13_value) == 0)
-						return 0;
-				}
-				break;
-			case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE:
-				{
-					if(pack_tlv(NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_req_pdu_rel13_value) == 0)
-						return 0;
-				}
-				break;
-			default:
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request invalid pdu type %d \n", pdu->pdu_type );
-				}
-				break;
-		};
-
-		// add 1 for the pdu_type. The delta will include the pdu_size
-		pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
-		push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-	}
-
-	return 1;
-}
-
-static uint8_t pack_lbt_pdsch_rsp_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_lbt_pdsch_rsp_pdu_rel13_t* value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t*)tlv;
-	
-	return ( push32(value->handle, ppWritePackedMsg, end) &&
-			 push32(value->result, ppWritePackedMsg, end) &&
-			 push32(value->lte_txop_symbols, ppWritePackedMsg, end) &&
-			 push32(value->initial_partial_sf, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_drs_rsp_pdu_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_lbt_drs_rsp_pdu_rel13_t* value = (nfapi_lbt_drs_rsp_pdu_rel13_t*)tlv;
-	
-	return ( push32(value->handle, ppWritePackedMsg, end) &&
-			 push32(value->result, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t*)msg;
-	
-	return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-			 pack_tlv(NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, ppWritePackedMsg, end, &pack_lbt_dl_config_request_body_value) &&
-			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_lbt_dl_config_indication_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_lbt_dl_indication_body_t* value = (nfapi_lbt_dl_indication_body_t*)tlv;
-	
-	if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	uint16_t i = 0;
-	uint16_t total_number_of_pdus = value->number_of_pdus;
-	for(; i < total_number_of_pdus; ++i)
-	{
-		nfapi_lbt_dl_indication_pdu_t* pdu = &(value->lbt_indication_pdu_list[i]);
-		
-		if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
-			return 0;
-
-		// Put a 0 size in and then determine the size after the pdu 
-		// has been writen and write the calculated size
-		uint8_t* pWritePackedMsgPduSize = *ppWritePackedMsg;
-		pdu->pdu_size = 0;
-		
-		if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
-			return 0;
-
-		switch(pdu->pdu_type)
-		{
-			case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE:
-				{
-					if( pack_tlv(NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_rsp_pdu_rel13_value) == 0)
-						return 0;
-				}
-				break;
-			case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE:
-				{
-					if( pack_tlv(NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_rsp_pdu_rel13_value) == 0)
-						return 0;
-				}
-				break;
-			default:
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d \n", pdu->pdu_type );
-				}
-				break;
-		};
-
-		// add 1 for the pdu_type. The delta will include the pdu_size
-		pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
-		push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-	}
-
-	return 1;
-}
-
-static uint8_t pack_lbt_dl_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t*)msg;
-	
-	return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-			 pack_tlv(NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, ppWritePackedMsg, end, &pack_lbt_dl_config_indication_value) &&
-			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nb_harq_indication_fdd_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nb_harq_indication_fdd_rel13_t* nb_harq_indication_fdd_rel13 = (nfapi_nb_harq_indication_fdd_rel13_t*)tlv;
-	
-	return ( push8(nb_harq_indication_fdd_rel13->harq_tb1, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_nb_harq_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nb_harq_indication_body_t* value = (nfapi_nb_harq_indication_body_t*)tlv;
-	
-	if( push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	uint16_t i = 0;
-	uint16_t total_number_of_harqs = value->number_of_harqs;
-	for(; i < total_number_of_harqs; ++i)
-	{
-		nfapi_nb_harq_indication_pdu_t* pdu = &(value->nb_harq_pdu_list[i]);
-		
-		uint8_t* instance_length_p = *ppWritePackedMsg;
-		if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-			return 0;
-
-		if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
-			 pack_tlv(NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_nb_harq_indication_fdd_rel13_value) &&
-			 pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
-			return 0;
-			
-		// calculate the instance length subtracting the size of the instance
-		// length feild
-		uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-		push16(instance_length, &instance_length_p, end);
-	}
-
-	return 1;
-}
-
-
-static uint8_t pack_nb_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t*)msg;
-	
-	return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-			 pack_tlv(NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, ppWritePackedMsg, end, &pack_nb_harq_indication_body_value) &&
-			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nrach_indication_rel13_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nrach_indication_pdu_rel13_t* nrach_indication_fdd_rel13 = (nfapi_nrach_indication_pdu_rel13_t*)tlv;
-	
-	return ( push16(nrach_indication_fdd_rel13->rnti, ppWritePackedMsg, end) &&
-			 push8(nrach_indication_fdd_rel13->initial_sc, ppWritePackedMsg, end) &&
-			 push16(nrach_indication_fdd_rel13->timing_advance, ppWritePackedMsg, end) &&
-			 push8(nrach_indication_fdd_rel13->nrach_ce_level, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_nrach_indication_body_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-{
-	nfapi_nrach_indication_body_t* value = (nfapi_nrach_indication_body_t*)tlv;
-	
-	if( push8(value->number_of_initial_scs_detected, ppWritePackedMsg, end) == 0)
-		return 0;
-
-	uint16_t i = 0;
-	uint16_t total_number_of_initial_scs_detected = value->number_of_initial_scs_detected;
-	for(; i < total_number_of_initial_scs_detected; ++i)
-	{
-		nfapi_nrach_indication_pdu_t* pdu = &(value->nrach_pdu_list[i]);
-		
-		//uint8_t* instance_length_p = *ppWritePackedMsg;
-		//if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-		//	return 0;
-
-		if(!(pack_tlv(NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, ppWritePackedMsg, end, pack_nrach_indication_rel13_value)))
-			return 0;
-			
-		// calculate the instance length subtracting the size of the instance
-		// length feild
-		//uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-		//push16(instance_length, &instance_length_p, end);
-	}
-
-	return 1;
-}
-
-static uint8_t pack_nrach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t*)msg;
-	
-	return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-			 pack_tlv(NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, ppWritePackedMsg, end, &pack_nrach_indication_body_value) &&
-			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t*)msg;
-
-	return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
-			 pushs32(pNfapiMsg->delta_sfn_slot, ppWritePackedMsg, end) &&
-			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t*)msg;
-
-	return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
-			 pushs32(pNfapiMsg->delta_sfn_sf, ppWritePackedMsg, end) &&
-			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t*)msg;
-
-	return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
-			push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
-			push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
-			pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t*)msg;
-
-	return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
-			push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
-			push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
-			pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t*)msg;
-    
-	return (push32(pNfapiMsg->last_sfn_sf, ppWritePackedMsg, end) &&
-			push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
-			push32(pNfapiMsg->dl_config_jitter, ppWritePackedMsg, end) &&
-			push32(pNfapiMsg->tx_request_jitter, ppWritePackedMsg, end) &&
-			push32(pNfapiMsg->ul_config_jitter, ppWritePackedMsg, end) &&
-			push32(pNfapiMsg->hi_dci0_jitter, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->dl_config_latest_delay, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->tx_request_latest_delay, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->ul_config_latest_delay, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->hi_dci0_latest_delay, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->dl_config_earliest_arrival, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->tx_request_earliest_arrival, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->ul_config_earliest_arrival, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->hi_dci0_earliest_arrival, ppWritePackedMsg, end) &&
-			pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t*)msg;
-    
-	return (push32(pNfapiMsg->last_sfn, ppWritePackedMsg, end) &&
-			push32(pNfapiMsg->last_slot, ppWritePackedMsg, end) &&
-			push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
-			push32(pNfapiMsg->dl_tti_jitter, ppWritePackedMsg, end) &&
-			push32(pNfapiMsg->tx_data_request_jitter, ppWritePackedMsg, end) &&
-			push32(pNfapiMsg->ul_tti_jitter, ppWritePackedMsg, end) &&
-			push32(pNfapiMsg->ul_dci_jitter, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->dl_tti_latest_delay, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->tx_data_request_latest_delay, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->ul_tti_latest_delay, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->ul_dci_latest_delay, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->dl_tti_earliest_arrival, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->tx_data_request_earliest_arrival, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->ul_tti_earliest_arrival, ppWritePackedMsg, end) &&
-			pushs32(pNfapiMsg->ul_dci_earliest_arrival, ppWritePackedMsg, end) &&
-			pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-
-// Main pack function - public
-
-int nfapi_nr_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config)
-{
-	nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
-	uint8_t *pWritePackedMessage = pPackedBuf;
-	uint8_t *pPackedLengthField = &pWritePackedMessage[4];
-	uint8_t *end = pPackedBuf + packedBufLen;
-
-	if (pMessageBuf == NULL || pPackedBuf == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
-		return -1;
-	}
-	/*
-	printf("\n P7 MESSAGE SENT: \n");
-	for(int i=0; i< packedBufLen; i++){
-		printf("%d", *(uint8_t *)(pMessageBuf + i));
-	}
-	printf("\n");
-	*/
-	// process the header
-	if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
-		 push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
-		 push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
-		 push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
-		 push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
-		 push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end)))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
-		return -1;
-	}
-
-        if (pMessageHeader->message_id != NFAPI_TIMING_INFO)
-        {
-          //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() message_id:0x%04x phy_id:%u m_segment_sequence:%u timestamp:%u\n", __FUNCTION__, pMessageHeader->message_id, pMessageHeader->phy_id, pMessageHeader->m_segment_sequence, pMessageHeader->transmit_timestamp);
-        }
-	// look for the specific message
-	uint8_t result = 0;
-	switch (pMessageHeader->message_id)
-	{
-		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
-			result = pack_dl_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
-			result = pack_ul_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-		case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
-			result = pack_tx_data_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-		case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
-			result = pack_ul_dci_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-		
-		case NFAPI_UE_RELEASE_REQUEST:
-			result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_UE_RELEASE_RESPONSE:
-			result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_HARQ_INDICATION:
-			result = pack_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_CRC_INDICATION:
-			result = pack_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_RX_ULSCH_INDICATION:
-                        //printf("RX ULSCH\n");
-			result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_RACH_INDICATION:
-			result = pack_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_SRS_INDICATION:
-			result = pack_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_RX_SR_INDICATION:
-			result = pack_sr_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_RX_CQI_INDICATION:
-			result = pack_cqi_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_LBT_DL_CONFIG_REQUEST:
-			result = pack_lbt_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_LBT_DL_INDICATION:
-			result = pack_lbt_dl_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NB_HARQ_INDICATION:
-			result = pack_nb_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NRACH_INDICATION:
-			result = pack_nrach_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
-			result = pack_nr_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
-			result = pack_nr_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_TIMING_INFO:
-			result = pack_nr_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		default:
-			{
-				if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-				   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
-				{
-					if(config && config->pack_p7_vendor_extension)
-					{
-						result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
-					}
-					else
-					{
-						NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-					}
-				}
-				else
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-				}
-			}
-			break;
-	}
-
-	if(result == 0)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
-		return -1;
-	}
-
-	// check for a valid message length
-	uintptr_t msgHead = (uintptr_t)pPackedBuf;
-	uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
-	uint32_t packedMsgLen = msgEnd - msgHead;
-	uint16_t packedMsgLen16;
-	if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
-		return -1;
-	}
-	else
-	{
-		packedMsgLen16 = (uint16_t)packedMsgLen;
-	}
-
-	// Update the message length in the header
-	pMessageHeader->message_length = packedMsgLen16;
-	
-	if(!push16(packedMsgLen16, &pPackedLengthField, end))
-		return -1;
-		
-	if(1)
-	{
-		//quick test
-		if(pMessageHeader->message_length != packedMsgLen)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
-		}
-	}
-
-	return (packedMsgLen);
-}
-
-int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config)
-{
-	nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
-	uint8_t *pWritePackedMessage = pPackedBuf;
-	uint8_t *pPackedLengthField = &pWritePackedMessage[4];
-	uint8_t *end = pPackedBuf + packedBufLen;
-
-	if (pMessageBuf == NULL || pPackedBuf == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
-		return -1;
-	}
-	/*
-	printf("\n P7 MESSAGE SENT: \n");
-	for(int i=0; i< packedBufLen; i++){
-		printf("%d", *(uint8_t *)(pMessageBuf + i));
-	}
-	printf("\n");
-	*/
-	// process the header
-	if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
-		 push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
-		 push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
-		 push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
-		 push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
-		 push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end)))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
-		return -1;
-	}
-
-        if (pMessageHeader->message_id != NFAPI_TIMING_INFO)
-        {
-          //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() message_id:0x%04x phy_id:%u m_segment_sequence:%u timestamp:%u\n", __FUNCTION__, pMessageHeader->message_id, pMessageHeader->phy_id, pMessageHeader->m_segment_sequence, pMessageHeader->transmit_timestamp);
-        }
-	// look for the specific message
-	uint8_t result = 0;
-	switch (pMessageHeader->message_id)
-	{
-		case NFAPI_DL_CONFIG_REQUEST:
-                  //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST\n", __FUNCTION__);
-			result = pack_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_UL_CONFIG_REQUEST:
-			result = pack_ul_config_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-        case NFAPI_TX_REQUEST:
-            //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_TX_REQUEST\n", __FUNCTION__);
-			result = pack_tx_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-		case NFAPI_HI_DCI0_REQUEST:
-			result = pack_hi_dci0_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-		
-		case NFAPI_UE_RELEASE_REQUEST:
-			result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_UE_RELEASE_RESPONSE:
-			result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_HARQ_INDICATION:
-			result = pack_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_CRC_INDICATION:
-			result = pack_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_RX_ULSCH_INDICATION:
-                        //printf("RX ULSCH\n");
-			result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_RACH_INDICATION:
-			result = pack_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_SRS_INDICATION:
-			result = pack_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_RX_SR_INDICATION:
-			result = pack_sr_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_RX_CQI_INDICATION:
-			result = pack_cqi_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_LBT_DL_CONFIG_REQUEST:
-			result = pack_lbt_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_LBT_DL_INDICATION:
-			result = pack_lbt_dl_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NB_HARQ_INDICATION:
-			result = pack_nb_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_NRACH_INDICATION:
-			result = pack_nrach_indication(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_DL_NODE_SYNC:
-			result = pack_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_UL_NODE_SYNC:
-			result = pack_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		case NFAPI_TIMING_INFO:
-			result = pack_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
-			break;
-
-		default:
-			{
-				if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-				   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
-				{
-					if(config && config->pack_p7_vendor_extension)
-					{
-						result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
-					}
-					else
-					{
-						NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-					}
-				}
-				else
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-				}
-			}
-			break;
-	}
-
-	if(result == 0)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
-		return -1;
-	}
-
-	// check for a valid message length
-	uintptr_t msgHead = (uintptr_t)pPackedBuf;
-	uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
-	uint32_t packedMsgLen = msgEnd - msgHead;
-	uint16_t packedMsgLen16;
-	if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
-		return -1;
-	}
-	else
-	{
-		packedMsgLen16 = (uint16_t)packedMsgLen;
-	}
-
-	// Update the message length in the header
-	pMessageHeader->message_length = packedMsgLen16;
-	
-	if(!push16(packedMsgLen16, &pPackedLengthField, end))
-		return -1;
-		
-	if(1)
-	{
-		//quick test
-		if(pMessageHeader->message_length != packedMsgLen)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
-		}
-	}
-
-	return (packedMsgLen);
-}
-
-// Unpack routines
-// NR:
-static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nr_dl_tti_csi_rs_pdu_rel15_t* value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t*)tlv;
-
-	return(
-		pull16(ppReadPackedMsg, &value->bwp_size, end) &&
-		pull16(ppReadPackedMsg, &value->bwp_start, end) &&
-
-		pull8(ppReadPackedMsg, &value->subcarrier_spacing, end) &&
-		pull8(ppReadPackedMsg, &value->cyclic_prefix, end) &&
-
-		pull16(ppReadPackedMsg, &value->start_rb, end) &&
-		pull16(ppReadPackedMsg, &value->nr_of_rbs, end) &&
-
-		pull8(ppReadPackedMsg, &value->csi_type, end) &&
-		pull8(ppReadPackedMsg, &value->row, end) &&
-
-		pull16(ppReadPackedMsg, &value->freq_domain, end) &&
-		pull8(ppReadPackedMsg, &value->symb_l0, end) &&
-
-		pull8(ppReadPackedMsg, &value->symb_l1, end) &&
-		pull8(ppReadPackedMsg, &value->cdm_type, end) &&
-
-		pull8(ppReadPackedMsg, &value->freq_density, end) &&
-		pull16(ppReadPackedMsg, &value->scramb_id, end) &&
-
-		pull8(ppReadPackedMsg, &value->power_control_offset, end) &&
-		pull8(ppReadPackedMsg, &value->power_control_offset_ss, end)
-	);
-
-}
-
-
-static uint8_t unpack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nr_dl_tti_pdcch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t*)tlv;
-	
-	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
-	{
-		if(!pull16(ppReadPackedMsg, &value->dci_pdu[i].RNTI, end) &&
-		pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingId, end) &&
-
-		pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingRNTI, end) &&
-		pull8(ppReadPackedMsg, &value->dci_pdu[i].CceIndex, end) &&
-		pull8(ppReadPackedMsg, &value->dci_pdu[i].AggregationLevel, end) &&
-		pull8(ppReadPackedMsg, &value->dci_pdu[i].beta_PDCCH_1_0, end) &&
-
-		pull8(ppReadPackedMsg, &value->dci_pdu[i].powerControlOffsetSS, end) &&
-		pull16(ppReadPackedMsg, &value->dci_pdu[i].PayloadSizeBits, end) &&
-		
-		pullarray8(ppReadPackedMsg, value->dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->dci_pdu[i].PayloadSizeBits, end));
-			
-		return 0;
-	}
-
-	// TODO: resolve the packaging of array (currently sending a single element)
-	return(
-		pull16(ppReadPackedMsg, &value->BWPSize, end) &&
-		pull16(ppReadPackedMsg, &value->BWPStart, end) &&
-		pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
-		pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
-
-		pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
-		pull8(ppReadPackedMsg, &value->DurationSymbols, end) &&
-		pullarray8(ppReadPackedMsg, value->FreqDomainResource, 6, 6, end) &&
-		pull8(ppReadPackedMsg, &value->CceRegMappingType, end) &&
-
-		pull8(ppReadPackedMsg, &value->RegBundleSize, end) &&
-		pull8(ppReadPackedMsg, &value->InterleaverSize, end) &&
-		pull8(ppReadPackedMsg, &value->CoreSetType, end) &&
-		pull16(ppReadPackedMsg, &value->ShiftIndex, end) &&
-
-		pull8(ppReadPackedMsg, &value->precoderGranularity, end) &&
-		pull16(ppReadPackedMsg, &value->numDlDci, end));
-
-}
-
-
-static uint8_t unpack_dl_tti_pdsch_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nr_dl_tti_pdsch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t*)tlv;
-
-	// TODO: resolve the packaging of array (currently sending a single element)
-	return(
-		pull16(ppReadPackedMsg, &value->pduBitmap, end) &&
-		pull16(ppReadPackedMsg, &value->rnti, end) &&
-		pull16(ppReadPackedMsg, &value->pduIndex, end) &&
-		pull16(ppReadPackedMsg, &value->BWPSize, end) &&
-		
-		pull16(ppReadPackedMsg, &value->BWPStart, end) &&
-		pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
-		pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
-		pull8(ppReadPackedMsg, &value->NrOfCodewords, end) &&
-		
-		pullarray16(ppReadPackedMsg, value->targetCodeRate, 2, 1, end) &&
-		pullarray8(ppReadPackedMsg, value->qamModOrder, 2, 1, end) &&
-		pullarray8(ppReadPackedMsg, value->mcsIndex, 2, 1, end) &&
-        pullarray8(ppReadPackedMsg, value->mcsTable, 2, 1, end) &&
-		
-		pullarray8(ppReadPackedMsg, value->rvIndex, 2, 1, end) &&
-	    pullarray32(ppReadPackedMsg, value->TBSize, 2, 1, end) &&
-	    pull16(ppReadPackedMsg, &value->dataScramblingId, end) &&
-		pull8(ppReadPackedMsg, &value->nrOfLayers, end) &&
-		
-		pull8(ppReadPackedMsg, &value->transmissionScheme, end) &&
-		pull8(ppReadPackedMsg, &value->refPoint, end) &&
-		pull16(ppReadPackedMsg, &value->dlDmrsSymbPos, end) &&
-		pull8(ppReadPackedMsg, &value->dmrsConfigType, end) &&
-		
-		pull16(ppReadPackedMsg, &value->dlDmrsScramblingId, end) &&
-		pull8(ppReadPackedMsg, &value->SCID, end) &&
-		pull8(ppReadPackedMsg, &value->numDmrsCdmGrpsNoData, end) &&
-		pull16(ppReadPackedMsg, &value->dmrsPorts, end) &&
-
-		pull8(ppReadPackedMsg, &value->resourceAlloc, end) &&
-		pull16(ppReadPackedMsg, &value->rbStart, end) &&
-		pull16(ppReadPackedMsg, &value->rbSize, end) &&
-
-		pull8(ppReadPackedMsg, &value->VRBtoPRBMapping, end) &&
-		pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
-		pull8(ppReadPackedMsg, &value->NrOfSymbols, end) &&
-		pull8(ppReadPackedMsg, &value->PTRSPortIndex, end) &&
-
-		pull8(ppReadPackedMsg, &value->PTRSTimeDensity, end) &&
-		pull8(ppReadPackedMsg, &value->PTRSFreqDensity, end) &&
-		pull8(ppReadPackedMsg, &value->PTRSReOffset, end) 	
-	);
-
-}
-
-
-static uint8_t unpack_dl_tti_ssb_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nr_dl_tti_ssb_pdu_rel15_t* value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t*)tlv;
-
-	return(
-		pull16(ppReadPackedMsg, &value->PhysCellId, end) &&
-		pull8(ppReadPackedMsg, &value->BetaPss, end) &&
-		pull8(ppReadPackedMsg, &value->SsbBlockIndex, end) &&
-		pull8(ppReadPackedMsg, &value->SsbSubcarrierOffset, end) &&
-		pull16(ppReadPackedMsg, &value->ssbOffsetPointA, end) &&
-		pull8(ppReadPackedMsg, &value->bchPayloadFlag, end) &&
-		pull32(ppReadPackedMsg, &value->bchPayload, end)	
-		// TODO: pack precoding_and_beamforming too
-	);
-
-}
-
-
-// LTE:
-static uint8_t unpack_dl_config_dci_dl_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dci_dl_pdu_rel8_t* dci_dl_pdu_rel8 = (nfapi_dl_config_dci_dl_pdu_rel8_t*)tlv; 
-
-	return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->dci_format, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->cce_idx, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->aggregation_level, end) &&
-			pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_allocation_type, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
-			pull32(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_block_coding, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_1, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_1, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_1, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_2, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_2, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_2, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->harq_process, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpmi, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->pmi, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->precoding_information, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpc, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_assignment_index, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->ngap, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_size_index, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_power_offset, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->allocate_prach_flag, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->preamble_index, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->prach_mask_index, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti_type, end) &&
-			pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->transmission_power, end));
-
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dci_dl_pdu_rel9_t* dci_dl_pdu_rel9 = (nfapi_dl_config_dci_dl_pdu_rel9_t*)tlv;
-	
-	return ( pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_flag, end) &&
-			 pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_change_notification, end) &&
-			 pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->scrambling_identity, end));
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dci_dl_pdu_rel10_t* dci_dl_pdu_rel10 = (nfapi_dl_config_dci_dl_pdu_rel10_t*)tlv;
-
-	return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->cross_carrier_scheduling_flag, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->carrier_indicator, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_flag, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_request, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->antenna_ports_scrambling_and_layers, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->total_dci_length_including_padding, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->n_dl_rb, end));
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dci_dl_pdu_rel11_t* dci_dl_pdu_rel11 = (nfapi_dl_config_dci_dl_pdu_rel11_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->harq_ack_resource_offset, end) && 
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->pdsch_re_mapping_quasi_co_location_indicator, end));
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dci_dl_pdu_rel12_t* dci_dl_pdu_rel12 = (nfapi_dl_config_dci_dl_pdu_rel12_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->primary_cell_type, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->ul_dl_configuration_flag, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->number_ul_dl_configurations, end) &&
-			pullarray8(ppReadPackedMsg, dci_dl_pdu_rel12->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, dci_dl_pdu_rel12->number_ul_dl_configurations, end));
-}
-
-static uint8_t unpack_tpm_value(uint8_t **ppReadPackedMsg, nfapi_dl_config_dci_dl_tpm_t *value, uint8_t *end)
-{
-	if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) && 
-		 pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
-		 pull8(ppReadPackedMsg, &value->num_antennas, end)))
-		return 0;
-	
-	
-	uint8_t idx = 0;
-	for(idx = 0; idx < value->number_of_subbands; ++idx)
-	{
-		nfapi_dl_config_dci_dl_tpm_subband_info_t* subband_info = &(value->subband_info[idx]);
-		
-		if(!(pull8(ppReadPackedMsg, &subband_info->subband_index, end) &&
-			 pull8(ppReadPackedMsg, &subband_info->scheduled_ues, end)))
-			return 0;
-			
-		uint8_t antenna_idx = 0;
-		uint8_t scheduled_ue_idx = 0;
-		
-		for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx)
-		{
-			for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx)
-			{
-				if(!pull16(ppReadPackedMsg, &(subband_info->precoding_value[antenna_idx][scheduled_ue_idx]), end))
-					return 0;
-			}
-		}
-
-	}
-	
-	
-	return 1;
-			
-}
-
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dci_dl_pdu_rel13_t* dci_dl_pdu_rel13 = (nfapi_dl_config_dci_dl_pdu_rel13_t*)tlv;
-	
-	// If the length is greater than 5 then the TPM struct flag and possiably the TPM structure have been 
-	// added
-	uint8_t tpm_struct_flag_present = dci_dl_pdu_rel13->tl.length > 5;
-	dci_dl_pdu_rel13->tpm_struct_flag = 0;
-	
-	return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_flag, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_configuration, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->initial_lbt_sf, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->codebook_size_determination, end) &&
-			pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->drms_table_flag, end) && 
-			( (tpm_struct_flag_present == 1) ? pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm_struct_flag, end) : 1) &&
-			( (tpm_struct_flag_present == 1 &&  dci_dl_pdu_rel13->tpm_struct_flag == 1) ? unpack_tpm_value(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm, end) : 1));
-			
-}
-
-static uint8_t unpack_dl_config_bch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_bch_pdu_rel8_t* bch_pdu_rel8 = (nfapi_dl_config_bch_pdu_rel8_t*)tlv;
-	
-	return ( pull16(ppReadPackedMsg, &bch_pdu_rel8->length, end) &&
-			 pull16(ppReadPackedMsg, (uint16_t *)&bch_pdu_rel8->pdu_index, end) &&
-			 pull16(ppReadPackedMsg, &bch_pdu_rel8->transmission_power, end));
-}
-
-static uint8_t unpack_dl_config_mch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_mch_pdu_rel8_t* mch_pdu_rel8 = (nfapi_dl_config_mch_pdu_rel8_t*)tlv;
-	
-	return (pull16(ppReadPackedMsg, &mch_pdu_rel8->length, end) &&
-			pull16(ppReadPackedMsg, (uint16_t *)&mch_pdu_rel8->pdu_index, end) &&
-			pull16(ppReadPackedMsg, &mch_pdu_rel8->rnti, end) &&
-			pull8(ppReadPackedMsg, &mch_pdu_rel8->resource_allocation_type, end) &&
-			pull32(ppReadPackedMsg, &mch_pdu_rel8->resource_block_coding, end) &&
-			pull8(ppReadPackedMsg, &mch_pdu_rel8->modulation, end) &&
-			pull16(ppReadPackedMsg, &mch_pdu_rel8->transmission_power, end) &&
-			pull16(ppReadPackedMsg, &mch_pdu_rel8->mbsfn_area_id, end));
-}
-
-static uint8_t unpack_dl_config_dlsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dlsch_pdu_rel8_t* dlsch_pdu_rel8 = (nfapi_dl_config_dlsch_pdu_rel8_t*)tlv;
-	
-	if (!(pull16(ppReadPackedMsg, &dlsch_pdu_rel8->length, end) &&
-		  pull16(ppReadPackedMsg, (uint16_t *)&dlsch_pdu_rel8->pdu_index, end) &&
-		  pull16(ppReadPackedMsg, &dlsch_pdu_rel8->rnti, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->resource_allocation_type, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
-		  pull32(ppReadPackedMsg, &dlsch_pdu_rel8->resource_block_coding, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->modulation, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->redundancy_version, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_blocks, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_scheme, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_layers, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_subbands, end) &&
-		  pullarray8(ppReadPackedMsg, dlsch_pdu_rel8->codebook_index, NFAPI_MAX_NUM_SUBBANDS, dlsch_pdu_rel8->number_of_subbands, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ue_category_capacity, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->pa, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->delta_power_offset_index, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ngap, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->nprb, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_mode, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_prb_per_subband, end) &&
-		  pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_vector, end)))
-		return 0;
-
-	uint16_t j = 0;
-	for(j = 0; j < dlsch_pdu_rel8->num_bf_vector; ++j)
-	{								
-		if(!(pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].subband_index, end) &&
-			 pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].num_antennas, end) &&
-			 pullarray16(ppReadPackedMsg, dlsch_pdu_rel8->bf_vector[j].bf_value, NFAPI_MAX_NUM_ANTENNAS, dlsch_pdu_rel8->bf_vector[j].num_antennas, end)))
-			return 0;
-	}
-	return 1;
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dlsch_pdu_rel9_t* dlsch_pdu_rel9 = (nfapi_dl_config_dlsch_pdu_rel9_t*)tlv;
-	return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel9->nscid, end) );
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dlsch_pdu_rel10_t* dlsch_pdu_rel10 = (nfapi_dl_config_dlsch_pdu_rel10_t*)tlv;
-	
-	return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_flag, end) &&
-			 pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_resource_config_r10, end) &&
-			 pull16(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
-			 pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
-			 pullarray8(ppReadPackedMsg, dlsch_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
-			 pull8(ppReadPackedMsg, &dlsch_pdu_rel10->pdsch_start, end)) ;
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dlsch_pdu_rel11_t* dlsch_pdu_rel11 = (nfapi_dl_config_dlsch_pdu_rel11_t*)tlv;
-	
-	return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel11->drms_config_flag, end) &&
-			 pull16(ppReadPackedMsg, &dlsch_pdu_rel11->drms_scrambling, end) &&
-			 pull8(ppReadPackedMsg, &dlsch_pdu_rel11->csi_config_flag, end) &&
-			 pull16(ppReadPackedMsg, &dlsch_pdu_rel11->csi_scrambling, end) &&
-			 pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_flag, end) &&
-			 pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_atenna_ports, end) &&
-			 pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_freq_shift, end));
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dlsch_pdu_rel12_t* dlsch_pdu_rel12 = (nfapi_dl_config_dlsch_pdu_rel12_t*)tlv;
-	
-	return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel12->altcqi_table_r12, end) &&
-			 pull8(ppReadPackedMsg, &dlsch_pdu_rel12->maxlayers, end) &&
-			 pull8(ppReadPackedMsg, &dlsch_pdu_rel12->n_dl_harq, end));
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_dlsch_pdu_rel13_t* dlsch_pdu_rel13 = (nfapi_dl_config_dlsch_pdu_rel13_t*)tlv;
-	
-	return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel13->dwpts_symbols, end) &&
-			 pull8(ppReadPackedMsg, &dlsch_pdu_rel13->initial_lbt_sf, end) &&
-			 pull8(ppReadPackedMsg, &dlsch_pdu_rel13->ue_type, end) &&
-			 pull8(ppReadPackedMsg, &dlsch_pdu_rel13->pdsch_payload_type, end) &&
-			 pull16(ppReadPackedMsg, &dlsch_pdu_rel13->initial_transmission_sf_io, end) &&
-			 pull8(ppReadPackedMsg, &dlsch_pdu_rel13->drms_table_flag, end));
-}
-
-static uint8_t unpack_dl_config_pch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_pch_pdu_rel8_t* pch_pdu_rel8 = (nfapi_dl_config_pch_pdu_rel8_t*)tlv;
-	
-	return ( pull16(ppReadPackedMsg, &pch_pdu_rel8->length, end) &&
-			 pull16(ppReadPackedMsg, (uint16_t *)&pch_pdu_rel8->pdu_index, end) &&
-			 pull16(ppReadPackedMsg, &pch_pdu_rel8->p_rnti, end) &&
-			 pull8(ppReadPackedMsg, &pch_pdu_rel8->resource_allocation_type, end) &&
-			 pull8(ppReadPackedMsg, &pch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
-			 pull32(ppReadPackedMsg, &pch_pdu_rel8->resource_block_coding, end) &&
-			 pull8(ppReadPackedMsg, &pch_pdu_rel8->mcs, end) &&
-			 pull8(ppReadPackedMsg, &pch_pdu_rel8->redundancy_version, end) &&
-			 pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_transport_blocks, end) &&
-			 pull8(ppReadPackedMsg, &pch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
-			 pull8(ppReadPackedMsg, &pch_pdu_rel8->transmission_scheme, end) &&
-			 pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_layers, end) &&
-			 pull8(ppReadPackedMsg, &pch_pdu_rel8->codebook_index, end) &&
-			 pull8(ppReadPackedMsg, &pch_pdu_rel8->ue_category_capacity, end) &&
-			 pull8(ppReadPackedMsg, &pch_pdu_rel8->pa, end) &&
-			 pull16(ppReadPackedMsg, &pch_pdu_rel8->transmission_power, end) &&
-			 pull8(ppReadPackedMsg, &pch_pdu_rel8->nprb, end) &&
-			 pull8(ppReadPackedMsg, &pch_pdu_rel8->ngap, end));
-}
-static uint8_t unpack_dl_config_pch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_pch_pdu_rel13_t* pch_pdu_rel13 = (nfapi_dl_config_pch_pdu_rel13_t*)tlv;
-	
-	return ( pull8(ppReadPackedMsg, &pch_pdu_rel13->ue_mode, end) &&
-			 pull16(ppReadPackedMsg, &pch_pdu_rel13->initial_transmission_sf_io, end));
-}
-
-static uint8_t unpack_dl_config_prs_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_prs_pdu_rel9_t* prs_pdu_rel9 = (nfapi_dl_config_prs_pdu_rel9_t*)tlv;
-	
-	return ( pull16(ppReadPackedMsg, &prs_pdu_rel9->transmission_power, end) &&
-			 pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_bandwidth, end) &&
-			 pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_cyclic_prefix_type, end) &&
-			 pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_muting, end));
-}
-
-static uint8_t unpack_dl_config_csi_rs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_csi_rs_pdu_rel10_t* csi_rs_pdu_rel10 = (nfapi_dl_config_csi_rs_pdu_rel10_t*)tlv;
-	
-	return ( pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_antenna_port_count_r10, end) &&
-			 pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_resource_config_r10, end) &&
-			 pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->transmission_power, end) &&
-			 pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
-			 pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end) &&
-			 pullarray8(ppReadPackedMsg, csi_rs_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end));
-}
-
-static uint8_t unpack_dl_config_csi_rs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_csi_rs_pdu_rel13_t* csi_rs_pdu_rel13 = (nfapi_dl_config_csi_rs_pdu_rel13_t*)tlv;
-	
-	if (!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->csi_rs_class, end) &&
-		  pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->cdm_type, end) &&
-		  pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->num_bf_vector, end)))
-		return 0;
-
-	
-	uint16_t idx =0;
-	for(idx = 0; idx < csi_rs_pdu_rel13->num_bf_vector; ++idx)
-	{
-		if(!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].csi_rs_resource_index, end)))
-			return 0;
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : HOW TO DECODE BF VALUE \n");
-		//pullarray16(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].bf_vector, ??);
-	}
-	return 1;
-}
-
-static uint8_t unpack_dl_config_epdcch_params_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_epdcch_parameters_rel11_t* epdcch_params_rel11 = (nfapi_dl_config_epdcch_parameters_rel11_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_resource_assignment_flag, end) &&
-			pull16(ppReadPackedMsg, &epdcch_params_rel11->epdcch_id, end) &&
-			pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_start_symbol, end) &&
-			pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_num_prb, end) &&
-			pullarray8(ppReadPackedMsg, epdcch_params_rel11->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, epdcch_params_rel11->epdcch_num_prb, end) &&
-			pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.subband_index, end) &&
-			pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.num_antennas, end) &&
-			pullarray16(ppReadPackedMsg, epdcch_params_rel11->bf_vector.bf_value, NFAPI_MAX_NUM_ANTENNAS, epdcch_params_rel11->bf_vector.num_antennas, end));
-}
-
-static uint8_t unpack_dl_config_epdcch_params_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_epdcch_parameters_rel13_t* epdcch_params_rel13 = (nfapi_dl_config_epdcch_parameters_rel13_t*)tlv;
-	
-	return ( pull8(ppReadPackedMsg, &epdcch_params_rel13->dwpts_symbols, end) &&
-			 pull8(ppReadPackedMsg, &epdcch_params_rel13->initial_lbt_sf, end));
-}
-
-static uint8_t unpack_dl_config_mpdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_mpdcch_pdu_rel13_t* mpdcch_params_rel13 = (nfapi_dl_config_mpdcch_pdu_rel13_t*)tlv;
-	
-	
-	return ( pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_narrow_band, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_prb_pairs, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_assignment, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_tansmission_type, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->start_symbol, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->ecce_index, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->aggregation_level, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->rnti_type, end) &&
-			 pull16(ppReadPackedMsg, &mpdcch_params_rel13->rnti, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->ce_mode, end) &&
-			 pull16(ppReadPackedMsg, &mpdcch_params_rel13->drms_scrambling_init, end) &&
-			 pull16(ppReadPackedMsg, &mpdcch_params_rel13->initial_transmission_sf_io, end) &&
-			 pull16(ppReadPackedMsg, &mpdcch_params_rel13->transmission_power, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_format, end) &&
-			 pull16(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_coding, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->mcs, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->pdsch_reptition_levels, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->redundancy_version, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->new_data_indicator, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_process, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi_length, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi_flag, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_resource_offset, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_subframe_repetition_number, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpc, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index_length, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->allocate_prach_flag, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->preamble_index, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->prach_mask_index, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->starting_ce_level, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->srs_request, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity_flag, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->frequency_hopping_enabled_flag, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->paging_direct_indication_differentiation_flag, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->direct_indication, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->total_dci_length_including_padding, end) &&
-			 pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_tx_antenna_ports, end) &&
-			 pullarray16(ppReadPackedMsg, mpdcch_params_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_params_rel13->number_of_tx_antenna_ports, end));
-}
-
-
-static uint8_t unpack_dl_config_nbch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_nbch_pdu_rel13_t* nbch_params_rel13 = (nfapi_dl_config_nbch_pdu_rel13_t*)tlv;
-	
-	return ( pull16(ppReadPackedMsg, &nbch_params_rel13->length, end) &&
-			 pull16(ppReadPackedMsg, (uint16_t *)&nbch_params_rel13->pdu_index, end) &&
-			 pull16(ppReadPackedMsg, &nbch_params_rel13->transmission_power, end) &&
-			 pull16(ppReadPackedMsg, &nbch_params_rel13->hyper_sfn_2_lsbs, end));
-}
-
-static uint8_t unpack_dl_config_npdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_npdcch_pdu_rel13_t* npdcch_params_rel13 = (nfapi_dl_config_npdcch_pdu_rel13_t*)tlv;
-	
-	return ( pull16(ppReadPackedMsg, &npdcch_params_rel13->length, end) &&
-			 pull16(ppReadPackedMsg, (uint16_t *)&npdcch_params_rel13->pdu_index, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->ncce_index, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->aggregation_level, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->start_symbol, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->rnti_type, end) &&
-			 pull16(ppReadPackedMsg, &npdcch_params_rel13->rnti, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->scrambling_reinitialization_batch_index, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_format, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->scheduling_delay, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->resource_assignment, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->repetition_number, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->mcs, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->new_data_indicator, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->harq_ack_resource, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->npdcch_order_indication, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->starting_number_of_nprach_repetitions, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->subcarrier_indication_of_nprach, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->paging_direct_indication_differentation_flag, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->direct_indication, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_subframe_repetition_number, end) &&
-			 pull8(ppReadPackedMsg, &npdcch_params_rel13->total_dci_length_including_padding, end));
-}
-
-static uint8_t unpack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_dl_config_ndlsch_pdu_rel13_t* ndlsch_params_rel13 = (nfapi_dl_config_ndlsch_pdu_rel13_t*)tlv;
-	
-	return ( pull16(ppReadPackedMsg, &ndlsch_params_rel13->length, end) &&
-			 pull16(ppReadPackedMsg, (uint16_t *)&ndlsch_params_rel13->pdu_index, end) &&
-			 pull8(ppReadPackedMsg, &ndlsch_params_rel13->start_symbol, end) &&
-			 pull8(ppReadPackedMsg, &ndlsch_params_rel13->rnti_type, end) &&
-			 pull16(ppReadPackedMsg, &ndlsch_params_rel13->rnti, end) &&
-			 pull16(ppReadPackedMsg, &ndlsch_params_rel13->resource_assignment, end) &&
-			 pull16(ppReadPackedMsg, &ndlsch_params_rel13->repetition_number, end) &&
-			 pull8(ppReadPackedMsg, &ndlsch_params_rel13->modulation, end) &&
-			 pull8(ppReadPackedMsg, &ndlsch_params_rel13->number_of_subframes_for_resource_assignment, end) &&
-			 pull8(ppReadPackedMsg, &ndlsch_params_rel13->scrambling_sequence_initialization_cinit, end) &&
-			 pull16(ppReadPackedMsg, &ndlsch_params_rel13->sf_idx, end) &&
-			 pull8(ppReadPackedMsg, &ndlsch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end));
-}
-
-
-static uint8_t unpack_dl_tti_request_body_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
-{
-	nfapi_nr_dl_tti_request_pdu_t* value = (nfapi_nr_dl_tti_request_pdu_t*)msg;
-
-	if(!(pull32(ppReadPackedMsg, &value->PDUSize, end) &&
-	 	 pull16(ppReadPackedMsg, &value->PDUType, end) ))
-		  return 0;
-
-
-	// first match the pdu type, then call the respective function
-	switch(value->PDUType)
-	{
-		case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
-		{
-			if(!(unpack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppReadPackedMsg,end)))
-				return 0;
-		}
-		break;
-
-		case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
-		{
-			if(!(unpack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppReadPackedMsg,end)))
-				return 0;
-		}
-		break;
-		case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
-		{
-			if(!(unpack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppReadPackedMsg,end)))
-				return 0;
-		}
-		break;
-		case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
-		{
-			if(!(unpack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppReadPackedMsg,end)))
-				return 0;
-		}
-		break;
-
-		default:
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
-		}
-		break;
-	}
-
-	return 1;
-}
-
-
-
-
-static uint8_t unpack_dl_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_dl_config_request_body_t* value = (nfapi_dl_config_request_body_t*)tlv;
-
-	if(!(pull8(ppReadPackedMsg, &value->number_pdcch_ofdm_symbols, end) &&
-		 pull8(ppReadPackedMsg, &value->number_dci, end) &&
-		 pull16(ppReadPackedMsg, &value->number_pdu, end) &&
-		 pull8(ppReadPackedMsg, &value->number_pdsch_rnti, end) &&
-		 pull16(ppReadPackedMsg, &value->transmission_power_pcfich, end)))
-		return 0;
-
-	if(value->number_pdu > NFAPI_DL_CONFIG_MAX_PDU)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_pdu, NFAPI_DL_CONFIG_MAX_PDU);
-		return 0;		
-	}
-
-	if(value->number_pdu)
-	{
-		value->dl_config_pdu_list = (nfapi_dl_config_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_dl_config_request_pdu_t) * value->number_pdu, config);
-		if(value->dl_config_pdu_list == NULL)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate dl config pdu list (count:%d)\n", __FUNCTION__, value->number_pdu);
-			return 0;
-		}
-	}
-	else
-	{
-		value->dl_config_pdu_list = 0;
-	}
-
-	uint16_t i;
-	uint16_t total_number_of_pdus = value->number_pdu;
-	for(i = 0; i < total_number_of_pdus; ++i)
-	{
-		nfapi_dl_config_request_pdu_t* pdu = &(value->dl_config_pdu_list[i]);
-		
-		if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
-			 pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
-			return 0;
-					
-		uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
-		if(packedPduEnd > end)
-		{
-			// pdu end of beyond buffer end
-			return 0;
-		}
-
-		switch(pdu->pdu_type)
-		{
-			case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
-						{ NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
-						{ NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
-						{ NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
-						{ NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
-						{ NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_DL_CONFIG_BCH_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, &unpack_dl_config_bch_pdu_rel8_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_DL_CONFIG_MCH_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, &unpack_dl_config_mch_pdu_rel8_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, &unpack_dl_config_dlsch_pdu_rel8_value},
-						{ NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, &unpack_dl_config_dlsch_pdu_rel9_value},
-						{ NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, &unpack_dl_config_dlsch_pdu_rel10_value},
-						{ NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, &unpack_dl_config_dlsch_pdu_rel11_value},
-						{ NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, &unpack_dl_config_dlsch_pdu_rel12_value},
-						{ NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, &unpack_dl_config_dlsch_pdu_rel13_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_DL_CONFIG_PCH_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, &unpack_dl_config_pch_pdu_rel8_value},
-						{ NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, &unpack_dl_config_pch_pdu_rel13_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_DL_CONFIG_PRS_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, &unpack_dl_config_prs_pdu_rel9_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, &unpack_dl_config_csi_rs_pdu_rel10_value},
-						{ NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, &unpack_dl_config_csi_rs_pdu_rel13_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
-						{ NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
-						{ NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
-						{ NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
-						{ NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
-						{ NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
-						{ NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, &unpack_dl_config_epdcch_params_rel11_value},
-						{ NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, &unpack_dl_config_epdcch_params_rel13_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, &unpack_dl_config_mpdcch_pdu_rel13_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_DL_CONFIG_NBCH_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, &unpack_dl_config_nbch_pdu_rel13_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, &unpack_dl_config_npdcch_pdu_rel13_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				
-				}
-				break;
-			case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, &unpack_dl_config_ndlsch_pdu_rel13_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				
-				}
-				break;
-			default:
-				// Need to log an error
-				break;
-		}
-	}
-
-	return 1;
-}
-
-
-static uint8_t unpack_dl_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t*)msg;
-
-	if (!(pull16(ppReadPackedMsg,&pNfapiMsg->SFN, end) &&
-		pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
-		pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nGroup, end) &&
-		pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nPDUs, end) &&
-		pullarray8(ppReadPackedMsg,pNfapiMsg->dl_tti_request_body.nUe ,256,pNfapiMsg->dl_tti_request_body.nGroup, end)
-		//pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
-		))
-			return 0;
-	
-	int arr[12];
-	for(int i=0;i<pNfapiMsg->dl_tti_request_body.nGroup;i++)
-	{
-		for(int j=0;j<pNfapiMsg->dl_tti_request_body.nUe[i];j++)
-		{
-			arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
-		}
-		if(!(pullarrays32(ppReadPackedMsg,arr,12,pNfapiMsg->dl_tti_request_body.nUe[i], end)))
-		return 0;
-	}
-
-	for(int i=0;i<pNfapiMsg->dl_tti_request_body.nPDUs;i++)	
-	{
-		if(!unpack_dl_tti_request_body_value(ppReadPackedMsg, end, &pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i]))
-		return 0;
-	}
-
-return 1;
-}
-
-
-static uint8_t unpack_ul_tti_request_prach_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nr_prach_pdu_t* prach_pdu = (nfapi_nr_prach_pdu_t*)tlv;
-
-	return(
-	pull16(ppReadPackedMsg, &prach_pdu->phys_cell_id, end) &&
-	pull8(ppReadPackedMsg, &prach_pdu->num_prach_ocas, end) &&
-	pull8(ppReadPackedMsg, &prach_pdu->prach_format, end) &&
-	pull8(ppReadPackedMsg, &prach_pdu->num_ra, end) &&
-	pull8(ppReadPackedMsg, &prach_pdu->prach_start_symbol, end) &&
-	pull16(ppReadPackedMsg, &prach_pdu->num_cs, end)
-	// TODO: ignoring beamforming tlv for now
-	);
-}
-
-
-static uint8_t unpack_ul_tti_request_pucch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nr_pucch_pdu_t* pucch_pdu = (nfapi_nr_pucch_pdu_t*)tlv;
-	
-	return(
-		pull16(ppReadPackedMsg, &pucch_pdu->rnti, end) &&
-		pull32(ppReadPackedMsg, &pucch_pdu->handle, end) &&
-		pull16(ppReadPackedMsg, &pucch_pdu->bwp_size, end) &&
-		pull16(ppReadPackedMsg, &pucch_pdu->bwp_start, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->subcarrier_spacing, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->cyclic_prefix, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->format_type, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->multi_slot_tx_indicator, end) &&
-		pull16(ppReadPackedMsg, &pucch_pdu->prb_start, end) &&
-		pull16(ppReadPackedMsg, &pucch_pdu->prb_size, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->start_symbol_index, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->nr_of_symbols, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->freq_hop_flag, end) &&
-		pull16(ppReadPackedMsg, &pucch_pdu->second_hop_prb, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->group_hop_flag, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->sequence_hop_flag, end) &&
-		pull16(ppReadPackedMsg, &pucch_pdu->hopping_id, end) &&
-		pull16(ppReadPackedMsg, &pucch_pdu->initial_cyclic_shift, end) &&
-		pull16(ppReadPackedMsg, &pucch_pdu->data_scrambling_id, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->time_domain_occ_idx, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_idx, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_len, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->add_dmrs_flag, end) &&
-		pull16(ppReadPackedMsg, &pucch_pdu->dmrs_scrambling_id, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->dmrs_cyclic_shift, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->sr_flag, end) &&
-		pull8(ppReadPackedMsg, &pucch_pdu->bit_len_harq, end) &&
-		pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part1, end) &&
-		pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part2, end) 
-		// TODO: ignoring beamforming tlv for now
-	);
-}
-
-
-static uint8_t unpack_ul_tti_request_pusch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nr_pusch_pdu_t* pusch_pdu = (nfapi_nr_pusch_pdu_t*)tlv;
-	
-	if (!(
-	pull16(ppReadPackedMsg, &pusch_pdu->pdu_bit_map, end) &&
-	pull16(ppReadPackedMsg, &pusch_pdu->rnti, end) &&
-	pull32(ppReadPackedMsg, &pusch_pdu->handle, end) &&
-	pull16(ppReadPackedMsg, &pusch_pdu->bwp_size, end) &&
-	pull16(ppReadPackedMsg, &pusch_pdu->bwp_start, end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->subcarrier_spacing, end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->cyclic_prefix, end) &&
-	pull16(ppReadPackedMsg, &pusch_pdu->target_code_rate,  end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->qam_mod_order,  end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->mcs_index,  end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->mcs_table, end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->transform_precoding, end) &&
-	pull16(ppReadPackedMsg, &pusch_pdu->data_scrambling_id, end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->nrOfLayers, end) &&
-	pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_symb_pos, end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->dmrs_config_type, end) &&
-	pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_scrambling_id, end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->scid, end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->num_dmrs_cdm_grps_no_data, end) &&
-	pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc, end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc,end) &&
-	pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
-	pull16(ppReadPackedMsg, &pusch_pdu->rb_start, end) &&
-	pull16(ppReadPackedMsg, &pusch_pdu->rb_size, end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->vrb_to_prb_mapping, end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->frequency_hopping, end) &&
-	pull16(ppReadPackedMsg, &pusch_pdu->tx_direct_current_location, end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->uplink_frequency_shift_7p5khz, end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->start_symbol_index, end) &&
-	pull8(ppReadPackedMsg, &pusch_pdu->nr_of_symbols, end) 
-	// TODO: ignoring beamforming tlv for now 
-	))
-		return 0;
-
-
-	//Pack Optional Data only included if indicated in pduBitmap
-	switch(pusch_pdu->pdu_bit_map){
-		case PUSCH_PDU_BITMAP_PUSCH_DATA:
-		{
-			// pack optional TLVs
-			return(
-				pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.rv_index, end) &&
-				pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.harq_process_id, end) &&
-				pull32(ppReadPackedMsg, &pusch_pdu->pusch_data.tb_size, end) &&
-				pull16(ppReadPackedMsg, &pusch_pdu->pusch_data.num_cb, end) &&
-				pullarray8(ppReadPackedMsg, pusch_pdu->pusch_data.cb_present_and_position,1,1,end)
-			);
-		}
-		break;
-
-		case PUSCH_PDU_BITMAP_PUSCH_UCI:
-		{
-			return(
-				pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.harq_ack_bit_length, end) &&
-				pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part1_bit_length, end) &&
-				pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part2_bit_length, end) &&
-				pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.alpha_scaling, end) &&
-				pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_harq_ack, end) &&
-				pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi1, end) &&
-				pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi2, end)
-			);
-		}
-		break;
-
-		case PUSCH_PDU_BITMAP_PUSCH_PTRS:
-		{
-			return(
-				pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.num_ptrs_ports, end) &&
-				pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, end) &&
-+               pull16(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, end) &&
-+               pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, end) &&
-				pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_time_density, end) &&
-				pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_freq_density, end) &&
-				pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ul_ptrs_power, end)
-			);
-		}
-		break;
-
-		case PUSCH_PDU_BITMAP_DFTS_OFDM:
-		{
-			return(
-				pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_group_number, end) &&
-				pull16(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_sequence_number, end) &&
-				pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, end) &&
-				pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, end)
-			);
-		}
-		break;
-
-		default:
-		{
-			NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
-		}
-	}
-
-	return 1;
-}
-
-
-static uint8_t unpack_ul_tti_request_srs_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nr_srs_pdu_t* srs_pdu = (nfapi_nr_srs_pdu_t*)tlv;
-	
-	return(
-		pull16(ppReadPackedMsg, &srs_pdu->rnti, end) &&
-		pull32(ppReadPackedMsg, &srs_pdu->handle, end) &&
-		pull16(ppReadPackedMsg, &srs_pdu->bwp_size, end) &&
-		pull16(ppReadPackedMsg, &srs_pdu->bwp_start, end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->subcarrier_spacing, end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->cyclic_prefix, end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->num_ant_ports, end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->num_symbols,  end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->num_repetitions, end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->time_start_position, end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->config_index, end) &&
-		pull16(ppReadPackedMsg, &srs_pdu->sequence_id, end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->bandwidth_index, end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->comb_size, end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->comb_offset, end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->cyclic_shift, end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->frequency_position, end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->frequency_shift, end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->frequency_hopping, end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->group_or_sequence_hopping, end) &&
-		pull8(ppReadPackedMsg, &srs_pdu->resource_type, end) &&
-		pull16(ppReadPackedMsg, &srs_pdu->t_srs, end) &&
-		pull16(ppReadPackedMsg, &srs_pdu->t_offset, end) 
-		// TODO: ignoring beamforming tlv for now
-	);
-}
-
-
-static uint8_t unpack_ul_tti_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
-{
-	nfapi_nr_ul_tti_request_number_of_pdus_t* pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_pdus_t*)msg;
-
-	if(!(pull16(ppReadPackedMsg, &pNfapiMsg->pdu_size, end) &&
-	 	 pull16(ppReadPackedMsg, &pNfapiMsg->pdu_type, end) ))
-		  return 0;
-
-
-	// first natch the pdu type, then call the respective function
-	switch(pNfapiMsg->pdu_type)
-	{
-
-		case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
-		{
-			if(!unpack_ul_tti_request_prach_pdu(&pNfapiMsg->prach_pdu, ppReadPackedMsg, end))
-				return 0;
-		}
-		break;
-
-		case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
-		{
-			if(!unpack_ul_tti_request_pucch_pdu(&pNfapiMsg->pucch_pdu, ppReadPackedMsg, end))
-				return 0;
-		}
-		break;
-		
-		case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
-		{
-			if(!unpack_ul_tti_request_pusch_pdu(&pNfapiMsg->pusch_pdu, ppReadPackedMsg, end))
-				return 0;
-		}
-		break;
-
-		case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE:
-		{
-			if(!unpack_ul_tti_request_srs_pdu(&pNfapiMsg->srs_pdu, ppReadPackedMsg, end))
-				return 0;
-		}
-		break;
-
-		default:
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", pNfapiMsg->pdu_type );
-		}
-		break;
-
-
-	}
-
-	return 1;
-}
-
-
-static uint8_t unpack_ul_tti_groups_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
-{
-	nfapi_nr_ul_tti_request_number_of_groups_t* pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_groups_t*)msg;
-
-	    if(!pull8(ppReadPackedMsg, &pNfapiMsg->n_ue, end))
-      return 0;
-       for (int i = 0; i < pNfapiMsg->n_ue; i++)
-       {
-               if(!pull8(ppReadPackedMsg, &pNfapiMsg->ue_list[i].pdu_idx ,end) )
-               return 0;
-       }
-       return 1; 
-}
-
-
-static uint8_t unpack_ul_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t*)msg;
-
-	if (!( 
-		pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
-		pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
-		pull8(ppReadPackedMsg, &pNfapiMsg->n_pdus, end) &&
-		pull8(ppReadPackedMsg, &pNfapiMsg->n_group, end) &&
-		pull8(ppReadPackedMsg, &pNfapiMsg->rach_present, end) &&
-		pull8(ppReadPackedMsg, &pNfapiMsg->n_ulcch, end) &&
-		pull8(ppReadPackedMsg, &pNfapiMsg->n_ulsch, end) ))
-			return 0;
-
-	for(int i=0; i< pNfapiMsg->n_pdus; i++)
-	{
-		if (!unpack_ul_tti_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdus_list[i]))
-			return 0;
-	}
-
-	for(int i=0; i< pNfapiMsg->n_group; i++)
-	{
-		if (!unpack_ul_tti_groups_list_value(ppReadPackedMsg, end, &pNfapiMsg->groups_list[i]))
-			return 0;
-	}
-
-	return 1;
-}
-
-
-
-static uint8_t unpack_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, &unpack_dl_config_request_body_value},
-	};
-
-	return ( pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-			 unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_ul_config_ulsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-
-
-	
-	nfapi_ul_config_ulsch_pdu_rel8_t* ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t*)tlv;
-	
-	return (pull32(ppReadPackedMsg, &ulsch_pdu_rel8->handle, end) &&
-			pull16(ppReadPackedMsg, &ulsch_pdu_rel8->size, end) &&
-			pull16(ppReadPackedMsg, &ulsch_pdu_rel8->rnti, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel8->resource_block_start, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel8->number_of_resource_blocks, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel8->modulation_type, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel8->cyclic_shift_2_for_drms, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_enabled_flag, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_bits, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel8->new_data_indication, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel8->redundancy_version, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel8->harq_process_number, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel8->ul_tx_mode, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel8->current_tx_nb, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel8->n_srs, end ));
-}
-
-static uint8_t unpack_ul_config_ulsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ulsch_pdu_rel10_t* ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t*)tlv; 
-	
-	return (pull8(ppReadPackedMsg, &ulsch_pdu_rel10->resource_allocation_type, end) &&
-			pull32(ppReadPackedMsg, &ulsch_pdu_rel10->resource_block_coding, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transport_blocks, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transmission_scheme, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel10->number_of_layers, end) &
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel10->codebook_index, end) &&
-			pull8(ppReadPackedMsg, &ulsch_pdu_rel10->disable_sequence_hopping_flag, end));
-}
-static uint8_t unpack_ul_config_ulsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ulsch_pdu_rel11_t* ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t*)tlv;
-	
-	return ( pull8(ppReadPackedMsg,	&ulsch_pdu_rel11->virtual_cell_id_enabled_flag, end) &&
-			 pull16(ppReadPackedMsg, &ulsch_pdu_rel11->npusch_identity, end) &&
-			 pull8(ppReadPackedMsg,	&ulsch_pdu_rel11->dmrs_config_flag, end) &&
-			 pull16(ppReadPackedMsg, &ulsch_pdu_rel11->ndmrs_csh_identity, end));
-}
-static uint8_t unpack_ul_config_ulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ulsch_pdu_rel13_t* ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg,  &ulsch_pdu_rel13->ue_type, end) &&
-			pull16(ppReadPackedMsg, &ulsch_pdu_rel13->total_number_of_repetitions, end) &&
-			pull16(ppReadPackedMsg, &ulsch_pdu_rel13->repetition_number, end) &&
-			pull16(ppReadPackedMsg, &ulsch_pdu_rel13->initial_transmission_sf_io, end) &&
-			pull8(ppReadPackedMsg,  &ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, end));
-}
-static uint8_t unpack_ul_config_cqi_ri_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_cqi_ri_information_rel8_t* cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, end) &&
-			pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, end) &&
-			pull8(ppReadPackedMsg, &cqi_ri_info_rel8->ri_size, end) &&
-			pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_cqi, end) &&
-			pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_ri, end));
-}
-
-static uint8_t unpack_ul_config_cqi_ri_info_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_cqi_ri_information_rel9_t* cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t*)tlv;
-	
-	if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->report_type, end) &&
-		 pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_cqi, end) &&
-		 pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_ri, end)))
-		return 0;
-
-	switch(cqi_ri_info_rel9->report_type)
-	{
-		case NFAPI_CSI_REPORT_TYPE_PERIODIC:
-			{
-				if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, end) &&
-					 pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, end)))
-					return 0;
-			}
-			break;
-		case NFAPI_CSI_REPORT_TYPE_APERIODIC:
-			{
-				if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, end) ==0)
-					return 0;
-					
-				uint8_t i;
-				for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i)
-				{
-					if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, end) == 0)
-						return 0;
-
-                                        uint8_t j;
-                                        for(j = 0; j < 8; ++j)
-					{
-						if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], end) == 0)
-							return 0;
-					}
-				}
-			}
-			break;
-		default:
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
-				return 0;
-			}
-			break;
-	};
-	return 1;
-}
-
-// NOTE : This function is a little unconventional as we uese the side to
-// determine the report type
-static uint8_t unpack_ul_config_cqi_ri_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_cqi_ri_information_rel13_t* cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t*)tlv;
-	if(cqi_ri_info_rel13->tl.length == 0)
-	{
-		cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_APERIODIC;
-	}
-	else
-	{
-		cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_PERIODIC;
-		if(pull16(ppReadPackedMsg, &cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, end) == 0)
-			return 0;
-	}
-	return 1;
-}
-static uint8_t unpack_ul_config_cqi_init_tx_params_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_initial_transmission_parameters_rel8_t* init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &init_tx_params_rel8->n_srs_initial, end) &&
-			pull8(ppReadPackedMsg, &init_tx_params_rel8->initial_number_of_resource_blocks, end));
-}
-static uint8_t unpack_ul_config_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ulsch_harq_information_rel10_t* harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &harq_info_rel10->harq_size, end) &&
-			pull8(ppReadPackedMsg, &harq_info_rel10->delta_offset_harq, end) &&
-			pull8(ppReadPackedMsg, &harq_info_rel10->ack_nack_mode, end));
-}
-
-static uint8_t unpack_ul_config_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ulsch_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t*)tlv;
-	
-	return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
-			pull8(ppReadPackedMsg, &harq_info_rel13->delta_offset_harq_2, end));
-}
-
-static uint8_t unpack_ul_config_ue_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ue_information_rel8_t* ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t*)tlv;
-	
-	return (pull32(ppReadPackedMsg, &ue_info_rel8->handle, end) &&
-			pull16(ppReadPackedMsg, (uint16_t *)&ue_info_rel8->rnti, end));
-}
-static uint8_t unpack_ul_config_ue_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ue_information_rel11_t* ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &ue_info_rel11->virtual_cell_id_enabled_flag, end) &&
-			pull16(ppReadPackedMsg, &ue_info_rel11->npusch_identity, end));
-}
-static uint8_t unpack_ul_config_ue_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_ue_information_rel13_t* ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &ue_info_rel13->ue_type, end) &&
-			pull8(ppReadPackedMsg, &ue_info_rel13->empty_symbols, end) &&
-			pull16(ppReadPackedMsg, &ue_info_rel13->total_number_of_repetitions, end) &&
-			pull16(ppReadPackedMsg, &ue_info_rel13->repetition_number, end));
-}
-
-static uint8_t unpack_ul_config_cqi_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_cqi_information_rel8_t* cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t*)tlv;
-	
-	return ( pull16(ppReadPackedMsg, &cqi_info_rel8->pucch_index, end) &&
-			 pull8(ppReadPackedMsg, &cqi_info_rel8->dl_cqi_pmi_size, end));
-}
-static uint8_t unpack_ul_config_cqi_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_cqi_information_rel10_t* cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &cqi_info_rel10->number_of_pucch_resource, end) &&
-			pull16(ppReadPackedMsg, &cqi_info_rel10->pucch_index_p1, end));
-}
-static uint8_t unpack_ul_config_cqi_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_cqi_information_rel13_t* cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &cqi_info_rel13->csi_mode, end) &&
-			pull16(ppReadPackedMsg, &cqi_info_rel13->dl_cqi_pmi_size_2, end) &&
-			pull8(ppReadPackedMsg, &cqi_info_rel13->starting_prb, end) &&
-			pull8(ppReadPackedMsg, &cqi_info_rel13->n_prb, end) &&
-			pull8(ppReadPackedMsg, &cqi_info_rel13->cdm_index, end) &&
-			pull8(ppReadPackedMsg, &cqi_info_rel13->n_srs, end));
-}
-		
-static uint8_t unpack_ul_config_sr_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_sr_information_rel8_t* sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t*)tlv;
-	
-	return ( pull16(ppReadPackedMsg, &sr_info_rel8->pucch_index, end));
-}
-
-static uint8_t unpack_ul_config_sr_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_sr_information_rel10_t* sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &sr_info_rel10->number_of_pucch_resources, end) &&
-			pull16(ppReadPackedMsg, &sr_info_rel10->pucch_index_p1, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_harq_information_rel10_tdd_t* harq_info_tdd_rel10 = (nfapi_ul_config_harq_information_rel10_tdd_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &harq_info_tdd_rel10->harq_size, end) &&
-			pull8(ppReadPackedMsg, &harq_info_tdd_rel10->ack_nack_mode, end) &&
-			pull8(ppReadPackedMsg, &harq_info_tdd_rel10->number_of_pucch_resources, end) &&
-			pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_0, end) &&
-			pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_1, end) &&
-			pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_2, end) &&
-			pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_3, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_harq_information_rel8_fdd_t* harq_info_fdd_rel8 = (nfapi_ul_config_harq_information_rel8_fdd_t*)tlv;
-	
-	return (pull16(ppReadPackedMsg, &harq_info_fdd_rel8->n_pucch_1_0, end) &&
-			pull8(ppReadPackedMsg, &harq_info_fdd_rel8->harq_size, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_harq_information_rel9_fdd_t* harq_info_fdd_rel9 = (nfapi_ul_config_harq_information_rel9_fdd_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &harq_info_fdd_rel9->harq_size, end) &&
-			pull8(ppReadPackedMsg, &harq_info_fdd_rel9->ack_nack_mode, end) &&
-			pull8(ppReadPackedMsg, &harq_info_fdd_rel9->number_of_pucch_resources, end) &&
-			pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_0, end) &&
-			pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_1, end) &&
-			pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_2, end) &&
-			pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_3, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_harq_information_rel11_t* harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &harq_info_rel11->num_ant_ports, end) &&
-			pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_0, end) &&
-			pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_1, end) &&
-			pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_2, end) &&
-			pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_3, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_harq_information_rel13_t* harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t*)tlv;
-	
-	return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
-			pull8(ppReadPackedMsg, &harq_info_rel13->starting_prb, end) &&
-			pull8(ppReadPackedMsg, &harq_info_rel13->n_prb, end) &&
-			pull8(ppReadPackedMsg, &harq_info_rel13->cdm_index, end) &&
-			pull8(ppReadPackedMsg, &harq_info_rel13->n_srs, end));
-}
-
-
-static uint8_t unpack_ul_config_srs_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_srs_pdu_rel8_t* srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t*)tlv;
-	
-	return (pull32(ppReadPackedMsg, &srs_pdu_rel8->handle, end) &&
-			pull16(ppReadPackedMsg, &srs_pdu_rel8->size, end) &&
-			pull16(ppReadPackedMsg, &srs_pdu_rel8->rnti, end) &&
-			pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_bandwidth, end) &&
-			pull8(ppReadPackedMsg, &srs_pdu_rel8->frequency_domain_position, end) &&
-			pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_hopping_bandwidth, end) &&
-			pull8(ppReadPackedMsg, &srs_pdu_rel8->transmission_comb, end) &&
-			pull16(ppReadPackedMsg, &srs_pdu_rel8->i_srs, end) &&
-			pull8(ppReadPackedMsg, &srs_pdu_rel8->sounding_reference_cyclic_shift, end));
-}
-
-static uint8_t unpack_ul_config_srs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_srs_pdu_rel10_t* srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t*)tlv;
-	return pull8(ppReadPackedMsg, &srs_pdu_rel10->antenna_port, end);
-}
-
-static uint8_t unpack_ul_config_srs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_srs_pdu_rel13_t* srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t*)tlv;
-
-	return (pull8(ppReadPackedMsg, &srs_pdu_rel13->number_of_combs, end));
-}
-
-static uint8_t unpack_ul_nb_harq_info_rel13_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_nb_harq_information_rel13_fdd_t* nb_harq_info_fdd_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t*)tlv;
-
-	return (pull8(ppReadPackedMsg, &nb_harq_info_fdd_rel13->harq_ack_resource, end));
-}
-
-static uint8_t unpack_ul_config_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_nulsch_pdu_rel13_t* nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t*)tlv;
-
-	if(!(pull8(ppReadPackedMsg, &nulsch_pdu_rel13->nulsch_format, end) && 
-		 pull32(ppReadPackedMsg, &nulsch_pdu_rel13->handle, end) && 
-		 pull16(ppReadPackedMsg, &nulsch_pdu_rel13->size, end) && 
-		 pull16(ppReadPackedMsg, &nulsch_pdu_rel13->rnti, end) && 
-		 pull8(ppReadPackedMsg, &nulsch_pdu_rel13->subcarrier_indication, end) && 
-		 pull8(ppReadPackedMsg, &nulsch_pdu_rel13->resource_assignment, end) && 
-		 pull8(ppReadPackedMsg, &nulsch_pdu_rel13->mcs, end) && 
-		 pull8(ppReadPackedMsg, &nulsch_pdu_rel13->redudancy_version, end) && 
-		 pull8(ppReadPackedMsg, &nulsch_pdu_rel13->repetition_number, end) && 
-		 pull8(ppReadPackedMsg, &nulsch_pdu_rel13->new_data_indication, end) && 
-		 pull8(ppReadPackedMsg, &nulsch_pdu_rel13->n_srs, end) && 
-		 pull16(ppReadPackedMsg, &nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, end) && 
-		 pull16(ppReadPackedMsg, &nulsch_pdu_rel13->sf_idx, end)))
-		return 0;
-		
-	unpack_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value},
-		{ NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value},
-		{ NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
-		{ NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, &unpack_ul_nb_harq_info_rel13_fdd_value},
-	};
-
-	return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, 0, 0);		
-}
-
-static uint8_t unpack_ul_config_nrach_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_config_nrach_pdu_rel13_t* nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t*)tlv;
-
-	return (pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_0, end) &&
-			pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_1, end) &&
-			pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_2, end));
-}
-
-
-static uint8_t unpack_ul_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	#define UL_CONFIG_ULSCH_PDU_UNPACK_FNS(_pdu) \
-		{ NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &_pdu.ulsch_pdu_rel8, &unpack_ul_config_ulsch_pdu_rel8_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &_pdu.ulsch_pdu_rel10, &unpack_ul_config_ulsch_pdu_rel10_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &_pdu.ulsch_pdu_rel11, &unpack_ul_config_ulsch_pdu_rel11_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &_pdu.ulsch_pdu_rel13, &unpack_ul_config_ulsch_pdu_rel13_value}, 
-
-	#define UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(_pdu) \
-		{ NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &_pdu.cqi_ri_information_rel8, &unpack_ul_config_cqi_ri_info_rel8_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &_pdu.cqi_ri_information_rel9, &unpack_ul_config_cqi_ri_info_rel9_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &_pdu.cqi_ri_information_rel13, &unpack_ul_config_cqi_ri_info_rel13_value},
-
-	#define UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(_pdu) \
-		{ NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &_pdu.harq_information_rel10, &unpack_ul_config_ulsch_harq_info_rel10_value},\
-		{ NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_ulsch_harq_info_rel13_value},
-
-	#define UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(_pdu) \
-		{ NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &_pdu.initial_transmission_parameters_rel8, &unpack_ul_config_cqi_init_tx_params_rel8_value},
-
-	#define UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(_pdu) \
-		{ NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &_pdu.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &_pdu.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &_pdu.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
-
-	#define UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(_pdu) \
-		{ NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &_pdu.cqi_information_rel8, &unpack_ul_config_cqi_info_rel8_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &_pdu.cqi_information_rel10, &unpack_ul_config_cqi_info_rel10_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &_pdu.cqi_information_rel13, &unpack_ul_config_cqi_info_rel13_value},
-						
-	#define UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(_pdu) \
-		{ NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &_pdu.sr_information_rel8, &unpack_ul_config_sr_info_rel8_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &_pdu.sr_information_rel10, &unpack_ul_config_sr_info_rel10_value},
-
-	#define UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(_pdu) \
-		{ NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &_pdu.harq_information_rel10_tdd, &unpack_ul_config_harq_info_rel10_tdd_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &_pdu.harq_information_rel8_fdd, &unpack_ul_config_harq_info_rel8_fdd_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &_pdu.harq_information_rel9_fdd, &unpack_ul_config_harq_info_rel9_fdd_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &_pdu.harq_information_rel11, &unpack_ul_config_harq_info_rel11_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_harq_info_rel13_value},
-
-	#define UL_CONFIG_SRS_PDU_UNPACK_FNS(_pdu) \
-		{ NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &_pdu.srs_pdu_rel8, &unpack_ul_config_srs_pdu_rel8_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &_pdu.srs_pdu_rel10, &unpack_ul_config_srs_pdu_rel10_value}, \
-		{ NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &_pdu.srs_pdu_rel13, &unpack_ul_config_srs_pdu_rel13_value},
-		
-	#define UL_CONFIG_NULSCH_PDU_UNPACK_FNS(_pdu) \
-		{ NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &_pdu.nulsch_pdu_rel13, &unpack_ul_config_nulsch_pdu_rel13_value},		
-
-	#define UL_CONFIG_NRACH_PDU_UNPACK_FNS(_pdu) \
-		{ NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &_pdu.nrach_pdu_rel13, &unpack_ul_config_nrach_pdu_rel13_value},		
-
-
-	nfapi_ul_config_request_body_t* value = (nfapi_ul_config_request_body_t*)tlv;
-
-	if(!(pull8(ppReadPackedMsg, &value->number_of_pdus, end) &&
-		 pull8(ppReadPackedMsg, &value->rach_prach_frequency_resources, end) &&
-		 pull8(ppReadPackedMsg, &value->srs_present, end)))
-		return 0;
-
-	if(value->number_of_pdus > NFAPI_UL_CONFIG_MAX_PDU)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of ul config pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_UL_CONFIG_MAX_PDU);
-		return 0;		
-	}
-
-	if(value->number_of_pdus > 0)
-	{
-		value->ul_config_pdu_list = (nfapi_ul_config_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_ul_config_request_pdu_t) * value->number_of_pdus, config);
-
-		if(value->ul_config_pdu_list == NULL)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate ul config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
-			return 0;
-		}
-	}
-	else
-	{
-		value->ul_config_pdu_list = 0;
-	}
-
-
-	uint16_t i;
-	uint16_t total_number_of_pdus = value->number_of_pdus;
-	for(i = 0; i < total_number_of_pdus; ++i)
-	{
-		nfapi_ul_config_request_pdu_t* pdu = &(value->ul_config_pdu_list[i]);
-		
-		if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
-			 pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
-			return 0;
-					
-		uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
-		if(packedPduEnd > end)
-		{
-			// pdu end is past buffer end
-			return 0;
-		}
-
-		switch(pdu->pdu_type)
-		{
-			case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_pdu)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-
-			case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.ulsch_pdu)
-						UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.cqi_ri_information)
-						UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_harq_pdu.ulsch_pdu)
-						UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_harq_pdu.harq_information)
-						UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_harq_pdu.initial_transmission_parameters)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu)
-						UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information)
-						UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.harq_information)
-						UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.ue_information)
-						UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.cqi_information)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_pdu.ue_information)
-						UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_pdu.sr_information)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_harq_pdu.ue_information)
-						UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_harq_pdu.harq_information)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.ue_information)
-						UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.sr_information)
-						UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.harq_information)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.ue_information)
-						UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.cqi_information)
-						UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.harq_information)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.ue_information)
-						UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.cqi_information)
-						UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.sr_information)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.ue_information)
-						UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.cqi_information)
-						UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.sr_information)
-						UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.harq_information)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_UL_CONFIG_SRS_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_SRS_PDU_UNPACK_FNS(pdu->srs_pdu)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->harq_buffer_pdu.ue_information)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.ulsch_pdu)
-						UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.csi_information)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.ulsch_pdu)
-						UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.harq_information)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu)
-						UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.csi_information)
-						UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.harq_information)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_NULSCH_PDU_UNPACK_FNS(pdu->nulsch_pdu)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;	
-			case NFAPI_UL_CONFIG_NRACH_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						UL_CONFIG_NRACH_PDU_UNPACK_FNS(pdu->nrach_pdu)
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;						
-		}
-	}
-	return 1;
-}
-
-
-static uint8_t unpack_ul_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, &unpack_ul_config_request_body_value},
-	};
-
-	return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_hi_dci0_hi_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_hi_dci0_hi_pdu_rel8_t* hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t*)tlv;
-	
-	return( pull8(ppReadPackedMsg, &hi_pdu_rel8->resource_block_start, end) &&
-			pull8(ppReadPackedMsg, &hi_pdu_rel8->cyclic_shift_2_for_drms, end) &&
-			pull8(ppReadPackedMsg, &hi_pdu_rel8->hi_value, end) &&
-			pull8(ppReadPackedMsg, &hi_pdu_rel8->i_phich, end) &&
-			pull16(ppReadPackedMsg, &hi_pdu_rel8->transmission_power, end));
-}
-
-static uint8_t unpack_hi_dci0_hi_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_hi_dci0_hi_pdu_rel10_t* hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &hi_pdu_rel10->flag_tb2, end) &&
-			pull8(ppReadPackedMsg, &hi_pdu_rel10->hi_value_2, end));
-}
-
-static uint8_t unpack_hi_dci0_dci_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_hi_dci0_dci_pdu_rel8_t* dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &dci_pdu_rel8->dci_format, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel8->cce_index, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel8->aggregation_level, end) &&
-			pull16(ppReadPackedMsg, &dci_pdu_rel8->rnti, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel8->resource_block_start, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel8->number_of_resource_block, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel8->mcs_1, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel8->cyclic_shift_2_for_drms, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_enabled_flag, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_bits, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel8->new_data_indication_1, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel8->ue_tx_antenna_seleciton, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel8->tpc, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel8->cqi_csi_request, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel8->ul_index, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel8->dl_assignment_index, end) &&
-			pull32(ppReadPackedMsg, &dci_pdu_rel8->tpc_bitmap, end) &&
-			pull16(ppReadPackedMsg, &dci_pdu_rel8->transmission_power, end));
-}
-
-static uint8_t unpack_hi_dci0_dci_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_hi_dci0_dci_pdu_rel10_t* dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &dci_pdu_rel10->cross_carrier_scheduling_flag, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel10->carrier_indicator, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel10->size_of_cqi_csi_feild, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_flag, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_request, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_flag, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_type, end) &&
-			pull32(ppReadPackedMsg, &dci_pdu_rel10->resource_block_coding, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel10->mcs_2, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel10->new_data_indication_2, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel10->number_of_antenna_ports, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel10->tpmi, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel10->total_dci_length_including_padding, end) &&
-			pull8(ppReadPackedMsg, &dci_pdu_rel10->n_ul_rb, end));
-}
-
-static uint8_t unpack_hi_dci0_dci_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_hi_dci0_dci_pdu_rel12_t* dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t*)tlv;
-	
-	return ( pull8(ppReadPackedMsg, &dci_pdu_rel12->pscch_resource, end) &&
-			 pull8(ppReadPackedMsg, &dci_pdu_rel12->time_resource_pattern, end));
-}
-
-static uint8_t unpack_hi_dci0_mpdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t* value = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &value->mpdcch_narrowband, end) &&
-			pull8(ppReadPackedMsg, &value->number_of_prb_pairs, end) &&
-			pull8(ppReadPackedMsg, &value->resource_block_assignment, end) &&
-			pull8(ppReadPackedMsg, &value->mpdcch_transmission_type, end) &&
-			pull8(ppReadPackedMsg, &value->start_symbol, end) &&
-			pull8(ppReadPackedMsg, &value->ecce_index, end) &&
-			pull8(ppReadPackedMsg, &value->aggreagation_level, end) &&
-			pull8(ppReadPackedMsg, &value->rnti_type, end) &&
-			pull16(ppReadPackedMsg, &value->rnti, end) &&
-			pull8(ppReadPackedMsg, &value->ce_mode, end) &&
-			pull16(ppReadPackedMsg, &value->drms_scrambling_init, end) &&
-			pull16(ppReadPackedMsg, &value->initial_transmission_sf_io, end) &&
-			pull16(ppReadPackedMsg, &value->transmission_power, end) &&
-			pull8(ppReadPackedMsg, &value->dci_format, end) &&
-			pull8(ppReadPackedMsg, &value->resource_block_start, end) &&
-			pull8(ppReadPackedMsg, &value->number_of_resource_blocks, end) &&
-			pull8(ppReadPackedMsg, &value->mcs, end) &&
-			pull8(ppReadPackedMsg, &value->pusch_repetition_levels, end) &&
-			pull8(ppReadPackedMsg, &value->frequency_hopping_flag, end) &&
-			pull8(ppReadPackedMsg, &value->new_data_indication, end) &&
-			pull8(ppReadPackedMsg, &value->harq_process, end) &&
-			pull8(ppReadPackedMsg, &value->redudency_version, end) &&
-			pull8(ppReadPackedMsg, &value->tpc, end) &&
-			pull8(ppReadPackedMsg, &value->csi_request, end) &&
-			pull8(ppReadPackedMsg, &value->ul_inex, end) &&
-			pull8(ppReadPackedMsg, &value->dai_presence_flag, end) &&
-			pull8(ppReadPackedMsg, &value->dl_assignment_index, end) &&
-			pull8(ppReadPackedMsg, &value->srs_request, end) &&
-			pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end) &&
-			pull32(ppReadPackedMsg, &value->tcp_bitmap, end) &&
-			pull8(ppReadPackedMsg, &value->total_dci_length_include_padding, end) &&
-			pull8(ppReadPackedMsg, &value->number_of_tx_antenna_ports, end) &&
-			pullarray16(ppReadPackedMsg, value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, end));
-}
-
-static uint8_t unpack_hi_dci0_npdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_hi_dci0_npdcch_dci_pdu_rel13_t* value = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &value->ncce_index, end) &&
-			pull8(ppReadPackedMsg, &value->aggregation_level, end) &&
-			pull8(ppReadPackedMsg, &value->start_symbol, end) &&
-			pull16(ppReadPackedMsg, &value->rnti, end) &&
-			pull8(ppReadPackedMsg, &value->scrambling_reinitialization_batch_index, end) &&
-			pull8(ppReadPackedMsg, &value->nrs_antenna_ports_assumed_by_the_ue, end) &&
-			pull8(ppReadPackedMsg, &value->subcarrier_indication, end) &&
-			pull8(ppReadPackedMsg, &value->resource_assignment, end) &&
-			pull8(ppReadPackedMsg, &value->scheduling_delay, end) &&
-			pull8(ppReadPackedMsg, &value->mcs, end) &&
-			pull8(ppReadPackedMsg, &value->redudancy_version, end) &&
-			pull8(ppReadPackedMsg, &value->repetition_number, end) &&
-			pull8(ppReadPackedMsg, &value->new_data_indicator, end) &&
-			pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end));
-}
-
-static uint8_t unpack_hi_dci0_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_hi_dci0_request_body_t* value = (nfapi_hi_dci0_request_body_t*)tlv;
-
-	if(!(pull16(ppReadPackedMsg, &value->sfnsf, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_dci, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_hi, end)))
-		return 0;
-
-	uint8_t totalNumPdus = value->number_of_hi + value->number_of_dci;
-
-	if(totalNumPdus > NFAPI_HI_DCI0_MAX_PDU)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dci0 pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, totalNumPdus, NFAPI_HI_DCI0_MAX_PDU);
-		return 0;		
-	}
-
-	if(totalNumPdus > 0)
-	{
-		value->hi_dci0_pdu_list = (nfapi_hi_dci0_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_hi_dci0_request_pdu_t) * totalNumPdus, config);
-		if(value->hi_dci0_pdu_list == NULL)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate hi dci0 pdu list (count:%d)\n", __FUNCTION__, totalNumPdus);
-			return 0;
-		}
-	}
-	else
-	{
-		value->hi_dci0_pdu_list = 0;
-	}
-
-	uint8_t i;
-	for(i = 0; i < totalNumPdus; ++i)
-	{
-		nfapi_hi_dci0_request_pdu_t* pdu = &(value->hi_dci0_pdu_list[i]);
-
-		if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
-			 pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
-			return 0;
-
-		uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
-		if(packedPduEnd > end)
-		{
-			// pdu end if past buffer end
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s pdu size to big %d %d\n", __FUNCTION__, packedPduEnd, end);
-			return 0;
-		}
-
-		switch(pdu->pdu_type)
-		{
-			case NFAPI_HI_DCI0_HI_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, &unpack_hi_dci0_hi_pdu_rel8_value},
-						{ NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, &unpack_hi_dci0_hi_pdu_rel10_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_HI_DCI0_DCI_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
-						{ NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
-						{ NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, &unpack_hi_dci0_dci_pdu_rel12_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
-						{ NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
-						{ NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, &unpack_dl_config_epdcch_params_rel11_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, &unpack_hi_dci0_mpdcch_dci_pdu_rel13_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, &unpack_hi_dci0_npdcch_dci_pdu_rel13_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			default:
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
-				}
-				break;
-		};
-	}
-
-	return 1;
-}
-//unpack_ul_dci_pdu_list_value
-
-static uint8_t unpack_ul_dci_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
-{
-	nfapi_nr_ul_dci_request_pdus_t* value = (nfapi_nr_ul_dci_request_pdus_t*)msg;
-	
-	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
-	{
-		if(!pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI,  end) &&
-		pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, end) &&
-
-		pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, end) &&
-		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, end) &&
-		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, end) &&
-		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, end) &&
-
-		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, end) &&
-		pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end) &&
-		
-		pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end));
-	
-		return 0;
-	}
-
-	return (pull16(ppReadPackedMsg, &value->PDUType, end) &&
-	   	    pull16(ppReadPackedMsg, &value->PDUSize, end) &&
-			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, end) &&
-			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, end) &&
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, end) &&
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, end) &&
-
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, end) &&
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, end) &&
-			pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, end) &&
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, end) &&
-
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, end) &&
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, end) &&
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, end) &&
-			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, end) &&
-
-			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.precoderGranularity, end) &&
-			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.numDlDci, end));
-		  
-}
-
-static uint8_t unpack_ul_dci_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t*)msg;
-	
-	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
-		     pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
-			 pull8(ppReadPackedMsg, &pNfapiMsg->numPdus, end)
-        ))
-		return 0;
-	for(int i=0; i< pNfapiMsg->numPdus; i++)
-		{
-			if (!unpack_ul_dci_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->ul_dci_pdu_list[i]))
-				return 0;
-		}
-
-		return 1;
-
-}
-
-static uint8_t unpack_hi_dci0_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, &unpack_hi_dci0_request_body_value},
-	};
-
-	return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-
-}
-static uint8_t unpack_tx_data_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
-{
-	nfapi_nr_pdu_t* pNfapiMsg = (nfapi_nr_pdu_t*)msg;
-
-	if(!(pull32(ppReadPackedMsg, &pNfapiMsg->num_TLV, end) &&
-	    pull16(ppReadPackedMsg, &pNfapiMsg->PDU_index, end) &&
-		pull16(ppReadPackedMsg, &pNfapiMsg->PDU_length, end)
-	 ))
-		return 0;
-
-	uint16_t i = 0;
-	uint16_t total_number_of_tlvs = pNfapiMsg->num_TLV;
-	for(; i < total_number_of_tlvs; ++i)
-	{
-		
-		if (!(pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].length, end) &&
-			pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].tag, end)))
-			return 0;
-
-		switch(pNfapiMsg->TLVs[i].tag){
-			case 0:
-			{
-				if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.direct, 16384, pNfapiMsg->TLVs[i].length, end))
-					return 0;
-				break;
-
-			}
-
-			case 1:
-			{
-				if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.ptr, pNfapiMsg->TLVs[i].length , pNfapiMsg->TLVs[i].length, end))
-					return 0;
-				break;
-
-			}
-				
-			default:
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", pNfapiMsg->TLVs[i].tag );
-				break;
-			}
-				
-		}		
-	}
-
-
-	return 1;
-}
-
-static uint8_t unpack_tx_data_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t*)msg;
-
-	if(!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
-		 pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
-		 pull16(ppReadPackedMsg, &pNfapiMsg->Number_of_PDUs, end)))
-		return 0;
-
-	for(int i=0; i< pNfapiMsg->Number_of_PDUs; i++)
-	{
-		if (!unpack_tx_data_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdu_list[i]))
-			return 0;
-	}
-
-	return 1;
-}
-
-static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	uint8_t proceed = 1;
-	nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t*)msg;
-
-	if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
-		return 0;
-
-	while (((uint8_t*)(*ppReadPackedMsg) < end) && proceed)
-	{
-		nfapi_tl_t generic_tl;
-		if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-			return 0;
-
-		switch(generic_tl.tag)
-		{
-			case NFAPI_TX_REQUEST_BODY_TAG:
-			{
-				pNfapiMsg->tx_request_body.tl = generic_tl;
-
-				if( pull16(ppReadPackedMsg, &pNfapiMsg->tx_request_body.number_of_pdus, end) == 0)
-					return 0;
-
-				if(pNfapiMsg->tx_request_body.number_of_pdus > NFAPI_TX_MAX_PDU)
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of tx pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus, NFAPI_TX_MAX_PDU);
-					return 0;		
-				}
-
-				if(pNfapiMsg->tx_request_body.number_of_pdus > 0)
-				{
-					pNfapiMsg->tx_request_body.tx_pdu_list = (nfapi_tx_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_tx_request_pdu_t) * pNfapiMsg->tx_request_body.number_of_pdus, config);
-					if(pNfapiMsg->tx_request_body.tx_pdu_list == NULL)
-					{
-						NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate tx  pdu list (count:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus);
-						return 0;
-					}
-				}
-				else
-				{
-					pNfapiMsg->tx_request_body.tx_pdu_list = 0;
-				}
-
-
-				uint16_t i;
-				uint16_t totalNumPdus = pNfapiMsg->tx_request_body.number_of_pdus;
-				for(i = 0; i < totalNumPdus; ++i)
-				{
-					nfapi_tx_request_pdu_t* pdu = &(pNfapiMsg->tx_request_body.tx_pdu_list[i]);
-					if (pdu) {
-					  uint16_t length = 0;
-					  uint16_t index = 0;
-					
-					  if(!(pull16(ppReadPackedMsg, &length, end) &&
-						 pull16(ppReadPackedMsg, &index, end)))
-						  return 0;
-
-                                          pdu->pdu_length = length;
-                                          pdu->pdu_index = index;
-					
-
-					// TODO : May need to rethink this bit
-					  pdu->num_segments = 1;
-					  pdu->segments[0].segment_length = pdu->pdu_length;
-					  pdu->segments[0].segment_data = nfapi_p7_allocate(pdu->pdu_length, config);
-
-					  if(pdu->segments[0].segment_data)
-					  {
-						  if(!pullarray8(ppReadPackedMsg, pdu->segments[0].segment_data, pdu->segments[0].segment_length, pdu->segments[0].segment_length, end))
-							return 0;
-                                                  if (pdu->segments[0].segment_length == 3)
-                                                  {
-                                                  NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__, 
-                                                      pdu->segments[0].segment_data[0], 
-                                                      pdu->segments[0].segment_data[1], 
-                                                      pdu->segments[0].segment_data[2]
-                                                      );
-                                                  }
-					  }
-					  else
-					  {
-						NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request: Failed to allocate pdu (len:%d) %d/%d %d\n", pdu->pdu_length, totalNumPdus, i, pdu->pdu_index);
-					  }
-                                      } else {
-                                          NFAPI_TRACE(NFAPI_TRACE_ERROR, "NULL pdu\n");
-                                      }
-				}
-			}
-			break;
-			default:
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request FIXME : Invalid pdu type %d \n", generic_tl.tag );
-			}
-			break;
-		};
-	}
-
-	return 1;
-}
-
-static uint8_t unpack_ue_release_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-    uint8_t proceed = 1;
-    nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t*)msg;
-
-    if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
-        return 0;
-
-    while (((uint8_t*)(*ppReadPackedMsg) < end) && proceed)
-    {
-        nfapi_tl_t generic_tl;
-        if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-            return 0;
-
-        switch(generic_tl.tag)
-        {
-            case NFAPI_UE_RELEASE_BODY_TAG:
-            {
-                pNfapiMsg->ue_release_request_body.tl = generic_tl;
-                if( pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.number_of_TLVs, end) == 0)
-                    return 0;
-
-                if(pNfapiMsg->ue_release_request_body.number_of_TLVs > NFAPI_RELEASE_MAX_RNTI)
-                {
-                    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of relese rnti's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->ue_release_request_body.number_of_TLVs, NFAPI_RELEASE_MAX_RNTI);
-                    return 0;
-                } else {
-                    uint8_t j;
-                    uint16_t num = pNfapiMsg->ue_release_request_body.number_of_TLVs;
-                    for(j = 0; j < num; ++j){
-                    		if(pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.ue_release_request_TLVs_list[j].rnti, end) == 0){
-                    				return 0;
-                    		}
-                    }
-                }
-            }
-            break;
-            default:
-            {
-              NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_ue_release_request FIXME : Invalid type %d \n", generic_tl.tag );
-            }
-            break;
-        };
-    }
-
-    return 1;
-}
-
-static uint8_t unpack_harq_indication_tdd_harq_data_bundling(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_tdd_harq_data_bundling_t* value = (nfapi_harq_indication_tdd_harq_data_bundling_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &value->value_0, end) &&
-			pull8(ppReadPackedMsg, &value->value_1, end));
-}
-
-static uint8_t unpack_harq_indication_tdd_harq_data_multiplexing(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_tdd_harq_data_multiplexing_t* value = (nfapi_harq_indication_tdd_harq_data_multiplexing_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &value->value_0, end) &&
-			pull8(ppReadPackedMsg, &value->value_1, end) &&
-			pull8(ppReadPackedMsg, &value->value_2, end) &&
-			pull8(ppReadPackedMsg, &value->value_3, end));
-}
-static uint8_t unpack_harq_indication_tdd_harq_data_special_bundling(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_tdd_harq_data_special_bundling_t* value = (nfapi_harq_indication_tdd_harq_data_special_bundling_t*)tlv;
-	return ( pull8(ppReadPackedMsg, &value->value_0, end));
-}
-static uint8_t unpack_harq_indication_tdd_harq_data(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_tdd_harq_data_t* value = (nfapi_harq_indication_tdd_harq_data_t*)tlv;
-	return  (pull8(ppReadPackedMsg, &value->value_0, end));
-}
-
-static uint8_t unpack_harq_indication_tdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_tdd_rel8_t* value = (nfapi_harq_indication_tdd_rel8_t*)tlv;
-	
-	if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
-		return 0;
-
-	uint8_t result = 0;
-	switch(value->mode)
-	{
-		case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-			result = unpack_harq_indication_tdd_harq_data_bundling(&value->harq_data.bundling, ppReadPackedMsg, end);
-			break;
-		case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-			result = unpack_harq_indication_tdd_harq_data_multiplexing(&value->harq_data.multiplex, ppReadPackedMsg, end);
-			break;
-		case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-			result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data.special_bundling, ppReadPackedMsg, end);
-			break;
-		case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-		case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-			result = 1;
-			break;
-		default:
-			// TODO add error message
-			return 0;
-			break;
-	}
-	return result;
-}
-
-static uint8_t unpack_harq_indication_tdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_tdd_rel9_t* value = (nfapi_harq_indication_tdd_rel9_t*)tlv;
-	
-	if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
-		return 0;
-
-	if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD)
-	{
-		// TODO : add error message
-		return 0;
-	}
-
-	uint16_t idx = 0;
-	for(idx = 0; idx < value->number_of_ack_nack; ++idx)
-	{
-		uint8_t result = 0;
-		switch(value->mode)
-		{
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-				result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-				result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-				result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-				result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-				result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
-				break;
-			default:
-				// TODO add error message
-				return 0;
-				break;
-		}
-
-		if(result == 0)
-			return 0;
-	}
-	return 1;
-}
-
-static uint8_t unpack_harq_indication_tdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_tdd_rel13_t* value = (nfapi_harq_indication_tdd_rel13_t*)tlv;
-	
-	if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
-		 pull16(ppReadPackedMsg, &value->number_of_ack_nack, end)))
-		return 0;
-
-	if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD)
-	{
-		// TODO : add error message
-		return 0;
-	}
-
-	uint16_t idx = 0;
-	for(idx = 0; idx < value->number_of_ack_nack; ++idx)
-	{
-		uint8_t result = 0;
-		switch(value->mode)
-		{
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-				result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-				result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-				result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-				result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-				result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
-				result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_4, ppReadPackedMsg, end);
-				break;
-			case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
-				result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_5, ppReadPackedMsg, end);
-				break;
-			default:
-				// TODO add error message
-				return 0;
-				break;
-		}
-
-		if(result == 0)
-			return 0;
-	}
-	return 1;
-}
-
-static uint8_t unpack_harq_indication_fdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_fdd_rel8_t* value = (nfapi_harq_indication_fdd_rel8_t*)tlv;
-	return (pull8(ppReadPackedMsg, &value->harq_tb1, end) &&
-			pull8(ppReadPackedMsg, &value->harq_tb2, end));
-}
-
-static uint8_t unpack_harq_indication_fdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_fdd_rel9_t* value = (nfapi_harq_indication_fdd_rel9_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &value->mode, end) &&
-			pull8(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
-			pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, value->number_of_ack_nack, end));
-}
-
-static uint8_t unpack_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_harq_indication_fdd_rel13_t* value = (nfapi_harq_indication_fdd_rel13_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &value->mode, end) &&
-			pull16(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
-			pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, value->number_of_ack_nack, end));
-}
-
-static uint8_t unpack_ul_cqi_information_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_ul_cqi_information_t* value = (nfapi_ul_cqi_information_t*)tlv;
-	
-	return (pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
-			pull8(ppReadPackedMsg, &value->channel, end));
-}
-
-
-
-static uint8_t unpack_harq_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_harq_indication_body_t* value = (nfapi_harq_indication_body_t*)tlv;
-	uint8_t* harqBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-	if(harqBodyEnd > end)
-		return 0;
-
-	if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
-		return 0;
-
-	if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
-		return 0;		
-	}
-
-	value->harq_pdu_list = (nfapi_harq_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_harq_indication_pdu_t) * value->number_of_harqs, config);
-	if(value->harq_pdu_list == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
-		return 0;
-	}
-	
-	uint8_t i = 0;
-	for(i = 0; i < value->number_of_harqs; ++i)
-	{
-		nfapi_harq_indication_pdu_t* pdu = &(value->harq_pdu_list[i]);
-		if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-			return 0;
-
-		uint8_t* harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
-		unpack_tlv_t unpack_fns[] =
-		{
-			{ NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
-			{ NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, &unpack_harq_indication_tdd_rel8_value},
-			{ NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, &unpack_harq_indication_tdd_rel9_value},
-			{ NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, &unpack_harq_indication_tdd_rel13_value},
-			{ NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, &unpack_harq_indication_fdd_rel8_value},
-			{ NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, &unpack_harq_indication_fdd_rel9_value},
-			{ NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, &unpack_harq_indication_fdd_rel13_value},
-			{ NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
-		};
-
-		if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
-			return 0;
-	
-	}
-
-	return 1;
-}
-
-static uint8_t unpack_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, &unpack_harq_indication_body_value},
-	};
-
-	return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_crc_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_crc_indication_rel8_t* crc_pdu_rel8 = (nfapi_crc_indication_rel8_t*)tlv;
-	return ( pull8(ppReadPackedMsg, &crc_pdu_rel8->crc_flag, end) );
-}
-
-static uint8_t unpack_crc_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end,  nfapi_p7_codec_config_t* config)
-{
-	nfapi_crc_indication_body_t* value = (nfapi_crc_indication_body_t*)tlv;
-	uint8_t* crcBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-	if(crcBodyEnd > end)
-		return 0;
-
-	if(pull16(ppReadPackedMsg, &value->number_of_crcs, end) == 0)
-		return 0;
-
-	if(value->number_of_crcs > NFAPI_CRC_IND_MAX_PDU)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of crc ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_crcs, NFAPI_CRC_IND_MAX_PDU);
-		return 0;		
-	}
-
-	if(value->number_of_crcs > 0)
-	{
-		value->crc_pdu_list = (nfapi_crc_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_crc_indication_pdu_t) * value->number_of_crcs, config);
-		if(value->crc_pdu_list == NULL)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate crc ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_crcs);
-			return 0;
-		}
-	}
-	else
-	{
-		value->crc_pdu_list = 0;
-	}
-
-	
-	uint8_t i = 0;
-	for(i = 0; i < value->number_of_crcs; ++i)
-	{
-		nfapi_crc_indication_pdu_t* pdu = &(value->crc_pdu_list[i]);
-
-		if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-			return 0;
-
-		uint8_t* crcPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
-
-		unpack_tlv_t unpack_fns[] =
-		{
-			{ NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
-			{ NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, unpack_crc_indication_rel8_value },
-		};
-
-		if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, crcPduInstanceEnd, 0, 0) == 0)
-			return 0;
-	}
-
-	return 1;
-}
-
-static uint8_t unpack_crc_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, &unpack_crc_indication_body_value},
-	};
-
-	return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_rx_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_rx_indication_rel8_t* value = (nfapi_rx_indication_rel8_t*)tlv;
-	
-	return (pull16(ppReadPackedMsg, &value->length, end) &&
-			pull16(ppReadPackedMsg, &value->offset, end) &&
-			pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
-			pull16(ppReadPackedMsg, &value->timing_advance, end));
-}
-static uint8_t unpack_rx_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_rx_indication_rel9_t* value = (nfapi_rx_indication_rel9_t*)tlv;
-	return (pull16(ppReadPackedMsg, &value->timing_advance_r9, end));
-}
-
-static uint8_t unpack_rx_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_rx_indication_body_t* value = (nfapi_rx_indication_body_t*)tlv;
-
-	// the rxBodyEnd points to the end of the cqi PDU's
-	uint8_t* rxBodyEnd = *ppReadPackedMsg + value->tl.length;
-	uint8_t* rxPduEnd = rxBodyEnd;
-
-	uint8_t* numberOfPdusAddress = *ppReadPackedMsg;
-
-	if(rxBodyEnd > end)
-	{
-		// pdu end is past buffer end
-		return 0;
-	}
-
-	if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
-		return 0;
-
-	if(value->number_of_pdus > NFAPI_RX_IND_MAX_PDU)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of rx ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_RX_IND_MAX_PDU);
-		return 0;		
-	}
-
-	if(value->number_of_pdus > 0)
-	{
-		value->rx_pdu_list = (nfapi_rx_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_rx_indication_pdu_t) * value->number_of_pdus, config);
-		if(value->rx_pdu_list == NULL)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate rx ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
-			return 0;
-		}
-	}
-	else
-	{
-		value->rx_pdu_list = 0;
-	}
-	
-	uint8_t i = 0;
-	nfapi_rx_indication_pdu_t* pdu = 0;
-	while((uint8_t*)(*ppReadPackedMsg) < rxBodyEnd && (uint8_t*)(*ppReadPackedMsg) < rxPduEnd)
-	{
-		nfapi_tl_t generic_tl;
-		if( unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-			return 0;
-
-		switch(generic_tl.tag)
-		{
-			case NFAPI_RX_UE_INFORMATION_TAG:
-				{
-					pdu = &(value->rx_pdu_list[i++]);
-					pdu->rx_ue_information.tl = generic_tl;
-					if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
-						return 0;
-				}
-				break;
-			case NFAPI_RX_INDICATION_REL8_TAG:
-				{
-					if(pdu != 0)
-					{
-						pdu->rx_indication_rel8.tl = generic_tl;
-						if(unpack_rx_indication_rel8_value(&pdu->rx_indication_rel8, ppReadPackedMsg, end) == 0)
-							return 0;
-		
-						if(pdu->rx_indication_rel8.offset > 0)
-						{
-							// Need to check that the data is within the tlv
-							if(numberOfPdusAddress + pdu->rx_indication_rel8.offset + pdu->rx_indication_rel8.length <= rxBodyEnd)
-							{
-								// If this the first pdu set the rxPduEnd
-								if(numberOfPdusAddress + pdu->rx_indication_rel8.offset < rxPduEnd)
-								{
-									rxPduEnd = numberOfPdusAddress + pdu->rx_indication_rel8.offset;
-		
-									if(rxPduEnd > end)
-									{
-										// pdu end is past buffer end
-										return 0;
-									}
-								}
-							}
-							else
-							{
-								NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME: the rx data is outside of the tlv\n");
-							}
-						}
-					}
-				}
-				break;
-			case NFAPI_RX_INDICATION_REL9_TAG:
-				{
-					if(pdu != 0)
-					{
-						pdu->rx_indication_rel9.tl = generic_tl;
-						if(unpack_rx_indication_rel9_value(&pdu->rx_indication_rel9, ppReadPackedMsg, end) == 0)
-							return 0;
-					}
-				}
-				break;
-			default:
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_ULSCH.indication Invalid pdu type %d \n", generic_tl.tag );
-				}
-				break;
-		}
-	}
-	
-	uint8_t idx = 0;
-	for(idx = 0; idx < value->number_of_pdus; ++idx)
-	{
-		if(value->rx_pdu_list[idx].rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG)
-		{
-			uint32_t length = value->rx_pdu_list[idx].rx_indication_rel8.length;
-			value->rx_pdu_list[idx].data = nfapi_p7_allocate(length, config);
-			if(pullarray8(ppReadPackedMsg, value->rx_pdu_list[idx].data, length, length, end) == 0)
-			{
-				return 0;
-			}
-		}
-	}
-
-	return 1;
-}
-
-static uint8_t unpack_rx_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, &unpack_rx_indication_body_value},
-	};
-
-	return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_preamble_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_preamble_pdu_rel8_t* preamble_pdu_rel8 = (nfapi_preamble_pdu_rel8_t*)tlv;
-	
-	return (pull16(ppReadPackedMsg, &preamble_pdu_rel8->rnti, end) &&
-			pull8(ppReadPackedMsg, &preamble_pdu_rel8->preamble, end) &&
-			pull16(ppReadPackedMsg, &preamble_pdu_rel8->timing_advance, end));
-}
-
-static uint8_t unpack_preamble_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_preamble_pdu_rel9_t* preamble_pdu_rel9 = (nfapi_preamble_pdu_rel9_t*)tlv;
-	return pull16(ppReadPackedMsg, &preamble_pdu_rel9->timing_advance_r9, end);
-}
-
-static uint8_t unpack_preamble_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_preamble_pdu_rel13_t* preamble_pdu_rel13 = (nfapi_preamble_pdu_rel13_t*)tlv;
-	return pull8(ppReadPackedMsg, &preamble_pdu_rel13->rach_resource_type, end);
-}
-
-static uint8_t unpack_rach_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_rach_indication_body_t* value = (nfapi_rach_indication_body_t*)tlv;
-	uint8_t* rachBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-	if(rachBodyEnd > end)
-		return 0;
-
-	if(pull16(ppReadPackedMsg, &value->number_of_preambles, end) == 0)
-		return 0;
-
-	if(value->number_of_preambles > NFAPI_PREAMBLE_MAX_PDU)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of preamble du's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_preambles, NFAPI_PREAMBLE_MAX_PDU);
-		return 0;		
-	}
-
-	if(value->number_of_preambles > 0)
-	{
-		value->preamble_list = (nfapi_preamble_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_preamble_pdu_t) * value->number_of_preambles, config);
-		if(value->preamble_list == NULL)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate preamble pdu list (count:%d)\n", __FUNCTION__, value->number_of_preambles);
-			return 0;
-		}
-	}
-	else
-	{
-		value->preamble_list = 0;
-	}
-
-	
-	uint8_t i = 0;
-	for(i = 0; i < value->number_of_preambles; ++i)
-	{
-		nfapi_preamble_pdu_t* pdu = &(value->preamble_list[i]);
-
-		if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-			return 0;
-
-		uint8_t* preamblePduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
-
-		unpack_tlv_t unpack_fns[] =
-		{
-			{ NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, unpack_preamble_pdu_rel8_value },
-			{ NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, unpack_preamble_pdu_rel9_value },
-			{ NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, unpack_preamble_pdu_rel13_value },
-		};
-
-		if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, preamblePduInstanceEnd, 0, 0) == 0)
-			return 0;
-	}
-	return 1;
-}
-
-static uint8_t unpack_rach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, &unpack_rach_indication_body_value},
-	};
-
-	return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_srs_indication_fdd_rel8_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_srs_indication_fdd_rel8_t* srs_pdu_fdd_rel8 = (nfapi_srs_indication_fdd_rel8_t*)tlv;
-	
-	if(!(pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->doppler_estimation, end) &&
-		 pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->timing_advance, end) &&
-		 pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->number_of_resource_blocks, end) &&
-		 pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->rb_start, end) &&
-		 pullarray8(ppReadPackedMsg, srs_pdu_fdd_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_fdd_rel8->number_of_resource_blocks, end)))
-		return 0;
-	return 1;
-}
-
-static uint8_t unpack_srs_indication_fdd_rel9_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_srs_indication_fdd_rel9_t* srs_pdu_fdd_rel9 = (nfapi_srs_indication_fdd_rel9_t*)tlv;
-	return (pull16(ppReadPackedMsg, &srs_pdu_fdd_rel9->timing_advance_r9, end));
-}
-
-static uint8_t unpack_srs_indication_tdd_rel10_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_srs_indication_ttd_rel10_t* srs_pdu_tdd_rel10 = (nfapi_srs_indication_ttd_rel10_t*)tlv;
-	return (pull8(ppReadPackedMsg, &srs_pdu_tdd_rel10->uppts_symbol, end));
-}
-
-static uint8_t unpack_srs_indication_fdd_rel11_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_srs_indication_fdd_rel11_t* srs_pdu_fdd_rel11 = (nfapi_srs_indication_fdd_rel11_t*)tlv;
-	return ( pull16(ppReadPackedMsg, &srs_pdu_fdd_rel11->ul_rtoa, end));
-}
-
-static uint8_t unpack_tdd_channel_measurement_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_tdd_channel_measurement_t* value = (nfapi_tdd_channel_measurement_t*)tlv;
-	
-	if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) &&
-		 pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
-		 pull8(ppReadPackedMsg, &value->num_atennas, end)))
-		return 0;
-
-	if(value->number_of_subbands > NFAPI_MAX_NUM_SUBBANDS)
-	{
-		// todo : add error
-		return 0;
-	}
-
-	if(value->num_atennas > NFAPI_MAX_NUM_PHYSICAL_ANTENNAS)
-	{
-		// todo : add error
-		return 0;
-	}
-
-	uint8_t idx = 0;
-	for(idx = 0; idx < value->number_of_subbands; ++idx)
-	{
-		if(!(pull8(ppReadPackedMsg, &value->subands[idx].subband_index, end) &&
-			 pullarray16(ppReadPackedMsg, value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, end)))
-			return 0;
-	}
-
-	return 1;
-}
-
-
-static uint8_t unpack_srs_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_srs_indication_body_t* value = (nfapi_srs_indication_body_t*)tlv;
-	uint8_t* srsBodyEnd = *ppReadPackedMsg + value->tl.length;
-	
-	if(srsBodyEnd > end)
-		return 0;
-
-	if(pull8(ppReadPackedMsg, &value->number_of_ues, end) == 0)
-		return 0;
-
-	if(value->number_of_ues > NFAPI_SRS_IND_MAX_PDU)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of srs ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_ues, NFAPI_SRS_IND_MAX_PDU);
-		return 0;		
-	}
-
-	if(value->number_of_ues > 0)
-	{
-		value->srs_pdu_list = (nfapi_srs_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_srs_indication_pdu_t) * value->number_of_ues, config);
-		if(value->srs_pdu_list == NULL)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate srs ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_ues);
-			return 0;
-		}
-	}
-	else
-	{
-		value->srs_pdu_list = 0;
-	}
-
-
-	
-	uint8_t i = 0;
-	for(i = 0; i < value->number_of_ues; ++i)
-	{
-		nfapi_srs_indication_pdu_t* pdu = &(value->srs_pdu_list[i]);
-
-		
-		if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-			return 0;
-
-		uint8_t* srsPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
-
-		unpack_tlv_t unpack_fns[] =
-		{
-			{ NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
-			{ NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, unpack_srs_indication_fdd_rel8_value},
-			{ NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, unpack_srs_indication_fdd_rel9_value},
-			{ NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, unpack_srs_indication_tdd_rel10_value},
-			{ NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, unpack_srs_indication_fdd_rel11_value},
-			{ NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, unpack_tdd_channel_measurement_value},
-		};
-
-		if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srsPduInstanceEnd, 0, 0) == 0)
-			return 0;
-	}
-	return 1;
-}
-
-static uint8_t unpack_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, &unpack_srs_indication_body_value},
-	};
-
-	return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_sr_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_sr_indication_body_t* value = (nfapi_sr_indication_body_t*)tlv;
-	uint8_t* srBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-	if(srBodyEnd > end)
-		return 0;
-
-	if(pull16(ppReadPackedMsg, &value->number_of_srs, end) == 0)
-		return 0;
-
-	if(value->number_of_srs > NFAPI_SR_IND_MAX_PDU)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of sr ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_srs, NFAPI_SR_IND_MAX_PDU);
-		return 0;		
-	}
-
-	if(value->number_of_srs > 0)
-	{
-		value->sr_pdu_list = (nfapi_sr_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_sr_indication_pdu_t) * value->number_of_srs, config);
-		if(value->sr_pdu_list == NULL)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate sr ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_srs);
-			return 0;
-		}
-	}
-	else
-	{
-		value->sr_pdu_list = 0;
-	}
-	
-	uint8_t i = 0;
-	for(i = 0; i < value->number_of_srs; ++i)
-	{
-		nfapi_sr_indication_pdu_t* pdu = &(value->sr_pdu_list[i]);
-
-		if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-			return 0;
-
-		uint8_t* srPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
-
-		unpack_tlv_t unpack_fns[] =
-		{
-			{ NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
-			{ NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, unpack_ul_cqi_information_value },
-		};
-
-		if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srPduInstanceEnd, 0, 0) == 0)
-			return 0;
-	}
-
-	return 1;
-
-}
-
-static int unpack_sr_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, &unpack_sr_indication_body_value},
-	};
-
-	return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-static uint8_t unpack_cqi_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_cqi_indication_rel8_t* cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t*)tlv;
-	
-	return (pull16(ppReadPackedMsg, &cqi_pdu_rel8->length, end) &&
-			pull16(ppReadPackedMsg, &cqi_pdu_rel8->data_offset, end) &&
-			pull8(ppReadPackedMsg, &cqi_pdu_rel8->ul_cqi, end) &&
-			pull8(ppReadPackedMsg, &cqi_pdu_rel8->ri, end) &&
-			pull16(ppReadPackedMsg, &cqi_pdu_rel8->timing_advance, end));
-
-}
-
-static uint8_t unpack_cqi_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_cqi_indication_rel9_t* cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t*)tlv;
-	
-	if(!(pull16(ppReadPackedMsg, &cqi_pdu_rel9->length, end) &&
-		 pull16(ppReadPackedMsg, &cqi_pdu_rel9->data_offset, end) &&
-		 pull8(ppReadPackedMsg, &cqi_pdu_rel9->ul_cqi, end) &&
-		 pull8(ppReadPackedMsg, &cqi_pdu_rel9->number_of_cc_reported, end)))
-		return 0;
-
-	if(cqi_pdu_rel9->number_of_cc_reported > NFAPI_CC_MAX)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : out of bound array\n");
-		return 0;
-	}
-	
-	if(!(pullarray8(ppReadPackedMsg, cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, end) &&
-		 pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance, end) &&
-		 pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance_r9, end)))
-		return 0;
-
-	return 1;
-}
-
-static uint8_t  unpack_cqi_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end,  nfapi_p7_codec_config_t* config)
-{
-	nfapi_cqi_indication_body_t* value = (nfapi_cqi_indication_body_t*)tlv;
-
-	// the cqiBodyEnd points to the end of the cqi PDU's
-	uint8_t* cqiBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-	//uint8_t* cqiPduEnd = cqiBodyEnd;
-	//uint8_t* numberOfPdusAddress = *ppReadPackedMsg;
-
-	if(cqiBodyEnd > end)
-		return 0;
-
-	if(pull16(ppReadPackedMsg, &value->number_of_cqis, end) == 0)
-		return 0;
-
-	if(value->number_of_cqis > NFAPI_CQI_IND_MAX_PDU)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of cqi ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_cqis, NFAPI_CQI_IND_MAX_PDU);
-		return -1;		
-	}
-
-	if(value->number_of_cqis > 0)
-	{
-		value->cqi_pdu_list = (nfapi_cqi_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_pdu_t) * value->number_of_cqis, config);
-		if(value->cqi_pdu_list == NULL)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
-			return 0;
-		}
-	}
-	else
-	{
-		value->cqi_pdu_list = 0;
-	}
-
-	if(value->number_of_cqis > 0)
-	{
-		value->cqi_raw_pdu_list = (nfapi_cqi_indication_raw_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_raw_pdu_t) * value->number_of_cqis, config);
-		if(value->cqi_raw_pdu_list == NULL)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate raw cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
-			return 0;
-		}
-	}
-	else
-	{
-		value->cqi_raw_pdu_list = 0;
-	}
-
-	uint8_t i = 0;
-	for(i = 0; i < value->number_of_cqis; ++i)
-	{
-		nfapi_cqi_indication_pdu_t* pdu = &(value->cqi_pdu_list[i]);
-		memset(pdu, 0, sizeof(nfapi_cqi_indication_pdu_t));
-
-		if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-			return 0;
-
-		uint8_t* cqiPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
-
-		while((uint8_t*)(*ppReadPackedMsg) < cqiPduInstanceEnd)
-		{
-			nfapi_tl_t generic_tl;
-			if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-				return 0;
-
-			switch(generic_tl.tag)
-			{
-				case NFAPI_RX_UE_INFORMATION_TAG:
-					pdu->rx_ue_information.tl = generic_tl;
-					if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
-						return 0;
-					break;
-				case NFAPI_CQI_INDICATION_REL8_TAG:
-					pdu->cqi_indication_rel8.tl = generic_tl;
-					if(unpack_cqi_indication_rel8_value(&pdu->cqi_indication_rel8, ppReadPackedMsg, end) == 0)
-						return 0;
-
-					break;
-				case NFAPI_CQI_INDICATION_REL9_TAG:
-					pdu->cqi_indication_rel9.tl = generic_tl;
-					if(unpack_cqi_indication_rel9_value(&pdu->cqi_indication_rel9, ppReadPackedMsg, end) == 0)
-						return 0;
-
-					break;
-				case NFAPI_UL_CQI_INFORMATION_TAG:
-					pdu->ul_cqi_information.tl = generic_tl;
-					if(unpack_ul_cqi_information_value(&pdu->ul_cqi_information, ppReadPackedMsg, end) == 0)
-						return 0;
-					break;
-				default:
-					{
-						NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_CQI.indication Invalid pdu type %d \n", generic_tl.tag );
-					}
-					break;
-
-			};
-		}
-	}
-
-	uint8_t idx = 0;
-	for(idx = 0; idx < value->number_of_cqis; ++idx)
-	{
-		if(value->cqi_pdu_list[idx].cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG)
-		{
-			if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel8.length, end) == 0)
-				return 0;
-		}
-		else if(value->cqi_pdu_list[idx].cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG)
-		{
-			if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel9.length, end) == 0)
-				return 0;
-		}
-	}
-
-
-	return 1;
-
-}
-
-static uint8_t unpack_cqi_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, &unpack_cqi_indication_body_value},
-	};
-
-	return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-static uint8_t unpack_lbt_pdsch_req_pdu_rel13_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_lbt_pdsch_req_pdu_rel13_t* value = (nfapi_lbt_pdsch_req_pdu_rel13_t*)tlv;
-
-	return (pull32(ppReadPackedMsg, &value->handle, end) &&
-			pull32(ppReadPackedMsg, &value->mp_cca, end) &&
-			pull32(ppReadPackedMsg, &value->n_cca, end) &&
-			pull32(ppReadPackedMsg, &value->offset, end) &&
-			pull32(ppReadPackedMsg, &value->lte_txop_sf, end) &&
-			pull16(ppReadPackedMsg, &value->txop_sfn_sf_end, end) &&
-			pull32(ppReadPackedMsg, &value->lbt_mode, end));
-}
-
-static uint8_t unpack_lbt_drs_req_pdu_rel13_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_lbt_drs_req_pdu_rel13_t* value = (nfapi_lbt_drs_req_pdu_rel13_t*)tlv;
-
-	return (pull32(ppReadPackedMsg, &value->handle, end) &&
-			pull32(ppReadPackedMsg, &value->offset, end) &&
-			pull16(ppReadPackedMsg, &value->sfn_sf_end, end) &&
-			pull32(ppReadPackedMsg, &value->lbt_mode, end));
-}
-
-
-static uint8_t unpack_lbt_config_request_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_lbt_dl_config_request_body_t* value = (nfapi_lbt_dl_config_request_body_t*)tlv;
-
-	if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
-		return 0;
-
-	if(value->number_of_pdus > NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU);
-		return 0;		
-	}
-
-	if(value->number_of_pdus)
-	{
-		value->lbt_dl_config_req_pdu_list = (nfapi_lbt_dl_config_request_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_config_request_pdu_t) * value->number_of_pdus, config);
-		if(value->lbt_dl_config_req_pdu_list == NULL)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
-			return 0;
-		}
-	}
-	else
-	{
-		value->lbt_dl_config_req_pdu_list = 0;
-	}
-
-
-	uint16_t i;
-	uint16_t total_number_of_pdus = value->number_of_pdus;
-	for(i = 0; i < total_number_of_pdus; ++i)
-	{
-		nfapi_lbt_dl_config_request_pdu_t* pdu = &(value->lbt_dl_config_req_pdu_list[i]);
-
-		if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
-			 pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
-			return 0;
-			
-		uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
-		if(packedPduEnd > end)
-			return 0;
-
-		switch(pdu->pdu_type)
-		{
-			case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, &unpack_lbt_pdsch_req_pdu_rel13_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, &unpack_lbt_drs_req_pdu_rel13_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			default:
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request body invalid pdu type %d\n", pdu->pdu_type);
-				return 0;
-		}
-	}
-
-	return 1;
-}
-static uint8_t unpack_lbt_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, &unpack_lbt_config_request_body_value},
-	};
-	
-	return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_lbt_pdsch_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_lbt_pdsch_rsp_pdu_rel13_t* value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t*)tlv;
-	
-	return (pull32(ppReadPackedMsg, &value->handle, end) &&
-			pull32(ppReadPackedMsg, &value->result, end) &&
-			pull32(ppReadPackedMsg, &value->lte_txop_symbols, end) &&
-			pull32(ppReadPackedMsg, &value->initial_partial_sf, end));
-	
-}
-static uint8_t unpack_lbt_drs_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_lbt_drs_rsp_pdu_rel13_t* value = (nfapi_lbt_drs_rsp_pdu_rel13_t*)tlv;
-	
-	return (pull32(ppReadPackedMsg, &value->handle, end) &&
-			pull32(ppReadPackedMsg, &value->result, end));
-}
-
-static uint8_t unpack_lbt_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_lbt_dl_indication_body_t* value = (nfapi_lbt_dl_indication_body_t*)tlv;
-
-	if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
-		return 0;
-
-	if(value->number_of_pdus > NFAPI_LBT_IND_MAX_PDU)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_IND_MAX_PDU);
-		return 0;		
-	}
-
-	if(value->number_of_pdus > 0)
-	{
-		value->lbt_indication_pdu_list = (nfapi_lbt_dl_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_indication_pdu_t) * value->number_of_pdus, config);
-		if(value->lbt_indication_pdu_list == NULL)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl ind config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
-			return 0;
-		}
-	}
-	else
-	{
-		value->lbt_indication_pdu_list = 0;
-	}
-
-	uint16_t i;
-	uint16_t total_number_of_pdus = value->number_of_pdus;
-	for(i = 0; i < total_number_of_pdus; ++i)
-	{
-		nfapi_lbt_dl_indication_pdu_t* pdu = &(value->lbt_indication_pdu_list[i]);
-
-		if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
-			 pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
-			return 0;
-			
-		uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
-		if(packedPduEnd > end)
-			return 0;
-
-		switch(pdu->pdu_type)
-		{
-			case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, &unpack_lbt_pdsch_rsp_pdu_rel13_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE:
-				{
-					unpack_tlv_t unpack_fns[] =
-					{
-						{ NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, &unpack_lbt_drs_rsp_pdu_rel13_value},
-					};
-
-					unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-				}
-				break;
-			default:
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d\n", pdu->pdu_type);
-				return 0;
-		}
-	}
-
-	return 1;
-}
-static uint8_t unpack_lbt_dl_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, &unpack_lbt_indication_body_value},
-	};
-
-	return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nb_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nb_harq_indication_fdd_rel13_t* value = (nfapi_nb_harq_indication_fdd_rel13_t*)tlv;
-	return (pull8(ppReadPackedMsg, &value->harq_tb1, end));
-}
-
-
-static uint8_t unpack_nb_harq_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nb_harq_indication_body_t* value = (nfapi_nb_harq_indication_body_t*)tlv;
-	uint8_t* nbharqBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-	if(nbharqBodyEnd > end)
-		return 0;
-
-	if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
-		return 0;
-
-	if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
-		return 0;		
-	}
-
-	value->nb_harq_pdu_list = (nfapi_nb_harq_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_nb_harq_indication_pdu_t) * value->number_of_harqs, config);
-	if(value->nb_harq_pdu_list == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
-		return 0;
-	}
-	
-	uint8_t i = 0;
-	for(i = 0; i < value->number_of_harqs; ++i)
-	{
-		nfapi_nb_harq_indication_pdu_t* pdu = &(value->nb_harq_pdu_list[i]);
-		if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-			return 0;
-
-		uint8_t* harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
-		unpack_tlv_t unpack_fns[] =
-		{
-			{ NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
-			{ NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, &unpack_nb_harq_indication_fdd_rel13_value},
-			{ NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
-		};
-
-		if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
-			return 0;
-	
-	}
-
-	return 1;
-}
-
-static uint8_t unpack_nb_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, &unpack_nb_harq_indication_body_value},
-	};
-
-	return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nrach_indication_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
-{
-	nfapi_nrach_indication_pdu_rel13_t* value = (nfapi_nrach_indication_pdu_rel13_t*)tlv;
-	
-	return (pull16(ppReadPackedMsg, &value->rnti, end) && 
-			pull8(ppReadPackedMsg, &value->initial_sc, end) &&
-			pull16(ppReadPackedMsg, &value->timing_advance, end) &&
-			pull8(ppReadPackedMsg, &value->nrach_ce_level, end));
-}
-
-static uint8_t unpack_ue_release_resp(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t*)msg;
-	if(pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) == 0){
-		return 0;
-	}
-	else{
-		NFAPI_TRACE(NFAPI_TRACE_INFO, "ue_release_response:error_code = %d\n", pNfapiMsg->error_code);
-	}
-	return 1;
-}
-
-static uint8_t unpack_nrach_indication_body_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nrach_indication_body_t* value = (nfapi_nrach_indication_body_t*)tlv;
-	uint8_t* nrachBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-	if(nrachBodyEnd > end)
-		return 0;
-
-	if(pull8(ppReadPackedMsg, &value->number_of_initial_scs_detected, end) == 0)
-		return 0;
-
-	if(value->number_of_initial_scs_detected > NFAPI_PREAMBLE_MAX_PDU)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of detected scs ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected, NFAPI_PREAMBLE_MAX_PDU);
-		return 0;		
-	}
-
-	value->nrach_pdu_list = (nfapi_nrach_indication_pdu_t*)nfapi_p7_allocate(sizeof(nfapi_nrach_indication_pdu_t) * value->number_of_initial_scs_detected, config);
-	if(value->nrach_pdu_list == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate nrach ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected);
-		return 0;
-	}
-	
-	uint8_t i = 0;
-	for(i = 0; i < value->number_of_initial_scs_detected; ++i)
-	{
-		nfapi_nrach_indication_pdu_t* pdu = &(value->nrach_pdu_list[i]);
-
-		uint8_t* nrachPduInstanceEnd = *ppReadPackedMsg + 4 + 6;
-
-		unpack_tlv_t unpack_fns[] =
-		{
-			{ NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, &unpack_nrach_indication_rel13_value},
-		};
-
-		if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, nrachPduInstanceEnd, 0, 0) == 0)
-			return 0;
-	
-	}
-
-	return 1;
-}
-
-static uint8_t unpack_nrach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, &unpack_nrach_indication_body_value},
-	};
-
-	return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nr_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-	};
-
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) && 
-			pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_slot, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-	};
-
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) && 
-			pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_sf, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_nr_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-	};
-
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
-			pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
-			pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-	};
-
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
-			pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
-			pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-	};
-    
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn_sf, end) &&
-			pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
-			pull32(ppReadPackedMsg, &pNfapiMsg->dl_config_jitter, end) &&
-			pull32(ppReadPackedMsg, &pNfapiMsg->tx_request_jitter, end) &&
-			pull32(ppReadPackedMsg, &pNfapiMsg->ul_config_jitter, end) &&
-			pull32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_jitter, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_latest_delay, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_latest_delay, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_latest_delay, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_latest_delay, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_earliest_arrival, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_earliest_arrival, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_earliest_arrival, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_earliest_arrival, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_nr_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
-{
-	nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t*)msg;
-
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-	};
-    
-	return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn, end) &&
-			pull32(ppReadPackedMsg, &pNfapiMsg->last_slot, end) &&
-			pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
-			pull32(ppReadPackedMsg, &pNfapiMsg->dl_tti_jitter, end) &&
-			pull32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_jitter, end) &&
-			pull32(ppReadPackedMsg, &pNfapiMsg->ul_tti_jitter, end) &&
-			pull32(ppReadPackedMsg, &pNfapiMsg->ul_dci_jitter, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_latest_delay, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_latest_delay, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_latest_delay, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_latest_delay, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_earliest_arrival, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_earliest_arrival, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_earliest_arrival, end) &&
-			pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_earliest_arrival, end) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-
-// unpack length check
-
-static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen)
-{
-	int retLen = 0;
-
-	switch (msgId)
-	{
-		case NFAPI_DL_CONFIG_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_dl_config_request_t))
-				retLen = sizeof(nfapi_dl_config_request_t);
-			break;
-
-		case NFAPI_UL_CONFIG_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_ul_config_request_t))
-				retLen = sizeof(nfapi_ul_config_request_t);
-			break;
-
-		case NFAPI_SUBFRAME_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
-				retLen = sizeof(nfapi_subframe_indication_t);
-			break;
-
-		case NFAPI_HI_DCI0_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_hi_dci0_request_t))
-				retLen = sizeof(nfapi_hi_dci0_request_t);
-			break;
-
-		case NFAPI_TX_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_tx_request_t))
-				retLen = sizeof(nfapi_tx_request_t);
-			break;
-
-		case NFAPI_HARQ_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_harq_indication_t))
-				retLen = sizeof(nfapi_harq_indication_t);
-			break;
-
-		case NFAPI_CRC_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_crc_indication_t))
-				retLen = sizeof(nfapi_crc_indication_t);
-			break;
-
-		case NFAPI_RX_ULSCH_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_rx_indication_t))
-				retLen = sizeof(nfapi_rx_indication_t);
-			break;
-
-		case NFAPI_RACH_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_rach_indication_t))
-				retLen = sizeof(nfapi_rach_indication_t);
-			break;
-
-		case NFAPI_SRS_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_srs_indication_t))
-				retLen = sizeof(nfapi_srs_indication_t);
-			break;
-
-		case NFAPI_RX_SR_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_sr_indication_t))
-				retLen = sizeof(nfapi_sr_indication_t);
-			break;
-
-		case NFAPI_RX_CQI_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_cqi_indication_t))
-				retLen = sizeof(nfapi_cqi_indication_t);
-			break;
-
-		case NFAPI_LBT_DL_CONFIG_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_lbt_dl_config_request_t))
-				retLen = sizeof(nfapi_lbt_dl_config_request_t);
-			break;
-
-		case NFAPI_LBT_DL_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_lbt_dl_indication_t))
-				retLen = sizeof(nfapi_lbt_dl_indication_t);
-			break;
-	
-		case NFAPI_NB_HARQ_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_nb_harq_indication_t))
-				retLen = sizeof(nfapi_nb_harq_indication_t);
-			break;
-			
-		case NFAPI_NRACH_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_nrach_indication_t))
-				retLen = sizeof(nfapi_nrach_indication_t);
-			break;			
-			
-		case NFAPI_DL_NODE_SYNC:
-			if (unpackedBufLen >= sizeof(nfapi_dl_node_sync_t))
-				retLen = sizeof(nfapi_dl_node_sync_t);
-			break;
-
-		case NFAPI_UL_NODE_SYNC:
-			if (unpackedBufLen >= sizeof(nfapi_ul_node_sync_t))
-				retLen = sizeof(nfapi_ul_node_sync_t);
-			break;
-
-		case NFAPI_TIMING_INFO:
-			if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
-				retLen = sizeof(nfapi_timing_info_t);
-			break;
-
-		case NFAPI_UE_RELEASE_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
-				retLen = sizeof(nfapi_ue_release_request_t);
-			break;
-
-		case NFAPI_UE_RELEASE_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
-				retLen = sizeof(nfapi_ue_release_response_t);
-			break;
-
-		default:
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
-			break;
-	}
-
-	return retLen;
-}
-
-static int check_nr_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen)
-{
-	int retLen = 0;
-
-	switch (msgId)
-	{
-		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_nr_dl_tti_request_t))
-				retLen = sizeof(nfapi_nr_dl_tti_request_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_nr_ul_tti_request_t))
-				retLen = sizeof(nfapi_nr_ul_tti_request_t);
-			break;
-
-		case NFAPI_SUBFRAME_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
-				retLen = sizeof(nfapi_subframe_indication_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_nr_ul_dci_request_t))
-				retLen = sizeof(nfapi_nr_ul_dci_request_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_nr_tx_data_request_t))
-				retLen = sizeof(nfapi_nr_tx_data_request_t);
-			break;
-
-		case NFAPI_HARQ_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_harq_indication_t))
-				retLen = sizeof(nfapi_harq_indication_t);
-			break;
-
-		case NFAPI_CRC_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_crc_indication_t))
-				retLen = sizeof(nfapi_crc_indication_t);
-			break;
-
-		case NFAPI_RX_ULSCH_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_rx_indication_t))
-				retLen = sizeof(nfapi_rx_indication_t);
-			break;
-
-		case NFAPI_RACH_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_rach_indication_t))
-				retLen = sizeof(nfapi_rach_indication_t);
-			break;
-
-		case NFAPI_SRS_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_srs_indication_t))
-				retLen = sizeof(nfapi_srs_indication_t);
-			break;
-
-		case NFAPI_RX_SR_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_sr_indication_t))
-				retLen = sizeof(nfapi_sr_indication_t);
-			break;
-
-		case NFAPI_RX_CQI_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_cqi_indication_t))
-				retLen = sizeof(nfapi_cqi_indication_t);
-			break;
-
-		case NFAPI_LBT_DL_CONFIG_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_lbt_dl_config_request_t))
-				retLen = sizeof(nfapi_lbt_dl_config_request_t);
-			break;
-
-		case NFAPI_LBT_DL_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_lbt_dl_indication_t))
-				retLen = sizeof(nfapi_lbt_dl_indication_t);
-			break;
-	
-		case NFAPI_NB_HARQ_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_nb_harq_indication_t))
-				retLen = sizeof(nfapi_nb_harq_indication_t);
-			break;
-			
-		case NFAPI_NRACH_INDICATION:
-			if (unpackedBufLen >= sizeof(nfapi_nrach_indication_t))
-				retLen = sizeof(nfapi_nrach_indication_t);
-			break;			
-			
-		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
-			if (unpackedBufLen >= sizeof(nfapi_nr_dl_node_sync_t))
-				retLen = sizeof(nfapi_nr_dl_node_sync_t);
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
-			if (unpackedBufLen >= sizeof(nfapi_nr_ul_node_sync_t))
-				retLen = sizeof(nfapi_nr_ul_node_sync_t);
-			break;
-
-		case NFAPI_TIMING_INFO:
-			if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
-				retLen = sizeof(nfapi_timing_info_t);
-			break;
-
-		case NFAPI_UE_RELEASE_REQUEST:
-			if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
-				retLen = sizeof(nfapi_ue_release_request_t);
-			break;
-
-		case NFAPI_UE_RELEASE_RESPONSE:
-			if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
-				retLen = sizeof(nfapi_ue_release_response_t);
-			break;
-
-		default:
-			NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
-			break;
-	}
-
-	return retLen;
-}
-
-
-
-// Main unpack functions - public
-
-int nfapi_p7_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config)
-{
-	nfapi_p7_message_header_t *pMessageHeader = pUnpackedBuf;
-	uint8_t *pReadPackedMessage = pMessageBuf;
-	uint8_t *end = pMessageBuf + messageBufLen;
-
-	if (pMessageBuf == NULL || pUnpackedBuf == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied pointers are null\n");
-		return -1;
-	}
-
-	if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-		return -1;
-	}
-
-	// process the header
-	if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
-		 pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-		 pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-		 pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
-		 pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
-		 pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
-		return -1;
-
-	return 0;
-}
-
-int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config)
-{
-	int result = 0;
-	nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t*)pUnpackedBuf;
-	uint8_t *pReadPackedMessage = pMessageBuf;
-	uint8_t *end = pMessageBuf + messageBufLen;
-
-	if (pMessageBuf == NULL || pUnpackedBuf == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
-		return -1;
-	}
-
-	if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-		return -1;
-	}
-  /*
-    uint8_t *ptr = pMessageBuf;
-	printf("\n Read P7 message unpack: ");
-	while(ptr < end){
-		printf(" %d ", *ptr);
-		ptr++;
-	}
-	printf("\n");
-*/
-	// clean the supplied buffer for - tag value blanking
-	(void)memset(pUnpackedBuf, 0, unpackedBufLen);
-
-	// process the header
-	if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
-		 pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-		 pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-		 pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
-		 pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
-		 pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
-		return -1;
-	}
-
-	if((uint8_t*)(pMessageBuf + pMessageHeader->message_length) > end)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
-		return -1;
-	}
-
-	/*
-	if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
-		return -1;
-	}
-	*/
-
-	// look for the specific message
-	switch (pMessageHeader->message_id)
-	{   
-		case NFAPI_DL_CONFIG_REQUEST:
-			if (check_unpack_length(NFAPI_DL_CONFIG_REQUEST, unpackedBufLen))
-				result = unpack_dl_config_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_UL_CONFIG_REQUEST:
-			if (check_unpack_length(NFAPI_UL_CONFIG_REQUEST, unpackedBufLen))
-				result = unpack_ul_config_request(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-		case NFAPI_TX_REQUEST:
-			if (check_unpack_length(NFAPI_TX_REQUEST, unpackedBufLen))
-				result = unpack_tx_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-			case NFAPI_HI_DCI0_REQUEST:
-			if (check_unpack_length(NFAPI_HI_DCI0_REQUEST, unpackedBufLen))
-				result = unpack_hi_dci0_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_UE_RELEASE_REQUEST:
-			if (check_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
-				result = unpack_ue_release_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_HARQ_INDICATION:
-			if (check_unpack_length(NFAPI_HARQ_INDICATION, unpackedBufLen))
-				result = unpack_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_CRC_INDICATION:
-			if (check_unpack_length(NFAPI_CRC_INDICATION, unpackedBufLen))
-				result = unpack_crc_indication(&pReadPackedMessage,end , pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_RX_ULSCH_INDICATION:
-			if (check_unpack_length(NFAPI_RX_ULSCH_INDICATION, unpackedBufLen))
-				result = unpack_rx_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_RACH_INDICATION:
-			if (check_unpack_length(NFAPI_RACH_INDICATION, unpackedBufLen))
-				result = unpack_rach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_SRS_INDICATION:
-			if (check_unpack_length(NFAPI_SRS_INDICATION, unpackedBufLen))
-				result = unpack_srs_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_RX_SR_INDICATION:
-			if (check_unpack_length(NFAPI_RX_SR_INDICATION, unpackedBufLen))
-				result = unpack_sr_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_RX_CQI_INDICATION:
-			if (check_unpack_length(NFAPI_RX_CQI_INDICATION, unpackedBufLen))
-				result = unpack_cqi_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_LBT_DL_CONFIG_REQUEST:
-			if (check_unpack_length(NFAPI_LBT_DL_CONFIG_REQUEST, unpackedBufLen))
-				result = unpack_lbt_dl_config_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_LBT_DL_INDICATION:
-			if (check_unpack_length(NFAPI_LBT_DL_INDICATION, unpackedBufLen))
-				result = unpack_lbt_dl_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-			
-		case NFAPI_NB_HARQ_INDICATION:
-			if (check_unpack_length(NFAPI_NB_HARQ_INDICATION, unpackedBufLen))
-				result = unpack_nb_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;	
-			
-		case NFAPI_NRACH_INDICATION:
-			if (check_unpack_length(NFAPI_NRACH_INDICATION, unpackedBufLen))
-				result = unpack_nrach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-			
-		case NFAPI_DL_NODE_SYNC:
-			if (check_unpack_length(NFAPI_DL_NODE_SYNC, unpackedBufLen))
-				result = unpack_dl_node_sync(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_UL_NODE_SYNC:
-			if (check_unpack_length(NFAPI_UL_NODE_SYNC, unpackedBufLen))
-				result = unpack_ul_node_sync(&pReadPackedMessage, end , pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_TIMING_INFO:
-			if (check_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
-				result = unpack_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_UE_RELEASE_RESPONSE:
-			if (check_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
-				result = unpack_ue_release_resp(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		default:
-
-			if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN && 
-			   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
-			{
-				if(config && config->unpack_p7_vendor_extension)
-				{
-					result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
-				}
-				else
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-				}
-			}
-			else
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-			}
-			break;
-	}
-
-	if(result == 0)
-		return -1;
-	else 
-		return 0;
-}
-
-int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config)
-{
-	int result = 0;
-	nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t*)pUnpackedBuf;
-	uint8_t *pReadPackedMessage = pMessageBuf;
-	uint8_t *end = pMessageBuf + messageBufLen;
-
-	if (pMessageBuf == NULL || pUnpackedBuf == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
-		return -1;
-	}
-
-	if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-		return -1;
-	}
-  /*
-    uint8_t *ptr = pMessageBuf;
-	printf("\n Read P7 message unpack: ");
-	while(ptr < end){
-		printf(" %d ", *ptr);
-		ptr++;
-	}
-	printf("\n");
-*/
-	// clean the supplied buffer for - tag value blanking
-	(void)memset(pUnpackedBuf, 0, unpackedBufLen);
-
-	// process the header
-	if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
-		 pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-		 pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-		 pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
-		 pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
-		 pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
-		return -1;
-	}
-
-	if((uint8_t*)(pMessageBuf + pMessageHeader->message_length) > end)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
-		return -1;
-	}
-
-	/*
-	if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
-		return -1;
-	}
-	*/
-
-	// look for the specific message
-	switch (pMessageHeader->message_id)
-	{   
-		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST, unpackedBufLen))
-				result = unpack_dl_tti_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST, unpackedBufLen))
-				result = unpack_ul_tti_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-		case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST, unpackedBufLen))
-				result = unpack_tx_data_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-		case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST, unpackedBufLen))
-				result = unpack_ul_dci_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-		
-		case NFAPI_UE_RELEASE_REQUEST:
-			if (check_nr_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
-				result = unpack_ue_release_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_HARQ_INDICATION:
-			if (check_nr_unpack_length(NFAPI_HARQ_INDICATION, unpackedBufLen))
-				result = unpack_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_CRC_INDICATION:
-			if (check_nr_unpack_length(NFAPI_CRC_INDICATION, unpackedBufLen))
-				result = unpack_crc_indication(&pReadPackedMessage,end , pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_RX_ULSCH_INDICATION:
-			if (check_nr_unpack_length(NFAPI_RX_ULSCH_INDICATION, unpackedBufLen))
-				result = unpack_rx_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_RACH_INDICATION:
-			if (check_nr_unpack_length(NFAPI_RACH_INDICATION, unpackedBufLen))
-				result = unpack_rach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_SRS_INDICATION:
-			if (check_nr_unpack_length(NFAPI_SRS_INDICATION, unpackedBufLen))
-				result = unpack_srs_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_RX_SR_INDICATION:
-			if (check_nr_unpack_length(NFAPI_RX_SR_INDICATION, unpackedBufLen))
-				result = unpack_sr_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_RX_CQI_INDICATION:
-			if (check_nr_unpack_length(NFAPI_RX_CQI_INDICATION, unpackedBufLen))
-				result = unpack_cqi_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_LBT_DL_CONFIG_REQUEST:
-			if (check_nr_unpack_length(NFAPI_LBT_DL_CONFIG_REQUEST, unpackedBufLen))
-				result = unpack_lbt_dl_config_request(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_LBT_DL_INDICATION:
-			if (check_nr_unpack_length(NFAPI_LBT_DL_INDICATION, unpackedBufLen))
-				result = unpack_lbt_dl_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-			
-		case NFAPI_NB_HARQ_INDICATION:
-			if (check_nr_unpack_length(NFAPI_NB_HARQ_INDICATION, unpackedBufLen))
-				result = unpack_nb_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;	
-			
-		case NFAPI_NRACH_INDICATION:
-			if (check_nr_unpack_length(NFAPI_NRACH_INDICATION, unpackedBufLen))
-				result = unpack_nrach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-			
-		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC, unpackedBufLen))
-				result = unpack_nr_dl_node_sync(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
-			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC, unpackedBufLen))
-				result = unpack_nr_ul_node_sync(&pReadPackedMessage, end , pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_TIMING_INFO:
-			if (check_nr_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
-				result = unpack_nr_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		case NFAPI_UE_RELEASE_RESPONSE:
-			if (check_nr_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
-				result = unpack_ue_release_resp(&pReadPackedMessage,  end, pMessageHeader, config);
-			else
-				return -1;
-			break;
-
-		default:
-
-			if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN && 
-			   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
-			{
-				if(config && config->unpack_p7_vendor_extension)
-				{
-					result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
-				}
-				else
-				{
-					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-				}
-			}
-			else
-			{
-				NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-			}
-			break;
-	}
-
-	if(result == 0)
-		return -1;
-	else 
-		return 0;
-}
-
-
+/*
+ * Copyright 2017 Cisco Systems, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.
+ */
+
+
+#include <assert.h>
+#include <signal.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <zlib.h>
+#include <sched.h>
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <pthread.h>
+#include <stdint.h>
+
+#include <nfapi_interface.h>
+#include <nfapi.h>
+#include <debug.h>
+#include "nfapi_nr_interface_scf.h"
+
+extern int nfapi_unpack_p7_vendor_extension(nfapi_p7_message_header_t *header, uint8_t **ppReadPackedMsg, void *user_data);
+extern int nfapi_pack_p7_vendor_extension(nfapi_p7_message_header_t *header, uint8_t **ppWritePackedMsg, void *user_data);
+
+uint32_t nfapi_calculate_checksum(uint8_t *buffer, uint16_t len) {
+  uint32_t chksum = 0;
+  // calcaulte upto the checksum
+  chksum = crc32(chksum, buffer, 8);
+  // skip the checksum
+  uint8_t zeros[4] = {0, 0, 0, 0};
+  chksum = crc32(chksum, zeros, 4);
+  // continu with the rest of the mesage
+  chksum = crc32(chksum, &buffer[NFAPI_P7_HEADER_LENGTH], len - NFAPI_P7_HEADER_LENGTH);
+  // return the inverse
+  return ~(chksum);
+}
+
+int nfapi_p7_update_checksum(uint8_t *buffer, uint32_t len) {
+  uint32_t checksum = nfapi_calculate_checksum(buffer, len);
+  uint8_t *p_write = &buffer[8];
+  return (push32(checksum, &p_write, buffer + len) > 0 ? 0 : -1);
+}
+
+int nfapi_p7_update_transmit_timestamp(uint8_t *buffer, uint32_t timestamp) {
+  uint8_t *p_write = &buffer[12];
+  return (push32(timestamp, &p_write, buffer + 16) > 0 ? 0 : -1);
+}
+
+uint32_t nfapi_p7_calculate_checksum(uint8_t *buffer, uint32_t len) {
+  return nfapi_calculate_checksum(buffer, len);
+}
+
+void *nfapi_p7_allocate(size_t size, nfapi_p7_codec_config_t *config) {
+  if(size == 0)
+    return 0;
+
+  void *buffer_p = NULL;
+
+  if(config && config->allocate) {
+    buffer_p = (config->allocate)(size);
+
+    if(buffer_p != NULL) {
+      memset(buffer_p,0,size);
+    }
+
+    return buffer_p;
+  } else {
+    buffer_p = calloc(1, size);
+    return buffer_p;
+  }
+}
+
+void nfapi_p7_deallocate(void *ptr, nfapi_p7_codec_config_t *config) {
+  if(ptr == NULL)
+    return;
+
+  if(config && config->deallocate) {
+    return (config->deallocate)(ptr);
+  } else {
+    return free(ptr);
+  }
+}
+// Pack routines
+
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel8_t *value = (nfapi_dl_config_dci_dl_pdu_rel8_t *)tlv;
+  //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci_format:%u\n", __FUNCTION__, value->dci_format);
+  return ( push8(value->dci_format, ppWritePackedMsg, end) &&
+           push8(value->cce_idx, ppWritePackedMsg, end) &&
+           push8(value->aggregation_level, ppWritePackedMsg, end) &&
+           push16(value->rnti, ppWritePackedMsg, end) &&
+           push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+           push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
+           push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+           push8(value->mcs_1, ppWritePackedMsg, end) &&
+           push8(value->redundancy_version_1, ppWritePackedMsg, end) &&
+           push8(value->new_data_indicator_1, ppWritePackedMsg, end) &&
+           push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
+           push8(value->mcs_2, ppWritePackedMsg, end) &&
+           push8(value->redundancy_version_2, ppWritePackedMsg, end) &&
+           push8(value->new_data_indicator_2, ppWritePackedMsg, end) &&
+           push8(value->harq_process, ppWritePackedMsg, end) &&
+           push8(value->tpmi, ppWritePackedMsg, end) &&
+           push8(value->pmi, ppWritePackedMsg, end) &&
+           push8(value->precoding_information, ppWritePackedMsg, end) &&
+           push8(value->tpc, ppWritePackedMsg, end) &&
+           push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
+           push8(value->ngap, ppWritePackedMsg, end) &&
+           push8(value->transport_block_size_index, ppWritePackedMsg, end) &&
+           push8(value->downlink_power_offset, ppWritePackedMsg, end) &&
+           push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
+           push8(value->preamble_index, ppWritePackedMsg, end) &&
+           push8(value->prach_mask_index, ppWritePackedMsg, end) &&
+           push8(value->rnti_type, ppWritePackedMsg, end) &&
+           push16(value->transmission_power, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel9_t *value = (nfapi_dl_config_dci_dl_pdu_rel9_t *)tlv;
+  return( push8(value->mcch_flag, ppWritePackedMsg, end) &&
+          push8(value->mcch_change_notification, ppWritePackedMsg, end) &&
+          push8(value->scrambling_identity, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel10_t *value = (nfapi_dl_config_dci_dl_pdu_rel10_t *)tlv;
+  return ( push8(value->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
+           push8(value->carrier_indicator, ppWritePackedMsg, end) &&
+           push8(value->srs_flag, ppWritePackedMsg, end) &&
+           push8(value->srs_request, ppWritePackedMsg, end) &&
+           push8(value->antenna_ports_scrambling_and_layers, ppWritePackedMsg, end) &&
+           push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) &&
+           push8(value->n_dl_rb, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel11_t *value = (nfapi_dl_config_dci_dl_pdu_rel11_t *)tlv;
+  return ( push8(value->harq_ack_resource_offset, ppWritePackedMsg, end) &&
+           push8(value->pdsch_re_mapping_quasi_co_location_indicator, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel12_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel12_t *value = (nfapi_dl_config_dci_dl_pdu_rel12_t *)tlv;
+  return ( push8(value->primary_cell_type, ppWritePackedMsg, end) &&
+           push8(value->ul_dl_configuration_flag, ppWritePackedMsg, end) &&
+           push8(value->number_ul_dl_configurations, ppWritePackedMsg, end) &&
+           pusharray8(value->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, value->number_ul_dl_configurations, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_tpm_value(nfapi_dl_config_dci_dl_tpm_t *value, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  if (!( push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
+         push8(value->number_of_subbands, ppWritePackedMsg, end) &&
+         push8(value->num_antennas, ppWritePackedMsg, end)))
+    return 0;
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_subbands; ++idx) {
+    nfapi_dl_config_dci_dl_tpm_subband_info_t *subband_info = &(value->subband_info[idx]);
+
+    if(!(push8(subband_info->subband_index, ppWritePackedMsg, end) &&
+         push8(subband_info->scheduled_ues, ppWritePackedMsg, end)))
+      return 0;
+
+    uint8_t antenna_idx = 0;
+    uint8_t scheduled_ue_idx = 0;
+
+    for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx) {
+      for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx) {
+        if(!push16(subband_info->precoding_value[antenna_idx][scheduled_ue_idx], ppWritePackedMsg, end))
+          return 0;
+      }
+    }
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv;
+  return(
+          push16(value->bwp_size, ppWritePackedMsg, end) &&
+          push16(value->bwp_start, ppWritePackedMsg, end) &&
+          push8(value->subcarrier_spacing, ppWritePackedMsg, end) &&
+          push8(value->cyclic_prefix, ppWritePackedMsg, end) &&
+          push16(value->start_rb, ppWritePackedMsg, end) &&
+          push16(value->nr_of_rbs, ppWritePackedMsg, end) &&
+          push8(value->csi_type, ppWritePackedMsg, end) &&
+          push8(value->row, ppWritePackedMsg, end) &&
+          push16(value->freq_domain, ppWritePackedMsg, end) &&
+          push8(value->symb_l0, ppWritePackedMsg, end) &&
+          push8(value->symb_l1, ppWritePackedMsg, end) &&
+          push8(value->cdm_type, ppWritePackedMsg, end) &&
+          push8(value->freq_density, ppWritePackedMsg, end) &&
+          push16(value->scramb_id, ppWritePackedMsg, end) &&
+          push8(value->power_control_offset, ppWritePackedMsg, end) &&
+          push8(value->power_control_offset_ss, ppWritePackedMsg, end)
+        );
+}
+
+
+static uint8_t pack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+
+	nfapi_nr_dl_tti_pdcch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t*)tlv;
+	
+	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+	{
+		if(!(push16(value->dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
+		push16(value->dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
+		push16(value->dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
+		push8(value->dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
+		push8(value->dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
+		push8(value->dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
+		push8(value->dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
+		push16(value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
+		pusharray8(value->dci_pdu[i].Payload, value->dci_pdu[i].PayloadSizeBits, value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end)))
+		return 0;
+		
+	}
+	// TODO: resolve the packaging of array (currently sending a single element)
+	return(
+		push16(value->BWPSize, ppWritePackedMsg, end) &&
+		push16(value->BWPStart, ppWritePackedMsg, end) &&
+		push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
+		push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
+		push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
+		push8(value->DurationSymbols, ppWritePackedMsg, end) &&
+		pusharray8(value->FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
+		push8(value->CceRegMappingType, ppWritePackedMsg, end) &&
+		push8(value->RegBundleSize, ppWritePackedMsg, end) &&
+		push8(value->InterleaverSize, ppWritePackedMsg, end) &&
+		push8(value->CoreSetType, ppWritePackedMsg, end) &&
+		push16(value->ShiftIndex, ppWritePackedMsg, end) &&
+		push8(value->precoderGranularity, ppWritePackedMsg, end) &&
+		push16(value->numDlDci, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_pdsch_pdu_rel15_t *value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t *)tlv;
+  // TODO: resolve the packaging of array (currently sending a single element)
+  return(
+          push16(value->pduBitmap, ppWritePackedMsg, end) &&
+          push16(value->rnti, ppWritePackedMsg, end) &&
+          push16(value->pduIndex, ppWritePackedMsg, end) &&
+          push16(value->BWPSize, ppWritePackedMsg, end) &&
+          push16(value->BWPStart, ppWritePackedMsg, end) &&
+          push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
+          push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
+          push8(value->NrOfCodewords, ppWritePackedMsg, end) &&
+          pusharray16(value->targetCodeRate, 2, 1, ppWritePackedMsg, end) &&
+          pusharray8(value->qamModOrder, 2, 1, ppWritePackedMsg, end) &&
+          pusharray8(value->mcsIndex, 2, 1, ppWritePackedMsg, end) &&
+          pusharray8(value->mcsTable, 2, 1, ppWritePackedMsg, end) &&
+          pusharray8(value->rvIndex, 2, 1, ppWritePackedMsg, end) &&
+          pusharray32(value->TBSize, 2, 1, ppWritePackedMsg, end) &&
+          push16(value->dataScramblingId, ppWritePackedMsg, end) &&
+          push8(value->nrOfLayers, ppWritePackedMsg, end) &&
+          push8(value->transmissionScheme, ppWritePackedMsg, end) &&
+          push8(value->refPoint, ppWritePackedMsg, end) &&
+          push16(value->dlDmrsSymbPos, ppWritePackedMsg, end) &&
+          push8(value->dmrsConfigType, ppWritePackedMsg, end) &&
+          push16(value->dlDmrsScramblingId, ppWritePackedMsg, end) &&
+          push8(value->SCID, ppWritePackedMsg, end) &&
+          push8(value->numDmrsCdmGrpsNoData, ppWritePackedMsg, end) &&
+          push16(value->dmrsPorts, ppWritePackedMsg, end) &&
+          push8(value->resourceAlloc, ppWritePackedMsg, end) &&
+          push16(value->rbStart, ppWritePackedMsg, end) &&
+          push16(value->rbSize, ppWritePackedMsg, end) &&
+          push8(value->VRBtoPRBMapping, ppWritePackedMsg, end) &&
+          push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
+          push8(value->NrOfSymbols, ppWritePackedMsg, end) &&
+          push8(value->PTRSPortIndex, ppWritePackedMsg, end) &&
+          push8(value->PTRSTimeDensity, ppWritePackedMsg, end) &&
+          push8(value->PTRSFreqDensity, ppWritePackedMsg, end) &&
+          push8(value->PTRSReOffset, ppWritePackedMsg, end)
+        );
+}
+
+
+static uint8_t pack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_ssb_pdu_rel15_t *value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t *)tlv;
+  return(
+          push16(value->PhysCellId, ppWritePackedMsg, end) &&
+          push8(value->BetaPss, ppWritePackedMsg, end) &&
+          push8(value->SsbBlockIndex, ppWritePackedMsg, end) &&
+          push8(value->SsbSubcarrierOffset, ppWritePackedMsg, end) &&
+          push16(value->ssbOffsetPointA, ppWritePackedMsg, end) &&
+          push8(value->bchPayloadFlag, ppWritePackedMsg, end) &&
+          push32(value->bchPayload, ppWritePackedMsg, end)
+          // TODO: pack precoding_and_beamforming too
+        );
+}
+
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel13_t *value = (nfapi_dl_config_dci_dl_pdu_rel13_t *)tlv;
+  return( push8(value->laa_end_partial_sf_flag, ppWritePackedMsg, end) &&
+          push8(value->laa_end_partial_sf_configuration, ppWritePackedMsg, end) &&
+          push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
+          push8(value->codebook_size_determination, ppWritePackedMsg, end) &&
+          push8(value->drms_table_flag, ppWritePackedMsg, end) &&
+          push8(value->tpm_struct_flag, ppWritePackedMsg, end) &&
+          (value->tpm_struct_flag == 1 ? pack_tpm_value(&(value->tpm), ppWritePackedMsg, end) : 1));
+}
+
+static uint8_t pack_dl_config_bch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_bch_pdu_rel8_t *value = (nfapi_dl_config_bch_pdu_rel8_t *)tlv;
+  //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s()\n", __FUNCTION__);
+  return( push16(value->length, ppWritePackedMsg, end) &&
+          push16(value->pdu_index, ppWritePackedMsg, end) &&
+          push16(value->transmission_power, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_mch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_mch_pdu_rel8_t *value = (nfapi_dl_config_mch_pdu_rel8_t *)tlv;
+  return ( push16(value->length, ppWritePackedMsg, end) &&
+           push16(value->pdu_index, ppWritePackedMsg, end) &&
+           push16(value->rnti, ppWritePackedMsg, end) &&
+           push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+           push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+           push8(value->modulation, ppWritePackedMsg, end) &&
+           push16(value->transmission_power, ppWritePackedMsg, end) &&
+           push16(value->mbsfn_area_id, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_bf_vector_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_bf_vector_t *bf = (nfapi_bf_vector_t *)elem;
+  return ( push8(bf->subband_index, ppWritePackedMsg, end) &&
+           push8(bf->num_antennas, ppWritePackedMsg, end) &&
+           pusharray16(bf->bf_value, NFAPI_MAX_NUM_ANTENNAS, bf->num_antennas, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel8_t *value = (nfapi_dl_config_dlsch_pdu_rel8_t *)tlv;
+  return ( push16(value->length, ppWritePackedMsg, end) &&
+           push16(value->pdu_index, ppWritePackedMsg, end) &&
+           push16(value->rnti, ppWritePackedMsg, end) &&
+           push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+           push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
+           push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+           push8(value->modulation, ppWritePackedMsg, end) &&
+           push8(value->redundancy_version, ppWritePackedMsg, end) &&
+           push8(value->transport_blocks, ppWritePackedMsg, end) &&
+           push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
+           push8(value->transmission_scheme, ppWritePackedMsg, end) &&
+           push8(value->number_of_layers, ppWritePackedMsg, end) &&
+           push8(value->number_of_subbands, ppWritePackedMsg, end) &&
+           pusharray8(value->codebook_index, NFAPI_MAX_NUM_SUBBANDS, value->number_of_subbands, ppWritePackedMsg, end) &&
+           push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
+           push8(value->pa, ppWritePackedMsg, end) &&
+           push8(value->delta_power_offset_index, ppWritePackedMsg, end) &&
+           push8(value->ngap, ppWritePackedMsg, end) &&
+           push8(value->nprb, ppWritePackedMsg, end) &&
+           push8(value->transmission_mode, ppWritePackedMsg, end) &&
+           push8(value->num_bf_prb_per_subband, ppWritePackedMsg, end) &&
+           push8(value->num_bf_vector, ppWritePackedMsg, end) &&
+           packarray(value->bf_vector, sizeof(nfapi_bf_vector_t), NFAPI_MAX_BF_VECTORS, value->num_bf_vector, ppWritePackedMsg, end, &pack_bf_vector_info));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel9_t *value = (nfapi_dl_config_dlsch_pdu_rel9_t *)tlv;
+  return ( push8(value->nscid, ppWritePackedMsg, end) );
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel10_t *value = (nfapi_dl_config_dlsch_pdu_rel10_t *)tlv;
+  return ( push8(value->csi_rs_flag, ppWritePackedMsg, end) &&
+           push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
+           push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
+           push8(value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
+           pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
+           push8(value->pdsch_start, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel11_t *value = (nfapi_dl_config_dlsch_pdu_rel11_t *)tlv;
+  return( push8(value->drms_config_flag, ppWritePackedMsg, end) &&
+          push16(value->drms_scrambling, ppWritePackedMsg, end) &&
+          push8(value->csi_config_flag, ppWritePackedMsg, end) &&
+          push16(value->csi_scrambling, ppWritePackedMsg, end) &&
+          push8(value->pdsch_re_mapping_flag, ppWritePackedMsg, end) &&
+          push8(value->pdsch_re_mapping_atenna_ports, ppWritePackedMsg, end) &&
+          push8(value->pdsch_re_mapping_freq_shift, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel12_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel12_t *value = (nfapi_dl_config_dlsch_pdu_rel12_t *)tlv;
+  return( push8(value->altcqi_table_r12, ppWritePackedMsg, end) &&
+          push8(value->maxlayers, ppWritePackedMsg, end) &&
+          push8(value->n_dl_harq, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel13_t *value = (nfapi_dl_config_dlsch_pdu_rel13_t *)tlv;
+  return( push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
+          push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
+          push8(value->ue_type, ppWritePackedMsg, end) &&
+          push8(value->pdsch_payload_type, ppWritePackedMsg, end) &&
+          push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+          push8(value->drms_table_flag, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_pch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_pch_pdu_rel8_t *value = (nfapi_dl_config_pch_pdu_rel8_t *)tlv;
+  return( push16(value->length, ppWritePackedMsg, end) &&
+          push16(value->pdu_index, ppWritePackedMsg, end) &&
+          push16(value->p_rnti, ppWritePackedMsg, end) &&
+          push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+          push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
+          push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+          push8(value->mcs, ppWritePackedMsg, end) &&
+          push8(value->redundancy_version, ppWritePackedMsg, end) &&
+          push8(value->number_of_transport_blocks, ppWritePackedMsg, end) &&
+          push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
+          push8(value->transmission_scheme, ppWritePackedMsg, end) &&
+          push8(value->number_of_layers, ppWritePackedMsg, end) &&
+          push8(value->codebook_index, ppWritePackedMsg, end) &&
+          push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
+          push8(value->pa, ppWritePackedMsg, end) &&
+          push16(value->transmission_power, ppWritePackedMsg, end) &&
+          push8(value->nprb, ppWritePackedMsg, end) &&
+          push8(value->ngap, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_pch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_pch_pdu_rel13_t *value = (nfapi_dl_config_pch_pdu_rel13_t *)tlv;
+  return ( push8(value->ue_mode, ppWritePackedMsg, end) &&
+           push16(value->initial_transmission_sf_io, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_prs_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_prs_pdu_rel9_t *value = (nfapi_dl_config_prs_pdu_rel9_t *)tlv;
+  return( push16(value->transmission_power, ppWritePackedMsg, end) &&
+          push8(value->prs_bandwidth, ppWritePackedMsg, end) &&
+          push8(value->prs_cyclic_prefix_type, ppWritePackedMsg, end) &&
+          push8(value->prs_muting, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_csi_rs_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_csi_rs_pdu_rel10_t *value = (nfapi_dl_config_csi_rs_pdu_rel10_t *)tlv;
+  return( push8(value->csi_rs_antenna_port_count_r10, ppWritePackedMsg, end) &&
+          push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
+          push16(value->transmission_power, ppWritePackedMsg, end) &&
+          push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
+          push8(value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end) &&
+          pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_csi_rs_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_csi_rs_pdu_rel13_t *value = (nfapi_dl_config_csi_rs_pdu_rel13_t *)tlv;
+
+  if(!(push8(value->csi_rs_class, ppWritePackedMsg, end) &&
+       push8(value->cdm_type, ppWritePackedMsg, end) &&
+       push8(value->num_bf_vector, ppWritePackedMsg, end))) {
+    return 0;
+  }
+
+  uint16_t i;
+
+  for(i = 0; i < value->num_bf_vector; ++i) {
+    if(!(push8(value->bf_vector[i].csi_rs_resource_index, ppWritePackedMsg, end) &&
+         pusharray16(value->bf_vector[i].bf_value, NFAPI_MAX_ANTENNA_PORT_COUNT, NFAPI_MAX_ANTENNA_PORT_COUNT, ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  return 1;
+}
+static uint8_t pack_bf_vector(nfapi_bf_vector_t *vector, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( push8(vector->subband_index, ppWritePackedMsg, end) &&
+           push8(vector->num_antennas, ppWritePackedMsg, end) &&
+           pusharray16(vector->bf_value, NFAPI_MAX_NUM_ANTENNAS, vector->num_antennas, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_epdcch_parameters_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_epdcch_parameters_rel11_t *value = (nfapi_dl_config_epdcch_parameters_rel11_t *)tlv;
+  return ( push8(value->epdcch_resource_assignment_flag, ppWritePackedMsg, end) &&
+           push16(value->epdcch_id, ppWritePackedMsg, end) &&
+           push8(value->epdcch_start_symbol, ppWritePackedMsg, end) &&
+           push8(value->epdcch_num_prb, ppWritePackedMsg, end) &&
+           pusharray8(value->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, value->epdcch_num_prb, ppWritePackedMsg, end) &&
+           pack_bf_vector(&value->bf_vector, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_epdcch_parameters_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_epdcch_parameters_rel13_t *value = (nfapi_dl_config_epdcch_parameters_rel13_t *)tlv;
+  return (push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
+          push8(value->initial_lbt_sf, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_mpdcch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_mpdcch_pdu_rel13_t *value = (nfapi_dl_config_mpdcch_pdu_rel13_t *)tlv;
+  return ( push8(value->mpdcch_narrow_band, ppWritePackedMsg, end) &&
+           push8(value->number_of_prb_pairs, ppWritePackedMsg, end) &&
+           push8(value->resource_block_assignment, ppWritePackedMsg, end) &&
+           push8(value->mpdcch_tansmission_type, ppWritePackedMsg, end) &&
+           push8(value->start_symbol, ppWritePackedMsg, end) &&
+           push8(value->ecce_index, ppWritePackedMsg, end) &&
+           push8(value->aggregation_level, ppWritePackedMsg, end) &&
+           push8(value->rnti_type, ppWritePackedMsg, end) &&
+           push16(value->rnti, ppWritePackedMsg, end) &&
+           push8(value->ce_mode, ppWritePackedMsg, end) &&
+           push16(value->drms_scrambling_init, ppWritePackedMsg, end) &&
+           push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+           push16(value->transmission_power, ppWritePackedMsg, end) &&
+           push8(value->dci_format, ppWritePackedMsg, end) &&
+           push16(value->resource_block_coding, ppWritePackedMsg, end) &&
+           push8(value->mcs, ppWritePackedMsg, end) &&
+           push8(value->pdsch_reptition_levels, ppWritePackedMsg, end) &&
+           push8(value->redundancy_version, ppWritePackedMsg, end) &&
+           push8(value->new_data_indicator, ppWritePackedMsg, end) &&
+           push8(value->harq_process, ppWritePackedMsg, end) &&
+           push8(value->tpmi_length, ppWritePackedMsg, end) &&
+           push8(value->tpmi, ppWritePackedMsg, end) &&
+           push8(value->pmi_flag, ppWritePackedMsg, end) &&
+           push8(value->pmi, ppWritePackedMsg, end) &&
+           push8(value->harq_resource_offset, ppWritePackedMsg, end) &&
+           push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
+           push8(value->tpc, ppWritePackedMsg, end) &&
+           push8(value->downlink_assignment_index_length, ppWritePackedMsg, end) &&
+           push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
+           push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
+           push8(value->preamble_index, ppWritePackedMsg, end) &&
+           push8(value->prach_mask_index, ppWritePackedMsg, end) &&
+           push8(value->starting_ce_level, ppWritePackedMsg, end) &&
+           push8(value->srs_request, ppWritePackedMsg, end) &&
+           push8(value->antenna_ports_and_scrambling_identity_flag, ppWritePackedMsg, end) &&
+           push8(value->antenna_ports_and_scrambling_identity, ppWritePackedMsg, end) &&
+           push8(value->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
+           push8(value->paging_direct_indication_differentiation_flag, ppWritePackedMsg, end) &&
+           push8(value->direct_indication, ppWritePackedMsg, end) &&
+           push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) &&
+           push8(value->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
+           pusharray16(value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_dl_config_nbch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_nbch_pdu_rel13_t *value = (nfapi_dl_config_nbch_pdu_rel13_t *)tlv;
+  return (push16(value->length, ppWritePackedMsg, end) &&
+          push16(value->pdu_index, ppWritePackedMsg, end) &&
+          push16(value->transmission_power, ppWritePackedMsg, end) &&
+          push16(value->hyper_sfn_2_lsbs, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_dl_config_npdcch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_npdcch_pdu_rel13_t *value = (nfapi_dl_config_npdcch_pdu_rel13_t *)tlv;
+  return (push16(value->length, ppWritePackedMsg, end) &&
+          push16(value->pdu_index, ppWritePackedMsg, end) &&
+          push8(value->ncce_index, ppWritePackedMsg, end) &&
+          push8(value->aggregation_level, ppWritePackedMsg, end) &&
+          push8(value->start_symbol, ppWritePackedMsg, end) &&
+          push8(value->rnti_type, ppWritePackedMsg, end) &&
+          push16(value->rnti, ppWritePackedMsg, end) &&
+          push8(value->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
+          push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
+          push8(value->dci_format, ppWritePackedMsg, end) &&
+          push8(value->scheduling_delay, ppWritePackedMsg, end) &&
+          push8(value->resource_assignment, ppWritePackedMsg, end) &&
+          push8(value->repetition_number, ppWritePackedMsg, end) &&
+          push8(value->mcs, ppWritePackedMsg, end) &&
+          push8(value->new_data_indicator, ppWritePackedMsg, end) &&
+          push8(value->harq_ack_resource, ppWritePackedMsg, end) &&
+          push8(value->npdcch_order_indication, ppWritePackedMsg, end) &&
+          push8(value->starting_number_of_nprach_repetitions, ppWritePackedMsg, end) &&
+          push8(value->subcarrier_indication_of_nprach, ppWritePackedMsg, end) &&
+          push8(value->paging_direct_indication_differentation_flag, ppWritePackedMsg, end) &&
+          push8(value->direct_indication, ppWritePackedMsg, end) &&
+          push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
+          push8(value->total_dci_length_including_padding, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_ndlsch_pdu_rel13_t *value = (nfapi_dl_config_ndlsch_pdu_rel13_t *)tlv;
+  return (push16(value->length, ppWritePackedMsg, end) &&
+          push16(value->pdu_index, ppWritePackedMsg, end) &&
+          push8(value->start_symbol, ppWritePackedMsg, end) &&
+          push8(value->rnti_type, ppWritePackedMsg, end) &&
+          push16(value->rnti, ppWritePackedMsg, end) &&
+          push16(value->resource_assignment, ppWritePackedMsg, end) &&
+          push16(value->repetition_number, ppWritePackedMsg, end) &&
+          push8(value->modulation, ppWritePackedMsg, end) &&
+          push8(value->number_of_subframes_for_resource_assignment, ppWritePackedMsg, end) &&
+          push8(value->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
+          push16(value->sf_idx, ppWritePackedMsg, end) &&
+          push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_dl_tti_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_request_pdu_t *value = (nfapi_nr_dl_tti_request_pdu_t *)tlv;
+
+  if(!(push32(value->PDUSize, ppWritePackedMsg, end) &&
+       push16(value->PDUType, ppWritePackedMsg, end) ))
+    return 0;
+
+  // first match the pdu type, then call the respective function
+  switch(value->PDUType) {
+    case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE: {
+      if(!(pack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppWritePackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE: {
+      if(!(pack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppWritePackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE: {
+      if(!(pack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppWritePackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_SSB_PDU_TYPE: {
+      if(!(pack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppWritePackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
+    }
+    break;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_dl_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_request_body_t *value = (nfapi_dl_config_request_body_t *)tlv;
+
+  //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci:%u pdu:%u pdsch:%u rnti:%u pcfich:%u\n", __FUNCTION__, value->number_dci, value->number_pdu, value->number_pdsch_rnti, value->transmission_power_pcfich);
+
+  if(!(push8(value->number_pdcch_ofdm_symbols, ppWritePackedMsg, end) &&
+       push8(value->number_dci, ppWritePackedMsg, end) &&
+       push16(value->number_pdu, ppWritePackedMsg, end) &&
+       push8(value->number_pdsch_rnti, ppWritePackedMsg, end) &&
+       push16(value->transmission_power_pcfich, ppWritePackedMsg, end))) {
+    return 0;
+  }
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_pdu;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_dl_config_request_pdu_t *pdu = &(value->dl_config_pdu_list[i]);
+
+    if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Put a 0 size in and then determine the size after the pdu
+    // has been writen and write the calculated size
+    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
+    pdu->pdu_size = 0;
+
+    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: {
+        //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE\n", __FUNCTION__);
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value))) {
+          return 0;
+        }
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_BCH_PDU_TYPE: {
+        //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_BCH_PDU_TYPE\n", __FUNCTION__);
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_bch_pdu_rel8_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_MCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_mch_pdu_rel8_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel8_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel9_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel10_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel11_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel12_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_PCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel8_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_PRS_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_prs_pdu_rel9_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, ppWritePackedMsg, end,  &pack_dl_config_csi_rs_pdu_rel10_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, ppWritePackedMsg, end,  &pack_dl_config_csi_rs_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel11_value) &
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_mpdcch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NBCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_nbch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_npdcch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_ndlsch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+
+    // add 1 for the pdu_type. The delta will include the pdu_size
+    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+
+    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_dl_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t *)msg;
+
+  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
+        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->dl_tti_request_body.nGroup, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->dl_tti_request_body.nPDUs, ppWritePackedMsg, end) &&
+        pusharray8(pNfapiMsg->dl_tti_request_body.nUe,256,pNfapiMsg->dl_tti_request_body.nGroup, ppWritePackedMsg, end)
+        //pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
+       ))
+    return 0;
+
+  int arr[12];
+
+  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nGroup; i++) {
+    for(int j=0; j<pNfapiMsg->dl_tti_request_body.nUe[i]; j++) {
+      arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
+    }
+
+    if(!(pusharrays32(arr,12,pNfapiMsg->dl_tti_request_body.nUe[i],ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nPDUs; i++) {
+    if(!pack_dl_tti_request_body_value(&pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i],ppWritePackedMsg,end))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t *)msg;
+  //return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+  //pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value) &&
+  //pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+  {
+    uint8_t x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
+    uint8_t y = pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value);
+    uint8_t z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+
+    if (!x || !y || !z) {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST x:%u y:%u z:%u \n", __FUNCTION__,x,y,z);
+    }
+
+    return x && y && z;
+  }
+}
+
+
+
+
+static uint8_t pack_ul_config_request_ulsch_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel8_t *ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t *)tlv;
+  return( push32(ulsch_pdu_rel8->handle, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel8->size, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel8->rnti, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->modulation_type, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->new_data_indication, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->redundancy_version, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->harq_process_number, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->ul_tx_mode, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->current_tx_nb, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->n_srs, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ulsch_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel10_t *ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t *)tlv;
+  return (push8(ulsch_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
+          push32(ulsch_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel10->transport_blocks, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel10->transmission_scheme, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel10->number_of_layers, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel10->codebook_index, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel10->disable_sequence_hopping_flag, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ulsch_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel11_t *ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t *)tlv;
+  return (push8(ulsch_pdu_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel11->npusch_identity, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel11->dmrs_config_flag, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel11->ndmrs_csh_identity, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ulsch_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel13_t *ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t *)tlv;
+  return (push8(ulsch_pdu_rel13->ue_type, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, ppWritePackedMsg, end));
+}
+
+//Pack fns for ul_tti PDUS
+
+
+static uint8_t pack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *prach_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return(
+          push16(prach_pdu->phys_cell_id, ppWritePackedMsg, end) &&
+          push8(prach_pdu->num_prach_ocas, ppWritePackedMsg, end) &&
+          push8(prach_pdu->prach_format, ppWritePackedMsg, end) &&
+          push8(prach_pdu->num_ra, ppWritePackedMsg, end) &&
+          push8(prach_pdu->prach_start_symbol, ppWritePackedMsg, end) &&
+          push16(prach_pdu->num_cs, ppWritePackedMsg, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+static uint8_t pack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pucch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return(
+          push16(pucch_pdu->rnti, ppWritePackedMsg, end) &&
+          push32(pucch_pdu->handle, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->bwp_size, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->bwp_start, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->format_type, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->multi_slot_tx_indicator, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->prb_start, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->prb_size, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->nr_of_symbols, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->freq_hop_flag, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->second_hop_prb, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->group_hop_flag, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->sequence_hop_flag, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->hopping_id, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->initial_cyclic_shift, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->time_domain_occ_idx, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->pre_dft_occ_idx, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->pre_dft_occ_len, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->add_dmrs_flag, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->dmrs_scrambling_id, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->dmrs_cyclic_shift, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->sr_flag, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->bit_len_harq, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->bit_len_csi_part1, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->bit_len_csi_part2, ppWritePackedMsg, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+
+static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  if (!(
+        push16(pusch_pdu->pdu_bit_map, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->rnti, ppWritePackedMsg, end) &&
+        push32(pusch_pdu->handle, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->bwp_size, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->bwp_start, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->target_code_rate, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->qam_mod_order, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->mcs_index, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->mcs_table, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->transform_precoding, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->nrOfLayers, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->ul_dmrs_symb_pos, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->dmrs_config_type, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->ul_dmrs_scrambling_id, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->scid, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->num_dmrs_cdm_grps_no_data, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->resource_alloc, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->resource_alloc,ppWritePackedMsg, end) &&
+        push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->rb_start, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->rb_size, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->vrb_to_prb_mapping, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->frequency_hopping, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->tx_direct_current_location, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->uplink_frequency_shift_7p5khz, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->nr_of_symbols, ppWritePackedMsg, end)
+        // TODO: ignoring beamforming tlv for now
+      ))
+    return 0;
+
+  //Pack Optional Data only included if indicated in pduBitmap
+  switch(pusch_pdu->pdu_bit_map) {
+    case PUSCH_PDU_BITMAP_PUSCH_DATA: {
+      // pack optional TLVs
+      return(
+              push8(pusch_pdu->pusch_data.rv_index, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_data.harq_process_id, ppWritePackedMsg, end) &&
+              push32(pusch_pdu->pusch_data.tb_size, ppWritePackedMsg, end) &&
+              push16(pusch_pdu->pusch_data.num_cb, ppWritePackedMsg, end) &&
+              pusharray8(pusch_pdu->pusch_data.cb_present_and_position,1,1,ppWritePackedMsg, end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_PUSCH_UCI: {
+      return(
+              push16(pusch_pdu->pusch_uci.harq_ack_bit_length, ppWritePackedMsg, end) &&
+              push16(pusch_pdu->pusch_uci.csi_part1_bit_length, ppWritePackedMsg, end) &&
+              push16(pusch_pdu->pusch_uci.csi_part2_bit_length, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_uci.alpha_scaling, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_uci.beta_offset_harq_ack, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_uci.beta_offset_csi1, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_uci.beta_offset_csi2, ppWritePackedMsg, end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_PUSCH_PTRS: {
+      return(
+              push8(pusch_pdu->pusch_ptrs.num_ptrs_ports, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, ppWritePackedMsg, end) &&
+              push16(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_ptrs.ptrs_time_density, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_ptrs.ptrs_freq_density, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_ptrs.ul_ptrs_power, ppWritePackedMsg, end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_DFTS_OFDM: {
+      return(
+              push8(pusch_pdu->dfts_ofdm.low_papr_group_number, ppWritePackedMsg, end) &&
+              push16(pusch_pdu->dfts_ofdm.low_papr_sequence_number, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, ppWritePackedMsg, end)
+            );
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t pack_ul_tti_request_srs_pdu(nfapi_nr_srs_pdu_t *srs_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return(
+          push16(srs_pdu->rnti, ppWritePackedMsg, end) &&
+          push32(srs_pdu->handle, ppWritePackedMsg, end) &&
+          push16(srs_pdu->bwp_size, ppWritePackedMsg, end) &&
+          push16(srs_pdu->bwp_start, ppWritePackedMsg, end) &&
+          push8(srs_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
+          push8(srs_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
+          push8(srs_pdu->num_ant_ports, ppWritePackedMsg, end) &&
+          push8(srs_pdu->num_symbols, ppWritePackedMsg, end) &&
+          push8(srs_pdu->num_repetitions, ppWritePackedMsg, end) &&
+          push8(srs_pdu->time_start_position, ppWritePackedMsg, end) &&
+          push8(srs_pdu->config_index, ppWritePackedMsg, end) &&
+          push16(srs_pdu->sequence_id, ppWritePackedMsg, end) &&
+          push8(srs_pdu->bandwidth_index, ppWritePackedMsg, end) &&
+          push8(srs_pdu->comb_size, ppWritePackedMsg, end) &&
+          push8(srs_pdu->comb_offset, ppWritePackedMsg, end) &&
+          push8(srs_pdu->cyclic_shift, ppWritePackedMsg, end) &&
+          push8(srs_pdu->frequency_position, ppWritePackedMsg, end) &&
+          push8(srs_pdu->frequency_shift, ppWritePackedMsg, end) &&
+          push8(srs_pdu->frequency_hopping, ppWritePackedMsg, end) &&
+          push8(srs_pdu->group_or_sequence_hopping, ppWritePackedMsg, end) &&
+          push8(srs_pdu->resource_type, ppWritePackedMsg, end) &&
+          push16(srs_pdu->t_srs, ppWritePackedMsg, end) &&
+          push16(srs_pdu->t_offset, ppWritePackedMsg, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+static uint8_t pack_ul_config_request_ulsch_pdu(nfapi_ul_config_ulsch_pdu *ulsch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &ulsch_pdu->ulsch_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel8_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &ulsch_pdu->ulsch_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel10_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &ulsch_pdu->ulsch_pdu_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel11_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &ulsch_pdu->ulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel8_t *cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t *)tlv;
+  return ( push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, ppWritePackedMsg, end) &&
+           push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, ppWritePackedMsg, end) &&
+           push8(cqi_ri_info_rel8->ri_size, ppWritePackedMsg, end) &&
+           push8(cqi_ri_info_rel8->delta_offset_cqi, ppWritePackedMsg, end) &&
+           push8(cqi_ri_info_rel8->delta_offset_ri, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel9_t *cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t *)tlv;
+
+  if(!(push8(cqi_ri_info_rel9->report_type, ppWritePackedMsg, end) &&
+       push8(cqi_ri_info_rel9->delta_offset_cqi, ppWritePackedMsg, end) &&
+       push8(cqi_ri_info_rel9->delta_offset_ri, ppWritePackedMsg, end))) {
+    return 0;
+  }
+
+  switch(cqi_ri_info_rel9->report_type) {
+    case NFAPI_CSI_REPORT_TYPE_PERIODIC: {
+      if(!(push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, ppWritePackedMsg, end) &&
+           push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, ppWritePackedMsg, end))) {
+        return 0;
+      }
+    }
+    break;
+
+    case NFAPI_CSI_REPORT_TYPE_APERIODIC: {
+      if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, ppWritePackedMsg, end) == 0)
+        return 0;
+
+      uint8_t i;
+
+      for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i) {
+        if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, ppWritePackedMsg, end) == 0)
+          return 0;
+
+        uint8_t j;
+
+        for(j = 0; j < 8; ++j) {
+          if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], ppWritePackedMsg, end) == 0)
+            return 0;
+        }
+      }
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
+    }
+    break;
+  };
+
+  return 1;
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel13_t *cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t *)tlv;
+
+  switch(cqi_ri_info_rel13->report_type) {
+    case NFAPI_CSI_REPORT_TYPE_PERIODIC: {
+      if(push16(cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, ppWritePackedMsg, end) == 0)
+        return 0;
+    }
+    break;
+
+    case NFAPI_CSI_REPORT_TYPE_APERIODIC: {
+      // No parameters
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel13->report_type );
+    }
+    break;
+  };
+
+  return 1;
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_information(nfapi_ul_config_cqi_ri_information *cqi_ri_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return (pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &cqi_ri_info->cqi_ri_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel8_value) &&
+          pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &cqi_ri_info->cqi_ri_information_rel9, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel9_value) &&
+          pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &cqi_ri_info->cqi_ri_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_init_tx_params_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_initial_transmission_parameters_rel8_t *init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t *)tlv;
+  return (push8(init_tx_params_rel8->n_srs_initial, ppWritePackedMsg, end) &&
+          push8(init_tx_params_rel8->initial_number_of_resource_blocks, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_initial_transmission_parameters(nfapi_ul_config_initial_transmission_parameters *init_tx_params, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return pack_tlv(NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &init_tx_params->initial_transmission_parameters_rel8, ppWritePackedMsg, end,
+                  &pack_ul_config_request_init_tx_params_rel8_value);
+}
+
+static uint8_t pack_ul_config_request_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_harq_information_rel10_t *harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t *)tlv;
+  return (push8(harq_info_rel10->harq_size, ppWritePackedMsg, end) &&
+          push8(harq_info_rel10->delta_offset_harq, ppWritePackedMsg, end) &&
+          push8(harq_info_rel10->ack_nack_mode, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t *)tlv;
+  return (push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
+          push8(harq_info_rel13->delta_offset_harq_2, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ulsch_harq_information(nfapi_ul_config_ulsch_harq_information *harq_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &harq_info->harq_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel10_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_ue_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel8_t *ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t *)tlv;
+  return ( push32(ue_info_rel8->handle, ppWritePackedMsg, end) &&
+           push16(ue_info_rel8->rnti, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ue_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel11_t *ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t *)tlv;
+  return ( push8(ue_info_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
+           push16(ue_info_rel11->npusch_identity, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ue_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel13_t *ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t *)tlv;
+  return ( push8(ue_info_rel13->ue_type, ppWritePackedMsg, end) &&
+           push8(ue_info_rel13->empty_symbols, ppWritePackedMsg, end) &&
+           push16(ue_info_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
+           push16(ue_info_rel13->repetition_number, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ue_information(nfapi_ul_config_ue_information *ue_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &ue_info->ue_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel8_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &ue_info->ue_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel11_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &ue_info->ue_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel10_tdd_t *harq_info_rel10_tdd = (nfapi_ul_config_harq_information_rel10_tdd_t *)tlv;
+  return ( push8(harq_info_rel10_tdd->harq_size, ppWritePackedMsg, end) &&
+           push8(harq_info_rel10_tdd->ack_nack_mode, ppWritePackedMsg, end) &&
+           push8(harq_info_rel10_tdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
+           push16(harq_info_rel10_tdd->n_pucch_1_0, ppWritePackedMsg, end) &&
+           push16(harq_info_rel10_tdd->n_pucch_1_1, ppWritePackedMsg, end) &&
+           push16(harq_info_rel10_tdd->n_pucch_1_2, ppWritePackedMsg, end) &&
+           push16(harq_info_rel10_tdd->n_pucch_1_3, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel8_fdd_t *harq_info_rel8_fdd = (nfapi_ul_config_harq_information_rel8_fdd_t *)tlv;
+  return ( push16(harq_info_rel8_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
+           push8(harq_info_rel8_fdd->harq_size, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel9_fdd_t *harq_info_rel9_fdd = (nfapi_ul_config_harq_information_rel9_fdd_t *)tlv;
+  return ( push8(harq_info_rel9_fdd->harq_size, ppWritePackedMsg, end) &&
+           push8(harq_info_rel9_fdd->ack_nack_mode, ppWritePackedMsg, end) &&
+           push8(harq_info_rel9_fdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
+           push16(harq_info_rel9_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
+           push16(harq_info_rel9_fdd->n_pucch_1_1, ppWritePackedMsg, end) &&
+           push16(harq_info_rel9_fdd->n_pucch_1_2, ppWritePackedMsg, end) &&
+           push16(harq_info_rel9_fdd->n_pucch_1_3, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel11_t *harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t *)tlv;
+  return ( push8(harq_info_rel11->num_ant_ports, ppWritePackedMsg, end) &&
+           push16(harq_info_rel11->n_pucch_2_0, ppWritePackedMsg, end) &&
+           push16(harq_info_rel11->n_pucch_2_1, ppWritePackedMsg, end) &&
+           push16(harq_info_rel11->n_pucch_2_2, ppWritePackedMsg, end) &&
+           push16(harq_info_rel11->n_pucch_2_3, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t *)tlv;
+  return ( push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
+           push8(harq_info_rel13->starting_prb, ppWritePackedMsg, end) &&
+           push8(harq_info_rel13->n_prb, ppWritePackedMsg, end) &&
+           push8(harq_info_rel13->cdm_index, ppWritePackedMsg, end) &&
+           push8(harq_info_rel13->n_srs, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_harq_information(nfapi_ul_config_harq_information *harq_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &harq_info->harq_information_rel10_tdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel10_tdd_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &harq_info->harq_information_rel8_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel8_fdd_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &harq_info->harq_information_rel9_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel9_fdd_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &harq_info->harq_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel11_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_cqi_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel8_t *cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t *)tlv;
+  return ( push16(cqi_info_rel8->pucch_index, ppWritePackedMsg, end) &&
+           push8(cqi_info_rel8->dl_cqi_pmi_size, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_cqi_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel10_t *cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t *)tlv;
+  return ( push8(cqi_info_rel10->number_of_pucch_resource, ppWritePackedMsg, end) &&
+           push16(cqi_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_cqi_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel13_t *cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t *)tlv;
+  return ( push8(cqi_info_rel13->csi_mode, ppWritePackedMsg, end) &&
+           push16(cqi_info_rel13->dl_cqi_pmi_size_2, ppWritePackedMsg, end) &&
+           push8(cqi_info_rel13->starting_prb, ppWritePackedMsg, end) &&
+           push8(cqi_info_rel13->n_prb, ppWritePackedMsg, end) &&
+           push8(cqi_info_rel13->cdm_index, ppWritePackedMsg, end) &&
+           push8(cqi_info_rel13->n_srs, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_cqi_information(nfapi_ul_config_cqi_information *cqi_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &cqi_info->cqi_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel8_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &cqi_info->cqi_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel10_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &cqi_info->cqi_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_sr_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_sr_information_rel8_t *sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t *)tlv;
+  return push16(sr_info_rel8->pucch_index, ppWritePackedMsg, end);
+}
+static uint8_t pack_ul_config_request_sr_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_sr_information_rel10_t *sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t *)tlv;
+  return ( push8(sr_info_rel10->number_of_pucch_resources, ppWritePackedMsg, end) &&
+           push16(sr_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_sr_information(nfapi_ul_config_sr_information *sr_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &sr_info->sr_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel8_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &sr_info->sr_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel10_value));
+}
+
+static uint8_t pack_ul_config_request_srs_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel8_t *srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t *)tlv;
+  return (push32(srs_pdu_rel8->handle, ppWritePackedMsg, end) &&
+          push16(srs_pdu_rel8->size, ppWritePackedMsg, end) &&
+          push16(srs_pdu_rel8->rnti, ppWritePackedMsg, end) &&
+          push8(srs_pdu_rel8->srs_bandwidth, ppWritePackedMsg, end) &&
+          push8(srs_pdu_rel8->frequency_domain_position, ppWritePackedMsg, end) &&
+          push8(srs_pdu_rel8->srs_hopping_bandwidth, ppWritePackedMsg, end) &&
+          push8(srs_pdu_rel8->transmission_comb, ppWritePackedMsg, end) &&
+          push16(srs_pdu_rel8->i_srs, ppWritePackedMsg, end) &&
+          push8(srs_pdu_rel8->sounding_reference_cyclic_shift, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_srs_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel10_t *srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t *)tlv;
+  return push8(srs_pdu_rel10->antenna_port, ppWritePackedMsg, end);
+}
+
+static uint8_t pack_ul_config_request_srs_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel13_t *srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t *)tlv;
+  return ( push8(srs_pdu_rel13->number_of_combs, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_nb_harq_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_nb_harq_information_rel13_fdd_t *nb_harq_pdu_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t *)tlv;
+  return ( push8(nb_harq_pdu_rel13->harq_ack_resource, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_nulsch_pdu_rel13_t *nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t *)tlv;
+  return (push8(nulsch_pdu_rel13->nulsch_format, ppWritePackedMsg, end) &&
+          push32(nulsch_pdu_rel13->handle, ppWritePackedMsg, end) &&
+          push16(nulsch_pdu_rel13->size, ppWritePackedMsg, end) &&
+          push16(nulsch_pdu_rel13->rnti, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->mcs, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->n_srs, ppWritePackedMsg, end) &&
+          push16(nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
+          push16(nulsch_pdu_rel13->sf_idx, ppWritePackedMsg, end) &&
+          pack_ul_config_request_ue_information(&(nulsch_pdu_rel13->ue_information), ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, ppWritePackedMsg, end,
+                   &pack_ul_config_request_nb_harq_rel13_value));
+}
+static uint8_t pack_ul_config_request_nrach_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_nrach_pdu_rel13_t *nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t *)tlv;
+  return ( push8(nrach_pdu_rel13->nprach_config_0, ppWritePackedMsg, end) &&
+           push8(nrach_pdu_rel13->nprach_config_1, ppWritePackedMsg, end) &&
+           push8(nrach_pdu_rel13->nprach_config_2, ppWritePackedMsg, end));
+}
+
+
+
+static uint8_t pack_ul_tti_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_ul_tti_request_number_of_pdus_t *value = (nfapi_nr_ul_tti_request_number_of_pdus_t *)tlv;
+
+  if(!(push16(value->pdu_size, ppWritePackedMsg, end) &&
+       push16(value->pdu_type, ppWritePackedMsg, end) ))
+    return 0;
+
+  // first match the pdu type, then call the respective function
+  switch(value->pdu_type) {
+    case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE: {
+      if(!pack_ul_tti_request_prach_pdu(&value->prach_pdu, ppWritePackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: {
+      if(!pack_ul_tti_request_pucch_pdu(&value->pucch_pdu, ppWritePackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
+      if(!pack_ul_tti_request_pusch_pdu(&value->pusch_pdu, ppWritePackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE: {
+      if(!pack_ul_tti_request_srs_pdu(&value->srs_pdu, ppWritePackedMsg, end))
+        return 0;
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", value->pdu_type );
+    }
+    break;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_ul_tti_groups_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_ul_tti_request_number_of_groups_t *value = (nfapi_nr_ul_tti_request_number_of_groups_t *)tlv;
+
+  if(!push8(value->n_ue, ppWritePackedMsg, end))
+    return 0;
+
+  for(int i=0; i<value->n_ue; i++) {
+    if(!push8(value->ue_list[i].pdu_idx, ppWritePackedMsg, end))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_ul_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_request_body_t *value = (nfapi_ul_config_request_body_t *)tlv;
+
+  if(!(push8(value->number_of_pdus, ppWritePackedMsg, end) &&
+       push8(value->rach_prach_frequency_resources, ppWritePackedMsg, end) &&
+       push8(value->srs_present, ppWritePackedMsg, end)))
+    return 0;
+
+  uint16_t i = 0;
+
+  for(i = 0; i < value->number_of_pdus; ++i) {
+    nfapi_ul_config_request_pdu_t *pdu = &(value->ul_config_pdu_list[i]);
+
+    if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Put a 0 size in and then determine the size after the pdu
+    // has been writen and write the calculated size
+    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
+    pdu->pdu_size = 0;
+
+    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: {
+        if(!pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_pdu), ppWritePackedMsg, end))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_harq_pdu.harq_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_harq_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_cqi_harq_ri_pdu.harq_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_pdu.cqi_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_sr_information(&(pdu->uci_sr_pdu.sr_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_sr_information(&(pdu->uci_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->uci_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->uci_cqi_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_pdu.cqi_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_pdu.sr_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->uci_cqi_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_SRS_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &pdu->srs_pdu.srs_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel8_value) &&
+             pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &pdu->srs_pdu.srs_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel10_value) &&
+             pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &pdu->srs_pdu.srs_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->harq_buffer_pdu.ue_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_csi_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->ulsch_uci_csi_pdu.csi_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->ulsch_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->ulsch_csi_uci_harq_pdu.csi_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->ulsch_csi_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &pdu->nulsch_pdu.nulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nulsch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_NRACH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &pdu->nrach_pdu.nrach_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nrach_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+
+    // add 1 for the pdu_type. The delta will include the pdu_size
+    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+
+    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_ul_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t *)msg;
+
+  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
+        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->n_pdus, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->rach_present, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->n_ulsch, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->n_ulcch, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->n_group, ppWritePackedMsg, end) ))
+    return 0;
+
+  for(int i=0; i<pNfapiMsg->n_pdus; i++) {
+    if(!pack_ul_tti_pdu_list_value(&pNfapiMsg->pdus_list[i], ppWritePackedMsg, end))
+      return 0;
+  }
+
+  for(int i=0; i<pNfapiMsg->n_group; i++) {
+    if(!pack_ul_tti_groups_list_value(&pNfapiMsg->groups_list[i], ppWritePackedMsg, end))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_ul_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, ppWritePackedMsg, end, &pack_ul_config_request_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)) ;
+}
+
+static uint8_t pack_hi_dci0_hi_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_hi_pdu_rel8_t *hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t *)tlv;
+  return ( push8(hi_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
+           push8(hi_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
+           push8(hi_pdu_rel8->hi_value, ppWritePackedMsg, end) &&
+           push8(hi_pdu_rel8->i_phich, ppWritePackedMsg, end) &&
+           push16(hi_pdu_rel8->transmission_power, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_hi_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_hi_pdu_rel10_t *hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t *)tlv;
+  return ( push8(hi_pdu_rel10->flag_tb2, ppWritePackedMsg, end) &&
+           push8(hi_pdu_rel10->hi_value_2, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_dci_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel8_t *dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t *)tlv;
+  return ( push8(dci_pdu_rel8->dci_format, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->cce_index, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->aggregation_level, ppWritePackedMsg, end) &&
+           push16(dci_pdu_rel8->rnti, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->number_of_resource_block, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->mcs_1, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->new_data_indication_1, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->ue_tx_antenna_seleciton, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->tpc, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->cqi_csi_request, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->ul_index, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->dl_assignment_index, ppWritePackedMsg, end) &&
+           push32(dci_pdu_rel8->tpc_bitmap, ppWritePackedMsg, end) &&
+           push16(dci_pdu_rel8->transmission_power, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_dci_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel10_t *dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t *)tlv;
+  return ( push8(dci_pdu_rel10->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->carrier_indicator, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->size_of_cqi_csi_feild, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->srs_flag, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->srs_request, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->resource_allocation_flag, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
+           push32(dci_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->mcs_2, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->new_data_indication_2, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->number_of_antenna_ports, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->tpmi, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->total_dci_length_including_padding, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->n_ul_rb, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_dci_rel12_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel12_t *dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t *)tlv;
+  return ( push8(dci_pdu_rel12->pscch_resource, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel12->time_resource_pattern, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_mpdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *mpdcch_dci_pdu_rel13 = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *)tlv;
+  return ( push8(mpdcch_dci_pdu_rel13->mpdcch_narrowband, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->number_of_prb_pairs, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->resource_block_assignment, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->mpdcch_transmission_type, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->ecce_index, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->aggreagation_level, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->rnti_type, ppWritePackedMsg, end) &&
+           push16(mpdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->ce_mode, ppWritePackedMsg, end) &&
+           push16(mpdcch_dci_pdu_rel13->drms_scrambling_init, ppWritePackedMsg, end) &&
+           push16(mpdcch_dci_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+           push16(mpdcch_dci_pdu_rel13->transmission_power, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->dci_format, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->resource_block_start, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->number_of_resource_blocks, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->pusch_repetition_levels, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->frequency_hopping_flag, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->harq_process, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->redudency_version, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->tpc, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->csi_request, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->ul_inex, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->dai_presence_flag, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->dl_assignment_index, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->srs_request, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
+           push32(mpdcch_dci_pdu_rel13->tcp_bitmap, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->total_dci_length_include_padding, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
+           pusharray16(mpdcch_dci_pdu_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_npdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *npdcch_dci_pdu_rel13 = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *)tlv;
+  return ( push8(npdcch_dci_pdu_rel13->ncce_index, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->aggregation_level, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
+           push16(npdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->scheduling_delay, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->new_data_indicator, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_hi_dci0_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_request_body_t *value = (nfapi_hi_dci0_request_body_t *)tlv;
+
+  if(!(push16(value->sfnsf, ppWritePackedMsg, end) &&
+       push8(value->number_of_dci, ppWritePackedMsg, end) &&
+       push8(value->number_of_hi, ppWritePackedMsg, end)))
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_dci + value->number_of_hi;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_hi_dci0_request_pdu_t *pdu = &(value->hi_dci0_pdu_list[i]);
+
+    if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Put a 0 size in and then determine the size after the pdu
+    // has been writen and write the calculated size
+    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
+    pdu->pdu_size = 0;
+
+    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_HI_DCI0_HI_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_hi_rel8_pdu_value) &&
+             pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_hi_rel10_pdu_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_HI_DCI0_DCI_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
+             pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
+             pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, ppWritePackedMsg, end, pack_hi_dci0_dci_rel12_pdu_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
+             pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
+             pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, ppWritePackedMsg, end, pack_dl_config_epdcch_parameters_rel11_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_mpdcch_dci_rel13_pdu_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_npdcch_dci_rel13_pdu_value)))
+          return 0;
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+
+    // add 1 for the pdu_type. The delta will include the pdu_size
+    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+
+    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_ul_dci_pdu_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_ul_dci_request_pdus_t* value = (nfapi_nr_ul_dci_request_pdus_t*)tlv;
+	
+	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+	{
+		if(!(push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
+		push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
+
+		push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
+		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
+		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
+		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
+
+		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
+		push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
+		
+		pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end)))
+
+		return 0;
+	}
+
+	return (push16(value->PDUType, ppWritePackedMsg, end) &&
+	   	    push16(value->PDUSize, ppWritePackedMsg, end) &&
+			    push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, ppWritePackedMsg, end) &&
+			    push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, ppWritePackedMsg, end) &&
+
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, ppWritePackedMsg, end) &&
+			    pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, ppWritePackedMsg, end) &&
+
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, ppWritePackedMsg, end) &&
+			    push16(value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.precoderGranularity, ppWritePackedMsg, end) &&
+			    push16(value->pdcch_pdu.pdcch_pdu_rel15.numDlDci, ppWritePackedMsg, end));
+
+}
+
+static uint8_t pack_ul_dci_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t *)msg;
+
+  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
+        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->numPdus, ppWritePackedMsg, end)
+       ))
+    return 0;
+
+  for(int i=0; i<pNfapiMsg->numPdus; i++) {
+    if(!pack_ul_dci_pdu_list_value(&pNfapiMsg->ul_dci_pdu_list[i], ppWritePackedMsg, end))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+
+static uint8_t pack_hi_dci0_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, ppWritePackedMsg, end, &pack_hi_dci0_request_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+//pack_tx_data_pdu_list_value
+static uint8_t pack_tx_data_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_pdu_t *value = (nfapi_nr_pdu_t *)tlv;
+
+  if(!(push32(value->num_TLV, ppWritePackedMsg, end) &&
+       push16(value->PDU_index, ppWritePackedMsg, end) &&
+       push16(value->PDU_length, ppWritePackedMsg, end)
+      ))
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_tlvs = value->num_TLV;
+
+  for(; i < total_number_of_tlvs; ++i) {
+    if (!(push16(value->TLVs[i].length, ppWritePackedMsg, end) &&
+          push16(value->TLVs[i].tag, ppWritePackedMsg, end)))
+      return 0;
+
+    switch(value->TLVs[i].tag) {
+      case 0: {
+        if(!pusharray32(value->TLVs[i].value.direct, 16384, value->TLVs[i].length, ppWritePackedMsg, end))
+          return 0;
+
+        break;
+      }
+
+      case 1: {
+        if(!pusharray32(value->TLVs[i].value.ptr, value->TLVs[i].length, value->TLVs[i].length, ppWritePackedMsg, end))
+          return 0;
+
+        break;
+      }
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", value->TLVs[i].tag );
+        break;
+      }
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t pack_tx_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_tx_request_body_t *value = (nfapi_tx_request_body_t *)tlv;
+
+  if(push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_tx_request_pdu_t *pdu = &(value->tx_pdu_list[i]);
+
+    if(!(push16(pdu->pdu_length, ppWritePackedMsg, end) &&
+         push16(pdu->pdu_index, ppWritePackedMsg, end)))
+      return 0;
+
+    uint8_t j;
+
+    for(j = 0; j < pdu->num_segments; ++j) {
+      // Use -1 as it is unbounded
+      // DJP - does not handle -1
+      // DJP - if(pusharray8(pdu->segments[j].segment_data, (uint32_t)(-1), pdu->segments[j].segment_length, ppWritePackedMsg, end) == 0)
+      int push_ret = pusharray8(pdu->segments[j].segment_data, 65535, pdu->segments[j].segment_length, ppWritePackedMsg, end);
+
+      if (pdu->segments[j].segment_length == 3) {
+        NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__,
+                    pdu->segments[j].segment_data[0],
+                    pdu->segments[j].segment_data[1],
+                    pdu->segments[j].segment_data[2]
+                   );
+      }
+
+      //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() segment_data:%p segment_length:%u pusharray8()=%d\n", __FUNCTION__, pdu->segments[j].segment_data, pdu->segments[j].segment_length, push_ret);
+
+      if (push_ret == 0) {
+        return 0;
+      }
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t pack_tx_data_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t *)msg;
+
+  if (!(
+        push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
+        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
+        push16(pNfapiMsg->Number_of_PDUs, ppWritePackedMsg, end)
+      ))
+    return 0;
+
+  for(int i=0; i<pNfapiMsg->Number_of_PDUs; i++) {
+    if(!pack_tx_data_pdu_list_value(&pNfapiMsg->pdu_list[i], ppWritePackedMsg, end))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_tx_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t *)msg;
+  int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
+  int y = pack_tlv(NFAPI_TX_REQUEST_BODY_TAG, &pNfapiMsg->tx_request_body, ppWritePackedMsg, end, &pack_tx_request_body_value);
+  int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+  //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() x:%d y:%d z:%d\n", __FUNCTION__, x, y, z);
+  return x && y && z;
+}
+
+static uint8_t pack_release_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ue_release_request_body_t *value = (nfapi_ue_release_request_body_t *)tlv;
+
+  if(push16(value->number_of_TLVs, ppWritePackedMsg, end) == 0) {
+    return 0;
+  }
+
+  uint8_t j;
+  uint16_t num = value->number_of_TLVs;
+
+  for(j = 0; j < num; ++j) {
+    if(push16(value->ue_release_request_TLVs_list[j].rnti, ppWritePackedMsg, end) == 0) {
+      return 0;
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t pack_ue_release_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t *)msg;
+  int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
+  int y = pack_tlv(NFAPI_UE_RELEASE_BODY_TAG, &pNfapiMsg->ue_release_request_body, ppWritePackedMsg, end, &pack_release_request_body_value);
+  int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+  return x && y && z;
+}
+
+static uint8_t pack_ue_release_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t *)msg;
+  int x = push32(pNfapiMsg->error_code, ppWritePackedMsg, end);
+  int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+  return x && z;
+}
+
+static uint8_t pack_rx_ue_information_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rx_ue_information *value = (nfapi_rx_ue_information *)tlv;
+  return ( push32(value->handle, ppWritePackedMsg, end) &&
+           push16(value->rnti, ppWritePackedMsg, end) );
+}
+
+static uint8_t unpack_rx_ue_information_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rx_ue_information *value = (nfapi_rx_ue_information *)tlv;
+  return ( pull32(ppReadPackedMsg, &value->handle, end) &&
+           pull16(ppReadPackedMsg, &value->rnti, end));
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data_bundling(nfapi_harq_indication_tdd_harq_data_bundling_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( push8(data->value_0, ppWritePackedMsg, end) &&
+           push8(data->value_1, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data_multiplexing(nfapi_harq_indication_tdd_harq_data_multiplexing_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( push8(data->value_0, ppWritePackedMsg, end) &&
+           push8(data->value_1, ppWritePackedMsg, end) &&
+           push8(data->value_2, ppWritePackedMsg, end) &&
+           push8(data->value_3, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data_special_bundling(nfapi_harq_indication_tdd_harq_data_special_bundling_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( push8(data->value_0, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data(nfapi_harq_indication_tdd_harq_data_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( push8(data->value_0, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_harq_indication_tdd_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel8_t *harq_indication_tdd_rel8 = (nfapi_harq_indication_tdd_rel8_t *)tlv;
+
+  if(!(push8(harq_indication_tdd_rel8->mode, ppWritePackedMsg, end) &&
+       push8(harq_indication_tdd_rel8->number_of_ack_nack, ppWritePackedMsg, end)))
+    return 0;
+
+  uint8_t result = 0;
+
+  switch(harq_indication_tdd_rel8->mode) {
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+      result = pack_harq_indication_tdd_harq_data_bundling(&harq_indication_tdd_rel8->harq_data.bundling, ppWritePackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+      result = pack_harq_indication_tdd_harq_data_multiplexing(&harq_indication_tdd_rel8->harq_data.multiplex, ppWritePackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+      result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel8->harq_data.special_bundling, ppWritePackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+      result = 1;
+      break;
+
+    default:
+      // err....
+      break;
+  }
+
+  return result;
+}
+
+static uint8_t pack_harq_indication_tdd_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel9_t *harq_indication_tdd_rel9 = (nfapi_harq_indication_tdd_rel9_t *)tlv;
+
+  if(!(push8(harq_indication_tdd_rel9->mode, ppWritePackedMsg, end) &&
+       push8(harq_indication_tdd_rel9->number_of_ack_nack, ppWritePackedMsg, end)))
+    return 0;
+
+  uint8_t idx;
+
+  for(idx = 0; idx < harq_indication_tdd_rel9->number_of_ack_nack; ++idx) {
+    uint8_t result = 0;
+
+    switch(harq_indication_tdd_rel9->mode) {
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+        result = pack_harq_indication_tdd_harq_data(&(harq_indication_tdd_rel9->harq_data[idx].bundling), ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].multiplex, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+        result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel9->harq_data[idx].special_bundling, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].channel_selection, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].format_3, ppWritePackedMsg, end);
+        break;
+
+      default:
+        // err....
+        break;
+    }
+
+    if(result == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_harq_indication_tdd_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel13_t *harq_indication_tdd_rel13 = (nfapi_harq_indication_tdd_rel13_t *)tlv;
+
+  if(!(push8(harq_indication_tdd_rel13->mode, ppWritePackedMsg, end) &&
+       push16(harq_indication_tdd_rel13->number_of_ack_nack, ppWritePackedMsg, end)))
+    return 0;
+
+  uint8_t idx;
+
+  for(idx = 0; idx < harq_indication_tdd_rel13->number_of_ack_nack; ++idx) {
+    uint8_t result = 0;
+
+    switch(harq_indication_tdd_rel13->mode) {
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].bundling, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].multiplex, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+        result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel13->harq_data[idx].special_bundling, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].channel_selection, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_3, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_4, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_5, ppWritePackedMsg, end);
+        break;
+
+      default:
+        // err....
+        break;
+    }
+
+    if(result == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_harq_indication_fdd_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel8_t *harq_indication_fdd_rel8 = (nfapi_harq_indication_fdd_rel8_t *)tlv;
+  return ( push8(harq_indication_fdd_rel8->harq_tb1, ppWritePackedMsg, end) &&
+           push8(harq_indication_fdd_rel8->harq_tb2, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_fdd_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel9_t *harq_indication_fdd_rel9 = (nfapi_harq_indication_fdd_rel9_t *)tlv;
+  return ( push8(harq_indication_fdd_rel9->mode, ppWritePackedMsg, end) &&
+           push8(harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end) &&
+           pusharray8(harq_indication_fdd_rel9->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel13_t *harq_indication_fdd_rel13 = (nfapi_harq_indication_fdd_rel13_t *)tlv;
+  return ( push8(harq_indication_fdd_rel13->mode, ppWritePackedMsg, end) &&
+           push16(harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end) &&
+           pusharray8(harq_indication_fdd_rel13->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_cqi_information_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_cqi_information_t *value = (nfapi_ul_cqi_information_t *)tlv;
+  return ( push8(value->ul_cqi, ppWritePackedMsg, end) &&
+           push8(value->channel, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_body_t *value = (nfapi_harq_indication_body_t *)tlv;
+
+  if(push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_harqs;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_harq_indication_pdu_t *pdu = &(value->harq_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, ppWritePackedMsg, end, pack_harq_indication_tdd_rel8_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, ppWritePackedMsg, end, pack_harq_indication_tdd_rel9_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, ppWritePackedMsg, end, pack_harq_indication_tdd_rel13_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, ppWritePackedMsg, end, pack_harq_indication_fdd_rel8_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, ppWritePackedMsg, end, pack_harq_indication_fdd_rel9_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_harq_indication_fdd_rel13_value) &&
+         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, ppWritePackedMsg, end, pack_harq_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_crc_indication_rel8_body(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_crc_indication_rel8_t *crc_indication_rel8 = (nfapi_crc_indication_rel8_t *)tlv;
+  return ( push8(crc_indication_rel8->crc_flag, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_crc_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_crc_indication_body_t *value = (nfapi_crc_indication_body_t *)tlv;
+
+  if(push16(value->number_of_crcs, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_crcs;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_crc_indication_pdu_t *pdu = &(value->crc_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, ppWritePackedMsg, end, pack_crc_indication_rel8_body)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_crc_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, ppWritePackedMsg, end, &pack_crc_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+static uint8_t pack_rx_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rx_indication_rel8_t *value = (nfapi_rx_indication_rel8_t *)tlv;
+  return ( push16(value->length, ppWritePackedMsg, end) &&
+           push16(value->offset, ppWritePackedMsg, end) &&
+           push8(value->ul_cqi, ppWritePackedMsg, end) &&
+           push16(value->timing_advance, ppWritePackedMsg, end));
+}
+static uint8_t pack_rx_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rx_indication_rel9_t *value = (nfapi_rx_indication_rel9_t *)tlv;
+  return ( push16(value->timing_advance_r9, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rx_indication_body_t *value = (nfapi_rx_indication_body_t *)tlv;
+
+  //printf("RX ULSCH BODY\n");
+
+  if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  // need to calculate the data offset's.
+  uint16_t i = 0;
+  uint16_t offset = 2; // taking into account the number_of_pdus
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+  //printf("ULSCH:pdus:%d\n", total_number_of_pdus);
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
+
+    if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG) {
+      //printf("NFAPI_RX_UE_INFORMATION_TAG\n");
+      offset += 4 + 6;
+    }
+
+    if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
+      //printf("NFAPI_RX_INDICATION_REL8_TAG\n");
+      offset += 4 + 7;
+    }
+
+    if(pdu->rx_indication_rel9.tl.tag == NFAPI_RX_INDICATION_REL9_TAG) {
+      //printf("NFAPI_RX_INDICATION_REL9_TAG\n");
+      offset += 4 + 2;
+    }
+  }
+
+  // Now update the structure to include the offset
+  for(i =0; i < total_number_of_pdus; ++i) {
+    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
+
+    if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
+      if(pdu->rx_indication_rel8.offset == 1) {
+        pdu->rx_indication_rel8.offset = offset;
+        offset += pdu->rx_indication_rel8.length;
+      }
+    }
+  }
+
+  // Write out the pdu
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_RX_INDICATION_REL8_TAG, &pdu->rx_indication_rel8, ppWritePackedMsg, end, pack_rx_indication_rel8_value) &&
+         pack_tlv(NFAPI_RX_INDICATION_REL9_TAG, &pdu->rx_indication_rel9, ppWritePackedMsg, end, pack_rx_indication_rel9_value)))
+      return 0;
+  }
+
+  // Write out the pdu data
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    uint16_t length = 0;
+    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
+
+    if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
+      length = pdu->rx_indication_rel8.length;
+    }
+
+    if( pusharray8(value->rx_pdu_list[i].data, length, length, ppWritePackedMsg, end) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_rx_ulsch_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, ppWritePackedMsg, end, pack_rx_ulsch_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_preamble_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel8_t *preamble_rel8 = (nfapi_preamble_pdu_rel8_t *)tlv;
+  return ( push16(preamble_rel8->rnti, ppWritePackedMsg, end) &&
+           push8(preamble_rel8->preamble, ppWritePackedMsg, end) &&
+           push16(preamble_rel8->timing_advance, ppWritePackedMsg, end));
+}
+static uint8_t pack_preamble_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel9_t *preamble_rel9 = (nfapi_preamble_pdu_rel9_t *)tlv;
+  return ( push16(preamble_rel9->timing_advance_r9, ppWritePackedMsg, end) );
+}
+static uint8_t pack_preamble_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel13_t *preamble_rel13 = (nfapi_preamble_pdu_rel13_t *)tlv;
+  return ( push8(preamble_rel13->rach_resource_type, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_rach_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rach_indication_body_t *value = (nfapi_rach_indication_body_t *)tlv;
+
+  if( push16(value->number_of_preambles, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_preambles;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_preamble_pdu_t *pdu = &(value->preamble_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, ppWritePackedMsg, end, pack_preamble_pdu_rel8_value) &&
+         pack_tlv(NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, ppWritePackedMsg, end, pack_preamble_pdu_rel9_value) &&
+         pack_tlv(NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, ppWritePackedMsg, end, pack_preamble_pdu_rel13_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_rach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, ppWritePackedMsg, end, pack_rach_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_srs_indication_fdd_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel8_t *srs_pdu_rel8 = (nfapi_srs_indication_fdd_rel8_t *)tlv;
+  return ( push16(srs_pdu_rel8->doppler_estimation, ppWritePackedMsg, end) &&
+           push16(srs_pdu_rel8->timing_advance, ppWritePackedMsg, end) &&
+           push8(srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
+           push8(srs_pdu_rel8->rb_start, ppWritePackedMsg, end) &&
+           pusharray8(srs_pdu_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_srs_indication_fdd_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel9_t *srs_pdu_rel9 = (nfapi_srs_indication_fdd_rel9_t *)tlv;
+  return ( push16(srs_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_srs_indication_tdd_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_srs_indication_ttd_rel10_t *srs_pdu_rel10 = (nfapi_srs_indication_ttd_rel10_t *)tlv;
+  return ( push8(srs_pdu_rel10->uppts_symbol, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_srs_indication_fdd_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel11_t *srs_pdu_rel11 = (nfapi_srs_indication_fdd_rel11_t *)tlv;
+  return ( push16(srs_pdu_rel11->ul_rtoa, ppWritePackedMsg, end) ) ;
+}
+
+static uint8_t pack_tdd_channel_measurement_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_tdd_channel_measurement_t *value = (nfapi_tdd_channel_measurement_t *)tlv;
+
+  if(!(push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
+       push8(value->number_of_subbands, ppWritePackedMsg, end) &&
+       push8(value->num_atennas, ppWritePackedMsg, end)))
+    return 0;
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_subbands; ++idx) {
+    if(!(push8(value->subands[idx].subband_index, ppWritePackedMsg, end) &&
+         pusharray16(value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_srs_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg,  uint8_t *end) {
+  nfapi_srs_indication_body_t *value = (nfapi_srs_indication_body_t *)tlv;
+
+  if( push8(value->number_of_ues, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_ues;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_srs_indication_pdu_t *pdu = &(value->srs_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, &pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel8_value) &&
+         pack_tlv(NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel9_value) &&
+         pack_tlv(NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, ppWritePackedMsg, end, &pack_srs_indication_tdd_rel10_value) &&
+         pack_tlv(NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel11_value) &&
+         pack_tlv(NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, ppWritePackedMsg, end, &pack_tdd_channel_measurement_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_srs_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, ppWritePackedMsg, end, &pack_srs_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_sr_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_sr_indication_body_t *value = (nfapi_sr_indication_body_t *)tlv;
+
+  if(push16(value->number_of_srs, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_srs;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_sr_indication_pdu_t *pdu = &(value->sr_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_sr_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, ppWritePackedMsg, end, &pack_sr_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_cqi_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_cqi_indication_rel8_t *cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t *)tlv;
+  return ( push16(cqi_pdu_rel8->length, ppWritePackedMsg, end) &&
+           push16(cqi_pdu_rel8->data_offset, ppWritePackedMsg, end) &&
+           push8(cqi_pdu_rel8->ul_cqi, ppWritePackedMsg, end) &&
+           push8(cqi_pdu_rel8->ri, ppWritePackedMsg, end) &&
+           push16(cqi_pdu_rel8->timing_advance, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_cqi_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_cqi_indication_rel9_t *cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t *)tlv;
+  return  ( push16(cqi_pdu_rel9->length, ppWritePackedMsg, end) &&
+            push16(cqi_pdu_rel9->data_offset, ppWritePackedMsg, end) &&
+            push8(cqi_pdu_rel9->ul_cqi, ppWritePackedMsg, end) &&
+            push8(cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
+            pusharray8(cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
+            push16(cqi_pdu_rel9->timing_advance, ppWritePackedMsg, end) &&
+            push16(cqi_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_cqi_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_cqi_indication_body_t *value = (nfapi_cqi_indication_body_t *)tlv;
+
+  if( push16(value->number_of_cqis, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  // need to calculate the data offset's. This very bittle due the hardcoding
+  // of the sizes. can not use the sizeof as we have an array for the Rel9
+  // info
+  uint16_t i = 0;
+  uint16_t offset = 2; // taking into account the number_of_cqis
+  uint16_t total_number_of_pdus = value->number_of_cqis;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
+    offset += 2; // for the instance length
+
+    if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG) {
+      offset += 4 + 6; // sizeof(nfapi_rx_ue_information) - sizeof(nfapi_tl_t)
+    }
+
+    if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
+      offset += 4 + 8;
+    }
+
+    if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
+      offset += 4 + 10 + pdu->cqi_indication_rel9.number_of_cc_reported;
+    }
+
+    if(pdu->ul_cqi_information.tl.tag == NFAPI_UL_CQI_INFORMATION_TAG) {
+      offset += 4 + 2;
+    }
+  }
+
+  // Now update the structure to include the offset
+  for(i =0; i < total_number_of_pdus; ++i) {
+    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
+
+    if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
+      if(pdu->cqi_indication_rel8.data_offset == 1) {
+        pdu->cqi_indication_rel8.data_offset = offset;
+        offset += pdu->cqi_indication_rel8.length;
+      }
+    }
+
+    if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
+      if(pdu->cqi_indication_rel9.data_offset == 1) {
+        pdu->cqi_indication_rel9.data_offset = offset;
+        offset += pdu->cqi_indication_rel9.length;
+      }
+    }
+  }
+
+  // Write out the cqi information
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end,pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_CQI_INDICATION_REL8_TAG, &pdu->cqi_indication_rel8, ppWritePackedMsg, end, pack_cqi_indication_rel8_value) &&
+         pack_tlv(NFAPI_CQI_INDICATION_REL9_TAG, &pdu->cqi_indication_rel9, ppWritePackedMsg, end, pack_cqi_indication_rel9_value) &&
+         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  // Write out the cqi raw data
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    uint16_t length = 0;
+    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
+
+    if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
+      length = pdu->cqi_indication_rel8.length;
+    }
+
+    if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
+      length = pdu->cqi_indication_rel9.length;
+    }
+
+    if( pusharray8(value->cqi_raw_pdu_list[i].pdu, NFAPI_CQI_RAW_MAX_LEN, length, ppWritePackedMsg, end) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_cqi_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t *)msg;
+  //Fixme: allocate some mem to fix pure bug, need to find out proper size
+  pNfapiMsg->vendor_extension=NULL;//(nfapi_vendor_extension_tlv_t)malloc( sizeof(* pNfapiMsg->vendor_extension));
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, ppWritePackedMsg, end, pack_cqi_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_lbt_pdsch_req_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_pdsch_req_pdu_rel13_t *value = (nfapi_lbt_pdsch_req_pdu_rel13_t *)tlv;
+  return ( push32(value->handle, ppWritePackedMsg, end) &&
+           push32(value->mp_cca, ppWritePackedMsg, end) &&
+           push32(value->n_cca, ppWritePackedMsg, end) &&
+           push32(value->offset, ppWritePackedMsg, end) &&
+           push32(value->lte_txop_sf, ppWritePackedMsg, end) &&
+           push16(value->txop_sfn_sf_end, ppWritePackedMsg, end) &&
+           push32(value->lbt_mode, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_drs_req_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_drs_req_pdu_rel13_t *value = (nfapi_lbt_drs_req_pdu_rel13_t *)tlv;
+  return ( push32(value->handle, ppWritePackedMsg, end) &&
+           push32(value->offset, ppWritePackedMsg, end) &&
+           push16(value->sfn_sf_end, ppWritePackedMsg, end) &&
+           push32(value->lbt_mode, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_dl_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_dl_config_request_body_t *value = (nfapi_lbt_dl_config_request_body_t *)tlv;
+
+  if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_lbt_dl_config_request_pdu_t *pdu = &(value->lbt_dl_config_req_pdu_list[i]);
+
+    if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Put a 0 size in and then determine the size after the pdu
+    // has been writen and write the calculated size
+    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
+    pdu->pdu_size = 0;
+
+    if( push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE: {
+        if( pack_tlv(NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_req_pdu_rel13_value) == 0)
+          return 0;
+      }
+      break;
+
+      case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE: {
+        if(pack_tlv(NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_req_pdu_rel13_value) == 0)
+          return 0;
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+
+    // add 1 for the pdu_type. The delta will include the pdu_size
+    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+
+    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_lbt_pdsch_rsp_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_pdsch_rsp_pdu_rel13_t *value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t *)tlv;
+  return ( push32(value->handle, ppWritePackedMsg, end) &&
+           push32(value->result, ppWritePackedMsg, end) &&
+           push32(value->lte_txop_symbols, ppWritePackedMsg, end) &&
+           push32(value->initial_partial_sf, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_drs_rsp_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_drs_rsp_pdu_rel13_t *value = (nfapi_lbt_drs_rsp_pdu_rel13_t *)tlv;
+  return ( push32(value->handle, ppWritePackedMsg, end) &&
+           push32(value->result, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, ppWritePackedMsg, end, &pack_lbt_dl_config_request_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_lbt_dl_config_indication_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_dl_indication_body_t *value = (nfapi_lbt_dl_indication_body_t *)tlv;
+
+  if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_lbt_dl_indication_pdu_t *pdu = &(value->lbt_indication_pdu_list[i]);
+
+    if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Put a 0 size in and then determine the size after the pdu
+    // has been writen and write the calculated size
+    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
+    pdu->pdu_size = 0;
+
+    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE: {
+        if( pack_tlv(NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_rsp_pdu_rel13_value) == 0)
+          return 0;
+      }
+      break;
+
+      case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE: {
+        if( pack_tlv(NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_rsp_pdu_rel13_value) == 0)
+          return 0;
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+
+    // add 1 for the pdu_type. The delta will include the pdu_size
+    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+
+    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_lbt_dl_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, ppWritePackedMsg, end, &pack_lbt_dl_config_indication_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nb_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nb_harq_indication_fdd_rel13_t *nb_harq_indication_fdd_rel13 = (nfapi_nb_harq_indication_fdd_rel13_t *)tlv;
+  return ( push8(nb_harq_indication_fdd_rel13->harq_tb1, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_nb_harq_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nb_harq_indication_body_t *value = (nfapi_nb_harq_indication_body_t *)tlv;
+
+  if( push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_harqs = value->number_of_harqs;
+
+  for(; i < total_number_of_harqs; ++i) {
+    nfapi_nb_harq_indication_pdu_t *pdu = &(value->nb_harq_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_nb_harq_indication_fdd_rel13_value) &&
+         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_nb_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, ppWritePackedMsg, end, &pack_nb_harq_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nrach_indication_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nrach_indication_pdu_rel13_t *nrach_indication_fdd_rel13 = (nfapi_nrach_indication_pdu_rel13_t *)tlv;
+  return ( push16(nrach_indication_fdd_rel13->rnti, ppWritePackedMsg, end) &&
+           push8(nrach_indication_fdd_rel13->initial_sc, ppWritePackedMsg, end) &&
+           push16(nrach_indication_fdd_rel13->timing_advance, ppWritePackedMsg, end) &&
+           push8(nrach_indication_fdd_rel13->nrach_ce_level, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_nrach_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nrach_indication_body_t *value = (nfapi_nrach_indication_body_t *)tlv;
+
+  if( push8(value->number_of_initial_scs_detected, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_initial_scs_detected = value->number_of_initial_scs_detected;
+
+  for(; i < total_number_of_initial_scs_detected; ++i) {
+    nfapi_nrach_indication_pdu_t *pdu = &(value->nrach_pdu_list[i]);
+
+    //uint8_t* instance_length_p = *ppWritePackedMsg;
+    //if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+    //  return 0;
+
+    if(!(pack_tlv(NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, ppWritePackedMsg, end, pack_nrach_indication_rel13_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    //uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    //push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_nrach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, ppWritePackedMsg, end, &pack_nrach_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t *)msg;
+  return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+           pushs32(pNfapiMsg->delta_sfn_slot, ppWritePackedMsg, end) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t *)msg;
+  return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+           pushs32(pNfapiMsg->delta_sfn_sf, ppWritePackedMsg, end) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t *)msg;
+  return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
+          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t *)msg;
+  return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
+          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t *)msg;
+  return (push32(pNfapiMsg->last_sfn_sf, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->dl_config_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->tx_request_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->ul_config_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->hi_dci0_jitter, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->dl_config_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->tx_request_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_config_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->hi_dci0_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->dl_config_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->tx_request_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_config_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->hi_dci0_earliest_arrival, ppWritePackedMsg, end) &&
+          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t *)msg;
+  return (push32(pNfapiMsg->last_sfn, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->last_slot, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->dl_tti_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->tx_data_request_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->ul_tti_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->ul_dci_jitter, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->dl_tti_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->tx_data_request_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_tti_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_dci_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->dl_tti_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->tx_data_request_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_tti_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_dci_earliest_arrival, ppWritePackedMsg, end) &&
+          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+//NR UPLINK indication function packing
+
+//SLOT INDICATION
+
+static uint8_t pack_nr_slot_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_slot_indication_scf_t *pNfapiMsg = (nfapi_nr_slot_indication_scf_t*)msg;
+
+	if (!(push16((uint16_t)pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16((uint16_t)pNfapiMsg->slot , ppWritePackedMsg, end)
+		))
+			return 0;
+
+return 1;
+}
+
+//RX DATA INDICATION 
+
+static uint8_t pack_nr_rx_data_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_rx_data_pdu_t* value = (nfapi_nr_rx_data_pdu_t*)tlv;
+
+	if(!(push32(value->handle, ppWritePackedMsg, end) &&
+	 	 push16(value->rnti, ppWritePackedMsg, end) &&
+		 push8(value->harq_id, ppWritePackedMsg, end) &&
+		 push16(value->pdu_length, ppWritePackedMsg, end) &&
+		 push8(value->ul_cqi, ppWritePackedMsg, end) &&
+		 push16(value->timing_advance, ppWritePackedMsg, end) && 
+		 push16(value->rssi, ppWritePackedMsg, end) 
+		 ))
+		  return 0;
+
+	return 1;
+}
+
+
+static uint8_t pack_nr_rx_data_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_rx_data_indication_t *pNfapiMsg = (nfapi_nr_rx_data_indication_t*)msg;
+
+	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->number_of_pdus, ppWritePackedMsg, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)	
+	{
+		if(!pack_nr_rx_data_indication_body(pNfapiMsg->pdu_list,ppWritePackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//NR CRC INDICATION
+
+static uint8_t pack_nr_crc_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_crc_t* value = (nfapi_nr_crc_t*)tlv;
+
+	if(!(push32(value->handle, ppWritePackedMsg, end) &&
+	 	 push16(value->rnti, ppWritePackedMsg, end) &&
+		 push8(value->harq_id, ppWritePackedMsg, end) &&
+		 push8(value->tb_crc_status, ppWritePackedMsg, end) &&
+		 push16(value->num_cb, ppWritePackedMsg, end) &&
+		 //pusharray8(value->cb_crc_status, (int)(value->num_cb / 8) + 1, (int)(value->num_cb / 8) + 1, ppWritePackedMsg, end) && //length is ceil(NumCb/8)
+		 push8(value->ul_cqi, ppWritePackedMsg, end) && 
+		 push16(value->timing_advance, ppWritePackedMsg, end) &&
+		 push16(value->rssi, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+
+	return 1;
+}
+
+static uint8_t pack_nr_crc_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_crc_indication_t *pNfapiMsg = (nfapi_nr_crc_indication_t*)msg;
+
+	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->number_crcs, ppWritePackedMsg, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_crcs;i++)	
+	{
+		if(!pack_nr_crc_indication_body(pNfapiMsg->crc_list,ppWritePackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//SRS INDICATION
+
+static uint8_t pack_nr_srs_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_srs_indication_pdu_t* value = (nfapi_nr_srs_indication_pdu_t*)tlv;
+
+	if(!(push32(value->handle, ppWritePackedMsg, end) &&
+	 	 push16(value->rnti, ppWritePackedMsg, end) &&
+		 push16(value->timing_advance, ppWritePackedMsg, end) &&
+		 push8(value->num_symbols, ppWritePackedMsg, end) &&
+		 push8(value->wide_band_snr, ppWritePackedMsg, end) &&
+		 push8(value->num_reported_symbols, ppWritePackedMsg, end) && 
+		 push8(value->reported_symbol_list->num_rbs, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+	for(int i = 0; i < value->reported_symbol_list->num_rbs; i++)
+	{
+		if(!(push8(value->reported_symbol_list->rb_list->rb_snr, ppWritePackedMsg, end)
+			))
+			return 0;
+	}
+	return 1;
+}
+
+static uint8_t pack_nr_srs_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_srs_indication_t *pNfapiMsg = (nfapi_nr_srs_indication_t*)msg;
+
+	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->number_of_pdus, ppWritePackedMsg, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)	
+	{
+		if(!pack_nr_srs_indication_body(&(pNfapiMsg->pdu_list[i]),ppWritePackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//RACH INDICATION
+
+static uint8_t pack_nr_rach_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_prach_indication_pdu_t* value = (nfapi_nr_prach_indication_pdu_t*)tlv;
+
+	if(!(push16(value->phy_cell_id, ppWritePackedMsg, end) &&
+	 	 push8(value->symbol_index, ppWritePackedMsg, end) &&
+		 push8(value->slot_index, ppWritePackedMsg, end) &&
+		 push8(value->freq_index, ppWritePackedMsg, end) &&
+		 push8(value->avg_rssi, ppWritePackedMsg, end) &&
+		 push8(value->avg_snr, ppWritePackedMsg, end) && 
+		 push8(value->num_preamble, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+	for(int i = 0; i < value->num_preamble; i++)
+	{
+		if(!(push8(value->preamble_list->preamble_index, ppWritePackedMsg, end) &&
+			push16(value->preamble_list->timing_advance, ppWritePackedMsg, end) &&
+			push32(value->preamble_list->preamble_pwr, ppWritePackedMsg, end)
+			))
+			return 0;
+	}
+	return 1;
+}
+
+static uint8_t pack_nr_rach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_rach_indication_t *pNfapiMsg = (nfapi_nr_rach_indication_t*)msg;
+
+	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+		push8(pNfapiMsg->number_of_pdus, ppWritePackedMsg, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)	
+	{
+		if(!pack_nr_rach_indication_body(&(pNfapiMsg->pdu_list[i]),ppWritePackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+
+//UCI INDICATION
+
+static uint8_t pack_nr_uci_pucch_0_1(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+	nfapi_nr_uci_pucch_pdu_format_0_1_t* value = (nfapi_nr_uci_pucch_pdu_format_0_1_t*)tlv;
+
+	if(!(push8(value->pduBitmap, ppWritePackedMsg, end) &&
+	 	 push32(value->handle, ppWritePackedMsg, end) &&
+		 push16(value->rnti, ppWritePackedMsg, end) &&
+		 push8(value->pucch_format, ppWritePackedMsg, end) &&
+		 push8(value->ul_cqi, ppWritePackedMsg, end) &&
+		 push16(value->timing_advance, ppWritePackedMsg, end) && 
+		 push16(value->rssi, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+	if (value->pduBitmap & 0x01) { //SR
+		if(!(push8(value->sr->sr_indication, ppWritePackedMsg, end) &&
+	 	 push8(value->sr->sr_confidence_level, ppWritePackedMsg, end) 
+		 ))
+		  return 0;
+	}
+
+	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
+		if(!(push8(value->harq->num_harq, ppWritePackedMsg, end) &&
+	 	 push8(value->harq->harq_confidence_level, ppWritePackedMsg, end) 
+		 ))
+			return 0;
+
+		for(int i=0; i<value->harq->num_harq;i++)	
+		{
+			if(!(push8(value->harq->harq_list[i].harq_value, ppWritePackedMsg, end)
+			))
+			return 0;
+		}
+	}
+
+	return 1;
+}
+
+static uint8_t pack_nr_uci_pucch_2_3_4(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+	nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value = (nfapi_nr_uci_pucch_pdu_format_2_3_4_t*) tlv;
+
+	if(!(push8(value->pduBitmap, ppWritePackedMsg, end) &&
+	 	 push32(value->handle, ppWritePackedMsg, end) &&
+		 push16(value->rnti, ppWritePackedMsg, end) &&
+		 push8(value->pucch_format, ppWritePackedMsg, end) &&
+		 push8(value->ul_cqi, ppWritePackedMsg, end) &&
+		 push16(value->timing_advance, ppWritePackedMsg, end) && 
+		 push16(value->rssi, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+
+	if (value->pduBitmap & 0x01) { //SR
+		if(!(push8(value->sr.sr_bit_len, ppWritePackedMsg, end) &&
+	 	 pusharray8(value->sr.sr_payload, (int)(value->sr.sr_bit_len / 8) + 1, (int)(value->sr.sr_bit_len / 8) + 1, ppWritePackedMsg, end) 
+		 ))
+		  return 0;
+	}
+
+	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
+		if(!(push8(value->harq.harq_crc, ppWritePackedMsg, end) &&
+			push8(value->harq.harq_bit_len, ppWritePackedMsg, end) &&
+	 	 	pusharray8(value->harq.harq_payload, (int)(value->harq.harq_bit_len / 8) + 1, (int)(value->harq.harq_bit_len / 8) + 1, ppWritePackedMsg, end) 
+			))
+			return 0;
+	}
+
+	if (((value->pduBitmap >> 2) & 0x01)) { //CSI-1
+		if(!(push8(value->csi_part1.csi_part1_crc, ppWritePackedMsg, end) &&
+			push8(value->csi_part1.csi_part1_bit_len, ppWritePackedMsg, end) &&
+	 	 	pusharray8(value->csi_part1.csi_part1_payload, (int)(value->csi_part1.csi_part1_bit_len / 8) + 1, (int)(value->csi_part1.csi_part1_bit_len / 8) + 1, ppWritePackedMsg, end) 
+			))
+			return 0;
+	}
+
+	if (((value->pduBitmap >> 3) & 0x01)) { //CSI-2
+		if(!(push8(value->csi_part2.csi_part2_crc, ppWritePackedMsg, end) &&
+			push8(value->csi_part2.csi_part2_bit_len, ppWritePackedMsg, end) &&
+	 	 	pusharray8(value->csi_part2.csi_part2_payload, (int)(value->csi_part2.csi_part2_bit_len / 8) + 1, (int)(value->csi_part2.csi_part2_bit_len / 8) + 1, ppWritePackedMsg, end) 
+			))
+			return 0;
+	}
+
+	return 1;
+}
+
+static uint8_t pack_nr_uci_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_uci_t* value = (nfapi_nr_uci_t*)tlv;
+
+	if(!(push16(value->pdu_type, ppWritePackedMsg, end) &&
+		push16(value->pdu_size, ppWritePackedMsg, end)
+		))
+		return 0;
+	
+	switch (value->pdu_type) {
+      case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
+        printf("Unhandled NFAPI_NR_UCI_PUSCH_PDU_TYPE \n");
+        break;
+
+      case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: 
+        pack_nr_uci_pucch_0_1(&value->pucch_pdu_format_0_1, ppWritePackedMsg, end);
+        break;
+      
+      case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: 
+        pack_nr_uci_pucch_2_3_4(&value->pucch_pdu_format_2_3_4, ppWritePackedMsg, end);
+        break;
+	}
+
+	return 1;
+}
+
+static uint8_t pack_nr_uci_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t*)msg;
+
+	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->num_ucis, ppWritePackedMsg, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->num_ucis;i++)	
+	{
+		if(!pack_nr_uci_indication_body(pNfapiMsg->uci_list,ppWritePackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+
+// Main pack function - public
+
+int nfapi_nr_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config)
+{
+	nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
+	uint8_t *pWritePackedMessage = pPackedBuf;
+	uint8_t *pPackedLengthField = &pWritePackedMessage[4];
+	uint8_t *end = pPackedBuf + packedBufLen;
+
+	if (pMessageBuf == NULL || pPackedBuf == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
+		return -1;
+	}
+	/*
+	printf("\n P7 MESSAGE SENT: \n");
+	for(int i=0; i< packedBufLen; i++){
+		printf("%d", *(uint8_t *)(pMessageBuf + i));
+	}
+	printf("\n");
+	*/
+	// process the header
+	if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
+		 push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
+		 push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
+		 push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
+		 push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
+		 push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end)))
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
+		return -1;
+	}
+
+        if (pMessageHeader->message_id != NFAPI_TIMING_INFO)
+        {
+          //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() message_id:0x%04x phy_id:%u m_segment_sequence:%u timestamp:%u\n", __FUNCTION__, pMessageHeader->message_id, pMessageHeader->phy_id, pMessageHeader->m_segment_sequence, pMessageHeader->transmit_timestamp);
+        }
+	// look for the specific message
+	uint8_t result = 0;
+	switch (pMessageHeader->message_id)
+	{	
+		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
+			result = pack_dl_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
+			result = pack_ul_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
+			result = pack_tx_data_request(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
+			result = pack_ul_dci_request(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+		
+		case NFAPI_UE_RELEASE_REQUEST:
+			result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_UE_RELEASE_RESPONSE:
+			result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION:
+			result = pack_nr_slot_indication(pMessageHeader, &pWritePackedMessage, end, config);
+
+		case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
+			result = pack_nr_rx_data_indication(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
+			result = pack_nr_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
+			result = pack_nr_uci_indication(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
+			result = pack_nr_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
+			result = pack_nr_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
+			result = pack_nr_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
+			result = pack_nr_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_TIMING_INFO:
+			result = pack_nr_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		default:
+			{
+				if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+				   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
+				{
+					if(config && config->pack_p7_vendor_extension)
+					{
+						result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
+					}
+					else
+					{
+						NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+					}
+				}
+				else
+				{
+					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+				}
+			}
+			break;
+	}
+
+	if(result == 0)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
+		return -1;
+	}
+
+	// check for a valid message length
+	uintptr_t msgHead = (uintptr_t)pPackedBuf;
+	uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
+	uint32_t packedMsgLen = msgEnd - msgHead;
+	uint16_t packedMsgLen16;
+	if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
+		return -1;
+	}
+	else
+	{
+		packedMsgLen16 = (uint16_t)packedMsgLen;
+	}
+
+	// Update the message length in the header
+	pMessageHeader->message_length = packedMsgLen16;
+
+	if(!push16(packedMsgLen16, &pPackedLengthField, end))
+		return -1;
+
+	if(1)
+	{
+		//quick test
+		if(pMessageHeader->message_length != packedMsgLen)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
+		}
+	}
+
+	return (packedMsgLen);
+}
+
+int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t *config) {
+  nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
+  uint8_t *pWritePackedMessage = pPackedBuf;
+  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
+  uint8_t *end = pPackedBuf + packedBufLen;
+
+  if (pMessageBuf == NULL || pPackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
+    return -1;
+  }
+
+  /*
+  printf("\n P7 MESSAGE SENT: \n");
+  for(int i=0; i< packedBufLen; i++){
+    printf("%d", *(uint8_t *)(pMessageBuf + i));
+  }
+  printf("\n");
+  */
+  // process the header
+  if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
+       push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
+       push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
+       push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
+       push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
+       push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end))) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
+    return -1;
+  }
+
+  if (pMessageHeader->message_id != NFAPI_TIMING_INFO) {
+    //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() message_id:0x%04x phy_id:%u m_segment_sequence:%u timestamp:%u\n", __FUNCTION__, pMessageHeader->message_id, pMessageHeader->phy_id, pMessageHeader->m_segment_sequence, pMessageHeader->transmit_timestamp);
+  }
+
+  // look for the specific message
+  uint8_t result = 0;
+
+  switch (pMessageHeader->message_id) {
+    case NFAPI_DL_CONFIG_REQUEST:
+      //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST\n", __FUNCTION__);
+      result = pack_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_UL_CONFIG_REQUEST:
+      result = pack_ul_config_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_TX_REQUEST:
+      //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_TX_REQUEST\n", __FUNCTION__);
+      result = pack_tx_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_HI_DCI0_REQUEST:
+      result = pack_hi_dci0_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_UE_RELEASE_REQUEST:
+      result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_UE_RELEASE_RESPONSE:
+      result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_HARQ_INDICATION:
+      result = pack_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_CRC_INDICATION:
+      result = pack_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_RX_ULSCH_INDICATION:
+      //printf("RX ULSCH\n");
+      result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_RACH_INDICATION:
+      result = pack_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_SRS_INDICATION:
+      result = pack_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_RX_SR_INDICATION:
+      result = pack_sr_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_RX_CQI_INDICATION:
+      result = pack_cqi_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_LBT_DL_CONFIG_REQUEST:
+      result = pack_lbt_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_LBT_DL_INDICATION:
+      result = pack_lbt_dl_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_NB_HARQ_INDICATION:
+      result = pack_nb_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_NRACH_INDICATION:
+      result = pack_nrach_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_DL_NODE_SYNC:
+      result = pack_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_UL_NODE_SYNC:
+      result = pack_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_TIMING_INFO:
+      result = pack_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    default: {
+      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->pack_p7_vendor_extension) {
+          result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+      }
+    }
+    break;
+  }
+
+  if(result == 0) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
+    return -1;
+  }
+
+  // check for a valid message length
+  uintptr_t msgHead = (uintptr_t)pPackedBuf;
+  uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
+  uint32_t packedMsgLen = msgEnd - msgHead;
+  uint16_t packedMsgLen16;
+
+  if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
+    return -1;
+  } else {
+    packedMsgLen16 = (uint16_t)packedMsgLen;
+  }
+
+  // Update the message length in the header
+  pMessageHeader->message_length = packedMsgLen16;
+
+  if(!push16(packedMsgLen16, &pPackedLengthField, end))
+    return -1;
+
+  if(1) {
+    //quick test
+    if(pMessageHeader->message_length != packedMsgLen) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
+    }
+  }
+
+  return (packedMsgLen);
+}
+
+// Unpack routines
+// NR:
+static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv;
+  return(
+          pull16(ppReadPackedMsg, &value->bwp_size, end) &&
+          pull16(ppReadPackedMsg, &value->bwp_start, end) &&
+          pull8(ppReadPackedMsg, &value->subcarrier_spacing, end) &&
+          pull8(ppReadPackedMsg, &value->cyclic_prefix, end) &&
+          pull16(ppReadPackedMsg, &value->start_rb, end) &&
+          pull16(ppReadPackedMsg, &value->nr_of_rbs, end) &&
+          pull8(ppReadPackedMsg, &value->csi_type, end) &&
+          pull8(ppReadPackedMsg, &value->row, end) &&
+          pull16(ppReadPackedMsg, &value->freq_domain, end) &&
+          pull8(ppReadPackedMsg, &value->symb_l0, end) &&
+          pull8(ppReadPackedMsg, &value->symb_l1, end) &&
+          pull8(ppReadPackedMsg, &value->cdm_type, end) &&
+          pull8(ppReadPackedMsg, &value->freq_density, end) &&
+          pull16(ppReadPackedMsg, &value->scramb_id, end) &&
+          pull8(ppReadPackedMsg, &value->power_control_offset, end) &&
+          pull8(ppReadPackedMsg, &value->power_control_offset_ss, end)
+        );
+}
+
+
+static uint8_t unpack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+
+	nfapi_nr_dl_tti_pdcch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t*)tlv;
+	
+	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+	{
+		if(!(pull16(ppReadPackedMsg, &value->dci_pdu[i].RNTI, end) &&
+		pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingId, end) &&
+		pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingRNTI, end) &&
+		pull8(ppReadPackedMsg, &value->dci_pdu[i].CceIndex, end) &&
+		pull8(ppReadPackedMsg, &value->dci_pdu[i].AggregationLevel, end) &&
+		pull8(ppReadPackedMsg, &value->dci_pdu[i].beta_PDCCH_1_0, end) &&
+		pull8(ppReadPackedMsg, &value->dci_pdu[i].powerControlOffsetSS, end) &&
+		pull16(ppReadPackedMsg, &value->dci_pdu[i].PayloadSizeBits, end) &&
+		
+		pullarray8(ppReadPackedMsg, value->dci_pdu[i].Payload, value->dci_pdu[i].PayloadSizeBits, value->dci_pdu[i].PayloadSizeBits, end)))
+			
+		return 0;
+	}
+	// TODO: resolve the packaging of array (currently sending a single element)
+	return(
+		pull16(ppReadPackedMsg, &value->BWPSize, end) &&
+		pull16(ppReadPackedMsg, &value->BWPStart, end) &&
+		pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
+		pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
+		pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
+		pull8(ppReadPackedMsg, &value->DurationSymbols, end) &&
+		pullarray8(ppReadPackedMsg, value->FreqDomainResource, 6, 6, end) &&
+		pull8(ppReadPackedMsg, &value->CceRegMappingType, end) &&
+		pull8(ppReadPackedMsg, &value->RegBundleSize, end) &&
+		pull8(ppReadPackedMsg, &value->InterleaverSize, end) &&
+		pull8(ppReadPackedMsg, &value->CoreSetType, end) &&
+		pull16(ppReadPackedMsg, &value->ShiftIndex, end) &&
+		pull8(ppReadPackedMsg, &value->precoderGranularity, end) &&
+		pull16(ppReadPackedMsg, &value->numDlDci, end));
+}
+
+
+
+static uint8_t unpack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_pdsch_pdu_rel15_t *value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t *)tlv;
+  // TODO: resolve the packaging of array (currently sending a single element)
+  return(
+          pull16(ppReadPackedMsg, &value->pduBitmap, end) &&
+          pull16(ppReadPackedMsg, &value->rnti, end) &&
+          pull16(ppReadPackedMsg, &value->pduIndex, end) &&
+          pull16(ppReadPackedMsg, &value->BWPSize, end) &&
+          pull16(ppReadPackedMsg, &value->BWPStart, end) &&
+          pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
+          pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
+          pull8(ppReadPackedMsg, &value->NrOfCodewords, end) &&
+          pullarray16(ppReadPackedMsg, value->targetCodeRate, 2, 1, end) &&
+          pullarray8(ppReadPackedMsg, value->qamModOrder, 2, 1, end) &&
+          pullarray8(ppReadPackedMsg, value->mcsIndex, 2, 1, end) &&
+          pullarray8(ppReadPackedMsg, value->mcsTable, 2, 1, end) &&
+          pullarray8(ppReadPackedMsg, value->rvIndex, 2, 1, end) &&
+          pullarray32(ppReadPackedMsg, value->TBSize, 2, 1, end) &&
+          pull16(ppReadPackedMsg, &value->dataScramblingId, end) &&
+          pull8(ppReadPackedMsg, &value->nrOfLayers, end) &&
+          pull8(ppReadPackedMsg, &value->transmissionScheme, end) &&
+          pull8(ppReadPackedMsg, &value->refPoint, end) &&
+          pull16(ppReadPackedMsg, &value->dlDmrsSymbPos, end) &&
+          pull8(ppReadPackedMsg, &value->dmrsConfigType, end) &&
+          pull16(ppReadPackedMsg, &value->dlDmrsScramblingId, end) &&
+          pull8(ppReadPackedMsg, &value->SCID, end) &&
+          pull8(ppReadPackedMsg, &value->numDmrsCdmGrpsNoData, end) &&
+          pull16(ppReadPackedMsg, &value->dmrsPorts, end) &&
+          pull8(ppReadPackedMsg, &value->resourceAlloc, end) &&
+          pull16(ppReadPackedMsg, &value->rbStart, end) &&
+          pull16(ppReadPackedMsg, &value->rbSize, end) &&
+          pull8(ppReadPackedMsg, &value->VRBtoPRBMapping, end) &&
+          pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
+          pull8(ppReadPackedMsg, &value->NrOfSymbols, end) &&
+          pull8(ppReadPackedMsg, &value->PTRSPortIndex, end) &&
+          pull8(ppReadPackedMsg, &value->PTRSTimeDensity, end) &&
+          pull8(ppReadPackedMsg, &value->PTRSFreqDensity, end) &&
+          pull8(ppReadPackedMsg, &value->PTRSReOffset, end)
+        );
+}
+
+
+static uint8_t unpack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_ssb_pdu_rel15_t *value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t *)tlv;
+  return(
+          pull16(ppReadPackedMsg, &value->PhysCellId, end) &&
+          pull8(ppReadPackedMsg, &value->BetaPss, end) &&
+          pull8(ppReadPackedMsg, &value->SsbBlockIndex, end) &&
+          pull8(ppReadPackedMsg, &value->SsbSubcarrierOffset, end) &&
+          pull16(ppReadPackedMsg, &value->ssbOffsetPointA, end) &&
+          pull8(ppReadPackedMsg, &value->bchPayloadFlag, end) &&
+          pull32(ppReadPackedMsg, &value->bchPayload, end)
+          // TODO: pack precoding_and_beamforming too
+        );
+}
+
+
+// LTE:
+static uint8_t unpack_dl_config_dci_dl_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel8_t *dci_dl_pdu_rel8 = (nfapi_dl_config_dci_dl_pdu_rel8_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->dci_format, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->cce_idx, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->aggregation_level, end) &&
+          pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_allocation_type, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
+          pull32(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_block_coding, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_1, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_1, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_1, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_2, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_2, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_2, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->harq_process, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpmi, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->pmi, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->precoding_information, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpc, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_assignment_index, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->ngap, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_size_index, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_power_offset, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->allocate_prach_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->preamble_index, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->prach_mask_index, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti_type, end) &&
+          pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->transmission_power, end));
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel9_t *dci_dl_pdu_rel9 = (nfapi_dl_config_dci_dl_pdu_rel9_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_flag, end) &&
+           pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_change_notification, end) &&
+           pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->scrambling_identity, end));
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel10_t *dci_dl_pdu_rel10 = (nfapi_dl_config_dci_dl_pdu_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->cross_carrier_scheduling_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->carrier_indicator, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_request, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->antenna_ports_scrambling_and_layers, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->total_dci_length_including_padding, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->n_dl_rb, end));
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel11_t *dci_dl_pdu_rel11 = (nfapi_dl_config_dci_dl_pdu_rel11_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->harq_ack_resource_offset, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->pdsch_re_mapping_quasi_co_location_indicator, end));
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel12_t *dci_dl_pdu_rel12 = (nfapi_dl_config_dci_dl_pdu_rel12_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->primary_cell_type, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->ul_dl_configuration_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->number_ul_dl_configurations, end) &&
+          pullarray8(ppReadPackedMsg, dci_dl_pdu_rel12->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, dci_dl_pdu_rel12->number_ul_dl_configurations, end));
+}
+
+static uint8_t unpack_tpm_value(uint8_t **ppReadPackedMsg, nfapi_dl_config_dci_dl_tpm_t *value, uint8_t *end) {
+  if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
+       pull8(ppReadPackedMsg, &value->num_antennas, end)))
+    return 0;
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_subbands; ++idx) {
+    nfapi_dl_config_dci_dl_tpm_subband_info_t *subband_info = &(value->subband_info[idx]);
+
+    if(!(pull8(ppReadPackedMsg, &subband_info->subband_index, end) &&
+         pull8(ppReadPackedMsg, &subband_info->scheduled_ues, end)))
+      return 0;
+
+    uint8_t antenna_idx = 0;
+    uint8_t scheduled_ue_idx = 0;
+
+    for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx) {
+      for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx) {
+        if(!pull16(ppReadPackedMsg, &(subband_info->precoding_value[antenna_idx][scheduled_ue_idx]), end))
+          return 0;
+      }
+    }
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel13_t *dci_dl_pdu_rel13 = (nfapi_dl_config_dci_dl_pdu_rel13_t *)tlv;
+  // If the length is greater than 5 then the TPM struct flag and possiably the TPM structure have been
+  // added
+  uint8_t tpm_struct_flag_present = dci_dl_pdu_rel13->tl.length > 5;
+  dci_dl_pdu_rel13->tpm_struct_flag = 0;
+  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_configuration, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->initial_lbt_sf, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->codebook_size_determination, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->drms_table_flag, end) &&
+          ( (tpm_struct_flag_present == 1) ? pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm_struct_flag, end) : 1) &&
+          ( (tpm_struct_flag_present == 1 &&  dci_dl_pdu_rel13->tpm_struct_flag == 1) ? unpack_tpm_value(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm, end) : 1));
+}
+
+static uint8_t unpack_dl_config_bch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_bch_pdu_rel8_t *bch_pdu_rel8 = (nfapi_dl_config_bch_pdu_rel8_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &bch_pdu_rel8->length, end) &&
+           pull16(ppReadPackedMsg, (uint16_t *)&bch_pdu_rel8->pdu_index, end) &&
+           pull16(ppReadPackedMsg, &bch_pdu_rel8->transmission_power, end));
+}
+
+static uint8_t unpack_dl_config_mch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_mch_pdu_rel8_t *mch_pdu_rel8 = (nfapi_dl_config_mch_pdu_rel8_t *)tlv;
+  return (pull16(ppReadPackedMsg, &mch_pdu_rel8->length, end) &&
+          pull16(ppReadPackedMsg, (uint16_t *)&mch_pdu_rel8->pdu_index, end) &&
+          pull16(ppReadPackedMsg, &mch_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &mch_pdu_rel8->resource_allocation_type, end) &&
+          pull32(ppReadPackedMsg, &mch_pdu_rel8->resource_block_coding, end) &&
+          pull8(ppReadPackedMsg, &mch_pdu_rel8->modulation, end) &&
+          pull16(ppReadPackedMsg, &mch_pdu_rel8->transmission_power, end) &&
+          pull16(ppReadPackedMsg, &mch_pdu_rel8->mbsfn_area_id, end));
+}
+
+static uint8_t unpack_dl_config_dlsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel8_t *dlsch_pdu_rel8 = (nfapi_dl_config_dlsch_pdu_rel8_t *)tlv;
+
+  if (!(pull16(ppReadPackedMsg, &dlsch_pdu_rel8->length, end) &&
+        pull16(ppReadPackedMsg, (uint16_t *)&dlsch_pdu_rel8->pdu_index, end) &&
+        pull16(ppReadPackedMsg, &dlsch_pdu_rel8->rnti, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->resource_allocation_type, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
+        pull32(ppReadPackedMsg, &dlsch_pdu_rel8->resource_block_coding, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->modulation, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->redundancy_version, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_blocks, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_scheme, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_layers, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_subbands, end) &&
+        pullarray8(ppReadPackedMsg, dlsch_pdu_rel8->codebook_index, NFAPI_MAX_NUM_SUBBANDS, dlsch_pdu_rel8->number_of_subbands, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ue_category_capacity, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->pa, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->delta_power_offset_index, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ngap, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->nprb, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_mode, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_prb_per_subband, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_vector, end)))
+    return 0;
+
+  uint16_t j = 0;
+
+  for(j = 0; j < dlsch_pdu_rel8->num_bf_vector; ++j) {
+    if(!(pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].subband_index, end) &&
+         pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].num_antennas, end) &&
+         pullarray16(ppReadPackedMsg, dlsch_pdu_rel8->bf_vector[j].bf_value, NFAPI_MAX_NUM_ANTENNAS, dlsch_pdu_rel8->bf_vector[j].num_antennas, end)))
+      return 0;
+  }
+
+  return 1;
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel9_t *dlsch_pdu_rel9 = (nfapi_dl_config_dlsch_pdu_rel9_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel9->nscid, end) );
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel10_t *dlsch_pdu_rel10 = (nfapi_dl_config_dlsch_pdu_rel10_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_flag, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_resource_config_r10, end) &&
+           pull16(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
+           pullarray8(ppReadPackedMsg, dlsch_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel10->pdsch_start, end)) ;
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel11_t *dlsch_pdu_rel11 = (nfapi_dl_config_dlsch_pdu_rel11_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel11->drms_config_flag, end) &&
+           pull16(ppReadPackedMsg, &dlsch_pdu_rel11->drms_scrambling, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->csi_config_flag, end) &&
+           pull16(ppReadPackedMsg, &dlsch_pdu_rel11->csi_scrambling, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_flag, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_atenna_ports, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_freq_shift, end));
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel12_t *dlsch_pdu_rel12 = (nfapi_dl_config_dlsch_pdu_rel12_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel12->altcqi_table_r12, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel12->maxlayers, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel12->n_dl_harq, end));
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel13_t *dlsch_pdu_rel13 = (nfapi_dl_config_dlsch_pdu_rel13_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel13->dwpts_symbols, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->initial_lbt_sf, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->ue_type, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->pdsch_payload_type, end) &&
+           pull16(ppReadPackedMsg, &dlsch_pdu_rel13->initial_transmission_sf_io, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->drms_table_flag, end));
+}
+
+static uint8_t unpack_dl_config_pch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_pch_pdu_rel8_t *pch_pdu_rel8 = (nfapi_dl_config_pch_pdu_rel8_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &pch_pdu_rel8->length, end) &&
+           pull16(ppReadPackedMsg, (uint16_t *)&pch_pdu_rel8->pdu_index, end) &&
+           pull16(ppReadPackedMsg, &pch_pdu_rel8->p_rnti, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->resource_allocation_type, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
+           pull32(ppReadPackedMsg, &pch_pdu_rel8->resource_block_coding, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->mcs, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->redundancy_version, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_transport_blocks, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->transmission_scheme, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_layers, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->codebook_index, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->ue_category_capacity, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->pa, end) &&
+           pull16(ppReadPackedMsg, &pch_pdu_rel8->transmission_power, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->nprb, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->ngap, end));
+}
+static uint8_t unpack_dl_config_pch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_pch_pdu_rel13_t *pch_pdu_rel13 = (nfapi_dl_config_pch_pdu_rel13_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &pch_pdu_rel13->ue_mode, end) &&
+           pull16(ppReadPackedMsg, &pch_pdu_rel13->initial_transmission_sf_io, end));
+}
+
+static uint8_t unpack_dl_config_prs_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_prs_pdu_rel9_t *prs_pdu_rel9 = (nfapi_dl_config_prs_pdu_rel9_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &prs_pdu_rel9->transmission_power, end) &&
+           pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_bandwidth, end) &&
+           pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_cyclic_prefix_type, end) &&
+           pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_muting, end));
+}
+
+static uint8_t unpack_dl_config_csi_rs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_csi_rs_pdu_rel10_t *csi_rs_pdu_rel10 = (nfapi_dl_config_csi_rs_pdu_rel10_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_antenna_port_count_r10, end) &&
+           pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_resource_config_r10, end) &&
+           pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->transmission_power, end) &&
+           pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
+           pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end) &&
+           pullarray8(ppReadPackedMsg, csi_rs_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end));
+}
+
+static uint8_t unpack_dl_config_csi_rs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_csi_rs_pdu_rel13_t *csi_rs_pdu_rel13 = (nfapi_dl_config_csi_rs_pdu_rel13_t *)tlv;
+
+  if (!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->csi_rs_class, end) &&
+        pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->cdm_type, end) &&
+        pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->num_bf_vector, end)))
+    return 0;
+
+  uint16_t idx =0;
+
+  for(idx = 0; idx < csi_rs_pdu_rel13->num_bf_vector; ++idx) {
+    if(!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].csi_rs_resource_index, end)))
+      return 0;
+
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : HOW TO DECODE BF VALUE \n");
+    //pullarray16(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].bf_vector, ??);
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_dl_config_epdcch_params_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_epdcch_parameters_rel11_t *epdcch_params_rel11 = (nfapi_dl_config_epdcch_parameters_rel11_t *)tlv;
+  return (pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_resource_assignment_flag, end) &&
+          pull16(ppReadPackedMsg, &epdcch_params_rel11->epdcch_id, end) &&
+          pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_start_symbol, end) &&
+          pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_num_prb, end) &&
+          pullarray8(ppReadPackedMsg, epdcch_params_rel11->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, epdcch_params_rel11->epdcch_num_prb, end) &&
+          pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.subband_index, end) &&
+          pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.num_antennas, end) &&
+          pullarray16(ppReadPackedMsg, epdcch_params_rel11->bf_vector.bf_value, NFAPI_MAX_NUM_ANTENNAS, epdcch_params_rel11->bf_vector.num_antennas, end));
+}
+
+static uint8_t unpack_dl_config_epdcch_params_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_epdcch_parameters_rel13_t *epdcch_params_rel13 = (nfapi_dl_config_epdcch_parameters_rel13_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &epdcch_params_rel13->dwpts_symbols, end) &&
+           pull8(ppReadPackedMsg, &epdcch_params_rel13->initial_lbt_sf, end));
+}
+
+static uint8_t unpack_dl_config_mpdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_mpdcch_pdu_rel13_t *mpdcch_params_rel13 = (nfapi_dl_config_mpdcch_pdu_rel13_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_narrow_band, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_prb_pairs, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_assignment, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_tansmission_type, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->start_symbol, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->ecce_index, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->aggregation_level, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->rnti_type, end) &&
+           pull16(ppReadPackedMsg, &mpdcch_params_rel13->rnti, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->ce_mode, end) &&
+           pull16(ppReadPackedMsg, &mpdcch_params_rel13->drms_scrambling_init, end) &&
+           pull16(ppReadPackedMsg, &mpdcch_params_rel13->initial_transmission_sf_io, end) &&
+           pull16(ppReadPackedMsg, &mpdcch_params_rel13->transmission_power, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_format, end) &&
+           pull16(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_coding, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->mcs, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->pdsch_reptition_levels, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->redundancy_version, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->new_data_indicator, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_process, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi_length, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi_flag, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_resource_offset, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_subframe_repetition_number, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpc, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index_length, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->allocate_prach_flag, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->preamble_index, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->prach_mask_index, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->starting_ce_level, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->srs_request, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity_flag, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->frequency_hopping_enabled_flag, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->paging_direct_indication_differentiation_flag, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->direct_indication, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->total_dci_length_including_padding, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_tx_antenna_ports, end) &&
+           pullarray16(ppReadPackedMsg, mpdcch_params_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_params_rel13->number_of_tx_antenna_ports, end));
+}
+
+
+static uint8_t unpack_dl_config_nbch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_nbch_pdu_rel13_t *nbch_params_rel13 = (nfapi_dl_config_nbch_pdu_rel13_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &nbch_params_rel13->length, end) &&
+           pull16(ppReadPackedMsg, (uint16_t *)&nbch_params_rel13->pdu_index, end) &&
+           pull16(ppReadPackedMsg, &nbch_params_rel13->transmission_power, end) &&
+           pull16(ppReadPackedMsg, &nbch_params_rel13->hyper_sfn_2_lsbs, end));
+}
+
+static uint8_t unpack_dl_config_npdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_npdcch_pdu_rel13_t *npdcch_params_rel13 = (nfapi_dl_config_npdcch_pdu_rel13_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &npdcch_params_rel13->length, end) &&
+           pull16(ppReadPackedMsg, (uint16_t *)&npdcch_params_rel13->pdu_index, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->ncce_index, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->aggregation_level, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->start_symbol, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->rnti_type, end) &&
+           pull16(ppReadPackedMsg, &npdcch_params_rel13->rnti, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->scrambling_reinitialization_batch_index, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_format, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->scheduling_delay, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->resource_assignment, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->repetition_number, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->mcs, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->new_data_indicator, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->harq_ack_resource, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->npdcch_order_indication, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->starting_number_of_nprach_repetitions, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->subcarrier_indication_of_nprach, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->paging_direct_indication_differentation_flag, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->direct_indication, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_subframe_repetition_number, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->total_dci_length_including_padding, end));
+}
+
+static uint8_t unpack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_ndlsch_pdu_rel13_t *ndlsch_params_rel13 = (nfapi_dl_config_ndlsch_pdu_rel13_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &ndlsch_params_rel13->length, end) &&
+           pull16(ppReadPackedMsg, (uint16_t *)&ndlsch_params_rel13->pdu_index, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->start_symbol, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->rnti_type, end) &&
+           pull16(ppReadPackedMsg, &ndlsch_params_rel13->rnti, end) &&
+           pull16(ppReadPackedMsg, &ndlsch_params_rel13->resource_assignment, end) &&
+           pull16(ppReadPackedMsg, &ndlsch_params_rel13->repetition_number, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->modulation, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->number_of_subframes_for_resource_assignment, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->scrambling_sequence_initialization_cinit, end) &&
+           pull16(ppReadPackedMsg, &ndlsch_params_rel13->sf_idx, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end));
+}
+
+
+static uint8_t unpack_dl_tti_request_body_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
+  nfapi_nr_dl_tti_request_pdu_t *value = (nfapi_nr_dl_tti_request_pdu_t *)msg;
+
+  if(!(pull32(ppReadPackedMsg, &value->PDUSize, end) &&
+       pull16(ppReadPackedMsg, &value->PDUType, end) ))
+    return 0;
+
+  // first match the pdu type, then call the respective function
+  switch(value->PDUType) {
+    case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE: {
+      if(!(unpack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppReadPackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE: {
+      if(!(unpack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppReadPackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE: {
+      if(!(unpack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppReadPackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_SSB_PDU_TYPE: {
+      if(!(unpack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppReadPackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
+    }
+    break;
+  }
+
+  return 1;
+}
+
+
+
+
+static uint8_t unpack_dl_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_dl_config_request_body_t *value = (nfapi_dl_config_request_body_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->number_pdcch_ofdm_symbols, end) &&
+       pull8(ppReadPackedMsg, &value->number_dci, end) &&
+       pull16(ppReadPackedMsg, &value->number_pdu, end) &&
+       pull8(ppReadPackedMsg, &value->number_pdsch_rnti, end) &&
+       pull16(ppReadPackedMsg, &value->transmission_power_pcfich, end)))
+    return 0;
+
+  if(value->number_pdu > NFAPI_DL_CONFIG_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_pdu, NFAPI_DL_CONFIG_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_pdu) {
+    value->dl_config_pdu_list = (nfapi_dl_config_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_dl_config_request_pdu_t) * value->number_pdu, config);
+
+    if(value->dl_config_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate dl config pdu list (count:%d)\n", __FUNCTION__, value->number_pdu);
+      return 0;
+    }
+  } else {
+    value->dl_config_pdu_list = 0;
+  }
+
+  uint16_t i;
+  uint16_t total_number_of_pdus = value->number_pdu;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_dl_config_request_pdu_t *pdu = &(value->dl_config_pdu_list[i]);
+
+    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+      return 0;
+
+    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+    if(packedPduEnd > end) {
+      // pdu end of beyond buffer end
+      return 0;
+    }
+
+    switch(pdu->pdu_type) {
+      case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_BCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, &unpack_dl_config_bch_pdu_rel8_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_MCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, &unpack_dl_config_mch_pdu_rel8_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, &unpack_dl_config_dlsch_pdu_rel8_value},
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, &unpack_dl_config_dlsch_pdu_rel9_value},
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, &unpack_dl_config_dlsch_pdu_rel10_value},
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, &unpack_dl_config_dlsch_pdu_rel11_value},
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, &unpack_dl_config_dlsch_pdu_rel12_value},
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, &unpack_dl_config_dlsch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_PCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, &unpack_dl_config_pch_pdu_rel8_value},
+          { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, &unpack_dl_config_pch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_PRS_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, &unpack_dl_config_prs_pdu_rel9_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, &unpack_dl_config_csi_rs_pdu_rel10_value},
+          { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, &unpack_dl_config_csi_rs_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, &unpack_dl_config_epdcch_params_rel11_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, &unpack_dl_config_epdcch_params_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, &unpack_dl_config_mpdcch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NBCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, &unpack_dl_config_nbch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, &unpack_dl_config_npdcch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, &unpack_dl_config_ndlsch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      default:
+        // Need to log an error
+        break;
+    }
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_dl_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t *)msg;
+
+  if (!(pull16(ppReadPackedMsg,&pNfapiMsg->SFN, end) &&
+        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nGroup, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nPDUs, end) &&
+        pullarray8(ppReadPackedMsg,pNfapiMsg->dl_tti_request_body.nUe,256,pNfapiMsg->dl_tti_request_body.nGroup, end)
+        //pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
+       ))
+    return 0;
+
+  int arr[12];
+
+  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nGroup; i++) {
+    for(int j=0; j<pNfapiMsg->dl_tti_request_body.nUe[i]; j++) {
+      arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
+    }
+
+    if(!(pullarrays32(ppReadPackedMsg,arr,12,pNfapiMsg->dl_tti_request_body.nUe[i], end)))
+      return 0;
+  }
+
+  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nPDUs; i++) {
+    if(!unpack_dl_tti_request_body_value(ppReadPackedMsg, end, &pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i]))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_ul_tti_request_prach_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_prach_pdu_t *prach_pdu = (nfapi_nr_prach_pdu_t *)tlv;
+  return(
+          pull16(ppReadPackedMsg, &prach_pdu->phys_cell_id, end) &&
+          pull8(ppReadPackedMsg, &prach_pdu->num_prach_ocas, end) &&
+          pull8(ppReadPackedMsg, &prach_pdu->prach_format, end) &&
+          pull8(ppReadPackedMsg, &prach_pdu->num_ra, end) &&
+          pull8(ppReadPackedMsg, &prach_pdu->prach_start_symbol, end) &&
+          pull16(ppReadPackedMsg, &prach_pdu->num_cs, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+
+static uint8_t unpack_ul_tti_request_pucch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_pucch_pdu_t *pucch_pdu = (nfapi_nr_pucch_pdu_t *)tlv;
+  return(
+          pull16(ppReadPackedMsg, &pucch_pdu->rnti, end) &&
+          pull32(ppReadPackedMsg, &pucch_pdu->handle, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->bwp_size, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->bwp_start, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->subcarrier_spacing, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->cyclic_prefix, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->format_type, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->multi_slot_tx_indicator, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->prb_start, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->prb_size, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->start_symbol_index, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->nr_of_symbols, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->freq_hop_flag, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->second_hop_prb, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->group_hop_flag, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->sequence_hop_flag, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->hopping_id, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->initial_cyclic_shift, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->data_scrambling_id, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->time_domain_occ_idx, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_idx, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_len, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->add_dmrs_flag, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->dmrs_scrambling_id, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->dmrs_cyclic_shift, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->sr_flag, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->bit_len_harq, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part1, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part2, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+
+static uint8_t unpack_ul_tti_request_pusch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_pusch_pdu_t *pusch_pdu = (nfapi_nr_pusch_pdu_t *)tlv;
+
+  if (!(
+        pull16(ppReadPackedMsg, &pusch_pdu->pdu_bit_map, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->rnti, end) &&
+        pull32(ppReadPackedMsg, &pusch_pdu->handle, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->bwp_size, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->bwp_start, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->subcarrier_spacing, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->cyclic_prefix, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->target_code_rate,  end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->qam_mod_order,  end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->mcs_index,  end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->mcs_table, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->transform_precoding, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->data_scrambling_id, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->nrOfLayers, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_symb_pos, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->dmrs_config_type, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_scrambling_id, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->scid, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->num_dmrs_cdm_grps_no_data, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc,end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->rb_start, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->rb_size, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->vrb_to_prb_mapping, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->frequency_hopping, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->tx_direct_current_location, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->uplink_frequency_shift_7p5khz, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->start_symbol_index, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->nr_of_symbols, end)
+        // TODO: ignoring beamforming tlv for now
+      ))
+    return 0;
+
+  //Pack Optional Data only included if indicated in pduBitmap
+  switch(pusch_pdu->pdu_bit_map) {
+    case PUSCH_PDU_BITMAP_PUSCH_DATA: {
+      // pack optional TLVs
+      return(
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.rv_index, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.harq_process_id, end) &&
+              pull32(ppReadPackedMsg, &pusch_pdu->pusch_data.tb_size, end) &&
+              pull16(ppReadPackedMsg, &pusch_pdu->pusch_data.num_cb, end) &&
+              pullarray8(ppReadPackedMsg, pusch_pdu->pusch_data.cb_present_and_position,1,1,end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_PUSCH_UCI: {
+      return(
+              pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.harq_ack_bit_length, end) &&
+              pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part1_bit_length, end) &&
+              pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part2_bit_length, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.alpha_scaling, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_harq_ack, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi1, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi2, end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_PUSCH_PTRS: {
+      return(
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.num_ptrs_ports, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, end) &&
+              +               pull16(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, end) &&
+              +               pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_time_density, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_freq_density, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ul_ptrs_power, end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_DFTS_OFDM: {
+      return(
+              pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_group_number, end) &&
+              pull16(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_sequence_number, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, end)
+            );
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
+    }
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_ul_tti_request_srs_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_srs_pdu_t *srs_pdu = (nfapi_nr_srs_pdu_t *)tlv;
+  return(
+          pull16(ppReadPackedMsg, &srs_pdu->rnti, end) &&
+          pull32(ppReadPackedMsg, &srs_pdu->handle, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu->bwp_size, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu->bwp_start, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->subcarrier_spacing, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->cyclic_prefix, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->num_ant_ports, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->num_symbols,  end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->num_repetitions, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->time_start_position, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->config_index, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu->sequence_id, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->bandwidth_index, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->comb_size, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->comb_offset, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->cyclic_shift, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->frequency_position, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->frequency_shift, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->frequency_hopping, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->group_or_sequence_hopping, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->resource_type, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu->t_srs, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu->t_offset, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+
+static uint8_t unpack_ul_tti_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
+  nfapi_nr_ul_tti_request_number_of_pdus_t *pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_pdus_t *)msg;
+
+  if(!(pull16(ppReadPackedMsg, &pNfapiMsg->pdu_size, end) &&
+       pull16(ppReadPackedMsg, &pNfapiMsg->pdu_type, end) ))
+    return 0;
+
+  // first natch the pdu type, then call the respective function
+  switch(pNfapiMsg->pdu_type) {
+    case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE: {
+      if(!unpack_ul_tti_request_prach_pdu(&pNfapiMsg->prach_pdu, ppReadPackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: {
+      if(!unpack_ul_tti_request_pucch_pdu(&pNfapiMsg->pucch_pdu, ppReadPackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
+      if(!unpack_ul_tti_request_pusch_pdu(&pNfapiMsg->pusch_pdu, ppReadPackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE: {
+      if(!unpack_ul_tti_request_srs_pdu(&pNfapiMsg->srs_pdu, ppReadPackedMsg, end))
+        return 0;
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", pNfapiMsg->pdu_type );
+    }
+    break;
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_ul_tti_groups_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
+  nfapi_nr_ul_tti_request_number_of_groups_t *pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_groups_t *)msg;
+
+  if(!pull8(ppReadPackedMsg, &pNfapiMsg->n_ue, end))
+    return 0;
+
+  for (int i = 0; i < pNfapiMsg->n_ue; i++) {
+    if(!pull8(ppReadPackedMsg, &pNfapiMsg->ue_list[i].pdu_idx,end) )
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_ul_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t *)msg;
+
+  if (!(
+        pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
+        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->n_pdus, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->n_group, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->rach_present, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->n_ulcch, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->n_ulsch, end) ))
+    return 0;
+
+  for(int i=0; i< pNfapiMsg->n_pdus; i++) {
+    if (!unpack_ul_tti_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdus_list[i]))
+      return 0;
+  }
+
+  for(int i=0; i< pNfapiMsg->n_group; i++) {
+    if (!unpack_ul_tti_groups_list_value(ppReadPackedMsg, end, &pNfapiMsg->groups_list[i]))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+
+static uint8_t unpack_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, &unpack_dl_config_request_body_value},
+  };
+  return ( pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+           unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_ul_config_ulsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel8_t *ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t *)tlv;
+  return (pull32(ppReadPackedMsg, &ulsch_pdu_rel8->handle, end) &&
+          pull16(ppReadPackedMsg, &ulsch_pdu_rel8->size, end) &&
+          pull16(ppReadPackedMsg, &ulsch_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->resource_block_start, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->number_of_resource_blocks, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->modulation_type, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->cyclic_shift_2_for_drms, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_enabled_flag, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_bits, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->new_data_indication, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->redundancy_version, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->harq_process_number, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->ul_tx_mode, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->current_tx_nb, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->n_srs, end ));
+}
+
+static uint8_t unpack_ul_config_ulsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel10_t *ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &ulsch_pdu_rel10->resource_allocation_type, end) &&
+          pull32(ppReadPackedMsg, &ulsch_pdu_rel10->resource_block_coding, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transport_blocks, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transmission_scheme, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->number_of_layers, end) &
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->codebook_index, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->disable_sequence_hopping_flag, end));
+}
+static uint8_t unpack_ul_config_ulsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel11_t *ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &ulsch_pdu_rel11->virtual_cell_id_enabled_flag, end) &&
+           pull16(ppReadPackedMsg, &ulsch_pdu_rel11->npusch_identity, end) &&
+           pull8(ppReadPackedMsg, &ulsch_pdu_rel11->dmrs_config_flag, end) &&
+           pull16(ppReadPackedMsg, &ulsch_pdu_rel11->ndmrs_csh_identity, end));
+}
+static uint8_t unpack_ul_config_ulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel13_t *ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg,  &ulsch_pdu_rel13->ue_type, end) &&
+          pull16(ppReadPackedMsg, &ulsch_pdu_rel13->total_number_of_repetitions, end) &&
+          pull16(ppReadPackedMsg, &ulsch_pdu_rel13->repetition_number, end) &&
+          pull16(ppReadPackedMsg, &ulsch_pdu_rel13->initial_transmission_sf_io, end) &&
+          pull8(ppReadPackedMsg,  &ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, end));
+}
+static uint8_t unpack_ul_config_cqi_ri_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel8_t *cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t *)tlv;
+  return (pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, end) &&
+          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, end) &&
+          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->ri_size, end) &&
+          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_cqi, end) &&
+          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_ri, end));
+}
+
+static uint8_t unpack_ul_config_cqi_ri_info_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel9_t *cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->report_type, end) &&
+       pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_cqi, end) &&
+       pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_ri, end)))
+    return 0;
+
+  switch(cqi_ri_info_rel9->report_type) {
+    case NFAPI_CSI_REPORT_TYPE_PERIODIC: {
+      if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, end) &&
+           pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_CSI_REPORT_TYPE_APERIODIC: {
+      if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, end) ==0)
+        return 0;
+
+      uint8_t i;
+
+      for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i) {
+        if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, end) == 0)
+          return 0;
+
+        uint8_t j;
+
+        for(j = 0; j < 8; ++j) {
+          if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], end) == 0)
+            return 0;
+        }
+      }
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
+      return 0;
+    }
+    break;
+  };
+
+  return 1;
+}
+
+// NOTE : This function is a little unconventional as we uese the side to
+// determine the report type
+static uint8_t unpack_ul_config_cqi_ri_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel13_t *cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t *)tlv;
+
+  if(cqi_ri_info_rel13->tl.length == 0) {
+    cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_APERIODIC;
+  } else {
+    cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_PERIODIC;
+
+    if(pull16(ppReadPackedMsg, &cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, end) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+static uint8_t unpack_ul_config_cqi_init_tx_params_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_initial_transmission_parameters_rel8_t *init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t *)tlv;
+  return (pull8(ppReadPackedMsg, &init_tx_params_rel8->n_srs_initial, end) &&
+          pull8(ppReadPackedMsg, &init_tx_params_rel8->initial_number_of_resource_blocks, end));
+}
+static uint8_t unpack_ul_config_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_harq_information_rel10_t *harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &harq_info_rel10->harq_size, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel10->delta_offset_harq, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel10->ack_nack_mode, end));
+}
+
+static uint8_t unpack_ul_config_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t *)tlv;
+  return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel13->delta_offset_harq_2, end));
+}
+
+static uint8_t unpack_ul_config_ue_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel8_t *ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t *)tlv;
+  return (pull32(ppReadPackedMsg, &ue_info_rel8->handle, end) &&
+          pull16(ppReadPackedMsg, (uint16_t *)&ue_info_rel8->rnti, end));
+}
+static uint8_t unpack_ul_config_ue_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel11_t *ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t *)tlv;
+  return (pull8(ppReadPackedMsg, &ue_info_rel11->virtual_cell_id_enabled_flag, end) &&
+          pull16(ppReadPackedMsg, &ue_info_rel11->npusch_identity, end));
+}
+static uint8_t unpack_ul_config_ue_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel13_t *ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &ue_info_rel13->ue_type, end) &&
+          pull8(ppReadPackedMsg, &ue_info_rel13->empty_symbols, end) &&
+          pull16(ppReadPackedMsg, &ue_info_rel13->total_number_of_repetitions, end) &&
+          pull16(ppReadPackedMsg, &ue_info_rel13->repetition_number, end));
+}
+
+static uint8_t unpack_ul_config_cqi_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel8_t *cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &cqi_info_rel8->pucch_index, end) &&
+           pull8(ppReadPackedMsg, &cqi_info_rel8->dl_cqi_pmi_size, end));
+}
+static uint8_t unpack_ul_config_cqi_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel10_t *cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &cqi_info_rel10->number_of_pucch_resource, end) &&
+          pull16(ppReadPackedMsg, &cqi_info_rel10->pucch_index_p1, end));
+}
+static uint8_t unpack_ul_config_cqi_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel13_t *cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &cqi_info_rel13->csi_mode, end) &&
+          pull16(ppReadPackedMsg, &cqi_info_rel13->dl_cqi_pmi_size_2, end) &&
+          pull8(ppReadPackedMsg, &cqi_info_rel13->starting_prb, end) &&
+          pull8(ppReadPackedMsg, &cqi_info_rel13->n_prb, end) &&
+          pull8(ppReadPackedMsg, &cqi_info_rel13->cdm_index, end) &&
+          pull8(ppReadPackedMsg, &cqi_info_rel13->n_srs, end));
+}
+
+static uint8_t unpack_ul_config_sr_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_sr_information_rel8_t *sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &sr_info_rel8->pucch_index, end));
+}
+
+static uint8_t unpack_ul_config_sr_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_sr_information_rel10_t *sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &sr_info_rel10->number_of_pucch_resources, end) &&
+          pull16(ppReadPackedMsg, &sr_info_rel10->pucch_index_p1, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel10_tdd_t *harq_info_tdd_rel10 = (nfapi_ul_config_harq_information_rel10_tdd_t *)tlv;
+  return (pull8(ppReadPackedMsg, &harq_info_tdd_rel10->harq_size, end) &&
+          pull8(ppReadPackedMsg, &harq_info_tdd_rel10->ack_nack_mode, end) &&
+          pull8(ppReadPackedMsg, &harq_info_tdd_rel10->number_of_pucch_resources, end) &&
+          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_0, end) &&
+          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_1, end) &&
+          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_2, end) &&
+          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_3, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel8_fdd_t *harq_info_fdd_rel8 = (nfapi_ul_config_harq_information_rel8_fdd_t *)tlv;
+  return (pull16(ppReadPackedMsg, &harq_info_fdd_rel8->n_pucch_1_0, end) &&
+          pull8(ppReadPackedMsg, &harq_info_fdd_rel8->harq_size, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel9_fdd_t *harq_info_fdd_rel9 = (nfapi_ul_config_harq_information_rel9_fdd_t *)tlv;
+  return (pull8(ppReadPackedMsg, &harq_info_fdd_rel9->harq_size, end) &&
+          pull8(ppReadPackedMsg, &harq_info_fdd_rel9->ack_nack_mode, end) &&
+          pull8(ppReadPackedMsg, &harq_info_fdd_rel9->number_of_pucch_resources, end) &&
+          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_0, end) &&
+          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_1, end) &&
+          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_2, end) &&
+          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_3, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel11_t *harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t *)tlv;
+  return (pull8(ppReadPackedMsg, &harq_info_rel11->num_ant_ports, end) &&
+          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_0, end) &&
+          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_1, end) &&
+          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_2, end) &&
+          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_3, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t *)tlv;
+  return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel13->starting_prb, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel13->n_prb, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel13->cdm_index, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel13->n_srs, end));
+}
+
+
+static uint8_t unpack_ul_config_srs_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel8_t *srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t *)tlv;
+  return (pull32(ppReadPackedMsg, &srs_pdu_rel8->handle, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu_rel8->size, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_bandwidth, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu_rel8->frequency_domain_position, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_hopping_bandwidth, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu_rel8->transmission_comb, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu_rel8->i_srs, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu_rel8->sounding_reference_cyclic_shift, end));
+}
+
+static uint8_t unpack_ul_config_srs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel10_t *srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t *)tlv;
+  return pull8(ppReadPackedMsg, &srs_pdu_rel10->antenna_port, end);
+}
+
+static uint8_t unpack_ul_config_srs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel13_t *srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &srs_pdu_rel13->number_of_combs, end));
+}
+
+static uint8_t unpack_ul_nb_harq_info_rel13_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_nb_harq_information_rel13_fdd_t *nb_harq_info_fdd_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t *)tlv;
+  return (pull8(ppReadPackedMsg, &nb_harq_info_fdd_rel13->harq_ack_resource, end));
+}
+
+static uint8_t unpack_ul_config_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_nulsch_pdu_rel13_t *nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &nulsch_pdu_rel13->nulsch_format, end) &&
+       pull32(ppReadPackedMsg, &nulsch_pdu_rel13->handle, end) &&
+       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->size, end) &&
+       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->rnti, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->subcarrier_indication, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->resource_assignment, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->mcs, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->redudancy_version, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->repetition_number, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->new_data_indication, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->n_srs, end) &&
+       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, end) &&
+       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->sf_idx, end)))
+    return 0;
+
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value},
+    { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value},
+    { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
+    { NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, &unpack_ul_nb_harq_info_rel13_fdd_value},
+  };
+  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, 0, 0);
+}
+
+static uint8_t unpack_ul_config_nrach_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_nrach_pdu_rel13_t *nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_0, end) &&
+          pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_1, end) &&
+          pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_2, end));
+}
+
+
+static uint8_t unpack_ul_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+#define UL_CONFIG_ULSCH_PDU_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &_pdu.ulsch_pdu_rel8, &unpack_ul_config_ulsch_pdu_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &_pdu.ulsch_pdu_rel10, &unpack_ul_config_ulsch_pdu_rel10_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &_pdu.ulsch_pdu_rel11, &unpack_ul_config_ulsch_pdu_rel11_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &_pdu.ulsch_pdu_rel13, &unpack_ul_config_ulsch_pdu_rel13_value},
+#define UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &_pdu.cqi_ri_information_rel8, &unpack_ul_config_cqi_ri_info_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &_pdu.cqi_ri_information_rel9, &unpack_ul_config_cqi_ri_info_rel9_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &_pdu.cqi_ri_information_rel13, &unpack_ul_config_cqi_ri_info_rel13_value},
+#define UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &_pdu.harq_information_rel10, &unpack_ul_config_ulsch_harq_info_rel10_value},\
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_ulsch_harq_info_rel13_value},
+#define UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &_pdu.initial_transmission_parameters_rel8, &unpack_ul_config_cqi_init_tx_params_rel8_value},
+#define UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &_pdu.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &_pdu.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &_pdu.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
+#define UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &_pdu.cqi_information_rel8, &unpack_ul_config_cqi_info_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &_pdu.cqi_information_rel10, &unpack_ul_config_cqi_info_rel10_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &_pdu.cqi_information_rel13, &unpack_ul_config_cqi_info_rel13_value},
+#define UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &_pdu.sr_information_rel8, &unpack_ul_config_sr_info_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &_pdu.sr_information_rel10, &unpack_ul_config_sr_info_rel10_value},
+#define UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &_pdu.harq_information_rel10_tdd, &unpack_ul_config_harq_info_rel10_tdd_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &_pdu.harq_information_rel8_fdd, &unpack_ul_config_harq_info_rel8_fdd_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &_pdu.harq_information_rel9_fdd, &unpack_ul_config_harq_info_rel9_fdd_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &_pdu.harq_information_rel11, &unpack_ul_config_harq_info_rel11_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_harq_info_rel13_value},
+#define UL_CONFIG_SRS_PDU_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &_pdu.srs_pdu_rel8, &unpack_ul_config_srs_pdu_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &_pdu.srs_pdu_rel10, &unpack_ul_config_srs_pdu_rel10_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &_pdu.srs_pdu_rel13, &unpack_ul_config_srs_pdu_rel13_value},
+#define UL_CONFIG_NULSCH_PDU_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &_pdu.nulsch_pdu_rel13, &unpack_ul_config_nulsch_pdu_rel13_value},
+#define UL_CONFIG_NRACH_PDU_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &_pdu.nrach_pdu_rel13, &unpack_ul_config_nrach_pdu_rel13_value},
+  nfapi_ul_config_request_body_t *value = (nfapi_ul_config_request_body_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->number_of_pdus, end) &&
+       pull8(ppReadPackedMsg, &value->rach_prach_frequency_resources, end) &&
+       pull8(ppReadPackedMsg, &value->srs_present, end)))
+    return 0;
+
+  if(value->number_of_pdus > NFAPI_UL_CONFIG_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of ul config pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_UL_CONFIG_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_pdus > 0) {
+    value->ul_config_pdu_list = (nfapi_ul_config_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_ul_config_request_pdu_t) * value->number_of_pdus, config);
+
+    if(value->ul_config_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate ul config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+      return 0;
+    }
+  } else {
+    value->ul_config_pdu_list = 0;
+  }
+
+  uint16_t i;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_ul_config_request_pdu_t *pdu = &(value->ul_config_pdu_list[i]);
+
+    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+      return 0;
+
+    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+    if(packedPduEnd > end) {
+      // pdu end is past buffer end
+      return 0;
+    }
+
+    switch(pdu->pdu_type) {
+      case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_pdu)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.ulsch_pdu)
+          UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.cqi_ri_information)
+          UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_harq_pdu.ulsch_pdu)
+          UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_harq_pdu.harq_information)
+          UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_harq_pdu.initial_transmission_parameters)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu)
+          UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information)
+          UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.harq_information)
+          UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.ue_information)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.cqi_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_pdu.ue_information)
+          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_pdu.sr_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_harq_pdu.ue_information)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.ue_information)
+          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.sr_information)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.ue_information)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.cqi_information)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.ue_information)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.cqi_information)
+          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.sr_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.ue_information)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.cqi_information)
+          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.sr_information)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_SRS_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_SRS_PDU_UNPACK_FNS(pdu->srs_pdu)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->harq_buffer_pdu.ue_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.ulsch_pdu)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.csi_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.ulsch_pdu)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.csi_information)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_NULSCH_PDU_UNPACK_FNS(pdu->nulsch_pdu)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_NRACH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_NRACH_PDU_UNPACK_FNS(pdu->nrach_pdu)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+    }
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_ul_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, &unpack_ul_config_request_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_hi_dci0_hi_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_hi_pdu_rel8_t *hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t *)tlv;
+  return( pull8(ppReadPackedMsg, &hi_pdu_rel8->resource_block_start, end) &&
+          pull8(ppReadPackedMsg, &hi_pdu_rel8->cyclic_shift_2_for_drms, end) &&
+          pull8(ppReadPackedMsg, &hi_pdu_rel8->hi_value, end) &&
+          pull8(ppReadPackedMsg, &hi_pdu_rel8->i_phich, end) &&
+          pull16(ppReadPackedMsg, &hi_pdu_rel8->transmission_power, end));
+}
+
+static uint8_t unpack_hi_dci0_hi_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_hi_pdu_rel10_t *hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &hi_pdu_rel10->flag_tb2, end) &&
+          pull8(ppReadPackedMsg, &hi_pdu_rel10->hi_value_2, end));
+}
+
+static uint8_t unpack_hi_dci0_dci_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel8_t *dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_pdu_rel8->dci_format, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->cce_index, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->aggregation_level, end) &&
+          pull16(ppReadPackedMsg, &dci_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->resource_block_start, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->number_of_resource_block, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->mcs_1, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->cyclic_shift_2_for_drms, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_enabled_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_bits, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->new_data_indication_1, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->ue_tx_antenna_seleciton, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->tpc, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->cqi_csi_request, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->ul_index, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->dl_assignment_index, end) &&
+          pull32(ppReadPackedMsg, &dci_pdu_rel8->tpc_bitmap, end) &&
+          pull16(ppReadPackedMsg, &dci_pdu_rel8->transmission_power, end));
+}
+
+static uint8_t unpack_hi_dci0_dci_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel10_t *dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_pdu_rel10->cross_carrier_scheduling_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->carrier_indicator, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->size_of_cqi_csi_feild, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_request, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_type, end) &&
+          pull32(ppReadPackedMsg, &dci_pdu_rel10->resource_block_coding, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->mcs_2, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->new_data_indication_2, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->number_of_antenna_ports, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->tpmi, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->total_dci_length_including_padding, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->n_ul_rb, end));
+}
+
+static uint8_t unpack_hi_dci0_dci_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel12_t *dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dci_pdu_rel12->pscch_resource, end) &&
+           pull8(ppReadPackedMsg, &dci_pdu_rel12->time_resource_pattern, end));
+}
+
+static uint8_t unpack_hi_dci0_mpdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *value = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->mpdcch_narrowband, end) &&
+          pull8(ppReadPackedMsg, &value->number_of_prb_pairs, end) &&
+          pull8(ppReadPackedMsg, &value->resource_block_assignment, end) &&
+          pull8(ppReadPackedMsg, &value->mpdcch_transmission_type, end) &&
+          pull8(ppReadPackedMsg, &value->start_symbol, end) &&
+          pull8(ppReadPackedMsg, &value->ecce_index, end) &&
+          pull8(ppReadPackedMsg, &value->aggreagation_level, end) &&
+          pull8(ppReadPackedMsg, &value->rnti_type, end) &&
+          pull16(ppReadPackedMsg, &value->rnti, end) &&
+          pull8(ppReadPackedMsg, &value->ce_mode, end) &&
+          pull16(ppReadPackedMsg, &value->drms_scrambling_init, end) &&
+          pull16(ppReadPackedMsg, &value->initial_transmission_sf_io, end) &&
+          pull16(ppReadPackedMsg, &value->transmission_power, end) &&
+          pull8(ppReadPackedMsg, &value->dci_format, end) &&
+          pull8(ppReadPackedMsg, &value->resource_block_start, end) &&
+          pull8(ppReadPackedMsg, &value->number_of_resource_blocks, end) &&
+          pull8(ppReadPackedMsg, &value->mcs, end) &&
+          pull8(ppReadPackedMsg, &value->pusch_repetition_levels, end) &&
+          pull8(ppReadPackedMsg, &value->frequency_hopping_flag, end) &&
+          pull8(ppReadPackedMsg, &value->new_data_indication, end) &&
+          pull8(ppReadPackedMsg, &value->harq_process, end) &&
+          pull8(ppReadPackedMsg, &value->redudency_version, end) &&
+          pull8(ppReadPackedMsg, &value->tpc, end) &&
+          pull8(ppReadPackedMsg, &value->csi_request, end) &&
+          pull8(ppReadPackedMsg, &value->ul_inex, end) &&
+          pull8(ppReadPackedMsg, &value->dai_presence_flag, end) &&
+          pull8(ppReadPackedMsg, &value->dl_assignment_index, end) &&
+          pull8(ppReadPackedMsg, &value->srs_request, end) &&
+          pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end) &&
+          pull32(ppReadPackedMsg, &value->tcp_bitmap, end) &&
+          pull8(ppReadPackedMsg, &value->total_dci_length_include_padding, end) &&
+          pull8(ppReadPackedMsg, &value->number_of_tx_antenna_ports, end) &&
+          pullarray16(ppReadPackedMsg, value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, end));
+}
+
+static uint8_t unpack_hi_dci0_npdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *value = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->ncce_index, end) &&
+          pull8(ppReadPackedMsg, &value->aggregation_level, end) &&
+          pull8(ppReadPackedMsg, &value->start_symbol, end) &&
+          pull16(ppReadPackedMsg, &value->rnti, end) &&
+          pull8(ppReadPackedMsg, &value->scrambling_reinitialization_batch_index, end) &&
+          pull8(ppReadPackedMsg, &value->nrs_antenna_ports_assumed_by_the_ue, end) &&
+          pull8(ppReadPackedMsg, &value->subcarrier_indication, end) &&
+          pull8(ppReadPackedMsg, &value->resource_assignment, end) &&
+          pull8(ppReadPackedMsg, &value->scheduling_delay, end) &&
+          pull8(ppReadPackedMsg, &value->mcs, end) &&
+          pull8(ppReadPackedMsg, &value->redudancy_version, end) &&
+          pull8(ppReadPackedMsg, &value->repetition_number, end) &&
+          pull8(ppReadPackedMsg, &value->new_data_indicator, end) &&
+          pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end));
+}
+
+static uint8_t unpack_hi_dci0_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_hi_dci0_request_body_t *value = (nfapi_hi_dci0_request_body_t *)tlv;
+
+  if(!(pull16(ppReadPackedMsg, &value->sfnsf, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_dci, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_hi, end)))
+    return 0;
+
+  uint8_t totalNumPdus = value->number_of_hi + value->number_of_dci;
+
+  if(totalNumPdus > NFAPI_HI_DCI0_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dci0 pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, totalNumPdus, NFAPI_HI_DCI0_MAX_PDU);
+    return 0;
+  }
+
+  if(totalNumPdus > 0) {
+    value->hi_dci0_pdu_list = (nfapi_hi_dci0_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_hi_dci0_request_pdu_t) * totalNumPdus, config);
+
+    if(value->hi_dci0_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate hi dci0 pdu list (count:%d)\n", __FUNCTION__, totalNumPdus);
+      return 0;
+    }
+  } else {
+    value->hi_dci0_pdu_list = 0;
+  }
+
+  uint8_t i;
+
+  for(i = 0; i < totalNumPdus; ++i) {
+    nfapi_hi_dci0_request_pdu_t *pdu = &(value->hi_dci0_pdu_list[i]);
+
+    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+      return 0;
+
+    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+    if(packedPduEnd > end) {
+      // pdu end if past buffer end
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s pdu size to big %d %d\n", __FUNCTION__, packedPduEnd, end);
+      return 0;
+    }
+
+    switch(pdu->pdu_type) {
+      case NFAPI_HI_DCI0_HI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, &unpack_hi_dci0_hi_pdu_rel8_value},
+          { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, &unpack_hi_dci0_hi_pdu_rel10_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_HI_DCI0_DCI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
+          { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
+          { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, &unpack_hi_dci0_dci_pdu_rel12_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
+          { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
+          { NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, &unpack_dl_config_epdcch_params_rel11_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, &unpack_hi_dci0_mpdcch_dci_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, &unpack_hi_dci0_npdcch_dci_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+  }
+
+  return 1;
+}
+//unpack_ul_dci_pdu_list_value
+
+static uint8_t unpack_ul_dci_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
+{
+	nfapi_nr_ul_dci_request_pdus_t* value = (nfapi_nr_ul_dci_request_pdus_t*)msg;
+	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+	{
+		if(!(pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI,  end) &&
+		pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, end) &&
+
+		pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, end) &&
+		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, end) &&
+		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, end) &&
+		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, end) &&
+
+		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, end) &&
+		pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end) &&
+		
+		pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end)))
+	
+		return 0;
+	}
+
+	return (pull16(ppReadPackedMsg, &value->PDUType, end) &&
+	   	    pull16(ppReadPackedMsg, &value->PDUSize, end) &&
+			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, end) &&
+			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, end) &&
+
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, end) &&
+			pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, end) &&
+
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, end) &&
+			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.precoderGranularity, end) &&
+			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.numDlDci, end));
+		  
+}
+
+static uint8_t unpack_ul_dci_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t *)msg;
+
+  if (!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
+        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->numPdus, end)
+       ))
+    return 0;
+
+  for(int i=0; i< pNfapiMsg->numPdus; i++) {
+    if (!unpack_ul_dci_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->ul_dci_pdu_list[i]))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_hi_dci0_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, &unpack_hi_dci0_request_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+static uint8_t unpack_tx_data_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
+  nfapi_nr_pdu_t *pNfapiMsg = (nfapi_nr_pdu_t *)msg;
+
+  if(!(pull32(ppReadPackedMsg, &pNfapiMsg->num_TLV, end) &&
+       pull16(ppReadPackedMsg, &pNfapiMsg->PDU_index, end) &&
+       pull16(ppReadPackedMsg, &pNfapiMsg->PDU_length, end)
+      ))
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_tlvs = pNfapiMsg->num_TLV;
+
+  for(; i < total_number_of_tlvs; ++i) {
+    if (!(pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].length, end) &&
+          pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].tag, end)))
+      return 0;
+
+    switch(pNfapiMsg->TLVs[i].tag) {
+      case 0: {
+        if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.direct, 16384, pNfapiMsg->TLVs[i].length, end))
+          return 0;
+
+        break;
+      }
+
+      case 1: {
+        if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.ptr, pNfapiMsg->TLVs[i].length, pNfapiMsg->TLVs[i].length, end))
+          return 0;
+
+        break;
+      }
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", pNfapiMsg->TLVs[i].tag );
+        break;
+      }
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_tx_data_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t *)msg;
+
+  if(!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
+       pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+       pull16(ppReadPackedMsg, &pNfapiMsg->Number_of_PDUs, end)))
+    return 0;
+
+  for(int i=0; i< pNfapiMsg->Number_of_PDUs; i++) {
+    if (!unpack_tx_data_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdu_list[i]))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  uint8_t proceed = 1;
+  nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t *)msg;
+
+  if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
+    return 0;
+
+  while (((uint8_t *)(*ppReadPackedMsg) < end) && proceed) {
+    nfapi_tl_t generic_tl;
+
+    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+      return 0;
+
+    switch(generic_tl.tag) {
+      case NFAPI_TX_REQUEST_BODY_TAG: {
+        pNfapiMsg->tx_request_body.tl = generic_tl;
+
+        if( pull16(ppReadPackedMsg, &pNfapiMsg->tx_request_body.number_of_pdus, end) == 0)
+          return 0;
+
+        if(pNfapiMsg->tx_request_body.number_of_pdus > NFAPI_TX_MAX_PDU) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of tx pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus, NFAPI_TX_MAX_PDU);
+          return 0;
+        }
+
+        if(pNfapiMsg->tx_request_body.number_of_pdus > 0) {
+          pNfapiMsg->tx_request_body.tx_pdu_list = (nfapi_tx_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_tx_request_pdu_t) * pNfapiMsg->tx_request_body.number_of_pdus, config);
+
+          if(pNfapiMsg->tx_request_body.tx_pdu_list == NULL) {
+            NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate tx  pdu list (count:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus);
+            return 0;
+          }
+        } else {
+          pNfapiMsg->tx_request_body.tx_pdu_list = 0;
+        }
+
+        uint16_t i;
+        uint16_t totalNumPdus = pNfapiMsg->tx_request_body.number_of_pdus;
+
+        for(i = 0; i < totalNumPdus; ++i) {
+          nfapi_tx_request_pdu_t *pdu = &(pNfapiMsg->tx_request_body.tx_pdu_list[i]);
+
+          if (pdu) {
+            uint16_t length = 0;
+            uint16_t index = 0;
+
+            if(!(pull16(ppReadPackedMsg, &length, end) &&
+                 pull16(ppReadPackedMsg, &index, end)))
+              return 0;
+
+            pdu->pdu_length = length;
+            pdu->pdu_index = index;
+            // TODO : May need to rethink this bit
+            pdu->num_segments = 1;
+            pdu->segments[0].segment_length = pdu->pdu_length;
+            pdu->segments[0].segment_data = nfapi_p7_allocate(pdu->pdu_length, config);
+
+            if(pdu->segments[0].segment_data) {
+              if(!pullarray8(ppReadPackedMsg, pdu->segments[0].segment_data, pdu->segments[0].segment_length, pdu->segments[0].segment_length, end))
+                return 0;
+
+              if (pdu->segments[0].segment_length == 3) {
+                NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__,
+                            pdu->segments[0].segment_data[0],
+                            pdu->segments[0].segment_data[1],
+                            pdu->segments[0].segment_data[2]
+                           );
+              }
+            } else {
+              NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request: Failed to allocate pdu (len:%d) %d/%d %d\n", pdu->pdu_length, totalNumPdus, i, pdu->pdu_index);
+            }
+          } else {
+            NFAPI_TRACE(NFAPI_TRACE_ERROR, "NULL pdu\n");
+          }
+        }
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request FIXME : Invalid pdu type %d \n", generic_tl.tag );
+      }
+      break;
+    };
+  }
+
+  return 1;
+}
+
+//UNPACK NR UPLINK INDICATION FUNCTIONS 
+
+//SLOT INDICATION
+
+static uint8_t unpack_nr_slot_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_slot_indication_scf_t *msg, nfapi_p7_codec_config_t* config)
+{	
+	nfapi_nr_slot_indication_scf_t *pNfapiMsg = (nfapi_nr_slot_indication_scf_t*)msg;
+	
+	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end)
+		))
+			return 0;
+
+return 1;
+}
+
+//RX DATA INDICATION 
+
+static uint8_t unpack_nr_rx_data_indication_body(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+	nfapi_nr_rx_data_pdu_t* value = (nfapi_nr_rx_data_pdu_t*)tlv;
+
+	if(!(pull32(ppReadPackedMsg, &value->handle, end) &&
+	 	 pull16(ppReadPackedMsg, &value->rnti, end) &&
+		 pull8(ppReadPackedMsg, &value->harq_id, end) &&
+		 pull16(ppReadPackedMsg, &value->pdu_length, end) &&
+		 pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+		 pull16(ppReadPackedMsg, &value->timing_advance, end) && 
+		 pull16(ppReadPackedMsg, &value->rssi, end) 
+		 ))
+		  return 0;
+	return 1;
+}
+
+
+static uint8_t unpack_nr_rx_data_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_rx_data_indication_t *msg, nfapi_p7_codec_config_t* config)
+{	
+	nfapi_nr_rx_data_indication_t *pNfapiMsg = (nfapi_nr_rx_data_indication_t*)msg;
+	
+	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->number_of_pdus, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)	
+	{
+		if(!unpack_nr_rx_data_indication_body(pNfapiMsg->pdu_list, ppReadPackedMsg, end))
+		return 0;
+	}
+
+return 1;
+}
+
+//NR CRC INDICATION
+
+static uint8_t unpack_nr_crc_indication_body(nfapi_nr_crc_t* value, uint8_t **ppReadPackedMsg, uint8_t *end)
+{	
+	if(!(pull32(ppReadPackedMsg, &value->handle, end) &&
+	 	 pull16(ppReadPackedMsg, &value->rnti, end) &&
+		 pull8(ppReadPackedMsg, &value->harq_id, end) &&
+		 pull8(ppReadPackedMsg, &value->tb_crc_status, end) &&
+		 pull16(ppReadPackedMsg, &value->num_cb, end) &&
+		 //pullarray8(ppReadPackedMsg, value->cb_crc_status, (int)(value->num_cb / 8) + 1, (int)(value->num_cb / 8) + 1, end) && //length is ceil(NumCb/8)
+		 pull8(ppReadPackedMsg, &value->ul_cqi, end) && 
+		 pull16(ppReadPackedMsg, &value->timing_advance, end) &&
+		 pull16(ppReadPackedMsg, &value->rssi, end)
+		 ))
+		  return 0;
+
+	//memcpy((nfapi_nr_crc_t *)tlv,value,sizeof(nfapi_nr_crc_t));
+
+	return 1;
+}
+
+static uint8_t unpack_nr_crc_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_crc_indication_t *msg, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_crc_indication_t *pNfapiMsg = (nfapi_nr_crc_indication_t *) msg;
+	// pNfapiMsg = (nfapi_nr_crc_indication_t *) malloc(sizeof(nfapi_nr_crc_indication_t));
+	// pNfapiMsg->crc_list = (nfapi_nr_crc_t *) malloc(sizeof(nfapi_nr_crc_t));
+	
+	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn, end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->slot, end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->number_crcs, end)
+		))
+		return 0;
+
+	for(int i=0; i<pNfapiMsg->number_crcs;i++)	
+	{
+		if(!unpack_nr_crc_indication_body(pNfapiMsg->crc_list,ppReadPackedMsg,end))
+		//if(!unpack_nr_crc_indication_body(value,ppReadPackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//SRS INDICATION
+
+static uint8_t unpack_nr_srs_indication_body(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+	nfapi_nr_srs_indication_pdu_t* value = (nfapi_nr_srs_indication_pdu_t*)tlv;
+
+	if(!(pull32(ppReadPackedMsg, &value->handle, end) &&
+	 	 pull16(ppReadPackedMsg, &value->rnti, end) &&
+		 pull16(ppReadPackedMsg, &value->timing_advance, end) &&
+		 pull8(ppReadPackedMsg, &value->num_symbols, end) &&
+		 pull8(ppReadPackedMsg, &value->wide_band_snr, end) &&
+		 pull8(ppReadPackedMsg, &value->num_reported_symbols, end) && 
+		 pull16(ppReadPackedMsg, &value->reported_symbol_list->num_rbs, end)
+		 ))
+		  return 0;
+	for(int i = 0; i < value->reported_symbol_list->num_rbs; i++)
+	{
+		if(!(pull8(ppReadPackedMsg, &value->reported_symbol_list->rb_list->rb_snr, end)
+			))
+			return 0;
+	}
+	return 1;
+}
+
+static uint8_t unpack_nr_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_srs_indication_t *pNfapiMsg = (nfapi_nr_srs_indication_t*)msg;
+
+	if (!(pull16(ppReadPackedMsg,&pNfapiMsg->sfn , end) &&
+		pull16(ppReadPackedMsg,&pNfapiMsg->slot , end) &&
+		pull8(ppReadPackedMsg,&pNfapiMsg->number_of_pdus, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)	
+	{
+		if(!unpack_nr_srs_indication_body(&pNfapiMsg->pdu_list,ppReadPackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//NR RACH
+
+static uint8_t unpack_nr_rach_indication_body(nfapi_nr_prach_indication_pdu_t* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+	nfapi_nr_prach_indication_pdu_t* value = (nfapi_nr_prach_indication_pdu_t*)tlv;
+
+	if(!(pull16(ppReadPackedMsg, &value->phy_cell_id, end) &&
+	 	 pull8(ppReadPackedMsg, &value->symbol_index, end) &&
+		 pull8(ppReadPackedMsg, &value->slot_index, end) &&
+		 pull8(ppReadPackedMsg, &value->freq_index, end) &&
+		 pull8(ppReadPackedMsg, &value->avg_rssi, end) &&
+		 pull8(ppReadPackedMsg, &value->avg_snr, end) && 
+		 pull8(ppReadPackedMsg, &value->num_preamble, end)
+		 ))
+		  return 0;
+	value->preamble_list = (nfapi_nr_prach_indication_preamble_t*) malloc(sizeof(nfapi_nr_prach_indication_preamble_t) * value->num_preamble);
+	for(int i = 0; i < value->num_preamble; i++)
+	{
+		if(!(pull8(ppReadPackedMsg, &value->preamble_list->preamble_index, end) &&
+			pull16(ppReadPackedMsg, &value->preamble_list->timing_advance, end) &&
+			pull32(ppReadPackedMsg, &value->preamble_list->preamble_pwr, end)
+			))
+			return 0;
+	}
+	return 1;
+}
+
+static uint8_t unpack_nr_rach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_rach_indication_t* msg, nfapi_p7_codec_config_t* config) {
+
+	nfapi_nr_rach_indication_t *pNfapiMsg = (nfapi_nr_rach_indication_t*)msg;
+	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
+		pull8(ppReadPackedMsg, &pNfapiMsg->number_of_pdus, end)
+		))
+			return 0;
+	pNfapiMsg->pdu_list = (nfapi_nr_prach_indication_pdu_t*) malloc(sizeof(nfapi_nr_prach_indication_pdu_t) * pNfapiMsg->number_of_pdus);
+	for(int i=0; i< pNfapiMsg->number_of_pdus;i++)	
+	{
+		if(!unpack_nr_rach_indication_body(pNfapiMsg->pdu_list,ppReadPackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//NR UCI 
+
+static uint8_t unpack_nr_uci_pucch_0_1(nfapi_nr_uci_pucch_pdu_format_0_1_t* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+	nfapi_nr_uci_pucch_pdu_format_0_1_t* value = (nfapi_nr_uci_pucch_pdu_format_0_1_t*)tlv;
+
+	// uint8_t *ptr = *ppReadPackedMsg;
+	// printf("\n Read P7 message uci_0_1 indication unpack: ");
+	// while(ptr < end){
+	// 	printf(" %d ", *ptr);
+	// 	ptr++;
+	// }
+	// printf("\n");
+
+	if(!(pull8(ppReadPackedMsg, &value->pduBitmap, end) &&
+	 	 pull32(ppReadPackedMsg, &value->handle, end) &&
+		 pull16(ppReadPackedMsg, &value->rnti, end) &&
+		 pull8(ppReadPackedMsg, &value->pucch_format, end) &&
+		 pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+		 pull16(ppReadPackedMsg, &value->timing_advance, end) && 
+		 pull16(ppReadPackedMsg, &value->rssi, end)
+		 ))
+		  return 0;
+	if (value->pduBitmap & 0x01) { //SR
+		value->sr = (nfapi_nr_sr_pdu_0_1_t*) malloc(sizeof(nfapi_nr_sr_pdu_0_1_t));
+		if(!(pull8(ppReadPackedMsg, &value->sr->sr_indication, end) &&
+	 	 pull8(ppReadPackedMsg, &value->sr->sr_confidence_level, end) 
+		 ))
+		  return 0;
+	}
+
+	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
+		value->harq = (nfapi_nr_harq_pdu_0_1_t*) malloc(sizeof(nfapi_nr_harq_pdu_0_1_t));
+		if(!(pull8(ppReadPackedMsg, &value->harq->num_harq, end) &&
+	 	 pull8(ppReadPackedMsg, &value->harq->harq_confidence_level, end) 
+		 ))
+			return 0;
+		value->harq->harq_list = (nfapi_nr_harq_t*) malloc(sizeof(nfapi_nr_harq_t*) * value->harq->num_harq);
+		for(int i=0; i<value->harq->num_harq;i++)	
+		{
+			if(!(pull8(ppReadPackedMsg, &value->harq->harq_list->harq_value, end) 
+			))
+			return 0;
+		}
+	}
+
+	return 1;
+}
+
+
+static uint8_t unpack_nr_uci_pucch_2_3_4(nfapi_nr_uci_pucch_pdu_format_2_3_4_t* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+	nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value = (nfapi_nr_uci_pucch_pdu_format_2_3_4_t*) tlv;
+
+	if(!(pull8(ppReadPackedMsg, &value->pduBitmap, end) &&
+	 	 pull32(ppReadPackedMsg, &value->handle, end) &&
+		 pull16(ppReadPackedMsg, &value->rnti, end) &&
+		 pull8(ppReadPackedMsg, &value->pucch_format, end) &&
+		 pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+		 pull16(ppReadPackedMsg, &value->timing_advance, end) && 
+		 pull16(ppReadPackedMsg, &value->rssi, end)
+		 ))
+		  return 0;
+	if (value->pduBitmap & 0x01) { //SR
+		if(!(pull16(ppReadPackedMsg, &value->sr.sr_bit_len, end)))
+			return 0; 
+
+		value->sr.sr_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->sr.sr_bit_len/8)));
+
+	 	if(!(pullarray8(ppReadPackedMsg, &value->sr.sr_payload[0], (int)(value->sr.sr_bit_len / 8), (int)(value->sr.sr_bit_len / 8), end)))
+		  	return 0;
+	}
+
+	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
+		if(!(pull8(ppReadPackedMsg, &value->harq.harq_crc, end)) &&
+			(pull16(ppReadPackedMsg, &value->harq.harq_bit_len, end)))
+			return 0; 
+		
+		value->harq.harq_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->harq.harq_bit_len/8 )));
+
+	 	if(!(pullarray8(ppReadPackedMsg, value->harq.harq_payload, (int)(value->harq.harq_bit_len / 8), (int)(value->harq.harq_bit_len / 8), end)))
+			return 0;
+	}
+
+	if (((value->pduBitmap >> 2) & 0x01)) { //CSI-1
+		if(!(pull8(ppReadPackedMsg, &value->csi_part1.csi_part1_crc, end)) &&
+			(pull16(ppReadPackedMsg, &value->csi_part1.csi_part1_bit_len, end)))
+			return 0; 
+
+		value->csi_part1.csi_part1_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->csi_part1.csi_part1_bit_len/8)));
+
+//		if(!(pullarray8(ppReadPackedMsg, value->csi_part1.csi_part1_payload, (int)(value->csi_part1.csi_part1_bit_len / 8), (int)(value->csi_part1.csi_part1_bit_len / 8), end)))
+//			return 0;
+	}
+
+	if (((value->pduBitmap >> 3) & 0x01)) { //CSI-2
+		if(!(pull8(ppReadPackedMsg, &value->csi_part2.csi_part2_crc, end)) &&
+			(pull16(ppReadPackedMsg, &value->csi_part2.csi_part2_bit_len, end)))
+			return 0; 
+
+		value->csi_part2.csi_part2_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->csi_part2.csi_part2_bit_len/8 )));
+
+		if(!(pullarray8(ppReadPackedMsg, value->csi_part2.csi_part2_payload, (int)(value->csi_part2.csi_part2_bit_len / 8) , (int)(value->csi_part2.csi_part2_bit_len / 8) , end)))
+			return 0;
+	}
+
+	return 1;
+}
+
+static uint8_t unpack_nr_uci_indication_body(nfapi_nr_uci_t* value, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+	if(!(pull16(ppReadPackedMsg, &value->pdu_type, end) &&
+		pull16(ppReadPackedMsg, &value->pdu_size, end)
+		))
+		return 0;
+	
+	switch (value->pdu_type) {
+      case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
+        printf("Unhandled NFAPI_NR_UCI_PUSCH_PDU_TYPE \n");
+        break;
+
+      case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: {
+        nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu = &value->pucch_pdu_format_0_1;
+        unpack_nr_uci_pucch_0_1(uci_pdu, ppReadPackedMsg, end);
+		break;
+        }
+      case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
+        nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &value->pucch_pdu_format_2_3_4;
+        unpack_nr_uci_pucch_2_3_4(uci_pdu, ppReadPackedMsg, end);
+        break;
+    	}
+	}	
+
+	return 1;	
+}
+
+static uint8_t unpack_nr_uci_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t*)msg;
+
+	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->num_ucis, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->num_ucis;i++)	
+	{
+		if(!unpack_nr_uci_indication_body(pNfapiMsg->uci_list,ppReadPackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+static uint8_t unpack_ue_release_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  uint8_t proceed = 1;
+  nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t *)msg;
+
+  if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
+    return 0;
+
+  while (((uint8_t *)(*ppReadPackedMsg) < end) && proceed) {
+    nfapi_tl_t generic_tl;
+
+    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+      return 0;
+
+    switch(generic_tl.tag) {
+      case NFAPI_UE_RELEASE_BODY_TAG: {
+        pNfapiMsg->ue_release_request_body.tl = generic_tl;
+
+        if( pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.number_of_TLVs, end) == 0)
+          return 0;
+
+        if(pNfapiMsg->ue_release_request_body.number_of_TLVs > NFAPI_RELEASE_MAX_RNTI) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of relese rnti's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->ue_release_request_body.number_of_TLVs, NFAPI_RELEASE_MAX_RNTI);
+          return 0;
+        } else {
+          uint8_t j;
+          uint16_t num = pNfapiMsg->ue_release_request_body.number_of_TLVs;
+
+          for(j = 0; j < num; ++j) {
+            if(pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.ue_release_request_TLVs_list[j].rnti, end) == 0) {
+              return 0;
+            }
+          }
+        }
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_ue_release_request FIXME : Invalid type %d \n", generic_tl.tag );
+      }
+      break;
+    };
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_harq_indication_tdd_harq_data_bundling(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_harq_data_bundling_t *value = (nfapi_harq_indication_tdd_harq_data_bundling_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->value_0, end) &&
+          pull8(ppReadPackedMsg, &value->value_1, end));
+}
+
+static uint8_t unpack_harq_indication_tdd_harq_data_multiplexing(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_harq_data_multiplexing_t *value = (nfapi_harq_indication_tdd_harq_data_multiplexing_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->value_0, end) &&
+          pull8(ppReadPackedMsg, &value->value_1, end) &&
+          pull8(ppReadPackedMsg, &value->value_2, end) &&
+          pull8(ppReadPackedMsg, &value->value_3, end));
+}
+static uint8_t unpack_harq_indication_tdd_harq_data_special_bundling(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_harq_data_special_bundling_t *value = (nfapi_harq_indication_tdd_harq_data_special_bundling_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &value->value_0, end));
+}
+static uint8_t unpack_harq_indication_tdd_harq_data(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_harq_data_t *value = (nfapi_harq_indication_tdd_harq_data_t *)tlv;
+  return  (pull8(ppReadPackedMsg, &value->value_0, end));
+}
+
+static uint8_t unpack_harq_indication_tdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel8_t *value = (nfapi_harq_indication_tdd_rel8_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
+    return 0;
+
+  uint8_t result = 0;
+
+  switch(value->mode) {
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+      result = unpack_harq_indication_tdd_harq_data_bundling(&value->harq_data.bundling, ppReadPackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+      result = unpack_harq_indication_tdd_harq_data_multiplexing(&value->harq_data.multiplex, ppReadPackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+      result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data.special_bundling, ppReadPackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+      result = 1;
+      break;
+
+    default:
+      // TODO add error message
+      return 0;
+      break;
+  }
+
+  return result;
+}
+
+static uint8_t unpack_harq_indication_tdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel9_t *value = (nfapi_harq_indication_tdd_rel9_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
+    return 0;
+
+  if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD) {
+    // TODO : add error message
+    return 0;
+  }
+
+  uint16_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_ack_nack; ++idx) {
+    uint8_t result = 0;
+
+    switch(value->mode) {
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+        result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
+        break;
+
+      default:
+        // TODO add error message
+        return 0;
+        break;
+    }
+
+    if(result == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_harq_indication_tdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel13_t *value = (nfapi_harq_indication_tdd_rel13_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
+       pull16(ppReadPackedMsg, &value->number_of_ack_nack, end)))
+    return 0;
+
+  if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD) {
+    // TODO : add error message
+    return 0;
+  }
+
+  uint16_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_ack_nack; ++idx) {
+    uint8_t result = 0;
+
+    switch(value->mode) {
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+        result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_4, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_5, ppReadPackedMsg, end);
+        break;
+
+      default:
+        // TODO add error message
+        return 0;
+        break;
+    }
+
+    if(result == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_harq_indication_fdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel8_t *value = (nfapi_harq_indication_fdd_rel8_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->harq_tb1, end) &&
+          pull8(ppReadPackedMsg, &value->harq_tb2, end));
+}
+
+static uint8_t unpack_harq_indication_fdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel9_t *value = (nfapi_harq_indication_fdd_rel9_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->mode, end) &&
+          pull8(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
+          pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, value->number_of_ack_nack, end));
+}
+
+static uint8_t unpack_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel13_t *value = (nfapi_harq_indication_fdd_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->mode, end) &&
+          pull16(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
+          pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, value->number_of_ack_nack, end));
+}
+
+static uint8_t unpack_ul_cqi_information_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_cqi_information_t *value = (nfapi_ul_cqi_information_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+          pull8(ppReadPackedMsg, &value->channel, end));
+}
+
+
+
+static uint8_t unpack_harq_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_harq_indication_body_t *value = (nfapi_harq_indication_body_t *)tlv;
+  uint8_t *harqBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(harqBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
+    return 0;
+
+  if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
+    return 0;
+  }
+
+  value->harq_pdu_list = (nfapi_harq_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_harq_indication_pdu_t) * value->number_of_harqs, config);
+
+  if(value->harq_pdu_list == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
+    return 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_harqs; ++i) {
+    nfapi_harq_indication_pdu_t *pdu = &(value->harq_pdu_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+      { NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, &unpack_harq_indication_tdd_rel8_value},
+      { NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, &unpack_harq_indication_tdd_rel9_value},
+      { NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, &unpack_harq_indication_tdd_rel13_value},
+      { NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, &unpack_harq_indication_fdd_rel8_value},
+      { NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, &unpack_harq_indication_fdd_rel9_value},
+      { NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, &unpack_harq_indication_fdd_rel13_value},
+      { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, &unpack_harq_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_crc_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_crc_indication_rel8_t *crc_pdu_rel8 = (nfapi_crc_indication_rel8_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &crc_pdu_rel8->crc_flag, end) );
+}
+
+static uint8_t unpack_crc_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end,  nfapi_p7_codec_config_t *config) {
+  nfapi_crc_indication_body_t *value = (nfapi_crc_indication_body_t *)tlv;
+  uint8_t *crcBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(crcBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_crcs, end) == 0)
+    return 0;
+
+  if(value->number_of_crcs > NFAPI_CRC_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of crc ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_crcs, NFAPI_CRC_IND_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_crcs > 0) {
+    value->crc_pdu_list = (nfapi_crc_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_crc_indication_pdu_t) * value->number_of_crcs, config);
+
+    if(value->crc_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate crc ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_crcs);
+      return 0;
+    }
+  } else {
+    value->crc_pdu_list = 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_crcs; ++i) {
+    nfapi_crc_indication_pdu_t *pdu = &(value->crc_pdu_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *crcPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+      { NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, unpack_crc_indication_rel8_value },
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, crcPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_crc_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, &unpack_crc_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_rx_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rx_indication_rel8_t *value = (nfapi_rx_indication_rel8_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->length, end) &&
+          pull16(ppReadPackedMsg, &value->offset, end) &&
+          pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+          pull16(ppReadPackedMsg, &value->timing_advance, end));
+}
+static uint8_t unpack_rx_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rx_indication_rel9_t *value = (nfapi_rx_indication_rel9_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->timing_advance_r9, end));
+}
+
+static uint8_t unpack_rx_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_rx_indication_body_t *value = (nfapi_rx_indication_body_t *)tlv;
+  // the rxBodyEnd points to the end of the cqi PDU's
+  uint8_t *rxBodyEnd = *ppReadPackedMsg + value->tl.length;
+  uint8_t *rxPduEnd = rxBodyEnd;
+  uint8_t *numberOfPdusAddress = *ppReadPackedMsg;
+
+  if(rxBodyEnd > end) {
+    // pdu end is past buffer end
+    return 0;
+  }
+
+  if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
+    return 0;
+
+  if(value->number_of_pdus > NFAPI_RX_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of rx ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_RX_IND_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_pdus > 0) {
+    value->rx_pdu_list = (nfapi_rx_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_rx_indication_pdu_t) * value->number_of_pdus, config);
+
+    if(value->rx_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate rx ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+      return 0;
+    }
+  } else {
+    value->rx_pdu_list = 0;
+  }
+
+  uint8_t i = 0;
+  nfapi_rx_indication_pdu_t *pdu = 0;
+
+  while((uint8_t *)(*ppReadPackedMsg) < rxBodyEnd && (uint8_t *)(*ppReadPackedMsg) < rxPduEnd) {
+    nfapi_tl_t generic_tl;
+
+    if( unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+      return 0;
+
+    switch(generic_tl.tag) {
+      case NFAPI_RX_UE_INFORMATION_TAG: {
+        pdu = &(value->rx_pdu_list[i++]);
+        pdu->rx_ue_information.tl = generic_tl;
+
+        if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
+          return 0;
+      }
+      break;
+
+      case NFAPI_RX_INDICATION_REL8_TAG: {
+        if(pdu != 0) {
+          pdu->rx_indication_rel8.tl = generic_tl;
+
+          if(unpack_rx_indication_rel8_value(&pdu->rx_indication_rel8, ppReadPackedMsg, end) == 0)
+            return 0;
+
+          if(pdu->rx_indication_rel8.offset > 0) {
+            // Need to check that the data is within the tlv
+            if(numberOfPdusAddress + pdu->rx_indication_rel8.offset + pdu->rx_indication_rel8.length <= rxBodyEnd) {
+              // If this the first pdu set the rxPduEnd
+              if(numberOfPdusAddress + pdu->rx_indication_rel8.offset < rxPduEnd) {
+                rxPduEnd = numberOfPdusAddress + pdu->rx_indication_rel8.offset;
+
+                if(rxPduEnd > end) {
+                  // pdu end is past buffer end
+                  return 0;
+                }
+              }
+            } else {
+              NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME: the rx data is outside of the tlv\n");
+            }
+          }
+        }
+      }
+      break;
+
+      case NFAPI_RX_INDICATION_REL9_TAG: {
+        if(pdu != 0) {
+          pdu->rx_indication_rel9.tl = generic_tl;
+
+          if(unpack_rx_indication_rel9_value(&pdu->rx_indication_rel9, ppReadPackedMsg, end) == 0)
+            return 0;
+        }
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_ULSCH.indication Invalid pdu type %d \n", generic_tl.tag );
+      }
+      break;
+    }
+  }
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_pdus; ++idx) {
+    if(value->rx_pdu_list[idx].rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
+      uint32_t length = value->rx_pdu_list[idx].rx_indication_rel8.length;
+      value->rx_pdu_list[idx].data = nfapi_p7_allocate(length, config);
+
+      if(pullarray8(ppReadPackedMsg, value->rx_pdu_list[idx].data, length, length, end) == 0) {
+        return 0;
+      }
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_rx_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, &unpack_rx_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_preamble_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel8_t *preamble_pdu_rel8 = (nfapi_preamble_pdu_rel8_t *)tlv;
+  return (pull16(ppReadPackedMsg, &preamble_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &preamble_pdu_rel8->preamble, end) &&
+          pull16(ppReadPackedMsg, &preamble_pdu_rel8->timing_advance, end));
+}
+
+static uint8_t unpack_preamble_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel9_t *preamble_pdu_rel9 = (nfapi_preamble_pdu_rel9_t *)tlv;
+  return pull16(ppReadPackedMsg, &preamble_pdu_rel9->timing_advance_r9, end);
+}
+
+static uint8_t unpack_preamble_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel13_t *preamble_pdu_rel13 = (nfapi_preamble_pdu_rel13_t *)tlv;
+  return pull8(ppReadPackedMsg, &preamble_pdu_rel13->rach_resource_type, end);
+}
+
+static uint8_t unpack_rach_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_rach_indication_body_t *value = (nfapi_rach_indication_body_t *)tlv;
+  uint8_t *rachBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(rachBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_preambles, end) == 0)
+    return 0;
+
+  if(value->number_of_preambles > NFAPI_PREAMBLE_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of preamble du's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_preambles, NFAPI_PREAMBLE_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_preambles > 0) {
+    value->preamble_list = (nfapi_preamble_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_preamble_pdu_t) * value->number_of_preambles, config);
+
+    if(value->preamble_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate preamble pdu list (count:%d)\n", __FUNCTION__, value->number_of_preambles);
+      return 0;
+    }
+  } else {
+    value->preamble_list = 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_preambles; ++i) {
+    nfapi_preamble_pdu_t *pdu = &(value->preamble_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *preamblePduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, unpack_preamble_pdu_rel8_value },
+      { NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, unpack_preamble_pdu_rel9_value },
+      { NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, unpack_preamble_pdu_rel13_value },
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, preamblePduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_rach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, &unpack_rach_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_srs_indication_fdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel8_t *srs_pdu_fdd_rel8 = (nfapi_srs_indication_fdd_rel8_t *)tlv;
+
+  if(!(pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->doppler_estimation, end) &&
+       pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->timing_advance, end) &&
+       pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->number_of_resource_blocks, end) &&
+       pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->rb_start, end) &&
+       pullarray8(ppReadPackedMsg, srs_pdu_fdd_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_fdd_rel8->number_of_resource_blocks, end)))
+    return 0;
+
+  return 1;
+}
+
+static uint8_t unpack_srs_indication_fdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel9_t *srs_pdu_fdd_rel9 = (nfapi_srs_indication_fdd_rel9_t *)tlv;
+  return (pull16(ppReadPackedMsg, &srs_pdu_fdd_rel9->timing_advance_r9, end));
+}
+
+static uint8_t unpack_srs_indication_tdd_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_srs_indication_ttd_rel10_t *srs_pdu_tdd_rel10 = (nfapi_srs_indication_ttd_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &srs_pdu_tdd_rel10->uppts_symbol, end));
+}
+
+static uint8_t unpack_srs_indication_fdd_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel11_t *srs_pdu_fdd_rel11 = (nfapi_srs_indication_fdd_rel11_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &srs_pdu_fdd_rel11->ul_rtoa, end));
+}
+
+static uint8_t unpack_tdd_channel_measurement_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_tdd_channel_measurement_t *value = (nfapi_tdd_channel_measurement_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
+       pull8(ppReadPackedMsg, &value->num_atennas, end)))
+    return 0;
+
+  if(value->number_of_subbands > NFAPI_MAX_NUM_SUBBANDS) {
+    // todo : add error
+    return 0;
+  }
+
+  if(value->num_atennas > NFAPI_MAX_NUM_PHYSICAL_ANTENNAS) {
+    // todo : add error
+    return 0;
+  }
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_subbands; ++idx) {
+    if(!(pull8(ppReadPackedMsg, &value->subands[idx].subband_index, end) &&
+         pullarray16(ppReadPackedMsg, value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, end)))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_srs_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_srs_indication_body_t *value = (nfapi_srs_indication_body_t *)tlv;
+  uint8_t *srsBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(srsBodyEnd > end)
+    return 0;
+
+  if(pull8(ppReadPackedMsg, &value->number_of_ues, end) == 0)
+    return 0;
+
+  if(value->number_of_ues > NFAPI_SRS_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of srs ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_ues, NFAPI_SRS_IND_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_ues > 0) {
+    value->srs_pdu_list = (nfapi_srs_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_srs_indication_pdu_t) * value->number_of_ues, config);
+
+    if(value->srs_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate srs ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_ues);
+      return 0;
+    }
+  } else {
+    value->srs_pdu_list = 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_ues; ++i) {
+    nfapi_srs_indication_pdu_t *pdu = &(value->srs_pdu_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *srsPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+      { NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, unpack_srs_indication_fdd_rel8_value},
+      { NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, unpack_srs_indication_fdd_rel9_value},
+      { NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, unpack_srs_indication_tdd_rel10_value},
+      { NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, unpack_srs_indication_fdd_rel11_value},
+      { NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, unpack_tdd_channel_measurement_value},
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srsPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, &unpack_srs_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_sr_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_sr_indication_body_t *value = (nfapi_sr_indication_body_t *)tlv;
+  uint8_t *srBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(srBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_srs, end) == 0)
+    return 0;
+
+  if(value->number_of_srs > NFAPI_SR_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of sr ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_srs, NFAPI_SR_IND_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_srs > 0) {
+    value->sr_pdu_list = (nfapi_sr_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_sr_indication_pdu_t) * value->number_of_srs, config);
+
+    if(value->sr_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate sr ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_srs);
+      return 0;
+    }
+  } else {
+    value->sr_pdu_list = 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_srs; ++i) {
+    nfapi_sr_indication_pdu_t *pdu = &(value->sr_pdu_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *srPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+      { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, unpack_ul_cqi_information_value },
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static int unpack_sr_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, &unpack_sr_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+static uint8_t unpack_cqi_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_cqi_indication_rel8_t *cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t *)tlv;
+  return (pull16(ppReadPackedMsg, &cqi_pdu_rel8->length, end) &&
+          pull16(ppReadPackedMsg, &cqi_pdu_rel8->data_offset, end) &&
+          pull8(ppReadPackedMsg, &cqi_pdu_rel8->ul_cqi, end) &&
+          pull8(ppReadPackedMsg, &cqi_pdu_rel8->ri, end) &&
+          pull16(ppReadPackedMsg, &cqi_pdu_rel8->timing_advance, end));
+}
+
+static uint8_t unpack_cqi_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_cqi_indication_rel9_t *cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t *)tlv;
+
+  if(!(pull16(ppReadPackedMsg, &cqi_pdu_rel9->length, end) &&
+       pull16(ppReadPackedMsg, &cqi_pdu_rel9->data_offset, end) &&
+       pull8(ppReadPackedMsg, &cqi_pdu_rel9->ul_cqi, end) &&
+       pull8(ppReadPackedMsg, &cqi_pdu_rel9->number_of_cc_reported, end)))
+    return 0;
+
+  if(cqi_pdu_rel9->number_of_cc_reported > NFAPI_CC_MAX) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : out of bound array\n");
+    return 0;
+  }
+
+  if(!(pullarray8(ppReadPackedMsg, cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, end) &&
+       pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance, end) &&
+       pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance_r9, end)))
+    return 0;
+
+  return 1;
+}
+
+static uint8_t  unpack_cqi_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end,  nfapi_p7_codec_config_t *config) {
+  nfapi_cqi_indication_body_t *value = (nfapi_cqi_indication_body_t *)tlv;
+  // the cqiBodyEnd points to the end of the cqi PDU's
+  uint8_t *cqiBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  //uint8_t* cqiPduEnd = cqiBodyEnd;
+  //uint8_t* numberOfPdusAddress = *ppReadPackedMsg;
+
+  if(cqiBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_cqis, end) == 0)
+    return 0;
+
+  if(value->number_of_cqis > NFAPI_CQI_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of cqi ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_cqis, NFAPI_CQI_IND_MAX_PDU);
+    return -1;
+  }
+
+  if(value->number_of_cqis > 0) {
+    value->cqi_pdu_list = (nfapi_cqi_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_pdu_t) * value->number_of_cqis, config);
+
+    if(value->cqi_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
+      return 0;
+    }
+  } else {
+    value->cqi_pdu_list = 0;
+  }
+
+  if(value->number_of_cqis > 0) {
+    value->cqi_raw_pdu_list = (nfapi_cqi_indication_raw_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_raw_pdu_t) * value->number_of_cqis, config);
+
+    if(value->cqi_raw_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate raw cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
+      return 0;
+    }
+  } else {
+    value->cqi_raw_pdu_list = 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_cqis; ++i) {
+    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
+    memset(pdu, 0, sizeof(nfapi_cqi_indication_pdu_t));
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *cqiPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+
+    while((uint8_t *)(*ppReadPackedMsg) < cqiPduInstanceEnd) {
+      nfapi_tl_t generic_tl;
+
+      if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+        return 0;
+
+      switch(generic_tl.tag) {
+        case NFAPI_RX_UE_INFORMATION_TAG:
+          pdu->rx_ue_information.tl = generic_tl;
+
+          if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
+            return 0;
+
+          break;
+
+        case NFAPI_CQI_INDICATION_REL8_TAG:
+          pdu->cqi_indication_rel8.tl = generic_tl;
+
+          if(unpack_cqi_indication_rel8_value(&pdu->cqi_indication_rel8, ppReadPackedMsg, end) == 0)
+            return 0;
+
+          break;
+
+        case NFAPI_CQI_INDICATION_REL9_TAG:
+          pdu->cqi_indication_rel9.tl = generic_tl;
+
+          if(unpack_cqi_indication_rel9_value(&pdu->cqi_indication_rel9, ppReadPackedMsg, end) == 0)
+            return 0;
+
+          break;
+
+        case NFAPI_UL_CQI_INFORMATION_TAG:
+          pdu->ul_cqi_information.tl = generic_tl;
+
+          if(unpack_ul_cqi_information_value(&pdu->ul_cqi_information, ppReadPackedMsg, end) == 0)
+            return 0;
+
+          break;
+
+        default: {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_CQI.indication Invalid pdu type %d \n", generic_tl.tag );
+        }
+        break;
+      };
+    }
+  }
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_cqis; ++idx) {
+    if(value->cqi_pdu_list[idx].cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
+      if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel8.length, end) == 0)
+        return 0;
+    } else if(value->cqi_pdu_list[idx].cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
+      if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel9.length, end) == 0)
+        return 0;
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_cqi_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, &unpack_cqi_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+static uint8_t unpack_lbt_pdsch_req_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lbt_pdsch_req_pdu_rel13_t *value = (nfapi_lbt_pdsch_req_pdu_rel13_t *)tlv;
+  return (pull32(ppReadPackedMsg, &value->handle, end) &&
+          pull32(ppReadPackedMsg, &value->mp_cca, end) &&
+          pull32(ppReadPackedMsg, &value->n_cca, end) &&
+          pull32(ppReadPackedMsg, &value->offset, end) &&
+          pull32(ppReadPackedMsg, &value->lte_txop_sf, end) &&
+          pull16(ppReadPackedMsg, &value->txop_sfn_sf_end, end) &&
+          pull32(ppReadPackedMsg, &value->lbt_mode, end));
+}
+
+static uint8_t unpack_lbt_drs_req_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lbt_drs_req_pdu_rel13_t *value = (nfapi_lbt_drs_req_pdu_rel13_t *)tlv;
+  return (pull32(ppReadPackedMsg, &value->handle, end) &&
+          pull32(ppReadPackedMsg, &value->offset, end) &&
+          pull16(ppReadPackedMsg, &value->sfn_sf_end, end) &&
+          pull32(ppReadPackedMsg, &value->lbt_mode, end));
+}
+
+
+static uint8_t unpack_lbt_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_config_request_body_t *value = (nfapi_lbt_dl_config_request_body_t *)tlv;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
+    return 0;
+
+  if(value->number_of_pdus > NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_pdus) {
+    value->lbt_dl_config_req_pdu_list = (nfapi_lbt_dl_config_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_config_request_pdu_t) * value->number_of_pdus, config);
+
+    if(value->lbt_dl_config_req_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+      return 0;
+    }
+  } else {
+    value->lbt_dl_config_req_pdu_list = 0;
+  }
+
+  uint16_t i;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_lbt_dl_config_request_pdu_t *pdu = &(value->lbt_dl_config_req_pdu_list[i]);
+
+    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+      return 0;
+
+    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+    if(packedPduEnd > end)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, &unpack_lbt_pdsch_req_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, &unpack_lbt_drs_req_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      default:
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request body invalid pdu type %d\n", pdu->pdu_type);
+        return 0;
+    }
+  }
+
+  return 1;
+}
+static uint8_t unpack_lbt_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, &unpack_lbt_config_request_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_lbt_pdsch_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lbt_pdsch_rsp_pdu_rel13_t *value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t *)tlv;
+  return (pull32(ppReadPackedMsg, &value->handle, end) &&
+          pull32(ppReadPackedMsg, &value->result, end) &&
+          pull32(ppReadPackedMsg, &value->lte_txop_symbols, end) &&
+          pull32(ppReadPackedMsg, &value->initial_partial_sf, end));
+}
+static uint8_t unpack_lbt_drs_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lbt_drs_rsp_pdu_rel13_t *value = (nfapi_lbt_drs_rsp_pdu_rel13_t *)tlv;
+  return (pull32(ppReadPackedMsg, &value->handle, end) &&
+          pull32(ppReadPackedMsg, &value->result, end));
+}
+
+static uint8_t unpack_lbt_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_indication_body_t *value = (nfapi_lbt_dl_indication_body_t *)tlv;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
+    return 0;
+
+  if(value->number_of_pdus > NFAPI_LBT_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_IND_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_pdus > 0) {
+    value->lbt_indication_pdu_list = (nfapi_lbt_dl_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_indication_pdu_t) * value->number_of_pdus, config);
+
+    if(value->lbt_indication_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl ind config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+      return 0;
+    }
+  } else {
+    value->lbt_indication_pdu_list = 0;
+  }
+
+  uint16_t i;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_lbt_dl_indication_pdu_t *pdu = &(value->lbt_indication_pdu_list[i]);
+
+    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+      return 0;
+
+    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+    if(packedPduEnd > end)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, &unpack_lbt_pdsch_rsp_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, &unpack_lbt_drs_rsp_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      default:
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d\n", pdu->pdu_type);
+        return 0;
+    }
+  }
+
+  return 1;
+}
+static uint8_t unpack_lbt_dl_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, &unpack_lbt_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nb_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nb_harq_indication_fdd_rel13_t *value = (nfapi_nb_harq_indication_fdd_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->harq_tb1, end));
+}
+
+
+static uint8_t unpack_nb_harq_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nb_harq_indication_body_t *value = (nfapi_nb_harq_indication_body_t *)tlv;
+  uint8_t *nbharqBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(nbharqBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
+    return 0;
+
+  if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
+    return 0;
+  }
+
+  value->nb_harq_pdu_list = (nfapi_nb_harq_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_nb_harq_indication_pdu_t) * value->number_of_harqs, config);
+
+  if(value->nb_harq_pdu_list == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
+    return 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_harqs; ++i) {
+    nfapi_nb_harq_indication_pdu_t *pdu = &(value->nb_harq_pdu_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+      { NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, &unpack_nb_harq_indication_fdd_rel13_value},
+      { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_nb_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, &unpack_nb_harq_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nrach_indication_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nrach_indication_pdu_rel13_t *value = (nfapi_nrach_indication_pdu_rel13_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->rnti, end) &&
+          pull8(ppReadPackedMsg, &value->initial_sc, end) &&
+          pull16(ppReadPackedMsg, &value->timing_advance, end) &&
+          pull8(ppReadPackedMsg, &value->nrach_ce_level, end));
+}
+
+static uint8_t unpack_ue_release_resp(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t *)msg;
+
+  if(pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) == 0) {
+    return 0;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_INFO, "ue_release_response:error_code = %d\n", pNfapiMsg->error_code);
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_nrach_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nrach_indication_body_t *value = (nfapi_nrach_indication_body_t *)tlv;
+  uint8_t *nrachBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(nrachBodyEnd > end)
+    return 0;
+
+  if(pull8(ppReadPackedMsg, &value->number_of_initial_scs_detected, end) == 0)
+    return 0;
+
+  if(value->number_of_initial_scs_detected > NFAPI_PREAMBLE_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of detected scs ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected, NFAPI_PREAMBLE_MAX_PDU);
+    return 0;
+  }
+
+  value->nrach_pdu_list = (nfapi_nrach_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_nrach_indication_pdu_t) * value->number_of_initial_scs_detected, config);
+
+  if(value->nrach_pdu_list == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate nrach ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected);
+    return 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_initial_scs_detected; ++i) {
+    nfapi_nrach_indication_pdu_t *pdu = &(value->nrach_pdu_list[i]);
+    uint8_t *nrachPduInstanceEnd = *ppReadPackedMsg + 4 + 6;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, &unpack_nrach_indication_rel13_value},
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, nrachPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_nrach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, &unpack_nrach_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nr_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_slot, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_sf, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_nr_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn_sf, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->dl_config_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->tx_request_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->ul_config_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_jitter, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_earliest_arrival, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_nr_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->last_slot, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->dl_tti_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->ul_tti_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->ul_dci_jitter, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_earliest_arrival, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+
+// unpack length check
+
+static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen) {
+  int retLen = 0;
+
+  switch (msgId) {
+    case NFAPI_DL_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_dl_config_request_t))
+        retLen = sizeof(nfapi_dl_config_request_t);
+
+      break;
+
+    case NFAPI_UL_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_ul_config_request_t))
+        retLen = sizeof(nfapi_ul_config_request_t);
+
+      break;
+
+    case NFAPI_SUBFRAME_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
+        retLen = sizeof(nfapi_subframe_indication_t);
+
+      break;
+
+    case NFAPI_HI_DCI0_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_hi_dci0_request_t))
+        retLen = sizeof(nfapi_hi_dci0_request_t);
+
+      break;
+
+    case NFAPI_TX_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_tx_request_t))
+        retLen = sizeof(nfapi_tx_request_t);
+
+      break;
+
+    case NFAPI_HARQ_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_harq_indication_t))
+        retLen = sizeof(nfapi_harq_indication_t);
+
+      break;
+
+    case NFAPI_CRC_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_crc_indication_t))
+        retLen = sizeof(nfapi_crc_indication_t);
+
+      break;
+
+    case NFAPI_RX_ULSCH_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_rx_indication_t))
+        retLen = sizeof(nfapi_rx_indication_t);
+
+      break;
+
+    case NFAPI_RACH_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_rach_indication_t))
+        retLen = sizeof(nfapi_rach_indication_t);
+
+      break;
+
+    case NFAPI_SRS_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_srs_indication_t))
+        retLen = sizeof(nfapi_srs_indication_t);
+
+      break;
+
+    case NFAPI_RX_SR_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_sr_indication_t))
+        retLen = sizeof(nfapi_sr_indication_t);
+
+      break;
+
+    case NFAPI_RX_CQI_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_cqi_indication_t))
+        retLen = sizeof(nfapi_cqi_indication_t);
+
+      break;
+
+    case NFAPI_LBT_DL_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_lbt_dl_config_request_t))
+        retLen = sizeof(nfapi_lbt_dl_config_request_t);
+
+      break;
+
+    case NFAPI_LBT_DL_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_lbt_dl_indication_t))
+        retLen = sizeof(nfapi_lbt_dl_indication_t);
+
+      break;
+
+    case NFAPI_NB_HARQ_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_nb_harq_indication_t))
+        retLen = sizeof(nfapi_nb_harq_indication_t);
+
+      break;
+
+    case NFAPI_NRACH_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_nrach_indication_t))
+        retLen = sizeof(nfapi_nrach_indication_t);
+
+      break;
+
+    case NFAPI_DL_NODE_SYNC:
+      if (unpackedBufLen >= sizeof(nfapi_dl_node_sync_t))
+        retLen = sizeof(nfapi_dl_node_sync_t);
+
+      break;
+
+    case NFAPI_UL_NODE_SYNC:
+      if (unpackedBufLen >= sizeof(nfapi_ul_node_sync_t))
+        retLen = sizeof(nfapi_ul_node_sync_t);
+
+      break;
+
+    case NFAPI_TIMING_INFO:
+      if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
+        retLen = sizeof(nfapi_timing_info_t);
+
+      break;
+
+    case NFAPI_UE_RELEASE_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
+        retLen = sizeof(nfapi_ue_release_request_t);
+
+      break;
+
+    case NFAPI_UE_RELEASE_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
+        retLen = sizeof(nfapi_ue_release_response_t);
+
+      break;
+
+    default:
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
+      break;
+  }
+
+  return retLen;
+}
+
+static int check_nr_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen)
+{
+	int retLen = 0;
+
+	switch (msgId)
+	{
+		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
+			if (unpackedBufLen >= sizeof(nfapi_nr_dl_tti_request_t))
+				retLen = sizeof(nfapi_nr_dl_tti_request_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
+			if (unpackedBufLen >= sizeof(nfapi_nr_ul_tti_request_t))
+				retLen = sizeof(nfapi_nr_ul_tti_request_t);
+			break;
+
+		case NFAPI_SUBFRAME_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
+				retLen = sizeof(nfapi_subframe_indication_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
+			if (unpackedBufLen >= sizeof(nfapi_nr_ul_dci_request_t))
+				retLen = sizeof(nfapi_nr_ul_dci_request_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
+			if (unpackedBufLen >= sizeof(nfapi_nr_tx_data_request_t))
+				retLen = sizeof(nfapi_nr_tx_data_request_t);
+			break;
+		
+		case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_nr_rx_data_indication_t))
+				retLen = sizeof(nfapi_nr_rx_data_indication_t);
+			break;
+		
+		case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_nr_crc_indication_t))
+				retLen = sizeof(nfapi_nr_crc_indication_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_nr_rach_indication_t))
+				retLen = sizeof(nfapi_nr_rach_indication_t);
+			break;
+		
+		case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_nr_uci_indication_t))
+				retLen = sizeof(nfapi_nr_uci_indication_t);
+			break;
+		
+		case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_nr_srs_indication_t))
+				retLen = sizeof(nfapi_nr_srs_indication_t);
+			break;
+		
+		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
+			if (unpackedBufLen >= sizeof(nfapi_nr_dl_node_sync_t))
+				retLen = sizeof(nfapi_nr_dl_node_sync_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
+			if (unpackedBufLen >= sizeof(nfapi_nr_ul_node_sync_t))
+				retLen = sizeof(nfapi_nr_ul_node_sync_t);
+			break;
+
+		case NFAPI_TIMING_INFO:
+			if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
+				retLen = sizeof(nfapi_timing_info_t);
+			break;
+
+		case NFAPI_UE_RELEASE_REQUEST:
+			if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
+				retLen = sizeof(nfapi_ue_release_request_t);
+			break;
+
+		case NFAPI_UE_RELEASE_RESPONSE:
+			if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
+				retLen = sizeof(nfapi_ue_release_response_t);
+			break;
+
+		default:
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
+			break;
+	}
+
+	return retLen;
+}
+
+
+
+// Main unpack functions - public
+
+int nfapi_p7_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t *config) {
+  nfapi_p7_message_header_t *pMessageHeader = pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  // process the header
+  if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
+       pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
+       pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
+    return -1;
+
+  return 0;
+}
+
+int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t *config) {
+  int result = 0;
+  nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t *)pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  /*
+    uint8_t *ptr = pMessageBuf;
+  printf("\n Read P7 message unpack: ");
+  while(ptr < end){
+    printf(" %d ", *ptr);
+    ptr++;
+  }
+  printf("\n");
+  */
+  // clean the supplied buffer for - tag value blanking
+  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
+
+  // process the header
+  if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
+       pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
+       pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end))) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
+    return -1;
+  }
+
+  if((uint8_t *)(pMessageBuf + pMessageHeader->message_length) > end) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
+    return -1;
+  }
+
+  /*
+  if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
+  {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
+    return -1;
+  }
+  */
+
+  // look for the specific message
+  switch (pMessageHeader->message_id) {
+    case NFAPI_DL_CONFIG_REQUEST:
+      if (check_unpack_length(NFAPI_DL_CONFIG_REQUEST, unpackedBufLen))
+        result = unpack_dl_config_request(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_UL_CONFIG_REQUEST:
+      if (check_unpack_length(NFAPI_UL_CONFIG_REQUEST, unpackedBufLen))
+        result = unpack_ul_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_TX_REQUEST:
+      if (check_unpack_length(NFAPI_TX_REQUEST, unpackedBufLen))
+        result = unpack_tx_request(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_HI_DCI0_REQUEST:
+      if (check_unpack_length(NFAPI_HI_DCI0_REQUEST, unpackedBufLen))
+        result = unpack_hi_dci0_request(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_UE_RELEASE_REQUEST:
+      if (check_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
+        result = unpack_ue_release_request(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_HARQ_INDICATION:
+      if (check_unpack_length(NFAPI_HARQ_INDICATION, unpackedBufLen))
+        result = unpack_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_CRC_INDICATION:
+      if (check_unpack_length(NFAPI_CRC_INDICATION, unpackedBufLen))
+        result = unpack_crc_indication(&pReadPackedMessage,end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_RX_ULSCH_INDICATION:
+      if (check_unpack_length(NFAPI_RX_ULSCH_INDICATION, unpackedBufLen))
+        result = unpack_rx_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_RACH_INDICATION:
+      if (check_unpack_length(NFAPI_RACH_INDICATION, unpackedBufLen))
+        result = unpack_rach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_SRS_INDICATION:
+      if (check_unpack_length(NFAPI_SRS_INDICATION, unpackedBufLen))
+        result = unpack_srs_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_RX_SR_INDICATION:
+      if (check_unpack_length(NFAPI_RX_SR_INDICATION, unpackedBufLen))
+        result = unpack_sr_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_RX_CQI_INDICATION:
+      if (check_unpack_length(NFAPI_RX_CQI_INDICATION, unpackedBufLen))
+        result = unpack_cqi_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_LBT_DL_CONFIG_REQUEST:
+      if (check_unpack_length(NFAPI_LBT_DL_CONFIG_REQUEST, unpackedBufLen))
+        result = unpack_lbt_dl_config_request(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_LBT_DL_INDICATION:
+      if (check_unpack_length(NFAPI_LBT_DL_INDICATION, unpackedBufLen))
+        result = unpack_lbt_dl_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_NB_HARQ_INDICATION:
+      if (check_unpack_length(NFAPI_NB_HARQ_INDICATION, unpackedBufLen))
+        result = unpack_nb_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_NRACH_INDICATION:
+      if (check_unpack_length(NFAPI_NRACH_INDICATION, unpackedBufLen))
+        result = unpack_nrach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_DL_NODE_SYNC:
+      if (check_unpack_length(NFAPI_DL_NODE_SYNC, unpackedBufLen))
+        result = unpack_dl_node_sync(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_UL_NODE_SYNC:
+      if (check_unpack_length(NFAPI_UL_NODE_SYNC, unpackedBufLen))
+        result = unpack_ul_node_sync(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_TIMING_INFO:
+      if (check_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
+        result = unpack_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_UE_RELEASE_RESPONSE:
+      if (check_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
+        result = unpack_ue_release_resp(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    default:
+      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->unpack_p7_vendor_extension) {
+          result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+      }
+
+      break;
+  }
+
+  if(result == 0)
+    return -1;
+  else
+    return 0;
+}
+
+int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config)
+{
+	int result = 0;
+	nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t*)pUnpackedBuf;
+	uint8_t *pReadPackedMessage = pMessageBuf;
+	uint8_t *end = pMessageBuf + messageBufLen;
+	
+	if (pMessageBuf == NULL || pUnpackedBuf == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
+		return -1;
+	}
+
+	if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t))
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+		return -1;
+	}
+  
+    // uint8_t *ptr = pMessageBuf;
+	// printf("\n Read P7 message unpack: ");
+	// while(ptr < end){
+	// 	printf(" %d ", *ptr);
+	// 	ptr++;
+	// }
+	// printf("\n");
+
+	// clean the supplied buffer for - tag value blanking
+	(void)memset(pUnpackedBuf, 0, unpackedBufLen);
+
+	// process the header
+	if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+		 pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+		 pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+		 pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
+		 pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
+		 pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
+		return -1;
+	}
+
+	if((uint8_t*)(pMessageBuf + pMessageHeader->message_length) > end)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
+		return -1;
+	}
+
+	/*
+	if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
+		return -1;
+	}
+	*/
+
+	// look for the specific message
+	switch (pMessageHeader->message_id)
+	{   
+		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST, unpackedBufLen))
+				result = unpack_dl_tti_request(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST, unpackedBufLen))
+				result = unpack_ul_tti_request(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+		case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST, unpackedBufLen))
+				result = unpack_tx_data_request(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+		case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST, unpackedBufLen))
+				result = unpack_ul_dci_request(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+		
+		case NFAPI_UE_RELEASE_REQUEST:
+			if (check_nr_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
+				result = unpack_ue_release_request(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+		case NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION, unpackedBufLen)){
+				nfapi_nr_slot_indication_scf_t* msg = (nfapi_nr_slot_indication_scf_t*) pMessageHeader;
+				result = unpack_nr_slot_indication(&pReadPackedMessage,  end, msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case  NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION, unpackedBufLen)){
+				nfapi_nr_rx_data_indication_t* msg = (nfapi_nr_rx_data_indication_t*) pMessageHeader;
+				msg->pdu_list = (nfapi_nr_rx_data_pdu_t*) malloc(sizeof(nfapi_nr_rx_data_pdu_t));
+				msg->pdu_list->pdu = (uint8_t *) malloc(sizeof(uint8_t));
+				result = unpack_nr_rx_data_indication(&pReadPackedMessage,  end, msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case  NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION, unpackedBufLen)){
+
+				nfapi_nr_crc_indication_t* msg = (nfapi_nr_crc_indication_t*) pMessageHeader;
+				msg->crc_list = (nfapi_nr_crc_t*) malloc(sizeof(nfapi_nr_crc_t));
+				result = unpack_nr_crc_indication(&pReadPackedMessage,end , msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case  NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION, unpackedBufLen)){
+				nfapi_nr_uci_indication_t* msg = (nfapi_nr_uci_indication_t*) pMessageHeader;
+				msg->uci_list = (nfapi_nr_uci_t*) malloc(sizeof(nfapi_nr_uci_t));
+				result = unpack_nr_uci_indication(&pReadPackedMessage,  end, msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case  NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION, unpackedBufLen)){
+				nfapi_nr_srs_indication_t* msg = (nfapi_nr_srs_indication_t*) pMessageHeader;
+				msg->pdu_list = (nfapi_nr_srs_indication_pdu_t*) malloc(sizeof(nfapi_nr_srs_indication_pdu_t));
+				result = unpack_nr_srs_indication(&pReadPackedMessage,  end, msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case  NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION, unpackedBufLen)){
+				nfapi_nr_rach_indication_t* msg = (nfapi_nr_rach_indication_t*) pMessageHeader;
+				result = unpack_nr_rach_indication(&pReadPackedMessage,  end, msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC, unpackedBufLen))
+				result = unpack_nr_dl_node_sync(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC, unpackedBufLen))
+				result = unpack_nr_ul_node_sync(&pReadPackedMessage, end , pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		case NFAPI_TIMING_INFO:
+			if (check_nr_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
+				result = unpack_nr_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		case NFAPI_UE_RELEASE_RESPONSE:
+			if (check_nr_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
+				result = unpack_ue_release_resp(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		default:
+
+			if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN && 
+			   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
+			{
+				if(config && config->unpack_p7_vendor_extension)
+				{
+					result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
+				}
+				else
+				{
+					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+				}
+			}
+			else
+			{
+				NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+			}
+			break;
+	}
+
+	if(result == 0)
+		return -1;
+	else 
+		return 0;
+}
+
+
diff --git a/nfapi/open-nFAPI/pnf/inc/pnf_p7.h b/nfapi/open-nFAPI/pnf/inc/pnf_p7.h
index 1e2e2fa21d25733a26ee24ffe4c1bd0381330db8..763b5c9abe11fc153aa453b54bd27e689cfe85c5 100644
--- a/nfapi/open-nFAPI/pnf/inc/pnf_p7.h
+++ b/nfapi/open-nFAPI/pnf/inc/pnf_p7.h
@@ -153,10 +153,17 @@ int pnf_p7_send_message(pnf_p7_t* pnf_p7, uint8_t* msg, uint32_t msg_len);
 
 int pnf_p7_slot_ind(pnf_p7_t* config, uint16_t phy_id, uint16_t sfn, uint16_t slot);
 int pnf_p7_subframe_ind(pnf_p7_t* config, uint16_t phy_id, uint16_t sfn_sf);
-
+int nfapi_pnf_p7_nr_slot_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_slot_indication_scf_t* ind);
+int nfapi_pnf_p7_nr_rx_data_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_rx_data_indication_t* ind);
+int nfapi_pnf_p7_nr_crc_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_crc_indication_t* ind);
+int nfapi_pnf_p7_nr_srs_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_srs_indication_t* ind);
+int nfapi_pnf_p7_nr_uci_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_uci_indication_t* ind);
+int nfapi_pnf_p7_nr_rach_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_rach_indication_t* ind);
 pnf_p7_rx_message_t* pnf_p7_rx_reassembly_queue_add_segment(pnf_p7_t* pnf_p7, pnf_p7_rx_reassembly_queue_t* queue, uint32_t rx_hr_time, uint16_t sequence_number, uint16_t segment_number, uint8_t m, uint8_t* data, uint16_t data_len);
 void pnf_p7_rx_reassembly_queue_remove_msg(pnf_p7_t* pnf_p7, pnf_p7_rx_reassembly_queue_t* queue, pnf_p7_rx_message_t* msg);
 void pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7_t* pnf_p7, pnf_p7_rx_reassembly_queue_t* queue, uint32_t rx_hr_time, uint32_t delta);
 
+int pnf_nr_p7_pack_and_send_p7_message(pnf_p7_t* pnf_p7, nfapi_p7_message_header_t* header, uint32_t msg_len);
+
 #endif /* _PNF_P7_H_ */
 
diff --git a/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h b/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h
index 8520a5d1620e74ad2b6848e27742f50412862113..fc9cd660774bbf497e77eb76ecfa1691c8a2f965 100644
--- a/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h
+++ b/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h
@@ -27,6 +27,7 @@ extern "C" {
 #include <openair2/PHY_INTERFACE/IF_Module.h>
 #include "nfapi_nr_interface.h"
 #include "nfapi_nr_interface_scf.h"
+
 #include <sys/types.h>
 #include "openair1/PHY/defs_gNB.h"
 
diff --git a/nfapi/open-nFAPI/pnf/src/pnf_p7.c b/nfapi/open-nFAPI/pnf/src/pnf_p7.c
index 18891cdee955d24928b84f40967f0edb63d769f4..092b967189b5050d057aaa87171dc547ac071e97 100644
--- a/nfapi/open-nFAPI/pnf/src/pnf_p7.c
+++ b/nfapi/open-nFAPI/pnf/src/pnf_p7.c
@@ -156,17 +156,16 @@ nfapi_dl_config_request_t* allocate_nfapi_dl_config_request(pnf_p7_t* pnf_p7)
 void deallocate_nfapi_dl_tti_request(nfapi_nr_dl_tti_request_t* req, pnf_p7_t* pnf_p7) 
 { 
   //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->dl_config_request_body.dl_config_pdu_list);
-	/*
-	if(pnf_p7->_public.codec_config.deallocate)
-	{	
-		//nfapi_nr_dl_tti_request_pdu_t *temp = &req->dl_tti_pdu_list;
-		(pnf_p7->_public.codec_config.deallocate)(req); 
-	}
-	else
-	{
-		free(req);
-	}
-*/
+	
+	// if(pnf_p7->_public.codec_config.deallocate)
+	// {	
+	// 	(pnf_p7->_public.codec_config.deallocate)(req); 
+	// }
+	// else
+	// {
+	// 	free(req);
+	// }
+
 	pnf_p7_free(pnf_p7, req);
 }
 
@@ -915,14 +914,13 @@ void send_dummy_subframe(pnf_p7_t* pnf_p7, uint16_t sfn_sf)
 
 
 int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t slot)
-{
+{	
+	//This function is aligned with rx sfn/slot
+
 	// We could either send an event to the p7 thread have have it run the
 	// subframe or we could handle it here and lock access to the subframe
 	// buffers. If we do it on the p7 thread then we run the risk of blocking
 	// on the udp send. 
-	//
-	// todo : start a timer to give us more of the 1 ms tick before send back
-	// the frame
 	
 	// todo : consider a more efficent lock mechasium
 	//uint16_t NUM_SLOTS = 20;//10* 2^mu
@@ -935,21 +933,21 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 
 	// save the curren time, sfn and slot
 	pnf_p7->slot_start_time_hr = pnf_get_current_time_hr();
-	pnf_p7->sfn = sfn;
-	
-	pnf_p7->slot = slot;
-
-
-
+	slot_ahead = 6;
 	uint32_t sfn_slot_tx = sfnslot_add_slot(sfn, slot, slot_ahead);
-	uint16_t sfn_tx = sfn_slot_tx>>6;
-	uint16_t slot_tx = sfn_slot_tx & 0X3F;
+	uint16_t sfn_tx = NFAPI_SFNSLOT2SFN(sfn_slot_tx);
+	uint8_t slot_tx = NFAPI_SFNSLOT2SLOT(sfn_slot_tx);
 
-	// uint32_t tx_sfn_slot_dec = NFAPI_SFNSLOT2DEC(sfn,slot);
-	uint32_t tx_slot_dec = NFAPI_SFNSLOT2DEC(sfn,slot);
+	//We align the pnf_p7 sfn/slot with tx sfn/slot, and vnf is synced with pnf_p7 sfn/slot. This is so that the scheduler runs slot_ahead from rx thread.
 
+	pnf_p7->sfn = sfn_tx;
+	pnf_p7->slot = slot_tx; 
 
-	//uint32_t tx_sfn_slot_dec = NFAPI_SFNSLOT2DEC(sfn_slot_tx);
+	uint32_t rx_slot_dec = NFAPI_SFNSLOT2DEC(sfn, slot);
+	uint8_t buffer_index_rx = rx_slot_dec % 20; 
+
+	uint32_t tx_slot_dec = NFAPI_SFNSLOT2DEC(sfn_tx,slot_tx);
+	uint8_t buffer_index_tx = tx_slot_dec % 20;
 
 	// If the subframe_buffer has been configured
 	if(pnf_p7->_public.slot_buffer_size!= 0) // for now value is same as sf_buffer_size
@@ -976,28 +974,20 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 			pnf_p7->slot_shift = 0;
 		}
 
-		uint32_t slot_dec = NFAPI_SFNSLOT2DEC(sfn, slot);
-		uint8_t buffer_index = slot_dec % pnf_p7->_public.slot_buffer_size; 
-
-		nfapi_pnf_p7_slot_buffer_t* slot_buffer = &(pnf_p7->slot_buffer[buffer_index]);
-		// see where the PNF_P7 slot buffer its getting filled
+		nfapi_pnf_p7_slot_buffer_t* rx_slot_buffer = &(pnf_p7->slot_buffer[buffer_index_rx]);
 
-		uint8_t tx_buffer_index = tx_slot_dec % pnf_p7->_public.slot_buffer_size;
-		nfapi_pnf_p7_slot_buffer_t* tx_slot_buffer = &(pnf_p7->slot_buffer[tx_buffer_index]);
+		nfapi_pnf_p7_slot_buffer_t* tx_slot_buffer = &(pnf_p7->slot_buffer[buffer_index_tx]);
 
-                if (0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() shift:%d slot_buffer->sfn_sf:%d tx_slot_buffer->sfn_slot:%d sfn_sf:%d subframe_buffer[buffer_index:%u dl_config_req:%p tx_req:%p] "
-                    "TX:sfn_sf:%d:tx_buffer_index:%d[dl_config_req:%p tx_req:%p]\n", 
-                    __FUNCTION__, 
-                    pnf_p7->slot_shift, 
-                    NFAPI_SFNSLOT2DEC(slot_buffer->sfn, slot_buffer->slot), 
-                    NFAPI_SFNSLOT2DEC(tx_slot_buffer->sfn, tx_slot_buffer->slot), 
-                       	slot_dec,    buffer_index,    slot_buffer->dl_tti_req,    slot_buffer->tx_data_req, 
-                    	tx_slot_dec, tx_buffer_index, tx_slot_buffer->dl_tti_req, tx_slot_buffer->tx_data_req);
+                // if (0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() shift:%d slot_buffer->sfn_sf:%d tx_slot_buffer->sfn_slot:%d sfn_sf:%d subframe_buffer[buffer_index:%u dl_config_req:%p tx_req:%p] "
+                //     "TX:sfn_sf:%d:tx_buffer_index:%d[dl_config_req:%p tx_req:%p]\n", 
+                //     __FUNCTION__, 
+                //     pnf_p7->slot_shift, 
+                //     NFAPI_SFNSLOT2DEC(rx_slot_buffer->sfn, rx_slot_buffer->slot), 
+                //     NFAPI_SFNSLOT2DEC(tx_slot_buffer->sfn, tx_slot_buffer->slot), 
+                //        	slot_dec,    buffer_index_rx, rx_slot_buffer->dl_tti_req, rx_slot_buffer->tx_data_req, 
+                //     	tx_slot_dec, buffer_index_tx, tx_slot_buffer->dl_tti_req, tx_slot_buffer->tx_data_req);
 					//TODO: Change later if required
 
-
-		// if the subframe buffer sfn sf is set then we have atlease 1 message
-		// from the vnf. 
 		// todo : how to handle the messages we don't have, send dummies for
 		// now
 
@@ -1006,37 +996,39 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 		//printf("tx_slot_buff_sfn - %d, tx_slot_buf_slot - %d, sfn_tx = %d, sllot_tx - %d \n",tx_slot_buffer->sfn,tx_slot_buffer->slot,sfn_tx,slot_tx);
 		// if(tx_slot_buffer->slot == slot_tx && tx_slot_buffer->sfn == sfn_tx)
 		// {	
-			
-			if(tx_slot_buffer->tx_data_req != 0)
-			{
+		
+		//checking in the tx slot buffers to see if a p7 msg is present. todo: what if it's a mixed slot? 
+
+		if(tx_slot_buffer->tx_data_req != 0 && tx_slot_buffer->tx_data_req->SFN == sfn_tx && tx_slot_buffer->tx_data_req->Slot == slot_tx)
+		{
 				
-				if(pnf_p7->_public.tx_data_req_fn)
-					{						
-						(pnf_p7->_public.tx_data_req_fn)(&(pnf_p7->_public), tx_slot_buffer->tx_data_req);
-					}
+			if(pnf_p7->_public.tx_data_req_fn)
+			{	
+				//NFAPI_TRACE(NFAPI_TRACE_INFO, "Calling tx_data_req_fn in SFN/slot %d.%d \n",sfn,slot);
+				LOG_D(PHY, "Process tx_data SFN/slot %d.%d buffer index: %d \n",sfn_tx,slot_tx,buffer_index_tx);	
+				(pnf_p7->_public.tx_data_req_fn)(&(pnf_p7->_public), tx_slot_buffer->tx_data_req);
 			}
-			else 
+		}
+		else 
+		{
+			// send dummy
+			if(pnf_p7->_public.tx_data_req_fn && pnf_p7->_public.dummy_slot.tx_data_req)
 			{
-				// send dummy
-				if(pnf_p7->_public.tx_data_req_fn && pnf_p7->_public.dummy_slot.tx_data_req)
-				{
-					pnf_p7->_public.dummy_slot.tx_data_req->SFN = sfn_tx;
-					pnf_p7->_public.dummy_slot.tx_data_req->Slot = slot_tx; 
+				pnf_p7->_public.dummy_slot.tx_data_req->SFN = sfn_tx;
+				pnf_p7->_public.dummy_slot.tx_data_req->Slot = slot_tx; 
 					
-					(pnf_p7->_public.tx_data_req_fn)(&(pnf_p7->_public), pnf_p7->_public.dummy_slot.tx_data_req);
-				}
+				(pnf_p7->_public.tx_data_req_fn)(&(pnf_p7->_public), pnf_p7->_public.dummy_slot.tx_data_req);
 			}
-		//} 
-
-		if( tx_slot_buffer->dl_tti_req != 0) // ADDED & TO BYPASS ERROR
+		}
+		 
+		if(tx_slot_buffer->dl_tti_req != 0 && tx_slot_buffer->dl_tti_req->SFN == sfn_tx && tx_slot_buffer->dl_tti_req->Slot == slot_tx) 
 		{
 			if(pnf_p7->_public.dl_tti_req_fn)
 			{
+				LOG_D(PHY, "Process dl_tti SFN/slot %d.%d buffer index: %d \n",sfn_tx,slot_tx,buffer_index_tx);
 				(pnf_p7->_public.dl_tti_req_fn)(NULL, &(pnf_p7->_public), tx_slot_buffer->dl_tti_req);
 			}
 		}
-
-
 		else
 		{
 			// send dummy
@@ -1048,10 +1040,13 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 			}
 		}
 
-		if(tx_slot_buffer->ul_dci_req!= 0)
+
+		if(tx_slot_buffer->ul_dci_req!= 0 && tx_slot_buffer->ul_dci_req->SFN == sfn_tx && tx_slot_buffer->ul_dci_req->Slot == slot_tx)
 		{
 			if(pnf_p7->_public.ul_dci_req_fn)
 			{   
+				//NFAPI_TRACE(NFAPI_TRACE_INFO, "Calling UL_dci_req_fn in SFN/slot %d.%d \n",sfn,slot);
+				LOG_D(PHY, "Process ul_dci SFN/slot %d.%d buffer index: %d \n",sfn_tx,slot_tx,buffer_index_tx);
  				(pnf_p7->_public.ul_dci_req_fn)(NULL, &(pnf_p7->_public), tx_slot_buffer->ul_dci_req);
 			}
 		}
@@ -1065,10 +1060,14 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 				(pnf_p7->_public.ul_dci_req_fn)(NULL, &(pnf_p7->_public), pnf_p7->_public.dummy_slot.ul_dci_req);
 			}
 		}
+
+		//deallocate slot buffers after passing down the PDUs to PHY processing
+
 		if(tx_slot_buffer->dl_tti_req != 0)
 		{
 			deallocate_nfapi_dl_tti_request(tx_slot_buffer->dl_tti_req, pnf_p7);
 			tx_slot_buffer->dl_tti_req = 0;
+			LOG_D(PHY,"SFN/slot %d.%d Buffer index : %d freed \n",sfn_tx,slot_tx,buffer_index_tx);
 		}
 
 		if(tx_slot_buffer->tx_data_req != 0)
@@ -1082,73 +1081,52 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 			deallocate_nfapi_ul_dci_request(tx_slot_buffer->ul_dci_req, pnf_p7);
 			tx_slot_buffer->ul_dci_req = 0;
 		}
-		else
-		{
-				// If we ever need to "send" a dummy ul_config this won't work!!!
-				// send_dummy_subframe(pnf_p7, sfn_sf_tx);
-
-				// send_dummy_slot(pnf_p7, sfn_tx, slot_tx);
-		}
 
 
+		//checking in the rx slot buffers to see if a p7 msg is present.
 
-		if(slot_buffer->sfn == sfn && slot_buffer->slot == slot )
+		if(rx_slot_buffer->ul_tti_req != 0 && rx_slot_buffer->ul_tti_req->SFN == sfn && rx_slot_buffer->ul_tti_req->Slot == slot)
 		{
-
-			if(slot_buffer->ul_tti_req != 0)
-			{
-				if(pnf_p7->_public.ul_tti_req_fn)
-				{ 
-					(pnf_p7->_public.ul_tti_req_fn)(NULL, &(pnf_p7->_public), slot_buffer->ul_tti_req);
-				}
-				//deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7);
+			if(pnf_p7->_public.ul_tti_req_fn)
+			{ 	
+				//NFAPI_TRACE(NFAPI_TRACE_INFO, "Calling UL_tti_req_fn in SFN/slot %d.%d \n",sfn,slot);
+				(pnf_p7->_public.ul_tti_req_fn)(NULL, &(pnf_p7->_public), rx_slot_buffer->ul_tti_req);
 			}
-			else
+		}
+		else
+		{
+			// send dummy
+			if(pnf_p7->_public.ul_tti_req_fn && pnf_p7->_public.dummy_slot.ul_tti_req)
 			{
-				// send dummy
-				if(pnf_p7->_public.ul_tti_req_fn && pnf_p7->_public.dummy_slot.ul_tti_req)
-				{
-					pnf_p7->_public.dummy_slot.ul_tti_req->SFN = sfn;
-					pnf_p7->_public.dummy_slot.ul_tti_req->Slot = slot;
-					(pnf_p7->_public.ul_tti_req_fn)(NULL, &(pnf_p7->_public), pnf_p7->_public.dummy_slot.ul_tti_req);
-				}
+				pnf_p7->_public.dummy_slot.ul_tti_req->SFN = sfn;
+				pnf_p7->_public.dummy_slot.ul_tti_req->Slot = slot;
+				LOG_D(PHY, "Process ul_tti SFN/slot %d.%d buffer index: %d \n",sfn,slot,buffer_index_rx);
+				(pnf_p7->_public.ul_tti_req_fn)(NULL, &(pnf_p7->_public), pnf_p7->_public.dummy_slot.ul_tti_req);
 			}
-			//if(subframe_buffer->dl_config_req != 0)
-			//deallocate_nfapi_dl_config_request(subframe_buffer->dl_config_req, pnf_p7);
-			//if(subframe_buffer->tx_req != 0)
-			//deallocate_nfapi_tx_request(subframe_buffer->tx_req, pnf_p7);
-			if(slot_buffer->ul_tti_req != 0)
-			{
-				deallocate_nfapi_ul_tti_request(slot_buffer->ul_tti_req, pnf_p7);
-				slot_buffer->ul_tti_req = 0;
+		}
+		if(rx_slot_buffer->ul_tti_req != 0)
+		{
+			deallocate_nfapi_ul_tti_request(rx_slot_buffer->ul_tti_req, pnf_p7);
+			rx_slot_buffer->ul_tti_req = 0;
 
-			}
-			#if 0
-			if(slot_buffer->lbt_dl_config_req != 0)
-			{
-				deallocate_nfapi_lbt_dl_config_request(slot_buffer->lbt_dl_config_req, pnf_p7);
-				slot_buffer->lbt_dl_config_req = 0;
-			}
-			#endif
-		} // sfn_slot match
+		}
 
+		//reset slot buffer 
 
-		if ( slot_buffer->dl_tti_req == 0 &&
-			 slot_buffer->tx_data_req == 0 && 
-			 slot_buffer->ul_tti_req == 0)
-			 //slot_buffer->lbt_dl_config_req == 0 && 
-			 //slot_buffer->ue_release_req == 0)
+		if ( rx_slot_buffer->dl_tti_req == 0 &&
+			 rx_slot_buffer->tx_data_req == 0 && 
+			 rx_slot_buffer->ul_tti_req == 0)
 		{
-			memset(&(pnf_p7->slot_buffer[buffer_index]), 0, sizeof(nfapi_pnf_p7_slot_buffer_t));
-			pnf_p7->slot_buffer[buffer_index].sfn = -1;
-			pnf_p7->slot_buffer[buffer_index].slot = -1;
+			memset(&(pnf_p7->slot_buffer[buffer_index_rx]), 0, sizeof(nfapi_pnf_p7_slot_buffer_t));
+			pnf_p7->slot_buffer[buffer_index_rx].sfn = -1;
+			pnf_p7->slot_buffer[buffer_index_rx].slot = -1;
 		}
 
 		//printf("pnf_p7->_public.timing_info_mode_periodic:%d pnf_p7->timing_info_period_counter:%d pnf_p7->_public.timing_info_period:%d\n", pnf_p7->_public.timing_info_mode_periodic, pnf_p7->timing_info_period_counter, pnf_p7->_public.timing_info_period);
 		//printf("pnf_p7->_public.timing_info_mode_aperiodic:%d pnf_p7->timing_info_aperiodic_send:%d\n", pnf_p7->_public.timing_info_mode_aperiodic, pnf_p7->timing_info_aperiodic_send);
 		//printf("pnf_p7->timing_info_ms_counter:%d\n", pnf_p7->timing_info_ms_counter);
 
-		// send the periodic timing info if configured
+		//send the periodic timing info if configured
 		if(pnf_p7->_public.timing_info_mode_periodic && (pnf_p7->timing_info_period_counter++) == pnf_p7->_public.timing_info_period)
 		{
 			pnf_nr_pack_and_send_timing_info(pnf_p7);
@@ -1167,26 +1145,6 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 		}
 
 	}
-	else
-	{
-		//send_dummy_subframe(pnf_p7, sfn_sf_tx);
-	}
-
-
-        //printf("pnf_p7->tick:%d\n", pnf_p7->tick);
-	// if(pnf_p7->tick == 1000) // why?
-	// {
-	// 	// TODO: change stats to nr_stats
-	// 	NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF P7:%d] (ONTIME/LATE) DL:(%d/%d) UL:(%d/%d) HI:(%d/%d) TX:(%d/%d)\n", pnf_p7->_public.phy_id,
-	// 				pnf_p7->stats.dl_conf_ontime, pnf_p7->stats.dl_conf_late, 
-	// 				pnf_p7->stats.ul_conf_ontime, pnf_p7->stats.ul_conf_late, 
-	// 				pnf_p7->stats.hi_dci0_ontime, pnf_p7->stats.hi_dci0_late, 
-	// 				pnf_p7->stats.tx_ontime, pnf_p7->stats.tx_late);
-	// 	pnf_p7->tick = 0;
-	// 	memset(&pnf_p7->stats, 0, sizeof(pnf_p7->stats));
-	// }
-	// pnf_p7->tick++;
-
 
 	if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0)
 	{
@@ -1495,7 +1453,7 @@ uint8_t is_nr_p7_request_in_window(uint16_t sfn,uint16_t slot, const char* name,
 {
 	uint32_t recv_sfn_slot_dec = NFAPI_SFNSLOT2DEC(sfn,slot);
 	uint32_t current_sfn_slot_dec = NFAPI_SFNSLOT2DEC(phy->sfn,phy->slot);
-	printf("p7_msg_sfn: %d, p7_msg_slot: %d, phy_sfn:%d , phy_slot:%d \n",sfn,slot,phy->sfn,phy->slot);
+	//printf("p7_msg_sfn: %d, p7_msg_slot: %d, phy_sfn:%d , phy_slot:%d \n",sfn,slot,phy->sfn,phy->slot);
 	uint8_t in_window = 0;
 	uint8_t timing_window = phy->_public.slot_buffer_size;
 
@@ -1546,11 +1504,11 @@ uint8_t is_nr_p7_request_in_window(uint16_t sfn,uint16_t slot, const char* name,
 	// }
 	if(current_sfn_slot_dec <= recv_sfn_slot_dec + timing_window){
 		in_window = 1;
-		NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d\n", current_sfn_slot_dec, name, recv_sfn_slot_dec);
+		//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d\n", current_sfn_slot_dec, name, recv_sfn_slot_dec);
 	}
 	else if(current_sfn_slot_dec + NFAPI_MAX_SFNSLOTDEC <= recv_sfn_slot_dec + timing_window){ //checking for wrap
 		in_window = 1;
-		NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d\n", current_sfn_slot_dec, name, recv_sfn_slot_dec);
+		//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d\n", current_sfn_slot_dec, name, recv_sfn_slot_dec);
 	}
   
 	else
@@ -1630,7 +1588,6 @@ void pnf_handle_dl_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 		NFAPI_TRACE(NFAPI_TRACE_INFO, "%s failed to alloced nfapi_dl_tti_request structure\n");
 		return;
 	}
-
 	int unpack_result = nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_nr_dl_tti_request_t), &(pnf_p7->_public.codec_config));
 
 	if(unpack_result == 0)
@@ -1640,34 +1597,18 @@ void pnf_handle_dl_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 			NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n");
 			return;
 		}
-#if 0
-                if (
-                    0 && 
-                    (NFAPI_SFNSF2DEC(req->sfn_sf) % 100 ==0 ||
-                     NFAPI_SFNSF2DEC(req->sfn_sf) % 105 ==0 
-                    )
-                )
-                  NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_CONFIG.req sfn_sf:%d pdcch:%u dci:%u pdu:%u pdsch_rnti:%u pcfich:%u\n", 
-                      NFAPI_SFNSF2DEC(req->sfn_sf),
-                      req->dl_config_request_body.number_pdcch_ofdm_symbols,
-                      req->dl_config_request_body.number_dci,
-                      req->dl_config_request_body.number_pdu,
-                      req->dl_config_request_body.number_pdsch_rnti,
-                      req->dl_config_request_body.transmission_power_pcfich
-                      );
-#endif
 
-                if(is_nr_p7_request_in_window(req->SFN,req->Slot, "dl_tti_request", pnf_p7))
-                {
-                  uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(req->SFN,req->Slot);
-                  uint8_t buffer_index = sfn_slot_dec % pnf_p7->_public.slot_buffer_size;
+        if(is_nr_p7_request_in_window(req->SFN,req->Slot, "dl_tti_request", pnf_p7))
+            {
+                uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(req->SFN,req->Slot);
+                uint8_t buffer_index = sfn_slot_dec % 20;
 
-                        struct timespec t;
-                        clock_gettime(CLOCK_MONOTONIC, &t);
+                struct timespec t;
+                clock_gettime(CLOCK_MONOTONIC, &t);
 
-                  //NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE DL_TTI_REQ sfn_slot:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_slot_dec, buffer_index);
+                NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE DL_TTI_REQ current tx sfn/slot:%d.%d p7 msg sfn/slot: %d.%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, pnf_p7->sfn,pnf_p7->slot, req->SFN, req->Slot, buffer_index);
 
-			// if there is already an dl_config_req make sure we free it.
+			// if there is already an dl_tti_req make sure we free it.
 			if(pnf_p7->slot_buffer[buffer_index].dl_tti_req != 0)
 			{
 				NFAPI_TRACE(NFAPI_TRACE_NOTE, "%s() is_nr_p7_request_in_window()=TRUE buffer_index occupied - free it first sfn_slot:%d buffer_index:%d\n", __FUNCTION__, NFAPI_SFNSLOT2DEC(req->SFN,req->Slot), buffer_index);
@@ -1677,7 +1618,7 @@ void pnf_handle_dl_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 				deallocate_nfapi_dl_tti_request(pnf_p7->slot_buffer[buffer_index].dl_tti_req, pnf_p7);
 			}
 
-			// saving dl_config_request in subframe buffer
+			// filling dl_tti_request in slot buffer
 			pnf_p7->slot_buffer[buffer_index].sfn = req->SFN;
 			pnf_p7->slot_buffer[buffer_index].slot = req->Slot;
 			pnf_p7->slot_buffer[buffer_index].dl_tti_req = req;
@@ -1826,12 +1767,12 @@ void pnf_handle_ul_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 		if(is_nr_p7_request_in_window(req->SFN,req->Slot, "ul_tti_request", pnf_p7))
 		{
 			uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(req->SFN,req->Slot);
-			uint8_t buffer_index = sfn_slot_dec % pnf_p7->_public.slot_buffer_size;
+			uint8_t buffer_index = (sfn_slot_dec % 20);
 
                         struct timespec t;
                         clock_gettime(CLOCK_MONOTONIC, &t);
 
-                        NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE UL_TTI_REQ sfn_slot:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_slot_dec, buffer_index);
+                        NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE UL_TTI_REQ current tx sfn/slot:%d.%d p7 msg sfn/slot: %d.%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, pnf_p7->sfn,pnf_p7->slot, req->SFN, req->Slot, buffer_index);
 
 			if(pnf_p7->slot_buffer[buffer_index].ul_tti_req != 0)
 			{
@@ -1841,6 +1782,8 @@ void pnf_handle_ul_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 
 				deallocate_nfapi_ul_tti_request(pnf_p7->slot_buffer[buffer_index].ul_tti_req, pnf_p7);
 			}
+			
+			//filling slot buffer
 
 			pnf_p7->slot_buffer[buffer_index].sfn = req->SFN;
 			pnf_p7->slot_buffer[buffer_index].slot = req->Slot;
@@ -1972,7 +1915,7 @@ void pnf_handle_ul_dci_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 		if(is_nr_p7_request_in_window(req->SFN,req->Slot,"ul_dci_request", pnf_p7))
 		{
 			uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(req->SFN,req->Slot);
-			uint8_t buffer_index = sfn_slot_dec % pnf_p7->_public.slot_buffer_size;
+			uint8_t buffer_index = sfn_slot_dec % 20;
 
 			if(pnf_p7->slot_buffer[buffer_index].ul_dci_req!= 0)
 			{
@@ -2010,7 +1953,7 @@ void pnf_handle_ul_dci_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 	}
 	else
 	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack hi_dci0_req\n");
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack UL DCI req\n");
 		deallocate_nfapi_ul_dci_request(req, pnf_p7);
 	}
 }
@@ -2111,12 +2054,12 @@ void pnf_handle_tx_data_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7
 		if(is_nr_p7_request_in_window(req->SFN, req->Slot,"tx_request", pnf_p7))
 		{
 			uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(req->SFN,req->Slot);
-			uint8_t buffer_index = sfn_slot_dec % pnf_p7->_public.slot_buffer_size;
+			uint8_t buffer_index = sfn_slot_dec % 20;
 
                         struct timespec t;
                         clock_gettime(CLOCK_MONOTONIC, &t);
 
-                        NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE TX_DATA_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_slot_dec, buffer_index);
+                        //NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE TX_DATA_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_slot_dec, buffer_index);
 #if 0
                         if (0 && NFAPI_SFNSF2DEC(req->sfn_sf)%100==0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() TX_REQ.req sfn_sf:%d pdus:%d - TX_REQ is within window\n",
                             __FUNCTION__,
@@ -2678,9 +2621,7 @@ void pnf_nr_dispatch_p7_message(void *pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7
 		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
 			pnf_nr_handle_dl_node_sync(pRecvMsg, recvMsgLen, pnf_p7, rx_hr_time);
 			break;
-
 		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
-		//printf("\nEntering pnf_handle_dl_tti_request sfn=%d,slot=%d \n",pnf_p7->sfn,pnf_p7->slot);
 			pnf_handle_dl_tti_request(pRecvMsg, recvMsgLen, pnf_p7);
 			break;
 		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
@@ -2989,13 +2930,11 @@ void pnf_nr_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_tim
 	struct sockaddr_in remote_addr;
 	socklen_t remote_addr_size = sizeof(remote_addr);
 	remote_addr.sin_family = 2; //hardcoded
-
 	do
 	{
 		// peek the header
 		uint8_t header_buffer[NFAPI_P7_HEADER_LENGTH];
 		recvfrom_result = recvfrom(pnf_p7->p7_sock, header_buffer, NFAPI_P7_HEADER_LENGTH, MSG_DONTWAIT | MSG_PEEK, (struct sockaddr*)&remote_addr, &remote_addr_size);
-
 		if(recvfrom_result > 0)
 		{
 			// get the segment size
@@ -3272,7 +3211,7 @@ int pnf_nr_p7_message_pump(pnf_p7_t* pnf_p7)
 		FD_SET(pnf_p7->p7_sock, &rfds);
 
 		struct timeval timeout;
-		timeout.tv_sec = 1;
+		timeout.tv_sec = 100;
 		timeout.tv_usec = 0;
 
 		selectRetval = select(pnf_p7->p7_sock+1, &rfds, NULL, NULL, &timeout);
diff --git a/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c b/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
index efcb60ce9632e366927ca4cb6c4af18bdcc28775..0db1feb398cc8922c954d0782337b8fc0c3e4691 100644
--- a/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
+++ b/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
@@ -265,3 +265,77 @@ int nfapi_pnf_ue_release_resp(nfapi_pnf_p7_config_t* config, nfapi_ue_release_re
 
 	return pnf_p7_pack_and_send_p7_message(_this, &(resp->header), sizeof(nfapi_ue_release_response_t));
 }
+
+//NR UPLINK INDICATION 
+
+int nfapi_pnf_p7_nr_slot_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_slot_indication_scf_t* ind)
+{
+	if(config == NULL || ind == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__);
+		return -1;
+	}
+
+	pnf_p7_t* _this = (pnf_p7_t*)(config);
+	return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nr_rx_data_indication_t));
+}
+
+int nfapi_pnf_p7_nr_rx_data_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_rx_data_indication_t* ind)
+{
+	if(config == NULL || ind == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__);
+		return -1;
+	}
+
+	pnf_p7_t* _this = (pnf_p7_t*)(config);
+	return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nr_rx_data_indication_t));
+}
+
+int nfapi_pnf_p7_nr_crc_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_crc_indication_t* ind)
+{
+	if(config == NULL || ind == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__);
+		return -1;
+	}
+
+	pnf_p7_t* _this = (pnf_p7_t*)(config);
+	return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nr_crc_indication_t));
+}
+
+int nfapi_pnf_p7_nr_srs_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_srs_indication_t* ind)
+{
+	if(config == NULL || ind == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__);
+		return -1;
+	}
+
+	pnf_p7_t* _this = (pnf_p7_t*)(config);
+	return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nr_srs_indication_t));
+}
+
+int nfapi_pnf_p7_nr_uci_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_uci_indication_t* ind)
+{
+	if(config == NULL || ind == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__);
+		return -1;
+	}
+
+	pnf_p7_t* _this = (pnf_p7_t*)(config);
+	return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nr_uci_indication_t));
+}
+
+int nfapi_pnf_p7_nr_rach_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_rach_indication_t* ind)
+{
+	if(config == NULL || ind == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__);
+		return -1;
+	}
+
+	pnf_p7_t* _this = (pnf_p7_t*)(config);
+	return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nr_rach_indication_t));
+}
diff --git a/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp b/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp
index 4fe5065ceac54c687c1fa73e159b87f3061fc549..1c2f0bef8078a072d7abd9eab6de65cbe3b5568d 100644
--- a/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp
+++ b/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp
@@ -278,7 +278,7 @@ void *fapi_thread_start(void *ptr) {
 
     if(instance->tick == 1000) {
       if(instance->tx_byte_count > 0) {
-        printf("[FAPI] Tx rate %u bytes/sec\n", instance->tx_byte_count);
+        printf("[FAPI] Tx rate %d bytes/sec\n", instance->tx_byte_count);
         instance->tx_byte_count = 0;
       }
 
@@ -319,7 +319,7 @@ void *fapi_thread_start(void *ptr) {
       millisec = now_ts.tv_nsec / 1e6;
 
       if(last_millisec != -1 && ((last_millisec + 1 ) % 1000) != millisec) {
-        printf("*** missing millisec %u %u\n", last_millisec, millisec);
+        printf("*** missing millisec %d %d\n", last_millisec, millisec);
         catchup = millisec - last_millisec - 1;
       }
 
diff --git a/nfapi/open-nFAPI/vnf/inc/vnf_p7.h b/nfapi/open-nFAPI/vnf/inc/vnf_p7.h
index ad1c5e7944295028eab74897ae8db264d836e989..4fcc99f79b7bf27f6f817557932ee0834d0bb38b 100644
--- a/nfapi/open-nFAPI/vnf/inc/vnf_p7.h
+++ b/nfapi/open-nFAPI/vnf/inc/vnf_p7.h
@@ -25,7 +25,6 @@
 #define TIME2TIMEHR(_time) (((uint32_t)(_time.tv_sec) & 0xFFF) << 20 | ((uint32_t)(_time.tv_usec) & 0xFFFFF))
 
 
-
 typedef struct {
 	uint8_t* buffer;
 	uint16_t length;
diff --git a/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h b/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h
index 518b01864e5f60d4d5b041bf93a8a0b84c2c5e5d..31328393c9a5749f8dc784abf74c3a78638b4248 100644
--- a/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h
+++ b/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h
@@ -852,7 +852,15 @@ typedef struct nfapi_vnf_p7_config
 	 *  use the codec_config.deallocate function to release it at a future point
 	 */	
 	int (*nrach_indication)(struct nfapi_vnf_p7_config* config, nfapi_nrach_indication_t* ind);		
-	
+
+	//The NR indication functions below copy uplink information received at the VNF into the UL info struct
+	int (*nr_slot_indication)(nfapi_nr_slot_indication_scf_t* ind);
+	int (*nr_crc_indication)(nfapi_nr_crc_indication_t* ind);
+	int (*nr_rx_data_indication)(nfapi_nr_rx_data_indication_t* ind);
+	int (*nr_uci_indication)(nfapi_nr_uci_indication_t* ind);
+	int (*nr_rach_indication)(nfapi_nr_rach_indication_t* ind);
+	int (*nr_srs_indication)(nfapi_nr_srs_indication_t* ind);
+
 	/*! A callback for any vendor extension messages
      *  \param config A pointer to the vnf p7 configuration
 	 *  \param msg A data structure for the decoded vendor extention message allocated
diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7.c b/nfapi/open-nFAPI/vnf/src/vnf_p7.c
index ffbc5819bc4826eaf0a349edd680e4860c283131..e3900315540f00e1dc88bea25da468fcf48a49a1 100644
--- a/nfapi/open-nFAPI/vnf/src/vnf_p7.c
+++ b/nfapi/open-nFAPI/vnf/src/vnf_p7.c
@@ -22,7 +22,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <errno.h>
-
+#include <stdio.h>
 #include "vnf_p7.h"
 
 #define SYNC_CYCLE_COUNT 2
@@ -456,7 +456,7 @@ int send_mac_subframe_indications(vnf_p7_t* vnf_p7)
 int vnf_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info, uint8_t* msg, const uint32_t len)
 {
 	int sendto_result = sendto(vnf_p7->socket, msg, len, 0, (struct sockaddr*)&(p7_info->remote_addr), sizeof(p7_info->remote_addr)); 
-	//printf("\nSending p7 message sfn=%d,slot=%d\n",vnf_p7->p7_connections->sfn,vnf_p7->p7_connections->slot);
+	//printf("P7 msg sent \n");
 	if(sendto_result != len)
 	{
 		NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sendto_result %d %d\n", __FUNCTION__, sendto_result, errno);
@@ -533,6 +533,7 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t*
 				nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));	
 
 				send_result = vnf_send_p7_msg(vnf_p7, p7_connection,  &tx_buffer[0], segment_size);
+
 			}
 		}
 		else
@@ -549,7 +550,6 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t*
 		}
 
 		p7_connection->sequence_number++;
-
 		return send_result;
 	}
 	else
@@ -667,7 +667,6 @@ int vnf_build_send_dl_node_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t
 
 int vnf_nr_build_send_dl_node_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info)
 {	
-	
 	nfapi_nr_dl_node_sync_t dl_node_sync;
 	memset(&dl_node_sync, 0, sizeof(dl_node_sync));
 
@@ -1290,7 +1289,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
 					{
 						if(phy->in_sync == 0)
 						{
-							NFAPI_TRACE(NFAPI_TRACE_NOTE, "VNF P7 In Sync with phy (phy_id:%d)\n", phy->phy_id); 
+							//NFAPI_TRACE(NFAPI_TRACE_NOTE, "VNF P7 In Sync with phy (phy_id:%d)\n", phy->phy_id); 
 
 							if(vnf_p7->_public.sync_indication)
 								(vnf_p7->_public.sync_indication)(&(vnf_p7->_public), 1);
@@ -1454,6 +1453,161 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
 	}
 }
 
+//NR HANDLES FOR UPLINK MESSAGES
+void vnf_handle_nr_slot_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
+{
+	// ensure it's valid
+	if (pRecvMsg == NULL || vnf_p7 == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
+	}
+	else
+	{
+		nfapi_nr_slot_indication_scf_t ind;
+	
+		if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
+		}
+		else
+		{
+			if(vnf_p7->_public.nr_slot_indication)
+			{
+				(vnf_p7->_public.nr_slot_indication)(&ind);
+			}
+		}
+
+	}
+}
+void vnf_handle_nr_rx_data_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
+{
+	// ensure it's valid
+	if (pRecvMsg == NULL || vnf_p7 == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
+	}
+	else
+	{
+		nfapi_nr_rx_data_indication_t ind;
+	
+		if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
+		}
+		else
+		{
+			if(vnf_p7->_public.nr_rx_data_indication)
+			{
+				(vnf_p7->_public.nr_rx_data_indication)(&ind);
+			}
+		}
+
+	}
+}
+
+void vnf_handle_nr_crc_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
+{
+	// ensure it's valid
+	if (pRecvMsg == NULL || vnf_p7 == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
+	}
+	else
+	{
+		nfapi_nr_crc_indication_t ind;
+	
+		if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
+		}
+		else
+		{
+			if(vnf_p7->_public.nr_crc_indication)
+			{	
+				(vnf_p7->_public.nr_crc_indication)(&ind);
+			}
+		}
+		
+	}
+}
+
+void vnf_handle_nr_srs_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
+{
+	// ensure it's valid
+	if (pRecvMsg == NULL || vnf_p7 == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
+	}
+	else
+	{
+		nfapi_nr_srs_indication_t ind;
+	
+		if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
+		}
+		else
+		{
+			if(vnf_p7->_public.nr_srs_indication)
+			{
+				(vnf_p7->_public.nr_srs_indication)(&ind);
+			}
+		}
+	}
+}
+
+void vnf_handle_nr_uci_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
+{
+	// ensure it's valid
+	if (pRecvMsg == NULL || vnf_p7 == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
+	}
+	else
+	{
+		nfapi_nr_uci_indication_t ind;
+	
+		if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
+		}
+		else
+		{
+			if(vnf_p7->_public.nr_uci_indication)
+			{
+				(vnf_p7->_public.nr_uci_indication)(&ind);
+			}
+		}
+
+	}
+}
+
+void vnf_handle_nr_rach_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
+{
+	// ensure it's valid
+	if (pRecvMsg == NULL || vnf_p7 == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
+	}
+	else
+	{
+		nfapi_nr_rach_indication_t ind;
+	
+		if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
+		}
+		else
+		{
+			if(vnf_p7->_public.nr_rach_indication)
+			{
+				(vnf_p7->_public.nr_rach_indication)(&ind);
+			}
+		}
+		
+	}
+}
+
 void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
 {	
 	//printf("received UL Node sync");
@@ -1484,6 +1638,8 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
 	// divide by 2 using shift operator
 	uint32_t latency =  (tx_2_rx - pnf_proc_time) >> 1;
 
+	//phy->in_sync = 1;
+
 	if(!(phy->filtered_adjust))
 	{
 		phy->latency[phy->min_sync_cycle_count] = latency;
@@ -1533,17 +1689,24 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
                   struct timespec ts;
                   clock_gettime(CLOCK_MONOTONIC, &ts);
 
-			//NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) %d.%d PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d(avg:%4d) offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n", 
-			//		phy->sfn, phy->slot, ts.tv_sec, ts.tv_nsec, ind.header.phy_id,
-					// ind.t1, ind.t2, ind.t3, t4, 
-					// tx_2_rx, pnf_proc_time, latency, phy->average_latency, phy->slot_offset, phy->slot_offset_filtered,
-					// (ind.t1<phy->previous_t1), (ind.t2<phy->previous_t2));
+			// NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) %d.%d PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d(avg:%4d) offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n", 
+			// 		phy->sfn, phy->slot, ts.tv_sec, ts.tv_nsec, ind.header.phy_id,
+			// 		ind.t1, ind.t2, ind.t3, t4, 
+			// 		tx_2_rx, pnf_proc_time, latency, phy->average_latency, phy->slot_offset, phy->slot_offset_filtered,
+			// 		(ind.t1<phy->previous_t1), (ind.t2<phy->previous_t2));
 		}
 
 	}
 
         if (phy->filtered_adjust && (phy->slot_offset_filtered > 1e6 || phy->slot_offset_filtered < -1e6))
-        {
+        {  struct timespec ts;
+           clock_gettime(CLOCK_MONOTONIC, &ts);
+			NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) %d.%d PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d(avg:%4d) offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n", 
+					phy->sfn, phy->slot, ts.tv_sec, ts.tv_nsec, ind.header.phy_id,
+					ind.t1, ind.t2, ind.t3, t4, 
+					tx_2_rx, pnf_proc_time, latency, phy->average_latency, phy->slot_offset, phy->slot_offset_filtered,
+					(ind.t1<phy->previous_t1), (ind.t2<phy->previous_t2));
+
           phy->filtered_adjust = 0;
           phy->zero_count=0;
           phy->min_sync_cycle_count = 2;
@@ -1575,7 +1738,7 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
 
 			sfn_slot_dec += (phy->slot_offset / 500);
 			
-			NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF slot offset:%d sfn :%d slot:%d \n",phy->slot_offset,NFAPI_SFNSLOTDEC2SFN(sfn_slot_dec),NFAPI_SFNSLOTDEC2SLOT(sfn_slot_dec) );
+			//NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF slot offset:%d sfn :%d slot:%d \n",phy->slot_offset,NFAPI_SFNSLOTDEC2SFN(sfn_slot_dec),NFAPI_SFNSLOTDEC2SLOT(sfn_slot_dec) ); 
 
 
 		}
@@ -2033,46 +2196,30 @@ void vnf_nr_dispatch_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
 		case NFAPI_TIMING_INFO:
 			vnf_nr_handle_timing_info(pRecvMsg, recvMsgLen, vnf_p7);
 			break;
-			
-		case NFAPI_HARQ_INDICATION:
-			vnf_handle_harq_indication(pRecvMsg, recvMsgLen, vnf_p7);
+		
+		case NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION:
+			vnf_handle_nr_slot_indication(pRecvMsg, recvMsgLen, vnf_p7);
 			break;
-	
-		case NFAPI_CRC_INDICATION:
-			vnf_handle_crc_indication(pRecvMsg, recvMsgLen, vnf_p7);
+		
+		case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
+			vnf_handle_nr_rx_data_indication(pRecvMsg, recvMsgLen, vnf_p7);
 			break;
 	
-		case NFAPI_RX_ULSCH_INDICATION:
-			vnf_handle_rx_ulsch_indication(pRecvMsg, recvMsgLen, vnf_p7);
+		case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
+			vnf_handle_nr_crc_indication(pRecvMsg, recvMsgLen, vnf_p7);
 			break;
 	
-		case NFAPI_RACH_INDICATION:
-			vnf_handle_rach_indication(pRecvMsg, recvMsgLen, vnf_p7);
+		case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
+			vnf_handle_nr_uci_indication(pRecvMsg, recvMsgLen, vnf_p7);
 			break;
 	
-		case NFAPI_SRS_INDICATION:
-			vnf_handle_srs_indication(pRecvMsg, recvMsgLen, vnf_p7);
+		case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
+			vnf_handle_nr_srs_indication(pRecvMsg, recvMsgLen, vnf_p7);
 			break;
-
-		case NFAPI_RX_SR_INDICATION:
-			vnf_handle_rx_sr_indication(pRecvMsg, recvMsgLen, vnf_p7);
-			break;
-
-		case NFAPI_RX_CQI_INDICATION:
-			vnf_handle_rx_cqi_indication(pRecvMsg, recvMsgLen, vnf_p7);
-			break;
-			
-		case NFAPI_LBT_DL_INDICATION:
-			vnf_handle_lbt_dl_indication(pRecvMsg, recvMsgLen, vnf_p7);
-			break;
-			
-		case NFAPI_NB_HARQ_INDICATION:
-			vnf_handle_nb_harq_indication(pRecvMsg, recvMsgLen, vnf_p7);
+	
+		case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
+			vnf_handle_nr_rach_indication(pRecvMsg, recvMsgLen, vnf_p7);
 			break;
-			
-		case NFAPI_NRACH_INDICATION:
-			vnf_handle_nrach_indication(pRecvMsg, recvMsgLen, vnf_p7);
-			break;			
 
 		case NFAPI_UE_RELEASE_RESPONSE:
 			vnf_handle_ue_release_resp(pRecvMsg, recvMsgLen, vnf_p7);
diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
index 3fa1f035fdc102e6c9a11d8032a7529ecb0e59ce..8cebf2b468b7f38b475d342639106ab421933617 100644
--- a/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
+++ b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
@@ -25,9 +25,14 @@
 #include <errno.h>
 
 #include "vnf_p7.h"
+#include "nfapi_vnf.h"
 
+#include "common/ran_context.h"
+
+#include "openair1/PHY/defs_gNB.h"
 #define FAPI2_IP_DSCP	0
 
+extern RAN_CONTEXT_t RC;
 
 nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create()
 {
@@ -92,7 +97,9 @@ struct timespec timespec_sub(struct timespec lhs, struct timespec rhs)
 // monitor the p7 endpoints and the timing loop and 
 // send indications to mac
 int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config)
-{
+{	
+	struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
+	uint8_t prev_slot = 0;
 	if(config == 0)
 		return -1;
 
@@ -145,40 +152,14 @@ int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config)
 
 	//struct timespec original_pselect_timeout;
 	struct timespec pselect_timeout;
-	pselect_timeout.tv_sec = 0;
-	pselect_timeout.tv_nsec = 500000; // ns in a 0.5 ms
-	//pselect_timeout.tv_nsec = 500000;
-
-	struct timespec pselect_start;
-	struct timespec pselect_stop;
-
-	//struct timespec sf_end;
-
-	long last_millisecond = -1;
-
-
-//	struct timespec sf_duration; //Change to slot_duration?
-//	sf_duration.tv_sec = 0;
-//	sf_duration.tv_nsec = 0.5e6; // We want 1ms pause //We want 0.5 ms pause for NR
-	struct timespec slot_duration; 
-	slot_duration.tv_sec = 0;
-	//slot_duration.tv_nsec = 0.5e6;
-	slot_duration.tv_nsec = 0.5e6;
-
+	pselect_timeout.tv_sec = 100; 
+	pselect_timeout.tv_nsec = 0; 
 
-//	struct timespec sf_start; //Change to slot_start?
-	struct timespec slot_start;
-//	clock_gettime(CLOCK_MONOTONIC, &sf_start);
-	clock_gettime(CLOCK_MONOTONIC, &slot_start);
-	long millisecond = slot_start.tv_nsec / 1e6; //Check if we have to change
-	//long millisecond = slot_start.tv_nsec / 0.5e6;
-//	sf_start = timespec_add(sf_start, sf_duration);
-	slot_start = timespec_add(slot_start, slot_duration);
-
-	NFAPI_TRACE(NFAPI_TRACE_INFO, "next slot will start at %d.%d\n", slot_start.tv_sec, slot_start.tv_nsec);
-    
+    struct timespec ref_time;
+	clock_gettime(CLOCK_MONOTONIC, &ref_time);
+	uint8_t setup_time;
 	while(vnf_p7->terminate == 0)
-	{
+	{	
 		fd_set rfds;
 		int maxSock = 0;
 		FD_ZERO(&rfds);
@@ -188,239 +169,33 @@ int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config)
 		FD_SET(vnf_p7->socket, &rfds);
 		maxSock = vnf_p7->socket;
 		
-		clock_gettime(CLOCK_MONOTONIC, &pselect_start);
-		//long millisecond = pselect_start.tv_nsec / 1e6;
-
-		if((last_millisecond == -1) || (millisecond == last_millisecond) || (millisecond == (last_millisecond + 1) % 1000) )
-		{
-                  //NFAPI_TRACE(NFAPI_TRACE_INFO, "pselect_start:%d.%d sf_start:%d.%d\n", pselect_start.tv_sec, pselect_start.tv_nsec, sf_start.tv_sec, sf_start.tv_nsec);
-
-
-			//if((pselect_start.tv_sec > sf_start.tv_sec) || 
-			//   ((pselect_start.tv_sec == sf_start.tv_sec) && (pselect_start.tv_nsec > sf_start.tv_nsec)))
-			if((pselect_start.tv_sec > slot_start.tv_sec) || ((pselect_start.tv_sec == slot_start.tv_sec) && (pselect_start.tv_nsec > slot_start.tv_nsec)))
-			{
-				// overran the end of the subframe we do not want to wait
-				pselect_timeout.tv_sec = 0;
-				pselect_timeout.tv_nsec = 0;
-
-				//struct timespec overrun = timespec_sub(pselect_start, sf_start);
-				//NFAPI_TRACE(NFAPI_TRACE_INFO, "Subframe overrun detected of %d.%d running to catchup\n", overrun.tv_sec, overrun.tv_nsec);
-			}
-			else
-			{
-				// still time before the end of the subframe wait
-				//pselect_timeout = timespec_sub(sf_start, pselect_start);
-				pselect_timeout = timespec_sub(slot_start, pselect_start);
-			}
-
-//original_pselect_timeout = pselect_timeout;
-
-			// detemine how long to sleep in ns before the start of the next 1ms
-			//pselect_timeout.tv_nsec = 1e6 - (pselect_start.tv_nsec % 1000000);
-
-			//uint8_t underrun_possible =0;
-			
-			// if we are not sleeping until the next milisecond due to the
-			// insycn minor adjment flag it so we don't consider it an error
-			//uint8_t underrun_possible =0;
-			/*
-			{
-				nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections;
-				if(phy && phy->in_sync && phy->insync_minor_adjustment != 0 && phy->insync_minor_adjustment_duration > 0 && pselect_start.tv_nsec != 0)
-				{
-					NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] Subframe minor adjustment %d (%d->%d)\n", phy->insync_minor_adjustment,
-							pselect_timeout.tv_nsec, pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000)) 
-					if(phy->insync_minor_adjustment > 0)
-					{
-						// todo check we don't go below 0
-						if((phy->insync_minor_adjustment * 1000) > pselect_timeout.tv_nsec)
-							pselect_timeout.tv_nsec = 0;
-						else
-							pselect_timeout.tv_nsec = pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000);
-
-
-						//underrun_possible = 1;
-					}
-					else if(phy->insync_minor_adjustment < 0)
-					{
-						// todo check we don't go below 0
-						pselect_timeout.tv_nsec = pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000);
-					
-
-					//phy->insync_minor_adjustment = 0;
-					phy->insync_minor_adjustment_duration--;
-				}
-			}
-			*/
-			
-
-//long wraps = pselect_timeout.tv_nsec % 1e9;
-
-
-			selectRetval = pselect(maxSock+1, &rfds, NULL, NULL, &pselect_timeout, NULL);
-		//	selectRetval = pselect(120, &rfds, NULL, NULL, &pselect_timeout, NULL);
-
-			clock_gettime(CLOCK_MONOTONIC, &pselect_stop);
-
-                        nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections;
-
-if (selectRetval==-1 && errno == 22)
-{
-//  NFAPI_TRACE(NFAPI_TRACE_ERROR, "INVAL: pselect_timeout:%d.%ld adj[dur:%d adj:%d], sf_dur:%d.%ld\n", 
-//  pselect_timeout.tv_sec, pselect_timeout.tv_nsec, 
-//  phy->insync_minor_adjustment_duration, phy->insync_minor_adjustment, 
-//  sf_duration.tv_sec, sf_duration.tv_nsec);
-
-NFAPI_TRACE(NFAPI_TRACE_ERROR, "INVAL: pselect_timeout:%d.%ld adj[dur:%d adj:%d], sf_dur:%d.%ld\n", 
-  pselect_timeout.tv_sec, pselect_timeout.tv_nsec, 
-  phy->insync_minor_adjustment_duration, phy->insync_minor_adjustment, 
-  slot_duration.tv_sec, slot_duration.tv_nsec);
-
-}
-			if(selectRetval == 0)
-			{
-				// calculate the start of the next slot
-				//sf_start = timespec_add(sf_start, sf_duration);
-				slot_start = timespec_add(slot_start, slot_duration);
-				//NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec);
-
-				if(phy && phy->in_sync && phy->insync_minor_adjustment != 0 && phy->insync_minor_adjustment_duration > 0)
-				{
-                                        long insync_minor_adjustment_ns = (phy->insync_minor_adjustment * 1000);
-
-                                        //sf_start.tv_nsec -= insync_minor_adjustment_ns;
-										slot_start.tv_nsec -= insync_minor_adjustment_ns;
-
-#if 1
-/*                                        if (sf_start.tv_nsec > 1e9) //Change to 0.5e6?
-                                        {
-                                          sf_start.tv_sec++;
-                                          sf_start.tv_nsec-=1e9;
-                                        }
-                                        else if (sf_start.tv_nsec < 0)
-                                        {
-                                          sf_start.tv_sec--;
-                                          sf_start.tv_nsec+=1e9;
-                                        }*/
-										if (slot_start.tv_nsec > 1e9) 
-                                        {
-                                          slot_start.tv_sec++;
-                                          slot_start.tv_nsec-=1e9;
-                                        }
-                                        else if (slot_start.tv_nsec < 0)
-                                        {
-                                          slot_start.tv_sec--;
-                                          slot_start.tv_nsec+=1e9;
-                                        }
-#else
-                                        //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] BEFORE adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d\n", phy->insync_minor_adjustment, sf_start.tv_nsec);
-					if(phy->insync_minor_adjustment > 0)
-					{
-						// decrease the subframe duration a little
-                                                if (sf_start.tv_nsec > insync_minor_adjustment_ns)
-                                                  sf_start.tv_nsec -= insync_minor_adjustment_ns;
-                                                else
-                                                {
-                                                  NFAPI_TRACE(NFAPI_TRACE_ERROR, "[VNF] Adjustment would make it negative sf:%d.%ld adjust:%ld\n\n\n", sf_start.tv_sec, sf_start.tv_nsec, insync_minor_adjustment_ns);
-                                                  sf_start.tv_sec--;
-                                                  sf_start.tv_nsec += 1e9 - insync_minor_adjustment_ns;
-                                                }
-					}
-					else if(phy->insync_minor_adjustment < 0)
-					{
-						// todo check we don't go below 0
-						// increase the subframe duration a little
-						sf_start.tv_nsec += insync_minor_adjustment_ns;
-
-                                                if (sf_start.tv_nsec < 0)
-                                                {
-                                                  NFAPI_TRACE(NFAPI_TRACE_ERROR, "[VNF] OVERFLOW %d.%ld\n\n\n\n", sf_start.tv_sec, sf_start.tv_nsec);
-                                                  sf_start.tv_sec++;
-                                                  sf_start.tv_nsec += 1e9;
-                                                }
-					}
-#endif
-
-					//phy->insync_minor_adjustment = 0;
-                                        phy->insync_minor_adjustment_duration--;
-
-//                                        NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] AFTER adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d duration:%u\n", 
-//                                            phy->insync_minor_adjustment, sf_start.tv_nsec, phy->insync_minor_adjustment_duration);
-										// NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] AFTER adjustment - Slot minor adjustment %dus slot_start.tv_nsec:%d duration:%u\n", 
-                                        //     phy->insync_minor_adjustment, slot_start.tv_nsec, phy->insync_minor_adjustment_duration);
-
-                                        if (phy->insync_minor_adjustment_duration==0)
-                                        {
-                                          phy->insync_minor_adjustment = 0;
-                                        }
-				}
-				/*
-				long pselect_stop_millisecond = pselect_stop.tv_nsec / 1e6;
-				if(millisecond == pselect_stop_millisecond)
-				{
-					// we have woke up in the same subframe
-					if(underrun_possible == 0)
-						NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe pselect underrun %ld (%d.%d)\n", millisecond, pselect_stop.tv_sec, pselect_stop.tv_nsec);
-				}
-				else if(((millisecond + 1) % 1000) != pselect_stop_millisecond)
-				{
-					// we have overrun the subframe
-					NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe pselect overrun %ld %ld\n", millisecond, pselect_stop_millisecond);
-					NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe underrun %ld\n", millisecond);
-				}
-				last_millisecond = millisecond;
-				*/
-				
-				//millisecond ++;
-				millisecond = millisecond + 1;
-
-			}
+		struct timespec curr_time;
+		clock_gettime(CLOCK_MONOTONIC, &curr_time);
+		setup_time = curr_time.tv_sec - ref_time.tv_sec;
+
+		if(setup_time > 10 && prev_slot != gNB->UL_INFO.slot){ //Give the VNF sufficient time to setup before starting scheduling
+
+			//Call the scheduler
+			pthread_mutex_lock(&gNB->UL_INFO_mutex);
+			gNB->UL_INFO.module_id = gNB->Mod_id;
+			gNB->UL_INFO.CC_id     = gNB->CC_id;
+			gNB->if_inst->NR_UL_indication(&gNB->UL_INFO);
+			pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+			prev_slot = gNB->UL_INFO.slot;
 		}
-		else
-		{
-			// we have overrun the subframe advance to go and collect $200 
-
-			if((millisecond - last_millisecond) > 3)
-				NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe overrun %ld %ld (%ld)\n", millisecond, last_millisecond, millisecond - last_millisecond + 1);
 
-			last_millisecond = ( last_millisecond + 1 ) % 1000;
-			selectRetval = 0;
-		}
+		selectRetval = pselect(maxSock+1, &rfds, NULL, NULL, &pselect_timeout, NULL);
 
 		if(selectRetval == 0)
 		{
-			//vnf_p7->sf_start_time_hr = vnf_get_current_time_hr();
-			vnf_p7->slot_start_time_hr = vnf_get_current_time_hr();
-struct timespec current_time;
-	clock_gettime(CLOCK_MONOTONIC, &current_time);
-			// pselect timed out
-			nfapi_vnf_p7_connection_info_t* curr = vnf_p7->p7_connections;
-			while(curr != 0)
-			{
-				if (curr->slot == 19)
-				{  //curr->slot = 0; 
-				if(curr->sfn == 1023)
-				curr->sfn=0;
-				else	
-				curr->sfn++;
-				curr->slot=0;
-				}
-				else
-				{
-				curr->slot++;
-				}
-				vnf_nr_sync(vnf_p7, curr);	
-				curr = curr->next;	
-			}
-			send_mac_slot_indications(vnf_p7);
+			// pselect timed out, continue
 		}
 		else if(selectRetval > 0)
 		{
 			// have a p7 message
 			if(FD_ISSET(vnf_p7->socket, &rfds))
-			{
-				vnf_nr_p7_read_dispatch_message(vnf_p7); 
+			{	
+				vnf_nr_p7_read_dispatch_message(vnf_p7); 				
 			}
 		}
 		else
@@ -432,7 +207,7 @@ struct timespec current_time;
 			}
 			else
 			{
-				NFAPI_TRACE(NFAPI_TRACE_INFO, "P7 select failed result %d errno %d timeout:%d.%d orginal:%d.%d last_ms:%ld ms:%ld\n", selectRetval, errno, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, last_millisecond, millisecond);
+				//NFAPI_TRACE(NFAPI_TRACE_INFO, "P7 select failed result %d errno %d timeout:%d.%d orginal:%d.%d last_ms:%ld ms:%ld\n", selectRetval, errno, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, last_millisecond, millisecond);
 				// should we exit now?
                                 if (selectRetval == -1 && errno == 22) // invalid argument??? not sure about timeout duration
                                 {
@@ -440,10 +215,7 @@ struct timespec current_time;
                                 }
 			}
 		}
-
 	}
-
-	
 	NFAPI_TRACE(NFAPI_TRACE_INFO, "Closing p7 socket\n");
 	close(vnf_p7->socket);
 
@@ -862,7 +634,6 @@ int nfapi_vnf_p7_ul_tti_req(nfapi_vnf_p7_config_t* config, nfapi_nr_ul_tti_reque
 {
 	if(config == 0 || req == 0)
 		return -1;
-
 	vnf_p7_t* vnf_p7 = (vnf_p7_t*)config;
 	return vnf_nr_p7_pack_and_send_p7_msg(vnf_p7, &req->header);
 }
diff --git a/openair1/PHY/CODING/3gpplte_sse.c b/openair1/PHY/CODING/3gpplte_sse.c
index fffd04ea3c8c2c25087164223e1ab1e56d227d4c..393b0f4a5d2ae5af14bfaf6c620bea95ac2e72ca 100644
--- a/openair1/PHY/CODING/3gpplte_sse.c
+++ b/openair1/PHY/CODING/3gpplte_sse.c
@@ -373,10 +373,10 @@ char interleave_compact_byte(short *base_interleaver,unsigned char *input, unsig
   short *ptr_intl=base_interleaver;
 #if defined(__x86_64) || defined(__i386__)
 #ifndef __AVX2__
-  __m128i tmp;
+  __m128i tmp={0};
   uint16_t *systematic2_ptr=(uint16_t *) output;
 #else
-  __m256i tmp;
+  __m256i tmp={0};
   uint32_t *systematic2_ptr=(uint32_t *) output;
 #endif
 #elif defined(__arm__)
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
index 8c2513b702b9822f7b8930604b46ea6c7e4543c6..619a8f07b9ac7211d97f915157641e7282f155f3 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
@@ -933,7 +933,7 @@ unsigned char phy_threegpplte_turbo_decoder16avx2(int16_t *y,
   uint32_t db;
 
 
-  __m256i tmp, zeros=_mm256_setzero_si256();
+  __m256i tmp={0}, zeros=_mm256_setzero_si256();
 
 
   int offset8_flag=0;
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
index 50fae438b7629e24bd1e74d11f2b1f7d721fff59..c9d2579314f32a8f3c674ebde6470e700acfe9a9 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
@@ -1105,7 +1105,7 @@ uint8_t phy_threegpplte_turbo_decoder16(int16_t *y,
   uint8_t temp;
 #if defined(__x86_64__) || defined(__i386__)
   __m128i *yp128;
-  __m128i tmp, zeros=_mm_setzero_si128();
+  __m128i tmp={0}, zeros=_mm_setzero_si128();
   __m128i tmpe;
 #elif defined(__arm__)
   int16x8_t *yp128;
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
index bc1c0dac5639ed39c634516b3cebc81c8c162801..264b25deca4520b0d7ea910c35d9b2b2da9e8cd6 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
@@ -819,7 +819,7 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y,
 #if defined(__x86_64__) || defined(__i386__)
   __m128i *yp128;
   __m128i tmp128[(n+8)>>3];
-  __m128i tmp, zeros=_mm_setzero_si128();
+  __m128i tmp={0}, zeros=_mm_setzero_si128();
 #elif defined(__arm__)
   int8x16_t *yp128;
   int8x16_t tmp128[(n+8)>>3];
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index d3b28e7604febc88d7013d5aeb5790c20f5b85f1..e2b493ec7ffff592c786b6725dc47bf7a6a13638 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -46,42 +46,6 @@
 
 #include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
 
-static
-uint16_t get_band(uint64_t downlink_frequency, int32_t delta_duplex)
-{
-  const uint64_t dl_freq_khz = downlink_frequency / 1000;
-  const int32_t  delta_duplex_khz = delta_duplex / 1000;
-
-  uint64_t center_freq_diff_khz = 999999999999999999; // 2^64
-  uint16_t current_band = 0;
-
-  for (int ind = 0; ind < nr_bandtable_size; ind++) {
-
-    LOG_D(PHY, "Scanning band %d, dl_min %"PRIu64", ul_min %"PRIu64"\n", nr_bandtable[ind].band, nr_bandtable[ind].dl_min, nr_bandtable[ind].ul_min);
-
-    if (dl_freq_khz < nr_bandtable[ind].dl_min || dl_freq_khz > nr_bandtable[ind].dl_max)
-      continue;
-
-    int32_t current_offset_khz = nr_bandtable[ind].ul_min - nr_bandtable[ind].dl_min;
-
-    if (current_offset_khz != delta_duplex_khz)
-      continue;
-
-    uint64_t center_frequency_khz = (nr_bandtable[ind].dl_max + nr_bandtable[ind].dl_min) / 2;
-
-    if (abs(dl_freq_khz - center_frequency_khz) < center_freq_diff_khz){
-      current_band = nr_bandtable[ind].band;
-      center_freq_diff_khz = abs(dl_freq_khz - center_frequency_khz);
-    }
-  }
-
-  LOG_I(PHY, "DL frequency %"PRIu64": band %d, UL frequency %"PRIu64"\n",
-        downlink_frequency, current_band, downlink_frequency+delta_duplex);
-
-  AssertFatal(current_band != 0, "Can't find EUTRA band for frequency %"PRIu64" and duplex_spacing %u\n", downlink_frequency, delta_duplex);
-
-  return current_band;
-}
 
 int l1_north_init_gNB() {
 
@@ -121,6 +85,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
   int i;
   int Ptx=cfg->carrier_config.num_tx_ant.value;
   int Prx=cfg->carrier_config.num_rx_ant.value;
+  int max_ul_mimo_layers = 4;
 
   AssertFatal(Ptx>0 && Ptx<9,"Ptx %d is not supported\n",Ptx);
   AssertFatal(Prx>0 && Prx<9,"Prx %d is not supported\n",Prx);
@@ -293,27 +258,30 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
   init_prach_list(gNB);
 
   int N_RB_UL = cfg->carrier_config.ul_grid_size[cfg->ssb_config.scs_common.value].value;
+  int n_buf = Prx*max_ul_mimo_layers;
 
   for (int ULSCH_id=0; ULSCH_id<gNB->number_of_nr_ulsch_max; ULSCH_id++) {
     pusch_vars[ULSCH_id] = (NR_gNB_PUSCH *)malloc16_clear( sizeof(NR_gNB_PUSCH) );
     pusch_vars[ULSCH_id]->rxdataF_ext           = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
     pusch_vars[ULSCH_id]->rxdataF_ext2          = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->ul_ch_estimates       = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->ul_ch_estimates_ext   = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates     = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->ptrs_phase_per_slot   = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->ul_ch_estimates_time  = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->rxdataF_comp          = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->ul_ch_mag0            = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->ul_ch_magb0           = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->ul_ch_mag             = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->ul_ch_magb            = (int32_t **)malloc16(Prx*sizeof(int32_t *) );
-    pusch_vars[ULSCH_id]->rho                   = (int32_t **)malloc16_clear(Prx*sizeof(int32_t*) );
+    pusch_vars[ULSCH_id]->ul_ch_estimates       = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
+    pusch_vars[ULSCH_id]->ul_ch_estimates_ext   = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
+    pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates     = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
+    pusch_vars[ULSCH_id]->ul_ch_ptrs_estimates_ext = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
+    pusch_vars[ULSCH_id]->ptrs_phase_per_slot   = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
+    pusch_vars[ULSCH_id]->ul_ch_estimates_time  = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
+    pusch_vars[ULSCH_id]->rxdataF_comp          = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
+    pusch_vars[ULSCH_id]->ul_ch_mag0            = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
+    pusch_vars[ULSCH_id]->ul_ch_magb0           = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
+    pusch_vars[ULSCH_id]->ul_ch_mag             = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
+    pusch_vars[ULSCH_id]->ul_ch_magb            = (int32_t **)malloc16(n_buf*sizeof(int32_t *) );
+    pusch_vars[ULSCH_id]->rho                   = (int32_t **)malloc16_clear(n_buf*sizeof(int32_t*) );
 
     for (i=0; i<Prx; i++) {
       pusch_vars[ULSCH_id]->rxdataF_ext[i]           = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
       pusch_vars[ULSCH_id]->rxdataF_ext2[i]          = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
+    }
+    for (i=0; i<n_buf; i++) {
       pusch_vars[ULSCH_id]->ul_ch_estimates[i]       = (int32_t *)malloc16_clear( sizeof(int32_t)*fp->ofdm_symbol_size*2*fp->symbols_per_slot );
       pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i]   = (int32_t *)malloc16_clear( sizeof(int32_t)*N_RB_UL*12*fp->symbols_per_slot );
       pusch_vars[ULSCH_id]->ul_ch_estimates_time[i]  = (int32_t *)malloc16_clear( 2*sizeof(int32_t)*fp->ofdm_symbol_size );
@@ -339,7 +307,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
 
 void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
 {
-  //NR_DL_FRAME_PARMS* const fp       = &gNB->frame_parms;
+  NR_DL_FRAME_PARMS* const fp       = &gNB->frame_parms;
   NR_gNB_COMMON *const common_vars  = &gNB->common_vars;
   NR_gNB_PUSCH **const pusch_vars   = gNB->pusch_vars;
   /*LTE_eNB_SRS *const srs_vars        = gNB->srs_vars;
@@ -380,9 +348,11 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
   free_and_zero(prach_vars->rxsigF[0]);
 */
   for (int ULSCH_id=0; ULSCH_id<gNB->number_of_nr_ulsch_max; ULSCH_id++) {
-    for (int i = 0; i < 2; i++) {
+    for (int i = 0; i < fp->nb_antennas_rx; i++) {
       free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext[i]);
       free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2[i]);
+    }
+    for (int i = 0; i < 4*fp->nb_antennas_rx; i++) {
       free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates[i]);
       free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_ext[i]);
       free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates_time[i]);
@@ -396,7 +366,6 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
       free_and_zero(pusch_vars[ULSCH_id]->ul_ch_magb[i]);
       free_and_zero(pusch_vars[ULSCH_id]->rho[i]);
     }
-
     free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext);
     free_and_zero(pusch_vars[ULSCH_id]->rxdataF_ext2);
     free_and_zero(pusch_vars[ULSCH_id]->ul_ch_estimates);
@@ -490,6 +459,7 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,
   gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band);
 
   nr_init_frame_parms(gNB_config, fp);
+  fp->ofdm_offset_divisor = UINT_MAX;
   gNB->configured    = 1;
   LOG_I(PHY,"gNB configured\n");
 }
@@ -541,7 +511,9 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config) {
 //  }
   RC.gNB[Mod_id]->configured     = 1;
 
+  fp->ofdm_offset_divisor = RC.gNB[Mod_id]->ofdm_offset_divisor;
   init_symbol_rotation(fp);
+  init_timeshift_rotation(fp);
 
   LOG_I(PHY,"gNB %d configured\n",Mod_id);
 }
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index 5d568e266f33630e298d6f3b9672d4997fd1ed95..b60e77e814b41023cfec4f64cda18286058d4de5 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -124,7 +124,7 @@ void phy_init_nr_ue_PUSCH(NR_UE_PUSCH *const pusch,
   AssertFatal( pusch, "pusch==0" );
 
   for (int i=0; i<NR_MAX_NB_LAYERS; i++) {
-    pusch->txdataF_layers[i] = (int32_t *)malloc16_clear((NR_MAX_PUSCH_ENCODED_LENGTH)*sizeof(int32_t *));
+    pusch->txdataF_layers[i] = (int32_t *)malloc16_clear(NR_MAX_PUSCH_ENCODED_LENGTH*sizeof(int32_t));
   }
 }
 
@@ -181,6 +181,16 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
     }
   }
 
+  /////////////////////////PUCCH init/////////////////////////
+  ///////////
+  for (th_id = 0; th_id < RX_NB_TH_MAX; th_id++) {
+    for (gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) {
+      ue->pucch_vars[th_id][gNB_id] = (NR_UE_PUCCH *)malloc16(sizeof(NR_UE_PUCCH));
+      for (i=0; i<2; i++)
+        ue->pucch_vars[th_id][gNB_id]->active[i] = false;
+    }
+  }
+
   ///////////
   ////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/openair1/PHY/INIT/nr_parms.c b/openair1/PHY/INIT/nr_parms.c
index 3a9d8a6c18f9398f5c25b9d0912c5c3728235b1d..98e3c5a1a3d752f9ad2f829a9f733c71714f7e6d 100644
--- a/openair1/PHY/INIT/nr_parms.c
+++ b/openair1/PHY/INIT/nr_parms.c
@@ -20,6 +20,7 @@
  */
 
 #include "phy_init.h"
+#include "common/utils/nr/nr_common.h"
 #include "common/utils/LOG/log.h"
 #include "LAYER2/NR_MAC_gNB/mac_proto.h"
 
@@ -27,6 +28,20 @@
 uint32_t nr_subcarrier_spacing[MAX_NUM_SUBCARRIER_SPACING] = {15e3, 30e3, 60e3, 120e3, 240e3};
 uint16_t nr_slots_per_subframe[MAX_NUM_SUBCARRIER_SPACING] = {1, 2, 4, 8, 16};
 
+
+void set_Lmax(NR_DL_FRAME_PARMS *fp) {
+  // definition of Lmax according to ts 38.213 section 4.1
+  if (fp->dl_CarrierFreq < 6e9) {
+    if(fp->frame_type && (fp->ssb_type==2))
+      fp->Lmax = (fp->dl_CarrierFreq < 2.4e9)? 4 : 8;
+    else
+      fp->Lmax = (fp->dl_CarrierFreq < 3e9)? 4 : 8;
+  } else {
+    fp->Lmax = 64;
+  }
+}
+
+
 int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp,uint8_t i_ssb) {
 
   int mu = fp->numerology_index;
@@ -198,9 +213,8 @@ int nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg,
 
   fp->slots_per_frame = 10* fp->slots_per_subframe;
 
-  fp->nb_antenna_ports_gNB = 1;                                   // It corresponds to the number of common antenna ports
   fp->nb_antennas_rx = cfg->carrier_config.num_rx_ant.value;      // It denotes the number of rx antennas at gNB
-  fp->nb_antennas_tx = cfg->carrier_config.num_tx_ant.value;      // It corresponds to pdsch_AntennaPorts
+  fp->nb_antennas_tx = cfg->carrier_config.num_tx_ant.value;      // It corresponds to pdsch_AntennaPorts (logical antenna ports)
 
   fp->symbols_per_slot = ((Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
   fp->samples_per_subframe_wCP = fp->ofdm_symbol_size * fp->symbols_per_slot * fp->slots_per_subframe;
@@ -218,15 +232,7 @@ int nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg,
 
   fp->Ncp = Ncp;
 
-  // definition of Lmax according to ts 38.213 section 4.1
-  if (fp->dl_CarrierFreq < 6e9) {
-    if(fp->frame_type && (fp->ssb_type==2))
-      fp->Lmax = (fp->dl_CarrierFreq < 2.4e9)? 4 : 8;
-    else
-      fp->Lmax = (fp->dl_CarrierFreq < 3e9)? 4 : 8;
-  } else {
-    fp->Lmax = 64;
-  }
+  set_Lmax(fp);
 
   fp->N_ssb = 0;
   int num_tx_ant = cfg->carrier_config.num_tx_ant.value;
@@ -317,16 +323,7 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp,
     sco = config->ssb_table.ssb_subcarrier_offset;
 
   fp->ssb_start_subcarrier = (12 * config->ssb_table.ssb_offset_point_a + sco);
-
-  // definition of Lmax according to ts 38.213 section 4.1
-  if (fp->dl_CarrierFreq < 6e9) {
-    if(fp->frame_type && (fp->ssb_type==2))
-      fp->Lmax = (fp->dl_CarrierFreq < 2.4e9)? 4 : 8;
-    else
-      fp->Lmax = (fp->dl_CarrierFreq < 3e9)? 4 : 8;
-  } else {
-    fp->Lmax = 64;
-  }
+  set_Lmax(fp);
 
   fp->L_ssb = (((uint64_t) config->ssb_table.ssb_mask_list[0].ssb_mask)<<32) | config->ssb_table.ssb_mask_list[1].ssb_mask;
   
@@ -337,6 +334,43 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp,
   return 0;
 }
 
+void nr_init_frame_parms_ue_sa(NR_DL_FRAME_PARMS *frame_parms, uint64_t downlink_frequency, int32_t delta_duplex, uint8_t mu, uint16_t nr_band) {
+
+  LOG_I(PHY,"SA init parameters. DL freq %lu UL offset %d SSB numerology %d N_RB_DL %d\n",
+        downlink_frequency,
+        delta_duplex,
+        mu,
+        frame_parms->N_RB_DL);
+
+  frame_parms->numerology_index = mu;
+  frame_parms->dl_CarrierFreq = downlink_frequency;
+  frame_parms->ul_CarrierFreq = downlink_frequency + delta_duplex;
+  frame_parms->freq_range = (frame_parms->dl_CarrierFreq < 6e9)? nr_FR1 : nr_FR2;
+  frame_parms->N_RB_UL = frame_parms->N_RB_DL;
+
+  frame_parms->nr_band = nr_band;
+  frame_parms->frame_type = get_frame_type(frame_parms->nr_band, frame_parms->numerology_index);
+
+  frame_parms->Ncp = NORMAL;
+  set_scs_parameters(frame_parms, frame_parms->numerology_index, frame_parms->N_RB_DL);
+  set_Lmax(frame_parms);
+
+  frame_parms->slots_per_frame = 10* frame_parms->slots_per_subframe;
+  frame_parms->symbols_per_slot = ((frame_parms->Ncp == NORMAL)? 14 : 12); // to redefine for different slot formats
+  frame_parms->samples_per_subframe_wCP = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_slot * frame_parms->slots_per_subframe;
+  frame_parms->samples_per_frame_wCP = 10 * frame_parms->samples_per_subframe_wCP;
+  frame_parms->samples_per_slot_wCP = frame_parms->symbols_per_slot*frame_parms->ofdm_symbol_size;
+  frame_parms->samples_per_slotN0 = (frame_parms->nb_prefix_samples + frame_parms->ofdm_symbol_size) * frame_parms->symbols_per_slot;
+  frame_parms->samples_per_slot0 = frame_parms->nb_prefix_samples0 + ((frame_parms->symbols_per_slot-1)*frame_parms->nb_prefix_samples) + (frame_parms->symbols_per_slot*frame_parms->ofdm_symbol_size);
+  frame_parms->samples_per_subframe = (frame_parms->nb_prefix_samples0 + frame_parms->ofdm_symbol_size) * 2 +
+                             (frame_parms->nb_prefix_samples + frame_parms->ofdm_symbol_size) * (frame_parms->symbols_per_slot * frame_parms->slots_per_subframe - 2);
+  frame_parms->get_samples_per_slot = &get_samples_per_slot;
+  frame_parms->get_samples_slot_timestamp = &get_samples_slot_timestamp;
+  frame_parms->samples_per_frame = 10 * frame_parms->samples_per_subframe;
+
+}
+
+
 void nr_dump_frame_parms(NR_DL_FRAME_PARMS *fp)
 {
   LOG_I(PHY,"fp->scs=%d\n",fp->subcarrier_spacing);
diff --git a/openair1/PHY/INIT/phy_init.h b/openair1/PHY/INIT/phy_init.h
index eff49fb2ce392ebcd7dede6b9b97495bb68f079a..dd9232de83ac744a38bf835cea367c8fec8d454b 100644
--- a/openair1/PHY/INIT/phy_init.h
+++ b/openair1/PHY/INIT/phy_init.h
@@ -389,12 +389,12 @@ void phy_config_request(PHY_Config_t *phy_config);
 void phy_config_update_sib2_request(PHY_Config_t *phy_config);
 void phy_config_update_sib13_request(PHY_Config_t *phy_config);
 
-
 int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf);
 void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms);
 int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp,uint8_t i_ssb);
 int nr_init_frame_parms(nfapi_nr_config_request_scf_t *config, NR_DL_FRAME_PARMS *frame_parms);
 int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *frame_parms, fapi_nr_config_request_t *config, uint16_t nr_band);
+void nr_init_frame_parms_ue_sa(NR_DL_FRAME_PARMS *frame_parms, uint64_t downlink_frequency, int32_t uplink_frequency_offset, uint8_t mu, uint16_t nr_band);
 int init_nr_ue_signal(PHY_VARS_NR_UE *ue,int nb_connected_eNB,uint8_t abstraction_flag);
 void init_nr_ue_transport(PHY_VARS_NR_UE *ue,int abstraction_flag);
 void init_N_TA_offset(PHY_VARS_NR_UE *ue);
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
index 0ce716ef2082f3883c577f30bda5583e52642516..c867292942f840d3bffd2891769ddf9b0d4dc7ca 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
@@ -35,7 +35,6 @@ static int16_t ru_90c[2*128] = {32767, 0,32766, -402,32758, -804,32746, -1206,32
 #define SCALE 0x3FFF
 
 static const short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
-//static const short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
 
 extern unsigned short dftsizes[34];
 extern int16_t *ul_ref_sigs_rx[30][2][34];
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index 61af617d6e6a6ae7dd47147a751a5bcdb83acd3e..1bbe9eb39a28159559597ae5008e4a623b5d7c68 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -1527,7 +1527,9 @@ void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,
   if (dlsch0->active)
     T(T_ENB_PHY_DLSCH_UE_DCI, T_INT(0), T_INT(frame), T_INT(subframe),
       T_INT(rel8->rnti), T_INT(rel8->dci_format), T_INT(rel8->harq_process),
-      T_INT(rel8->mcs_1), T_INT(dlsch0_harq->TBS));
+      T_INT(rel8->mcs_1), T_INT(dlsch0_harq->TBS), T_INT(rel8->new_data_indicator_1),
+      T_INT(rel8->redundancy_version_1), T_INT(rel8->resource_block_coding),
+      T_INT(dlsch0_harq->nb_rb), T_INT(dlsch0_harq->rb_alloc[0]));
 
 #endif
 }
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
index 556a9f2d237f5e4cbf84dae7541d69b570e0d2a6..9906b945d81ca209046cb839280ec18926fb7afb 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
@@ -1234,7 +1234,7 @@ void dlsch_channel_compensation(int **rxdataF_ext,
   unsigned short rb;
   unsigned char aatx,aarx,symbol_mod,pilots=0;
   __m128i *dl_ch128,*dl_ch128_2,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128;
-  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128;
+  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0};
   symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
 
   if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) {
@@ -1657,11 +1657,11 @@ void dlsch_channel_compensation_core(int **rxdataF_ext,
   int length_mod8 = 0;
   int length2;
   __m128i *dl_ch128,*dl_ch_mag128,*dl_ch_mag128b, *dl_ch128_2, *rxdataF128,*rxdataF_comp128,*rho128;
-  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128;
+  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0};
   int aatx = 0, aarx = 0;
 
   for (aatx=0; aatx<n_tx; aatx++) {
-    __m128i QAM_amp128b;
+    __m128i QAM_amp128b={0};
 
     if (mod_order == 4) {
       QAM_amp128 = _mm_set1_epi16(QAM16_n1);  // 2/sqrt(10)
@@ -2004,7 +2004,7 @@ void dlsch_channel_compensation_TM56(int **rxdataF_ext,
   __m128i *dl_ch0_128,*dl_ch1_128,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128;
   unsigned char aarx=0,symbol_mod,pilots=0;
   int precoded_signal_strength=0;
-  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128;
+  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0};
   symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
 
   if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp)))
@@ -2411,7 +2411,7 @@ void dlsch_channel_compensation_TM34(LTE_DL_FRAME_PARMS *frame_parms,
   int **rxdataF_comp0         = pdsch_vars->rxdataF_comp0;
   int **rxdataF_comp1         = pdsch_vars->rxdataF_comp1[harq_pid][round];
   unsigned char *pmi_ext      = pdsch_vars->pmi_ext;
-  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp0_128,QAM_amp1_128;
+  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp0_128={0},QAM_amp1_128={0};
   symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
 
   if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp)))
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/pmch_ue.c b/openair1/PHY/LTE_UE_TRANSPORT/pmch_ue.c
index 69aa1c06a34aefb8c0999db10b4b34cc8ab069b4..3c22c64a9e56a00c2c145ebd14a37e59e43b73e8 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/pmch_ue.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/pmch_ue.c
@@ -328,7 +328,7 @@ void mch_channel_compensation(int **rxdataF_ext,
   int aarx,nre,i;
 #if defined(__x86_64__) || defined(__i386__)
   __m128i *dl_ch128,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128;
-  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
+  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0},QAM_amp128b={0};
 #elif defined(__arm__)
 #endif
 
@@ -455,7 +455,7 @@ void mch_channel_compensation_khz_1dot25(int **rxdataF_ext,
   int aarx,nre,i;
 #if defined(__x86_64__) || defined(__i386__)
   __m128i *dl_ch128,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128;
-  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
+  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0},QAM_amp128b={0};
 #elif defined(__arm__)
 #endif
   /*if ((symbol == 2) || (symbol == 6) || (symbol == 10))
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c
index de1c3891da078517be8425ebf1556a916df5b6ec..ae3ebbce9dc0ba96df89af0ba7875bf3e7880df8 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/ulsch_coding.c
@@ -52,8 +52,7 @@
 
 
 
-void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch)
-{
+void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) {
   int i;
   int r;
 
@@ -68,6 +67,7 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch)
           free16(ulsch->harq_processes[i]->b,MAX_ULSCH_PAYLOAD_BYTES);
           ulsch->harq_processes[i]->b = NULL;
         }
+
         for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) {
           if (ulsch->harq_processes[i]->c[r]) {
             free16(ulsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768);
@@ -79,51 +79,47 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch)
         ulsch->harq_processes[i] = NULL;
       }
     }
+
     free16(ulsch,sizeof(LTE_UE_ULSCH_t));
   }
-
 }
 
-LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag)
-{
-
+LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) {
   LTE_UE_ULSCH_t *ulsch;
   unsigned char exit_flag = 0,i,j,r;
   unsigned char bw_scaling =1;
 
   switch (N_RB_UL) {
-  case 6:
-    bw_scaling =16;
-    break;
-
-  case 25:
-    bw_scaling =4;
-    break;
-
-  case 50:
-    bw_scaling =2;
-    break;
- 
-  default:
-    bw_scaling =1;
-    break;
+    case 6:
+      bw_scaling =16;
+      break;
+
+    case 25:
+      bw_scaling =4;
+      break;
+
+    case 50:
+      bw_scaling =2;
+      break;
+
+    default:
+      bw_scaling =1;
+      break;
   }
 
   ulsch = (LTE_UE_ULSCH_t *)malloc16(sizeof(LTE_UE_ULSCH_t));
 
   if (ulsch) {
     memset(ulsch,0,sizeof(LTE_UE_ULSCH_t));
-
     ulsch->Mlimit = 4;
 
     for (i=0; i<8; i++) {
-
       ulsch->harq_processes[i] = (LTE_UL_UE_HARQ_t *)malloc16(sizeof(LTE_UL_UE_HARQ_t));
 
       //      printf("ulsch->harq_processes[%d] %p\n",i,ulsch->harq_processes[i]);
       if (ulsch->harq_processes[i]) {
         memset(ulsch->harq_processes[i], 0, sizeof(LTE_UL_UE_HARQ_t));
-        ulsch->harq_processes[i]->b = (unsigned char*)malloc16(MAX_ULSCH_PAYLOAD_BYTES/bw_scaling);
+        ulsch->harq_processes[i]->b = (unsigned char *)malloc16(MAX_ULSCH_PAYLOAD_BYTES/bw_scaling);
 
         if (ulsch->harq_processes[i]->b)
           memset(ulsch->harq_processes[i]->b,0,MAX_ULSCH_PAYLOAD_BYTES/bw_scaling);
@@ -134,7 +130,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag)
 
         if (abstraction_flag==0) {
           for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) {
-            ulsch->harq_processes[i]->c[r] = (unsigned char*)malloc16(((r==0)?8:0) + 3+768);  // account for filler in first segment and CRCs for multiple segment case
+            ulsch->harq_processes[i]->c[r] = (unsigned char *)malloc16(((r==0)?8:0) + 3+768); // account for filler in first segment and CRCs for multiple segment case
 
             if (ulsch->harq_processes[i]->c[r])
               memset(ulsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+768);
@@ -167,8 +163,6 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag)
   LOG_E(PHY,"new_ue_ulsch exit flag, size of  %d ,   %zu\n",exit_flag, sizeof(LTE_UE_ULSCH_t));
   free_ue_ulsch(ulsch);
   return(NULL);
-
-
 }
 
 
@@ -179,15 +173,12 @@ uint32_t ulsch_encoding(uint8_t *a,
                         uint8_t subframe_rx,
                         uint8_t tmode,
                         uint8_t control_only_flag,
-                        uint8_t Nbundled)
-{
-
+                        uint8_t Nbundled) {
   time_stats_t *seg_stats=&ue->ulsch_segmentation_stats;
   time_stats_t *rm_stats=&ue->ulsch_rate_matching_stats;
   time_stats_t *te_stats=&ue->ulsch_turbo_encoding_stats;
   time_stats_t *i_stats=&ue->ulsch_interleaving_stats;
   time_stats_t *m_stats=&ue->ulsch_multiplexing_stats;
-
   //  uint16_t offset;
   uint32_t crc=1;
   uint32_t A;
@@ -237,7 +228,6 @@ uint32_t ulsch_encoding(uint8_t *a,
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING_FILL_CQI, VCD_FUNCTION_IN);
     rnti = ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti;
     fill_CQI(ulsch,meas,0,harq_pid,ue->frame_parms.N_RB_DL,rnti, tmode,ue->sinr_eff);
-
     LOG_D(PHY,"ULSCH Encoding rnti %x \n", rnti);
     print_CQI(ulsch->o,ulsch->uci_format,0,ue->frame_parms.N_RB_DL);
 
@@ -246,6 +236,7 @@ uint32_t ulsch_encoding(uint8_t *a,
       //LOG_I(PHY,"XXX saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi));
       dlsch[0]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi;
     }
+
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING_FILL_CQI, VCD_FUNCTION_OUT);
   }
 
@@ -268,17 +259,15 @@ uint32_t ulsch_encoding(uint8_t *a,
   if (control_only_flag == 0) {
     A=ulsch->harq_processes[harq_pid]->TBS;
     Q_m = get_Qm_ul(ulsch->harq_processes[harq_pid]->mcs);
-
     ulsch->harq_processes[harq_pid]->control_only = 0;
-
 #ifdef DEBUG_ULSCH_CODING
     printf("[PHY][UE] ULSCH coding : A %d, Qm %d, mcs %d, harq_pid %d, round %d, RV %d\n",
-        ulsch->harq_processes[harq_pid]->TBS,
-        Q_m,
-        ulsch->harq_processes[harq_pid]->mcs,
-        harq_pid,
-        ulsch->harq_processes[harq_pid]->round,
-        ulsch->harq_processes[harq_pid]->rvidx);
+           ulsch->harq_processes[harq_pid]->TBS,
+           Q_m,
+           ulsch->harq_processes[harq_pid]->mcs,
+           harq_pid,
+           ulsch->harq_processes[harq_pid]->round,
+           ulsch->harq_processes[harq_pid]->rvidx);
 
     for (i=0; i<ulsch->harq_processes[harq_pid]->O_ACK; i++)
       printf("ulsch_coding: o_ACK[%d] %d\n",i,ulsch->o_ACK[i]);
@@ -301,16 +290,13 @@ uint32_t ulsch_encoding(uint8_t *a,
 #endif
 
     if (ulsch->harq_processes[harq_pid]->round == 0) {  // this is a new packet
-
       start_meas(seg_stats);
       // Add 24-bit crc (polynomial A) to payload
       crc = crc24a(a,
                    A)>>8;
-
-      a[A>>3] = ((uint8_t*)&crc)[2];
-      a[1+(A>>3)] = ((uint8_t*)&crc)[1];
-      a[2+(A>>3)] = ((uint8_t*)&crc)[0];
-
+      a[A>>3] = ((uint8_t *)&crc)[2];
+      a[1+(A>>3)] = ((uint8_t *)&crc)[1];
+      a[2+(A>>3)] = ((uint8_t *)&crc)[0];
       ulsch->harq_processes[harq_pid]->B = A+24;
       ulsch->harq_processes[harq_pid]->b = a;
       lte_segmentation(ulsch->harq_processes[harq_pid]->b,
@@ -322,7 +308,6 @@ uint32_t ulsch_encoding(uint8_t *a,
                        &ulsch->harq_processes[harq_pid]->Kplus,
                        &ulsch->harq_processes[harq_pid]->Kminus,
                        &ulsch->harq_processes[harq_pid]->F);
-
       stop_meas(seg_stats);
 
       for (r=0; r<ulsch->harq_processes[harq_pid]->C; r++) {
@@ -332,25 +317,20 @@ uint32_t ulsch_encoding(uint8_t *a,
           Kr = ulsch->harq_processes[harq_pid]->Kplus;
 
         Kr_bytes = Kr>>3;
-
 #ifdef DEBUG_ULSCH_CODING
         printf("Generating Code Segment %d (%d bits)\n",r,Kr);
         // generate codewords
-
         printf("bits_per_codeword (Kr)= %d\n",Kr);
         printf("N_RB = %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
         printf("Ncp %d\n",frame_parms->Ncp);
         printf("Qm %d\n",Q_m);
 #endif
-
         //  offset=0;
-
-
         start_meas(te_stats);
         encoder(ulsch->harq_processes[harq_pid]->c[r],
-        	Kr>>3,
-        	&ulsch->harq_processes[harq_pid]->d[r][96],
-        	(r==0) ? ulsch->harq_processes[harq_pid]->F : 0
+                Kr>>3,
+                &ulsch->harq_processes[harq_pid]->d[r][96],
+                (r==0) ? ulsch->harq_processes[harq_pid]->F : 0
                );
         stop_meas(te_stats);
 #ifdef DEBUG_ULSCH_CODING
@@ -366,7 +346,6 @@ uint32_t ulsch_encoding(uint8_t *a,
                                        ulsch->harq_processes[harq_pid]->w[r]);
         stop_meas(i_stats);
       }
-
     }
 
     if (ulsch->harq_processes[harq_pid]->C == 0) {
@@ -392,7 +371,6 @@ uint32_t ulsch_encoding(uint8_t *a,
 
   ulsch->harq_processes[harq_pid]->sumKr = sumKr;
   // Compute Q_ri (p. 23 36-212)
-
   Qprime = ulsch->O_RI*ulsch->harq_processes[harq_pid]->Msc_initial*ulsch->harq_processes[harq_pid]->Nsymb_initial * ulsch->beta_offset_ri_times8;
 
   if (Qprime > 0) {
@@ -407,7 +385,6 @@ uint32_t ulsch_encoding(uint8_t *a,
 
   Q_RI = Q_m*Qprime;
   Qprime_RI = Qprime;
-
   // Compute Q_ack (p. 23 36-212)
   Qprime = ulsch->harq_processes[harq_pid]->O_ACK*ulsch->harq_processes[harq_pid]->Msc_initial*ulsch->harq_processes[harq_pid]->Nsymb_initial * ulsch->beta_offset_harqack_times8;
 
@@ -423,20 +400,18 @@ uint32_t ulsch_encoding(uint8_t *a,
 
   Q_ACK = Qprime * Q_m;
   Qprime_ACK = Qprime;
-
   LOG_D(PHY,"UE (%x/%d) O_ACK %d, Mcs_initial %d, Nsymb_initial %d, beta_offset_harqack*8 %d, sum Kr %d, Qprime_ACK %d, Q_ACK %d\n",
-      rnti, harq_pid,
-      ulsch->harq_processes[harq_pid]->O_ACK,
-      ulsch->harq_processes[harq_pid]->Msc_initial,
-      ulsch->harq_processes[harq_pid]->Nsymb_initial,
-      ulsch->beta_offset_harqack_times8,
-      sumKr,
-      Qprime_ACK,
-      Q_ACK);
+        rnti, harq_pid,
+        ulsch->harq_processes[harq_pid]->O_ACK,
+        ulsch->harq_processes[harq_pid]->Msc_initial,
+        ulsch->harq_processes[harq_pid]->Nsymb_initial,
+        ulsch->beta_offset_harqack_times8,
+        sumKr,
+        Qprime_ACK,
+        Q_ACK);
 
   // Compute Q_cqi, assume O>11, p. 26 36-212
   if (control_only_flag == 0) {
-
     if (ulsch->O < 12)
       L=0;
     else
@@ -446,13 +421,13 @@ uint32_t ulsch_encoding(uint8_t *a,
       Qprime = (ulsch->O + L) * ulsch->harq_processes[harq_pid]->Msc_initial*ulsch->harq_processes[harq_pid]->Nsymb_initial * ulsch->beta_offset_cqi_times8;
     else
       Qprime = 0;
-      LOG_D(PHY,"Qprime %d, O_RI %d + %d, Msc %d, Nym %d beta %d\n",
-                  Qprime,
-                  ulsch->O, L,
-                  ulsch->harq_processes[harq_pid]->Msc_initial,
-                  ulsch->harq_processes[harq_pid]->Nsymb_initial,
-                  ulsch->beta_offset_cqi_times8);
 
+    LOG_D(PHY,"Qprime %d, O_RI %d + %d, Msc %d, Nym %d beta %d\n",
+          Qprime,
+          ulsch->O, L,
+          ulsch->harq_processes[harq_pid]->Msc_initial,
+          ulsch->harq_processes[harq_pid]->Nsymb_initial,
+          ulsch->beta_offset_cqi_times8);
 
     if (Qprime > 0) {
       if ((Qprime % (8*sumKr)) > 0)
@@ -463,31 +438,29 @@ uint32_t ulsch_encoding(uint8_t *a,
 
     G = ulsch->harq_processes[harq_pid]->nb_rb * (12 * Q_m) * (ulsch->Nsymb_pusch);
     LOG_D(PHY,"G: rb %d * ( 12 * Qm %d ) * nsymb %d, Qprime %d, O_RI %d\n", ulsch->harq_processes[harq_pid]->nb_rb, Q_m, ulsch->Nsymb_pusch, Qprime, ulsch->O_RI);
+
     if (Qprime > (G - ulsch->O_RI))
       Qprime = G - ulsch->O_RI;
 
     Q_CQI = Q_m * Qprime;
     Qprime_CQI = Qprime;
-
-
-
     G = G - Q_RI - Q_CQI;
-    LOG_D(PHY,"new G: %d, Q_RI %d Q_CQI %d\n",  G , Q_RI , Q_CQI);
+    LOG_D(PHY,"new G: %d, Q_RI %d Q_CQI %d\n",  G, Q_RI, Q_CQI);
     ulsch->harq_processes[harq_pid]->G = G;
 
-/*
-    LOG_I(PHY,"ULSCH Encoding G %d, Q_RI %d (O_RI%d, Msc_initial %d, Nsymb_initial%d, beta_offset_ri_times8 %d), Q_CQI %d, Q_ACK %d \n",G,Q_RI,ulsch->O_RI,ulsch->harq_processes[harq_pid]->Msc_initial,ulsch->harq_processes[harq_pid]->Nsymb_initial,ulsch->beta_offset_ri_times8,Q_CQI,Q_ACK);
-
-    LOG_I(PHY,"ULSCH Encoding (Nid_cell %d, rnti %x): harq_pid %d round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d\n",
-          frame_parms->Nid_cell,ulsch->rnti,
-          harq_pid,
-          ulsch->harq_processes[harq_pid]->round,
-          ulsch->harq_processes[harq_pid]->rvidx,
-          ulsch->harq_processes[harq_pid]->mcs,
-          ulsch->O_RI,
-          ulsch->harq_processes[harq_pid]->O_ACK,
-          G);
-*/
+    /*
+        LOG_I(PHY,"ULSCH Encoding G %d, Q_RI %d (O_RI%d, Msc_initial %d, Nsymb_initial%d, beta_offset_ri_times8 %d), Q_CQI %d, Q_ACK %d \n",G,Q_RI,ulsch->O_RI,ulsch->harq_processes[harq_pid]->Msc_initial,ulsch->harq_processes[harq_pid]->Nsymb_initial,ulsch->beta_offset_ri_times8,Q_CQI,Q_ACK);
+
+        LOG_I(PHY,"ULSCH Encoding (Nid_cell %d, rnti %x): harq_pid %d round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d\n",
+              frame_parms->Nid_cell,ulsch->rnti,
+              harq_pid,
+              ulsch->harq_processes[harq_pid]->round,
+              ulsch->harq_processes[harq_pid]->rvidx,
+              ulsch->harq_processes[harq_pid]->mcs,
+              ulsch->O_RI,
+              ulsch->harq_processes[harq_pid]->O_ACK,
+              G);
+    */
 
     if ((int)G < 0) {
       LOG_E(PHY,"FATAL: ulsch_coding.c G < 0 (%d) : Q_RI %d, Q_CQI %d, O %d, betaCQI_times8 %d)\n",G,Q_RI,Q_CQI,ulsch->O,ulsch->beta_offset_cqi_times8);
@@ -495,26 +468,21 @@ uint32_t ulsch_encoding(uint8_t *a,
       return(-1);
     }
 
-
     // Data and control multiplexing (5.2.2.7 36-212)
-
     H = G + Q_CQI;
     Hprime = H/Q_m;
 
-
-
     // Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the
     // outputs for each code segment, see Section 5.1.5 p.20
 
     for (r=0; r<ulsch->harq_processes[harq_pid]->C; r++) {
 #ifdef DEBUG_ULSCH_CODING
       printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n",
-          r,
-          G,
-          Kr*3,
-          Q_m,ulsch->harq_processes[harq_pid]->nb_rb);
+             r,
+             G,
+             Kr*3,
+             Q_m,ulsch->harq_processes[harq_pid]->nb_rb);
 #endif
-
       start_meas(rm_stats);
       r_offset += lte_rate_matching_turbo(ulsch->harq_processes[harq_pid]->RTC[r],
                                           G,
@@ -529,7 +497,7 @@ uint32_t ulsch_encoding(uint8_t *a,
                                           1,
                                           r,
                                           ulsch->harq_processes[harq_pid]->nb_rb);
-                                          //ulsch->harq_processes[harq_pid]->mcs);                       // r
+      //ulsch->harq_processes[harq_pid]->mcs);                       // r
       stop_meas(rm_stats);
 #ifdef DEBUG_ULSCH_CODING
 
@@ -544,7 +512,6 @@ uint32_t ulsch_encoding(uint8_t *a,
     Hprime = H/Q_m;
   }
 
-
   //  Do CQI coding
   if ((ulsch->O>1) && (ulsch->O < 12)) {
     LOG_E(PHY,"short CQI sizes not supported yet\n");
@@ -558,23 +525,18 @@ uint32_t ulsch_encoding(uint8_t *a,
     printf("crc(cqi) tx : %x\n",crc);
 #endif
     memset((void *)&ulsch->o_d[0],LTE_NULL,96);
-
     ccodelte_encode(ulsch->O,
                     1,
                     o_flip,
                     &ulsch->o_d[96],
                     0);
-
-
     o_RCC = sub_block_interleaving_cc(8+ulsch->O,
                                       &ulsch->o_d[96],
                                       ulsch->o_w);
-
     lte_rate_matching_cc(o_RCC,
                          Q_CQI,
                          ulsch->o_w,
                          ulsch->q);
-
   }
 
   i=0;
@@ -582,29 +544,29 @@ uint32_t ulsch_encoding(uint8_t *a,
   //  Do RI coding
   if (ulsch->O_RI == 1) {
     switch (Q_m) {
-    case 2:
-      ulsch->q_RI[0] = ulsch->o_RI[0];
-      ulsch->q_RI[1] = PUSCH_y;//ulsch->o_RI[0];
-      len_RI=2;
-      break;
-
-    case 4:
-      ulsch->q_RI[0] = ulsch->o_RI[0];
-      ulsch->q_RI[1] = PUSCH_y;//1;
-      ulsch->q_RI[2] = PUSCH_x;//ulsch->o_RI[0];
-      ulsch->q_RI[3] = PUSCH_x;//1;
-      len_RI=4;
-      break;
-
-    case 6:
-      ulsch->q_RI[0] = ulsch->o_RI[0];
-      ulsch->q_RI[1] = PUSCH_y;//1;
-      ulsch->q_RI[2] = PUSCH_x;//1;
-      ulsch->q_RI[3] = PUSCH_x;//ulsch->o_RI[0];
-      ulsch->q_RI[4] = PUSCH_x;//1;
-      ulsch->q_RI[5] = PUSCH_x;//1;
-      len_RI=6;
-      break;
+      case 2:
+        ulsch->q_RI[0] = ulsch->o_RI[0];
+        ulsch->q_RI[1] = PUSCH_y;//ulsch->o_RI[0];
+        len_RI=2;
+        break;
+
+      case 4:
+        ulsch->q_RI[0] = ulsch->o_RI[0];
+        ulsch->q_RI[1] = PUSCH_y;//1;
+        ulsch->q_RI[2] = PUSCH_x;//ulsch->o_RI[0];
+        ulsch->q_RI[3] = PUSCH_x;//1;
+        len_RI=4;
+        break;
+
+      case 6:
+        ulsch->q_RI[0] = ulsch->o_RI[0];
+        ulsch->q_RI[1] = PUSCH_y;//1;
+        ulsch->q_RI[2] = PUSCH_x;//1;
+        ulsch->q_RI[3] = PUSCH_x;//ulsch->o_RI[0];
+        ulsch->q_RI[4] = PUSCH_x;//1;
+        ulsch->q_RI[5] = PUSCH_x;//1;
+        len_RI=6;
+        break;
     }
   } else if (ulsch->O_RI>1) {
     LOG_E(PHY,"RI cannot be more than 1 bit yet\n");
@@ -616,35 +578,35 @@ uint32_t ulsch_encoding(uint8_t *a,
   wACK_idx = (ulsch->bundling==0) ? 4 : ((Nbundled-1)&3);
 #ifdef DEBUG_ULSCH_CODING
   printf("ulsch_coding.c: Bundling %d, Nbundled %d, wACK_idx %d\n",
-      ulsch->bundling,Nbundled,wACK_idx);
+         ulsch->bundling,Nbundled,wACK_idx);
 #endif
 
   // 1-bit ACK/NAK
   if (ulsch->harq_processes[harq_pid]->O_ACK == 1) {
     switch (Q_m) {
-    case 2:
-      ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
-      ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1);//ulsch->o_ACK[0];
-      len_ACK = 2;
-      break;
-
-    case 4:
-      ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
-      ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1);
-      ulsch->q_ACK[2] = PUSCH_x;
-      ulsch->q_ACK[3] = PUSCH_x;
-      len_ACK = 4;
-      break;
-
-    case 6:
-      ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
-      ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1);
-      ulsch->q_ACK[2] = PUSCH_x;
-      ulsch->q_ACK[3] = PUSCH_x;
-      ulsch->q_ACK[4] = PUSCH_x;
-      ulsch->q_ACK[6] = PUSCH_x;
-      len_ACK = 6;
-      break;
+      case 2:
+        ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
+        ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1);//ulsch->o_ACK[0];
+        len_ACK = 2;
+        break;
+
+      case 4:
+        ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
+        ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1);
+        ulsch->q_ACK[2] = PUSCH_x;
+        ulsch->q_ACK[3] = PUSCH_x;
+        len_ACK = 4;
+        break;
+
+      case 6:
+        ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
+        ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1);
+        ulsch->q_ACK[2] = PUSCH_x;
+        ulsch->q_ACK[3] = PUSCH_x;
+        ulsch->q_ACK[4] = PUSCH_x;
+        ulsch->q_ACK[6] = PUSCH_x;
+        len_ACK = 6;
+        break;
     }
   }
 
@@ -653,56 +615,53 @@ uint32_t ulsch_encoding(uint8_t *a,
     ack_parity = (ulsch->o_ACK[0]+ulsch->o_ACK[1])&1;
 
     switch (Q_m) {
-    case 2:
-      ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
-      ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1;
-      ulsch->q_ACK[2] = (ack_parity+wACK[wACK_idx][0])&1;
-      ulsch->q_ACK[3] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1;
-      ulsch->q_ACK[4] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1;
-      ulsch->q_ACK[5] = (ack_parity+wACK[wACK_idx][1])&1;
-      len_ACK = 6;
-      break;
-
-    case 4:
-      ulsch->q_ACK[0]  = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
-      ulsch->q_ACK[1]  = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1;
-      ulsch->q_ACK[2]  = PUSCH_x;
-      ulsch->q_ACK[3]  = PUSCH_x;//1;
-      ulsch->q_ACK[4]  = (ack_parity+wACK[wACK_idx][0])&1;
-      ulsch->q_ACK[5]  = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1;
-      ulsch->q_ACK[6]  = PUSCH_x;
-      ulsch->q_ACK[7]  = PUSCH_x;//1;
-      ulsch->q_ACK[8]  = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1;
-      ulsch->q_ACK[9]  = (ack_parity+wACK[wACK_idx][1])&1;
-      ulsch->q_ACK[10] = PUSCH_x;
-      ulsch->q_ACK[11] = PUSCH_x;//1;
-      len_ACK = 12;
-      break;
-
-    case 6:
-      ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
-      ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1;
-      ulsch->q_ACK[2] = PUSCH_x;
-      ulsch->q_ACK[3] = PUSCH_x;
-      ulsch->q_ACK[4] = PUSCH_x;
-      ulsch->q_ACK[5] = PUSCH_x;
-
-      ulsch->q_ACK[6] = (ack_parity+wACK[wACK_idx][0])&1;
-      ulsch->q_ACK[7] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1;
-      ulsch->q_ACK[8] = PUSCH_x;
-      ulsch->q_ACK[9] = PUSCH_x;
-      ulsch->q_ACK[10] = PUSCH_x;
-      ulsch->q_ACK[11] = PUSCH_x;
-
-      ulsch->q_ACK[12] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1;
-      ulsch->q_ACK[13] = (ack_parity+wACK[wACK_idx][1])&1;
-      ulsch->q_ACK[14] = PUSCH_x;
-      ulsch->q_ACK[15] = PUSCH_x;
-      ulsch->q_ACK[16] = PUSCH_x;
-      ulsch->q_ACK[17] = PUSCH_x;
-      len_ACK = 18;
-
-      break;
+      case 2:
+        ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
+        ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1;
+        ulsch->q_ACK[2] = (ack_parity+wACK[wACK_idx][0])&1;
+        ulsch->q_ACK[3] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1;
+        ulsch->q_ACK[4] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1;
+        ulsch->q_ACK[5] = (ack_parity+wACK[wACK_idx][1])&1;
+        len_ACK = 6;
+        break;
+
+      case 4:
+        ulsch->q_ACK[0]  = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
+        ulsch->q_ACK[1]  = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1;
+        ulsch->q_ACK[2]  = PUSCH_x;
+        ulsch->q_ACK[3]  = PUSCH_x;//1;
+        ulsch->q_ACK[4]  = (ack_parity+wACK[wACK_idx][0])&1;
+        ulsch->q_ACK[5]  = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1;
+        ulsch->q_ACK[6]  = PUSCH_x;
+        ulsch->q_ACK[7]  = PUSCH_x;//1;
+        ulsch->q_ACK[8]  = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1;
+        ulsch->q_ACK[9]  = (ack_parity+wACK[wACK_idx][1])&1;
+        ulsch->q_ACK[10] = PUSCH_x;
+        ulsch->q_ACK[11] = PUSCH_x;//1;
+        len_ACK = 12;
+        break;
+
+      case 6:
+        ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
+        ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1;
+        ulsch->q_ACK[2] = PUSCH_x;
+        ulsch->q_ACK[3] = PUSCH_x;
+        ulsch->q_ACK[4] = PUSCH_x;
+        ulsch->q_ACK[5] = PUSCH_x;
+        ulsch->q_ACK[6] = (ack_parity+wACK[wACK_idx][0])&1;
+        ulsch->q_ACK[7] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1;
+        ulsch->q_ACK[8] = PUSCH_x;
+        ulsch->q_ACK[9] = PUSCH_x;
+        ulsch->q_ACK[10] = PUSCH_x;
+        ulsch->q_ACK[11] = PUSCH_x;
+        ulsch->q_ACK[12] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1;
+        ulsch->q_ACK[13] = (ack_parity+wACK[wACK_idx][1])&1;
+        ulsch->q_ACK[14] = PUSCH_x;
+        ulsch->q_ACK[15] = PUSCH_x;
+        ulsch->q_ACK[16] = PUSCH_x;
+        ulsch->q_ACK[17] = PUSCH_x;
+        len_ACK = 18;
+        break;
     }
   }
 
@@ -712,23 +671,17 @@ uint32_t ulsch_encoding(uint8_t *a,
     return(-1);
   }
 
-
   // channel multiplexing/interleaving
-
   start_meas(m_stats);
   Hpp = Hprime + Q_RI;
-
   Cmux       = ulsch->Nsymb_pusch;
   Rmux       = Hpp*Q_m/Cmux;
   Rmux_prime = Rmux/Q_m;
-
   Qprime_RI  = Q_RI / Q_m;
   Qprime_ACK = Q_ACK / Q_m;
   Qprime_CQI = Q_CQI / Q_m;
-
   //  printf("Qprime_CQI = %d\n",Qprime_CQI);
   // RI BITS
-
   memset(y,LTE_NULL,Q_m*Hpp);
 
   if (frame_parms->Ncp == 0)
@@ -747,10 +700,8 @@ uint32_t ulsch_encoding(uint8_t *a,
     }
 
     j=(j+3)&3;
-
   }
 
-
   // CQI and Data bits
   j=0;
   /*
@@ -775,7 +726,6 @@ uint32_t ulsch_encoding(uint8_t *a,
   */
 
   for (i=0; i<Qprime_CQI; i++) {
-
     while (y[Q_m*j] != LTE_NULL) j++;
 
     for (q=0; q<Q_m; q++) {
@@ -789,47 +739,44 @@ uint32_t ulsch_encoding(uint8_t *a,
   j2 = j*Q_m;
 
   switch (Q_m) {
+    case 2:
+      for (iprime=0; iprime<(Hprime-Qprime_CQI)<<1; iprime+=2) {
+        while (y[j2] != LTE_NULL) j2+=2;
 
-  case 2:
-
-    for (iprime=0; iprime<(Hprime-Qprime_CQI)<<1; iprime+=2) {
-      while (y[j2] != LTE_NULL) j2+=2;
-
-      y[j2]   = ulsch->e[iprime];
-      y[1+j2] = ulsch->e[1+iprime];
-      j2+=2;
-    }
-
-    break;
-
-  case 4:
-    for (iprime=0; iprime<(Hprime-Qprime_CQI)<<2; iprime+=4) {
-      while (y[j2] != LTE_NULL) j2+=4;
-
-      y[j2]   = ulsch->e[iprime];
-      y[1+j2] = ulsch->e[1+iprime];
-      y[2+j2] = ulsch->e[2+iprime];
-      y[3+j2] = ulsch->e[3+iprime];
-      j2+=4;
-    }
+        y[j2]   = ulsch->e[iprime];
+        y[1+j2] = ulsch->e[1+iprime];
+        j2+=2;
+      }
 
-    break;
+      break;
 
-  case 6:
-    for (iprime=0; iprime<(Hprime-Qprime_CQI)*6; iprime+=6) {
-      while (y[j2] != LTE_NULL) j2+=6;
+    case 4:
+      for (iprime=0; iprime<(Hprime-Qprime_CQI)<<2; iprime+=4) {
+        while (y[j2] != LTE_NULL) j2+=4;
+
+        y[j2]   = ulsch->e[iprime];
+        y[1+j2] = ulsch->e[1+iprime];
+        y[2+j2] = ulsch->e[2+iprime];
+        y[3+j2] = ulsch->e[3+iprime];
+        j2+=4;
+      }
 
-      y[j2]   = ulsch->e[iprime];
-      y[1+j2] = ulsch->e[1+iprime];
-      y[2+j2] = ulsch->e[2+iprime];
-      y[3+j2] = ulsch->e[3+iprime];
-      y[4+j2] = ulsch->e[4+iprime];
-      y[5+j2] = ulsch->e[5+iprime];
-      j2+=6;
-    }
+      break;
 
-    break;
+    case 6:
+      for (iprime=0; iprime<(Hprime-Qprime_CQI)*6; iprime+=6) {
+        while (y[j2] != LTE_NULL) j2+=6;
+
+        y[j2]   = ulsch->e[iprime];
+        y[1+j2] = ulsch->e[1+iprime];
+        y[2+j2] = ulsch->e[2+iprime];
+        y[3+j2] = ulsch->e[3+iprime];
+        y[4+j2] = ulsch->e[4+iprime];
+        y[5+j2] = ulsch->e[5+iprime];
+        j2+=6;
+      }
 
+      break;
   }
 
   // HARQ-ACK Bits (Note these overwrite some bits)
@@ -848,57 +795,56 @@ uint32_t ulsch_encoding(uint8_t *a,
       y[q+(Q_m*((r*Cmux) + columnset[j]))]  = ulsch->q_ACK[(q+(Q_m*i))%len_ACK];
 #ifdef DEBUG_ULSCH_CODING
       printf("ulsch_coding.c: ACK %d => y[%d]=%d (i %d, r*Cmux %d, columnset %d)\n",q+(Q_m*i),
-          q+(Q_m*((r*Cmux) + columnset[j])),ulsch->q_ACK[(q+(Q_m*i))%len_ACK],
-          i,r*Cmux,columnset[j]);
+             q+(Q_m*((r*Cmux) + columnset[j])),ulsch->q_ACK[(q+(Q_m*i))%len_ACK],
+             i,r*Cmux,columnset[j]);
 #endif
     }
 
     j=(j+3)&3;
-
   }
 
   // write out buffer
   j=0;
 
   switch (Q_m) {
-  case 2:
-    for (i=0; i<Cmux; i++)
-      for (r=0; r<Rmux_prime; r++) {
-        yptr=&y[((r*Cmux)+i)<<1];
-        ulsch->h[j++] = *yptr++;
-        ulsch->h[j++] = *yptr++;
-      }
+    case 2:
+      for (i=0; i<Cmux; i++)
+        for (r=0; r<Rmux_prime; r++) {
+          yptr=&y[((r*Cmux)+i)<<1];
+          ulsch->h[j++] = *yptr++;
+          ulsch->h[j++] = *yptr++;
+        }
 
-    break;
+      break;
 
-  case 4:
-    for (i=0; i<Cmux; i++)
-      for (r=0; r<Rmux_prime; r++) {
-        yptr = &y[((r*Cmux)+i)<<2];
-        ulsch->h[j++] = *yptr++;
-        ulsch->h[j++] = *yptr++;
-        ulsch->h[j++] = *yptr++;
-        ulsch->h[j++] = *yptr++;
-      }
+    case 4:
+      for (i=0; i<Cmux; i++)
+        for (r=0; r<Rmux_prime; r++) {
+          yptr = &y[((r*Cmux)+i)<<2];
+          ulsch->h[j++] = *yptr++;
+          ulsch->h[j++] = *yptr++;
+          ulsch->h[j++] = *yptr++;
+          ulsch->h[j++] = *yptr++;
+        }
 
-    break;
-
-  case 6:
-    for (i=0; i<Cmux; i++)
-      for (r=0; r<Rmux_prime; r++) {
-        yptr = &y[((r*Cmux)+i)*6];
-        ulsch->h[j++] = *yptr++;
-        ulsch->h[j++] = *yptr++;
-        ulsch->h[j++] = *yptr++;
-        ulsch->h[j++] = *yptr++;
-        ulsch->h[j++] = *yptr++;
-        ulsch->h[j++] = *yptr++;
-      }
+      break;
 
-    break;
+    case 6:
+      for (i=0; i<Cmux; i++)
+        for (r=0; r<Rmux_prime; r++) {
+          yptr = &y[((r*Cmux)+i)*6];
+          ulsch->h[j++] = *yptr++;
+          ulsch->h[j++] = *yptr++;
+          ulsch->h[j++] = *yptr++;
+          ulsch->h[j++] = *yptr++;
+          ulsch->h[j++] = *yptr++;
+          ulsch->h[j++] = *yptr++;
+        }
 
-  default:
-    break;
+      break;
+
+    default:
+      break;
   }
 
   stop_meas(m_stats);
diff --git a/openair1/PHY/MODULATION/modulation_common.h b/openair1/PHY/MODULATION/modulation_common.h
index f550eeca5f6c7f9b483e13c5a44b33eb41f1abd5..1a19bec78c83ea5b2772f91685d6235a0d5a994d 100644
--- a/openair1/PHY/MODULATION/modulation_common.h
+++ b/openair1/PHY/MODULATION/modulation_common.h
@@ -49,7 +49,7 @@ void PHY_ofdm_mod(int *input,
 
 
 void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRAME_PARMS *frame_parms);
-void nr_normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,NR_DL_FRAME_PARMS *frame_parms);
+void nr_normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,NR_DL_FRAME_PARMS *frame_parms, uint32_t slot);
 
 void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms);
 
diff --git a/openair1/PHY/MODULATION/nr_modulation.c b/openair1/PHY/MODULATION/nr_modulation.c
index e32f6bf575add7a80ad80e60b9938bbccb770471..c81a88ff3075bd6071a8cc02b5230f29f51de7af 100644
--- a/openair1/PHY/MODULATION/nr_modulation.c
+++ b/openair1/PHY/MODULATION/nr_modulation.c
@@ -745,6 +745,23 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp) {
   }
 }
 
+void init_timeshift_rotation(NR_DL_FRAME_PARMS *fp)
+{
+  for (int i = 0; i < fp->ofdm_symbol_size; i++) {
+    double poff = -i * 2.0 * M_PI * 144.0 / 2048.0 / fp->ofdm_offset_divisor;
+    double exp_re = cos(poff);
+    double exp_im = sin(-poff);
+    fp->timeshift_symbol_rotation[i*2] = (int16_t)round(exp_re * 32767);
+    fp->timeshift_symbol_rotation[i*2+1] = (int16_t)round(exp_im * 32767);
+
+    if (i < 10)
+      LOG_I(PHY,"Timeshift symbol rotation %d => (%d,%d) %f\n",i,
+            fp->timeshift_symbol_rotation[i*2],
+            fp->timeshift_symbol_rotation[i*2+1],
+            poff);
+  }
+}
+
 int nr_layer_precoder(int16_t **datatx_F_precoding, char *prec_matrix, uint8_t n_layers, int32_t re_offset)
 {
   int32_t precodatatx_F = 0;
diff --git a/openair1/PHY/MODULATION/nr_modulation.h b/openair1/PHY/MODULATION/nr_modulation.h
index 547d20952fb4d7e0b5e959535c00088d026af87c..75541a13615ce851db32f45e127c7285e5db971b 100644
--- a/openair1/PHY/MODULATION/nr_modulation.h
+++ b/openair1/PHY/MODULATION/nr_modulation.h
@@ -117,6 +117,8 @@ void apply_nr_rotation(NR_DL_FRAME_PARMS *fp,
 
 void init_symbol_rotation(NR_DL_FRAME_PARMS *fp);
 
+void init_timeshift_rotation(NR_DL_FRAME_PARMS *fp);
+
 void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
 			  int32_t *rxdataF,
 			  int slot,
diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c
index 8cf9f05b9b63acd4bd4bab2e0f0296013a279302..2f075e8218d7da918b8826a6167014aef7e93d95 100644
--- a/openair1/PHY/MODULATION/ofdm_mod.c
+++ b/openair1/PHY/MODULATION/ofdm_mod.c
@@ -63,20 +63,62 @@ void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRA
   
 }
 
-void nr_normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,NR_DL_FRAME_PARMS *frame_parms)
+void nr_normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,NR_DL_FRAME_PARMS *frame_parms, uint32_t slot)
 {
-  PHY_ofdm_mod(txdataF,        // input
-	       txdata,         // output
-	       frame_parms->ofdm_symbol_size,                
-	       1,                 // number of symbols
-	       frame_parms->nb_prefix_samples0,               // number of prefix samples
-	       CYCLIC_PREFIX);
-  PHY_ofdm_mod(txdataF+frame_parms->ofdm_symbol_size,        // input
-	       txdata + frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples0,         // output
-	       frame_parms->ofdm_symbol_size,                
-	       nsymb - 1,
-	       frame_parms->nb_prefix_samples,               // number of prefix samples
-	       CYCLIC_PREFIX);  
+  // This function works only slot wise. For more generic symbol generation refer nr_feptx0()
+  if (frame_parms->numerology_index != 0) { // case where numerology != 0
+    if (!(slot%(frame_parms->slots_per_subframe/2))) {
+      PHY_ofdm_mod(txdataF,
+             txdata,
+             frame_parms->ofdm_symbol_size,
+             1,
+             frame_parms->nb_prefix_samples0,
+             CYCLIC_PREFIX);
+      PHY_ofdm_mod(txdataF+frame_parms->ofdm_symbol_size,
+             txdata + frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples0,
+             frame_parms->ofdm_symbol_size,
+             nsymb - 1,
+             frame_parms->nb_prefix_samples,
+             CYCLIC_PREFIX);
+    }
+    else {
+      PHY_ofdm_mod(txdataF,
+             txdata,
+             frame_parms->ofdm_symbol_size,
+             nsymb,
+             frame_parms->nb_prefix_samples,
+             CYCLIC_PREFIX);
+    }
+  }
+  else { // numerology = 0, longer CP for every 7th symbol
+      PHY_ofdm_mod(txdataF,
+             txdata,
+             frame_parms->ofdm_symbol_size,
+             1,
+             frame_parms->nb_prefix_samples0,
+             CYCLIC_PREFIX);
+      PHY_ofdm_mod(txdataF+frame_parms->ofdm_symbol_size,
+             txdata + frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples0,
+             frame_parms->ofdm_symbol_size,
+             6,
+             frame_parms->nb_prefix_samples,
+             CYCLIC_PREFIX);
+      PHY_ofdm_mod(txdataF + 7*frame_parms->ofdm_symbol_size,
+             txdata + 6*(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples) +
+                    frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples0,
+             frame_parms->ofdm_symbol_size,
+             1,
+             frame_parms->nb_prefix_samples0,
+             CYCLIC_PREFIX);
+      PHY_ofdm_mod(txdataF + 8*frame_parms->ofdm_symbol_size,
+             txdata + 6*(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples) +
+                    2*(frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples0),
+             frame_parms->ofdm_symbol_size,
+             6,
+             frame_parms->nb_prefix_samples,
+             CYCLIC_PREFIX);
+  }
+
 }
 
 void PHY_ofdm_mod(int *input,                       /// pointer to complex input
diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c
index 39c730bfac3a5b8c973e9e9643e40acbaf61cee0..f3c8c108dca8d28d36fdac17d0cafd9429e582f3 100644
--- a/openair1/PHY/MODULATION/slot_fep_nr.c
+++ b/openair1/PHY/MODULATION/slot_fep_nr.c
@@ -107,7 +107,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
   rx_offset += frame_parms->ofdm_symbol_size * symbol;
 
   // use OFDM symbol from within 1/8th of the CP to avoid ISI
-  rx_offset -= nb_prefix_samples / 8;
+  rx_offset -= (nb_prefix_samples / frame_parms->ofdm_offset_divisor);
 
 #ifdef DEBUG_FEP
   //  if (ue->frame <100)
@@ -157,6 +157,15 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
 		      (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
 		      frame_parms->ofdm_symbol_size,
 		      15);
+
+    int16_t *shift_rot = frame_parms->timeshift_symbol_rotation;
+
+    multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+          shift_rot,
+          (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+          1,
+          frame_parms->ofdm_symbol_size,
+          15);
   }
 
 #ifdef DEBUG_FEP
@@ -292,14 +301,15 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
   // This is for misalignment issues
   int32_t tmp_dft_in[8192] __attribute__ ((aligned (32)));
 
-  unsigned int slot_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
-
   // offset of first OFDM symbol
-  int32_t rxdata_offset = slot_offset + nb_prefix_samples0;
-  // offset of n-th OFDM symbol
-  rxdata_offset += symbol * (frame_parms->ofdm_symbol_size + nb_prefix_samples);
+  unsigned int rxdata_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
+  unsigned int abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
+  for (int idx_symb = Ns*frame_parms->symbols_per_slot; idx_symb <= abs_symbol; idx_symb++)
+    rxdata_offset += (idx_symb%(0x7<<frame_parms->numerology_index)) ? nb_prefix_samples : nb_prefix_samples0;
+  rxdata_offset += frame_parms->ofdm_symbol_size * symbol;
+
   // use OFDM symbol from within 1/8th of the CP to avoid ISI
-  rxdata_offset -= nb_prefix_samples / 8;
+  rxdata_offset -= (nb_prefix_samples / frame_parms->ofdm_offset_divisor);
 
   int16_t *rxdata_ptr;
 
@@ -333,9 +343,6 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
       (int16_t *)&rxdataF[symbol * frame_parms->ofdm_symbol_size],
       1);
 
-  // clear DC carrier from OFDM symbols
-  rxdataF[symbol * frame_parms->ofdm_symbol_size] = 0;
-
   return 0;
 }
 
@@ -349,7 +356,7 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
 			  
   int symb_offset = (slot%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
 
-  for (int symbol=0;symbol<nsymb;symbol++) {
+  for (int symbol=first_symbol;symbol<nsymb;symbol++) {
     
     uint32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[1])[symbol + symb_offset];
     ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
@@ -359,5 +366,14 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
 		      (int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
 		      length,
 		      15);
+
+    int16_t *shift_rot = frame_parms->timeshift_symbol_rotation;
+
+    multadd_cpx_vector((int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
+          shift_rot,
+          (int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
+          1,
+          length,
+          15);
   }
 }
diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
index 91b6a592487790093dd52038108875960e73373b..57470cf98864fb73643f7c1489b89208d5175e04 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
@@ -39,23 +39,22 @@ extern openair0_config_t openair0_cfg[MAX_CARDS];
 
 int nr_est_timing_advance_pusch(PHY_VARS_gNB* gNB, int UE_id)
 {
-  int i, aa, max_pos = 0, max_val = 0;
-  
+  int max_pos = 0, max_val = 0;
+
   NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
   NR_gNB_PUSCH *gNB_pusch_vars   = gNB->pusch_vars[UE_id];
   int32_t **ul_ch_estimates_time = gNB_pusch_vars->ul_ch_estimates_time;
-  
-  int sync_pos = frame_parms->nb_prefix_samples / 8;
 
-  for (i = 0; i < frame_parms->ofdm_symbol_size; i++) {
+  const int sync_pos = 0;
+
+  for (int i = 0; i < frame_parms->ofdm_symbol_size; i++) {
     int temp = 0;
 
-    for (aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
-      short Re = ((int16_t*)ul_ch_estimates_time[aa])[(i<<1)];
-      short Im = ((int16_t*)ul_ch_estimates_time[aa])[1+(i<<1)];
+    for (int aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
+      int Re = ((int16_t*)ul_ch_estimates_time[aa])[(i<<1)];
+      int Im = ((int16_t*)ul_ch_estimates_time[aa])[1+(i<<1)];
       temp += (Re*Re/2) + (Im*Im/2);      
     }
-
     if (temp > max_val) {
       max_pos = i;
       max_val = temp;
@@ -65,7 +64,6 @@ int nr_est_timing_advance_pusch(PHY_VARS_gNB* gNB, int UE_id)
   if (max_pos > frame_parms->ofdm_symbol_size/2)
     max_pos = max_pos - frame_parms->ofdm_symbol_size;
 
-
   return max_pos - sync_pos;
 }
 
@@ -149,7 +147,7 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int first_symb,int num_symb) {
 //
 // Todo:
 // - averaging IIR filter for RX power and noise
-void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq_pid, unsigned char symbol){
+void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq_pid, unsigned char symbol, uint8_t nrOfLayers){
 
   int rx_power_tot[NUMBER_OF_NR_ULSCH_MAX];
   int rx_power[NUMBER_OF_NR_ULSCH_MAX][NB_ANTENNAS_RX];
@@ -169,9 +167,9 @@ void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq
 
     rx_power[ulsch_id][aarx] = 0;
 
-    for (int aatx = 0; aatx < fp->nb_antennas_tx; aatx++){
+    for (int aatx = 0; aatx < nrOfLayers; aatx++){
 
-      meas->rx_spatial_power[ulsch_id][aatx][aarx] = (signal_energy_nodc(&gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aarx][ch_offset], N_RB_UL * NR_NB_SC_PER_RB));
+      meas->rx_spatial_power[ulsch_id][aatx][aarx] = (signal_energy_nodc(&gNB->pusch_vars[ulsch_id]->ul_ch_estimates[aatx*fp->nb_antennas_rx+aarx][ch_offset], N_RB_UL * NR_NB_SC_PER_RB));
 
       if (meas->rx_spatial_power[ulsch_id][aatx][aarx] < 0) {
         meas->rx_spatial_power[ulsch_id][aatx][aarx] = 0;
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
index 5e1528c92252a6c932d27981f51e9484dadb8852..960ad826969403ee723b3a88228762798e6b114b 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
@@ -31,11 +31,13 @@
 #include "PHY/NR_UE_ESTIMATION/filt16a_32.h"
 
 #include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
+#include "executables/softmodem-common.h"
 
 
 //#define DEBUG_CH
 //#define DEBUG_PUSCH
 
+#define NO_INTERP 1
 #define dBc(x,y) (dB_fixed(((int32_t)(x))*(x) + ((int32_t)(y))*(y)))
 
 int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
@@ -129,8 +131,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 
   //------------------generate DMRS------------------//
 
-  if (pusch_pdu->transform_precoding == transform_precoder_disabled) {
-    nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch, (pusch_pdu->bwp_start + pusch_pdu->rb_start)*NR_NB_SC_PER_RB, pusch_pdu->dmrs_config_type);
+  // transform precoding = 1 means disabled
+  if (pusch_pdu->transform_precoding == 1) {
+    nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch,
+                     (pusch_pdu->bwp_start + pusch_pdu->rb_start)*NR_NB_SC_PER_RB, pusch_pdu->dmrs_config_type);
   }
   else {  // if transform precoding or SC-FDMA is enabled in Uplink
 
@@ -171,7 +175,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 
     pil   = (int16_t *)&pilot[0];
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)];
-    ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset];
+    ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
     re_offset = k;
 
     memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size));
@@ -185,8 +189,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 #endif
     //if ((gNB->frame_parms.N_RB_UL&1)==0) {
 
-    if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1){
-
+    if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1 && gNB->prb_interpolation == 0){
+      LOG_D(PHY,"PUSCH estimation DMRS type 1, Freq-domain interpolation");
       // Treat first 2 pilots specially (left edge)
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
@@ -210,7 +214,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
                                          ch,
                                          ul_ch,
                                          8);
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       //for (int i= 0; i<8; i++)
@@ -241,7 +245,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
                                          ch,
                                          ul_ch,
                                          8);
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       //printf("ul_ch addr %p\n",ul_ch);
@@ -275,12 +279,12 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
       //for (int i= 0; i<16; i++)
       //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));
       
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-      ul_ch+=8;
+      ul_ch += 8;
 
-      for (pilot_cnt=3; pilot_cnt<(6*nb_rb_pusch-3); pilot_cnt+=2) {
+      for (pilot_cnt=3; pilot_cnt<(6*nb_rb_pusch-3); pilot_cnt += 2) {
 
         ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
         ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
@@ -293,7 +297,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
                                            ch,
                                            ul_ch,
                                            8);
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
         //printf("ul_ch addr %p\n",ul_ch);
@@ -313,10 +317,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
         //for (int i= 0; i<16; i++)
         //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));
 
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-        ul_ch+=8;
+        ul_ch += 8;
 
       }
       
@@ -335,7 +339,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
       //for (int i= 0; i<8; i++)
       //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
              
@@ -351,10 +355,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
                                          ul_ch,
                                          8);
                                          
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-      ul_ch+=8;
+      ul_ch += 8;
       
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
@@ -370,7 +374,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 
       // check if PRB crosses DC and improve estimates around DC
       if ((bwp_start_subcarrier < gNB->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pusch*12 >= gNB->frame_parms.ofdm_symbol_size)) {
-        ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset];
+        ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
         uint16_t idxDC = 2*(gNB->frame_parms.ofdm_symbol_size - bwp_start_subcarrier);
         uint16_t idxPil = idxDC/2;
         re_offset = k;
@@ -421,17 +425,17 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
         }
       }
 #ifdef DEBUG_PUSCH
-      ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset];
+      ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
       for(uint16_t idxP=0; idxP<ceil((float)nb_rb_pusch*12/8); idxP++) {
-        for(uint8_t idxI=0; idxI<16; idxI+=2) {
+        for(uint8_t idxI=0; idxI<16; idxI += 2) {
           printf("%d\t%d\t",ul_ch[idxP*16+idxI],ul_ch[idxP*16+idxI+1]);
         }
         printf("%d\n",idxP);
       }
 #endif    
     }
-    else { //pusch_dmrs_type2  |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
-
+    else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type2 && gNB->prb_interpolation == 0) { //pusch_dmrs_type2  |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
+      LOG_D(PHY,"PUSCH estimation DMRS type 2, Freq-domain interpolation");
       // Treat first DMRS specially (left edge)
 
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
@@ -439,12 +443,12 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
         ul_ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
         ul_ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
-        pil+=2;
-        ul_ch+=2;
+        pil += 2;
+        ul_ch += 2;
         re_offset = (re_offset + 1)%gNB->frame_parms.ofdm_symbol_size;
         ch_offset++;
 
-        for (re_cnt = 1; re_cnt < (nb_rb_pusch*NR_NB_SC_PER_RB) - 5; re_cnt+=6){
+        for (re_cnt = 1; re_cnt < (nb_rb_pusch*NR_NB_SC_PER_RB) - 5; re_cnt += 6){
 
           rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
 
@@ -454,8 +458,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
           ul_ch[0] = ch_l[0];
           ul_ch[1] = ch_l[1];
 
-          pil+=2;
-          ul_ch+=2;
+          pil += 2;
+          ul_ch += 2;
           ch_offset++;
 
           multadd_real_four_symbols_vector_complex_scalar(filt8_ml2,
@@ -474,17 +478,17 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
                                                           ch_r,
                                                           ul_ch);
 
-          //for (int re_idx = 0; re_idx < 8; re_idx+=2)
+          //for (int re_idx = 0; re_idx < 8; re_idx += 2)
             //printf("ul_ch = %d + j*%d\n", ul_ch[re_idx], ul_ch[re_idx+1]);
 
-          ul_ch+=8;
-          ch_offset+=4;
+          ul_ch += 8;
+          ch_offset += 4;
 
           ul_ch[0] = ch_r[0];
           ul_ch[1] = ch_r[1];
 
-          pil+=2;
-          ul_ch+=2;
+          pil += 2;
+          ul_ch += 2;
           ch_offset++;
           re_offset = (re_offset + 1)%gNB->frame_parms.ofdm_symbol_size;
 
@@ -500,7 +504,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
         ul_ch[0] = ch_l[0];
         ul_ch[1] = ch_l[1];
 
-        ul_ch+=2;
+        ul_ch += 2;
         ch_offset++;
 
         multadd_real_four_symbols_vector_complex_scalar(filt8_rr1,
@@ -511,11 +515,390 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
                                                         ch_r,
                                                         ul_ch);
 
-        ul_ch_128 = (__m128i *)&ul_ch_estimates[aarx][ch_offset];
+        ul_ch_128 = (__m128i *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
 
         ul_ch_128[0] = _mm_slli_epi16 (ul_ch_128[0], 2);
     }
 
+    else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1) {// this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 6 DMRS REs and use a common value for the whole PRB
+      LOG_D(PHY,"PUSCH estimation DMRS type 1, no Freq-domain interpolation");
+      int32_t ch_0, ch_1;
+      // First PRB
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 6;
+      ch[1] = ch_1 / 6;
+
+
+
+
+#if NO_INTERP
+      for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch;
+      ul_ch+=24;
+#else
+      multadd_real_vector_complex_scalar(filt8_avlip0,
+                                         ch,
+                                         ul_ch,
+                                         8);
+
+      ul_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip1,
+                                         ch,
+                                         ul_ch,
+                                         8);
+
+      ul_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip2,
+                                         ch,
+                                         ul_ch,
+                                         8);
+      ul_ch -= 24;
+#endif
+
+      for (pilot_cnt=6; pilot_cnt<6*(nb_rb_pusch-1); pilot_cnt += 6) {
+
+        ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch[0] = ch_0 / 6;
+        ch[1] = ch_1 / 6;
+
+#if NO_INTERP
+      for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch;
+      ul_ch+=24;
+#else
+        ul_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+        ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+        ul_ch += 8;
+        multadd_real_vector_complex_scalar(filt8_avlip3,
+                                           ch,
+                                           ul_ch,
+                                           8);
+
+        ul_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip4,
+                                           ch,
+                                           ul_ch,
+                                           8);
+
+        ul_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip5,
+                                           ch,
+                                           ul_ch,
+                                           8);
+        ul_ch -= 16;
+#endif
+      }
+      // Last PRB
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 6;
+      ch[1] = ch_1 / 6;
+
+#if NO_INTERP
+      for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch;
+      ul_ch+=24;
+#else
+      ul_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+      ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+      ul_ch += 8;
+      multadd_real_vector_complex_scalar(filt8_avlip3,
+                                         ch,
+                                         ul_ch,
+                                         8);
+
+      ul_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip6,
+                                         ch,
+                                         ul_ch,
+                                         8);
+#endif
+    }
+    else  { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 4 DMRS REs and use a common value for the whole PRB
+      LOG_D(PHY,"PUSCH estimation DMRS type 2, no Freq-domain interpolation");
+      int32_t ch_0, ch_1;
+      //First PRB
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 4;
+      ch[1] = ch_1 / 4;
+
+      multadd_real_vector_complex_scalar(filt8_avlip0,
+                                         ch,
+                                         ul_ch,
+                                         8);
+
+      ul_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip1,
+                                         ch,
+                                         ul_ch,
+                                         8);
+
+      ul_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip2,
+                                         ch,
+                                         ul_ch,
+                                         8);
+      ul_ch -= 24;
+
+      for (pilot_cnt=4; pilot_cnt<4*(nb_rb_pusch-1); pilot_cnt += 4) {
+
+        ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch[0] = ch_0 / 4;
+        ch[1] = ch_1 / 4;
+
+        ul_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+        ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+        ul_ch += 8;
+        multadd_real_vector_complex_scalar(filt8_avlip3,
+                                           ch,
+                                           ul_ch,
+                                           8);
+
+        ul_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip4,
+                                           ch,
+                                           ul_ch,
+                                           8);
+
+        ul_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip5,
+                                           ch,
+                                           ul_ch,
+                                           8);
+        ul_ch -= 16;
+      }
+      // Last PRB
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 4;
+      ch[1] = ch_1 / 4;
+
+      ul_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+      ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+      ul_ch += 8;
+      multadd_real_vector_complex_scalar(filt8_avlip3,
+                                         ch,
+                                         ul_ch,
+                                         8);
+
+      ul_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip6,
+                                         ch,
+                                         ul_ch,
+                                         8);
+    }
+#ifdef DEBUG_PUSCH
+    ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
+    for(uint16_t idxP=0; idxP<ceil((float)nb_rb_pusch*12/8); idxP++) {
+      for(uint8_t idxI=0; idxI<16; idxI += 2) {
+        printf("%d\t%d\t",ul_ch[idxP*16+idxI],ul_ch[idxP*16+idxI+1]);
+      }
+      printf("%d\n",idxP);
+    }
+#endif
 
     // Convert to time domain
 
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
index 89bb5b2807323f262694bff010e48854fda7443b..c8e02fd13dcdcb6bb648dda5d25d889e04df2f38 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
@@ -51,7 +51,7 @@ void dump_nr_I0_stats(FILE *fd,PHY_VARS_gNB *gNB);
 
 void gNB_I0_measurements(PHY_VARS_gNB *gNB,int first_symb,int num_symb);
 
-void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq_pid, unsigned char symbol);
+void nr_gnb_measurements(PHY_VARS_gNB *gNB, uint8_t ulsch_id, unsigned char harq_pid, unsigned char symbol, uint8_t nrOfLayers);
 
 int nr_est_timing_advance_pusch(PHY_VARS_gNB* phy_vars_gNB, int UE_id);
 
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
index f043ce6551bdd72559178db627dd5dc941887fe5..f4ef8851ae335ed7a9348abebbe410ee39f279d4 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
@@ -213,7 +213,7 @@ uint8_t nr_generate_pdsch(processingData_L1tx_t *msgTx,
       nr_pdsch_codeword_scrambling_optim(harq->f,
 					 encoded_length,
 					 q,
-					 rel15->dlDmrsScramblingId,
+					 rel15->dataScramblingId,
 					 rel15->rnti,
 					 scrambled_output[q]);
     
@@ -278,8 +278,9 @@ uint8_t nr_generate_pdsch(processingData_L1tx_t *msgTx,
     printf("PDSCH resource mapping started (start SC %d\tstart symbol %d\tN_PRB %d\tnb_re %d,nb_layers %d)\n",
 	   start_sc, rel15->StartSymbolIndex, rel15->rbSize, nb_re,rel15->nrOfLayers);
 #endif
+
     for (int ap=0; ap<rel15->nrOfLayers; ap++) {
-      
+
       // DMRS params for this ap
       get_Wt(Wt, ap, dmrs_Type);
       get_Wf(Wf, ap, dmrs_Type);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index 2ae2549df31743e6d7263e1087c8d0714bf34091..9956e147016559bb79e53bd9b354a3d241065e97 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -292,7 +292,8 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
   }
   G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,rel15->nrOfLayers);
 
-  LOG_D(NR_PHY,"dlsch coding A %d G %d (nb_rb %d, nb_symb_sch %d, nb_re_dmrs %d, length_dmrs %d, mod_order %d)\n", A,G, nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs,mod_order);
+  LOG_D(PHY,"dlsch coding A %d G %d (nb_rb %d, nb_symb_sch %d, nb_re_dmrs %d, length_dmrs %d, mod_order %d)\n", 
+        A,G, nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs,(int)mod_order);
 
   if (A > 3824) {
     // Add 24-bit crc (polynomial A) to payload
diff --git a/openair1/PHY/NR_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_TRANSPORT/nr_pbch.c
index 0bc04e30473db8f0350f9a89dcfda4fb0059cc97..a4cec432de30d4b2805db685964b7dc7a52b137d 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_pbch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_pbch.c
@@ -42,7 +42,7 @@
 
 extern short nr_qpsk_mod_table[8];
 
-uint8_t nr_pbch_payload_interleaving_pattern[32] = {16, 23, 18, 17, 8, 30, 10, 6, 24, 7, 0, 5, 3, 2, 1, 4,
+const uint8_t nr_pbch_payload_interleaving_pattern[32] = {16, 23, 18, 17, 8, 30, 10, 6, 24, 7, 0, 5, 3, 2, 1, 4,
                                                     9, 11, 12, 13, 14, 15, 19, 20, 21, 22, 25, 26, 27, 28, 29, 31
                                                    };
 
@@ -141,7 +141,7 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
   return 0;
 }
 
-void nr_pbch_scrambling(NR_gNB_PBCH *pbch,
+static void nr_pbch_scrambling(NR_gNB_PBCH *pbch,
                         uint32_t Nid,
                         uint8_t nushift,
                         uint16_t M,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c
index 000348ae8728ef2fd2656f86db9ba317c827c5a6..4e2fbd4e715d05639ff011e5833c6247bf277194 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c
@@ -174,7 +174,11 @@ void rx_nr_prach_ru(RU_t *ru,
 
   int msg1_frequencystart   = ru->config.prach_config.num_prach_fd_occasions_list[numRA].k1.value;
 
-  int sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1));
+  int sample_offset_slot;
+  if (!(slot%(fp->slots_per_subframe/2)))
+    sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1));
+  else
+    sample_offset_slot = (prachStartSymbol==0?0:prachStartSymbol*(fp->ofdm_symbol_size+fp->nb_prefix_samples));
   //to be checked for mu=0;
 
   LOG_D(PHY,"frame %d, slot %d: doing rx_nr_prach_ru for format %d, numRA %d, prachStartSymbol %d, prachOccasion %d\n",frame,slot,prachFormat,numRA,prachStartSymbol,prachOccasion);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
index a2449e30a5317fe84167c2396c0f8fcac3cbdc7c..54188d22c0a863fa6d99470900b54d6208850876 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
@@ -78,19 +78,6 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
                           nfapi_nr_config_request_scf_t *config,
                           NR_DL_FRAME_PARMS *frame_parms);
 
-/*!
-\fn int nr_pbch_scrambling
-\brief PBCH scrambling function
-@param
- */
-void nr_pbch_scrambling(NR_gNB_PBCH *pbch,
-                        uint32_t Nid,
-                        uint8_t nushift,
-                        uint16_t M,
-                        uint16_t length,
-                        uint8_t encoded,
-                        uint32_t unscrambling_mask);
-
 /*!
 \fn int nr_generate_pbch
 \brief Generation of the PBCH
@@ -178,6 +165,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
                             int32_t *avg,
                             uint8_t symbol,
                             uint32_t len,
+                            uint8_t  nrOfLayers,
                             unsigned short nb_rb);
 
 /** \brief This function performs channel compensation (matched filtering) on the received RBs for this allocation.  In addition, it computes the squared-magnitude of the channel with weightings for 16QAM/64QAM detection as well as dual-stream detection (cross-correlation)
@@ -202,6 +190,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
                                 unsigned char symbol,
                                 uint8_t is_dmrs_symbol,
                                 unsigned char mod_order,
+                                uint8_t  nrOfLayers,
                                 unsigned short nb_rb,
                                 unsigned char output_shift);
 
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
index 7a4555d2548898a4e38d33c32e39d69347031798..0531a8b98fdee5e396218f0a277a78a8c3f72499 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
@@ -7,6 +7,7 @@
 #include "PHY/NR_REFSIG/ptrs_nr.h"
 #include "PHY/NR_ESTIMATION/nr_ul_estimation.h"
 #include "PHY/defs_nr_common.h"
+#include "common/utils/nr/nr_common.h"
 
 //#define DEBUG_CH_COMP
 //#define DEBUG_RB_EXT
@@ -467,6 +468,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
                             int32_t *avg,
                             uint8_t symbol,
                             uint32_t len,
+                            uint8_t nrOfLayers,
                             unsigned short nb_rb)
 {
 
@@ -474,7 +476,6 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
 
   short rb;
   unsigned char aatx, aarx;
-  char nb_antennas_ue_tx = 1;
   __m128i *ul_ch128, avg128U;
 
   int16_t x = factor2(len);
@@ -486,12 +487,12 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
   int off = 0;
 #endif
 
-  for (aatx = 0; aatx < nb_antennas_ue_tx; aatx++)
+  for (aatx = 0; aatx < nrOfLayers; aatx++)
     for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
       //clear average level
       avg128U = _mm_setzero_si128();
 
-      ul_ch128=(__m128i *)&ul_ch_estimates_ext[(aatx<<1)+aarx][symbol*(off+(nb_rb*12))];
+      ul_ch128=(__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
 
       for (rb = 0; rb < len/12; rb++) {
         avg128U = _mm_add_epi32(avg128U, _mm_srai_epi32(_mm_madd_epi16(ul_ch128[0], ul_ch128[0]), x));
@@ -500,10 +501,10 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
         ul_ch128+=3;
       }
 
-      avg[(aatx<<1)+aarx] = (((int32_t*)&avg128U)[0] +
-                             ((int32_t*)&avg128U)[1] +
-                             ((int32_t*)&avg128U)[2] +
-                             ((int32_t*)&avg128U)[3]   ) / y;
+      avg[aatx*frame_parms->nb_antennas_rx+aarx] = (((int32_t*)&avg128U)[0] +
+                                                    ((int32_t*)&avg128U)[1] +
+                                                    ((int32_t*)&avg128U)[2] +
+                                                    ((int32_t*)&avg128U)[3]) / y;
 
     }
 
@@ -519,13 +520,13 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
 
   symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
 
-  for (aatx=0; aatx<frame_parms->nb_antenna_ports_gNB; aatx++) {
+  for (aatx=0; aatx<nrOfLayers; aatx++) {
     for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
       //clear average level
       avg128U = vdupq_n_s32(0);
       // 5 is always a symbol with no pilots for both normal and extended prefix
 
-      ul_ch128 = (int16x4_t *)&ul_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_UL*12];
+      ul_ch128 = (int16x4_t *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*frame_parms->N_RB_UL*12];
 
       for (rb = 0; rb < nb_rb; rb++) {
         //  printf("rb %d : ",rb);
@@ -535,7 +536,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
         avg128U = vqaddq_s32(avg128U, vmull_s16(ul_ch128[2], ul_ch128[2]));
         avg128U = vqaddq_s32(avg128U, vmull_s16(ul_ch128[3], ul_ch128[3]));
 
-        if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->nb_antenna_ports_gNB!=1)) {
+        if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(nrOfLayers!=1)) {
           ul_ch128+=4;
         } else {
           avg128U = vqaddq_s32(avg128U, vmull_s16(ul_ch128[4], ul_ch128[4]));
@@ -557,10 +558,10 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
       else
           nre=12;
 
-      avg[(aatx<<1)+aarx] = (((int32_t*)&avg128U)[0] +
-                             ((int32_t*)&avg128U)[1] +
-                             ((int32_t*)&avg128U)[2] +
-                             ((int32_t*)&avg128U)[3]   ) / (nb_rb*nre);
+      avg[aatx*frame_parms->nb_antennas_rx+aarx] = (((int32_t*)&avg128U)[0] +
+                                                    ((int32_t*)&avg128U)[1] +
+                                                    ((int32_t*)&avg128U)[2] +
+                                                    ((int32_t*)&avg128U)[3]) / (nb_rb*nre);
     }
   }
 #endif
@@ -576,6 +577,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
                                    unsigned char symbol,
                                    uint8_t is_dmrs_symbol,
                                    unsigned char mod_order,
+                                   uint8_t  nrOfLayers,
                                    unsigned short nb_rb,
                                    unsigned char output_shift) {
 
@@ -627,12 +629,11 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
 
   unsigned short rb;
   unsigned char aatx,aarx;
-  char nb_antennas_ue_tx = 1;
   __m128i *ul_ch128,*ul_ch128_2,*ul_ch_mag128,*ul_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128;
-  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
+  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0},QAM_amp128b={0};
   QAM_amp128b = _mm_setzero_si128();
 
-  for (aatx=0; aatx<nb_antennas_ue_tx; aatx++) {
+  for (aatx=0; aatx<nrOfLayers; aatx++) {
 
     if (mod_order == 4) {
       QAM_amp128 = _mm_set1_epi16(QAM16_n1);  // 2/sqrt(10)
@@ -646,11 +647,11 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
 
     for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
 
-      ul_ch128          = (__m128i *)&ul_ch_estimates_ext[(aatx<<1)+aarx][symbol*(off+(nb_rb*12))];
-      ul_ch_mag128      = (__m128i *)&ul_ch_mag[(aatx<<1)+aarx][symbol*(off+(nb_rb*12))];
-      ul_ch_mag128b     = (__m128i *)&ul_ch_magb[(aatx<<1)+aarx][symbol*(off+(nb_rb*12))];
+      ul_ch128          = (__m128i *)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
+      ul_ch_mag128      = (__m128i *)&ul_ch_mag[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
+      ul_ch_mag128b     = (__m128i *)&ul_ch_magb[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
       rxdataF128        = (__m128i *)&rxdataF_ext[aarx][symbol*(off+(nb_rb*12))];
-      rxdataF_comp128   = (__m128i *)&rxdataF_comp[(aatx<<1)+aarx][symbol*(off+(nb_rb*12))];
+      rxdataF_comp128   = (__m128i *)&rxdataF_comp[aatx*frame_parms->nb_antennas_rx+aarx][symbol*(off+(nb_rb*12))];
 
 
       for (rb=0; rb<nb_rb; rb++) {
@@ -884,7 +885,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
   symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
 
   if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) {
-    if (frame_parms->nb_antenna_ports_gNB==1) { // 10 out of 12 so don't reduce size
+    if (nrOfLayers==1) { // 10 out of 12 so don't reduce size
       nb_rb=1+(5*nb_rb/6);
     }
     else {
@@ -892,7 +893,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
     }
   }
 
-  for (aatx=0; aatx<frame_parms->nb_antenna_ports_gNB; aatx++) {
+  for (aatx=0; aatx<nrOfLayers; aatx++) {
     if (mod_order == 4) {
       QAM_amp128  = vmovq_n_s16(QAM16_n1);  // 2/sqrt(10)
       QAM_amp128b = vmovq_n_s16(0);
@@ -903,11 +904,11 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
     //    printf("comp: rxdataF_comp %p, symbol %d\n",rxdataF_comp[0],symbol);
 
     for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
-      ul_ch128          = (int16x4_t*)&ul_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_UL*12];
-      ul_ch_mag128      = (int16x8_t*)&ul_ch_mag[(aatx<<1)+aarx][symbol*frame_parms->N_RB_UL*12];
-      ul_ch_mag128b     = (int16x8_t*)&ul_ch_magb[(aatx<<1)+aarx][symbol*frame_parms->N_RB_UL*12];
+      ul_ch128          = (int16x4_t*)&ul_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*frame_parms->N_RB_UL*12];
+      ul_ch_mag128      = (int16x8_t*)&ul_ch_mag[aatx*frame_parms->nb_antennas_rx+aarx][symbol*frame_parms->N_RB_UL*12];
+      ul_ch_mag128b     = (int16x8_t*)&ul_ch_magb[aatx*frame_parms->nb_antennas_rx+aarx][symbol*frame_parms->N_RB_UL*12];
       rxdataF128        = (int16x4_t*)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_UL*12];
-      rxdataF_comp128   = (int16x4x2_t*)&rxdataF_comp[(aatx<<1)+aarx][symbol*frame_parms->N_RB_UL*12];
+      rxdataF_comp128   = (int16x4x2_t*)&rxdataF_comp[aatx*frame_parms->nb_antennas_rx+aarx][symbol*frame_parms->N_RB_UL*12];
 
       for (rb=0; rb<nb_rb; rb++) {
   if (mod_order>2) {
@@ -1166,10 +1167,10 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
   uint8_t aarx, aatx;
   uint32_t nb_re_pusch, bwp_start_subcarrier;
   int avgs;
-  int avg[4];
-  char nb_antennas_ue_tx = 1;
+
   NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
   nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu;
+  int avg[frame_parms->nb_antennas_rx*rel15_ul->nrOfLayers];
 
   gNB->pusch_vars[ulsch_id]->dmrs_symbol = INVALID_VALUE;
   gNB->pusch_vars[ulsch_id]->cl_done = 0;
@@ -1189,15 +1190,16 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
       if (gNB->pusch_vars[ulsch_id]->dmrs_symbol == INVALID_VALUE)
         gNB->pusch_vars[ulsch_id]->dmrs_symbol = symbol;
 
-      nr_pusch_channel_estimation(gNB,
-                                  slot,
-                                  0, // p
-                                  symbol,
-                                  ulsch_id,
-                                  bwp_start_subcarrier,
-                                  rel15_ul);
+      for (int nl=0; nl<rel15_ul->nrOfLayers; nl++)
+        nr_pusch_channel_estimation(gNB,
+                                    slot,
+                                    get_dmrs_port(nl,rel15_ul->dmrs_ports),
+                                    symbol,
+                                    ulsch_id,
+                                    bwp_start_subcarrier,
+                                    rel15_ul);
 
-      nr_gnb_measurements(gNB, ulsch_id, harq_pid, symbol);
+      nr_gnb_measurements(gNB, ulsch_id, harq_pid, symbol,rel15_ul->nrOfLayers);
 
       for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
         if (symbol == rel15_ul->start_symbol_index) {
@@ -1278,13 +1280,14 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
                               avg,
                               symbol,
                               nb_re_pusch,
+                              rel15_ul->nrOfLayers,
                               rel15_ul->rb_size);
 
         avgs = 0;
 
-        for (aatx=0;aatx<nb_antennas_ue_tx;aatx++)
+        for (aatx=0;aatx<rel15_ul->nrOfLayers;aatx++)
           for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++)
-            avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
+            avgs = cmax(avgs,avg[aatx*frame_parms->nb_antennas_rx+aarx]);
 
         gNB->pusch_vars[ulsch_id]->log2_maxh = (log2_approx(avgs)/2)+3;
         gNB->pusch_vars[ulsch_id]->cl_done = 1;
@@ -1299,11 +1302,12 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
                                     gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
                                     gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
                                     gNB->pusch_vars[ulsch_id]->rxdataF_comp,
-                                    (nb_antennas_ue_tx>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL,
+                                    (rel15_ul->nrOfLayers>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL,
                                     frame_parms,
                                     symbol,
                                     dmrs_symbol_flag,
                                     rel15_ul->qam_mod_order,
+                                    rel15_ul->nrOfLayers,
                                     rel15_ul->rb_size,
                                     gNB->pusch_vars[ulsch_id]->log2_maxh);
       stop_meas(&gNB->ulsch_channel_compensation_stats);
@@ -1317,7 +1321,8 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
                              rel15_ul->rb_size);
       stop_meas(&gNB->ulsch_mrc_stats);
 
-      if (rel15_ul->transform_precoding == transform_precoder_enabled) {
+      // transform precoding = 0 means enabled
+      if (rel15_ul->transform_precoding == 0) {
 
       #ifdef __AVX2__
         // For odd number of resource blocks need byte alignment to multiple of 8
diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
index 1524c840c3458dc3a077123feb2f5b45af7c2668..e3b87ff233c3d9bdac5f5d461f2076b60a7aa60f 100644
--- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
@@ -48,6 +48,8 @@
 #include "common/utils/LOG/log.h"
 #include "common/utils/LOG/vcd_signal_dumper.h"
 
+#include "nfapi/oai_integration/vendor_ext.h"
+
 #include "T.h"
 
 //#define DEBUG_NR_PUCCH_RX 1
@@ -1437,7 +1439,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
 	  corr_tmp += corr_re*corr_re + corr_im*corr_im;	
 	} // aa loop
       }// group loop
-
+      LOG_D(PHY,"cw %d, metric %f dB\n",cw,10*log10(corr_tmp));
       if (corr_tmp > corr) {
 	corr = corr_tmp;
 	cw_ML=cw;
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
index 990f3101fd181b42686e4faa044fa9af7c788097..65ae28825201321ced5139d9bc785e2284f1f076 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
@@ -239,3 +239,24 @@ short filt8_dcll2[8] = {
 
 short filt8_dclh2[8] = {
 0,0,0,0,1489,2979,4468,5958};
+
+short filt8_avlip0[8] = {
+16384,16384,16384,16384,16384,16384,16384,15019};
+
+short filt8_avlip1[8] = {
+13653,12288,10923,9557,8192,6827,5461,4096};
+
+short filt8_avlip2[8] = {
+2731,1365,0,0,0,0,0,0};
+
+short filt8_avlip3[8] = {
+2731,4096,5461,6827,8192,9557,10923,12288};
+
+short filt8_avlip4[8] = {
+13653,15019,16384,15019,13653,12288,10923,9557};
+
+short filt8_avlip5[8] = {
+8192,6827,5461,4096,2731,1365,0,0};
+
+short filt8_avlip6[8] = {
+13653,15019,16384,16384,16384,16384,16384,16384};
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
index ef6137a07f161e79ab97ea37a2b0061e73f6a4d1..e28736b51daf45dc7c133f1f210d46c89abfd571 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
@@ -169,4 +169,17 @@ extern short filt8_dcll2[8];
 
 extern short filt8_dclh2[8];
 
-#endif
\ No newline at end of file
+extern short filt8_avlip0[8];
+
+extern short filt8_avlip1[8];
+
+extern short filt8_avlip2[8];
+
+extern short filt8_avlip3[8];
+
+extern short filt8_avlip4[8];
+
+extern short filt8_avlip5[8];
+
+extern short filt8_avlip6[8];
+#endif
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
index a2f824e4686e70226b8e96478b7db1229b7a3053..3908febae9bf2531e941e18777bcd8154b1ede72 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
@@ -45,25 +45,23 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
   static int max_pos_fil = 0;
   static int count_max_pos_ok = 0;
   static int first_time = 1;
-  int temp = 0, i, aa, max_val = 0, max_pos = 0;
-  int diff;
-  short Re,Im,ncoef;
+  int max_val = 0, max_pos = 0;
+  const int sync_pos = 0;
   uint8_t sync_offset = 0;
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN);
 
-  ncoef = 32767 - coef;
+  short ncoef = 32767 - coef;
 
   LOG_D(PHY,"AbsSubframe %d: rx_offset (before) = %d\n",subframe,ue->rx_offset);
 
-
   // we only use channel estimates from tx antenna 0 here
-  for (i = 0; i < frame_parms->nb_prefix_samples; i++) {
-    temp = 0;
+  for (int i = 0; i < frame_parms->nb_prefix_samples; i++) {
+    int temp = 0;
 
-    for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
-      Re = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[(i<<1)];
-      Im = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[1+(i<<1)];
+    for (int aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
+      int Re = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[(i<<1)];
+      int Im = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[1+(i<<1)];
       temp += (Re*Re/2) + (Im*Im/2);
     }
 
@@ -73,6 +71,9 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
     }
   }
 
+  if (max_pos > frame_parms->ofdm_symbol_size/2)
+    max_pos = max_pos - frame_parms->ofdm_symbol_size;
+
   // filter position to reduce jitter
   if (clear == 1)
     max_pos_fil = max_pos;
@@ -82,61 +83,58 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
   // do not filter to have proactive timing adjustment
   //max_pos_fil = max_pos;
 
-      diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3);
-
-      if (frame_parms->freq_range==nr_FR2) 
-		sync_offset = 2;
-      else
-		sync_offset = 0;
-	
-      if ( abs(diff) < (SYNCH_HYST+sync_offset) )
-          ue->rx_offset = 0;
-      else
-          ue->rx_offset = diff;
-
-      if(abs(diff)<5)
-          count_max_pos_ok ++;
-      else
-          count_max_pos_ok = 0;
-          
-      //printf("adjust sync count_max_pos_ok = %d\n",count_max_pos_ok);
-
-      if(count_max_pos_ok > 10 && first_time == 1)
-      {
-          first_time = 0;
-          ue->time_sync_cell = 1;
-          if (get_softmodem_params()->do_ra || get_softmodem_params()->sa) {
-              LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id);
-              //mac_resynch();
-              //dl_phy_sync_success(ue->Mod_id,frame,0,1);//ue->common_vars.eNb_id);
-              ue->UE_mode[0] = PRACH;
-              ue->prach_resources[gNB_id]->sync_frame = frame;
-              ue->prach_resources[gNB_id]->init_msg1 = 0;
-          } else {
-              ue->UE_mode[0] = PUSCH;
-          }
-      }
-
-      if (ue->rx_offset < 0)
-        ue->rx_offset += frame_parms->samples_per_frame;
-
-      if (ue->rx_offset >= frame_parms->samples_per_frame)
-        ue->rx_offset -= frame_parms->samples_per_frame;
-
-
-
-      #ifdef DEBUG_PHY
-      LOG_D(PHY,"AbsSubframe %d: diff =%i rx_offset (final) = %i : clear %d,max_pos = %d,max_pos_fil = %d (peak %d) max_val %d target_pos %d \n",
-              subframe,
-              diff,
-              ue->rx_offset,
-              clear,
-              max_pos,
-              max_pos_fil,
-              temp,max_val,
-              (frame_parms->nb_prefix_samples>>3));
-      #endif //DEBUG_PHY
-
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT);
+  int diff = max_pos_fil - sync_pos;
+
+  if (frame_parms->freq_range==nr_FR2) 
+    sync_offset = 2;
+  else
+    sync_offset = 0;
+
+  if ( abs(diff) < (SYNCH_HYST+sync_offset) )
+    ue->rx_offset = 0;
+  else
+    ue->rx_offset = diff;
+
+  if(abs(diff)<5)
+    count_max_pos_ok ++;
+  else
+    count_max_pos_ok = 0;
+      
+  //printf("adjust sync count_max_pos_ok = %d\n",count_max_pos_ok);
+
+  if(count_max_pos_ok > 10 && first_time == 1)
+  {
+    first_time = 0;
+    ue->time_sync_cell = 1;
+    if (get_softmodem_params()->do_ra || get_softmodem_params()->sa) {
+      LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id);
+      //mac_resynch();
+      //dl_phy_sync_success(ue->Mod_id,frame,0,1);//ue->common_vars.eNb_id);
+      ue->UE_mode[0] = PRACH;
+      ue->prach_resources[gNB_id]->sync_frame = frame;
+      ue->prach_resources[gNB_id]->init_msg1 = 0;
+    } else {
+      ue->UE_mode[0] = PUSCH;
+    }
+  }
 
+  if (ue->rx_offset < 0)
+    ue->rx_offset += frame_parms->samples_per_frame;
+
+  if (ue->rx_offset >= frame_parms->samples_per_frame)
+    ue->rx_offset -= frame_parms->samples_per_frame;
+
+#ifdef DEBUG_PHY
+  LOG_D(PHY,"AbsSubframe %d: diff = %i, rx_offset (final) = %i : clear = %d, max_pos = %d, max_pos_fil = %d, max_val = %d, sync_pos %d\n",
+        subframe,
+        diff,
+        ue->rx_offset,
+        clear,
+        max_pos,
+        max_pos_fil,
+        max_val,
+        sync_pos);
+#endif //DEBUG_PHY
+
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT);
 }
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
index e4a82e7021fe1603df0d447d92979aad79f56163..8097b9b3ea12b3d4fa6b6c06941d21ea39b08ea6 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -94,15 +94,15 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
     ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
     ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
-    current_ssb->c_re +=ch[0];
-    current_ssb->c_im +=ch[1];
+    current_ssb->c_re += ch[0];
+    current_ssb->c_im += ch[1];
 
 #ifdef DEBUG_CH
     printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
     printf("pilot 0 : rxF - > (%d,%d) addr %p  ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
 #endif
 
-    pil+=2;
+    pil += 2;
     re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
@@ -110,29 +110,29 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
     ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
     ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
-    current_ssb->c_re +=ch[0];
-    current_ssb->c_im +=ch[1];
+    current_ssb->c_re += ch[0];
+    current_ssb->c_im += ch[1];
 
 #ifdef DEBUG_CH
     printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
 
-    pil+=2;
+    pil += 2;
     re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
-    current_ssb->c_re +=ch[0];
-    current_ssb->c_im +=ch[1];
+    current_ssb->c_re += ch[0];
+    current_ssb->c_im += ch[1];
 
 #ifdef DEBUG_CH
     printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
 
-    pil+=2;
+    pil += 2;
     re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
-    for (pilot_cnt=3; pilot_cnt<(3*20); pilot_cnt+=3) {
+    for (pilot_cnt=3; pilot_cnt<(3*20); pilot_cnt += 3) {
 
       //	if (pilot_cnt == 30)
       //	  rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k)];
@@ -146,14 +146,14 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
       
-      current_ssb->c_re +=ch[0];
-      current_ssb->c_im +=ch[1];
+      current_ssb->c_re += ch[0];
+      current_ssb->c_im += ch[1];
 
 #ifdef DEBUG_CH
       printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
         
@@ -161,13 +161,13 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
-      current_ssb->c_re +=ch[0];
-      current_ssb->c_im +=ch[1];
+      current_ssb->c_re += ch[0];
+      current_ssb->c_im += ch[1];
 
 #ifdef DEBUG_CH
       printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
         
@@ -175,14 +175,14 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
-      current_ssb->c_re +=ch[0];
-      current_ssb->c_im +=ch[1];
+      current_ssb->c_re += ch[0];
+      current_ssb->c_im += ch[1];
 
 #ifdef DEBUG_CH
       printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
@@ -287,7 +287,6 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
     printf("rxF addr %p\n", rxF);
     printf("dl_ch addr %p\n",dl_ch);
 #endif
-    //if ((ue->frame_parms.N_RB_DL&1)==0) {
 
     // Treat first 2 pilots specially (left edge)
     ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -301,7 +300,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 				       ch,
 				       dl_ch,
 				       16);
-    pil+=2;
+    pil += 2;
     re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
@@ -319,7 +318,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 				       ch,
 				       dl_ch,
 				       16);
-    pil+=2;
+    pil += 2;
     re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
@@ -334,12 +333,12 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 				       ch,
 				       dl_ch,
 				       16);
-    pil+=2;
+    pil += 2;
     re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
-    dl_ch+=24;
+    dl_ch += 24;
 
-    for (pilot_cnt=3; pilot_cnt<(3*20); pilot_cnt+=3) {
+    for (pilot_cnt=3; pilot_cnt<(3*20); pilot_cnt += 3) {
 
       //	if (pilot_cnt == 30)
       //	  rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k)];
@@ -365,7 +364,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
       //for (int i= 0; i<8; i++)
       //            printf("pilot_cnt %d dl_ch %d %d\n", pilot_cnt, dl_ch+i, *(dl_ch+i));
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
         
@@ -380,7 +379,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 					 ch,
 					 dl_ch,
 					 16);
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
         
@@ -396,10 +395,10 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 					 ch,
 					 dl_ch,
 					 16);
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
-      dl_ch+=24;
+      dl_ch += 24;
 
     }
 
@@ -458,8 +457,6 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
         }
     }
 
-    //}
-
   }
   return(0);
 }
@@ -526,111 +523,111 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
     printf("dl_ch addr %p\n",dl_ch);
 #endif
     //    if ((ue->frame_parms.N_RB_DL&1)==0) {
-      // Treat first 2 pilots specially (left edge)
-      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+    // Treat first 2 pilots specially (left edge)
+    ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+    ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 #ifdef DEBUG_PDCCH
-      printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
-      printf("pilot 0 : rxF - > (%d,%d) addr %p  ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
+    printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
+    printf("pilot 0 : rxF - > (%d,%d) addr %p  ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
 #endif
-      multadd_real_vector_complex_scalar(fl,
-                                         ch,
-                                         dl_ch,
-                                         16);
-      pil+=2;
-      rxF+=8;
-      //for (int i= 0; i<8; i++)
-      //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i));
+    multadd_real_vector_complex_scalar(fl,
+				       ch,
+				       dl_ch,
+				       16);
+    pil += 2;
+    rxF += 8;
+    //for (int i= 0; i<8; i++)
+    //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i));
 
-      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+    ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+    ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 #ifdef DEBUG_PDCCH
-      printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+    printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
-      multadd_real_vector_complex_scalar(fm,
-                                         ch,
-                                         dl_ch,
-                                         16);
-      pil+=2;
-      rxF+=8;
+    multadd_real_vector_complex_scalar(fm,
+				       ch,
+				       dl_ch,
+				       16);
+    pil += 2;
+    rxF += 8;
 
-      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+    ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+    ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
 #ifdef DEBUG_PDCCH
-      printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+    printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
 
-      multadd_real_vector_complex_scalar(fr,
-                                         ch,
-                                         dl_ch,
-                                         16);
+    multadd_real_vector_complex_scalar(fr,
+				       ch,
+				       dl_ch,
+				       16);
                                          
 #ifdef DEBUG_PDCCH       
-      for (int m =0; m<12; m++)
-	printf("data :  dl_ch -> (%d,%d)\n",dl_ch[0+2*m],dl_ch[1+2*m]);
+    for (int m =0; m<12; m++)
+      printf("data :  dl_ch -> (%d,%d)\n",dl_ch[0+2*m],dl_ch[1+2*m]);
 #endif      
-      pil+=2;
-      rxF+=8;
-      dl_ch+=24;
-      k+=12;
+    pil += 2;
+    rxF += 8;
+    dl_ch += 24;
+    k += 12;
       
       
 
-      for (pilot_cnt=3; pilot_cnt<(3*nb_rb_coreset); pilot_cnt+=3) {
+    for (pilot_cnt=3; pilot_cnt<(3*nb_rb_coreset); pilot_cnt += 3) {
 
-        if (k >= ue->frame_parms.ofdm_symbol_size){
-	  k-=ue->frame_parms.ofdm_symbol_size;
-	  rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+1)];}
+      if (k >= ue->frame_parms.ofdm_symbol_size){
+	k-=ue->frame_parms.ofdm_symbol_size;
+	rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+1)];}
 
-        ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-        ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 #ifdef DEBUG_PDCCH
-	printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+      printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
-        multadd_real_vector_complex_scalar(fl,
-                                           ch,
-                                           dl_ch,
-                                           16);
+      multadd_real_vector_complex_scalar(fl,
+					 ch,
+					 dl_ch,
+					 16);
 
-        //for (int i= 0; i<8; i++)
-        //            printf("pilot_cnt %d dl_ch %d %d\n", pilot_cnt, dl_ch+i, *(dl_ch+i));
+      //for (int i= 0; i<8; i++)
+      //            printf("pilot_cnt %d dl_ch %d %d\n", pilot_cnt, dl_ch+i, *(dl_ch+i));
 
-        pil+=2;
-        rxF+=8;
+      pil += 2;
+      rxF += 8;
 
-        ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-        ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 #ifdef DEBUG_PDCCH
-	printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+      printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
-        multadd_real_vector_complex_scalar(fm,
-                                           ch,
-                                           dl_ch,
-                                           16);
-        pil+=2;
-        rxF+=8;
+      multadd_real_vector_complex_scalar(fm,
+					 ch,
+					 dl_ch,
+					 16);
+      pil += 2;
+      rxF += 8;
 
-        ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-        ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
 #ifdef DEBUG_PDCCH
-	printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+      printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
 
-        multadd_real_vector_complex_scalar(fr,
-                                           ch,
-                                           dl_ch,
-                                           16);
-        pil+=2;
-        rxF+=8;
-        dl_ch+=24;
-        k+=12;
+      multadd_real_vector_complex_scalar(fr,
+					 ch,
+					 dl_ch,
+					 16);
+      pil += 2;
+      rxF += 8;
+      dl_ch += 24;
+      k += 12;
 
-      }
+    }
 
 
-      //}
+    //}
 
   }
 
@@ -653,7 +650,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
   unsigned short k;
   unsigned int pilot_cnt;
   int16_t ch_l[2],ch_r[2],ch[2],*pil,*rxF,*dl_ch;
-  int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh, *frl, *frr;
+  int16_t *fl=NULL,*fm=NULL,*fr=NULL,*fml=NULL,*fmr=NULL,*fmm=NULL,*fdcl=NULL,*fdcr=NULL,*fdclh=NULL,*fdcrh=NULL, *frl=NULL, *frr=NULL;
   int ch_offset,symbol_offset;
 
   NR_UE_DLSCH_t  **dlsch = ue->dlsch[proc->thread_id][gNB_id];
@@ -698,99 +695,97 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
     if (p<4) ue->frame_parms.nushift = nushift;
     switch (delta) {
 
-      case 0://port 0,1
-        fl = filt8_l0;//left interpolation Filter for DMRS config. 1
-        fm = filt8_m0;//left middle interpolation Filter
-        fr = filt8_r0;//right interpolation Filter
-        fmm = filt8_mm0;;//middle middle interpolation Filter
-        fml = filt8_m0;//left middle interpolation Filter
-        fmr = filt8_mr0;//middle right interpolation Filter
-        fdcl = filt8_dcl0;//left DC interpolation Filter (even RB)
-        fdcr = filt8_dcr0;//right DC interpolation Filter (even RB)
-        fdclh = filt8_dcl0_h;//left DC interpolation Filter (odd RB)
-        fdcrh = filt8_dcr0_h;//right DC interpolation Filter (odd RB)
-        frl = NULL;
-        frr = NULL;
-        break;
-
-      case 1://port2,3
-        fl = filt8_l1;
-        fm = filt8_m1;
-        fr = filt8_r1;
-        fmm = filt8_mm1;
-        fml = filt8_ml1;
-        fmr = filt8_m1;
-        fdcl = filt8_dcl1;
-        fdcr = filt8_dcr1;
-        fdclh = filt8_dcl1_h;
-        fdcrh = filt8_dcr1_h;
-        frl = NULL;
-        frr = NULL;
-        break;
-
-      default:
-        msg("pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
-        return -1;
-        break;
+    case 0://port 0,1
+      fl = filt8_l0;//left interpolation Filter for DMRS config. 1
+      fm = filt8_m0;//left middle interpolation Filter
+      fr = filt8_r0;//right interpolation Filter
+      fmm = filt8_mm0;;//middle middle interpolation Filter
+      fml = filt8_m0;//left middle interpolation Filter
+      fmr = filt8_mr0;//middle right interpolation Filter
+      fdcl = filt8_dcl0;//left DC interpolation Filter (even RB)
+      fdcr = filt8_dcr0;//right DC interpolation Filter (even RB)
+      fdclh = filt8_dcl0_h;//left DC interpolation Filter (odd RB)
+      fdcrh = filt8_dcr0_h;//right DC interpolation Filter (odd RB)
+      frl = NULL;
+      frr = NULL;
+      break;
+
+    case 1://port2,3
+      fl = filt8_l1;
+      fm = filt8_m1;
+      fr = filt8_r1;
+      fmm = filt8_mm1;
+      fml = filt8_ml1;
+      fmr = filt8_m1;
+      fdcl = filt8_dcl1;
+      fdcr = filt8_dcr1;
+      fdclh = filt8_dcl1_h;
+      fdcrh = filt8_dcr1_h;
+      frl = NULL;
+      frr = NULL;
+      break;
+
+    default:
+      LOG_E(PHY,"pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
+      return -1;
+      break;
     }
   } else {//NFAPI_NR_DMRS_TYPE2
     nushift = delta;
     if (p<6) ue->frame_parms.nushift = nushift;
     switch (delta) {
-      case 0://port 0,1
-        fl = filt8_l2;//left interpolation Filter should be fml
-        fr = filt8_r2;//right interpolation Filter should be fmr
-        fm = filt8_l2;
-        fmm = filt8_r2;
-        fml = filt8_ml2;
-        fmr = filt8_mr2;
-        frl = filt8_rl2;
-        frr = filt8_rm2;
-        fdcl = filt8_dcl1;
-        fdcr = filt8_dcr1;
-        fdclh = filt8_dcl1_h;
-        fdcrh = filt8_dcr1_h;
-        break;
-
-      case 2://port2,3
-        fl = filt8_l3;
-        fm = filt8_m2;
-        fr = filt8_r3;
-        fmm = filt8_mm2;
-        fml = filt8_l2;
-        fmr = filt8_r2;
-        frl = filt8_rl3;
-        frr = filt8_rr3;
-        fdcl = NULL;
-        fdcr = NULL;
-        fdclh = NULL;
-        fdcrh = NULL;
-        break;
-
-      default:
-        msg("pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
-        return -1;
-        break;
+    case 0://port 0,1
+      fl = filt8_l2;//left interpolation Filter should be fml
+      fr = filt8_r2;//right interpolation Filter should be fmr
+      fm = filt8_l2;
+      fmm = filt8_r2;
+      fml = filt8_ml2;
+      fmr = filt8_mr2;
+      frl = filt8_rl2;
+      frr = filt8_rm2;
+      fdcl = filt8_dcl1;
+      fdcr = filt8_dcr1;
+      fdclh = filt8_dcl1_h;
+      fdcrh = filt8_dcr1_h;
+      break;
+
+    case 2://port2,3
+      fl = filt8_l3;
+      fm = filt8_m2;
+      fr = filt8_r3;
+      fmm = filt8_mm2;
+      fml = filt8_l2;
+      fmr = filt8_r2;
+      frl = filt8_rl3;
+      frr = filt8_rr3;
+      fdcl = NULL;
+      fdcr = NULL;
+      fdclh = NULL;
+      fdcrh = NULL;
+      break;
+
+    default:
+      LOG_E(PHY,"pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
+      return -1;
+      break;
     }
   }
 
   for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
-    pil   = (int16_t *)&pilot[rb_offset*((config_type==NFAPI_NR_DMRS_TYPE1) ? 6:4)];
+    pil   = (int16_t *)&pilot[rb_offset*((config_type == NFAPI_NR_DMRS_TYPE1) ? 6:4)];
     k     = k % ue->frame_parms.ofdm_symbol_size;
     re_offset = k;
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+re_offset+nushift)];
     dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
 
     memset(dl_ch,0,4*(ue->frame_parms.ofdm_symbol_size));
-
 #ifdef DEBUG_PDSCH
     printf("ch est pilot addr %p RB_DL %d\n",&pilot[0], ue->frame_parms.N_RB_DL);
     printf("k %d, first_carrier %d\n",k,ue->frame_parms.first_carrier_offset);
     printf("rxF addr %p p %d\n", rxF,p);
     printf("dl_ch addr %p nushift %d\n",dl_ch,nushift);
 #endif
-
-    if (config_type == NFAPI_NR_DMRS_TYPE1) {
+    if (config_type == NFAPI_NR_DMRS_TYPE1 && ue->prb_interpolation == 0) {
 
       // Treat first 2 pilots specially (left edge)
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -804,7 +799,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          ch,
                                          dl_ch,
                                          8);
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       //for (int i= 0; i<8; i++)
@@ -819,7 +814,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          ch,
                                          dl_ch,
                                          8);
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       //printf("dl_ch addr %p\n",dl_ch);
@@ -834,18 +829,12 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          dl_ch,
                                          8);
                                          
-      //for (int i= 0; i<16; i++)
-      //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i));
-      
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-      dl_ch+=8;
+      dl_ch += 8;
 
-      for (pilot_cnt=3; pilot_cnt<(6*nb_rb_pdsch-3); pilot_cnt+=2) {
-    	//if ((pilot_cnt%6)==0)
-    		//dl_ch+=4;
-		//printf("re_offset %d\n",re_offset);
+      for (pilot_cnt=3; pilot_cnt<(6*nb_rb_pdsch-3); pilot_cnt += 2) {
 
         ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
         ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
@@ -857,7 +846,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                            dl_ch,
                                            8);
 
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       
@@ -870,10 +859,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                            ch,
                                            dl_ch,
                                            8);
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-        dl_ch+=8;
+        dl_ch += 8;
 
       }
       
@@ -881,7 +870,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 #ifdef DEBUG_PDSCH
-	printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+      printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
       multadd_real_vector_complex_scalar(fm,
                                          ch,
@@ -891,7 +880,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
       //for (int i= 0; i<8; i++)
       //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i));
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
              
@@ -906,10 +895,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          dl_ch,
                                          8);
                                          
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-      dl_ch+=8;
+      dl_ch += 8;
       
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
@@ -921,59 +910,59 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          dl_ch,
                                          8);
     
-    // check if PRB crosses DC and improve estimates around DC
-    if ((bwp_start_subcarrier < ue->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pdsch*12 >= ue->frame_parms.ofdm_symbol_size)) {
-      dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
-      uint16_t idxDC = 2*(ue->frame_parms.ofdm_symbol_size - bwp_start_subcarrier);
-      uint16_t idxPil = idxDC/2;
-      re_offset = k;
-      pil = (int16_t *)&pilot[rb_offset*((config_type==NFAPI_NR_DMRS_TYPE1) ? 6:4)];
-      pil += (idxPil-2);
-      dl_ch += (idxDC-4);
-      dl_ch = memset(dl_ch, 0, sizeof(int16_t)*10);
-      re_offset = (re_offset+idxDC/2-2) % ue->frame_parms.ofdm_symbol_size;
-      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-      
-      // for proper allignment of SIMD vectors
-      if((ue->frame_parms.N_RB_DL&1)==0) {
-        
-        multadd_real_vector_complex_scalar(fdcl,
-                                           ch,
-                                           dl_ch-4,
-                                           8);
-        
-        pil += 4;
-        re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
+      // check if PRB crosses DC and improve estimates around DC
+      if ((bwp_start_subcarrier < ue->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pdsch*12 >= ue->frame_parms.ofdm_symbol_size)) {
+        dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset];
+        uint16_t idxDC = 2*(ue->frame_parms.ofdm_symbol_size - bwp_start_subcarrier);
+        uint16_t idxPil = idxDC/2;
+        re_offset = k;
+        pil = (int16_t *)&pilot[rb_offset*((config_type == NFAPI_NR_DMRS_TYPE1) ? 6:4)];
+        pil += (idxPil-2);
+        dl_ch += (idxDC-4);
+        dl_ch = memset(dl_ch, 0, sizeof(int16_t)*10);
+        re_offset = (re_offset+idxDC/2-2) % ue->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
         ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
         ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-        
-        multadd_real_vector_complex_scalar(fdcr,
-                                           ch,
-                                           dl_ch-4,
-                                           8);
-      } else {
+          
+        // for proper allignment of SIMD vectors
+        if((ue->frame_parms.N_RB_DL&1) == 0) {
+              
+          multadd_real_vector_complex_scalar(fdcl,
+                     ch,
+                     dl_ch-4,
+                     8);
+              
+          pil += 4;
+          re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
+          rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+          ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+          ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+              
+          multadd_real_vector_complex_scalar(fdcr,
+                     ch,
+                     dl_ch-4,
+                     8);
+        } else {
 
-        multadd_real_vector_complex_scalar(fdclh,
-                                           ch,
-                                           dl_ch,
-                                           8);
-        
-        pil += 4;
-        re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
-        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-        ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-        ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-        
-        multadd_real_vector_complex_scalar(fdcrh,
-                                           ch,
-                                           dl_ch,
-                                           8);
+          multadd_real_vector_complex_scalar(fdclh,
+                     ch,
+                     dl_ch,
+                     8);
+              
+          pil += 4;
+          re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
+          rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+          ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+          ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+              
+          multadd_real_vector_complex_scalar(fdcrh,
+                     ch,
+                     dl_ch,
+                     8);
+        }
       }
-    }
-    } else { //NFAPI_NR_DMRS_TYPE2  |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0|
+    } else if (config_type == NFAPI_NR_DMRS_TYPE2 && ue->prb_interpolation == 0){ //pdsch_dmrs_type2  |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0|
 
       // Treat first 4 pilots specially (left edge)
       ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -984,7 +973,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
       printf("pilot 0 : rxF - > (%d,%d) addr %p  ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch_l[0],ch_l[1],pil[0],pil[1]);
 #endif
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -1003,13 +992,13 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          dl_ch,
                                          8);
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -1023,20 +1012,20 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          dl_ch,
                                          8);
 
-      dl_ch+=12;
+      dl_ch += 12;
       dl_ch[0+2*nushift] = ch[0];
       dl_ch[1+2*nushift] = ch[1];
       dl_ch[2+2*nushift] = ch[0];
       dl_ch[3+2*nushift] = ch[1];
-      dl_ch+=4;
+      dl_ch += 4;
 
-      for (pilot_cnt=4; pilot_cnt<4*nb_rb_pdsch; pilot_cnt+=4) {
+      for (pilot_cnt=4; pilot_cnt<4*nb_rb_pdsch; pilot_cnt += 4) {
 
         multadd_real_vector_complex_scalar(fml,
                                            ch,
                                            dl_ch,
                                            8);
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
         ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -1046,7 +1035,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
         printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch_l[0],ch_l[1],pil[0],pil[1]);
 #endif
 
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
         ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -1064,7 +1053,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                            dl_ch,
                                            8);
 
-        dl_ch+=8;
+        dl_ch += 8;
         dl_ch[0+2*nushift] = ch[0];
         dl_ch[1+2*nushift] = ch[1];
         dl_ch[2+2*nushift] = ch[0];
@@ -1075,13 +1064,13 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                            dl_ch,
                                            8);
 
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
         ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
         ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
         ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -1099,12 +1088,12 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                            dl_ch,
                                            8);
 
-        dl_ch+=12;
+        dl_ch += 12;
         dl_ch[0+2*nushift] = ch[0];
         dl_ch[1+2*nushift] = ch[1];
         dl_ch[2+2*nushift] = ch[0];
         dl_ch[3+2*nushift] = ch[1];
-        dl_ch+=4;
+        dl_ch += 4;
       }
 
       // Treat last 2 pilots specially (right edge)
@@ -1136,7 +1125,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
         ch_l[1]= dl_ch[1] ;
 
         // for proper allignment of SIMD vectors
-        if((ue->frame_parms.N_RB_DL&1)==0) {
+        if((ue->frame_parms.N_RB_DL&1) == 0) {
           dl_ch -= 20;
           //Interpolate fdcrl1 with ch_r
           multadd_real_vector_complex_scalar(filt8_dcrl1,
@@ -1185,11 +1174,359 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
         }
       }
     }
+    else if (config_type == NFAPI_NR_DMRS_TYPE1) { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 6 DMRS REs and use a common value for the whole PRB
+      int32_t ch_0, ch_1;
+      
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 6;
+      ch[1] = ch_1 / 6;
+
+      multadd_real_vector_complex_scalar(filt8_avlip0,
+                                         ch,
+                                         dl_ch,
+                                         8);
+
+      dl_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip1,
+                                         ch,
+                                         dl_ch,
+                                         8);
+
+      dl_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip2,
+                                         ch,
+                                         dl_ch,
+                                         8);
+      dl_ch -= 24;
+
+      for (pilot_cnt=6; pilot_cnt<6*(nb_rb_pdsch-1); pilot_cnt += 6) {
+
+        ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch[0] = ch_0 / 6;
+        ch[1] = ch_1 / 6;
+        dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+        dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+        dl_ch += 8;
+        multadd_real_vector_complex_scalar(filt8_avlip3,
+                                           ch,
+                                           dl_ch,
+                                           8);
+
+        dl_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip4,
+                                           ch,
+                                           dl_ch,
+                                           8);
+
+        dl_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip5,
+                                           ch,
+                                           dl_ch,
+                                           8);
+        dl_ch -= 16;
+      }
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 6;
+      ch[1] = ch_1 / 6;
+
+      dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+      dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+      dl_ch += 8;
+      multadd_real_vector_complex_scalar(filt8_avlip3,
+                                         ch,
+                                         dl_ch,
+                                         8);
+
+      dl_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip6,
+                                         ch,
+                                         dl_ch,
+                                         8);
+    }
+    else  { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 4 DMRS REs and use a common value for the whole PRB
+      int32_t ch_0, ch_1;
+
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
 
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 4;
+      ch[1] = ch_1 / 4;
+
+      multadd_real_vector_complex_scalar(filt8_avlip0,
+                                         ch,
+                                         dl_ch,
+                                         8);
+
+      dl_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip1,
+                                         ch,
+                                         dl_ch,
+                                         8);
+
+      dl_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip2,
+                                         ch,
+                                         dl_ch,
+                                         8);
+      dl_ch -= 24;
+
+      for (pilot_cnt=4; pilot_cnt<4*(nb_rb_pdsch-1); pilot_cnt += 4) {
+        int32_t ch_0, ch_1;
+
+        ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch[0] = ch_0 / 4;
+        ch[1] = ch_1 / 4;
+
+        dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+        dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+        dl_ch += 8;
+        multadd_real_vector_complex_scalar(filt8_avlip3,
+                                           ch,
+                                           dl_ch,
+                                           8);
+
+        dl_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip4,
+                                           ch,
+                                           dl_ch,
+                                           8);
+
+        dl_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip5,
+                                           ch,
+                                           dl_ch,
+                                           8);
+        dl_ch -= 16;
+      }
+
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 4;
+      ch[1] = ch_1 / 4;
+
+      dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+      dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+      dl_ch += 8;
+      multadd_real_vector_complex_scalar(filt8_avlip3,
+                                         ch,
+                                         dl_ch,
+                                         8);
+
+      dl_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip6,
+                                         ch,
+                                         dl_ch,
+                                         8);
+    }
 #ifdef DEBUG_PDSCH
     dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
     for(uint16_t idxP=0; idxP<ceil((float)nb_rb_pdsch*12/8); idxP++) {
-      for(uint8_t idxI=0; idxI<16; idxI+=2) {
+      for(uint8_t idxI=0; idxI<16; idxI += 2) {
         printf("%d\t%d\t",dl_ch[idxP*16+idxI],dl_ch[idxP*16+idxI+1]);
       }
       printf("%d\n",idxP);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
index cffdf5092d90e796dce3efb9164796d6e965ea33..aa8588f106f6a4718d50fed7b0f72d768372f7aa 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
@@ -715,106 +715,102 @@ void pdcch_siso(NR_DL_FRAME_PARMS *frame_parms,
 
 #ifdef NR_PDCCH_DCI_RUN
 int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
-                    UE_nr_rxtx_proc_t *proc) {
+                    UE_nr_rxtx_proc_t *proc,
+                    fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15) {
 
   uint32_t frame = proc->frame_rx;
   uint32_t slot  = proc->nr_slot_rx;
   NR_UE_COMMON *common_vars      = &ue->common_vars;
   NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
   NR_UE_PDCCH *pdcch_vars        = ue->pdcch_vars[proc->thread_id][0];
-  fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15;
 
   uint8_t log2_maxh, aarx;
   int32_t avgs;
   int32_t avgP[4];
-  for (int i=0;i<pdcch_vars->nb_search_space;i++) {
-
-    rel15 = &pdcch_vars->pdcch_config[i];
-    int n_rb,rb_offset;
-    get_coreset_rballoc(rel15->coreset.frequency_domain_resource,&n_rb,&rb_offset);
-
-    LOG_D(PHY,"pdcch coreset: freq %x, n_rb %d, rb_offset %d\n",
-          rel15->coreset.frequency_domain_resource[0],n_rb,rb_offset);
-
-    for (int s=rel15->coreset.StartSymbolIndex; s<(rel15->coreset.StartSymbolIndex+rel15->coreset.duration); s++) {
-      LOG_D(PHY,"in nr_pdcch_extract_rbs_single(rxdataF -> rxdataF_ext || dl_ch_estimates -> dl_ch_estimates_ext)\n");
-
-      nr_pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
-				  pdcch_vars->dl_ch_estimates,
-				  pdcch_vars->rxdataF_ext,
-				  pdcch_vars->dl_ch_estimates_ext,
-				  s,
-				  frame_parms,
-				  rel15->coreset.frequency_domain_resource,
-				  n_rb,
-				  rel15->BWPStart);
-
-      LOG_D(PHY,"we enter nr_pdcch_channel_level(avgP=%d) => compute channel level based on ofdm symbol 0, pdcch_vars[eNB_id]->dl_ch_estimates_ext\n",*avgP);
-      LOG_D(PHY,"in nr_pdcch_channel_level(dl_ch_estimates_ext -> dl_ch_estimates_ext)\n");
-      // compute channel level based on ofdm symbol 0
-      nr_pdcch_channel_level(pdcch_vars->dl_ch_estimates_ext,
-                             frame_parms,
-                             avgP,
-                             n_rb);
-      avgs = 0;
-
-      for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++)
-        avgs = cmax(avgs, avgP[aarx]);
-
-      log2_maxh = (log2_approx(avgs) / 2) + 1;  //+frame_parms->nb_antennas_rx;
+  int n_rb,rb_offset;
+  get_coreset_rballoc(rel15->coreset.frequency_domain_resource,&n_rb,&rb_offset);
+  LOG_D(PHY,"pdcch coreset: freq %x, n_rb %d, rb_offset %d\n",
+        rel15->coreset.frequency_domain_resource[0],n_rb,rb_offset);
+  for (int s=rel15->coreset.StartSymbolIndex; s<(rel15->coreset.StartSymbolIndex+rel15->coreset.duration); s++) {
+    LOG_D(PHY,"in nr_pdcch_extract_rbs_single(rxdataF -> rxdataF_ext || dl_ch_estimates -> dl_ch_estimates_ext)\n");
+
+    nr_pdcch_extract_rbs_single(common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF,
+                                pdcch_vars->dl_ch_estimates,
+                                pdcch_vars->rxdataF_ext,
+                                pdcch_vars->dl_ch_estimates_ext,
+                                s,
+                                frame_parms,
+                                rel15->coreset.frequency_domain_resource,
+                                n_rb,
+                                rel15->BWPStart);
+
+    LOG_D(PHY,"we enter nr_pdcch_channel_level(avgP=%d) => compute channel level based on ofdm symbol 0, pdcch_vars[eNB_id]->dl_ch_estimates_ext\n",*avgP);
+    LOG_D(PHY,"in nr_pdcch_channel_level(dl_ch_estimates_ext -> dl_ch_estimates_ext)\n");
+    // compute channel level based on ofdm symbol 0
+    nr_pdcch_channel_level(pdcch_vars->dl_ch_estimates_ext,
+                           frame_parms,
+                           avgP,
+                           n_rb);
+    avgs = 0;
+
+    for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++)
+      avgs = cmax(avgs, avgP[aarx]);
+
+    log2_maxh = (log2_approx(avgs) / 2) + 5;  //+frame_parms->nb_antennas_rx;
+
 #ifdef UE_DEBUG_TRACE
-      LOG_D(PHY,"slot %d: pdcch log2_maxh = %d (%d,%d)\n",slot,log2_maxh,avgP[0],avgs);
+    LOG_D(PHY,"slot %d: pdcch log2_maxh = %d (%d,%d)\n",slot,log2_maxh,avgP[0],avgs);
 #endif
 #if T_TRACER
-      T(T_UE_PHY_PDCCH_ENERGY, T_INT(0), T_INT(0), T_INT(frame%1024), T_INT(slot),
-	    T_INT(avgP[0]), T_INT(avgP[1]), T_INT(avgP[2]), T_INT(avgP[3]));
+    T(T_UE_PHY_PDCCH_ENERGY, T_INT(0), T_INT(0), T_INT(frame%1024), T_INT(slot),
+      T_INT(avgP[0]), T_INT(avgP[1]), T_INT(avgP[2]), T_INT(avgP[3]));
 #endif
-      LOG_D(PHY,"we enter nr_pdcch_channel_compensation(log2_maxh=%d)\n",log2_maxh);
-      LOG_D(PHY,"in nr_pdcch_channel_compensation(rxdataF_ext x dl_ch_estimates_ext -> rxdataF_comp)\n");
-      // compute LLRs for ofdm symbol 0 only
-      nr_pdcch_channel_compensation(pdcch_vars->rxdataF_ext,
-                                    pdcch_vars->dl_ch_estimates_ext,
-                                    pdcch_vars->rxdataF_comp,
-                                    NULL,
-                                    frame_parms,
-                                    s,
-                                    log2_maxh,
-                                    n_rb); // log2_maxh+I0_shift
-      if (frame_parms->nb_antennas_rx > 1) {
-        LOG_D(PHY,"we enter nr_pdcch_detection_mrc(frame_parms->nb_antennas_rx=%d)\n", frame_parms->nb_antennas_rx);
-        nr_pdcch_detection_mrc(frame_parms, pdcch_vars->rxdataF_comp,s);
-      }
+    LOG_D(PHY,"we enter nr_pdcch_channel_compensation(log2_maxh=%d)\n",log2_maxh);
+    LOG_D(PHY,"in nr_pdcch_channel_compensation(rxdataF_ext x dl_ch_estimates_ext -> rxdataF_comp)\n");
+    // compute LLRs for ofdm symbol 0 only
+    nr_pdcch_channel_compensation(pdcch_vars->rxdataF_ext,
+                                  pdcch_vars->dl_ch_estimates_ext,
+                                  pdcch_vars->rxdataF_comp,
+                                  NULL,
+                                  frame_parms,
+                                  s,
+                                  log2_maxh,
+                                  n_rb); // log2_maxh+I0_shift
+    if (frame_parms->nb_antennas_rx > 1) {
+      LOG_D(PHY,"we enter nr_pdcch_detection_mrc(frame_parms->nb_antennas_rx=%d)\n", frame_parms->nb_antennas_rx);
+      nr_pdcch_detection_mrc(frame_parms, pdcch_vars->rxdataF_comp,s);
+    }
 
-      LOG_D(PHY,"we enter nr_pdcch_llr(for symbol %d), pdcch_vars[eNB_id]->rxdataF_comp ---> pdcch_vars[eNB_id]->llr \n",s);
-      LOG_D(PHY,"in nr_pdcch_llr(rxdataF_comp -> llr)\n");
-      nr_pdcch_llr(frame_parms,
-                   pdcch_vars->rxdataF_comp,
-                   pdcch_vars->llr,
-                   s,
-                   n_rb);
+    LOG_D(PHY,"we enter nr_pdcch_llr(for symbol %d), pdcch_vars[eNB_id]->rxdataF_comp ---> pdcch_vars[eNB_id]->llr \n",s);
+    LOG_D(PHY,"in nr_pdcch_llr(rxdataF_comp -> llr)\n");
+    nr_pdcch_llr(frame_parms,
+                 pdcch_vars->rxdataF_comp,
+                 pdcch_vars->llr,
+                 s,
+                 n_rb);
 #if T_TRACER
     
-      //  T(T_UE_PHY_PDCCH_IQ, T_INT(frame_parms->N_RB_DL), T_INT(frame_parms->N_RB_DL),
-      //  T_INT(n_pdcch_symbols),
-      //  T_BUFFER(pdcch_vars[eNB_id]->rxdataF_comp, frame_parms->N_RB_DL*12*n_pdcch_symbols* 4));
+    //  T(T_UE_PHY_PDCCH_IQ, T_INT(frame_parms->N_RB_DL), T_INT(frame_parms->N_RB_DL),
+    //  T_INT(n_pdcch_symbols),
+    //  T_BUFFER(pdcch_vars[eNB_id]->rxdataF_comp, frame_parms->N_RB_DL*12*n_pdcch_symbols* 4));
     
 #endif
 #ifdef DEBUG_DCI_DECODING
-      printf("demapping: slot %d, mi %d\n",slot,get_mi(frame_parms,slot));
+    printf("demapping: slot %d, mi %d\n",slot,get_mi(frame_parms,slot));
 #endif
-    }
+  }
 
-    LOG_D(PHY,"we enter nr_pdcch_demapping_deinterleaving()\n");
-    nr_pdcch_demapping_deinterleaving((uint32_t *) pdcch_vars->llr,
-                                      (uint32_t *) pdcch_vars->e_rx,
-                                      rel15->coreset.duration,
-                                      n_rb,
-                                      rel15->coreset.RegBundleSize,
-                                      rel15->coreset.InterleaverSize,
-                                      rel15->coreset.ShiftIndex,
-                                      rel15->number_of_candidates,
-                                      rel15->CCE,
-                                      rel15->L);
+  LOG_D(PHY,"we enter nr_pdcch_demapping_deinterleaving()\n");
+  nr_pdcch_demapping_deinterleaving((uint32_t *) pdcch_vars->llr,
+                                    (uint32_t *) pdcch_vars->e_rx,
+                                    rel15->coreset.duration,
+                                    n_rb,
+                                    rel15->coreset.RegBundleSize,
+                                    rel15->coreset.InterleaverSize,
+                                    rel15->coreset.ShiftIndex,
+                                    rel15->number_of_candidates,
+                                    rel15->CCE,
+                                    rel15->L);
     /*
     nr_pdcch_unscrambling(rel15->rnti,
                           frame_parms,
@@ -824,10 +820,9 @@ int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
                           // get_nCCE(n_pdcch_symbols, frame_parms, mi) * 72,
                           rel15->coreset.pdcch_dmrs_scrambling_id);
     */
-    LOG_D(PHY,"we end nr_pdcch_unscrambling()\n");
-    LOG_D(PHY,"Ending nr_rx_pdcch() function\n");
+  LOG_D(PHY,"we end nr_pdcch_unscrambling()\n");
+  LOG_D(PHY,"Ending nr_rx_pdcch() function\n");
 
-  }
   return (0);
 }
 
@@ -923,73 +918,73 @@ uint16_t nr_dci_false_detection(uint64_t *dci,
 
 uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
                                   UE_nr_rxtx_proc_t *proc,
-                                  fapi_nr_dci_indication_t *dci_ind) {
+                                  fapi_nr_dci_indication_t *dci_ind,
+                                  fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15) {
 
-  NR_UE_PDCCH *pdcch_vars        = ue->pdcch_vars[proc->thread_id][0];
-  fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15;
-  for (int i=0;i<pdcch_vars->nb_search_space;i++) {
+  NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[proc->thread_id][0];
 
-    rel15 = &pdcch_vars->pdcch_config[i];
-    //int gNB_id = 0;
-    int16_t tmp_e[16*108];
-    rnti_t n_rnti;
+  //int gNB_id = 0;
+  int16_t tmp_e[16*108];
+  rnti_t n_rnti;
 
-    for (int j=0;j<rel15->number_of_candidates;j++) {
-      int CCEind = rel15->CCE[j];
-      int L = rel15->L[j];
+  for (int j=0;j<rel15->number_of_candidates;j++) {
+    int CCEind = rel15->CCE[j];
+    int L = rel15->L[j];
 
-      // Loop over possible DCI lengths
-      for (int k = 0; k < rel15->num_dci_options; k++) {
-        int dci_length = rel15->dci_length_options[k];
-        uint64_t dci_estimation[2]= {0};
-        const t_nrPolar_params *currentPtrDCI = nr_polar_params(NR_POLAR_DCI_MESSAGE_TYPE, dci_length, L, 1, &ue->polarList);
+    // Loop over possible DCI lengths
+    for (int k = 0; k < rel15->num_dci_options; k++) {
+      int dci_length = rel15->dci_length_options[k];
+      uint64_t dci_estimation[2]= {0};
+      const t_nrPolar_params *currentPtrDCI = nr_polar_params(NR_POLAR_DCI_MESSAGE_TYPE, dci_length, L, 1, &ue->polarList);
 
-        LOG_D(PHY, "Trying DCI candidate %d of %d number of candidates, CCE %d (%d), L %d\n", j, rel15->number_of_candidates, CCEind, CCEind*9*6*2, L);
+      LOG_D(PHY, "Trying DCI candidate %d of %d number of candidates, CCE %d (%d), L %d\n", j, rel15->number_of_candidates, CCEind, CCEind*9*6*2, L);
 
-        nr_pdcch_unscrambling(&pdcch_vars->e_rx[CCEind*108], rel15->coreset.scrambling_rnti, L*108, rel15->coreset.pdcch_dmrs_scrambling_id, tmp_e);
+      nr_pdcch_unscrambling(&pdcch_vars->e_rx[CCEind*108], rel15->coreset.scrambling_rnti, L*108, rel15->coreset.pdcch_dmrs_scrambling_id, tmp_e);
 
-        #ifdef DEBUG_DCI_DECODING
-          uint32_t * z = (uint32_t *) &pdcch_vars->e_rx[CCEind*108];
-          for (int index_z = 0; index_z < 96; index_z++){
-            for (int i=0; i<9; i++) {
-              LOG_D(PHY,"z[%d]=(%d,%d) \n", (9*index_z + i), *(int16_t *) &z[index_z + i],*(1 + (int16_t *) &z[index_z + i]));
-            }
-          }
-        #endif
-
-        uint16_t crc = polar_decoder_int16(tmp_e,
-                                          dci_estimation,
-                                          1,
-                                          currentPtrDCI);
-
-        n_rnti = rel15->rnti;
-	      LOG_D(PHY, "(%i.%i) dci indication (rnti %x,dci format %s,n_CCE %d,payloadSize %d)\n", proc->frame_rx, proc->nr_slot_rx,n_rnti,nr_dci_format_string[rel15->dci_format_options[k]],CCEind,dci_length);
-        if (crc == n_rnti) {
-          LOG_D(PHY, "(%i.%i) Received dci indication (rnti %x,dci format %s,n_CCE %d,payloadSize %d,payload %llx)\n",
-                proc->frame_rx, proc->nr_slot_rx,n_rnti,nr_dci_format_string[rel15->dci_format_options[k]],CCEind,dci_length,*(unsigned long long*)dci_estimation);
-          uint16_t mb = nr_dci_false_detection(dci_estimation,tmp_e,currentPtrDCI,L*108,n_rnti);
-          ue->dci_thres = (ue->dci_thres + mb) / 2;
-          if (mb > (ue->dci_thres+20)) {
-            LOG_W(PHY,"DCI false positive. Dropping DCI index %d. Mismatched bits: %d/%d. Current DCI threshold: %d\n",j,mb,L*108,ue->dci_thres);
-            continue;
-          }
-          else {
-            dci_ind->SFN = proc->frame_rx;
-            dci_ind->slot = proc->nr_slot_rx;
-            dci_ind->dci_list[dci_ind->number_of_dcis].rnti        = n_rnti;
-            dci_ind->dci_list[dci_ind->number_of_dcis].n_CCE       = CCEind;
-            dci_ind->dci_list[dci_ind->number_of_dcis].dci_format  = rel15->dci_format_options[k];
-            dci_ind->dci_list[dci_ind->number_of_dcis].payloadSize = dci_length;
-            memcpy((void*)dci_ind->dci_list[dci_ind->number_of_dcis].payloadBits,(void*)dci_estimation,8);
-            dci_ind->number_of_dcis++;
-            break;    // If DCI is found, no need to check for remaining DCI lengths
-          }
-        } else {
-          LOG_D(PHY,"(%i.%i) Decoded crc %x does not match rnti %x for DCI format %d\n", proc->frame_rx, proc->nr_slot_rx, crc, n_rnti, rel15->dci_format_options[k]);
+#ifdef DEBUG_DCI_DECODING
+      uint32_t * z = (uint32_t *) &pdcch_vars->e_rx[CCEind*108];
+      for (int index_z = 0; index_z < 96; index_z++){
+        for (int i=0; i<9; i++) {
+          LOG_D(PHY,"z[%d]=(%d,%d) \n", (9*index_z + i), *(int16_t *) &z[index_z + i],*(1 + (int16_t *) &z[index_z + i]));
+        }
+      }
+#endif
+
+      uint16_t crc = polar_decoder_int16(tmp_e,
+                                         dci_estimation,
+                                         1,
+                                         currentPtrDCI);
+
+      n_rnti = rel15->rnti;
+      LOG_D(PHY, "(%i.%i) dci indication (rnti %x,dci format %s,n_CCE %d,payloadSize %d)\n",
+            proc->frame_rx, proc->nr_slot_rx,n_rnti,nr_dci_format_string[rel15->dci_format_options[k]],CCEind,dci_length);
+      if (crc == n_rnti) {
+        LOG_D(PHY, "(%i.%i) Received dci indication (rnti %x,dci format %s,n_CCE %d,payloadSize %d,payload %llx)\n",
+              proc->frame_rx, proc->nr_slot_rx,n_rnti,nr_dci_format_string[rel15->dci_format_options[k]],CCEind,dci_length,*(unsigned long long*)dci_estimation);
+        uint16_t mb = nr_dci_false_detection(dci_estimation,tmp_e,currentPtrDCI,L*108,n_rnti);
+        ue->dci_thres = (ue->dci_thres + mb) / 2;
+        if (mb > (ue->dci_thres+20)) {
+          LOG_W(PHY,"DCI false positive. Dropping DCI index %d. Mismatched bits: %d/%d. Current DCI threshold: %d\n",j,mb,L*108,ue->dci_thres);
+          continue;
+        }
+        else {
+          dci_ind->SFN = proc->frame_rx;
+          dci_ind->slot = proc->nr_slot_rx;
+          dci_ind->dci_list[dci_ind->number_of_dcis].rnti        = n_rnti;
+          dci_ind->dci_list[dci_ind->number_of_dcis].n_CCE       = CCEind;
+          dci_ind->dci_list[dci_ind->number_of_dcis].N_CCE       = L;
+          dci_ind->dci_list[dci_ind->number_of_dcis].dci_format  = rel15->dci_format_options[k];
+          dci_ind->dci_list[dci_ind->number_of_dcis].payloadSize = dci_length;
+          memcpy((void*)dci_ind->dci_list[dci_ind->number_of_dcis].payloadBits,(void*)dci_estimation,8);
+          dci_ind->number_of_dcis++;
+          break;    // If DCI is found, no need to check for remaining DCI lengths
         }
+      } else {
+        LOG_D(PHY,"(%i.%i) Decoded crc %x does not match rnti %x for DCI format %d\n", proc->frame_rx, proc->nr_slot_rx, crc, n_rnti, rel15->dci_format_options[k]);
       }
     }
   }
+  pdcch_vars->nb_search_space = 0;
   return(dci_ind->number_of_dcis);
 }
 
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index 4f6871ca4f9b89fed334a146195429da1e764ff5..95b04435eba70320525dbfec38663be2075d3319 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -60,23 +60,22 @@ int nbDlProcessing =0;
 static  tpool_t pool_dl;
 
 //extern double cpuf;
-void init_dlsch_tpool(uint8_t num_dlsch_threads)
-{
-    if( num_dlsch_threads==0)
-    	return;
+void init_dlsch_tpool(uint8_t num_dlsch_threads) {
+  if( num_dlsch_threads==0)
+    return;
 
   char *params=calloc(1,(num_dlsch_threads*3)+1);
+
   for (int i=0; i<num_dlsch_threads; i++) {
     memcpy(params+(i*3),"-1,",3);
   }
+
   initNamedTpool(params, &pool_dl, false,"dlsch");
   free(params);
 }
 
 
-void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL)
-{
-
+void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL) {
   int i,r;
   uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS;  //number of segments to be allocated
   NR_UE_DLSCH_t *dlsch=*dlschptr;
@@ -85,8 +84,7 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL)
     if (N_RB_DL != 273) {
       a_segments = a_segments*N_RB_DL;
       a_segments = a_segments/273 +1;
-    }  
- 
+    }
 
     for (i=0; i<dlsch->Mdlharq; i++) {
       if (dlsch->harq_processes[i]) {
@@ -105,7 +103,7 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL)
             free16(dlsch->harq_processes[i]->d[r],(5*8448)*sizeof(short));
             dlsch->harq_processes[i]->d[r] = NULL;
           }
-        
+
         for (r=0; r<a_segments; r++)
           if (dlsch->harq_processes[i]->w[r]) {
             free16(dlsch->harq_processes[i]->w[r],(5*8448)*sizeof(short));
@@ -113,7 +111,7 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL)
           }
 
         for (r=0; r<a_segments; r++) {
-          if (dlsch->harq_processes[i]->p_nrLDPC_procBuf[r]){
+          if (dlsch->harq_processes[i]->p_nrLDPC_procBuf[r]) {
             nrLDPC_free_mem(dlsch->harq_processes[i]->p_nrLDPC_procBuf[r]);
             dlsch->harq_processes[i]->p_nrLDPC_procBuf[r] = NULL;
           }
@@ -123,27 +121,23 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL)
         dlsch->harq_processes[i] = NULL;
       }
     }
-      
+
     free16(dlsch,sizeof(NR_UE_DLSCH_t));
     dlsch = NULL;
   }
 }
 
-NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_ldpc_iterations,uint16_t N_RB_DL, uint8_t abstraction_flag)
-{
-
+NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_ldpc_iterations,uint16_t N_RB_DL, uint8_t abstraction_flag) {
   NR_UE_DLSCH_t *dlsch;
   uint8_t exit_flag = 0,i,r;
-
   uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS;  //number of segments to be allocated
 
   if (N_RB_DL != 273) {
     a_segments = a_segments*N_RB_DL;
     a_segments = (a_segments/273)+1;
-  }  
+  }
 
   uint16_t dlsch_bytes = a_segments*1056;  // allocated bytes per segment
-
   dlsch = (NR_UE_DLSCH_t *)malloc16(sizeof(NR_UE_DLSCH_t));
 
   if (dlsch) {
@@ -154,15 +148,15 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
     dlsch->Nsoft = Nsoft;
     dlsch->Mlimit = 4;
     dlsch->max_ldpc_iterations = max_ldpc_iterations;
- 
+
     for (i=0; i<Mdlharq; i++) {
       dlsch->harq_processes[i] = (NR_DL_UE_HARQ_t *)malloc16(sizeof(NR_DL_UE_HARQ_t));
 
       if (dlsch->harq_processes[i]) {
         memset(dlsch->harq_processes[i],0,sizeof(NR_DL_UE_HARQ_t));
         init_downlink_harq_status(dlsch->harq_processes[i]);
-        dlsch->harq_processes[i]->first_tx=1;
-        dlsch->harq_processes[i]->b = (uint8_t*)malloc16(dlsch_bytes);
+        dlsch->harq_processes[i]->first_rx=1;
+        dlsch->harq_processes[i]->b = (uint8_t *)malloc16(dlsch_bytes);
 
         if (dlsch->harq_processes[i]->b)
           memset(dlsch->harq_processes[i]->b,0,dlsch_bytes);
@@ -170,23 +164,23 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
           exit_flag=3;
 
         if (abstraction_flag == 0) {
-          for (r=0; r<a_segments; r++) { 
+          for (r=0; r<a_segments; r++) {
             dlsch->harq_processes[i]->p_nrLDPC_procBuf[r] = nrLDPC_init_mem();
-            dlsch->harq_processes[i]->c[r] = (uint8_t*)malloc16(1056);
+            dlsch->harq_processes[i]->c[r] = (uint8_t *)malloc16(1056);
 
             if (dlsch->harq_processes[i]->c[r])
               memset(dlsch->harq_processes[i]->c[r],0,1056);
             else
               exit_flag=2;
 
-            dlsch->harq_processes[i]->d[r] = (short*)malloc16((5*8448)*sizeof(short));
+            dlsch->harq_processes[i]->d[r] = (short *)malloc16((5*8448)*sizeof(short));
 
             if (dlsch->harq_processes[i]->d[r])
               memset(dlsch->harq_processes[i]->d[r],0,(5*8448)*sizeof(short));
             else
               exit_flag=2;
 
-            dlsch->harq_processes[i]->w[r] = (short*)malloc16((5*8448)*sizeof(short));
+            dlsch->harq_processes[i]->w[r] = (short *)malloc16((5*8448)*sizeof(short));
 
             if (dlsch->harq_processes[i]->w[r])
               memset(dlsch->harq_processes[i]->w[r],0,(5*8448)*sizeof(short));
@@ -205,19 +199,16 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
 
   LOG_D(PHY,"new_ue_dlsch with size %zu: exit_flag = %u\n",sizeof(NR_DL_UE_HARQ_t), exit_flag);
   free_nr_ue_dlsch(&dlsch,N_RB_DL);
-
   return(NULL);
 }
 
-void nr_dlsch_unscrambling(int16_t* llr,
-                         uint32_t size,
-                         uint8_t q,
-                         uint32_t Nid,
-                         uint32_t n_RNTI) {
-
+void nr_dlsch_unscrambling(int16_t *llr,
+                           uint32_t size,
+                           uint8_t q,
+                           uint32_t Nid,
+                           uint32_t n_RNTI) {
   uint8_t reset;
   uint32_t x1, x2, s=0;
-
   reset = 1;
   x2 = (n_RNTI<<15) + (q<<14) + Nid;
 
@@ -226,10 +217,10 @@ void nr_dlsch_unscrambling(int16_t* llr,
       s = lte_gold_generic(&x1, &x2, reset);
       reset = 0;
     }
+
     if (((s>>(i&0x1f))&1)==1)
       llr[i] = -llr[i];
   }
-
 }
 
 uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
@@ -244,9 +235,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
                            uint8_t nr_slot_rx,
                            uint8_t harq_pid,
                            uint8_t is_crnti,
-                           uint8_t llr8_flag)
-{
-
+                           uint8_t llr8_flag) {
 #if UE_TIMING_TRACE
   time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats;
   time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats;
@@ -260,48 +249,43 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
   uint8_t crc_type;
   int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
   t_nrLDPC_dec_params decParams;
-  t_nrLDPC_dec_params* p_decParams = &decParams;
+  t_nrLDPC_dec_params *p_decParams = &decParams;
   t_nrLDPC_time_stats procTime = {0};
-  t_nrLDPC_time_stats* p_procTime =&procTime ;
-  
+  t_nrLDPC_time_stats *p_procTime =&procTime ;
+
   if (!harq_process) {
     LOG_E(PHY,"dlsch_decoding.c: NULL harq_process pointer\n");
     return(dlsch->max_ldpc_iterations + 1);
   }
-  t_nrLDPC_procBuf** p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf;
 
+  t_nrLDPC_procBuf **p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf;
   // HARQ stats
   phy_vars_ue->dl_stats[harq_process->round]++;
-    
   int16_t z [68*384];
   int8_t l [68*384];
   //__m128i l;
   //int16_t inv_d [68*384];
   uint8_t kc;
   uint8_t Ilbrm = 1;
-
   uint32_t Tbslbrm;// = 950984;
   uint16_t nb_rb;// = 30;
   double Coderate;// = 0.0;
-
   uint8_t dmrs_Type = harq_process->dmrsConfigType;
   AssertFatal(dmrs_Type == 0 || dmrs_Type == 1, "Illegal dmrs_type %d\n", dmrs_Type);
   uint8_t nb_re_dmrs;
+
   if (dmrs_Type==NFAPI_NR_DMRS_TYPE1) {
     nb_re_dmrs = 6*harq_process->n_dmrs_cdm_groups;
-  }
-  else {
+  } else {
     nb_re_dmrs = 4*harq_process->n_dmrs_cdm_groups;
   }
-  uint16_t dmrs_length = get_num_dmrs(harq_process->dlDmrsSymbPos);
 
+  uint16_t dmrs_length = get_num_dmrs(harq_process->dlDmrsSymbPos);
   uint32_t i,j;
+  __m128i *pv = (__m128i *)&z;
+  __m128i *pl = (__m128i *)&l;
+  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_IN);
 
-  __m128i *pv = (__m128i*)&z;
-  __m128i *pl = (__m128i*)&l;
-  
-    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_IN);
-  
   //NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[0];
 
   if (!dlsch_llr) {
@@ -318,84 +302,70 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
     printf("dlsch_decoding.c: Illegal slot index %d\n",nr_slot_rx);
     return(dlsch->max_ldpc_iterations + 1);
   }*/
-
   /*if (harq_process->harq_ack.ack != 2) {
     LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n",
         phy_vars_ue->Mod_id, nr_slot_rx, harq_process->harq_ack.ack);
   }*/
-
   //  nb_rb = dlsch->nb_rb;
-
   /*
   if (nb_rb > frame_parms->N_RB_DL) {
     printf("dlsch_decoding.c: Illegal nb_rb %d\n",nb_rb);
     return(max_ldpc_iterations + 1);
     }*/
-
   /*harq_pid = dlsch->current_harq_pid[proc->thread_id];
   if (harq_pid >= 8) {
     printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
     return(max_ldpc_iterations + 1);
   }
   */
-
   nb_rb = harq_process->nb_rb;
-
   harq_process->trials[harq_process->round]++;
-
   uint16_t nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
-
   harq_process->TBS = nr_compute_tbs(harq_process->Qm,harq_process->R,nb_rb,nb_symb_sch,nb_re_dmrs*dmrs_length, nb_rb_oh, 0, harq_process->Nl);
-
   A = harq_process->TBS;
   ret = dlsch->max_ldpc_iterations + 1;
   dlsch->last_iteration_cnt = ret;
- 
   harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, dmrs_length, harq_process->Qm,harq_process->Nl);
   G = harq_process->G;
 
-  LOG_D(PHY,"DLSCH Decoding, harq_pid %d TBS %d (%d) G %d nb_re_dmrs %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,A/8,G, nb_re_dmrs,harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb);
+  LOG_D(PHY,"DLSCH Decoding, harq_pid %d TBS %d (%d) G %d nb_re_dmrs %d length dmrs %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",
+        harq_pid,A,A/8,G, nb_re_dmrs, dmrs_length, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb);
 
   if ((harq_process->R)<1024)
     Coderate = (float) (harq_process->R) /(float) 1024;
   else
     Coderate = (float) (harq_process->R) /(float) 2048;
 
-  if ((A <=292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25)
-  {
+  if ((A <=292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25) {
     p_decParams->BG = 2;
     kc = 52;
-    if (Coderate < 0.3333){
+
+    if (Coderate < 0.3333) {
       p_decParams->R = 15;
-    }
-    else if (Coderate <0.6667){
+    } else if (Coderate <0.6667) {
       p_decParams->R = 13;
-    }
-    else {
+    } else {
       p_decParams->R = 23;
     }
-  }
-  else{
+  } else {
     p_decParams->BG = 1;
     kc = 68;
-    if (Coderate < 0.6667){
+
+    if (Coderate < 0.6667) {
       p_decParams->R = 13;
-    }
-    else if (Coderate <0.8889){
+    } else if (Coderate <0.8889) {
       p_decParams->R = 23;
-    }
-    else {
+    } else {
       p_decParams->R = 89;
     }
   }
 
-
-  if (harq_process->round == 0) {
-  // This is a new packet, so compute quantities regarding segmentation
-  if (A > NR_MAX_PDSCH_TBS)
-	  harq_process->B = A+24;
-	else
-	  harq_process->B = A+16;
+  if (harq_process->first_rx == 1) {
+    // This is a new packet, so compute quantities regarding segmentation
+    if (A > NR_MAX_PDSCH_TBS)
+      harq_process->B = A+24;
+    else
+      harq_process->B = A+16;
 
     nr_segmentation(NULL,
                     NULL,
@@ -406,29 +376,24 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
                     &harq_process->F,
                     p_decParams->BG);
 
-  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD) && (!frame%100))
-       LOG_I(PHY,"K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, p_decParams->Z, harq_process->Nl);
+    if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD) && (!frame%100))
+      LOG_I(PHY,"K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, p_decParams->Z, harq_process->Nl);
   }
-  
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
 
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
   p_decParams->Z = harq_process->Z;
   //printf("dlsch decoding nr segmentation Z %d\n", p_decParams->Z);
-
   //printf("coderate %f kc %d \n", Coderate, kc);
-
   p_decParams->numMaxIter = dlsch->max_ldpc_iterations;
   p_decParams->outMode= 0;
-
   err_flag = 0;
   r_offset = 0;
-
   uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS;  //number of segments to be allocated
 
   if (nb_rb != 273) {
     a_segments = a_segments*nb_rb;
     a_segments = a_segments/273 +1;
-  }  
+  }
 
   if (harq_process->C > a_segments) {
     LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,a_segments);
@@ -438,41 +403,29 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
   if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
     LOG_I(PHY,"Segmentation: C %d, K %d\n",harq_process->C,harq_process->K);
 
-
   opp_enabled=1;
-
   Kr = harq_process->K; // [hna] overwrites this line "Kr = p_decParams->Z*kb"
   Kr_bytes = Kr>>3;
   K_bits_F = Kr-harq_process->F;
 
   for (r=0; r<harq_process->C; r++) {
-
     //printf("start rx segment %d\n",r);
     E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
-
 #if UE_TIMING_TRACE
     start_meas(dlsch_deinterleaving_stats);
 #endif
-
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_IN);
-
-
     nr_deinterleaving_ldpc(E,
                            harq_process->Qm,
                            harq_process->w[r], // [hna] w is e
                            dlsch_llr+r_offset);
-
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_OUT);
-
-
 #if UE_TIMING_TRACE
     stop_meas(dlsch_deinterleaving_stats);
 #endif
-
 #if UE_TIMING_TRACE
     start_meas(dlsch_rate_unmatching_stats);
 #endif
-
     LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,E %d, F %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
           harq_pid,r, G,E,harq_process->F,
           Kr*3,
@@ -482,8 +435,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
           harq_process->Nl,
           harq_process->rvidx,
           harq_process->round);
-
-
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_IN);
 
     if ((harq_process->Nl)<4)
@@ -491,7 +442,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
     else
       Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,4);
 
-
     if (nr_rate_matching_ldpc_rx(Ilbrm,
                                  Tbslbrm,
                                  p_decParams->BG,
@@ -500,18 +450,17 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
                                  harq_process->w[r],
                                  harq_process->C,
                                  harq_process->rvidx,
-                                 (harq_process->round==0)?1:0,
+                                 (harq_process->first_rx==1)?1:0,
                                  E,
                                  harq_process->F,
                                  Kr-harq_process->F-2*(p_decParams->Z))==-1) {
-    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_OUT);
+      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_OUT);
 #if UE_TIMING_TRACE
       stop_meas(dlsch_rate_unmatching_stats);
 #endif
       LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
       return(dlsch->max_ldpc_iterations + 1);
     } else {
-
 #if UE_TIMING_TRACE
       stop_meas(dlsch_rate_unmatching_stats);
 #endif
@@ -519,38 +468,33 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
 
     r_offset += E;
 
-  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
-  {
-    LOG_I(PHY,"decoder input(segment %u) :",r);
-    for (int i=0;i<E;i++)
-     LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
-    LOG_D(PHY,"\n");
-  }
+    if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
+      LOG_I(PHY,"decoder input(segment %u) :",r);
 
-    memset(harq_process->c[r],0,Kr_bytes);
+      for (int i=0; i<E; i++)
+        LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
 
+      LOG_D(PHY,"\n");
+    }
+
+    memset(harq_process->c[r],0,Kr_bytes);
 
-    if (harq_process->C == 1){
+    if (harq_process->C == 1) {
       if (A > NR_MAX_PDSCH_TBS)
-    		crc_type = CRC24_A;
-    	else
-    		crc_type = CRC16;
-    	
-	length_dec = harq_process->B;
+        crc_type = CRC24_A;
+      else
+        crc_type = CRC16;
 
-    }
-    else{
+      length_dec = harq_process->B;
+    } else {
       crc_type = CRC24_B;
       length_dec = (harq_process->B+24*harq_process->C)/harq_process->C;
     }
 
     if (err_flag == 0) {
-
 #if UE_TIMING_TRACE
       start_meas(dlsch_turbo_decoding_stats);
 #endif
-
-
       //set first 2*Z_c bits to zeros
       memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
       //set Filler bits
@@ -559,61 +503,56 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
       memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
       //skip filler bits
       memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
+
       //Saturate coded bits before decoding into 8 bits values
-      for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1;  i+=2, j++)
-      {
+      for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1;  i+=2, j++) {
         pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
       }
 
-
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_IN);
-
       no_iteration_ldpc = nrLDPC_decoder(p_decParams,
-                           (int8_t*)&pl[0],
-                           llrProcBuf,
-                           p_nrLDPC_procBuf[r],
-                           p_procTime);
+                                         (int8_t *)&pl[0],
+                                         llrProcBuf,
+                                         p_nrLDPC_procBuf[r],
+                                         p_procTime);
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_OUT);
 
       // Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
-      if (check_crc((uint8_t*)llrProcBuf,length_dec,harq_process->F,crc_type)) {
+      if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) {
         LOG_D(PHY,"Segment %u CRC OK\n\033[0m",r);
+
         if (r==0) {
-          for (int i=0;i<10;i++) LOG_D(PHY,"byte %d : %x\n",i,((uint8_t*)llrProcBuf)[i]);
+          for (int i=0; i<10; i++) LOG_D(PHY,"byte %d : %x\n",i,((uint8_t *)llrProcBuf)[i]);
         }
 
         //Temporary hack
         no_iteration_ldpc = dlsch->max_ldpc_iterations;
         ret = no_iteration_ldpc;
-      }
-      else {
+      } else {
         LOG_D(PHY,"CRC NOT OK\n\033[0m");
       }
 
-
       nb_total_decod++;
-      if (no_iteration_ldpc > dlsch->max_ldpc_iterations){
+
+      if (no_iteration_ldpc > dlsch->max_ldpc_iterations) {
         nb_error_decod++;
       }
 
-      for (int m=0; m < Kr>>3; m ++)
-      {
+      for (int m=0; m < Kr>>3; m ++) {
         harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
       }
 
-      if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
-      	{
-        for (int k=0;k<A>>3;k++)
+      if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
+        for (int k=0; k<A>>3; k++)
           LOG_D(PHY,"output decoder [%d] =  0x%02x \n", k, harq_process->c[r][k]);
-        LOG_D(PHY,"no_iterations_ldpc %d (ret %u)\n",no_iteration_ldpc,ret);
-        }
 
+        LOG_D(PHY,"no_iterations_ldpc %d (ret %u)\n",no_iteration_ldpc,ret);
+      }
 
 #if UE_TIMING_TRACE
       stop_meas(dlsch_turbo_decoding_stats);
 #endif
     }
-    
 
     if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
       LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
@@ -623,11 +562,8 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
 
   if (err_flag == 1) {
     LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
-        phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
-
-    harq_process->harq_ack.ack = 0;
-    harq_process->harq_ack.harq_id = harq_pid;
-    harq_process->harq_ack.send_harq_status = 1;
+          phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
+    harq_process->ack = 0;
     harq_process->errors[harq_process->round]++;
 
     if (harq_process->round >= dlsch->Mlimit) {
@@ -636,72 +572,62 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
       phy_vars_ue->dl_stats[4]++;
     }
 
-    if(is_crnti)
-    {
-    LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
-               phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS);
+    if(is_crnti) {
+      LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
+            phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS);
     }
 
     return((1 + dlsch->max_ldpc_iterations));
   } else {
-
     LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n",
-	  phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round);
-
+          phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round);
     harq_process->status = SCH_IDLE;
     harq_process->round  = 0;
-    harq_process->harq_ack.ack = 1;
-    harq_process->harq_ack.harq_id = harq_pid;
-    harq_process->harq_ack.send_harq_status = 1;
-    
+    harq_process->ack = 1;
+
     //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n",
-      //  phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs);
+    //  phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs);
 
-    if(is_crnti)
-    {
-    LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round,harq_process->TBS);
+    if(is_crnti) {
+      LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round,harq_process->TBS);
     }
-    //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
 
+    //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
   }
 
   // Reassembly of Transport block here
   offset = 0;
   Kr = harq_process->K;
   Kr_bytes = Kr>>3;
-
-
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_COMBINE_SEG, VCD_FUNCTION_IN);
 
   for (r=0; r<harq_process->C; r++) {
-
     memcpy(harq_process->b+offset,
-	   harq_process->c[r],
-	   Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
+           harq_process->c[r],
+           Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
     offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
 
-    if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
-      {
+    if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
       LOG_D(PHY,"Segment %u : Kr= %u bytes\n",r,Kr_bytes);
       LOG_D(PHY,"copied %d bytes to b sequence (harq_pid %d)\n",
-             (Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid);
+            (Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid);
       LOG_D(PHY,"b[0] = %p,c[%d] = %p\n",
-              (void *)(uint64_t)(harq_process->b[offset]),
-              harq_process->F>>3,
-              (void *)(uint64_t)(harq_process->c[r]) );
-      if (frame%100 == 0){
-          LOG_D (PHY, "Printing 60 first payload bytes at frame: %d ", frame);
-          for (int i = 0; i <60 ; i++){ //Kr_bytes
-            LOG_D(PHY, "[%d] : %x ", i, harq_process->b[i]);
-          }
+            (void *)(uint64_t)(harq_process->b[offset]),
+            harq_process->F>>3,
+            (void *)(uint64_t)(harq_process->c[r]) );
+
+      if (frame%100 == 0) {
+        LOG_D (PHY, "Printing 60 first payload bytes at frame: %d ", frame);
+
+        for (int i = 0; i <60 ; i++) { //Kr_bytes
+          LOG_D(PHY, "[%d] : %x ", i, harq_process->b[i]);
         }
       }
+    }
   }
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_COMBINE_SEG, VCD_FUNCTION_OUT);
-
   dlsch->last_iteration_cnt = ret;
-
   return(ret);
 }
 
@@ -718,9 +644,7 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
                                     uint8_t nr_slot_rx,
                                     uint8_t harq_pid,
                                     uint8_t is_crnti,
-                                    uint8_t llr8_flag)
-{
-
+                                    uint8_t llr8_flag) {
 #if UE_TIMING_TRACE
   time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats;
   time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats;
@@ -738,15 +662,17 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
   uint8_t r_thread;
   uint32_t Er, Gp,GpmodC;*/
   t_nrLDPC_dec_params decParams;
-  t_nrLDPC_dec_params* p_decParams = &decParams;
+  t_nrLDPC_dec_params *p_decParams = &decParams;
   t_nrLDPC_time_stats procTime;
-  t_nrLDPC_time_stats* p_procTime =&procTime ;
+  t_nrLDPC_time_stats *p_procTime =&procTime ;
   int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
-    if (!harq_process) {
+
+  if (!harq_process) {
     LOG_E(PHY,"dlsch_decoding.c: NULL harq_process pointer\n");
     return(dlsch->max_ldpc_iterations);
   }
-  t_nrLDPC_procBuf* p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf[0];
+
+  t_nrLDPC_procBuf *p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf[0];
   uint8_t Nl=4;
   int16_t z [68*384];
   int8_t l [68*384];
@@ -756,22 +682,19 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
   uint16_t nb_rb = 30;
   double Coderate = 0.0;
   uint8_t dmrs_type = harq_process->dmrsConfigType;
-
   uint8_t nb_re_dmrs;
+
   if (dmrs_type == NFAPI_NR_DMRS_TYPE1)
     nb_re_dmrs = 6*harq_process->n_dmrs_cdm_groups;
   else
     nb_re_dmrs = 4*harq_process->n_dmrs_cdm_groups;
 
-  uint16_t length_dmrs = get_num_dmrs(harq_process->dlDmrsSymbPos); 
-  
+  uint16_t length_dmrs = get_num_dmrs(harq_process->dlDmrsSymbPos);
   uint32_t i,j;
-
-  __m128i *pv = (__m128i*)&z;
-  __m128i *pl = (__m128i*)&l;
+  __m128i *pv = (__m128i *)&z;
+  __m128i *pl = (__m128i *)&l;
   notifiedFIFO_t nf;
   initNotifiedFIFO(&nf);
-
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_IN);
 
   if (!dlsch_llr) {
@@ -779,217 +702,188 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
     return(dlsch->max_ldpc_iterations);
   }
 
-
-
   if (!frame_parms) {
     LOG_E(PHY,"dlsch_decoding.c: NULL frame_parms pointer\n");
     return(dlsch->max_ldpc_iterations);
   }
 
- /* if (nr_slot_rx> (frame_parms->slots_per_frame-1)) {
-    printf("dlsch_decoding.c: Illegal slot index %d\n",nr_slot_rx);
-    return(dlsch->max_ldpc_iterations);
-  }
-
-  if (dlsch->harq_ack[nr_slot_rx].ack != 2) {
-    LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n",
-        phy_vars_ue->Mod_id, nr_slot_rx, dlsch->harq_ack[nr_slot_rx].ack);
-  }*/
+  /* if (nr_slot_rx> (frame_parms->slots_per_frame-1)) {
+     printf("dlsch_decoding.c: Illegal slot index %d\n",nr_slot_rx);
+     return(dlsch->max_ldpc_iterations);
+   }
 
+   if (dlsch->harq_ack[nr_slot_rx].ack != 2) {
+     LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n",
+         phy_vars_ue->Mod_id, nr_slot_rx, dlsch->harq_ack[nr_slot_rx].ack);
+   }*/
   /*
   if (nb_rb > frame_parms->N_RB_DL) {
     printf("dlsch_decoding.c: Illegal nb_rb %d\n",nb_rb);
     return(max_ldpc_iterations);
     }*/
-
   /*harq_pid = dlsch->current_harq_pid[proc->thread_id];
   if (harq_pid >= 8) {
     printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
     return(max_ldpc_iterations);
   }
   */
-
   nb_rb = harq_process->nb_rb;
   harq_process->trials[harq_process->round]++;
-
   // HARQ stats
   phy_vars_ue->dl_stats[harq_process->round]++;
-
   uint16_t nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
-
   harq_process->TBS = nr_compute_tbs(harq_process->Qm,harq_process->R,nb_rb,nb_symb_sch,nb_re_dmrs*length_dmrs, nb_rb_oh, 0, harq_process->Nl);
-
   A = harq_process->TBS;
-
   ret = dlsch->max_ldpc_iterations + 1;
   dlsch->last_iteration_cnt = ret;
-
   harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl);
-
   G = harq_process->G;
-
-  LOG_D(PHY,"DLSCH Decoding main, harq_pid %d TBS %d G %d, nb_re_dmrs %d, length_dmrs %d  mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, nb_re_dmrs, length_dmrs, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb);
-
+  LOG_D(PHY,"DLSCH Decoding main, harq_pid %d TBS %d G %d, nb_re_dmrs %d, length_dmrs %d  mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, nb_re_dmrs, length_dmrs, harq_process->mcs,
+        harq_process->Nl, nb_symb_sch,nb_rb);
   proc->decoder_main_available = 1;
   proc->decoder_thread_available = 0;
   proc->decoder_thread_available1 = 0;
 
-
   if ((harq_process->R)<1024)
     Coderate = (float) (harq_process->R) /(float) 1024;
   else
     Coderate = (float) (harq_process->R) /(float) 2048;
 
-  if ((A <= 292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25)
-  {
+  if ((A <= 292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25) {
     p_decParams->BG = 2;
     kc = 52;
-    if (Coderate < 0.3333){
+
+    if (Coderate < 0.3333) {
       p_decParams->R = 15;
-    }
-    else if (Coderate <0.6667){
+    } else if (Coderate <0.6667) {
       p_decParams->R = 13;
-    }
-    else {
+    } else {
       p_decParams->R = 23;
     }
-  }
-  else{
+  } else {
     p_decParams->BG = 1;
     kc = 68;
-    if (Coderate < 0.6667){
+
+    if (Coderate < 0.6667) {
       p_decParams->R = 13;
-    }
-    else if (Coderate <0.8889){
+    } else if (Coderate <0.8889) {
       p_decParams->R = 23;
-    }
-    else {
+    } else {
       p_decParams->R = 89;
     }
   }
 
-  if (harq_process->round == 0) {
-      // This is a new packet, so compute quantities regarding segmentation
+  if (harq_process->first_rx == 1) {
+    // This is a new packet, so compute quantities regarding segmentation
     if (A > NR_MAX_PDSCH_TBS)
-	  	  harq_process->B = A+24;
-	  else
-	  	  harq_process->B = A+16;
-
-      nr_segmentation(NULL,
-                      NULL,
-                      harq_process->B,
-                      &harq_process->C,
-                      &harq_process->K,
-                      &harq_process->Z,
-                      &harq_process->F,
-                      p_decParams->BG);
-
+      harq_process->B = A+24;
+    else
+      harq_process->B = A+16;
 
-    }
-    
-    p_decParams->Z = harq_process->Z;
+    nr_segmentation(NULL,
+                    NULL,
+                    harq_process->B,
+                    &harq_process->C,
+                    &harq_process->K,
+                    &harq_process->Z,
+                    &harq_process->F,
+                    p_decParams->BG);
+  }
 
+  p_decParams->Z = harq_process->Z;
   p_decParams->numMaxIter = dlsch->max_ldpc_iterations;
   p_decParams->outMode= 0;
-
   err_flag = 0;
   r_offset = 0;
-
   uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS;  //number of segments to be allocated
 
   if (nb_rb != 273) {
     a_segments = a_segments*nb_rb;
     a_segments = a_segments/273 +1;
-  }  
+  }
 
   if (harq_process->C > a_segments) {
     LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,a_segments);
     return((1+dlsch->max_ldpc_iterations));
   }
+
   if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
     LOG_D(PHY,"Segmentation: C %d, K %d\n",harq_process->C,harq_process->K);
 
-
   notifiedFIFO_elt_t *res_dl;
   opp_enabled=1;
-  if (harq_process->C>1) {
-	for (int nb_seg =1 ; nb_seg<harq_process->C; nb_seg++){
-	  if ( (res_dl=tryPullTpool(&nf, &pool_dl)) != NULL ) {
-	          pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,res_dl);
-	        }
-
-	  AssertFatal((msgToPush_dl=pullNotifiedFIFO_nothreadSafe(&freeBlocks_dl)) != NULL,"chained list failure");
-          nr_rxtx_thread_data_t *curMsg=(nr_rxtx_thread_data_t *)NotifiedFifoData(msgToPush_dl);
-	  curMsg->UE=phy_vars_ue;
-	  
-	  nbDlProcessing++;
 
+  if (harq_process->C>1) {
+    for (int nb_seg =1 ; nb_seg<harq_process->C; nb_seg++) {
+      if ( (res_dl=tryPullTpool(&nf, &pool_dl)) != NULL ) {
+        pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,res_dl);
+      }
 
-	  memset(&curMsg->proc, 0, sizeof(curMsg->proc));
-	  curMsg->proc.frame_rx   = proc->frame_rx;
-	  curMsg->proc.nr_slot_rx = proc->nr_slot_rx;
-	  curMsg->proc.thread_id  = proc->thread_id;
-	  curMsg->proc.num_seg    = nb_seg;
-
-	  curMsg->proc.eNB_id= eNB_id;
-	  curMsg->proc.harq_pid=harq_pid;
-	  curMsg->proc.llr8_flag = llr8_flag;
-
-	  msgToPush_dl->key= (nr_slot_rx%2) ? (nb_seg+30): nb_seg;
-	  pushTpool(&pool_dl, msgToPush_dl);
-
-  /*Qm= harq_process->Qm;
-    Nl=harq_process->Nl;
-    r_thread = harq_process->C/2-1;
-    C= harq_process->C;
-
-    Gp = G/Nl/Qm;
-    GpmodC = Gp%C;
-
+      AssertFatal((msgToPush_dl=pullNotifiedFIFO_nothreadSafe(&freeBlocks_dl)) != NULL,"chained list failure");
+      nr_rxtx_thread_data_t *curMsg=(nr_rxtx_thread_data_t *)NotifiedFifoData(msgToPush_dl);
+      curMsg->UE=phy_vars_ue;
+      nbDlProcessing++;
+      memset(&curMsg->proc, 0, sizeof(curMsg->proc));
+      curMsg->proc.frame_rx   = proc->frame_rx;
+      curMsg->proc.nr_slot_rx = proc->nr_slot_rx;
+      curMsg->proc.thread_id  = proc->thread_id;
+      curMsg->proc.num_seg    = nb_seg;
+      curMsg->proc.eNB_id= eNB_id;
+      curMsg->proc.harq_pid=harq_pid;
+      curMsg->proc.llr8_flag = llr8_flag;
+      msgToPush_dl->key= (nr_slot_rx%2) ? (nb_seg+30): nb_seg;
+      pushTpool(&pool_dl, msgToPush_dl);
+      /*Qm= harq_process->Qm;
+        Nl=harq_process->Nl;
+        r_thread = harq_process->C/2-1;
+        C= harq_process->C;
+
+        Gp = G/Nl/Qm;
+        GpmodC = Gp%C;
+
+
+        if (r_thread < (C-(GpmodC)))
+          Er = Nl*Qm * (Gp/C);
+        else
+          Er = Nl*Qm * ((GpmodC==0?0:1) + (Gp/C));
+        printf("mthread Er %d\n", Er);
 
-    if (r_thread < (C-(GpmodC)))
-      Er = Nl*Qm * (Gp/C);
-    else
-      Er = Nl*Qm * ((GpmodC==0?0:1) + (Gp/C));
-    printf("mthread Er %d\n", Er);
+        printf("mthread instance_cnt_dlsch_td %d\n",  proc->instance_cnt_dlsch_td);*/
+    }
 
-    printf("mthread instance_cnt_dlsch_td %d\n",  proc->instance_cnt_dlsch_td);*/
-	  }
-  //proc->decoder_main_available = 1;
+    //proc->decoder_main_available = 1;
   }
 
-    r = 0;  
-    if (r==0) r_offset =0;
+  r = 0;
 
-    Kr = harq_process->K;
-    Kr_bytes = Kr>>3;
-    K_bits_F = Kr-harq_process->F;
+  if (r==0) r_offset =0;
 
-    E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
-
-    /*
-    printf("Subblock deinterleaving, dlsch_llr %p, w %p\n",
-     dlsch_llr+r_offset,
-     &harq_process->w[r]);
-    */
+  Kr = harq_process->K;
+  Kr_bytes = Kr>>3;
+  K_bits_F = Kr-harq_process->F;
+  E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
+  /*
+  printf("Subblock deinterleaving, dlsch_llr %p, w %p\n",
+   dlsch_llr+r_offset,
+   &harq_process->w[r]);
+  */
 #if UE_TIMING_TRACE
-    start_meas(dlsch_deinterleaving_stats);
+  start_meas(dlsch_deinterleaving_stats);
 #endif
-    nr_deinterleaving_ldpc(E,
-                           harq_process->Qm,
-                           harq_process->w[r],
-                           dlsch_llr+r_offset);
+  nr_deinterleaving_ldpc(E,
+                         harq_process->Qm,
+                         harq_process->w[r],
+                         dlsch_llr+r_offset);
 
-    if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
-        for (int i =0; i<16; i++)
-              LOG_D(PHY,"rx output deinterleaving w[%d]= %d r_offset %u\n", i,harq_process->w[r][i], r_offset);
+  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
+    for (int i =0; i<16; i++)
+      LOG_D(PHY,"rx output deinterleaving w[%d]= %d r_offset %u\n", i,harq_process->w[r][i], r_offset);
 
 #if UE_TIMING_TRACE
-    stop_meas(dlsch_deinterleaving_stats);
+  stop_meas(dlsch_deinterleaving_stats);
 #endif
-
 #if UE_TIMING_TRACE
-    start_meas(dlsch_rate_unmatching_stats);
+  start_meas(dlsch_rate_unmatching_stats);
 #endif
 
   if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
@@ -1002,136 +896,126 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
           harq_process->Nl,
           harq_process->rvidx,
           harq_process->round);
- 
-
-    // for tbslbrm calculation according to 5.4.2.1 of 38.212
-    if (harq_process->Nl < Nl)
-      Nl = harq_process->Nl;
-
-    Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,harq_process->Nl);
 
-    if (nr_rate_matching_ldpc_rx(Ilbrm,
-                                 Tbslbrm,
-                                 p_decParams->BG,
-                                 p_decParams->Z,
-                                 harq_process->d[r],
-                                 harq_process->w[r],
-                                 harq_process->C,
-                                 harq_process->rvidx,
-                                 (harq_process->round==0)?1:0,
-                                 E,
-				 harq_process->F,
-				 Kr-harq_process->F-2*(p_decParams->Z))==-1) {
+  // for tbslbrm calculation according to 5.4.2.1 of 38.212
+  if (harq_process->Nl < Nl)
+    Nl = harq_process->Nl;
+
+  Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,harq_process->Nl);
+
+  if (nr_rate_matching_ldpc_rx(Ilbrm,
+                               Tbslbrm,
+                               p_decParams->BG,
+                               p_decParams->Z,
+                               harq_process->d[r],
+                               harq_process->w[r],
+                               harq_process->C,
+                               harq_process->rvidx,
+                               (harq_process->first_rx==1)?1:0,
+                               E,
+                               harq_process->F,
+                               Kr-harq_process->F-2*(p_decParams->Z))==-1) {
 #if UE_TIMING_TRACE
-      stop_meas(dlsch_rate_unmatching_stats);
+    stop_meas(dlsch_rate_unmatching_stats);
 #endif
-      LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
-      return(dlsch->max_ldpc_iterations);
-    } else
-    {
+    LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
+    return(dlsch->max_ldpc_iterations);
+  } else {
 #if UE_TIMING_TRACE
-      stop_meas(dlsch_rate_unmatching_stats);
+    stop_meas(dlsch_rate_unmatching_stats);
 #endif
-    }
+  }
 
- 
-  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))   
+  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
     for (int i =0; i<16; i++)
       LOG_I(PHY,"rx output ratematching d[%d]= %d r_offset %u\n", i,harq_process->d[r][i], r_offset);
 
-
-  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) 
-    {
-
+  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
     if (r==0) {
       LOG_M("decoder_llr.m","decllr",dlsch_llr,G,1,0);
       LOG_M("decoder_in.m","dec",&harq_process->d[0][96],(3*8*Kr_bytes)+12,1,0);
     }
 
     LOG_D(PHY,"decoder input(segment %u) :",r);
-    for (int i=0;i<(3*8*Kr_bytes);i++)
+
+    for (int i=0; i<(3*8*Kr_bytes); i++)
       LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
+
     LOG_D(PHY,"\n");
-   }
+  }
 
-    memset(harq_process->c[r],0,Kr_bytes);
+  memset(harq_process->c[r],0,Kr_bytes);
 
-    if (harq_process->C == 1){
-      if (A > NR_MAX_PDSCH_TBS)
-    	crc_type = CRC24_A;
-      else
-    	crc_type = CRC16;
-
-      length_dec = harq_process->B;
-    }
-    else{
-      crc_type = CRC24_B;
-      length_dec = (harq_process->B+24*harq_process->C)/harq_process->C;
-    }
+  if (harq_process->C == 1) {
+    if (A > NR_MAX_PDSCH_TBS)
+      crc_type = CRC24_A;
+    else
+      crc_type = CRC16;
 
-    //#ifndef __AVX2__
+    length_dec = harq_process->B;
+  } else {
+    crc_type = CRC24_B;
+    length_dec = (harq_process->B+24*harq_process->C)/harq_process->C;
+  }
 
-    if (err_flag == 0) {
-/*
-        LOG_D(PHY, "LDPC algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n",
-                            Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS,
-                            harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_ldpc_iterations);
-*/
+  //#ifndef __AVX2__
 
+  if (err_flag == 0) {
+    /*
+            LOG_D(PHY, "LDPC algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n",
+                                Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS,
+                                harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_ldpc_iterations);
+    */
 #if UE_TIMING_TRACE
-      start_meas(dlsch_turbo_decoding_stats);
+    start_meas(dlsch_turbo_decoding_stats);
 #endif
-      LOG_D(PHY,"mthread AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
-
-      /*for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){
-        inv_d[cnt] = (1)*harq_process->d[r][cnt];
-      }*/
-
-      //set first 2*Z_c bits to zeros
-      memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
-      //set Filler bits
-      memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
-      //Move coded bits before filler bits
-      memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
-      //skip filler bits
-      memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
-      //Saturate coded bits before decoding into 8 bits values
-      for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1;  i+=2, j++)
-      {
-        pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
-      }
+    LOG_D(PHY,"mthread AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
+    /*for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){
+      inv_d[cnt] = (1)*harq_process->d[r][cnt];
+    }*/
+    //set first 2*Z_c bits to zeros
+    memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
+    //set Filler bits
+    memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
+    //Move coded bits before filler bits
+    memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
+    //skip filler bits
+    memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
+
+    //Saturate coded bits before decoding into 8 bits values
+    for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1;  i+=2, j++) {
+      pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
+    }
 
-      no_iteration_ldpc = nrLDPC_decoder(p_decParams,
-               (int8_t*)&pl[0],
-               llrProcBuf,
-               p_nrLDPC_procBuf,
-               p_procTime);
+    no_iteration_ldpc = nrLDPC_decoder(p_decParams,
+                                       (int8_t *)&pl[0],
+                                       llrProcBuf,
+                                       p_nrLDPC_procBuf,
+                                       p_procTime);
+    nb_total_decod++;
 
-      nb_total_decod++;
-      if (no_iteration_ldpc > 10){
-        nb_error_decod++;
-        ret = 1+dlsch->max_ldpc_iterations;
-      }
-      else {
-        ret=2;
-      }
+    if (no_iteration_ldpc > 10) {
+      nb_error_decod++;
+      ret = 1+dlsch->max_ldpc_iterations;
+    } else {
+      ret=2;
+    }
 
-      if (check_crc((uint8_t*)llrProcBuf,length_dec,harq_process->F,crc_type)) {
-        LOG_D(PHY,"Segment %u CRC OK\n",r);
-        ret = 2;
-      }
-      else {
-        ret = 1+dlsch->max_ldpc_iterations;
-      }
+    if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) {
+      LOG_D(PHY,"Segment %u CRC OK\n",r);
+      ret = 2;
+    } else {
+      ret = 1+dlsch->max_ldpc_iterations;
+    }
 
-    if (!nb_total_decod%10000){
-        printf("Error number of iteration LPDC %d %ld/%ld \n", no_iteration_ldpc, nb_error_decod,nb_total_decod);fflush(stdout);
+    if (!nb_total_decod%10000) {
+      printf("Error number of iteration LPDC %d %ld/%ld \n", no_iteration_ldpc, nb_error_decod,nb_total_decod);
+      fflush(stdout);
     }
 
-      for (int m=0; m < Kr>>3; m ++)
-      {
-        harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
-      }
+    for (int m=0; m < Kr>>3; m ++) {
+      harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
+    }
 
     /*for (int u=0; u < Kr>>3; u ++)
       {
@@ -1149,30 +1033,27 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
     //printf("output channel decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]);
 
     //printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]);
-     if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
-       for (int k=0;k<32;k++)
-         LOG_D(PHY,"output decoder [%d] =  0x%02x \n", k, harq_process->c[r][k]);
-
+    if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
+      for (int k=0; k<32; k++)
+        LOG_D(PHY,"output decoder [%d] =  0x%02x \n", k, harq_process->c[r][k]);
 
 #if UE_TIMING_TRACE
-      stop_meas(dlsch_turbo_decoding_stats);
+    stop_meas(dlsch_turbo_decoding_stats);
 #endif
-    }
+  }
 
+  if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
+    LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
+    err_flag = 1;
+  }
 
-    if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
-      LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
-      err_flag = 1;
-    }
   //} //loop r
 
   if (err_flag == 1) {
     if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
       LOG_I(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
-        phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
-    harq_process->harq_ack.ack = 0;
-    harq_process->harq_ack.harq_id = harq_pid;
-    harq_process->harq_ack.send_harq_status = 1;
+            phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
+    harq_process->ack = 0;
     harq_process->errors[harq_process->round]++;
     harq_process->round++;
 
@@ -1180,130 +1061,112 @@ uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
       harq_process->status = SCH_IDLE;
       harq_process->round  = 0;
     }
-    if(is_crnti)
-    {
-    LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
-               phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mlimit,harq_process->TBS);
+
+    if(is_crnti) {
+      LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
+            phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mlimit,harq_process->TBS);
     }
 
     return((1+dlsch->max_ldpc_iterations));
   } else {
-   if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
+    if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
       LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d\n",
-           phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb);
+            phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb);
 
     harq_process->status = SCH_IDLE;
     harq_process->round  = 0;
-    harq_process->harq_ack.ack = 1;
-    harq_process->harq_ack.harq_id = harq_pid;
-    harq_process->harq_ack.send_harq_status = 1;
+    harq_process->ack = 1;
     //LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n",
-      //  phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs);
+    //  phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs);
 
-    if(is_crnti)
-    {
-    LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round,harq_process->TBS);
+    if(is_crnti) {
+      LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round,harq_process->TBS);
     }
-    //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
 
+    //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
   }
 
   // Reassembly of Transport block here
   offset = 0;
-
   /*
   printf("harq_pid %d\n",harq_pid);
   printf("F %d, Fbytes %d\n",harq_process->F,harq_process->F>>3);
   printf("C %d\n",harq_process->C);
   */
   //uint32_t wait = 0;
-  
   /* while((proc->decoder_thread_available == 0) )
   {
           usleep(1);
   }
   proc->decoder_thread_available == 0;*/
-
   /*notifiedFIFO_elt_t *res1=tryPullTpool(&nf, Tpool);
   if (!res1) {
-	  printf("mthread trypull null\n");
-	  usleep(1);
-	  wait++;
+    printf("mthread trypull null\n");
+    usleep(1);
+    wait++;
   }*/
-  
   //usleep(50);
-
   proc->decoder_main_available = 0;
   Kr = harq_process->K; //to check if same K in all segments
   Kr_bytes = Kr>>3;
-  
-  for (r=0; r<harq_process->C; r++) {
 
-      memcpy(harq_process->b+offset,
-               harq_process->c[r],
-               Kr_bytes- - (harq_process->F>>3) -((harq_process->C>1)?3:0));
-      offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
+  for (r=0; r<harq_process->C; r++) {
+    memcpy(harq_process->b+offset,
+           harq_process->c[r],
+           Kr_bytes- - (harq_process->F>>3) -((harq_process->C>1)?3:0));
+    offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
 
-  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
-    {
-    LOG_I(PHY,"Segment %u : Kr= %u bytes\n",r,Kr_bytes);
-    LOG_I(PHY,"copied %d bytes to b sequence (harq_pid %d)\n",
-              (Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid);
-     LOG_I(PHY,"b[0] = %p,c[%d] = %p\n",
-              (void *)(uint64_t)(harq_process->b[offset]),
-              harq_process->F>>3,
-               (void *)(uint64_t)(harq_process->c[r]));
+    if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
+      LOG_I(PHY,"Segment %u : Kr= %u bytes\n",r,Kr_bytes);
+      LOG_I(PHY,"copied %d bytes to b sequence (harq_pid %d)\n",
+            (Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid);
+      LOG_I(PHY,"b[0] = %p,c[%d] = %p\n",
+            (void *)(uint64_t)(harq_process->b[offset]),
+            harq_process->F>>3,
+            (void *)(uint64_t)(harq_process->c[r]));
     }
   }
-  
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
 
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
   dlsch->last_iteration_cnt = ret;
   //proc->decoder_thread_available = 0;
   //proc->decoder_main_available = 0;
-
   return(ret);
 }
 
 
 
-void nr_dlsch_decoding_process(void *arg)
-{
-	nr_rxtx_thread_data_t *rxtxD= (nr_rxtx_thread_data_t *)arg;
-    UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
-    PHY_VARS_NR_UE    *phy_vars_ue   = rxtxD->UE;
-    int llr8_flag1;
-    int32_t no_iteration_ldpc,length_dec;
-    t_nrLDPC_dec_params decParams;
-    t_nrLDPC_dec_params* p_decParams = &decParams;
-    t_nrLDPC_time_stats procTime;
-    t_nrLDPC_time_stats* p_procTime =&procTime ;
-    int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
-    t_nrLDPC_procBuf* p_nrLDPC_procBuf; 
-    int16_t z [68*384];
-    int8_t l [68*384];
-    //__m128i l;
-    //int16_t inv_d [68*384];
-    //int16_t *p_invd =&inv_d;
-    uint8_t  kc;
-    uint8_t Ilbrm = 1;
-    uint32_t Tbslbrm = 950984;
-    uint16_t nb_rb = 30; //to update
-    double Coderate = 0.0;
-    uint16_t nb_symb_sch = 12;
-    uint8_t nb_re_dmrs = 6;
-    uint16_t length_dmrs = 1;
-
-    uint32_t i,j;
-    __m128i *pv = (__m128i*)&z;
-    __m128i *pl = (__m128i*)&l;
-
-    proc->instance_cnt_dlsch_td=-1;
-    //proc->nr_slot_rx = proc->sub_frame_start * frame_parms->slots_per_subframe;
-
-    proc->decoder_thread_available = 1;
-    
-
+void nr_dlsch_decoding_process(void *arg) {
+  nr_rxtx_thread_data_t *rxtxD= (nr_rxtx_thread_data_t *)arg;
+  UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
+  PHY_VARS_NR_UE    *phy_vars_ue   = rxtxD->UE;
+  int llr8_flag1;
+  int32_t no_iteration_ldpc,length_dec;
+  t_nrLDPC_dec_params decParams;
+  t_nrLDPC_dec_params *p_decParams = &decParams;
+  t_nrLDPC_time_stats procTime;
+  t_nrLDPC_time_stats *p_procTime =&procTime ;
+  int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
+  t_nrLDPC_procBuf *p_nrLDPC_procBuf;
+  int16_t z [68*384];
+  int8_t l [68*384];
+  //__m128i l;
+  //int16_t inv_d [68*384];
+  //int16_t *p_invd =&inv_d;
+  uint8_t  kc;
+  uint8_t Ilbrm = 1;
+  uint32_t Tbslbrm = 950984;
+  uint16_t nb_rb = 30; //to update
+  double Coderate = 0.0;
+  uint16_t nb_symb_sch = 12;
+  uint8_t nb_re_dmrs = 6;
+  uint16_t length_dmrs = 1;
+  uint32_t i,j;
+  __m128i *pv = (__m128i *)&z;
+  __m128i *pl = (__m128i *)&l;
+  proc->instance_cnt_dlsch_td=-1;
+  //proc->nr_slot_rx = proc->sub_frame_start * frame_parms->slots_per_subframe;
+  proc->decoder_thread_available = 1;
 #if UE_TIMING_TRACE
   time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats;
   time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats;
@@ -1311,47 +1174,32 @@ void nr_dlsch_decoding_process(void *arg)
 #endif
   uint32_t A,E;
   uint32_t G;
-
   uint32_t ret;
   uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,K_bits_F;
-
   uint8_t crc_type;
   uint8_t C,Cprime;
   uint8_t Qm;
   uint8_t Nl;
   //uint32_t Er;
-
   int eNB_id                = proc->eNB_id;
   int harq_pid              = proc->harq_pid;
   llr8_flag1                = proc->llr8_flag;
   int frame                 = proc->frame_rx;
-  r               	    = proc->num_seg;
-
+  r                     = proc->num_seg;
   NR_UE_DLSCH_t *dlsch      = phy_vars_ue->dlsch[proc->thread_id][eNB_id][0];
   NR_DL_UE_HARQ_t *harq_process  = dlsch->harq_processes[harq_pid];
   short *dlsch_llr        = phy_vars_ue->pdsch_vars[proc->thread_id][eNB_id]->llr[0];
-
   p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf[r];
   nb_symb_sch = harq_process->nb_symbols;
   LOG_D(PHY,"dlsch decoding process frame %d slot %d segment %d r %u nb symb %d \n", frame, proc->nr_slot_rx, proc->num_seg, r, harq_process->nb_symbols);
-
-
   nb_rb = harq_process->nb_rb;
-
   harq_process->trials[harq_process->round]++;
-
   uint16_t nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
-
   harq_process->TBS = nr_compute_tbs(harq_process->Qm,harq_process->R,nb_rb,nb_symb_sch,nb_re_dmrs*length_dmrs, nb_rb_oh, 0, harq_process->Nl);
-
   A = harq_process->TBS; //2072 for QPSK 1/3
-
-
   ret = dlsch->max_ldpc_iterations;
-
   harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl);
   G = harq_process->G;
-
   LOG_D(PHY,"DLSCH Decoding process, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb);
 
   if ((harq_process->R)<1024)
@@ -1359,41 +1207,36 @@ void nr_dlsch_decoding_process(void *arg)
   else
     Coderate = (float) (harq_process->R) /(float) 2048;
 
-  if ((A <= 292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25)
-  {
+  if ((A <= 292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25) {
     p_decParams->BG = 2;
     kc = 52;
-    if (Coderate < 0.3333){
+
+    if (Coderate < 0.3333) {
       p_decParams->R = 15;
-    }
-    else if (Coderate <0.6667){
+    } else if (Coderate <0.6667) {
       p_decParams->R = 13;
-    }
-    else {
+    } else {
       p_decParams->R = 23;
     }
-  }
-  else{
+  } else {
     p_decParams->BG = 1;
     kc = 68;
-    if (Coderate < 0.6667){
+
+    if (Coderate < 0.6667) {
       p_decParams->R = 13;
-    }
-    else if (Coderate <0.8889){
+    } else if (Coderate <0.8889) {
       p_decParams->R = 23;
-    }
-    else {
+    } else {
       p_decParams->R = 89;
     }
-  }    
+  }
 
-  harq_process->round  =0;
- // if (harq_process->round == 0) {
+  if (harq_process->first_rx == 1) {
     // This is a new packet, so compute quantities regarding segmentation
-  if (A > NR_MAX_PDSCH_TBS)
-	  harq_process->B = A+24;
-	else
-	  harq_process->B = A+16;
+    if (A > NR_MAX_PDSCH_TBS)
+      harq_process->B = A+24;
+    else
+      harq_process->B = A+16;
 
     nr_segmentation(NULL,
                     NULL,
@@ -1403,63 +1246,48 @@ void nr_dlsch_decoding_process(void *arg)
                     &harq_process->Z,
                     &harq_process->F,
                     p_decParams->BG);
-
     p_decParams->Z = harq_process->Z;
-
-   // }
-    
-    LOG_D(PHY,"round %d Z %d K %d BG %d\n", harq_process->round, p_decParams->Z, harq_process->K, p_decParams->BG);
-
-
+  }
+  LOG_D(PHY,"round %d Z %d K %d BG %d\n", harq_process->round, p_decParams->Z, harq_process->K, p_decParams->BG);
   p_decParams->numMaxIter = dlsch->max_ldpc_iterations;
   p_decParams->outMode= 0;
-
   err_flag = 0;
-
   opp_enabled=1;
-  
   Qm= harq_process->Qm;
   Nl=harq_process->Nl;
   //r_thread = harq_process->C/2-1;
   C= harq_process->C;
-
   Cprime = C; //assume CBGTI not present
 
   if (r <= Cprime - ((G/(Nl*Qm))%Cprime) - 1)
     r_offset = Nl*Qm*(G/(Nl*Qm*Cprime));
   else
     r_offset = Nl*Qm*((G/(Nl*Qm*Cprime))+1);
-          
-  //for (r=(harq_process->C/2); r<harq_process->C; r++) {
-     //    r=1; //(harq_process->C/2);
 
+  //for (r=(harq_process->C/2); r<harq_process->C; r++) {
+  //    r=1; //(harq_process->C/2);
   r_offset = r*r_offset;
-
   Kr = harq_process->K;
   Kr_bytes = Kr>>3;
   K_bits_F = Kr-harq_process->F;
-
   E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
-
 #if UE_TIMING_TRACE
-    start_meas(dlsch_deinterleaving_stats);
+  start_meas(dlsch_deinterleaving_stats);
 #endif
-    nr_deinterleaving_ldpc(E,
-                           harq_process->Qm,
-                           harq_process->w[r],
-                           dlsch_llr+r_offset);
+  nr_deinterleaving_ldpc(E,
+                         harq_process->Qm,
+                         harq_process->w[r],
+                         dlsch_llr+r_offset);
 
   if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
     for (int i =0; i<16; i++)
-              LOG_D(PHY,"rx output thread 0 deinterleaving w[%d]= %d r_offset %u\n", i,harq_process->w[r][i], r_offset);
-
+      LOG_D(PHY,"rx output thread 0 deinterleaving w[%d]= %d r_offset %u\n", i,harq_process->w[r][i], r_offset);
 
 #if UE_TIMING_TRACE
-    stop_meas(dlsch_deinterleaving_stats);
+  stop_meas(dlsch_deinterleaving_stats);
 #endif
-
 #if UE_TIMING_TRACE
-    start_meas(dlsch_rate_unmatching_stats);
+  start_meas(dlsch_rate_unmatching_stats);
 #endif
 
   if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
@@ -1473,134 +1301,128 @@ void nr_dlsch_decoding_process(void *arg)
           harq_process->rvidx,
           harq_process->round);
 
-
-    if (Nl<4)
-      Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,Nl);
-    else
-      Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,4);
-
-    if (nr_rate_matching_ldpc_rx(Ilbrm,
-                                 Tbslbrm,
-                                 p_decParams->BG,
-                                 p_decParams->Z,
-                                 harq_process->d[r],
-                                 harq_process->w[r],
-                                 harq_process->C,
-                                 harq_process->rvidx,
-                                 (harq_process->round==0)?1:0,
-                                 E,
-				 harq_process->F,
-				 Kr-harq_process->F-2*(p_decParams->Z))==-1) {
+  if (Nl<4)
+    Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,Nl);
+  else
+    Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,4);
+
+  if (nr_rate_matching_ldpc_rx(Ilbrm,
+                               Tbslbrm,
+                               p_decParams->BG,
+                               p_decParams->Z,
+                               harq_process->d[r],
+                               harq_process->w[r],
+                               harq_process->C,
+                               harq_process->rvidx,
+                               (harq_process->first_rx==1)?1:0,
+                               E,
+                               harq_process->F,
+                               Kr-harq_process->F-2*(p_decParams->Z))==-1) {
 #if UE_TIMING_TRACE
-      stop_meas(dlsch_rate_unmatching_stats);
+    stop_meas(dlsch_rate_unmatching_stats);
 #endif
-      LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
-      //return(dlsch->max_ldpc_iterations);
-    } else
-    {
+    LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
+    //return(dlsch->max_ldpc_iterations);
+  } else {
 #if UE_TIMING_TRACE
-      stop_meas(dlsch_rate_unmatching_stats);
+    stop_meas(dlsch_rate_unmatching_stats);
 #endif
-    }
+  }
 
-    if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
-      LOG_D(PHY,"decoder input(segment %u) :",r);
-      for (int i=0;i<(3*8*Kr_bytes)+12;i++)
-        LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
-      LOG_D(PHY,"\n");
-    }
+  if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
+    LOG_D(PHY,"decoder input(segment %u) :",r);
 
+    for (int i=0; i<(3*8*Kr_bytes)+12; i++)
+      LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
 
-    memset(harq_process->c[r],0,Kr_bytes);
+    LOG_D(PHY,"\n");
+  }
 
-    if (harq_process->C == 1){
-      if (A > NR_MAX_PDSCH_TBS)
-    	 	crc_type = CRC24_A;
-    	else
-    		crc_type = CRC16;
+  memset(harq_process->c[r],0,Kr_bytes);
 
-      length_dec = harq_process->B;
-    }
-    else{
-      crc_type = CRC24_B;
-      length_dec = (harq_process->B+24*harq_process->C)/harq_process->C;
+  if (harq_process->C == 1) {
+    if (A > NR_MAX_PDSCH_TBS)
+      crc_type = CRC24_A;
+    else
+      crc_type = CRC16;
+
+    length_dec = harq_process->B;
+  } else {
+    crc_type = CRC24_B;
+    length_dec = (harq_process->B+24*harq_process->C)/harq_process->C;
+  }
+
+  if (err_flag == 0) {
+    /*
+            LOG_D(PHY, "LDPC algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n",
+                                Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS,
+                                harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_ldpc_iterations);
+    */
+    if (llr8_flag1) {
+      AssertFatal (Kr >= 256, "LDPC algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d\n",
+                   Kr,r,harq_process->C,harq_process->nb_rb,A,harq_process->TBS,harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
     }
 
-    if (err_flag == 0) {
-/*
-        LOG_D(PHY, "LDPC algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n",
-                            Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS,
-                            harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_ldpc_iterations);
-*/
-      if (llr8_flag1) {
-        AssertFatal (Kr >= 256, "LDPC algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d\n",
-            Kr,r,harq_process->C,harq_process->nb_rb,A,harq_process->TBS,harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
-      }
 #if UE_TIMING_TRACE
-        start_meas(dlsch_turbo_decoding_stats);
+    start_meas(dlsch_turbo_decoding_stats);
 #endif
-//      LOG_D(PHY,"AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
-/*
-        for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){
-              inv_d[cnt] = (1)*harq_process->d[r][cnt];
-              }
-*/
-
-        //set first 2*Z_c bits to zeros
-        memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
-        //set Filler bits
-        memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
-        //Move coded bits before filler bits
-        memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
-        //skip filler bits
-        memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
-        //Saturate coded bits before decoding into 8 bits values
-        for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1;  i+=2, j++)
-        {
-          pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
-        }
+    //      LOG_D(PHY,"AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
+    /*
+            for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){
+                  inv_d[cnt] = (1)*harq_process->d[r][cnt];
+                  }
+    */
+    //set first 2*Z_c bits to zeros
+    memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
+    //set Filler bits
+    memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
+    //Move coded bits before filler bits
+    memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
+    //skip filler bits
+    memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
+
+    //Saturate coded bits before decoding into 8 bits values
+    for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1;  i+=2, j++) {
+      pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
+    }
 
-        no_iteration_ldpc = nrLDPC_decoder(p_decParams,
-                                           (int8_t*)&pl[0],
-                                           llrProcBuf,
-                                           p_nrLDPC_procBuf,
-                                           p_procTime);
+    no_iteration_ldpc = nrLDPC_decoder(p_decParams,
+                                       (int8_t *)&pl[0],
+                                       llrProcBuf,
+                                       p_nrLDPC_procBuf,
+                                       p_procTime);
 
-        // Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
-        if (check_crc((uint8_t*)llrProcBuf,length_dec,harq_process->F,crc_type)) {
-          LOG_D(PHY,"Segment %u CRC OK\n",r);
-          ret = 2;
-        }
-        else {
-          LOG_D(PHY,"Segment %u CRC NOK\n",r);
-          ret = 1+dlsch->max_ldpc_iterations;
-        }
+    // Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
+    if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) {
+      LOG_D(PHY,"Segment %u CRC OK\n",r);
+      ret = 2;
+    } else {
+      LOG_D(PHY,"Segment %u CRC NOK\n",r);
+      ret = 1+dlsch->max_ldpc_iterations;
+    }
 
     if (no_iteration_ldpc > 10)
       LOG_D(PHY,"Error number of iteration LPDC %d\n", no_iteration_ldpc);
 
+    for (int m=0; m < Kr>>3; m ++) {
+      harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
+    }
 
-    for (int m=0; m < Kr>>3; m ++)
-                    {
-                  harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
-                    }
-
-    if ( LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))       
-      for (int k=0;k<2;k++)
+    if ( LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
+      for (int k=0; k<2; k++)
         LOG_D(PHY,"segment 1 output decoder [%d] =  0x%02x \n", k, harq_process->c[r][k]);
 
-    
 #if UE_TIMING_TRACE
-      stop_meas(dlsch_turbo_decoding_stats);
+    stop_meas(dlsch_turbo_decoding_stats);
 #endif
-    }
+  }
 
-    if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
-//      LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
-      err_flag = 1;
-    }
-  //}
+  if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
+    //      LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
+    err_flag = 1;
+  }
 
+  //}
   proc->decoder_thread_available = 1;
   //proc->decoder_main_available = 0;
 }
@@ -1612,12 +1434,12 @@ void *dlsch_thread(void *arg) {
   notifiedFIFO_elt_t *res_dl;
   initNotifiedFIFO_nothreadSafe(&freeBlocks_dl);
 
-  for (int i=0; i<tpool_nbthreads(pool_dl)+1; i++){
+  for (int i=0; i<tpool_nbthreads(pool_dl)+1; i++) {
     pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,
-                                  newNotifiedFIFO_elt(sizeof(nr_rxtx_thread_data_t), 0,&nf,nr_dlsch_decoding_process));}
+                                  newNotifiedFIFO_elt(sizeof(nr_rxtx_thread_data_t), 0,&nf,nr_dlsch_decoding_process));
+  }
 
   while (!oai_exit) {
-
     notifiedFIFO_elt_t *res;
 
     while (nbDlProcessing >= tpool_nbthreads(pool_dl)) {
@@ -1628,15 +1450,12 @@ void *dlsch_thread(void *arg) {
 
       usleep(200);
     }
-    
+
     res_dl=pullTpool(&nf, &pool_dl);
     nbDlProcessing--;
-	pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,res_dl);
-    
-
+    pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,res_dl);
     //msgToPush->key=0;
     //pushTpool(Tpool, msgToPush);
-
   } // while !oai_exit
 
   return NULL;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
index 189a18cad8fd6140da0ea89ce56bdb2c4d22663c..fb6e7bf6b5da04d2c47c890f7a07e51298cb2c16 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
@@ -445,8 +445,6 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
           //LOG_I(PHY, "avgs Power per SC is %d\n", avgs);
           median[(aatx*frame_parms->nb_antennas_rx)+aarx] = avg[(aatx*frame_parms->nb_antennas_rx)+aarx];
         }
-      pdsch_vars[gNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1;
-      //LOG_I(PHY, "avgs Power per SC is %d lg2_maxh %d\n", avgs,  pdsch_vars[gNB_id]->log2_maxh);
 
       if (dlsch0_harq->mimo_mode == NR_DUALSTREAM) {
         nr_dlsch_channel_level_median(pdsch_vars[gNB_id]->dl_ch_estimates_ext,
@@ -461,8 +459,10 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
             avgs = cmax(avgs, median[aatx*n_rx + aarx]);
           }
         }
-        pdsch_vars[gNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1;
       }
+
+      pdsch_vars[gNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1;
+      //LOG_I(PHY, "avgs Power per SC is %d lg2_maxh %d\n", avgs,  pdsch_vars[gNB_id]->log2_maxh);
     }
     LOG_D(PHY,"[DLSCH] AbsSubframe %d.%d log2_maxh = %d [log2_maxh0 %d log2_maxh1 %d] (%d,%d)\n",
           frame%1024,
@@ -738,11 +738,11 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
 }
 
 void nr_dlsch_deinterleaving(uint8_t symbol,
-							uint8_t start_symbol,
-							uint16_t L,
-							uint16_t *llr,
-							uint16_t *llr_deint,
-							uint16_t nb_rb_pdsch)
+                             uint8_t start_symbol,
+                             uint16_t L,
+                             uint16_t *llr,
+                             uint16_t *llr_deint,
+                             uint16_t nb_rb_pdsch)
 {
 
   uint32_t bundle_idx, N_bundle, R, C, r,c;
@@ -811,7 +811,7 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
   unsigned short rb;
   unsigned char aatx,aarx,atx;
   __m128i *dl_ch128,*dl_ch128_2,*dl_ch_mag128,*dl_ch_mag128b,*dl_ch_mag128r,*rxdataF128,*rxdataF_comp128,*rho128;
-  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b,QAM_amp128r;
+  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0},QAM_amp128b={0},QAM_amp128r={0};
 
   uint32_t nb_rb_0 = length/12 + ((length%12)?1:0);
   for (aatx=0; aatx<nb_aatx; aatx++) {
@@ -1303,7 +1303,7 @@ void nr_dlsch_channel_compensation_core(int **rxdataF_ext,
   int length_mod8 = 0;
   int length2;
   __m128i *dl_ch128,*dl_ch_mag128,*dl_ch_mag128b, *dl_ch128_2, *rxdataF128,*rxdataF_comp128,*rho128;
-  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
+  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0},QAM_amp128b={0};
   int aatx = 0, aarx = 0;
 
   for (aatx=0; aatx<n_tx; aatx++) {
@@ -2877,10 +2877,10 @@ uint8_t nr_zero_forcing_rx_2layers(int **rxdataF_comp,
      *
      *
      **************************************************************************/
-  __m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*dl_ch_mag128_0,*dl_ch_mag128b_0,*dl_ch_mag128r_0,*determ_fin_128;//*dl_ch_mag128_1,*dl_ch_mag128b_1,*dl_ch_mag128r_1
+  __m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*dl_ch_mag128_0=NULL,*dl_ch_mag128b_0=NULL,*dl_ch_mag128r_0=NULL,*determ_fin_128;//*dl_ch_mag128_1,*dl_ch_mag128b_1,*dl_ch_mag128r_1
   __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3;
   __m128i *after_mf_a_128,*after_mf_b_128, *after_mf_c_128, *after_mf_d_128;
-  __m128i QAM_amp128,QAM_amp128b,QAM_amp128r;
+  __m128i QAM_amp128={0},QAM_amp128b={0},QAM_amp128r={0};
 
   determ_fin_128      = (__m128i *)&determ_fin[0];
 
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
index a91dec343ac3599342129ca4b2314408fd6862ae..7dfd765b76e8050710b92f423600518232c101e1 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
@@ -36,8 +36,7 @@
 #include "PHY/MODULATION/modulation_UE.h"
 #include "nr_transport_proto_ue.h"
 #include "PHY/NR_UE_ESTIMATION/nr_estimation.h"
-//#include "SCHED/defs.h"
-//#include "SCHED/extern.h"
+#include "SCHED_NR_UE/defs.h"
 #include "common/utils/LOG/vcd_signal_dumper.h"
 
 #include "common_lib.h"
@@ -46,6 +45,7 @@
 #include "PHY/NR_REFSIG/pss_nr.h"
 #include "PHY/NR_REFSIG/sss_nr.h"
 #include "PHY/NR_REFSIG/refsig_defs_ue.h"
+#include "PHY/NR_TRANSPORT/nr_dci.h"
 
 extern openair0_config_t openair0_cfg[];
 //static  nfapi_nr_config_request_t config_t;
@@ -201,7 +201,10 @@ int nr_pbch_detection(UE_nr_rxtx_proc_t * proc, PHY_VARS_NR_UE *ue, int pbch_ini
 char duplex_string[2][4] = {"FDD","TDD"};
 char prefix_string[2][9] = {"NORMAL","EXTENDED"};
 
-int nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, int n_frames)
+int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
+                    PHY_VARS_NR_UE *ue,
+                    int n_frames, int sa,
+                    int dlsch_parallel)
 {
 
   int32_t sync_pos, sync_pos_frame; // k_ssb, N_ssb_crb, sync_pos2,
@@ -349,7 +352,7 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, int n_frames)
     }
   }
   else {
-	  ret = -1;
+    ret = -1;
   }
 
   /* Consider this is a false detection if the offset is > 1000 Hz 
@@ -374,8 +377,6 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, int n_frames)
 #endif
     //#endif
 
-    ue->is_synchronized_on_frame = is; // to notify on which of the two frames sync was successful
-
     if (ue->UE_scan_carrier == 0) {
 
     #if UE_AUTOTEST_TRACE
@@ -481,6 +482,76 @@ int nr_initial_sync(UE_nr_rxtx_proc_t *proc, PHY_VARS_NR_UE *ue, int n_frames)
 
   }
 
+  // if stand alone and sync on ssb do sib1 detection as part of initial sync
+  if (sa==1 && ret==0) {
+    bool dec = false;
+    NR_UE_PDCCH *pdcch_vars  = ue->pdcch_vars[proc->thread_id][0];
+    int gnb_id = 0; //FIXME
+    int coreset_nb_rb=0;
+    int coreset_start_rb=0;
+
+    for(int n_ss = 0; n_ss<pdcch_vars->nb_search_space; n_ss++) {
+      uint8_t nb_symb_pdcch = pdcch_vars->pdcch_config[n_ss].coreset.duration;
+      get_coreset_rballoc(pdcch_vars->pdcch_config[n_ss].coreset.frequency_domain_resource,&coreset_nb_rb,&coreset_start_rb);
+
+      for (uint16_t l=0; l<nb_symb_pdcch; l++) {
+        nr_slot_fep_init_sync(ue,
+                              proc,
+                              l, // the UE PHY has no notion of the symbols to be monitored in the search space
+                              pdcch_vars->slot,
+                              is*fp->samples_per_frame+pdcch_vars->sfn*fp->samples_per_frame+ue->rx_offset);
+
+        if (coreset_nb_rb > 0)
+          nr_pdcch_channel_estimation(ue,
+                                      proc,
+                                      0,
+                                      pdcch_vars->slot,
+                                      l,
+                                      fp->first_carrier_offset+(pdcch_vars->pdcch_config[n_ss].BWPStart + coreset_start_rb)*12,
+                                      coreset_nb_rb);
+
+      }
+      int  dci_cnt = nr_ue_pdcch_procedures(gnb_id, ue, proc, n_ss);
+      if (dci_cnt>0){
+        NR_UE_DLSCH_t *dlsch = ue->dlsch_SI[gnb_id];
+        if (dlsch && (dlsch->active == 1)) {
+          uint8_t harq_pid = dlsch->current_harq_pid;
+          NR_DL_UE_HARQ_t *dlsch0_harq = dlsch->harq_processes[harq_pid];
+          uint16_t nb_symb_sch = dlsch0_harq->nb_symbols;
+          uint16_t start_symb_sch = dlsch0_harq->start_symbol;
+
+          for (uint16_t m=start_symb_sch;m<(nb_symb_sch+start_symb_sch) ; m++){
+            nr_slot_fep_init_sync(ue,
+                                  proc,
+                                  m,
+                                  pdcch_vars->slot,  // same slot and offset as pdcch
+                                  is*fp->samples_per_frame+pdcch_vars->sfn*fp->samples_per_frame+ue->rx_offset);
+          }
+
+          int ret = nr_ue_pdsch_procedures(ue,
+                                           proc,
+                                           gnb_id,
+                                           SI_PDSCH,
+                                           ue->dlsch_SI[gnb_id],
+                                           NULL);
+          if (ret >= 0)
+            dec = nr_ue_dlsch_procedures(ue,
+                                         proc,
+                                         gnb_id,
+                                         SI_PDSCH,
+                                         ue->dlsch_SI[gnb_id],
+                                         NULL,
+                                         &ue->dlsch_SI_errors[gnb_id],
+                                         dlsch_parallel);
+
+          // deactivate dlsch once dlsch proc is done
+          ue->dlsch_SI[gnb_id]->active = 0;
+        }
+      }
+    }
+    if (dec == false) // sib1 not decoded
+      ret = -1;
+  }
   //  exit_fun("debug exit");
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INITIAL_UE_SYNC, VCD_FUNCTION_OUT);
   return ret;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
index 05264014edbfe8d07e9df1641cabc364cef489f7..4d9e2dce3522f0cd6cdd531073bfaef0bddc48c4 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
@@ -328,7 +328,7 @@ void nr_pbch_detection_mrc(NR_DL_FRAME_PARMS *frame_parms,
 #endif
 }
 
-void nr_pbch_unscrambling(NR_UE_PBCH *pbch,
+static void nr_pbch_unscrambling(NR_UE_PBCH *pbch,
                           uint16_t Nid,
                           uint8_t nushift,
                           uint16_t M,
@@ -549,7 +549,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
 
   nr_ue_pbch_vars->pbch_a_prime = a_reversed;
   //payload un-scrambling
-  memset(&nr_ue_pbch_vars->pbch_a_interleaved, 0, sizeof(uint32_t) );
+  nr_ue_pbch_vars->pbch_a_interleaved=0;
   M = (Lmax == 64)? (NR_POLAR_PBCH_PAYLOAD_BITS - 6) : (NR_POLAR_PBCH_PAYLOAD_BITS - 3);
   nushift = ((nr_ue_pbch_vars->pbch_a_prime>>24)&1) ^ (((nr_ue_pbch_vars->pbch_a_prime>>6)&1)<<1);
   nr_pbch_unscrambling(nr_ue_pbch_vars,frame_parms->Nid_cell,nushift,M,NR_POLAR_PBCH_PAYLOAD_BITS,1,unscrambling_mask);
@@ -607,7 +607,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
   uint16_t number_pdus = 1;
 
   nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, gNB_id);
-  nr_fill_rx_indication(&rx_ind, FAPI_NR_RX_PDU_TYPE_SSB, gNB_id, ue, NULL, number_pdus);
+  nr_fill_rx_indication(&rx_ind, FAPI_NR_RX_PDU_TYPE_SSB, gNB_id, ue, NULL, NULL, number_pdus);
 
   if (ue->if_inst && ue->if_inst->dl_indication)
     ue->if_inst->dl_indication(&dl_indication, NULL);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
index e7cf3c15a913a3127a1516c9a80fc583d09f62b9..24299fd788f9373c39bed13bc9c47bd8d2d5dd96 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
@@ -102,7 +102,11 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
                        nrUE_config->prach_config.num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index,
                        ue->X_u);
 
-  sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1));
+  if (slot % (fp->slots_per_subframe / 2) == 0)
+    sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1));
+  else
+    sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * prachStartSymbol;
+
   prach_start = fp->get_samples_slot_timestamp(slot, fp, 0) + sample_offset_slot;
 
   //printf("prachstartsymbold %d, sample_offset_slot %d, prach_start %d\n",prachStartSymbol, sample_offset_slot, prach_start);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
index 3a2ac8b7ce5ecebbd9e1911d0834927e412cc607..c277a8ffcc2e2b8a6f1b96ad7722776e92ff500d 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
@@ -1044,7 +1044,8 @@ uint32_t  nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
                          uint8_t is_crnti,
                          uint8_t llr8_flag);
 
-int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
+int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
+                     NR_UE_ULSCH_t *ulsch,
                      NR_DL_FRAME_PARMS* frame_parms,
                      uint8_t harq_pid,
                      unsigned int G);
@@ -1119,7 +1120,8 @@ uint32_t dlsch_decoding_emul(PHY_VARS_NR_UE *phy_vars_ue,
                              uint8_t eNB_id);
 
 int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
-                    UE_nr_rxtx_proc_t *proc);
+                    UE_nr_rxtx_proc_t *proc,
+                    fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
 
 
 /*! \brief Extract PSS and SSS resource elements
@@ -1454,7 +1456,9 @@ void generate_RIV_tables(void);
 */
 int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
                     PHY_VARS_NR_UE *phy_vars_ue, 
-                    int n_frames);
+                    int n_frames,
+                    int sa,
+                    int dlsch_parallel);
 
 /*!
   \brief This function gets the carrier frequencies either from FP or command-line-set global variables, depending on the availability of the latter
@@ -1475,11 +1479,13 @@ void nr_get_carrier_frequencies(NR_DL_FRAME_PARMS *fp,
   @param dl_Carrier     DL carrier to be set
   @param freq_offset    Freq offset to be set
 */
-void nr_rf_card_config(openair0_config_t *openair0_cfg,
-                       double rx_gain_off,
-                       uint64_t ul_Carrier,
-                       uint64_t dl_Carrier,
-                       int freq_offset);
+void nr_rf_card_config_gain(openair0_config_t *openair0_cfg,
+                            double rx_gain_off);
+
+void nr_rf_card_config_freq(openair0_config_t *openair0_cfg,
+                            uint64_t ul_Carrier,
+                            uint64_t dl_Carrier,
+                            int freq_offset);
 
 
 void print_CQI(void *o,UCI_format_t uci_format,uint8_t eNB_id,int N_RB_DL);
@@ -1706,7 +1712,8 @@ uint32_t lte_gold_generic(uint32_t *x1, uint32_t *x2, uint8_t reset);
 
 uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
                                   UE_nr_rxtx_proc_t *proc,
-                                  fapi_nr_dci_indication_t *dci_ind);
+                                  fapi_nr_dci_indication_t *dci_ind,
+                                  fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
 
 
 /** \brief This function is the top-level entry point to PDSCH demodulation, after frequency-domain transformation and channel estimation.  It performs
@@ -1742,6 +1749,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
 
 int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t subframe);
 
+void dump_nrdlsch(PHY_VARS_NR_UE *ue,uint8_t gNB_id,uint8_t nr_slot_rx,unsigned int *coded_bits_per_codeword,int round,  unsigned char harq_pid);
+
 void *dlsch_thread(void *arg);
 /**@}*/
 #endif
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
index f3cca9e33db0a9a7aa38bf50f6f0e2c10d735fdb..b4ee4f5b41d047483cdd90afa7491a225072d478 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
@@ -56,34 +56,6 @@ typedef enum {
  RETRANSMISSION_HARQ
 } harq_result_t;
 
-//#if defined(UPGRADE_RAT_NR)
-#if 1
-typedef struct {
-  /// HARQ process id
-  uint8_t harq_id;
-  /// HARQ rx status
-  harq_result_t rx_status;
-  /// ACK bits (after decoding) 0:NACK / 1:ACK / 2:DTX
-  uint8_t ack;
-  /// send status (for PUCCH)
-  uint8_t send_harq_status;
-  /// nCCE (for PUCCH)
-  uint8_t nCCE;
-  /// DAI value detected from DCI1/1a/1b/1d/2/2a/2b/2c. 0xff indicates not touched
-  uint8_t vDAI_DL;
-  /// DAI value detected from DCI0/4. 0xff indicates not touched
-  uint8_t vDAI_UL;
-  /// allow to define pucch parameters TS 38.213 9.2.3 UE procedure for reporting HARQ-ACK
-  uint8_t  pucch_resource_indicator;
-  /// slot on which feedback ack should be send to network
-  uint16_t slot_for_feedback_ack;
-  /// index of a first CCE for the PDCCH reception
-  uint8_t  n_CCE;
-  /// number of CCEs in a control resource set of a PDCCH reception conveying DCI format 1_0
-  uint8_t  N_CCE;
-} NR_UE_HARQ_STATUS_t;
-#endif
-
 typedef struct {
   /// NDAPI struct for UE
   nfapi_nr_ue_pusch_pdu_t pusch_pdu;
@@ -234,8 +206,8 @@ typedef struct {
 } NR_UE_ULSCH_t;
 
 typedef struct {
-  /// Indicator of first transmission
-  uint8_t first_tx;
+  /// Indicator of first reception
+  uint8_t first_rx;
   /// Last Ndi received for this process on DCI (used for C-RNTI only)
   uint8_t DCINdi;
   /// DLSCH status flag indicating
@@ -319,7 +291,7 @@ typedef struct {
   /// codeword this transport block is mapped to
   uint8_t codeword;
   /// HARQ-ACKs
-  NR_UE_HARQ_STATUS_t harq_ack;
+  uint8_t ack;
   /// PTRS Frequency Density
   uint8_t PTRSFreqDensity;
   /// PTRS Time Density
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c
index 6cf782d9d83d0ce0c11edaceba8ce880dda505a1..29cccdcf8811dbc9605bf6c9a532a5d9d99abf85 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ue_rf_helpers.c
@@ -48,11 +48,9 @@ void nr_get_carrier_frequencies(NR_DL_FRAME_PARMS *fp, uint64_t *dl_carrier, uin
 
 }
 
-void nr_rf_card_config(openair0_config_t *openair0_cfg,
-                       double rx_gain_offset,
-                       uint64_t ul_carrier,
-                       uint64_t dl_carrier,
-                       int freq_offset){
+
+void nr_rf_card_config_gain(openair0_config_t *openair0_cfg,
+                            double rx_gain_off){
 
   uint8_t mod_id     = 0;
   uint8_t cc_id      = 0;
@@ -61,6 +59,36 @@ void nr_rf_card_config(openair0_config_t *openair0_cfg,
   double rx_gain     = ue->rx_total_gain_dB;
   double tx_gain     = ue->tx_total_gain_dB;
 
+  for (int i = rf_chain; i < rf_chain + 4; i++) {
+
+    if (tx_gain)
+      openair0_cfg->tx_gain[i] = tx_gain;
+    if (rx_gain)
+      openair0_cfg->rx_gain[i] = rx_gain - rx_gain_off;
+
+    openair0_cfg->autocal[i] = 1;
+
+    if (i < openair0_cfg->rx_num_channels) {
+      LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_gain %f, rx_gain %f\n",
+        i,
+        rf_chain,
+        openair0_cfg->tx_gain[i],
+        openair0_cfg->rx_gain[i]);
+    }
+
+  }
+}
+
+void nr_rf_card_config_freq(openair0_config_t *openair0_cfg,
+                            uint64_t ul_carrier,
+                            uint64_t dl_carrier,
+                            int freq_offset){
+
+  uint8_t mod_id     = 0;
+  uint8_t cc_id      = 0;
+  PHY_VARS_NR_UE *ue = PHY_vars_UE_g[mod_id][cc_id];
+  int rf_chain       = ue->rf_map.chain;
+
   for (int i = rf_chain; i < rf_chain + 4; i++) {
 
     if (i < openair0_cfg->rx_num_channels)
@@ -73,22 +101,15 @@ void nr_rf_card_config(openair0_config_t *openair0_cfg,
     else
       openair0_cfg->tx_freq[i] = 0.0;
 
-    if (tx_gain)
-      openair0_cfg->tx_gain[i] = tx_gain;
-    if (rx_gain)
-      openair0_cfg->rx_gain[i] = rx_gain - rx_gain_offset;
-
     openair0_cfg->autocal[i] = 1;
 
     if (i < openair0_cfg->rx_num_channels) {
-      LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_gain %f, rx_gain %f, tx_freq %f Hz, rx_freq %f Hz\n",
+      LOG_I(PHY, "HW: Configuring channel %d (rf_chain %d): setting tx_freq %f Hz, rx_freq %f Hz\n",
         i,
         rf_chain,
-        openair0_cfg->tx_gain[i],
-        openair0_cfg->rx_gain[i],
         openair0_cfg->tx_freq[i],
         openair0_cfg->rx_freq[i]);
     }
 
   }
-}
\ No newline at end of file
+}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
index 5733ef6eb3c3595481bdc9757a5877140e70e970..ba5c65ceb71086c01f6505bc4134ad9acfaaeb49 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
@@ -215,11 +215,13 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL,
 }
 
 
-int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
+int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
+                      NR_UE_ULSCH_t *ulsch,
                       NR_DL_FRAME_PARMS* frame_parms,
                       uint8_t harq_pid,
                       unsigned int G)
 {
+  start_meas(&ue->ulsch_encoding_stats);
 /////////////////////////parameters and variables declaration/////////////////////////
 ///////////
 
@@ -332,6 +334,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
     }
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_SEGMENTATION, VCD_FUNCTION_IN);
+    start_meas(&ue->ulsch_segmentation_stats);
     Kb=nr_segmentation(harq_process->b,
                        harq_process->c,
                        harq_process->B,
@@ -340,6 +343,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
                        pz,
                        &harq_process->F,
                        harq_process->BG);
+    stop_meas(&ue->ulsch_segmentation_stats);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_SEGMENTATION, VCD_FUNCTION_OUT);
 
     F = harq_process->F;
@@ -374,14 +378,6 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
     //for (int i=0;i<68*384;i++)
       //        printf("channel_input[%d]=%d\n",i,channel_input[i]);
 
-    int temp_opp = 0;
-
-    if (opp_enabled) {
-      opp_enabled = 0;
-      temp_opp = 1;
-    }
-
-
     /*printf("output %d %d %d %d %d \n", harq_process->d[0][0], harq_process->d[0][1], harq_process->d[r][2],harq_process->d[0][3], harq_process->d[0][4]);
       for (int cnt =0 ; cnt < 66*(*pz); cnt ++){
       printf("%d \n",  harq_process->d[0][cnt]);
@@ -397,11 +393,13 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LDPC_ENCODER_OPTIM, VCD_FUNCTION_IN);
 
+    start_meas(&ue->ulsch_ldpc_encoding_stats);
     for(int j = 0; j < (harq_process->C/8 + 1); j++)
     {
       impp.macro_num = j;
       nrLDPC_encoder(harq_process->c,harq_process->d,*pz,Kb,Kr,harq_process->BG,&impp);
     }
+    stop_meas(&ue->ulsch_ldpc_encoding_stats);
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LDPC_ENCODER_OPTIM, VCD_FUNCTION_OUT);
 
@@ -412,8 +410,6 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
     write_output("ulsch_enc_output0.m","enc0",&harq_process->d[0][0],(3*8*Kr_bytes)+12,1,4);
 #endif
 
-    if (temp_opp) opp_enabled = 1;
-
 ///////////
 ///////////////////////////////////////////////////////////////////////////////
     LOG_D(PHY,"setting ndi to %d from pusch_data\n", harq_process->pusch_pdu.pusch_data.new_data_indicator);
@@ -449,6 +445,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
     Tbslbrm = nr_compute_tbslbrm(0,nb_rb,harq_process->pusch_pdu.nrOfLayers);
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RATE_MATCHING_LDPC, VCD_FUNCTION_IN);
+    start_meas(&ue->ulsch_rate_matching_stats);
     nr_rate_matching_ldpc(Ilbrm,
                           Tbslbrm,
                           harq_process->BG,
@@ -460,6 +457,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
                           Kr-F-2*(*pz),
                           harq_process->pusch_pdu.pusch_data.rv_index,
                           E);
+    stop_meas(&ue->ulsch_rate_matching_stats);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RATE_MATCHING_LDPC, VCD_FUNCTION_OUT);
 
 
@@ -481,10 +479,12 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
     //start_meas(i_stats);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INTERLEAVING_LDPC, VCD_FUNCTION_IN);
     
+    start_meas(&ue->ulsch_interleaving_stats);
     nr_interleaving_ldpc(E,
             mod_order,
             harq_process->e+r_offset,
             harq_process->f+r_offset);
+    stop_meas(&ue->ulsch_interleaving_stats);
     
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INTERLEAVING_LDPC, VCD_FUNCTION_OUT);
     //stop_meas(i_stats);
@@ -509,5 +509,6 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT);
 
+  stop_meas(&ue->ulsch_encoding_stats);
   return(0);
 }
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
index bab801e0e36c3aad81b9309e050354b839effb06..b1addf740a2ee6c668eb03831b1841d1e1877c5e 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
@@ -159,7 +159,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
                               nb_dmrs_re_per_rb, number_dmrs_symbols, mod_order, Nl);
     
 
-    nr_ulsch_encoding(ulsch_ue, frame_parms, harq_pid, G);
+    nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, G);
 
     ///////////
     ////////////////////////////////////////////////////////////////////
@@ -252,14 +252,15 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
   uint8_t u = 0, v = 0;
   int16_t *dmrs_seq = NULL;
 
-  if (pusch_pdu->transform_precoding == transform_precoder_enabled) { 
+  // if  transform precoding is enbaled (value 0)
+  if (pusch_pdu->transform_precoding == 0) {
 
     uint32_t nb_re_pusch=nb_rb * NR_NB_SC_PER_RB;
     uint32_t y_offset = 0;
     uint16_t num_dmrs_res_per_symbol = nb_rb*(NR_NB_SC_PER_RB/2);
     
     // Calculate index to dmrs seq array based on number of DMRS Subcarriers on this symbol
-    index = get_index_for_dmrs_lowpapr_seq(num_dmrs_res_per_symbol);    
+    index = get_index_for_dmrs_lowpapr_seq(num_dmrs_res_per_symbol);
     u = pusch_pdu->dfts_ofdm.low_papr_group_number;
     v = pusch_pdu->dfts_ofdm.low_papr_sequence_number;
     dmrs_seq = dmrs_lowpaprtype1_ul_ref_sig[u][v][index];
@@ -297,7 +298,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
       }
       
       printf("NR_ULSCH_UE: numSym: %d, num_dmrs_sym: %d", number_of_symbols,number_dmrs_symbols);
-      for (int ll = 0; ll < (number_of_symbols-number_dmrs_symbols); ll++) {  
+      for (int ll = 0; ll < (number_of_symbols-number_dmrs_symbols); ll++) {
 
         nr_idft(&debug_symbols[offset], nb_re_pusch);
 
@@ -353,8 +354,8 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
       if ((ul_dmrs_symb_pos >> l) & 0x01) {
         is_dmrs_sym = 1;
 
-   
-        if (pusch_pdu->transform_precoding == transform_precoder_disabled){ 
+        // transform precoding disabled (value 1)
+        if (pusch_pdu->transform_precoding == 1){
         
           if (dmrs_type == pusch_dmrs_type1)
             dmrs_idx = (pusch_pdu->bwp_start + start_rb)*6;
@@ -371,9 +372,9 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
         }
        
        
-      } else if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {       
+      } else if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
 
-        AssertFatal(pusch_pdu->transform_precoding == transform_precoder_disabled, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n"); 
+        AssertFatal(pusch_pdu->transform_precoding == 1, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n");
 
         if(is_ptrs_symbol(l, ulsch_ue->ptrs_symbols)) {
           is_ptrs_sym = 1;
@@ -404,8 +405,8 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
         }
 
         if (is_dmrs == 1) {
-
-          if (pusch_pdu->transform_precoding == transform_precoder_enabled) { 
+          // if transform precoding is enabled
+          if (pusch_pdu->transform_precoding == 0) {
           
             ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[2*dmrs_idx]) >> 15;
             ((int16_t*)txdataF[ap])[((sample_offsetF)<<1) + 1] = (Wt[l_prime[0]]*Wf[k_prime]*AMP*dmrs_seq[(2*dmrs_idx) + 1]) >> 15;
@@ -528,7 +529,8 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
       nr_normal_prefix_mod(txdataF[ap],
                            &txdata[ap][tx_offset],
                            14,
-                           frame_parms);
+                           frame_parms,
+                           slot);
     }
   }
 
diff --git a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
index c7bf459f6f5a185decc1087cab3d2ab6731ba524..61bca6f409a9fc97d9ceeb2f58333ab91bccc817 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
@@ -54,16 +54,10 @@
 void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
                         int32_t **txdataF,
                         NR_DL_FRAME_PARMS *frame_parms,
-                        long pucch_GroupHopping,
-                        long hoppingId,
                         int16_t amp,
                         int nr_slot_tx,
-                        uint8_t m0,
-			                  uint8_t mcs,
-                        uint8_t nrofSymbols,
-                        uint8_t startingSymbolIndex,
-                        uint16_t startingPRB,
-			                  uint16_t secondHopPRB) {
+                        fapi_nr_ul_config_pucch_pdu *pucch_pdu) {
+
 #ifdef DEBUG_NR_PUCCH_TX
   printf("\t [nr_generate_pucch0] start function at slot(nr_slot_tx)=%d\n",nr_slot_tx);
 #endif
@@ -97,21 +91,31 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
   // the value of u,v (delta always 0 for PUCCH) has to be calculated according to TS 38.211 Subclause 6.3.2.2.1
   uint8_t u[2]={0,0},v[2]={0,0};
 
+  LOG_D(PHY,"pucch0: nr_symbols %d, start_symbol %d, prb_start %d, second_hop_prb %d,  group_hop_flag %d, sequence_hop_flag %d, mcs %d\n",pucch_pdu->nr_of_symbols,pucch_pdu->start_symbol_index,pucch_pdu->prb_start,pucch_pdu->second_hop_prb,pucch_pdu->group_hop_flag,pucch_pdu->sequence_hop_flag,pucch_pdu->mcs);
+
+
 #ifdef DEBUG_NR_PUCCH_TX
   printf("\t [nr_generate_pucch0] sequence generation: variable initialization for test\n");
 #endif
   // x_n contains the sequence r_u_v_alpha_delta(n)
   int16_t x_n_re[2][24],x_n_im[2][24];
 
+  uint16_t startingPRB = pucch_pdu->prb_start + pucch_pdu->bwp_start;
+  pucch_GroupHopping_t pucch_GroupHopping = pucch_pdu->group_hop_flag + (pucch_pdu->sequence_hop_flag<<1);
+
   // we proceed to calculate alpha according to TS 38.211 Subclause 6.3.2.2.2
   int prb_offset[2]={startingPRB,startingPRB};
-  nr_group_sequence_hopping(pucch_GroupHopping,hoppingId,0,nr_slot_tx,&u[0],&v[0]); // calculating u and v value
-  if (startingPRB!=secondHopPRB) {
-    nr_group_sequence_hopping(pucch_GroupHopping,hoppingId,1,nr_slot_tx,&u[1],&v[1]); // calculating u and v value
-    prb_offset[1] = secondHopPRB;
+  nr_group_sequence_hopping(pucch_GroupHopping,pucch_pdu->hopping_id,0,nr_slot_tx,&u[0],&v[0]); // calculating u and v value
+  if (pucch_pdu->freq_hop_flag == 1) {
+    nr_group_sequence_hopping(pucch_GroupHopping,pucch_pdu->hopping_id,1,nr_slot_tx,&u[1],&v[1]); // calculating u and v value
+    prb_offset[1] = pucch_pdu->second_hop_prb;
   }
-  for (int l=0; l<nrofSymbols; l++) {
-    alpha = nr_cyclic_shift_hopping(hoppingId,m0,mcs,l,startingSymbolIndex,nr_slot_tx);
+  for (int l=0; l<pucch_pdu->nr_of_symbols; l++) {
+    alpha = nr_cyclic_shift_hopping(pucch_pdu->hopping_id,
+                                    pucch_pdu->initial_cyclic_shift,
+                                    pucch_pdu->mcs,l,
+                                    pucch_pdu->start_symbol_index,
+                                    nr_slot_tx);
 #ifdef DEBUG_NR_PUCCH_TX
     printf("\t [nr_generate_pucch0] sequence generation \tu=%d \tv=%d \talpha=%lf \t(for symbol l=%d)\n",u[l],v[l],alpha,l);
 #endif
@@ -135,8 +139,8 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
   uint32_t re_offset=0;
   uint8_t l2;
 
-  for (int l=0; l<nrofSymbols; l++) {
-    l2=l+startingSymbolIndex;
+  for (int l=0; l<pucch_pdu->nr_of_symbols; l++) {
+    l2=l+pucch_pdu->start_symbol_index;
     re_offset = (12*prb_offset[l]) + frame_parms->first_carrier_offset;
     if (re_offset>= frame_parms->ofdm_symbol_size) 
       re_offset-=frame_parms->ofdm_symbol_size;
@@ -168,20 +172,20 @@ void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
 void nr_generate_pucch1(PHY_VARS_NR_UE *ue,
                         int32_t **txdataF,
                         NR_DL_FRAME_PARMS *frame_parms,
-                        PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
-                        uint64_t payload,
                         int16_t amp,
                         int nr_slot_tx,
-                        uint8_t m0,
-                        uint8_t nrofSymbols,
-                        uint8_t startingSymbolIndex,
-                        uint16_t startingPRB,
-                        uint16_t startingPRB_intraSlotHopping,
-                        uint8_t timeDomainOCC,
-                        uint8_t nr_bit) {
-#ifdef DEBUG_NR_PUCCH_TX
-  printf("\t [nr_generate_pucch1] start function at slot(nr_slot_tx)=%d payload=%lu m0=%d nrofSymbols=%d startingSymbolIndex=%d startingPRB=%d startingPRB_intraSlotHopping=%d timeDomainOCC=%d nr_bit=%d\n",
-         nr_slot_tx,payload,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,timeDomainOCC,nr_bit);
+                        fapi_nr_ul_config_pucch_pdu *pucch_pdu) {
+
+  uint16_t m0 = pucch_pdu->initial_cyclic_shift;
+  uint64_t payload = pucch_pdu->payload;
+  uint8_t startingSymbolIndex = pucch_pdu->start_symbol_index;
+  uint8_t nrofSymbols = pucch_pdu->nr_of_symbols;
+  uint16_t startingPRB = pucch_pdu->prb_start + pucch_pdu->bwp_start;
+  uint8_t timeDomainOCC = pucch_pdu->time_domain_occ_idx;
+
+#ifdef DEBUG_NR_PUCCH_TX
+  printf("\t [nr_generate_pucch1] start function at slot(nr_slot_tx)=%d payload=%lu m0=%d nrofSymbols=%d startingSymbolIndex=%d startingPRB=%d second_hop_prb=%d timeDomainOCC=%d nr_bit=%d\n",
+         nr_slot_tx,payload,m0,nrofSymbols,startingSymbolIndex,startingPRB,pucch_pdu->second_hop_prb,timeDomainOCC,pucch_pdu->n_bit);
 #endif
   /*
    * Implement TS 38.211 Subclause 6.3.2.4.1 Sequence modulation
@@ -190,12 +194,12 @@ void nr_generate_pucch1(PHY_VARS_NR_UE *ue,
   // complex-valued symbol d_re, d_im containing complex-valued symbol d(0):
   int16_t d_re=0, d_im=0;
 
-  if (nr_bit == 1) { // using BPSK if M_bit=1 according to TC 38.211 Subclause 5.1.2
+  if (pucch_pdu->n_bit == 1) { // using BPSK if M_bit=1 according to TC 38.211 Subclause 5.1.2
     d_re = (payload&1)==0 ? (int16_t)(((int32_t)amp*ONE_OVER_SQRT2)>>15) : -(int16_t)(((int32_t)amp*ONE_OVER_SQRT2)>>15);
     d_im = (payload&1)==0 ? (int16_t)(((int32_t)amp*ONE_OVER_SQRT2)>>15) : -(int16_t)(((int32_t)amp*ONE_OVER_SQRT2)>>15);
   }
 
-  if (nr_bit == 2) { // using QPSK if M_bit=2 according to TC 38.211 Subclause 5.1.2
+  if (pucch_pdu->n_bit == 2) { // using QPSK if M_bit=2 according to TC 38.211 Subclause 5.1.2
     if (((payload&1)==0) && (((payload>>1)&1)==0)) {
       d_re =  (int16_t)(((int32_t)amp*ONE_OVER_SQRT2)>>15); // 32767/sqrt(2) = 23170 (ONE_OVER_SQRT2)
       d_im =  (int16_t)(((int32_t)amp*ONE_OVER_SQRT2)>>15);
@@ -256,7 +260,7 @@ void nr_generate_pucch1(PHY_VARS_NR_UE *ue,
   //uint8_t PUCCH_Frequency_Hopping = 0 ; // from higher layers
   uint8_t intraSlotFrequencyHopping = 0;
 
-  if (startingPRB != startingPRB_intraSlotHopping) {
+  if (pucch_pdu->freq_hop_flag) {
     intraSlotFrequencyHopping=1;
   }
 
@@ -287,8 +291,9 @@ void nr_generate_pucch1(PHY_VARS_NR_UE *ue,
     printf("\t [nr_generate_pucch1] entering function nr_group_sequence_hopping with n_hop=%d, nr_slot_tx=%d\n",
            n_hop,nr_slot_tx);
 #endif
-    nr_group_sequence_hopping(ue->pucch_config_common_nr->pucch_GroupHopping,ue->pucch_config_common_nr->hoppingId,n_hop,nr_slot_tx,&u,&v); // calculating u and v value
-    alpha = nr_cyclic_shift_hopping(ue->pucch_config_common_nr->hoppingId,m0,mcs,l,lprime,nr_slot_tx);
+    pucch_GroupHopping_t pucch_GroupHopping = pucch_pdu->group_hop_flag + (pucch_pdu->sequence_hop_flag<<1);
+    nr_group_sequence_hopping(pucch_GroupHopping,pucch_pdu->hopping_id,n_hop,nr_slot_tx,&u,&v); // calculating u and v value
+    alpha = nr_cyclic_shift_hopping(pucch_pdu->hopping_id,m0,mcs,l,lprime,nr_slot_tx);
 
     for (int n=0; n<12; n++) {
       r_u_v_alpha_delta_re[n] = (int16_t)(((((int32_t)(round(32767*cos(alpha*n))) * table_5_2_2_2_2_Re[u][n])>>15)
@@ -441,7 +446,7 @@ void nr_generate_pucch1(PHY_VARS_NR_UE *ue,
     }
 
     if ((intraSlotFrequencyHopping == 1) && (l<floor(nrofSymbols/2))) { // intra-slot hopping enabled, we need to calculate new offset PRB
-      startingPRB = startingPRB + startingPRB_intraSlotHopping;
+      startingPRB = startingPRB + pucch_pdu->second_hop_prb;
     }
 
     if ((startingPRB <  (frame_parms->N_RB_DL>>1)) && ((frame_parms->N_RB_DL & 1) == 0)) { // if number RBs in bandwidth is even and current PRB is lower band
@@ -834,7 +839,7 @@ inline void nr_pucch2_3_4_scrambling(uint16_t M_bit,uint16_t rnti,uint16_t n_id,
       c = (uint8_t)((s>>i)&1);
       btildep[i] = (((B>>i)&1) ^ c);
 #ifdef DEBUG_NR_PUCCH_TX
-      printf("\t\t\t btilde[%d]=%lx from unscrambled bit %d and scrambling %d (%x)\n",i+(iprime<<5),btilde[i],((B>>i)&1),c,s>>i);
+      printf("\t\t\t btilde[%d]=%x from unscrambled bit %d and scrambling %d (%x)\n",i+(iprime<<5),btilde[i],((B>>i)&1),c,s>>i);
 #endif
     }
     M_bit3-=32;
@@ -848,7 +853,7 @@ inline void nr_pucch2_3_4_scrambling(uint16_t M_bit,uint16_t rnti,uint16_t n_id,
 }
 void nr_uci_encoding(uint64_t payload,
                      uint8_t nr_bit,
-                     pucch_format_nr_t fmt,
+                     int fmt,
                      uint8_t is_pi_over_2_bpsk_enabled,
                      uint8_t nrofSymbols,
                      uint8_t nrofPRB,
@@ -868,9 +873,9 @@ void nr_uci_encoding(uint64_t payload,
   // E is the rate matching output sequence length as given in TS 38.212 subclause 6.3.1.4.1
   uint16_t E=0,E_init;
 
-  if (fmt == pucch_format2_nr) E = 16*nrofSymbols*nrofPRB;
+  if (fmt == 2) E = 16*nrofSymbols*nrofPRB;
 
-  if (fmt == pucch_format3_nr) {
+  if (fmt == 3) {
     E_init = (is_pi_over_2_bpsk_enabled == 0) ? 24:12;
 
     if (nrofSymbols == 4) {
@@ -895,7 +900,7 @@ void nr_uci_encoding(uint64_t payload,
     }
   }
 
-  if (fmt == pucch_format4_nr) {
+  if (fmt == 4) {
     E_init = (is_pi_over_2_bpsk_enabled == 0) ? 24:12;
 
     if (nrofSymbols == 4) {
@@ -953,28 +958,24 @@ void nr_uci_encoding(uint64_t payload,
 }
 //#if 0
 void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
-                        uint16_t crnti,
-			uint32_t dmrs_scrambling_id,
-			uint32_t data_scrambling_id,
                         int32_t **txdataF,
                         NR_DL_FRAME_PARMS *frame_parms,
-                        PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
-                        uint64_t payload,
                         int16_t amp,
                         int nr_slot_tx,
-                        uint8_t nrofSymbols,
-                        uint8_t startingSymbolIndex,
-                        uint8_t nrofPRB,
-                        uint16_t startingPRB,
-                        uint8_t nr_bit) {
+                        fapi_nr_ul_config_pucch_pdu *pucch_pdu) {
 #ifdef DEBUG_NR_PUCCH_TX
-  printf("\t [nr_generate_pucch2] start function at slot(nr_slot_tx)=%d  with payload=%lu and nr_bit=%d\n",nr_slot_tx, payload, nr_bit);
+  printf("\t [nr_generate_pucch2] start function at slot(nr_slot_tx)=%d  with payload=%lu and nr_bit=%d\n",nr_slot_tx, pucch_pdu->payload, pucch_pdu->n_bit);
 #endif
   // b is the block of bits transmitted on the physical channel after payload coding
   uint64_t b[16]; // limit to 1024-bit encoded length
   // M_bit is the number of bits of block b (payload after encoding)
   uint16_t M_bit;
-  nr_uci_encoding(payload,nr_bit,pucch_format2_nr,0,nrofSymbols,nrofPRB,1,0,0,&b[0],&M_bit);
+  nr_uci_encoding(pucch_pdu->payload,
+                  pucch_pdu->n_bit,
+                  2,0,
+                  pucch_pdu->nr_of_symbols,
+                  pucch_pdu->prb_size,
+                  1,0,0,&b[0],&M_bit);
   /*
    * Implementing TS 38.211
    * Subclauses 6.3.2.5.1 Scrambling (PUCCH format 2)
@@ -989,14 +990,14 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
    */
   uint8_t *btilde = malloc(sizeof(int8_t)*M_bit);
   // rnti is given by the C-RNTI
-  uint16_t rnti=crnti;
+  uint16_t rnti=pucch_pdu->rnti;
 #ifdef DEBUG_NR_PUCCH_TX
   printf("\t [nr_generate_pucch2] rnti = %d ,\n",rnti);
 #endif
   /*
    * Implementing TS 38.211 Subclause 6.3.2.5.1 scrambling format 2
    */
-  nr_pucch2_3_4_scrambling(M_bit,rnti,data_scrambling_id,&b[0],btilde);
+  nr_pucch2_3_4_scrambling(M_bit,rnti,pucch_pdu->data_scrambling_id,&b[0],btilde);
   /*
    * Implementing TS 38.211 Subclause 6.3.2.5.2 modulation format 2
    * btilde shall be modulated as described in subclause 5.1 using QPSK
@@ -1042,9 +1043,12 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
   uint32_t x1, x2, s=0;
   int i=0;
   int m=0;
+  uint8_t  startingSymbolIndex = pucch_pdu->start_symbol_index;
+  uint16_t startingPRB = pucch_pdu->prb_start + pucch_pdu->bwp_start;
 
-  for (int l=0; l<nrofSymbols; l++) {
-    x2 = (((1<<17)*((14*nr_slot_tx) + (l+startingSymbolIndex) + 1)*((2*dmrs_scrambling_id) + 1)) + (2*dmrs_scrambling_id))%(1U<<31); // c_init calculation according to TS38.211 subclause
+  for (int l=0; l<pucch_pdu->nr_of_symbols; l++) {
+    // c_init calculation according to TS38.211 subclause
+    x2 = (((1<<17)*((14*nr_slot_tx) + (l+startingSymbolIndex) + 1)*((2*pucch_pdu->dmrs_scrambling_id) + 1)) + (2*pucch_pdu->dmrs_scrambling_id))%(1U<<31); 
 
     int reset = 1;
     for (int ii=0; ii<=(startingPRB>>2); ii++) {
@@ -1052,7 +1056,7 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
       reset = 0;
     }
     m = 0;
-    for (int rb=0; rb<nrofPRB; rb++) {
+    for (int rb=0; rb<pucch_pdu->prb_size; rb++) {
       //startingPRB = startingPRB + rb;
       if (((rb+startingPRB) <  (frame_parms->N_RB_DL>>1)) && ((frame_parms->N_RB_DL & 1) == 0)) { // if number RBs in bandwidth is even and current PRB is lower band
         re_offset = ((l+startingSymbolIndex)*frame_parms->ofdm_symbol_size) + (12*(rb+startingPRB)) + frame_parms->first_carrier_offset;
@@ -1124,52 +1128,53 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
 }
 //#if 0
 void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
-                          uint16_t crnti,
                           int32_t **txdataF,
                           NR_DL_FRAME_PARMS *frame_parms,
-                          pucch_format_nr_t fmt,
-                          PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
-                          uint64_t payload,
                           int16_t amp,
                           int nr_slot_tx,
-                          uint8_t nrofSymbols,
-                          uint8_t startingSymbolIndex,
-                          uint8_t nrofPRB,
-                          uint16_t startingPRB,
-                          uint16_t startingPRB_intraSlotHopping,
-                          uint8_t nr_bit,
-                          uint8_t occ_length_format4,
-                          uint8_t occ_index_format4) {
+                          fapi_nr_ul_config_pucch_pdu *pucch_pdu) {
 #ifdef DEBUG_NR_PUCCH_TX
-  printf("\t [nr_generate_pucch3_4] start function at slot(nr_slot_tx)=%d with payload=%lu and nr_bit=%d\n", nr_slot_tx, payload, nr_bit);
+  printf("\t [nr_generate_pucch3_4] start function at slot(nr_slot_tx)=%d with payload=%lu and nr_bit=%d\n", nr_slot_tx, pucch_pdu->payload, pucch_pdu->n_bit);
 #endif
   // b is the block of bits transmitted on the physical channel after payload coding
   uint64_t b[16];
   // M_bit is the number of bits of block b (payload after encoding)
   uint16_t M_bit;
   // parameter PUCCH-F4-preDFT-OCC-length set of {2,4} -> to use table -1 or -2
-  uint8_t n_SF_PUCCH_s = 2; // in format 4, n_SF_PUCCH_s = {2,4}, provided by higher layer parameter PUCCH-F4-preDFT-OCC-length (in format 3 n_SF_PUCCH_s=1), FIXME!!!
-  uint8_t is_pi_over_2_bpsk_enabled = 0; // this value has to be provided by higher layers parameter
+  // in format 4, n_SF_PUCCH_s = {2,4}, provided by higher layer parameter PUCCH-F4-preDFT-OCC-length (in format 3 n_SF_PUCCH_s=1)
+  uint8_t n_SF_PUCCH_s;
+  if (pucch_pdu->format_type == 3)
+    n_SF_PUCCH_s = 1;
+  else
+    n_SF_PUCCH_s = pucch_pdu->pre_dft_occ_len;
+  uint8_t is_pi_over_2_bpsk_enabled = pucch_pdu->pi_2bpsk;
   // Intra-slot frequency hopping shall be assumed when the higher-layer parameter intraSlotFrequencyHopping is provided,
   // regardless of whether the frequency-hop distance is zero or not,
   // otherwise no intra-slot frequency hopping shall be assumed
   //uint8_t PUCCH_Frequency_Hopping = 0 ; // from higher layers
   uint8_t intraSlotFrequencyHopping = 0;
 
-  if (startingPRB != startingPRB_intraSlotHopping) {
+  if (pucch_pdu->freq_hop_flag) {
     intraSlotFrequencyHopping=1;
 #ifdef DEBUG_NR_PUCCH_TX
     printf("\t [nr_generate_pucch3_4] intraSlotFrequencyHopping=%d \n",intraSlotFrequencyHopping);
 #endif
   }
 
-  // add_dmrs indicates if we are using or not Additional DM-RS for formats 3 and 4. From higher layers. FIXME!!!
-  uint8_t add_dmrs = 0;
-
-  //nrofPRB = 2; // only for test purposes
-  if (fmt == pucch_format4_nr) nrofPRB = 1;
-
-  nr_uci_encoding(payload,nr_bit,fmt,is_pi_over_2_bpsk_enabled,nrofSymbols,nrofPRB,n_SF_PUCCH_s,intraSlotFrequencyHopping,add_dmrs,&b[0],&M_bit);
+  uint8_t nrofSymbols = pucch_pdu->nr_of_symbols;
+  uint16_t nrofPRB = pucch_pdu->prb_size;
+  uint16_t startingPRB = pucch_pdu->prb_start + pucch_pdu->bwp_start;
+  uint8_t add_dmrs = pucch_pdu->add_dmrs_flag;
+
+  nr_uci_encoding(pucch_pdu->payload,
+                  pucch_pdu->n_bit,
+                  pucch_pdu->format_type,
+                  is_pi_over_2_bpsk_enabled,
+                  nrofSymbols,nrofPRB,
+                  n_SF_PUCCH_s,
+                  intraSlotFrequencyHopping,
+                  add_dmrs,
+                  &b[0],&M_bit);
   /*
    * Implementing TS 38.211
    * Subclauses 6.3.2.6.1 Scrambling (PUCCH formats 3 and 4)
@@ -1184,7 +1189,7 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
    */
   uint8_t *btilde = malloc(sizeof(int8_t)*M_bit);
   // rnti is given by the C-RNTI
-  uint16_t rnti=crnti, n_id=0;
+  uint16_t rnti=pucch_pdu->rnti, n_id=0;
 #ifdef DEBUG_NR_PUCCH_TX
   printf("\t [nr_generate_pucch3_4] rnti = %d ,\n",rnti);
 #endif
@@ -1300,12 +1305,11 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
     {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
     {0, 0, 0, 1, 1, 1, 0, 0, 0,-1,-1,-1}
   };
-  //uint8_t occ_Length = occ_length_format4; // higher layer parameter occ-Length
-  uint8_t occ_Index  = occ_index_format4;  // higher layer parameter occ-Index
+
+  uint8_t occ_Index  = pucch_pdu->pre_dft_occ_idx;  // higher layer parameter occ-Index
 
   //occ_Index = 1; //only for testing purposes; to be removed FIXME!!!
-  if (fmt == pucch_format3_nr) { // no block-wise spreading for format 3
-    n_SF_PUCCH_s = 1;
+  if (pucch_pdu->format_type == 3) { // no block-wise spreading for format 3
 
     for (int l=0; l < floor(m_symbol/(12*nrofPRB)); l++) {
       for (int k=0; k < (12*nrofPRB); k++) {
@@ -1319,7 +1323,7 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
     }
   }
 
-  if (fmt == pucch_format4_nr) {
+  if (pucch_pdu->format_type == 4) {
     nrofPRB = 1;
 
     for (int l=0; l < floor((n_SF_PUCCH_s*m_symbol)/(12*nrofPRB)); l++) {
@@ -1414,9 +1418,9 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
   uint8_t m0;
   uint8_t mcs=0;
 
-  if (fmt == pucch_format3_nr) m0 = 0;
+  if (pucch_pdu->format_type == 3) m0 = 0;
 
-  if (fmt == pucch_format4_nr) {
+  if (pucch_pdu->format_type == 4) {
     if (n_SF_PUCCH_s == 2) {
       m0 = (occ_Index == 0) ? 0 : 6;
     }
@@ -1456,7 +1460,8 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
   for (int l=0; l<nrofSymbols; l++) {
     if ((intraSlotFrequencyHopping == 1) && (l >= (int)floor(nrofSymbols/2))) n_hop = 1; // n_hop = 1 for second hop
 
-    nr_group_sequence_hopping(ue->pucch_config_common_nr->pucch_GroupHopping,ue->pucch_config_common_nr->hoppingId,n_hop,nr_slot_tx,&u,&v); // calculating u and v value
+    pucch_GroupHopping_t pucch_GroupHopping = pucch_pdu->group_hop_flag + (pucch_pdu->sequence_hop_flag<<1);
+    nr_group_sequence_hopping(pucch_GroupHopping,pucch_pdu->hopping_id,n_hop,nr_slot_tx,&u,&v); // calculating u and v value
 
     // Next we proceed to calculate base sequence for DM-RS signal, according to TS 38.211 subclause 6.4.1.33
     if (nrofPRB >= 3) { // TS 38.211 subclause 5.2.2.1 (Base sequences of length 36 or larger) applies
@@ -1501,12 +1506,13 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
       }
     }
 
+    uint8_t  startingSymbolIndex = pucch_pdu->start_symbol_index;
     uint16_t j=0;
-    alpha = nr_cyclic_shift_hopping(ue->pucch_config_common_nr->hoppingId,m0,mcs,l,startingSymbolIndex,nr_slot_tx);
+    alpha = nr_cyclic_shift_hopping(pucch_pdu->hopping_id,m0,mcs,l,startingSymbolIndex,nr_slot_tx);
 
     for (int rb=0; rb<nrofPRB; rb++) {
       if ((intraSlotFrequencyHopping == 1) && (l<floor(nrofSymbols/2))) { // intra-slot hopping enabled, we need to calculate new offset PRB
-        startingPRB = startingPRB + startingPRB_intraSlotHopping;
+        startingPRB = startingPRB + pucch_pdu->second_hop_prb;
       }
 
       //startingPRB = startingPRB + rb;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h
index 665dec244370cfb1cb7673c56a7eadd1efc35fb8..dcf7fb4a37eab55559ed4fbf6219242511ce30bd 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h
@@ -49,65 +49,30 @@
 void nr_generate_pucch0(PHY_VARS_NR_UE *ue,
                         int32_t **txdataF,
                         NR_DL_FRAME_PARMS *frame_parms,
-                        long pucch_GroupHopping,
-                        long hoppingId,
                         int16_t amp,
                         int nr_slot_tx,
-                        uint8_t m0,
-			                  uint8_t mcs,
-                        uint8_t nrofSymbols,
-                        uint8_t startingSymbolIndex,
-                        uint16_t startingPRB,
-			                  uint16_t secondHopPRB);
+                        fapi_nr_ul_config_pucch_pdu *pucch_pdu);
 
 void nr_generate_pucch1(PHY_VARS_NR_UE *ue,
                         int32_t **txdataF,
                         NR_DL_FRAME_PARMS *frame_parms,
-                        PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
-                        uint64_t payload,
                         int16_t amp,
                         int nr_slot_tx,
-                        uint8_t m0,
-                        uint8_t nrofSymbols,
-                        uint8_t startingSymbolIndex,
-                        uint16_t startingPRB,
-                        uint16_t startingPRB_intraSlotHopping,
-                        uint8_t timeDomainOCC,
-                        uint8_t nr_bit);
+                        fapi_nr_ul_config_pucch_pdu *pucch_pdu);
 
 void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
-                        uint16_t crnti,
-			                  uint32_t dmrs_scrambling_id,
-			                  uint32_t data_scrambling_id,
                         int32_t **txdataF,
                         NR_DL_FRAME_PARMS *frame_parms,
-                        PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
-                        uint64_t payload,
                         int16_t amp,
                         int nr_slot_tx,
-                        uint8_t nrofSymbols,
-                        uint8_t startingSymbolIndex,
-                        uint8_t nrofPRB,
-                        uint16_t startingPRB,
-                        uint8_t nr_bit);
+                        fapi_nr_ul_config_pucch_pdu *pucch_pdu);
 
 void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
-                          uint16_t crnti,
                           int32_t **txdataF,
                           NR_DL_FRAME_PARMS *frame_parms,
-                          pucch_format_nr_t fmt,
-                          PUCCH_CONFIG_DEDICATED *pucch_config_dedicated,
-                          uint64_t payload,
                           int16_t amp,
                           int nr_slot_tx,
-                          uint8_t nrofSymbols,
-                          uint8_t startingSymbolIndex,
-                          uint8_t nrofPRB,
-                          uint16_t startingPRB,
-                          uint16_t startingPRB_intraSlotHopping,
-                          uint8_t nr_bit,
-                          uint8_t occ_length_format4,
-                          uint8_t occ_index_format4);
+                          fapi_nr_ul_config_pucch_pdu *pucch_pdu);
 
 // tables for mcs values for different payloads 
  static const uint8_t table1_mcs[]={0,6,3,9};
diff --git a/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c
index 66296910fc419f2610a13de455d3ffee93aa6648..9339f3974d4cdb31cb01c12ad35e655cc3aebd89 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/sss_nr.c
@@ -318,7 +318,7 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
                           int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
                           int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR],
                           uint8_t doPss, uint8_t doSss,
-					      uint8_t subframe) // add flag to indicate extracting only PSS, only SSS, or both
+                          uint8_t subframe) // add flag to indicate extracting only PSS, only SSS, or both
 {
   uint8_t aarx;
   int32_t *pss_rxF,*pss_rxF_ext;
@@ -329,8 +329,8 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
 
   for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
 
-  pss_symbol = 0;
-  sss_symbol = SSS_SYMBOL_NB-PSS_SYMBOL_NB;
+    pss_symbol = 0;
+    sss_symbol = SSS_SYMBOL_NB-PSS_SYMBOL_NB;
 
     rxdataF  =  ue->common_vars.common_vars_rx_data_per_thread[proc->thread_id].rxdataF;
 
@@ -343,6 +343,7 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
     sss_rxF_ext = &sss_ext[aarx][0];
 
     unsigned int k = frame_parms->first_carrier_offset + frame_parms->ssb_start_subcarrier + 56;
+
     if (k>= frame_parms->ofdm_symbol_size) k-=frame_parms->ofdm_symbol_size;
 
     for (int i=0; i < LENGTH_PSS_NR; i++) {
@@ -401,7 +402,7 @@ int pss_sss_extract_nr(PHY_VARS_NR_UE *phy_vars_ue,
                        UE_nr_rxtx_proc_t *proc,
                        int32_t pss_ext[NB_ANTENNAS_RX][LENGTH_PSS_NR],
                        int32_t sss_ext[NB_ANTENNAS_RX][LENGTH_SSS_NR],
-					   uint8_t subframe)
+                       uint8_t subframe)
 {
   return do_pss_sss_extract_nr(phy_vars_ue, proc, pss_ext, sss_ext, 1 /* doPss */, 1 /* doSss */, subframe);
 }
diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c
index c8401495070b294be0368aff4bfa1a80e21408cc..fc1fa4c297c5b5bafb244194cecd554ee093b69a 100644
--- a/openair1/PHY/TOOLS/nr_phy_scope.c
+++ b/openair1/PHY/TOOLS/nr_phy_scope.c
@@ -894,7 +894,7 @@ void phy_scope_nrUE(OAI_phy_scope_t *form,
 static void *nrUEscopeThread(void *arg) {
   PHY_VARS_NR_UE *ue=(PHY_VARS_NR_UE *)arg;
   size_t stksize;
-  pthread_attr_t atr;
+  pthread_attr_t atr={0};
   pthread_attr_getstacksize(&atr, &stksize);
   pthread_attr_setstacksize(&atr,32*1024*1024 );
   int fl_argc=1;
diff --git a/openair1/PHY/TOOLS/signal_energy.c b/openair1/PHY/TOOLS/signal_energy.c
index f3dea58374486f106177ea413c77a15cbf7782f7..96ee211285bef6569a68737f2a409e4bcc0fcb4d 100644
--- a/openair1/PHY/TOOLS/signal_energy.c
+++ b/openair1/PHY/TOOLS/signal_energy.c
@@ -264,7 +264,7 @@ double signal_energy_fp(double *s_re[2],double *s_im[2],uint32_t nb_antennas,uin
   return(V/length/nb_antennas);
 }
 
-double signal_energy_fp2(struct complex *s,uint32_t length)
+double signal_energy_fp2(struct complexd *s,uint32_t length)
 {
 
   int32_t i;
@@ -273,7 +273,7 @@ double signal_energy_fp2(struct complex *s,uint32_t length)
   for (i=0; i<length; i++) {
     //    printf("signal_energy_fp2 : %f,%f => %f\n",s[i].x,s[i].y,V);
     //      V= V + (s[i].y*s[i].x) + (s[i].y*s[i].x);
-    V= V + (s[i].x*s[i].x) + (s[i].y*s[i].y);
+    V= V + (s[i].r*s[i].r) + (s[i].i*s[i].i);
   }
 
   return(V/length);
diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h
index 4c68c15cb68fb60ee351c9cad227fb0ca63adef4..966e93440e9b017752734da7f4b4cc9398dc5019 100644
--- a/openair1/PHY/TOOLS/tools_defs.h
+++ b/openair1/PHY/TOOLS/tools_defs.h
@@ -39,11 +39,6 @@ extern "C" {
 #define CEILIDIV(a,b) ((a+b-1)/b)
 #define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
 
-struct complex {
-  double x;
-  double y;
-};
-
 struct complexd {
   double r;
   double i;
@@ -468,7 +463,7 @@ double signal_energy_fp(double *s_re[2], double *s_im[2], uint32_t nb_antennas,
 /*!\fn double signal_energy_fp2(struct complex *, uint32_t);
 \brief Computes the signal energy per subcarrier
 */
-double signal_energy_fp2(struct complex *s, uint32_t length);
+double signal_energy_fp2(struct complexd *s, uint32_t length);
 
 
 int32_t iSqrt(int32_t value);
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index c88bcf1c184494d9d49d34bed597336c7395f26a..11bb54a720a4ba4b7a61b7e6f649551d6cf78790 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -815,6 +815,8 @@ typedef struct PHY_VARS_gNB_s {
 
   uint32_t max_peak_val;
 
+  /// OFDM symbol offset divisor for UL
+  uint32_t ofdm_offset_divisor;
   /// \brief sinr for all subcarriers of the current link (used only for abstraction).
   /// first index: ? [0..N_RB_DL*12[
   double *sinr_dB;
@@ -834,6 +836,8 @@ typedef struct PHY_VARS_gNB_s {
   int              **dl_precoder_SgNB[3];
   char             log2_maxp; /// holds the maximum channel/precoder coefficient
 
+  int  prb_interpolation;
+
   /// if ==0 enables phy only test mode
   int mac_enabled;
   /// counter to average prach energh over first 100 prach opportunities
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index bf9b88f025f47682545ce1f3e29c7f6cd67db97d..33322bccb233bf98c2197b5d36bfba6bc03464a2 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -235,6 +235,11 @@ typedef struct {
   int32_t *txdataF_layers[NR_MAX_NB_LAYERS];
   } NR_UE_PUSCH;
 
+typedef struct {
+  bool active[2];
+  fapi_nr_ul_config_pucch_pdu pucch_pdu[2];
+  } NR_UE_PUCCH;
+
 typedef struct {
   /// \brief Holds the transmit data in time domain.
   /// For IFFT_FPGA this points to the same memory as PHY_vars->tx_vars[a].TX_DMA_BUFFER.
@@ -634,6 +639,9 @@ typedef struct {
   uint8_t agregationLevel;
   int nb_search_space;
   fapi_nr_dl_config_dci_dl_pdu_rel15_t pdcch_config[FAPI_NR_MAX_SS_PER_CORESET];
+  // frame and slot for sib1 in initial sync
+  uint16_t sfn;
+  uint16_t slot;
   /*
 #ifdef NR_PDCCH_DEFS_NR_UE
   int nb_searchSpaces;
@@ -761,8 +769,6 @@ typedef struct {
   int UE_fo_compensation;
   /// \brief Indicator that UE is synchronized to a gNB
   int is_synchronized;
-  /// \brief Indicates on which frame is synchronized in a two frame synchronization
-  int is_synchronized_on_frame;
   /// \brief Indicator that UE lost frame synchronization
   int lost_sync;
   /// Data structure for UE process scheduling
@@ -810,6 +816,7 @@ typedef struct {
   NR_UE_PDCCH     *pdcch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX];
   NR_UE_PRACH     *prach_vars[NUMBER_OF_CONNECTED_gNB_MAX];
   NR_UE_PUSCH     *pusch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX];
+  NR_UE_PUCCH     *pucch_vars[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX];
   NR_UE_DLSCH_t   *dlsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX][NR_MAX_NB_CODEWORDS]; // two RxTx Threads
   NR_UE_ULSCH_t   *ulsch[RX_NB_TH_MAX][NUMBER_OF_CONNECTED_gNB_MAX][NR_MAX_NB_CODEWORDS]; // two code words
   NR_UE_DLSCH_t   *dlsch_SI[NUMBER_OF_CONNECTED_gNB_MAX];
@@ -861,7 +868,9 @@ typedef struct {
 
 
   uint32_t perfect_ce;
-
+  // flag to activate PRB based averaging of channel estimates
+  // when off, defaults to frequency domain interpolation
+  int prb_interpolation;
   int generate_ul_signal[NUMBER_OF_CONNECTED_gNB_MAX];
 
   UE_NR_SCAN_INFO_t scan_info[NB_BANDS_MAX];
@@ -957,15 +966,10 @@ typedef struct {
   /// PUSCH contention-based access vars
   PUSCH_CA_CONFIG_DEDICATED  pusch_ca_config_dedicated[NUMBER_OF_eNB_MAX]; // lola
 
-  /// PUCCH variables
-
-  PUCCH_CONFIG_DEDICATED pucch_config_dedicated[NUMBER_OF_CONNECTED_gNB_MAX];
 
   //#if defined(UPGRADE_RAT_NR)
 #if 1
   SystemInformationBlockType1_nr_t systemInformationBlockType1_nr;
-  PUCCH_ConfigCommon_nr_t    pucch_config_common_nr[NUMBER_OF_CONNECTED_gNB_MAX];
-  PUCCH_Config_t             pucch_config_dedicated_nr[NUMBER_OF_CONNECTED_gNB_MAX];
 #endif
 
   uint8_t ncs_cell[20][7];
@@ -1003,6 +1007,7 @@ typedef struct {
 
   time_stats_t ofdm_mod_stats;
   time_stats_t ulsch_encoding_stats;
+  time_stats_t ulsch_ldpc_encoding_stats;
   time_stats_t ulsch_modulation_stats;
   time_stats_t ulsch_segmentation_stats;
   time_stats_t ulsch_rate_matching_stats;
@@ -1068,6 +1073,7 @@ typedef struct {
 typedef struct nr_rxtx_thread_data_s {
   UE_nr_rxtx_proc_t proc;
   PHY_VARS_NR_UE    *UE;
+  NR_UE_SCHED_MODE_t ue_sched_mode;
   notifiedFIFO_t txFifo;
 }  nr_rxtx_thread_data_t;
 
diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h
index d333732d1fdbadb64e0a491e88177c493277e855..c385d323e3b51e4deddd9a9e5606d8f3c045e00b 100644
--- a/openair1/PHY/defs_nr_common.h
+++ b/openair1/PHY/defs_nr_common.h
@@ -234,8 +234,6 @@ typedef struct {
   int RA_PCMAX;
   /// Corresponding RA-RNTI for UL-grant
   uint16_t ra_RNTI;
-  /// Pointer to Msg3 payload for UL-grant
-  uint8_t *Msg3;
   /// Frame of last completed synch
   uint16_t sync_frame;
   /// Flag to indicate that prach is ready to start: it is enabled with an initial delay after the sync
@@ -331,6 +329,9 @@ struct NR_DL_FRAME_PARMS {
   /// sequence which is computed based on carrier frequency and numerology to rotate/derotate each OFDM symbol according to Section 5.3 in 38.211
   /// First dimension is for the direction of the link (0 DL, 1 UL)
   int16_t symbol_rotation[2][224*2];
+  /// sequence used to compensate the phase rotation due to timeshifted OFDM symbols
+  /// First dimenstion is for different CP lengths
+  int16_t timeshift_symbol_rotation[4096*2] __attribute__ ((aligned (16)));
   /// shift of pilot position in one RB
   uint8_t nushift;
   /// SRS configuration from TS 38.331 RRC
@@ -364,6 +365,8 @@ struct NR_DL_FRAME_PARMS {
   uint8_t ssb_index;
   /// PBCH polar encoder params
   t_nrPolar_params pbch_polar_params;
+  /// OFDM symbol offset divisor for UL
+  uint32_t ofdm_offset_divisor;
 };
 
 
diff --git a/openair1/PHY/impl_defs_nr.h b/openair1/PHY/impl_defs_nr.h
index 93dbf513e85e0c1a944df3e3de4d8a1bbc5ed1f0..59d82166790b791a6d6128f85da00d0488f238e9 100644
--- a/openair1/PHY/impl_defs_nr.h
+++ b/openair1/PHY/impl_defs_nr.h
@@ -427,23 +427,10 @@ typedef struct {
 *
 ************************************************************************/
 
-#define MAX_NR_OF_PUCCH_P0_PER_SET                (8)
 #define NUMBER_PUCCH_FORMAT_NR                    (5)
 
 typedef int8_t power_level_t;      /* INTEGER (-16..15) */
 
-typedef struct {
-  uint8_t         p0_PUCCH_Id;     /* INTEGER (1..8)     */
-  power_level_t   p0_PUCCH_Value;
-} P0_PUCCH_t;
-
-typedef struct {
-  power_level_t deltaF_PUCCH_f[NUMBER_PUCCH_FORMAT_NR];
-  P0_PUCCH_t    *p0_Set[MAX_NR_OF_PUCCH_P0_PER_SET];
-  // pathlossReferenceRSs        SEQUENCE (SIZE (1..maxNrofPUCCH-PathlossReferenceRSs)) OF PUCCH-PathlossReferenceRS OPTIONAL, -- Need M
-  int8_t        twoPUCCH_PC_AdjustmentStates;
-
-} PUCCH_PowerControl_t;
 
 /***********************************************************************
 *
@@ -633,9 +620,10 @@ typedef struct {
   PUCCH_FormatConfig_t   *formatConfig[NUMBER_PUCCH_FORMAT_NR-1];   /* format 0 is not there */
   uint8_t                dl_DataToUL_ACK[NB_DL_DATA_TO_UL_ACK];     /* table TS 38.213 Table 9.2.3-1: Mapping of PSDCH-to-HARQ_feedback timing indicator field values to numbers of slots */
   void                   *spatial_Relation_Info[MAX_NR_OF_SPATIAL_RELATION_INFOS];
-  PUCCH_PowerControl_t   pucch_PowerControl;
 } PUCCH_Config_t;
 
+
+
 /***********************************************************************
 *
 * FUNCTIONALITY    :  Scheduling Request Configuration (SR)
diff --git a/openair1/PHY/types.h b/openair1/PHY/types.h
index c0a9af388cfcc02643e118851719e05364c60570..8d8d9db2de5c38e912327050f67cbcd79ddd7c94 100644
--- a/openair1/PHY/types.h
+++ b/openair1/PHY/types.h
@@ -23,6 +23,6 @@
 #define __openair_TYPES_H__
 
 #include <stdint.h>
-
+#define MAKE_VERSION(a,b,c) ((a)*256+(b)*16+c)
 
 #endif /*__openair_TYPES_H__ */
diff --git a/openair1/SCHED/fapi_l1.h b/openair1/SCHED/fapi_l1.h
index b8f0ae1dd89a96f8b5b6b6d688c0852b57f806ce..60ef5e764a4c40ef4415e91f45b3b2cc5f630ed0 100644
--- a/openair1/SCHED/fapi_l1.h
+++ b/openair1/SCHED/fapi_l1.h
@@ -61,6 +61,8 @@ void handle_nfapi_ul_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
 			 nfapi_ul_config_request_pdu_t *ul_config_pdu,
 			 uint16_t frame,uint8_t subframe,uint8_t srs_present);
 
+void handle_nfapi_hi_dci0_dci_pdu(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t *proc,
+                                  nfapi_hi_dci0_request_pdu_t *hi_dci0_config_pdu);
 void handle_ulsch_harq_pdu(
         PHY_VARS_eNB                           *eNB,
         int                                     UE_id,
@@ -68,7 +70,9 @@ void handle_ulsch_harq_pdu(
         nfapi_ul_config_ulsch_harq_information *harq_information,
         uint16_t                                frame,
         uint8_t                                 subframe);
-
+void handle_nfapi_bch_pdu(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,
+                          nfapi_dl_config_request_pdu_t *dl_config_pdu,
+                          uint8_t *sdu) ;
 void handle_ulsch_cqi_ri_pdu(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_request_pdu_t *ul_config_pdu,uint16_t frame,uint8_t subframe);
 
 void handle_uci_harq_information(PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci,nfapi_ul_config_harq_information *harq_information);
diff --git a/openair1/SCHED/nfapi_lte_dummy.c b/openair1/SCHED/nfapi_lte_dummy.c
index 9562e2de30ca6b7e7266888e31fabed83b6c664a..7d1e7e76843e02f791238f474d8373167e4eca86 100644
--- a/openair1/SCHED/nfapi_lte_dummy.c
+++ b/openair1/SCHED/nfapi_lte_dummy.c
@@ -17,6 +17,10 @@ void handle_nr_nfapi_pdsch_pdu(PHY_VARS_gNB *gNB,int frame,int slot,
                             nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
                             uint8_t *sdu){
                             }
+void handle_nfapi_nr_csirs_pdu(PHY_VARS_gNB *gNB,
+			       int frame, int slot,
+			       nfapi_nr_dl_tti_csi_rs_pdu *csirs_pdu){
+                    }                           
 int l1_north_init_gNB(void){return 0;}
 
 uint8_t slot_ahead=6;
diff --git a/openair1/SCHED/nfapi_nr_dummy.c b/openair1/SCHED/nfapi_nr_dummy.c
index db20017fb81e828e50c9ae8754f941301b2c2bc5..1286a4e48a270c15e13a4c3b6153732bd3fe8b08 100644
--- a/openair1/SCHED/nfapi_nr_dummy.c
+++ b/openair1/SCHED/nfapi_nr_dummy.c
@@ -17,6 +17,10 @@ void handle_nr_nfapi_pdsch_pdu(PHY_VARS_gNB *gNB,int frame,int slot,
                             nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
                             uint8_t *sdu){
                             }
+void handle_nfapi_nr_csirs_pdu(PHY_VARS_gNB *gNB,
+			       int frame, int slot,
+			       nfapi_nr_dl_tti_csi_rs_pdu *csirs_pdu){
+                    }
 int l1_north_init_gNB(void){return 0;}
 
 uint8_t slot_ahead=6;
diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c
index 73d1c1313233d252e735d214c6232ea62fc168ca..e37248e96fec2f166ca58a6478fe4496eabefb8d 100644
--- a/openair1/SCHED_NR/fapi_nr_l1.c
+++ b/openair1/SCHED_NR/fapi_nr_l1.c
@@ -155,70 +155,63 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
   uint8_t number_dl_pdu             = (DL_req==NULL) ? 0 : DL_req->dl_tti_request_body.nPDUs;
   uint8_t number_ul_dci_pdu         = (UL_dci_req==NULL) ? 0 : UL_dci_req->numPdus;
   uint8_t number_ul_tti_pdu         = (UL_tti_req==NULL) ? 0 : UL_tti_req->n_pdus;
+  uint8_t number_tx_data_pdu        = (TX_req == NULL) ? 0 : TX_req->Number_of_PDUs;
+
+  if (NFAPI_MODE == NFAPI_MONOLITHIC) {
+    if (DL_req != NULL && TX_req!=NULL)
+      LOG_D(PHY,"NFAPI: Sched_INFO:SFN/SLOT:%04d/%d DL_req:SFN/SLO:%04d/%d:dl_pdu:%d tx_req:SFN/SLOT:%04d/%d:pdus:%d;ul_dci %d ul_tti %d\n",
+      frame,slot,
+      DL_req->SFN,DL_req->Slot,number_dl_pdu,
+      TX_req->SFN,TX_req->Slot,TX_req->Number_of_PDUs,
+      number_ul_dci_pdu,number_ul_tti_pdu);
+
+    int pdcch_received=0;
+    msgTx->num_pdsch_slot=0;
+    msgTx->pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
+    msgTx->ul_pdcch_pdu.pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
+    msgTx->slot = slot;
+    msgTx->frame = frame;
+
+    for (int i=0;i<number_dl_pdu;i++) {
+      nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdu = &DL_req->dl_tti_request_body.dl_tti_pdu_list[i];
+      LOG_D(PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_tti_pdu->PDUType);
+      switch (dl_tti_pdu->PDUType) {
+        case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
+          handle_nr_nfapi_ssb_pdu(msgTx,frame,slot,
+                                  dl_tti_pdu);
+          break;
 
-  if (DL_req != NULL && TX_req!=NULL)
-    LOG_D(PHY,"NFAPI: Sched_INFO:SFN/SLOT:%04d/%d DL_req:SFN/SLO:%04d/%d:dl_pdu:%d tx_req:SFN/SLOT:%04d/%d:pdus:%d;ul_dci %d ul_tti %d\n",
-	  frame,slot,
-	  DL_req->SFN,DL_req->Slot,number_dl_pdu,
-	  TX_req->SFN,TX_req->Slot,TX_req->Number_of_PDUs,
-	  number_ul_dci_pdu,number_ul_tti_pdu);
-
-  int pdcch_received=0;
-  msgTx->num_pdsch_slot=0;
-  msgTx->pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
-  msgTx->ul_pdcch_pdu.pdcch_pdu.pdcch_pdu_rel15.numDlDci = 0;
-  msgTx->slot = slot;
-  msgTx->frame = frame;
-
-  for (int i=0;i<number_dl_pdu;i++) {
-    nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdu = &DL_req->dl_tti_request_body.dl_tti_pdu_list[i];
-    LOG_D(PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_tti_pdu->PDUType);
-    switch (dl_tti_pdu->PDUType) {
-      case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
-
-        if(NFAPI_MODE != NFAPI_MODE_VNF)
-        handle_nr_nfapi_ssb_pdu(msgTx,frame,slot,
-                                dl_tti_pdu);
-
-      break;
-
-      case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
-	AssertFatal(pdcch_received == 0, "pdcch_received is not 0, we can only handle one PDCCH PDU per slot\n");
-        if(NFAPI_MODE != NFAPI_MODE_VNF)
+        case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
+          AssertFatal(pdcch_received == 0, "pdcch_received is not 0, we can only handle one PDCCH PDU per slot\n");
           msgTx->pdcch_pdu = dl_tti_pdu->pdcch_pdu;
- 
-        pdcch_received = 1;
+   
+          pdcch_received = 1;
+          break;
 
-      break;
-      case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
-        LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot);
-        handle_nfapi_nr_csirs_pdu(msgTx,frame,slot,
-				  &dl_tti_pdu->csi_rs_pdu);
-      break;
-      case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
-
-      {
-        LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot);
-        nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdu->pdsch_pdu.pdsch_pdu_rel15;
-        uint16_t pduIndex = pdsch_pdu_rel15->pduIndex;
-	AssertFatal(TX_req->pdu_list[pduIndex].num_TLV == 1, "TX_req->pdu_list[%d].num_TLV %d != 1\n",
-		    pduIndex,TX_req->pdu_list[pduIndex].num_TLV);
-        uint8_t *sdu = (uint8_t *)TX_req->pdu_list[pduIndex].TLVs[0].value.direct;
-        if(NFAPI_MODE != NFAPI_MODE_VNF)
-        AssertFatal(msgTx->num_pdsch_slot < gNB->number_of_nr_dlsch_max,
-                    "Number of PDSCH PDUs %d exceeded the limit %d\n",msgTx->num_pdsch_slot,gNB->number_of_nr_dlsch_max);
-        handle_nr_nfapi_pdsch_pdu(msgTx,&dl_tti_pdu->pdsch_pdu, sdu);
+        case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
+          LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot);
+          handle_nfapi_nr_csirs_pdu(msgTx,frame,slot,
+            &dl_tti_pdu->csi_rs_pdu);
+          break;
+
+        case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
+          LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot);
+          nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdu->pdsch_pdu.pdsch_pdu_rel15;
+          uint16_t pduIndex = pdsch_pdu_rel15->pduIndex;
+          AssertFatal(TX_req->pdu_list[pduIndex].num_TLV == 1, "TX_req->pdu_list[%d].num_TLV %d != 1\n",
+          pduIndex,TX_req->pdu_list[pduIndex].num_TLV);
+          uint8_t *sdu = (uint8_t *)TX_req->pdu_list[pduIndex].TLVs[0].value.direct;
+          AssertFatal(msgTx->num_pdsch_slot < gNB->number_of_nr_dlsch_max,"Number of PDSCH PDUs %d exceeded the limit %d\n",
+            msgTx->num_pdsch_slot,gNB->number_of_nr_dlsch_max);
+          handle_nr_nfapi_pdsch_pdu(msgTx,&dl_tti_pdu->pdsch_pdu, sdu);
       }
     }
-  }
 
-  if(NFAPI_MODE != NFAPI_MODE_VNF)
     if (number_ul_dci_pdu > 0)
       msgTx->ul_pdcch_pdu = UL_dci_req->ul_dci_pdu_list[number_ul_dci_pdu-1]; // copy the last pdu
 
-  pushNotifiedFIFO(gNB->resp_L1_tx,res);
+    pushNotifiedFIFO(gNB->resp_L1_tx,res);
 
-  if(NFAPI_MODE != NFAPI_MODE_VNF)
     for (int i = 0; i < number_ul_tti_pdu; i++) {
       switch (UL_tti_req->pdus_list[i].pdu_type) {
         case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
@@ -237,30 +230,22 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
           break;
       }
     }
-
-  if(NFAPI_MODE != NFAPI_MONOLITHIC && number_ul_tti_pdu>0)
-  {
-    oai_nfapi_ul_tti_req(UL_tti_req);
   }
-  
-  if (NFAPI_MODE != NFAPI_MONOLITHIC && Sched_INFO->UL_dci_req->numPdus!=0)
-  {
-    oai_nfapi_ul_dci_req(Sched_INFO->UL_dci_req);
-  } 
-  
-  if (NFAPI_MODE != NFAPI_MONOLITHIC) 
-  { 
-    if(Sched_INFO->DL_req->dl_tti_request_body.nPDUs>0)
-    {
-      Sched_INFO->DL_req->SFN = frame;
-      Sched_INFO->DL_req->Slot = slot;
-      oai_nfapi_dl_tti_req(Sched_INFO->DL_req);
-    }
-    if (Sched_INFO->TX_req->Number_of_PDUs > 0)
-    {
-      oai_nfapi_tx_data_req(Sched_INFO->TX_req);
-    }
+
+  if (NFAPI_MODE == NFAPI_MODE_VNF) { //If VNF, oai_nfapi functions send respective p7 msgs to PNF for which nPDUs is greater than 0
+
+    if(number_ul_tti_pdu>0)
+      oai_nfapi_ul_tti_req(UL_tti_req);
+
+    if (number_ul_dci_pdu>0)
+      oai_nfapi_ul_dci_req(UL_dci_req);
     
-  }
+    if (number_dl_pdu>0)
+      oai_nfapi_dl_tti_req(DL_req);
+
+    if (number_tx_data_pdu>0)
+      oai_nfapi_tx_data_req(TX_req);
 
+  } 
+  
 }
diff --git a/openair1/SCHED_NR/nr_prach_procedures.c b/openair1/SCHED_NR/nr_prach_procedures.c
index dfc5376ee7813d2aa6136ecc3bc25e0fd64bea41..cc51ce7fe3f594e84a3dc3892fbc7b572c10dca0 100644
--- a/openair1/SCHED_NR/nr_prach_procedures.c
+++ b/openair1/SCHED_NR/nr_prach_procedures.c
@@ -49,9 +49,6 @@
 
 extern uint8_t nfapi_mode;
 
-extern int oai_nfapi_nr_rach_ind(nfapi_rach_indication_t *rach_ind);
-
-
 void L1_nr_prach_procedures(PHY_VARS_gNB *gNB,int frame,int slot) {
 
   uint16_t max_preamble[4]={0},max_preamble_energy[4]={0},max_preamble_delay[4]={0};
diff --git a/openair1/SCHED_NR/nr_ru_procedures.c b/openair1/SCHED_NR/nr_ru_procedures.c
index 827e986f1b20c9e3bded717c95dc4811811ff523..eb0a4f8cdc3ee46145c7b7e3474d017716163cb0 100644
--- a/openair1/SCHED_NR/nr_ru_procedures.c
+++ b/openair1/SCHED_NR/nr_ru_procedures.c
@@ -119,6 +119,7 @@ void nr_feptx0(RU_t *ru,int tti_tx,int first_symbol, int num_symbols, int aa) {
                        fp->nb_prefix_samples,
                        CYCLIC_PREFIX);
           slot_offset += fp->nb_prefix_samples+fp->ofdm_symbol_size;
+          slot_offsetF += fp->ofdm_symbol_size;
         }
         else {
           PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF],
@@ -128,6 +129,7 @@ void nr_feptx0(RU_t *ru,int tti_tx,int first_symbol, int num_symbols, int aa) {
                        fp->nb_prefix_samples0,
                        CYCLIC_PREFIX);
           slot_offset += fp->nb_prefix_samples0+fp->ofdm_symbol_size;
+          slot_offsetF += fp->ofdm_symbol_size;
         }
       }
     }
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index b5e36fed72bc070f3572364464dbe76ad97638b7..95cb9a51fd3227e03f36c6dbe7eb62c03cfe772b 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -149,14 +149,13 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
   }
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_COMMON_TX,1);
-  if (NFAPI_MODE == NFAPI_MONOLITHIC || NFAPI_MODE == NFAPI_MODE_PNF) { 
-    for (int i=0; i<fp->Lmax; i++) {
-      if (msgTx->ssb[i].active) {
-        nr_common_signal_procedures(gNB,frame,slot,msgTx->ssb[i].ssb_pdu);
-        msgTx->ssb[i].active = false;
-      }
+  for (int i=0; i<fp->Lmax; i++) {
+    if (msgTx->ssb[i].active) {
+      nr_common_signal_procedures(gNB,frame,slot,msgTx->ssb[i].ssb_pdu);
+      msgTx->ssb[i].active = false;
     }
   }
+  
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_COMMON_TX,0);
 
   int num_dl_dci = msgTx->pdcch_pdu.pdcch_pdu_rel15.numDlDci;
@@ -372,7 +371,13 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH
 
   // scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
   uint16_t bw_scaling = 16 * gNB->frame_parms.ofdm_symbol_size / 2048;
-  timing_advance_update = sync_pos / bw_scaling;
+  int sync_pos_rounded;
+  // do some integer rounding to improve TA accuracy
+  if (sync_pos > 0)
+    sync_pos_rounded = sync_pos + (bw_scaling / 2) - 1;
+  else
+    sync_pos_rounded = sync_pos - (bw_scaling / 2) - 1;
+  timing_advance_update = sync_pos_rounded / bw_scaling;
 
   // put timing advance command in 0..63 range
   timing_advance_update += 31;
@@ -558,8 +563,8 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
     NR_gNB_PUCCH_t *pucch = gNB->pucch[i];
     if (pucch) {
       if ((pucch->active == 1) &&
-	       (pucch->frame == frame_rx) &&
-	       (pucch->slot == slot_rx) ) {
+          (pucch->frame == frame_rx) &&
+          (pucch->slot == slot_rx) ) {
 
         pucch_decode_done = 1;
 
@@ -580,7 +585,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
           LOG_D(PHY,"frame %d, slot %d: PUCCH signal energy %d\n",frame_rx,slot_rx,power_rxF);
 
           nr_decode_pucch0(gNB,
-	                         frame_rx,
+                           frame_rx,
                            slot_rx,
                            uci_pdu_format0,
                            pucch_pdu);
@@ -622,9 +627,9 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
         (ulsch->rnti > 0)) {
       // for for an active HARQ process
       for (harq_pid=0;harq_pid<NR_MAX_ULSCH_HARQ_PROCESSES;harq_pid++) {
-	      ulsch_harq = ulsch->harq_processes[harq_pid];
-    	  AssertFatal(ulsch_harq!=NULL,"harq_pid %d is not allocated\n",harq_pid);
-    	  if ((ulsch_harq->status == NR_ACTIVE) &&
+        ulsch_harq = ulsch->harq_processes[harq_pid];
+        AssertFatal(ulsch_harq!=NULL,"harq_pid %d is not allocated\n",harq_pid);
+        if ((ulsch_harq->status == NR_ACTIVE) &&
             (ulsch_harq->frame == frame_rx) &&
             (ulsch_harq->slot == slot_rx) &&
             (ulsch_harq->handled == 0)){
diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h
index 2675e46a04be92c5b7b449ebe007215cbbc7f9ad..7b4511e7f4236f7a4e67c90a288db37551827296 100644
--- a/openair1/SCHED_NR_UE/defs.h
+++ b/openair1/SCHED_NR_UE/defs.h
@@ -417,8 +417,28 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
                            uint8_t gNB_id,
                            PHY_VARS_NR_UE *ue,
                            NR_UE_DLSCH_t *dlsch0,
+                           NR_UE_DLSCH_t *dlsch1,
                            uint16_t n_pdus);
 
+bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
+                            UE_nr_rxtx_proc_t *proc,
+                            int gNB_id,
+                            PDSCH_t pdsch,
+                            NR_UE_DLSCH_t *dlsch0,
+                            NR_UE_DLSCH_t *dlsch1,
+                            int *dlsch_errors,
+                            uint8_t dlsch_parallel);
+
+int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
+                           UE_nr_rxtx_proc_t *proc,
+                           int eNB_id, PDSCH_t pdsch,
+                           NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t *dlsch1);
+
+int nr_ue_pdcch_procedures(uint8_t gNB_id,
+			   PHY_VARS_NR_UE *ue,
+			   UE_nr_rxtx_proc_t *proc,
+                           int n_ss);
+
 
 #endif
 
diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
index 99edbf9a40d0f7907cd531e886734b08284d313c..697f5b19d10f3b5e8effa4958a8ba5dfa854f80d 100644
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
@@ -47,6 +47,7 @@ const char *ul_pdu_type[]={"PRACH", "PUCCH", "PUSCH", "SRS"};
 
 int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
 
+  bool found = false;
   if(scheduled_response != NULL){
 
     module_id_t module_id = scheduled_response->module_id;
@@ -59,7 +60,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
     NR_UE_DLSCH_t *dlsch0 = NULL;
     NR_UE_PDCCH *pdcch_vars = PHY_vars_UE_g[module_id][cc_id]->pdcch_vars[thread_id][0];
     NR_UE_ULSCH_t *ulsch0 = PHY_vars_UE_g[module_id][cc_id]->ulsch[thread_id][0][0];
-    NR_DL_FRAME_PARMS frame_parms = PHY_vars_UE_g[module_id][cc_id]->frame_parms;
+    NR_UE_PUCCH *pucch_vars = PHY_vars_UE_g[module_id][cc_id]->pucch_vars[thread_id][0];
 
     if(scheduled_response->dl_config != NULL){
       fapi_nr_dl_config_request_t *dl_config = scheduled_response->dl_config;
@@ -69,13 +70,16 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
       for (i = 0; i < dl_config->number_pdus; ++i){
         AssertFatal(dl_config->number_pdus < FAPI_NR_DL_CONFIG_LIST_NUM,"dl_config->number_pdus %d out of bounds\n",dl_config->number_pdus);
         AssertFatal(dl_config->dl_config_list[i].pdu_type<=FAPI_NR_DL_CONFIG_TYPES,"pdu_type %d > 2\n",dl_config->dl_config_list[i].pdu_type);
-        LOG_D(PHY, "In %s: received 1 DL %s PDU of %d total DL PDUs:\n", __FUNCTION__, dl_pdu_type[dl_config->dl_config_list[i].pdu_type - 1], dl_config->number_pdus);
+        LOG_D(PHY, "In %s: frame %d slot %d received 1 DL %s PDU of %d total DL PDUs:\n",
+              __FUNCTION__, scheduled_response->frame, slot, dl_pdu_type[dl_config->dl_config_list[i].pdu_type - 1], dl_config->number_pdus);
 
         if (dl_config->dl_config_list[i].pdu_type == FAPI_NR_DL_CONFIG_TYPE_DCI) {
 
           fapi_nr_dl_config_dci_dl_pdu_rel15_t *pdcch_config = &dl_config->dl_config_list[i].dci_config_pdu.dci_config_rel15;
           memcpy((void*)&pdcch_vars->pdcch_config[pdcch_vars->nb_search_space],(void*)pdcch_config,sizeof(*pdcch_config));
           pdcch_vars->nb_search_space = pdcch_vars->nb_search_space + 1;
+          pdcch_vars->sfn = scheduled_response->frame;
+          pdcch_vars->slot = slot;
           LOG_D(PHY,"Number of DCI SearchSpaces %d\n",pdcch_vars->nb_search_space);
 
         } else {
@@ -118,26 +122,19 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
             dlsch0_harq->mcs = dlsch_config_pdu->mcs;
             dlsch0_harq->rvidx = dlsch_config_pdu->rv;
             dlsch0->g_pucch = dlsch_config_pdu->accumulated_delta_PUCCH;
-            dlsch0_harq->harq_ack.pucch_resource_indicator = dlsch_config_pdu->pucch_resource_id;
-            dlsch0_harq->harq_ack.slot_for_feedback_ack = (slot+dlsch_config_pdu->pdsch_to_harq_feedback_time_ind)%frame_parms.slots_per_frame;
-
             //get nrOfLayers from DCI info
             uint8_t Nl = 0;
             for (i = 0; i < 4; i++) {
               if (dlsch_config_pdu->dmrs_ports[i] >= i) Nl += 1;
             }
             dlsch0_harq->Nl = Nl;
-
             dlsch0_harq->mcs_table=dlsch_config_pdu->mcs_table;
-            dlsch0_harq->harq_ack.rx_status = downlink_harq_process(dlsch0_harq, dlsch0->current_harq_pid, dlsch_config_pdu->ndi, dlsch0->rnti_type);
+            downlink_harq_process(dlsch0_harq, dlsch0->current_harq_pid, dlsch_config_pdu->ndi, dlsch_config_pdu->rv, dlsch0->rnti_type);
             if (dlsch0_harq->status != ACTIVE) {
               // dlsch0_harq->status not ACTIVE may be due to false retransmission. Reset the 
               // following flag to skip PDSCH procedures in that case.
               dlsch0->active = 0;
-              dlsch0_harq->harq_ack.ack = 1;
-              dlsch0_harq->harq_ack.send_harq_status = 1;
             }
-            dlsch0_harq->harq_ack.vDAI_DL = dlsch_config_pdu->dai;
             /* PTRS */
             dlsch0_harq->PTRSFreqDensity = dlsch_config_pdu->PTRSFreqDensity;
             dlsch0_harq->PTRSTimeDensity = dlsch_config_pdu->PTRSTimeDensity;
@@ -145,7 +142,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
             dlsch0_harq->nEpreRatioOfPDSCHToPTRS = dlsch_config_pdu->nEpreRatioOfPDSCHToPTRS;
             dlsch0_harq->PTRSReOffset = dlsch_config_pdu->PTRSReOffset;
             dlsch0_harq->pduBitmap = dlsch_config_pdu->pduBitmap;
-            LOG_D(MAC, ">>>> \tdlsch0->g_pucch = %d\tdlsch0_harq.mcs = %d\tpdsch_to_harq_feedback_time_ind = %d\tslot_for_feedback_ack = %d\n", dlsch0->g_pucch, dlsch0_harq->mcs, dlsch_config_pdu->pdsch_to_harq_feedback_time_ind, dlsch0_harq->harq_ack.slot_for_feedback_ack);
+            LOG_D(MAC, ">>>> \tdlsch0->g_pucch = %d\tdlsch0_harq.mcs = %d\n", dlsch0->g_pucch, dlsch0_harq->mcs);
           }
         }
       }
@@ -161,7 +158,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
         AssertFatal(ul_config->ul_config_list[i].pdu_type <= FAPI_NR_UL_CONFIG_TYPES,"pdu_type %d out of bounds\n",ul_config->ul_config_list[i].pdu_type);
         LOG_D(PHY, "In %s: processing %s PDU of %d total UL PDUs (ul_config %p) \n", __FUNCTION__, ul_pdu_type[ul_config->ul_config_list[i].pdu_type - 1], ul_config->number_pdus, ul_config);
 
-        uint8_t pdu_type = ul_config->ul_config_list[i].pdu_type, pucch_resource_id, current_harq_pid, format, gNB_id = 0;
+        uint8_t pdu_type = ul_config->ul_config_list[i].pdu_type, current_harq_pid, gNB_id = 0;
         /* PRACH */
         //NR_PRACH_RESOURCES_t *prach_resources;
         fapi_nr_ul_config_prach_pdu *prach_config_pdu;
@@ -169,9 +166,6 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
         nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu;
         /* PUCCH */
         fapi_nr_ul_config_pucch_pdu *pucch_config_pdu;
-        PUCCH_ConfigCommon_nr_t *pucch_config_common_nr;
-        PUCCH_Config_t *pucch_config_dedicated_nr;
-        PUCCH_format_t *format_params;
 
         switch (pdu_type){
 
@@ -209,47 +203,19 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
         break;
 
         case (FAPI_NR_UL_CONFIG_TYPE_PUCCH):
-          // pucch config pdu
+          found = false;
           pucch_config_pdu = &ul_config->ul_config_list[i].pucch_config_pdu;
-          pucch_resource_id = 0; //FIXME!!!
-          format = 1; // FIXME!!!
-          pucch_config_common_nr = &PHY_vars_UE_g[module_id][cc_id]->pucch_config_common_nr[0];
-          pucch_config_dedicated_nr = &PHY_vars_UE_g[module_id][cc_id]->pucch_config_dedicated_nr[0];
-          format_params = &pucch_config_dedicated_nr->PUCCH_Resource[pucch_resource_id]->format_parameters;
-
-          format_params->initialCyclicShift = pucch_config_pdu->initialCyclicShift;
-          format_params->nrofSymbols = pucch_config_pdu->nrofSymbols;
-          format_params->startingSymbolIndex = pucch_config_pdu->startingSymbolIndex;
-          format_params->nrofPRBs = pucch_config_pdu->nrofPRBs;
-          format_params->timeDomainOCC = pucch_config_pdu->timeDomainOCC;
-          format_params->occ_length = pucch_config_pdu->occ_length;
-          format_params->occ_Index = pucch_config_pdu->occ_Index;
-
-          pucch_config_dedicated_nr->PUCCH_Resource[pucch_resource_id]->startingPRB = pucch_config_pdu->startingPRB;
-          pucch_config_dedicated_nr->PUCCH_Resource[pucch_resource_id]->intraSlotFrequencyHopping = pucch_config_pdu->intraSlotFrequencyHopping;
-          pucch_config_dedicated_nr->PUCCH_Resource[pucch_resource_id]->secondHopPRB = pucch_config_pdu->secondHopPRB; // Not sure this parameter is used
-          pucch_config_dedicated_nr->formatConfig[format - 1]->additionalDMRS = pucch_config_pdu->additionalDMRS; // At this point we need to know which format is going to be used
-          pucch_config_dedicated_nr->formatConfig[format - 1]->pi2PBSK = pucch_config_pdu->pi2PBSK;
-
-          pucch_config_common_nr->pucch_GroupHopping = pucch_config_pdu->pucch_GroupHopping;
-          pucch_config_common_nr->hoppingId = pucch_config_pdu->hoppingId;
-          pucch_config_common_nr->p0_nominal = pucch_config_pdu->p0_nominal;
-
-          /* pucch_config_dedicated->PUCCH_Resource[pucch_resource_id]->format_parameters.initialCyclicShift = pucch_config_pdu->initialCyclicShift;
-          pucch_config_dedicated->PUCCH_Resource[pucch_resource_id]->format_parameters.nrofSymbols = pucch_config_pdu->nrofSymbols;
-          pucch_config_dedicated->PUCCH_Resource[pucch_resource_id]->format_parameters.startingSymbolIndex = pucch_config_pdu->startingSymbolIndex;
-          pucch_config_dedicated->PUCCH_Resource[pucch_resource_id]->format_parameters.nrofPRBs = pucch_config_pdu->nrofPRBs;
-          pucch_config_dedicated->PUCCH_Resource[pucch_resource_id]->startingPRB = pucch_config_pdu->startingPRB;
-          pucch_config_dedicated->PUCCH_Resource[pucch_resource_id]->format_parameters.timeDomainOCC = pucch_config_pdu->timeDomainOCC;
-          pucch_config_dedicated->PUCCH_Resource[pucch_resource_id]->format_parameters.occ_length = pucch_config_pdu->occ_length;
-          pucch_config_dedicated->PUCCH_Resource[pucch_resource_id]->format_parameters.occ_Index = pucch_config_pdu->occ_Index;
-          pucch_config_dedicated->PUCCH_Resource[pucch_resource_id]->intraSlotFrequencyHopping = pucch_config_pdu->intraSlotFrequencyHopping;
-          pucch_config_dedicated->PUCCH_Resource[pucch_resource_id]->secondHopPRB = pucch_config_pdu->secondHopPRB; // Not sure this parameter is used
-          pucch_config_dedicated->formatConfig[format-1]->additionalDMRS = pucch_config_pdu->additionalDMRS; // At this point we need to know which format is going to be used
-          pucch_config_dedicated->formatConfig[format-1]->pi2PBSK = pucch_config_pdu->pi2PBSK;
-          pucch_config_common->pucch_GroupHopping = pucch_config_pdu->pucch_GroupHopping;
-          pucch_config_common->hoppingId = pucch_config_pdu->hoppingId;
-          pucch_config_common->p0_nominal = pucch_config_pdu->p0_nominal;*/
+          for(int j=0; j<2; j++) {
+            if(pucch_vars->active[j] == false) {
+              LOG_D(PHY,"%d.%d Copying pucch pdu to UE PHY\n",scheduled_response->frame,slot);
+              memcpy((void*)&(pucch_vars->pucch_pdu[j]), (void*)pucch_config_pdu, sizeof(fapi_nr_ul_config_pucch_pdu));
+              pucch_vars->active[j] = true;
+              found = true;
+              break;
+            }
+          }
+          if (!found)
+            LOG_E(PHY, "Couldn't find allocation for PUCCH PDU in PUCCH VARS\n");
         break;
 
         case (FAPI_NR_UL_CONFIG_TYPE_PRACH):
@@ -262,9 +228,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
         break;
         }
       }
-
       memset(ul_config, 0, sizeof(fapi_nr_ul_config_request_t));
-
     }
   }
   return 0;
diff --git a/openair1/SCHED_NR_UE/harq_nr.c b/openair1/SCHED_NR_UE/harq_nr.c
index 85f6d90bbedb3a62a07d7671289d5525dcbc24d1..7bc1f3053bafec50360e2ac01517ca87d6b757ef 100644
--- a/openair1/SCHED_NR_UE/harq_nr.c
+++ b/openair1/SCHED_NR_UE/harq_nr.c
@@ -98,43 +98,6 @@
 #define DL_DCI              (1)
 #define UL_DCI              (0)
 
-/*******************************************************************
-*
-* NAME :         get_dci_info_for_harq
-*
-* PARAMETERS :   pointer to ue context
-*                id of current gNB
-*                number of uplink processes
-*                maximum number of uplink retransmissions
-* RETURN :       none
-*
-* DESCRIPTION :  update HARQ entity with information from DCI
-*                TS 38.212 7.3.1.2 DCI formats for scheduling PDSCH
-*
-*********************************************************************/
-
-void get_dci_info_for_harq(PHY_VARS_NR_UE *ue, NR_DCI_INFO_EXTRACTED_t *nr_dci_info_extracted,
-		                   NR_UE_DLSCH_t **dlsch, NR_UE_ULSCH_t *ulsch, uint8_t slot, uint8_t tx_offset)
-{
-  if (nr_dci_info_extracted->identifier_dci_formats == DL_DCI) {
-
-	dlsch[0]->current_harq_pid = nr_dci_info_extracted->harq_process_number;
-
-	NR_DL_UE_HARQ_t *dl_harq = dlsch[0]->harq_processes[dlsch[0]->current_harq_pid];
-
-    dl_harq->harq_ack.vDAI_DL = nr_dci_info_extracted->dai+1;
-    dl_harq->harq_ack.pucch_resource_indicator = nr_dci_info_extracted->pucch_resource_ind;
-    dl_harq->harq_ack.slot_for_feedback_ack = (slot + nr_dci_info_extracted->pdsch_to_harq_feedback_time_ind)%ue->frame_parms.slots_per_subframe;
-    dl_harq->harq_ack.harq_id = nr_dci_info_extracted->harq_process_number;
-    dl_harq->harq_ack.rx_status = downlink_harq_process(dl_harq, dlsch[0]->current_harq_pid, nr_dci_info_extracted->ndi, dlsch[0]->rnti_type);
-  }
-  else if (nr_dci_info_extracted->identifier_dci_formats == UL_DCI) {
-
-	/* store harq id for which pusch should be transmitted at rx_slot + tx_offset */
-	set_tx_harq_id(ulsch, nr_dci_info_extracted->harq_process_number, (slot + tx_offset)%ue->frame_parms.slots_per_subframe);
-    ulsch->harq_processes[nr_dci_info_extracted->harq_process_number]->tx_status = uplink_harq_process(ulsch, nr_dci_info_extracted->harq_process_number, nr_dci_info_extracted->ndi, ulsch->rnti_type);
-  }
-}
 
 /*******************************************************************
 *
@@ -343,98 +306,10 @@ harq_result_t uplink_harq_process(NR_UE_ULSCH_t *ulsch, int harq_pid, int ndi, u
 void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq)
 {
   dl_harq->status = SCH_IDLE;
-  dl_harq->first_tx = 1;
+  dl_harq->first_rx = 1;
   dl_harq->round  = 0;
-  dl_harq->harq_ack.ack = DL_ACKNACK_NO_SET;
-  dl_harq->harq_ack.send_harq_status = 0;
-  dl_harq->harq_ack.vDAI_UL = UL_DAI_NO_SET;
-  dl_harq->harq_ack.vDAI_DL = DL_DAI_NO_SET;
-  dl_harq->harq_ack.slot_for_feedback_ack = NR_MAX_SLOTS_PER_FRAME;
-  dl_harq->harq_ack.pucch_resource_indicator = MAX_PUCCH_RESOURCE_INDICATOR;
-  dl_harq->harq_ack.n_CCE = 0;
-  dl_harq->harq_ack.N_CCE = 0;;
-}
-
-/*******************************************************************
-*
-* NAME :         config_downlink_harq_process
-*
-* PARAMETERS :   pointer to ue context
-*                id of current gNB
-*                number of downlink processes
-*
-* RETURN :       none
-*
-* DESCRIPTION :  configuration of downlink HARQ entity
-*
-*********************************************************************/
-
-void config_downlink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int TB_id, int execution_thread_number, uint8_t number_harq_processes_for_pdsch)
-{
-  NR_UE_DLSCH_t *dlsch;
-
-  dlsch = (NR_UE_DLSCH_t *)malloc16(sizeof(NR_UE_DLSCH_t));
-
-  if (dlsch != NULL) {
-
-    memset(dlsch,0,sizeof(NR_UE_DLSCH_t));
-
-    ue->dlsch[execution_thread_number][gNB_id][TB_id] = dlsch;
-  }
-  else {
-    LOG_E(PHY, "Fatal memory allocation problem at line %d in function %s of file %s \n", __LINE__ , __func__, __FILE__);
-    assert(0);
-  }
-
-  dlsch->Mdlharq = number_harq_processes_for_pdsch; /* an additional HARQ is reserved for PBCCH */
-  dlsch->number_harq_processes_for_pdsch = number_harq_processes_for_pdsch;
-
-  /* allocation of HARQ process context */
-  for (int harq_pid = 0; harq_pid < number_harq_processes_for_pdsch; harq_pid++) {
-
-    //dlsch->harq_processes[harq_pid] = (NR_DL_UE_HARQ_t *)malloc16(sizeof(NR_DL_UE_HARQ_t));
-
-    /*if (dlsch->harq_processes[harq_pid] == NULL) {
-      LOG_E(PHY, "Fatal memory allocation problem at line %d in function %s of file %s \n", __LINE__ , __func__, __FILE__);
-      assert(0);
-    }*/
-
-    memset(&dlsch->harq_processes[harq_pid],0,sizeof(NR_DL_UE_HARQ_t));
-
-    NR_DL_UE_HARQ_t *dl_harq = dlsch->harq_processes[harq_pid];
-
-    init_downlink_harq_status(dl_harq);
-  }
-}
-
-/*******************************************************************
-*
-* NAME :         release_downlink_harq_process
-*
-* PARAMETERS :   pointer to ue context
-*                id of current gNB
-*                TB_id transport block identity 0 or 1
-*                execution_thread_number thread number for current downlink processing
-* RETURN :       none
-*
-* DESCRIPTION :  release of HARQ downlink entity
-*
-*********************************************************************/
-
-void release_downlink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int TB_id, int execution_thread_number)
-{
-  NR_UE_DLSCH_t *dlsch = ue->dlsch[execution_thread_number][gNB_id][TB_id];
-
-  /*for (int process_id = 0; process_id < dlsch->Mdlharq; process_id++) {
-
-    free16(dlsch->harq_processes[process_id],sizeof(NR_DL_UE_HARQ_t));
-
-    dlsch->harq_processes[process_id] = NULL;
-  }*/
-
-  free16(dlsch,sizeof(NR_UE_DLSCH_t));
-
-  ue->dlsch[execution_thread_number][gNB_id][TB_id] = NULL;
+  dl_harq->DCINdi = 1;
+  dl_harq->ack = DL_ACKNACK_NO_SET;
 }
 
 /*******************************************************************
@@ -454,49 +329,66 @@ void release_downlink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int TB_id, in
 *
 *********************************************************************/
 
-harq_result_t downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, uint8_t rnti_type)
-{
-  harq_result_t result_harq = RETRANSMISSION_HARQ;
-
-  if (rnti_type == _CS_RNTI_)
-  {
-    LOG_E(PHY, "Fatal error in HARQ entity due to not supported CS_RNTI at line %d in function %s of file %s \n", __LINE__ , __func__, __FILE__);
-	return(NEW_TRANSMISSION_HARQ);
-  }
-  else if ((rnti_type != _C_RNTI_) && (rnti_type != _TC_RNTI_)) {
-    /* harq mechanism is not relevant for other rnti */
-    return(NEW_TRANSMISSION_HARQ);
-  }
-
-  if (dl_harq->first_tx == 1) {
-    dl_harq->round = 0;
-    dl_harq->status = ACTIVE;
-    dl_harq->DCINdi = ndi;
-    dl_harq->first_tx = 0;
+void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, int rv, uint8_t rnti_type) {
 
-    result_harq = NEW_TRANSMISSION_HARQ;
 
-    LOG_D(PHY, "[HARQ-DL-PDSCH harqId : %d] first new reception \n", harq_pid);
-  }
-  else if (dl_harq->DCINdi != ndi) {
+  if (rnti_type == _SI_RNTI_ ||
+      rnti_type == _P_RNTI_ ||
+      rnti_type == _RA_RNTI_) {
     dl_harq->round = 0;
     dl_harq->status = ACTIVE;
-    dl_harq->DCINdi = ndi;
-
-    result_harq = NEW_TRANSMISSION_HARQ;
-
-    LOG_D(PHY, "[HARQ-DL-PDSCH harqId : %d] new reception due to toogle of ndi \n", harq_pid);
+    dl_harq->first_rx = 1;
   }
-  else {
-
-    dl_harq->round++;
-
-    if (dl_harq->harq_ack.ack) dl_harq->status = SCH_IDLE;
-
-    result_harq = RETRANSMISSION_HARQ;
-
-    LOG_D(PHY, "[HARQ-DL-PDSCH harqId : %d] reception of a retransmission \n", harq_pid);
+  else{
+    switch(rv){
+      case 0:
+        dl_harq->round = 0;
+        dl_harq->status = ACTIVE;
+        dl_harq->first_rx = 1;
+        if (dl_harq->DCINdi == ndi)
+          LOG_E(PHY,"Warning! rv %d indicates new transmission but new ndi %d is the same as old ndi %d\n",rv,ndi,dl_harq->DCINdi);
+        dl_harq->DCINdi = ndi;
+        break;
+      case 1:
+        dl_harq->round = 2;
+        dl_harq->first_rx = 0;
+        if (dl_harq->DCINdi != ndi) {
+          LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv);
+          dl_harq->status = ACTIVE;
+          dl_harq->first_rx = 1;
+          dl_harq->DCINdi = ndi;
+        }
+        else if (dl_harq->ack)
+          dl_harq->status = SCH_IDLE;
+        break;
+      case 2:
+        dl_harq->round = 1;
+        dl_harq->first_rx = 0;
+        if (dl_harq->DCINdi != ndi) {
+          LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv);
+          dl_harq->status = ACTIVE;
+          dl_harq->first_rx = 1;
+          dl_harq->DCINdi = ndi;
+        }
+        else if (dl_harq->ack)
+          dl_harq->status = SCH_IDLE;
+        break;
+      case 3:
+        dl_harq->round = 3;
+        dl_harq->first_rx = 0;
+        if (dl_harq->DCINdi != ndi) {
+          LOG_E(PHY,"Missed previous DCI detections. NDI toggled but rv %d does not correspond to first reception\n",rv);
+          dl_harq->status = ACTIVE;
+          dl_harq->first_rx = 1;
+          dl_harq->DCINdi = ndi;
+        }
+        else if (dl_harq->ack)
+          dl_harq->status = SCH_IDLE;
+        break;
+      default:
+        AssertFatal(1==0,"Invalid value for rv %d\n",rv);
+    }
   }
 
-  return (result_harq);
 }
+
diff --git a/openair1/SCHED_NR_UE/harq_nr.h b/openair1/SCHED_NR_UE/harq_nr.h
index c6d47a91ef9ab3df0fd60cbfc02f93abc5c14776..5586518d7c7646e598b89b7369c74cf82edf3e8c 100644
--- a/openair1/SCHED_NR_UE/harq_nr.h
+++ b/openair1/SCHED_NR_UE/harq_nr.h
@@ -46,8 +46,6 @@
 
 #define NR_DEFAULT_DLSCH_HARQ_PROCESSES          (8)                      /* TS 38.214 5.1 */
 
-#define NR_DL_MAX_DAI                            (4)                      /* TS 38.213 table 9.1.3-1 Value of counter DAI for DCI format 1_0 and 1_1 */
-#define NR_DL_MAX_NB_CW                          (2)                      /* number of downlink code word */
 #define DL_ACKNACK_NO_SET                        (2)
 #define DL_NACK                                  (0)
 #define DL_ACK                                   (1)
@@ -68,18 +66,6 @@
 /*************** FUNCTIONS ****************************************/
 
 
-/** \brief This function updates HARQ context according to dci
-    @param PHY_VARS_NR_UE ue context
-    @param nr_dci_info_extracted extracted information from dci
-    @param dlsch downlink context
-    @param ulsch uplink context
-    @param nr_slot_rx rx slot
-    @param tx_offset slot offset for tx
-    @returns none */
-
-void get_dci_info_for_harq(PHY_VARS_NR_UE *ue, NR_DCI_INFO_EXTRACTED_t *nr_dci_info_extracted,
-		                   NR_UE_DLSCH_t **dlsch, NR_UE_ULSCH_t *ulsch, uint8_t nr_slot_rx, uint8_t tx_offset);
-
 /** \brief This function configures uplink HARQ context
     @param PHY_VARS_NR_UE ue context
     @param gNB_id gNodeB identifier
@@ -127,24 +113,6 @@ harq_result_t uplink_harq_process(NR_UE_ULSCH_t *ulsch, int harq_pid, int ndi, u
 
 void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq);
 
-/** \brief This function configures downlink HARQ context
-    @param PHY_VARS_NR_UE ue context
-    @param gNB_id gNodeB identifier
-    @param TB_id transport block identifier
-    @param execution_thread_number thread_number
-    @param number_harq_processes maximum number of downlink HARQ processes
-    @returns none */
-
-void config_downlink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int TB_id, int execution_thread_number, uint8_t number_harq_processes);
-
-/** \brief This function releases downlink HARQ context
-    @param PHY_VARS_NR_UE ue context
-    @param gNB_id gNodeB identifier
-    @param TB_id transport block identifier
-    @param execution_thread_number thread_number
-    @returns none */
-
-void release_downlink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int TB_id, int execution_thread_number);
 
 /** \brief This function update downlink harq context and return reception type (new transmission or retransmission)
     @param dlsch downlink harq context
@@ -152,7 +120,7 @@ void release_downlink_harq_process(PHY_VARS_NR_UE *ue, int gNB_id, int TB_id, in
     @param rnti_type type of rnti
     @returns retransmission or new transmission */
 
-harq_result_t downlink_harq_process(NR_DL_UE_HARQ_t *dlsch, int harq_pid, int ndi, uint8_t rnti_type);
+void downlink_harq_process(NR_DL_UE_HARQ_t *dlsch, int harq_pid, int ndi, int rv, uint8_t rnti_type);
 
 #undef EXTERN
 #undef INIT_VARIABLES_HARQ_NR_H
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index c0020cc689b2d01054f2501877219820f146ff54..4e47eb2865da056251cebf6522f65029984466f4 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -114,7 +114,6 @@ void nr_fill_dl_indication(nr_downlink_indication_t *dl_ind,
     dl_ind->dci_ind = NULL;
 
   }
-
 }
 
 void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
@@ -122,9 +121,10 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
                            uint8_t gNB_id,
                            PHY_VARS_NR_UE *ue,
                            NR_UE_DLSCH_t *dlsch0,
+                           NR_UE_DLSCH_t *dlsch1,
                            uint16_t n_pdus){
 
-  int harq_pid;
+
   NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
 
   if (n_pdus > 1){
@@ -133,11 +133,27 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
 
   switch (pdu_type){
     case FAPI_NR_RX_PDU_TYPE_SIB:
+      rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.harq_pid = dlsch0->current_harq_pid;
+      rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.ack_nack = dlsch0->harq_processes[dlsch0->current_harq_pid]->ack;
+      rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.pdu = dlsch0->harq_processes[dlsch0->current_harq_pid]->b;
+      rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.pdu_length = dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS / 8;
+    break;
     case FAPI_NR_RX_PDU_TYPE_DLSCH:
+      if(dlsch0) {
+        rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.harq_pid = dlsch0->current_harq_pid;
+        rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.ack_nack = dlsch0->harq_processes[dlsch0->current_harq_pid]->ack;
+        rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.pdu = dlsch0->harq_processes[dlsch0->current_harq_pid]->b;
+        rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.pdu_length = dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS / 8;
+      }
+      if(dlsch1) {
+        AssertFatal(1==0,"Second codeword currently not supported\n");
+      }
+      break;
     case FAPI_NR_RX_PDU_TYPE_RAR:
-      harq_pid = dlsch0->current_harq_pid;
-      rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.pdu = dlsch0->harq_processes[harq_pid]->b;
-      rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.pdu_length = dlsch0->harq_processes[harq_pid]->TBS / 8;
+      rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.harq_pid = dlsch0->current_harq_pid;
+      rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.ack_nack = dlsch0->harq_processes[dlsch0->current_harq_pid]->ack;
+      rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.pdu = dlsch0->harq_processes[dlsch0->current_harq_pid]->b;
+      rx_ind->rx_indication_body[n_pdus - 1].pdsch_pdu.pdu_length = dlsch0->harq_processes[dlsch0->current_harq_pid]->TBS / 8;
     break;
     case FAPI_NR_RX_PDU_TYPE_SSB:
       rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.pdu = ue->pbch_vars[gNB_id]->decoded_output;
@@ -146,6 +162,7 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
       rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.ssb_length = frame_parms->Lmax;
       rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.cell_id = frame_parms->Nid_cell;
       rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.ssb_start_subcarrier = frame_parms->ssb_start_subcarrier;
+      rx_ind->rx_indication_body[n_pdus - 1].ssb_pdu.rsrp_dBm = ue->measurements.rsrp_dBm[gNB_id];
     break;
     default:
     break;
@@ -235,7 +252,7 @@ void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx){
 
       ue->timing_advance += (ul_time_alignment->ta_command - 31) * bw_scaling;
 
-      LOG_D(PHY, "In %s: [UE %d] [%d.%d] Got timing advance command %u from MAC, new value is %d\n",
+      LOG_I(PHY, "In %s: [UE %d] [%d.%d] Got timing advance command %u from MAC, new value is %d\n",
         __FUNCTION__,
         ue->Mod_id,
         frame_tx,
@@ -464,7 +481,8 @@ unsigned int nr_get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb
 
 int nr_ue_pdcch_procedures(uint8_t gNB_id,
 			   PHY_VARS_NR_UE *ue,
-			   UE_nr_rxtx_proc_t *proc)
+			   UE_nr_rxtx_proc_t *proc,
+                           int n_ss)
 {
   int frame_rx = proc->frame_rx;
   int nr_slot_rx = proc->nr_slot_rx;
@@ -472,6 +490,9 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
   fapi_nr_dci_indication_t dci_ind = {0};
   nr_downlink_indication_t dl_indication;
 
+  NR_UE_PDCCH *pdcch_vars = ue->pdcch_vars[proc->thread_id][gNB_id];
+  fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &pdcch_vars->pdcch_config[n_ss];
+
   /*
   //  unsigned int dci_cnt=0, i;  //removed for nr_ue_pdcch_procedures and added in the loop for nb_coreset_active
 #ifdef NR_PDCCH_SCHED_DEBUG
@@ -656,18 +677,18 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
   */
   
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_IN);
-  nr_rx_pdcch(ue, proc);
+  nr_rx_pdcch(ue, proc, rel15);
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_OUT);
   
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_IN);
 
 #ifdef NR_PDCCH_SCHED_DEBUG
-  printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Entering function nr_dci_decoding_procedure with (nb_searchspace_active=%d)\n",
-	 pdcch_vars->nb_search_space);
+  printf("<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Entering function nr_dci_decoding_procedure for search space %d)\n",
+	 n_ss);
 #endif
 
-  dci_cnt = nr_dci_decoding_procedure(ue, proc, &dci_ind);
+  dci_cnt = nr_dci_decoding_procedure(ue, proc, &dci_ind, rel15);
 
 #ifdef NR_PDCCH_SCHED_DEBUG
   LOG_I(PHY,"<-NR_PDCCH_PHY_PROCEDURES_LTE_UE (nr_ue_pdcch_procedures)-> Ending function nr_dci_decoding_procedure() -> dci_cnt=%u\n",dci_cnt);
@@ -853,18 +874,18 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int gNB_
   return 0;
 }
 
-void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
-       UE_nr_rxtx_proc_t *proc,
-       int gNB_id,
-       PDSCH_t pdsch,
-       NR_UE_DLSCH_t *dlsch0,
-       NR_UE_DLSCH_t *dlsch1,
-       int *dlsch_errors,
-       uint8_t dlsch_parallel) {
+bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
+                            UE_nr_rxtx_proc_t *proc,
+                            int gNB_id,
+                            PDSCH_t pdsch,
+                            NR_UE_DLSCH_t *dlsch0,
+                            NR_UE_DLSCH_t *dlsch1,
+                            int *dlsch_errors,
+                            uint8_t dlsch_parallel) {
 
   if (dlsch0==NULL)
     AssertFatal(0,"dlsch0 should be defined at this level \n");
-
+  bool dec = false;
   int harq_pid = dlsch0->current_harq_pid;
   int frame_rx = proc->frame_rx;
   int nr_slot_rx = proc->nr_slot_rx;
@@ -918,11 +939,11 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
     case PDSCH1:
       LOG_E(PHY,"Illegal PDSCH %d for ue_pdsch_procedures\n",pdsch);
       pdsch_vars = NULL;
-      return;
+      return false;
       break;
     default:
       pdsch_vars = NULL;
-      return;
+      return false;
       break;
 
     }
@@ -931,17 +952,17 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
 
     if (pdsch == RA_PDSCH) {
       if (ue->prach_resources[gNB_id]!=NULL)
-	      dlsch0->rnti = ue->prach_resources[gNB_id]->ra_RNTI;
+        dlsch0->rnti = ue->prach_resources[gNB_id]->ra_RNTI;
       else {
-	      LOG_E(PHY,"[UE %d] Frame %d, nr_slot_rx %d: FATAL, prach_resources is NULL\n", ue->Mod_id, frame_rx, nr_slot_rx);
-	      //mac_xface->macphy_exit("prach_resources is NULL");
-	      return;
+        LOG_E(PHY,"[UE %d] Frame %d, nr_slot_rx %d: FATAL, prach_resources is NULL\n", ue->Mod_id, frame_rx, nr_slot_rx);
+        //mac_xface->macphy_exit("prach_resources is NULL");
+        return false;
       }
     }
 
     // exit dlsch procedures as there are no active dlsch
     if (is_cw0_active != ACTIVE && is_cw1_active != ACTIVE)
-      return;
+      return false;
 
     // start ldpc decode for CW 0
     dlsch0->harq_processes[harq_pid]->G = nr_get_G(dlsch0->harq_processes[harq_pid]->nb_rb,
@@ -951,17 +972,17 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
                                                    dlsch0->harq_processes[harq_pid]->Qm,
                                                    dlsch0->harq_processes[harq_pid]->Nl);
 #if UE_TIMING_TRACE
-      start_meas(&ue->dlsch_unscrambling_stats);
+    start_meas(&ue->dlsch_unscrambling_stats);
 #endif
-      nr_dlsch_unscrambling(pdsch_vars->llr[0],
-                            dlsch0->harq_processes[harq_pid]->G,
-                            0,
-                            ue->frame_parms.Nid_cell,
-                            dlsch0->rnti);
+    nr_dlsch_unscrambling(pdsch_vars->llr[0],
+                          dlsch0->harq_processes[harq_pid]->G,
+                          0,
+                          ue->frame_parms.Nid_cell,
+                          dlsch0->rnti);
       
 
 #if UE_TIMING_TRACE
-      stop_meas(&ue->dlsch_unscrambling_stats);
+    stop_meas(&ue->dlsch_unscrambling_stats);
 #endif
 
 #if 0
@@ -976,79 +997,101 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
 #endif
 
 #if UE_TIMING_TRACE
-      start_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
+    start_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
 #endif
 
-  if( dlsch_parallel)
-    {
-    ret = nr_dlsch_decoding_mthread(ue,
-			   proc,
-			   gNB_id,
-			   pdsch_vars->llr[0],
-			   &ue->frame_parms,
-			   dlsch0,
-			   dlsch0->harq_processes[harq_pid],
-			   frame_rx,
-			   nb_symb_sch,
-			   nr_slot_rx,
-			   harq_pid,
-			   pdsch==PDSCH?1:0,
-			   dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
-    LOG_T(PHY,"dlsch decoding is parallelized, ret = %d\n", ret);
+    if( dlsch_parallel) {
+      ret = nr_dlsch_decoding_mthread(ue,
+                                      proc,
+                                      gNB_id,
+                                      pdsch_vars->llr[0],
+                                      &ue->frame_parms,
+                                      dlsch0,
+                                      dlsch0->harq_processes[harq_pid],
+                                      frame_rx,
+                                      nb_symb_sch,
+                                      nr_slot_rx,
+                                      harq_pid,
+                                      pdsch==PDSCH?1:0,
+                                      dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
+
+      LOG_T(PHY,"dlsch decoding is parallelized, ret = %d\n", ret);
     }
-  else
-    {
-    ret = nr_dlsch_decoding(ue,
-			   proc,
-			   gNB_id,
-			   pdsch_vars->llr[0],
-			   &ue->frame_parms,
-			   dlsch0,
-			   dlsch0->harq_processes[harq_pid],
-			   frame_rx,
-			   nb_symb_sch,
-			   nr_slot_rx,
-			   harq_pid,
-			   pdsch==PDSCH?1:0,
-			   dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
+    else {
+      ret = nr_dlsch_decoding(ue,
+                              proc,
+                              gNB_id,
+                              pdsch_vars->llr[0],
+                              &ue->frame_parms,
+                              dlsch0,
+                              dlsch0->harq_processes[harq_pid],
+                              frame_rx,
+                              nb_symb_sch,
+                              nr_slot_rx,
+                              harq_pid,
+                              pdsch==PDSCH?1:0,
+                              dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
       LOG_T(PHY,"Sequential dlsch decoding , ret = %d\n", ret);
-     }
+    }
+
+    if(ret<dlsch0->max_ldpc_iterations+1)
+      dec = true;
+
+    switch (pdsch) {
+      case RA_PDSCH:
+        nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, gNB_id);
+        nr_fill_rx_indication(&rx_ind, FAPI_NR_RX_PDU_TYPE_RAR, gNB_id, ue, dlsch0, NULL, number_pdus);
+        ue->UE_mode[gNB_id] = RA_RESPONSE;
+        break;
+      case PDSCH:
+        nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, gNB_id);
+        nr_fill_rx_indication(&rx_ind, FAPI_NR_RX_PDU_TYPE_DLSCH, gNB_id, ue, dlsch0, NULL, number_pdus);
+        break;
+      case SI_PDSCH:
+        nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, gNB_id);
+        nr_fill_rx_indication(&rx_ind, FAPI_NR_RX_PDU_TYPE_SIB, gNB_id, ue, dlsch0, NULL, number_pdus);
+        break;
+      default:
+        break;
+    }
+
+    LOG_D(PHY, "In %s DL PDU length in bits: %d, in bytes: %d \n", __FUNCTION__, dlsch0->harq_processes[harq_pid]->TBS, dlsch0->harq_processes[harq_pid]->TBS / 8);
+
 
 
 #if UE_TIMING_TRACE
-      stop_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
+    stop_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
 #if DISABLE_LOG_X
-      printf(" --> Unscrambling for CW0 %5.3f\n",
-              (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
-      printf("AbsSubframe %d.%d --> LDPC Decoding for CW0 %5.3f\n",
-              frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
+    printf(" --> Unscrambling for CW0 %5.3f\n",
+           (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
+    printf("AbsSubframe %d.%d --> LDPC Decoding for CW0 %5.3f\n",
+           frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
 #else
-      LOG_I(PHY, " --> Unscrambling for CW0 %5.3f\n",
-              (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
-      LOG_I(PHY, "AbsSubframe %d.%d --> LDPC Decoding for CW0 %5.3f\n",
-              frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
+    LOG_I(PHY, " --> Unscrambling for CW0 %5.3f\n",
+          (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
+    LOG_I(PHY, "AbsSubframe %d.%d --> LDPC Decoding for CW0 %5.3f\n",
+          frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
 #endif
 
 #endif
-      if(is_cw1_active)
-      {
-          // start ldpc decode for CW 1
-        dlsch1->harq_processes[harq_pid]->G = nr_get_G(dlsch1->harq_processes[harq_pid]->nb_rb,
-                                                       nb_symb_sch,
-                                                       nb_re_dmrs,
-                                                       dmrs_len,
-                                                       dlsch1->harq_processes[harq_pid]->Qm,
-							 dlsch1->harq_processes[harq_pid]->Nl);
+    if(is_cw1_active) {
+      // start ldpc decode for CW 1
+      dlsch1->harq_processes[harq_pid]->G = nr_get_G(dlsch1->harq_processes[harq_pid]->nb_rb,
+                                                     nb_symb_sch,
+                                                     nb_re_dmrs,
+                                                     dmrs_len,
+                                                     dlsch1->harq_processes[harq_pid]->Qm,
+                                                     dlsch1->harq_processes[harq_pid]->Nl);
 #if UE_TIMING_TRACE
-          start_meas(&ue->dlsch_unscrambling_stats);
+      start_meas(&ue->dlsch_unscrambling_stats);
 #endif
-          nr_dlsch_unscrambling(pdsch_vars->llr[1],
-                                dlsch1->harq_processes[harq_pid]->G,
-                                0,
-                                ue->frame_parms.Nid_cell,
-                                dlsch1->rnti);
+      nr_dlsch_unscrambling(pdsch_vars->llr[1],
+                            dlsch1->harq_processes[harq_pid]->G,
+                            0,
+                            ue->frame_parms.Nid_cell,
+                            dlsch1->rnti);
 #if UE_TIMING_TRACE
-          stop_meas(&ue->dlsch_unscrambling_stats);
+      stop_meas(&ue->dlsch_unscrambling_stats);
 #endif
 
 #if 0
@@ -1062,229 +1105,204 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
 #endif
 
 #if UE_TIMING_TRACE
-          start_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
+      start_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
 #endif
 
-  if(dlsch_parallel)
-    {
-    ret1 = nr_dlsch_decoding_mthread(ue,
-                                     proc,
-                                     gNB_id,
-                                     pdsch_vars->llr[1],
-                                     &ue->frame_parms,
-                                     dlsch1,
-                                     dlsch1->harq_processes[harq_pid],
-                                     frame_rx,
-                                     nb_symb_sch,
-				     nr_slot_rx,
-                                     harq_pid,
-                                     pdsch==PDSCH?1:0,
-                                     dlsch1->harq_processes[harq_pid]->TBS>256?1:0);
-          LOG_T(PHY,"CW dlsch decoding is parallelized, ret1 = %d\n", ret1);
-    }
-    else
-    {
-    ret1 = nr_dlsch_decoding(ue,
-			     proc,
-			     gNB_id,
-                             pdsch_vars->llr[1],
-                             &ue->frame_parms,
-                             dlsch1,
-                             dlsch1->harq_processes[harq_pid],
-                             frame_rx,
-                             nb_symb_sch,
-                             nr_slot_rx,
-                             harq_pid,
-                             pdsch==PDSCH?1:0,//proc->decoder_switch,
-                             dlsch1->harq_processes[harq_pid]->TBS>256?1:0);
-    LOG_T(PHY,"CWW sequential dlsch decoding, ret1 = %d\n", ret1);
-    }
+      if(dlsch_parallel) {
+        ret1 = nr_dlsch_decoding_mthread(ue,
+                                         proc,
+                                         gNB_id,
+                                         pdsch_vars->llr[1],
+                                         &ue->frame_parms,
+                                         dlsch1,
+                                         dlsch1->harq_processes[harq_pid],
+                                         frame_rx,
+                                         nb_symb_sch,
+				         nr_slot_rx,
+                                         harq_pid,
+                                         pdsch==PDSCH?1:0,
+                                         dlsch1->harq_processes[harq_pid]->TBS>256?1:0);
+        LOG_T(PHY,"CW dlsch decoding is parallelized, ret1 = %d\n", ret1);
+      }
+      else {
+        ret1 = nr_dlsch_decoding(ue,
+                                 proc,
+                                 gNB_id,
+                                 pdsch_vars->llr[1],
+                                 &ue->frame_parms,
+                                 dlsch1,
+                                 dlsch1->harq_processes[harq_pid],
+                                 frame_rx,
+                                 nb_symb_sch,
+                                 nr_slot_rx,
+                                 harq_pid,
+                                 pdsch==PDSCH?1:0,//proc->decoder_switch,
+                                 dlsch1->harq_processes[harq_pid]->TBS>256?1:0);
+        LOG_T(PHY,"CWW sequential dlsch decoding, ret1 = %d\n", ret1);
+      }
 
 #if UE_TIMING_TRACE
-          stop_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
+      stop_meas(&ue->dlsch_decoding_stats[proc->thread_id]);
 #if DISABLE_LOG_X
-          printf(" --> Unscrambling for CW1 %5.3f\n",
-                  (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
-          printf("AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n",
-                  frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
+      printf(" --> Unscrambling for CW1 %5.3f\n",
+             (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
+      printf("AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n",
+             frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
 #else
-          LOG_D(PHY, " --> Unscrambling for CW1 %5.3f\n",
-                  (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
-          LOG_D(PHY, "AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n",
-                  frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
+      LOG_D(PHY, " --> Unscrambling for CW1 %5.3f\n",
+            (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
+      LOG_D(PHY, "AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n",
+            frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
 #endif
 
 #endif
-          LOG_I(PHY,"AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n",
-                  frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
+      LOG_D(PHY,"AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f\n",
+            frame_rx%1024, nr_slot_rx,(ue->dlsch_decoding_stats[proc->thread_id].p_time)/(cpuf*1000.0));
 
-        LOG_D(PHY, "harq_pid: %d, TBS expected dlsch1: %d \n", harq_pid, dlsch1->harq_processes[harq_pid]->TBS);
-      }
+      LOG_D(PHY, "harq_pid: %d, TBS expected dlsch1: %d \n", harq_pid, dlsch1->harq_processes[harq_pid]->TBS);
+    }
 
-      LOG_D(PHY," ------ end ldpc decoder for AbsSubframe %d.%d ------ decoded in %d \n", frame_rx, nr_slot_rx, ret);
-      LOG_D(PHY, "harq_pid: %d, TBS expected dlsch0: %d  \n",harq_pid, dlsch0->harq_processes[harq_pid]->TBS);
-
-      if(ret<dlsch0->max_ldpc_iterations+1){
-
-        switch (pdsch) {
-          case RA_PDSCH:
-            nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, gNB_id);
-            nr_fill_rx_indication(&rx_ind, FAPI_NR_RX_PDU_TYPE_RAR, gNB_id, ue, dlsch0, number_pdus);
-
-            ue->UE_mode[gNB_id] = RA_RESPONSE;
-            break;
-          case PDSCH:
-            nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, gNB_id);
-            nr_fill_rx_indication(&rx_ind, FAPI_NR_RX_PDU_TYPE_DLSCH, gNB_id, ue, dlsch0, number_pdus);
-            break;
-          case SI_PDSCH:
-            nr_fill_dl_indication(&dl_indication, NULL, &rx_ind, proc, ue, gNB_id);
-            nr_fill_rx_indication(&rx_ind, FAPI_NR_RX_PDU_TYPE_SIB, gNB_id, ue, dlsch0, number_pdus);
-            break;
-          default:
-            break;
-        }
+    LOG_D(PHY," ------ end ldpc decoder for AbsSubframe %d.%d ------ decoded in %d \n", frame_rx, nr_slot_rx, ret);
 
-        LOG_D(PHY, "In %s DL PDU length in bits: %d, in bytes: %d \n", __FUNCTION__, dlsch0->harq_processes[harq_pid]->TBS, dlsch0->harq_processes[harq_pid]->TBS / 8);
+    //  send to mac
+    if (ue->if_inst && ue->if_inst->dl_indication) {
+      ue->if_inst->dl_indication(&dl_indication, ul_time_alignment);
+    }
 
-        //  send to mac
-        if (ue->if_inst && ue->if_inst->dl_indication) {
-          ue->if_inst->dl_indication(&dl_indication, ul_time_alignment);
-        }
+    if (ue->mac_enabled == 1) { // TODO: move this from PHY to MAC layer!
+
+      /* Time Alignment procedure
+      // - UE processing capability 1
+      // - Setting the TA update to be applied after the reception of the TA command
+      // - Timing adjustment computed according to TS 38.213 section 4.2
+      // - Durations of N1 and N2 symbols corresponding to PDSCH and PUSCH are
+      //   computed according to sections 5.3 and 6.4 of TS 38.214 */
+      const int numerology = ue->frame_parms.numerology_index;
+      const int ofdm_symbol_size = ue->frame_parms.ofdm_symbol_size;
+      const int nb_prefix_samples = ue->frame_parms.nb_prefix_samples;
+      const int samples_per_subframe = ue->frame_parms.samples_per_subframe;
+      const int slots_per_frame = ue->frame_parms.slots_per_frame;
+      const int slots_per_subframe = ue->frame_parms.slots_per_subframe;
+
+      const double tc_factor = 1.0 / samples_per_subframe;
+      const uint16_t bw_scaling = get_bw_scaling(ofdm_symbol_size);
+
+      const int Ta_max = 3846; // Max value of 12 bits TA Command
+      const double N_TA_max = Ta_max * bw_scaling * tc_factor;
+
+      NR_UE_MAC_INST_t *mac = get_mac_inst(0);
+
+      NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
+      if (mac->ULbwp[0] &&
+          mac->ULbwp[0]->bwp_Dedicated &&
+          mac->ULbwp[0]->bwp_Dedicated->pusch_Config &&
+          mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup &&
+          mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList) {
+        pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList->choice.setup;
+      }
+      else if (mac->ULbwp[0] &&
+               mac->ULbwp[0]->bwp_Common &&
+               mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon &&
+               mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup &&
+               mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
+        pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+      }
+      else if (mac->scc_SIB &&
+               mac->scc_SIB->uplinkConfigCommon &&
+               mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon &&
+               mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup &&
+               mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
+        pusch_TimeDomainAllocationList = mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+      }
+      long mapping_type_ul = pusch_TimeDomainAllocationList ? pusch_TimeDomainAllocationList->list.array[0]->mappingType : NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeA;
+
+      NR_PDSCH_Config_t *pdsch_Config = (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup) ? mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup : NULL;
+      NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = NULL;
+      if (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList)
+        pdsch_TimeDomainAllocationList = pdsch_Config->pdsch_TimeDomainAllocationList->choice.setup;
+      else if (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)
+        pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+      else if (mac->scc_SIB && mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup)
+        pdsch_TimeDomainAllocationList = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+      long mapping_type_dl = pdsch_TimeDomainAllocationList ? pdsch_TimeDomainAllocationList->list.array[0]->mappingType : NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
+
+      NR_DMRS_DownlinkConfig_t *NR_DMRS_dlconfig = NULL;
+      if (pdsch_Config) {
+        if (mapping_type_dl == NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA)
+          NR_DMRS_dlconfig = (NR_DMRS_DownlinkConfig_t *)pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup;
+        else
+          NR_DMRS_dlconfig = (NR_DMRS_DownlinkConfig_t *)pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup;
       }
 
-      if (ue->mac_enabled == 1) { // TODO: move this from PHY to MAC layer!
-
-        /* Time Alignment procedure
-        // - UE processing capability 1
-        // - Setting the TA update to be applied after the reception of the TA command
-        // - Timing adjustment computed according to TS 38.213 section 4.2
-        // - Durations of N1 and N2 symbols corresponding to PDSCH and PUSCH are
-        //   computed according to sections 5.3 and 6.4 of TS 38.214 */
-        const int numerology = ue->frame_parms.numerology_index;
-        const int ofdm_symbol_size = ue->frame_parms.ofdm_symbol_size;
-        const int nb_prefix_samples = ue->frame_parms.nb_prefix_samples;
-        const int samples_per_subframe = ue->frame_parms.samples_per_subframe;
-        const int slots_per_frame = ue->frame_parms.slots_per_frame;
-        const int slots_per_subframe = ue->frame_parms.slots_per_subframe;
-
-        const double tc_factor = 1.0 / samples_per_subframe;
-        const uint16_t bw_scaling = get_bw_scaling(ofdm_symbol_size);
-
-        const int Ta_max = 3846; // Max value of 12 bits TA Command
-        const double N_TA_max = Ta_max * bw_scaling * tc_factor;
-
-        NR_UE_MAC_INST_t *mac = get_mac_inst(0);
-
-        NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
-        if (mac->ULbwp[0] &&
-            mac->ULbwp[0]->bwp_Dedicated &&
-            mac->ULbwp[0]->bwp_Dedicated->pusch_Config &&
-            mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup &&
-            mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList) {
-          pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList->choice.setup;
-        }
-        else if (mac->ULbwp[0] &&
-                 mac->ULbwp[0]->bwp_Common &&
-                 mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon &&
-                 mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup &&
-                 mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
-          pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
-        }
-        else if (mac->scc_SIB &&
-                 mac->scc_SIB->uplinkConfigCommon &&
-                 mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon &&
-                 mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup &&
-                 mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
-          pusch_TimeDomainAllocationList = mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
-        }
-        long mapping_type_ul = pusch_TimeDomainAllocationList ? pusch_TimeDomainAllocationList->list.array[0]->mappingType : NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeA;
-
-        NR_PDSCH_Config_t *pdsch_Config = (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup) ? mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup : NULL;
-        NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = NULL;
-        if (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList)
-          pdsch_TimeDomainAllocationList = pdsch_Config->pdsch_TimeDomainAllocationList->choice.setup;
-        else if (mac->DLbwp[0] && mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)
-          pdsch_TimeDomainAllocationList = mac->DLbwp[0]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
-        else if (mac->scc_SIB && mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup)
-          pdsch_TimeDomainAllocationList = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
-        long mapping_type_dl = pdsch_TimeDomainAllocationList ? pdsch_TimeDomainAllocationList->list.array[0]->mappingType : NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
-
-        NR_DMRS_DownlinkConfig_t *NR_DMRS_dlconfig = NULL;
-        if (pdsch_Config) {
-          if (mapping_type_dl == NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA)
-            NR_DMRS_dlconfig = (NR_DMRS_DownlinkConfig_t *)pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup;
-          else
-            NR_DMRS_dlconfig = (NR_DMRS_DownlinkConfig_t *)pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup;
-        }
-
-        pdsch_dmrs_AdditionalPosition_t add_pos_dl = pdsch_dmrs_pos2;
-        if (NR_DMRS_dlconfig && NR_DMRS_dlconfig->dmrs_AdditionalPosition)
-          add_pos_dl = *NR_DMRS_dlconfig->dmrs_AdditionalPosition;
+      pdsch_dmrs_AdditionalPosition_t add_pos_dl = pdsch_dmrs_pos2;
+      if (NR_DMRS_dlconfig && NR_DMRS_dlconfig->dmrs_AdditionalPosition)
+        add_pos_dl = *NR_DMRS_dlconfig->dmrs_AdditionalPosition;
 
-        /* PDSCH decoding time N_1 for processing capability 1 */
-        int N_1;
+      /* PDSCH decoding time N_1 for processing capability 1 */
+      int N_1;
 
-        if (add_pos_dl == pdsch_dmrs_pos0)
-          N_1 = pdsch_N_1_capability_1[numerology][1];
-        else if (add_pos_dl == pdsch_dmrs_pos1 || add_pos_dl == pdsch_dmrs_pos2)
-          N_1 = pdsch_N_1_capability_1[numerology][2];
-        else
-          N_1 = pdsch_N_1_capability_1[numerology][3];
+      if (add_pos_dl == pdsch_dmrs_pos0)
+        N_1 = pdsch_N_1_capability_1[numerology][1];
+      else if (add_pos_dl == pdsch_dmrs_pos1 || add_pos_dl == pdsch_dmrs_pos2)
+        N_1 = pdsch_N_1_capability_1[numerology][2];
+      else
+        N_1 = pdsch_N_1_capability_1[numerology][3];
 
-        /* PUSCH preapration time N_2 for processing capability 1 */
-        const int N_2 = pusch_N_2_timing_capability_1[numerology][1];
+      /* PUSCH preapration time N_2 for processing capability 1 */
+      const int N_2 = pusch_N_2_timing_capability_1[numerology][1];
 
-        /* d_1_1 depending on the number of PDSCH symbols allocated */
-        const int d = 0; // TODO number of overlapping symbols of the scheduling PDCCH and the scheduled PDSCH
-        int d_1_1 = 0;
-        if (mapping_type_dl == NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA)
-         if (nb_symb_sch + start_symbol < 7)
+      /* d_1_1 depending on the number of PDSCH symbols allocated */
+      const int d = 0; // TODO number of overlapping symbols of the scheduling PDCCH and the scheduled PDSCH
+      int d_1_1 = 0;
+      if (mapping_type_dl == NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA)
+       if (nb_symb_sch + start_symbol < 7)
           d_1_1 = 7 - (nb_symb_sch + start_symbol);
-         else
+        else
           d_1_1 = 0;
-        else // mapping type B
-          switch (nb_symb_sch){
-            case 7: d_1_1 = 0; break;
-            case 4: d_1_1 = 3; break;
-            case 2: d_1_1 = 3 + d; break;
-            default: break;
-          }
+      else // mapping type B
+        switch (nb_symb_sch){
+          case 7: d_1_1 = 0; break;
+          case 4: d_1_1 = 3; break;
+          case 2: d_1_1 = 3 + d; break;
+          default: break;
+        }
 
-        /* d_2_1 */
-        int d_2_1;
-        if (mapping_type_ul == NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB && start_symbol != 0)
-          d_2_1 = 0;
-        else
-          d_2_1 = 1;
-
-        /* d_2_2 */
-        const double d_2_2 = 0.0; // set to 0 because there is only 1 BWP: TODO this should corresponds to the switching time as defined in TS 38.133
-
-        /* N_t_1 time duration in msec of N_1 symbols corresponding to a PDSCH reception time
-        // N_t_2 time duration in msec of N_2 symbols corresponding to a PUSCH preparation time */
-        double N_t_1 = (N_1 + d_1_1) * (ofdm_symbol_size + nb_prefix_samples) * tc_factor;
-        double N_t_2 = (N_2 + d_2_1) * (ofdm_symbol_size + nb_prefix_samples) * tc_factor;
-        if (N_t_2 < d_2_2) N_t_2 = d_2_2;
-
-        /* Time alignment procedure */
-        // N_t_1 + N_t_2 + N_TA_max must be in msec
-        const double t_subframe = 1.0; // subframe duration of 1 msec
-        const int ul_tx_timing_adjustment = 1 + (int)ceil(slots_per_subframe*(N_t_1 + N_t_2 + N_TA_max + 0.5)/t_subframe);
-
-        if (ul_time_alignment->apply_ta == 1){
-          ul_time_alignment->ta_slot = (nr_slot_rx + ul_tx_timing_adjustment) % slots_per_frame;
-          if (nr_slot_rx + ul_tx_timing_adjustment > slots_per_frame){
-            ul_time_alignment->ta_frame = (frame_rx + 1) % 1024;
-          } else {
-            ul_time_alignment->ta_frame = frame_rx;
-          }
-          // reset TA flag
-          ul_time_alignment->apply_ta = 0;
-          LOG_D(PHY,"Frame %d slot %d -- Starting UL time alignment procedures. TA update will be applied at frame %d slot %d\n", frame_rx, nr_slot_rx, ul_time_alignment->ta_frame, ul_time_alignment->ta_slot);
+      /* d_2_1 */
+      int d_2_1;
+      if (mapping_type_ul == NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB && start_symbol != 0)
+        d_2_1 = 0;
+      else
+        d_2_1 = 1;
+
+      /* d_2_2 */
+      const double d_2_2 = 0.0; // set to 0 because there is only 1 BWP: TODO this should corresponds to the switching time as defined in TS 38.133
+
+      /* N_t_1 time duration in msec of N_1 symbols corresponding to a PDSCH reception time
+      // N_t_2 time duration in msec of N_2 symbols corresponding to a PUSCH preparation time */
+      double N_t_1 = (N_1 + d_1_1) * (ofdm_symbol_size + nb_prefix_samples) * tc_factor;
+      double N_t_2 = (N_2 + d_2_1) * (ofdm_symbol_size + nb_prefix_samples) * tc_factor;
+      if (N_t_2 < d_2_2) N_t_2 = d_2_2;
+
+      /* Time alignment procedure */
+      // N_t_1 + N_t_2 + N_TA_max must be in msec
+      const double t_subframe = 1.0; // subframe duration of 1 msec
+      const int ul_tx_timing_adjustment = 1 + (int)ceil(slots_per_subframe*(N_t_1 + N_t_2 + N_TA_max + 0.5)/t_subframe);
+
+      if (ul_time_alignment->apply_ta == 1){
+        ul_time_alignment->ta_slot = (nr_slot_rx + ul_tx_timing_adjustment) % slots_per_frame;
+        if (nr_slot_rx + ul_tx_timing_adjustment > slots_per_frame){
+          ul_time_alignment->ta_frame = (frame_rx + 1) % 1024;
+        } else {
+          ul_time_alignment->ta_frame = frame_rx;
         }
+        // reset TA flag
+        ul_time_alignment->apply_ta = 0;
+        LOG_D(PHY,"Frame %d slot %d -- Starting UL time alignment procedures. TA update will be applied at frame %d slot %d\n",
+             frame_rx, nr_slot_rx, ul_time_alignment->ta_frame, ul_time_alignment->ta_slot);
       }
+    }
   }
+  return dec;
 }
 
 
@@ -1734,6 +1752,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
 
   LOG_D(PHY," ------ --> PDCCH ChannelComp/LLR Frame.slot %d.%d ------  \n", frame_rx%1024, nr_slot_rx);
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDCCH, VCD_FUNCTION_IN);
+
   for (uint16_t l=0; l<nb_symb_pdcch; l++) {
 
 #if UE_TIMING_TRACE
@@ -1743,29 +1762,30 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
                 proc,
                 l,
                 nr_slot_rx);
+  }
 
-    dci_cnt = 0;
-    for(int n_ss = 0; n_ss<pdcch_vars->nb_search_space; n_ss++) {
+  dci_cnt = 0;
+  for(int n_ss = 0; n_ss<pdcch_vars->nb_search_space; n_ss++) {
+    for (uint16_t l=0; l<nb_symb_pdcch; l++) {
 
-    // note: this only works if RBs for PDCCH are contigous!
-    LOG_D(PHY, "pdcch_channel_estimation: first_carrier_offset %d, BWPStart %d, coreset_start_rb %d\n",
-          fp->first_carrier_offset, pdcch_vars->pdcch_config[n_ss].BWPStart, coreset_start_rb);
+      // note: this only works if RBs for PDCCH are contigous!
+      LOG_D(PHY, "pdcch_channel_estimation: first_carrier_offset %d, BWPStart %d, coreset_start_rb %d\n",
+            fp->first_carrier_offset, pdcch_vars->pdcch_config[n_ss].BWPStart, coreset_start_rb);
 
-    if (coreset_nb_rb > 0)
-      nr_pdcch_channel_estimation(ue,
-                                  proc,
-                                  gNB_id,
-                                  nr_slot_rx,
-                                  l,
-                                  fp->first_carrier_offset+(pdcch_vars->pdcch_config[n_ss].BWPStart + coreset_start_rb)*12,
-                                  coreset_nb_rb);
+      if (coreset_nb_rb > 0)
+        nr_pdcch_channel_estimation(ue,
+                                    proc,
+                                    gNB_id,
+                                    nr_slot_rx,
+                                    l,
+                                    fp->first_carrier_offset+(pdcch_vars->pdcch_config[n_ss].BWPStart + coreset_start_rb)*12,
+                                    coreset_nb_rb);
 
 #if UE_TIMING_TRACE
-    stop_meas(&ue->ofdm_demod_stats);
+      stop_meas(&ue->ofdm_demod_stats);
 #endif
-
-      dci_cnt = dci_cnt + nr_ue_pdcch_procedures(gNB_id, ue, proc);
     }
+    dci_cnt = dci_cnt + nr_ue_pdcch_procedures(gNB_id, ue, proc, n_ss);
   }
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDCCH, VCD_FUNCTION_OUT);
 
@@ -1811,6 +1831,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
   nr_rxtx_thread_data_t *curMsg=(nr_rxtx_thread_data_t *)NotifiedFifoData(newElt);
   curMsg->proc = *proc;
   curMsg->UE = ue;
+  curMsg->ue_sched_mode = ONLY_PUSCH;
   pushTpool(&(get_nrUE_params()->Tpool), newElt);
 
 #if UE_TIMING_TRACE
@@ -1819,13 +1840,14 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
   // do procedures for C-RNTI
   int ret_pdsch = 0;
   if (ue->dlsch[proc->thread_id][gNB_id][0]->active == 1) {
+
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_C, VCD_FUNCTION_IN);
     ret_pdsch = nr_ue_pdsch_procedures(ue,
-			   proc,
-			   gNB_id,
-			   PDSCH,
-			   ue->dlsch[proc->thread_id][gNB_id][0],
-			   NULL);
+                                       proc,
+                                       gNB_id,
+                                       PDSCH,
+                                       ue->dlsch[proc->thread_id][gNB_id][0],
+                                       NULL);
 
     nr_ue_measurement_procedures(2, ue, proc, gNB_id, nr_slot_rx);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_C, VCD_FUNCTION_OUT);
@@ -2117,7 +2139,8 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t
       int16_t ra_preamble_rx_power = (int16_t)(prach_resources->ra_PREAMBLE_RECEIVED_TARGET_POWER - pathloss + 30);
       ue->tx_power_dBm[nr_slot_tx] = min(nr_get_Pcmax(mod_id), ra_preamble_rx_power);
 
-      LOG_D(PHY,"DEBUG [UE %d][RAPROC][%d.%d]: Generating PRACH Msg1 (preamble %d, PL %d dB, P0_PRACH %d, TARGET_RECEIVED_POWER %d dBm, RA-RNTI %x)\n",
+      LOG_D(PHY, "In %s: [UE %d][RAPROC][%d.%d]: Generating PRACH Msg1 (preamble %d, PL %d dB, P0_PRACH %d, TARGET_RECEIVED_POWER %d dBm, RA-RNTI %x)\n",
+        __FUNCTION__,
         mod_id,
         frame_tx,
         nr_slot_tx,
diff --git a/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.c b/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.c
deleted file mode 100644
index fadfba6bce576d71d1665b930a14095f7da63741..0000000000000000000000000000000000000000
--- a/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.c
+++ /dev/null
@@ -1,220 +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
- */
-
-/************************************************************************
-*
-* MODULE      :  PUCCH power control for UE NR
-*
-* DESCRIPTION :  functions related to PUCCH Transmit power
-*                TS 38.213 7.2.1 UE behaviour
-*
-**************************************************************************/
-
-#include "PHY/NR_REFSIG/ss_pbch_nr.h"
-#include "PHY/defs_nr_UE.h"
-#include "SCHED_NR_UE/pucch_uci_ue_nr.h"
-#include "SCHED_NR_UE/pucch_power_control_ue_nr.h"
-#include <openair1/PHY/LTE_ESTIMATION/lte_estimation.h>
-#include <openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h>
-
-/**************** defines **************************************/
-
-/**************** variables **************************************/
-
-
-/**************** functions **************************************/
-
-
-/*******************************************************************
-*
-* NAME :         get_pucch_tx_power_ue
-*
-* PARAMETERS :   ue context
-*                gNB_id identity
-*                slots for rx and tx
-*                pucch_format_nr_t pucch format
-*                nb_of_prbs number of prb allocated to pucch
-*                N_sc_ctrl_RB subcarrier control rb related to current pucch format
-*                N_symb_PUCCH number of pucch symbols excluding those reserved for dmrs
-*                O_UCI number of bits for UCI Uplink Control Information
-*                O_SR number of bits for SR scheduling Request
-*                O_UCI number of  bits for CSI Channel State Information
-*                O_ACK number of bits for HARQ-ACK
-*                O_CRC number of bits for CRC
-*                n_HARQ_ACK use for obtaining a PUCCH transmission power
-*
-* RETURN :       pucch power level in dBm
-*
-* DESCRIPTION :  determines pucch transmission power in dBm
-*                TS 38.213 7.2.1 UE behaviour
-*
-*********************************************************************/
-
-int16_t get_pucch_tx_power_ue(PHY_VARS_NR_UE *ue,
-                              uint8_t gNB_id,
-                              UE_nr_rxtx_proc_t *proc,
-                              pucch_format_nr_t pucch_format,
-                              int nb_of_prbs,
-                              int N_sc_ctrl_RB,
-                              int N_symb_PUCCH,
-                              int O_UCI,
-                              int O_SR,
-                              int O_CSI,
-                              int O_ACK,
-                              int O_CRC,
-                              int n_HARQ_ACK) {
-
-  int16_t P_O_NOMINAL_PUCCH = ue->pucch_config_common_nr[gNB_id].p0_nominal;
-  PUCCH_PowerControl_t *power_config = &ue->pucch_config_dedicated_nr[gNB_id].pucch_PowerControl;
-  int16_t P_O_UE_PUCCH;
-  int16_t G_b_f_c = 0;
-
-  if (ue->pucch_config_dedicated_nr[gNB_id].spatial_Relation_Info[0] != NULL) {  /* FFS TODO NR */
-    LOG_E(PHY,"PUCCH Spatial relation infos are not yet implemented : at line %d in function %s of file %s \n", LINE_FILE , __func__, __FILE__);
-    return (PUCCH_POWER_DEFAULT);
-  }
-
-  if (power_config->p0_Set[0] != NULL) {
-    P_O_UE_PUCCH = power_config->p0_Set[0]->p0_PUCCH_Value; /* get from index 0 if no spatial relation set */
-    G_b_f_c = 0;
-  }
-  else {
-    G_b_f_c = ue->dlsch[proc->thread_id][gNB_id][0]->g_pucch;
-    LOG_D(PHY,"PUCCH Transmit power control command not yet implemented for NR : at line %d in function %s of file %s \n", LINE_FILE , __func__, __FILE__);
-    return (PUCCH_POWER_DEFAULT);
-  }
-
-  int P_O_PUCCH = P_O_NOMINAL_PUCCH + P_O_UE_PUCCH;
-
-  int16_t PL = get_nr_PL(ue->Mod_id, ue->CC_id, gNB_id); /* LTE function because NR path loss not yet implemented FFS TODO NR */
-
-  int16_t delta_F_PUCCH =  power_config->deltaF_PUCCH_f[pucch_format];
-
-  int DELTA_TF;
-  uint16_t N_ref_PUCCH;
-
-  /* computing of pucch transmission power adjustment */
-  switch (pucch_format) {
-    case pucch_format0_nr:
-    {
-      N_ref_PUCCH = 2;
-      DELTA_TF = 10 * log10(N_ref_PUCCH/N_symb_PUCCH);
-      break;
-    }
-    case pucch_format1_nr:
-    {
-      N_ref_PUCCH = N_SYMB_SLOT;
-      DELTA_TF = 10 * log10(N_ref_PUCCH/N_symb_PUCCH);
-      break;
-    }
-    case pucch_format2_nr:
-    case pucch_format3_nr:
-    case pucch_format4_nr:
-    {
-      float N_RE = nb_of_prbs * N_sc_ctrl_RB * N_symb_PUCCH;
-      float K1 = 6;
-      /* initial phase so no higher layer parameters */
-      if (ue->UE_mode[gNB_id] != PUSCH) {
-        if (O_ACK == 0) {
-          n_HARQ_ACK = 0;
-        }
-        else {
-          n_HARQ_ACK = 1;
-        }
-      }
-      if (O_UCI < 12) {
-
-        DELTA_TF = 10 * log10((double)(((K1 * (n_HARQ_ACK + O_SR + O_CSI))/N_RE)));
-      }
-      else {
-       float K2 = 2.4;
-       float BPRE = (O_ACK + O_SR + O_CSI + O_CRC)/N_RE;
-       DELTA_TF = 10 * log10((double)(pow(2,(K2*BPRE)) - 1));
-      }
-      break;
-    }
-    default:
-    {
-      LOG_E(PHY,"PUCCH unknown pucch format : at line %d in function %s of file %s \n", LINE_FILE , __func__, __FILE__);
-      return (0);
-    }
-  }
-
-  if (power_config->twoPUCCH_PC_AdjustmentStates > 1) {
-    LOG_E(PHY,"PUCCH power control adjustment states with 2 states not yet implemented : at line %d in function %s of file %s \n", LINE_FILE , __func__, __FILE__);
-    return (PUCCH_POWER_DEFAULT);
-  }
-
-#if 0
-  int k2;
-
-  /* response to a detection by the UE of a DCI format 1_0 or DCI format 1_1 */
-  //int K_PUCCH = 0;
-  if (O_ACK != 0) {
-    /* it assumes that PDCCH is in the first symbol of receive slot FFS TDDO NR */
-    //int slots_gap = (proc->nr_slot_tx > proc->nr_slot_rx ? (proc->nr_slot_tx - proc->nr_slot_rx - 1) : ((proc->nr_slot_tx + ue->frame_parms.slots_per_subframe) - proc->nr_slot_rx - 1));
-    //K_PUCCH = (slots_gap * (ue->frame_parms.symbols_per_tti)) - 1;
-  }
-  else {
-    /* field k2 is not present - to check k2 of pucch from upper layer FFS TDDO NR */
-    if (ue->pusch_config.pusch_TimeDomainResourceAllocation[0] == NULL) {
-      if (ue->frame_parms.numerology_index == 0) {
-        k2 = 1;
-      }
-      else {
-        k2 = ue->frame_parms.numerology_index;
-      }
-    }
-    else
-    {
-      /* get minimum value of k2 */
-      int i = 0;
-      int k2_min = 32;  /* max value of k2 */
-      do {
-        k2 = ue->pusch_config.pusch_TimeDomainResourceAllocation[i]->k2;
-        if (k2 < k2_min) {
-          k2_min = k2;
-        }
-        i++;
-        if (i >= MAX_NR_OF_UL_ALLOCATIONS) {
-          break;
-        }
-       } while(ue->pusch_config.pusch_TimeDomainResourceAllocation[i] != NULL);
-      k2 = k2_min;
-    }
-    //K_PUCCH = N_SYMB_SLOT * k2; /* the product of a number of symbols per slot and the minimum of the values provided by higher layer parameter k2 */
-  }
-#endif
-
-  int contributor = (10 * log10((double)(pow(2,(ue->frame_parms.numerology_index)) * nb_of_prbs)));
-
-  int16_t pucch_power = P_O_PUCCH + contributor + PL + delta_F_PUCCH + DELTA_TF + G_b_f_c;
-
-  if (pucch_power > ue->tx_power_max_dBm) {
-    pucch_power = ue->tx_power_max_dBm;
-  }
-
-  NR_TST_PHY_PRINTF("PUCCH ( Tx power : %d dBm ) ( 10Log(...) : %d ) ( from Path Loss : %d ) ( delta_F_PUCCH : %d ) ( DELTA_TF : %d ) ( G_b_f_c : %d ) \n",
-                                    pucch_power,            contributor,            PL,                    delta_F_PUCCH,    DELTA_TF,        G_b_f_c);
-
-  return (pucch_power);
-}
-
diff --git a/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.h b/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.h
deleted file mode 100644
index 3ebd263c94b9f75af9900302a36b81fe833f1867..0000000000000000000000000000000000000000
--- a/openair1/SCHED_NR_UE/pucch_power_control_ue_nr.h
+++ /dev/null
@@ -1,65 +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
- */
-
-/************************************************************************
-*
-* MODULE      :  PUCCH power control for UE NR
-*
-* DESCRIPTION :  functions related to PUCCH Transmit power
-*                TS 38.213 7.2.1 UE behaviour
-*
-**************************************************************************/
-
-#ifndef PUCCH_POWER_CONTROL_H
-#define PUCCH_POWER_CONTROL_H
-
-/*************** INCLUDE *******************************************/
-
-/*************** DEFINE ********************************************/
-
-#define PUCCH_POWER_DEFAULT         (0)       /* in dBm */
-
-/*************** VARIABLES *****************************************/
-
-/*************** FUNCTIONS *****************************************/
-
-
-/** \brief This function returns pucch power level in dBm
-    @param ue context
-    @param gNB_id identity
-    @param slots for rx and tx
-    @param pucch_format_nr_t pucch format
-    @param nb_of_prbs number of prb allocated to pucch
-    @param N_sc_ctrl_RB subcarrier control rb related to current pucch format
-    @param N_symb_PUCCH number of pucch symbols excluding those reserved for dmrs
-    @param O_UCI number of bits for UCI Uplink Control Information
-    @param O_SR number of bits for SR scheduling Request
-    @param int O_UCI number of  bits for CSI Channel State Information
-    @param O_ACK number of bits for HARQ-ACK
-    @param O_CRC number of bits for CRC
-    @param n_HARQ_ACK use for obtaining a PUCCH transmission power
-    @returns pucch power level in dBm */
-
-int16_t get_pucch_tx_power_ue(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_t *proc, pucch_format_nr_t pucch_format,
-                              int nb_of_prbs, int N_sc_ctrl_RB, int N_symb_PUCCH, int O_UCI, int O_SR, int O_CSI, int O_ACK,
-                              int O_CRC, int n_HARQ_ACK);
-
-#endif /* PUCCH_POWER_CONTROL_H */
diff --git a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
index 2067a0c63bf3b57c35930e9f0ce025ea5d03533d..2dbe6dcb9a6582cbea28e2a6242c02dc039d63a3 100644
--- a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
+++ b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
@@ -47,7 +47,6 @@
 
 #include "SCHED_NR_UE/defs.h"
 #include "SCHED_NR_UE/harq_nr.h"
-#include "SCHED_NR_UE/pucch_power_control_ue_nr.h"
 
 #define DEFINE_VARIABLES_PUCCH_UE_NR_H
 #include "SCHED_NR_UE/pucch_uci_ue_nr.h"
@@ -56,69 +55,15 @@
 #endif
 
 
-/* TS 36.213 Table 9.2.3-3: Mapping of values for one HARQ-ACK bit to sequences */
-static const int sequence_cyclic_shift_1_harq_ack_bit[2]
-/*        HARQ-ACK Value        0    1 */
-/* Sequence cyclic shift */ = { 0,   6 }
-;
-
-/* TS 36.213 Table 9.2.5-2: Mapping of values for two HARQ-ACK bits and positive SR to sequences */
-static const int sequence_cyclic_shift_2_harq_ack_bits_positive_sr[4]
-/*        HARQ-ACK Value      (0,0)  (0,1)   (1,0)  (1,1) */
-/* Sequence cyclic shift */ = {  1,     4,     10,     7 }
-;
-
-
 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);
 
-static const uint16_t scheduling_request_periodicity[NB_SR_PERIOD]
-= { 0, 0, 1, 2, 4, 5, 8, 10, 16, 20, 40, 80, 160, 320, 640 }
-;
-
-/* TS 38.213 9.2.5.2 UE procedure for multiplexing HARQ-ACK/SR and CSI in a PUCCH */
-/* this is a counter of number of pucch format 4 per subframe */
-static int nb_pucch_format_4_in_subframes[LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] = { 0 } ;
-
 /* TS 36.213 Table 9.2.5.2-1: Code rate  corresponding to higher layer parameter PUCCH-F2-maximum-coderate, */
 /* or PUCCH-F3-maximum-coderate, or PUCCH-F4-maximum-coderate */
 /* add one additional element set to 0 for parsing the array until this end */
 /* stored values are code rates * 100 */
 //static const int code_rate_r_time_100[8] = { (0.08 * 100), (0.15 * 100), (0.25*100), (0.35*100), (0.45*100), (0.60*100), (0.80*100), 0 } ;
 
-/* TS 38.213 Table 9.2.3-4: Mapping of values for two HARQ-ACK bits to sequences */
-static const int sequence_cyclic_shift_2_harq_ack_bits[4]
-/*        HARQ-ACK Value       (0,0)  (0,1)  (1,0)  (1,1) */
-/* Sequence cyclic shift */ = {   0,     3,     9,     6 }
-;
-
-/* TS 38.211 Table 6.4.1.3.3.2-1: DM-RS positions for PUCCH format 3 and 4 */
-static const int nb_symbols_excluding_dmrs[NB_SYMBOL_MINUS_FOUR][2][2]
-= {
-/*                     No additional DMRS            Additional DMRS   */
-/* PUCCH length      No hopping   hopping         No hopping   hopping */
-/* index                  0          1                 0          1    */
-/*    4     */    {{      3    ,     2   }   ,  {      3     ,    2    }},
-/*    5     */    {{      3    ,     3   }   ,  {      3     ,    3    }},
-/*    6     */    {{      4    ,     4   }   ,  {      4     ,    4    }},
-/*    7     */    {{      5    ,     5   }   ,  {      5     ,    5    }},
-/*    8     */    {{      6    ,     6   }   ,  {      6     ,    6    }},
-/*    9     */    {{      7    ,     7   }   ,  {      7     ,    7    }},
-/*   10     */    {{      8    ,     8   }   ,  {      6     ,    6    }},
-/*   11     */    {{      9    ,     9   }   ,  {      7     ,    7    }},
-/*   12     */    {{     10    ,    10   }   ,  {      8     ,    8    }},
-/*   13     */    {{     11    ,    11   }   ,  {      9     ,    9    }},
-/*   14     */    {{     12    ,    12   }   ,  {     10     ,   10    }},
-}
-;
-
-
-/* TS 36.213 Table 9.2.5-1: Mapping of values for one HARQ-ACK bit and positive SR to sequences */
-static const int sequence_cyclic_shift_1_harq_ack_bit_positive_sr[2]
-/*        HARQ-ACK Value        0    1 */
-/* Sequence cyclic shift */ = { 3,   9 }
-;
-
 static float RSRP_meas_mapping_nr[98]
 = {
   -140,
@@ -366,1063 +311,86 @@ void nr_generate_pucch3_4(int32_t **txdataF,
 *
 *********************************************************************/
 
-/* 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]
-=
-{
-/*              format           first symbol     Number of symbols        PRB offset    nb index for       set of initial CS */
-/*  0  */ {  pucch_format0_nr,      12,                  2,                   0,            2,       {    0,   3,    0,    0  }   },
-/*  1  */ {  pucch_format0_nr,      12,                  2,                   0,            3,       {    0,   4,    8,    0  }   },
-/*  2  */ {  pucch_format0_nr,      12,                  2,                   3,            3,       {    0,   4,    8,    0  }   },
-/*  3  */ {  pucch_format1_nr,      10,                  4,                   0,            2,       {    0,   6,    0,    0  }   },
-/*  4  */ {  pucch_format1_nr,      10,                  4,                   0,            4,       {    0,   3,    6,    9  }   },
-/*  5  */ {  pucch_format1_nr,      10,                  4,                   2,            4,       {    0,   3,    6,    9  }   },
-/*  6  */ {  pucch_format1_nr,      10,                  4,                   4,            4,       {    0,   3,    6,    9  }   },
-/*  7  */ {  pucch_format1_nr,       4,                 10,                   0,            2,       {    0,   6,    0,    0  }   },
-/*  8  */ {  pucch_format1_nr,       4,                 10,                   0,            4,       {    0,   3,    6,    9  }   },
-/*  9  */ {  pucch_format1_nr,       4,                 10,                   2,            4,       {    0,   3,    6,    9  }   },
-/* 10  */ {  pucch_format1_nr,       4,                 10,                   4,            4,       {    0,   3,    6,    9  }   },
-/* 11  */ {  pucch_format1_nr,       0,                 14,                   0,            2,       {    0,   6,    0,    0  }   },
-/* 12  */ {  pucch_format1_nr,       0,                 14,                   0,            4,       {    0,   3,    6,    9  }   },
-/* 13  */ {  pucch_format1_nr,       0,                 14,                   2,            4,       {    0,   3,    6,    9  }   },
-/* 14  */ {  pucch_format1_nr,       0,                 14,                   4,            4,       {    0,   3,    6,    9  }   },
-/* 15  */ {  pucch_format1_nr,       0,                 14,                   0,            4,       {    0,   3,    6,    9  }   },
-}
-;
+void pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, 
+                            uint8_t gNB_id,
+                            UE_nr_rxtx_proc_t *proc) {
 
-bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_t *proc, bool reset_harq)
-{
-  uint8_t   sr_payload = 0;
-  uint32_t  pucch_ack_payload = 0; /* maximum number of bits for pucch payload is supposed to be 32 */
-  uint64_t  pucch_payload = 0;
-  uint32_t  csi_payload = 0;
-  int       frame_tx = proc->frame_tx;
   int       nr_slot_tx = proc->nr_slot_tx;
-  int       Mod_id = ue->Mod_id;
-  int       CC_id = ue->CC_id;
-
-  int       O_SR = 0;
-  int       O_ACK = 0;
-  int       O_CSI = 0;      /* channel state information */
-  int       N_UCI = 0;      /* size in bits for Uplink Control Information */
-  int       cqi_status = 0;
-  int       ri_status = 0;
-  int       csi_status = 0;
-
-  int       initial_pucch_id = NB_INITIAL_PUCCH_RESOURCE;
-  int       pucch_resource_set = MAX_NB_OF_PUCCH_RESOURCE_SETS;
-  int       pucch_resource_id = MAX_NB_OF_PUCCH_RESOURCES;
-  int       pucch_resource_indicator = MAX_PUCCH_RESOURCE_INDICATOR;
-  int       n_HARQ_ACK;
-
-  int dmrs_scrambling_id=0,data_scrambling_id=0;
-
-  NR_UE_MAC_INST_t *mac = get_mac_inst(0);
-  NR_PUCCH_Resource_t *pucch_resource = NULL;
-  uint16_t crnti = mac->crnti;
-  NR_BWP_Id_t bwp_id = mac->UL_BWP_Id;
-
-  /* update current context */
-
-  int subframe_number = proc->nr_slot_rx / ue->frame_parms.slots_per_subframe;
-  nb_pucch_format_4_in_subframes[subframe_number] = 0; /* reset pucch format 4 counter at current rx position */
-
-  int dl_harq_pid = ue->dlsch[proc->thread_id][gNB_id][0]->current_harq_pid;
-
-  if (dl_harq_pid < ue->dlsch[proc->thread_id][gNB_id][0]->number_harq_processes_for_pdsch) {
-    /* pucch indicator can be reseted in function get_downlink_ack so it should be get now */
-    pucch_resource_indicator = ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid]->harq_ack.pucch_resource_indicator;
-  }
-
-  LOG_D(PHY, "PUCCH: %d.%d bwp_id %ld dl_harq_pid = %d, pucch_resource_indicator = %d\n", frame_tx, nr_slot_tx, bwp_id,dl_harq_pid, pucch_resource_indicator);
-
-  /* Part - I
-   * Collect feedback that should be transmitted at this nr_slot_tx :
-   * - ACK/NACK, SR, CSI (CQI, RI, ...)
-   */
-
-  sr_payload = 0;
-
-  if (trigger_periodic_scheduling_request( ue, gNB_id, proc ) == 1) {
-    O_SR = 1; /* sr should be transmitted */
-    if (ue->mac_enabled == 1) {
-
-      /* sr_payload = 1 means that this is a positive SR, sr_payload = 0 means that it is a negative SR */
-      sr_payload = nr_ue_get_SR(Mod_id,
-                                CC_id,
-                                frame_tx,
-                                gNB_id,
-                                0,//ue->pdcch_vars[proc->thread_id][gNB_id]->crnti,
-                                nr_slot_tx); // nr_slot_rx used for meas gap
-    }
-    else {
-      sr_payload = 1;
-    }
-  }
-
-  O_ACK = get_downlink_ack( ue, gNB_id, proc, &pucch_ack_payload,
-                            &n_HARQ_ACK, reset_harq); // 1 to reset ACK/NACK status : 0 otherwise
-
-  cqi_status = ((ue->cqi_report_config[gNB_id].CQI_ReportPeriodic.cqi_PMI_ConfigIndex>0) &&
-                                                         (nr_is_cqi_TXOp(ue,proc,gNB_id) == 1));
-
-  ri_status = ((ue->cqi_report_config[gNB_id].CQI_ReportPeriodic.ri_ConfigIndex>0) &&
-                                                         (nr_is_ri_TXOp(ue,proc,gNB_id) == 1));
-
-
-  if (mac->cg &&
-      mac->cg->spCellConfig &&
-      mac->cg->spCellConfig->spCellConfigDedicated &&
-      mac->cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig&&
-      mac->cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup) {
-    NR_CSI_MeasConfig_t *csi_MeasConfig = mac->cg->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_slot_tx)
-      csi_status = get_csi_nr(mac, ue, gNB_id, &csi_payload);
-    else
-      csi_status = 0;
-    //}
-
-    O_CSI = cqi_status + ri_status + csi_status;
-
-    /* Part - II */
-    /* if payload is empty or only negative SR -> no pucch transmission */
-
-  if(O_ACK == 0) {
-    N_UCI = O_SR + O_CSI;
-    if ((N_UCI == 0) || ((O_CSI == 0) && (sr_payload == 0))) {   /* TS 38.213 9.2.4 UE procedure for reporting SR */
-      NR_TST_PHY_PRINTF("PUCCH No feedback AbsSubframe %d.%d \n", frame_tx%1024, nr_slot_tx);
-      LOG_D(PHY,"PUCCH No feedback AbsSubframe %d.%d \n", frame_tx%1024, nr_slot_tx);
-      return (FALSE);
-    }
-    else {
-      /* a resource set and a resource should be find according to payload size */
-      pucch_resource_set = find_pucch_resource_set( mac, gNB_id, N_UCI);
-      if (pucch_resource_set != MAX_NB_OF_PUCCH_RESOURCE_SETS) {
-        pucch_resource_indicator = 0;
-        /* get the first resource of the set */
-        pucch_resource_id = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set]->resourceList.list.array[pucch_resource_indicator][0];
-      }
-      else {
-        LOG_W(PHY,"PUCCH no resource set found for CSI at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-        O_CSI = 0;
-        csi_payload = 0;
-      }
-
-	if (O_CSI == 0) {
-	  /* only SR has to be send */
-	  /* in this case there is no DCI related to PUCCH parameters so pucch resource should be get from sr configuration */
-	  /* TS 38.213 9.2.4 UE procedure for reporting SR */
-	  pucch_resource_set = 0; /* force it to a valid value */
-	  if (ue->scheduling_request_config_nr[gNB_id].sr_ResourceConfig[ue->scheduling_request_config_nr[gNB_id].active_sr_id] != NULL) {
-	    pucch_resource_id = ue->scheduling_request_config_nr[gNB_id].sr_ResourceConfig[ue->scheduling_request_config_nr[gNB_id].active_sr_id]->resource;
-	  }
-	  else {
-	    LOG_E(PHY,"PUCCH No scheduling request configuration : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-	    return(FALSE);
-	  }
-	}
-      }
-    }
-  }
-
-  N_UCI = O_SR + O_ACK + O_CSI;
-  if (N_UCI ==0) return(TRUE);
-
-  /* Part - III */
-  /* Choice PUCCH format and its related parameters */
-  pucch_format_nr_t format = pucch_format0_nr;
-  uint8_t  starting_symbol_index=0;
-  uint8_t nb_symbols_total = 0;
-  uint8_t  nb_symbols = 0;
-  uint16_t startingPRB = 0;;  /* it can be considered as first  hop on case of pucch hopping */
-  uint16_t secondHopPRB = 0;     /* second part for pucch for hopping */
-  uint8_t  nb_of_prbs = 0;
-  int m_0 = 0;                 /* format 0 only */
-  int m_CS = 0;                /* for all format except for format 0 */
-  int index_additional_dmrs = I_PUCCH_NO_ADDITIONAL_DMRS;
-  int index_hopping = I_PUCCH_NO_HOPPING;
-  int time_domain_occ = 0;
-  int occ_length = 0;
-  int occ_Index = 0;
-  int BWPsize = 0;
-  int BWPstart = INT_MAX;
-
-  NR_UE_HARQ_STATUS_t *harq_status = &ue->dlsch[proc->thread_id][gNB_id][0]->harq_processes[dl_harq_pid]->harq_ack;
-
-  if (select_pucch_resource(ue, mac, gNB_id, N_UCI, pucch_resource_indicator, &initial_pucch_id, &pucch_resource_set,
-                            &pucch_resource_id, harq_status) == TRUE) {
-    /* use of initial pucch configuration provided by system information 1 */
-    /***********************************************************************/
-    if (initial_pucch_id != NB_INITIAL_PUCCH_RESOURCE) {
-      LOG_D(MAC,"Selecting INITIAL PUCCH Resource\n");
-      format = initial_pucch_resource[initial_pucch_id].format;
-      starting_symbol_index = initial_pucch_resource[initial_pucch_id].startingSymbolIndex;
-      nb_symbols_total = initial_pucch_resource[initial_pucch_id].nrofSymbols;
-
-      int N_CS = initial_pucch_resource[initial_pucch_id].nb_CS_indexes;
-      /* see TS 38213 Table 9.2.1-1: PUCCH resource sets before dedicated PUCCH resource configuration */
-      BWPsize = NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
-      BWPstart = NRRIV2PRBOFFSET(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
-      int RB_BWP_offset;
-      if (initial_pucch_id == 15) {
-        RB_BWP_offset =BWPsize/4;
-      }
-      else
-      {
-        RB_BWP_offset = initial_pucch_resource[initial_pucch_id].PRB_offset;
-      }
-      if (initial_pucch_id/8 == 0) {
-        startingPRB = RB_BWP_offset + (initial_pucch_id/N_CS);
-        secondHopPRB = BWPsize - 1 - RB_BWP_offset - (initial_pucch_id/N_CS);
-        m_0 = initial_pucch_resource[initial_pucch_id].initial_CS_indexes[initial_pucch_id%N_CS];
-      }
-      else if (initial_pucch_id/8 == 1)
-      {
-        startingPRB = RB_BWP_offset + (initial_pucch_id/N_CS);
-        secondHopPRB = BWPsize - 1 - RB_BWP_offset - ((initial_pucch_id - 8)/N_CS);
-        m_0 =  initial_pucch_resource[initial_pucch_id].initial_CS_indexes[(initial_pucch_id - 8)%N_CS];
-      }
-      if ((ue->UE_mode[gNB_id] != PUSCH) && (O_ACK > 1)) {
-        O_ACK = 1;
-        pucch_ack_payload &= 0x1; /* take only first ack */
-        LOG_W(PHY,"PUCCH ue is not expected to generate more than one HARQ-ACK at AbsSubframe %d.%d \n", frame_tx%1024, nr_slot_tx);
-      }
-      NR_TST_PHY_PRINTF("PUCCH common configuration with index %d \n", initial_pucch_id);
-      startingPRB += BWPstart;
-      secondHopPRB += BWPstart;
-    }
-    /* use dedicated pucch resource configuration */
-    /**********************************************/
-    else if ((pucch_resource_set != MAX_NB_OF_PUCCH_RESOURCE_SETS) && (pucch_resource_id != MAX_NB_OF_PUCCH_RESOURCES)) {
-      /* check that current configuration is supported */
-      if (mac->cg &&
-	        mac->cg->physicalCellGroupConfig &&
-          (mac->cg->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUCCH != NULL || mac->cg->physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook != 1)) {
-        LOG_E(PHY,"PUCCH Unsupported cell group configuration : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-        return(FALSE);
-      }
-      else if (mac->cg &&
-               mac->cg->spCellConfig &&
-               mac->cg->spCellConfig->spCellConfigDedicated &&
-               mac->cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig &&
-               mac->cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup &&
-               mac->cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup->codeBlockGroupTransmission != NULL) {
-        LOG_E(PHY,"PUCCH Unsupported code block group for serving cell config : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-        return(FALSE);
-      }
-      NR_PUCCH_Config_t *pucch_Config;
-      if (bwp_id>0 &&
-          mac->ULbwp[bwp_id-1] &&
-          mac->ULbwp[bwp_id-1]->bwp_Dedicated &&
-          mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
-          mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup) {
-        pucch_Config =  mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup;
-        BWPsize  =  NRRIV2BW(mac->ULbwp[bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
-        BWPstart =  NRRIV2PRBOFFSET(mac->ULbwp[bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
-      } else if (bwp_id==0 &&
-               mac->cg &&
-               mac->cg->spCellConfig &&
-               mac->cg->spCellConfig->spCellConfigDedicated &&
-               mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
-               mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
-               mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
-               mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
-        pucch_Config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
-        BWPsize  =  NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
-        BWPstart =  NRRIV2PRBOFFSET(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
-      }
-
-      else AssertFatal(1==0,"no pucch_Config\n");
-      pucch_resource = select_resource_by_id(pucch_resource_id, pucch_Config);
-      format = pucch_resource->format.present;
-      nb_symbols_total = get_nb_symbols_pucch(pucch_resource, format);
-      starting_symbol_index = get_starting_symb_idx(pucch_resource, format);
-      startingPRB   = BWPstart + pucch_resource->startingPRB;
-      secondHopPRB = pucch_resource->intraSlotFrequencyHopping ? (BWPstart+*pucch_resource->secondHopPRB) : startingPRB;
-      if (format==pucch_format1_nr)
-        time_domain_occ = pucch_resource->format.choice.format1->timeDomainOCC;
-      if (format==pucch_format4_nr) {
-        occ_length = pucch_resource->format.choice.format4->occ_Length;
-        occ_Index  = pucch_resource->format.choice.format4->occ_Index;
-      }
-
-      m_0 = get_ics_pucch(pucch_resource, format);
-      AssertFatal(m_0 >= 0, "Invalid m_0\n");
-      if (format == pucch_format3_nr) {
-        if (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->format3->choice.setup->additionalDMRS[0] == 1) {
-          index_additional_dmrs = I_PUCCH_ADDITIONAL_DMRS;
-        }
-      }
-      else if (format == pucch_format4_nr) {
-        if (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->format4->choice.setup->additionalDMRS[0] == 1) {
-          index_additional_dmrs = I_PUCCH_ADDITIONAL_DMRS;
-        }
-      }
-
-      if ((format == pucch_format3_nr) || (format == pucch_format4_nr)) {
-        if (pucch_resource->intraSlotFrequencyHopping[0] == 1) {
-          index_hopping = I_PUCCH_HOPING;
-        }
-      }
-
-      NR_TST_PHY_PRINTF("PUCCH dedicated configuration with resource index %d \n", pucch_resource_id);
-    }
+  fapi_nr_ul_config_pucch_pdu *pucch_pdu;
+  NR_UE_PUCCH *pucch_vars = ue->pucch_vars[proc->thread_id][gNB_id];
+
+  for (int i=0; i<2; i++) {
+    if(pucch_vars->active[i]) {
+
+      pucch_pdu = &pucch_vars->pucch_pdu[i];
+      uint16_t nb_of_prbs = pucch_pdu->prb_size;
+      /* Generate PUCCH signal according to its format and parameters */
+      ue->generate_ul_signal[gNB_id] = 1;
+
+      int16_t PL = get_nr_PL(ue->Mod_id, ue->CC_id, gNB_id); /* LTE function because NR path loss not yet implemented FFS TODO NR */
+      int contributor = (10 * log10((double)(pow(2,(ue->frame_parms.numerology_index)) * nb_of_prbs)));
+
+      int16_t pucch_tx_power = pucch_pdu->pucch_tx_power + contributor + PL;
+
+      if (pucch_tx_power > ue->tx_power_max_dBm)
+        pucch_tx_power = ue->tx_power_max_dBm;
+
+      /* set tx power */
+      ue->tx_power_dBm[nr_slot_tx] = pucch_tx_power;
+      ue->tx_total_RE[nr_slot_tx] = nb_of_prbs*N_SC_RB;
+
+      int tx_amp;
+
+      tx_amp = nr_get_tx_amp(pucch_tx_power,
+                             ue->tx_power_max_dBm,
+                             ue->frame_parms.N_RB_UL,
+                             nb_of_prbs);
+      if (tx_amp == 0)
+        tx_amp = AMP;
+
+
+      LOG_D(PHY,"Generation of PUCCH format %d at frame.slot %d.%d\n",pucch_pdu->format_type,proc->frame_tx,nr_slot_tx);
+
+      switch(pucch_pdu->format_type) {
+        case 0:
+          nr_generate_pucch0(ue,
+                             ue->common_vars.txdataF,
+                             &ue->frame_parms,
+                             tx_amp,
+                             nr_slot_tx,
+                             pucch_pdu);
+          break;
+        case 1:
+          nr_generate_pucch1(ue,
+                             ue->common_vars.txdataF,
+                             &ue->frame_parms,
+                             tx_amp,
+                             nr_slot_tx,
+                             pucch_pdu);
+          break;
+        case 2:
+          nr_generate_pucch2(ue,
+                             ue->common_vars.txdataF,
+                             &ue->frame_parms,
+                             tx_amp,
+                             nr_slot_tx,
+                             pucch_pdu);
+          break;
+        case 3:
+        case 4:
+          nr_generate_pucch3_4(ue,
+                               ue->common_vars.txdataF,
+                               &ue->frame_parms,
+                               tx_amp,
+                               nr_slot_tx,
+                               pucch_pdu);
+          break;
+      }
+    }
+    pucch_vars->active[i] = false;
   }
-  else {
-    LOG_W(PHY,"PUCCH No PUCCH resource found at AbsSubframe %d.%d \n", frame_tx%1024, nr_slot_tx);
-    return (FALSE);
-  }
-
-  //int max_code_rate = 0;
-  //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;
-
-  nb_symbols = nb_symbols_total; /* by default, it can be reduced due to symbols reserved for dmrs */
-
-  switch(format) {
-    case pucch_format0_nr:
-    {
-      nb_of_prbs = 1;
-      N_sc_ctrl_RB = N_SC_RB;
-      break;
-    }
-    case pucch_format1_nr:
-    {
-      nb_of_prbs = 1;
-      N_sc_ctrl_RB = N_SC_RB;
-      break;
-    }
-    case pucch_format2_nr:
-    {
-      nb_of_prbs = pucch_resource->format.choice.format2->nrofPRBs;
-      N_sc_ctrl_RB = N_SC_RB - 4;
-      break;
-    }
-    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 */
-      //}
-      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 */
-      //}
-      nb_symbols = nb_symbols_excluding_dmrs[nb_symbols_total-4][index_additional_dmrs][index_hopping];
-      nb_of_prbs = 1;
-      subframe_number = nr_slot_tx / ue->frame_parms.slots_per_subframe;
-      nb_pucch_format_4_in_subframes[subframe_number]++; /* increment number of transmit pucch 4 in current subframe */
-      NR_TST_PHY_PRINTF("PUCCH Number of pucch format 4 in subframe %d is %d \n", subframe_number, nb_pucch_format_4_in_subframes[subframe_number]);
-      N_sc_ctrl_RB = N_SC_RB/(nb_pucch_format_4_in_subframes[subframe_number]);
-      break;
-    }
-  }
-
-  /* TS 38.213 9.2.5.2 UE procedure for multiplexing HARQ-ACK/SR and CSI */
-  /* drop CSI report if simultaneous HARQ-ACK/SR and periodic/semi-periodic CSI cannot be transmitted at the same time */
-  if (format !=  pucch_format0_nr) {
-
-    if (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->format1 != NULL) {
-      //max_code_rate = code_rate_r_time_100[mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->format1->choice.setup->maxCodeRate[0]]; /* it is code rate * 10 */
-
-      if ((O_ACK != 0) && (mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->format1->choice.setup->simultaneousHARQ_ACK_CSI[0] == 0)) {
-        N_UCI = N_UCI - O_CSI;
-        O_CSI = cqi_status = ri_status = 0;
-        csi_payload = 0; /* csi should be dropped in this case */
-      }
-    }
-
-    /* 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 */
-//    }
-
-    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 ) {
-      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",
-                                               N_UCI,        payload_in_bits,       N_sc_ctrl_RB,       nb_symbols,       Q_m,       max_code_rate);
-      } while (N_UCI > payload_in_bits);
-
-      if (nb_prb_min > nb_of_prbs) {
-        LOG_E(PHY,"PUCCH Number of prbs too small for current pucch bits to transmit : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-        return (FALSE);
-      }
-      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)) {
-      sr_payload = 0;
-    }
-  }
-  else {  /* only format 0 here */
-    if ((O_SR == 0) && (O_CSI == 0)) {  /* only ack is transmitted TS 36.213 9.2.3 UE procedure for reporting HARQ-ACK */
-      if (O_ACK == 1) {
-        m_CS = sequence_cyclic_shift_1_harq_ack_bit[pucch_ack_payload & 0x1];   /* only harq of 1 bit */
-      }
-      else {
-        m_CS = sequence_cyclic_shift_2_harq_ack_bits[pucch_ack_payload & 0x3];  /* only harq with 2 bits */
-      }
-    }
-    else if ((O_SR == 1) && (O_CSI == 0)) { /* SR + eventually ack are transmitted TS 36.213 9.2.5.1 UE procedure for multiplexing HARQ-ACK or CSI and SR */
-      if (sr_payload == 1) {                /* positive scheduling request */
-        if (O_ACK == 1) {
-          m_CS = sequence_cyclic_shift_1_harq_ack_bit_positive_sr[pucch_ack_payload & 0x1];   /* positive SR and harq of 1 bit */
-        }
-        else if (O_ACK == 2) {
-          m_CS = sequence_cyclic_shift_2_harq_ack_bits_positive_sr[pucch_ack_payload & 0x3];  /* positive SR and harq with 2 bits */
-        }
-        else {
-          m_CS = 0;  /* only positive SR */
-        }
-      }
-    }
-    N_UCI = O_SR = O_ACK = 0;
-    pucch_payload = sr_payload = pucch_ack_payload = 0; /* no data for format 0 */
-  }
-
-  /* TS 38.212 6.3.1  Uplink control information on PUCCH                                       */
-  /* information concatenation of payload                                                       */
-  /*                                                   CSI           SR          HARQ-ACK       */
-  /* bit order of payload of size n :           a(n)....................................a(0)    */
-  /* a(0) is the LSB and a(n) the MSB   <--------><--------------><------------><---------->    */
-  /*                                       O_CRC        O_CSI           O_SR         O_ACK      */
-  /*                                                                                            */
-  /* remark: crc is not part of payload, it is later added by block coding.                     */
-
-  if (N_UCI > (sizeof(uint64_t)*8)) {
-    LOG_E(PHY,"PUCCH number of UCI bits exceeds payload size : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-    return(0);
-  }
-
-  pucch_payload = pucch_payload | (csi_payload << (O_ACK + O_SR)) |  (sr_payload << O_ACK) | pucch_ack_payload;
-
-  NR_TST_PHY_PRINTF("PUCCH ( AbsSubframe : %d.%d ) ( total payload size %d data 0x%02x ) ( ack length %d data 0x%02x ) ( sr length %d value %d ) ( csi length %d data : 0x%02x ) \n",
-                         frame_tx%1024, nr_slot_tx, N_UCI,  pucch_payload, O_ACK, pucch_ack_payload, O_SR, sr_payload, csi_status, csi_payload);
-
-  NR_TST_PHY_PRINTF("PUCCH ( format : %d ) ( modulation : %s ) ( nb prb : %d ) ( nb symbols total: %d ) ( nb symbols : %d ) ( max code rate*100 : %d ) ( starting_symbol_index : %d ) \n",
-                             format, (Q_m == BITS_PER_SYMBOL_QPSK ? " QPSK " : " BPSK "), nb_of_prbs, nb_symbols_total, nb_symbols, max_code_rate, starting_symbol_index);
-
-  NR_TST_PHY_PRINTF("PUCCH ( startingPRB : %d ) ( secondHopPRB : %d ) ( m_0 : %d ) ( m_CS : %d ) ( time_domain_occ %d ) (occ_length : %d ) ( occ_Index : %d ) \n",
-		    startingPRB (absolute),         secondHopPRB (absolute),         m_0,         m_CS,         time_domain_occ,      occ_length,         occ_Index);
-
-  /* Part - IV */
-  /* Generate PUCCH signal according to its format and parameters */
-  ue->generate_ul_signal[gNB_id] = 1;
-
-  int16_t pucch_tx_power = get_pucch_tx_power_ue( ue, gNB_id, proc, format,
-                                                  nb_of_prbs, N_sc_ctrl_RB, nb_symbols, N_UCI, O_SR, O_CSI, O_ACK,
-                                                  O_CRC, n_HARQ_ACK);
-
-  /* set tx power */
-  ue->tx_power_dBm[nr_slot_tx] = pucch_tx_power;
-  ue->tx_total_RE[nr_slot_tx] = nb_of_prbs*N_SC_RB;
-
-  int tx_amp;
-
-#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) || defined(OAI_ADRV9371_ZC706)
-
-  tx_amp = nr_get_tx_amp(pucch_tx_power,
-                      ue->tx_power_max_dBm,
-                      ue->frame_parms.N_RB_UL,
-                      nb_of_prbs);
-#else
-  tx_amp = AMP;
-#endif
-
-  switch(format) {
-    case pucch_format0_nr:
-    {
-      int pucch_GroupHopping = mac->ULbwp[bwp_id-1] ?
-            mac->ULbwp[bwp_id-1]->bwp_Common->pucch_ConfigCommon->choice.setup->pucch_GroupHopping:
-            mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pucch_ConfigCommon->choice.setup->pucch_GroupHopping;
-      int hoppingId = mac->ULbwp[bwp_id-1] ?
-            mac->ULbwp[bwp_id-1]->bwp_Common->pucch_ConfigCommon->choice.setup->hoppingId[0]:
-            (mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pucch_ConfigCommon->choice.setup->hoppingId?
-             mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pucch_ConfigCommon->choice.setup->hoppingId[0]:
-             mac->physCellId);
-      nr_generate_pucch0(ue,ue->common_vars.txdataF,
-                         &ue->frame_parms,
-                         pucch_GroupHopping,
-                         hoppingId,
-                         tx_amp,
-                         nr_slot_tx,
-                         (uint8_t)m_0,
-                         (uint8_t)m_CS,
-                         nb_symbols_total,
-                         starting_symbol_index,
-                         startingPRB,
-                         secondHopPRB
-                         );
-      break;
-    }
-    case pucch_format1_nr:
-    {
-      nr_generate_pucch1(ue,ue->common_vars.txdataF,
-                         &ue->frame_parms,
-                         &ue->pucch_config_dedicated[gNB_id],
-                         pucch_payload,
-                         tx_amp,
-                         nr_slot_tx,
-                         (uint8_t)m_0,
-                         nb_symbols_total,
-                         starting_symbol_index,
-                         startingPRB,
-                         secondHopPRB,
-                         (uint8_t)time_domain_occ,
-                         (uint8_t)N_UCI);
-      break;
-    }
-    case pucch_format2_nr:
-    {
-      nr_generate_pucch2(ue,
-                         crnti,
-			 dmrs_scrambling_id,
-			 data_scrambling_id,
-                         ue->common_vars.txdataF,
-                         &ue->frame_parms,
-                         &ue->pucch_config_dedicated[gNB_id],
-                         pucch_payload,
-                         tx_amp,
-                         nr_slot_tx,
-                         nb_symbols_total,
-                         starting_symbol_index,
-                         nb_of_prbs,
-                         startingPRB,
-                         (uint8_t)N_UCI);
-      break;
-    }
-    case pucch_format3_nr:
-    case pucch_format4_nr:
-    {
-      nr_generate_pucch3_4(ue,
-                           0,//ue->pdcch_vars[proc->thread_id][gNB_id]->crnti,
-                           ue->common_vars.txdataF,
-                           &ue->frame_parms,
-                           format,
-                           &ue->pucch_config_dedicated[gNB_id],
-                           pucch_payload,
-                           tx_amp,
-                           nr_slot_tx,
-                           nb_symbols_total,
-                           starting_symbol_index,
-                           nb_of_prbs,
-                           startingPRB,
-                           secondHopPRB,
-                           (uint8_t)N_UCI,
-                           (uint8_t)occ_length,
-                           (uint8_t)occ_Index);
-      break;
-    }
-  }
-  return (TRUE);
 }
 
-/*******************************************************************
-*
-* NAME :         get_downlink_ack
-*
-* PARAMETERS :   ue context
-*                processing slots of reception/transmission
-*                gNB_id identifier
-*
-* RETURN :       o_ACK acknowledgment data
-*                o_ACK_number_bits number of bits for acknowledgment
-*
-* DESCRIPTION :  return acknowledgment value
-*                TS 38.213 9.1.3 Type-2 HARQ-ACK codebook determination
-*
-*          --+--------+-------+--------+-------+---  ---+-------+--
-*            | PDCCH1 |       | PDCCH2 |PDCCH3 |        | PUCCH |
-*          --+--------+-------+--------+-------+---  ---+-------+--
-*    DAI_DL      1                 2       3              ACK for
-*                V                 V       V        PDCCH1, PDDCH2 and PCCH3
-*                |                 |       |               ^
-*                +-----------------+-------+---------------+
-*
-*                PDCCH1, PDCCH2 and PDCCH3 are PDCCH monitoring occasions
-*                M is the total of monitoring occasions
-*
-*********************************************************************/
-
-uint8_t get_downlink_ack(PHY_VARS_NR_UE *ue, uint8_t gNB_id,  UE_nr_rxtx_proc_t *proc,
-                         uint32_t *o_ACK, int *n_HARQ_ACK,
-                         bool do_reset) // 1 to reset ACK/NACK status : 0 otherwise
-{
-  NR_UE_HARQ_STATUS_t *harq_status;
-  uint32_t ack_data[NR_DL_MAX_NB_CW][NR_DL_MAX_DAI] = {{0},{0}};
-  uint32_t dai[NR_DL_MAX_NB_CW][NR_DL_MAX_DAI] = {{0},{0}};       /* for serving cell */
-  uint32_t dai_total[NR_DL_MAX_NB_CW][NR_DL_MAX_DAI] = {{0},{0}}; /* for multiple cells */
-  int number_harq_feedback = 0;
-  uint32_t dai_current = 0;
-  uint32_t dai_max = 0;
-  int number_pid_dl = ue->dlsch[proc->thread_id][gNB_id][0]->number_harq_processes_for_pdsch;
-  bool two_transport_blocks = FALSE;
-  int number_of_code_word = 1;
-  int U_DAI_c = 0;
-  int N_m_c_rx = 0;
-  int V_DAI_m_DL = 0;
-  NR_UE_MAC_INST_t *mac = get_mac_inst(0);
-
-  if (mac->DLbwp[0] &&
-      mac->DLbwp[0]->bwp_Dedicated &&
-      mac->DLbwp[0]->bwp_Dedicated->pdsch_Config &&
-      mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup &&
-      mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI[0] == 2) {
-    two_transport_blocks = TRUE;
-    number_of_code_word = 2;
-  }
-  else {
-    number_of_code_word = 1;
-  }
-
-  if (ue->n_connected_gNB > 1) {
-    LOG_E(PHY,"PUCCH ACK feedback is not implemented for mutiple gNB cells : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-    return (0);
-  }
-
-  /* look for dl acknowledgment which should be done on current uplink slot */
-  for (int code_word = 0; code_word < number_of_code_word; code_word++) {
-
-    for (int dl_harq_pid = 0; dl_harq_pid < number_pid_dl; dl_harq_pid++) {
-
-      for (int thread_idx = 0; thread_idx < RX_NB_TH; thread_idx++) {
-
-        harq_status = &ue->dlsch[thread_idx][gNB_id][code_word]->harq_processes[dl_harq_pid]->harq_ack;
-
-        /* check if current tx slot should transmit downlink acknowlegment */
-        if (harq_status->slot_for_feedback_ack == proc->nr_slot_tx) {
-
-          if (harq_status->ack == DL_ACKNACK_NO_SET) {
-            LOG_E(PHY,"PUCCH Downlink acknowledgment has not been set : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-          }
-          else if (harq_status->vDAI_DL == DL_DAI_NO_SET) {
-            LOG_E(PHY,"PUCCH Downlink DAI has not been set : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-          }
-          else if (harq_status->vDAI_DL > NR_DL_MAX_DAI) {
-            LOG_E(PHY,"PUCCH Downlink DAI has an invalid value : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-          }
-          else if (harq_status->send_harq_status == 0) {
-            LOG_E(PHY,"PUCCH Downlink ack can not be transmitted : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-          }
-          else {
-
-            dai_current = harq_status->vDAI_DL+1; // DCI DAI to counter DAI conversion
-
-            if (dai_current == 0) {
-              LOG_E(PHY,"PUCCH Downlink dai is invalid : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-              return(0);
-            } else if (dai_current > dai_max) {
-              dai_max = dai_current;
-            }
-
-            number_harq_feedback++;
-            ack_data[code_word][dai_current - 1] = harq_status->ack;
-            dai[code_word][dai_current - 1] = dai_current;
-            harq_status->slot_for_feedback_ack = NR_MAX_SLOTS_PER_FRAME;
-            harq_status->send_harq_status = 0;
-          }
-          if (do_reset == TRUE) {
-            init_downlink_harq_status(ue->dlsch[thread_idx][gNB_id][code_word]->harq_processes[dl_harq_pid]);
-          }
-        }
-      }
-    }
-  }
-
-  /* no any ack to transmit */
-  if (number_harq_feedback == 0) {
-    *n_HARQ_ACK = 0;
-    return(0);
-  }
-  else  if (number_harq_feedback > (sizeof(uint32_t)*8)) {
-    LOG_E(PHY,"PUCCH number of ack bits exceeds payload size : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-    return(0);
-  }
-
-  /* for computing n_HARQ_ACK for power */
-   V_DAI_m_DL = dai_max;
-   U_DAI_c = number_harq_feedback/number_of_code_word;
-   N_m_c_rx = number_harq_feedback;
-   int N_SPS_c = 0; /* FFS TODO_NR multicells and SPS are not supported at the moment */
-   if (mac->cg != NULL &&
-       mac->cg->physicalCellGroupConfig != NULL &&
-       mac->cg->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUCCH != NULL) {
-     int N_TB_max_DL = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI[0];
-     *n_HARQ_ACK = (((V_DAI_m_DL - U_DAI_c)%4) * N_TB_max_DL) + N_m_c_rx + N_SPS_c;
-     NR_TST_PHY_PRINTF("PUCCH power n(%d) = ( V(%d) - U(%d) )mod4 * N_TB(%d) + N(%d) \n", *n_HARQ_ACK, V_DAI_m_DL, U_DAI_c, N_TB_max_DL, N_m_c_rx);
-   }
-
-  /*
-  * For a monitoring occasion of a PDCCH with DCI format 1_0 or DCI format 1_1 in at least one serving cell,
-  * when a UE receives a PDSCH with one transport block and the value of higher layer parameter maxNrofCodeWordsScheduledByDCI is 2,
-  * the HARQ-ACK response is associated with the first transport block and the UE generates a NACK for the second transport block
-  * if spatial bundling is not applied (HARQ-ACK-spatial-bundling-PUCCH = FALSE) and generates HARQ-ACK value of ACK for the second
-  * transport block if spatial bundling is applied.
-  */
-
-  for (int code_word = 0; code_word < number_of_code_word; code_word++) {
-    for (uint32_t i = 0; i < dai_max ; i++ ) {
-      if (dai[code_word][i] != i + 1) { /* fill table with consistent value for each dai */
-        dai[code_word][i] = i + 1;      /* it covers case for which PDCCH DCI has not been successfully decoded and so it has been missed */
-        ack_data[code_word][i] = 0;     /* nack data transport block which has been missed */
-        number_harq_feedback++;
-      }
-      if (two_transport_blocks == TRUE) {
-        dai_total[code_word][i] = dai[code_word][i]; /* for a single cell, dai_total is the same as dai of first cell */
-      }
-    }
-  }
-
-  int M = dai_max;
-  int j = 0;
-  uint32_t V_temp = 0;
-  uint32_t V_temp2 = 0;
-  int O_ACK = 0;
-  int O_bit_number_cw0 = 0;
-  int O_bit_number_cw1 = 0;
-
-  for (int m = 0; m < M ; m++) {
-
-    if (dai[0][m] <= V_temp) {
-      j = j + 1;
-    }
-
-    V_temp = dai[0][m]; /* value of the counter DAI for format 1_0 and format 1_1 on serving cell c */
-
-    if (dai_total[0][m] == 0) {
-      V_temp2 = dai[0][m];
-    } else {
-      V_temp2 = dai[1][m];         /* second code word has been received */
-      O_bit_number_cw1 = (8 * j) + 2*(V_temp - 1) + 1;
-      *o_ACK = *o_ACK | (ack_data[1][m] << O_bit_number_cw1);
-    }
-
-    if (two_transport_blocks == TRUE) {
-      O_bit_number_cw0 = (8 * j) + 2*(V_temp - 1);
-    }
-    else {
-      O_bit_number_cw0 = (4 * j) + (V_temp - 1);
-    }
-
-    *o_ACK = *o_ACK | (ack_data[0][m] << O_bit_number_cw0);
-  }
-
-  if (V_temp2 < V_temp) {
-    j = j + 1;
-  }
-
-  if (two_transport_blocks == TRUE) {
-    O_ACK = 2 * ( 4 * j + V_temp2);  /* for two transport blocks */
-  }
-  else {
-    O_ACK = 4 * j + V_temp2;         /* only one transport block */
-  }
-
-  if (number_harq_feedback != O_ACK) {
-    LOG_E(PHY,"PUCCH Error for number of bits for acknowledgment : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-    return (0);
-  }
-
-  return(number_harq_feedback);
-}
-
-/*******************************************************************
-*
-* NAME :         select_pucch_format
-*
-* PARAMETERS :   ue context
-*                processing slots of reception/transmission
-*                gNB_id identifier
-*
-* RETURN :       TRUE a valid resource has been found
-*
-* DESCRIPTION :  return tx harq process identifier for given transmission slot
-*                TS 38.213 9.2.1  PUCCH Resource Sets
-*                TS 38.213 9.2.2  PUCCH Formats for UCI transmission
-*                In the case of pucch for scheduling request only, resource is already get from scheduling request configuration
-*
-*********************************************************************/
-
-boolean_t select_pucch_resource(PHY_VARS_NR_UE *ue, NR_UE_MAC_INST_t *mac, uint8_t gNB_id, int uci_size, int pucch_resource_indicator, 
-                                int *initial_pucch_id, int *resource_set_id, int *resource_id, NR_UE_HARQ_STATUS_t *harq_status)
-{
-  boolean_t resource_set_found = FALSE;
-  int nb_symbols_for_tx = 0;
-  int current_resource_id = MAX_NB_OF_PUCCH_RESOURCES;
-  pucch_format_nr_t format_pucch;
-  int ready_pucch_resource_id = FALSE; /* in the case that it is already given */
-  NR_PUCCH_Resource_t *pucch_resource = NULL;
-  NR_BWP_Id_t bwp_id = mac->UL_BWP_Id;
-
-  /* ini values to unset */
-  *initial_pucch_id = NB_INITIAL_PUCCH_RESOURCE;
-  //*resource_set_id = MAX_NB_OF_PUCCH_RESOURCE_SETS;
-  //*resource_id = MAX_NB_OF_PUCCH_RESOURCES;
-
-  if ((bwp_id ==0 &&
-       mac->cg == NULL) ||
-      (bwp_id == 0 &&
-       mac->cg &&
-       mac->cg->spCellConfig &&
-       mac->cg->spCellConfig->spCellConfigDedicated &&
-       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
-       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
-       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
-       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup &&
-       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList &&
-       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList->list.array[0] == NULL) ||
-      (mac->ULbwp[bwp_id-1] &&
-       mac->ULbwp[bwp_id-1]->bwp_Dedicated &&
-       mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
-       mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup &&
-       mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList &&
-       mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[0] == NULL)
-      ){
-
-    /* No resource set has been already configured so pucch_configCommon from Sib1 should be used in this case */
-
-    if (ue->UE_mode[gNB_id] != PUSCH) {
-      *initial_pucch_id = *mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pucch_ConfigCommon->choice.setup->pucch_ResourceCommon;
-      if (*initial_pucch_id >= NB_INITIAL_PUCCH_RESOURCE) {
-        LOG_E(PHY,"PUCCH Invalid initial resource index : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-        *initial_pucch_id = NB_INITIAL_PUCCH_RESOURCE;
-        return (FALSE);
-      }
-    }
-    else  {
-      /* see TS 38.213 9.2.1  PUCCH Resource Sets */
-      int delta_PRI = harq_status->pucch_resource_indicator;
-      // n_CCE can be obtained from ue->dci_ind.dci_list[i].n_CCE. FIXME!!!
-      // N_CCE can be obtained from ue->dci_ind.dci_list[i].N_CCE. FIXME!!!
-      //int n_CCE = ue->dci_ind.dci_list[0].n_CCE;
-      //int N_CCE = ue->dci_ind.dci_list[0].N_CCE;
-      int n_CCE_0 = harq_status->n_CCE;
-      int N_CCE_0 = harq_status->N_CCE;
-      if (N_CCE_0 == 0) {
-        AssertFatal(1==0,"PUCCH No compatible pucch format found : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-      }
-      int r_PUCCH = ((2 * n_CCE_0)/N_CCE_0) + (2 * delta_PRI);
-      *initial_pucch_id = r_PUCCH;
-    }
-    nb_symbols_for_tx = initial_pucch_resource[*initial_pucch_id].nrofSymbols;
-    format_pucch = initial_pucch_resource[*initial_pucch_id].format;
-    if (check_pucch_format(mac, gNB_id, format_pucch, nb_symbols_for_tx, uci_size) == TRUE) {
-      return (TRUE);
-    }
-    else {
-      LOG_E(PHY,"PUCCH No compatible pucch format found : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-      return (FALSE);
-    }
-  }
-  else {
-    /* dedicated resources have been configured */
-    int pucch_resource_set_id = 0;
-    if (*resource_set_id == MAX_NB_OF_PUCCH_RESOURCE_SETS) {
-      /* 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
-        -- chooses the first of its PUCCH-ResourceSet which supports the number of bits that the UE wants to transmit.
-        -- The field is not present in the first set (Set0) since the maximum Size of Set0 is specified to be 3 bit.
-        -- The field is not present in the last configured set since the UE derives its maximum payload size as specified in 38.213.
-        -- This field can take integer values that are multiples of 4. Corresponds to L1 parameter 'N_2' or 'N_3' (see 38.213, section 9.2)
-      */
-      /* look for the first resource set which supports uci_size number of bits for payload */
-      pucch_resource_set_id = find_pucch_resource_set(mac, gNB_id, uci_size);
-      if (pucch_resource_set_id != MAX_NB_OF_PUCCH_RESOURCE_SETS) {
-        resource_set_found = TRUE;
-      }
-    }
-    else {
-      /* a valid resource has already be found outside this function */
-      resource_set_found = TRUE;
-      ready_pucch_resource_id = TRUE;
-      //pucch_resource_indicator = pucch_resource_indicator;
-    }
-
-    if (resource_set_found == TRUE) {
-
-      if (pucch_resource_indicator < MAX_PUCCH_RESOURCE_INDICATOR) {
-        // Verify that the value of pucch_resource_indicator is valid
-        struct NR_PUCCH_Config__resourceSetToAddModList *resourceSetToAddModList = NULL;
-	      struct NR_PUCCH_Config__resourceToAddModList *resourceToAddModList = NULL;
-        if (bwp_id > 0 && mac->ULbwp[bwp_id-1]) {
-           AssertFatal(mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList!=NULL,"mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList is null\n");
-           resourceSetToAddModList = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList;
-           resourceToAddModList = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceToAddModList;
-        } else if (bwp_id == 0 && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList!=NULL) {
-	        resourceSetToAddModList = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList;
-          resourceToAddModList = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceToAddModList;
-        }
-        if (resourceSetToAddModList->list.array[pucch_resource_set_id]->resourceList.list.count <= pucch_resource_indicator)
-        {
-          LOG_E(PHY, "Value of pucch_resource_indicator is out of bounds! Possibly due to a false DCI. \n");
-          return (FALSE);
-        }
-        /* check if resource indexing by pucch_resource_indicator of this set is compatible */
-        if ((ready_pucch_resource_id == TRUE) || (resourceSetToAddModList->list.array[pucch_resource_set_id]->resourceList.list.array[pucch_resource_indicator][0] != MAX_NB_OF_PUCCH_RESOURCES)) {
-
-          if (ready_pucch_resource_id == TRUE) {
-            current_resource_id = *resource_id;
-          }
-          else {
-            int R_PUCCH = resourceSetToAddModList->list.array[pucch_resource_set_id]->resourceList.list.count;
-            /* is it the first resource and its size exceeds 8 */
-            if ((pucch_resource_set_id == 0)
-             && (R_PUCCH > MAX_NB_OF_PUCCH_RESOURCES_PER_SET_NOT_0)) {
-              /* see TS 38.213 9.2.3  UE procedure for reporting HARQ-ACK */
-              int delta_PRI = pucch_resource_indicator;
-              int n_CCE_p = harq_status->n_CCE;
-              int N_CCE_p = harq_status->N_CCE;
-              int r_PUCCH;
-              if (N_CCE_p == 0) {
-                LOG_E(PHY,"PUCCH No compatible pucch format found : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-                return (FALSE);
-              }
-              if (pucch_resource_set_id < (R_PUCCH%8)) {
-                r_PUCCH = ((n_CCE_p * (R_PUCCH/8))/N_CCE_p) + (delta_PRI*(R_PUCCH/8));
-              }
-              else {
-                r_PUCCH = ((n_CCE_p * (R_PUCCH/8))/N_CCE_p) + (delta_PRI*(R_PUCCH/8)) + (R_PUCCH%8);
-              }
-              current_resource_id = r_PUCCH;
-            }
-            else {
-		          current_resource_id = resourceSetToAddModList->list.array[pucch_resource_set_id]->resourceList.list.array[pucch_resource_indicator][0];
-            }
-          }
-
-          uint8_t pucch_resource_count = resourceToAddModList->list.count;
-          for (uint8_t i=0; i<pucch_resource_count; i++) {
-            if (resourceToAddModList->list.array[i]->pucch_ResourceId == current_resource_id)
-              pucch_resource = resourceToAddModList->list.array[i];
-          }
-          if (pucch_resource != NULL) {
-            format_pucch = pucch_resource->format.present;
-            nb_symbols_for_tx = get_nb_symbols_pucch(pucch_resource, format_pucch);
-            if (check_pucch_format(mac, gNB_id, format_pucch, nb_symbols_for_tx, uci_size) == TRUE) {
-              *resource_set_id = pucch_resource_set_id;
-              *resource_id = current_resource_id;
-              return (TRUE);
-            }
-            else {
-              LOG_E(PHY,"PUCCH Found format no compatible with payload size and symbol length : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-              return (FALSE);
-            }
-          }
-        }
-        else {
-          LOG_E(PHY,"PUCCH Undefined Resource related to pucch resource indicator: at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-          return (FALSE);
-        }
-      }
-      else {
-        LOG_E(PHY,"PUCCH Invalid pucch resource indicator: at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-        return (FALSE);
-      }
-    }
-
-    /* check that a resource has been found */
-    if (*resource_set_id == MAX_NB_OF_PUCCH_RESOURCES) {
-      LOG_E(PHY,"PUCCH No compatible pucch format found : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-      return (FALSE);
-    }
-  }
-  return (FALSE);
-}
-
-/*******************************************************************
-*
-* NAME :         find_pucch_resource_set
-*
-* PARAMETERS :   ue context
-*                gNB_id identifier
-*
-*
-* RETURN :       harq process identifier
-*
-* DESCRIPTION :  return tx harq process identifier for given transmission slot
-*                YS 38.213 9.2.2  PUCCH Formats for UCI transmission
-*
-*********************************************************************/
-
-int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, int uci_size)
-{
-  int pucch_resource_set_id = 0;
-  NR_BWP_Id_t bwp_id = mac->DL_BWP_Id;
-
-  //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
-    -- chooses the first of its PUCCH-ResourceSet which supports the number of bits that the UE wants to transmit.
-    -- The field is not present in the first set (Set0) since the maximum Size of Set0 is specified to be 3 bit.
-    -- The field is not present in the last configured set since the UE derives its maximum payload size as specified in 38.213.
-    -- This field can take integer values that are multiples of 4. Corresponds to L1 parameter 'N_2' or 'N_3' (see 38.213, section 9.2)
-  */
-  /* 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 ((bwp_id>0 &&
-         mac->ULbwp[bwp_id-1] &&
-         mac->ULbwp[bwp_id-1]->bwp_Dedicated &&
-         mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
-         mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup &&
-         mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList &&
-         mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL) ||
-        (bwp_id==0 &&
-         mac->cg &&
-         mac->cg->spCellConfig &&
-         mac->cg->spCellConfig->spCellConfigDedicated &&
-         mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
-         mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
-         mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
-         mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup &&
-         mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList &&
-         mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL)) {
-      if (uci_size <= 2) {
-        pucch_resource_set_id = 0;
-        return (pucch_resource_set_id);
-        break;
-      }
-      else {
-        pucch_resource_set_id = 1;
-        return (pucch_resource_set_id);
-        break;
-      }
-    }
-    pucch_resource_set_id++;
-  }
-
-  pucch_resource_set_id = MAX_NB_OF_PUCCH_RESOURCE_SETS;
-
-  return (pucch_resource_set_id);
-}
 
 /*******************************************************************
 *
@@ -1519,59 +487,7 @@ boolean_t check_pucch_format(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, pucch_format
   }
 }
 
-/*******************************************************************
-*
-* NAME :         trigger_periodic_scheduling_request
-*
-* PARAMETERS :   pointer to resource set
-*
-* RETURN :       1 if peridic scheduling request is triggered
-*                0 no periodic scheduling request
-*
-* DESCRIPTION :  TS 38.213 9.2.4 UE procedure for reporting SR
-*
-*********************************************************************/
-
-int trigger_periodic_scheduling_request(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_t *proc)
-{
-  const int max_sr_periodicity[NB_NUMEROLOGIES_NR] = { 80, 160, 320, 640, 640 };
-
-  int active_scheduling_request = ue->scheduling_request_config_nr[gNB_id].active_sr_id;
-
-  /* is there any valid scheduling request configuration */
-  if (ue->scheduling_request_config_nr[gNB_id].sr_ResourceConfig[active_scheduling_request] == NULL) {
-    return (0);
-  }
 
-  if (ue->scheduling_request_config_nr[gNB_id].sr_ResourceConfig[active_scheduling_request]->periodicity < 2) {
-    LOG_W(PHY,"PUCCH Not supported scheduling request period smaller than 1 slot : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-    return (0);
-  }
-
-  int16_t SR_periodicity = scheduling_request_periodicity[ue->scheduling_request_config_nr[gNB_id].sr_ResourceConfig[active_scheduling_request]->periodicity];
-  uint16_t SR_offset = ue->scheduling_request_config_nr[gNB_id].sr_ResourceConfig[active_scheduling_request]->offset;
-
-  if (SR_periodicity > max_sr_periodicity[ue->frame_parms.numerology_index]) {
-    LOG_W(PHY,"PUCCH Invalid scheduling request period : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
-    return (0);
-  }
-
-  if (SR_offset > SR_periodicity) {
-    LOG_E(PHY,"PUCCH SR offset %d is greater than SR periodicity %d : at line %d in function %s of file %s \n", SR_offset, SR_periodicity, LINE_FILE , __func__, FILE_NAME);
-    return (0);
-  }
-  else if (SR_periodicity == 1) {
-    return (1); /* period is slot */
-  }
-
-  int16_t N_slot_frame = ue->frame_parms.slots_per_frame;
-  if (((proc->frame_tx * N_slot_frame) + proc->nr_slot_tx - SR_offset)%SR_periodicity == 0) {
-    return (1);
-  }
-  else {
-    return (0);
-  }
-}
 
 /*******************************************************************
 *
diff --git a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h
index 97d8d73282ba024b42224063847e93c0595ce652..101b80fb8d2d25274df9730dabb8d28a74c7b113 100644
--- a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h
+++ b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.h
@@ -58,51 +58,12 @@
 #define BITS_PER_SYMBOL_BPSK  (1)     /* 1 bit per symbol for bpsk modulation */
 #define BITS_PER_SYMBOL_QPSK  (2)     /* 2 bits per symbol for bpsk modulation */
 
-/************** VARIABLES *****************************************/
-
-#define  NB_SYMBOL_MINUS_FOUR             (11)
-#define  I_PUCCH_NO_ADDITIONAL_DMRS        (0)
-#define  I_PUCCH_ADDITIONAL_DMRS           (1)
-#define  I_PUCCH_NO_HOPPING                (0)
-#define  I_PUCCH_HOPING                    (1)
-
 
 /*************** FUNCTIONS ****************************************/
 
-bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_t *proc, bool reset_harq);
-
-/** \brief This function return number of downlink acknowledgement and its bitmap
-    @param ue context
-    @param gNB_id identity
-    @param slots for rx and tx
-    @param o_ACK HARQ-ACK information bits
-    @param n_HARQ_ACK use for obtaining a PUCCH transmission power
-    @param do_reset reset downlink HARQ context
-    @returns number of bits of o_ACK */
-
-uint8_t get_downlink_ack(PHY_VARS_NR_UE *ue, uint8_t gNB_id,  UE_nr_rxtx_proc_t *proc, uint32_t *o_ACK,
-                         int *n_HARQ_ACK, bool do_reset);
-
-/** \brief This function selects a pucch resource
-    @param ue context
-    @param gNB_id identity
-    @param uci size number of uci bits
-    @param pucch_resource_indicator is from downlink DCI
-    @param initial_pucch_id  pucch resource id for initial phase
-    @param resource_set_id   pucch resource set if any
-    @param resource_id       pucch resource id if any
-    @returns TRUE  a pucch resource has been found FALSE no valid pucch resource */
-
-boolean_t select_pucch_resource(PHY_VARS_NR_UE *ue, NR_UE_MAC_INST_t *mac, uint8_t gNB_id, int uci_size, int pucch_resource_indicator, 
-                                int *initial_pucch_id, int *resource_set_id, int *resource_id, NR_UE_HARQ_STATUS_t *harq_status);
-
-/** \brief This function select a pucch resource set
-    @param ue context
-    @param gNB_id identity
-    @param uci size number of uci bits
-    @returns number of the pucch resource set */
-
-int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, int uci_size);
+void pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, 
+                            uint8_t gNB_id,
+                            UE_nr_rxtx_proc_t *proc);
 
 /** \brief This function check pucch format
     @param ue context
@@ -115,14 +76,6 @@ int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, int uci_size)
 boolean_t check_pucch_format(NR_UE_MAC_INST_t *mac, uint8_t gNB_id, pucch_format_nr_t format_pucch, int nb_symbols_for_tx, 
                              int uci_size);
 
-/** \brief This function selects a pucch resource
-    @param ue context
-    @param gNB_id identity
-    @param slots for rx and tx
-    @returns TRUE  a scheduling request is triggered */
-                             
-int trigger_periodic_scheduling_request(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_t *proc);
-
 /** \brief This function reads current CSI
     @param ue context
     @param gNB_id identity
diff --git a/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c b/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c
index f71a8ee11727b06e7cd9379475afebe45739a99f..03fbfeffe0f2cf3e77b1324f3b7fe0050d2f42a3 100644
--- a/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c
+++ b/openair1/SIMULATION/ETH_TRANSPORT/emu_transport.c
@@ -231,7 +231,6 @@ void clear_UE_transport_info(uint8_t nb_UE)
 
   for (UE_id=0; UE_id<nb_UE; UE_id++)
     for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
-      UE_transport_info_TB_index[UE_id][CC_id]=0;
       memset((void *)&UE_transport_info[UE_id][CC_id].cntl,0,sizeof(UE_cntl));
     }
 
diff --git a/openair1/SIMULATION/ETH_TRANSPORT/extern.h b/openair1/SIMULATION/ETH_TRANSPORT/extern.h
index 472a4545eb6d2ef8012b3f6c755caa46cc87cbdf..826317b5388ee56cb7cc196013bac3716234a1d9 100644
--- a/openair1/SIMULATION/ETH_TRANSPORT/extern.h
+++ b/openair1/SIMULATION/ETH_TRANSPORT/extern.h
@@ -57,7 +57,6 @@ extern eNB_transport_info_t eNB_transport_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs];
 extern uint16_t eNB_transport_info_TB_index[NUMBER_OF_eNB_MAX][MAX_NUM_CCs];
 
 extern UE_transport_info_t UE_transport_info[NUMBER_OF_UE_MAX][MAX_NUM_CCs];
-extern uint16_t UE_transport_info_TB_index[NUMBER_OF_UE_MAX][MAX_NUM_CCs];
 
 extern UE_cntl ue_cntl_delay[NUMBER_OF_UE_MAX][MAX_NUM_CCs][2];
 
diff --git a/openair1/SIMULATION/ETH_TRANSPORT/vars.h b/openair1/SIMULATION/ETH_TRANSPORT/vars.h
index f49678642ed19458f41b349034a5688de544161d..9368d622c65d71110e5b09aa61fef1343ffe38e3 100644
--- a/openair1/SIMULATION/ETH_TRANSPORT/vars.h
+++ b/openair1/SIMULATION/ETH_TRANSPORT/vars.h
@@ -58,7 +58,6 @@ eNB_transport_info_t eNB_transport_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs];
 uint16_t eNB_transport_info_TB_index[NUMBER_OF_eNB_MAX][MAX_NUM_CCs];
 
 UE_transport_info_t UE_transport_info[NUMBER_OF_UE_MAX][MAX_NUM_CCs];
-uint16_t UE_transport_info_TB_index[NUMBER_OF_UE_MAX][MAX_NUM_CCs];
 
 UE_cntl ue_cntl_delay[NUMBER_OF_UE_MAX][MAX_NUM_CCs][2];
 
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index adfda7a0c85229dfa7ef9c153b7780c0c5685709..9a9ccaf1f7e303f1843b99a1d79031afc0b75408 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -200,8 +200,8 @@ void DL_channel(RU_t *ru,PHY_VARS_UE *UE,uint subframe,int awgn_flag,double SNR,
       for (u=0; u<2*ru->frame_parms->N_RB_DL; u++) {
         for (aarx=0; aarx<eNB2UE[0]->nb_rx; aarx++) {
           for (aatx=0; aatx<eNB2UE[0]->nb_tx; aatx++) {
-            channelx = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].x;
-            channely = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].y;
+            channelx = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].r;
+            channely = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].i;
             fprintf(csv_fd,"%e+i*(%e),",channelx,channely);
           }
         }
@@ -213,8 +213,8 @@ void DL_channel(RU_t *ru,PHY_VARS_UE *UE,uint subframe,int awgn_flag,double SNR,
         for (u=0; u<2*ru->frame_parms->N_RB_DL; u++) {
           for (aarx=0; aarx<eNB2UE[1]->nb_rx; aarx++) {
             for (aatx=0; aatx<eNB2UE[1]->nb_tx; aatx++) {
-              channelx = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].x;
-              channely = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].y;
+              channelx = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].r;
+              channely = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].i;
               fprintf(csv_fd,"%e+i*(%e),",channelx,channely);
             }
           }
@@ -225,8 +225,8 @@ void DL_channel(RU_t *ru,PHY_VARS_UE *UE,uint subframe,int awgn_flag,double SNR,
         for (u=0; u<2*ru->frame_parms->N_RB_DL; u++) {
           for (aarx=0; aarx<eNB2UE[2]->nb_rx; aarx++) {
             for (aatx=0; aatx<eNB2UE[2]->nb_tx; aatx++) {
-              channelx = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].x;
-              channely = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].y;
+              channelx = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].r;
+              channely = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].i;
               fprintf(csv_fd,"%e+i*(%e),",channelx,channely);
             }
           }
@@ -237,8 +237,8 @@ void DL_channel(RU_t *ru,PHY_VARS_UE *UE,uint subframe,int awgn_flag,double SNR,
         for (u=0; u<2*ru->frame_parms->N_RB_DL; u++) {
           for (aarx=0; aarx<eNB2UE[3]->nb_rx; aarx++) {
             for (aatx=0; aatx<eNB2UE[3]->nb_tx; aatx++) {
-              channelx = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].x;
-              channely = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].y;
+              channelx = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].r;
+              channely = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].i;
               fprintf(csv_fd,"%e+i*(%e),",channelx,channely);
             }
           }
diff --git a/openair1/SIMULATION/LTE_PHY/test.c b/openair1/SIMULATION/LTE_PHY/test.c
index 06785f7cdc2a533375b826bbbcb7cd510decae9b..6b78dad4e7e25f0b672f21b7c5eece38a654f349 100644
--- a/openair1/SIMULATION/LTE_PHY/test.c
+++ b/openair1/SIMULATION/LTE_PHY/test.c
@@ -75,7 +75,7 @@ int main(int argc, char **argv)
   double rx_gain;
   int rx_pwr2, target_rx_pwr_dB;
 
-  struct complex **ch;
+  struct complexd **ch;
   unsigned char first_call = 1;
 
   LTE_DL_FRAME_PARMS frame_parms;
@@ -169,10 +169,10 @@ int main(int argc, char **argv)
 
   channel_length = (int) 11+2*BW*Td;
 
-  ch = (struct complex**) malloc(4 * sizeof(struct complex*));
+  ch = (struct complexd**) malloc(4 * sizeof(struct complexd*));
 
   for (i = 0; i<4; i++)
-    ch[i] = (struct complex*) malloc(channel_length * sizeof(struct complex));
+    ch[i] = (struct complexd*) malloc(channel_length * sizeof(struct complexd));
 
   randominit(0);
   set_taus_seed(0);
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c
index 0d39e6e533fd4159dd23fd9528b8f7e4dfcad641..20a348f6c337c469ac5b9cc35782efafd56888b7 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim.c
@@ -1111,8 +1111,8 @@ int main(int argc, char **argv) {
                   for (aarx=0; aarx<UE2eNB->nb_rx; aarx++) {
                     for (aatx=0; aatx<UE2eNB->nb_tx; aatx++) {
                       // abs_channel = (eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][u].x*eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][u].x + eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][u].y*eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][u].y);
-                      channelx = UE2eNB->chF[aarx+(aatx*UE2eNB->nb_rx)][u].x;
-                      channely = UE2eNB->chF[aarx+(aatx*UE2eNB->nb_rx)][u].y;
+                      channelx = UE2eNB->chF[aarx+(aatx*UE2eNB->nb_rx)][u].r;
+                      channely = UE2eNB->chF[aarx+(aatx*UE2eNB->nb_rx)][u].i;
                       // if(transmission_m==5){
                       fprintf(csv_fdUL,"%e+i*(%e),",channelx,channely);
                       // }
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim2.c b/openair1/SIMULATION/LTE_PHY/ulsim2.c
index 69d4dc2e3f1b5c8fdaeb6e39d58cc4e12a35250c..e994d4fc364695a13340fbb6bc4fe7eed2935f7d 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim2.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim2.c
@@ -49,7 +49,7 @@ int main(int argc, char **argv)
   double amps[8] = {0.3868472 , 0.3094778 , 0.1547389 , 0.0773694 , 0.0386847 , 0.0193424 , 0.0096712 , 0.0038685};
   double aoa=.03,ricean_factor=1; //0.0000005;
   int channel_length;
-  struct complex **ch;
+  struct complexd **ch;
   unsigned char pbch_pdu[6];
   int sync_pos, sync_pos_slot;
   FILE *rx_frame_file;
@@ -170,10 +170,10 @@ int main(int argc, char **argv)
     bzero(r_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
   }
 
-  ch = (struct complex**) malloc(4 * sizeof(struct complex*));
+  ch = (struct complexd**) malloc(4 * sizeof(struct complexd*));
 
   for (i = 0; i<4; i++)
-    ch[i] = (struct complex*) malloc(channel_length * sizeof(struct complex));
+    ch[i] = (struct complexd*) malloc(channel_length * sizeof(struct complexd));
 
   generate_srs_tx(lte_frame_parms,lte_ue_common_vars->txdataF[0],AMP,0);
   generate_drs_puch(lte_frame_parms,lte_ue_common_vars->txdataF[0],AMP,0,first_rb,nb_rb);
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index ea79c6d29d4ecb8c530a53a8c4e5336c8b18b9cf..0ba6f9637d266c49cfd56543732c4ef2c466e41b 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -87,7 +87,6 @@ uint16_t sl_ahead=0;
 uint64_t downlink_frequency[MAX_NUM_CCs][4];
 THREAD_STRUCT thread_struct;
 nfapi_ue_release_request_body_t release_rntis;
-msc_interface_t msc_interface;
 uint32_t N_RB_DL = 106;
 
 // dummy functions
@@ -227,12 +226,17 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(module_id_t     module_idP,
 
 void processSlotTX(void *arg) {}
 
-//nFAPI P7 dummy functions
+//nFAPI P7 dummy functions to avoid linking errors 
 
 int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0);  }
 int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req){ return(0);  }
 int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req){ return(0);  }
 int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0);  }
+int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind) { return(0);  }
 
 // needed for some functions
 openair0_config_t openair0_cfg[MAX_CARDS];
@@ -263,6 +267,8 @@ void nr_dlsim_preprocessor(module_id_t module_id,
 
   NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
 
+  ps->nrOfLayers = g_nrOfLayers;
+
   nr_set_pdsch_semi_static(scc,
                            UE_info->CellGroup[0],
                            sched_ctrl->active_bwp,
@@ -278,7 +284,6 @@ void nr_dlsim_preprocessor(module_id_t module_id,
    * configuration */
   ps->mcsTableIdx = g_mcsTableIdx;
 
-  sched_pdsch->nrOfLayers = g_nrOfLayers;
   sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
   sched_pdsch->R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx);
   sched_pdsch->tb_size = nr_compute_tbs(sched_pdsch->Qm,
@@ -288,7 +293,7 @@ void nr_dlsim_preprocessor(module_id_t module_id,
                                         ps->N_PRB_DMRS * ps->N_DMRS_SLOT,
                                         0 /* N_PRB_oh, 0 for initialBWP */,
                                         0 /* tb_scaling */,
-                                        sched_pdsch->nrOfLayers)
+                                        ps->nrOfLayers)
                          >> 3;
 
   /* the simulator assumes the HARQ PID is equal to the slot number */
@@ -409,6 +414,7 @@ int main(int argc, char **argv)
   uint16_t rbSize = 106;
   uint8_t  mcsIndex = 9;
   uint8_t  dlsch_threads = 0;
+  int      prb_inter = 0;
   if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0) {
     exit_fun("[NR_DLSIM] Error, configuration module init failed\n");
   }
@@ -419,7 +425,7 @@ int main(int argc, char **argv)
 
   FILE *scg_fd=NULL;
   
-  while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:d:e:m:w:T:U:q")) != -1) {
+  while ((c = getopt (argc, argv, "f:hA:pf:g:in:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:d:e:m:w:T:U:q")) != -1) {
     switch (c) {
     case 'f':
       scg_fd = fopen(optarg,"r");
@@ -475,14 +481,10 @@ int main(int argc, char **argv)
 
       break;
 
-    /*case 'i':
-      interf1=atoi(optarg);
+    case 'i':
+      prb_inter=1;
       break;
 
-    case 'j':
-      interf2=atoi(optarg);
-      break;*/
-
     case 'n':
       n_trials = atoi(optarg);
       break;
@@ -641,7 +643,7 @@ int main(int argc, char **argv)
       printf("-g [A,B,C,D,E,F,G,R] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models or R for MIMO model (ignores delay spread and Ricean factor)\n");
       printf("-y Number of TX antennas used in gNB\n");
       printf("-z Number of RX antennas used in UE\n");
-      //printf("-i Relative strength of first intefering gNB (in dB) - cell_id mod 3 = 1\n");
+      printf("-i Activate PRB based averaging for channel estimation. Frequncy domain interpolation by default.\n");
       //printf("-j Relative strength of second intefering gNB (in dB) - cell_id mod 3 = 2\n");
       printf("-R N_RB_DL\n");
       printf("-O oversampling factor (1,2,4,8,16)\n");
@@ -687,6 +689,7 @@ int main(int argc, char **argv)
   memset(RC.gNB[0],0,sizeof(PHY_VARS_gNB));
 
   gNB = RC.gNB[0];
+  gNB->ofdm_offset_divisor = UINT_MAX;
   frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
   frame_parms->nb_antennas_tx = n_tx;
   frame_parms->nb_antennas_rx = n_rx;
@@ -758,7 +761,7 @@ int main(int argc, char **argv)
 
   prepare_scd(scd);
 
-  fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, 0, 1, n_tx, 0, 0);
+  fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, 0, 1, n_tx, 0, 0, 0);
 
   /* RRC parameter validation for secondaryCellGroup */
   fix_scd(scd);
@@ -777,9 +780,9 @@ int main(int argc, char **argv)
   AssertFatal((gNB->if_inst         = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
   gNB->if_inst->NR_PHY_config_req      = nr_phy_config_request;
   // common configuration
-  rrc_mac_config_req_gNB(0,0, n_tx, n_tx, scc, 0, 0, NULL);
+  rrc_mac_config_req_gNB(0,0, n_tx, n_tx, 0, scc, 0, 0, NULL);
   // UE dedicated configuration
-  rrc_mac_config_req_gNB(0,0, n_tx, n_tx, scc, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
+  rrc_mac_config_req_gNB(0,0, n_tx, n_tx, 0, scc, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
   // reset preprocessor to the one of DLSIM after it has been set during
   // rrc_mac_config_req_gNB
   gNB_mac->pre_processor_dl = nr_dlsim_preprocessor;
@@ -907,6 +910,7 @@ int main(int argc, char **argv)
   UE->if_inst->phy_config_request = nr_ue_phy_config_request;
   UE->if_inst->dl_indication = nr_ue_dl_indication;
   UE->if_inst->ul_indication = dummy_nr_ue_ul_indication;
+  UE->prb_interpolation = prb_inter;
 
 
   UE_mac->if_module = nr_ue_if_module_init(0);
@@ -929,6 +933,7 @@ int main(int argc, char **argv)
   //Configure UE
   rrc.carrier.MIB = (uint8_t*) malloc(4);
   rrc.carrier.sizeof_MIB = do_MIB_NR(&rrc,0);
+
   nr_rrc_mac_config_req_ue(0,0,0,rrc.carrier.mib.message.choice.mib, NULL, NULL, secondaryCellGroup);
 
 
@@ -1015,12 +1020,13 @@ int main(int argc, char **argv)
       NR_gNB_DLSCH_t *gNB_dlsch = msgDataTx->dlsch[0][0];
       nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15 = &gNB_dlsch->harq_process.pdsch_pdu.pdsch_pdu_rel15;
       
-      UE_harq_process->harq_ack.ack = 0;
+      UE_harq_process->ack = 0;
       round = 0;
       UE_harq_process->round = round;
-      UE_harq_process->first_tx = 1;
+      UE_harq_process->first_rx = 1;
         
-      while ((round<num_rounds) && (UE_harq_process->harq_ack.ack==0)) {
+      while ((round<num_rounds) && (UE_harq_process->ack==0)) {
+
         memset(RC.nrmac[0]->cce_list[1][0],0,MAX_NUM_CCE*sizeof(int));
         memset(RC.nrmac[0]->cce_list[1][1],0,MAX_NUM_CCE*sizeof(int));
         clear_nr_nfapi_information(RC.nrmac[0], 0, frame, slot);
@@ -1095,7 +1101,8 @@ int main(int argc, char **argv)
             nr_normal_prefix_mod(&gNB->common_vars.txdataF[aa][txdataF_offset],
                                  &txdata[aa][tx_offset],
                                  14,
-                                 frame_parms);
+                                 frame_parms,
+                                 slot);
           }
         }
        
@@ -1258,7 +1265,7 @@ int main(int argc, char **argv)
 	  printf("errors_bit = %u (trial %d)\n", errors_bit, trial);
       }
       roundStats[snrRun]+=((float)round); 
-      if (UE_harq_process->harq_ack.ack==1) effRate += ((float)TBS)/round;
+      if (UE_harq_process->ack==1) effRate += ((float)TBS)/round;
     } // noise trials
 
     blerStats[snrRun] = (float) n_errors / (float) n_trials;
@@ -1330,7 +1337,7 @@ int main(int argc, char **argv)
       LOG_M("rxsig0.m","rxs0", UE->common_vars.rxdata[0], frame_length_complex_samples, 1, 1);
       if (UE->frame_parms.nb_antennas_rx>1)
 	LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1], frame_length_complex_samples, 1, 1);
-      LOG_M("chestF0.m","chF0",UE->pdsch_vars[0][0]->dl_ch_estimates_ext,N_RB_DL*12*14,1,1);
+      LOG_M("chestF0.m","chF0",&UE->pdsch_vars[0][0]->dl_ch_estimates_ext[0][0],g_rbSize*12*14,1,1);
       write_output("rxF_comp.m","rxFc",&UE->pdsch_vars[0][0]->rxdataF_comp0[0][0],N_RB_DL*12*14,1,1);
       LOG_M("rxF_llr.m","rxFllr",UE->pdsch_vars[UE_proc.thread_id][0]->llr[0],available_bits,1,0);
       break;
diff --git a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c
index 24ed8a930c699d4597b8fcbc7e7de75425b0eb37..056b018504ab6387e2eb82f5a3cae3a0d367c748 100644
--- a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c
+++ b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c
@@ -8,6 +8,12 @@ int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0);
 int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req){ return(0);  }
 int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req){ return(0);  }
 int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0);  }
+int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind) { return(0);  }
+
 int32_t get_uldl_offset(int nr_bandP)                                       { return(0);  }
 NR_IF_Module_t *NR_IF_Module_init(int Mod_id)                               {return(NULL);}
 nfapi_mode_t nfapi_mod;
@@ -27,4 +33,5 @@ void nr_fill_rx_indication(fapi_nr_rx_indication_t *rx_ind,
                            uint8_t gNB_id,
                            PHY_VARS_NR_UE *ue,
                            NR_UE_DLSCH_t *dlsch0,
+                           NR_UE_DLSCH_t *dlsch1,
                            uint16_t n_pdus) {}
diff --git a/openair1/SIMULATION/NR_PHY/nr_dummy_functions_prach.c b/openair1/SIMULATION/NR_PHY/nr_dummy_functions_prach.c
index a930c96a755992604415953f7e18e84812ed6e42..76f4e826ee6ed740e63933def6c99682f65bdb2e 100644
--- a/openair1/SIMULATION/NR_PHY/nr_dummy_functions_prach.c
+++ b/openair1/SIMULATION/NR_PHY/nr_dummy_functions_prach.c
@@ -3,9 +3,15 @@ int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req)                            { re
 int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req)       { return(0);  }
 int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req)       { return(0);  }
 int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0);  }
- int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req){ return(0);  }
- int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req){ return(0);  }
- int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0);  }
+int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req){ return(0);  }
+int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req){ return(0);  }
+int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0);  }
+int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind) { return(0);  }
+
 int32_t get_uldl_offset(int nr_bandP)                                       { return(0);  }
 NR_IF_Module_t *NR_IF_Module_init(int Mod_id)                               {return(NULL);}
 int dummy_nr_ue_dl_indication(nr_downlink_indication_t *dl_info)            { return(0);  }
@@ -315,7 +321,7 @@ void nr_Msg1_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint
   mac->RA_attempt_number++;
 }
 
-void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id){
+void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, slot_t slotP, uint8_t gNB_id){
   AssertFatal(CC_id == 0, "Transmission on secondary CCs is not supported yet\n");
   LOG_D(MAC,"[UE %d][RAPROC] Frame %d : Msg3_tx: Starting contention resolution timer\n", mod_id, frameP);
   NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
index 703d2f8d22fc21690c5aca54254615e8eee91ea1..8f4f227f6ca95ef3ce94747d0e501947b4428fd7 100644
--- a/openair1/SIMULATION/NR_PHY/pbchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -70,6 +70,31 @@ softmodem_params_t *get_softmodem_params(void) {return 0;}
 
 void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq) {}
 
+int nr_ue_pdcch_procedures(uint8_t gNB_id,
+			   PHY_VARS_NR_UE *ue,
+			   UE_nr_rxtx_proc_t *proc,
+                           int n_ss) {
+  return 0;
+}
+
+int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
+                           UE_nr_rxtx_proc_t *proc,
+                           int eNB_id, PDSCH_t pdsch,
+                           NR_UE_DLSCH_t *dlsch0, NR_UE_DLSCH_t *dlsch1) {
+  return 0;
+}
+
+bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
+                            UE_nr_rxtx_proc_t *proc,
+                            int gNB_id,
+                            PDSCH_t pdsch,
+                            NR_UE_DLSCH_t *dlsch0,
+                            NR_UE_DLSCH_t *dlsch1,
+                            int *dlsch_errors,
+                            uint8_t dlsch_parallel) {
+  return false;
+}
+
 void nr_phy_config_request_sim_pbchsim(PHY_VARS_gNB *gNB,
                                int N_RB_DL,
                                int N_RB_UL,
@@ -110,7 +135,9 @@ void nr_phy_config_request_sim_pbchsim(PHY_VARS_gNB *gNB,
 
   gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band);
 
+  fp->ofdm_offset_divisor = UINT_MAX;
   nr_init_frame_parms(gNB_config, fp);
+  init_timeshift_rotation(fp);
 
   init_symbol_rotation(fp);
 
@@ -406,6 +433,7 @@ int main(int argc, char **argv)
   RC.gNB = (PHY_VARS_gNB**) malloc(sizeof(PHY_VARS_gNB *));
   RC.gNB[0] = malloc(sizeof(PHY_VARS_gNB));
   gNB = RC.gNB[0];
+  gNB->ofdm_offset_divisor = UINT_MAX;
   frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
   frame_parms->nb_antennas_tx = n_tx;
   frame_parms->nb_antennas_rx = n_rx;
@@ -684,7 +712,7 @@ int main(int argc, char **argv)
       }
       if (UE->is_synchronized == 0) {
 	UE_nr_rxtx_proc_t proc={0};
-	ret = nr_initial_sync(&proc, UE, 1);
+	ret = nr_initial_sync(&proc, UE, 1, 0, 0);
 	printf("nr_initial_sync1 returns %d\n",ret);
 	if (ret<0) n_errors++;
       }
diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c
index 93bed5514f7455c5c366d7963577c45903d22ded..6167c809ff3daeac997367e018de35ba27942a92 100644
--- a/openair1/SIMULATION/NR_PHY/prachsim.c
+++ b/openair1/SIMULATION/NR_PHY/prachsim.c
@@ -67,6 +67,7 @@ extern uint16_t prach_root_sequence_map0_3[838];
 openair0_config_t openair0_cfg[MAX_CARDS];
 //uint8_t nfapi_mode=0;
 uint64_t downlink_frequency[MAX_NUM_CCs][4];
+int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
 uint16_t sl_ahead = 0;
 msc_interface_t msc_interface;
 uint32_t N_RB_DL = 106;
@@ -81,6 +82,11 @@ int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0);
 int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req){ return(0);  }
 int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req){ return(0);  }
 int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0);  }
+int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind) { return(0);  }
 
 void
 rrc_data_ind(
@@ -216,7 +222,7 @@ int main(int argc, char **argv){
   char c;
 
   double sigma2, sigma2_dB = 0, SNR, snr0 = -2.0, snr1 = 0.0, ue_speed0 = 0.0, ue_speed1 = 0.0;
-  double **s_re, **s_im, **r_re, **r_im, iqim = 0.0, delay_avg = 0, ue_speed = 0, fs, bw;
+  double **s_re, **s_im, **r_re, **r_im, iqim = 0.0, delay_avg = 0, ue_speed = 0, fs=-1, bw;
   int i, l, aa, aarx, **txdata, trial, n_frames = 1, prach_start, rx_prach_start; //, ntrials=1;
   int N_RB_UL = 106, delay = 0, NCS_config = 13, rootSequenceIndex = 1, threequarter_fs = 0, mu = 1, fd_occasion = 0, loglvl = OAILOG_INFO, numRA = 0, prachStartSymbol = 0;
   uint8_t snr1set = 0, ue_speed1set = 0, transmission_mode = 1, n_tx = 1, n_rx = 1, awgn_flag = 0, msg1_frequencystart = 0, num_prach_fd_occasions = 1, prach_format=0;
diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c
index 9c5fa5b8c9fc2726190394f64c8aa14bc8586d54..a3eb4452d7396acf2fb4ba4238f3087607a7eea5 100644
--- a/openair1/SIMULATION/NR_PHY/pucchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pucchsim.c
@@ -457,32 +457,8 @@ int main(int argc, char **argv)
     bzero(rxdataF[i],14*frame_parms->ofdm_symbol_size*sizeof(int));
   }
 
-
-  //configure UE
-  UE = malloc(sizeof(PHY_VARS_NR_UE));
-  memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS));
-  UE->pucch_config_common_nr->hoppingId = Nid_cell;
-  //phy_init_nr_top(UE); //called from init_nr_ue_signal
-                      
-  UE->perfect_ce = 0;
-
-  if(eps!=0.0)
-	UE->UE_fo_compensation = 1; // if a frequency offset is set then perform fo estimation and compensation
-
-  if (init_nr_ue_signal(UE, 1, 0) != 0)
-  {
-    printf("Error at UE NR initialisation\n");
-    exit(-1);
-  }
   uint8_t mcs=0;
-  startingPRB_intraSlotHopping=N_RB_DL-1;
-  pucch_GroupHopping_t PUCCH_GroupHopping=UE->pucch_config_common_nr->pucch_GroupHopping;
-  uint32_t hopping_id=UE->pucch_config_common_nr->hoppingId;
-  uint32_t dmrs_scrambling_id = 0, data_scrambling_id=0;
-  //t_nrPolar_params *currentPtr;
-
   int shift = 0;
-
   if(format==0){
     if (sr_flag)
       shift = 1<<nr_bit;
@@ -496,6 +472,63 @@ int main(int argc, char **argv)
   }
   else if (format == 2 && nr_bit > 11) gNB->uci_polarParams = nr_polar_params(2, nr_bit, nrofPRB, 1, NULL);
   
+  startingPRB_intraSlotHopping=N_RB_DL-1;
+  uint32_t hopping_id=Nid_cell;
+  uint32_t dmrs_scrambling_id = 0, data_scrambling_id=0;
+
+  //configure UE
+  UE = malloc(sizeof(PHY_VARS_NR_UE));
+  memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS));
+
+  fapi_nr_ul_config_pucch_pdu pucch_tx_pdu;
+  if (format==0) {
+    pucch_tx_pdu.format_type = 0;
+    pucch_tx_pdu.nr_of_symbols = nrofSymbols;
+    pucch_tx_pdu.start_symbol_index = startingSymbolIndex;
+    pucch_tx_pdu.bwp_start = 0;
+    pucch_tx_pdu.prb_start = startingPRB;
+    pucch_tx_pdu.hopping_id = hopping_id;
+    pucch_tx_pdu.group_hop_flag = 0;
+    pucch_tx_pdu.sequence_hop_flag = 0;
+    pucch_tx_pdu.freq_hop_flag = 0;
+    pucch_tx_pdu.mcs = mcs;
+    pucch_tx_pdu.initial_cyclic_shift = 0;
+    pucch_tx_pdu.second_hop_prb = startingPRB_intraSlotHopping;
+  }
+  if (format==2) {
+    pucch_tx_pdu.format_type = 2;
+    pucch_tx_pdu.rnti = 0x1234;
+    pucch_tx_pdu.n_bit = nr_bit;
+    pucch_tx_pdu.payload = actual_payload;
+    pucch_tx_pdu.nr_of_symbols = nrofSymbols;
+    pucch_tx_pdu.start_symbol_index = startingSymbolIndex;
+    pucch_tx_pdu.bwp_start = 0;
+    pucch_tx_pdu.prb_start = startingPRB;
+    pucch_tx_pdu.prb_size = nrofPRB;
+    pucch_tx_pdu.hopping_id = hopping_id;
+    pucch_tx_pdu.group_hop_flag = 0;
+    pucch_tx_pdu.sequence_hop_flag = 0;
+    pucch_tx_pdu.freq_hop_flag = 0;
+    pucch_tx_pdu.dmrs_scrambling_id = dmrs_scrambling_id;
+    pucch_tx_pdu.data_scrambling_id = data_scrambling_id;
+    pucch_tx_pdu.second_hop_prb = startingPRB_intraSlotHopping;
+  }
+
+  UE->perfect_ce = 0;
+
+  if(eps!=0.0)
+    UE->UE_fo_compensation = 1; // if a frequency offset is set then perform fo estimation and compensation
+
+  if (init_nr_ue_signal(UE, 1, 0) != 0)
+  {
+    printf("Error at UE NR initialisation\n");
+    exit(-1);
+  }
+
+  pucch_GroupHopping_t PUCCH_GroupHopping = pucch_tx_pdu.group_hop_flag + (pucch_tx_pdu.sequence_hop_flag<<1);
+
+  //t_nrPolar_params *currentPtr;
+
   for(SNR=snr0;SNR<=snr1;SNR=SNR+1){
     ack_nack_errors=0;
     sr_errors=0;
@@ -503,13 +536,28 @@ int main(int argc, char **argv)
     for (trial=0; trial<n_trials; trial++) {
       bzero(txdataF[aa],frame_parms->ofdm_symbol_size*sizeof(int));
       if(format==0){
-        nr_generate_pucch0(UE,txdataF,frame_parms,PUCCH_GroupHopping,hopping_id,amp,nr_slot_tx,m0,mcs,nrofSymbols,startingSymbolIndex,startingPRB, 0);
+        nr_generate_pucch0(UE,
+                           txdataF,
+	                   frame_parms,
+                           amp,
+                           nr_slot_tx,
+                           &pucch_tx_pdu);
       }
       else if (format == 1){
-        nr_generate_pucch1(UE,txdataF,frame_parms,UE->pucch_config_dedicated,actual_payload,amp,nr_slot_tx,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,0,nr_bit);
+        nr_generate_pucch1(UE,
+                           txdataF,
+                           frame_parms,
+                           amp,
+                           nr_slot_tx,
+                           &pucch_tx_pdu);
       }
       else {
-	      nr_generate_pucch2(UE,0x1234,dmrs_scrambling_id,data_scrambling_id,txdataF,frame_parms,UE->pucch_config_dedicated,actual_payload,amp,nr_slot_tx,nrofSymbols,startingSymbolIndex,nrofPRB,startingPRB,nr_bit);
+        nr_generate_pucch2(UE,
+                           txdataF,
+                           frame_parms,
+                           amp,
+                           nr_slot_tx,
+                           &pucch_tx_pdu);
       }
       
       int txlev = signal_energy(&txdataF[aa][startingSymbolIndex*frame_parms->ofdm_symbol_size],
diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c
index c889e6dcb994803a39e906429178e2e0991fc3e7..94aea36a670ce960ffcc663080cb48473813b31d 100644
--- a/openair1/SIMULATION/NR_PHY/ulschsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulschsim.c
@@ -504,7 +504,7 @@ int main(int argc, char **argv)
   unsigned int G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, Nl);
 
   if (input_fd == NULL) {
-    nr_ulsch_encoding(ulsch_ue, frame_parms, harq_pid, G);
+    nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, G);
   }
   
   printf("\n");
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index 62f4420e75af13ff17e9659f3b2eab4240ed9737..e267c8b6d7410379bdd6ee8a8ec5c58c2472ecb3 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -83,7 +83,6 @@ double cpuf;
 uint64_t downlink_frequency[MAX_NUM_CCs][4];
 THREAD_STRUCT thread_struct;
 nfapi_ue_release_request_body_t release_rntis;
-msc_interface_t msc_interface;
 uint32_t N_RB_DL = 106;
 
 extern void fix_scd(NR_ServingCellConfig_t *scd);// forward declaration
@@ -213,6 +212,11 @@ int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0);
 int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req){ return(0);  }
 int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req){ return(0);  }
 int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0);  }
+int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind) { return(0);  }
 
 int nr_derive_key(int alg_type, uint8_t alg_id,
                const uint8_t key[32], uint8_t **out)
@@ -286,7 +290,7 @@ int main(int argc, char **argv)
   int gNB_id = 0;
   int ap;
   int tx_offset;
-  int32_t txlev;
+  int32_t txlev=0;
   int start_rb = 0;
   int UE_id =0; // [hna] only works for UE_id = 0 because NUMBER_OF_NR_UE_MAX is set to 1 (phy_init_nr_gNB causes segmentation fault)
   float target_error_rate = 0.01;
@@ -298,6 +302,7 @@ int main(int argc, char **argv)
   float effRate; 
   //float eff_tp_check = 0.7;
   uint8_t snrRun;
+  int prb_inter = 0;
 
   int enable_ptrs = 0;
   int modify_dmrs = 0;
@@ -309,7 +314,7 @@ int main(int argc, char **argv)
   uint16_t ptrsSymbPerSlot = 0;
   uint16_t ptrsRePerSymb = 0;
 
-  uint8_t transform_precoding = transform_precoder_disabled; // 0 - ENABLE, 1 - DISABLE
+  uint8_t transform_precoding = 1; // 0 - ENABLE, 1 - DISABLE
   uint8_t num_dmrs_cdm_grps_no_data = 1;
   uint8_t mcs_table = 0;
 
@@ -331,7 +336,7 @@ int main(int argc, char **argv)
   /* initialize the sin-cos table */
    InitSinLUT();
 
-  while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:i:j:kl:m:n:p:r:s:y:z:F:G:H:M:N:PR:S:T:U:L:Z")) != -1) {
+  while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:ikl:m:n:p:r:s:u:w:y:z:F:G:H:M:N:PR:S:T:U:L:Z")) != -1) {
     printf("handling optarg %c\n",c);
     switch (c) {
 
@@ -423,14 +428,10 @@ int main(int argc, char **argv)
       
       break;
       
-      /*case 'i':
-        interf1 = atoi(optarg);
-        break;
+    case 'i':
+      prb_inter=1;
+      break;
 	
-	case 'j':
-        interf2 = atoi(optarg);
-        break;*/
-
     case 'k':
       printf("Setting threequarter_fs_flag\n");
       openair0_cfg[0].threequarter_fs= 1;
@@ -461,6 +462,14 @@ int main(int argc, char **argv)
       printf("Setting SNR0 to %f\n", snr0);
       break;
 
+    case 'u':
+      mu = atoi(optarg);
+      break;
+
+    case 'w':
+      start_rb = atoi(optarg);
+      break;
+
 /*
     case 't':
       eff_tp_check = (float)atoi(optarg)/100;
@@ -566,7 +575,7 @@ int main(int argc, char **argv)
 
     case 'Z':
 
-      transform_precoding = transform_precoder_enabled; 
+      transform_precoding = 0; // enabled
       num_dmrs_cdm_grps_no_data = 2;
       mcs_table = 3;
       
@@ -582,13 +591,15 @@ int main(int argc, char **argv)
       printf("-f Number of frames to simulate\n");
       printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n");
       printf("-h This message\n");
-      //printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
+      printf("-i Activate PRB based averaging for channel estimation. Frequncy domain interpolation by default.\n");
       //printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
       printf("-s Starting SNR, runs from SNR0 to SNR0 + 10 dB if ending SNR isn't given\n");
       printf("-m MCS value\n");
       printf("-n Number of trials to simulate\n");
       printf("-p Use extended prefix mode\n");
       printf("-t Delay spread for multipath channel\n");
+      printf("-u Set the numerology\n");
+      printf("-w Start PRB for PUSCH\n");
       //printf("-x Transmission mode (1,2,6 for the moment)\n");
       printf("-y Number of TX antennas used in eNB\n");
       printf("-z Number of RX antennas used in UE\n");
@@ -629,10 +640,12 @@ int main(int argc, char **argv)
 
   if (N_RB_UL >= 217) sampling_frequency = 122.88;
   else if (N_RB_UL >= 106) sampling_frequency = 61.44;
+  else if (N_RB_UL >= 32) sampling_frequency = 32.72;
   else { printf("Need at least 106 PRBs\b"); exit(-1); }
   if (N_RB_UL == 273) bandwidth = 100;
   else if (N_RB_UL == 217) bandwidth = 80;
   else if (N_RB_UL == 106) bandwidth = 40;
+  else if (N_RB_UL == 32) bandwidth = 50;
   else { printf("Add N_RB_UL %d\n",N_RB_UL); exit(-1); }
 			   
   if (openair0_cfg[0].threequarter_fs == 1) sampling_frequency*=.75;
@@ -653,6 +666,7 @@ int main(int argc, char **argv)
   RC.gNB = (PHY_VARS_gNB **) malloc(sizeof(PHY_VARS_gNB *));
   RC.gNB[0] = calloc(1,sizeof(PHY_VARS_gNB));
   gNB = RC.gNB[0];
+  gNB->ofdm_offset_divisor = UINT_MAX;
   gNB->threadPool = (tpool_t*)malloc(sizeof(tpool_t));
   gNB->respDecode = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
   char tp_param[] = "n";
@@ -665,6 +679,7 @@ int main(int argc, char **argv)
   gNB->UL_INFO.crc_ind.crc_list = (nfapi_nr_crc_t *)malloc(NB_UE_INST*sizeof(nfapi_nr_crc_t));
   gNB->UL_INFO.rx_ind.number_of_pdus = 0;
   gNB->UL_INFO.crc_ind.number_crcs = 0;
+  gNB->prb_interpolation = prb_inter;
   frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
 
 
@@ -697,7 +712,7 @@ int main(int argc, char **argv)
 
   prepare_scd(scd);
 
-  fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, 0, 1, n_tx, 0, 0);
+  fill_default_secondaryCellGroup(scc, scd, secondaryCellGroup, 0, 1, n_tx, 0, 0, 0);
 
   // xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
 
@@ -708,9 +723,9 @@ int main(int argc, char **argv)
 
   gNB->if_inst->NR_PHY_config_req      = nr_phy_config_request;
   // common configuration
-  rrc_mac_config_req_gNB(0,0, n_tx, n_tx, scc, 0, 0, NULL);
+  rrc_mac_config_req_gNB(0,0, n_tx, n_tx, 0, scc, 0, 0, NULL);
   // UE dedicated configuration
-  rrc_mac_config_req_gNB(0,0, n_tx, n_tx, scc, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
+  rrc_mac_config_req_gNB(0,0, n_tx, n_tx, 0, scc, 1, secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity,secondaryCellGroup);
   phy_init_nr_gNB(gNB,0,1);
   N_RB_DL = gNB->frame_parms.N_RB_DL;
 
@@ -797,7 +812,11 @@ int main(int argc, char **argv)
   nr_scheduled_response_t scheduled_response;
   fapi_nr_ul_config_request_t ul_config;
   fapi_nr_tx_request_t tx_req;
-  
+
+  memset(&scheduled_response, 0, sizeof(scheduled_response));
+  memset(&ul_config, 0, sizeof(ul_config));
+  memset(&tx_req, 0, sizeof(tx_req));
+
   uint8_t ptrs_mcs1 = 2;
   uint8_t ptrs_mcs2 = 4;
   uint8_t ptrs_mcs3 = 10;
@@ -840,7 +859,8 @@ int main(int argc, char **argv)
   uint16_t number_dmrs_symbols = get_dmrs_symbols_in_slot(l_prime_mask, nb_symb_sch);
   uint8_t  nb_re_dmrs          = (dmrs_config_type == pusch_dmrs_type1) ? 6 : 4;
 
-  if (transform_precoding == transform_precoder_enabled) {  
+  // if transform precoding is enabled
+  if (transform_precoding == 0) {
 
     AssertFatal(enable_ptrs == 0, "PTRS NOT SUPPORTED IF TRANSFORM PRECODING IS ENABLED\n");
 
@@ -944,9 +964,12 @@ int main(int argc, char **argv)
     input_fd);
     if (read_errors==0) exit(1);
     for (int i=0;i<16;i+=2) printf("slot_offset %d : %d,%d\n",
-           slot_offset,
-           ((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[i],
-           ((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[1+i]);
+				   slot_offset,
+				   ((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[i],
+				   ((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[1+i]);
+
+    mod_order = nr_get_Qm_ul(Imcs, mcs_table);
+    code_rate = nr_get_code_rate_ul(Imcs, mcs_table);
   }
   
   for (SNR = snr0; SNR < snr1; SNR += snr_step) {
@@ -968,6 +991,10 @@ int main(int argc, char **argv)
     reset_meas(&gNB->ulsch_llr_stats);
     reset_meas(&gNB->ulsch_channel_compensation_stats);
     reset_meas(&gNB->ulsch_rbs_extraction_stats);
+    reset_meas(&UE->ulsch_ldpc_encoding_stats);
+    reset_meas(&UE->ulsch_rate_matching_stats);
+    reset_meas(&UE->ulsch_interleaving_stats);
+    reset_meas(&UE->ulsch_encoding_stats);
 
     clear_pusch_stats(gNB);
     for (trial = 0; trial < n_trials; trial++) {
@@ -1045,7 +1072,8 @@ int main(int argc, char **argv)
       pusch_pdu->pusch_ptrs.ptrs_ports_list   = (nfapi_nr_ptrs_ports_t *) malloc(2*sizeof(nfapi_nr_ptrs_ports_t));
       pusch_pdu->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset = 0;
 
-      if (transform_precoding == transform_precoder_enabled) { 
+      // if transform precoding is enabled
+      if (transform_precoding == 0) {
 
         pusch_pdu->dfts_ofdm.low_papr_group_number = *scc->physCellId % 30; // U as defined in 38.211 section 6.4.1.1.1.2 
         pusch_pdu->dfts_ofdm.low_papr_sequence_number = 0;     // V as defined in 38.211 section 6.4.1.1.1.2
@@ -1105,7 +1133,8 @@ int main(int argc, char **argv)
 
       ul_config.ul_config_list[0].pusch_config_pdu.transform_precoding = transform_precoding;
 
-      if (transform_precoding == transform_precoder_enabled) { 
+      // if transform precoding is enabled
+      if (transform_precoding == 0) {
    
         ul_config.ul_config_list[0].pusch_config_pdu.dfts_ofdm.low_papr_group_number = *scc->physCellId % 30;// U as defined in 38.211 section 6.4.1.1.1.2 
         ul_config.ul_config_list[0].pusch_config_pdu.dfts_ofdm.low_papr_sequence_number = 0;// V as defined in 38.211 section 6.4.1.1.1.2
@@ -1158,7 +1187,7 @@ int main(int argc, char **argv)
                                 frame_parms->ofdm_symbol_size/(12*nb_rb));
 
         for (i=0; i<slot_length; i++) {
-          for (int aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
+          for (int aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
             s_re[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)]);
             s_im[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)+1]);
           }
@@ -1215,7 +1244,7 @@ int main(int argc, char **argv)
 	}
 
 
-	if (n_trials == 1  && round==0) { 
+	if (n_trials == 1  && round==0) {
 #ifdef __AVX2__
 	  int off = ((nb_rb&1) == 1)? 4:0;
 #else
@@ -1226,6 +1255,8 @@ int main(int argc, char **argv)
 		&gNB->pusch_vars[0]->rxdataF_ext[0][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
 	  LOG_M("chestF0.m","chF0",
 		&gNB->pusch_vars[0]->ul_ch_estimates[0][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
+	  LOG_M("chestT0.m","chT0",
+		&gNB->pusch_vars[0]->ul_ch_estimates_time[0][0],frame_parms->ofdm_symbol_size,1,1);
 	  LOG_M("chestF0_ext.m","chF0_ext",
 		&gNB->pusch_vars[0]->ul_ch_estimates_ext[0][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
 		(nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
@@ -1343,6 +1374,11 @@ int main(int argc, char **argv)
       printStatIndent2(&gNB->ulsch_llr_stats,"ULSCH llr computation");
       printStatIndent(&gNB->ulsch_unscrambling_stats,"ULSCH unscrambling");
       printStatIndent(&gNB->ulsch_decoding_stats,"ULSCH total decoding time");
+      printStatIndent(&UE->ulsch_encoding_stats,"ULSCH total encoding time");
+      printStatIndent2(&UE->ulsch_segmentation_stats,"ULSCH segmentation time");
+      printStatIndent2(&UE->ulsch_ldpc_encoding_stats,"ULSCH LDPC encoder time");
+      printStatIndent2(&UE->ulsch_rate_matching_stats,"ULSCH rate-matching time");
+      printStatIndent2(&UE->ulsch_interleaving_stats,"ULSCH interleaving time");
       //printStatIndent2(&gNB->ulsch_deinterleaving_stats,"ULSCH deinterleaving");
       //printStatIndent2(&gNB->ulsch_rate_unmatching_stats,"ULSCH rate matching rx");
       //printStatIndent2(&gNB->ulsch_ldpc_decoding_stats,"ULSCH ldpc decoding");
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/dummy_functions.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/dummy_functions.c
index 4d17fe723cd8653f2e3715ba5ae93dc8ba0da9bf..b8a5c7a78069cc88aa0072f68fefeea4c5bd776b 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/dummy_functions.c
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/dummy_functions.c
@@ -146,6 +146,11 @@ int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0);
 int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req){ return(0);  }
 int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req){ return(0);  }
 int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0);  }
+int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind) { return(0);  }
 
 int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) { return(0); }
 
diff --git a/openair1/SIMULATION/TOOLS/abstraction.c b/openair1/SIMULATION/TOOLS/abstraction.c
index 7ac19804176115087bb1db54b803543bd20a7bf9..d19afcd0305a9d6a0a56f17a8186d56d2d866924 100644
--- a/openair1/SIMULATION/TOOLS/abstraction.c
+++ b/openair1/SIMULATION/TOOLS/abstraction.c
@@ -111,14 +111,14 @@ int freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples) {
 
     for (aarx=0; aarx<desc->nb_rx; aarx++) {
       for (aatx=0; aatx<desc->nb_tx; aatx++) {
-        desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].x=0.0;
-        desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].y=0.0;
+        desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].r=0.0;
+        desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].i=0.0;
 
         for (l=0; l<(int)desc->nb_taps; l++) {
-          desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].x+=(desc->a[l][aarx+(aatx*desc->nb_rx)].x*clut[l]+
-              desc->a[l][aarx+(aatx*desc->nb_rx)].y*slut[l]);
-          desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].y+=(-desc->a[l][aarx+(aatx*desc->nb_rx)].x*slut[l]+
-              desc->a[l][aarx+(aatx*desc->nb_rx)].y*clut[l]);
+          desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].r+=(desc->a[l][aarx+(aatx*desc->nb_rx)].r*clut[l]+
+              desc->a[l][aarx+(aatx*desc->nb_rx)].i*slut[l]);
+          desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].i+=(-desc->a[l][aarx+(aatx*desc->nb_rx)].r*slut[l]+
+              desc->a[l][aarx+(aatx*desc->nb_rx)].i*clut[l]);
         }
       }
     }
@@ -138,42 +138,42 @@ double compute_pbch_sinr(channel_desc_t *desc,
   uint16_t f;
   uint8_t aarx,aatx;
   double S;
-  struct complex S_i1;
-  struct complex S_i2;
+  struct complexd S_i1;
+  struct complexd S_i2;
   avg_sinr=0.0;
 
   //  printf("nb_rb %d\n",nb_rb);
   for (f=(nb_rb-6); f<(nb_rb+6); f++) {
     S = 0.0;
-    S_i1.x =0.0;
-    S_i1.y =0.0;
-    S_i2.x =0.0;
-    S_i2.y =0.0;
+    S_i1.r =0.0;
+    S_i1.i =0.0;
+    S_i2.r =0.0;
+    S_i2.i =0.0;
 
     for (aarx=0; aarx<desc->nb_rx; aarx++) {
       for (aatx=0; aatx<desc->nb_tx; aatx++) {
-        S    += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc->chF[aarx+(aatx*desc->nb_rx)][f].x +
-                 desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc->chF[aarx+(aatx*desc->nb_rx)][f].y);
+        S    += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc->chF[aarx+(aatx*desc->nb_rx)][f].r +
+                 desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc->chF[aarx+(aatx*desc->nb_rx)][f].i);
         //  printf("%d %d chF[%d] => (%f,%f)\n",aarx,aatx,f,desc->chF[aarx+(aatx*desc->nb_rx)][f].x,desc->chF[aarx+(aatx*desc->nb_rx)][f].y);
 
         if (desc_i1) {
-          S_i1.x += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].x +
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].y);
-          S_i1.y += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].y -
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].x);
+          S_i1.r += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].r +
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].i);
+          S_i1.i += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].i -
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].r);
         }
 
         if (desc_i2) {
-          S_i2.x += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].x +
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].y);
-          S_i2.y += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].y -
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].x);
+          S_i2.r += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].r +
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].i);
+          S_i2.r += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].i -
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].r);
         }
       }
     }
 
     //    printf("snr %f f %d : S %f, S_i1 %f, S_i2 %f\n",snr,f-nb_rb,S,snr_i1*sqrt(S_i1.x*S_i1.x + S_i1.y*S_i1.y),snr_i2*sqrt(S_i2.x*S_i2.x + S_i2.y*S_i2.y));
-    avg_sinr += (snr*S/(desc->nb_tx+snr_i1*sqrt(S_i1.x*S_i1.x + S_i1.y*S_i1.y)+snr_i2*sqrt(S_i2.x*S_i2.x + S_i2.y*S_i2.y)));
+    avg_sinr += (snr*S/(desc->nb_tx+snr_i1*sqrt(S_i1.r*S_i1.r + S_i1.i*S_i1.i)+snr_i2*sqrt(S_i2.r*S_i2.r + S_i2.i*S_i2.i)));
   }
 
   //  printf("avg_sinr %f (%f,%f,%f)\n",avg_sinr/12.0,snr,snr_i1,snr_i2);
@@ -191,42 +191,42 @@ double compute_sinr(channel_desc_t *desc,
   uint16_t f;
   uint8_t aarx,aatx;
   double S;
-  struct complex S_i1;
-  struct complex S_i2;
+  struct complexd S_i1;
+  struct complexd S_i2;
   DevAssert( nb_rb > 0 );
   avg_sinr=0.0;
 
   //  printf("nb_rb %d\n",nb_rb);
   for (f=0; f<2*nb_rb; f++) {
     S = 0.0;
-    S_i1.x =0.0;
-    S_i1.y =0.0;
-    S_i2.x =0.0;
-    S_i2.y =0.0;
+    S_i1.r =0.0;
+    S_i1.i =0.0;
+    S_i2.r =0.0;
+    S_i2.i =0.0;
 
     for (aarx=0; aarx<desc->nb_rx; aarx++) {
       for (aatx=0; aatx<desc->nb_tx; aatx++) {
-        S    += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc->chF[aarx+(aatx*desc->nb_rx)][f].x +
-                 desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc->chF[aarx+(aatx*desc->nb_rx)][f].y);
+        S    += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc->chF[aarx+(aatx*desc->nb_rx)][f].r +
+                 desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc->chF[aarx+(aatx*desc->nb_rx)][f].i);
 
         if (desc_i1) {
-          S_i1.x += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].x +
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].y);
-          S_i1.y += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].y -
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].x);
+          S_i1.r += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].r +
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].i);
+          S_i1.i += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].i -
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].r);
         }
 
         if (desc_i2) {
-          S_i2.x += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].x +
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].y);
-          S_i2.y += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].y -
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].x);
+          S_i2.r += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].r +
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].i);
+          S_i2.i += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].i -
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].r);
         }
       }
     }
 
     //        printf("f %d : S %f, S_i1 %f, S_i2 %f\n",f-nb_rb,snr*S,snr_i1*sqrt(S_i1.x*S_i1.x + S_i1.y*S_i1.y),snr_i2*sqrt(S_i2.x*S_i2.x + S_i2.y*S_i2.y));
-    avg_sinr += (snr*S/(desc->nb_tx+snr_i1*sqrt(S_i1.x*S_i1.x + S_i1.y*S_i1.y)+snr_i2*sqrt(S_i2.x*S_i2.x + S_i2.y*S_i2.y)));
+    avg_sinr += (snr*S/(desc->nb_tx+snr_i1*sqrt(S_i1.r*S_i1.r + S_i1.i*S_i1.i)+snr_i2*sqrt(S_i2.r*S_i2.r + S_i2.i*S_i2.i)));
   }
 
   //  printf("avg_sinr %f (%f,%f,%f)\n",avg_sinr/12.0,snr,snr_i1,snr_i2);
diff --git a/openair1/SIMULATION/TOOLS/channel_sim.c b/openair1/SIMULATION/TOOLS/channel_sim.c
index 81949f40e6b334b2ca1b7231ee8ef48c174cb552..197a296a5125694f0fc5fe2c178aadfbb59852f6 100644
--- a/openair1/SIMULATION/TOOLS/channel_sim.c
+++ b/openair1/SIMULATION/TOOLS/channel_sim.c
@@ -70,16 +70,16 @@ void do_DL_sig(sim_t *sim,
 
   double s_re0[30720];
   double s_re1[30720];
-  double *s_re[2];
+  double *s_re[RC.nb_RU];
   double s_im0[30720];
   double s_im1[30720];
-  double *s_im[2];
+  double *s_im[RC.nb_RU];
   double r_re00[30720];
   double r_re01[30720];
-  double *r_re0[2];
+  double *r_re0[RC.nb_RU];
   double r_im00[30720];
   double r_im01[30720];
-  double *r_im0[2];
+  double *r_im0[RC.nb_RU];
   LTE_DL_FRAME_PARMS *frame_parms;
 
   s_re[0] = s_re0;
@@ -320,16 +320,16 @@ void do_UL_sig(sim_t *sim,
 
   double s_re0[30720];
   double s_re1[30720];
-  double *s_re[2];
+  double *s_re[NB_UE_INST];
   double s_im0[30720];
   double s_im1[30720];
-  double *s_im[2];
+  double *s_im[NB_UE_INST];
   double r_re00[30720];
   double r_re01[30720];
-  double *r_re0[2];
+  double *r_re0[NB_UE_INST];
   double r_im00[30720];
   double r_im01[30720];
-  double *r_im0[2];
+  double *r_im0[NB_UE_INST];
 
   s_re[0] = s_re0;
   s_im[0] = s_im0;
diff --git a/openair1/SIMULATION/TOOLS/corr_mat.m b/openair1/SIMULATION/TOOLS/corr_mat.m
index 6629030b7df92f88005e053da1be1f0ad0f9d4ef..783310e6e566d2046127d52d5188881a4569096b 100644
--- a/openair1/SIMULATION/TOOLS/corr_mat.m
+++ b/openair1/SIMULATION/TOOLS/corr_mat.m
@@ -57,11 +57,11 @@ R22_sqrt_int(2:2:end,:,:) = imag(R22_sqrt);
 
 %%
 fid = fopen('scm_corrmat.h','w');
-fprintf(fid,'double R22_sqrt[][] = {\n');
+fprintf(fid,'static double R22_sqrt[][] = {\n');
 for i=1:size(Gamma,3)
     fprintf(fid,'{');
     fprintf(fid,'%f, ',R22_sqrt_int(:,:,i)); 
     fprintf(fid,'\b\b},\n');
 end
 fprintf(fid,'};\n');
-fclose(fid)
\ No newline at end of file
+fclose(fid)
diff --git a/openair1/SIMULATION/TOOLS/multipath_channel.c b/openair1/SIMULATION/TOOLS/multipath_channel.c
index 3608eb7da25d623cfaa5a87d69bc41c6de8abfb9..3045d8ca6c0b36b7fb34bb529cb64e3281303a15 100644
--- a/openair1/SIMULATION/TOOLS/multipath_channel.c
+++ b/openair1/SIMULATION/TOOLS/multipath_channel.c
@@ -156,7 +156,7 @@ void multipath_channel(channel_desc_t *desc,
 {
 
   int i,ii,j,l;
-  struct complex rx_tmp,tx;
+  struct complexd rx_tmp,tx;
 
   double path_loss = pow(10,desc->path_loss_dB/20);
   int dd;
@@ -183,32 +183,32 @@ void multipath_channel(channel_desc_t *desc,
 
   for (i=0; i<((int)length-dd); i++) {
     for (ii=0; ii<desc->nb_rx; ii++) {
-      rx_tmp.x = 0;
-      rx_tmp.y = 0;
+      rx_tmp.r = 0;
+      rx_tmp.i = 0;
 
       for (j=0; j<desc->nb_tx; j++) {
         for (l = 0; l<(int)desc->channel_length; l++) {
           if ((i>=0) && (i-l)>=0) {
-            tx.x = tx_sig_re[j][i-l];
-            tx.y = tx_sig_im[j][i-l];
+            tx.r = tx_sig_re[j][i-l];
+            tx.i = tx_sig_im[j][i-l];
           } else {
-            tx.x =0;
-            tx.y =0;
+            tx.r =0;
+            tx.i =0;
           }
 
-          rx_tmp.x += (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].x) - (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].y);
-          rx_tmp.y += (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].x) + (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].y);
+          rx_tmp.r += (tx.r * desc->ch[ii+(j*desc->nb_rx)][l].r) - (tx.i * desc->ch[ii+(j*desc->nb_rx)][l].i);
+          rx_tmp.i += (tx.i * desc->ch[ii+(j*desc->nb_rx)][l].r) + (tx.r * desc->ch[ii+(j*desc->nb_rx)][l].i);
 
           if (i==0 && log_channel == 1) {
-	           printf("channel[%d][%d][%d] = %f dB (%e,%e)\n",ii,j,l,10*log10(pow(desc->ch[ii+(j*desc->nb_rx)][l].x,2.0)+pow(desc->ch[ii+(j*desc->nb_rx)][l].y,2.0)),
-		         desc->ch[ii+(j*desc->nb_rx)][l].x,
-		         desc->ch[ii+(j*desc->nb_rx)][l].y);
+	           printf("channel[%d][%d][%d] = %f dB (%e,%e)\n",ii,j,l,10*log10(pow(desc->ch[ii+(j*desc->nb_rx)][l].r,2.0)+pow(desc->ch[ii+(j*desc->nb_rx)][l].i,2.0)),
+		         desc->ch[ii+(j*desc->nb_rx)][l].r,
+		         desc->ch[ii+(j*desc->nb_rx)][l].i);
 	        }
         } //l
       }  // j
 
-      rx_sig_re[ii][i+dd] = rx_tmp.x*path_loss;
-      rx_sig_im[ii][i+dd] = rx_tmp.y*path_loss;
+      rx_sig_re[ii][i+dd] = rx_tmp.r*path_loss;
+      rx_sig_im[ii][i+dd] = rx_tmp.i*path_loss;
 #ifdef DEBUG_CHANNEL      
       if ((i%32)==0) {
 	       printf("rx aa %d: %p %p %f,%f => %e,%e\n",ii,rx_sig_re[ii],rx_sig_im[ii],rx_tmp.x,rx_tmp.y,rx_sig_re[ii][i-dd],rx_sig_im[ii][i-dd]);
diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c
index d2339954bdff175513e2c8094750e19a6d62f7db..d393bb134296d82bf4964ad1087b75d2467d18a2 100644
--- a/openair1/SIMULATION/TOOLS/random_channel.c
+++ b/openair1/SIMULATION/TOOLS/random_channel.c
@@ -72,7 +72,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
                        uint8_t channel_length,
                        double *amps,
                        double *delays,
-                       struct complex **R_sqrt,
+                       struct complexd *R_sqrt,
                        double Td,
                        double sampling_rate,
                        double channel_bandwidth,
@@ -116,52 +116,52 @@ void fill_channel_desc(channel_desc_t *chan_desc,
   chan_desc->first_run                  = 1;
   chan_desc->ip                         = 0.0;
   chan_desc->max_Doppler                = max_Doppler;
-  chan_desc->ch                         = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-  chan_desc->chF                        = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-  chan_desc->a                          = (struct complex **) malloc(nb_taps*sizeof(struct complex *));
+  chan_desc->ch                         = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+  chan_desc->chF                        = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+  chan_desc->a                          = (struct complexd **) malloc(nb_taps*sizeof(struct complexd *));
   LOG_D(OCM,"[CHANNEL] Filling ch \n");
 
   for (i = 0; i<nb_tx*nb_rx; i++)
-    chan_desc->ch[i] = (struct complex *) malloc(channel_length * sizeof(struct complex));
+    chan_desc->ch[i] = (struct complexd *) malloc(channel_length * sizeof(struct complexd));
 
   for (i = 0; i<nb_tx*nb_rx; i++)
-    chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex)); // allocate for up to 100 RBs, 12 samples per RB
+    chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd)); // allocate for up to 100 RBs, 12 samples per RB
 
   LOG_D(OCM,"[CHANNEL] Filling a (nb_taps %d)\n",nb_taps);
 
   for (i = 0; i<nb_taps; i++) {
-    LOG_D(OCM,"tap %d (%p,%zu)\n",i,&chan_desc->a[i],nb_tx*nb_rx * sizeof(struct complex));
-    chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+    LOG_D(OCM,"tap %d (%p,%zu)\n",i,&chan_desc->a[i],nb_tx*nb_rx * sizeof(struct complexd));
+    chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
   }
 
   LOG_D(OCM,"[CHANNEL] Doing R_sqrt ...\n");
 
   if (R_sqrt == NULL) {
-    chan_desc->R_sqrt         = (struct complex **) calloc(nb_taps,sizeof(struct complex *));
+    chan_desc->R_sqrt         = (struct complexd **) calloc(nb_taps,sizeof(struct complexd *));
     chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_NTAPS ;
 
     for (i = 0; i<nb_taps; i++) {
-      chan_desc->R_sqrt[i]    = (struct complex *) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
+      chan_desc->R_sqrt[i]    = (struct complexd *) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complexd));
 
       for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-        chan_desc->R_sqrt[i][j].x = 1.0;
-        chan_desc->R_sqrt[i][j].y = 0.0;
+        chan_desc->R_sqrt[i][j].r = 1.0;
+        chan_desc->R_sqrt[i][j].i = 0.0;
       }
     }
   } else {
-    chan_desc->R_sqrt = (struct complex **) calloc(nb_taps,sizeof(struct complex *));
+    chan_desc->R_sqrt = (struct complexd **) calloc(nb_taps,sizeof(struct complexd *));
 
     for (i = 0; i<nb_taps; i++) {
-      //chan_desc->R_sqrt[i]    = (struct complex*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
-      //chan_desc->R_sqrt = (struct complex*)&R_sqrt[i][0];
+      //chan_desc->R_sqrt[i]    = (struct complexd*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complexd));
+      //chan_desc->R_sqrt = (struct complexd*)&R_sqrt[i][0];
       /* all chan_desc share the same R_sqrt, coming from caller */
-      chan_desc->R_sqrt[i] = R_sqrt[0];
+      chan_desc->R_sqrt[i] = R_sqrt;
     }
   }
 
   for (i = 0; i<nb_taps; i++) {
     for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-      LOG_D(OCM,"Rsqrt[%d][%d] %f %f\n",i,j,chan_desc->R_sqrt[i][j].x,chan_desc->R_sqrt[i][j].y);
+      LOG_D(OCM,"Rsqrt[%d][%d] %f %f\n",i,j,chan_desc->R_sqrt[i][j].r,chan_desc->R_sqrt[i][j].i);
     }
   }
 
@@ -177,13 +177,13 @@ void fill_channel_desc(channel_desc_t *chan_desc,
   reset_meas(&chan_desc->convolution);
 }
 
-double mbsfn_delays[] = {0,.03,.15,.31,.37,1.09,12.490,12.52,12.64,12.80,12.86,13.58,27.49,27.52,27.64,27.80,27.86,28.58};
-double mbsfn_amps_dB[] = {0,-1.5,-1.4,-3.6,-0.6,-7.0,-10,-11.5,-11.4,-13.6,-10.6,-17.0,-20,-21.5,-21.4,-23.6,-20.6,-27};
+static double mbsfn_delays[] = {0,.03,.15,.31,.37,1.09,12.490,12.52,12.64,12.80,12.86,13.58,27.49,27.52,27.64,27.80,27.86,28.58};
+static double mbsfn_amps_dB[] = {0,-1.5,-1.4,-3.6,-0.6,-7.0,-10,-11.5,-11.4,-13.6,-10.6,-17.0,-20,-21.5,-21.4,-23.6,-20.6,-27};
 
-double scm_c_delays[] = {0, 0.0125, 0.0250, 0.3625, 0.3750, 0.3875, 0.2500, 0.2625, 0.2750, 1.0375, 1.0500, 1.0625, 2.7250, 2.7375, 2.7500, 4.6000, 4.6125, 4.6250};
-double scm_c_amps_dB[] = {0.00, -2.22, -3.98, -1.86, -4.08, -5.84, -1.08, -3.30, -5.06, -9.08, -11.30, -13.06, -15.14, -17.36, -19.12, -20.64, -22.85, -24.62};
+static double scm_c_delays[] = {0, 0.0125, 0.0250, 0.3625, 0.3750, 0.3875, 0.2500, 0.2625, 0.2750, 1.0375, 1.0500, 1.0625, 2.7250, 2.7375, 2.7500, 4.6000, 4.6125, 4.6250};
+static double scm_c_amps_dB[] = {0.00, -2.22, -3.98, -1.86, -4.08, -5.84, -1.08, -3.30, -5.06, -9.08, -11.30, -13.06, -15.14, -17.36, -19.12, -20.64, -22.85, -24.62};
 
-double tdl_a_delays[] = {0.0000,
+static double tdl_a_delays[] = {0.0000,
                          0.3819,
                          0.4025,
                          0.5868,
@@ -207,7 +207,7 @@ double tdl_a_delays[] = {0.0000,
                          5.3043,
                          9.6586
                         };
-double tdl_a_amps_dB[] = {-13.4,
+static double tdl_a_amps_dB[] = {-13.4,
                           0,
                           -2.2,
                           -4,
@@ -232,7 +232,7 @@ double tdl_a_amps_dB[] = {-13.4,
                           -29.7
                           };
 
-double tdl_b_delays[] = {0.0000,
+static double tdl_b_delays[] = {0.0000,
                          0.1072,
                          0.2155,
                          0.2095,
@@ -257,7 +257,7 @@ double tdl_b_delays[] = {0.0000,
                          4.7834
                         };
 
-double tdl_b_amps_dB[] = {0,
+static double tdl_b_amps_dB[] = {0,
                           -2.2,
                           -4,
                           -3.2,
@@ -282,7 +282,7 @@ double tdl_b_amps_dB[] = {0,
                           -11.3
                           };
 
-double tdl_c_delays[] = {0,
+static double tdl_c_delays[] = {0,
                          0.2099,
                          0.2219,
                          0.2329,
@@ -308,7 +308,7 @@ double tdl_c_delays[] = {0,
                          8.6523
                         };
 
-double tdl_c_amps_dB[] = {-4.4,
+static double tdl_c_amps_dB[] = {-4.4,
                           -1.2,
                           -3.5,
                           -5.2,
@@ -334,7 +334,7 @@ double tdl_c_amps_dB[] = {-4.4,
                           -22.8
                           };
 
-double tdl_d_delays[] = {//0,
+static double tdl_d_delays[] = {//0,
   0,
   0.035,
   0.612,
@@ -350,7 +350,7 @@ double tdl_d_delays[] = {//0,
   12.525
 };
 
-double tdl_d_amps_dB[] = {//-0.2,
+static double tdl_d_amps_dB[] = {//-0.2,
   //-13.5,
   -.00147,
     -18.8,
@@ -369,7 +369,7 @@ double tdl_d_amps_dB[] = {//-0.2,
 
 #define TDL_D_RICEAN_FACTOR .046774
 
-double tdl_e_delays[] = {0,
+static double tdl_e_delays[] = {0,
                          0.5133,
                          0.5440,
                          0.5630,
@@ -385,7 +385,7 @@ double tdl_e_delays[] = {0,
                          20.6519
                         };
 
-double tdl_e_amps_dB[] = {//-0.03,
+static double tdl_e_amps_dB[] = {//-0.03,
   //-22.03,
   -.00433,
     -15.8,
@@ -405,102 +405,78 @@ double tdl_e_amps_dB[] = {//-0.03,
 
 #define TDL_E_RICEAN_FACTOR 0.0063096
 
-double epa_delays[] = { 0,.03,.07,.09,.11,.19,.41};
-double epa_amps_dB[] = {0.0,-1.0,-2.0,-3.0,-8.0,-17.2,-20.8};
+static double epa_delays[] = { 0,.03,.07,.09,.11,.19,.41};
+static double epa_amps_dB[] = {0.0,-1.0,-2.0,-3.0,-8.0,-17.2,-20.8};
 
-double eva_delays[] = { 0,.03,.15,.31,.37,.71,1.09,1.73,2.51};
-double eva_amps_dB[] = {0.0,-1.5,-1.4,-3.6,-0.6,-9.1,-7.0,-12.0,-16.9};
+static double eva_delays[] = { 0,.03,.15,.31,.37,.71,1.09,1.73,2.51};
+static double eva_amps_dB[] = {0.0,-1.5,-1.4,-3.6,-0.6,-9.1,-7.0,-12.0,-16.9};
 
-double etu_delays[] = { 0,.05,.12,.2,.23,.5,1.6,2.3,5.0};
-double etu_amps_dB[] = {-1.0,-1.0,-1.0,0.0,0.0,0.0,-3.0,-5.0,-7.0};
+static double etu_delays[] = { 0,.05,.12,.2,.23,.5,1.6,2.3,5.0};
+static double etu_amps_dB[] = {-1.0,-1.0,-1.0,0.0,0.0,0.0,-3.0,-5.0,-7.0};
 
-double default_amps_lin[] = {0.3868472, 0.3094778, 0.1547389, 0.0773694, 0.0386847, 0.0193424, 0.0096712, 0.0038685};
-double default_amp_lin[] = {1};
-
-double ts_shift_delays[] = {0, 1/7.68};
-double ts_shift_amps[] = {0, 1};
+static double default_amps_lin[] = {0.3868472, 0.3094778, 0.1547389, 0.0773694, 0.0386847, 0.0193424, 0.0096712, 0.0038685};
+static double default_amp_lin[] = {1};
 
 //correlation matrix for a 2x2 channel with full Tx correlation
-struct complex R_sqrt_22_corr_tap[16] = {{0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0},
+static struct complexd R_sqrt_22_corr[16] = {{0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0},
   {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {0.70711,0},
   {0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0},
   {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {0.70711,0}
 };
-struct complex *R_sqrt_22_corr[1]     = {R_sqrt_22_corr_tap};
 
 //correlation matrix for a fully correlated 2x1 channel (h1==h2)
-struct complex R_sqrt_21_corr_tap[4]  = {{0.70711,0}, {0.70711,0}, {0.70711,0}, {0.70711,0}};
-struct complex *R_sqrt_21_corr[1]      = {R_sqrt_21_corr_tap};
+static struct complexd R_sqrt_21_corr[]  = {{0.70711,0}, {0.70711,0}, {0.70711,0}, {0.70711,0}};
 
 //correlation matrix for a 2x2 channel with full Tx anti-correlation
-struct complex R_sqrt_22_anticorr_tap[16] = {{0.70711,0}, {0.0, 0.0}, {-0.70711,0}, {0.0, 0.0},
+static struct complexd R_sqrt_22_anticorr[16] = {{0.70711,0}, {0.0, 0.0}, {-0.70711,0}, {0.0, 0.0},
   {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {-0.70711,0},
   {-0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0},
   {0.0, 0.0}, {-0.70711,0}, {0.0, 0.0}, {0.70711,0}
 };
-struct complex *R_sqrt_22_anticorr[1]     = {R_sqrt_22_anticorr_tap};
 
 //correlation matrix for a fully anti-correlated 2x1 channel (h1==-h2)
-struct complex R_sqrt_21_anticorr_tap[4]  = {{0.70711,0}, {-0.70711,0}, {-0.70711,0}, {0.70711,0}};
-struct complex *R_sqrt_21_anticorr[1]     = {R_sqrt_21_anticorr_tap};
-
-struct complex **R_sqrt_ptr2;
+static struct complexd R_sqrt_21_anticorr[4]  = {{0.70711,0}, {-0.70711,0}, {-0.70711,0}, {0.70711,0}};
 
 // full correlation matrix in vectorized form for 2x2 channel, where h1 is  perfectly orthogonal to h2
 
-struct complex R_sqrt_22_orthogonal_tap[16] = {{0.70711,0.0}, {0.0, 0.0}, {0.0,0.0}, {0.0, 0.0},
+static struct complexd R_sqrt_22_orthogonal[16] = {{0.70711,0.0}, {0.0, 0.0}, {0.0,0.0}, {0.0, 0.0},
   {0.0, 0.0}, {0.0,0.0}, {0.0, 0.0}, {0.0,0.0},
   {0.0,0.0}, {0.0, 0.0}, {0.0,0.0}, {0.0, 0.0},
   {0.0, 0.0}, {0.0,0.0}, {0.0, 0.0}, {0.70711,0.0}
 };
-struct complex *R_sqrt_22_orthogonal[1]     = {R_sqrt_22_orthogonal_tap};
 
 // full correlation matrix for TM4 to make orthogonal effective channel
-
-
-
-
-struct complex R_sqrt_22_orth_eff_ch_TM4_prec_real_tap[16] = {{0.70711,0.0}, {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0},
+static struct complexd R_sqrt_22_orth_eff_ch_TM4_prec_real[16] = {{0.70711,0.0}, {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0},
   {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0}, {-0.70711,0.0},
   {0.70711,0.0}, {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0},
   {0.0, 0.0}, {-0.70711,0.0}, {0.0, 0.0}, {0.70711,0.0}
 };
-struct complex *R_sqrt_22_orth_eff_ch_TM4_prec_real[1]     = {R_sqrt_22_orth_eff_ch_TM4_prec_real_tap};
 
-
-
-
-struct complex R_sqrt_22_orth_eff_ch_TM4_prec_imag_tap[16] = {{0.70711,0.0}, {0.0,0.0}, {0.0, -0.70711}, {0.0,0.0},
+static struct complexd R_sqrt_22_orth_eff_ch_TM4_prec_imag[16] = {{0.70711,0.0}, {0.0,0.0}, {0.0, -0.70711}, {0.0,0.0},
   {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0}, {0.0,0.70711},
   {0.0,-0.70711}, {0.0, 0.0}, {-0.70711,0.0}, {0.0, 0.0},
   {0.0, 0.0}, {0.0,0.70711}, {0.0, 0.0}, {-0.70711,0.0}
 };
-struct complex *R_sqrt_22_orth_eff_ch_TM4_prec_imag[1]     = {R_sqrt_22_orth_eff_ch_TM4_prec_imag_tap};
 
 //Correlation matrix for EPA channel
-struct complex R_sqrt_22_EPA_low_tap[16] = {{1.0,0.0}, {0.0,0.0}, {0.0,0.0}, {0.0,0.0},
+static struct complexd R_sqrt_22_EPA_low[16] = {{1.0,0.0}, {0.0,0.0}, {0.0,0.0}, {0.0,0.0},
   {0.0,0.0}, {1.0,0.0}, {0.0,0.0}, {0.0,0.0},
   {0.0,0.0}, {0.0,0.0}, {1.0,0.0}, {0.0,0.0},
   {0.0,0.0}, {0.0,0.0}, {0.0,0.0}, {1.0,0.0}
 };
-struct complex *R_sqrt_22_EPA_low[1]     = {R_sqrt_22_EPA_low_tap};
 
-struct complex R_sqrt_22_EPA_high_tap[16] = {
+static struct complexd R_sqrt_22_EPA_high[16] = {
   {0.7179,0.0}, {0.4500,0.0}, {0.4500,0.0}, {0.2821,0.0},
   {0.4500,0.0}, {0.7179,0.0}, {0.2821,0.0}, {0.4500,0.0},
   {0.4500,0.0}, {0.2821,0.0}, {0.7179,0.0}, {0.4500,0.0},
   {0.2821,0.0}, {0.4500,0.0}, {0.4500,0.0}, {0.7179,0.0}
 };
-struct complex *R_sqrt_22_EPA_high[1]     = {R_sqrt_22_EPA_high_tap};
 
-struct complex R_sqrt_22_EPA_medium_tap[16] = {{0.8375,0.0}, {0.5249,0.0}, {0.1286,0.0}, {0.0806,0.0},
+static struct complexd R_sqrt_22_EPA_medium[16] = {{0.8375,0.0}, {0.5249,0.0}, {0.1286,0.0}, {0.0806,0.0},
   {0.5249,0.0}, {0.8375,0.0}, {0.0806,0.0}, {0.1286,0.0},
   {0.1286,0.0}, {0.0806,0.0}, {0.8375,0.0}, {0.5249,0.0},
   {0.0806,0.0}, {0.1286,0.0}, {0.5249,0.0}, {0.8375,0.0}
 };
-struct complex *R_sqrt_22_EPA_medium[1]     = {R_sqrt_22_EPA_medium_tap};
-
-
 
 //Rayleigh1_orth_eff_ch_TM4
 
@@ -535,37 +511,37 @@ void tdlModel(int  tdl_paths, double *tdl_delays, double *tdl_amps_dB, double DS
   chan_desc->delays         = tdl_delays;
   chan_desc->aoa            = 0;
   chan_desc->random_aoa     = 0;
-  chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-  chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-  chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+  chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+  chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+  chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
   for (int i = 0; i<nb_tx*nb_rx; i++)
-    chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+    chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
   for (int i = 0; i<nb_tx*nb_rx; i++)
-    chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+    chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
   for (int i = 0; i<chan_desc->nb_taps; i++)
-    chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+    chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
-  chan_desc->R_sqrt  = (struct complex **) malloc(6*sizeof(struct complex **));
+  chan_desc->R_sqrt  = (struct complexd **) malloc(6*sizeof(struct complexd **));
 
   if (nb_tx==2 && nb_rx==2) {
     for (int i = 0; i<(tdl_pathsby3); i++)
-      chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
+      chan_desc->R_sqrt[i] = (struct complexd *) &R22_sqrt[i][0];
   } else if (nb_tx==2 && nb_rx==1) {
     for (int i = 0; i<(tdl_pathsby3); i++)
-      chan_desc->R_sqrt[i] = (struct complex *) &R21_sqrt[i][0];
+      chan_desc->R_sqrt[i] = (struct complexd *) &R21_sqrt[i][0];
   } else if (nb_tx==1 && nb_rx==2) {
     for (int i = 0; i<(tdl_pathsby3); i++)
-      chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
+      chan_desc->R_sqrt[i] = (struct complexd *) &R12_sqrt[i][0];
   } else {
     for (int i = 0; i<(tdl_pathsby3); i++) {
-      chan_desc->R_sqrt[i]    = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+      chan_desc->R_sqrt[i]    = (struct complexd *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
 
       for (int j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-        chan_desc->R_sqrt[i][j].x = 1.0;
-        chan_desc->R_sqrt[i][j].y = 0.0;
+        chan_desc->R_sqrt[i][j].r = 1.0;
+        chan_desc->R_sqrt[i][j].i = 0.0;
       }
 
       LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx);
@@ -600,6 +576,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
   double sum_amps;
   double aoa,ricean_factor,Td,maxDoppler;
   int channel_length,nb_taps;
+  struct complexd *R_sqrt_ptr2;
   chan_desc->modelid                   = channel_model;
   chan_desc->nb_tx                      = nb_tx;
   chan_desc->nb_rx                      = nb_rx;
@@ -648,39 +625,39 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
-      chan_desc->R_sqrt  = (struct complex **) malloc(6*sizeof(struct complex **));
+      chan_desc->R_sqrt  = (struct complexd **) malloc(6*sizeof(struct complexd **));
 
       if (nb_tx==2 && nb_rx==2) {
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R22_sqrt[i][0];
       } else if (nb_tx==2 && nb_rx==1) {
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R21_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R21_sqrt[i][0];
       } else if (nb_tx==1 && nb_rx==2) {
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R12_sqrt[i][0];
       } else {
         chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
 
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
 
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-            chan_desc->R_sqrt[i][j].x = 1.0;
-            chan_desc->R_sqrt[i][j].y = 0.0;
+            chan_desc->R_sqrt[i][j].r = 1.0;
+            chan_desc->R_sqrt[i][j].i = 0.0;
           }
 
           LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx);
@@ -710,39 +687,39 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 0.1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
-      chan_desc->R_sqrt  = (struct complex **) malloc(6*sizeof(struct complex **));
+      chan_desc->R_sqrt  = (struct complexd **) malloc(6*sizeof(struct complexd **));
 
       if (nb_tx==2 && nb_rx==2) {
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R22_sqrt[i][0];
       } else if (nb_tx==2 && nb_rx==1) {
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R21_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R21_sqrt[i][0];
       } else if (nb_tx==1 && nb_rx==2) {
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R12_sqrt[i][0];
       } else {
         chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
 
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
 
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-            chan_desc->R_sqrt[i][j].x = 1.0;
-            chan_desc->R_sqrt[i][j].y = 0.0;
+            chan_desc->R_sqrt[i][j].r = 1.0;
+            chan_desc->R_sqrt[i][j].i = 0.0;
           }
 
           LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx);
@@ -807,34 +784,34 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
       if (nb_tx==2 && nb_rx==2) {
-        chan_desc->R_sqrt  = (struct complex **) malloc(6*sizeof(struct complex **));
+        chan_desc->R_sqrt  = (struct complexd **) malloc(6*sizeof(struct complexd **));
 
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R22_sqrt[i][0];
       } else {
-        chan_desc->R_sqrt         = (struct complex **) malloc(6*sizeof(struct complex **));
+        chan_desc->R_sqrt         = (struct complexd **) malloc(6*sizeof(struct complexd **));
         chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
 
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
 
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-            chan_desc->R_sqrt[i][j].x = 1.0;
-            chan_desc->R_sqrt[i][j].y = 0.0;
+            chan_desc->R_sqrt[i][j].r = 1.0;
+            chan_desc->R_sqrt[i][j].i = 0.0;
           }
 
           LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n");
@@ -863,32 +840,32 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
       if (nb_tx==2 && nb_rx==2) {
-        chan_desc->R_sqrt  = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex **));
+        chan_desc->R_sqrt  = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd **));
 
         for (i = 0; i<chan_desc->nb_taps; i++)
-          chan_desc->R_sqrt[i] = R_sqrt_22_EPA_low[0];
+          chan_desc->R_sqrt[i] = R_sqrt_22_EPA_low;
       } else {
         printf("Correlation matrices are implemented for 2 x 2 only");
       }
 
       /*else {
-        chan_desc->R_sqrt         = (struct complex**) malloc(6*sizeof(struct complex**));
+        chan_desc->R_sqrt         = (struct complexd**) malloc(6*sizeof(struct complexd**));
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
             chan_desc->R_sqrt[i][j].x = 1.0;
             chan_desc->R_sqrt[i][j].y = 0.0;
@@ -918,32 +895,32 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
       if (nb_tx==2 && nb_rx==2) {
-        chan_desc->R_sqrt  = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex **));
+        chan_desc->R_sqrt  = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd **));
 
         for (i = 0; i<chan_desc->nb_taps; i++)
-          chan_desc->R_sqrt[i] = R_sqrt_22_EPA_high[0];
+          chan_desc->R_sqrt[i] = R_sqrt_22_EPA_high;
       } else {
         printf("Correlation matrices are implemented for 2 x 2 only");
       }
 
       /*else {
-        chan_desc->R_sqrt         = (struct complex**) malloc(6*sizeof(struct complex**));
+        chan_desc->R_sqrt         = (struct complexd**) malloc(6*sizeof(struct complexd**));
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
             chan_desc->R_sqrt[i][j].x = 1.0;
             chan_desc->R_sqrt[i][j].y = 0.0;
@@ -973,32 +950,32 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
       if (nb_tx==2 && nb_rx==2) {
-        chan_desc->R_sqrt  = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex **));
+        chan_desc->R_sqrt  = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd **));
 
         for (i = 0; i<chan_desc->nb_taps; i++)
-          chan_desc->R_sqrt[i] = R_sqrt_22_EPA_medium[0];
+          chan_desc->R_sqrt[i] = R_sqrt_22_EPA_medium;
       } else {
         printf("Correlation matrices are implemented for 2 x 2 only");
       }
 
       /*else {
-        chan_desc->R_sqrt         = (struct complex**) malloc(6*sizeof(struct complex**));
+        chan_desc->R_sqrt         = (struct complexd**) malloc(6*sizeof(struct complexd**));
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
             chan_desc->R_sqrt[i][j].x = 1.0;
             chan_desc->R_sqrt[i][j].y = 0.0;
@@ -1028,34 +1005,34 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
       if (nb_tx==2 && nb_rx==2) {
-        chan_desc->R_sqrt  = (struct complex **) malloc(6*sizeof(struct complex **));
+        chan_desc->R_sqrt  = (struct complexd **) malloc(6*sizeof(struct complexd **));
 
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R22_sqrt[i][0];
       } else {
-        chan_desc->R_sqrt         = (struct complex **) malloc(6*sizeof(struct complex **));
+        chan_desc->R_sqrt         = (struct complexd **) malloc(6*sizeof(struct complexd **));
         chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
 
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
 
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-            chan_desc->R_sqrt[i][j].x = 1.0;
-            chan_desc->R_sqrt[i][j].y = 0.0;
+            chan_desc->R_sqrt[i][j].r = 1.0;
+            chan_desc->R_sqrt[i][j].i = 0.0;
           }
 
           LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n");
@@ -1084,34 +1061,34 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
       if (nb_tx==2 && nb_rx==2) {
-        chan_desc->R_sqrt  = (struct complex **) malloc(6*sizeof(struct complex **));
+        chan_desc->R_sqrt  = (struct complexd **) malloc(6*sizeof(struct complexd **));
 
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R22_sqrt[i][0];
       } else {
-        chan_desc->R_sqrt         = (struct complex **) malloc(6*sizeof(struct complex **));
+        chan_desc->R_sqrt         = (struct complexd **) malloc(6*sizeof(struct complexd **));
         chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
 
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
 
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-            chan_desc->R_sqrt[i][j].x = 1.0;
-            chan_desc->R_sqrt[i][j].y = 0.0;
+            chan_desc->R_sqrt[i][j].r = 1.0;
+            chan_desc->R_sqrt[i][j].i = 0.0;
           }
 
           LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n");
@@ -1140,28 +1117,28 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
-      chan_desc->R_sqrt  = (struct complex **) malloc(6*sizeof(struct complex *));
+      chan_desc->R_sqrt  = (struct complexd **) malloc(6*sizeof(struct complexd *));
       chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6;
 
       for (i = 0; i<6; i++) {
-        chan_desc->R_sqrt[i]    = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->R_sqrt[i]    = (struct complexd *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
 
         for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-          chan_desc->R_sqrt[i][j].x = 1.0;
-          chan_desc->R_sqrt[i][j].y = 0.0;
+          chan_desc->R_sqrt[i][j].r = 1.0;
+          chan_desc->R_sqrt[i][j].i = 0.0;
         }
 
         LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n");
@@ -1397,11 +1374,13 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
 
     case TS_SHIFT:
       nb_taps = 2;
+      double ts_shift_delays[] = {0, 1/7.68};
       Td = ts_shift_delays[1];
       channel_length = 10;
       ricean_factor = 0.0;
       aoa = 0.0;
       maxDoppler = 0;
+      double ts_shift_amps[] = {0, 1};
       fill_channel_desc(chan_desc,nb_tx,
                         nb_rx,
                         nb_taps,
@@ -1729,8 +1708,8 @@ void set_channeldesc_name(channel_desc_t *cdesc,char *modelname) {
 int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
   double s;
   int i,k,l,aarx,aatx;
-  struct complex anew[NB_ANTENNAS_TX*NB_ANTENNAS_RX],acorr[NB_ANTENNAS_TX*NB_ANTENNAS_RX];
-  struct complex phase, alpha, beta;
+  struct complexd anew[NB_ANTENNAS_TX*NB_ANTENNAS_RX],acorr[NB_ANTENNAS_TX*NB_ANTENNAS_RX];
+  struct complexd phase, alpha, beta;
   AssertFatal(desc->nb_tx<=NB_ANTENNAS_TX && desc->nb_rx <= NB_ANTENNAS_RX,
               "random_channel.c: Error: temporary buffer for channel not big enough (%d,%d)\n",desc->nb_tx,desc->nb_rx);
   start_meas(&desc->random_channel);
@@ -1738,8 +1717,8 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
   for (i=0; i<(int)desc->nb_taps; i++) {
     for (aarx=0; aarx<desc->nb_rx; aarx++) {
       for (aatx=0; aatx<desc->nb_tx; aatx++) {
-        anew[aarx+(aatx*desc->nb_rx)].x = sqrt(desc->ricean_factor*desc->amps[i]/2) * gaussdouble(0.0,1.0);
-        anew[aarx+(aatx*desc->nb_rx)].y = sqrt(desc->ricean_factor*desc->amps[i]/2) * gaussdouble(0.0,1.0);
+        anew[aarx+(aatx*desc->nb_rx)].r = sqrt(desc->ricean_factor*desc->amps[i]/2) * gaussdouble(0.0,1.0);
+        anew[aarx+(aatx*desc->nb_rx)].i = sqrt(desc->ricean_factor*desc->amps[i]/2) * gaussdouble(0.0,1.0);
 
         if ((i==0) && (desc->ricean_factor != 1.0)) {
           if (desc->random_aoa==1) {
@@ -1749,10 +1728,10 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
           // this assumes that both RX and TX have linear antenna arrays with lambda/2 antenna spacing.
           // Furhter it is assumed that the arrays are parallel to each other and that they are far enough apart so
           // that we can safely assume plane wave propagation.
-          phase.x = cos(M_PI*((aarx-aatx)*sin(desc->aoa)));
-          phase.y = sin(M_PI*((aarx-aatx)*sin(desc->aoa)));
-          anew[aarx+(aatx*desc->nb_rx)].x += phase.x * sqrt(1.0-desc->ricean_factor);
-          anew[aarx+(aatx*desc->nb_rx)].y += phase.y * sqrt(1.0-desc->ricean_factor);
+          phase.r = cos(M_PI*((aarx-aatx)*sin(desc->aoa)));
+          phase.i = sin(M_PI*((aarx-aatx)*sin(desc->aoa)));
+          anew[aarx+(aatx*desc->nb_rx)].r += phase.r * sqrt(1.0-desc->ricean_factor);
+          anew[aarx+(aatx*desc->nb_rx)].i += phase.i * sqrt(1.0-desc->ricean_factor);
         }
 
 #ifdef DEBUG_CH
@@ -1773,10 +1752,10 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
     */
     //apply correlation matrix
     //compute acorr = R_sqrt[i] * anew
-    alpha.x = 1.0;
-    alpha.y = 0.0;
-    beta.x = 0.0;
-    beta.y = 0.0;
+    alpha.r = 1.0;
+    alpha.i = 0.0;
+    beta.r = 0.0;
+    beta.i = 0.0;
     cblas_zgemv(CblasRowMajor, CblasNoTrans, desc->nb_tx*desc->nb_rx, desc->nb_tx*desc->nb_rx,
                 (void *) &alpha, (void *) desc->R_sqrt[i/3], desc->nb_rx*desc->nb_tx,
                 (void *) anew, 1, (void *) &beta, (void *) acorr, 1);
@@ -1797,10 +1776,10 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
       // a = alpha*acorr+beta*a
       // a = beta*a
       // a = a+alpha*acorr
-      alpha.x = sqrt(1-desc->forgetting_factor);
-      alpha.y = 0;
-      beta.x = sqrt(desc->forgetting_factor);
-      beta.y = 0;
+      alpha.r = sqrt(1-desc->forgetting_factor);
+      alpha.i = 0;
+      beta.r = sqrt(desc->forgetting_factor);
+      beta.i = 0;
       cblas_zscal(desc->nb_tx*desc->nb_rx, (void *) &beta, (void *) desc->a[i], 1);
       cblas_zaxpy(desc->nb_tx*desc->nb_rx, (void *) &alpha, (void *) acorr, 1, (void *) desc->a[i], 1);
       //  desc->a[i][aarx+(aatx*desc->nb_rx)].x = (sqrt(desc->forgetting_factor)*desc->a[i][aarx+(aatx*desc->nb_rx)].x) + sqrt(1-desc->forgetting_factor)*anew.x;
@@ -1820,7 +1799,7 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
 
   stop_meas(&desc->random_channel);
 
-  //memset((void *)desc->ch[aarx+(aatx*desc->nb_rx)],0,(int)(desc->channel_length)*sizeof(struct complex));
+  //memset((void *)desc->ch[aarx+(aatx*desc->nb_rx)],0,(int)(desc->channel_length)*sizeof(struct complexd));
 
   if (abstraction_flag==0) {
     start_meas(&desc->interp_time);
@@ -1828,12 +1807,12 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
     for (aarx=0; aarx<desc->nb_rx; aarx++) {
       for (aatx=0; aatx<desc->nb_tx; aatx++) {
         if (desc->channel_length == 1) {
-          desc->ch[aarx+(aatx*desc->nb_rx)][0].x = desc->a[0][aarx+(aatx*desc->nb_rx)].x;
-          desc->ch[aarx+(aatx*desc->nb_rx)][0].y = desc->a[0][aarx+(aatx*desc->nb_rx)].y;
+          desc->ch[aarx+(aatx*desc->nb_rx)][0].r = desc->a[0][aarx+(aatx*desc->nb_rx)].r;
+          desc->ch[aarx+(aatx*desc->nb_rx)][0].i = desc->a[0][aarx+(aatx*desc->nb_rx)].i;
         } else {
           for (k=0; k<(int)desc->channel_length; k++) {
-            desc->ch[aarx+(aatx*desc->nb_rx)][k].x = 0.0;
-            desc->ch[aarx+(aatx*desc->nb_rx)][k].y = 0.0;
+            desc->ch[aarx+(aatx*desc->nb_rx)][k].r = 0.0;
+            desc->ch[aarx+(aatx*desc->nb_rx)][k].i = 0.0;
 
             for (l=0; l<desc->nb_taps; l++) {
               if ((k - (desc->delays[l]*desc->sampling_rate) - desc->channel_offset) == 0)
@@ -1842,8 +1821,8 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
                 s = sin(M_PI*(k - (desc->delays[l]*desc->sampling_rate) - desc->channel_offset))/
                     (M_PI*(k - (desc->delays[l]*desc->sampling_rate) - desc->channel_offset));
 
-              desc->ch[aarx+(aatx*desc->nb_rx)][k].x += s*desc->a[l][aarx+(aatx*desc->nb_rx)].x;
-              desc->ch[aarx+(aatx*desc->nb_rx)][k].y += s*desc->a[l][aarx+(aatx*desc->nb_rx)].y;
+              desc->ch[aarx+(aatx*desc->nb_rx)][k].r += s*desc->a[l][aarx+(aatx*desc->nb_rx)].r;
+              desc->ch[aarx+(aatx*desc->nb_rx)][k].i += s*desc->a[l][aarx+(aatx*desc->nb_rx)].i;
               //        printf("l %d : desc->ch.x %f, s %e, delay %f\n",l,desc->a[l][aarx+(aatx*desc->nb_rx)].x,s,desc->delays[l]);
             } //nb_taps
 
@@ -2123,7 +2102,7 @@ int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double
 #define Td 2.0
 main(int argc,char **argv) {
   double amps[8] = {.8,.2,.1,.04,.02,.01,.005};
-  struct complex ch[(int)(1+2*sampling_rate*Td)],phase;
+  struct complexd ch[(int)(1+2*sampling_rate*Td)],phase;
   int i;
   randominit();
   phase.x = 1.0;
diff --git a/openair1/SIMULATION/TOOLS/scm_corrmat.h b/openair1/SIMULATION/TOOLS/scm_corrmat.h
index 6ee6567ce9a77d8dd76c5027d61a9818fd7aa929..5695e0bd0f8092ca2f493427f48f245bcfa0ffa2 100644
--- a/openair1/SIMULATION/TOOLS/scm_corrmat.h
+++ b/openair1/SIMULATION/TOOLS/scm_corrmat.h
@@ -19,7 +19,7 @@
  *      contact@openairinterface.org
  */
 
-double R22_sqrt[6][32] = {
+static double R22_sqrt[6][32] = {
   {0.921700, -0.000000, 0.010380, -0.027448, -0.250153, 0.294754, 0.005961, 0.010769, 0.010380, 0.027448, 0.921700, 0.000000, -0.011595, -0.004130, -0.250153, 0.294754, -0.250153, -0.294754, -0.011595, 0.004130, 0.921700, 0.000000, 0.010380, -0.027448, 0.005961, -0.010769, -0.250153, -0.294754, 0.010380, 0.027448, 0.921700, 0.000000},
   {0.923810, 0.000000, 0.004069, 0.027832, 0.151730, 0.350180, -0.009882, 0.006114, 0.004069, -0.027832, 0.923810, 0.000000, 0.011218, -0.003029, 0.151730, 0.350180, 0.151730, -0.350180, 0.011218, 0.003029, 0.923810, -0.000000, 0.004069, 0.027832, -0.009882, -0.006114, 0.151730, -0.350180, 0.004069, -0.027832, 0.923810, 0.000000},
   {0.927613, 0.000000, 0.014253, 0.025767, -0.061171, -0.367133, 0.009258, -0.007340, 0.014253, -0.025767, 0.927613, -0.000000, -0.011138, -0.003942, -0.061171, -0.367133, -0.061171, 0.367133, -0.011138, 0.003942, 0.927613, 0.000000, 0.014253, 0.025767, 0.009258, 0.007340, -0.061171, 0.367133, 0.014253, -0.025767, 0.927613, 0.000000},
@@ -27,7 +27,7 @@ double R22_sqrt[6][32] = {
   {0.919726, -0.000000, 0.038700, -0.111146, 0.217804, 0.300925, 0.045531, -0.013659, 0.038700, 0.111146, 0.919726, 0.000000, -0.027201, 0.038983, 0.217804, 0.300925, 0.217804, -0.300925, -0.027201, -0.038983, 0.919726, 0.000000, 0.038700, -0.111146, 0.045531, 0.013659, 0.217804, -0.300925, 0.038700, 0.111146, 0.919726, 0.000000},
   {0.867608, -0.000000, 0.194097, -0.112414, -0.418811, 0.095938, -0.081264, 0.075727, 0.194097, 0.112414, 0.867608, -0.000000, -0.106125, -0.032801, -0.418811, 0.095938, -0.418811, -0.095938, -0.106125, 0.032801, 0.867608, 0.000000, 0.194097, -0.112414, -0.081264, -0.075727, -0.418811, -0.095938, 0.194097, 0.112414, 0.867608, 0.000000},
 };
-double R21_sqrt[6][8] = {
+static double R21_sqrt[6][8] = {
   {0.922167, 0.000000,-0.250280, 0.294903,-0.250280, -0.294903,0.922167, 0.000000},
   {0.924238, 0.000000,0.151801, 0.350342,0.151801, -0.350342,0.924238, 0.000000},
   {0.928080, 0.000000,-0.061202, -0.367318,-0.061202, 0.367318,0.928080, 0.000000},
@@ -35,7 +35,7 @@ double R21_sqrt[6][8] = {
   {0.927225, 0.000000,0.219580, 0.303378,0.219580, -0.303378,0.927225, 0.000000},
   {0.896133, 0.000000,-0.432581, 0.099092,-0.432581, -0.099092,0.896133, 0.000000},
 };
-double R12_sqrt[6][8] = {
+static double R12_sqrt[6][8] = {
   {0.999494, 0.000000,0.011256, -0.029765,0.011256, 0.029765,0.999494, 0.000000},
   {0.999537, 0.000000,0.004402, 0.030114,0.004402, -0.030114,0.999537, 0.000000},
   {0.999497, 0.000000,0.015358, 0.027764,0.015358, -0.027764,0.999497, 0.000000},
diff --git a/openair1/SIMULATION/TOOLS/sim.h b/openair1/SIMULATION/TOOLS/sim.h
index 78e260b73f196142dc9d08da8fbe401e011583aa..4b3ac5f8623324594449f24aff6ed6902d55e51b 100644
--- a/openair1/SIMULATION/TOOLS/sim.h
+++ b/openair1/SIMULATION/TOOLS/sim.h
@@ -64,11 +64,11 @@ typedef struct {
   ///length of impulse response. should be set to 11+2*bw*t_max
   uint8_t channel_length;
   ///channel state vector. size(state) = nb_taps * (n_tx * n_rx);
-  struct complex **a;
+  struct complexd **a;
   ///interpolated (sample-spaced) channel impulse response. size(ch) = (n_tx * n_rx) * channel_length. ATTENTION: the dimensions of ch are the transposed ones of a. This is to allow the use of BLAS when applying the correlation matrices to the state.
-  struct complex **ch;
+  struct complexd **ch;
   ///Sampled frequency response (90 kHz resolution)
-  struct complex **chF;
+  struct complexd **chF;
   ///Maximum path delay in mus.
   double Td;
   ///Channel bandwidth in MHz.
@@ -84,7 +84,7 @@ typedef struct {
   ///in Hz. if >0 generate a channel with a Clarke's Doppler profile with a maximum Doppler bandwidth max_Doppler. CURRENTLY NOT IMPLEMENTED!
   double max_Doppler;
   ///Square root of the full correlation matrix size(R_tx) = nb_taps * (n_tx * n_rx) * (n_tx * n_rx).
-  struct complex **R_sqrt;
+  struct complexd **R_sqrt;
   ///path loss including shadow fading in dB
   double path_loss_dB;
   ///additional delay of channel in samples.
diff --git a/openair2/COMMON/gtpv1_u_messages_types.h b/openair2/COMMON/gtpv1_u_messages_types.h
index 75df3253f6cefa9542246fbabf03728fbef95ab3..3c820765103c917cdaaf7a54e3f36e4fd38b1061 100644
--- a/openair2/COMMON/gtpv1_u_messages_types.h
+++ b/openair2/COMMON/gtpv1_u_messages_types.h
@@ -191,6 +191,7 @@ typedef struct gtpv1u_gnb_create_tunnel_req_s {
   int                    num_tunnels;
   teid_t                 upf_NGu_teid[NR_GTPV1U_MAX_BEARERS_PER_UE];  ///< Tunnel Endpoint Identifier
   pdusessionid_t         pdusession_id[NR_GTPV1U_MAX_BEARERS_PER_UE];
+  ebi_t                  incoming_rb_id[NR_GTPV1U_MAX_BEARERS_PER_UE];
   transport_layer_addr_t upf_addr[NR_GTPV1U_MAX_BEARERS_PER_UE];
 } gtpv1u_gnb_create_tunnel_req_t;
 
diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h
index 220ef60b3ddd3c66c36ea65dd6bc172dd4ee76df..c0fa80d4a9a0c23b5970568d8d27e304bbdc454b 100644
--- a/openair2/COMMON/rrc_messages_types.h
+++ b/openair2/COMMON/rrc_messages_types.h
@@ -409,8 +409,10 @@ typedef struct NRRrcConfigurationReq_s {
   NR_ServingCellConfigCommon_t *scc;
   NR_ServingCellConfig_t  *scd;
   int                     ssb_SubcarrierOffset;
+  int                     sib1_tda;
   int                     pdsch_AntennaPorts;
   int                     pusch_AntennaPorts;
+  int                     do_CSIRS;
   int                     pusch_TargetSNRx10;
   int                     pucch_TargetSNRx10;
 } gNB_RrcConfigurationReq;
diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c
index 9f134f826ea26d0863892547e7f75fde30f2e3a6..2e6c94540d768a61ec6b0da881c993e4d5ec2cb6 100644
--- a/openair2/ENB_APP/enb_app.c
+++ b/openair2/ENB_APP/enb_app.c
@@ -53,7 +53,6 @@
 #include "openair1/PHY/INIT/phy_init.h"
 extern unsigned char NB_eNB_INST;
 
-#include <nr-softmodem.h>
 extern RAN_CONTEXT_t RC;
 
 #   define ENB_REGISTER_RETRY_DELAY 10
diff --git a/openair2/GNB_APP/L1_nr_paramdef.h b/openair2/GNB_APP/L1_nr_paramdef.h
index fc2bca19d5e25718e1c464e17da62565d353b541..0306713845b9f302a42a44b5bef53ae61b8030ed 100644
--- a/openair2/GNB_APP/L1_nr_paramdef.h
+++ b/openair2/GNB_APP/L1_nr_paramdef.h
@@ -47,6 +47,7 @@
 #define CONFIG_STRING_L1_REMOTE_N_PORTD                    "remote_n_portd"
 #define CONFIG_STRING_L1_TRANSPORT_N_PREFERENCE            "tr_n_preference"
 #define CONFIG_STRING_L1_PUSCH_PROC_THREADS                "pusch_proc_threads"
+#define CONFIG_STRING_L1_OFDM_OFFSET_DIVISOR               "ofdm_offset_divisor"
 #define CONFIG_STRING_L1_PUCCH0_DTX_THRESHOLD              "pucch0_dtx_threshold"
 #define CONFIG_STRING_L1_PRACH_DTX_THRESHOLD               "prach_dtx_threshold"
 #define CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD               "pusch_dtx_threshold"
@@ -64,7 +65,8 @@
 {CONFIG_STRING_L1_REMOTE_N_PORTC,                    NULL,      0,         uptr:NULL,           defintval:50030,           TYPE_UINT,     0},         \
 {CONFIG_STRING_L1_LOCAL_N_PORTD,                     NULL,      0,         uptr:NULL,           defintval:50031,           TYPE_UINT,     0},         \
 {CONFIG_STRING_L1_REMOTE_N_PORTD,                    NULL,      0,         uptr:NULL,           defintval:50031,           TYPE_UINT,     0},         \
-{CONFIG_STRING_L1_PUSCH_PROC_THREADS,                NULL,      0,         uptr:NULL,           defintval:1,               TYPE_UINT,     0},         \
+{CONFIG_STRING_L1_PUSCH_PROC_THREADS,                NULL,      0,         uptr:NULL,           defintval:3,               TYPE_UINT,     0}, \
+{CONFIG_STRING_L1_OFDM_OFFSET_DIVISOR,               NULL,      0,         uptr:NULL,           defuintval:8,              TYPE_UINT,     0}, \
 {CONFIG_STRING_L1_PUCCH0_DTX_THRESHOLD,              NULL,      0,         uptr:NULL,           defintval:100,             TYPE_UINT,     0},         \
 {CONFIG_STRING_L1_PRACH_DTX_THRESHOLD,               NULL,      0,         uptr:NULL,           defintval:150,             TYPE_UINT,     0},         \
 {CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD,               NULL,      0,         uptr:NULL,           defintval:50,              TYPE_UINT,     0}          \
@@ -79,9 +81,10 @@
 #define L1_LOCAL_N_PORTD_IDX                               7
 #define L1_REMOTE_N_PORTD_IDX                              8
 #define L1_PUSCH_PROC_THREADS                              9
-#define L1_PUCCH0_DTX_THRESHOLD                            10
-#define L1_PRACH_DTX_THRESHOLD                             11
-#define L1_PUSCH_DTX_THRESHOLD                             12
+#define L1_OFDM_OFFSET_DIVISOR                             10
+#define L1_PUCCH0_DTX_THRESHOLD                            11
+#define L1_PRACH_DTX_THRESHOLD                             12
+#define L1_PUSCH_DTX_THRESHOLD                             13
 
 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/
 #endif
diff --git a/openair2/GNB_APP/gnb_app.c b/openair2/GNB_APP/gnb_app.c
index b1dc59f2e27bb816df2dd6c053955a2a9952e115..510402139995171f0dc43fab6b1eacbea3989cec 100644
--- a/openair2/GNB_APP/gnb_app.c
+++ b/openair2/GNB_APP/gnb_app.c
@@ -219,29 +219,30 @@ void *gNB_app_task(void *args_p)
     //registered_gnb = 0;
     __attribute__((unused)) uint32_t register_gnb_pending = gNB_app_register (gnb_id_start, gnb_id_end);
   }
+  
+  if (RC.nb_nr_inst > 0) {
+    if (NODE_IS_CU(RC.nrrrc[0]->node_type)) {
 
-  if (NODE_IS_CU(RC.nrrrc[0]->node_type)) {
-
-     if (itti_create_task(TASK_CU_F1, F1AP_CU_task, NULL) < 0) {
-        LOG_E(F1AP, "Create task for F1AP CU failed\n");
-        AssertFatal(1==0,"exiting");
-     }
-  }
+      if (itti_create_task(TASK_CU_F1, F1AP_CU_task, NULL) < 0) {
+          LOG_E(F1AP, "Create task for F1AP CU failed\n");
+          AssertFatal(1==0,"exiting");
+      }
+    }
 
-  if (NODE_IS_DU(RC.nrrrc[0]->node_type)) {
+    if (NODE_IS_DU(RC.nrrrc[0]->node_type)) {
 
-    if (itti_create_task(TASK_DU_F1, F1AP_DU_task, NULL) < 0) {
-       LOG_E(F1AP, "Create task for F1AP DU failed\n");
-       AssertFatal(1==0,"exiting");
+      if (itti_create_task(TASK_DU_F1, F1AP_DU_task, NULL) < 0) {
+        LOG_E(F1AP, "Create task for F1AP DU failed\n");
+        AssertFatal(1==0,"exiting");
+      }
+      // configure F1AP here for F1C
+      LOG_I(GNB_APP,"ngran_gNB_DU: Allocating ITTI message for F1AP_SETUP_REQ\n");
+      msg_p = itti_alloc_new_message (TASK_GNB_APP, 0, F1AP_SETUP_REQ);
+      RCconfig_NR_DU_F1(msg_p, 0);
+      
+      itti_send_msg_to_task (TASK_DU_F1, GNB_MODULE_ID_TO_INSTANCE(0), msg_p);
     }
-    // configure F1AP here for F1C
-    LOG_I(GNB_APP,"ngran_gNB_DU: Allocating ITTI message for F1AP_SETUP_REQ\n");
-    msg_p = itti_alloc_new_message (TASK_GNB_APP, 0, F1AP_SETUP_REQ);
-    RCconfig_NR_DU_F1(msg_p, 0);
-    
-    itti_send_msg_to_task (TASK_DU_F1, GNB_MODULE_ID_TO_INSTANCE(0), msg_p);
   }
-
   do {
     // Wait for a message
     itti_receive_msg (TASK_GNB_APP, &msg_p);
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index 94337ecb58f9591a5c666d3fd2fa5771f4d3d0a6..7e6fd61b0e0aeb23810ae663ca9bbbef5e4243b5 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -132,36 +132,7 @@ void prepare_scc(NR_ServingCellConfigCommon_t *scc) {
   scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->controlResourceSetZero    = CALLOC(1,sizeof(long));
   scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceZero           = CALLOC(1,sizeof(long));
 
-  NR_ControlResourceSet_t *coreset0 = CALLOC(1,sizeof(struct NR_ControlResourceSet));
-  coreset0->controlResourceSetId = 0;
-  // frequencyDomainResources '11111111 00000000 00000000 00000000 00000000 00000'B,
-  if(coreset0->frequencyDomainResources.buf == NULL) coreset0->frequencyDomainResources.buf = calloc(1,6);
-  coreset0->frequencyDomainResources.buf[0] = 0xff;
-  coreset0->frequencyDomainResources.buf[1] = 0;
-  coreset0->frequencyDomainResources.buf[2] = 0;
-  coreset0->frequencyDomainResources.buf[3] = 0;
-  coreset0->frequencyDomainResources.buf[4] = 0;
-  coreset0->frequencyDomainResources.buf[5] = 0;
-  coreset0->frequencyDomainResources.size = 6;
-  coreset0->frequencyDomainResources.bits_unused = 3;
-  coreset0->duration = 1;
-  coreset0->cce_REG_MappingType.present=NR_ControlResourceSet__cce_REG_MappingType_PR_interleaved;
-  coreset0->cce_REG_MappingType.choice.interleaved=calloc(1,sizeof(*coreset0->cce_REG_MappingType.choice.interleaved));
-  coreset0->cce_REG_MappingType.choice.interleaved->reg_BundleSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6;
-  coreset0->cce_REG_MappingType.choice.interleaved->interleaverSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n2;
-  coreset0->cce_REG_MappingType.choice.interleaved->shiftIndex = scc->physCellId;
-  coreset0->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle;
-  if(coreset0->tci_StatesPDCCH_ToAddList == NULL) coreset0->tci_StatesPDCCH_ToAddList = calloc(1,sizeof(*coreset0->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(&coreset0->tci_StatesPDCCH_ToAddList->list,tci[i]);
-  }
-  coreset0->tci_StatesPDCCH_ToReleaseList = NULL;
-  coreset0->tci_PresentInDCI = NULL;
-  coreset0->pdcch_DMRS_ScramblingID = NULL;
-  scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = coreset0;
+  scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonControlResourceSet = NULL;
 
   //  scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList     = CALLOC(1,sizeof(struct NR_PDCCH_ConfigCommon__commonSearchSpaceList));
   //  scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1                    = CALLOC(1,sizeof(NR_SearchSpaceId_t));
@@ -602,6 +573,7 @@ void RCconfig_NR_L1(void) {
       }
 
       RC.gNB[j]->pusch_proc_threads = *(L1_ParamList.paramarray[j][L1_PUSCH_PROC_THREADS].uptr);
+      RC.gNB[j]->ofdm_offset_divisor = *(L1_ParamList.paramarray[j][L1_OFDM_OFFSET_DIVISOR].uptr);
       RC.gNB[j]->pucch0_thres       = *(L1_ParamList.paramarray[j][L1_PUCCH0_DTX_THRESHOLD].uptr);
       RC.gNB[j]->prach_thres        = *(L1_ParamList.paramarray[j][L1_PRACH_DTX_THRESHOLD].uptr);
       RC.gNB[j]->pusch_thres        = *(L1_ParamList.paramarray[j][L1_PUSCH_DTX_THRESHOLD].uptr);
@@ -1045,6 +1017,9 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
         NRRRC_CONFIGURATION_REQ (msg_p).pdsch_AntennaPorts = *GNBParamList.paramarray[i][GNB_PDSCH_ANTENNAPORTS_IDX].iptr;
         printf("pusch_AntennaPorts %d\n",*GNBParamList.paramarray[i][GNB_PUSCH_ANTENNAPORTS_IDX].iptr);
         NRRRC_CONFIGURATION_REQ (msg_p).pusch_AntennaPorts = *GNBParamList.paramarray[i][GNB_PUSCH_ANTENNAPORTS_IDX].iptr;
+        NRRRC_CONFIGURATION_REQ (msg_p).sib1_tda = *GNBParamList.paramarray[i][GNB_SIB1_TDA_IDX].iptr;
+        printf("Do CSI-RS %d\n",*GNBParamList.paramarray[i][GNB_DO_CSIRS_IDX].iptr);
+        NRRRC_CONFIGURATION_REQ (msg_p).do_CSIRS = *GNBParamList.paramarray[i][GNB_DO_CSIRS_IDX].iptr;
         NRRRC_CONFIGURATION_REQ (msg_p).scc = scc;
         NRRRC_CONFIGURATION_REQ (msg_p).scd = scd;
 
@@ -1410,7 +1385,6 @@ void NRRCConfig(void) {
  
   config_get( GNBSParams,sizeof(GNBSParams)/sizeof(paramdef_t),NULL); 
   RC.nb_nr_inst = GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt;
- 
 
 	// Get num MACRLC instances
   config_getlist( &MACRLCParamList,NULL,0, NULL);
@@ -1923,6 +1897,7 @@ void configure_gnb_du_mac(int inst) {
                         rrc->configuration.ssb_SubcarrierOffset,
                         rrc->configuration.pdsch_AntennaPorts,
                         rrc->configuration.pusch_AntennaPorts,
+                        rrc->configuration.sib1_tda,
                         rrc->configuration.scc,
                         0,
                         0, // rnti
diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h
index 6d9c9b83420da30c67c91251d8adfd5992ed5262..ccab98d63c6634e49b7899521fb6d220310004b0 100644
--- a/openair2/GNB_APP/gnb_paramdef.h
+++ b/openair2/GNB_APP/gnb_paramdef.h
@@ -116,6 +116,8 @@ typedef enum {
 #define GNB_CONFIG_STRING_SSBSUBCARRIEROFFSET           "ssb_SubcarrierOffset"
 #define GNB_CONFIG_STRING_PDSCHANTENNAPORTS             "pdsch_AntennaPorts"
 #define GNB_CONFIG_STRING_PUSCHANTENNAPORTS             "pusch_AntennaPorts"
+#define GNB_CONFIG_STRING_SIB1TDA                       "sib1_tda"
+#define GNB_CONFIG_STRING_DOCSIRS                       "do_CSIRS"
 #define GNB_CONFIG_STRING_NRCELLID                      "nr_cellid"
 
 /*-----------------------------------------------------------------------------------------------------------------------------------------*/
@@ -140,7 +142,9 @@ typedef enum {
 {GNB_CONFIG_STRING_SSBSUBCARRIEROFFSET,          NULL,   0,            iptr:NULL,   defintval:31,                TYPE_INT,       0},  \
 {GNB_CONFIG_STRING_PDSCHANTENNAPORTS,            NULL,   0,            iptr:NULL,   defintval:1,                 TYPE_INT,       0},  \
 {GNB_CONFIG_STRING_PUSCHANTENNAPORTS,            NULL,   0,            iptr:NULL,   defintval:1,                 TYPE_INT,       0},  \
-{GNB_CONFIG_STRING_NRCELLID         ,            NULL,   0,            u64ptr:NULL, defint64val:1,               TYPE_UINT64,       0},  \
+{GNB_CONFIG_STRING_SIB1TDA,                      NULL,   0,            iptr:NULL,   defintval:0,                 TYPE_INT,       0},  \
+{GNB_CONFIG_STRING_DOCSIRS,                      NULL,   0,            iptr:NULL,   defintval:0,                 TYPE_INT,       0},  \
+{GNB_CONFIG_STRING_NRCELLID,                     NULL,   0,            u64ptr:NULL, defint64val:1,               TYPE_UINT64,    0},  \
 }															     	
 
 #define GNB_GNB_ID_IDX                  0
@@ -160,7 +164,9 @@ typedef enum {
 #define GNB_SSB_SUBCARRIEROFFSET_IDX    14
 #define GNB_PDSCH_ANTENNAPORTS_IDX      15
 #define GNB_PUSCH_ANTENNAPORTS_IDX      16
-#define GNB_NRCELLID_IDX                17
+#define GNB_SIB1_TDA_IDX                17
+#define GNB_DO_CSIRS_IDX                18
+#define GNB_NRCELLID_IDX                19
 
 #define TRACKING_AREA_CODE_OKRANGE {0x0001,0xFFFD}
 #define GNBPARAMS_CHECK {                                         \
diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c
index 71f91a67ec31ff3e4ab822587608a397d2c4f954..8d4a53da6c21cad4d1e0d49ad7b2f91addde0a5f 100644
--- a/openair2/LAYER2/MAC/config.c
+++ b/openair2/LAYER2/MAC/config.c
@@ -51,7 +51,7 @@
 #include "LTE_MBSFN-SubframeConfigList.h"
 #include "LTE_MBSFN-SubframeConfig.h"
 #include "LTE_PMCH-InfoList-r9.h"
-
+#include <openair2/LAYER2/MAC/mac_proto.h>
 
 extern RAN_CONTEXT_t RC;
 extern int l2_init_eNB(void);
diff --git a/openair2/LAYER2/MAC/config_ue.c b/openair2/LAYER2/MAC/config_ue.c
index 79202d87e32733b5026aca200f0d0825c61567a9..f5c12e710d35103c2056206dfe28247e9d329c68 100644
--- a/openair2/LAYER2/MAC/config_ue.c
+++ b/openair2/LAYER2/MAC/config_ue.c
@@ -57,6 +57,7 @@
 #include "LTE_PMCH-InfoList-r9.h"
 
 
+#include <openair2/LAYER2/MAC/mac_proto.h>
 extern void mac_init_cell_params(int Mod_idP,int CC_idP);
 extern void phy_reset_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c
index 4e063d22072c6702bcb3aa61bd829b2b0a7421ac..9d07018e2feddeea160bd9af1b94e6f20122e7e4 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler.c
@@ -556,10 +556,7 @@ copy_ulreq(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP) {
   }
 }
 
-extern int16_t find_dlsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type);
-extern int16_t find_ulsch(uint16_t rnti, PHY_VARS_eNB *eNB,find_type_t type);
-extern void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch);
-extern void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch);
+#include <openair1/PHY/LTE_TRANSPORT/transport_proto.h>
 
 void
 eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
@@ -586,6 +583,23 @@ eNB_dlsch_ulsch_scheduler(module_id_t module_idP,
     memset(cc[CC_id].vrb_map_UL, 0, 100);
     cc[CC_id].mcch_active = 0;
     clear_nfapi_information(RC.mac[module_idP], CC_id, frameP, subframeP);
+
+    /* hack: skip BCH RBs in subframe 0 for DL scheduling,
+     *       because with high MCS we may exceed code rate 0.93
+     *       when using those RBs (36.213 7.1.7 says the UE may
+     *       skip decoding if the code rate is higher than 0.93)
+     * TODO: remove this hack, deal with physical bits properly
+     *       i.e. reduce MCS in the scheduler if code rate > 0.93
+     */
+    if (subframeP == 0) {
+      int i;
+      int bw = cc[CC_id].mib->message.dl_Bandwidth;
+      /* start and count defined for RBs: 6, 15, 25, 50, 75, 100 */
+      int start[6] = { 0, 4, 9, 22, 34, 47 };
+      int count[6] = { 6, 7, 7,  6,  7,  6 };
+      for (i = 0; i < count[bw]; i++)
+        cc[CC_id].vrb_map[start[bw] + i] = 1;
+    }
   }
 
   /* Refresh UE list based on UEs dropped by PHY in previous subframe */
diff --git a/openair2/LAYER2/MAC/mac_extern.h b/openair2/LAYER2/MAC/mac_extern.h
index cbca693b2abd8fc9b637cafab2428c29e6784e72..522dc2721ff0674ba4cb4d29a431a43f7f40458d 100644
--- a/openair2/LAYER2/MAC/mac_extern.h
+++ b/openair2/LAYER2/MAC/mac_extern.h
@@ -58,7 +58,6 @@ extern unsigned char NB_eNB_INST;
 extern uint16_t NB_UE_INST;
 extern uint16_t NB_THREAD_INST;
 extern unsigned char NB_RN_INST;
-extern unsigned short NODE_ID[1];
 
 extern const int cqi_to_mcs[16];
 
diff --git a/openair2/LAYER2/MAC/main_ue.c b/openair2/LAYER2/MAC/main_ue.c
index 2868d9493029ee7a88df34536b61533a3f2a4f2b..2140d66a1024e93ebeefc908c042c8371e9e6442 100644
--- a/openair2/LAYER2/MAC/main_ue.c
+++ b/openair2/LAYER2/MAC/main_ue.c
@@ -44,8 +44,7 @@
 
 
 #include "common/ran_context.h"
-extern void openair_rrc_top_init_ue( int eMBMS_active, char *uecap_xer, uint8_t cba_group_active, uint8_t HO_active);
-
+#include <openair2/RRC/LTE/rrc_proto.h>
 void dl_phy_sync_success(module_id_t module_idP, frame_t frameP, unsigned char eNB_index, uint8_t first_sync) { //init as MR
   LOG_D(MAC, "[UE %d] Frame %d: PHY Sync to eNB_index %d successful \n",
         module_idP, frameP, eNB_index);
diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c
index bb892c7efe94bd17f354a317fdd14668ca4569d8..bb969668d6b32bf3cfdd44e9f0809bfc220bc28a 100644
--- a/openair2/LAYER2/MAC/pre_processor.c
+++ b/openair2/LAYER2/MAC/pre_processor.c
@@ -113,10 +113,29 @@ bool try_allocate_harq_retransmission(module_id_t Mod_id,
     LOG_D(MAC, "cannot allocate UE %d: no CCE can be allocated\n", UE_id);
     return false;
   }
+  /* if nb_rb is not multiple of RBGsize, then last RBG must be free
+   * (it will be allocated just below)
+   */
+  if (nb_rb % RBGsize && !rbgalloc_mask[N_RBG-1]) {
+    LOG_E(MAC, "retransmission: last RBG already allocated (this should not happen)\n");
+    return false;
+  }
   ue_ctrl->pre_dci_dl_pdu_idx = idx;
   // retransmissions: directly allocate
   *n_rbg_sched -= nb_rbg;
   ue_ctrl->pre_nb_available_rbs[CC_id] += nb_rb;
+  if (nb_rb % RBGsize) {
+    /* special case: if nb_rb is not multiple of RBGsize, then allocate last RBG.
+     * If we instead allocated another RBG then we will retransmit with more
+     * RBs and the UE will not accept it.
+     * (This has been seen in a test with cots UEs, if not true, then change
+     * code as needed.)
+     * At this point rbgalloc_mask[N_RBG-1] == 1 due to the test above.
+     */
+    ue_ctrl->rballoc_sub_UE[CC_id][N_RBG-1] = 1;
+    rbgalloc_mask[N_RBG-1] = 0;
+    nb_rbg--;
+  }
   for (; nb_rbg > 0; start_rbg++) {
     if (!rbgalloc_mask[start_rbg])
       continue;
diff --git a/openair2/LAYER2/MAC/rar_tools.c b/openair2/LAYER2/MAC/rar_tools.c
index d48952318aaf24a13edc0000945f0e8d359e4b3c..740923cc08769072c043d2395d89aa7af63324c7 100644
--- a/openair2/LAYER2/MAC/rar_tools.c
+++ b/openair2/LAYER2/MAC/rar_tools.c
@@ -41,7 +41,6 @@
 #define DEBUG_RAR
 
 extern unsigned int localRIV2alloc_LUT25[512];
-extern unsigned int distRIV2alloc_LUT25[512];
 extern unsigned short RIV2nb_rb_LUT25[512];
 extern unsigned short RIV2first_rb_LUT25[512];
 extern RAN_CONTEXT_t RC;
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
index 6bb7970be66d72ed4a1f67498af3dcdaad6001b4..09fb08d7c4b0df33d73390047cd39ccf531fc0e7 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
@@ -38,6 +38,8 @@
 #include <string.h>
 #include <stdbool.h>
 
+#include "NR_SubcarrierSpacing.h"
+
 #define TABLE_38213_13_1_NUM_INDEXES 15
 #define TABLE_38213_13_2_NUM_INDEXES 14
 #define TABLE_38213_13_3_NUM_INDEXES 9
@@ -452,9 +454,11 @@ typedef struct Type0_PDCCH_CSS_config_s {
   uint32_t number_of_search_space_per_slot;
   uint32_t first_symbol_index;
   uint32_t search_space_duration;
+  uint32_t search_space_frame_period;  // in slots
   uint32_t ssb_length;
   uint32_t ssb_index;
   uint32_t cset_start_rb;
+  NR_SubcarrierSpacing_t scs_pdcch;
   bool active;
 } NR_Type0_PDCCH_CSS_config_t;
 
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index d21100ae7cfd234f7266ab3bd05bdd1e38c2a8de..6385cb6212edb9c737d0fd7c35dae44331b050a4 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -36,6 +36,19 @@
 
 #define reserved 0xffff
 
+
+void reverse_n_bits(uint8_t *value, uint16_t bitlen) {
+  uint16_t j;
+  uint8_t i;
+  for(j = bitlen - 1,i = 0; j > i; j--, i++) {
+    if(((*value>>j)&1) != ((*value>>i)&1)) {
+      *value ^= (1<<j);
+      *value ^= (1<<i);
+    }
+  }
+}
+
+
 // start symbols for SSB types A,B,C,D,E
 uint16_t symbol_ssb_AC[8]={2,8,16,22,30,36,44,50};
 uint16_t symbol_ssb_BD[64]={4,8,16,20,32,36,44,48,60,64,72,76,88,92,100,104,144,148,156,160,172,176,184,188,200,204,212,216,228,232,240,244,284,288,
@@ -126,151 +139,225 @@ const float   table_38213_13_12_c3[16] = { 1, 0.5f, 1, 0.5f, 1, 0.5f, 0.5f, 0.5f
 const int32_t table_38213_10_1_1_c2[5] = { 0, 0, 4, 2, 1 };
 
 // for PDSCH from TS 38.214 subclause 5.1.2.1.1
-const uint8_t table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[16][3]={
-    {0,2,12},   // row index 1
-    {0,2,10},   // row index 2
-    {0,2,9},    // row index 3
-    {0,2,7},    // row index 4
-    {0,2,5},    // row index 5
-    {0,9,4},    // row index 6
-    {0,4,4},    // row index 7
-    {0,5,7},    // row index 8
-    {0,5,2},    // row index 9
-    {0,9,2},    // row index 10
-    {0,12,2},   // row index 11
-    {0,1,13},   // row index 12
-    {0,1,6},    // row index 13
-    {0,2,4},    // row index 14
-    {0,4,7},    // row index 15
-    {0,8,4}     // row index 16
+const uint8_t table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[16][4]={
+    {1,0,2,12},   // row index 1
+    {1,0,2,10},   // row index 2
+    {1,0,2,9},    // row index 3
+    {1,0,2,7},    // row index 4
+    {1,0,2,5},    // row index 5
+    {0,0,9,4},    // row index 6
+    {0,0,4,4},    // row index 7
+    {0,0,5,7},    // row index 8
+    {0,0,5,2},    // row index 9
+    {0,0,9,2},    // row index 10
+    {0,0,12,2},   // row index 11
+    {1,0,1,13},   // row index 12
+    {1,0,1,6},    // row index 13
+    {1,0,2,4},    // row index 14
+    {0,0,4,7},    // row index 15
+    {0,0,8,4}     // row index 16
 };
-const uint8_t table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[16][3]={
-    {0,3,11},   // row index 1
-    {0,3,9},    // row index 2
-    {0,3,8},    // row index 3
-    {0,3,6},    // row index 4
-    {0,3,4},    // row index 5
-    {0,10,4},   // row index 6
-    {0,6,4},    // row index 7
-    {0,5,7},    // row index 8
-    {0,5,2},    // row index 9
-    {0,9,2},    // row index 10
-    {0,12,2},   // row index 11
-    {0,1,13},   // row index 12
-    {0,1,6},    // row index 13
-    {0,2,4},    // row index 14
-    {0,4,7},    // row index 15
-    {0,8,4}     // row index 16
+const uint8_t table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[16][4]={
+    {1,0,3,11},   // row index 1
+    {1,0,3,9},    // row index 2
+    {1,0,3,8},    // row index 3
+    {1,0,3,6},    // row index 4
+    {1,0,3,4},    // row index 5
+    {0,0,10,4},   // row index 6
+    {0,0,6,4},    // row index 7
+    {0,0,5,7},    // row index 8
+    {0,0,5,2},    // row index 9
+    {0,0,9,2},    // row index 10
+    {0,0,12,2},   // row index 11
+    {1,0,1,13},   // row index 12
+    {1,0,1,6},    // row index 13
+    {1,0,2,4},    // row index 14
+    {0,0,4,7},    // row index 15
+    {0,0,8,4}     // row index 16
 };
-const uint8_t table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[16][3]={
-    {0,2,6},    // row index 1
-    {0,2,10},   // row index 2
-    {0,2,9},    // row index 3
-    {0,2,7},    // row index 4
-    {0,2,5},    // row index 5
-    {0,6,4},    // row index 6
-    {0,4,4},    // row index 7
-    {0,5,6},    // row index 8
-    {0,5,2},    // row index 9
-    {0,9,2},    // row index 10
-    {0,10,2},   // row index 11
-    {0,1,11},   // row index 12
-    {0,1,6},    // row index 13
-    {0,2,4},    // row index 14
-    {0,4,6},    // row index 15
-    {0,8,4}     // row index 16
+const uint8_t table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[16][4]={
+    {1,0,2,6},    // row index 1
+    {1,0,2,10},   // row index 2
+    {1,0,2,9},    // row index 3
+    {1,0,2,7},    // row index 4
+    {1,0,2,5},    // row index 5
+    {0,0,6,4},    // row index 6
+    {0,0,4,4},    // row index 7
+    {0,0,5,6},    // row index 8
+    {0,0,5,2},    // row index 9
+    {0,0,9,2},    // row index 10
+    {0,0,10,2},   // row index 11
+    {1,0,1,11},   // row index 12
+    {1,0,1,6},    // row index 13
+    {1,0,2,4},    // row index 14
+    {0,0,4,6},    // row index 15
+    {0,0,8,4}     // row index 16
 };
-const uint8_t table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[16][3]={
-    {0,3,5},    // row index 1
-    {0,3,9},    // row index 2
-    {0,3,8},    // row index 3
-    {0,3,6},    // row index 4
-    {0,3,4},    // row index 5
-    {0,8,2},    // row index 6
-    {0,6,4},    // row index 7
-    {0,5,6},    // row index 8
-    {0,5,2},    // row index 9
-    {0,9,2},    // row index 10
-    {0,10,2},   // row index 11
-    {0,1,11},   // row index 12
-    {0,1,6},    // row index 13
-    {0,2,4},    // row index 14
-    {0,4,6},    // row index 15
-    {0,8,4}     // row index 16
+const uint8_t table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[16][4]={
+    {1,0,3,5},    // row index 1
+    {1,0,3,9},    // row index 2
+    {1,0,3,8},    // row index 3
+    {1,0,3,6},    // row index 4
+    {1,0,3,4},    // row index 5
+    {0,0,8,2},    // row index 6
+    {0,0,6,4},    // row index 7
+    {0,0,5,6},    // row index 8
+    {0,0,5,2},    // row index 9
+    {0,0,9,2},    // row index 10
+    {0,0,10,2},   // row index 11
+    {1,0,1,11},   // row index 12
+    {1,0,1,6},    // row index 13
+    {1,0,2,4},    // row index 14
+    {0,0,4,6},    // row index 15
+    {0,0,8,4}     // row index 16
 };
-const uint8_t table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[16][3]={
-    {0,2,2},    // row index 1
-    {0,4,2},    // row index 2
-    {0,6,2},    // row index 3
-    {0,8,2},    // row index 4
-    {0,10,2},   // row index 5
-    {1,2,2},    // row index 6
-    {1,4,2},    // row index 7
-    {0,2,4},    // row index 8
-    {0,4,4},    // row index 9
-    {0,6,4},    // row index 10
-    {0,8,4},    // row index 11
-    {0,10,4},   // row index 12
-    {0,2,7},    // row index 13
-    {0,2,12},   // row index 14
-    {1,2,4},    // row index 15
-    {0,0,0}     // row index 16
+const uint8_t table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[16][4]={
+    {0,0,2,2},    // row index 1
+    {0,0,4,2},    // row index 2
+    {0,0,6,2},    // row index 3
+    {0,0,8,2},    // row index 4
+    {0,0,10,2},   // row index 5
+    {0,1,2,2},    // row index 6
+    {0,1,4,2},    // row index 7
+    {0,0,2,4},    // row index 8
+    {0,0,4,4},    // row index 9
+    {0,0,6,4},    // row index 10
+    {0,0,8,4},    // row index 11
+    {0,0,10,4},   // row index 12
+    {0,0,2,7},    // row index 13
+    {1,0,2,12},   // row index 14
+    {0,1,2,4},    // row index 15
+    {0,0,0,0}     // row index 16
 };
-const uint8_t table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[16][3]={
-    {0,2,2},    // row index 1
-    {0,4,2},    // row index 2
-    {0,6,2},    // row index 3
-    {0,8,2},    // row index 4
-    {0,10,2},   // row index 5
-    {1,2,2},    // row index 6
-    {1,4,2},    // row index 7
-    {0,2,4},    // row index 8
-    {0,4,4},    // row index 9
-    {0,6,4},    // row index 10
-    {0,8,4},    // row index 11
-    {0,10,4},   // row index 12
-    {0,2,7},    // row index 13
-    {0,3,11},   // row index 14
-    {1,2,4},    // row index 15
-    {0,0,0}     // row index 16
+const uint8_t table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[16][4]={
+    {0,0,2,2},    // row index 1
+    {0,0,4,2},    // row index 2
+    {0,0,6,2},    // row index 3
+    {0,0,8,2},    // row index 4
+    {0,0,10,2},   // row index 5
+    {0,1,2,2},    // row index 6
+    {0,1,4,2},    // row index 7
+    {0,0,2,4},    // row index 8
+    {0,0,4,4},    // row index 9
+    {0,0,6,4},    // row index 10
+    {0,0,8,4},    // row index 11
+    {0,0,10,4},   // row index 12
+    {0,0,2,7},    // row index 13
+    {1,0,3,11},   // row index 14
+    {0,1,2,4},    // row index 15
+    {0,0,0,0}     // row index 16
 };
-const uint8_t table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[16][3]={
-    {0,2,2},  // row index 1
-    {0,4,2},  // row index 2
-    {0,6,2},  // row index 3
-    {0,8,2},  // row index 4
-    {0,10,2}, // row index 5
-    {0,0,0},  // row index 6
-    {0,0,0},  // row index 7
-    {0,2,4},  // row index 8
-    {0,4,4},  // row index 9
-    {0,6,4},  // row index 10
-    {0,8,4},  // row index 11
-    {0,10,4}, // row index 12
-    {0,2,7},  // row index 13
-    {0,2,12},  // row index 14
-    {0,0,6},  // row index 15
-    {0,2,6}   // row index 16
+const uint8_t table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[16][4]={
+    {0,0,2,2},  // row index 1
+    {0,0,4,2},  // row index 2
+    {0,0,6,2},  // row index 3
+    {0,0,8,2},  // row index 4
+    {0,0,10,2}, // row index 5
+    {0,0,0,0},  // row index 6
+    {0,0,0,0},  // row index 7
+    {0,0,2,4},  // row index 8
+    {0,0,4,4},  // row index 9
+    {0,0,6,4},  // row index 10
+    {0,0,8,4},  // row index 11
+    {0,0,10,4}, // row index 12
+    {0,0,2,7},  // row index 13
+    {1,0,2,12},  // row index 14
+    {1,0,0,6},  // row index 15
+    {1,0,2,6}   // row index 16
 };
-const uint8_t table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[16][3]={
-    {0,2,2},  // row index 1
-    {0,4,2},  // row index 2
-    {0,6,2},  // row index 3
-    {0,8,2},  // row index 4
-    {0,10,2}, // row index 5
-    {0,0,0},  // row index 6
-    {0,0,0},  // row index 7
-    {0,2,4},  // row index 8
-    {0,4,4},  // row index 9
-    {0,6,4},  // row index 10
-    {0,8,4},  // row index 11
-    {0,10,4}, // row index 12
-    {0,2,7},  // row index 13
-    {0,3,11},  // row index 14
-    {0,0,6},  // row index 15
-    {0,2,6}   // row index 16
+const uint8_t table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[16][4]={
+    {0,0,2,2},  // row index 1
+    {0,0,4,2},  // row index 2
+    {0,0,6,2},  // row index 3
+    {0,0,8,2},  // row index 4
+    {0,0,10,2}, // row index 5
+    {0,0,0,0},  // row index 6
+    {0,0,0,0},  // row index 7
+    {0,0,2,4},  // row index 8
+    {0,0,4,4},  // row index 9
+    {0,0,6,4},  // row index 10
+    {0,0,8,4},  // row index 11
+    {0,0,10,4}, // row index 12
+    {0,0,2,7},  // row index 13
+    {1,0,3,11},  // row index 14
+    {1,0,0,6},  // row index 15
+    {1,0,2,6}   // row index 16
 };
 
+void get_info_from_tda_tables(int default_abc,
+                              int tda,
+                              int dmrs_TypeA_Position,
+                              int normal_CP,
+                              int *startSymbolIndex,
+                              int *nrOfSymbols) {
+  int k0 = 0;
+  int is_mapping_typeA = 1;
+  switch(default_abc){
+    case 1:
+      if (normal_CP){
+        if (dmrs_TypeA_Position){
+          is_mapping_typeA = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[tda][0];
+          k0 = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[tda][1];
+          *startSymbolIndex = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[tda][2];
+          *nrOfSymbols = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[tda][3];
+        }
+        else{
+          is_mapping_typeA = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[tda][0];
+          k0 = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[tda][1];
+          *startSymbolIndex = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[tda][2];
+          *nrOfSymbols = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[tda][3];
+        }
+      }
+      else{
+        if (dmrs_TypeA_Position){
+          is_mapping_typeA = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[tda][0];
+          k0 = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[tda][1];
+          *startSymbolIndex = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[tda][2];
+          *nrOfSymbols = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[tda][3];
+        }
+        else{
+          is_mapping_typeA = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[tda][0];
+          k0 = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[tda][1];
+          *startSymbolIndex = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[tda][2];
+          *nrOfSymbols = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[tda][3];
+        }
+      }
+      break;
+    case 2:
+      if (dmrs_TypeA_Position){
+        is_mapping_typeA = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[tda][0];
+        k0 = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[tda][1];
+        *startSymbolIndex = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[tda][2];
+        *nrOfSymbols = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[tda][3];
+      }
+      else{
+        is_mapping_typeA = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[tda][0];
+        k0 = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[tda][1];
+        *startSymbolIndex = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[tda][2];
+        *nrOfSymbols = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[tda][3];
+      }
+      break;
+    case 3:
+      if (dmrs_TypeA_Position){
+        is_mapping_typeA = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[tda][0];
+        k0 = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[tda][1];
+        *startSymbolIndex = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[tda][2];
+        *nrOfSymbols = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[tda][3];
+      }
+      else{
+        is_mapping_typeA = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[tda][0];
+        k0 = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[tda][1];
+        *startSymbolIndex = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[tda][2];
+        *nrOfSymbols = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[tda][3];
+      }
+      break;
+    default:
+     AssertFatal(1==0,"Invalid default time domaing allocation type\n");
+  }
+  AssertFatal(k0==0,"Only k0 = 0 is supported\n");
+  AssertFatal(is_mapping_typeA==1,"Only mapping type A is currently supported\n");
+}
+
 const char *prachfmt[]={"0","1","2","3", "A1","A2","A3","B1","B4","C0","C2","A1/B1","A2/B2","A3/B3"};
 const char *duplex_mode[]={"FDD","TDD"};
 
@@ -1221,6 +1308,79 @@ void find_aggregation_candidates(uint8_t *aggregation_level,
     *aggregation_level = 16;
     *nr_of_candidates = ss->nrofCandidates->aggregationLevel16;
   }
+  // n8 does not correspont to a value of 8 but 7, the following corrects this
+  if(*nr_of_candidates == 7)
+    *nr_of_candidates = 8;
+}
+
+
+void set_monitoring_periodicity_offset(NR_SearchSpace_t *ss,
+                                       uint16_t period,
+                                       uint16_t offset) {
+
+  switch(period) {
+    case 1:
+      ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
+      break;
+    case 2:
+      ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl2;
+      ss->monitoringSlotPeriodicityAndOffset->choice.sl2 = offset;
+      break;
+    case 4:
+      ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl4;
+      ss->monitoringSlotPeriodicityAndOffset->choice.sl4 = offset;
+      break;
+    case 5:
+      ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl5;
+      ss->monitoringSlotPeriodicityAndOffset->choice.sl5 = offset;
+      break;
+    case 8:
+      ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl8;
+      ss->monitoringSlotPeriodicityAndOffset->choice.sl8 = offset;
+      break;
+    case 10:
+      ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl10;
+      ss->monitoringSlotPeriodicityAndOffset->choice.sl10 = offset;
+      break;
+    case 16:
+      ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl16;
+      ss->monitoringSlotPeriodicityAndOffset->choice.sl16 = offset;
+      break;
+    case 20:
+      ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl20;
+      ss->monitoringSlotPeriodicityAndOffset->choice.sl20 = offset;
+      break;
+    case 40:
+      ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl40;
+      ss->monitoringSlotPeriodicityAndOffset->choice.sl40 = offset;
+      break;
+    case 80:
+      ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl80;
+      ss->monitoringSlotPeriodicityAndOffset->choice.sl80 = offset;
+      break;
+    case 160:
+      ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl160;
+      ss->monitoringSlotPeriodicityAndOffset->choice.sl160 = offset;
+      break;
+    case 320:
+      ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl320;
+      ss->monitoringSlotPeriodicityAndOffset->choice.sl320 = offset;
+      break;
+    case 640:
+      ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl640;
+      ss->monitoringSlotPeriodicityAndOffset->choice.sl640 = offset;
+      break;
+    case 1280:
+      ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1280;
+      ss->monitoringSlotPeriodicityAndOffset->choice.sl1280 = offset;
+      break;
+    case 2560:
+      ss->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl2560;
+      ss->monitoringSlotPeriodicityAndOffset->choice.sl2560 = offset;      break;
+  default:
+    AssertFatal(1==0,"Invalid monitoring slot periodicity value\n");
+    break;
+  }
 }
 
 
@@ -3240,6 +3400,126 @@ uint16_t get_ssb_start_symbol(const long band, NR_SubcarrierSpacing_t scs, int i
   }
 }
 
+
+void csi_period_offset(NR_CSI_ReportConfig_t *csirep,
+                       NR_NZP_CSI_RS_Resource_t *nzpcsi,
+                       int *period, int *offset) {
+
+  if(nzpcsi != NULL) {
+
+    NR_CSI_ResourcePeriodicityAndOffset_PR p_and_o = nzpcsi->periodicityAndOffset->present;
+
+    switch(p_and_o){
+      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots4:
+        *period = 4;
+        *offset = nzpcsi->periodicityAndOffset->choice.slots4;
+        break;
+      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots5:
+        *period = 5;
+        *offset = nzpcsi->periodicityAndOffset->choice.slots5;
+        break;
+      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots8:
+        *period = 8;
+        *offset = nzpcsi->periodicityAndOffset->choice.slots8;
+        break;
+      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots10:
+        *period = 10;
+        *offset = nzpcsi->periodicityAndOffset->choice.slots10;
+        break;
+      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots16:
+        *period = 16;
+        *offset = nzpcsi->periodicityAndOffset->choice.slots16;
+        break;
+      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots20:
+        *period = 20;
+        *offset = nzpcsi->periodicityAndOffset->choice.slots20;
+        break;
+      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots32:
+        *period = 32;
+        *offset = nzpcsi->periodicityAndOffset->choice.slots32;
+        break;
+      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots40:
+        *period = 40;
+        *offset = nzpcsi->periodicityAndOffset->choice.slots40;
+        break;
+      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots64:
+        *period = 64;
+        *offset = nzpcsi->periodicityAndOffset->choice.slots64;
+        break;
+      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots80:
+        *period = 80;
+        *offset = nzpcsi->periodicityAndOffset->choice.slots80;
+        break;
+      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots160:
+        *period = 160;
+        *offset = nzpcsi->periodicityAndOffset->choice.slots160;
+        break;
+      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots320:
+        *period = 320;
+        *offset = nzpcsi->periodicityAndOffset->choice.slots320;
+        break;
+      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots640:
+        *period = 640;
+        *offset = nzpcsi->periodicityAndOffset->choice.slots640;
+        break;
+    default:
+      AssertFatal(1==0,"No periodicity and offset found in CSI resource");
+    }
+
+  }
+
+  if(csirep != NULL) {
+
+    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");
+    }
+  }
+}
+
+
 void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
                                            frame_t frameP,
                                            NR_MIB_t *mib,
@@ -3249,6 +3529,7 @@ void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PD
                                            NR_SubcarrierSpacing_t scs_ssb,
                                            frequency_range_t frequency_range,
                                            uint32_t ssb_index,
+                                           uint32_t ssb_period,
                                            uint32_t ssb_offset_point_a) {
 
   NR_SubcarrierSpacing_t scs_pdcch;
@@ -3268,7 +3549,7 @@ void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PD
     else
       scs_pdcch = NR_SubcarrierSpacing_kHz30;
   }
-
+  type0_PDCCH_CSS_config->scs_pdcch = scs_pdcch;
   type0_PDCCH_CSS_config->ssb_index = ssb_index;
   type0_PDCCH_CSS_config->frame = frameP;
 
@@ -3461,6 +3742,8 @@ void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PD
     }
     //  38.213 chapter 13: over two consecutive slots
     type0_PDCCH_CSS_config->search_space_duration = 2;
+    // two frames
+    type0_PDCCH_CSS_config->search_space_frame_period = nr_slots_per_frame[scs_ssb]<<1;
   }
 
   if(type0_PDCCH_CSS_config->type0_pdcch_ss_mux_pattern == 1 && frequency_range == FR2){
@@ -3477,6 +3760,8 @@ void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PD
     }
     //  38.213 chapter 13: over two consecutive slots
     type0_PDCCH_CSS_config->search_space_duration = 2;
+    // two frames
+    type0_PDCCH_CSS_config->search_space_frame_period = nr_slots_per_frame[scs_ssb]<<1;
   }
 
   /// MUX PATTERN 2
@@ -3542,6 +3827,8 @@ void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PD
     }else{ ; }
     //  38.213 chapter 13: over one slot
     type0_PDCCH_CSS_config->search_space_duration = 1;
+    // SSB periodicity in slots
+    type0_PDCCH_CSS_config->search_space_frame_period = ssb_period*nr_slots_per_frame[scs_ssb];
   }
 
   /// MUX PATTERN 3
@@ -3570,6 +3857,8 @@ void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PD
     }else{ ; }
     //  38.213 chapter 13: over one slot
     type0_PDCCH_CSS_config->search_space_duration = 1;
+    // SSB periodicity in slots
+    type0_PDCCH_CSS_config->search_space_frame_period = ssb_period*nr_slots_per_frame[scs_ssb];
   }
 
   AssertFatal(type0_PDCCH_CSS_config->number_of_search_space_per_slot!=UINT_MAX,"");
@@ -3593,6 +3882,271 @@ void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PD
 
 }
 
+void fill_coresetZero(NR_ControlResourceSet_t *coreset0, NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config) {
+
+  int32_t duration;
+
+  if (coreset0 == NULL)
+    coreset0 = calloc(1,sizeof(*coreset0));
+
+  coreset0->controlResourceSetId = 0;
+
+  AssertFatal(type0_PDCCH_CSS_config!=NULL,"No type0 CSS configuration\n");
+
+  duration = type0_PDCCH_CSS_config->num_symbols;
+
+  if(coreset0->frequencyDomainResources.buf == NULL) coreset0->frequencyDomainResources.buf = calloc(1,6);
+
+  switch(type0_PDCCH_CSS_config->num_rbs){
+    case 24:
+      coreset0->frequencyDomainResources.buf[0] = 0xf0;
+      coreset0->frequencyDomainResources.buf[1] = 0;
+      break;
+    case 48:
+      coreset0->frequencyDomainResources.buf[0] = 0xff;
+      coreset0->frequencyDomainResources.buf[1] = 0;
+      break;
+    case 96:
+      coreset0->frequencyDomainResources.buf[0] = 0xff;
+      coreset0->frequencyDomainResources.buf[1] = 0xff;
+      break;
+  default:
+    AssertFatal(1==0,"Invalid number of PRBs %d for Coreset0\n",type0_PDCCH_CSS_config->num_rbs);
+  }
+  coreset0->frequencyDomainResources.buf[2] = 0;
+  coreset0->frequencyDomainResources.buf[3] = 0;
+  coreset0->frequencyDomainResources.buf[4] = 0;
+  coreset0->frequencyDomainResources.buf[5] = 0;
+  coreset0->frequencyDomainResources.size = 6;
+  coreset0->frequencyDomainResources.bits_unused = 3;
+
+  coreset0->duration = duration;
+  coreset0->cce_REG_MappingType.present=NR_ControlResourceSet__cce_REG_MappingType_PR_interleaved;
+  coreset0->cce_REG_MappingType.choice.interleaved=calloc(1,sizeof(*coreset0->cce_REG_MappingType.choice.interleaved));
+  coreset0->cce_REG_MappingType.choice.interleaved->reg_BundleSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6;
+  coreset0->cce_REG_MappingType.choice.interleaved->interleaverSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n2;
+  coreset0->cce_REG_MappingType.choice.interleaved->shiftIndex = NULL; // -> use cell_id
+  coreset0->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle;
+
+  coreset0->tci_StatesPDCCH_ToAddList = NULL;
+  coreset0->tci_StatesPDCCH_ToReleaseList = NULL;
+  coreset0->tci_PresentInDCI = NULL;
+  coreset0->pdcch_DMRS_ScramblingID = NULL;
+
+}
+
+uint8_t fill_searchSpaceZero(NR_SearchSpace_t *ss0, NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config, int L) {
+
+  if(ss0 == NULL) ss0=calloc(1,sizeof(*ss0));
+  if(ss0->controlResourceSetId == NULL) ss0->controlResourceSetId=calloc(1,sizeof(*ss0->controlResourceSetId));
+  if(ss0->monitoringSymbolsWithinSlot == NULL) ss0->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss0->monitoringSymbolsWithinSlot));
+  if(ss0->monitoringSymbolsWithinSlot->buf == NULL) ss0->monitoringSymbolsWithinSlot->buf = calloc(1,2);
+  if(ss0->nrofCandidates == NULL) ss0->nrofCandidates = calloc(1,sizeof(*ss0->nrofCandidates));
+  if(ss0->searchSpaceType == NULL) ss0->searchSpaceType = calloc(1,sizeof(*ss0->searchSpaceType));
+  if(ss0->searchSpaceType->choice.common == NULL) ss0->searchSpaceType->choice.common=calloc(1,sizeof(*ss0->searchSpaceType->choice.common));
+  if(ss0->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 == NULL)
+    ss0->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss0->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0));
+
+  uint32_t duration,periodicity,offset;
+  uint16_t symbols,max_agg;
+
+  AssertFatal(type0_PDCCH_CSS_config!=NULL,"No type0 CSS configuration\n");
+
+  max_agg = (type0_PDCCH_CSS_config->num_symbols*type0_PDCCH_CSS_config->num_rbs)/6;
+  if (L>max_agg) return 0;
+
+  symbols = (1-(1<<type0_PDCCH_CSS_config->num_symbols))<<type0_PDCCH_CSS_config->first_symbol_index;
+  duration = type0_PDCCH_CSS_config->search_space_duration;
+  periodicity = type0_PDCCH_CSS_config->search_space_frame_period;
+  if (type0_PDCCH_CSS_config->type0_pdcch_ss_mux_pattern == 1)
+    offset = type0_PDCCH_CSS_config->n_0;
+  else
+    offset = type0_PDCCH_CSS_config->n_c;
+
+  ss0->searchSpaceId = 0;
+  *ss0->controlResourceSetId = 0;
+  ss0->monitoringSlotPeriodicityAndOffset = calloc(1,sizeof(*ss0->monitoringSlotPeriodicityAndOffset));
+  set_monitoring_periodicity_offset(ss0,periodicity,offset);
+  if (duration==1)
+    ss0->duration = NULL;
+  else{
+    ss0->duration = calloc(1,sizeof(*ss0->duration));
+    *ss0->duration = duration;
+  }
+
+  ss0->monitoringSymbolsWithinSlot->size = 2;
+  ss0->monitoringSymbolsWithinSlot->bits_unused = 2;
+  ss0->monitoringSymbolsWithinSlot->buf[1] = 0;
+  ss0->monitoringSymbolsWithinSlot->buf[0] = 0;
+  for (int i=0; i<8; i++) {
+    ss0->monitoringSymbolsWithinSlot->buf[1] |= ((symbols>>(i+8))&0x01)<<(7-i);
+    ss0->monitoringSymbolsWithinSlot->buf[0] |= ((symbols>>i)&0x01)<<(7-i);
+  }
+
+  // max values are set according to TS38.213 Section 10.1 Table 10.1-1
+  ss0->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
+  ss0->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
+  switch(L){
+    case 4:
+      ss0->nrofCandidates->aggregationLevel4 = (((max_agg>>2) > 4)? 4 : max_agg>>2);
+      ss0->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
+      ss0->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
+      break;
+    case 8:
+      ss0->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n0;
+      ss0->nrofCandidates->aggregationLevel8 = (((max_agg>>3) > 2)? 2 : max_agg>>3);
+      ss0->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
+      break;
+    case 16:
+      ss0->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n0;
+      ss0->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
+      ss0->nrofCandidates->aggregationLevel16 = (((max_agg>>4) > 1)? 1 : max_agg>>4);
+      break;
+  default:
+    AssertFatal(1==0,"Invalid aggregation level %d for SS0\n",L);
+  }
+
+  ss0->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common;
+  return 1;
+}
+
+
+void find_period_offest_SR (NR_SchedulingRequestResourceConfig_t *SchedulingReqRec, int *period, int *offset) {
+  NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR P_O = SchedulingReqRec->periodicityAndOffset->present;
+  switch (P_O){
+    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl1:
+      *period = 1;
+      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl1;
+      break;
+    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl2:
+      *period = 2;
+      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl2;
+      break;
+    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl4:
+      *period = 4;
+      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl4;
+      break;
+    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl5:
+      *period = 5;
+      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl5;
+      break;
+    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl8:
+      *period = 8;
+      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl8;
+      break;
+    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10:
+      *period = 10;
+      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl10;
+      break;
+    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl16:
+      *period = 16;
+      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl16;
+      break;
+    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl20:
+      *period = 20;
+      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl20;
+      break;
+    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40:
+      *period = 40;
+      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl40;
+      break;
+    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl80:
+      *period = 80;
+      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl80;
+      break;
+    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl160:
+      *period = 160;
+      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl160;
+      break;
+    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl320:
+      *period = 320;
+      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl320;
+      break;
+    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl640:
+      *period = 640;
+      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl640;
+      break;
+    default:
+      AssertFatal(1==0,"No periodicityAndOffset resources found in schedulingrequestresourceconfig");
+  }
+}
+
+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");
+  }
+}
+
 /* extract UL PTRS values from RRC and validate it based upon 38.214 6.2.3 */
 bool set_ul_ptrs_values(NR_PTRS_UplinkConfig_t *ul_ptrs_config,
                         uint16_t rbSize,uint8_t mcsIndex, uint8_t mcsTable,
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
index d12e5b6f0a8d7d71e60eb8a5d2e9486462f55f8d..0a185157ef90c84af2af9523afd8cf792d512037 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
@@ -135,12 +135,40 @@ void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PD
                                            NR_SubcarrierSpacing_t scs_ssb,
                                            frequency_range_t frequency_range,
                                            uint32_t ssb_index,
+                                           uint32_t ssb_period,
                                            uint32_t ssb_offset_point_a);
 
 uint16_t get_ssb_start_symbol(const long band, NR_SubcarrierSpacing_t scs, int i_ssb);
 
+void get_info_from_tda_tables(int default_abc,
+                              int tda,
+                              int dmrs_TypeA_Position,
+                              int normal_CP,
+                              int *startSymbolIndex,
+                              int *nrOfSymbols);
+
+void fill_coresetZero(NR_ControlResourceSet_t *coreset0, NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config);
+uint8_t fill_searchSpaceZero(NR_SearchSpace_t *ss0, NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config, int L);
+
+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);
+
 int16_t get_N_RA_RB (int delta_f_RA_PRACH,int delta_f_PUSCH);
 
+void find_period_offest_SR (NR_SchedulingRequestResourceConfig_t *SchedulingReqRec, int *period, int *offset);
+
+void csi_period_offset(NR_CSI_ReportConfig_t *csirep,
+                       NR_NZP_CSI_RS_Resource_t *nzpcsi,
+                       int *period, int *offset);
+
+void reverse_n_bits(uint8_t *value, uint16_t bitlen);
+
 bool set_dl_ptrs_values(NR_PTRS_DownlinkConfig_t *ptrs_config,
                         uint16_t rbSize, uint8_t mcsIndex, uint8_t mcsTable,
                         uint8_t *K_ptrs, uint8_t *L_ptrs,uint8_t *portIndex,
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h
index 1e0ab98d4c0b1724f75993bbc35bf7bf53f7f34d..5b4ebe2397e25cbb2a1769aedfdf574493e4ca55 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h
@@ -56,7 +56,6 @@ extern unsigned char NB_UE_INST;*/
 extern unsigned char NB_INST;
 extern unsigned char NB_eNB_INST;
 extern unsigned char NB_RN_INST;
-extern unsigned short NODE_ID[1];
 
 /* Scheduler */
 extern RAN_CONTEXT_t RC;
@@ -139,13 +138,4 @@ extern const float   table_38213_13_12_c3[16];
 
 extern const int32_t table_38213_10_1_1_c2[5];
 
-extern const uint8_t table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[16][3];
-extern const uint8_t table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[16][3];
-extern const uint8_t table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[16][3];
-extern const uint8_t table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[16][3];
-extern const uint8_t table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[16][3];
-extern const uint8_t table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[16][3];
-extern const uint8_t table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[16][3];
-extern const uint8_t table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[16][3];
-
 #endif //DEF_H
diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c
index 3f08b709303a1b5b02274252f5e5a2b270c99567..6f9e36d047277b4c4e3f1d0d0d7371d064748314 100755
--- a/openair2/LAYER2/NR_MAC_UE/config_ue.c
+++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c
@@ -35,9 +35,8 @@
 #include "NR_MAC_UE/mac_proto.h"
 #include "NR_MAC-CellGroupConfig.h"
 #include "LAYER2/NR_MAC_COMMON/nr_mac_common.h"
-#include <executables/softmodem-common.h>
-
-extern uint32_t N_RB_DL;
+#include "common/utils/nr/nr_common.h"
+#include "executables/softmodem-common.h"
 
 int set_tdd_config_nr_ue(fapi_nr_config_request_t *cfg,
                          int mu,
@@ -145,13 +144,170 @@ int set_tdd_config_nr_ue(fapi_nr_config_request_t *cfg,
 }
 
 
+void config_common_ue_sa(NR_UE_MAC_INST_t *mac,
+		         module_id_t module_id,
+		         int cc_idP) {
+
+  fapi_nr_config_request_t *cfg = &mac->phy_config.config_req;
+  NR_ServingCellConfigCommonSIB_t *scc = mac->scc_SIB;
+
+  mac->phy_config.Mod_id = module_id;
+  mac->phy_config.CC_id = cc_idP;
+
+  LOG_D(MAC, "Entering SA UE Config Common\n");
+
+  // carrier config
+  cfg->carrier_config.dl_bandwidth = config_bandwidth(scc->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
+                                                      scc->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->carrierBandwidth,
+                                                      *scc->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list.array[0]->freqBandIndicatorNR);
+
+  uint64_t dl_bw_khz = (12*scc->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->carrierBandwidth)*
+                       (15<<scc->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing);
+  cfg->carrier_config.dl_frequency = (downlink_frequency[cc_idP][0]/1000) - (dl_bw_khz>>1);
+
+  for (int i=0; i<5; i++) {
+    if (i==scc->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) {
+      cfg->carrier_config.dl_grid_size[i] = scc->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
+      cfg->carrier_config.dl_k0[i] = scc->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->offsetToCarrier;
+    }
+    else {
+      cfg->carrier_config.dl_grid_size[i] = 0;
+      cfg->carrier_config.dl_k0[i] = 0;
+    }
+  }
+
+  cfg->carrier_config.uplink_bandwidth = config_bandwidth(scc->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
+                                                          scc->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->carrierBandwidth,
+                                                          scc->uplinkConfigCommon->frequencyInfoUL.frequencyBandList==NULL ?
+                                                          *scc->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list.array[0]->freqBandIndicatorNR :
+                                                          *scc->uplinkConfigCommon->frequencyInfoUL.frequencyBandList->list.array[0]->freqBandIndicatorNR);
+
+
+  if (scc->uplinkConfigCommon->frequencyInfoUL.absoluteFrequencyPointA == NULL)
+    cfg->carrier_config.uplink_frequency = cfg->carrier_config.dl_frequency;
+  else
+    // TODO check if corresponds to what reported in SIB1
+    cfg->carrier_config.uplink_frequency = (downlink_frequency[cc_idP][0]/1000) + uplink_frequency_offset[cc_idP][0];
+
+  for (int i=0; i<5; i++) {
+    if (i==scc->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) {
+      cfg->carrier_config.ul_grid_size[i] = scc->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
+      cfg->carrier_config.ul_k0[i] = scc->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->offsetToCarrier;
+    }
+    else {
+      cfg->carrier_config.ul_grid_size[i] = 0;
+      cfg->carrier_config.ul_k0[i] = 0;
+    }
+  }
+
+  mac->nr_band = *scc->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list.array[0]->freqBandIndicatorNR;
+  mac->frame_type = get_frame_type(mac->nr_band, get_softmodem_params()->numerology);
+  // cell config
+
+  cfg->cell_config.phy_cell_id = mac->physCellId;
+  cfg->cell_config.frame_duplex_type = mac->frame_type;
+
+  // SSB config
+  cfg->ssb_config.ss_pbch_power = scc->ss_PBCH_BlockPower;
+  cfg->ssb_config.scs_common = get_softmodem_params()->numerology;
+
+  // SSB Table config
+  cfg->ssb_table.ssb_offset_point_a = scc->downlinkConfigCommon.frequencyInfoDL.offsetToPointA;
+  cfg->ssb_table.ssb_period = scc->ssb_PeriodicityServingCell;
+  cfg->ssb_table.ssb_subcarrier_offset = mac->ssb_subcarrier_offset;
+
+  if (mac->frequency_range == FR1){
+    cfg->ssb_table.ssb_mask_list[0].ssb_mask = scc->ssb_PositionsInBurst.inOneGroup.buf[0]<<24;
+    cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0;
+  }
+  else{
+    for (int i=0; i<8; i++){
+      if ((scc->ssb_PositionsInBurst.groupPresence->buf[0]>>(7-i))&0x01)
+        cfg->ssb_table.ssb_mask_list[i>>2].ssb_mask |= scc->ssb_PositionsInBurst.inOneGroup.buf[0]<<(24-8*(i%4));
+    }
+  }
+
+  // TDD Table Configuration
+  if (scc->tdd_UL_DL_ConfigurationCommon->pattern1.ext1 == NULL)
+    cfg->tdd_table.tdd_period = scc->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity;
+  else {
+    AssertFatal(scc->tdd_UL_DL_ConfigurationCommon->pattern1.ext1->dl_UL_TransmissionPeriodicity_v1530 != NULL,
+		"scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.ext1->dl_UL_TransmissionPeriodicity_v1530 is null\n");
+    cfg->tdd_table.tdd_period = *scc->tdd_UL_DL_ConfigurationCommon->pattern1.ext1->dl_UL_TransmissionPeriodicity_v1530;
+  }
+  if(cfg->cell_config.frame_duplex_type == TDD){
+    LOG_I(MAC,"Setting TDD configuration period to %d\n", cfg->tdd_table.tdd_period);
+    int return_tdd = set_tdd_config_nr_ue(cfg,
+		     scc->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
+                     scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots,
+                     scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols,
+                     scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots,
+                     scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols
+                     );
+
+    if (return_tdd !=0)
+      LOG_E(PHY,"TDD configuration can not be done\n");
+    else
+      LOG_I(PHY,"TDD has been properly configurated\n");
+  }
+
+  // PRACH configuration
+
+  uint8_t nb_preambles = 64;
+  if(scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->totalNumberOfRA_Preambles != NULL)
+     nb_preambles = *scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->totalNumberOfRA_Preambles;
+
+  cfg->prach_config.prach_sequence_length = scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.present-1;
+
+  if (scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing)
+    cfg->prach_config.prach_sub_c_spacing = *scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing;
+  else
+    cfg->prach_config.prach_sub_c_spacing = scc->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
+
+  cfg->prach_config.restricted_set_config = scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->restrictedSetConfig;
+
+  switch (scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FDM) {
+    case 0 :
+      cfg->prach_config.num_prach_fd_occasions = 1;
+      break;
+    case 1 :
+      cfg->prach_config.num_prach_fd_occasions = 2;
+      break;
+    case 2 :
+      cfg->prach_config.num_prach_fd_occasions = 4;
+      break;
+    case 3 :
+      cfg->prach_config.num_prach_fd_occasions = 8;
+      break;
+    default:
+      AssertFatal(1==0,"msg1 FDM identifier %ld undefined (0,1,2,3) \n", scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FDM);
+  }
+
+  cfg->prach_config.num_prach_fd_occasions_list = (fapi_nr_num_prach_fd_occasions_t *) malloc(cfg->prach_config.num_prach_fd_occasions*sizeof(fapi_nr_num_prach_fd_occasions_t));
+  for (int i=0; i<cfg->prach_config.num_prach_fd_occasions; i++) {
+    cfg->prach_config.num_prach_fd_occasions_list[i].num_prach_fd_occasions = i;
+    if (cfg->prach_config.prach_sequence_length)
+      cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index = scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l139;
+    else
+      cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index = scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l839;
+    cfg->prach_config.num_prach_fd_occasions_list[i].k1 = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE) +
+      scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart +
+      (get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing, scc->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i);
+    cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf = scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig;
+    cfg->prach_config.num_prach_fd_occasions_list[i].num_root_sequences = compute_nr_root_seq(scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup,
+                                                                                              nb_preambles, mac->frame_type, mac->frequency_range);
+    //cfg->prach_config.num_prach_fd_occasions_list[i].num_unused_root_sequences = ???
+  }
+  cfg->prach_config.ssb_per_rach = scc->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present-1;
+
+}
+
 void config_common_ue(NR_UE_MAC_INST_t *mac,
-		      module_id_t       module_id,
-		      int               cc_idP) {
+		      module_id_t module_id,
+		      int cc_idP) {
 
   fapi_nr_config_request_t        *cfg = &mac->phy_config.config_req;
   NR_ServingCellConfigCommon_t    *scc = mac->scc;
-  NR_ServingCellConfigCommonSIB_t *scc_SIB = mac->scc_SIB;
   int i;
 
   mac->phy_config.Mod_id = module_id;
@@ -160,7 +316,7 @@ void config_common_ue(NR_UE_MAC_INST_t *mac,
   // carrier config
   LOG_D(MAC, "Entering UE Config Common\n");
 
-  AssertFatal(scc==NULL || scc_SIB==NULL,"Both scc and scc_SIB cannot be null\n");
+  AssertFatal(scc!=NULL,"scc cannot be null\n");
 
   if (scc) {
     cfg->carrier_config.dl_bandwidth = config_bandwidth(scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
@@ -212,7 +368,7 @@ void config_common_ue(NR_UE_MAC_INST_t *mac,
     mac->frequency_range = band<100?FR1:FR2;
     
     lte_frame_type_t frame_type = get_frame_type(*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0], *scc->ssbSubcarrierSpacing);
-
+    
     // cell config
     
     cfg->cell_config.phy_cell_id = *scc->physCellId;
@@ -231,8 +387,8 @@ void config_common_ue(NR_UE_MAC_INST_t *mac,
     uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
     cfg->ssb_table.ssb_offset_point_a = absolute_diff/(12*scs_scaling) - 10;
     cfg->ssb_table.ssb_period = *scc->ssb_periodicityServingCell;
-    cfg->ssb_table.ssb_subcarrier_offset = 0; // TODO currently not in RRC?
-
+    cfg->ssb_table.ssb_subcarrier_offset = mac->ssb_subcarrier_offset;
+    
     switch (scc->ssb_PositionsInBurst->present) {
     case 1 :
       cfg->ssb_table.ssb_mask_list[0].ssb_mask = scc->ssb_PositionsInBurst->choice.shortBitmap.buf[0]<<24;
@@ -328,156 +484,6 @@ void config_common_ue(NR_UE_MAC_INST_t *mac,
     cfg->prach_config.ssb_per_rach = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present-1;
     
   } // scc
-
-  else { // scc_SIB
-
-  cfg->carrier_config.dl_bandwidth = config_bandwidth(scc_SIB->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
-                                                      scc_SIB->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->carrierBandwidth,
-                                                      *scc_SIB->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list.array[0]->freqBandIndicatorNR);
-
-  cfg->carrier_config.dl_frequency = downlink_frequency[0][0] - (10+scc_SIB->downlinkConfigCommon.frequencyInfoDL.offsetToPointA)*(15<<scc_SIB->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing); 
-
-  for (i=0; i<5; i++) {
-    if (i==scc_SIB->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) {
-      cfg->carrier_config.dl_grid_size[i] = scc_SIB->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-      cfg->carrier_config.dl_k0[i] = scc_SIB->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->offsetToCarrier;
-    }
-    else {
-      cfg->carrier_config.dl_grid_size[i] = 0;
-      cfg->carrier_config.dl_k0[i] = 0;
-    }
-  }
-
-  cfg->carrier_config.uplink_bandwidth = config_bandwidth(scc_SIB->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
-                                                          scc_SIB->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->carrierBandwidth,
-                                                          scc_SIB->uplinkConfigCommon->frequencyInfoUL.frequencyBandList==NULL ? *scc_SIB->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list.array[0]->freqBandIndicatorNR : *scc_SIB->uplinkConfigCommon->frequencyInfoUL.frequencyBandList->list.array[0]->freqBandIndicatorNR);
-
-
-  if (scc_SIB->uplinkConfigCommon->frequencyInfoUL.absoluteFrequencyPointA == NULL)
-    cfg->carrier_config.uplink_frequency = cfg->carrier_config.dl_frequency;
-  else  
-    cfg->carrier_config.uplink_frequency = from_nrarfcn(*scc_SIB->uplinkConfigCommon->frequencyInfoUL.frequencyBandList->list.array[0]->freqBandIndicatorNR,
-							scc_SIB->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
-							*scc_SIB->uplinkConfigCommon->frequencyInfoUL.absoluteFrequencyPointA)/1000; // freq in kHz
-    
-
-  for (i=0; i<5; i++) {
-    if (i==scc_SIB->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing) {
-      cfg->carrier_config.ul_grid_size[i] = scc_SIB->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->carrierBandwidth;
-      cfg->carrier_config.ul_k0[i] = scc_SIB->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->offsetToCarrier;
-    }
-    else {
-      cfg->carrier_config.ul_grid_size[i] = 0;
-      cfg->carrier_config.ul_k0[i] = 0;
-    }
-  }
-
-  uint32_t band = *scc_SIB->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list.array[0]->freqBandIndicatorNR;
-  frequency_range_t  frequency_range = band<100?FR1:FR2;
- 
-  lte_frame_type_t frame_type = get_frame_type(band, get_softmodem_params()->numerology);
-
-  // cell config
-
-  cfg->cell_config.phy_cell_id = mac->physCellId;
-  cfg->cell_config.frame_duplex_type = frame_type;
-
-  // SSB config
-  cfg->ssb_config.ss_pbch_power = scc_SIB->ss_PBCH_BlockPower;
-  cfg->ssb_config.scs_common = get_softmodem_params()->numerology;
-
-  // SSB Table config
-
-  cfg->ssb_table.ssb_offset_point_a = scc_SIB->downlinkConfigCommon.frequencyInfoDL.offsetToPointA;
-  cfg->ssb_table.ssb_period = scc_SIB->ssb_PeriodicityServingCell;
-  cfg->ssb_table.ssb_subcarrier_offset = 0; // TODO currently not in RRC?
-
-  AssertFatal(scc_SIB->ssb_PositionsInBurst.groupPresence==NULL, "Cannot handle more than 8 SSBs for now (%x.%x.%x.%x.%x.%x.%x.%x)\n",
-	      scc_SIB->ssb_PositionsInBurst.groupPresence->buf[0],
-	      scc_SIB->ssb_PositionsInBurst.groupPresence->buf[1],
-	      scc_SIB->ssb_PositionsInBurst.groupPresence->buf[2],
-	      scc_SIB->ssb_PositionsInBurst.groupPresence->buf[3],
-	      scc_SIB->ssb_PositionsInBurst.groupPresence->buf[4],
-	      scc_SIB->ssb_PositionsInBurst.groupPresence->buf[5],
-	      scc_SIB->ssb_PositionsInBurst.groupPresence->buf[6],
-	      scc_SIB->ssb_PositionsInBurst.groupPresence->buf[7]);
-  cfg->ssb_table.ssb_mask_list[0].ssb_mask = scc_SIB->ssb_PositionsInBurst.inOneGroup.buf[0]<<24;
-  cfg->ssb_table.ssb_mask_list[1].ssb_mask = 0;
- 
-
-  // TDD Table Configuration
-  if (scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.ext1 == NULL)
-    cfg->tdd_table.tdd_period = scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.dl_UL_TransmissionPeriodicity;
-  else {
-    AssertFatal(scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.ext1->dl_UL_TransmissionPeriodicity_v1530 != NULL,
-		"scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.ext1->dl_UL_TransmissionPeriodicity_v1530 is null\n");
-    cfg->tdd_table.tdd_period = *scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.ext1->dl_UL_TransmissionPeriodicity_v1530;
-  }
-  if(cfg->cell_config.frame_duplex_type == TDD){
-    LOG_I(MAC,"Setting TDD configuration period to %d\n", cfg->tdd_table.tdd_period);
-    int return_tdd = set_tdd_config_nr_ue(cfg,
-		     scc_SIB->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
-                     scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots,
-                     scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols,
-                     scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots,
-                     scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols
-                     );
-
-    if (return_tdd !=0)
-      LOG_E(PHY,"TDD configuration can not be done\n");
-    else
-      LOG_I(PHY,"TDD has been properly configurated\n");
-  }
-
-  // PRACH configuration
-
-  uint8_t nb_preambles = 64;
-  if(scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->totalNumberOfRA_Preambles != NULL)
-     nb_preambles = *scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->totalNumberOfRA_Preambles;
-
-  cfg->prach_config.prach_sequence_length = scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.present-1;
-
-  if (scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing)
-    cfg->prach_config.prach_sub_c_spacing = *scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing;
-  else 
-    cfg->prach_config.prach_sub_c_spacing = scc_SIB->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
-
-  cfg->prach_config.restricted_set_config = scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->restrictedSetConfig;
-
-  switch (scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FDM) {
-    case 0 :
-      cfg->prach_config.num_prach_fd_occasions = 1;
-      break;
-    case 1 :
-      cfg->prach_config.num_prach_fd_occasions = 2;
-      break;
-    case 2 :
-      cfg->prach_config.num_prach_fd_occasions = 4;
-      break;
-    case 3 :
-      cfg->prach_config.num_prach_fd_occasions = 8;
-      break;
-    default:
-      AssertFatal(1==0,"msg1 FDM identifier %ld undefined (0,1,2,3) \n", scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FDM);
-  }
-
-  cfg->prach_config.num_prach_fd_occasions_list = (fapi_nr_num_prach_fd_occasions_t *) malloc(cfg->prach_config.num_prach_fd_occasions*sizeof(fapi_nr_num_prach_fd_occasions_t));
-  for (i=0; i<cfg->prach_config.num_prach_fd_occasions; i++) {
-    cfg->prach_config.num_prach_fd_occasions_list[i].num_prach_fd_occasions = i;
-    if (cfg->prach_config.prach_sequence_length)
-      cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index = scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l139; 
-    else
-      cfg->prach_config.num_prach_fd_occasions_list[i].prach_root_sequence_index = scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l839;
-    cfg->prach_config.num_prach_fd_occasions_list[i].k1 = NRRIV2PRBOFFSET(scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE) + scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->rach_ConfigGeneric.msg1_FrequencyStart + (get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing, scc_SIB->uplinkConfigCommon->frequencyInfoUL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing ) * i);
-    cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf = scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig;
-    cfg->prach_config.num_prach_fd_occasions_list[i].num_root_sequences = compute_nr_root_seq(scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup, nb_preambles, mac->frame_type, frequency_range);
-    //cfg->prach_config.num_prach_fd_occasions_list[i].num_unused_root_sequences = ???
-  }
-
-  cfg->prach_config.ssb_per_rach = scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present-1;
-
-
-  }
     
 }
 
@@ -523,70 +529,6 @@ void config_bwp_ue(NR_UE_MAC_INST_t *mac, uint16_t *bwp_ind, uint8_t *dci_format
 
 }
 
-
-void fill_default_coreset_zero(NR_UE_MAC_INST_t *mac) {
-
-  // Search space zero
-
-  if(mac->search_space_zero == NULL) mac->search_space_zero=calloc(1,sizeof(*mac->search_space_zero));
-  if(mac->search_space_zero->controlResourceSetId == NULL) mac->search_space_zero->controlResourceSetId=calloc(1,sizeof(*mac->search_space_zero->controlResourceSetId));
-  if(mac->search_space_zero->monitoringSymbolsWithinSlot == NULL) mac->search_space_zero->monitoringSymbolsWithinSlot = calloc(1,sizeof(*mac->search_space_zero->monitoringSymbolsWithinSlot));
-  if(mac->search_space_zero->monitoringSymbolsWithinSlot->buf == NULL) mac->search_space_zero->monitoringSymbolsWithinSlot->buf = calloc(1,2);
-  if(mac->search_space_zero->nrofCandidates == NULL) mac->search_space_zero->nrofCandidates = calloc(1,sizeof(*mac->search_space_zero->nrofCandidates));
-  if(mac->search_space_zero->searchSpaceType == NULL) mac->search_space_zero->searchSpaceType = calloc(1,sizeof(*mac->search_space_zero->searchSpaceType));
-  if(mac->search_space_zero->searchSpaceType->choice.common == NULL) mac->search_space_zero->searchSpaceType->choice.common=calloc(1,sizeof(*mac->search_space_zero->searchSpaceType->choice.common));
-  if(mac->search_space_zero->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 == NULL) mac->search_space_zero->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*mac->search_space_zero->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0));
-  mac->search_space_zero->searchSpaceId = 0;
-  *mac->search_space_zero->controlResourceSetId = 0;
-  mac->search_space_zero->monitoringSlotPeriodicityAndOffset = calloc(1,sizeof(*mac->search_space_zero->monitoringSlotPeriodicityAndOffset));
-  mac->search_space_zero->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
-  mac->search_space_zero->duration=NULL;
-  // should be '1100 0000 0000 00'B (LSB first!), first two symbols in slot, adjust if needed
-  mac->search_space_zero->monitoringSymbolsWithinSlot->buf[1] = 0;
-  mac->search_space_zero->monitoringSymbolsWithinSlot->buf[0] = (1<<7);
-  mac->search_space_zero->monitoringSymbolsWithinSlot->size = 2;
-  mac->search_space_zero->monitoringSymbolsWithinSlot->bits_unused = 2;
-
-  // FIXME: update values from TS38.213 Section 10.1 Table 10.1-1: CCE aggregation levels and maximum number of PDCCH candidates per CCE aggregation level for CSS sets configured by searchSpaceSIB1
-  mac->search_space_zero->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
-  mac->search_space_zero->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
-  mac->search_space_zero->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n2;
-  mac->search_space_zero->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
-  mac->search_space_zero->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
-  mac->search_space_zero->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common;
-
-  // Coreset0
-  if(mac->coreset0 == NULL) mac->coreset0 = calloc(1,sizeof(*mac->coreset0));
-  mac->coreset0->controlResourceSetId = 0;
-  // frequencyDomainResources '11111111 00000000 00000000 00000000 00000000 00000'B,
-  if(mac->coreset0->frequencyDomainResources.buf == NULL) mac->coreset0->frequencyDomainResources.buf = calloc(1,6);
-  mac->coreset0->frequencyDomainResources.buf[0] = 0xff;
-  mac->coreset0->frequencyDomainResources.buf[1] = 0;
-  mac->coreset0->frequencyDomainResources.buf[2] = 0;
-  mac->coreset0->frequencyDomainResources.buf[3] = 0;
-  mac->coreset0->frequencyDomainResources.buf[4] = 0;
-  mac->coreset0->frequencyDomainResources.buf[5] = 0;
-  mac->coreset0->frequencyDomainResources.size = 6;
-  mac->coreset0->frequencyDomainResources.bits_unused = 3;
-  mac->coreset0->duration = 1;
-  mac->coreset0->cce_REG_MappingType.present=NR_ControlResourceSet__cce_REG_MappingType_PR_interleaved;
-  mac->coreset0->cce_REG_MappingType.choice.interleaved=calloc(1,sizeof(*mac->coreset0->cce_REG_MappingType.choice.interleaved));
-  mac->coreset0->cce_REG_MappingType.choice.interleaved->reg_BundleSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6;
-  mac->coreset0->cce_REG_MappingType.choice.interleaved->interleaverSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n2;
-  mac->coreset0->cce_REG_MappingType.choice.interleaved->shiftIndex = NULL;
-  mac->coreset0->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle;
-  if(mac->coreset0->tci_StatesPDCCH_ToAddList == NULL) mac->coreset0->tci_StatesPDCCH_ToAddList = calloc(1,sizeof(*mac->coreset0->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(&mac->coreset0->tci_StatesPDCCH_ToAddList->list,tci[i]);
-  }
-  mac->coreset0->tci_StatesPDCCH_ToReleaseList = NULL;
-  mac->coreset0->tci_PresentInDCI = NULL;
-  mac->coreset0->pdcch_DMRS_ScramblingID = NULL;
-}
-
 /** \brief This function is relavant for the UE procedures for control. It loads the search spaces, the BWPs and the CORESETs into the MAC instance and
     \brief performs assert checks on the relevant RRC configuration.
     @param NR_UE_MAC_INST_t mac: pointer to local MAC instance
@@ -667,9 +609,6 @@ void config_control_ue(NR_UE_MAC_INST_t *mac){
     mac->SSpace[0][0][ss_id] = css;
     ss_id++;
   }
-
-  fill_default_coreset_zero(mac);
-
 }
 
 int nr_rrc_mac_config_req_ue(
@@ -689,16 +628,9 @@ int nr_rrc_mac_config_req_ue(
     //  TODO do something FAPI-like P5 L1/L2 config interface in config_si, config_mib, etc.
 
     if(mibP != NULL){
-
-      // if this is the first MIB intialize coreset0 for SA
-      if (mac->mib == NULL) fill_default_coreset_zero(mac);
-
       mac->mib = mibP;    //  update by every reception
       mac->phy_config.Mod_id = module_id;
       mac->phy_config.CC_id = cc_idP;
-      mac->phy_config.config_req.ssb_table.ssb_subcarrier_offset = 0; // TODO currently not in RRC?
-      mac->phy_config.config_req.tdd_table.tdd_period_in_slots=5<<get_softmodem_params()->numerology;
-      mac->phy_config.config_req.ssb_table.ssb_offset_point_a = (N_RB_DL-20)>>1;
     }
     AssertFatal(scell_group_config == NULL || cell_group_config == NULL,
 		"both scell_group_config and cell_group_config cannot be non-NULL\n");
@@ -706,8 +638,8 @@ int nr_rrc_mac_config_req_ue(
     if (sccP != NULL) {
 
       mac->scc_SIB=sccP;
-      LOG_I(MAC,"Keeping ServingCellConfigCommonSIB\n");
-      config_common_ue(mac,module_id,cc_idP);
+      LOG_D(MAC,"Keeping ServingCellConfigCommonSIB\n");
+      config_common_ue_sa(mac,module_id,cc_idP);
       int num_slots_ul = mac->scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
       if (mac->scc_SIB->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols>0) num_slots_ul++;
       LOG_I(MAC, "Initializing ul_config_request. num_slots_ul = %d\n", num_slots_ul);
@@ -726,7 +658,7 @@ int nr_rrc_mac_config_req_ue(
           ra->rach_ConfigDedicated = scell_group_config->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink;
         }
         mac->scc = scell_group_config->spCellConfig->reconfigurationWithSync->spCellConfigCommon;
-	      mac->physCellId = *mac->scc->physCellId;
+        mac->physCellId = *mac->scc->physCellId;
         config_common_ue(mac,module_id,cc_idP);
         mac->crnti = scell_group_config->spCellConfig->reconfigurationWithSync->newUE_Identity;
         LOG_I(MAC,"Configuring CRNTI %x\n",mac->crnti);
@@ -735,26 +667,12 @@ int nr_rrc_mac_config_req_ue(
       // Setup the SSB to Rach Occasions mapping according to the config
       build_ssb_to_ro_map(mac);
     }
-    else if (cell_group_config != NULL){
+    else if (cell_group_config != NULL ){
       LOG_I(MAC,"Applying CellGroupConfig from gNodeB\n");
       mac->cg = cell_group_config;
       mac->servCellIndex = cell_group_config->spCellConfig->servCellIndex ? *cell_group_config->spCellConfig->servCellIndex : 0;
-      if(get_softmodem_params()->phy_test==1 || get_softmodem_params()->do_ra==1) {
-        config_control_ue(mac);
-        if (cell_group_config->spCellConfig->reconfigurationWithSync) {
-          if (cell_group_config->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated) {
-            ra->rach_ConfigDedicated = cell_group_config->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink;
-          }
-          mac->scc = cell_group_config->spCellConfig->reconfigurationWithSync->spCellConfigCommon;
-          config_common_ue(mac,module_id,cc_idP);
-          mac->crnti = cell_group_config->spCellConfig->reconfigurationWithSync->newUE_Identity;
-          LOG_I(MAC,"Configuring CRNTI %x\n",mac->crnti);
-        }
-
-        // Setup the SSB to Rach Occasions mapping according to the config
-        build_ssb_to_ro_map(mac);
-      }
-
+      //      config_control_ue(mac);
+      //      config_common_ue(mac,module_id,cc_idP);
       /*      
       if(mac_cell_group_configP != NULL){
 	if(mac_cell_group_configP->drx_Config != NULL ){
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
index fc02662a6391d068619b90166666e2842b5120eb..8a59b3599e65244cc9c402610cc7bff8c8a4d8e8 100755
--- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
@@ -292,16 +292,32 @@ typedef struct {
 
   /// Random-access Contention Resolution Timer active flag
   uint8_t RA_contention_resolution_timer_active;
-  /// Random-access Contention Resolution Timer count value
-  uint8_t RA_contention_resolution_cnt;
+  int RA_contention_resolution_target_frame;
+  int RA_contention_resolution_target_slot;
   /// Transmitted UE Contention Resolution Identifier
   uint8_t cont_res_id[6];
 
   /// BeamfailurerecoveryConfig
   NR_BeamFailureRecoveryConfig_t RA_BeamFailureRecoveryConfig;
 
+  /// RA SearchSpace
+  NR_SearchSpace_t *ss;
 } RA_config_t;
 
+typedef struct {
+  bool active;
+  bool ack_received;
+  uint8_t  pucch_resource_indicator;
+  uint16_t feedback_to_ul;
+  frame_t dl_frame;
+  int dl_slot;
+  uint8_t ack;
+  uint8_t dai;
+  int n_CCE;
+  int N_CCE;
+  int8_t delta_pucch;
+} NR_UE_HARQ_STATUS_t;
+
 typedef struct {
 
   uint8_t freq_hopping;
@@ -311,6 +327,30 @@ typedef struct {
 
 } RAR_grant_t;
 
+typedef struct {
+
+  uint8_t  phr_reporting;
+  uint16_t truncated_bsr;
+  uint16_t short_bsr;
+  uint16_t long_bsr;
+
+} NR_UE_MAC_CE_t;
+
+typedef struct {
+  int n_HARQ_ACK;
+  uint32_t ack_payload;
+  uint8_t sr_payload;
+  uint32_t csi_part1_payload;
+  uint32_t csi_part2_payload;
+  int resource_indicator;
+  int resource_set_id;
+  int initial_pucch_id;
+  NR_PUCCH_Resource_t *pucch_resource;
+  int n_CCE;
+  int N_CCE;
+  int8_t delta_pucch;
+} PUCCH_sched_t;
+
 /*!\brief Top level UE MAC structure */
 typedef struct {
 
@@ -362,6 +402,9 @@ typedef struct {
   RA_config_t ra;
   /// SSB index from MIB decoding
   uint8_t mib_ssb;
+  /// measured SSB RSRP in dBm
+  short ssb_rsrp_dBm;
+
   /// Last NDI of UL HARQ processes
   uint8_t UL_ndi[NR_MAX_HARQ_PROCESSES];
   /// first ULTX of UL HARQ processes
@@ -374,20 +417,20 @@ typedef struct {
   nr_ue_if_module_t       *if_module;
   nr_phy_config_t         phy_config;
 
-  /// BSR report flag management
-  uint8_t BSR_reporting_active;
   NR_UE_SCHEDULING_INFO   scheduling_info;
-
-  /// PHR
-  uint8_t PHR_reporting_active;
+  NR_UE_MAC_CE_t          nr_ue_mac_ce;
 
   NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config;
   NR_SearchSpace_t *search_space_zero;
   NR_ControlResourceSet_t *coreset0;
   frequency_range_t frequency_range;
+  uint16_t nr_band;
+  uint8_t ssb_subcarrier_offset;
 
   dci_pdu_rel15_t def_dci_pdu_rel15[8];
 
+  NR_UE_HARQ_STATUS_t dl_harq_info[16];
+
 } NR_UE_MAC_INST_t;
 
 typedef enum seach_space_mask_e {
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
index 2d00aa00034efc3683002c18199645cc61aaa635..83ff1d3a9e25176188d615f742d299222bd9b73a 100755
--- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
@@ -37,6 +37,9 @@
 #include "PHY/defs_nr_UE.h"
 #include "RRC/NR_UE/rrc_defs.h"
 
+#define NR_DL_MAX_DAI                            (4)                      /* TS 38.213 table 9.1.3-1 Value of counter DAI for DCI format 1_0 and 1_1 */
+#define NR_DL_MAX_NB_CW                          (2)                      /* number of downlink code word */
+
 /**\brief decode mib pdu in NR_UE, from if_module ul_ind with P7 tx_ind message
    \param module_id      module id
    \param cc_id          component carrier id
@@ -65,11 +68,11 @@ int8_t nr_ue_decode_mib(
    \param pduP           pointer to pdu
    \param pdu_length     length of pdu */
 int8_t nr_ue_decode_BCCH_DL_SCH(module_id_t module_id,
-                         int cc_id,
-                         unsigned int gNB_index,
-                         uint32_t sibs_mask,
-                         uint8_t *pduP,
-                         uint32_t pdu_len);
+                                int cc_id,
+                                unsigned int gNB_index,
+                                uint8_t ack_nack,
+                                uint8_t *pduP,
+                                uint32_t pdu_len);
 
 /**\brief primitive from RRC layer to MAC layer for configuration L1/L2, now supported 4 rrc messages: MIB, cell_group_config for MAC/PHY, spcell_config(serving cell config)
    \param module_id                 module id
@@ -122,25 +125,35 @@ void fill_scheduled_response(nr_scheduled_response_t *scheduled_response,
                              int slot,
                              int thread_id);
 
-/* \brief Get SR payload (0,1) from UE MAC
-@param Mod_id Instance id of UE in machine
-@param CC_id Component Carrier index
-@param eNB_id Index of eNB that UE is attached to
-@param rnti C_RNTI of UE
-@param subframe subframe number
-@returns 0 for no SR, 1 for SR
-*/
-uint32_t ue_get_SR(module_id_t module_idP, int CC_id, frame_t frameP,
-       uint8_t eNB_id, rnti_t rnti, sub_frame_t subframe);
-
-int8_t nr_ue_get_SR(module_id_t module_idP, int CC_id, frame_t frameP, uint8_t eNB_id, uint16_t rnti, sub_frame_t subframe);
+int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, int slotP);
 
-int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, frame_t frame, int slot, dci_pdu_rel15_t *dci, uint16_t rnti, uint8_t dci_format);
+int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, frame_t frame, int slot, dci_pdu_rel15_t *dci, fapi_nr_dci_indication_pdu_t *dci_ind);
 int nr_ue_process_dci_indication_pdu(module_id_t module_id, int cc_id, int gNB_index, frame_t frame, int slot, fapi_nr_dci_indication_pdu_t *dci);
 
 uint32_t get_ssb_frame(uint32_t test);
 
-uint32_t mr_ue_get_SR(module_id_t module_idP, int CC_id, frame_t frameP, uint8_t eNB_id, uint16_t rnti, sub_frame_t subframe);
+bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac,
+                                         PUCCH_sched_t *pucch,
+                                         frame_t frame,
+                                         int slot);
+
+uint8_t nr_get_csi_measurements(NR_UE_MAC_INST_t *mac,
+                                frame_t frame,
+                                int slot,
+                                PUCCH_sched_t *pucch);
+
+uint8_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac,
+                             PUCCH_sched_t *pucch,
+                             struct NR_CSI_ReportConfig *csi_reportconfig,
+                             NR_CSI_ResourceConfigId_t csi_ResourceConfigId,
+                             NR_CSI_MeasConfig_t *csi_MeasConfig);
+
+uint8_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac,
+                           PUCCH_sched_t *pucch,
+                           NR_CSI_MeasConfig_t *csi_MeasConfig);
+
+uint8_t get_rsrp_index(int rsrp);
+uint8_t get_rsrp_diff_index(int best_rsrp,int current_rsrp);
 
 /* \brief Get payload (MAC PDU) from UE PHY
 @param dl_info            pointer to dl indication
@@ -156,18 +169,8 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
                            NR_UL_TIME_ALIGNMENT_t *ul_time_alignment,
                            int pdu_id);
 
-uint16_t nr_generate_ulsch_pdu(uint8_t *sdus_payload,
-                                    uint8_t *pdu,
-                                    uint8_t num_sdus,
-                                    uint16_t *sdu_lengths,
-                                    uint8_t *sdu_lcids,
-                                    uint8_t power_headroom,
-                                    uint16_t crnti,
-                                    uint16_t truncated_bsr,
-                                    uint16_t short_bsr,
-                                    uint16_t long_bsr,
-                                    unsigned short post_padding,
-                                    uint16_t buflen);
+int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
+                          NR_UE_MAC_INST_t *mac);
 
 void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
 
@@ -186,17 +189,73 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
                                                       nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu,
                                                       fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu,
                                                       uint8_t time_domain_ind,
+                                                      int default_abc,
                                                       bool use_default);
 
-uint8_t
-nr_ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP,
-           sub_frame_t subframe, uint8_t eNB_index,
-           uint8_t *ulsch_buffer, uint16_t buflen, uint8_t *access_mode) ;
+
+uint8_t nr_ue_get_sdu(module_id_t module_idP,
+                      frame_t frameP,
+                      sub_frame_t subframe,
+                      uint8_t gNB_index,
+                      uint8_t *ulsch_buffer,
+                      uint16_t buflen);
 
 int set_tdd_config_nr_ue(fapi_nr_config_request_t *cfg, int mu,
                          int nrofDownlinkSlots, int nrofDownlinkSymbols,
                          int nrofUplinkSlots,   int nrofUplinkSymbols);
 
+void set_harq_status(NR_UE_MAC_INST_t *mac,
+                     uint8_t pucch_id,
+                     uint8_t harq_id,
+                     int8_t delta_pucch,
+                     uint8_t data_toul_fb,
+                     uint8_t dai,
+                     int n_CCE,
+                     int N_CCE,
+                     frame_t frame,
+                     int slot);
+
+void update_harq_status(nr_downlink_indication_t *dl_info,
+                        int pdu_id);
+
+uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
+                         frame_t frame,
+                         int slot,
+                         PUCCH_sched_t *pucch);
+
+int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, int uci_size);
+
+void select_pucch_resource(NR_UE_MAC_INST_t *mac,
+                           PUCCH_sched_t *pucch);
+
+int16_t get_pucch_tx_power_ue(NR_UE_MAC_INST_t *mac,
+                              NR_PUCCH_Config_t *pucch_Config,
+                              PUCCH_sched_t *pucch,
+                              uint8_t format_type,
+                              uint16_t nb_of_prbs,
+                              uint8_t  freq_hop_flag,
+                              uint8_t  add_dmrs_flag,
+                              uint8_t N_symb_PUCCH,
+                              int subframe_number,
+                              int O_ACK, int O_SR,
+                              int O_CSI, int O_CRC);
+
+int get_deltatf(uint16_t nb_of_prbs,
+                uint8_t N_symb_PUCCH,
+                uint8_t freq_hop_flag,
+                uint8_t add_dmrs_flag,
+                int N_sc_ctrl_RB,
+                int n_HARQ_ACK,
+                int O_ACK, int O_SR,
+                int O_CSI, int O_CRC);
+
+void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
+                           int slot,
+                           uint16_t rnti,
+                           PUCCH_sched_t *pucch,
+                           fapi_nr_ul_config_pucch_pdu *pucch_pdu,
+                           int O_SR, int O_ACK, int O_CSI);
+
 /** \brief Function for UE/PHY to compute PUSCH transmit power in power-control procedure.
     @param Mod_id Module id of UE
     @returns Po_NOMINAL_PUSCH (PREAMBLE_RECEIVED_TARGET_POWER+DELTA_PREAMBLE
@@ -226,6 +285,7 @@ and fills the PRACH PDU per each FD occasion.
 @returns void
 */
 void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t slotP, int thread_id);
+void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, int thread_id);
 
 /* \brief This function schedules the Msg3 transmission
 @param
@@ -238,6 +298,15 @@ void nr_ue_msg3_scheduler(NR_UE_MAC_INST_t *mac,
                           sub_frame_t current_slot,
                           uint8_t Msg3_tda_id);
 
+void nr_ue_sib1_scheduler(module_id_t module_idP,
+                          int cc_id,
+                          uint16_t ssb_start_symbol,
+                          uint16_t frame,
+                          uint8_t ssb_subcarrier_offset,
+                          uint32_t ssb_index,
+                          uint16_t ssb_start_subcarrier,
+                          frequency_range_t frequency_range);
+
 /* \brief Function called by PHY to process the received RAR and check that the preamble matches what was sent by the gNB. It provides the timing advance and t-CRNTI.
 @param Mod_id Index of UE instance
 @param CC_id Index to a component carrier
@@ -294,7 +363,7 @@ void nr_get_prach_resources(module_id_t mod_id,
 
 void nr_Msg1_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id);
 
-void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id);
+void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, slot_t slotP, uint8_t gNB_id);
 
 void nr_ue_msg2_scheduler(module_id_t mod_id, uint16_t rach_frame, uint16_t rach_slot, uint16_t *msg2_frame, uint16_t *msg2_slot);
 
@@ -304,6 +373,9 @@ int8_t nr_ue_process_dci_freq_dom_resource_assignment(nfapi_nr_ue_pusch_pdu_t *p
                                                       uint16_t n_RB_DLBWP,
                                                       uint16_t riv);
 
+void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id);
+void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
+
 void get_num_re_dmrs(nfapi_nr_ue_pusch_pdu_t *pusch_pdu,
                      uint8_t *nb_dmrs_re_per_rb,
                      uint16_t *number_dmrs_symbols);
diff --git a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
index 768f65bf635abebc6abecfcac462ae3c22447605..b27837043ffc5cd9c1712cb128ce3e388f23efa7 100644
--- a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
+++ b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
@@ -43,36 +43,27 @@
 
 static NR_UE_MAC_INST_t *nr_ue_mac_inst; 
 
-NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst)
-{
+NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst) {
+
     //LOG_I(MAC, "[MAIN] MAC_INIT_GLOBAL_PARAM IN...\n");
 
     //LOG_I(MAC, "[MAIN] init UE MAC functions \n");
     
     //init mac here
     nr_ue_mac_inst = (NR_UE_MAC_INST_t *)calloc(sizeof(NR_UE_MAC_INST_t),NB_NR_UE_MAC_INST);
+
     for (int j=0;j<NB_NR_UE_MAC_INST;j++)
-	    for (int i=0;i<NR_MAX_HARQ_PROCESSES;i++)
-	      nr_ue_mac_inst[j].first_ul_tx[i]=1;
+	for (int i=0;i<NR_MAX_HARQ_PROCESSES;i++) nr_ue_mac_inst[j].first_ul_tx[i]=1;
 
-    if (rrc_inst && (rrc_inst->scell_group_config || rrc_inst->cell_group_config)) {
 
-      if(rrc_inst->scell_group_config) {
-        nr_rrc_mac_config_req_ue(0,0,0,NULL,NULL,NULL,rrc_inst->scell_group_config);
-        //if (IS_SOFTMODEM_NOS1){
-        //  AssertFatal(rlc_module_init(0) == 0, "%s: Could not initialize RLC layer\n", __FUNCTION__);
-        //  nr_pdcp_layer_init();
-        //  nr_DRB_preconfiguration(nr_ue_mac_inst->crnti);
-        //}
-      } else if (rrc_inst->cell_group_config) {
-        nr_rrc_mac_config_req_ue(0,0,0,NULL,NULL,rrc_inst->cell_group_config,NULL);
-        AssertFatal(rlc_module_init(0) == 0, "%s: Could not initialize RLC layer\n", __FUNCTION__);
-        if (IS_SOFTMODEM_NOS1){
-          pdcp_layer_init();
-          nr_DRB_preconfiguration(nr_ue_mac_inst->crnti);
-        }
-      }
+    if (rrc_inst && rrc_inst->scell_group_config) {
 
+      nr_rrc_mac_config_req_ue(0,0,0,NULL,NULL,NULL,rrc_inst->scell_group_config);
+      AssertFatal(rlc_module_init(0) == 0, "%s: Could not initialize RLC layer\n", __FUNCTION__);
+      if (IS_SOFTMODEM_NOS1){
+        pdcp_layer_init();
+        nr_DRB_preconfiguration(nr_ue_mac_inst->crnti);
+      }
       // Allocate memory for ul_config_request in the mac instance. This is now a pointer and will
       // point to a list of structures (one for each UL slot) to store PUSCH scheduling parameters
       // received from UL DCI.
@@ -83,8 +74,8 @@ NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst)
         LOG_D(MAC, "Initializing ul_config_request. num_slots_ul = %d\n", num_slots_ul);
         nr_ue_mac_inst->ul_config_request = (fapi_nr_ul_config_request_t *)calloc(num_slots_ul, sizeof(fapi_nr_ul_config_request_t));
       }
-
-    } else {
+    }
+    else {
       LOG_I(MAC,"Running without CellGroupConfig\n");
       nr_rrc_mac_config_req_ue(0,0,0,NULL,NULL,NULL,NULL);
       if(get_softmodem_params()->sa == 1) {
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
index 5d9126ad6954ac6207551b15e790da7030ffe0f8..83784634fcf74b4c7aee68f76ad7c3ce722c9746 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
@@ -81,6 +81,41 @@ void init_RA(module_id_t mod_id,
   prach_resources->POWER_OFFSET_2STEP_RA = 0;
   prach_resources->RA_SCALING_FACTOR_BI = 1;
 
+  struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList;
+  NR_SearchSpaceId_t *ra_ss;
+  NR_SearchSpaceId_t ss_id = -1;
+  NR_SearchSpace_t *ss = NULL;
+
+  if(mac->scc_SIB) {
+    commonSearchSpaceList = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
+    ss_id = *mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
+  }
+  else{
+    if (mac->scc) {
+      NR_SearchSpaceId_t *ra_ss = mac->scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
+      if (ra_ss) {
+        commonSearchSpaceList = mac->scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
+        ss_id = *mac->scc->downlinkConfigCommon->initialDownlinkBWP->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
+      }
+    }
+    if (ss_id < 0) {
+      ra_ss = mac->DLbwp[0]->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
+      if (ra_ss) {
+        commonSearchSpaceList = mac->DLbwp[0]->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
+        ss_id = *mac->DLbwp[0]->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace;
+      }
+    }
+  }
+
+  AssertFatal(ss_id>-1,"Didn't find ra-SearchSpace\n");
+  AssertFatal(commonSearchSpaceList->list.count > 0, "common SearchSpace list has 0 elements\n");
+  // Common searchspace list
+  for (int i = 0; i < commonSearchSpaceList->list.count; i++) {
+    ss = commonSearchSpaceList->list.array[i];
+    if (ss->searchSpaceId == ss_id)
+          ra->ss = ss;
+  }
+
   if (rach_ConfigDedicated) {
     if (rach_ConfigDedicated->cfra){
       LOG_I(MAC, "Initialization of 2-step contention-free random access procedure\n");
@@ -157,7 +192,7 @@ void init_RA(module_id_t mod_id,
   }
 
   if (nr_rach_ConfigCommon->ext1) {
-    if (nr_rach_ConfigCommon->ext1->ra_PrioritizationForAccessIdentity){
+    if (nr_rach_ConfigCommon->ext1->ra_PrioritizationForAccessIdentity_r16){
       LOG_D(MAC, "In %s:%d: Missing implementation for Access Identity initialization procedures\n", __FUNCTION__, __LINE__);
     }
   }
@@ -457,40 +492,45 @@ void nr_Msg1_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint
   ra->RA_attempt_number++;
 }
 
-void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id){
+void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, slot_t slotP, uint8_t gNB_id){
 
   NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
-  NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = (mac->scc) ? 
+  RA_config_t *ra = &mac->ra;
+  NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = (mac->scc) ?
     mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup:
     mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
-  RA_config_t *ra = &mac->ra;
+  long mu = (mac->scc) ? 
+    mac->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing :
+    mac->scc_SIB->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
+  int subframes_per_slot = nr_slots_per_frame[mu]/10;
+
+  // start contention resolution timer (cnt in slots)
+  int RA_contention_resolution_timer_subframes = (nr_rach_ConfigCommon->ra_ContentionResolutionTimer + 1)<<3;
 
-  LOG_D(MAC,"In %s: [UE %d] Frame %d, CB-RA: starting contention resolution timer\n", __FUNCTION__, mod_id, frameP);
+  ra->RA_contention_resolution_target_frame = frameP + (RA_contention_resolution_timer_subframes/10);
+  ra->RA_contention_resolution_target_slot = (slotP + (RA_contention_resolution_timer_subframes * subframes_per_slot)) % nr_slots_per_frame[mu];
+
+  LOG_D(MAC,"In %s: [UE %d] CB-RA: contention resolution timer set in frame.slot %d.%d and expiring in %d.%d\n",
+       __FUNCTION__, mod_id, frameP, slotP, ra->RA_contention_resolution_target_frame, ra->RA_contention_resolution_target_slot);
 
-  // start contention resolution timer
-  ra->RA_contention_resolution_cnt = (nr_rach_ConfigCommon->ra_ContentionResolutionTimer + 1) * 8;
   ra->RA_contention_resolution_timer_active = 1;
   ra->ra_state = WAIT_CONTENTION_RESOLUTION;
 
 }
 
-/////////////////////////////////////////////////////////////////////////
-// This function handles:
-// - Random Access Preamble Initialization (5.1.1 TS 38.321)
-// - Random Access Response reception (5.1.4 TS 38.321)
-/// In the current implementation, RA is 4-step contention free only
-/////////////////////////////////////////////////////////////////////////
-// todo TS 38.321:
-// - BWP operation (subclause 5.15 TS 38.321)
-// - beam failure recovery
-// - handle initialization by handover
-// - handle DL assignment on PDCCH for RA-RNTI
-// - transmission on DCCH using PRACH (during handover, or sending SR for example)
-// - take into account MAC CEs in size_sdu (currently hardcoded size to 1 MAC subPDU and 1 padding subheader)
-// - fix rrc data req logic
-// - retrieve TBS
-// - add mac_rrc_nr_data_req_ue, etc ...
-// - Msg3 Retransmissions to be scheduled by DCI 0_0
+/**
+ * Function:            handles Random Access Preamble Initialization (5.1.1 TS 38.321)
+ *                      handles Random Access Response reception (5.1.4 TS 38.321)
+ * Note:                In SA mode the Msg3 contains a CCCH SDU, therefore no C-RNTI MAC CE is transmitted.
+ *
+ * @prach_resources     pointer to PRACH resources
+ * @prach_pdu           pointer to FAPI UL PRACH PDU
+ * @mod_id              module ID
+ * @CC_id               CC ID
+ * @frame               current UL TX frame
+ * @gNB_id              gNB ID
+ * @nr_slot_tx          current UL TX slot
+ */
 uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
                        fapi_nr_ul_config_prach_pdu *prach_pdu,
                        module_id_t mod_id,
@@ -501,11 +541,6 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
 
   NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
   RA_config_t *ra = &mac->ra;
-  uint8_t mac_sdus[MAX_NR_ULSCH_PAYLOAD_BYTES];
-  uint8_t lcid = UL_SCH_LCID_CCCH;
-  uint8_t *payload;
-  uint16_t size_sdu = 0;
-  unsigned short post_padding;
   NR_RACH_ConfigCommon_t *setup;
   if (mac->scc) setup = mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup;
   else          setup = mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
@@ -513,11 +548,6 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
   NR_RACH_ConfigGeneric_t *rach_ConfigGeneric = &setup->rach_ConfigGeneric;
   NR_RACH_ConfigDedicated_t *rach_ConfigDedicated = ra->rach_ConfigDedicated;
 
-  uint8_t sdu_lcids[NB_RB_MAX] = {0};
-  uint16_t sdu_lengths[NB_RB_MAX] = {0};
-  int num_sdus = 0;
-  int offset = 0;
-
   // Delay init RA procedure to allow the convergence of the IIR filter on PRACH noise measurements at gNB side
   if (!prach_resources->init_msg1) {
     if ( (mac->common_configuration_complete>0 || get_softmodem_params()->do_ra==1) && ((MAX_FRAME_NUMBER+frame-prach_resources->sync_frame)%MAX_FRAME_NUMBER)>150 ){
@@ -528,90 +558,107 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
     }
   }
 
-  LOG_D(NR_MAC,"frame %d prach_resources->init_msg1 %d, ra->ra_state %d, ra->RA_active %d\n",
-	frame,prach_resources->init_msg1,ra->ra_state,ra->RA_active);
+  LOG_D(NR_MAC, "In %s: [UE %d][%d.%d]: init_msg1 %d, ra_state %d, RA_active %d\n",
+    __FUNCTION__,
+    mod_id,
+    frame,
+    nr_slot_tx,
+    prach_resources->init_msg1,
+    ra->ra_state,
+    ra->RA_active);
 
   if (prach_resources->init_msg1 && ra->ra_state != RA_SUCCEEDED) {
 
     if (ra->RA_active == 0) {
       /* RA not active - checking if RRC is ready to initiate the RA procedure */
 
-      LOG_D(NR_MAC, "RA not active. Checking for data to transmit from upper layers...\n");
+      LOG_D(NR_MAC, "In %s: RA not active. Checking for data to transmit from upper layers...\n", __FUNCTION__);
 
-      uint8_t TBS_max = 8 + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT);
-      payload = (uint8_t*) mac->CCCH_pdu.payload;
+      const uint8_t lcid = UL_SCH_LCID_CCCH;
+      const uint8_t sh_size = sizeof(NR_MAC_SUBHEADER_FIXED);
+      const uint8_t TBS_max = 8 + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT); // Note: unclear the reason behind the selection of such TBS_max
+      int8_t size_sdu = 0;
+      uint8_t mac_ce[16] = {0};
+      uint8_t *pdu = get_softmodem_params()->sa ? mac->CCCH_pdu.payload : mac_ce;
+      uint8_t *payload = pdu;
 
-      num_sdus = 1;
-      post_padding = 1;
-      sdu_lcids[0] = lcid;
+      // Concerning the C-RNTI MAC CE, it has to be included if the UL transmission (Msg3) is not being made for the CCCH logical channel.
+      // Therefore it has been assumed that this event only occurs only when RA is done and it is not SA mode.
+      if (get_softmodem_params()->sa) {
 
-      // initialisation by RRC
+        NR_MAC_SUBHEADER_FIXED *header = (NR_MAC_SUBHEADER_FIXED *) pdu;
+        pdu += sh_size;
 
-      // TODO: To be removed after RA procedures fully implemented
-      if(get_softmodem_params()->do_ra) {
+        // initialisation by RRC
         nr_rrc_ue_generate_RRCSetupRequest(mod_id,gNB_id);
-      }
 
-      // CCCH PDU
-      size_sdu = (uint16_t) nr_mac_rrc_data_req_ue(mod_id, CC_id, gNB_id, frame, CCCH, mac_sdus);
+        // CCCH PDU
+        size_sdu = nr_mac_rrc_data_req_ue(mod_id, CC_id, gNB_id, frame, CCCH, pdu);
+        LOG_D(NR_MAC, "In %s: [UE %d][%d.%d]: Requested RRCConnectionRequest, got %d bytes for LCID 0x%02x \n", __FUNCTION__, mod_id, frame, nr_slot_tx, size_sdu, lcid);
 
-      sdu_lengths[0] = size_sdu;
+        if (size_sdu > 0) {
 
-      LOG_D(NR_MAC,"[UE %d] Frame %d: Requested RRCConnectionRequest, got %d bytes\n", mod_id, frame, size_sdu);
+          // UE Contention Resolution Identity
+          // Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to determine whether or not the
+          // Random Access Procedure has been successful after reception of Msg4
+          memcpy(ra->cont_res_id, pdu, sizeof(uint8_t) * 6);
 
-      if (size_sdu > 0) {
+          pdu += size_sdu;
+          ra->Msg3_size = size_sdu + sh_size;
 
-        // UE Contention Resolution Identity
-        // Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to determine whether or not the
-        // Random Access Procedure has been successful after reception of Msg4
-        memcpy(ra->cont_res_id, mac_sdus, sizeof(uint8_t) * 6);
+          // Build header
+          header->R = 0;
+          header->LCID = lcid;
 
-        LOG_D(NR_MAC, "[UE %d][%d.%d]: starting initialisation Random Access Procedure...\n", mod_id, frame, nr_slot_tx);
+        } else {
+          pdu -= sh_size;
+        }
 
-        ra->Msg3_size = size_sdu + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT);
+      } else {
+
+        size_sdu = nr_write_ce_ulsch_pdu(pdu, mac);
+        pdu += size_sdu;
+        ra->Msg3_size = size_sdu;
+
+      }
+
+      if (size_sdu > 0 && ra->generate_nr_prach == GENERATE_PREAMBLE) {
+
+        LOG_D(NR_MAC, "In %s: [UE %d][%d.%d]: starting initialisation Random Access Procedure...\n", __FUNCTION__, mod_id, frame, nr_slot_tx);
+        AssertFatal(TBS_max > ra->Msg3_size, "In %s: allocated resources are not enough for Msg3!\n", __FUNCTION__);
 
+        // Init RA procedure
         init_RA(mod_id, prach_resources, setup, rach_ConfigGeneric, rach_ConfigDedicated);
-        prach_resources->Msg3 = payload;
         nr_get_RA_window(mac);
-
         // Fill in preamble and PRACH resources
-        if (ra->generate_nr_prach == GENERATE_PREAMBLE) {
-          nr_get_prach_resources(mod_id, CC_id, gNB_id, prach_resources, prach_pdu, rach_ConfigDedicated);
-        }
-        offset = nr_generate_ulsch_pdu((uint8_t *) mac_sdus,              // sdus buffer
-                                       (uint8_t *) payload,               // UL MAC pdu pointer
-                                       num_sdus,                          // num sdus
-                                       sdu_lengths,                       // sdu length
-                                       sdu_lcids,                         // sdu lcid
-                                       0,                                 // power headroom
-                                       0,                                 // crnti
-                                       0,                                 // truncated bsr
-                                       0,                                 // short bsr
-                                       0,                                 // long_bsr
-                                       post_padding,
-                                       0);
-
-        AssertFatal(TBS_max > offset, "Frequency resources are not enough for Msg3!\n");
+        nr_get_prach_resources(mod_id, CC_id, gNB_id, prach_resources, prach_pdu, rach_ConfigDedicated);
 
         // Padding: fill remainder with 0
-        if (post_padding > 0){
-          for (int j = 0; j < (TBS_max - offset); j++)
-            payload[offset + j] = 0;
+        if (TBS_max - ra->Msg3_size > 0) {
+          LOG_D(NR_MAC, "In %s: remaining %d bytes, filling with padding\n", __FUNCTION__, TBS_max - ra->Msg3_size);
+          ((NR_MAC_SUBHEADER_FIXED *) pdu)->R = 0;
+          ((NR_MAC_SUBHEADER_FIXED *) pdu)->LCID = UL_SCH_LCID_PADDING;
+          pdu += sizeof(NR_MAC_SUBHEADER_FIXED);
+          for (int j = 0; j < TBS_max - ra->Msg3_size - sizeof(NR_MAC_SUBHEADER_FIXED); j++) {
+            pdu[j] = 0;
+          }
         }
-      }
 
-      LOG_D(MAC,"size_sdu = %i\n", size_sdu);
-      LOG_D(MAC,"offset = %i\n", offset);
-      for(int k = 0; k < TBS_max; k++) {
-        LOG_D(MAC,"(%i): %i\n", k, prach_resources->Msg3[k]);
-      }
+        // Dumping ULSCH payload
+        LOG_D(NR_MAC, "In %s: dumping UL Msg3 MAC PDU with length %d: \n", __FUNCTION__, TBS_max);
+        for(int k = 0; k < TBS_max; k++) {
+          LOG_D(NR_MAC,"(%i): %i\n", k, payload[k]);
+        }
 
-      // Msg3 was initialized with TBS_max bytes because the RA_Msg3_size will only be known after
-      // receiving Msg2 (which contains the Msg3 resource reserve).
-      // Msg3 will be transmitted with RA_Msg3_size bytes, removing unnecessary 0s.
-      mac->ulsch_pdu.Pdu_size = TBS_max;
-      memcpy(mac->ulsch_pdu.payload, prach_resources->Msg3, TBS_max);
+        // Msg3 was initialized with TBS_max bytes because the RA_Msg3_size will only be known after
+        // receiving Msg2 (which contains the Msg3 resource reserve).
+        // Msg3 will be transmitted with RA_Msg3_size bytes, removing unnecessary 0s.
+        mac->ulsch_pdu.Pdu_size = TBS_max;
+        memcpy(mac->ulsch_pdu.payload, payload, TBS_max);
 
+      } else {
+        return 0;
+      }
     } else if (ra->RA_window_cnt != -1) { // RACH is active
 
       LOG_D(MAC, "In %s [%d.%d] RA is active: RA window count %d, RA backoff count %d\n", __FUNCTION__, frame, nr_slot_tx, ra->RA_window_cnt, ra->RA_backoff_cnt);
@@ -736,20 +783,15 @@ void nr_ue_contention_resolution(module_id_t module_id, int cc_id, frame_t frame
   RA_config_t *ra = &mac->ra;
 
   if (ra->RA_contention_resolution_timer_active == 1) {
-
-      ra->RA_contention_resolution_cnt--;
-
-      LOG_D(MAC, "In %s: [%d.%d] RA contention resolution timer %d\n", __FUNCTION__, frame, slot, ra->RA_contention_resolution_cnt);
-
-      if (ra->RA_contention_resolution_cnt == 0) {
-        ra->t_crnti = 0;
-        ra->RA_active = 0;
-        ra->RA_contention_resolution_timer_active = 0;
-        // Signal PHY to quit RA procedure
-        LOG_E(MAC, "[UE %d] CB-RA: Contention resolution timer has expired, RA procedure has failed...\n", module_id);
-        nr_ra_failed(module_id, cc_id, prach_resources, frame, slot);
-      }
-    
+    if (frame >= ra->RA_contention_resolution_target_frame &&
+      slot >= ra->RA_contention_resolution_target_slot) {
+      ra->t_crnti = 0;
+      ra->RA_active = 0;
+      ra->RA_contention_resolution_timer_active = 0;
+      // Signal PHY to quit RA procedure
+      LOG_E(MAC, "[UE %d] CB-RA: Contention resolution timer has expired, RA procedure has failed...\n", module_id);
+      nr_ra_failed(module_id, cc_id, prach_resources, frame, slot);
+    }
   }
 }
 
@@ -767,13 +809,11 @@ void nr_ra_succeeded(module_id_t mod_id, frame_t frame, int slot){
     LOG_I(MAC, "[UE %d][%d.%d][RAPROC] RA procedure succeeded. CF-RA: RAR successfully received.\n", mod_id, frame, slot);
 
     ra->RA_window_cnt = -1;
-    mac->crnti = ra->t_crnti;
 
   } else {
 
     LOG_I(MAC, "[UE %d][%d.%d][RAPROC] RA procedure succeeded. CB-RA: Contention Resolution is successful.\n", mod_id, frame, slot);
 
-    ra->RA_contention_resolution_cnt = -1;
     ra->RA_contention_resolution_timer_active = 0;
     mac->crnti = ra->t_crnti;
     ra->t_crnti = 0;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
index 8891d3354e0eb00be0d0ce33fc0fc5000a274ea6..7f62ee9b3e2534f651ad2953523ecb3eed9226ae 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
@@ -66,7 +66,6 @@ void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pd
 
 void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15, fapi_nr_dl_config_request_t *dl_config, int rnti_type, int ss_id){
 
-  RA_config_t *ra = &mac->ra;
   uint16_t monitoringSymbolsWithinSlot = 0;
   uint8_t coreset_id = 1;
   int sps = 0;
@@ -90,6 +89,9 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
   NR_SearchSpace_t *ss;
   NR_ControlResourceSet_t *coreset;
   if(ss_id>=0) {
+    AssertFatal(mac->scc != NULL, "scc is null\n");
+    initialDownlinkBWP = scc->downlinkConfigCommon->initialDownlinkBWP;
+    bwp_Common = mac->DLbwp[bwp_id - 1]->bwp_Common;
     ss = mac->SSpace[bwp_id - 1][coreset_id - 1][ss_id];
     coreset = mac->coreset[bwp_id - 1][coreset_id - 1];
     rel15->coreset.CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG;
@@ -107,7 +109,8 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
 
   for (int i = 0; i < 6; i++)
     rel15->coreset.frequency_domain_resource[i] = coreset->frequencyDomainResources.buf[i];
-  rel15->coreset.CceRegMappingType = coreset->cce_REG_MappingType.present == NR_ControlResourceSet__cce_REG_MappingType_PR_interleaved ? FAPI_NR_CCE_REG_MAPPING_TYPE_INTERLEAVED : FAPI_NR_CCE_REG_MAPPING_TYPE_NON_INTERLEAVED;
+  rel15->coreset.CceRegMappingType = coreset->cce_REG_MappingType.present ==
+    NR_ControlResourceSet__cce_REG_MappingType_PR_interleaved ? FAPI_NR_CCE_REG_MAPPING_TYPE_INTERLEAVED : FAPI_NR_CCE_REG_MAPPING_TYPE_NON_INTERLEAVED;
   if (rel15->coreset.CceRegMappingType == FAPI_NR_CCE_REG_MAPPING_TYPE_INTERLEAVED) {
     struct NR_ControlResourceSet__cce_REG_MappingType__interleaved *interleaved = coreset->cce_REG_MappingType.choice.interleaved;
     rel15->coreset.RegBundleSize = (interleaved->reg_BundleSize == NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6) ? 6 : (2 + interleaved->reg_BundleSize);
@@ -130,10 +133,6 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
     rel15->coreset.scrambling_rnti = 0;
   }
 
-  #ifdef DEBUG_DCI
-    LOG_D(MAC, "[DCI_CONFIG] Configure DCI PDU: ss_id %d bwp %p bwp_Id %d controlResourceSetId %d\n", ss_id, mac->DLbwp[bwp_id - 1], mac->DLbwp[bwp_id - 1]->bwp_Id, coreset->controlResourceSetId);
-  #endif
-
   // loop over RNTI type and configure resource allocation for DCI
   switch(rnti_type) {
     case NR_RNTI_C:
@@ -161,7 +160,7 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
     // we use the initial DL BWP
     sps = initialDownlinkBWP->genericParameters.cyclicPrefix == NULL ? 14 : 12;
     monitoringSymbolsWithinSlot = (ss->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) | (ss->monitoringSymbolsWithinSlot->buf[1]>>(16-sps));
-    rel15->rnti = ra->ra_rnti;
+    rel15->rnti = mac->ra.ra_rnti;
     rel15->BWPSize = NRRIV2BW(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
     if (get_softmodem_params()->sa) {
       rel15->BWPStart = NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
@@ -179,11 +178,12 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
       // we use the initial DL BWP
       sps = initialDownlinkBWP->genericParameters.cyclicPrefix == NULL ? 14 : 12;
       monitoringSymbolsWithinSlot = (ss->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) | (ss->monitoringSymbolsWithinSlot->buf[1]>>(16-sps));
-      rel15->rnti = ra->t_crnti;
+      rel15->rnti = mac->ra.t_crnti;
       rel15->BWPSize = NRRIV2BW(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
       rel15->BWPStart = NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
       rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing;
-      rel15->dci_length_options[0] = nr_dci_size(initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[0]], rel15->dci_format_options[0], NR_RNTI_TC, rel15->BWPSize, bwp_id);
+      for (int i = 0; i < rel15->num_dci_options; i++)
+        rel15->dci_length_options[i] = nr_dci_size(initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_TC, rel15->BWPSize, bwp_id);
     break;
     case NR_RNTI_SP_CSI:
     break;
@@ -198,7 +198,11 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
       rel15->rnti = SI_RNTI; // SI-RNTI - 3GPP TS 38.321 Table 7.1-1: RNTI values
       rel15->BWPSize = mac->type0_PDCCH_CSS_config.num_rbs;
       rel15->BWPStart = mac->type0_PDCCH_CSS_config.cset_start_rb;
-      rel15->SubcarrierSpacing = mac->mib->subCarrierSpacingCommon;
+
+      if(mac->frequency_range == FR1)
+        rel15->SubcarrierSpacing = mac->mib->subCarrierSpacingCommon;
+      else
+        rel15->SubcarrierSpacing = mac->mib->subCarrierSpacingCommon + 2;
 
       for (int i = 0; i < rel15->num_dci_options; i++) {
         rel15->dci_length_options[i] = nr_dci_size(initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_SI, rel15->BWPSize, 0);
@@ -427,11 +431,13 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
   }
   else { // use coreset0/ss0
     NR_SearchSpace_t *ss0 = mac->search_space_zero;
-    fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[0].dci_config_pdu.dci_config_rel15;
-    rel15->num_dci_options = 1;
-    rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
-    config_dci_pdu(mac, rel15, dl_config, NR_RNTI_C , -1);
-    fill_dci_search_candidates(ss0, rel15);
-    dl_config->number_pdus = 1;
+    if(ss0) {
+      fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[0].dci_config_pdu.dci_config_rel15;
+      rel15->num_dci_options = 1;
+      rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
+      config_dci_pdu(mac, rel15, dl_config, NR_RNTI_C , -1);
+      fill_dci_search_candidates(ss0, rel15);
+      dl_config->number_pdus = 1;
+    }
   }
 }
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index a72d7dc23dc12d75c7b16f3fef2dc1904be8d3e0..6e22a05b17551e12ef088064dc7f1fa9e6560a3e 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -69,6 +69,72 @@
 
 extern uint32_t N_RB_DL;
 
+/* TS 38.213 9.2.5.2 UE procedure for multiplexing HARQ-ACK/SR and CSI in a PUCCH */
+/* this is a counter of number of pucch format 4 per subframe */
+static int nb_pucch_format_4_in_subframes[LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] = { 0 } ;
+
+/* TS 36.213 Table 9.2.3-3: Mapping of values for one HARQ-ACK bit to sequences */
+static const int sequence_cyclic_shift_1_harq_ack_bit[2]
+/*        HARQ-ACK Value        0    1 */
+/* Sequence cyclic shift */ = { 0,   6 };
+
+/* TS 36.213 Table 9.2.5-1: Mapping of values for one HARQ-ACK bit and positive SR to sequences */
+static const int sequence_cyclic_shift_1_harq_ack_bit_positive_sr[2]
+/*        HARQ-ACK Value        0    1 */
+/* Sequence cyclic shift */ = { 3,   9 };
+
+/* TS 36.213 Table 9.2.5-2: Mapping of values for two HARQ-ACK bits and positive SR to sequences */
+static const int sequence_cyclic_shift_2_harq_ack_bits_positive_sr[4]
+/*        HARQ-ACK Value      (0,0)  (0,1)   (1,0)  (1,1) */
+/* Sequence cyclic shift */ = {  1,     4,     10,     7 };
+
+/* TS 38.213 Table 9.2.3-4: Mapping of values for two HARQ-ACK bits to sequences */
+static const int sequence_cyclic_shift_2_harq_ack_bits[4]
+/*        HARQ-ACK Value       (0,0)  (0,1)  (1,0)  (1,1) */
+/* Sequence cyclic shift */ = {   0,     3,     9,     6 };
+
+
+/* TS 38.211 Table 6.4.1.3.3.2-1: DM-RS positions for PUCCH format 3 and 4 */
+static const int nb_symbols_excluding_dmrs[11][2][2]
+= {
+/*                     No additional DMRS            Additional DMRS   */
+/* PUCCH length      No hopping   hopping         No hopping   hopping */
+/* index                  0          1                 0          1    */
+/*    4     */    {{      3    ,     2   }   ,  {      3     ,    2    }},
+/*    5     */    {{      3    ,     3   }   ,  {      3     ,    3    }},
+/*    6     */    {{      4    ,     4   }   ,  {      4     ,    4    }},
+/*    7     */    {{      5    ,     5   }   ,  {      5     ,    5    }},
+/*    8     */    {{      6    ,     6   }   ,  {      6     ,    6    }},
+/*    9     */    {{      7    ,     7   }   ,  {      7     ,    7    }},
+/*   10     */    {{      8    ,     8   }   ,  {      6     ,    6    }},
+/*   11     */    {{      9    ,     9   }   ,  {      7     ,    7    }},
+/*   12     */    {{     10    ,    10   }   ,  {      8     ,    8    }},
+/*   13     */    {{     11    ,    11   }   ,  {      9     ,    9    }},
+/*   14     */    {{     12    ,    12   }   ,  {     10     ,   10    }},
+};
+
+/* TS 36.213 Table 9.2.1-1: PUCCH resource sets before dedicated PUCCH resource configuration */
+const initial_pucch_resource_t initial_pucch_resource[16] = {
+/*              format           first symbol     Number of symbols        PRB offset    nb index for       set of initial CS */
+/*  0  */ {  0,      12,                  2,                   0,            2,       {    0,   3,    0,    0  }   },
+/*  1  */ {  0,      12,                  2,                   0,            3,       {    0,   4,    8,    0  }   },
+/*  2  */ {  0,      12,                  2,                   3,            3,       {    0,   4,    8,    0  }   },
+/*  3  */ {  1,      10,                  4,                   0,            2,       {    0,   6,    0,    0  }   },
+/*  4  */ {  1,      10,                  4,                   0,            4,       {    0,   3,    6,    9  }   },
+/*  5  */ {  1,      10,                  4,                   2,            4,       {    0,   3,    6,    9  }   },
+/*  6  */ {  1,      10,                  4,                   4,            4,       {    0,   3,    6,    9  }   },
+/*  7  */ {  1,       4,                 10,                   0,            2,       {    0,   6,    0,    0  }   },
+/*  8  */ {  1,       4,                 10,                   0,            4,       {    0,   3,    6,    9  }   },
+/*  9  */ {  1,       4,                 10,                   2,            4,       {    0,   3,    6,    9  }   },
+/* 10  */ {  1,       4,                 10,                   4,            4,       {    0,   3,    6,    9  }   },
+/* 11  */ {  1,       0,                 14,                   0,            2,       {    0,   6,    0,    0  }   },
+/* 12  */ {  1,       0,                 14,                   0,            4,       {    0,   3,    6,    9  }   },
+/* 13  */ {  1,       0,                 14,                   2,            4,       {    0,   3,    6,    9  }   },
+/* 14  */ {  1,       0,                 14,                   4,            4,       {    0,   3,    6,    9  }   },
+/* 15  */ {  1,       0,                 14,                   0,            4,       {    0,   3,    6,    9  }   },
+};
+
+
 int get_rnti_type(NR_UE_MAC_INST_t *mac, uint16_t rnti){
 
     RA_config_t *ra = &mac->ra;
@@ -105,7 +171,7 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
                         uint16_t ssb_start_subcarrier,
                         uint16_t cell_id)
 {
-  LOG_D(MAC,"[L2][MAC] decode mib\n");
+  LOG_I(MAC,"[L2][MAC] decode mib\n");
 
   NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
   mac->physCellId = cell_id;
@@ -153,34 +219,37 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
 
   //storing ssb index in the mac structure
   mac->mib_ssb = ssb_index;
+  mac->ssb_subcarrier_offset = ssb_subcarrier_offset;
+
+  uint8_t scs_ssb;
+  uint32_t band;
+  uint16_t ssb_start_symbol;
 
   if (get_softmodem_params()->sa == 1) {
 
-    // TODO these values shouldn't be taken from SCC in SA
-    uint8_t scs_ssb = get_softmodem_params()->numerology;
-    uint32_t band   = get_softmodem_params()->band;
-    uint16_t ssb_start_symbol = get_ssb_start_symbol(band,scs_ssb,ssb_index);
-    uint16_t ssb_offset_point_a = (ssb_start_subcarrier - ssb_subcarrier_offset)/12;
-
-    get_type0_PDCCH_CSS_config_parameters(&mac->type0_PDCCH_CSS_config,
-                                          frame,
-                                          mac->mib,
-                                          nr_slots_per_frame[scs_ssb],
-                                          ssb_subcarrier_offset,
-                                          ssb_start_symbol,
-                                          scs_ssb,
-                                          mac->frequency_range,
-                                          ssb_index,
-                                          ssb_offset_point_a);
-
-
-    mac->type0_pdcch_ss_mux_pattern = mac->type0_PDCCH_CSS_config.type0_pdcch_ss_mux_pattern;
-    mac->type0_pdcch_ss_sfn_c = mac->type0_PDCCH_CSS_config.sfn_c;
-    mac->type0_pdcch_ss_n_c = mac->type0_PDCCH_CSS_config.n_c;
+    scs_ssb = get_softmodem_params()->numerology;
+    band = mac->nr_band;
+    ssb_start_symbol = get_ssb_start_symbol(band,scs_ssb,ssb_index);
+
+    if (mac->common_configuration_complete == 0)
+      nr_ue_sib1_scheduler(module_id,
+                           cc_id,
+                           ssb_start_symbol,
+                           frame,
+                           ssb_subcarrier_offset,
+                           ssb_index,
+                           ssb_start_subcarrier,
+                           mac->frequency_range);
+  }
+  else {
+    NR_ServingCellConfigCommon_t *scc = mac->scc;
+    scs_ssb = *scc->ssbSubcarrierSpacing;
+    band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
+    ssb_start_symbol = get_ssb_start_symbol(band,scs_ssb,ssb_index);
   }
 
-  mac->dl_config_request.sfn = mac->type0_PDCCH_CSS_config.frame;
-  mac->dl_config_request.slot = (ssb_index>>1) + ((ssb_index>>4)<<1); // not valid for 240kHz SCS
+  mac->dl_config_request.sfn = frame;
+  mac->dl_config_request.slot = ssb_start_symbol/14;
 
   return 0;
 }
@@ -188,11 +257,15 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
 int8_t nr_ue_decode_BCCH_DL_SCH(module_id_t module_id,
                                 int cc_id,
                                 unsigned int gNB_index,
-                                uint32_t sibs_mask,
+                                uint8_t ack_nack,
                                 uint8_t *pduP,
                                 uint32_t pdu_len) {
-  LOG_D(NR_MAC, "Decoding NR-BCCH-DL-SCH-Message (SIB1 or SI)\n");
-  nr_mac_rrc_data_ind_ue(module_id, cc_id, gNB_index, 0, 0, 0, NR_BCCH_DL_SCH, (uint8_t *) pduP, pdu_len);
+  if(ack_nack) {
+    LOG_D(NR_MAC, "Decoding NR-BCCH-DL-SCH-Message (SIB1 or SI)\n");
+    nr_mac_rrc_data_ind_ue(module_id, cc_id, gNB_index, 0, 0, 0, NR_BCCH_DL_SCH, (uint8_t *) pduP, pdu_len);
+  }
+  else
+    LOG_E(NR_MAC, "Got NACK on NR-BCCH-DL-SCH-Message (SIB1 or SI)\n");
   return 0;
 }
 
@@ -272,13 +345,14 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
 						      nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu,
 						      fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu,
 						      uint8_t time_domain_ind,
-						      bool use_default
-						      ){
+                                                      int default_abc,
+                                                      bool use_default){
+
   int dmrs_typeA_pos = (mac->scc != NULL) ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position;
 
 //  uint8_t k_offset=0;
-  uint8_t sliv_S=0;
-  uint8_t sliv_L=0;
+  int sliv_S=0;
+  int sliv_L=0;
   uint8_t mu_pusch = 1;
 
   // definition table j Table 6.1.2.1.1-4
@@ -357,25 +431,14 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
 
     }
     else {// Default configuration from tables
-//      k_offset = table_5_1_2_1_1_2_time_dom_res_alloc_A[time_domain_ind-1][0];
 
-      if(dmrs_typeA_pos == 0) {
-        sliv_S = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[time_domain_ind][1];
-        sliv_L = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[time_domain_ind][2];
-      } else {
-        sliv_S = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[time_domain_ind][1];
-        sliv_L = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[time_domain_ind][2];
-      }
+      get_info_from_tda_tables(default_abc,
+                               time_domain_ind,
+                               dmrs_typeA_pos,
+                               1, // normal CP
+                               &sliv_S,
+                               &sliv_L);
 
-      // k_offset = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP[nr_pdci_info_extracted->time_dom_resource_assignment][0];
-      // sliv_S   = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP[nr_pdci_info_extracted->time_dom_resource_assignment][1];
-      // sliv_L   = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP[nr_pdci_info_extracted->time_dom_resource_assignment][2];
-      // k_offset = table_5_1_2_1_1_4_time_dom_res_alloc_B[nr_pdci_info_extracted->time_dom_resource_assignment][0];
-      // sliv_S   = table_5_1_2_1_1_4_time_dom_res_alloc_B[nr_pdci_info_extracted->time_dom_resource_assignment][1];
-      // sliv_L   = table_5_1_2_1_1_4_time_dom_res_alloc_B[nr_pdci_info_extracted->time_dom_resource_assignment][2];
-      // k_offset = table_5_1_2_1_1_5_time_dom_res_alloc_C[nr_pdci_info_extracted->time_dom_resource_assignment][0];
-      // sliv_S   = table_5_1_2_1_1_5_time_dom_res_alloc_C[nr_pdci_info_extracted->time_dom_resource_assignment][1];
-      // sliv_L   = table_5_1_2_1_1_5_time_dom_res_alloc_C[nr_pdci_info_extracted->time_dom_resource_assignment][2];
       dlsch_config_pdu->number_symbols = sliv_L;
       dlsch_config_pdu->start_symbol = sliv_S;
     }
@@ -442,12 +505,19 @@ int nr_ue_process_dci_indication_pdu(module_id_t module_id,int cc_id, int gNB_in
 	dci->rnti,dci->dci_format,dci->n_CCE,dci->payloadSize,*(unsigned long long*)dci->payloadBits);
   int8_t ret = nr_extract_dci_info(mac, dci->dci_format, dci->payloadSize, dci->rnti, (uint64_t *)dci->payloadBits, def_dci_pdu_rel15);
   if ((ret&1) == 1) return -1;
-  else if (ret == 2) dci->dci_format = NR_UL_DCI_FORMAT_0_0;
-  return (nr_ue_process_dci(module_id, cc_id, gNB_index, frame, slot, def_dci_pdu_rel15, dci->rnti, dci->dci_format));
+  else if (ret == 2) {
+    dci->dci_format = NR_UL_DCI_FORMAT_0_0;
+    def_dci_pdu_rel15 = &mac->def_dci_pdu_rel15[dci->dci_format];
+  }
+  int8_t ret_proc = nr_ue_process_dci(module_id, cc_id, gNB_index, frame, slot, def_dci_pdu_rel15, dci);
+  memset(def_dci_pdu_rel15, 0, sizeof(dci_pdu_rel15_t));
+  return ret_proc;
 }
 
-int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, frame_t frame, int slot, dci_pdu_rel15_t *dci, uint16_t rnti, uint8_t dci_format){
+int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, frame_t frame, int slot, dci_pdu_rel15_t *dci, fapi_nr_dci_indication_pdu_t *dci_ind) {
 
+  uint16_t rnti = dci_ind->rnti;
+  uint8_t dci_format = dci_ind->dci_format;
   int ret = 0;
   int pucch_res_set_cnt = 0, valid = 0;
   frame_t frame_tx = 0;
@@ -457,6 +527,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
   RA_config_t *ra = &mac->ra;
   fapi_nr_dl_config_request_t *dl_config = &mac->dl_config_request;
   uint8_t is_Msg3 = 0;
+  int default_abc = 1;
 
   uint16_t n_RB_DLBWP;
   if (mac->DLbwp[0]) n_RB_DLBWP = NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
@@ -625,10 +696,13 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
 
     dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.rnti = rnti;
     fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu_1_0 = &dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.dlsch_config_rel15;
+
     NR_PDSCH_Config_t *pdsch_config= (mac->DLbwp[0]) ? mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup : NULL;
     uint16_t BWPSize = n_RB_DLBWP;
 
     if(rnti == SI_RNTI) {
+      NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config = mac->type0_PDCCH_CSS_config;
+      default_abc = type0_PDCCH_CSS_config.type0_pdcch_ss_mux_pattern;
       dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_SI_DLSCH;
       dlsch_config_pdu_1_0->BWPSize = mac->type0_PDCCH_CSS_config.num_rbs;
       dlsch_config_pdu_1_0->BWPStart = mac->type0_PDCCH_CSS_config.cset_start_rb;
@@ -675,7 +749,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
       return -1;
     }
     /* TIME_DOM_RESOURCE_ASSIGNMENT */
-    if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,dlsch_config_pdu_1_0,dci->time_domain_assignment.val,rnti==SI_RNTI) < 0) {
+    if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,dlsch_config_pdu_1_0,dci->time_domain_assignment.val,default_abc,rnti==SI_RNTI) < 0) {
       LOG_W(MAC, "[%d.%d] Invalid time_domain_assignment. Possibly due to false DCI. Ignoring DCI!\n", frame, slot);
       return -1;
     }
@@ -699,7 +773,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
                                                          dlsch_config_pdu_1_0->number_symbols,
                                                          dlsch_config_pdu_1_0->start_symbol,
                                                          mappingtype);
-    dlsch_config_pdu_1_0->dmrsConfigType = (mac->DLbwp[0] != NULL) ? (mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1) : 0;
+    dlsch_config_pdu_1_0->dmrsConfigType = (mac->DLbwp[0] != NULL) ?
+                                           (mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1) : 0;
     /* number of DM-RS CDM groups without data according to subclause 5.1.6.2 of 3GPP TS 38.214 version 15.9.0 Release 15 */
     if (dlsch_config_pdu_1_0->number_symbols == 2)
       dlsch_config_pdu_1_0->n_dmrs_cdm_groups = 1;
@@ -722,8 +797,6 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
     dlsch_config_pdu_1_0->rv = dci->rv;
     /* HARQ_PROCESS_NUMBER (only if CRC scrambled by C-RNTI or CS-RNTI or new-RNTI or TC-RNTI)*/
     dlsch_config_pdu_1_0->harq_process_nbr = dci->harq_pid;
-    /* DAI (only if CRC scrambled by C-RNTI or CS-RNTI or new-RNTI or TC-RNTI)*/
-    dlsch_config_pdu_1_0->dai = dci->dai[0].val;
     /* TB_SCALING (only if CRC scrambled by P-RNTI or RA-RNTI) */
     // according to TS 38.214 Table 5.1.3.2-3
     if (dci->tb_scaling == 0) dlsch_config_pdu_1_0->scaling_factor_S = 1;
@@ -736,16 +809,6 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
     if (dci->tpc == 1) dlsch_config_pdu_1_0->accumulated_delta_PUCCH = 0;
     if (dci->tpc == 2) dlsch_config_pdu_1_0->accumulated_delta_PUCCH = 1;
     if (dci->tpc == 3) dlsch_config_pdu_1_0->accumulated_delta_PUCCH = 3;
-    /* PUCCH_RESOURCE_IND (only if CRC scrambled by C-RNTI or CS-RNTI or new-RNTI)*/
-    //if (dci->pucch_resource_indicator == 0) dlsch_config_pdu_1_0->pucch_resource_id = 1; //pucch-ResourceId obtained from the 1st value of resourceList FIXME!!!
-    //if (dci->pucch_resource_indicator == 1) dlsch_config_pdu_1_0->pucch_resource_id = 2; //pucch-ResourceId obtained from the 2nd value of resourceList FIXME!!
-    //if (dci->pucch_resource_indicator == 2) dlsch_config_pdu_1_0->pucch_resource_id = 3; //pucch-ResourceId obtained from the 3rd value of resourceList FIXME!!
-    //if (dci->pucch_resource_indicator == 3) dlsch_config_pdu_1_0->pucch_resource_id = 4; //pucch-ResourceId obtained from the 4th value of resourceList FIXME!!
-    //if (dci->pucch_resource_indicator == 4) dlsch_config_pdu_1_0->pucch_resource_id = 5; //pucch-ResourceId obtained from the 5th value of resourceList FIXME!!
-    //if (dci->pucch_resource_indicator == 5) dlsch_config_pdu_1_0->pucch_resource_id = 6; //pucch-ResourceId obtained from the 6th value of resourceList FIXME!!
-    //if (dci->pucch_resource_indicator == 6) dlsch_config_pdu_1_0->pucch_resource_id = 7; //pucch-ResourceId obtained from the 7th value of resourceList FIXME!!
-    //if (dci->pucch_resource_indicator == 7) dlsch_config_pdu_1_0->pucch_resource_id = 8; //pucch-ResourceId obtained from the 8th value of resourceList FIXME!!
-    dlsch_config_pdu_1_0->pucch_resource_id = dci->pucch_resource_indicator;
     // Sanity check for pucch_resource_indicator value received to check for false DCI.
     valid = 0;
     if (mac->ULbwp[0] &&
@@ -755,7 +818,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
         mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList) {
       pucch_res_set_cnt = mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.count;
       for (int id = 0; id < pucch_res_set_cnt; id++) {
-	if (dlsch_config_pdu_1_0->pucch_resource_id < mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
+	if (dci->pucch_resource_indicator < mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
 	  valid = 1;
 	  break;
 	}
@@ -771,19 +834,25 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
              mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList){
       pucch_res_set_cnt = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList->list.count;
       for (int id = 0; id < pucch_res_set_cnt; id++) {
-        if (dlsch_config_pdu_1_0->pucch_resource_id < mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
+        if (dci->pucch_resource_indicator < mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
           valid = 1;
           break;
         }
       }
     } else valid=1;
     if (!valid) {
-      LOG_W(MAC, "[%d.%d] pucch_resource_indicator value %d is out of bounds. Possibly due to false DCI. Ignoring DCI!\n", frame, slot, dlsch_config_pdu_1_0->pucch_resource_id);
+      LOG_W(MAC, "[%d.%d] pucch_resource_indicator value %d is out of bounds. Possibly due to false DCI. Ignoring DCI!\n", frame, slot, dci->pucch_resource_indicator);
       return -1;
     }
 
-    /* PDSCH_TO_HARQ_FEEDBACK_TIME_IND (only if CRC scrambled by C-RNTI or CS-RNTI or new-RNTI)*/
-    dlsch_config_pdu_1_0->pdsch_to_harq_feedback_time_ind = 1+dci->pdsch_to_harq_feedback_timing_indicator.val;
+   // set the harq status at MAC for feedback
+   set_harq_status(mac,dci->pucch_resource_indicator,
+                   dci->harq_pid,
+                   dlsch_config_pdu_1_0->accumulated_delta_PUCCH,
+                   1+dci->pdsch_to_harq_feedback_timing_indicator.val,
+                   dci->dai[0].val,
+                   dci_ind->n_CCE,dci_ind->N_CCE,
+                   frame,slot);
 
     LOG_D(MAC,"(nr_ue_procedures.c) rnti = %x dl_config->number_pdus = %d\n",
 	  dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.rnti,
@@ -802,11 +871,11 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
 	  dlsch_config_pdu_1_0->ndi,
 	  dlsch_config_pdu_1_0->rv,
 	  dlsch_config_pdu_1_0->harq_process_nbr,
-	  dlsch_config_pdu_1_0->dai,
+	  dci->dai[0].val,
 	  dlsch_config_pdu_1_0->scaling_factor_S,
 	  dlsch_config_pdu_1_0->accumulated_delta_PUCCH,
-	  dlsch_config_pdu_1_0->pucch_resource_id,
-	  dlsch_config_pdu_1_0->pdsch_to_harq_feedback_time_ind);
+	  dci->pucch_resource_indicator,
+	  1+dci->pdsch_to_harq_feedback_timing_indicator.val);
 
     //	    dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15.N_RB_BWP = n_RB_DLBWP;
 	    
@@ -875,7 +944,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
       return -1;
     }
     /* TIME_DOM_RESOURCE_ASSIGNMENT */
-    if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,dlsch_config_pdu_1_1,dci->time_domain_assignment.val,false) < 0) {
+    if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,dlsch_config_pdu_1_1,dci->time_domain_assignment.val,0,false) < 0) {
       LOG_W(MAC, "[%d.%d] Invalid time_domain_assignment. Possibly due to false DCI. Ignoring DCI!\n", frame, slot);
       return -1;
     }
@@ -897,9 +966,11 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
     dlsch_config_pdu_1_1->dlDmrsSymbPos = fill_dmrs_mask(pdsch_config,
 							 mac->scc->dmrs_TypeA_Position,
 							 dlsch_config_pdu_1_1->number_symbols,
-               dlsch_config_pdu_1_1->start_symbol,
-               mappingtype);
+                                                         dlsch_config_pdu_1_1->start_symbol,
+                                                         mappingtype);
+
     dlsch_config_pdu_1_1->dmrsConfigType = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? NFAPI_NR_DMRS_TYPE1 : NFAPI_NR_DMRS_TYPE2;
+
     /* TODO: fix number of DM-RS CDM groups without data according to subclause 5.1.6.2 of 3GPP TS 38.214,
              using tables 7.3.1.2.2-1, 7.3.1.2.2-2, 7.3.1.2.2-3, 7.3.1.2.2-4 of 3GPP TS 38.212 */
     dlsch_config_pdu_1_1->n_dmrs_cdm_groups = 1;
@@ -936,36 +1007,27 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
     dlsch_config_pdu_1_1->tb2_rv = dci->rv2.val;
     /* HARQ_PROCESS_NUMBER */
     dlsch_config_pdu_1_1->harq_process_nbr = dci->harq_pid;
-    /* DAI */
-    dlsch_config_pdu_1_1->dai = dci->dai[0].val;
     /* TPC_PUCCH */
     // according to TS 38.213 Table 7.2.1-1
     if (dci->tpc == 0) dlsch_config_pdu_1_1->accumulated_delta_PUCCH = -1;
     if (dci->tpc == 1) dlsch_config_pdu_1_1->accumulated_delta_PUCCH = 0;
     if (dci->tpc == 2) dlsch_config_pdu_1_1->accumulated_delta_PUCCH = 1;
     if (dci->tpc == 3) dlsch_config_pdu_1_1->accumulated_delta_PUCCH = 3;
-    /* PUCCH_RESOURCE_IND */
-    dlsch_config_pdu_1_1->pucch_resource_id = dci->pucch_resource_indicator;
+
     // Sanity check for pucch_resource_indicator value received to check for false DCI.
     valid = 0;
     pucch_res_set_cnt = mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.count;
     for (int id = 0; id < pucch_res_set_cnt; id++) {
-      if (dlsch_config_pdu_1_1->pucch_resource_id < mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
+      if (dci->pucch_resource_indicator < mac->ULbwp[0]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
         valid = 1;
         break;
       }
     }
     if (!valid) {
-      LOG_W(MAC, "[%d.%d] pucch_resource_indicator value %d is out of bounds. Possibly due to false DCI. Ignoring DCI!\n", frame, slot, dlsch_config_pdu_1_1->pucch_resource_id);
+      LOG_W(MAC, "[%d.%d] pucch_resource_indicator value %d is out of bounds. Possibly due to false DCI. Ignoring DCI!\n", frame, slot, dci->pucch_resource_indicator);
       return -1;
     }
 
-    /* PDSCH_TO_HARQ_FEEDBACK_TIME_IND */
-    // according to TS 38.213 Table 9.2.3-1
-    NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
-    dlsch_config_pdu_1_1->pdsch_to_harq_feedback_time_ind =
-      mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->dl_DataToUL_ACK->list.array[dci->pdsch_to_harq_feedback_timing_indicator.val][0];
-
     /* ANTENNA_PORTS */
     uint8_t n_codewords = 1; // FIXME!!!
     long *max_length = NULL;
@@ -1068,7 +1130,22 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
     //FIXME!!!
 
     //	    dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15.N_RB_BWP = n_RB_DLBWP;
-	    
+
+    /* PDSCH_TO_HARQ_FEEDBACK_TIME_IND */
+    // according to TS 38.213 Table 9.2.3-1
+    NR_BWP_Id_t ul_bwp_id = mac->UL_BWP_Id;
+    uint8_t feedback_ti =
+      mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->dl_DataToUL_ACK->list.array[dci->pdsch_to_harq_feedback_timing_indicator.val][0];
+
+   // set the harq status at MAC for feedback
+   set_harq_status(mac,dci->pucch_resource_indicator,
+                   dci->harq_pid,
+                   dlsch_config_pdu_1_1->accumulated_delta_PUCCH,
+                   feedback_ti,
+                   dci->dai[0].val,
+                   dci_ind->n_CCE,dci_ind->N_CCE,
+                   frame,slot);
+
     dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH;
     LOG_D(MAC,"(nr_ue_procedures.c) pdu_type=%d\n\n",dl_config->dl_config_list[dl_config->number_pdus].pdu_type);
             
@@ -1128,22 +1205,1176 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
 
 }
 
-int8_t nr_ue_get_SR(module_id_t module_idP, int CC_id, frame_t frameP, uint8_t eNB_id, uint16_t rnti, sub_frame_t subframe){
+void set_harq_status(NR_UE_MAC_INST_t *mac,
+                     uint8_t pucch_id,
+                     uint8_t harq_id,
+                     int8_t delta_pucch,
+                     uint8_t data_toul_fb,
+                     uint8_t dai,
+                     int n_CCE,
+                     int N_CCE,
+                     frame_t frame,
+                     int slot) {
+
+  NR_UE_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[harq_id];
+
+  current_harq->active = true;
+  current_harq->ack_received = false;
+  current_harq->pucch_resource_indicator = pucch_id;
+  current_harq->feedback_to_ul = data_toul_fb;
+  current_harq->dai = dai;
+  current_harq->n_CCE = n_CCE;
+  current_harq->N_CCE = N_CCE;
+  current_harq->delta_pucch = delta_pucch;
+  // FIXME k0 != 0 currently not taken into consideration
+  current_harq->dl_frame = frame;
+  current_harq->dl_slot = slot;
+
+}
+
+
+void update_harq_status(nr_downlink_indication_t *dl_info, int pdu_id) {
+
+  NR_UE_MAC_INST_t *mac = get_mac_inst(dl_info->module_id);
+  uint8_t harq_pid = dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.harq_pid;
+  NR_UE_HARQ_STATUS_t *current_harq = &mac->dl_harq_info[harq_pid];
+
+  if (current_harq->active) {
+    current_harq->ack = dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.ack_nack;
+    current_harq->ack_received = true;
+  }
+  else {
+    //shouldn't get here
+    LOG_E(MAC, "Trying to process acknack for an inactive harq process (%d)\n", harq_pid);
+  }
+}
+
+
+void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
+                           int slot,
+                           uint16_t rnti,
+                           PUCCH_sched_t *pucch,
+                           fapi_nr_ul_config_pucch_pdu *pucch_pdu,
+                           int O_SR, int O_ACK, int O_CSI) {
+
+  int O_CRC = 0; //FIXME
+  uint16_t O_uci = O_CSI + O_ACK;
+  NR_BWP_Id_t bwp_id = mac->UL_BWP_Id;
+  NR_PUCCH_FormatConfig_t *pucchfmt;
+  long *pusch_id = NULL;
+  long *id0 = NULL;
+  int scs;
+  NR_BWP_UplinkCommon_t *initialUplinkBWP;
+  if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
+  else          initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
+  NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
+  if (mac->cg && ubwp &&
+      mac->cg->spCellConfig &&
+      mac->cg->spCellConfig->spCellConfigDedicated &&
+      mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+      mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
+    scs = ubwp->bwp_Common->genericParameters.subcarrierSpacing;
+  }
+  else
+    scs = initialUplinkBWP->genericParameters.subcarrierSpacing;
+
+  int subframe_number = slot / (nr_slots_per_frame[scs]/10);
+  nb_pucch_format_4_in_subframes[subframe_number] = 0;
+
+  pucch_pdu->rnti = rnti;
+
+  // configure pucch from Table 9.2.1-1
+  if (pucch->initial_pucch_id > -1 &&
+      pucch->pucch_resource == NULL) {
+
+    pucch_pdu->format_type = initial_pucch_resource[pucch->initial_pucch_id].format;
+    pucch_pdu->start_symbol_index = initial_pucch_resource[pucch->initial_pucch_id].startingSymbolIndex;
+    pucch_pdu->nr_of_symbols = initial_pucch_resource[pucch->initial_pucch_id].nrofSymbols;
+
+    pucch_pdu->bwp_size = NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth,
+                                   MAX_BWP_SIZE);
+    pucch_pdu->bwp_start = NRRIV2PRBOFFSET(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth,
+                                           MAX_BWP_SIZE);
+
+    pucch_pdu->prb_size = 1; // format 0 or 1
+    int RB_BWP_offset;
+    if (pucch->initial_pucch_id == 15)
+      RB_BWP_offset = pucch_pdu->bwp_size>>2;
+    else
+      RB_BWP_offset = initial_pucch_resource[pucch->initial_pucch_id].PRB_offset;
+
+    int N_CS = initial_pucch_resource[pucch->initial_pucch_id].nb_CS_indexes;
+    pucch_pdu->prb_start = RB_BWP_offset + (pucch->initial_pucch_id/N_CS);
+    if (pucch->initial_pucch_id>>3 == 0) {
+      pucch_pdu->second_hop_prb = pucch_pdu->bwp_size - 1 - RB_BWP_offset - (pucch->initial_pucch_id/N_CS);
+      pucch_pdu->initial_cyclic_shift = initial_pucch_resource[pucch->initial_pucch_id].initial_CS_indexes[pucch->initial_pucch_id%N_CS];
+    }
+    else {
+      pucch_pdu->second_hop_prb = pucch_pdu->bwp_size - 1 - RB_BWP_offset - ((pucch->initial_pucch_id - 8)/N_CS);
+      pucch_pdu->initial_cyclic_shift =  initial_pucch_resource[pucch->initial_pucch_id].initial_CS_indexes[(pucch->initial_pucch_id - 8)%N_CS];
+    }
+    pucch_pdu->freq_hop_flag = 1;
+    pucch_pdu->time_domain_occ_idx = 0;
+
+    if (O_SR == 0 || pucch->sr_payload == 0) {  /* only ack is transmitted TS 36.213 9.2.3 UE procedure for reporting HARQ-ACK */
+      if (O_ACK == 1)
+        pucch_pdu->mcs = sequence_cyclic_shift_1_harq_ack_bit[pucch->ack_payload & 0x1];   /* only harq of 1 bit */
+      else
+        pucch_pdu->mcs = sequence_cyclic_shift_2_harq_ack_bits[pucch->ack_payload & 0x3];  /* only harq with 2 bits */
+    }
+    else { /* SR + eventually ack are transmitted TS 36.213 9.2.5.1 UE procedure for multiplexing HARQ-ACK or CSI and SR */
+      if (pucch->sr_payload == 1) {                /* positive scheduling request */
+        if (O_ACK == 1)
+          pucch_pdu->mcs = sequence_cyclic_shift_1_harq_ack_bit_positive_sr[pucch->ack_payload & 0x1];   /* positive SR and harq of 1 bit */
+        else if (O_ACK == 2)
+          pucch_pdu->mcs = sequence_cyclic_shift_2_harq_ack_bits_positive_sr[pucch->ack_payload & 0x3];  /* positive SR and harq with 2 bits */
+        else
+          pucch_pdu->mcs = 0;  /* only positive SR */
+      }
+    }
+
+    // TODO verify if SR can be transmitted in this mode
+    pucch_pdu->payload = (pucch->sr_payload << O_ACK) | pucch->ack_payload;
+
+  }
+  else if (pucch->pucch_resource != NULL) {
+
+    NR_PUCCH_Resource_t *pucchres = pucch->pucch_resource;
+
+    if (mac->cg &&
+        mac->cg->physicalCellGroupConfig &&
+        (mac->cg->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUCCH != NULL ||
+        mac->cg->physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook != 1)) {
+      LOG_E(PHY,"PUCCH Unsupported cell group configuration : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
+      return;
+    }
+    else if (mac->cg &&
+             mac->cg->spCellConfig &&
+             mac->cg->spCellConfig->spCellConfigDedicated &&
+             mac->cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig &&
+             mac->cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup &&
+             mac->cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup->codeBlockGroupTransmission != NULL) {
+      LOG_E(MAC,"PUCCH Unsupported code block group for serving cell config : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
+      return;
+    }
+    NR_PUCCH_Config_t *pucch_Config;
+    if (bwp_id>0 &&
+        mac->ULbwp[bwp_id-1] &&
+        mac->ULbwp[bwp_id-1]->bwp_Dedicated &&
+        mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
+        mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup) {
+      NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup;
+      pusch_id = pusch_Config->dataScramblingIdentityPUSCH;
+      if (pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA != NULL)
+        id0 = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup->transformPrecodingDisabled->scramblingID0;
+      else if (pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB != NULL)
+        id0 = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->transformPrecodingDisabled->scramblingID0;
+      else *id0 = mac->physCellId;
+      pucch_Config =  mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup;
+      pucch_pdu->bwp_size = NRRIV2BW(mac->ULbwp[bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
+      pucch_pdu->bwp_start = NRRIV2PRBOFFSET(mac->ULbwp[bwp_id-1]->bwp_Common->genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
+    }
+    else if (bwp_id==0 &&
+             mac->cg &&
+             mac->cg->spCellConfig &&
+             mac->cg->spCellConfig->spCellConfigDedicated &&
+             mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+             mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
+             mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
+             mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
+      pucch_Config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
+      pucch_pdu->bwp_size = NRRIV2BW(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
+      pucch_pdu->bwp_start = NRRIV2PRBOFFSET(mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters.locationAndBandwidth,MAX_BWP_SIZE);
+    }
+    else AssertFatal(1==0,"no pucch_Config\n");
+
+    NR_PUCCH_ConfigCommon_t *pucch_ConfigCommon;
+    if (mac->scc) pucch_ConfigCommon = mac->scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup;
+    else          pucch_ConfigCommon = mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pucch_ConfigCommon->choice.setup;
+    if (pucch_ConfigCommon->hoppingId != NULL)
+      pucch_pdu->hopping_id = *pucch_ConfigCommon->hoppingId;
+    else
+      pucch_pdu->hopping_id = mac->physCellId;
+
+    switch (pucch_ConfigCommon->pucch_GroupHopping){
+      case 0 :
+      // if neither, both disabled
+      pucch_pdu->group_hop_flag = 0;
+      pucch_pdu->sequence_hop_flag = 0;
+      break;
+    case 1 :
+      // if enable, group enabled
+      pucch_pdu->group_hop_flag = 1;
+      pucch_pdu->sequence_hop_flag = 0;
+      break;
+    case 2 :
+      // if disable, sequence disabled
+      pucch_pdu->group_hop_flag = 0;
+      pucch_pdu->sequence_hop_flag = 1;
+      break;
+    default:
+      AssertFatal(1==0,"Group hopping flag undefined (0,1,2) \n");
+    }
+
+    pucch_pdu->prb_start = pucchres->startingPRB;
+    pucch_pdu->freq_hop_flag = pucchres->intraSlotFrequencyHopping!= NULL ?  1 : 0;
+    pucch_pdu->second_hop_prb = pucchres->secondHopPRB!= NULL ?  *pucchres->secondHopPRB : 0;
+    pucch_pdu->prb_size = 1; // format 0 or 1
+
+    if ((O_SR+O_CSI+O_SR) > (sizeof(uint64_t)*8)) {
+      LOG_E(MAC,"PUCCH number of UCI bits exceeds payload size : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
+      return;
+    }
+    pucch_pdu->payload = (pucch->csi_part1_payload << (O_ACK + O_SR)) |  (pucch->sr_payload << O_ACK) | pucch->ack_payload;
+
+    switch(pucchres->format.present) {
+      case NR_PUCCH_Resource__format_PR_format0 :
+        pucch_pdu->format_type = 0;
+        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;
+        if (O_SR == 0 || pucch->sr_payload == 0) {  /* only ack is transmitted TS 36.213 9.2.3 UE procedure for reporting HARQ-ACK */
+          if (O_ACK == 1)
+            pucch_pdu->mcs = sequence_cyclic_shift_1_harq_ack_bit[pucch->ack_payload & 0x1];   /* only harq of 1 bit */
+          else
+            pucch_pdu->mcs = sequence_cyclic_shift_2_harq_ack_bits[pucch->ack_payload & 0x3];  /* only harq with 2 bits */
+        }
+        else { /* SR + eventually ack are transmitted TS 36.213 9.2.5.1 UE procedure for multiplexing HARQ-ACK or CSI and SR */
+          if (pucch->sr_payload == 1) {                /* positive scheduling request */
+            if (O_ACK == 1)
+              pucch_pdu->mcs = sequence_cyclic_shift_1_harq_ack_bit_positive_sr[pucch->ack_payload & 0x1];   /* positive SR and harq of 1 bit */
+            else if (O_ACK == 2)
+              pucch_pdu->mcs = sequence_cyclic_shift_2_harq_ack_bits_positive_sr[pucch->ack_payload & 0x3];  /* positive SR and harq with 2 bits */
+            else
+              pucch_pdu->mcs = 0;  /* only positive SR */
+          }
+        }
+        break;
+      case NR_PUCCH_Resource__format_PR_format1 :
+        pucch_pdu->format_type = 1;
+        pucch_pdu->initial_cyclic_shift = pucchres->format.choice.format1->initialCyclicShift;
+        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;
+        break;
+      case NR_PUCCH_Resource__format_PR_format2 :
+        pucch_pdu->format_type = 2;
+        pucch_pdu->n_bit = O_uci+O_SR;
+        pucch_pdu->nr_of_symbols = pucchres->format.choice.format2->nrofSymbols;
+        pucch_pdu->start_symbol_index = pucchres->format.choice.format2->startingSymbolIndex;
+        pucch_pdu->data_scrambling_id = pusch_id!= NULL ? *pusch_id : mac->physCellId;
+        pucch_pdu->dmrs_scrambling_id = id0!= NULL ? *id0 : mac->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);
+        break;
+      case NR_PUCCH_Resource__format_PR_format3 :
+        pucch_pdu->format_type = 3;
+        pucch_pdu->n_bit = O_uci+O_SR;
+        pucch_pdu->nr_of_symbols = pucchres->format.choice.format3->nrofSymbols;
+        pucch_pdu->start_symbol_index = pucchres->format.choice.format3->startingSymbolIndex;
+        pucch_pdu->data_scrambling_id = pusch_id!= NULL ? *pusch_id : mac->physCellId;
+        if (pucch_Config->format3 == NULL) {
+          pucch_pdu->pi_2bpsk = 0;
+          pucch_pdu->add_dmrs_flag = 0;
+        }
+        else {
+          pucchfmt = pucch_Config->format3->choice.setup;
+          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);
+        break;
+      case NR_PUCCH_Resource__format_PR_format4 :
+        pucch_pdu->format_type = 4;
+        pucch_pdu->nr_of_symbols = pucchres->format.choice.format4->nrofSymbols;
+        pucch_pdu->start_symbol_index = pucchres->format.choice.format4->startingSymbolIndex;
+        pucch_pdu->pre_dft_occ_len = pucchres->format.choice.format4->occ_Length;
+        pucch_pdu->pre_dft_occ_idx = pucchres->format.choice.format4->occ_Index;
+        pucch_pdu->data_scrambling_id = pusch_id!= NULL ? *pusch_id : mac->physCellId;
+        if (pucch_Config->format3 == NULL) {
+          pucch_pdu->pi_2bpsk = 0;
+          pucch_pdu->add_dmrs_flag = 0;
+        }
+        else {
+          pucchfmt = pucch_Config->format3->choice.setup;
+          pucch_pdu->pi_2bpsk = pucchfmt->pi2BPSK!= NULL ?  1 : 0;
+          pucch_pdu->add_dmrs_flag = pucchfmt->additionalDMRS!= NULL ?  1 : 0;
+        }
+        break;
+      default :
+        AssertFatal(1==0,"Undefined PUCCH format \n");
+    }
+    pucch_pdu->pucch_tx_power = get_pucch_tx_power_ue(mac,
+                                                      pucch_Config,
+                                                      pucch,
+                                                      pucch_pdu->format_type,
+                                                      pucch_pdu->prb_size,
+                                                      pucch_pdu->freq_hop_flag,
+                                                      pucch_pdu->add_dmrs_flag,
+                                                      pucch_pdu->nr_of_symbols,
+                                                      subframe_number,
+                                                      O_ACK, O_SR,
+                                                      O_CSI, O_CRC);
+  }
+}
+
+
+int16_t get_pucch_tx_power_ue(NR_UE_MAC_INST_t *mac,
+                              NR_PUCCH_Config_t *pucch_Config,
+                              PUCCH_sched_t *pucch,
+                              uint8_t format_type,
+                              uint16_t nb_of_prbs,
+                              uint8_t  freq_hop_flag,
+                              uint8_t  add_dmrs_flag,
+                              uint8_t N_symb_PUCCH,
+                              int subframe_number,
+                              int O_ACK, int O_SR,
+                              int O_CSI, int O_CRC) {
+
+  int PUCCH_POWER_DEFAULT = 0;
+  int16_t P_O_NOMINAL_PUCCH;
+  if (mac->scc) P_O_NOMINAL_PUCCH = *mac->scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup->p0_nominal;
+  else          P_O_NOMINAL_PUCCH = *mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pucch_ConfigCommon->choice.setup->p0_nominal;
+
+  struct NR_PUCCH_PowerControl *power_config = pucch_Config->pucch_PowerControl;
+
+  if (!power_config)
+    return (PUCCH_POWER_DEFAULT);
+
+  int16_t P_O_UE_PUCCH;
+  int16_t G_b_f_c = 0;
+
+  if (pucch_Config->spatialRelationInfoToAddModList != NULL) {  /* FFS TODO NR */
+    LOG_D(MAC,"PUCCH Spatial relation infos are not yet implemented : at line %d in function %s of file %s \n", LINE_FILE , __func__, __FILE__);
+    return (PUCCH_POWER_DEFAULT);
+  }
+
+  if (power_config->p0_Set != NULL) {
+    P_O_UE_PUCCH = power_config->p0_Set->list.array[0]->p0_PUCCH_Value; /* get from index 0 if no spatial relation set */
+    G_b_f_c = 0;
+  }
+  else {
+    G_b_f_c = pucch->delta_pucch;
+    LOG_D(MAC,"PUCCH Transmit power control command not yet implemented for NR : at line %d in function %s of file %s \n", LINE_FILE , __func__, __FILE__);
+    return (PUCCH_POWER_DEFAULT);
+  }
+
+  int P_O_PUCCH = P_O_NOMINAL_PUCCH + P_O_UE_PUCCH;
+
+  int16_t delta_F_PUCCH;
+  int DELTA_TF;
+  uint16_t N_ref_PUCCH;
+  int N_sc_ctrl_RB = 0;
+
+  /* computing of pucch transmission power adjustment */
+  switch (format_type) {
+    case 0:
+      N_ref_PUCCH = 2;
+      DELTA_TF = 10 * log10(N_ref_PUCCH/N_symb_PUCCH);
+      delta_F_PUCCH =  *power_config->deltaF_PUCCH_f0;
+      break;
+    case 1:
+      N_ref_PUCCH = 14;
+      DELTA_TF = 10 * log10(N_ref_PUCCH/N_symb_PUCCH);
+      delta_F_PUCCH =  *power_config->deltaF_PUCCH_f1;
+      break;
+    case 2:
+      N_sc_ctrl_RB = 10;
+      DELTA_TF = get_deltatf(nb_of_prbs,
+                             N_symb_PUCCH,
+                             freq_hop_flag,
+                             add_dmrs_flag,
+                             N_sc_ctrl_RB,
+                             pucch->n_HARQ_ACK,
+                             O_ACK, O_SR,
+                             O_CSI, O_CRC);
+      delta_F_PUCCH =  *power_config->deltaF_PUCCH_f2;
+      break;
+    case 3:
+      N_sc_ctrl_RB = 14;
+      DELTA_TF = get_deltatf(nb_of_prbs,
+                             N_symb_PUCCH,
+                             freq_hop_flag,
+                             add_dmrs_flag,
+                             N_sc_ctrl_RB,
+                             pucch->n_HARQ_ACK,
+                             O_ACK, O_SR,
+                             O_CSI, O_CRC);
+      delta_F_PUCCH =  *power_config->deltaF_PUCCH_f3;
+      break;
+    case 4:
+      N_sc_ctrl_RB = 14/(nb_pucch_format_4_in_subframes[subframe_number]);
+      DELTA_TF = get_deltatf(nb_of_prbs,
+                             N_symb_PUCCH,
+                             freq_hop_flag,
+                             add_dmrs_flag,
+                             N_sc_ctrl_RB,
+                             pucch->n_HARQ_ACK,
+                             O_ACK, O_SR,
+                             O_CSI, O_CRC);
+      delta_F_PUCCH =  *power_config->deltaF_PUCCH_f4;
+      break;
+    default:
+    {
+      LOG_E(MAC,"PUCCH unknown pucch format : at line %d in function %s of file %s \n", LINE_FILE , __func__, __FILE__);
+      return (0);
+    }
+  }
+
+  if (*power_config->twoPUCCH_PC_AdjustmentStates > 1) {
+    LOG_E(MAC,"PUCCH power control adjustment states with 2 states not yet implemented : at line %d in function %s of file %s \n", LINE_FILE , __func__, __FILE__);
+    return (PUCCH_POWER_DEFAULT);
+  }
+
+  int16_t pucch_power = P_O_PUCCH + delta_F_PUCCH + DELTA_TF + G_b_f_c;
+
+  NR_TST_PHY_PRINTF("PUCCH ( Tx power : %d dBm ) ( 10Log(...) : %d ) ( from Path Loss : %d ) ( delta_F_PUCCH : %d ) ( DELTA_TF : %d ) ( G_b_f_c : %d ) \n",
+                    pucch_power, contributor, PL, delta_F_PUCCH, DELTA_TF, G_b_f_c);
+
+  return (pucch_power);
+}
+
+int get_deltatf(uint16_t nb_of_prbs,
+                uint8_t N_symb_PUCCH,
+                uint8_t freq_hop_flag,
+                uint8_t add_dmrs_flag,
+                int N_sc_ctrl_RB,
+                int n_HARQ_ACK,
+                int O_ACK, int O_SR,
+                int O_CSI, int O_CRC){
+
+  int DELTA_TF;
+  int O_UCI = O_ACK + O_SR + O_CSI + O_CRC;
+  int N_symb = nb_symbols_excluding_dmrs[N_symb_PUCCH-4][add_dmrs_flag][freq_hop_flag];
+  float N_RE = nb_of_prbs * N_sc_ctrl_RB * N_symb;
+  float K1 = 6;
+  if (O_UCI < 12)
+    DELTA_TF = 10 * log10((double)(((K1 * (n_HARQ_ACK + O_SR + O_CSI))/N_RE)));
+  else {
+    float K2 = 2.4;
+    float BPRE = O_UCI/N_RE;
+    DELTA_TF = 10 * log10((double)(pow(2,(K2*BPRE)) - 1));
+  }
+  return DELTA_TF;
+}
+
+/*******************************************************************
+*
+* NAME :         find_pucch_resource_set
+*
+* PARAMETERS :   ue context
+*                gNB_id identifier
+*
+*
+* RETURN :       harq process identifier
+*
+* DESCRIPTION :  return tx harq process identifier for given transmission slot
+*                YS 38.213 9.2.2  PUCCH Formats for UCI transmission
+*
+*********************************************************************/
+
+int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, int uci_size) {
+  int pucch_resource_set_id = 0;
+  NR_BWP_Id_t bwp_id = mac->DL_BWP_Id;
+
+  //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
+    -- chooses the first of its PUCCH-ResourceSet which supports the number of bits that the UE wants to transmit.
+    -- The field is not present in the first set (Set0) since the maximum Size of Set0 is specified to be 3 bit.
+    -- The field is not present in the last configured set since the UE derives its maximum payload size as specified in 38.213.
+    -- This field can take integer values that are multiples of 4. Corresponds to L1 parameter 'N_2' or 'N_3' (see 38.213, section 9.2)
+  */
+  /* 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 ((bwp_id>0 &&
+         mac->ULbwp[bwp_id-1] &&
+         mac->ULbwp[bwp_id-1]->bwp_Dedicated &&
+         mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
+         mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup &&
+         mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList &&
+         mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL) ||
+        (bwp_id==0 &&
+         mac->cg &&
+         mac->cg->spCellConfig &&
+         mac->cg->spCellConfig->spCellConfigDedicated &&
+         mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+         mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
+         mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
+         mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup &&
+         mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList &&
+         mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL)) {
+      if (uci_size <= 2) {
+        pucch_resource_set_id = 0;
+        return (pucch_resource_set_id);
+        break;
+      }
+      else {
+        pucch_resource_set_id = 1;
+        return (pucch_resource_set_id);
+        break;
+      }
+    }
+    pucch_resource_set_id++;
+  }
+
+  pucch_resource_set_id = MAX_NB_OF_PUCCH_RESOURCE_SETS;
+
+  return (pucch_resource_set_id);
+}
+
+
+/*******************************************************************
+*
+* NAME :         select_pucch_format
+*
+* PARAMETERS :   ue context
+*                processing slots of reception/transmission
+*                gNB_id identifier
+*
+* RETURN :       TRUE a valid resource has been found
+*
+* DESCRIPTION :  return tx harq process identifier for given transmission slot
+*                TS 38.213 9.2.1  PUCCH Resource Sets
+*                TS 38.213 9.2.2  PUCCH Formats for UCI transmission
+*                In the case of pucch for scheduling request only, resource is already get from scheduling request configuration
+*
+*********************************************************************/
+
+void select_pucch_resource(NR_UE_MAC_INST_t *mac,
+                           PUCCH_sched_t *pucch) {
+
+  NR_PUCCH_ResourceId_t *current_resource_id = NULL;
+  NR_BWP_Id_t bwp_id = mac->UL_BWP_Id;
+  int n_list;
+
+  if ((bwp_id == 0 &&
+       mac->cg == NULL) ||
+      (bwp_id == 0 &&
+       mac->cg &&
+       mac->cg->spCellConfig &&
+       mac->cg->spCellConfig->spCellConfigDedicated &&
+       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
+       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
+       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup &&
+       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList &&
+       mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList->list.array[0] == NULL) ||
+      (mac->ULbwp[bwp_id-1] &&
+       mac->ULbwp[bwp_id-1]->bwp_Dedicated &&
+       mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
+       mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup &&
+       mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList &&
+       mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[0] == NULL)
+      ){
+
+    /* see TS 38.213 9.2.1  PUCCH Resource Sets */
+    int delta_PRI = pucch->resource_indicator;
+    int n_CCE_0 = pucch->n_CCE;
+    int N_CCE_0 = pucch->N_CCE;
+    if (N_CCE_0 == 0) {
+      AssertFatal(1==0,"PUCCH No compatible pucch format found : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
+    }
+    int r_PUCCH = ((2 * n_CCE_0)/N_CCE_0) + (2 * delta_PRI);
+    pucch->initial_pucch_id = r_PUCCH;
+    pucch->pucch_resource = NULL;
+  }
+  else {
+    struct NR_PUCCH_Config__resourceSetToAddModList *resourceSetToAddModList = NULL;
+    struct NR_PUCCH_Config__resourceToAddModList *resourceToAddModList = NULL;
+    if (bwp_id > 0 && mac->ULbwp[bwp_id-1]) {
+      AssertFatal(mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList!=NULL,
+                  "mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList is null\n");
+      resourceSetToAddModList = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList;
+      resourceToAddModList = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceToAddModList;
+    }
+    else if (bwp_id == 0 && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList!=NULL) {
+      resourceSetToAddModList = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList;
+      resourceToAddModList = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceToAddModList;
+    }
+
+    n_list = resourceSetToAddModList->list.count;
+    if (pucch->resource_set_id > n_list) {
+      LOG_E(MAC,"Invalid PUCCH resource set id %d\n",pucch->resource_set_id);
+      pucch->pucch_resource = NULL;
+      return;
+    }
+    n_list = resourceSetToAddModList->list.array[pucch->resource_set_id]->resourceList.list.count;
+    if (pucch->resource_indicator > n_list) {
+      LOG_E(MAC,"Invalid PUCCH resource id %d\n",pucch->resource_indicator);
+      pucch->pucch_resource = NULL;
+      return;
+    }
+    current_resource_id = resourceSetToAddModList->list.array[pucch->resource_set_id]->resourceList.list.array[pucch->resource_indicator];
+    n_list = resourceToAddModList->list.count;
+    int res_found = 0;
+    for (int i=0; i<n_list; i++) {
+      if (resourceToAddModList->list.array[i]->pucch_ResourceId == *current_resource_id) {
+        pucch->pucch_resource = resourceToAddModList->list.array[i];
+        res_found = 1;
+        break;
+      }
+    }
+    if (res_found == 0) {
+      LOG_E(MAC,"Couldn't find PUCCH Resource\n");
+      pucch->pucch_resource = NULL;
+    }
+  }
+}
+
+/*******************************************************************
+*
+* NAME :         get_downlink_ack
+*
+* PARAMETERS :   ue context
+*                processing slots of reception/transmission
+*                gNB_id identifier
+*
+* RETURN :       o_ACK acknowledgment data
+*                o_ACK_number_bits number of bits for acknowledgment
+*
+* DESCRIPTION :  return acknowledgment value
+*                TS 38.213 9.1.3 Type-2 HARQ-ACK codebook determination
+*
+*          --+--------+-------+--------+-------+---  ---+-------+--
+*            | PDCCH1 |       | PDCCH2 |PDCCH3 |        | PUCCH |
+*          --+--------+-------+--------+-------+---  ---+-------+--
+*    DAI_DL      1                 2       3              ACK for
+*                V                 V       V        PDCCH1, PDDCH2 and PCCH3
+*                |                 |       |               ^
+*                +-----------------+-------+---------------+
+*
+*                PDCCH1, PDCCH2 and PDCCH3 are PDCCH monitoring occasions
+*                M is the total of monitoring occasions
+*
+*********************************************************************/
+
+uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
+                         frame_t frame,
+                         int slot,
+                         PUCCH_sched_t *pucch) {
+
+
+  uint32_t ack_data[NR_DL_MAX_NB_CW][NR_DL_MAX_DAI] = {{0},{0}};
+  uint32_t dai[NR_DL_MAX_NB_CW][NR_DL_MAX_DAI] = {{0},{0}};       /* for serving cell */
+  uint32_t dai_total[NR_DL_MAX_NB_CW][NR_DL_MAX_DAI] = {{0},{0}}; /* for multiple cells */
+  int number_harq_feedback = 0;
+  uint32_t dai_current = 0;
+  uint32_t dai_max = 0;
+  bool two_transport_blocks = FALSE;
+  int number_of_code_word = 1;
+  int U_DAI_c = 0;
+  int N_m_c_rx = 0;
+  int V_DAI_m_DL = 0;
+  NR_UE_HARQ_STATUS_t *current_harq;
+  int sched_frame,sched_slot;
+  NR_BWP_UplinkCommon_t *initialUplinkBWP;
+  if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
+  else          initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
+  int slots_per_frame,scs;
+
+  if (mac->DLbwp[0] &&
+      mac->DLbwp[0]->bwp_Dedicated &&
+      mac->DLbwp[0]->bwp_Dedicated->pdsch_Config &&
+      mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup &&
+      mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI[0] == 2) {
+    two_transport_blocks = TRUE;
+    number_of_code_word = 2;
+  }
+  else {
+    number_of_code_word = 1;
+  }
 
+  NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
+  if (mac->cg && ubwp &&
+      mac->cg->spCellConfig &&
+      mac->cg->spCellConfig->spCellConfigDedicated &&
+      mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+      mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
+    scs = ubwp->bwp_Common->genericParameters.subcarrierSpacing;
+  }
+  else
+    scs = initialUplinkBWP->genericParameters.subcarrierSpacing;
+
+  slots_per_frame = nr_slots_per_frame[scs];
+
+  /* look for dl acknowledgment which should be done on current uplink slot */
+  for (int code_word = 0; code_word < number_of_code_word; code_word++) {
+
+    for (int dl_harq_pid = 0; dl_harq_pid < 16; dl_harq_pid++) {
+
+      current_harq = &mac->dl_harq_info[dl_harq_pid];
+
+      if (current_harq->active) {
+
+        sched_slot = current_harq->dl_slot + current_harq->feedback_to_ul;
+        sched_frame = current_harq->dl_frame;
+        if (sched_slot>=slots_per_frame){
+          sched_slot %= slots_per_frame;
+          sched_frame++;
+        }
+
+        /* check if current tx slot should transmit downlink acknowlegment */
+        if (sched_frame == frame && sched_slot == slot) {
+
+          if (current_harq->dai > NR_DL_MAX_DAI) {
+            LOG_E(MAC,"PUCCH Downlink DAI has an invalid value : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
+          }
+          else {
+
+            if ((pucch->resource_indicator != -1) && (pucch->resource_indicator != current_harq->pucch_resource_indicator))
+              LOG_E(MAC, "Value of pucch_resource_indicator %d not matching with what set before %d (Possibly due to a false DCI) \n",
+                    current_harq->pucch_resource_indicator,pucch->resource_indicator);
+            else{
+              dai_current = current_harq->dai+1; // DCI DAI to counter DAI conversion
+
+              if (dai_current == 0) {
+                LOG_E(MAC,"PUCCH Downlink dai is invalid : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
+                return(0);
+              } else if (dai_current > dai_max) {
+                dai_max = dai_current;
+              }
+
+              number_harq_feedback++;
+              if (current_harq->ack_received)
+                ack_data[code_word][dai_current - 1] = current_harq->ack;
+              else
+                ack_data[code_word][dai_current - 1] = 0;
+              dai[code_word][dai_current - 1] = dai_current;
+
+              pucch->resource_indicator = current_harq->pucch_resource_indicator;
+              pucch->n_CCE = current_harq->n_CCE;
+              pucch->N_CCE = current_harq->N_CCE;
+              pucch->delta_pucch = current_harq->delta_pucch;
+              current_harq->active = false;
+              current_harq->ack_received = false;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  /* no any ack to transmit */
+  if (number_harq_feedback == 0) {
+    pucch->n_HARQ_ACK = 0;
+    return(0);
+  }
+  else  if (number_harq_feedback > (sizeof(uint32_t)*8)) {
+    LOG_E(MAC,"PUCCH number of ack bits exceeds payload size : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
+    return(0);
+  }
+
+  /* for computing n_HARQ_ACK for power */
+  V_DAI_m_DL = dai_max;
+  U_DAI_c = number_harq_feedback/number_of_code_word;
+  N_m_c_rx = number_harq_feedback;
+  int N_SPS_c = 0; /* FFS TODO_NR multicells and SPS are not supported at the moment */
+  if (mac->cg != NULL &&
+      mac->cg->physicalCellGroupConfig != NULL &&
+      mac->cg->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUCCH != NULL) {
+    int N_TB_max_DL = mac->DLbwp[0]->bwp_Dedicated->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI[0];
+    pucch->n_HARQ_ACK = (((V_DAI_m_DL - U_DAI_c)%4) * N_TB_max_DL) + N_m_c_rx + N_SPS_c;
+    NR_TST_PHY_PRINTF("PUCCH power n(%d) = ( V(%d) - U(%d) )mod4 * N_TB(%d) + N(%d) \n", pucch->n_HARQ_ACK, V_DAI_m_DL, U_DAI_c, N_TB_max_DL, N_m_c_rx);
+  }
+
+  /*
+  * For a monitoring occasion of a PDCCH with DCI format 1_0 or DCI format 1_1 in at least one serving cell,
+  * when a UE receives a PDSCH with one transport block and the value of higher layer parameter maxNrofCodeWordsScheduledByDCI is 2,
+  * the HARQ-ACK response is associated with the first transport block and the UE generates a NACK for the second transport block
+  * if spatial bundling is not applied (HARQ-ACK-spatial-bundling-PUCCH = FALSE) and generates HARQ-ACK value of ACK for the second
+  * transport block if spatial bundling is applied.
+  */
+
+  for (int code_word = 0; code_word < number_of_code_word; code_word++) {
+    for (uint32_t i = 0; i < dai_max ; i++ ) {
+      if (dai[code_word][i] != i + 1) { /* fill table with consistent value for each dai */
+        dai[code_word][i] = i + 1;      /* it covers case for which PDCCH DCI has not been successfully decoded and so it has been missed */
+        ack_data[code_word][i] = 0;     /* nack data transport block which has been missed */
+        number_harq_feedback++;
+      }
+      if (two_transport_blocks == TRUE) {
+        dai_total[code_word][i] = dai[code_word][i]; /* for a single cell, dai_total is the same as dai of first cell */
+      }
+    }
+  }
+
+  int M = dai_max;
+  int j = 0;
+  uint32_t V_temp = 0;
+  uint32_t V_temp2 = 0;
+  int O_ACK = 0;
+  int o_ACK = 0;
+  int O_bit_number_cw0 = 0;
+  int O_bit_number_cw1 = 0;
+
+  for (int m = 0; m < M ; m++) {
+
+    if (dai[0][m] <= V_temp) {
+      j = j + 1;
+    }
+
+    V_temp = dai[0][m]; /* value of the counter DAI for format 1_0 and format 1_1 on serving cell c */
+
+    if (dai_total[0][m] == 0) {
+      V_temp2 = dai[0][m];
+    } else {
+      V_temp2 = dai[1][m];         /* second code word has been received */
+      O_bit_number_cw1 = (8 * j) + 2*(V_temp - 1) + 1;
+      o_ACK = o_ACK | (ack_data[1][m] << O_bit_number_cw1);
+    }
+
+    if (two_transport_blocks == TRUE) {
+      O_bit_number_cw0 = (8 * j) + 2*(V_temp - 1);
+    }
+    else {
+      O_bit_number_cw0 = (4 * j) + (V_temp - 1);
+    }
+
+    o_ACK = o_ACK | (ack_data[0][m] << O_bit_number_cw0);
+  }
+
+  if (V_temp2 < V_temp) {
+    j = j + 1;
+  }
+
+  if (two_transport_blocks == TRUE) {
+    O_ACK = 2 * ( 4 * j + V_temp2);  /* for two transport blocks */
+  }
+  else {
+    O_ACK = 4 * j + V_temp2;         /* only one transport block */
+  }
+
+  if (number_harq_feedback != O_ACK) {
+    LOG_E(MAC,"PUCCH Error for number of bits for acknowledgment : at line %d in function %s of file %s \n", LINE_FILE , __func__, FILE_NAME);
+    return (0);
+  }
+
+  pucch->ack_payload = o_ACK;
+
+  return(number_harq_feedback);
+}
+
+
+bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac,
+                                         PUCCH_sched_t *pucch,
+                                         frame_t frame,
+                                         int slot) {
+
+  NR_BWP_Id_t bwp_id = mac->UL_BWP_Id;
+  NR_PUCCH_Config_t *pucch_Config = NULL;
+  int scs;
+  NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
+  NR_BWP_UplinkCommon_t *initialUplinkBWP;
+  if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
+  else          initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
+
+  if (mac->cg && ubwp &&
+      mac->cg->spCellConfig &&
+      mac->cg->spCellConfig->spCellConfigDedicated &&
+      mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+      mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
+    scs = ubwp->bwp_Common->genericParameters.subcarrierSpacing;
+  }
+  else
+    scs = initialUplinkBWP->genericParameters.subcarrierSpacing;
+
+  const int n_slots_frame = nr_slots_per_frame[scs];
+
+  if (bwp_id>0 &&
+      mac->ULbwp[bwp_id-1] &&
+      mac->ULbwp[bwp_id-1]->bwp_Dedicated &&
+      mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
+      mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup) {
+    pucch_Config =  mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup;
+  }
+  else if (bwp_id==0 &&
+           mac->cg &&
+           mac->cg->spCellConfig &&
+           mac->cg->spCellConfig->spCellConfigDedicated &&
+           mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+           mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
+           mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
+           mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
+    pucch_Config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
+  }
+  if(!pucch_Config || pucch_Config->schedulingRequestResourceToAddModList->list.count==0)
+    return false; // SR not configured
+
+  for (int SR_resource_id =0; SR_resource_id < pucch_Config->schedulingRequestResourceToAddModList->list.count;SR_resource_id++) {
+    NR_SchedulingRequestResourceConfig_t *SchedulingRequestResourceConfig = pucch_Config->schedulingRequestResourceToAddModList->list.array[SR_resource_id];
+    int SR_period; int SR_offset;
+
+    find_period_offest_SR(SchedulingRequestResourceConfig,&SR_period,&SR_offset);
+    int sfn_sf = frame * n_slots_frame + slot;
+
+    if ((sfn_sf - SR_offset) % SR_period == 0) {
+      LOG_D(MAC, "Scheduling Request active in frame %d slot %d \n", frame, slot);
+      NR_PUCCH_ResourceId_t *PucchResourceId = SchedulingRequestResourceConfig->resource;
+
+      int found = -1;
+      NR_PUCCH_ResourceSet_t *pucchresset = pucch_Config->resourceSetToAddModList->list.array[0]; // set with formats 0,1
+      int n_list = pucchresset->resourceList.list.count;
+       for (int i=0; i<n_list; i++) {
+        if (*pucchresset->resourceList.list.array[i] == *PucchResourceId ) {
+          found = i;
+          break;
+        }
+      }
+      if (found == -1) {
+        LOG_E(MAC,"Couldn't find PUCCH resource for SR\n");
+        return false;
+      }
+      pucch->resource_indicator = found;
+      return true;
+    }
+  }
+  return false;
+}
+
+
+int8_t nr_ue_get_SR(module_id_t module_idP, frame_t frameP, int slotP){
   return 0;
 }
 
-void nr_ue_send_sdu(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){
 
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_IN);
+uint8_t nr_get_csi_measurements(NR_UE_MAC_INST_t *mac,
+                                frame_t frame,
+                                int slot,
+                                PUCCH_sched_t *pucch) {
+
+  NR_BWP_Id_t bwp_id = mac->UL_BWP_Id;
+  NR_PUCCH_Config_t *pucch_Config = NULL;
+  int csi_bits = 0;
+
+  if(mac->cg &&
+     mac->cg->spCellConfig &&
+     mac->cg->spCellConfig->spCellConfigDedicated &&
+     mac->cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig) {
+
+    NR_CSI_MeasConfig_t *csi_measconfig = mac->cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
+
+    for (int csi_report_id = 0; csi_report_id < csi_measconfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
+      NR_CSI_ReportConfig_t *csirep = csi_measconfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
+
+      if(csirep->reportConfigType.present == NR_CSI_ReportConfig__reportConfigType_PR_periodic){
+        int period, offset;
+        csi_period_offset(csirep, NULL, &period, &offset);
+
+        int scs;
+        NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
+        NR_BWP_UplinkCommon_t *initialUplinkBWP;
+        if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
+        else          initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
+
+        if (ubwp &&
+            mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+            mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
+          scs = ubwp->bwp_Common->genericParameters.subcarrierSpacing;
+        else
+          scs = initialUplinkBWP->genericParameters.subcarrierSpacing;
+
+        if (bwp_id>0 &&
+            mac->ULbwp[bwp_id-1] &&
+            mac->ULbwp[bwp_id-1]->bwp_Dedicated &&
+            mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
+            mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup) {
+          pucch_Config =  mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup;
+        }
+        else if (bwp_id==0 &&
+                 mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+                 mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
+                 mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
+                 mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
+          pucch_Config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
+        }
 
-  #if defined(ENABLE_MAC_PAYLOAD_DEBUG)
-    LOG_T(MAC, "[UE %d] First 32 bytes of DLSCH : \n", module_idP);
-    for (i = 0; i < 32; i++) {
-      LOG_T(MAC, "%x.", sdu[i]);
+        const int n_slots_frame = nr_slots_per_frame[scs];
+        if (((n_slots_frame*frame + slot - offset)%period) == 0 && pucch_Config) {
+
+          NR_PUCCH_CSI_Resource_t *pucchcsires = csirep->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list.array[0];
+          NR_PUCCH_ResourceSet_t *pucchresset = pucch_Config->resourceSetToAddModList->list.array[1]; // set with formats >1
+          int n = pucchresset->resourceList.list.count;
+
+          int res_index;
+          int found = -1;
+          for (res_index = 0; res_index < n; res_index++) {
+            if (*pucchresset->resourceList.list.array[res_index] == pucchcsires->pucch_Resource) {
+              found = res_index;
+              break;
+            }
+          }
+          AssertFatal(found != -1,
+                      "CSI resource not found among PUCCH resources\n");
+
+          pucch->resource_indicator = found;
+          csi_bits = nr_get_csi_payload(mac, pucch, csi_measconfig);
+        }
+      }
+      else
+        AssertFatal(1==0,"Only periodic CSI reporting is currently implemented\n");
     }
-    LOG_T(MAC, "\n");
-  #endif
+  }
+
+  return csi_bits;
+}
+
+
+uint8_t nr_get_csi_payload(NR_UE_MAC_INST_t *mac,
+                           PUCCH_sched_t *pucch,
+                           NR_CSI_MeasConfig_t *csi_MeasConfig) {
+
+  int n_csi_bits = 0;
+
+  AssertFatal(csi_MeasConfig->csi_ReportConfigToAddModList->list.count>0,"No CSI Report configuration available\n");
+
+  for (int csi_report_id=0; csi_report_id < csi_MeasConfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
+    struct NR_CSI_ReportConfig *csi_reportconfig = csi_MeasConfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
+    NR_CSI_ResourceConfigId_t csi_ResourceConfigId = csi_reportconfig->resourcesForChannelMeasurement;
+    switch(csi_reportconfig->reportQuantity.present) {
+      case NR_CSI_ReportConfig__reportQuantity_PR_none:
+        break;
+      case NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP:
+        n_csi_bits += get_ssb_rsrp_payload(mac,pucch,csi_reportconfig,csi_ResourceConfigId,csi_MeasConfig);
+        break;
+      case NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP:
+      case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI:
+      case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1:
+      case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_i1_CQI:
+      case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_CQI:
+      case NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_LI_PMI_CQI:
+        AssertFatal(1==0,"Measurement report based on CSI-RS not availalble\n");
+      default:
+        AssertFatal(1==0,"Invalid CSI report quantity type %d\n",csi_reportconfig->reportQuantity.present);
+    }
+  }
+  return (n_csi_bits);
+}
+
+
+uint8_t get_ssb_rsrp_payload(NR_UE_MAC_INST_t *mac,
+                             PUCCH_sched_t *pucch,
+                             struct NR_CSI_ReportConfig *csi_reportconfig,
+                             NR_CSI_ResourceConfigId_t csi_ResourceConfigId,
+                             NR_CSI_MeasConfig_t *csi_MeasConfig) {
+
+  int nb_ssb = 0;  // nb of ssb in the resource
+  int nb_meas = 0; // nb of ssb to report measurements on
+  int bits = 0;
+  uint32_t temp_payload = 0;
+
+  for (int csi_resourceidx = 0; csi_resourceidx < csi_MeasConfig->csi_ResourceConfigToAddModList->list.count; csi_resourceidx++) {
+    struct NR_CSI_ResourceConfig *csi_resourceconfig = csi_MeasConfig->csi_ResourceConfigToAddModList->list.array[csi_resourceidx];
+    if (csi_resourceconfig->csi_ResourceConfigId == csi_ResourceConfigId) {
+
+      if (csi_reportconfig->groupBasedBeamReporting.present == NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled) {
+        if (csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS != NULL)
+          nb_meas = *(csi_reportconfig->groupBasedBeamReporting.choice.disabled->nrofReportedRS)+1;
+        else
+          nb_meas = 1;
+      } else
+        nb_meas = 2;
+
+      for (int 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_resourceconfig->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->csi_SSB_ResourceSetList->list.array[0])){
+
+          ///only one SSB resource set from spec 38.331 IE CSI-ResourceConfig
+          nb_ssb = csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list.array[csi_ssb_idx]->csi_SSB_ResourceList.list.count;
+          break;
+        }
+      }
+
+      AssertFatal(nb_ssb>0,"No SSB found in the resource set\n");
+      int ssbri_bits = ceil(log2(nb_ssb));
+
+      //TODO measurement of multiple SSBs at PHY and indication to MAC
+      if(nb_ssb>1)
+        LOG_E(MAC, "In current implementation only the SSB of synchronization is measured at PHY. This works only for a single SSB scenario\n");
+
+      int ssb_rsrp[2][nb_meas]; // the array contains index and RSRP of each SSB to be reported (nb_meas highest RSRPs)
+
+      //TODO replace the following 2 lines with a function to order the nb_meas highest SSB RSRPs
+      ssb_rsrp[0][0] = mac->mib_ssb;
+      ssb_rsrp[1][0] = mac->ssb_rsrp_dBm;
+
+      uint8_t ssbi;
+
+      if (ssbri_bits > 0) {
+        ssbi = ssb_rsrp[0][0];
+        reverse_n_bits(&ssbi, ssbri_bits);
+        temp_payload = ssbi;
+        bits += ssbri_bits;
+      }
+
+      uint8_t rsrp_idx = get_rsrp_index(ssb_rsrp[1][0]);
+      reverse_n_bits(&rsrp_idx, 7);
+      temp_payload |= (rsrp_idx<<bits);
+      bits += 7; // 7 bits for highest RSRP
+
+      // from the second SSB, differential report
+      for (int i=1; i<nb_meas; i++){
+        ssbi = ssb_rsrp[0][i];
+        reverse_n_bits(&ssbi, ssbri_bits);
+        temp_payload = ssbi;
+        bits += ssbri_bits;
+
+        rsrp_idx = get_rsrp_diff_index(ssb_rsrp[1][0],ssb_rsrp[1][i]);
+        reverse_n_bits(&rsrp_idx, 4);
+        temp_payload |= (rsrp_idx<<bits);
+        bits += 4; // 7 bits for highest RSRP
+      }
+      break; // resorce found
+    }
+  }
+  pucch->csi_part1_payload = temp_payload;
+  return bits;
+}
+
+
+// returns index from RSRP
+// according to Table 10.1.6.1-1 in 38.133
+
+uint8_t get_rsrp_index(int rsrp) {
+
+  int index = rsrp + 157;
+  if (rsrp>-44)
+    index = 113;
+  if (rsrp<-140)
+    index = 16;
+
+  return index;
+}
+
+
+// returns index from differential RSRP
+// according to Table 10.1.6.1-2 in 38.133
+uint8_t get_rsrp_diff_index(int best_rsrp,int current_rsrp) {
+
+  int diff = best_rsrp-current_rsrp;
+  if (diff>30)
+    return 15;
+  else
+    return (diff>>1);
+
+}
+
+void nr_ue_send_sdu(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){
+
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_IN);
 
   LOG_D(MAC, "In %s [%d.%d] Handling DLSCH PDU...\n", __FUNCTION__, dl_info->frame, dl_info->slot);
 
@@ -1267,9 +2498,10 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
       dci_pdu_rel15->format_indicator = (*dci_pdu>>(dci_size-pos))&1;
 
       //switch to DCI_0_0
-      if (dci_pdu_rel15->format_indicator == 0)
+      if (dci_pdu_rel15->format_indicator == 0) {
+        dci_pdu_rel15 = &mac->def_dci_pdu_rel15[NR_UL_DCI_FORMAT_0_0];
         return 2+nr_extract_dci_info(mac, NR_UL_DCI_FORMAT_0_0, dci_size, rnti, dci_pdu, dci_pdu_rel15);
-
+      }
 #ifdef DEBUG_EXTRACT_DCI
       LOG_D(MAC,"Format indicator %d (%d bits) N_RB_BWP %d => %d (0x%lx)\n",dci_pdu_rel15->format_indicator,1,N_RB,dci_size-pos,*dci_pdu);
 #endif
@@ -1461,10 +2693,16 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
       if (mac->DLbwp[0]) N_RB=NRRIV2BW(mac->DLbwp[0]->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
       else         N_RB=NRRIV2BW(mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
 
-      // indicating a DL DCI format - 1 bit
+      // indicating a DL DCI format 1bit
       pos++;
       dci_pdu_rel15->format_indicator = (*dci_pdu>>(dci_size-pos))&1;
 
+      //switch to DCI_0_0
+      if (dci_pdu_rel15->format_indicator == 0) {
+        dci_pdu_rel15 = &mac->def_dci_pdu_rel15[NR_UL_DCI_FORMAT_0_0];
+        return 2+nr_extract_dci_info(mac, NR_UL_DCI_FORMAT_0_0, dci_size, rnti, dci_pdu, dci_pdu_rel15);
+      }
+
       if (dci_pdu_rel15->format_indicator == 0)
         return 1; // discard dci, format indicator not corresponding to dci_format
 
@@ -1603,40 +2841,62 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
 	break;
 	
       case NR_RNTI_TC:
-	/*	
-	// indicating a DL DCI format 1bit
-	dci_pdu->= (*dci_pdu>>(dci_size-pos)format_indicator&1)<<(dci_size-pos++);
-	// Freq domain assignment  max 16 bit
+        //Identifier for DCI formats
+        pos++;
+        dci_pdu_rel15->format_indicator = (*dci_pdu>>(dci_size-pos))&1;
+#ifdef DEBUG_EXTRACT_DCI
+	LOG_I(MAC,"Format indicator %d (%d bits)=> %d (0x%lx)\n",dci_pdu_rel15->format_indicator,1,dci_size-pos,*dci_pdu);
+#endif
+        if (dci_pdu_rel15->format_indicator == 1)
+          return 1; // discard dci, format indicator not corresponding to dci_format
 	fsize = (int)ceil( log2( (N_RB_UL*(N_RB_UL+1))>>1 ) );
-	for (int i=0; i<fsize; i++)
-	dci_pdu->= ((*dci_pdu>>(dci_size-pos)frequency_domain_assignment>>(fsize-i-1))&1)<<(dci_size-pos++);
+	pos+=fsize;
+	dci_pdu_rel15->frequency_domain_assignment.val = (*dci_pdu>>(dci_size-pos))&((1<<fsize)-1);
+#ifdef DEBUG_EXTRACT_DCI
+	LOG_I(MAC,"Freq domain assignment %d (%d bits)=> %d (0x%lx)\n",dci_pdu_rel15->frequency_domain_assignment.val,fsize,dci_size-pos,*dci_pdu);
+#endif
 	// Time domain assignment 4bit
-	for (int i=0; i<4; i++)
-	dci_pdu->= (((uint64_t)*dci_pdu>>(dci_size-pos)time_domain_assignment>>(3-i))&1)<<(dci_size-pos++);
+	pos+=4;
+	dci_pdu_rel15->time_domain_assignment.val = (*dci_pdu>>(dci_size-pos))&0xf;
+#ifdef DEBUG_EXTRACT_DCI
+      LOG_I(MAC,"time-domain assignment %d  (4 bits)=> %d (0x%lx)\n",dci_pdu_rel15->time_domain_assignment.val,dci_size-pos,*dci_pdu);
+#endif
 	// Frequency hopping flag  E1 bit
-	dci_pdu->= ((uint64_t)*dci_pdu>>(dci_size-pos)frequency_hopping_flag&1)<<(dci_size-pos++);
+	pos++;
+	dci_pdu_rel15->frequency_hopping_flag.val= (*dci_pdu>>(dci_size-pos))&1;
+#ifdef DEBUG_EXTRACT_DCI
+      LOG_I(MAC,"frequency_hopping %d  (1 bit)=> %d (0x%lx)\n",dci_pdu_rel15->frequency_hopping_flag.val,dci_size-pos,*dci_pdu);
+#endif
 	// MCS  5 bit
-	for (int i=0; i<5; i++)
-	dci_pdu->= (((uint64_t)*dci_pdu>>(dci_size-pos)mcs>>(4-i))&1)<<(dci_size-pos++);
+	pos+=5;
+	dci_pdu_rel15->mcs= (*dci_pdu>>(dci_size-pos))&0x1f;
+#ifdef DEBUG_EXTRACT_DCI
+      LOG_I(MAC,"mcs %d  (5 bits)=> %d (0x%lx)\n",dci_pdu_rel15->mcs,dci_size-pos,*dci_pdu);
+#endif
 	// New data indicator 1bit
-	dci_pdu->= ((uint64_t)*dci_pdu>>(dci_size-pos)ndi&1)<<(dci_size-pos++);
+	pos++;
+	dci_pdu_rel15->ndi= (*dci_pdu>>(dci_size-pos))&1;
+#ifdef DEBUG_EXTRACT_DCI
+	LOG_I(MAC,"NDI %d (%d bits)=> %d (0x%lx)\n",dci_pdu_rel15->ndi,1,dci_size-pos,*dci_pdu);
+#endif
 	// Redundancy version  2bit
-	for (int i=0; i<2; i++)
-	dci_pdu->= (((uint64_t)*dci_pdu>>(dci_size-pos)rv>>(1-i))&1)<<(dci_size-pos++);
+	pos+=2;
+	dci_pdu_rel15->rv= (*dci_pdu>>(dci_size-pos))&3;
+#ifdef DEBUG_EXTRACT_DCI
+	LOG_I(MAC,"RV %d (%d bits)=> %d (0x%lx)\n",dci_pdu_rel15->rv,2,dci_size-pos,*dci_pdu);
+#endif
 	// HARQ process number  4bit
-	for (int i=0; i<4; i++)
-	*dci_pdu  |= (((uint64_t)*dci_pdu>>(dci_size-pos)harq_pid>>(3-i))&1)<<(dci_size-pos++);
-	
+	pos+=4;
+	dci_pdu_rel15->harq_pid = (*dci_pdu>>(dci_size-pos))&0xf;
+#ifdef DEBUG_EXTRACT_DCI
+	LOG_I(MAC,"HARQ_PID %d (%d bits)=> %d (0x%lx)\n",dci_pdu_rel15->harq_pid,4,dci_size-pos,*dci_pdu);
+#endif
 	// TPC command for scheduled PUSCH  E2 bits
-	for (int i=0; i<2; i++)
-	dci_pdu->= (((uint64_t)*dci_pdu>>(dci_size-pos)tpc>>(1-i))&1)<<(dci_size-pos++);
-	*/	
-	// UL/SUL indicator  E1 bit
-	/*
-	  commented for now (RK): need to get this information from BWP descriptor
-	  if (cfg->pucch_config.pucch_GroupHopping.value)
-	  dci_pdu->= ((uint64_t)dci_pdu_rel15->ul_sul_indicator&1)<<(dci_size-pos++);
-	*/
+	pos+=2;
+	dci_pdu_rel15->tpc = (*dci_pdu>>(dci_size-pos))&3;
+#ifdef DEBUG_EXTRACT_DCI
+	LOG_I(MAC,"TPC %d (%d bits)=> %d (0x%lx)\n",dci_pdu_rel15->tpc,2,dci_size-pos,*dci_pdu);
+#endif
 	break;
 	
       }
@@ -1904,390 +3164,351 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
 
   LOG_D(MAC, "In %s [%d.%d]: processing PDU %d (with length %d) of %d total number of PDUs...\n", __FUNCTION__, frameP, slot, pdu_id, pdu_len, dl_info->rx_ind->number_pdus);
 
-    while (!done && pdu_len > 0){
-        mac_ce_len = 0x0000;
-        mac_subheader_len = 0x0001; //  default to fixed-length subheader = 1-oct
-        mac_sdu_len = 0x0000;
-        rx_lcid = ((NR_MAC_SUBHEADER_FIXED *)pduP)->LCID;
-
-        LOG_D(MAC, "[UE] LCID %d, PDU length %d\n", rx_lcid, pdu_len);
-        switch(rx_lcid){
-            //  MAC CE
-
-            case DL_SCH_LCID_CCCH:
-              //  MSG4 RRC Setup 38.331
-              //  variable length
-              if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
-                mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pduP)->L1 & 0x7f) << 8)
-                              | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff);
-                mac_subheader_len = 3;
-              } else {
-                mac_sdu_len = ((NR_MAC_SUBHEADER_SHORT *) pduP)->L;
-                mac_subheader_len = 2;
-              }
-
-              // Check if it is a valid CCCH message, we get all 00's messages very often
-              int i = 0;
-              for(i=0; i<(mac_subheader_len+mac_sdu_len); i++) {
-                if(pduP[i] != 0) {
-                  break;
-                }
-              }
-              if (i == (mac_subheader_len+mac_sdu_len)) {
-                LOG_D(NR_MAC, "%s() Invalid CCCH message!, pdu_len: %d\n", __func__, pdu_len);
-                done = 1;
-                break;
-              }
+  while (!done && pdu_len > 0){
+    mac_ce_len = 0x0000;
+    mac_subheader_len = 0x0001; //  default to fixed-length subheader = 1-oct
+    mac_sdu_len = 0x0000;
+    rx_lcid = ((NR_MAC_SUBHEADER_FIXED *)pduP)->LCID;
+
+    LOG_D(MAC, "[UE] LCID %d, PDU length %d\n", rx_lcid, pdu_len);
+    switch(rx_lcid){
+      //  MAC CE
+      case DL_SCH_LCID_CCCH:
+        //  MSG4 RRC Setup 38.331
+        //  variable length
+        if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+          mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pduP)->L1 & 0x7f) << 8)
+                        | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff);
+          mac_subheader_len = 3;
+        } else {
+          mac_sdu_len = ((NR_MAC_SUBHEADER_SHORT *) pduP)->L;
+          mac_subheader_len = 2;
+        }
 
-              if ( mac_sdu_len > 0 ) {
-                LOG_D(NR_MAC,"DL_SCH_LCID_CCCH (e.g. RRCSetup) with payload len %d\n", mac_sdu_len);
-                for (int i = 0; i < mac_subheader_len; i++) {
-                  LOG_D(NR_MAC, "MAC header %d: 0x%x\n", i, pduP[i]);
-                }
-                for (int i = 0; i < mac_sdu_len; i++) {
-                  LOG_D(NR_MAC, "%d: 0x%x\n", i, pduP[mac_subheader_len + i]);
-                }
-                nr_mac_rrc_data_ind_ue(module_idP, CC_id, gNB_index, frameP, 0, mac->crnti, CCCH, pduP+mac_subheader_len, mac_sdu_len);
-              }
-              break;
+        // Check if it is a valid CCCH message, we get all 00's messages very often
+        int i = 0;
+        for(i=0; i<(mac_subheader_len+mac_sdu_len); i++) {
+          if(pduP[i] != 0) {
+            break;
+          }
+        }
+        if (i == (mac_subheader_len+mac_sdu_len)) {
+          LOG_D(NR_MAC, "%s() Invalid CCCH message!, pdu_len: %d\n", __func__, pdu_len);
+          done = 1;
+          break;
+        }
 
-            case DL_SCH_LCID_TCI_STATE_ACT_UE_SPEC_PDSCH:
-
-                //  38.321 Ch6.1.3.14
-                //  varialbe length
-                mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
-                mac_subheader_len = 2;
-                if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
-                    mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
-                    mac_subheader_len = 3;
-                }
-                break;
-            case DL_SCH_LCID_APERIODIC_CSI_TRI_STATE_SUBSEL:
-                //  38.321 Ch6.1.3.13
-                //  varialbe length
-                mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
-                mac_subheader_len = 2;
-                if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
-                    mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
-                    mac_subheader_len = 3;
-                }
-                break;
-            case DL_SCH_LCID_SP_CSI_RS_CSI_IM_RES_SET_ACT:
-                //  38.321 Ch6.1.3.12
-                //  varialbe length
-                mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
-                mac_subheader_len = 2;
-                if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
-                    mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
-                    mac_subheader_len = 3;
-                }
-                break;
-            case DL_SCH_LCID_SP_SRS_ACTIVATION:
-                //  38.321 Ch6.1.3.17
-                //  varialbe length
-                mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
-                mac_subheader_len = 2;
-                if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
-                    mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
-                    mac_subheader_len = 3;
-                }
-                break;
-            
-            case DL_SCH_LCID_RECOMMENDED_BITRATE:
-                //  38.321 Ch6.1.3.20
-                mac_ce_len = 2;
-                break;
-            case DL_SCH_LCID_SP_ZP_CSI_RS_RES_SET_ACT:
-                //  38.321 Ch6.1.3.19
-                mac_ce_len = 2;
-                break;
-            case DL_SCH_LCID_PUCCH_SPATIAL_RELATION_ACT:
-                //  38.321 Ch6.1.3.18
-                mac_ce_len = 3;
-                break;
-            case DL_SCH_LCID_SP_CSI_REP_PUCCH_ACT:
-                //  38.321 Ch6.1.3.16
-                mac_ce_len = 2;
-                break;
-            case DL_SCH_LCID_TCI_STATE_IND_UE_SPEC_PDCCH:
-                //  38.321 Ch6.1.3.15
-                mac_ce_len = 2;
-                break;
-            case DL_SCH_LCID_DUPLICATION_ACT:
-                //  38.321 Ch6.1.3.11
-                mac_ce_len = 1;
-                break;
-            case DL_SCH_LCID_SCell_ACT_4_OCT:
-                //  38.321 Ch6.1.3.10
-                mac_ce_len = 4;
-                break;
-            case DL_SCH_LCID_SCell_ACT_1_OCT:
-                //  38.321 Ch6.1.3.10
-                mac_ce_len = 1;
-                break;
-            case DL_SCH_LCID_L_DRX:
-                //  38.321 Ch6.1.3.6
-                //  fixed length but not yet specify.
-                mac_ce_len = 0;
-                break;
-            case DL_SCH_LCID_DRX:
-                //  38.321 Ch6.1.3.5
-                //  fixed length but not yet specify.
-                mac_ce_len = 0;
-                break;
-            case DL_SCH_LCID_TA_COMMAND:
-                //  38.321 Ch6.1.3.4
-                mac_ce_len = 1;
-
-                /*uint8_t ta_command = ((NR_MAC_CE_TA *)pduP)[1].TA_COMMAND;
-                uint8_t tag_id = ((NR_MAC_CE_TA *)pduP)[1].TAGID;*/
-
-                ul_time_alignment->apply_ta = 1;
-                ul_time_alignment->ta_command = ((NR_MAC_CE_TA *)pduP)[1].TA_COMMAND;
-                ul_time_alignment->tag_id = ((NR_MAC_CE_TA *)pduP)[1].TAGID;
-
-                /*
-                #ifdef DEBUG_HEADER_PARSING
-                LOG_D(MAC, "[UE] CE %d : UE Timing Advance : %d\n", i, pduP[1]);
-                #endif
-                */
-
-                LOG_I(MAC, "[%d.%d] Received TA_COMMAND %u TAGID %u CC_id %d\n", frameP, slot, ul_time_alignment->ta_command, ul_time_alignment->tag_id, CC_id);
-
-                break;
-            case DL_SCH_LCID_CON_RES_ID:
-              //  Clause 5.1.5 and 6.1.3.3 of 3GPP TS 38.321 version 16.2.1 Release 16
-              // MAC Header: 1 byte (R/R/LCID)
-              // MAC SDU: 6 bytes (UE Contention Resolution Identity)
-              mac_ce_len = 6;
-
-              if(ra->ra_state == WAIT_CONTENTION_RESOLUTION) {
-                LOG_I(MAC, "[UE %d][RAPROC] Frame %d : received contention resolution identity: 0x%02x%02x%02x%02x%02x%02x Terminating RA procedure\n",
-                      module_idP, frameP, pduP[1], pduP[2], pduP[3], pduP[4], pduP[5], pduP[6]);
-
-                bool ra_success = true;
-                for(int i = 0; i<mac_ce_len; i++) {
-                  if(ra->cont_res_id[i] != pduP[i+1]) {
-                    ra_success = false;
-                    break;
-                  }
-                }
-
-                if ( (ra->RA_active == 1) && ra_success) {
-                  nr_ra_succeeded(module_idP, frameP, slot);
-                } else if (!ra_success){
-                  // TODO: Handle failure of RA procedure @ MAC layer
-                  //  nr_ra_failed(module_idP, CC_id, prach_resources, frameP, slot); // prach_resources is a PHY structure
-                  ra->ra_state = RA_UE_IDLE;
-                  ra->RA_active = 0;
-                }
-              }
+        if ( mac_sdu_len > 0 ) {
+          LOG_D(NR_MAC,"DL_SCH_LCID_CCCH (e.g. RRCSetup) with payload len %d\n", mac_sdu_len);
+          for (int i = 0; i < mac_subheader_len; i++) {
+            LOG_D(NR_MAC, "MAC header %d: 0x%x\n", i, pduP[i]);
+          }
+          for (int i = 0; i < mac_sdu_len; i++) {
+            LOG_D(NR_MAC, "%d: 0x%x\n", i, pduP[mac_subheader_len + i]);
+          }
+          nr_mac_rrc_data_ind_ue(module_idP, CC_id, gNB_index, frameP, 0, mac->crnti, CCCH, pduP+mac_subheader_len, mac_sdu_len);
+        }
+        break;
+      case DL_SCH_LCID_TCI_STATE_ACT_UE_SPEC_PDSCH:
+
+        //  38.321 Ch6.1.3.14
+        //  varialbe length
+        mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
+        mac_subheader_len = 2;
+        if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+          mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
+          mac_subheader_len = 3;
+        }
+        break;
+      case DL_SCH_LCID_APERIODIC_CSI_TRI_STATE_SUBSEL:
+        //  38.321 Ch6.1.3.13
+        //  varialbe length
+        mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
+        mac_subheader_len = 2;
+        if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+          mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
+          mac_subheader_len = 3;
+        }
+        break;
+      case DL_SCH_LCID_SP_CSI_RS_CSI_IM_RES_SET_ACT:
+        //  38.321 Ch6.1.3.12
+        //  varialbe length
+        mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
+        mac_subheader_len = 2;
+        if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+          mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
+          mac_subheader_len = 3;
+        }
+        break;
+      case DL_SCH_LCID_SP_SRS_ACTIVATION:
+        //  38.321 Ch6.1.3.17
+        //  varialbe length
+        mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
+        mac_subheader_len = 2;
+        if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+          mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
+          mac_subheader_len = 3;
+        }
+        break;
+      case DL_SCH_LCID_RECOMMENDED_BITRATE:
+        //  38.321 Ch6.1.3.20
+        mac_ce_len = 2;
+        break;
+      case DL_SCH_LCID_SP_ZP_CSI_RS_RES_SET_ACT:
+        //  38.321 Ch6.1.3.19
+        mac_ce_len = 2;
+        break;
+      case DL_SCH_LCID_PUCCH_SPATIAL_RELATION_ACT:
+        //  38.321 Ch6.1.3.18
+        mac_ce_len = 3;
+        break;
+      case DL_SCH_LCID_SP_CSI_REP_PUCCH_ACT:
+        //  38.321 Ch6.1.3.16
+        mac_ce_len = 2;
+        break;
+      case DL_SCH_LCID_TCI_STATE_IND_UE_SPEC_PDCCH:
+        //  38.321 Ch6.1.3.15
+        mac_ce_len = 2;
+        break;
+      case DL_SCH_LCID_DUPLICATION_ACT:
+        //  38.321 Ch6.1.3.11
+        mac_ce_len = 1;
+        break;
+      case DL_SCH_LCID_SCell_ACT_4_OCT:
+        //  38.321 Ch6.1.3.10
+        mac_ce_len = 4;
+        break;
+      case DL_SCH_LCID_SCell_ACT_1_OCT:
+        //  38.321 Ch6.1.3.10
+        mac_ce_len = 1;
+        break;
+      case DL_SCH_LCID_L_DRX:
+        //  38.321 Ch6.1.3.6
+        //  fixed length but not yet specify.
+        mac_ce_len = 0;
+        break;
+      case DL_SCH_LCID_DRX:
+        //  38.321 Ch6.1.3.5
+        //  fixed length but not yet specify.
+        mac_ce_len = 0;
+        break;
+      case DL_SCH_LCID_TA_COMMAND:
+        //  38.321 Ch6.1.3.4
+        mac_ce_len = 1;
 
-              break;
-            case DL_SCH_LCID_PADDING:
-                done = 1;
-                //  end of MAC PDU, can ignore the rest.
-                break;
-
-            //  MAC SDU
-
-            case DL_SCH_LCID_DCCH:
-                //  check if LCID is valid at current time.
-
-            case DL_SCH_LCID_DCCH1:
-                //  check if LCID is valid at current time.
-
-            default:
-                //  check if LCID is valid at current time.
-                if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
-                    //mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
-                    mac_subheader_len = 3;
-                    mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pduP)->L1 & 0x7f) << 8)
-                    | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff);
-
-                } else {
-                  mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
-                  mac_subheader_len = 2;
-                }
-
-                LOG_D(MAC, "[UE %d] Frame %d : DLSCH -> DL-DTCH %d (gNB %d, %d bytes)\n", module_idP, frameP, rx_lcid, gNB_index, mac_sdu_len);
-
-                #if defined(ENABLE_MAC_PAYLOAD_DEBUG)
-                    LOG_T(MAC, "[UE %d] First 32 bytes of DLSCH : \n", module_idP);
-
-                    for (i = 0; i < 32; i++)
-                      LOG_T(MAC, "%x.", (pduP + mac_subheader_len)[i]);
-
-                    LOG_T(MAC, "\n");
-                #endif
-
-//                if (IS_SOFTMODEM_NOS1){
-                  if (rx_lcid < NB_RB_MAX && rx_lcid >= DL_SCH_LCID_DCCH) {
-
-                    mac_rlc_data_ind(module_idP,
-                                     mac->crnti,
-                                     gNB_index,
-                                     frameP,
-                                     ENB_FLAG_NO,
-                                     MBMS_FLAG_NO,
-                                     rx_lcid,
-                                     (char *) (pduP + mac_subheader_len),
-                                     mac_sdu_len,
-                                     1,
-                                     NULL);
-                  } else {
-                    LOG_E(MAC, "[UE %d] Frame %d : unknown LCID %d (gNB %d)\n", module_idP, frameP, rx_lcid, gNB_index);
-                  }
-//                }
+        /*uint8_t ta_command = ((NR_MAC_CE_TA *)pduP)[1].TA_COMMAND;
+          uint8_t tag_id = ((NR_MAC_CE_TA *)pduP)[1].TAGID;*/
 
-            break;
-        }
-        pduP += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
-        pdu_len -= ( mac_subheader_len + mac_ce_len + mac_sdu_len );
-        if (pdu_len < 0)
-          LOG_E(MAC, "[UE %d][%d.%d] nr_ue_process_mac_pdu, residual mac pdu length %d < 0!\n", module_idP, frameP, slot, pdu_len);
-    }
-}
+        ul_time_alignment->apply_ta = 1;
+        ul_time_alignment->ta_command = ((NR_MAC_CE_TA *)pduP)[1].TA_COMMAND;
+        ul_time_alignment->tag_id = ((NR_MAC_CE_TA *)pduP)[1].TAGID;
 
-////////////////////////////////////////////////////////
-/////* ULSCH MAC PDU generation (6.1.2 TS 38.321) */////
-////////////////////////////////////////////////////////
+        /*
+        #ifdef DEBUG_HEADER_PARSING
+        LOG_D(MAC, "[UE] CE %d : UE Timing Advance : %d\n", i, pduP[1]);
+        #endif
+        */
 
-uint16_t nr_generate_ulsch_pdu(uint8_t *sdus_payload,
-                                    uint8_t *pdu,
-                                    uint8_t num_sdus,
-                                    uint16_t *sdu_lengths,
-                                    uint8_t *sdu_lcids,
-                                    uint8_t power_headroom,
-                                    uint16_t crnti,
-                                    uint16_t truncated_bsr,
-                                    uint16_t short_bsr,
-                                    uint16_t long_bsr,
-                                    unsigned short post_padding,
-                                    uint16_t buflen) {
+        LOG_D(MAC, "[%d.%d] Received TA_COMMAND %u TAGID %u CC_id %d\n", frameP, slot, ul_time_alignment->ta_command, ul_time_alignment->tag_id, CC_id);
 
-  NR_MAC_SUBHEADER_FIXED *mac_pdu_ptr = (NR_MAC_SUBHEADER_FIXED *) pdu;
+        break;
+      case DL_SCH_LCID_CON_RES_ID:
+        //  Clause 5.1.5 and 6.1.3.3 of 3GPP TS 38.321 version 16.2.1 Release 16
+        // MAC Header: 1 byte (R/R/LCID)
+        // MAC SDU: 6 bytes (UE Contention Resolution Identity)
+        mac_ce_len = 6;
+
+        if(ra->ra_state == WAIT_CONTENTION_RESOLUTION) {
+          LOG_I(MAC, "[UE %d][RAPROC] Frame %d : received contention resolution identity: 0x%02x%02x%02x%02x%02x%02x Terminating RA procedure\n",
+                module_idP, frameP, pduP[1], pduP[2], pduP[3], pduP[4], pduP[5], pduP[6]);
+
+          bool ra_success = true;
+          for(int i = 0; i<mac_ce_len; i++) {
+            if(ra->cont_res_id[i] != pduP[i+1]) {
+              ra_success = false;
+              break;
+            }
+          }
+
+          if ( (ra->RA_active == 1) && ra_success) {
+            nr_ra_succeeded(module_idP, frameP, slot);
+          } else if (!ra_success){
+            // TODO: Handle failure of RA procedure @ MAC layer
+            //  nr_ra_failed(module_idP, CC_id, prach_resources, frameP, slot); // prach_resources is a PHY structure
+            ra->ra_state = RA_UE_IDLE;
+            ra->RA_active = 0;
+          }
+        }
+        break;
+      case DL_SCH_LCID_PADDING:
+        done = 1;
+        //  end of MAC PDU, can ignore the rest.
+        break;
+        //  MAC SDU
+      case DL_SCH_LCID_DCCH:
+        //  check if LCID is valid at current time.
+      case DL_SCH_LCID_DCCH1:
+        //  check if LCID is valid at current time.
+      default:
+        //  check if LCID is valid at current time.
+        if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+          //mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
+          mac_subheader_len = 3;
+          mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pduP)->L1 & 0x7f) << 8)
+                        | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff);
+
+        } else {
+          mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
+          mac_subheader_len = 2;
+        }
 
-  LOG_D(MAC, "[UE] Generating ULSCH PDU : num_sdus %d\n", num_sdus);
+        LOG_D(MAC, "[UE %d] Frame %d : DLSCH -> DL-DTCH %d (gNB %d, %d bytes)\n", module_idP, frameP, rx_lcid, gNB_index, mac_sdu_len);
 
-  #ifdef DEBUG_HEADER_PARSING
+        #if defined(ENABLE_MAC_PAYLOAD_DEBUG)
+          LOG_T(MAC, "[UE %d] First 32 bytes of DLSCH : \n", module_idP);
 
-    for (int i = 0; i < num_sdus; i++)
-      LOG_D(MAC, "[UE] MAC subPDU %d (lcid %d length %d bytes \n", i, sdu_lcids[i], sdu_lengths[i]);
+          for (i = 0; i < 32; i++)
+            LOG_T(MAC, "%x.", (pduP + mac_subheader_len)[i]);
 
-  #endif
+          LOG_T(MAC, "\n");
+        #endif
 
-  // Generating UL MAC subPDUs including MAC SDU and subheader
+        if (rx_lcid < NB_RB_MAX && rx_lcid >= DL_SCH_LCID_DCCH) {
 
-  for (int i = 0; i < num_sdus; i++) {
-    LOG_D(MAC, "[UE] Generating UL MAC subPDUs for SDU with lenght %d ( num_sdus %d )\n", sdu_lengths[i], num_sdus);
+          mac_rlc_data_ind(module_idP,
+                           mac->crnti,
+                           gNB_index,
+                           frameP,
+                           ENB_FLAG_NO,
+                           MBMS_FLAG_NO,
+                           rx_lcid,
+                           (char *) (pduP + mac_subheader_len),
+                           mac_sdu_len,
+                           1,
+                           NULL);
+        } else {
+          LOG_E(MAC, "[UE %d] Frame %d : unknown LCID %d (gNB %d)\n", module_idP, frameP, rx_lcid, gNB_index);
+        }
 
-    if (sdu_lcids[i] != UL_SCH_LCID_CCCH){
-      if (sdu_lengths[i] < 128) {
-        ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->R = 0;
-        ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->F = 0;
-        ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->LCID = sdu_lcids[i];
-        ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->L = (unsigned char) sdu_lengths[i];
-        mac_pdu_ptr += sizeof(NR_MAC_SUBHEADER_SHORT);
-      } else {
-        ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->R = 0;
-        ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->F = 1;
-        ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->LCID = sdu_lcids[i];
-        ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->L1 = ((unsigned short) sdu_lengths[i] >> 8) & 0x7f;
-        ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->L2 = (unsigned short) sdu_lengths[i] & 0xff;
-        mac_pdu_ptr += sizeof(NR_MAC_SUBHEADER_LONG);
+        break;
       }
-    } else { // UL CCCH SDU
-      mac_pdu_ptr->R = 0;
-      mac_pdu_ptr->LCID = sdu_lcids[i];
-      mac_pdu_ptr ++;
+      pduP += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
+      pdu_len -= ( mac_subheader_len + mac_ce_len + mac_sdu_len );
+      if (pdu_len < 0)
+        LOG_E(MAC, "[UE %d][%d.%d] nr_ue_process_mac_pdu, residual mac pdu length %d < 0!\n", module_idP, frameP, slot, pdu_len);
     }
+}
 
-    // cycle through SDUs, compute each relevant and place ulsch_buffer in
-    memcpy((void *) mac_pdu_ptr, (void *) sdus_payload, sdu_lengths[i]);
-    sdus_payload += sdu_lengths[i]; 
-    mac_pdu_ptr  += sdu_lengths[i];
-  }
+/**
+ * Function:      generating MAC CEs (MAC CE and subheader) for the ULSCH PDU
+ * Notes:         TODO: PHR and BSR reporting
+ * Parameters:
+ * @mac_ce        pointer to the MAC sub-PDUs including the MAC CEs
+ * @mac           pointer to the MAC instance
+ * Return:        number of written bytes
+ */
+int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
+                          NR_UE_MAC_INST_t *mac) {
+
+  int      mac_ce_len = 0;
+  uint8_t mac_ce_size = 0;
+  NR_UE_MAC_CE_t *nr_ue_mac_ce = &mac->nr_ue_mac_ce;
 
-  // Generating UL MAC subPDUs including MAC CEs (MAC CE and subheader)
+  if (nr_ue_mac_ce->phr_reporting && mac->phr_Config != NULL) {
 
-  if (power_headroom) {
     // MAC CE fixed subheader
-    mac_pdu_ptr->R = 0;
-    mac_pdu_ptr->LCID = UL_SCH_LCID_SINGLE_ENTRY_PHR;
-    mac_pdu_ptr++;
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->LCID = UL_SCH_LCID_SINGLE_ENTRY_PHR;
+    mac_ce++;
 
     // PHR MAC CE (1 octet)
-    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_pdu_ptr)->PH = power_headroom;
-    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_pdu_ptr)->R1 = 0;
-    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_pdu_ptr)->PCMAX = 0; // todo
-    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_pdu_ptr)->R2 = 0;
-    mac_pdu_ptr += sizeof(NR_SINGLE_ENTRY_PHR_MAC_CE);
+    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->PH = 0;
+    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->R1 = 0;
+    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->PCMAX = 0;
+    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->R2 = 0;
+
+    // update pointer and length
+    mac_ce_size = sizeof(NR_SINGLE_ENTRY_PHR_MAC_CE);
+    mac_ce += mac_ce_size;
+    mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_FIXED);
+
   }
 
-  if (crnti) {
+  if (!get_softmodem_params()->sa && get_softmodem_params()->do_ra && mac->ra.ra_state != RA_SUCCEEDED) {
+
+    LOG_D(NR_MAC, "In %s: generating C-RNTI MAC CE with C-RNTI %x\n", __FUNCTION__, mac->crnti);
+
     // MAC CE fixed subheader
-    mac_pdu_ptr->R = 0;
-    mac_pdu_ptr->LCID = UL_SCH_LCID_C_RNTI;
-    mac_pdu_ptr++;
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->LCID = UL_SCH_LCID_C_RNTI;
+    mac_ce++;
 
     // C-RNTI MAC CE (2 octets)
-    * (uint16_t *) mac_pdu_ptr = crnti;
-    mac_pdu_ptr += sizeof(uint16_t);
+    *(uint16_t *) mac_ce = mac->crnti;
+
+    // update pointer and length
+    mac_ce_size = sizeof(uint16_t);
+    mac_ce += mac_ce_size;
+    mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_FIXED);
+
   }
 
-  if (truncated_bsr) {
+  if (nr_ue_mac_ce->truncated_bsr) {
+
+    LOG_D(NR_MAC, "In %s: generating short truncated BSR MAC CE with command %x\n", __FUNCTION__, nr_ue_mac_ce->truncated_bsr);
+
     // MAC CE fixed subheader
-    mac_pdu_ptr->R = 0;
-    mac_pdu_ptr->LCID = UL_SCH_LCID_S_TRUNCATED_BSR;
-    mac_pdu_ptr++;
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->LCID = UL_SCH_LCID_S_TRUNCATED_BSR;
+    mac_ce++;
 
     // Short truncated BSR MAC CE (1 octet)
-    ((NR_BSR_SHORT_TRUNCATED *) mac_pdu_ptr)-> Buffer_size = truncated_bsr;
-    ((NR_BSR_SHORT_TRUNCATED *) mac_pdu_ptr)-> LcgID = 0; // todo
-    mac_pdu_ptr+= sizeof(NR_BSR_SHORT_TRUNCATED);
-  } else if (short_bsr) {
+    ((NR_BSR_SHORT_TRUNCATED *) mac_ce)-> Buffer_size = 0;
+    ((NR_BSR_SHORT_TRUNCATED *) mac_ce)-> LcgID = 0;
+
+    // update pointer and length
+    mac_ce_size = sizeof(NR_BSR_SHORT_TRUNCATED);
+    mac_ce += mac_ce_size;
+    mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_FIXED);
+
+  } else if (nr_ue_mac_ce->short_bsr) {
+
+    LOG_D(NR_MAC, "In %s: generating short BSR MAC CE with command %x\n", __FUNCTION__, nr_ue_mac_ce->short_bsr);
+
     // MAC CE fixed subheader
-    mac_pdu_ptr->R = 0;
-    mac_pdu_ptr->LCID = UL_SCH_LCID_S_BSR;
-    mac_pdu_ptr++;
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->LCID = UL_SCH_LCID_S_BSR;
+    mac_ce++;
 
     // Short truncated BSR MAC CE (1 octet)
-    ((NR_BSR_SHORT *) mac_pdu_ptr)->Buffer_size = short_bsr;
-    ((NR_BSR_SHORT *) mac_pdu_ptr)->LcgID = 0; // todo
-     mac_pdu_ptr+= sizeof(NR_BSR_SHORT);
-  } else if (long_bsr) {
+    ((NR_BSR_SHORT *) mac_ce)->Buffer_size = nr_ue_mac_ce->short_bsr;
+    ((NR_BSR_SHORT *) mac_ce)->LcgID = 0;
+
+    // update pointer and length
+    mac_ce_size = sizeof(NR_BSR_SHORT);
+    mac_ce += mac_ce_size;
+    mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_FIXED);
+
+  } else if (nr_ue_mac_ce->long_bsr) {
     // MAC CE variable subheader
     // todo ch 6.1.3.1. TS 38.321
     // ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->R = 0;
     // ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->F = 0;
     // ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->LCID = UL_SCH_LCID_L_BSR;
     // ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->L = 0;
-    // last_size = 2;
-    // mac_pdu_ptr += last_size;
+    // sh_size = 2;
 
     // Short truncated BSR MAC CE (1 octet)
-    // ((NR_BSR_LONG *) ce_ptr)->Buffer_size0 = short_bsr;
-    // ((NR_BSR_LONG *) ce_ptr)->LCGID0 = 0;
+    // ((NR_BSR_LONG *) mac_ce)->Buffer_size0 = short_bsr;
+    // ((NR_BSR_LONG *) mac_ce)->LCGID0 = 0;
     // mac_ce_size = sizeof(NR_BSR_LONG); // size is variable
   }
-// compute offset before adding padding (if necessary)
-  int padding_bytes = 0; 
 
-  if(buflen > 0) // If the buflen is provided
-    padding_bytes = buflen + pdu - (unsigned char *) mac_pdu_ptr;
+  return mac_ce_len;
 
-  AssertFatal(padding_bytes>=0,"");
-
-  // Compute final offset for padding
-  if (post_padding || padding_bytes>0) {
-    ((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->R = 0;
-    ((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->LCID = UL_SCH_LCID_PADDING;
-    mac_pdu_ptr++;
-  } 
-  return (uint8_t *)mac_pdu_ptr-pdu;
 }
 
+
 /////////////////////////////////////
 //    Random Access Response PDU   //
 //         TS 38.213 ch 8.2        //
@@ -2326,6 +3547,12 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t
   module_id_t mod_id       = dl_info->module_id;
   frame_t frame            = dl_info->frame;
   int slot                 = dl_info->slot;
+
+  if(dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.ack_nack == 0) {
+    LOG_W(NR_MAC,"[UE %d][RAPROC][%d.%d] CRC check failed on RAR (NAK)\n", mod_id, frame, slot);
+    return 0;
+  }
+
   int cc_id                = dl_info->cc_id;
   uint8_t gNB_id           = dl_info->gNB_index;
   NR_UE_MAC_INST_t *mac    = get_mac_inst(mod_id);
@@ -2336,7 +3563,6 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t
   uint8_t is_Msg3          = 1;
   frame_t frame_tx         = 0;
   int slot_tx              = 0;
-  uint16_t rnti            = 0;
   int ret                  = 0;
   NR_RA_HEADER_RAPID *rarh = (NR_RA_HEADER_RAPID *) dlsch_buffer; // RAR subheader pointer
   NR_MAC_RAR *rar          = (NR_MAC_RAR *) (dlsch_buffer + 1);   // RAR subPDU pointer
@@ -2388,46 +3614,43 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t
     unsigned char csi_req;
 #endif
 
-  // TC-RNTI
-  ra->t_crnti = rar->TCRNTI_2 + (rar->TCRNTI_1 << 8);
-
-  // TA command
-  ul_time_alignment->apply_ta = 1;
-  ul_time_alignment->ta_command = 31 + rar->TA2 + (rar->TA1 << 5);
+    // TA command
+    ul_time_alignment->apply_ta = 1;
+    ul_time_alignment->ta_command = 31 + rar->TA2 + (rar->TA1 << 5);
 
 #ifdef DEBUG_RAR
-  // CSI
-  csi_req = (unsigned char) (rar->UL_GRANT_4 & 0x01);
+    // CSI
+    csi_req = (unsigned char) (rar->UL_GRANT_4 & 0x01);
 #endif
 
-  // TPC
-  tpc_command = (unsigned char) ((rar->UL_GRANT_4 >> 1) & 0x07);
-  switch (tpc_command){
-    case 0:
-      ra->Msg3_TPC = -6;
-      break;
-    case 1:
-      ra->Msg3_TPC = -4;
-      break;
-    case 2:
-      ra->Msg3_TPC = -2;
-      break;
-    case 3:
-      ra->Msg3_TPC = 0;
-      break;
-    case 4:
-      ra->Msg3_TPC = 2;
-      break;
-    case 5:
-      ra->Msg3_TPC = 4;
-      break;
-    case 6:
-      ra->Msg3_TPC = 6;
-      break;
-    case 7:
-      ra->Msg3_TPC = 8;
-      break;
-  }
+    // TPC
+    tpc_command = (unsigned char) ((rar->UL_GRANT_4 >> 1) & 0x07);
+    switch (tpc_command){
+      case 0:
+        ra->Msg3_TPC = -6;
+        break;
+      case 1:
+        ra->Msg3_TPC = -4;
+        break;
+      case 2:
+        ra->Msg3_TPC = -2;
+        break;
+      case 3:
+        ra->Msg3_TPC = 0;
+        break;
+      case 4:
+        ra->Msg3_TPC = 2;
+        break;
+      case 5:
+        ra->Msg3_TPC = 4;
+        break;
+      case 6:
+        ra->Msg3_TPC = 6;
+        break;
+      case 7:
+        ra->Msg3_TPC = 8;
+        break;
+    }
     // MCS
     rar_grant.mcs = (unsigned char) (rar->UL_GRANT_4 >> 4);
     // time alloc
@@ -2436,12 +3659,6 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t
     rar_grant.Msg3_f_alloc = (uint16_t) ((rar->UL_GRANT_3 >> 4) | (rar->UL_GRANT_2 << 4) | ((rar->UL_GRANT_1 & 0x03) << 12));
     // frequency hopping
     rar_grant.freq_hopping = (unsigned char) (rar->UL_GRANT_1 >> 2);
-    // TC-RNTI
-    if (ra->t_crnti) {
-      rnti = ra->t_crnti;
-    } else {
-      rnti = mac->crnti;
-    }
 
 #ifdef DEBUG_RAR
     LOG_I(NR_MAC, "rarh->E = 0x%x\n", rarh->E);
@@ -2481,12 +3698,19 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t
     if (ret != -1){
 
       fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, slot_tx);
+      uint16_t rnti = mac->crnti;
 
       if (!ul_config) {
         LOG_W(MAC, "In %s: ul_config request is NULL. Probably due to unexpected UL DCI in frame.slot %d.%d. Ignoring DCI!\n", __FUNCTION__, frame, slot);
         return -1;
       }
 
+      // Upon successful reception, set the T-CRNTI to the RAR value if the RA preamble is selected among the contention-based RA Preambles
+      if (!ra->cfra) {
+        ra->t_crnti = rar->TCRNTI_2 + (rar->TCRNTI_1 << 8);
+        rnti = ra->t_crnti;
+      }
+
       nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu = &ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu;
 
       fill_ul_config(ul_config, frame_tx, slot_tx, FAPI_NR_UL_CONFIG_TYPE_PUSCH);
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index 8916555f188de229959d2998bd37264b7a4ad3d9..f3a2496ce3e4a7ae48c0ad0d7f4e266c4d2688ba 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -703,7 +703,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
 
     /* TRANSFORM PRECODING ------------------------------------------------------------------------------------------*/
 
-    if (pusch_config_pdu->transform_precoding == transform_precoder_enabled) {
+    if (pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled) {
 
       pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2;
 
@@ -735,7 +735,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
       return -1;
     }
     /* TIME_DOM_RESOURCE_ASSIGNMENT */
-    if (nr_ue_process_dci_time_dom_resource_assignment(mac, pusch_config_pdu, NULL, dci->time_domain_assignment.val,false) < 0) {
+    if (nr_ue_process_dci_time_dom_resource_assignment(mac, pusch_config_pdu, NULL, dci->time_domain_assignment.val,0,false) < 0) {
       return -1;
     }
 
@@ -748,7 +748,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
     pusch_config_pdu->mcs_index = dci->mcs;
 
     /* MCS TABLE */
-    if (pusch_config_pdu->transform_precoding == transform_precoder_disabled) {
+    if (pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled) {
       pusch_config_pdu->mcs_table = get_pusch_mcs_table(pusch_Config ? pusch_Config->mcs_Table : NULL, 0, *dci_format, rnti_type, target_ss, false);
     } else {
       pusch_config_pdu->mcs_table = get_pusch_mcs_table(pusch_Config ? pusch_Config->mcs_TableTransformPrecoder : NULL, 1, *dci_format, rnti_type, target_ss, false);
@@ -781,10 +781,13 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
     }
 
     /* DMRS */
-    l_prime_mask = get_l_prime(pusch_config_pdu->nr_of_symbols, mappingtype, add_pos, dmrslength, pusch_config_pdu->start_symbol_index, mac->scc ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position);
-    if ((mac->ULbwp[0] && pusch_config_pdu->transform_precoding == transform_precoder_disabled))
+    l_prime_mask = get_l_prime(pusch_config_pdu->nr_of_symbols,
+                               mappingtype, add_pos, dmrslength,
+                               pusch_config_pdu->start_symbol_index,
+                               mac->scc ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position);
+    if ((mac->ULbwp[0] && pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled))
       pusch_config_pdu->num_dmrs_cdm_grps_no_data = 1;
-    else if (*dci_format == NR_UL_DCI_FORMAT_0_0 || (mac->ULbwp[0] && pusch_config_pdu->transform_precoding == transform_precoder_enabled))
+    else if (*dci_format == NR_UL_DCI_FORMAT_0_0 || (mac->ULbwp[0] && pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_enabled))
       pusch_config_pdu->num_dmrs_cdm_grps_no_data = 2;
 
     // Num PRB Overhead from PUSCH-ServingCellConfig
@@ -800,12 +803,12 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
 
     /* PTRS */
     if (mac->ULbwp[0] &&
-        mac->ULbwp[0]->bwp_Dedicated &&
-        mac->ULbwp[0]->bwp_Dedicated->pusch_Config &&
-        mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup &&
-        mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB &&
-        mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
-      if (pusch_config_pdu->transform_precoding == transform_precoder_disabled) {
+	mac->ULbwp[0]->bwp_Dedicated &&
+	mac->ULbwp[0]->bwp_Dedicated->pusch_Config &&
+	mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup &&
+	mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB &&
+	mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
+      if (pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled) {
         nfapi_nr_ue_ptrs_ports_t ptrs_ports_list;
         pusch_config_pdu->pusch_ptrs.ptrs_ports_list = &ptrs_ports_list;
         valid_ptrs_setup = set_ul_ptrs_values(mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup,
@@ -861,8 +864,6 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
 // 3. TODO: Perform PHR procedures
 NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_indication_t *ul_info){
 
-  uint32_t search_space_mask = 0;
-
   if (dl_info){
 
     module_id_t mod_id    = dl_info->module_id;
@@ -873,87 +874,11 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
     NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
 
     fapi_nr_dl_config_request_t *dl_config = &mac->dl_config_request;
+
     nr_scheduled_response_t scheduled_response;
     nr_dcireq_t dcireq;
 
-    // check type0 from 38.213 13 if we have no CellGroupConfig
-    // TODO: implementation to be completed
-    LOG_D(NR_MAC,"nr_ue_scheduler(): mac->cg %p\n",mac->cg);
-    if (mac->cg == NULL) {
-      if(dl_info->ssb_index != -1){
-
-        if(mac->type0_pdcch_ss_mux_pattern == 1){
-          //  38.213 chapter 13
-          if((mac->type0_pdcch_ss_sfn_c == SFN_C_MOD_2_EQ_0) && !(rx_frame & 0x1) && (rx_slot == mac->type0_pdcch_ss_n_c)){
-            search_space_mask = search_space_mask | type0_pdcch;
-            mac->type0_pdcch_consecutive_slots = mac->type0_pdcch_dci_config.coreset.duration;
-          }
-          if((mac->type0_pdcch_ss_sfn_c == SFN_C_MOD_2_EQ_1) && (rx_frame & 0x1) && (rx_slot == mac->type0_pdcch_ss_n_c)){
-            search_space_mask = search_space_mask | type0_pdcch;
-            mac->type0_pdcch_consecutive_slots = mac->type0_pdcch_dci_config.coreset.duration;
-          }
-        }
-        if(mac->type0_pdcch_ss_mux_pattern == 2){
-          //  38.213 Table 13-13, 13-14
-          if((rx_frame == get_ssb_frame(rx_frame)) && (rx_slot == mac->type0_pdcch_ss_n_c)){
-            search_space_mask = search_space_mask | type0_pdcch;
-            mac->type0_pdcch_consecutive_slots = mac->type0_pdcch_dci_config.coreset.duration;
-          }
-        }
-        if(mac->type0_pdcch_ss_mux_pattern == 3){
-          //  38.213 Table 13-15
-          if((rx_frame == get_ssb_frame(rx_frame)) && (rx_slot == mac->type0_pdcch_ss_n_c)){
-            search_space_mask = search_space_mask | type0_pdcch;
-            mac->type0_pdcch_consecutive_slots = mac->type0_pdcch_dci_config.coreset.duration;
-          }
-        }
-      } // ssb_index != -1
-
-      // Type0 PDCCH search space
-      if((search_space_mask & type0_pdcch) || ( mac->type0_pdcch_consecutive_slots != 0 )){
-        mac->type0_pdcch_consecutive_slots = mac->type0_pdcch_consecutive_slots - 1;
-
-        dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15 = mac->type0_pdcch_dci_config;
-        dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DCI;
-
-        /*
-        dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15.rnti = 0xaaaa;        //      to be set
-        dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15.N_RB_BWP = 106;       //      to be set
-
-        LOG_I(NR_MAC,"nr_ue_scheduler Type0 PDCCH with rnti %x, BWP %d\n",
-        dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15.rnti,
-        dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15.N_RB_BWP);
-        */
-	NR_SearchSpace_t *ss0 = mac->search_space_zero;
-	fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
-
-
-	if( mac->scc == NULL && mac->scc_SIB == NULL && (rx_frame%2 == mac->type0_PDCCH_CSS_config.sfn_c) && (rx_slot == mac->type0_PDCCH_CSS_config.n_0) ){
-	  rel15->num_dci_options = 1;
-	  rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
-	  config_dci_pdu(mac, rel15, dl_config, NR_RNTI_SI, -1);
-	  fill_dci_search_candidates(ss0, rel15);
-	  dl_config->number_pdus = 1;
-	  LOG_D(NR_MAC,"Calling fill_scheduled_response, type0_pdcch, num_pdus %d\n",dl_config->number_pdus);
-	  fill_scheduled_response(&scheduled_response, dl_config, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id);
-	  if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
-	    mac->if_module->scheduled_response(&scheduled_response);
-	}
-	// this is for Msg2/Msg4
-	if (mac->ra.ra_state >= WAIT_RAR) {
-	  rel15->num_dci_options = 1;
-	  rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
-	  config_dci_pdu(mac, rel15, dl_config, mac->ra.ra_state == WAIT_RAR ? NR_RNTI_RA : NR_RNTI_TC , -1);
-	  fill_dci_search_candidates(ss0, rel15);
-	  dl_config->number_pdus = 1;
-	  LOG_D(NR_MAC,"mac->cg %p: Calling fill_scheduled_response rnti %x, type0_pdcch, num_pdus %d\n",mac->cg,rel15->rnti,dl_config->number_pdus);
-	  fill_scheduled_response(&scheduled_response, dl_config, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id);
-	  if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
-	    mac->if_module->scheduled_response(&scheduled_response);
-	}
-      }
-    } else { // we have a Master or Secondary CellGroupConfig
-
+    if(mac->cg != NULL){ // we have a cg
       dcireq.module_id = mod_id;
       dcireq.gNB_index = gNB_index;
       dcireq.cc_id     = cc_id;
@@ -963,23 +888,25 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
       nr_ue_dcireq(&dcireq); //to be replaced with function pointer later
 
       fill_scheduled_response(&scheduled_response, &dcireq.dl_config_req, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id);
-      if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL){
+      if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
         mac->if_module->scheduled_response(&scheduled_response);
+    }
+    else {
+      // this is for Msg2/Msg4
+      if (mac->ra.ra_state >= WAIT_RAR) {
+        fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
+        rel15->num_dci_options = mac->ra.ra_state == WAIT_RAR ? 1 : 2;
+        rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
+        if (mac->ra.ra_state == WAIT_CONTENTION_RESOLUTION)
+          rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_0; // msg3 retransmission
+        config_dci_pdu(mac, rel15, dl_config, mac->ra.ra_state == WAIT_RAR ? NR_RNTI_RA : NR_RNTI_TC , -1);
+        fill_dci_search_candidates(mac->ra.ss, rel15);
+        dl_config->number_pdus = 1;
+        LOG_D(MAC,"mac->cg %p: Calling fill_scheduled_response rnti %x, type0_pdcch, num_pdus %d\n",mac->cg,rel15->rnti,dl_config->number_pdus);
+        fill_scheduled_response(&scheduled_response, dl_config, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id);
+        if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
+          mac->if_module->scheduled_response(&scheduled_response);
       }
-
-      /*
-        if(search_space_mask & type0a_pdcch){
-        }
-        
-        if(search_space_mask & type1_pdcch){
-        }
-
-        if(search_space_mask & type2_pdcch){
-        }
-
-        if(search_space_mask & type3_pdcch){
-        }
-      */
     }
   } else if (ul_info) {
 
@@ -989,7 +916,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
     frame_t frame_tx      = ul_info->frame_tx;
     slot_t slot_tx        = ul_info->slot_tx;
     module_id_t mod_id    = ul_info->module_id;
-    uint8_t access_mode   = SCHEDULED_ACCESS;
+    uint32_t gNB_index    = ul_info->gNB_index;
 
     NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
     RA_config_t *ra       = &mac->ra;
@@ -1003,7 +930,6 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
       LOG_D(NR_MAC, "In %s:[%d.%d]: number of UL PDUs: %d with UL transmission in [%d.%d]\n", __FUNCTION__, frame_tx, slot_tx, ul_config->number_pdus, ul_config->sfn, ul_config->slot);
 
       uint8_t ulsch_input_buffer[MAX_ULSCH_PAYLOAD_BYTES];
-      uint8_t data_existing = 0;
       nr_scheduled_response_t scheduled_response;
       fapi_nr_tx_request_t tx_req;
 
@@ -1014,12 +940,11 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
         if (ulcfg_pdu->pdu_type == FAPI_NR_UL_CONFIG_TYPE_PUSCH) {
 
           uint16_t TBS_bytes = ulcfg_pdu->pusch_config_pdu.pusch_data.tb_size;
-          LOG_D(NR_MAC,"harq_id %d, NDI %d NDI_DCI %d, TBS_bytes %d (ra_state %d\n",
+          LOG_D(NR_MAC,"harq_id %d, NDI %d NDI_DCI %d, TBS_bytes %d\n",
                 ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id,
                 mac->UL_ndi[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id],
                 ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator,
-                TBS_bytes,
-                ra->ra_state);
+                TBS_bytes);
           if (ra->ra_state == WAIT_RAR && !ra->cfra){
             memcpy(ulsch_input_buffer, mac->ulsch_pdu.payload, TBS_bytes);
             LOG_D(NR_MAC,"[RAPROC] Msg3 to be transmitted:\n");
@@ -1028,52 +953,24 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
             }
             LOG_D(NR_MAC,"Flipping NDI for harq_id %d (Msg3)\n",ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator);
             mac->UL_ndi[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] = ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator;
-	          mac->first_ul_tx[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] = 0;
+            mac->first_ul_tx[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] = 0;
           } else {
 
-            if ( (mac->UL_ndi[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] != ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator ||
-                    mac->first_ul_tx[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id]==1)){
+            if ((mac->UL_ndi[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] != ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator ||
+                mac->first_ul_tx[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id]==1) &&
+                ((get_softmodem_params()->phy_test == 1) ||
+                (ra->ra_state == RA_SUCCEEDED) ||
+                (ra->ra_state == WAIT_RAR && ra->cfra))){
 
               // Getting IP traffic to be transmitted
-              data_existing = nr_ue_get_sdu(mod_id,
-                                            cc_id,
-                                            frame_tx,
-                                            slot_tx,
-                                            0,
-                                            ulsch_input_buffer,
-                                            TBS_bytes,
-                                            &access_mode);
+              nr_ue_get_sdu(mod_id, frame_tx, slot_tx, gNB_index, ulsch_input_buffer, TBS_bytes);
             }
 
             LOG_D(NR_MAC,"Flipping NDI for harq_id %d\n",ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator);
             mac->UL_ndi[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] = ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator;
             mac->first_ul_tx[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] = 0;
 
-            //Random traffic to be transmitted if there is no IP traffic available for this Tx opportunity
-            if (!data_existing) {
-              //Use zeros for the header bytes in noS1 mode, in order to make sure that the LCID is not valid
-              //and block this traffic from being forwarded to the upper layers at the gNB
-              LOG_D(PHY, "In %s: Random data to be transmitted: TBS_bytes %d \n", __FUNCTION__, TBS_bytes);
-
-              //Give the first byte a dummy value (a value not corresponding to any valid LCID based on 38.321, Table 6.2.1-2)
-              //in order to distinguish the PHY random packets at the MAC layer of the gNB receiver from the normal packets that should
-              //have a valid LCID (nr_process_mac_pdu function)
-              ulsch_input_buffer[0] = UL_SCH_LCID_PADDING;
-
-              for (int i = 1; i < TBS_bytes; i++) {
-                ulsch_input_buffer[i] = (unsigned char) rand();
-              }
-            }
-          }
-
-          #ifdef DEBUG_MAC_PDU
-          LOG_D(PHY, "Is data existing ?: %d \n", data_existing);
-          LOG_I(PHY, "Printing MAC PDU to be encoded, TBS is: %d \n", TBS_bytes);
-          for (i = 0; i < TBS_bytes; i++) {
-            printf("%02x", ulsch_input_buffer[i]);
           }
-          printf("\n");
-          #endif
 
           // Config UL TX PDU
           tx_req.slot = slot_tx;
@@ -1083,11 +980,15 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
           tx_req.tx_request_body[0].pdu_index = j;
           tx_req.tx_request_body[0].pdu = ulsch_input_buffer;
 
+          if (ra->ra_state == WAIT_CONTENTION_RESOLUTION && !ra->cfra){
+            LOG_I(NR_MAC,"[RAPROC] RA-Msg3 retransmitted\n");
+            // 38.321 restart the ra-ContentionResolutionTimer at each HARQ retransmission in the first symbol after the end of the Msg3 transmission
+            nr_Msg3_transmitted(ul_info->module_id, ul_info->cc_id, ul_info->frame_tx, ul_info->slot_tx, ul_info->gNB_index);
+          }
           if (ra->ra_state == WAIT_RAR && !ra->cfra){
             LOG_I(NR_MAC,"[RAPROC] RA-Msg3 transmitted\n");
-            nr_Msg3_transmitted(ul_info->module_id, ul_info->cc_id, ul_info->frame_tx, ul_info->gNB_index);
+            nr_Msg3_transmitted(ul_info->module_id, ul_info->cc_id, ul_info->frame_tx, ul_info->slot_tx, ul_info->gNB_index);
           }
-
         }
       }
 
@@ -1119,7 +1020,6 @@ int nr_ue_pusch_scheduler(NR_UE_MAC_INST_t *mac,
 
   int delta = 0;
   NR_BWP_Uplink_t *ubwp = mac->ULbwp[0];
-
   // Get the numerology to calculate the Tx frame and slot
   int mu = ubwp ?
     ubwp->bwp_Common->genericParameters.subcarrierSpacing :
@@ -1240,11 +1140,12 @@ static void build_ro_list(NR_UE_MAC_INST_t *mac) {
   // WIP: For now assume no rejected PRACH occasions because of conflict with SSB or TDD_UL_DL_ConfigurationCommon schedule
 
   int unpaired = mac->phy_config.config_req.cell_config.frame_duplex_type;
-  // Identify the proper PRACH Configuration Index table according to the operating frequency
-  LOG_D(NR_MAC,"mu = %u, PRACH config index  = %u, unpaired = %u\n", mu, config_index, unpaired);
 
   prach_config_info_p = get_prach_config_info(mac->frequency_range, config_index, unpaired);
 
+  // Identify the proper PRACH Configuration Index table according to the operating frequency
+  LOG_D(NR_MAC,"mu = %u, PRACH config index  = %u, unpaired = %u\n", mu, config_index, unpaired);
+
   if (mac->frequency_range == FR2) { //FR2
 
     x = prach_config_info_p[2];
@@ -1375,57 +1276,57 @@ static void build_ssb_list(NR_UE_MAC_INST_t *mac) {
   if (mac->scc) {
     NR_ServingCellConfigCommon_t *scc = mac->scc;
     switch (scc->ssb_PositionsInBurst->present) {
-    case NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_shortBitmap:
-      ssb_bitmap = &scc->ssb_PositionsInBurst->choice.shortBitmap;
-
-      ssb_positionsInBurst = BIT_STRING_to_uint8(ssb_bitmap);
-      LOG_D(NR_MAC,"SSB config: SSB_positions_in_burst 0x%lx\n", ssb_positionsInBurst);
-
-      for (uint8_t bit_nb=3; bit_nb<=3; bit_nb--) {
-        // If SSB is transmitted
-        if ((ssb_positionsInBurst>>bit_nb) & 0x01) {
-          ssb_list.nb_tx_ssb++;
-          ssb_list.tx_ssb[ssb_idx].transmitted = true;
-          LOG_D(NR_MAC,"SSB idx %d transmitted\n", ssb_idx);
+      case NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_shortBitmap:
+        ssb_bitmap = &scc->ssb_PositionsInBurst->choice.shortBitmap;
+
+        ssb_positionsInBurst = BIT_STRING_to_uint8(ssb_bitmap);
+        LOG_D(NR_MAC,"SSB config: SSB_positions_in_burst 0x%lx\n", ssb_positionsInBurst);
+
+        for (uint8_t bit_nb=3; bit_nb<=3; bit_nb--) {
+          // If SSB is transmitted
+          if ((ssb_positionsInBurst>>bit_nb) & 0x01) {
+            ssb_list.nb_tx_ssb++;
+            ssb_list.tx_ssb[ssb_idx].transmitted = true;
+            LOG_D(NR_MAC,"SSB idx %d transmitted\n", ssb_idx);
+          }
+          ssb_idx++;
         }
-        ssb_idx++;
-      }
-      break;
-    case NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_mediumBitmap:
-      ssb_bitmap = &scc->ssb_PositionsInBurst->choice.mediumBitmap;
-
-      ssb_positionsInBurst = BIT_STRING_to_uint8(ssb_bitmap);
-      LOG_D(NR_MAC,"SSB config: SSB_positions_in_burst 0x%lx\n", ssb_positionsInBurst);
-
-      for (uint8_t bit_nb=7; bit_nb<=7; bit_nb--) {
-        // If SSB is transmitted
-        if ((ssb_positionsInBurst>>bit_nb) & 0x01) {
-          ssb_list.nb_tx_ssb++;
-          ssb_list.tx_ssb[ssb_idx].transmitted = true;
-          LOG_D(NR_MAC,"SSB idx %d transmitted\n", ssb_idx);
+        break;
+      case NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_mediumBitmap:
+        ssb_bitmap = &scc->ssb_PositionsInBurst->choice.mediumBitmap;
+
+        ssb_positionsInBurst = BIT_STRING_to_uint8(ssb_bitmap);
+        LOG_D(NR_MAC,"SSB config: SSB_positions_in_burst 0x%lx\n", ssb_positionsInBurst);
+
+        for (uint8_t bit_nb=7; bit_nb<=7; bit_nb--) {
+          // If SSB is transmitted
+          if ((ssb_positionsInBurst>>bit_nb) & 0x01) {
+            ssb_list.nb_tx_ssb++;
+            ssb_list.tx_ssb[ssb_idx].transmitted = true;
+            LOG_D(NR_MAC,"SSB idx %d transmitted\n", ssb_idx);
+          }
+          ssb_idx++;
         }
-        ssb_idx++;
-      }
-      break;
-    case NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_longBitmap:
-      ssb_bitmap = &scc->ssb_PositionsInBurst->choice.longBitmap;
-
-      ssb_positionsInBurst = BIT_STRING_to_uint64(ssb_bitmap);
-      LOG_D(NR_MAC,"SSB config: SSB_positions_in_burst 0x%lx\n", ssb_positionsInBurst);
-
-      for (uint8_t bit_nb=63; bit_nb<=63; bit_nb--) {
-        // If SSB is transmitted
-        if ((ssb_positionsInBurst>>bit_nb) & 0x01) {
-          ssb_list.nb_tx_ssb++;
-          ssb_list.tx_ssb[ssb_idx].transmitted = true;
-          LOG_D(NR_MAC,"SSB idx %d transmitted\n", ssb_idx);
+        break;
+      case NR_ServingCellConfigCommon__ssb_PositionsInBurst_PR_longBitmap:
+        ssb_bitmap = &scc->ssb_PositionsInBurst->choice.longBitmap;
+
+        ssb_positionsInBurst = BIT_STRING_to_uint64(ssb_bitmap);
+        LOG_D(NR_MAC,"SSB config: SSB_positions_in_burst 0x%lx\n", ssb_positionsInBurst);
+
+        for (uint8_t bit_nb=63; bit_nb<=63; bit_nb--) {
+          // If SSB is transmitted
+          if ((ssb_positionsInBurst>>bit_nb) & 0x01) {
+            ssb_list.nb_tx_ssb++;
+            ssb_list.tx_ssb[ssb_idx].transmitted = true;
+            LOG_D(NR_MAC,"SSB idx %d transmitted\n", ssb_idx);
+          }
+          ssb_idx++;
         }
-        ssb_idx++;
-      }
-      break;
-    default:
-      AssertFatal(false,"ssb_PositionsInBurst not present\n");
-      break;
+        break;
+      default:
+        AssertFatal(false,"ssb_PositionsInBurst not present\n");
+        break;
     }
   } else { // This is configuration from SIB1
 
@@ -1433,6 +1334,7 @@ static void build_ssb_list(NR_UE_MAC_INST_t *mac) {
     ssb_bitmap = &mac->scc_SIB->ssb_PositionsInBurst.inOneGroup;
 
     ssb_positionsInBurst = BIT_STRING_to_uint8(ssb_bitmap);
+
     LOG_D(NR_MAC,"SSB config: SSB_positions_in_burst 0x%lx\n", ssb_positionsInBurst);
 
     for (uint8_t bit_nb=7; bit_nb<=7; bit_nb--) {
@@ -1517,8 +1419,11 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac) {
     required_nb_of_prach_occasion = ssb_list.nb_tx_ssb * ssb_rach_ratio;
   }
 
-  AssertFatal(prach_assoc_pattern.prach_conf_period_list[0].nb_of_prach_occasion>0,"prach_assoc_pattern.prach_conf_period_list[0].nb_of_prach_occasion shouldn't be 0 (ssb_list.nb_tx_ssb %d, ssb_rach_ratio %d\n",ssb_list.nb_tx_ssb,ssb_rach_ratio);
-  required_nb_of_prach_conf_period = ((required_nb_of_prach_occasion-1) + prach_assoc_pattern.prach_conf_period_list[0].nb_of_prach_occasion) / prach_assoc_pattern.prach_conf_period_list[0].nb_of_prach_occasion;
+  AssertFatal(prach_assoc_pattern.prach_conf_period_list[0].nb_of_prach_occasion>0,
+              "prach_assoc_pattern.prach_conf_period_list[0].nb_of_prach_occasion shouldn't be 0 (ssb_list.nb_tx_ssb %d, ssb_rach_ratio %d\n",
+              ssb_list.nb_tx_ssb,ssb_rach_ratio);
+  required_nb_of_prach_conf_period = ((required_nb_of_prach_occasion-1) + prach_assoc_pattern.prach_conf_period_list[0].nb_of_prach_occasion) /
+                                     prach_assoc_pattern.prach_conf_period_list[0].nb_of_prach_occasion;
 
   if (required_nb_of_prach_conf_period == 1) {
     prach_assoc_pattern.prach_association_period_list[0].nb_of_prach_conf_period = 1;
@@ -1603,7 +1508,9 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac) {
                     ssb_list.tx_ssb[ssb_idx].nb_mapped_ro++;
                     AssertFatal(MAX_NB_RO_PER_SSB_IN_ASSOCIATION_PATTERN > ssb_list.tx_ssb[ssb_idx].nb_mapped_ro,"Too many mapped ROs (%d) to a single SSB\n", ssb_list.tx_ssb[ssb_idx].nb_mapped_ro);
 
-                    LOG_D(NR_MAC,"Mapped ssb_idx %u to RO slot-symbol %u-%u, %u-%u-%u/%u\n", ssb_idx, ro_p->slot, ro_p->start_symbol, slot, ro_in_time, ro_in_freq, prach_conf_period_p->prach_occasion_slot_map[frame][slot].nb_of_prach_occasion_in_freq);
+                    LOG_D(NR_MAC,"Mapped ssb_idx %u to RO slot-symbol %u-%u, %u-%u-%u/%u\n",
+                          ssb_idx, ro_p->slot, ro_p->start_symbol, slot, ro_in_time, ro_in_freq,
+                          prach_conf_period_p->prach_occasion_slot_map[frame][slot].nb_of_prach_occasion_in_freq);
                     LOG_D(NR_MAC,"Nb mapped ROs for this ssb idx: in the association period only %u\n", ssb_list.tx_ssb[ssb_idx].nb_mapped_ro);
 
                     // If all the required SSBs are mapped to this RO, exit the loop of SSBs
@@ -1675,11 +1582,15 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac) {
                     ro_p->nb_mapped_ssb = 1;
                     ssb_list.tx_ssb[ssb_idx].mapped_ro[ssb_list.tx_ssb[ssb_idx].nb_mapped_ro] = ro_p;
                     ssb_list.tx_ssb[ssb_idx].nb_mapped_ro++;
-                    AssertFatal(MAX_NB_RO_PER_SSB_IN_ASSOCIATION_PATTERN > ssb_list.tx_ssb[ssb_idx].nb_mapped_ro,"Too many mapped ROs (%d) to a single SSB\n", ssb_list.tx_ssb[ssb_idx].nb_mapped_ro);
+                    AssertFatal(MAX_NB_RO_PER_SSB_IN_ASSOCIATION_PATTERN > ssb_list.tx_ssb[ssb_idx].nb_mapped_ro,"Too many mapped ROs (%d) to a single SSB\n",
+                                ssb_list.tx_ssb[ssb_idx].nb_mapped_ro);
                     nb_mapped_ro_in_association_period++;
 
-                    LOG_D(NR_MAC,"Mapped ssb_idx %u to RO slot-symbol %u-%u, %u-%u-%u/%u\n", ssb_idx, ro_p->slot, ro_p->start_symbol, slot, ro_in_time, ro_in_freq, prach_conf_period_p->prach_occasion_slot_map[frame][slot].nb_of_prach_occasion_in_freq);
-                    LOG_D(NR_MAC,"Nb mapped ROs for this ssb idx: in the association period only %u / total %u\n", ssb_list.tx_ssb[ssb_idx].nb_mapped_ro, nb_mapped_ro_in_association_period);
+                    LOG_D(NR_MAC,"Mapped ssb_idx %u to RO slot-symbol %u-%u, %u-%u-%u/%u\n",
+                          ssb_idx, ro_p->slot, ro_p->start_symbol, slot, ro_in_time, ro_in_freq,
+                          prach_conf_period_p->prach_occasion_slot_map[frame][slot].nb_of_prach_occasion_in_freq);
+                    LOG_D(NR_MAC,"Nb mapped ROs for this ssb idx: in the association period only %u / total %u\n",
+                          ssb_list.tx_ssb[ssb_idx].nb_mapped_ro, nb_mapped_ro_in_association_period);
 
                     // Exit the loop if this SSB has been mapped to all the required ROs
                     // WIP: Assuming that ssb_rach_ratio equals the maximum nb of times a given ssb_idx is mapped within an association period:
@@ -1744,7 +1655,8 @@ static int get_nr_prach_info_from_ssb_index(uint8_t ssb_idx,
   ssb_info_p = &ssb_list.tx_ssb[ssb_idx];
   LOG_D(NR_MAC,"checking for prach : ssb_info_p->nb_mapped_ro %d\n",ssb_info_p->nb_mapped_ro);
   for (uint8_t n_mapped_ro=0; n_mapped_ro<ssb_info_p->nb_mapped_ro; n_mapped_ro++) {
-    LOG_D(NR_MAC,"%d.%d: mapped_ro[%d]->frame.slot %d.%d, prach_assoc_pattern.nb_of_frame %d\n",frame,slot,n_mapped_ro,ssb_info_p->mapped_ro[n_mapped_ro]->frame,ssb_info_p->mapped_ro[n_mapped_ro]->slot,prach_assoc_pattern.nb_of_frame);
+    LOG_D(NR_MAC,"%d.%d: mapped_ro[%d]->frame.slot %d.%d, prach_assoc_pattern.nb_of_frame %d\n",
+          frame,slot,n_mapped_ro,ssb_info_p->mapped_ro[n_mapped_ro]->frame,ssb_info_p->mapped_ro[n_mapped_ro]->slot,prach_assoc_pattern.nb_of_frame);
     if ((slot == ssb_info_p->mapped_ro[n_mapped_ro]->slot) &&
         (ssb_info_p->mapped_ro[n_mapped_ro]->frame == (frame % prach_assoc_pattern.nb_of_frame))) {
 
@@ -1824,6 +1736,95 @@ void build_ssb_to_ro_map(NR_UE_MAC_INST_t *mac) {
   LOG_D(NR_MAC,"Map SSB to RO done\n");
 }
 
+
+void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, int thread_id) {
+
+  NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
+  int O_SR = 0;
+  int O_ACK = 0;
+  int O_CSI = 0;
+  int N_UCI = 0;
+
+  PUCCH_sched_t *pucch = calloc(1,sizeof(*pucch));
+  pucch->resource_indicator = -1;
+  pucch->initial_pucch_id = -1;
+  uint16_t rnti = mac->crnti;  //FIXME not sure this is valid for all pucch instances
+
+  // SR
+  if(trigger_periodic_scheduling_request(mac, pucch, frameP, slotP)) {
+    O_SR = 1;
+    /* sr_payload = 1 means that this is a positive SR, sr_payload = 0 means that it is a negative SR */
+    pucch->sr_payload = nr_ue_get_SR(module_idP,
+                                     frameP,
+                                     slotP);
+  }
+
+  // CSI
+  if (mac->ra.ra_state == RA_SUCCEEDED)
+    O_CSI = nr_get_csi_measurements(mac, frameP, slotP, pucch);
+
+  // ACKNACK
+  O_ACK = get_downlink_ack(mac, frameP, slotP, pucch);
+
+  NR_BWP_Id_t bwp_id = mac->UL_BWP_Id;
+  NR_PUCCH_Config_t *pucch_Config = NULL;
+
+  if (bwp_id>0 &&
+      mac->ULbwp[bwp_id-1] &&
+      mac->ULbwp[bwp_id-1]->bwp_Dedicated &&
+      mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
+      mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup) {
+    pucch_Config =  mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup;
+  }
+  else if (bwp_id==0 &&
+           mac->cg &&
+           mac->cg->spCellConfig &&
+           mac->cg->spCellConfig->spCellConfigDedicated &&
+           mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
+           mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
+           mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
+           mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
+      pucch_Config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
+  }
+
+
+  // if multiplexing of HARQ and CSI is not possible, transmit only HARQ bits
+  if ((O_ACK != 0) && (O_CSI != 0) &&
+      pucch_Config &&
+      pucch_Config->format2 &&
+      (pucch_Config->format2->choice.setup->simultaneousHARQ_ACK_CSI == NULL)) {
+    O_CSI = 0;
+    pucch->csi_part1_payload = 0;
+    pucch->csi_part2_payload = 0;
+  }
+
+  N_UCI = O_SR + O_ACK + O_CSI;
+
+  // do no transmit pucch if only SR scheduled and it is negative
+  if ((O_ACK + O_CSI) == 0 && pucch->sr_payload == 0)
+    return;
+
+  if (N_UCI > 0) {
+
+    pucch->resource_set_id = find_pucch_resource_set(mac, N_UCI);
+    select_pucch_resource(mac, pucch);
+    fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, slotP);
+    fapi_nr_ul_config_pucch_pdu *pucch_pdu = &ul_config->ul_config_list[ul_config->number_pdus].pucch_config_pdu;
+    nr_ue_configure_pucch(mac,
+                          slotP,
+                          rnti,
+                          pucch,
+                          pucch_pdu,
+                          O_SR, O_ACK, O_CSI);
+    fill_ul_config(ul_config, frameP, slotP, FAPI_NR_UL_CONFIG_TYPE_PUCCH);
+    nr_scheduled_response_t scheduled_response;
+    fill_scheduled_response(&scheduled_response, NULL, ul_config, NULL, module_idP, 0 /*TBR fix*/, frameP, slotP, thread_id);
+    if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
+      mac->if_module->scheduled_response(&scheduled_response);
+  }
+
+}
+
 // This function schedules the PRACH according to prach_ConfigurationIndex and TS 38.211, tables 6.3.3.2.x
 // PRACH formats 9, 10, 11 are corresponding to dual PRACH format configurations A1/B1, A2/B2, A3/B3.
 // - todo:
@@ -1965,114 +1966,244 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s
   } // if is_nr_UL_slot
 }
 
-#define MAX_LCID 8 //Fixme: also defined in LCID table
-uint8_t
-nr_ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP,
-           sub_frame_t subframe, uint8_t eNB_index,
-           uint8_t *ulsch_buffer, uint16_t buflen, uint8_t *access_mode) {
-  uint8_t total_rlc_pdu_header_len = 0;
+// This function schedules the reception of SIB1 after initial sync and before going to real time state
+void nr_ue_sib1_scheduler(module_id_t module_idP,
+                          int cc_id,
+                          uint16_t ssb_start_symbol,
+                          uint16_t frame,
+                          uint8_t ssb_subcarrier_offset,
+                          uint32_t ssb_index,
+                          uint16_t ssb_start_subcarrier,
+                          frequency_range_t frequency_range) {
+
+  NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
+  nr_scheduled_response_t scheduled_response;
+  int frame_s,slot_s,ret;
+  fapi_nr_dl_config_request_t *dl_config = &mac->dl_config_request;
+  fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15;
+
+  uint8_t scs_ssb = get_softmodem_params()->numerology;
+  uint16_t ssb_offset_point_a = (ssb_start_subcarrier - ssb_subcarrier_offset)/12;
+
+  get_type0_PDCCH_CSS_config_parameters(&mac->type0_PDCCH_CSS_config,
+                                        frame,
+                                        mac->mib,
+                                        nr_slots_per_frame[scs_ssb],
+                                        ssb_subcarrier_offset,
+                                        ssb_start_symbol,
+                                        scs_ssb,
+                                        frequency_range,
+                                        ssb_index,
+                                        1, // If the UE is not configured with a periodicity, the UE assumes a periodicity of a half frame
+                                        ssb_offset_point_a);
+
+  if(mac->search_space_zero == NULL) mac->search_space_zero=calloc(1,sizeof(*mac->search_space_zero));
+  if(mac->coreset0 == NULL) mac->coreset0 = calloc(1,sizeof(*mac->coreset0));
+
+  for (int i=0; i<3; i++) { // loop over possible aggregation levels
+
+    fill_coresetZero(mac->coreset0, &mac->type0_PDCCH_CSS_config);
+    ret = fill_searchSpaceZero(mac->search_space_zero, &mac->type0_PDCCH_CSS_config,4<<i);
+    if (ret) {
+      rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
+      rel15->num_dci_options = 1;
+      rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
+      config_dci_pdu(mac, rel15, dl_config, NR_RNTI_SI, -1);
+      fill_dci_search_candidates(mac->search_space_zero, rel15);
+
+      if(mac->type0_PDCCH_CSS_config.type0_pdcch_ss_mux_pattern == 1){
+        // same frame as ssb
+        if ((mac->type0_PDCCH_CSS_config.frame & 0x1) == mac->type0_PDCCH_CSS_config.sfn_c)
+          frame_s = 0;
+        else
+          frame_s = 1;
+        slot_s = mac->type0_PDCCH_CSS_config.n_0;
+      }
+      else{
+        frame_s = 0; // same frame as ssb
+        slot_s = mac->type0_PDCCH_CSS_config.n_c;
+      }
+      LOG_D(MAC,"Calling fill_scheduled_response, type0_pdcch, num_pdus %d\n",dl_config->number_pdus);
+      fill_scheduled_response(&scheduled_response, dl_config, NULL, NULL, module_idP, cc_id, frame_s, slot_s, 0); // TODO fix thread_id, for now assumed 0
+    }
+  }
+  if (dl_config->number_pdus) {
+    if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
+      mac->if_module->scheduled_response(&scheduled_response);
+  }
+  else
+    AssertFatal(1==0,"Unable to find aggregation level for type0 CSS\n");
+}
+
+
+#define MAX_LCID 8 // NR_MAX_NUM_LCID shall be used but the mac_rlc_data_req function can fetch data for max 8 LCID
+
+/**
+ * Function:      to fetch data to be transmitted from RLC, place it in the ULSCH PDU buffer
+                  to generate the complete MAC PDU with sub-headers and MAC CEs according to ULSCH MAC PDU generation (6.1.2 TS 38.321)
+                  the selected sub-header for the payload sub-PDUs is NR_MAC_SUBHEADER_LONG
+ * @module_idP    Module ID
+ * @frameP        current UL frame
+ * @subframe      current UL slot
+ * @gNB_index     gNB index
+ * @ulsch_buffer  Pointer to ULSCH PDU
+ * @buflen        TBS
+ */
+uint8_t nr_ue_get_sdu(module_id_t module_idP,
+                      frame_t frameP,
+                      sub_frame_t subframe,
+                      uint8_t gNB_index,
+                      uint8_t *ulsch_buffer,
+                      uint16_t buflen) {
+
   int16_t buflen_remain = 0;
   uint8_t lcid = 0;
-  uint16_t sdu_lengths[MAX_LCID] = { 0 };
-  uint8_t sdu_lcids[MAX_LCID] = { 0 };
-  uint16_t payload_offset = 0, num_sdus = 0;
-  uint8_t ulsch_sdus[MAX_ULSCH_PAYLOAD_BYTES];
+  uint16_t sdu_length = 0;
+  uint16_t num_sdus = 0;
   uint16_t sdu_length_total = 0;
-  //unsigned short post_padding = 0;
   NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
+  const uint8_t sh_size = sizeof(NR_MAC_SUBHEADER_LONG);
+
+  // Pointer used to build the MAC PDU by placing the RLC SDUs in the ULSCH buffer
+  uint8_t *pdu = ulsch_buffer;
 
-  rlc_buffer_occupancy_t lcid_buffer_occupancy_new = 0;
-  LOG_D(NR_MAC,
-        "[UE %d] MAC PROCESS UL TRANSPORT BLOCK at frame%d subframe %d TBS=%d\n",
-        module_idP, frameP, subframe, buflen);
-  AssertFatal(CC_id == 0,
-              "Transmission on secondary CCs is not supported yet\n");
+  // Preparing the MAC CEs sub-PDUs and get the total size
+  unsigned char mac_header_control_elements[16] = {0};
+  int tot_mac_ce_len = nr_write_ce_ulsch_pdu(&mac_header_control_elements[0], mac);
+  uint8_t total_mac_pdu_header_len = tot_mac_ce_len;
+
+  LOG_D(NR_MAC, "In %s: [UE %d] [%d.%d] process UL transport block at with size TBS = %d bytes \n", __FUNCTION__, module_idP, frameP, subframe, buflen);
 
   // Check for DCCH first
   // TO DO: Multiplex in the order defined by the logical channel prioritization
   for (lcid = UL_SCH_LCID_SRB1;
        lcid < MAX_LCID; lcid++) {
-    lcid_buffer_occupancy_new = mac_rlc_get_buffer_occupancy_ind(module_idP, mac->crnti, eNB_index, frameP, subframe, ENB_FLAG_NO, lcid);
-
-    if(lcid_buffer_occupancy_new) {
-        buflen_remain =
-          buflen - (total_rlc_pdu_header_len + sdu_length_total + MAX_RLC_SDU_SUBHEADER_SIZE);
-        LOG_D(NR_MAC,
-              "[UE %d] Frame %d : UL-DXCH -> ULSCH, RLC %d has %d bytes to "
-              "send (Transport Block size %d SDU Length Total %d , mac header len %d, buflen_remain %d )\n", //BSR byte before Tx=%d
-              module_idP, frameP, lcid, lcid_buffer_occupancy_new,
-              buflen, sdu_length_total,
-              total_rlc_pdu_header_len, buflen_remain); // ,nr_ue_mac_inst->scheduling_info.BSR_bytes[nr_ue_mac_inst->scheduling_info.LCGID[lcid]]
-
-      while(buflen_remain > 0 && lcid_buffer_occupancy_new){
-
-        sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP,
-                                mac->crnti,
-                                eNB_index,
-                                frameP,
-                                ENB_FLAG_NO,
-                                MBMS_FLAG_NO,
-                                lcid,
-                                buflen_remain-MAX_RLC_SDU_SUBHEADER_SIZE,
-                                //Fixme: Laurent I removed MAX_RLC_SDU_SUBHEADER_SIZE because else we get out the buffer silently
-                                // the interface with nr_generate_ulsch_pdu() looks over complex and not CPU optimized
-                                (char *)&ulsch_sdus[sdu_length_total],0,
-                                0);
-
-        AssertFatal(buflen_remain >= sdu_lengths[num_sdus],
-                    "LCID=%d RLC has segmented %d bytes but MAC has max=%d\n",
-                    lcid, sdu_lengths[num_sdus], buflen_remain);
-
-        if (sdu_lengths[num_sdus]) {
-          sdu_length_total += sdu_lengths[num_sdus];
-          sdu_lcids[num_sdus] = lcid;
-
-          total_rlc_pdu_header_len += MAX_RLC_SDU_SUBHEADER_SIZE; //rlc_pdu_header_len_last;
-
-          //Update number of SDU
-          num_sdus++;
-        }
 
-        /* Get updated BO after multiplexing this PDU */
-        lcid_buffer_occupancy_new = mac_rlc_get_buffer_occupancy_ind(module_idP,mac->crnti,eNB_index,frameP, subframe, ENB_FLAG_NO, lcid);
-        buflen_remain = buflen - (total_rlc_pdu_header_len + sdu_length_total + MAX_RLC_SDU_SUBHEADER_SIZE);
+    buflen_remain = buflen - (total_mac_pdu_header_len + sdu_length_total + sh_size);
+
+    LOG_D(NR_MAC, "In %s: [UE %d] [%d.%d] UL-DXCH -> ULSCH, RLC with LCID 0x%02x (TBS %d bytes, sdu_length_total %d bytes, MAC header len %d bytes, buflen_remain %d bytes)\n",
+          __FUNCTION__,
+          module_idP,
+          frameP,
+          subframe,
+          lcid,
+          buflen,
+          sdu_length_total,
+          tot_mac_ce_len,
+          buflen_remain);
+
+    while (buflen_remain > 0){
+
+      // Pointer used to build the MAC sub-PDU headers in the ULSCH buffer for each SDU
+      NR_MAC_SUBHEADER_LONG *header = (NR_MAC_SUBHEADER_LONG *) pdu;
+
+      pdu += sh_size;
+
+      sdu_length = mac_rlc_data_req(module_idP,
+                                    mac->crnti,
+                                    gNB_index,
+                                    frameP,
+                                    ENB_FLAG_NO,
+                                    MBMS_FLAG_NO,
+                                    lcid,
+                                    buflen_remain,
+                                    (char *)pdu,
+                                    0,
+                                    0);
+
+      AssertFatal(buflen_remain >= sdu_length, "In %s: LCID = 0x%02x RLC has segmented %d bytes but MAC has max %d remaining bytes\n",
+                  __FUNCTION__,
+                  lcid,
+                  sdu_length,
+                  buflen_remain);
+
+      if (sdu_length > 0) {
+
+        LOG_D(MAC, "In %s: Generating UL MAC sub-PDU for SDU %d, length %d bytes, RB with LCID 0x%02x (buflen (TBS) %d bytes)\n", __FUNCTION__,
+          num_sdus + 1,
+          sdu_length,
+          lcid,
+          buflen);
+
+        header->R = 0;
+        header->F = 1;
+        header->LCID = lcid;
+        header->L1 = ((unsigned short) sdu_length >> 8) & 0x7f;
+        header->L2 = (unsigned short) sdu_length & 0xff;
+
+        #ifdef ENABLE_MAC_PAYLOAD_DEBUG
+        LOG_I(NR_MAC, "In %s: dumping MAC sub-header with length %d: \n", __FUNCTION__, sh_size);
+        log_dump(NR_MAC, header, sh_size, LOG_DUMP_CHAR, "\n");
+        LOG_I(NR_MAC, "In %s: dumping MAC SDU with length %d \n", __FUNCTION__, sdu_length);
+        log_dump(NR_MAC, pdu, sdu_length, LOG_DUMP_CHAR, "\n");
+        #endif
+
+        pdu += sdu_length;
+        sdu_length_total += sdu_length;
+        total_mac_pdu_header_len += sh_size;
+
+        num_sdus++;
+
+      } else {
+        pdu -= sh_size;
+        LOG_D(MAC, "In %s: no data to transmit for RB with LCID 0x%02x\n", __FUNCTION__, lcid);
+        break;
       }
+
+      buflen_remain = buflen - (total_mac_pdu_header_len + sdu_length_total + sh_size);
+
     }
   }
 
-  // Generate ULSCH PDU
-  if (num_sdus>0) {
-  payload_offset = nr_generate_ulsch_pdu(ulsch_sdus,
-                                         ulsch_buffer,  // mac header
-                                         num_sdus,  // num sdus
-                                         sdu_lengths, // sdu length
-                                         sdu_lcids, // sdu lcid
-                                         0, // power_headroom
-                                         mac->crnti, // crnti
-                                         0, // truncated_bsr
-                                         0, // short_bsr
-                                         0, // long_bsr
-                                         0, // post_padding 
-                                         buflen);  // TBS in bytes
-  } else {
-    return 0;
-  }
+  if (tot_mac_ce_len > 0) {
+
+    LOG_D(NR_MAC, "In %s copying %d bytes of MAC CEs to the UL PDU \n", __FUNCTION__, tot_mac_ce_len);
+    memcpy((void *) pdu, (void *) mac_header_control_elements, tot_mac_ce_len);
+    pdu += (unsigned char) tot_mac_ce_len;
+
+    #ifdef ENABLE_MAC_PAYLOAD_DEBUG
+    LOG_I(NR_MAC, "In %s: dumping MAC CE with length tot_mac_ce_len %d: \n", __FUNCTION__, tot_mac_ce_len);
+    log_dump(NR_MAC, mac_header_control_elements, tot_mac_ce_len, LOG_DUMP_CHAR, "\n");
+    #endif
 
-  // Padding: fill remainder of ULSCH with 0
-  if (buflen - payload_offset > 0){
-          for (int j = payload_offset; j < buflen; j++)
-                  ulsch_buffer[j] = 0;
   }
 
-#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
-  LOG_I(NR_MAC, "Printing UL MAC payload UE side, payload_offset: %d \n", payload_offset);
-  for (int i = 0; i < buflen ; i++) {
-          //harq_process_ul_ue->a[i] = (unsigned char) rand();
-          //printf("a[%d]=0x%02x\n",i,harq_process_ul_ue->a[i]);
-          printf("%02x ",(unsigned char)ulsch_buffer[i]);
+  buflen_remain = buflen - (total_mac_pdu_header_len + sdu_length_total);
+
+  // Compute final offset for padding and fill remainder of ULSCH with 0
+  if (buflen_remain > 0) {
+
+    ((NR_MAC_SUBHEADER_FIXED *) pdu)->R = 0;
+    ((NR_MAC_SUBHEADER_FIXED *) pdu)->LCID = UL_SCH_LCID_PADDING;
+
+    #ifdef ENABLE_MAC_PAYLOAD_DEBUG
+    LOG_I(NR_MAC, "In %s: padding MAC sub-header with length %ld bytes \n", __FUNCTION__, sizeof(NR_MAC_SUBHEADER_FIXED));
+    log_dump(NR_MAC, pdu, sizeof(NR_MAC_SUBHEADER_FIXED), LOG_DUMP_CHAR, "\n");
+    #endif
+
+    pdu++;
+    buflen_remain--;
+
+    if (IS_SOFTMODEM_RFSIM) {
+      for (int j = 0; j < buflen_remain; j++) {
+        pdu[j] = (unsigned char) rand();
+      }
+    } else {
+      memset(pdu, 0, buflen_remain);
+    }
+
+    #ifdef ENABLE_MAC_PAYLOAD_DEBUG
+    LOG_I(NR_MAC, "In %s: MAC padding sub-PDU with length %d bytes \n", __FUNCTION__, buflen_remain);
+    log_dump(NR_MAC, pdu, buflen_remain, LOG_DUMP_CHAR, "\n");
+    #endif
+
   }
-  printf("\n");
-#endif
 
-  return 1;
+  #ifdef ENABLE_MAC_PAYLOAD_DEBUG
+  LOG_I(NR_MAC, "In %s: dumping MAC PDU with length %d: \n", __FUNCTION__, buflen);
+  log_dump(NR_MAC, ulsch_buffer, buflen, LOG_DUMP_CHAR, "\n");
+  #endif
+
+  return num_sdus > 0 ? 1 : 0;
+
 }
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index 94288530373b0ac80bf4f18b9166192a8ec0daf8..13a2cb48ddb2d08a2629cd0e268c49e883e89d5f 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -419,6 +419,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
                            int ssb_SubcarrierOffset,
                            int pdsch_AntennaPorts,
                            int pusch_AntennaPorts,
+                           int sib1_tda,
                            NR_ServingCellConfigCommon_t *scc,
 	                         int add_ue,
                            uint32_t rnti,
@@ -457,7 +458,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
                   ssb_SubcarrierOffset,
                   pdsch_AntennaPorts,
                   pusch_AntennaPorts,
-		              scc);
+                  scc);
     LOG_D(NR_MAC, "%s() %s:%d RC.nrmac[Mod_idP]->if_inst->NR_PHY_config_req:%p\n", __FUNCTION__, __FILE__, __LINE__, RC.nrmac[Mod_idP]->if_inst->NR_PHY_config_req);
   
     // if in nFAPI mode 
@@ -507,6 +508,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
 
     if (get_softmodem_params()->sa > 0) {
       NR_COMMON_channels_t *cc = &RC.nrmac[Mod_idP]->common_channels[0];
+      RC.nrmac[Mod_idP]->sib1_tda = sib1_tda;
       for (int n=0;n<NR_NB_RA_PROC_MAX;n++ ) {
 	       cc->ra[n].cfra = false;
 	       cc->ra[n].rnti = 0;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index 753e94b65ea98b4028cf4313afb49a7ab0ac7826..252144be3b78d0318bc35aad1ce29d0c1c2b4f27 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -60,6 +60,8 @@
 
 uint16_t nr_pdcch_order_table[6] = { 31, 31, 511, 2047, 2047, 8191 };
 
+uint8_t vnf_first_sched_entry = 1;
+
 void clear_mac_stats(gNB_MAC_INST *gNB) {
   memset((void*)gNB->UE_info.mac_stats,0,MAX_MOBILES_PER_GNB*sizeof(NR_mac_stats_t));
 }
@@ -119,12 +121,14 @@ void dump_mac_stats(gNB_MAC_INST *gNB)
           UE_id,
           stats->ulsch_total_bytes_scheduled, stats->ulsch_total_bytes_rx);
     for (int lc_id = 0; lc_id < 63; lc_id++) {
-      if (stats->lc_bytes_tx[lc_id] > 0)
+      if (stats->lc_bytes_tx[lc_id] > 0) {
         stroff+=sprintf(output+stroff, "UE %d: LCID %d: %d bytes TX\n", UE_id, lc_id, stats->lc_bytes_tx[lc_id]);
-        LOG_D(NR_MAC, "UE %d: LCID %d: %d bytes TX\n", UE_id, lc_id, stats->lc_bytes_tx[lc_id]);
-      if (stats->lc_bytes_rx[lc_id] > 0)
+	LOG_D(NR_MAC, "UE %d: LCID %d: %d bytes TX\n", UE_id, lc_id, stats->lc_bytes_tx[lc_id]);
+      }
+      if (stats->lc_bytes_rx[lc_id] > 0) {
         stroff+=sprintf(output+stroff, "UE %d: LCID %d: %d bytes RX\n", UE_id, lc_id, stats->lc_bytes_rx[lc_id]);
-        LOG_D(NR_MAC, "UE %d: LCID %d: %d bytes RX\n", UE_id, lc_id, stats->lc_bytes_rx[lc_id]);
+	LOG_D(NR_MAC, "UE %d: LCID %d: %d bytes RX\n", UE_id, lc_id, stats->lc_bytes_rx[lc_id]);
+      }
     }
   }
   print_meas(&gNB->eNB_scheduler, "DL & UL scheduling timing stats", NULL, NULL);
@@ -148,34 +152,32 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB,
 
   gNB->pdu_index[CC_idP] = 0;
 
-  if (NFAPI_MODE == NFAPI_MONOLITHIC || NFAPI_MODE == NFAPI_MODE_PNF) { // monolithic or PNF
-
-    DL_req[CC_idP].SFN                                   = frameP;
-    DL_req[CC_idP].Slot                                  = slotP;
-    DL_req[CC_idP].dl_tti_request_body.nPDUs             = 0;
-    DL_req[CC_idP].dl_tti_request_body.nGroup            = 0;
-    //DL_req[CC_idP].dl_tti_request_body.transmission_power_pcfich           = 6000;
-    memset(pdcch, 0, sizeof(**pdcch) * MAX_NUM_BWP * MAX_NUM_CORESET);
+  DL_req[CC_idP].SFN                                   = frameP;
+  DL_req[CC_idP].Slot                                  = slotP;
+  DL_req[CC_idP].dl_tti_request_body.nPDUs             = 0;
+  DL_req[CC_idP].dl_tti_request_body.nGroup            = 0;
+  //DL_req[CC_idP].dl_tti_request_body.transmission_power_pcfich           = 6000;
+  memset(pdcch, 0, sizeof(**pdcch) * MAX_NUM_BWP * MAX_NUM_CORESET);
 
-    UL_dci_req[CC_idP].SFN                         = frameP;
-    UL_dci_req[CC_idP].Slot                        = slotP;
-    UL_dci_req[CC_idP].numPdus                     = 0;
+  UL_dci_req[CC_idP].SFN                         = frameP;
+  UL_dci_req[CC_idP].Slot                        = slotP;
+  UL_dci_req[CC_idP].numPdus                     = 0;
 
-    /* advance last round's future UL_tti_req to be ahead of current frame/slot */
-    future_ul_tti_req->SFN = (slotP == 0 ? frameP : frameP + 1) % 1024;
-    /* future_ul_tti_req->Slot is fixed! */
-    future_ul_tti_req->n_pdus = 0;
-    future_ul_tti_req->n_ulsch = 0;
-    future_ul_tti_req->n_ulcch = 0;
-    future_ul_tti_req->n_group = 0;
+  /* advance last round's future UL_tti_req to be ahead of current frame/slot */
+  future_ul_tti_req->SFN = (slotP == 0 ? frameP : frameP + 1) % 1024;
+  LOG_D(MAC,"Future_ul_tti SFN = %d for slot %d \n", future_ul_tti_req->SFN, (slotP + num_slots - 1) % num_slots);
+  /* future_ul_tti_req->Slot is fixed! */
+  future_ul_tti_req->n_pdus = 0;
+  future_ul_tti_req->n_ulsch = 0;
+  future_ul_tti_req->n_ulcch = 0;
+  future_ul_tti_req->n_group = 0;
 
-    /* UL_tti_req is a simple pointer into the current UL_tti_req_ahead, i.e.,
-     * it walks over UL_tti_req_ahead in a circular fashion */
-    gNB->UL_tti_req[CC_idP] = &gNB->UL_tti_req_ahead[CC_idP][slotP];
+  /* UL_tti_req is a simple pointer into the current UL_tti_req_ahead, i.e.,
+   * it walks over UL_tti_req_ahead in a circular fashion */
+  gNB->UL_tti_req[CC_idP] = &gNB->UL_tti_req_ahead[CC_idP][slotP];
 
-    TX_req[CC_idP].Number_of_PDUs                  = 0;
+  TX_req[CC_idP].Number_of_PDUs                  = 0;
 
-  }
 }
 /*
 void check_nr_ul_failure(module_id_t module_idP,
@@ -399,6 +401,22 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
     memset(&vrb_map_UL[last_slot * MAX_BWP_SIZE], 0, sizeof(uint16_t) * MAX_BWP_SIZE);
 
     clear_nr_nfapi_information(RC.nrmac[module_idP], CC_id, frame, slot);
+
+    /*VNF first entry into scheduler. Since frame numbers for future_ul_tti_req of some future slots 
+    will not be set before we encounter them, set them here */
+
+    if (NFAPI_MODE == NFAPI_MODE_VNF){
+      if(vnf_first_sched_entry == 1)
+      {
+        for (int i = 0; i<num_slots; i++){
+          if(i < slot)
+            gNB->UL_tti_req_ahead[CC_id][i].SFN = (frame + 1) % 1024;
+          else
+            gNB->UL_tti_req_ahead[CC_id][i].SFN = frame;
+        }
+        vnf_first_sched_entry = 0;
+      }
+    }
   }
 
 
@@ -427,7 +445,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
     schedule_nr_prach(module_idP, f, s);
   }
 
-  // This schedule SR
+    // This schedule SR
   nr_sr_reporting(module_idP, frame, slot);
 
   // Schedule CSI-RS transmission
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index 1d3f69d876fc786da23f95de4a89a86c539db200..606da48575e6ba5407c6d0fd029901cb25667200 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -545,7 +545,7 @@ void nr_initiate_ra_proc(module_id_t module_idP,
       if (ra->CellGroup && ra->CellGroup->spCellConfig && ra->CellGroup->spCellConfig->spCellConfigDedicated &&
           ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList) {
         ra->bwp_id = 1;
-	      bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1];
+        bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1];
       }
 
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 1);
@@ -653,33 +653,228 @@ void nr_initiate_ra_proc(module_id_t module_idP,
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 0);
 }
 
-  void nr_schedule_RA(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
-  {
-    gNB_MAC_INST *mac = RC.nrmac[module_idP];
-
-    start_meas(&mac->schedule_ra);
-    for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
-      NR_COMMON_channels_t *cc = &mac->common_channels[CC_id];
-      for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) {
-        NR_RA_t *ra = &cc->ra[i];
-        LOG_D(NR_MAC, "RA[state:%d]\n", ra->state);
-        switch (ra->state) {
-          case Msg2:
-            nr_generate_Msg2(module_idP, CC_id, frameP, slotP, ra);
-            break;
-          case Msg4:
-            nr_generate_Msg4(module_idP, CC_id, frameP, slotP, ra);
-            break;
-          case WAIT_Msg4_ACK:
-            nr_check_Msg4_Ack(module_idP, CC_id, frameP, slotP, ra);
-            break;
-          default:
-            break;
-        }
+void nr_schedule_RA(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) {
+
+  gNB_MAC_INST *mac = RC.nrmac[module_idP];
+
+  start_meas(&mac->schedule_ra);
+  for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
+    NR_COMMON_channels_t *cc = &mac->common_channels[CC_id];
+    for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) {
+      NR_RA_t *ra = &cc->ra[i];
+      LOG_D(NR_MAC, "RA[state:%d]\n", ra->state);
+      switch (ra->state) {
+        case Msg2:
+          nr_generate_Msg2(module_idP, CC_id, frameP, slotP, ra);
+          break;
+        case Msg3_retransmission:
+          nr_generate_Msg3_retransmission(module_idP, CC_id, frameP, slotP, ra);
+          break;
+        case Msg4:
+          nr_generate_Msg4(module_idP, CC_id, frameP, slotP, ra);
+          break;
+        case WAIT_Msg4_ACK:
+          nr_check_Msg4_Ack(module_idP, CC_id, frameP, slotP, ra);
+          break;
+        default:
+          break;
       }
     }
-    stop_meas(&mac->schedule_ra);
   }
+  stop_meas(&mac->schedule_ra);
+}
+
+
+void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t frame, sub_frame_t slot, NR_RA_t *ra) {
+
+  gNB_MAC_INST *nr_mac = RC.nrmac[module_idP];
+  NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id];
+  NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
+
+  NR_BWP_Uplink_t *ubwp = ra->CellGroup ?
+    ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id-1] :
+    NULL;
+
+  NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList= ubwp ?
+    ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList:
+    scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+
+  int mu = ubwp ?
+    ubwp->bwp_Common->genericParameters.subcarrierSpacing :
+    scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
+
+  uint8_t K2 = *pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->k2;
+
+  const int sched_frame = frame + (slot + K2 >= nr_slots_per_frame[mu]);
+  const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
+
+  if (is_xlsch_in_slot(RC.nrmac[module_idP]->ulsch_slot_bitmap[sched_slot / 64], sched_slot)) {
+    // beam association for FR2
+    int16_t *tdd_beam_association = nr_mac->tdd_beam_association;
+    if (*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] >= 257) {
+      uint8_t tdd_period_slot =  scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots + scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
+      if ((scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols > 0) || (scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols > 0))
+        tdd_period_slot++;
+      int num_tdd_period = sched_slot/tdd_period_slot;
+      if((tdd_beam_association[num_tdd_period]!=-1)&&(tdd_beam_association[num_tdd_period]!=ra->beam_id))
+        return; // can't schedule retransmission in this slot
+      else
+        tdd_beam_association[num_tdd_period] = ra->beam_id;
+    }
+
+    int bwpSize = NRRIV2BW(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+    int bwpStart = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+    int scs = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
+    int fh = 0;
+    int startSymbolAndLength = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->startSymbolAndLength;
+    int mappingtype = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->mappingType;
+
+    if (ra->CellGroup) {
+      AssertFatal(ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1,
+                  "downlinkBWP_ToAddModList has %d BWP!\n", ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count);
+      int act_bwp_start = NRRIV2PRBOFFSET(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+      int act_bwp_size  = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+      startSymbolAndLength = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->startSymbolAndLength;
+      mappingtype = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->mappingType;
+      scs = ubwp->bwp_Common->genericParameters.subcarrierSpacing;
+      fh = ubwp->bwp_Dedicated->pusch_Config->choice.setup->frequencyHopping ? 1 : 0;
+      if ((bwpStart < act_bwp_start) || (bwpSize > act_bwp_size))
+        bwpStart = act_bwp_start;
+    }
+    uint16_t *vrb_map_UL =
+        &RC.nrmac[module_idP]->common_channels[CC_id].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
+
+    int rbStart = 0;
+    for (int i = 0; (i < ra->msg3_nb_rb) && (rbStart <= (bwpSize - ra->msg3_nb_rb)); i++) {
+      if (vrb_map_UL[rbStart + bwpStart + i]) {
+        rbStart += i;
+        i = 0;
+      }
+    }
+    if (rbStart > (bwpSize - ra->msg3_nb_rb)) {
+      // cannot find free vrb_map for msg3 retransmission in this slot
+      return;
+    }
+
+    LOG_I(NR_MAC, "[gNB %d][RAPROC] Frame %d, Slot %d : CC_id %d Scheduling retransmission of Msg3 in (%d,%d)\n",
+          module_idP, frame, slot, CC_id, sched_frame, sched_slot);
+
+    nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_idP]->UL_tti_req_ahead[CC_id][sched_slot];
+    AssertFatal(future_ul_tti_req->SFN == sched_frame
+                && future_ul_tti_req->Slot == sched_slot,
+                "future UL_tti_req's frame.slot %d.%d does not match PUSCH %d.%d\n",
+                future_ul_tti_req->SFN,
+                future_ul_tti_req->Slot,
+                sched_frame,
+                sched_slot);
+    future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE;
+    future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pusch_pdu_t);
+    nfapi_nr_pusch_pdu_t *pusch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pusch_pdu;
+    memset(pusch_pdu, 0, sizeof(nfapi_nr_pusch_pdu_t));
+
+    fill_msg3_pusch_pdu(pusch_pdu, scc,
+                        ra->msg3_round,
+                        startSymbolAndLength,
+                        ra->rnti, scs,
+                        bwpSize, bwpStart,
+                        mappingtype, fh,
+                        rbStart, ra->msg3_nb_rb);
+    future_ul_tti_req->n_pdus += 1;
+
+    // generation of DCI 0_0 to schedule msg3 retransmission
+    NR_SearchSpace_t *ss = ra->ra_ss;
+    NR_BWP_Downlink_t *bwp = NULL;
+    NR_ControlResourceSet_t *coreset = NULL;
+
+    NR_BWP_t *genericParameters = NULL;
+    if (ra->CellGroup &&
+        ra->CellGroup->spCellConfig &&
+        ra->CellGroup->spCellConfig->spCellConfigDedicated &&
+        ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList &&
+        ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1]) {
+      bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1];
+      genericParameters = &bwp->bwp_Common->genericParameters;
+    }
+    else {
+      genericParameters= &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
+    }
+
+    if (*ss->controlResourceSetId == 0)
+      coreset = nr_mac->sched_ctrlCommon->coreset; // this is coreset 0
+    else
+      coreset = get_coreset(scc, bwp, ss, NR_SearchSpace__searchSpaceType_PR_common);
+    AssertFatal(coreset!=NULL,"Coreset cannot be null for RA-Msg3 retransmission\n");
+
+    nfapi_nr_ul_dci_request_t *ul_dci_req = &nr_mac->UL_dci_req[CC_id];
+
+    const int coresetid = coreset->controlResourceSetId;
+    nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][ra->bwp_id][coresetid];
+    if (!pdcch_pdu_rel15) {
+      nfapi_nr_ul_dci_request_pdus_t *ul_dci_request_pdu = &ul_dci_req->ul_dci_pdu_list[ul_dci_req->numPdus];
+      memset(ul_dci_request_pdu, 0, sizeof(nfapi_nr_ul_dci_request_pdus_t));
+      ul_dci_request_pdu->PDUType = NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE;
+      ul_dci_request_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu));
+      pdcch_pdu_rel15 = &ul_dci_request_pdu->pdcch_pdu.pdcch_pdu_rel15;
+      ul_dci_req->numPdus += 1;
+      nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, genericParameters, NULL);
+      nr_mac->pdcch_pdu_idx[CC_id][ra->bwp_id][coresetid] = pdcch_pdu_rel15;
+    }
+
+    uint8_t aggregation_level;
+    uint8_t nr_of_candidates;
+    find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss);
+    int CCEIndex = allocate_nr_CCEs(nr_mac, bwp, coreset, aggregation_level, 0, 0, nr_of_candidates);
+    if (CCEIndex < 0) {
+      LOG_E(NR_MAC, "%s(): cannot find free CCE for RA RNTI %04x!\n", __func__, ra->rnti);
+      return;
+    }
+
+    // Fill PDCCH DL DCI PDU
+    nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci];
+    pdcch_pdu_rel15->numDlDci++;
+    dci_pdu->RNTI = ra->rnti;
+    dci_pdu->ScramblingId = *scc->physCellId;
+    dci_pdu->ScramblingRNTI = 0;
+    dci_pdu->AggregationLevel = aggregation_level;
+    dci_pdu->CceIndex = CCEIndex;
+    dci_pdu->beta_PDCCH_1_0 = 0;
+    dci_pdu->powerControlOffsetSS = 1;
+
+    dci_pdu_rel15_t uldci_payload;
+    memset(&uldci_payload, 0, sizeof(uldci_payload));
+
+    config_uldci(ubwp,
+                 scc,
+                 pusch_pdu,
+                 &uldci_payload,
+                 NR_UL_DCI_FORMAT_0_0,
+                 ra->Msg3_tda_id,
+                 ra->msg3_TPC,
+                 0, // not used in format 0_0
+                 ra->bwp_id);
+
+    fill_dci_pdu_rel15(scc,
+                       ra->CellGroup,
+                       dci_pdu,
+                       &uldci_payload,
+                       NR_UL_DCI_FORMAT_0_0,
+                       NR_RNTI_TC,
+                       pusch_pdu->bwp_size,
+                       ra->bwp_id);
+
+    // Mark the corresponding RBs as used
+    for (int rb = 0; rb < ra->msg3_nb_rb; rb++) {
+      vrb_map_UL[rbStart + bwpStart + rb] = 1;
+    }
+
+    // reset state to wait msg3
+    ra->state = WAIT_Msg3;
+    ra->Msg3_frame = sched_frame;
+    ra->Msg3_slot = sched_slot;
+
+  }
+
+}
 
 void nr_get_Msg3alloc(module_id_t module_id,
                       int CC_id,
@@ -690,45 +885,45 @@ void nr_get_Msg3alloc(module_id_t module_id,
                       NR_RA_t *ra,
                       int16_t *tdd_beam_association) {
 
-    // msg3 is schedulend in mixed slot in the following TDD period
-
-    uint16_t msg3_nb_rb = 8 + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT); // sdu has 6 or 8 bytes
-
-    int mu = ubwp ?
-      ubwp->bwp_Common->genericParameters.subcarrierSpacing :
-      scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
-    int StartSymbolIndex = 0;
-    int NrOfSymbols = 0;
-    int startSymbolAndLength = 0;
-    int temp_slot = 0;
-    ra->Msg3_tda_id = 16; // initialization to a value above limit
-
-    NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList= ubwp ?
-      ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList:
-      scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
-
-    uint8_t k2 = 0;
-    for (int i=0; i<pusch_TimeDomainAllocationList->list.count; i++) {
-      startSymbolAndLength = pusch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength;
-      SLIV2SL(startSymbolAndLength, &StartSymbolIndex, &NrOfSymbols);
-      // we want to transmit in the uplink symbols of mixed slot
-      if (NrOfSymbols == scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols) {
-        k2 = *pusch_TimeDomainAllocationList->list.array[i]->k2;
-        temp_slot = current_slot + k2 + DELTA[mu]; // msg3 slot according to 8.3 in 38.213
-        ra->Msg3_slot = temp_slot%nr_slots_per_frame[mu];
-        if (is_xlsch_in_slot(RC.nrmac[module_id]->ulsch_slot_bitmap[ra->Msg3_slot / 64], ra->Msg3_slot)) {
-          ra->Msg3_tda_id = i;
-          break;
-        }
+  // msg3 is scheduled in mixed slot in the following TDD period
+
+  uint16_t msg3_nb_rb = 8 + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT); // sdu has 6 or 8 bytes
+
+  int mu = ubwp ?
+    ubwp->bwp_Common->genericParameters.subcarrierSpacing :
+    scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
+  int StartSymbolIndex = 0;
+  int NrOfSymbols = 0;
+  int startSymbolAndLength = 0;
+  int temp_slot = 0;
+  ra->Msg3_tda_id = 16; // initialization to a value above limit
+
+  NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList= ubwp ?
+    ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList:
+    scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+
+  uint8_t k2 = 0;
+  for (int i=0; i<pusch_TimeDomainAllocationList->list.count; i++) {
+    startSymbolAndLength = pusch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength;
+    SLIV2SL(startSymbolAndLength, &StartSymbolIndex, &NrOfSymbols);
+    // we want to transmit in the uplink symbols of mixed slot
+    if (NrOfSymbols == scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols) {
+      k2 = *pusch_TimeDomainAllocationList->list.array[i]->k2;
+      temp_slot = current_slot + k2 + DELTA[mu]; // msg3 slot according to 8.3 in 38.213
+      ra->Msg3_slot = temp_slot%nr_slots_per_frame[mu];
+      if (is_xlsch_in_slot(RC.nrmac[module_id]->ulsch_slot_bitmap[ra->Msg3_slot / 64], ra->Msg3_slot)) {
+        ra->Msg3_tda_id = i;
+        break;
       }
     }
+  }
 
-    AssertFatal(ra->Msg3_tda_id<16,"Unable to find Msg3 time domain allocation in list\n");
+  AssertFatal(ra->Msg3_tda_id<16,"Unable to find Msg3 time domain allocation in list\n");
 
-    if (nr_slots_per_frame[mu]>temp_slot)
-      ra->Msg3_frame = current_frame;
-    else
-      ra->Msg3_frame = (current_frame + (temp_slot/nr_slots_per_frame[mu]))%1024;
+  if (nr_slots_per_frame[mu]>temp_slot)
+    ra->Msg3_frame = current_frame;
+  else
+    ra->Msg3_frame = (current_frame + (temp_slot/nr_slots_per_frame[mu]))%1024;
 
   // beam association for FR2
   if (*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] >= 257) {
@@ -750,7 +945,7 @@ void nr_get_Msg3alloc(module_id_t module_id,
 				    scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth,
 				    MAX_BWP_SIZE);
 
-    /* search msg3_nb_rb free RBs */
+  /* search msg3_nb_rb free RBs */
   int rbSize = 0;
   int rbStart = 0;
   while (rbSize < msg3_nb_rb) {
@@ -768,6 +963,75 @@ void nr_get_Msg3alloc(module_id_t module_id,
   ra->msg3_first_rb = rbStart;
 }
 
+
+void fill_msg3_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu,
+                         NR_ServingCellConfigCommon_t *scc,
+                         int round,
+                         int startSymbolAndLength,
+                         rnti_t rnti, int scs,
+                         int bwp_size, int bwp_start,
+                         int mappingtype, int fh,
+                         int msg3_first_rb, int msg3_nb_rb) {
+
+
+  int start_symbol_index,nr_of_symbols;
+  SLIV2SL(startSymbolAndLength, &start_symbol_index, &nr_of_symbols);
+
+  pusch_pdu->pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA;
+  pusch_pdu->rnti = rnti;
+  pusch_pdu->handle = 0;
+  pusch_pdu->bwp_start = bwp_start;
+  pusch_pdu->bwp_size = bwp_size;
+  pusch_pdu->subcarrier_spacing = scs;
+  pusch_pdu->cyclic_prefix = 0;
+  pusch_pdu->mcs_index = 0;
+  pusch_pdu->mcs_table = 0;
+  pusch_pdu->target_code_rate = nr_get_code_rate_ul(pusch_pdu->mcs_index,pusch_pdu->mcs_table);
+  pusch_pdu->qam_mod_order = nr_get_Qm_ul(pusch_pdu->mcs_index,pusch_pdu->mcs_table);
+  if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL)
+    pusch_pdu->transform_precoding = 1;
+  else
+    pusch_pdu->transform_precoding = 0;
+  pusch_pdu->data_scrambling_id = *scc->physCellId;
+  pusch_pdu->nrOfLayers = 1;
+  pusch_pdu->ul_dmrs_symb_pos = get_l_prime(nr_of_symbols,mappingtype,pusch_dmrs_pos2,pusch_len1,start_symbol_index, scc->dmrs_TypeA_Position);
+  LOG_D(MAC, "MSG3 start_sym:%d NR Symb:%d mappingtype:%d , ul_dmrs_symb_pos:%x\n", start_symbol_index, nr_of_symbols, mappingtype, pusch_pdu->ul_dmrs_symb_pos);
+  pusch_pdu->dmrs_config_type = 0;
+  pusch_pdu->ul_dmrs_scrambling_id = *scc->physCellId; //If provided and the PUSCH is not a msg3 PUSCH, otherwise, L2 should set this to physical cell id.
+  pusch_pdu->scid = 0; //DMRS sequence initialization [TS38.211, sec 6.4.1.1.1]. Should match what is sent in DCI 0_1, otherwise set to 0.
+  pusch_pdu->dmrs_ports = 1;  // 6.2.2 in 38.214 only port 0 to be used
+  pusch_pdu->num_dmrs_cdm_grps_no_data = 2;  // no data in dmrs symbols as in 6.2.2 in 38.214
+  pusch_pdu->resource_alloc = 1; //type 1
+
+  pusch_pdu->rb_start = msg3_first_rb;
+  if (msg3_nb_rb > pusch_pdu->bwp_size)
+    AssertFatal(1==0,"MSG3 allocated number of RBs exceed the BWP size\n");
+  else
+    pusch_pdu->rb_size = msg3_nb_rb;
+  pusch_pdu->vrb_to_prb_mapping = 0;
+
+  pusch_pdu->frequency_hopping = fh;
+  //pusch_pdu->tx_direct_current_location;//The uplink Tx Direct Current location for the carrier. Only values in the value range of this field between 0 and 3299, which indicate the subcarrier index within the carrier corresponding 1o the numerology of the corresponding uplink BWP and value 3300, which indicates "Outside the carrier" and value 3301, which indicates "Undetermined position within the carrier" are used. [TS38.331, UplinkTxDirectCurrentBWP IE]
+  pusch_pdu->uplink_frequency_shift_7p5khz = 0;
+  //Resource Allocation in time domain
+  pusch_pdu->start_symbol_index = start_symbol_index;
+  pusch_pdu->nr_of_symbols = nr_of_symbols;
+  //Optional Data only included if indicated in pduBitmap
+  pusch_pdu->pusch_data.rv_index = nr_rv_round_map[round];
+  pusch_pdu->pusch_data.harq_process_id = 0;
+  pusch_pdu->pusch_data.new_data_indicator = 1;
+  pusch_pdu->pusch_data.num_cb = 0;
+  pusch_pdu->pusch_data.tb_size = nr_compute_tbs(pusch_pdu->qam_mod_order,
+                                                 pusch_pdu->target_code_rate,
+                                                 pusch_pdu->rb_size,
+                                                 pusch_pdu->nr_of_symbols,
+                                                 12, // nb dmrs set for no data in dmrs symbol
+                                                 0, //nb_rb_oh
+                                                 0, // to verify tb scaling
+                                                 pusch_pdu->nrOfLayers)>>3;
+
+}
+
 void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP, NR_RA_t *ra, uint8_t *RAR_pdu)
 {
   gNB_MAC_INST                                   *mac = RC.nrmac[module_idP];
@@ -790,7 +1054,7 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
     vrb_map_UL[i + ra->msg3_first_rb] = 1;
   }
 
-  LOG_D(NR_MAC, "[gNB %d][RAPROC] Frame %d, Subframe %d : CC_id %d RA is active, Msg3 in (%d,%d)\n", module_idP, frameP, slotP, CC_id, ra->Msg3_frame, ra->Msg3_slot);
+  LOG_D(NR_MAC, "[gNB %d][RAPROC] Frame %d, Slot %d : CC_id %d RA is active, Msg3 in (%d,%d)\n", module_idP, frameP, slotP, CC_id, ra->Msg3_frame, ra->Msg3_slot);
 
   nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_idP]->UL_tti_req_ahead[CC_id][ra->Msg3_slot];
   AssertFatal(future_ul_tti_req->SFN == ra->Msg3_frame
@@ -804,7 +1068,7 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
   future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pusch_pdu_t);
   nfapi_nr_pusch_pdu_t *pusch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pusch_pdu;
   memset(pusch_pdu, 0, sizeof(nfapi_nr_pusch_pdu_t));
-  future_ul_tti_req->n_pdus += 1;
+
   int ibwp_size  = NRRIV2BW(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
   int ibwp_start = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
   int abwp_size = ibwp_size;
@@ -837,67 +1101,20 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
     ra->msg3_round,
     ra->rnti);
 
-  int start_symbol_index,nr_of_symbols;
-  SLIV2SL(startSymbolAndLength, &start_symbol_index, &nr_of_symbols);
-
-  pusch_pdu->pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA;
-  pusch_pdu->rnti = ra->rnti;
-  pusch_pdu->handle = 0;
-
+  int bwp_start;
   if ((ibwp_start < abwp_start) || (ibwp_size > abwp_size))
-    pusch_pdu->bwp_start = abwp_start;
-  else
-    pusch_pdu->bwp_start = ibwp_start;
-  pusch_pdu->bwp_size = ibwp_size;
-  pusch_pdu->subcarrier_spacing = scs;
-  pusch_pdu->cyclic_prefix = 0;
-  pusch_pdu->mcs_index = 0;
-  pusch_pdu->mcs_table = 0;
-  pusch_pdu->target_code_rate = nr_get_code_rate_ul(pusch_pdu->mcs_index,pusch_pdu->mcs_table);
-  pusch_pdu->qam_mod_order = nr_get_Qm_ul(pusch_pdu->mcs_index,pusch_pdu->mcs_table);
-  if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL)
-    pusch_pdu->transform_precoding = 1;
+    bwp_start = abwp_start;
   else
-    pusch_pdu->transform_precoding = 0;
-  pusch_pdu->data_scrambling_id = *scc->physCellId;
-  pusch_pdu->nrOfLayers = 1;
-
-  pusch_pdu->ul_dmrs_symb_pos = get_l_prime(nr_of_symbols,mappingtype,pusch_dmrs_pos2,pusch_len1,start_symbol_index, scc->dmrs_TypeA_Position);
-  LOG_D(MAC, "MSG3 start_sym:%d NR Symb:%d mappingtype:%d , ul_dmrs_symb_pos:%x\n", start_symbol_index, nr_of_symbols, mappingtype, pusch_pdu->ul_dmrs_symb_pos);
-
-  pusch_pdu->dmrs_config_type = 0;
-  pusch_pdu->ul_dmrs_scrambling_id = *scc->physCellId; //If provided and the PUSCH is not a msg3 PUSCH, otherwise, L2 should set this to physical cell id.
-  pusch_pdu->scid = 0; //DMRS sequence initialization [TS38.211, sec 6.4.1.1.1]. Should match what is sent in DCI 0_1, otherwise set to 0.
-  pusch_pdu->dmrs_ports = 1;  // 6.2.2 in 38.214 only port 0 to be used
-  pusch_pdu->num_dmrs_cdm_grps_no_data = 2;  // no data in dmrs symbols as in 6.2.2 in 38.214
-  pusch_pdu->resource_alloc = 1; //type 1
-  //pusch_pdu->rb_start = ra->msg3_first_rb + ibwp_start - abwp_start; // as for 6.3.1.7 in 38.211
-  pusch_pdu->rb_start = ra->msg3_first_rb;
-  if (ra->msg3_nb_rb > pusch_pdu->bwp_size)
-    AssertFatal(1==0,"MSG3 allocated number of RBs exceed the BWP size\n");
-  else
-    pusch_pdu->rb_size = ra->msg3_nb_rb;
-  pusch_pdu->vrb_to_prb_mapping = 0;
-
-  pusch_pdu->frequency_hopping = fh;
-  //pusch_pdu->tx_direct_current_location;//The uplink Tx Direct Current location for the carrier. Only values in the value range of this field between 0 and 3299, which indicate the subcarrier index within the carrier corresponding 1o the numerology of the corresponding uplink BWP and value 3300, which indicates "Outside the carrier" and value 3301, which indicates "Undetermined position within the carrier" are used. [TS38.331, UplinkTxDirectCurrentBWP IE]
-  pusch_pdu->uplink_frequency_shift_7p5khz = 0;
-  //Resource Allocation in time domain
-  pusch_pdu->start_symbol_index = start_symbol_index;
-  pusch_pdu->nr_of_symbols = nr_of_symbols;
-  //Optional Data only included if indicated in pduBitmap
-  pusch_pdu->pusch_data.rv_index = 0;  // 8.3 in 38.213
-  pusch_pdu->pusch_data.harq_process_id = 0;
-  pusch_pdu->pusch_data.new_data_indicator = 1; // new data
-  pusch_pdu->pusch_data.num_cb = 0;
-  pusch_pdu->pusch_data.tb_size = nr_compute_tbs(pusch_pdu->qam_mod_order,
-                                                 pusch_pdu->target_code_rate,
-                                                 pusch_pdu->rb_size,
-                                                 pusch_pdu->nr_of_symbols,
-                                                 12, // nb dmrs set for no data in dmrs symbol
-                                                 0, //nb_rb_oh
-                                                 0, // to verify tb scaling
-                                                 pusch_pdu->nrOfLayers = 1)>>3;
+    bwp_start = ibwp_start;
+
+  fill_msg3_pusch_pdu(pusch_pdu,scc,
+                      ra->msg3_round,
+                      startSymbolAndLength,
+                      ra->rnti, scs,
+                      ibwp_size, bwp_start,
+                      mappingtype, fh,
+                      ra->msg3_first_rb, ra->msg3_nb_rb);
+  future_ul_tti_req->n_pdus += 1;
 
   // calling function to fill rar message
   nr_fill_rar(module_idP, ra, RAR_pdu, pusch_pdu);
@@ -941,7 +1158,11 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
       pdsch_TimeDomainAllocationList = scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
     }
     BWPStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
-    coreset = get_coreset(scc,bwp, ss, NR_SearchSpace__searchSpaceType_PR_common);
+
+    if (*ss->controlResourceSetId == 0)
+      coreset = nr_mac->sched_ctrlCommon->coreset; // this is coreset 0
+    else
+      coreset = get_coreset(scc, bwp, ss, NR_SearchSpace__searchSpaceType_PR_common);
 
     AssertFatal(coreset!=NULL,"Coreset cannot be null for RA-Msg2\n");
 
@@ -996,7 +1217,7 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
       dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2 + sizeof(nfapi_nr_dl_tti_pdcch_pdu));
       dl_req->nPDUs += 1;
       pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
-      nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, bwp);
+      nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, genericParameters, NULL);
       nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu_rel15;
     }
 
@@ -1191,7 +1412,11 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
       genericParameters= &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
       pdsch_TimeDomainAllocationList = scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
     }
-    coreset = get_coreset(scc,bwp, ss, NR_SearchSpace__searchSpaceType_PR_common);
+
+    if (*ss->controlResourceSetId == 0)
+      coreset = nr_mac->sched_ctrlCommon->coreset; // this is coreset 0
+    else
+      coreset = get_coreset(scc, bwp, ss, NR_SearchSpace__searchSpaceType_PR_common);
 
     AssertFatal(coreset!=NULL,"Coreset cannot be null for RA-Msg4\n");
 
@@ -1202,11 +1427,15 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
     long BWPSize  = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
     long BWPStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
 
+    /* get the PID of a HARQ process awaiting retrnasmission, or -1 otherwise */
+    int current_harq_pid = sched_ctrl->retrans_dl_harq.head;
     // HARQ management
-    AssertFatal(sched_ctrl->available_dl_harq.head >= 0,
-                "UE context not initialized: no HARQ processes found\n");
-    int current_harq_pid = sched_ctrl->available_dl_harq.head;
-    remove_front_nr_list(&sched_ctrl->available_dl_harq);
+    if (current_harq_pid < 0) {
+      AssertFatal(sched_ctrl->available_dl_harq.head >= 0,
+                  "UE context not initialized: no HARQ processes found\n");
+      current_harq_pid = sched_ctrl->available_dl_harq.head;
+      remove_front_nr_list(&sched_ctrl->available_dl_harq);
+    }
     NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid];
     DevAssert(!harq->is_waiting);
     add_tail_nr_list(&sched_ctrl->feedback_dl_harq, current_harq_pid);
@@ -1239,18 +1468,19 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
     harq->feedback_slot = pucch->ul_slot;
     harq->feedback_frame = pucch->frame;
 
-    // Bytes to be transmitted
     uint8_t *buf = (uint8_t *) harq->tb;
-    uint16_t mac_pdu_length = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, buf, 255, ra->cont_res_id);
-    LOG_D(NR_MAC,"Encoded contention resolution mac_pdu_length %d\n",mac_pdu_length);
-    uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, &buf[mac_pdu_length+2]);
-    ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->R = 0;
-    ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->F = 0;
-    ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH;
-    ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->L = mac_sdu_length;
-    mac_pdu_length = mac_pdu_length + mac_sdu_length + sizeof(NR_MAC_SUBHEADER_SHORT);
-
-    LOG_D(NR_MAC,"Encoded RRCSetup Piggyback (%d + %d bytes), mac_pdu_length %d\n", mac_sdu_length, (int)sizeof(NR_MAC_SUBHEADER_SHORT), mac_pdu_length);
+    // Bytes to be transmitted
+    if (harq->round == 0) {
+      uint16_t mac_pdu_length = nr_write_ce_dlsch_pdu(module_idP, nr_mac->sched_ctrlCommon, buf, 255, ra->cont_res_id);
+      LOG_D(NR_MAC,"Encoded contention resolution mac_pdu_length %d\n",mac_pdu_length);
+      uint16_t mac_sdu_length = mac_rrc_nr_data_req(module_idP, CC_id, frameP, CCCH, ra->rnti, 1, &buf[mac_pdu_length+2]);
+      ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->R = 0;
+      ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->F = 0;
+      ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->LCID = DL_SCH_LCID_CCCH;
+      ((NR_MAC_SUBHEADER_SHORT *) &buf[mac_pdu_length])->L = mac_sdu_length;
+      ra->mac_pdu_length = mac_pdu_length + mac_sdu_length + sizeof(NR_MAC_SUBHEADER_SHORT);
+      LOG_D(NR_MAC,"Encoded RRCSetup Piggyback (%d + %d bytes), mac_pdu_length %d\n", mac_sdu_length, (int)sizeof(NR_MAC_SUBHEADER_SHORT), ra->mac_pdu_length);
+    }
 
     // Calculate number of symbols
     int startSymbolIndex, nrOfSymbols;
@@ -1311,12 +1541,15 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
       harq->tb_size = nr_compute_tbs(nr_get_Qm_dl(mcsIndex, mcsTableIdx),
                            nr_get_code_rate_dl(mcsIndex, mcsTableIdx),
                            rbSize, nrOfSymbols, N_PRB_DMRS * N_DMRS_SLOT, 0, tb_scaling,1) >> 3;
-    } while (rbStart + rbSize < BWPSize && !vrb_map[rbStart + rbSize] && harq->tb_size < mac_pdu_length);
+    } while (rbSize < BWPSize && harq->tb_size < ra->mac_pdu_length);
 
-    for (int i = 0; (i < rbSize) && (rbStart <= (BWPSize - rbSize)); i++) {
+    int i = 0;
+    while ((i < rbSize) && (rbStart + rbSize <= BWPSize)) {
       if (vrb_map[rbStart + i]) {
-        rbStart += i;
+        rbStart += i+1;
         i = 0;
+      } else {
+        i++;
       }
     }
 
@@ -1345,7 +1578,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
       dl_tti_pdcch_pdu->PDUSize = (uint8_t)(2 + sizeof(nfapi_nr_dl_tti_pdcch_pdu));
       dl_req->nPDUs += 1;
       pdcch_pdu_rel15 = &dl_tti_pdcch_pdu->pdcch_pdu.pdcch_pdu_rel15;
-      nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, bwp);
+      nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, genericParameters, NULL);
       nr_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu_rel15;
     }
 
@@ -1462,15 +1695,18 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
                        bwpid);
 
     // Add padding header and zero rest out if there is space left
-    if (mac_pdu_length < harq->tb_size) {
-      NR_MAC_SUBHEADER_FIXED *padding = (NR_MAC_SUBHEADER_FIXED *) &buf[mac_pdu_length];
+    if (ra->mac_pdu_length < harq->tb_size) {
+      NR_MAC_SUBHEADER_FIXED *padding = (NR_MAC_SUBHEADER_FIXED *) &buf[ra->mac_pdu_length];
       padding->R = 0;
       padding->LCID = DL_SCH_LCID_PADDING;
-      for(int k = mac_pdu_length+1; k<harq->tb_size; k++) {
+      for(int k = ra->mac_pdu_length+1; k<harq->tb_size; k++) {
         buf[k] = 0;
       }
     }
 
+    T(T_GNB_MAC_DL_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), T_INT(ra->rnti),
+      T_INT(frameP), T_INT(slotP), T_INT(current_harq_pid), T_BUFFER(harq->tb, harq->tb_size));
+
     // DL TX request
     nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs];
     memcpy(tx_req->TLVs[0].value.direct, harq->tb, sizeof(uint8_t) * harq->tb_size);
@@ -1514,24 +1750,32 @@ void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_fram
 
   NR_UE_info_t *UE_info = &RC.nrmac[module_id]->UE_info;
   NR_UE_harq_t *harq = &UE_info->UE_sched_ctrl[UE_id].harq_processes[current_harq_pid];
+  NR_mac_stats_t *stats = &UE_info->mac_stats[UE_id];
 
   LOG_D(NR_MAC, "ue %d, rnti %d, harq is waiting %d, round %d, frame %d %d, harq id %d\n", UE_id, ra->rnti, harq->is_waiting, harq->round, frame, slot, current_harq_pid);
 
-  if (harq->is_waiting == 0)
-  {
-    if (harq->round == 0)
-    {
-      LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", UE_id, ra->rnti);
-      nr_clear_ra_proc(module_id, CC_id, frame, ra);
-      UE_info->active[UE_id] = true;
-      UE_info->Msg4_ACKed[UE_id] = true;
+  if (harq->is_waiting == 0) {
+    if (harq->round == 0) {
+      if (stats->dlsch_errors == 0) {
+        LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Ack of RA-Msg4. CBRA procedure succeeded!\n", UE_id, ra->rnti);
+        nr_clear_ra_proc(module_id, CC_id, frame, ra);
+        UE_info->active[UE_id] = true;
+        UE_info->Msg4_ACKed[UE_id] = true;
+      }
+      else {
+        LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) RA Procedure failed at Msg4!\n", UE_id, ra->rnti);
+        nr_mac_remove_ra_rnti(module_id, ra->rnti);
+        nr_clear_ra_proc(module_id, CC_id, frame, ra);
+        mac_remove_nr_ue(module_id, ra->rnti);
+      }
     }
-    else
-    {
+    else {
+      LOG_I(NR_MAC, "(ue %i, rnti 0x%04x) Received Nack of RA-Msg4. Preparing retransmission!\n", UE_id, ra->rnti);
+      ra->Msg4_frame = (frame + 1) % 1024;
+      ra->Msg4_slot = 1;
       ra->state = Msg4;
     }
   }
-
 }
 
 void nr_clear_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP, NR_RA_t *ra){
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
index fbd08f18c48297f04f2e54f2ca4e2aa1de161b81..b74432b2ae1462d707a325e36266a9dc6c558f71 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
@@ -220,6 +220,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
                                                         scs,
                                                         FR1,
                                                         i_ssb,
+                                                        ssb_frame_periodicity,
                                                         offset_pointa);
                   gNB->type0_PDCCH_CSS_config[i_ssb].active = true;
                 }
@@ -246,6 +247,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
                                                         scs,
                                                         FR1,
                                                         i_ssb,
+                                                        ssb_frame_periodicity,
                                                         offset_pointa);
                   gNB->type0_PDCCH_CSS_config[i_ssb].active = true;
                 }
@@ -280,6 +282,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
                                                         scs,
                                                         FR2,
                                                         i_ssb,
+                                                        ssb_frame_periodicity,
                                                         offset_pointa);
                   gNB->type0_PDCCH_CSS_config[i_ssb].active = true;
                 }
@@ -313,40 +316,43 @@ void fill_ssb_vrb_map (NR_COMMON_channels_t *cc, int rbStart,  uint16_t symStart
 
 }
 
-void schedule_control_sib1(module_id_t module_id,
-                           int CC_id,
-                           NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
-                           int time_domain_allocation,
-                           uint8_t mcsTableIdx,
-                           uint8_t mcs,
-                           uint8_t candidate_idx,
-                           int num_total_bytes) {
+uint32_t schedule_control_sib1(module_id_t module_id,
+                               int CC_id,
+                               NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
+                               int time_domain_allocation,
+                               int startSymbolIndex,
+                               int nrOfSymbols,
+                               uint16_t dlDmrsSymbPos,
+                               uint8_t candidate_idx,
+                               int num_total_bytes) {
 
   gNB_MAC_INST *gNB_mac = RC.nrmac[module_id];
-  NR_ServingCellConfigCommon_t *servingcellconfigcommon = gNB_mac->common_channels[CC_id].ServingCellConfigCommon;
   uint16_t *vrb_map = RC.nrmac[module_id]->common_channels[CC_id].vrb_map;
+  int ret;
 
   if (gNB_mac->sched_ctrlCommon == NULL){
     LOG_D(NR_MAC,"schedule_control_common: Filling nr_mac->sched_ctrlCommon\n");
     gNB_mac->sched_ctrlCommon = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon));
     gNB_mac->sched_ctrlCommon->search_space = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon->search_space));
     gNB_mac->sched_ctrlCommon->coreset = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon->coreset));
-    gNB_mac->sched_ctrlCommon->active_bwp = calloc(1,sizeof(*gNB_mac->sched_ctrlCommon->active_bwp));
-    fill_default_searchSpaceZero(gNB_mac->sched_ctrlCommon->search_space);
-    fill_default_coresetZero(gNB_mac->sched_ctrlCommon->coreset,servingcellconfigcommon);
-    fill_default_initialDownlinkBWP(gNB_mac->sched_ctrlCommon->active_bwp,servingcellconfigcommon);
+    for (int i=0; i<3; i++){ // loop over possible aggregation levels
+      ret = fill_searchSpaceZero(gNB_mac->sched_ctrlCommon->search_space,type0_PDCCH_CSS_config,4<<i);
+      if (ret == 1) break;
+    }
+    AssertFatal(ret==1,"No aggregation level for type0_PDCCH_CSS found\n");
+    fill_coresetZero(gNB_mac->sched_ctrlCommon->coreset,type0_PDCCH_CSS_config);
   }
 
   gNB_mac->sched_ctrlCommon->pdsch_semi_static.time_domain_allocation = time_domain_allocation;
-  gNB_mac->sched_ctrlCommon->pdsch_semi_static.mcsTableIdx = mcsTableIdx;
-  gNB_mac->sched_ctrlCommon->sched_pdsch.mcs = mcs;
+  gNB_mac->sched_ctrlCommon->pdsch_semi_static.mcsTableIdx = 0;
+  gNB_mac->sched_ctrlCommon->sched_pdsch.mcs = 0; // starting from mcs 0
   gNB_mac->sched_ctrlCommon->num_total_bytes = num_total_bytes;
 
   uint8_t nr_of_candidates;
   find_aggregation_candidates(&gNB_mac->sched_ctrlCommon->aggregation_level, &nr_of_candidates, gNB_mac->sched_ctrlCommon->search_space);
 
   gNB_mac->sched_ctrlCommon->cce_index = allocate_nr_CCEs(RC.nrmac[module_id],
-                                                          gNB_mac->sched_ctrlCommon->active_bwp,
+                                                          NULL,
                                                           gNB_mac->sched_ctrlCommon->coreset,
                                                           gNB_mac->sched_ctrlCommon->aggregation_level,
                                                           0,
@@ -358,17 +364,6 @@ void schedule_control_sib1(module_id_t module_id,
   const uint16_t bwpSize = type0_PDCCH_CSS_config->num_rbs;
   int rbStart = type0_PDCCH_CSS_config->cset_start_rb;
 
-  int startSymbolIndex = 0;
-  int nrOfSymbols = 0;
-
-  if(gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position == 0) {
-    startSymbolIndex = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[gNB_mac->sched_ctrlCommon->pdsch_semi_static.time_domain_allocation][1];
-    nrOfSymbols = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[gNB_mac->sched_ctrlCommon->pdsch_semi_static.time_domain_allocation][2];
-  } else {
-    startSymbolIndex = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[gNB_mac->sched_ctrlCommon->pdsch_semi_static.time_domain_allocation][1];
-    nrOfSymbols = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[gNB_mac->sched_ctrlCommon->pdsch_semi_static.time_domain_allocation][2];
-  }
-
   // TODO: There are exceptions to this in table 5.1.2.1.1-4,5 (Default time domain allocation tables B, C)
   int mappingtype = (startSymbolIndex <= 3)? typeA: typeB;
 
@@ -380,22 +375,32 @@ void schedule_control_sib1(module_id_t module_id,
 
   // Calculate number of PRB_DMRS
   uint8_t N_PRB_DMRS = gNB_mac->sched_ctrlCommon->pdsch_semi_static.numDmrsCdmGrpsNoData * 6;
-  uint16_t dlDmrsSymbPos = fill_dmrs_mask(NULL, gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, nrOfSymbols, startSymbolIndex, mappingtype);
   uint16_t dmrs_length = get_num_dmrs(dlDmrsSymbPos);
 
   LOG_D(MAC,"dlDmrsSymbPos %x\n",dlDmrsSymbPos);
   int rbSize = 0;
   uint32_t TBS = 0;
   do {
-    rbSize++;
+    if(rbSize < bwpSize && !vrb_map[rbStart + rbSize])
+      rbSize++;
+    else{
+      if (gNB_mac->sched_ctrlCommon->sched_pdsch.mcs<10)
+        gNB_mac->sched_ctrlCommon->sched_pdsch.mcs++;
+      else
+        break;
+    }
     TBS = nr_compute_tbs(nr_get_Qm_dl(gNB_mac->sched_ctrlCommon->sched_pdsch.mcs, gNB_mac->sched_ctrlCommon->pdsch_semi_static.mcsTableIdx),
                          nr_get_code_rate_dl(gNB_mac->sched_ctrlCommon->sched_pdsch.mcs, gNB_mac->sched_ctrlCommon->pdsch_semi_static.mcsTableIdx),
                          rbSize, nrOfSymbols, N_PRB_DMRS * dmrs_length,0, 0,1) >> 3;
-  } while (rbStart + rbSize < bwpSize && !vrb_map[rbStart + rbSize] && TBS < gNB_mac->sched_ctrlCommon->num_total_bytes);
+  } while (TBS < gNB_mac->sched_ctrlCommon->num_total_bytes);
+
+  AssertFatal(TBS>=gNB_mac->sched_ctrlCommon->num_total_bytes,"Couldn't allocate enough resources for %d bytes in SIB1 PDSCH\n",
+              gNB_mac->sched_ctrlCommon->num_total_bytes);
 
   gNB_mac->sched_ctrlCommon->sched_pdsch.rbSize = rbSize;
   gNB_mac->sched_ctrlCommon->sched_pdsch.rbStart = 0;
 
+  LOG_D(MAC,"mcs = %i\n", gNB_mac->sched_ctrlCommon->sched_pdsch.mcs);
   LOG_D(MAC,"startSymbolIndex = %i\n", startSymbolIndex);
   LOG_D(MAC,"nrOfSymbols = %i\n", nrOfSymbols);
   LOG_D(MAC, "rbSize = %i\n", gNB_mac->sched_ctrlCommon->sched_pdsch.rbSize);
@@ -408,6 +413,7 @@ void schedule_control_sib1(module_id_t module_id,
   for (int rb = 0; rb < gNB_mac->sched_ctrlCommon->sched_pdsch.rbSize; rb++) {
     vrb_map[rb + rbStart] = 1;
   }
+  return TBS;
 }
 
 void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
@@ -421,7 +427,6 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
   gNB_MAC_INST *gNB_mac = RC.nrmac[Mod_idP];
   NR_COMMON_channels_t *cc = gNB_mac->common_channels;
   NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
-  NR_BWP_Downlink_t *bwp = gNB_mac->sched_ctrlCommon->active_bwp;
 
   nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdcch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
   memset((void*)dl_tti_pdcch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t));
@@ -433,11 +438,8 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
                      gNB_mac->sched_ctrlCommon->search_space,
                      gNB_mac->sched_ctrlCommon->coreset,
                      scc,
-                     bwp);
-
-  // TODO: This assignment should be done in function nr_configure_pdcch()
-  pdcch_pdu_rel15->BWPSize = type0_PDCCH_CSS_config->num_rbs;
-  pdcch_pdu_rel15->BWPStart = type0_PDCCH_CSS_config->cset_start_rb;
+                     NULL,
+                     type0_PDCCH_CSS_config);
 
   nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdsch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
   memset((void*)dl_tti_pdsch_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t));
@@ -455,12 +457,8 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
   pdsch_pdu_rel15->BWPSize  = type0_PDCCH_CSS_config->num_rbs;
   pdsch_pdu_rel15->BWPStart = type0_PDCCH_CSS_config->cset_start_rb;
 
-  pdsch_pdu_rel15->SubcarrierSpacing = bwp->bwp_Common->genericParameters.subcarrierSpacing;
-  if (bwp->bwp_Common->genericParameters.cyclicPrefix) {
-    pdsch_pdu_rel15->CyclicPrefix = *bwp->bwp_Common->genericParameters.cyclicPrefix;
-  } else {
-    pdsch_pdu_rel15->CyclicPrefix = 0;
-  }
+  pdsch_pdu_rel15->SubcarrierSpacing = type0_PDCCH_CSS_config->scs_pdcch;
+  pdsch_pdu_rel15->CyclicPrefix = 0;
 
   pdsch_pdu_rel15->NrOfCodewords = 1;
   pdsch_pdu_rel15->targetCodeRate[0] = nr_get_code_rate_dl(gNB_mac->sched_ctrlCommon->sched_pdsch.mcs, 0);
@@ -505,7 +503,7 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
   dci_pdu_rel15_t dci_payload;
   memset(&dci_payload, 0, sizeof(dci_pdu_rel15_t));
 
-  dci_payload.bwp_indicator.val = gNB_mac->sched_ctrlCommon->active_bwp->bwp_Id;
+  dci_payload.bwp_indicator.val = 0;
 
   // frequency domain assignment
   dci_payload.frequency_domain_assignment.val = PRBalloc_to_locationandbandwidth0(
@@ -533,7 +531,7 @@ void nr_fill_nfapi_dl_sib1_pdu(int Mod_idP,
                      dci_format,
                      rnti_type,
                      pdsch_pdu_rel15->BWPSize,
-                     gNB_mac->sched_ctrlCommon->active_bwp->bwp_Id);
+                     0);
 
   LOG_D(MAC,"BWPSize: %i\n", pdcch_pdu_rel15->BWPSize);
   LOG_D(MAC,"BWPStart: %i\n", pdcch_pdu_rel15->BWPStart);
@@ -556,14 +554,13 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
 
   // TODO: Get these values from RRC
   const int CC_id = 0;
-  int time_domain_allocation = 0;
-  uint8_t mcsTableIdx = 0;
-  uint8_t mcs = 6;
   uint8_t candidate_idx = 0;
 
   gNB_MAC_INST *gNB_mac = RC.nrmac[module_idP];
   NR_ServingCellConfigCommon_t *scc = gNB_mac->common_channels[CC_id].ServingCellConfigCommon;
 
+  int time_domain_allocation = gNB_mac->sib1_tda;
+
   int L_max;
   switch (scc->ssb_PositionsInBurst->present) {
     case 1:
@@ -599,30 +596,27 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
       for (int k=0;k<sib1_sdu_length;k++)
         LOG_D(NR_MAC,"byte %d : %x\n",k,((uint8_t*)sib1_payload)[k]);
 
-      // Configure sched_ctrlCommon for SIB1
-      schedule_control_sib1(module_idP, CC_id, type0_PDCCH_CSS_config, time_domain_allocation, mcsTableIdx, mcs, candidate_idx, sib1_sdu_length);
-
       int startSymbolIndex = 0;
       int nrOfSymbols = 0;
-      if(gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position == 0) {
-        startSymbolIndex = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[gNB_mac->sched_ctrlCommon->pdsch_semi_static.time_domain_allocation][1];
-        nrOfSymbols = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[gNB_mac->sched_ctrlCommon->pdsch_semi_static.time_domain_allocation][2];
-      } else {
-        startSymbolIndex = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[gNB_mac->sched_ctrlCommon->pdsch_semi_static.time_domain_allocation][1];
-        nrOfSymbols = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[gNB_mac->sched_ctrlCommon->pdsch_semi_static.time_domain_allocation][2];
-      }
+
+      get_info_from_tda_tables(type0_PDCCH_CSS_config->type0_pdcch_ss_mux_pattern,
+                               time_domain_allocation,
+                               gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position,
+                               1, &startSymbolIndex, &nrOfSymbols);
 
       // TODO: There are exceptions to this in table 5.1.2.1.1-4,5 (Default time domain allocation tables B, C)
-      int mappingtype = (startSymbolIndex <= 3) ? typeA : typeB;
+      int mappingtype = (startSymbolIndex <= 3)? typeA: typeB;
 
-      // Calculate number of PRB_DMRS
-      uint8_t N_PRB_DMRS = gNB_mac->sched_ctrlCommon->pdsch_semi_static.numDmrsCdmGrpsNoData * 6;
       uint16_t dlDmrsSymbPos = fill_dmrs_mask(NULL, gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, nrOfSymbols, startSymbolIndex, mappingtype);
-      uint16_t dmrs_length = get_num_dmrs(dlDmrsSymbPos);
 
-      const uint32_t TBS = nr_compute_tbs(nr_get_Qm_dl(gNB_mac->sched_ctrlCommon->sched_pdsch.mcs, gNB_mac->sched_ctrlCommon->pdsch_semi_static.mcsTableIdx),
-                                          nr_get_code_rate_dl(gNB_mac->sched_ctrlCommon->sched_pdsch.mcs, gNB_mac->sched_ctrlCommon->pdsch_semi_static.mcsTableIdx),
-                                          gNB_mac->sched_ctrlCommon->sched_pdsch.rbSize, nrOfSymbols, N_PRB_DMRS * dmrs_length,0 ,0 ,1 ) >> 3;
+      // Configure sched_ctrlCommon for SIB1
+      uint32_t TBS = schedule_control_sib1(module_idP, CC_id,
+                                           type0_PDCCH_CSS_config,
+                                           time_domain_allocation,
+                                           startSymbolIndex,
+                                           nrOfSymbols,
+                                           dlDmrsSymbPos,
+                                           candidate_idx, sib1_sdu_length);
 
       nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body;
       nr_fill_nfapi_dl_sib1_pdu(module_idP, dl_req, type0_PDCCH_CSS_config, TBS, startSymbolIndex, nrOfSymbols, dlDmrsSymbPos);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index bfdb1a01e39183d1e3f05d48ed82ce5d361ea2ad..2cbe232fe0a30adcd5cda4130afe588f35f9bca2 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -47,6 +47,7 @@
 
 /*Softmodem params*/
 #include "executables/softmodem-common.h"
+#include "../../../nfapi/oai_integration/vendor_ext.h"
 
 ////////////////////////////////////////////////////////
 /////* DLSCH MAC PDU generation (6.1.2 TS 38.321) */////
@@ -454,9 +455,7 @@ bool allocate_dl_retransmission(module_id_t module_id,
   int rbStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
 
   NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
-  const long f = sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats;
-  const uint8_t num_dmrs_cdm_grps_no_data = sched_ctrl->active_bwp ? (f ? 1 : (ps->nrOfSymbols == 2 ? 1 : 2)) : (ps->nrOfSymbols == 2 ? 1 : 2);
-
+  const long f = sched_ctrl->active_bwp ? sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats : 0;
   int rbSize = 0;
   const int tda = sched_ctrl->active_bwp ? RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp->bwp_Id][slot] : 1;
   if (tda == retInfo->time_domain_allocation) {
@@ -475,9 +474,8 @@ bool allocate_dl_retransmission(module_id_t module_id,
     }
     /* check whether we need to switch the TDA allocation since the last
      * (re-)transmission */
-    if (ps->time_domain_allocation != tda || ps->numDmrsCdmGrpsNoData != num_dmrs_cdm_grps_no_data)
-      nr_set_pdsch_semi_static(
-          scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, tda, num_dmrs_cdm_grps_no_data, ps);
+    if (ps->time_domain_allocation != tda)
+      nr_set_pdsch_semi_static(scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, tda, f, ps);
   } else {
     /* the retransmission will use a different time domain allocation, check
      * that we have enough resources */
@@ -486,8 +484,8 @@ bool allocate_dl_retransmission(module_id_t module_id,
     while (rbStart + rbSize < bwpSize && rballoc_mask[rbStart + rbSize])
       rbSize++;
     NR_pdsch_semi_static_t temp_ps;
-    nr_set_pdsch_semi_static(
-        scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, tda, num_dmrs_cdm_grps_no_data, &temp_ps);
+    temp_ps.nrOfLayers = 1;
+    nr_set_pdsch_semi_static(scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, tda, f, &temp_ps);
     uint32_t new_tbs;
     uint16_t new_rbSize;
     bool success = nr_find_nb_rb(retInfo->Qm,
@@ -603,7 +601,7 @@ void pf_dl(module_id_t module_id,
 
       /* Calculate coeff */
       sched_pdsch->mcs = 9;
-      sched_pdsch->nrOfLayers = 1;
+      ps->nrOfLayers = 1;
       uint32_t tbs = pf_tbs[ps->mcsTableIdx][sched_pdsch->mcs];
       coeff_ue[UE_id] = (float) tbs / thr_ue[UE_id];
       LOG_D(NR_MAC,"b %d, thr_ue[%d] %f, tbs %d, coeff_ue[%d] %f\n",
@@ -674,6 +672,7 @@ void pf_dl(module_id_t module_id,
 
     // Freq-demain allocation
     while (rbStart < bwpSize && !rballoc_mask[rbStart]) rbStart++;
+
     uint16_t max_rbSize = 1;
     while (rbStart + max_rbSize < bwpSize && rballoc_mask[rbStart + max_rbSize])
       max_rbSize++;
@@ -682,11 +681,9 @@ void pf_dl(module_id_t module_id,
     const int tda = sched_ctrl->active_bwp ? RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp->bwp_Id][slot] : 1;
     NR_sched_pdsch_t *sched_pdsch = &sched_ctrl->sched_pdsch;
     NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
-    const long f = sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats;
-    const uint8_t num_dmrs_cdm_grps_no_data = sched_ctrl->active_bwp ? (f ? 1 : (ps->nrOfSymbols == 2 ? 1 : 2)) : (ps->nrOfSymbols == 2 ? 1 : 2);
-    if (ps->time_domain_allocation != tda || ps->numDmrsCdmGrpsNoData != num_dmrs_cdm_grps_no_data)
-      nr_set_pdsch_semi_static(
-          scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, tda, num_dmrs_cdm_grps_no_data, ps);
+    const long f = sched_ctrl->active_bwp ? sched_ctrl->search_space->searchSpaceType->choice.ue_Specific->dci_Formats : 0;
+    if (ps->time_domain_allocation != tda)
+      nr_set_pdsch_semi_static(scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, tda, f, ps);
     sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
     sched_pdsch->R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx);
     sched_pdsch->pucch_allocation = alloc;
@@ -820,17 +817,17 @@ void nr_schedule_ue_spec(module_id_t module_id,
 
     const rnti_t rnti = UE_info->rnti[UE_id];
 
-    /* POST processing */
-    const uint8_t nrOfLayers = sched_pdsch->nrOfLayers;
-    const uint16_t R = sched_pdsch->R;
-    const uint8_t Qm = sched_pdsch->Qm;
-    const uint32_t TBS = sched_pdsch->tb_size;
-
     /* pre-computed PDSCH values that only change if time domain
      * allocation/DMRS parameters change. Updated in the preprocessor through
      * nr_set_pdsch_semi_static() */
     NR_pdsch_semi_static_t *ps = &sched_ctrl->pdsch_semi_static;
 
+    /* POST processing */
+    const uint8_t nrOfLayers = ps->nrOfLayers;
+    const uint16_t R = sched_pdsch->R;
+    const uint8_t Qm = sched_pdsch->Qm;
+    const uint32_t TBS = sched_pdsch->tb_size;
+
     int8_t current_harq_pid = sched_pdsch->dl_harq_pid;
     if (current_harq_pid < 0) {
       /* PP has not selected a specific HARQ Process, get a new one */
@@ -877,6 +874,10 @@ void nr_schedule_ue_spec(module_id_t module_id,
 
     /* look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not
      * exist, create it */
+
+    // BWP
+    NR_BWP_t *genericParameters = bwp ? &bwp->bwp_Common->genericParameters : &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
+
     const int bwpid = bwp ? bwp->bwp_Id : 0;
     const int coresetid = bwp ? sched_ctrl->coreset->controlResourceSetId : gNB_mac->sched_ctrlCommon->coreset->controlResourceSetId;
     nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu = gNB_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid];
@@ -890,7 +891,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
       LOG_D(NR_MAC,"Trying to configure DL pdcch for bwp %d, cs %d\n",bwpid,coresetid);
       NR_SearchSpace_t *ss = bwp ? sched_ctrl->search_space:gNB_mac->sched_ctrlCommon->search_space;
       NR_ControlResourceSet_t *coreset = bwp? sched_ctrl->coreset:gNB_mac->sched_ctrlCommon->coreset;
-      nr_configure_pdcch(pdcch_pdu, ss, coreset, scc, bwp);
+      nr_configure_pdcch(pdcch_pdu, ss, coreset, scc, genericParameters, NULL);
       gNB_mac->pdcch_pdu_idx[CC_id][bwpid][coresetid] = pdcch_pdu;
     }
 
@@ -909,9 +910,6 @@ void nr_schedule_ue_spec(module_id_t module_id,
     const int pduindex = gNB_mac->pdu_index[CC_id]++;
     pdsch_pdu->pduIndex = pduindex;
 
-    // BWP
-    NR_BWP_t *genericParameters = bwp ? &bwp->bwp_Common->genericParameters : &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
-
     pdsch_pdu->BWPSize  = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
     pdsch_pdu->BWPStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth,MAX_BWP_SIZE);
     pdsch_pdu->SubcarrierSpacing = genericParameters->subcarrierSpacing;
@@ -940,7 +938,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
     pdsch_pdu->dlDmrsScramblingId = *scc->physCellId;
     pdsch_pdu->SCID = 0;
     pdsch_pdu->numDmrsCdmGrpsNoData = ps->numDmrsCdmGrpsNoData;
-    pdsch_pdu->dmrsPorts = 1;
+    pdsch_pdu->dmrsPorts = (1<<nrOfLayers)-1;  // FIXME with a better implementation
 
     // Pdsch Allocation in frequency domain
     pdsch_pdu->resourceAlloc = 1;
@@ -1022,7 +1020,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
     dci_payload.tpc = sched_ctrl->tpc1; // TPC for PUCCH: table 7.2.1-1 in 38.213
     dci_payload.pucch_resource_indicator = pucch->resource_indicator;
     dci_payload.pdsch_to_harq_feedback_timing_indicator.val = pucch->timing_indicator; // PDSCH to HARQ TI
-    dci_payload.antenna_ports.val = 0;  // nb of cdm groups w/o data 1 and dmrs port 0
+    dci_payload.antenna_ports.val = ps->dmrs_ports_id;
     dci_payload.dmrs_sequence_initialization.val = pdsch_pdu->SCID;
     LOG_D(NR_MAC,
           "%4d.%2d DCI type 1 payload: freq_alloc %d (%d,%d,%d), "
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index 47ccc74612a3a58c5e995e986af8fde5d3d5eeb2..f707e6efebd0d91d194b4b13b789bf00988ecc1a 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -166,10 +166,10 @@ void nr_schedule_css_dlsch_phytest(module_id_t   module_idP,
     pdsch_pdu_rel15->StartSymbolIndex = StartSymbolIndex;
     pdsch_pdu_rel15->NrOfSymbols      = NrOfSymbols;
     pdsch_pdu_rel15->dlDmrsSymbPos = fill_dmrs_mask(NULL,
-						    scc->dmrs_TypeA_Position,
-						    NrOfSymbols,
-                StartSymbolIndex,
-                mappingtype);
+                                                    scc->dmrs_TypeA_Position,
+                                                    NrOfSymbols,
+                                                    StartSymbolIndex,
+                                                    mappingtype);
 
     /*
     AssertFatal(k0==0,"k0 is not zero for Initial DL BWP TimeDomain Alloc\n");
@@ -369,11 +369,12 @@ void nr_preprocessor_phytest(module_id_t module_id,
   sched_pdsch->rbSize = rbSize;
   const int tda = sched_ctrl->active_bwp ? RC.nrmac[module_id]->preferred_dl_tda[sched_ctrl->active_bwp->bwp_Id][slot] : 1;
   const uint8_t num_dmrs_cdm_grps_no_data = 1;
+  ps->nrOfLayers = target_dl_Nl;
   if (ps->time_domain_allocation != tda || ps->numDmrsCdmGrpsNoData != num_dmrs_cdm_grps_no_data)
     nr_set_pdsch_semi_static(
         scc, UE_info->CellGroup[UE_id], sched_ctrl->active_bwp, tda, num_dmrs_cdm_grps_no_data, ps);
 
-  sched_pdsch->nrOfLayers = target_dl_Nl;
+
   sched_pdsch->mcs = target_dl_mcs;
   sched_pdsch->Qm = nr_get_Qm_dl(sched_pdsch->mcs, ps->mcsTableIdx);
   sched_pdsch->R = nr_get_code_rate_dl(sched_pdsch->mcs, ps->mcsTableIdx);
@@ -384,7 +385,7 @@ void nr_preprocessor_phytest(module_id_t module_id,
                                         ps->N_PRB_DMRS * ps->N_DMRS_SLOT,
                                         0 /* N_PRB_oh, 0 for initialBWP */,
                                         0 /* tb_scaling */,
-                                        sched_pdsch->nrOfLayers)
+                                        ps->nrOfLayers)
                          >> 3;
 
   /* get the PID of a HARQ process awaiting retransmission, or -1 otherwise */
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index 546602427a1090f8fd7c4e56f38e5623461bbf11..1948959d550eaf265863c8312e3967d1fc5ce05c 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -122,6 +122,36 @@ static inline uint8_t get_max_cces(uint8_t scs) {
   return (nr_max_number_of_cces_per_slot[scs]);
 }
 
+void set_dl_dmrs_ports(NR_pdsch_semi_static_t *ps) {
+
+  //TODO first basic implementation of dmrs port selection
+  //     only vaild for a single codeword
+  //     for now it assumes a selection of Nl consecutive dmrs ports
+  //     and a single front loaded symbol
+  //     dmrs_ports_id is the index of Tables 7.3.1.2.2-1/2/3/4
+
+  switch (ps->nrOfLayers) {
+    case 1:
+      ps->dmrs_ports_id = 0;
+      ps->numDmrsCdmGrpsNoData = 1;
+      break;
+    case 2:
+      ps->dmrs_ports_id = 2;
+      ps->numDmrsCdmGrpsNoData = 1;
+      break;
+    case 3:
+      ps->dmrs_ports_id = 9;
+      ps->numDmrsCdmGrpsNoData = 2;
+      break;
+    case 4:
+      ps->dmrs_ports_id = 10;
+      ps->numDmrsCdmGrpsNoData = 2;
+      break;
+    default:
+      AssertFatal(1==0,"Number of layers %d\n not supported or not valid\n",ps->nrOfLayers);
+  }
+}
+
 NR_ControlResourceSet_t *get_coreset(NR_ServingCellConfigCommon_t *scc,
                                      NR_BWP_Downlink_t *bwp,
                                      NR_SearchSpace_t *ss,
@@ -178,9 +208,6 @@ int allocate_nr_CCEs(gNB_MAC_INST *nr_mac,
                      uint16_t Y,
                      int m,
                      int nr_of_candidates) {
-  // uncomment these when we allocate for common search space
-  //  NR_COMMON_channels_t                *cc      = nr_mac->common_channels;
-  //  NR_ServingCellConfigCommon_t        *scc     = cc->ServingCellConfigCommon;
 
   int coreset_id = coreset->controlResourceSetId;
 
@@ -269,7 +296,7 @@ void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc,
                               const NR_CellGroupConfig_t *secondaryCellGroup,
                               const NR_BWP_Downlink_t *bwp,
                               int tda,
-                              uint8_t num_dmrs_cdm_grps_no_data,
+                              const long dci_format,
                               NR_pdsch_semi_static_t *ps)
 {
   ps->time_domain_allocation = tda;
@@ -295,12 +322,13 @@ void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc,
   }
   else ps->mcsTableIdx = 0;
 
-  ps->numDmrsCdmGrpsNoData = num_dmrs_cdm_grps_no_data;
+  if(dci_format == 0) // format 1_0
+    ps->numDmrsCdmGrpsNoData = (ps->nrOfSymbols == 2 ? 1 : 2);
+  else
+    set_dl_dmrs_ports(ps);
   ps->dmrsConfigType = bwp!=NULL ? (bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type == NULL ? 0 : 1) : 0;
 
-  // if no data in dmrs cdm group is 1 only even REs have no data
-  // if no data in dmrs cdm group is 2 both odd and even REs have no data
-  ps->N_PRB_DMRS = num_dmrs_cdm_grps_no_data * (ps->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6 : 4);
+  ps->N_PRB_DMRS = ps->numDmrsCdmGrpsNoData * (ps->dmrsConfigType == NFAPI_NR_DMRS_TYPE1 ? 6 : 4);
   ps->dl_dmrs_symb_pos = fill_dmrs_mask(bwp ? bwp->bwp_Dedicated->pdsch_Config->choice.setup : NULL, scc->dmrs_TypeA_Position, ps->nrOfSymbols, ps->startSymbolIndex, mapping_type);
   ps->N_DMRS_SLOT = get_num_dmrs(ps->dl_dmrs_symb_pos);
 }
@@ -607,6 +635,7 @@ void config_uldci(const NR_BWP_Uplink_t *ubwp,
                   uint8_t tpc,
                   int n_ubwp,
                   int bwp_id) {
+
   const int bw = NRRIV2BW(ubwp ?
 			  ubwp->bwp_Common->genericParameters.locationAndBandwidth :
 			  scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
@@ -678,25 +707,33 @@ void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
                         NR_SearchSpace_t *ss,
                         NR_ControlResourceSet_t *coreset,
                         NR_ServingCellConfigCommon_t *scc,
-                        NR_BWP_Downlink_t *bwp)
-{
-  NR_BWP_t *genericParameters = bwp ? &bwp->bwp_Common->genericParameters : &scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
-
-  pdcch_pdu->BWPSize  = NRRIV2BW(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
-  pdcch_pdu->BWPStart = NRRIV2PRBOFFSET(genericParameters->locationAndBandwidth, MAX_BWP_SIZE);
-  pdcch_pdu->SubcarrierSpacing = genericParameters->subcarrierSpacing;
-  pdcch_pdu->CyclicPrefix = genericParameters->cyclicPrefix ? *genericParameters->cyclicPrefix:0;
-
-  // first symbol
-  //AssertFatal(pdcch_scs==kHz15, "PDCCH SCS above 15kHz not allowed if a symbol above 2 is monitored");
-  int sps = genericParameters->cyclicPrefix == NULL ? 14 : 12;
+                        NR_BWP_t *bwp,
+                        NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config) {
+
+  int sps;
+  if (bwp) { // This is not for SIB1
+    pdcch_pdu->BWPSize  = NRRIV2BW(bwp->locationAndBandwidth, MAX_BWP_SIZE);
+    pdcch_pdu->BWPStart = NRRIV2PRBOFFSET(bwp->locationAndBandwidth, MAX_BWP_SIZE);
+    pdcch_pdu->SubcarrierSpacing = bwp->subcarrierSpacing;
+    pdcch_pdu->CyclicPrefix = (bwp->cyclicPrefix==NULL) ? 0 : *bwp->cyclicPrefix;
+
+    //AssertFatal(pdcch_scs==kHz15, "PDCCH SCS above 15kHz not allowed if a symbol above 2 is monitored");
+    sps = bwp->cyclicPrefix == NULL ? 14 : 12;
+  }
+  else {
+    pdcch_pdu->BWPSize = type0_PDCCH_CSS_config->num_rbs;
+    pdcch_pdu->BWPStart = type0_PDCCH_CSS_config->cset_start_rb;
+    pdcch_pdu->SubcarrierSpacing = type0_PDCCH_CSS_config->scs_pdcch;
+    pdcch_pdu->CyclicPrefix = 0;
+    sps = 14;
+  }
 
   AssertFatal(ss->monitoringSymbolsWithinSlot!=NULL,"ss->monitoringSymbolsWithinSlot is null\n");
   AssertFatal(ss->monitoringSymbolsWithinSlot->buf!=NULL,"ss->monitoringSymbolsWithinSlot->buf is null\n");
-
+    
   // for SPS=14 8 MSBs in positions 13 downto 6
   uint16_t monitoringSymbolsWithinSlot = (ss->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) |
-    (ss->monitoringSymbolsWithinSlot->buf[1]>>(16-sps));
+                                         (ss->monitoringSymbolsWithinSlot->buf[1]>>(16-sps));
 
   for (int i=0; i<sps; i++) {
     if ((monitoringSymbolsWithinSlot>>(sps-1-i))&1) {
@@ -716,8 +753,10 @@ void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
     NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED : NFAPI_NR_CCE_REG_MAPPING_NON_INTERLEAVED;
 
   if (pdcch_pdu->CceRegMappingType == NFAPI_NR_CCE_REG_MAPPING_INTERLEAVED) {
-    pdcch_pdu->RegBundleSize = (coreset->cce_REG_MappingType.choice.interleaved->reg_BundleSize == NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6) ? 6 : (2+coreset->cce_REG_MappingType.choice.interleaved->reg_BundleSize);
-    pdcch_pdu->InterleaverSize = (coreset->cce_REG_MappingType.choice.interleaved->interleaverSize==NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n6) ? 6 : (2+coreset->cce_REG_MappingType.choice.interleaved->interleaverSize);
+    pdcch_pdu->RegBundleSize = (coreset->cce_REG_MappingType.choice.interleaved->reg_BundleSize ==
+                                NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6) ? 6 : (2+coreset->cce_REG_MappingType.choice.interleaved->reg_BundleSize);
+    pdcch_pdu->InterleaverSize = (coreset->cce_REG_MappingType.choice.interleaved->interleaverSize ==
+                                  NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n6) ? 6 : (2+coreset->cce_REG_MappingType.choice.interleaved->interleaverSize);
     AssertFatal(scc->physCellId != NULL,"scc->physCellId is null\n");
     pdcch_pdu->ShiftIndex = coreset->cce_REG_MappingType.choice.interleaved->shiftIndex != NULL ? *coreset->cce_REG_MappingType.choice.interleaved->shiftIndex : *scc->physCellId;
   }
@@ -728,7 +767,10 @@ void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
   }
 
   if(coreset->controlResourceSetId == 0) {
-    pdcch_pdu->CoreSetType = NFAPI_NR_CSET_CONFIG_MIB_SIB1;
+    if(bwp == NULL)
+      pdcch_pdu->CoreSetType = NFAPI_NR_CSET_CONFIG_MIB_SIB1;
+    else
+      pdcch_pdu->CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG_CSET_0;
   } else{
     pdcch_pdu->CoreSetType = NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG;
   }
@@ -812,169 +854,168 @@ void nr_configure_pucch(nfapi_nr_pucch_pdu_t* pucch_pdu,
   pucch_pdu->cyclic_prefix = (genericParameters->cyclicPrefix==NULL) ? 0 : *genericParameters->cyclicPrefix;
   if (r_pucch<0 || bwp){
     // we have either a dedicated BWP or Dedicated PUCCH configuration on InitialBWP
-	pucch_Config = bwp ?
-	  bwp->bwp_Dedicated->pucch_Config->choice.setup:
-	  CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
-
-	AssertFatal(pucch_Config->resourceSetToAddModList!=NULL,
-		    "PUCCH resourceSetToAddModList is null\n");
-
-	n_set = pucch_Config->resourceSetToAddModList->list.count;
-	AssertFatal(n_set>0,"PUCCH resourceSetToAddModList is empty\n");
-
-	LOG_D(NR_MAC, "UCI n_set= %d\n", n_set);
-
-	N2 = 2;
-	// procedure to select pucch resource id from resource sets according to
-	// number of uci bits and pucch resource indicator pucch_resource
-	// ( see table 9.2.3.2 in 38.213)
-	for (int i=0; i<n_set; i++) {
-	  pucchresset = pucch_Config->resourceSetToAddModList->list.array[i];
-	  n_list = pucchresset->resourceList.list.count;
-	  if (pucchresset->pucch_ResourceSetId == 0 && O_uci<3) {
-	    if (pucch_resource < n_list)
-	      resource_id = pucchresset->resourceList.list.array[pucch_resource];
-	    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);
-	  }
-	  if (pucchresset->pucch_ResourceSetId == 1 && O_uci>2) {
+    pucch_Config = bwp ?
+                   bwp->bwp_Dedicated->pucch_Config->choice.setup:
+                   CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
+
+    AssertFatal(pucch_Config->resourceSetToAddModList!=NULL,
+                "PUCCH resourceSetToAddModList is null\n");
+
+    n_set = pucch_Config->resourceSetToAddModList->list.count;
+    AssertFatal(n_set>0,"PUCCH resourceSetToAddModList is empty\n");
+
+    LOG_D(NR_MAC, "UCI n_set= %d\n", n_set);
+
+    N2 = 2;
+    // procedure to select pucch resource id from resource sets according to
+    // number of uci bits and pucch resource indicator pucch_resource
+    // ( see table 9.2.3.2 in 38.213)
+    for (int i=0; i<n_set; i++) {
+      pucchresset = pucch_Config->resourceSetToAddModList->list.array[i];
+      n_list = pucchresset->resourceList.list.count;
+      if (pucchresset->pucch_ResourceSetId == 0 && O_uci<3) {
+        if (pucch_resource < n_list)
+          resource_id = pucchresset->resourceList.list.array[pucch_resource];
+        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);
+      }
+      if (pucchresset->pucch_ResourceSetId == 1 && O_uci>2) {
 #if (NR_RRC_VERSION >= MAKE_VERSION(16, 0, 0))
-	    N3 = pucchresset->maxPayloadSize!= NULL ?  *pucchresset->maxPayloadSize : 1706;
+        N3 = pucchresset->maxPayloadSize!= NULL ?  *pucchresset->maxPayloadSize : 1706;
 #else
-	    N3 = pucchresset->maxPayloadMinus1!= NULL ?  *pucchresset->maxPayloadMinus1 : 1706;
+        N3 = pucchresset->maxPayloadMinus1!= NULL ?  *pucchresset->maxPayloadMinus1 : 1706;
 #endif
-	    if (N2<O_uci && N3>O_uci) {
-	      if (pucch_resource < n_list)
-		resource_id = pucchresset->resourceList.list.array[pucch_resource];
-	      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 N2 = N3;
-	  }
-	}
-
-	AssertFatal(resource_id!=NULL,"Couldn-t find any matching PUCCH resource in the PUCCH resource sets");
-
-	AssertFatal(pucch_Config->resourceToAddModList!=NULL,
-		    "PUCCH resourceToAddModList is null\n");
-
-	n_list = pucch_Config->resourceToAddModList->list.count;
-	AssertFatal(n_list>0,"PUCCH resourceToAddModList is empty\n");
-
-	// going through the list of PUCCH resources to find the one indexed by resource_id
-	for (int i=0; i<n_list; i++) {
-	  pucchres = pucch_Config->resourceToAddModList->list.array[i];
-	  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;
-	    pucch_pdu->second_hop_prb = pucchres->secondHopPRB!= NULL ?  *pucchres->secondHopPRB : 0;
-	    switch(pucchres->format.present) {
-	    case NR_PUCCH_Resource__format_PR_format0 :
-	      pucch_pdu->format_type = 0;
-	      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 = O_sr;
-	      break;
-	    case NR_PUCCH_Resource__format_PR_format1 :
-	      pucch_pdu->format_type = 1;
-	      pucch_pdu->initial_cyclic_shift = pucchres->format.choice.format1->initialCyclicShift;
-	      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 = 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->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->data_scrambling_id = pusch_id!= NULL ? *pusch_id : *scc->physCellId;
-	      if (pucch_Config->format3 == NULL) {
-		pucch_pdu->pi_2bpsk = 0;
-		pucch_pdu->add_dmrs_flag = 0;
-	      }
-	      else {
-		pucchfmt = pucch_Config->format3->choice.setup;
-		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;
-	      pucch_pdu->nr_of_symbols = pucchres->format.choice.format4->nrofSymbols;
-	      pucch_pdu->start_symbol_index = pucchres->format.choice.format4->startingSymbolIndex;
-	      pucch_pdu->pre_dft_occ_len = pucchres->format.choice.format4->occ_Length;
-	      pucch_pdu->pre_dft_occ_idx = pucchres->format.choice.format4->occ_Index;
-	      pucch_pdu->data_scrambling_id = pusch_id!= NULL ? *pusch_id : *scc->physCellId;
-	      if (pucch_Config->format3 == NULL) {
-		pucch_pdu->pi_2bpsk = 0;
-		pucch_pdu->add_dmrs_flag = 0;
-	      }
-	      else {
-		pucchfmt = pucch_Config->format3->choice.setup;
-		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");
-	    }
-	  }
-	}
-	AssertFatal(res_found==1,"No PUCCH resource found corresponding to id %ld\n",*resource_id);
-      }
-      else { // this is the default PUCCH configuration, PUCCH format 0 or 1
-	int rsetindex = *scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup->pucch_ResourceCommon;
-	int prboffset = r_pucch/default_pucch_csset[rsetindex];
-	int prboffsetm8 = (r_pucch-8)/default_pucch_csset[rsetindex];
-	pucch_pdu->prb_start = (r_pucch>>3)==0 ?
-	  default_pucch_prboffset[rsetindex] + prboffset:
-	  pucch_pdu->bwp_size-1-default_pucch_prboffset[rsetindex]-prboffsetm8;
-	pucch_pdu->rnti = rnti;
-	pucch_pdu->freq_hop_flag = 1;
-	pucch_pdu->second_hop_prb = (r_pucch>>3)==0?
-	  pucch_pdu->bwp_size-1-default_pucch_prboffset[rsetindex]-prboffset:
-	  default_pucch_prboffset[rsetindex] + prboffsetm8;
-	pucch_pdu->format_type = default_pucch_fmt[rsetindex];
-	pucch_pdu->initial_cyclic_shift = r_pucch%default_pucch_csset[rsetindex];
-	if (rsetindex==3||rsetindex==7||rsetindex==11) pucch_pdu->initial_cyclic_shift*=6;
-	else if (rsetindex==1||rsetindex==2) pucch_pdu->initial_cyclic_shift*=3;
-	else pucch_pdu->initial_cyclic_shift*=4;
-	pucch_pdu->nr_of_symbols = default_pucch_numbsymb[rsetindex];
-	pucch_pdu->start_symbol_index = default_pucch_firstsymb[rsetindex];
-	if (pucch_pdu->format_type == 1) pucch_pdu->time_domain_occ_idx = 0; // check this!!
-	pucch_pdu->sr_flag = O_sr;
+        if (N2<O_uci && N3>O_uci) {
+          if (pucch_resource < n_list)
+            resource_id = pucchresset->resourceList.list.array[pucch_resource];
+          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 N2 = N3;
       }
+    }
 
+    AssertFatal(resource_id!=NULL,"Couldn-t find any matching PUCCH resource in the PUCCH resource sets");
+
+    AssertFatal(pucch_Config->resourceToAddModList!=NULL,
+                "PUCCH resourceToAddModList is null\n");
+
+    n_list = pucch_Config->resourceToAddModList->list.count;
+    AssertFatal(n_list>0,"PUCCH resourceToAddModList is empty\n");
+
+    // going through the list of PUCCH resources to find the one indexed by resource_id
+    for (int i=0; i<n_list; i++) {
+      pucchres = pucch_Config->resourceToAddModList->list.array[i];
+      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;
+        pucch_pdu->second_hop_prb = pucchres->secondHopPRB!= NULL ?  *pucchres->secondHopPRB : 0;
+        switch(pucchres->format.present) {
+          case NR_PUCCH_Resource__format_PR_format0 :
+            pucch_pdu->format_type = 0;
+            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 = O_sr;
+            break;
+          case NR_PUCCH_Resource__format_PR_format1 :
+            pucch_pdu->format_type = 1;
+            pucch_pdu->initial_cyclic_shift = pucchres->format.choice.format1->initialCyclicShift;
+            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 = 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->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->data_scrambling_id = pusch_id!= NULL ? *pusch_id : *scc->physCellId;
+            if (pucch_Config->format3 == NULL) {
+              pucch_pdu->pi_2bpsk = 0;
+              pucch_pdu->add_dmrs_flag = 0;
+            }
+            else {
+              pucchfmt = pucch_Config->format3->choice.setup;
+              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;
+            pucch_pdu->nr_of_symbols = pucchres->format.choice.format4->nrofSymbols;
+            pucch_pdu->start_symbol_index = pucchres->format.choice.format4->startingSymbolIndex;
+            pucch_pdu->pre_dft_occ_len = pucchres->format.choice.format4->occ_Length;
+            pucch_pdu->pre_dft_occ_idx = pucchres->format.choice.format4->occ_Index;
+            pucch_pdu->data_scrambling_id = pusch_id!= NULL ? *pusch_id : *scc->physCellId;
+            if (pucch_Config->format3 == NULL) {
+              pucch_pdu->pi_2bpsk = 0;
+              pucch_pdu->add_dmrs_flag = 0;
+            }
+            else {
+              pucchfmt = pucch_Config->format3->choice.setup;
+              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");
+        }
+      }
+    }
+    AssertFatal(res_found==1,"No PUCCH resource found corresponding to id %ld\n",*resource_id);
+  }
+  else { // this is the default PUCCH configuration, PUCCH format 0 or 1
+    int rsetindex = *scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup->pucch_ResourceCommon;
+    int prboffset = r_pucch/default_pucch_csset[rsetindex];
+    int prboffsetm8 = (r_pucch-8)/default_pucch_csset[rsetindex];
+    pucch_pdu->prb_start = (r_pucch>>3)==0 ?
+                           default_pucch_prboffset[rsetindex] + prboffset:
+                           pucch_pdu->bwp_size-1-default_pucch_prboffset[rsetindex]-prboffsetm8;
+    pucch_pdu->rnti = rnti;
+    pucch_pdu->freq_hop_flag = 1;
+    pucch_pdu->second_hop_prb = (r_pucch>>3)==0?
+                                pucch_pdu->bwp_size-1-default_pucch_prboffset[rsetindex]-prboffset:
+                                default_pucch_prboffset[rsetindex] + prboffsetm8;
+    pucch_pdu->format_type = default_pucch_fmt[rsetindex];
+    pucch_pdu->initial_cyclic_shift = r_pucch%default_pucch_csset[rsetindex];
+    if (rsetindex==3||rsetindex==7||rsetindex==11) pucch_pdu->initial_cyclic_shift*=6;
+    else if (rsetindex==1||rsetindex==2) pucch_pdu->initial_cyclic_shift*=3;
+    else pucch_pdu->initial_cyclic_shift*=4;
+    pucch_pdu->nr_of_symbols = default_pucch_numbsymb[rsetindex];
+    pucch_pdu->start_symbol_index = default_pucch_firstsymb[rsetindex];
+    if (pucch_pdu->format_type == 1) pucch_pdu->time_domain_occ_idx = 0; // check this!!
+    pucch_pdu->sr_flag = O_sr;
+  }
 }
 
 
@@ -1386,41 +1427,53 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
       break;
 
     case NFAPI_NR_RNTI_TC:
-      // indicating a DL DCI format 1bit
-      *dci_pdu |= (dci_pdu_rel15->format_indicator & 1) << (dci_size - pos++);
+      // indicating a UL DCI format 1bit
+      pos=1;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->format_indicator & 1) << (dci_size - pos);
       // Freq domain assignment  max 16 bit
       fsize = (int)ceil(log2((N_RB * (N_RB + 1)) >> 1));
-      for (int i = 0; i < fsize; i++)
-        *dci_pdu |= ((dci_pdu_rel15->frequency_domain_assignment.val >> (fsize - i - 1)) & 1) << (dci_size - pos++);
+      pos+=fsize;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->frequency_domain_assignment.val & ((1 << fsize) - 1)) << (dci_size - pos);
       // Time domain assignment 4bit
-      for (int i = 0; i < 4; i++)
-        *dci_pdu |= (((uint64_t)dci_pdu_rel15->time_domain_assignment.val >> (3 - i)) & 1) << (dci_size - pos++);
+      pos += 4;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->time_domain_assignment.val & ((1 << 4) - 1)) << (dci_size - pos);
       // Frequency hopping flag – 1 bit
-      *dci_pdu |= ((uint64_t)dci_pdu_rel15->frequency_hopping_flag.val & 1) << (dci_size - pos++);
+      pos++;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->frequency_hopping_flag.val & 1) << (dci_size - pos);
       // MCS  5 bit
-      for (int i = 0; i < 5; i++)
-        *dci_pdu |= (((uint64_t)dci_pdu_rel15->mcs >> (4 - i)) & 1) << (dci_size - pos++);
+      pos+=5;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->mcs & 0x1f) << (dci_size - pos);
       // New data indicator 1bit
-      *dci_pdu |= ((uint64_t)dci_pdu_rel15->ndi & 1) << (dci_size - pos++);
+      pos++;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->ndi & 1) << (dci_size - pos);
       // Redundancy version  2bit
-      for (int i = 0; i < 2; i++)
-        *dci_pdu |= (((uint64_t)dci_pdu_rel15->rv >> (1 - i)) & 1) << (dci_size - pos++);
+      pos+=2;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->rv & 0x3) << (dci_size - pos);
       // HARQ process number  4bit
-      for (int i = 0; i < 4; i++)
-        *dci_pdu |= (((uint64_t)dci_pdu_rel15->harq_pid >> (3 - i)) & 1) << (dci_size - pos++);
-      // TPC command for scheduled PUSCH – 2 bits
-      for (int i = 0; i < 2; i++)
-        *dci_pdu |= (((uint64_t)dci_pdu_rel15->tpc >> (1 - i)) & 1) << (dci_size - pos++);
+      pos+=4;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->harq_pid & 0xf) << (dci_size - pos);
       // Padding bits
       for (int a = pos; a < 32; a++)
         *dci_pdu |= ((uint64_t)dci_pdu_rel15->padding & 1) << (dci_size - pos++);
       // UL/SUL indicator – 1 bit
-      /*
-        commented for now (RK): need to get this information from BWP descriptor
-        if (cfg->pucch_config.pucch_GroupHopping.value)
+      /* commented for now (RK): need to get this from BWP descriptor
+      if (cfg->pucch_config.pucch_GroupHopping.value)
         *dci_pdu |=
-        ((uint64_t)dci_pdu_rel15->ul_sul_indicator.val&1)<<(dci_size-pos++);
+      ((uint64_t)dci_pdu_rel15->ul_sul_indicator.val&1)<<(dci_size-pos++);
         */
+      LOG_D(NR_MAC,"N_RB = %i\n", N_RB);
+      LOG_D(NR_MAC,"dci_size = %i\n", dci_size);
+      LOG_D(NR_MAC,"fsize = %i\n", fsize);
+      LOG_D(NR_MAC,"dci_pdu_rel15->frequency_domain_assignment.val = %i\n", dci_pdu_rel15->frequency_domain_assignment.val);
+      LOG_D(NR_MAC,"dci_pdu_rel15->time_domain_assignment.val = %i\n", dci_pdu_rel15->time_domain_assignment.val);
+      LOG_D(NR_MAC,"dci_pdu_rel15->frequency_hopping_flag.val = %i\n", dci_pdu_rel15->frequency_hopping_flag.val);
+      LOG_D(NR_MAC,"dci_pdu_rel15->mcs = %i\n", dci_pdu_rel15->mcs);
+      LOG_D(NR_MAC,"dci_pdu_rel15->ndi = %i\n", dci_pdu_rel15->ndi);
+      LOG_D(NR_MAC,"dci_pdu_rel15->rv = %i\n", dci_pdu_rel15->rv);
+      LOG_D(NR_MAC,"dci_pdu_rel15->harq_pid = %i\n", dci_pdu_rel15->harq_pid);
+      LOG_D(NR_MAC,"dci_pdu_rel15->tpc = %i\n", dci_pdu_rel15->tpc);
+      LOG_D(NR_MAC,"dci_pdu_rel15->padding = %i\n", dci_pdu_rel15->padding);
+
       break;
     }
     break;
@@ -1863,7 +1916,10 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP, NR_CellGroupConfig_t *CellG
     sched_ctrl->active_bwp = bwpList ? bwpList->list.array[bwp_id - 1] : NULL;
     const int target_ss = sched_ctrl->active_bwp ? NR_SearchSpace__searchSpaceType_PR_ue_Specific : NR_SearchSpace__searchSpaceType_PR_common;
     sched_ctrl->search_space = get_searchspace(scc, sched_ctrl->active_bwp ? sched_ctrl->active_bwp->bwp_Dedicated : NULL, target_ss);
-    sched_ctrl->coreset = get_coreset(scc, sched_ctrl->active_bwp, sched_ctrl->search_space, target_ss);
+    if (*sched_ctrl->search_space->controlResourceSetId == 0)
+      sched_ctrl->coreset = RC.nrmac[mod_idP]->sched_ctrlCommon->coreset; // this is coreset 0
+    else
+      sched_ctrl->coreset = get_coreset(scc, sched_ctrl->active_bwp, sched_ctrl->search_space, target_ss);
     const struct NR_UplinkConfig__uplinkBWP_ToAddModList *ubwpList = servingCellConfig ? servingCellConfig->uplinkConfig->uplinkBWP_ToAddModList : NULL;
     if (ubwpList) AssertFatal(ubwpList->list.count == 1,
 			      "uplinkBWP_ToAddModList has %d BWP!\n",
@@ -2056,8 +2112,6 @@ void nr_csirs_scheduling(int Mod_idP,
 
   for (int UE_id = UE_list->head; UE_id >= 0; UE_id = UE_list->next[UE_id]) {
 
-    NR_NZP_CSI_RS_Resource_t *nzpcsi;
-    int period, offset;
     NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
     NR_CellGroupConfig_t *CellGroup = UE_info->CellGroup[UE_id];
 
@@ -2066,182 +2120,185 @@ void nr_csirs_scheduling(int Mod_idP,
 
     NR_CSI_MeasConfig_t *csi_measconfig = CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
 
-    nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body;
-    NR_BWP_Downlink_t *bwp=CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[sched_ctrl->active_bwp->bwp_Id-1];
-
-    AssertFatal(csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.count>0,"NO CSI report configuration available");
-
-    for (int id = 0; id < csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.count; id++){
-      nzpcsi = csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.array[id];
-      NR_CSI_RS_ResourceMapping_t  resourceMapping = nzpcsi->resourceMapping;
-      csi_period_offset(NULL,nzpcsi,&period,&offset);
-
-      if((frame*n_slots_frame+slot-offset)%period == 0) {
-
-        LOG_I(MAC,"Scheduling CSI-RS in frame %d slot %d\n",frame,slot);
-
-        nfapi_nr_dl_tti_request_pdu_t *dl_tti_csirs_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
-        memset((void*)dl_tti_csirs_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t));
-        dl_tti_csirs_pdu->PDUType = NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE;
-        dl_tti_csirs_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_csi_rs_pdu));
-
-        nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csirs_pdu_rel15 = &dl_tti_csirs_pdu->csi_rs_pdu.csi_rs_pdu_rel15;
-
-        csirs_pdu_rel15->bwp_size  = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,275);
-        csirs_pdu_rel15->bwp_start = NRRIV2PRBOFFSET(bwp->bwp_Common->genericParameters.locationAndBandwidth,275);
-        csirs_pdu_rel15->subcarrier_spacing = bwp->bwp_Common->genericParameters.subcarrierSpacing;
-        if (bwp->bwp_Common->genericParameters.cyclicPrefix)
-          csirs_pdu_rel15->cyclic_prefix = *bwp->bwp_Common->genericParameters.cyclicPrefix;
-        else
-          csirs_pdu_rel15->cyclic_prefix = 0;
-
-        csirs_pdu_rel15->start_rb = resourceMapping.freqBand.startingRB;
-        csirs_pdu_rel15->nr_of_rbs = resourceMapping.freqBand.nrofRBs;
-        csirs_pdu_rel15->csi_type = 1; // NZP-CSI-RS
-        csirs_pdu_rel15->symb_l0 = resourceMapping.firstOFDMSymbolInTimeDomain;
-        if (resourceMapping.firstOFDMSymbolInTimeDomain2)
-          csirs_pdu_rel15->symb_l1 = *resourceMapping.firstOFDMSymbolInTimeDomain2;
-        csirs_pdu_rel15->cdm_type = resourceMapping.cdm_Type;
-        csirs_pdu_rel15->freq_density = resourceMapping.density.present;
-        if ((resourceMapping.density.present == NR_CSI_RS_ResourceMapping__density_PR_dot5)
-            && (resourceMapping.density.choice.dot5 == NR_CSI_RS_ResourceMapping__density__dot5_evenPRBs))
-          csirs_pdu_rel15->freq_density--;
-        csirs_pdu_rel15->scramb_id = nzpcsi->scramblingID;
-        csirs_pdu_rel15->power_control_offset = nzpcsi->powerControlOffset + 8;
-        if (nzpcsi->powerControlOffsetSS)
-          csirs_pdu_rel15->power_control_offset_ss = *nzpcsi->powerControlOffsetSS;
-        else
-          csirs_pdu_rel15->power_control_offset_ss = 1; // 0 dB
-        switch(resourceMapping.frequencyDomainAllocation.present){
-          case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1:
-            csirs_pdu_rel15->row = 1;
-            csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row1.buf[0])>>4)&0x0f;
-            for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-              vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
-            break;
-          case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row2:
-            csirs_pdu_rel15->row = 2;
-            csirs_pdu_rel15->freq_domain = (((resourceMapping.frequencyDomainAllocation.choice.row2.buf[1]>>4)&0x0f) |
-                                           ((resourceMapping.frequencyDomainAllocation.choice.row2.buf[0]<<8)&0xff0));
-            for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-              vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
-            break;
-          case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row4:
-            csirs_pdu_rel15->row = 4;
-            csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row4.buf[0])>>5)&0x07;
-            for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-              vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
-            break;
-          case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_other:
-            csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.other.buf[0])>>2)&0x3f;
-            // determining the row of table 7.4.1.5.3-1 in 38.211
-            switch(resourceMapping.nrofPorts){
-              case NR_CSI_RS_ResourceMapping__nrofPorts_p1:
-                break;
-              case NR_CSI_RS_ResourceMapping__nrofPorts_p2:
-                csirs_pdu_rel15->row = 3;
-                for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                  vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
-                break;
-              case NR_CSI_RS_ResourceMapping__nrofPorts_p4:
-                csirs_pdu_rel15->row = 5;
-                for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                  vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
-                break;
-              case NR_CSI_RS_ResourceMapping__nrofPorts_p8:
-                if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
-                  csirs_pdu_rel15->row = 8;
+    if (csi_measconfig->nzp_CSI_RS_ResourceToAddModList != NULL) {
+
+      NR_NZP_CSI_RS_Resource_t *nzpcsi;
+      int period, offset;
+
+      nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body;
+      NR_BWP_Downlink_t *bwp=CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[sched_ctrl->active_bwp->bwp_Id-1];
+
+      for (int id = 0; id < csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.count; id++){
+        nzpcsi = csi_measconfig->nzp_CSI_RS_ResourceToAddModList->list.array[id];
+        NR_CSI_RS_ResourceMapping_t  resourceMapping = nzpcsi->resourceMapping;
+        csi_period_offset(NULL,nzpcsi,&period,&offset);
+
+        if((frame*n_slots_frame+slot-offset)%period == 0) {
+
+          LOG_I(MAC,"Scheduling CSI-RS in frame %d slot %d\n",frame,slot);
+
+          nfapi_nr_dl_tti_request_pdu_t *dl_tti_csirs_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
+          memset((void*)dl_tti_csirs_pdu,0,sizeof(nfapi_nr_dl_tti_request_pdu_t));
+          dl_tti_csirs_pdu->PDUType = NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE;
+          dl_tti_csirs_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_csi_rs_pdu));
+
+          nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csirs_pdu_rel15 = &dl_tti_csirs_pdu->csi_rs_pdu.csi_rs_pdu_rel15;
+
+          csirs_pdu_rel15->bwp_size  = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,275);
+          csirs_pdu_rel15->bwp_start = NRRIV2PRBOFFSET(bwp->bwp_Common->genericParameters.locationAndBandwidth,275);
+          csirs_pdu_rel15->subcarrier_spacing = bwp->bwp_Common->genericParameters.subcarrierSpacing;
+          if (bwp->bwp_Common->genericParameters.cyclicPrefix)
+            csirs_pdu_rel15->cyclic_prefix = *bwp->bwp_Common->genericParameters.cyclicPrefix;
+          else
+            csirs_pdu_rel15->cyclic_prefix = 0;
+
+          csirs_pdu_rel15->start_rb = resourceMapping.freqBand.startingRB;
+          csirs_pdu_rel15->nr_of_rbs = resourceMapping.freqBand.nrofRBs;
+          csirs_pdu_rel15->csi_type = 1; // NZP-CSI-RS
+          csirs_pdu_rel15->symb_l0 = resourceMapping.firstOFDMSymbolInTimeDomain;
+          if (resourceMapping.firstOFDMSymbolInTimeDomain2)
+            csirs_pdu_rel15->symb_l1 = *resourceMapping.firstOFDMSymbolInTimeDomain2;
+          csirs_pdu_rel15->cdm_type = resourceMapping.cdm_Type;
+          csirs_pdu_rel15->freq_density = resourceMapping.density.present;
+          if ((resourceMapping.density.present == NR_CSI_RS_ResourceMapping__density_PR_dot5)
+              && (resourceMapping.density.choice.dot5 == NR_CSI_RS_ResourceMapping__density__dot5_evenPRBs))
+            csirs_pdu_rel15->freq_density--;
+          csirs_pdu_rel15->scramb_id = nzpcsi->scramblingID;
+          csirs_pdu_rel15->power_control_offset = nzpcsi->powerControlOffset + 8;
+          if (nzpcsi->powerControlOffsetSS)
+            csirs_pdu_rel15->power_control_offset_ss = *nzpcsi->powerControlOffsetSS;
+          else
+            csirs_pdu_rel15->power_control_offset_ss = 1; // 0 dB
+          switch(resourceMapping.frequencyDomainAllocation.present){
+            case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row1:
+              csirs_pdu_rel15->row = 1;
+              csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row1.buf[0])>>4)&0x0f;
+              for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
+                vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
+              break;
+            case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row2:
+              csirs_pdu_rel15->row = 2;
+              csirs_pdu_rel15->freq_domain = (((resourceMapping.frequencyDomainAllocation.choice.row2.buf[1]>>4)&0x0f) |
+                                             ((resourceMapping.frequencyDomainAllocation.choice.row2.buf[0]<<8)&0xff0));
+              for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
+                vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
+              break;
+            case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row4:
+              csirs_pdu_rel15->row = 4;
+              csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.row4.buf[0])>>5)&0x07;
+              for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
+                vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
+              break;
+            case NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_other:
+              csirs_pdu_rel15->freq_domain = ((resourceMapping.frequencyDomainAllocation.choice.other.buf[0])>>2)&0x3f;
+              // determining the row of table 7.4.1.5.3-1 in 38.211
+              switch(resourceMapping.nrofPorts){
+                case NR_CSI_RS_ResourceMapping__nrofPorts_p1:
+                  break;
+                case NR_CSI_RS_ResourceMapping__nrofPorts_p2:
+                  csirs_pdu_rel15->row = 3;
+                  for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
+                    vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
+                  break;
+                case NR_CSI_RS_ResourceMapping__nrofPorts_p4:
+                  csirs_pdu_rel15->row = 5;
                   for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
                     vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
-                }
-                else{
-                  int num_k = 0;
-                  for (int k=0; k<6; k++)
-                    num_k+=(((csirs_pdu_rel15->freq_domain)>>k)&0x01);
-                  if(num_k==4) {
-                    csirs_pdu_rel15->row = 6;
-                    for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                      vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
-                  }
-                  else {
-                    csirs_pdu_rel15->row = 7;
+                  break;
+                case NR_CSI_RS_ResourceMapping__nrofPorts_p8:
+                  if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
+                    csirs_pdu_rel15->row = 8;
                     for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
                       vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
                   }
-                }
-                break;
-              case NR_CSI_RS_ResourceMapping__nrofPorts_p12:
-                if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
-                  csirs_pdu_rel15->row = 10;
-                  for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                    vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
-                }
-                else {
-                  csirs_pdu_rel15->row = 9;
-                  for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                    vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
-                }
-                break;
-              case NR_CSI_RS_ResourceMapping__nrofPorts_p16:
-                if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2)
-                  csirs_pdu_rel15->row = 12;
-                else
-                  csirs_pdu_rel15->row = 11;
-                for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                  vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
-                break;
-              case NR_CSI_RS_ResourceMapping__nrofPorts_p24:
-                if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
-                  csirs_pdu_rel15->row = 14;
-                  for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                    vrb_map[rb] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
-                }
-                else{
-                  if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4) {
-                    csirs_pdu_rel15->row = 15;
+                  else{
+                    int num_k = 0;
+                    for (int k=0; k<6; k++)
+                      num_k+=(((csirs_pdu_rel15->freq_domain)>>k)&0x01);
+                    if(num_k==4) {
+                      csirs_pdu_rel15->row = 6;
+                      for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
+                        vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
+                    }
+                    else {
+                      csirs_pdu_rel15->row = 7;
+                      for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
+                        vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
+                    }
+                  }
+                  break;
+                case NR_CSI_RS_ResourceMapping__nrofPorts_p12:
+                  if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
+                    csirs_pdu_rel15->row = 10;
                     for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                      vrb_map[rb] |= (7 << csirs_pdu_rel15->symb_l0);
+                      vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
                   }
                   else {
-                    csirs_pdu_rel15->row = 13;
+                    csirs_pdu_rel15->row = 9;
                     for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                      vrb_map[rb] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
+                      vrb_map[rb] |= (1 << csirs_pdu_rel15->symb_l0);
                   }
-                }
-                break;
-              case NR_CSI_RS_ResourceMapping__nrofPorts_p32:
-                if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
-                  csirs_pdu_rel15->row = 17;
+                  break;
+                case NR_CSI_RS_ResourceMapping__nrofPorts_p16:
+                  if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2)
+                    csirs_pdu_rel15->row = 12;
+                  else
+                    csirs_pdu_rel15->row = 11;
                   for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                    vrb_map[rb] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
-                }
-                else{
-                  if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4) {
-                    csirs_pdu_rel15->row = 18;
+                    vrb_map[rb] |= ((1 << csirs_pdu_rel15->symb_l0) | (2 << csirs_pdu_rel15->symb_l0));
+                  break;
+                case NR_CSI_RS_ResourceMapping__nrofPorts_p24:
+                  if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
+                    csirs_pdu_rel15->row = 14;
                     for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
-                      vrb_map[rb] |= (7 << csirs_pdu_rel15->symb_l0);
+                      vrb_map[rb] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
                   }
-                  else {
-                    csirs_pdu_rel15->row = 16;
+                  else{
+                    if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4) {
+                      csirs_pdu_rel15->row = 15;
+                      for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
+                        vrb_map[rb] |= (7 << csirs_pdu_rel15->symb_l0);
+                    }
+                    else {
+                      csirs_pdu_rel15->row = 13;
+                      for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
+                        vrb_map[rb] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
+                    }
+                  }
+                  break;
+                case NR_CSI_RS_ResourceMapping__nrofPorts_p32:
+                  if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm4_FD2_TD2) {
+                    csirs_pdu_rel15->row = 17;
                     for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
                       vrb_map[rb] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
                   }
-                }
-                break;
-            default:
-              AssertFatal(1==0,"Invalid number of ports in CSI-RS resource\n");
-            }
-            break;
-        default:
-          AssertFatal(1==0,"Invalid freqency domain allocation in CSI-RS resource\n");
+                  else{
+                    if (resourceMapping.cdm_Type == NR_CSI_RS_ResourceMapping__cdm_Type_cdm8_FD2_TD4) {
+                      csirs_pdu_rel15->row = 18;
+                      for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
+                        vrb_map[rb] |= (7 << csirs_pdu_rel15->symb_l0);
+                    }
+                    else {
+                      csirs_pdu_rel15->row = 16;
+                      for (int rb = csirs_pdu_rel15->start_rb; rb < (csirs_pdu_rel15->start_rb + csirs_pdu_rel15->nr_of_rbs); rb++)
+                        vrb_map[rb] |= ((3 << csirs_pdu_rel15->symb_l0) | (3 << csirs_pdu_rel15->symb_l1));
+                    }
+                  }
+                  break;
+              default:
+                AssertFatal(1==0,"Invalid number of ports in CSI-RS resource\n");
+              }
+              break;
+          default:
+            AssertFatal(1==0,"Invalid freqency domain allocation in CSI-RS resource\n");
+          }
+          dl_req->nPDUs++;
         }
-        dl_req->nPDUs++;
       }
     }
   }
 }
 
-
 bool find_free_CCE(module_id_t module_id,
                    sub_frame_t slot,
                    int UE_id){
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index 79d8ce64e6301537261b85704194cea2a8374e73..6a17cb4879816e8cdef0848c8965e7f45b2b1d75 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -98,17 +98,17 @@ int ssb_rsrp_sorted[MAX_NUM_SSB] = {0};
 //stored -1 for invalid values
 int L1_SSB_CSI_RSRP_measReport_mapping_38133_10_1_6_1_1[128] = {
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //0 - 9
-    -1, -1, -1, -1, -1, -1, -140, -139, -138, -137, //10 - 19
-    -136, -135, -134, -133, -132, -131, -130, -129, -128, -127, //20 - 29
-    -126, -125, -124, -123, -122, -121, -120, -119, -118, -117, //30 - 39
-    -116, -115, -114, -113, -112, -111, -110, -109, -108, -107, //40 - 49
-    -106, -105, -104, -103, -102, -101, -100, -99, -98, -97, //50 - 59
-    -96, -95, -94, -93, -92, -91, -90, -89, -88, -87, //60 - 69
-    -86, -85, -84, -83, -82, -81, -80, -79, -78, -77, //70 - 79
-    -76, -75, -74, -73, -72, -71, -70, -69, -68, -67, //80 - 89
-    -66, -65, -64, -63, -62, -61, -60, -59, -58, -57, //90 - 99
-    -56, -55, -54, -53, -52, -51, -50, -49, -48, -47, //100 - 109
-    -46, -45, -44, -44, -1, -1, -1, -1, -1, -1, //110 - 119
+     -1, -1, -1, -1, -1, -1, INT_MIN, -140, -139, -138, //10 - 19
+    -137, -136, -135, -134, -133, -132, -131, -130, -129, -128, //20 - 29
+    -127, -126, -125, -124, -123, -122, -121, -120, -119, -118, //30 - 39
+    -117,-116, -115, -114, -113, -112, -111, -110, -109, -108, //40 - 49
+    -107, -106, -105, -104, -103, -102, -101, -100, -99, -98, //50 - 59
+    -97, -96, -95, -94, -93, -92, -91, -90, -89, -88, //60 - 69
+    -87, -86, -85, -84, -83, -82, -81, -80, -79, -78, //70 - 79
+    -77, -76, -75, -74, -73, -72, -71, -70, -69, -68, //80 - 89
+    -67, -66, -65, -64, -63, -62, -61, -60, -59, -58, //90 - 99
+    -57, -56, -55, -54, -53, -52, -51, -50, -49, -48, //100 - 109
+    -47, -46, -45, -44, INT_MAX, -1, -1, -1, -1, -1, //110 - 119
     -1, -1, -1, -1, -1, -1, -1, -1//120 - 127
   };
 
@@ -487,7 +487,7 @@ void nr_csi_meas_reporting(int Mod_idP,
       // preparation is done in first slot of tdd period
       if (frame % (period / n_slots_frame) != offset / n_slots_frame)
         continue;
-      LOG_I(MAC, "CSI reporting in frame %d slot %d\n", frame, sched_slot);
+      LOG_D(MAC, "CSI reporting in frame %d slot %d\n", frame, sched_slot);
 
       const NR_PUCCH_CSI_Resource_t *pucchcsires = csirep->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list.array[0];
       const NR_PUCCH_ResourceSet_t *pucchresset = pucch_Config->resourceSetToAddModList->list.array[1]; // set with formats >1
@@ -507,6 +507,7 @@ void nr_csi_meas_reporting(int Mod_idP,
                   && curr_pucch->dai_c == 0,
                   "PUCCH not free at index 1 for UE %04x\n",
                   UE_info->rnti[UE_id]);
+      curr_pucch->r_pucch = -1;
       curr_pucch->frame = frame;
       curr_pucch->ul_slot = sched_slot;
       curr_pucch->resource_indicator = res_index;
@@ -849,6 +850,7 @@ void tci_handling(module_id_t Mod_idP, int UE_id, frame_t frame, slot_t slot) {
   }//is-triggering_beam_switch
 }//tci handling
 
+
 uint8_t pickandreverse_bits(uint8_t *payload, uint16_t bitlen, uint8_t start_bit) {
   uint8_t rev_bits = 0;
   for (int i=0; i<bitlen; i++)
@@ -984,7 +986,7 @@ void extract_pucch_csi_report(NR_CSI_MeasConfig_t *csi_MeasConfig,
     // verify if report with current id has been scheduled for this frame and slot
     if ((n_slots_frame*frame + slot - offset)%period == 0) {
       reportQuantity_type = UE_info->csi_report_template[UE_id][csi_report_id].reportQuantity_type;
-      LOG_I(MAC,"SFN/SF:%d/%d reportQuantity type = %d\n",frame,slot,reportQuantity_type);
+      LOG_D(MAC,"SFN/SF:%d/%d reportQuantity type = %d\n",frame,slot,reportQuantity_type);
       switch(reportQuantity_type){
         case NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP:
           evaluate_rsrp_report(UE_info,sched_ctrl,UE_id,csi_report_id,payload,&cumul_bits,reportQuantity_type);
@@ -1150,7 +1152,6 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
 }
 
 
-// function to update pucch scheduling parameters in UE list when a USS DL is scheduled
 // this function returns an index to NR_sched_pucch structure
 // currently this structure contains PUCCH0 at index 0 and PUCCH2 at index 1
 // if the function returns -1 it was not possible to schedule acknack
@@ -1363,199 +1364,6 @@ int nr_acknack_scheduling(int mod_id,
   return 0;
 }
 
-void csi_period_offset(NR_CSI_ReportConfig_t *csirep,
-                       NR_NZP_CSI_RS_Resource_t *nzpcsi,
-                       int *period, int *offset) {
-
-  if(nzpcsi != NULL) {
-
-    NR_CSI_ResourcePeriodicityAndOffset_PR p_and_o = nzpcsi->periodicityAndOffset->present;
-
-    switch(p_and_o){
-      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots4:
-        *period = 4;
-        *offset = nzpcsi->periodicityAndOffset->choice.slots4;
-        break;
-      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots5:
-        *period = 5;
-        *offset = nzpcsi->periodicityAndOffset->choice.slots5;
-        break;
-      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots8:
-        *period = 8;
-        *offset = nzpcsi->periodicityAndOffset->choice.slots8;
-        break;
-      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots10:
-        *period = 10;
-        *offset = nzpcsi->periodicityAndOffset->choice.slots10;
-        break;
-      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots16:
-        *period = 16;
-        *offset = nzpcsi->periodicityAndOffset->choice.slots16;
-        break;
-      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots20:
-        *period = 20;
-        *offset = nzpcsi->periodicityAndOffset->choice.slots20;
-        break;
-      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots32:
-        *period = 32;
-        *offset = nzpcsi->periodicityAndOffset->choice.slots32;
-        break;
-      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots40:
-        *period = 40;
-        *offset = nzpcsi->periodicityAndOffset->choice.slots40;
-        break;
-      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots64:
-        *period = 64;
-        *offset = nzpcsi->periodicityAndOffset->choice.slots64;
-        break;
-      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots80:
-        *period = 80;
-        *offset = nzpcsi->periodicityAndOffset->choice.slots80;
-        break;
-      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots160:
-        *period = 160;
-        *offset = nzpcsi->periodicityAndOffset->choice.slots160;
-        break;
-      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots320:
-        *period = 320;
-        *offset = nzpcsi->periodicityAndOffset->choice.slots320;
-        break;
-      case NR_CSI_ResourcePeriodicityAndOffset_PR_slots640:
-        *period = 640;
-        *offset = nzpcsi->periodicityAndOffset->choice.slots640;
-        break;
-    default:
-      AssertFatal(1==0,"No periodicity and offset found in CSI resource");
-    }
-
-  }
-
-  if(csirep != NULL) {
-
-    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");
-    }
-  }
-}
-
-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 nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
 {
@@ -1588,7 +1396,7 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
 
       int SR_period; int SR_offset;
 
-      periodicity__SRR(SchedulingRequestResourceConfig,&SR_period,&SR_offset);
+      find_period_offest_SR(SchedulingRequestResourceConfig,&SR_period,&SR_offset);
       // convert to int to avoid underflow of uint
       int sfn_sf = SFN * n_slots_frame + slot;
       if ((sfn_sf - SR_offset) % SR_period != 0)
@@ -1657,65 +1465,3 @@ void nr_sr_reporting(int Mod_idP, frame_t SFN, sub_frame_t slot)
   }
 }
 
-
-void periodicity__SRR (NR_SchedulingRequestResourceConfig_t *SchedulingReqRec, int *period, int *offset)
-{
-  NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR P_O = SchedulingReqRec->periodicityAndOffset->present;
-  switch (P_O){
-    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl1:
-      *period = 1;
-      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl1;
-      break;
-    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl2:
-      *period = 2;
-      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl2;
-      break;
-    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl4:
-      *period = 4;
-      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl4;
-      break;
-    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl5:
-      *period = 5;
-      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl5;
-      break;
-    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl8:
-      *period = 8;
-      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl8;
-      break;
-    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl10:
-      *period = 10;
-      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl10;
-      break;
-    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl16:
-      *period = 16;
-      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl16;
-      break;
-    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl20:
-      *period = 20;
-      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl20;
-      break;
-    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl40:
-      *period = 40;
-      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl40;
-      break;
-    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl80:
-      *period = 80;
-      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl80;
-      break;
-    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl160:
-      *period = 160;
-      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl160;
-      break;
-    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl320:
-      *period = 320;
-      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl320;
-      break;
-    case NR_SchedulingRequestResourceConfig__periodicityAndOffset_PR_sl640:
-      *period = 640;
-      *offset = SchedulingReqRec->periodicityAndOffset->choice.sl640;
-      break;
-    default:
-      AssertFatal(1==0,"No periodicityAndOffset resources found in schedulingrequestresourceconfig");
-  }
-}
-
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index fbd8a4b5ca0f924041a912dc7fa38292999033c2..f43c4bfa6ea296f1b369c80e93fe3d72e2d15a2a 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -174,60 +174,63 @@ void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ub
           tdd->nrofUplinkSlots);
 }
 
+//  For both UL-SCH except:
+//   - UL-SCH: fixed-size MAC CE(known by LCID)
+//   - UL-SCH: padding
+//   - UL-SCH: MSG3 48-bits
+//  |0|1|2|3|4|5|6|7|  bit-wise
+//  |R|F|   LCID    |
+//  |       L       |
+//  |0|1|2|3|4|5|6|7|  bit-wise
+//  |R|F|   LCID    |
+//  |       L       |
+//  |       L       |
+//
+//  For:
+//   - UL-SCH: fixed-size MAC CE(known by LCID)
+//   - UL-SCH: padding, for single/multiple 1-oct padding CE(s)
+//   - UL-SCH: MSG3 48-bits
+//  |0|1|2|3|4|5|6|7|  bit-wise
+//  |R|R|   LCID    |
+//
+//  LCID: The Logical Channel ID field identifies the logical channel instance of the corresponding MAC SDU or the type of the corresponding MAC CE or padding as described in Tables 6.2.1-1 and 6.2.1-2 for the DL-SCH and UL-SCH respectively. There is one LCID field per MAC subheader. The LCID field size is 6 bits;
+//  L: The Length field indicates the length of the corresponding MAC SDU or variable-sized MAC CE in bytes. There is one L field per MAC subheader except for subheaders corresponding to fixed-sized MAC CEs and padding. The size of the L field is indicated by the F field;
+//  F: length of L is 0:8 or 1:16 bits wide
+//  R: Reserved bit, set to zero.
+
 void nr_process_mac_pdu(module_id_t module_idP,
                         int UE_id,
                         uint8_t CC_id,
                         frame_t frameP,
                         sub_frame_t slot,
                         uint8_t *pduP,
-                        uint16_t mac_pdu_len)
+                        int pdu_len)
 {
 
-    // This function is adapting code from the old
-    // parse_header(...) and ue_send_sdu(...) functions of OAI LTE
-
-    uint8_t *pdu_ptr = pduP, rx_lcid, done = 0;
-    int pdu_len = mac_pdu_len;
-    uint16_t mac_ce_len, mac_subheader_len, mac_sdu_len;
+    uint8_t rx_lcid;
+    uint8_t done = 0;
+    uint16_t mac_ce_len;
+    uint16_t mac_subheader_len;
+    uint16_t mac_sdu_len;
 
     NR_UE_info_t *UE_info = &RC.nrmac[module_idP]->UE_info;
     NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
 
     if ( pduP[0] != UL_SCH_LCID_PADDING )
-      trace_NRpdu(DIRECTION_UPLINK, pduP, mac_pdu_len ,UE_id, WS_C_RNTI, UE_info->rnti[UE_id], frameP, 0, 0, 0);
-
-    //  For both DL/UL-SCH
-    //  Except:
-    //   - UL/DL-SCH: fixed-size MAC CE(known by LCID)
-    //   - UL/DL-SCH: padding
-    //   - UL-SCH:    MSG3 48-bits
-    //  |0|1|2|3|4|5|6|7|  bit-wise
-    //  |R|F|   LCID    |
-    //  |       L       |
-    //  |0|1|2|3|4|5|6|7|  bit-wise
-    //  |R|F|   LCID    |
-    //  |       L       |
-    //  |       L       |
-
-    //  For both DL/UL-SCH
-    //  For:
-    //   - UL/DL-SCH: fixed-size MAC CE(known by LCID)
-    //   - UL/DL-SCH: padding, for single/multiple 1-oct padding CE(s)
-    //   - UL-SCH:    MSG3 48-bits
-    //  |0|1|2|3|4|5|6|7|  bit-wise
-    //  |R|R|   LCID    |
-    //  LCID: The Logical Channel ID field identifies the logical channel instance of the corresponding MAC SDU or the type of the corresponding MAC CE or padding as described in Tables 6.2.1-1 and 6.2.1-2 for the DL-SCH and UL-SCH respectively. There is one LCID field per MAC subheader. The LCID field size is 6 bits;
-    //  L: The Length field indicates the length of the corresponding MAC SDU or variable-sized MAC CE in bytes. There is one L field per MAC subheader except for subheaders corresponding to fixed-sized MAC CEs and padding. The size of the L field is indicated by the F field;
-    //  F: lenght of L is 0:8 or 1:16 bits wide
-    //  R: Reserved bit, set to zero.
+      trace_NRpdu(DIRECTION_UPLINK, pduP, pdu_len, UE_id, WS_C_RNTI, UE_info->rnti[UE_id], frameP, 0, 0, 0);
+
+    #ifdef ENABLE_MAC_PAYLOAD_DEBUG
+    LOG_I(NR_MAC, "In %s: dumping MAC PDU in %d.%d:\n", __func__, frameP, slot);
+    log_dump(NR_MAC, pduP, pdu_len, LOG_DUMP_CHAR, "\n");
+    #endif
 
     while (!done && pdu_len > 0){
         mac_ce_len = 0;
-        mac_subheader_len = 1; //  default to fixed-length subheader = 1-oct
+        mac_subheader_len = sizeof(NR_MAC_SUBHEADER_FIXED);
         mac_sdu_len = 0;
-        rx_lcid = ((NR_MAC_SUBHEADER_FIXED *)pdu_ptr)->LCID;
+        rx_lcid = ((NR_MAC_SUBHEADER_FIXED *)pduP)->LCID;
 
-        LOG_D(NR_MAC, "LCID received at gNB side: %d \n", rx_lcid);
+        LOG_D(NR_MAC, "In %s: received UL-SCH sub-PDU with LCID 0x%x in %d.%d (remaining PDU length %d)\n", __func__, rx_lcid, frameP, slot, pdu_len);
 
         unsigned char *ce_ptr;
         int n_Lcg = 0;
@@ -236,7 +239,7 @@ void nr_process_mac_pdu(module_id_t module_idP,
             //  MAC CE
 
             /*#ifdef DEBUG_HEADER_PARSING
-              LOG_D(NR_MAC, "[UE] LCID %d, PDU length %d\n", ((NR_MAC_SUBHEADER_FIXED *)pdu_ptr)->LCID, pdu_len);
+              LOG_D(NR_MAC, "[UE] LCID %d, PDU length %d\n", ((NR_MAC_SUBHEADER_FIXED *)pduP)->LCID, pdu_len);
             #endif*/
         case UL_SCH_LCID_RECOMMENDED_BITRATE_QUERY:
               // 38.321 Ch6.1.3.20
@@ -252,7 +255,7 @@ void nr_process_mac_pdu(module_id_t module_idP,
                //fixed length
                mac_ce_len =1;
                /* Extract short BSR value */
-               ce_ptr = &pdu_ptr[mac_subheader_len];
+               ce_ptr = &pduP[mac_subheader_len];
                NR_BSR_SHORT *bsr_s = (NR_BSR_SHORT *) ce_ptr;
                sched_ctrl->estimated_ul_buffer = 0;
                sched_ctrl->estimated_ul_buffer = NR_SHORT_BSR_TABLE[bsr_s->Buffer_size];
@@ -270,14 +273,14 @@ void nr_process_mac_pdu(module_id_t module_idP,
         case UL_SCH_LCID_L_TRUNCATED_BSR:
         	//38.321 section 6.1.3.1
         	//variable length
-        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
+        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
         	mac_subheader_len = 2;
-        	if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
-        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
+        	if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
         		mac_subheader_len = 3;
         	}
         	/* Extract long BSR value */
-               ce_ptr = &pdu_ptr[mac_subheader_len];
+               ce_ptr = &pduP[mac_subheader_len];
                NR_BSR_LONG *bsr_l = (NR_BSR_LONG *) ce_ptr;
                sched_ctrl->estimated_ul_buffer = 0;
 
@@ -290,18 +293,18 @@ void nr_process_mac_pdu(module_id_t module_idP,
 
                for (int n = 0; n < n_Lcg; n++){
                  LOG_D(NR_MAC, "LONG BSR, %d/%d (n/n_Lcg), BS Index %d, BS value < %d",
-                       n, n_Lcg, pdu_ptr[mac_subheader_len + 1 + n],
-                       NR_LONG_BSR_TABLE[pdu_ptr[mac_subheader_len + 1 + n]]);
+                       n, n_Lcg, pduP[mac_subheader_len + 1 + n],
+                       NR_LONG_BSR_TABLE[pduP[mac_subheader_len + 1 + n]]);
                  sched_ctrl->estimated_ul_buffer +=
-                       NR_LONG_BSR_TABLE[pdu_ptr[mac_subheader_len + 1 + n]];
+                       NR_LONG_BSR_TABLE[pduP[mac_subheader_len + 1 + n]];
                  LOG_D(NR_MAC,
                        "LONG BSR at %4d.%2d, %d/%d (n/n_Lcg), BS Index %d, BS value < %d, total %d\n",
                        frameP,
                        slot,
                        n,
                        n_Lcg,
-                       pdu_ptr[mac_subheader_len + 1 + n],
-                       NR_LONG_BSR_TABLE[pdu_ptr[mac_subheader_len + 1 + n]],
+                       pduP[mac_subheader_len + 1 + n],
+                       NR_LONG_BSR_TABLE[pduP[mac_subheader_len + 1 + n]],
                        sched_ctrl->estimated_ul_buffer);
                }
 
@@ -319,7 +322,7 @@ void nr_process_mac_pdu(module_id_t module_idP,
         	//fixed length
         	mac_ce_len = 2;
         	/* Extract SINGLE ENTRY PHR elements for PHR calculation */
-        	ce_ptr = &pdu_ptr[mac_subheader_len];
+        	ce_ptr = &pduP[mac_subheader_len];
         	NR_SINGLE_ENTRY_PHR_MAC_CE *phr = (NR_SINGLE_ENTRY_PHR_MAC_CE *) ce_ptr;
         	/* Save the phr info */
         	const int PH = phr->PH;
@@ -338,10 +341,10 @@ void nr_process_mac_pdu(module_id_t module_idP,
         case UL_SCH_LCID_MULTI_ENTRY_PHR_1_OCT:
         	//38.321 section 6.1.3.9
         	//  varialbe length
-        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
+        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
         	mac_subheader_len = 2;
-        	if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
-        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
+        	if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
         		mac_subheader_len = 3;
         	}
         	/* Extract MULTI ENTRY PHR elements from single octet bitmap for PHR calculation */
@@ -350,10 +353,10 @@ void nr_process_mac_pdu(module_id_t module_idP,
         case UL_SCH_LCID_MULTI_ENTRY_PHR_4_OCT:
         	//38.321 section 6.1.3.9
         	//  varialbe length
-        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
+        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
         	mac_subheader_len = 2;
-        	if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
-        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
+        	if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
         		mac_subheader_len = 3;
         	}
         	/* Extract MULTI ENTRY PHR elements from four octets bitmap for PHR calculation */
@@ -366,13 +369,13 @@ void nr_process_mac_pdu(module_id_t module_idP,
 
         case UL_SCH_LCID_SRB1:
         case UL_SCH_LCID_SRB2:
-          if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
-            //mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
+          if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+            //mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
             mac_subheader_len = 3;
-            mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pdu_ptr)->L1 & 0x7f) << 8)
-                | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pdu_ptr)->L2 & 0xff);
+            mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pduP)->L1 & 0x7f) << 8)
+                | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff);
           } else {
-            mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
+            mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
             mac_subheader_len = 2;
           }
           LOG_D(NR_MAC, "[UE %d] Frame %d : ULSCH -> UL-DCCH %d (gNB %d, %d bytes), rnti: %d \n", module_idP, frameP, rx_lcid, module_idP, mac_sdu_len, UE_info->rnti[UE_id]);
@@ -383,7 +386,7 @@ void nr_process_mac_pdu(module_id_t module_idP,
                            ENB_FLAG_YES,
                            MBMS_FLAG_NO,
                            rx_lcid,
-                           (char *) (pdu_ptr + mac_subheader_len),
+                           (char *) (pduP + mac_subheader_len),
                            mac_sdu_len,
                            1,
                            NULL);
@@ -404,7 +407,7 @@ void nr_process_mac_pdu(module_id_t module_idP,
             // Check if it is a valid CCCH1 message, we get all 00's messages very often
             int i = 0;
             for(i=0; i<(mac_subheader_len+mac_sdu_len); i++) {
-              if(pdu_ptr[i] != 0) {
+              if(pduP[i] != 0) {
                 break;
               }
             }
@@ -425,35 +428,34 @@ void nr_process_mac_pdu(module_id_t module_idP,
                               0,
                               UE_info->rnti[UE_id],
                               CCCH,
-                              pdu_ptr+mac_subheader_len,
+                              pduP + mac_subheader_len,
                               mac_sdu_len,
                               0);
           break;
 
         case UL_SCH_LCID_DTCH:
           //  check if LCID is valid at current time.
-          if (((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F) {
-            // mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
+          if (((NR_MAC_SUBHEADER_SHORT *)pduP)->F) {
+            // mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
             mac_subheader_len = 3;
-            mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L1 & 0x7f) << 8)
-                          | ((uint16_t)((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2 & 0xff);
+            mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L1 & 0x7f) << 8)
+                          | ((uint16_t)((NR_MAC_SUBHEADER_LONG *)pduP)->L2 & 0xff);
 
           } else {
-            mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
+            mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
             mac_subheader_len = 2;
           }
 
-          LOG_D(NR_MAC, "[UE %d] Frame %d : ULSCH -> UL-%s %d (gNB %d, %d bytes)\n",
+          LOG_D(NR_MAC, "In %s: [UE %d] %d.%d : ULSCH -> UL-%s %d (gNB %d, %d bytes)\n",
+                __func__,
                 module_idP,
                 frameP,
+                slot,
                 rx_lcid<4?"DCCH":"DTCH",
                 rx_lcid,
                 module_idP,
                 mac_sdu_len);
           UE_info->mac_stats[UE_id].lc_bytes_rx[rx_lcid] += mac_sdu_len;
-#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
-            log_dump(NR_MAC, pdu_ptr + mac_subheader_len, 32, LOG_DUMP_CHAR, "\n");
-#endif
 
           mac_rlc_data_ind(module_idP,
                            UE_info->rnti[UE_id],
@@ -462,7 +464,7 @@ void nr_process_mac_pdu(module_id_t module_idP,
                            ENB_FLAG_YES,
                            MBMS_FLAG_NO,
                            rx_lcid,
-                           (char *)(pdu_ptr + mac_subheader_len),
+                           (char *)(pduP + mac_subheader_len),
                            mac_sdu_len,
                            1,
                            NULL);
@@ -479,14 +481,27 @@ void nr_process_mac_pdu(module_id_t module_idP,
           return;
           break;
         }
-        pdu_ptr += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
+
+        #ifdef ENABLE_MAC_PAYLOAD_DEBUG
+        if (rx_lcid < 45 || rx_lcid == 52 || rx_lcid == 63) {
+          LOG_I(NR_MAC, "In %s: dumping UL MAC SDU sub-header with length %d (LCID = 0x%02x):\n", __func__, mac_subheader_len, rx_lcid);
+          log_dump(NR_MAC, pduP, mac_subheader_len, LOG_DUMP_CHAR, "\n");
+          LOG_I(NR_MAC, "In %s: dumping UL MAC SDU with length %d (LCID = 0x%02x):\n", __func__, mac_sdu_len, rx_lcid);
+          log_dump(NR_MAC, pduP + mac_subheader_len, mac_sdu_len, LOG_DUMP_CHAR, "\n");
+        } else {
+          LOG_I(NR_MAC, "In %s: dumping UL MAC CE with length %d (LCID = 0x%02x):\n", __func__, mac_ce_len, rx_lcid);
+          log_dump(NR_MAC, pduP + mac_subheader_len + mac_sdu_len, mac_ce_len, LOG_DUMP_CHAR, "\n");
+        }
+        #endif
+
+        pduP += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
         pdu_len -= ( mac_subheader_len + mac_ce_len + mac_sdu_len );
 
         if (pdu_len < 0) {
-          LOG_E(NR_MAC, "%s() residual mac pdu length < 0!, pdu_len: %d\n", __func__, pdu_len);
+          LOG_E(NR_MAC, "In %s: residual UL MAC PDU in %d.%d with length < 0!, pdu_len %d \n", __func__, frameP, slot, pdu_len);
           LOG_E(NR_MAC, "MAC PDU ");
           for (int i = 0; i < 20; i++) // Only printf 1st - 20nd bytes
-            printf("%02x ", pdu_ptr[i]);
+            printf("%02x ", pduP[i]);
           printf("\n");
           return;
         }
@@ -511,19 +526,26 @@ void abort_nr_ul_harq(module_id_t mod_id, int UE_id, int8_t harq_pid)
     sched_ctrl->sched_ul_bytes = 0;
 }
 
-void handle_nr_ul_harq(module_id_t mod_id,
+void handle_nr_ul_harq(const int CC_idP,
+                       module_id_t mod_id,
                        frame_t frame,
                        sub_frame_t slot,
                        const nfapi_nr_crc_t *crc_pdu)
 {
+  gNB_MAC_INST *gNB_mac = RC.nrmac[mod_id];
   int UE_id = find_nr_UE_id(mod_id, crc_pdu->rnti);
   if (UE_id < 0) {
+    for (int i = 0; i < NR_NB_RA_PROC_MAX; ++i) {
+      NR_RA_t *ra = &gNB_mac->common_channels[CC_idP].ra[i];
+      if (ra->state >= WAIT_Msg3 &&
+          ra->rnti == crc_pdu->rnti)
+        return;
+    }
     LOG_E(NR_MAC, "%s(): unknown RNTI %04x in PUSCH\n", __func__, crc_pdu->rnti);
     return;
   }
   NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
   NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
-
   int8_t harq_pid = sched_ctrl->feedback_ul_harq.head;
   while (crc_pdu->harq_id != harq_pid || harq_pid < 0) {
     LOG_W(NR_MAC,
@@ -586,6 +608,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
                const uint16_t timing_advance,
                const uint8_t ul_cqi,
                const uint16_t rssi){
+
   gNB_MAC_INST *gNB_mac = RC.nrmac[gnb_mod_idP];
   NR_UE_info_t *UE_info = &gNB_mac->UE_info;
 
@@ -770,7 +793,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
           nr_process_mac_pdu(gnb_mod_idP, UE_id, CC_idP, frameP, slotP, sduP, sdu_lenP);
 
           ra->state = Msg4;
-          ra->Msg4_frame = ( frameP +2 ) % 1024;
+          ra->Msg4_frame = (frameP + 2) % 1024;
           ra->Msg4_slot = 1;
           LOG_I(NR_MAC, "Scheduling RA-Msg4 for TC_RNTI %04x (state %d, frame %d, slot %d)\n", ra->rnti, ra->state, ra->Msg4_frame, ra->Msg4_slot);
 
@@ -784,9 +807,19 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
       if (ra->state != WAIT_Msg3)
         continue;
 
-      LOG_W(NR_MAC, "Random Access %i failed at state %i (state is not WAIT_Msg3)\n", i, ra->state);
-      nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
-      nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
+      if( (frameP!=ra->Msg3_frame) || (slotP!=ra->Msg3_slot))
+        continue;
+
+      if (ra->msg3_round >= MAX_HARQ_ROUNDS - 1) {
+        LOG_W(NR_MAC, "Random Access %i failed at state %i (Reached msg3 max harq rounds)\n", i, ra->state);
+        nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
+        nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
+        return;
+      }
+
+      LOG_W(NR_MAC, "Random Access %i Msg3 CRC did not pass)\n", i);
+      ra->msg3_round++;
+      ra->state = Msg3_retransmission;
     }
   }
 }
@@ -1562,7 +1595,7 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
       ul_dci_request_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu));
       pdcch_pdu = &ul_dci_request_pdu->pdcch_pdu.pdcch_pdu_rel15;
       ul_dci_req->numPdus += 1;
-      nr_configure_pdcch(pdcch_pdu, ss, coreset, scc, sched_ctrl->active_bwp);
+      nr_configure_pdcch(pdcch_pdu, ss, coreset, scc, genericParameters, NULL);
       pdcch_pdu_bwp_coreset[bwpid][coresetid] = pdcch_pdu;
     }
 
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index c7e6f9c5fc2fe8bd6018dd41292f856879ee76ac..391b98af365dd4be61fe8985b44ad1fc7461a847 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -51,6 +51,7 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
                            int ssb_SubcarrierOffset,
                            int pdsch_AntennaPorts,
                            int pusch_AntennaPorts,
+                           int sib1_tda,
                            NR_ServingCellConfigCommon_t *scc,
 		                  	   int nsa_flag,
 			                     uint32_t rnti,
@@ -72,18 +73,19 @@ void nr_schedule_ue_spec(module_id_t module_id,
                          frame_t frame,
                          sub_frame_t slot);
 
+uint32_t schedule_control_sib1(module_id_t module_id,
+                               int CC_id,
+                               NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
+                               int time_domain_allocation,
+                               int startSymbolIndex,
+                               int nrOfSymbols,
+                               uint16_t dlDmrsSymbPos,
+                               uint8_t candidate_idx,
+                               int num_total_bytes);
+
 /* \brief default FR1 DL preprocessor init routine, returns preprocessor to call */
 nr_pp_impl_dl nr_init_fr1_dlsch_preprocessor(module_id_t module_id, int CC_id);
 
-void schedule_control_sib1(module_id_t module_id,
-                           int CC_id,
-                           NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config,
-                           int time_domain_allocation,
-                           uint8_t mcsTableIdx,
-                           uint8_t mcs,
-                           uint8_t candidate_idx,
-                           int num_total_bytes);
-
 void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t subframeP);
 
 void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP);
@@ -124,6 +126,8 @@ void nr_get_Msg3alloc(module_id_t module_id,
                       NR_RA_t *ra,
                       int16_t *tdd_beam_association);
 
+void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP, NR_RA_t *ra);
+
 /* \brief Function in gNB to fill RAR pdu when requested by PHY.
 @param ra Instance of RA resources of gNB
 @param dlsch_buffer Pointer to RAR input buffer
@@ -134,6 +138,15 @@ void nr_fill_rar(uint8_t Mod_idP,
                  uint8_t * dlsch_buffer,
                  nfapi_nr_pusch_pdu_t  *pusch_pdu);
 
+void fill_msg3_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu,
+                         NR_ServingCellConfigCommon_t *scc,
+                         int round,
+                         int startSymbolAndLength,
+                         rnti_t rnti, int scs,
+                         int bwp_size, int bwp_start,
+                         int mappingtype, int fh,
+                         int msg3_first_rb, int msg3_nb_rb);
+
 
 void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP);
 
@@ -183,10 +196,6 @@ void nr_csirs_scheduling(int Mod_idP,
                          sub_frame_t slot,
                          int n_slots_frame);
 
-void csi_period_offset(NR_CSI_ReportConfig_t *csirep,
-                       NR_NZP_CSI_RS_Resource_t *nzpcsi,
-                       int *period, int *offset);
-
 void nr_csi_meas_reporting(int Mod_idP,
                            frame_t frameP,
                            sub_frame_t slotP);
@@ -240,7 +249,8 @@ void nr_configure_pdcch(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
                         NR_SearchSpace_t *ss,
                         NR_ControlResourceSet_t *coreset,
                         NR_ServingCellConfigCommon_t *scc,
-                        NR_BWP_Downlink_t *bwp);
+                        NR_BWP_t *bwp,
+                        NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config);
 
 void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
                         const NR_CellGroupConfig_t *CellGroup,
@@ -273,7 +283,7 @@ void nr_set_pdsch_semi_static(const NR_ServingCellConfigCommon_t *scc,
                               const NR_CellGroupConfig_t *secondaryCellGroup,
                               const NR_BWP_Downlink_t *bwp,
                               int tda,
-                              uint8_t num_dmrs_cdm_grps_no_data,
+                              const long dci_format,
                               NR_pdsch_semi_static_t *ps);
 
 void nr_set_pusch_semi_static(const NR_ServingCellConfigCommon_t *scc,
@@ -333,15 +343,6 @@ 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);
-
 int nr_get_default_pucch_res(int pucch_ResourceCommon);
 
 void compute_csi_bitlen(NR_CSI_MeasConfig_t *csi_MeasConfig, NR_UE_info_t *UE_info, int UE_id, module_id_t Mod_idP);
@@ -401,7 +402,8 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
                const uint8_t ul_cqi,
                const uint16_t rssi);
 
-void handle_nr_ul_harq(module_id_t mod_id,
+void handle_nr_ul_harq(const int CC_idP,
+                       module_id_t mod_id,
                        frame_t frame,
                        sub_frame_t slot,
                        const nfapi_nr_crc_t *crc_pdu);
@@ -415,6 +417,8 @@ int16_t ssb_index_from_prach(module_id_t module_idP,
 
 void find_SSB_and_RO_available(module_id_t module_idP);
 
+void set_dl_dmrs_ports(NR_pdsch_semi_static_t *ps);
+
 void calculate_preferred_dl_tda(module_id_t module_id, const NR_BWP_Downlink_t *bwp);
 void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ubwp);
 
@@ -431,8 +435,4 @@ bool nr_find_nb_rb(uint16_t Qm,
 
 void nr_sr_reporting(int Mod_idP, frame_t frameP, sub_frame_t slotP);
 
-void periodicity__SRR (NR_SchedulingRequestResourceConfig_t *SchedulingReqRecconf,
-                       int *period,
-                       int *offset);
-
 #endif /*__LAYER2_NR_MAC_PROTO_H__*/
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index bd88c39306ab09098c13e288e447c33c331fc856..22da5223c06ac8b4efd3b729c73e3fd1f93bb58a 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -93,8 +93,9 @@ typedef enum {
   RA_IDLE = 0,
   Msg2 = 1,
   WAIT_Msg3 = 2,
-  Msg4 = 3,
-  WAIT_Msg4_ACK = 4
+  Msg3_retransmission = 3,
+  Msg4 = 4,
+  WAIT_Msg4_ACK = 5
 } RA_gNB_state_t;
 
 typedef struct NR_preamble_ue {
@@ -156,6 +157,8 @@ typedef struct {
   int msg4_TBsize;
   /// MCS used for Msg4
   int msg4_mcs;
+  /// MAC PDU length for Msg4
+  int mac_pdu_length;
   /// RA search space
   NR_SearchSpace_t *ra_ss;
   // Beam index
@@ -365,9 +368,9 @@ typedef struct NR_pdsch_semi_static {
 
   int startSymbolIndex;
   int nrOfSymbols;
-
+  uint8_t nrOfLayers;
   uint8_t mcsTableIdx;
-
+  uint8_t dmrs_ports_id;
   uint8_t N_PRB_DMRS;
   uint8_t N_DMRS_SLOT;
   uint16_t dl_dmrs_symb_pos;
@@ -383,7 +386,6 @@ typedef struct NR_sched_pdsch {
   uint8_t mcs;
 
   /// TBS-related info
-  uint8_t nrOfLayers;
   uint16_t R;
   uint8_t Qm;
   uint32_t tb_size;
@@ -670,6 +672,8 @@ typedef struct gNB_MAC_INST_s {
   int                             pusch_failure_thres;
   /// Subcarrier Offset
   int                             ssb_SubcarrierOffset;
+  /// SIB1 Time domain allocation
+  int                             sib1_tda;
   /// Common cell resources
   NR_COMMON_channels_t common_channels[NFAPI_CC_MAX];
   /// current PDU index (BCH,DLSCH)
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c
index 0ef6893d084a4c366fba14276dd5655fd46d40c6..c2736ddd840869392fd20bc236648594485cbc0f 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_control_primitive.c
@@ -32,7 +32,6 @@
 #include "rtos_header.h"
 #include "platform.h"
 #include "protocol_vars_extern.h"
-#include "print.h"
 //-----------------------------------------------------------------------------
 #include "rlc.h"
 #include "pdcp.h"
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
index 08f5b11c23197f47587d5f8801cd8c875dd211df..8db5ce31adf0885dcea340b2bac61b25c9ea0a83 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
@@ -218,7 +218,7 @@ static void reassemble_and_deliver(nr_rlc_entity_am_t *entity, int sn)
       bad_sdu = 1;
     }
     if (!bad_sdu && len > 0) {
-      memcpy(sdu + so, pdu->data, len);
+      memcpy(sdu + so, pdu->data + so - pdu->so, len);
       so += len;
     }
     free(pdu->data);
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
index 86a0697624091d9d41dae21a095753ed8bf928d4..26ae4818891f2062113c4eeedd4d7da9a293141c 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
@@ -78,7 +78,7 @@ static int tx_list_size(nr_rlc_entity_tm_t *entity,
 {
   int ret = 0;
 
-  while (l != NULL) {
+  while (l != NULL && ret < maxsize) {
     ret += l->size;
     l = l->next;
   }
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
index f967c3c5432a9832768ea4ceb22a0083eecbc0ff..71173eee5af3ae0024f2cab860805057dcd05563 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
@@ -148,7 +148,7 @@ static void reassemble_and_deliver(nr_rlc_entity_um_t *entity, int sn)
       bad_sdu = 1;
     }
     if (!bad_sdu && len > 0) {
-      memcpy(sdu + so, pdu->data, len);
+      memcpy(sdu + so, pdu->data + so - pdu->so, len);
       so += len;
     }
     free(pdu->data);
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
index fb657bf5a8889042f0611f1c441bf706b764d4bc..2d28343f9be65bc36c55fff70b3aa0e3c7939774 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
@@ -208,7 +208,10 @@ tbs_size_t mac_rlc_data_req(
   switch (channel_idP) {
   case 1 ... 3: rb = ue->srb[channel_idP - 1]; break;
   case 4 ... 8: rb = ue->drb[channel_idP - 4]; break;
-  default:      rb = NULL;                     break;
+  default:
+  rb = NULL;
+  LOG_E(RLC, "In %s:%d:%s: data request for unknown RB with LCID 0x%02x !\n", __FILE__, __LINE__, __FUNCTION__, channel_idP);
+  break;
   }
 
   if (rb != NULL) {
@@ -216,8 +219,6 @@ tbs_size_t mac_rlc_data_req(
     maxsize = tb_sizeP;
     ret = rb->generate_pdu(rb, buffer_pP, maxsize);
   } else {
-    LOG_E(RLC, "%s:%d:%s: fatal: data req for unknown RB, channel_idP: %d\n", __FILE__, __LINE__, __FUNCTION__, channel_idP);
-    exit(1);
     ret = 0;
   }
 
@@ -263,7 +264,8 @@ mac_rlc_status_resp_t mac_rlc_status_ind(
      * reports '> 81338368' (table 6.1.3.1-2). Passing 100000000 is thus
      * more than enough.
      */
-    buf_stat = rb->buffer_status(rb, 100000000);
+    // Fix me: temproary reduction meanwhile cpu cost of this computation is optimized
+    buf_stat = rb->buffer_status(rb, 1000*1000);
     ret.bytes_in_buffer = buf_stat.status_size
                         + buf_stat.retx_size
                         + buf_stat.tx_size;
@@ -326,7 +328,8 @@ rlc_buffer_occupancy_t mac_rlc_get_buffer_occupancy_ind(
      * more than enough.
      */
     // Fixme : Laurent reduced size for CPU saving
-    buf_stat = rb->buffer_status(rb, 10000000);
+    // Fix me: temproary reduction meanwhile cpu cost of this computation is optimized
+    buf_stat = rb->buffer_status(rb, 1000*1000);
     ret = buf_stat.status_size
         + buf_stat.retx_size
         + buf_stat.tx_size;
diff --git a/openair2/LAYER2/nr_rlc/tests/run_tests.sh b/openair2/LAYER2/nr_rlc/tests/run_tests.sh
index a98f6b5d0fffe9f530e0ee49d06bedb9413ed11b..7ca4798861a8dc50f0abe830a67288404cc9d243 100755
--- a/openair2/LAYER2/nr_rlc/tests/run_tests.sh
+++ b/openair2/LAYER2/nr_rlc/tests/run_tests.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-test_count=15
+test_count=17
 
 for i in `seq $test_count`
 do
diff --git a/openair2/LAYER2/nr_rlc/tests/test.c b/openair2/LAYER2/nr_rlc/tests/test.c
index 742e79ca2c1cf788a38e95b9b2f4457c3e6deeb9..bfde8b9fadd37924e0811b7c4477179359c01c45 100644
--- a/openair2/LAYER2/nr_rlc/tests/test.c
+++ b/openair2/LAYER2/nr_rlc/tests/test.c
@@ -22,13 +22,13 @@
  *       create the UE RLC AM entity with given parameters
  *
  * GNB_UM <rx_maxsize> <tx_maxsize> <t_reassembly> <sn_field_length>
- *     create the eNB RLC UM entity with given parameters
+ *     create the gNB RLC UM entity with given parameters
  *
  * UE_UM <rx_maxsize> <tx_maxsize> <t_reassembly> <sn_field_length>
  *     create the UE RLC UM entity with given parameters
  *
  * GNB_TM <tx_maxsize>
- *     create the eNB RLC TM entity with given parameters
+ *     create the gNB RLC TM entity with given parameters
  *
  * UE_UM <tx_maxsize>
  *     create the UE RLC TM entity with given parameters
@@ -39,7 +39,7 @@
  *     You must end your test definition with a line 'TIME, -1'.
  *
  * GNB_SDU <id> <size>
- *     send an SDU to eNB with id <i> and size <size>
+ *     send an SDU to gNB with id <i> and size <size>
  *     the SDU is [00 01 ... ff 01 ...]
  *     (ie. start byte is 00 then we increment for each byte, loop if needed)
  *
@@ -47,10 +47,10 @@
  *     same as GNB_SDU but the SDU is sent to the UE
  *
  * GNB_PDU <size> <'size' bytes>
- *     send a custom PDU from eNB to UE (eNB does not see this PDU at all)
+ *     send a custom PDU from gNB to UE (gNB does not see this PDU at all)
  *
  * UE_PDU <size> <'size' bytes>
- *     send a custom PDU from UE to eNB (UE does not see this PDU at all)
+ *     send a custom PDU from UE to gNB (UE does not see this PDU at all)
  *
  * GNB_PDU_SIZE <size>
  *     set 'gnb_pdu_size'
@@ -70,7 +70,7 @@
  *     that the test must fail (ie. exit with non zero, crash not allowed)
  *
  * GNB_BUFFER_STATUS
- *     call buffer_status for eNB and print result
+ *     call buffer_status for gNB and print result
  *
  * UE_BUFFER_STATUS
  *     call buffer_status for UE and print result
@@ -82,7 +82,7 @@
  *     discards given SDU
  *
  * RE_ESTABLISH
- *     re-establish both eNB and UE
+ *     re-establish both gNB and UE
  */
 
 enum action {
@@ -368,7 +368,7 @@ int test_main(void)
           pos += 2;
           break;
         case RE_ESTABLISH:
-          printf("TEST: %d: re-establish eNB and UE\n", i);
+          printf("TEST: %d: re-establish gNB and UE\n", i);
           gnb->reestablishment(gnb);
           ue->reestablishment(ue);
           pos++;
diff --git a/openair2/LAYER2/nr_rlc/tests/test16.h b/openair2/LAYER2/nr_rlc/tests/test16.h
new file mode 100644
index 0000000000000000000000000000000000000000..92f9923809b5bf3e5269f15c9370cb45c183e3fb
--- /dev/null
+++ b/openair2/LAYER2/nr_rlc/tests/test16.h
@@ -0,0 +1,19 @@
+/*
+ * am test (SN field size 18):
+ * there was a bug when we receive a full PDU after receiving only the
+ * beginning of it; the data was copied at the end but from the start of the
+ * full PDU instead of the correct offset. This test captures this case.
+ * Gnb sends the start of a PDU then the full PDU. That is the SDU is
+ * [00 .. 09]. First gnb sends [00 .. 08] then it sends [00 .. 09].
+ */
+
+TIME, 1,
+    GNB_AM, 100000, 100000, 45, 35, 0, -1, -1, 8, 18,
+    UE_AM, 100000, 100000, 45, 35, 0, -1, -1, 8, 18,
+    GNB_PDU_SIZE, 12,
+    UE_PDU_SIZE, 20,
+    GNB_PDU, 12, 0x90, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+TIME, 2,
+    GNB_PDU_SIZE, 20,
+    GNB_PDU, 13, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
+TIME, -1
diff --git a/openair2/LAYER2/nr_rlc/tests/test16.txt.gz b/openair2/LAYER2/nr_rlc/tests/test16.txt.gz
new file mode 100644
index 0000000000000000000000000000000000000000..74b19724aab10fcde721e98fa8e7565616eb133e
Binary files /dev/null and b/openair2/LAYER2/nr_rlc/tests/test16.txt.gz differ
diff --git a/openair2/LAYER2/nr_rlc/tests/test17.h b/openair2/LAYER2/nr_rlc/tests/test17.h
new file mode 100644
index 0000000000000000000000000000000000000000..3da9fcc6e5ad3f7f56e875eebeab794e36414430
--- /dev/null
+++ b/openair2/LAYER2/nr_rlc/tests/test17.h
@@ -0,0 +1,18 @@
+/*
+ * um test (SN field size 12):
+ * same problem as for test16, but we test by sending [00 .. 08] then
+ * [02 .. 09] (they overlap, the full SDU is [00 .. 09]), which probably
+ * never occurs in practice but triggers the bug. Doing as for test16 does
+ * not trigger the bug.
+ */
+
+TIME, 1,
+    GNB_UM, 100000, 100000, 35, 12,
+    UE_UM, 100000, 100000, 35, 12,
+    GNB_PDU_SIZE, 8,
+    UE_PDU_SIZE, 20,
+    GNB_PDU, 11, 0x40, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+TIME, 2,
+    GNB_PDU_SIZE, 20,
+    GNB_PDU, 12, 0x80, 0x00, 0x00, 0x02, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
+TIME, -1
diff --git a/openair2/LAYER2/nr_rlc/tests/test17.txt.gz b/openair2/LAYER2/nr_rlc/tests/test17.txt.gz
new file mode 100644
index 0000000000000000000000000000000000000000..b30f671617a67a09b01e8016f96b5de33e669e73
Binary files /dev/null and b/openair2/LAYER2/nr_rlc/tests/test17.txt.gz differ
diff --git a/openair2/LAYER2/openair2_proc.c b/openair2/LAYER2/openair2_proc.c
index bbdc55e0366098cf0e284bea75e758fda3bc5007..3d2c06f4893c5fa457bb068922a02d5765845bdc 100644
--- a/openair2/LAYER2/openair2_proc.c
+++ b/openair2/LAYER2/openair2_proc.c
@@ -503,8 +503,8 @@ int openair2_stats_read(char *buffer, char **my_buffer, off_t off, int length) {
         } else if(Mac_rlc_xface->Is_cluster_head[k] ==1) {
             Mod_id=k;
             len+=sprintf(&buffer[len],
-                         "-------------------------------------------------------------------CH %d: TTI: %d------------------------------------------------------------------\n",
-                         NODE_ID[Mod_id],Mac_rlc_xface->frame);
+                         "------------------------------------------------------------------- TTI: %d------------------------------------------------------------------\n",
+                         Mac_rlc_xface->frame);
 
             for(i=1; i<=NB_CNX_CH; i++) {
                 if (CH_mac_inst[Mod_id].Dcch_lchan[i].Active==1) {
diff --git a/openair2/MCE_APP/mce_app.c b/openair2/MCE_APP/mce_app.c
index 3572de215c446a12b3573cda32f635c345b110df..4ac12ab5b49388092bbf54eed08922e944a12aeb 100644
--- a/openair2/MCE_APP/mce_app.c
+++ b/openair2/MCE_APP/mce_app.c
@@ -54,7 +54,6 @@
 #   define X2AP_ENB_REGISTER_RETRY_DELAY   10
 
 #include "openair1/PHY/INIT/phy_init.h"
-extern unsigned char NB_MCE_INST;
 
 extern RAN_CONTEXT_t RC;
 
diff --git a/openair2/NETWORK_DRIVER/MESH/local.h b/openair2/NETWORK_DRIVER/MESH/local.h
index 58ae78e7a5a3e47d22190cf969a43e6ed829940e..4918e196280f9317dc15bed651f5c60fc31a30c9 100644
--- a/openair2/NETWORK_DRIVER/MESH/local.h
+++ b/openair2/NETWORK_DRIVER/MESH/local.h
@@ -64,10 +64,6 @@
 #include "rrc_nas_primitives.h"
 #include "COMMON/platform_types.h"
 
-#ifndef MAKE_VERSION
-  #define MAKE_VERSION(a,b,c) ((a)*256+(b)*16+(c))
-#endif
-
 struct rb_entity {
   nasRadioBearerId_t rab_id;
   nasSapId_t sapi;
diff --git a/openair2/NETWORK_DRIVER/UE_IP/local.h b/openair2/NETWORK_DRIVER/UE_IP/local.h
index 5532de9573ba7758724af826e1ba9ca30e733cb4..46e44f0040892bb942e6877abd8a9cca492f1a42 100644
--- a/openair2/NETWORK_DRIVER/UE_IP/local.h
+++ b/openair2/NETWORK_DRIVER/UE_IP/local.h
@@ -55,10 +55,6 @@
 #include "platform_types.h"
 #include "sap.h"
 
-#ifndef MAKE_VERSION
-  #define MAKE_VERSION(a,b,c) ((a)*256+(b)*16+(c))
-#endif
-
 typedef struct ue_ip_priv_s {
   int                        irq;
   int                        rx_flags;
diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
index fa76fd00bca0e7446f594bf0a0c6818a4a1f9307..cb5bef5ab0ed7e76648d75f16e7646fefecf7ed1 100644
--- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
@@ -48,59 +48,83 @@ extern int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind);
 extern int oai_nfapi_cqi_indication(nfapi_cqi_indication_t *cqi_ind);
 extern int oai_nfapi_sr_indication(nfapi_sr_indication_t *ind);
 extern int oai_nfapi_rx_ind(nfapi_rx_indication_t *ind);
+extern int oai_nfapi_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind);
+extern int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind);
+extern int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind);
+extern int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind);
+extern int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind);
+extern int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind);
 extern uint8_t nfapi_mode;
 extern uint16_t sf_ahead;
 extern uint16_t sl_ahead;
 
 void handle_nr_rach(NR_UL_IND_t *UL_info) {
-
-  if (UL_info->rach_ind.number_of_pdus>0) {
-    LOG_D(MAC,"UL_info[Frame %d, Slot %d] Calling initiate_ra_proc RACH:SFN/SLOT:%d/%d\n",UL_info->frame,UL_info->slot, UL_info->rach_ind.sfn,UL_info->rach_ind.slot);
-    int npdus = UL_info->rach_ind.number_of_pdus;
-    for(int i = 0; i < npdus; i++) {
-      UL_info->rach_ind.number_of_pdus--;
-      if (UL_info->rach_ind.pdu_list[i].num_preamble>0)
-      AssertFatal(UL_info->rach_ind.pdu_list[i].num_preamble==1,
-                  "More than 1 preamble not supported\n");
-    
-      nr_initiate_ra_proc(UL_info->module_id,
-                          UL_info->CC_id,
-                          UL_info->rach_ind.sfn,
-                          UL_info->rach_ind.slot,
-                          UL_info->rach_ind.pdu_list[i].preamble_list[0].preamble_index,
-                          UL_info->rach_ind.pdu_list[i].freq_index,
-                          UL_info->rach_ind.pdu_list[i].symbol_index,
-                          UL_info->rach_ind.pdu_list[i].preamble_list[0].timing_advance);
+  if(NFAPI_MODE == NFAPI_MODE_PNF) {
+    if (UL_info->rach_ind.number_of_pdus>0) {
+      LOG_D(PHY,"UL_info->UL_info->rach_ind.number_of_pdus:%d SFN/Slot:%d.%d \n", UL_info->rach_ind.number_of_pdus, UL_info->rach_ind.sfn,UL_info->rach_ind.slot);
+      oai_nfapi_nr_rach_indication(&UL_info->rach_ind);
+      UL_info->rach_ind.number_of_pdus = 0;
+    }
+  }
+  else{
+    if (UL_info->rach_ind.number_of_pdus>0) {
+      LOG_D(MAC,"UL_info[Frame %d, Slot %d] Calling initiate_ra_proc RACH:SFN/SLOT:%d/%d\n",UL_info->frame,UL_info->slot, UL_info->rach_ind.sfn,UL_info->rach_ind.slot);
+      int npdus = UL_info->rach_ind.number_of_pdus;
+      for(int i = 0; i < npdus; i++) {
+        UL_info->rach_ind.number_of_pdus--;
+        if (UL_info->rach_ind.pdu_list[i].num_preamble>0)
+        AssertFatal(UL_info->rach_ind.pdu_list[i].num_preamble==1,
+                    "More than 1 preamble not supported\n");
+      
+        nr_initiate_ra_proc(UL_info->module_id,
+                            UL_info->CC_id,
+                            UL_info->rach_ind.sfn,
+                            UL_info->rach_ind.slot,
+                            UL_info->rach_ind.pdu_list[i].preamble_list[0].preamble_index,
+                            UL_info->rach_ind.pdu_list[i].freq_index,
+                            UL_info->rach_ind.pdu_list[i].symbol_index,
+                            UL_info->rach_ind.pdu_list[i].preamble_list[0].timing_advance);
+      }
     }
   }
 }
 
 
 void handle_nr_uci(NR_UL_IND_t *UL_info)
-{
-  const module_id_t mod_id = UL_info->module_id;
-  const frame_t frame = UL_info->frame;
-  const sub_frame_t slot = UL_info->slot;
-  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:
-        LOG_E(MAC, "%s(): unhandled NFAPI_NR_UCI_PUSCH_PDU_TYPE\n", __func__);
-        break;
+{ 
+  if(NFAPI_MODE == NFAPI_MODE_PNF) {
+    if (UL_info->uci_ind.num_ucis>0) {
+      LOG_D(PHY,"PNF Sending UL_info->num_ucis:%d PDU_type: %d, SFN/SF:%d.%d \n", UL_info->uci_ind.num_ucis, UL_info->uci_ind.uci_list[0].pdu_type ,UL_info->frame, UL_info->slot);
+      oai_nfapi_nr_uci_indication(&UL_info->uci_ind);
+      UL_info->uci_ind.num_ucis = 0;
+    }
+  }
+  else{
+    const module_id_t mod_id = UL_info->module_id;
+    const frame_t frame = UL_info->frame;
+    const sub_frame_t slot = UL_info->slot;
+    int num_ucis = UL_info->uci_ind.num_ucis;
+    nfapi_nr_uci_t *uci_list = UL_info->uci_ind.uci_list;
+    LOG_D(MAC,"handling UCI SFN/slot: %d.%d, num_ucis: %d \n", frame,slot, num_ucis);
+    for (int i = 0; i < num_ucis; i++) {
+      switch (uci_list[i].pdu_type) {
+        case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
+          LOG_E(MAC, "%s(): unhandled NFAPI_NR_UCI_PUSCH_PDU_TYPE\n", __func__);
+          break;
 
-      case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: {
-        const nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_pdu = &uci_list[i].pucch_pdu_format_0_1;
-        handle_nr_uci_pucch_0_1(mod_id, frame, slot, uci_pdu);
-        break;
-      }
+        case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: {
+          const nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_pdu = &uci_list[i].pucch_pdu_format_0_1;
+          handle_nr_uci_pucch_0_1(mod_id, frame, slot, uci_pdu);
+          break;
+        }
 
-      case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
-        const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &uci_list[i].pucch_pdu_format_2_3_4;
-        handle_nr_uci_pucch_2_3_4(mod_id, frame, slot, uci_pdu);
-        break;
+        case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
+          const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &uci_list[i].pucch_pdu_format_2_3_4;
+          handle_nr_uci_pucch_2_3_4(mod_id, frame, slot, uci_pdu);
+          break;
+        }
       }
+      LOG_D(MAC, "UCI handled \n");
     }
   }
 
@@ -109,60 +133,75 @@ void handle_nr_uci(NR_UL_IND_t *UL_info)
 
 void handle_nr_ulsch(NR_UL_IND_t *UL_info)
 {
-  if (UL_info->rx_ind.number_of_pdus > 0 && UL_info->crc_ind.number_crcs > 0) {
-    for (int i = 0; i < UL_info->rx_ind.number_of_pdus; i++) {
-      for (int j = 0; j < UL_info->crc_ind.number_crcs; j++) {
-        // find crc_indication j corresponding rx_indication i
-        const nfapi_nr_rx_data_pdu_t *rx = &UL_info->rx_ind.pdu_list[i];
-        const nfapi_nr_crc_t *crc = &UL_info->crc_ind.crc_list[j];
-        LOG_D(PHY,
-              "UL_info->crc_ind.pdu_list[%d].rnti:%04x "
-              "UL_info->rx_ind.pdu_list[%d].rnti:%04x\n",
-              j,
-              crc->rnti,
-              i,
-              rx->rnti);
+  if(NFAPI_MODE == NFAPI_MODE_PNF) {
+    if (UL_info->crc_ind.number_crcs>0) {
+      LOG_D(PHY,"UL_info->UL_info->crc_ind.number_crcs:%d CRC_IND:SFN/Slot:%d.%d\n", UL_info->crc_ind.number_crcs, UL_info->crc_ind.sfn, UL_info->crc_ind.slot);
+      oai_nfapi_nr_crc_indication(&UL_info->crc_ind);
+      UL_info->crc_ind.number_crcs = 0;
+    }
 
-        if (crc->rnti != rx->rnti)
-          continue;
+    if (UL_info->rx_ind.number_of_pdus>0) {
+      LOG_D(PHY,"UL_info->rx_ind.number_of_pdus:%d RX_IND:SFN/Slot:%d.%d \n", UL_info->rx_ind.number_of_pdus, UL_info->rx_ind.sfn, UL_info->rx_ind.slot);
+      oai_nfapi_nr_rx_data_indication(&UL_info->rx_ind);
+      UL_info->rx_ind.number_of_pdus = 0;
+    }
+  }
+  else{
+    if (UL_info->rx_ind.number_of_pdus > 0 && UL_info->crc_ind.number_crcs > 0) {
+      for (int i = 0; i < UL_info->rx_ind.number_of_pdus; i++) {
+        for (int j = 0; j < UL_info->crc_ind.number_crcs; j++) {
+          // find crc_indication j corresponding rx_indication i
+          const nfapi_nr_rx_data_pdu_t *rx = &UL_info->rx_ind.pdu_list[i];
+          const nfapi_nr_crc_t *crc = &UL_info->crc_ind.crc_list[j];
+          LOG_D(PHY,
+                "UL_info->crc_ind.pdu_list[%d].rnti:%04x "
+                "UL_info->rx_ind.pdu_list[%d].rnti:%04x\n",
+                j,
+                crc->rnti,
+                i,
+                rx->rnti);
+
+          if (crc->rnti != rx->rnti)
+            continue;
 
-        LOG_D(MAC,
-              "%4d.%2d Calling rx_sdu (CRC %s/tb_crc_status %d)\n",
-              UL_info->frame,
-              UL_info->slot,
-              crc->tb_crc_status ? "error" : "ok",
-              crc->tb_crc_status);
+          LOG_D(MAC,
+                "%4d.%2d Calling rx_sdu (CRC %s/tb_crc_status %d)\n",
+                UL_info->frame,
+                UL_info->slot,
+                crc->tb_crc_status ? "error" : "ok",
+                crc->tb_crc_status);
 
-        /* if CRC passes, pass PDU, otherwise pass NULL as error indication */
-        nr_rx_sdu(UL_info->module_id,
-                  UL_info->CC_id,
-                  UL_info->rx_ind.sfn,
-                  UL_info->rx_ind.slot,
-                  rx->rnti,
-                  crc->tb_crc_status ? NULL : rx->pdu,
-                  rx->pdu_length,
-                  rx->timing_advance,
-                  rx->ul_cqi,
-                  rx->rssi);
-        handle_nr_ul_harq(UL_info->module_id, UL_info->frame, UL_info->slot, crc);
-        break;
-      } //    for (j=0;j<UL_info->crc_ind.number_crcs;j++)
-    } //   for (i=0;i<UL_info->rx_ind.number_of_pdus;i++)
+          /* if CRC passes, pass PDU, otherwise pass NULL as error indication */
+          nr_rx_sdu(UL_info->module_id,
+                    UL_info->CC_id,
+                    UL_info->rx_ind.sfn,
+                    UL_info->rx_ind.slot,
+                    rx->rnti,
+                    crc->tb_crc_status ? NULL : rx->pdu,
+                    rx->pdu_length,
+                    rx->timing_advance,
+                    rx->ul_cqi,
+                    rx->rssi);
+          handle_nr_ul_harq(UL_info->CC_id, UL_info->module_id, UL_info->frame, UL_info->slot, crc);
+          break;
+        } //    for (j=0;j<UL_info->crc_ind.number_crcs;j++)
+      } //   for (i=0;i<UL_info->rx_ind.number_of_pdus;i++)
 
-    UL_info->crc_ind.number_crcs = 0;
-    UL_info->rx_ind.number_of_pdus = 0;
-  } else if (UL_info->rx_ind.number_of_pdus != 0
-             || UL_info->crc_ind.number_crcs != 0) {
-    LOG_E(PHY,
-          "hoping not to have mis-match between CRC ind and RX ind - "
-          "hopefully the missing message is coming shortly "
-          "rx_ind:%d(SFN/SL:%d/%d) crc_ind:%d(SFN/SL:%d/%d) \n",
-          UL_info->rx_ind.number_of_pdus,
-          UL_info->rx_ind.sfn,
-          UL_info->rx_ind.slot,
-          UL_info->crc_ind.number_crcs,
-          UL_info->rx_ind.sfn,
-          UL_info->rx_ind.slot);
+      UL_info->crc_ind.number_crcs = 0;
+      UL_info->rx_ind.number_of_pdus = 0;
+    } else if (UL_info->rx_ind.number_of_pdus != 0
+              || UL_info->crc_ind.number_crcs != 0) {
+      LOG_E(PHY,
+            "hoping not to have mis-match between CRC ind and RX ind - "
+            "hopefully the missing message is coming shortly "
+            "rx_ind:%d(SFN/SL:%d/%d) crc_ind:%d(SFN/SL:%d/%d) \n",
+            UL_info->rx_ind.number_of_pdus,
+            UL_info->rx_ind.sfn,
+            UL_info->rx_ind.slot,
+            UL_info->crc_ind.number_crcs,
+            UL_info->rx_ind.sfn,
+            UL_info->rx_ind.slot);
+    }
   }
 }
 
@@ -181,7 +220,15 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) {
         module_id,CC_id, UL_info->rach_ind.number_of_pdus,
         UL_info->rx_ind.number_of_pdus, UL_info->crc_ind.number_crcs);
 
+  handle_nr_rach(UL_info);
+  
+  handle_nr_uci(UL_info);
+  // clear UL DCI prior to handling ULSCH
+  mac->UL_dci_req[CC_id].numPdus = 0;
+  handle_nr_ulsch(UL_info);
+
   if (NFAPI_MODE != NFAPI_MODE_PNF) {
+
     if (ifi->CC_mask==0) {
       ifi->current_frame    = UL_info->frame;
       ifi->current_slot = UL_info->slot;
@@ -191,16 +238,7 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) {
     }
 
     ifi->CC_mask |= (1<<CC_id);
-  }
 
-  handle_nr_rach(UL_info);
-  
-  handle_nr_uci(UL_info);
-  // clear HI prior to handling ULSCH
-  mac->UL_dci_req[CC_id].numPdus = 0;
-  handle_nr_ulsch(UL_info);
-
-  if (NFAPI_MODE != NFAPI_MODE_PNF) {
     if (ifi->CC_mask == ((1<<MAX_NUM_CCs)-1)) {
       /*
       eNB_dlsch_ulsch_scheduler(module_id,
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
index 4576dbcc9bbc816ee46e72c86442f40cc979679a..b5c2f666a295eb68ce83c06a6b9d2b07e1d45b93 100644
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
@@ -66,8 +66,8 @@ int handle_bcch_bch(module_id_t module_id, int cc_id,
 }
 
 //  L2 Abstraction Layer
-int handle_bcch_dlsch(module_id_t module_id, int cc_id, unsigned int gNB_index, uint32_t sibs_mask, uint8_t *pduP, uint32_t pdu_len){
-  return nr_ue_decode_BCCH_DL_SCH(module_id, cc_id, gNB_index, sibs_mask, pduP, pdu_len);
+int handle_bcch_dlsch(module_id_t module_id, int cc_id, unsigned int gNB_index, uint8_t ack_nack, uint8_t *pduP, uint32_t pdu_len){
+  return nr_ue_decode_BCCH_DL_SCH(module_id, cc_id, gNB_index, ack_nack, pduP, pdu_len);
 }
 
 //  L2 Abstraction Layer
@@ -79,12 +79,13 @@ int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t
 
 // L2 Abstraction Layer
 // Note: sdu should always be processed because data and timing advance updates are transmitted by the UE
-int8_t handle_dlsch (nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){
+int8_t handle_dlsch(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *ul_time_alignment, int pdu_id){
 
-  nr_ue_send_sdu(dl_info, ul_time_alignment, pdu_id);
+  update_harq_status(dl_info, pdu_id);
+  if(dl_info->rx_ind->rx_indication_body[pdu_id].pdsch_pdu.ack_nack)
+    nr_ue_send_sdu(dl_info, ul_time_alignment, pdu_id);
 
   return 0;
-
 }
 
 int nr_ue_ul_indication(nr_uplink_indication_t *ul_info){
@@ -93,13 +94,21 @@ int nr_ue_ul_indication(nr_uplink_indication_t *ul_info){
   module_id_t module_id = ul_info->module_id;
   NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
 
-  ret = nr_ue_scheduler(NULL, ul_info);
+  if (ul_info->ue_sched_mode == ONLY_PUSCH) {
+    ret = nr_ue_scheduler(NULL, ul_info);
+    return 0;
+  }
+  else if (ul_info->ue_sched_mode == SCHED_ALL)
+    ret = nr_ue_scheduler(NULL, ul_info);
 
   NR_TDD_UL_DL_ConfigCommon_t *tdd_UL_DL_ConfigurationCommon = mac->scc != NULL ? mac->scc->tdd_UL_DL_ConfigurationCommon : mac->scc_SIB->tdd_UL_DL_ConfigurationCommon;
 
   if (is_nr_UL_slot(tdd_UL_DL_ConfigurationCommon, ul_info->slot_tx, mac->frame_type) && !get_softmodem_params()->phy_test)
     nr_ue_prach_scheduler(module_id, ul_info->frame_tx, ul_info->slot_tx, ul_info->thread_id);
 
+  if (is_nr_UL_slot(tdd_UL_DL_ConfigurationCommon, ul_info->slot_tx, mac->frame_type))
+    nr_ue_pucch_scheduler(module_id, ul_info->frame_tx, ul_info->slot_tx, ul_info->thread_id);
+
   switch(ret){
   case UE_CONNECTION_OK:
     break;
@@ -161,43 +170,32 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
           dl_info->rx_ind->number_pdus);
 
         switch(dl_info->rx_ind->rx_indication_body[i].pdu_type){
-
-        case FAPI_NR_RX_PDU_TYPE_SSB:
-
-          ret_mask |= (handle_bcch_bch(dl_info->module_id, dl_info->cc_id, dl_info->gNB_index,
-                                       (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.pdu,
-                                       (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.additional_bits,
-                                       (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.ssb_index,
-                                       (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.ssb_length,
-                                       (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.ssb_start_subcarrier,
-                                       (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.cell_id)) << FAPI_NR_RX_PDU_TYPE_SSB;
-
-          break;
-
-        case FAPI_NR_RX_PDU_TYPE_SIB:
-
-          ret_mask |= (handle_bcch_dlsch(dl_info->module_id,
-                       dl_info->cc_id, dl_info->gNB_index,
-                      (dl_info->rx_ind->rx_indication_body+i)->sib_pdu.sibs_mask,
-                      (dl_info->rx_ind->rx_indication_body+i)->sib_pdu.pdu,
-                      (dl_info->rx_ind->rx_indication_body+i)->sib_pdu.pdu_length)) << FAPI_NR_RX_PDU_TYPE_SIB;
-
-          break;
-
-        case FAPI_NR_RX_PDU_TYPE_DLSCH:
-
-          ret_mask |= (handle_dlsch(dl_info, ul_time_alignment, i)) << FAPI_NR_RX_PDU_TYPE_DLSCH;
-
-          break;
-
-        case FAPI_NR_RX_PDU_TYPE_RAR:
-
-          ret_mask |= (handle_dlsch(dl_info, ul_time_alignment, i)) << FAPI_NR_RX_PDU_TYPE_RAR;
-
-          break;
-
-        default:
-          break;
+          case FAPI_NR_RX_PDU_TYPE_SSB:
+            mac->ssb_rsrp_dBm = (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.rsrp_dBm;
+            ret_mask |= (handle_bcch_bch(dl_info->module_id, dl_info->cc_id, dl_info->gNB_index,
+                                         (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.pdu,
+                                         (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.additional_bits,
+                                         (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.ssb_index,
+                                         (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.ssb_length,
+                                         (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.ssb_start_subcarrier,
+                                         (dl_info->rx_ind->rx_indication_body+i)->ssb_pdu.cell_id)) << FAPI_NR_RX_PDU_TYPE_SSB;
+
+            break;
+          case FAPI_NR_RX_PDU_TYPE_SIB:
+            ret_mask |= (handle_bcch_dlsch(dl_info->module_id,
+                                           dl_info->cc_id, dl_info->gNB_index,
+                                           (dl_info->rx_ind->rx_indication_body+i)->pdsch_pdu.ack_nack,
+                                           (dl_info->rx_ind->rx_indication_body+i)->pdsch_pdu.pdu,
+                                           (dl_info->rx_ind->rx_indication_body+i)->pdsch_pdu.pdu_length)) << FAPI_NR_RX_PDU_TYPE_SIB;
+            break;
+          case FAPI_NR_RX_PDU_TYPE_DLSCH:
+            ret_mask |= (handle_dlsch(dl_info, ul_time_alignment, i)) << FAPI_NR_RX_PDU_TYPE_DLSCH;
+            break;
+          case FAPI_NR_RX_PDU_TYPE_RAR:
+            ret_mask |= (handle_dlsch(dl_info, ul_time_alignment, i)) << FAPI_NR_RX_PDU_TYPE_RAR;
+            break;
+          default:
+            break;
         }
       }
     }
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
index 449c7bf890b8d55cee422033f69141326bb5e8ef..1ba8238f1ec7d04c262bb1cc2df78e4889ebc246 100755
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
@@ -39,6 +39,12 @@
 
 typedef struct NR_UL_TIME_ALIGNMENT NR_UL_TIME_ALIGNMENT_t;
 
+typedef enum {
+  ONLY_PUSCH,
+  NOT_PUSCH,
+  SCHED_ALL,
+} NR_UE_SCHED_MODE_t;
+
 typedef struct {
     /// module id
   module_id_t module_id;
@@ -100,6 +106,9 @@ typedef struct {
 
     /// dci reception indication structure
     fapi_nr_dci_indication_t *dci_ind;
+
+    NR_UE_SCHED_MODE_t ue_sched_mode;
+
 } nr_uplink_indication_t;
 
 // Downlink subframe P7
@@ -235,7 +244,7 @@ int handle_bcch_bch(module_id_t module_id,
 /**\brief handle BCCH-DL-SCH message from dl_indication
    \param pdu_len   length(bytes) of pdu
    \param pduP      pointer to pdu*/
-int handle_bcch_dlsch(module_id_t module_id, int cc_id, unsigned int gNB_index, uint32_t sibs_mask, uint8_t *pduP, uint32_t pdu_len);
+int handle_bcch_dlsch(module_id_t module_id, int cc_id, unsigned int gNB_index, uint8_t ack_nack, uint8_t *pduP, uint32_t pdu_len);
 
 int handle_dci(module_id_t module_id, int cc_id, unsigned int gNB_index, frame_t frame, int slot, fapi_nr_dci_indication_pdu_t *dci);
 
diff --git a/openair2/PHY_INTERFACE/mac_phy_primitives.c b/openair2/PHY_INTERFACE/mac_phy_primitives.c
deleted file mode 100644
index 06e06d096dc53caf0066bbdd26f6546dd5f7f9ee..0000000000000000000000000000000000000000
--- a/openair2/PHY_INTERFACE/mac_phy_primitives.c
+++ /dev/null
@@ -1,283 +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
- */
-
-/*________________________mac_phy_primitives.c________________________
-
- Authors : Hicham Anouar, Raymond Knopp
- Company : EURECOM
- Emails  : anouar@eurecom.fr,  knopp@eurecom.fr
-________________________________________________________________*/
-
-
-//#include "openair_extern.h"
-
-#ifdef MAC_CONTEXT
-#include "LAYER2/MAC/defs.h"
-#include "LAYER2/MAC/extern.h"
-//#include "extern.h"
-#include "defs.h"
-#endif //MAC_CONTEXT
-
-
-//#define DEBUG_UE_DECODE_SACH
-//#define DEBUG_NODEB_DECODE_SACH
-
-#ifdef PHY_CONTEXT
-#ifdef PHY_EMUL
-#include "extern.h"
-#include "SIMULATION/simulation_defs.h"
-#else //PHY_EMUL
-#include "MAC_INTERFACE/extern.h"
-#endif //PHY_EMUL
-
-void clear_macphy_data_req(unsigned char Mod_id)
-{
-  //msg("CLEAR DATA_REQ\n");
-  unsigned char i;
-
-  Macphy_req_table[Mod_id].Macphy_req_cnt = 0;
-
-  for (i=0; i<NB_REQ_MAX; i++)
-    Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Active = 0;
-}
-
-/*
-unsigned char phy_resources_compare(PHY_RESOURCES *Phy1,PHY_RESOURCES* Phy2 ){
-
-  if(Phy1->Time_alloc==Phy2->Time_alloc && Phy1->Freq_alloc==Phy2->Freq_alloc)// && Phy1->Coding_fmt==Phy2->Coding_fmt && Phy1->Seq_index==Phy2->Seq_index)
-    return 1;
-  else
-    return 0;
-
-}
-*/
-
-MACPHY_DATA_REQ_TABLE_ENTRY* find_data_req_entry(unsigned char Mod_id,MACPHY_REQ_ENTRY_KEY *Search_key)
-{
-
-  unsigned char i;
-
-  //msg("[MAC_PHY]MAC_PHY_REQUEST_CNT=%d\n",Macphy_req_table.Macphy_req_cnt);
-  if (Macphy_req_table[Mod_id].Macphy_req_cnt > 0) {
-#ifdef DEBUG_PHY
-    //    msg("[MACPHY_FIND_REQ] SEARCH KEY=%d\n",Search_key->Key_type);
-#endif //DEBUG_PHY
-    //msg("[MACPHY_FIND_REQ] SEARCH KEY=%d, NB_REQ_MAX=%d\n",Search_key->Key_type,NB_REQ_MAX);
-
-    switch(Search_key->Key_type) {
-    case PDU_TYPE_KEY:
-      for(i=0; i<NB_REQ_MAX; i++) {
-        if ( (Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Macphy_data_req.Pdu_type==Search_key->Key.Pdu_type) &&
-             (Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Active == 1) ) {
-          //msg("[MACPHY_FIND] MACPHY_req_table_entry=%p,idx=%d,Phy_resources %p",       &Macphy_req_table.Macphy_req_table_entry[i],i,Macphy_req_table.Macphy_req_table_entry[i].Macphy_data_req.Phy_Resources_Entry);
-          return(&Macphy_req_table[Mod_id].Macphy_req_table_entry[i]);
-        }
-      }
-
-      break;
-      /*
-      case LCHAN_KEY:
-      for(i=0;i<NB_REQ_MAX;i++){
-      if ((Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Macphy_data_req.Lchan_id.Index==Search_key->Key.Lchan_id->Index) &&
-      (Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Active == 1) )
-      return(&Macphy_req_table[Mod_id].Macphy_req_table_entry[i]);
-      }
-      break;
-
-      case PHY_RESOURCES_KEY:
-      for(i=0;i<NB_REQ_MAX;i++){
-      if(Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Active == 1)
-      if ( ( Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Macphy_data_req.Phy_resources->Time_alloc ==
-        Search_key->Key.Phy_resources.Time_alloc )
-         &&( Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Macphy_data_req.Phy_resources->Freq_alloc ==
-       Search_key->Key.Phy_resources.Freq_alloc )
-         &&( Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Macphy_data_req.CH_index ==
-      Search_key->CH_index )
-         && ( Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Macphy_data_req.Direction == RX))
-      return(&Macphy_req_table[Mod_id].Macphy_req_table_entry[i]);
-      }
-      break;
-      */
-    }
-  }
-
-#ifndef PHY_EMUL
-  //  msg("[PHY][PHY_MAC] Frame %d : No data request\n",mac_xface->frame);
-#endif //PHY_EMUL
-
-
-  return (MACPHY_DATA_REQ_TABLE_ENTRY*)0;
-
-}
-
-
-
-
-
-
-void print_active_requests(unsigned char Mod_id)
-{
-
-  int i;
-  msg("_________________________INST %d , FRAME %d ACTIVE_REQUESTS_________________\n",Mod_id,mac_xface->frame);
-
-  for (i=0; i<NB_REQ_MAX; i++) {
-
-    if (Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Active == 1) {
-      msg("[MACPHY][DATA][REQ] Request %d: Direction %d, Pdu_type %d\n",
-          i,
-          Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Macphy_data_req.Direction,
-          Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Macphy_data_req.Pdu_type);
-      //    Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Macphy_data_req.Lchan_id.Index);
-      //    Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Macphy_data_req.Phy_resources,
-      //    Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Macphy_data_req.Phy_resources->Time_alloc,
-      //    Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Macphy_data_req.Phy_resources->Freq_alloc);
-      //if(Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Macphy_data_req.Pdu_type==RACH)
-      //msg("[RACH_REQ] Rach_pdu %p, Payload %p\n",Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Macphy_data_req.Dir.Req_rx.Pdu.Rach_pdu,
-      //    Macphy_req_table[Mod_id].Macphy_req_table_entry[i].Macphy_data_req.Dir.Req_rx.Pdu.Rach_pdu->Rach_payload);
-
-    }
-  }
-}
-
-
-/*___________________________________________________________________________________________________*/
-#define RCNT Macphy_req_table[Mod_id].Macphy_req_cnt
-
-MACPHY_DATA_REQ *new_macphy_data_req(unsigned char Mod_id)
-{
-  /*___________________________________________________________________________________________________*/
-  unsigned char i;
-
-
-
-  for (i=0; i<NB_REQ_MAX; i++) {
-    if (Macphy_req_table[Mod_id].Macphy_req_table_entry[(i)%NB_REQ_MAX].Active == 0) {
-      Macphy_req_table[Mod_id].Macphy_req_table_entry[(i)%NB_REQ_MAX].Active = 1;
-      RCNT = (RCNT + 1)%NB_REQ_MAX;
-      //            msg("[MAC_PHY]NEW MAC_REQUEST_CNT=%d,frame %d, Module %d, entry %d \n",Macphy_req_table[Mod_id].Macphy_req_cnt,mac_xface->frame,Mod_id,i);
-      //        Macphy_req_table[Mod_id].Macphy_req_table_entry[i%NB_REQ_MAX].Macphy_data_req.Phy_resources=(PHY_RESOURCES*)malloc16(sizeof(PHY_RESOURCES));
-      return(&Macphy_req_table[Mod_id].Macphy_req_table_entry[i%NB_REQ_MAX].Macphy_data_req);
-    }
-  }
-
-  msg("[OPENAIR][MAC][ERROR] frame %d: No more DATA_REQ !!!!\n",mac_xface->frame);
-
-  print_active_requests(Mod_id);
-  mac_xface->macphy_exit("new_macphy_data_req: no more DATA_REQ");
-  //rt_sleep(nano2count(2000));
-
-  return((MACPHY_DATA_REQ*)0);
-}
-
-
-#endif //PHY_CONTEXT
-
-#ifdef MAC_CONTEXT
-#include "LAYER2/MAC/extern.h"
-
-// Function called by PHY to indicate available data/measurements for MAC
-
-/*___________________________________________________________________________________________________*/
-void macphy_data_ind(unsigned char Mod_id,unsigned char Pdu_type,void *pdu,unsigned short rnti)
-{
-  /*___________________________________________________________________________________________________*/
-  //msg("[OPENAIR][MACPHY] Calling mac_resp In\n");
-
-  int i;
-
-  //  if (Req_rx->crc_status[0]!= -1) {  //CRC_STATUS
-
-  // msg("[OPENAIR][MACPHY] Calling mac_indicate In\n");
-  //     Req_rx->Meas.UL_meas=&UL_meas[Mod_id];
-  //   Req_rx->Meas.DL_meas=&DL_meas[Mod_id];
-
-  switch (Pdu_type) {
-  case ULSCH:
-
-    //        msg("[OPENAIR][MACPHY] Received RACH, Sending to MAC\n");
-    nodeb_decode_ulsch(Mod_id,(ULSCH_PDU *)pdu,rnti);
-
-    break;
-
-  case DLSCH:
-#ifdef DEBUG_UE_DECODE_SACH
-    msg("[MAC][UE][MAC_PHY] TTI %d Inst %d\n",mac_xface->frame,Mod_id);
-#endif
-
-    //      ue_decode_dlsch(Mod_id-NB_CH_INST,
-    //          (DLSCH_PDU *)pdu,rnti);
-
-    break;
-
-  default:
-    break;
-  }
-
-  //    msg("Freeing Req %p\n",Macphy_data_req_table_entry);
-  //  }
-
-}
-
-
-
-
-
-/*PHY_RESOURCES_TABLE_ENTRY *new_phy_resources() {
-
-
-  unsigned char i;
-
-  //msg("[OPENAIR][PHY][MAC Interface] New Phy Resource, cnt %d\n",Phy_resources_table.Phy_resources_cnt);
-
-  for (i=0;i<NB_PHY_RESOURCES_MAX;i++){
-
-    if (Phy_resources_table.Phy_resources_table_entry[(i+Phy_resources_table.Phy_resources_cnt+1)%NB_PHY_RESOURCES_MAX].Active == 0) {
-      Phy_resources_table.Phy_resources_table_entry[(i+Phy_resources_table.Phy_resources_cnt+1)%NB_PHY_RESOURCES_MAX].Active = 1;
-      Phy_resources_table.Phy_resources_cnt = (Phy_resources_table.Phy_resources_cnt + 1)%NB_PHY_RESOURCES_MAX;
-      //  msg("[OPENAIR][PHY][MAC Interface] NEW PHY_RESOURCES: Taking index %d\n\n",(i+Phy_resources_table.Phy_resources_cnt+1)%NB_PHY_RESOURCES_MAX);
-
-      return(&Phy_resources_table.Phy_resources_table_entry[(i+Phy_resources_table.Phy_resources_cnt)%NB_PHY_RESOURCES_MAX]);
-    }
-  }
-  msg("[OPENAIR][MAC][ERROR] No more PHY_RESOURCES !!!!\n");
-  exit(-1);
-}
-*/
-
-#endif //MAC_CONTEXT
-
-
-// Measurements, etc ..
-
-//short phy_resource_cnt = 0, macphy_data_req_cnt = 0, macphy_data_ind_cnt = 0;
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/openair2/PHY_INTERFACE/mac_phy_primitives.h b/openair2/PHY_INTERFACE/mac_phy_primitives.h
deleted file mode 100644
index 889cb503dca1d91088401f20c8ee963433512e35..0000000000000000000000000000000000000000
--- a/openair2/PHY_INTERFACE/mac_phy_primitives.h
+++ /dev/null
@@ -1,232 +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
- */
-
-/*________________________mac_phy_primitives.h________________________
-
- Authors : Hicham Anouar, Raymond Knopp
- Company : EURECOM
- Emails  : anouar@eurecom.fr,  knopp@eurecom.fr
-________________________________________________________________*/
-
-
-#ifndef __MAC_PHY_PRIMITIVES_H__
-#    define __MAC_PHY_PRIMITIVES_H__
-
-#include "../LAYER2/MAC/defs.h"
-
-
-/**@defgroup _mac_phy_primitives_ MAC Layer Primitives for Communications with PHY
- *@ingroup w3g4f_mac_layer_
- *@{
-
-This subclause describes the primitives for communications between the MAC and PHY sub-layers.
-
-The primitives for dynamic MAC-PHY PDU exchange (Transport channel interface) are:
-
-- MACPHY_DATA_REQ: transfers or requests a PDU from PHY.  The data is passed along with the dynamic PHY transmission
-format (coding and modulation, time/freq/space resource allocation)
-
-- MACPHY_DATA_IND: Function call (by PHY) to deliver a new PDU and corresponding measurements to MAC.  This implicitly confirms the MACPHY_DATA_REQ by
-filling the fields of the request (TX or RX) with the data and measurements.
-
-One primitive is used for semi-static configuration (during logical channel establishment)
-relaying the puncturing/repetition patterns for HARQ:
-
-- MACPHY_CONFIG_SACH_HARQ_REQ (still to be defined...)
-
-The primitive for static (re)configuration is:
-- MACPHY_CONFIG_REQ : This primitive transports the initial configuration during the setup phase of equipment, both for CH and UE.
-Static configuration is used during the initialization phase of the equipment.  For a CH, it is done prior to any communication.  For a UE, some
-structures may be set after receiving configuration information from the network via the BCCH/CCCH.
-*/
-
-
-
-
-/*! \brief MACPHY-DATA-REQ_RX structure is used to request transfer a new PDU from PHY corresponding to a particular transport channel*/
-typedef struct {
-  int crc_status[MAX_NUMBER_TB_PER_LCHAN];                   /*!< This field indicates the CRC status of the PDU upon reception from PHY*/
-  unsigned char num_tb;                /*!< This field indicates the number of transport blocks to be received*/
-  unsigned short tb_size_bytes;        /*!< This field indicates the number of bytes per transpor block*/
-  unsigned int Active_process_map;   /*!< HARQ indicator for active processes*/
-  union {
-    CHBCH_PDU   *Chbch_pdu;        /*!< This is a pointer to CHBCH data*/
-    DL_SACH_PDU *DL_sach_pdu;      /*!< This is a pointer to DL_SACH data*/
-    UL_SACH_PDU *UL_sach_pdu;      /*!< This is a pointer to UL_SACH data*/
-    RACH_PDU    *Rach_pdu;         /*!< This is a pointer to RACH data*/
-    MRBCH_PDU   *Mrbch_pdu;        /*!< This is a pointer to MRBCH data*/
-  } Pdu;
-  union {
-    DL_MEAS *DL_meas;   /*!< This is an array of pointers to the current measurements of DL quality at UE (indexed by CH_id) */
-    UL_MEAS *UL_meas;   /*!< This is an array of pointers to the current measurements of UL quality at Node-B (indexed by user_id) */
-  } Meas;
-} MACPHY_DATA_REQ_RX;
-
-
-/*! \brief MACPHY-DATA-REQ_TX structure is used to transfer a new PDU to PHY corresponding to a particular transport channel*/
-typedef struct {
-  unsigned char num_tb;             /*!< This field indicates the number of transport blocks to be received*/
-  unsigned short tb_size_bytes;     /*!< This field indicates the number of bytes per transpor block*/
-  unsigned int Active_process_map;   /*!< HARQ indicator for active processes*/
-  unsigned int New_process_map;      /*!< HARQ indicator for new processes*/
-  //  unsigned char round_indices_tx;
-  union {
-    CHBCH_PDU   *Chbch_pdu;      /*!< pointer to CHBCH data */
-    DL_SACH_PDU DL_sach_pdu;    /*!< pointer to DL_SACH data*/
-    UL_SACH_PDU UL_sach_pdu;    /*!< pointer to UL_SACH data*/
-    RACH_PDU Rach_pdu;  //H.A   /*!< pointer to RACH data */
-    MRBCH_PDU   *Mrbch_pdu;     /*!< pointer to MRBCH data */
-  } Pdu;
-} MACPHY_DATA_REQ_TX;
-
-/*! \brief MACPHY-DATA-REQ primitive is used to transfer a new PDU to PHY corresponding to a particular transport channel*/
-typedef struct {
-  unsigned char Direction;
-  unsigned char Pdu_type;                 /*!< This field indicates the type of PDU requested */
-  LCHAN_ID      Lchan_id;                 /*!< This field indicates the flow id of the PDU */
-  PHY_RESOURCES *Phy_resources;           /*!< This field indicates to PHY the physical resources */
-  unsigned int format_flag;               /*!< This field indicates to PHY something about a SACH, e.g. presense of SACCH*/
-  union {
-    MACPHY_DATA_REQ_RX Req_rx;            /*!< This field contains the request corresponding to an RX resource*/
-    MACPHY_DATA_REQ_TX Req_tx;            /*!< This field contains the request corresponding to a TX resource*/
-  } Dir;
-} MACPHY_DATA_REQ;
-
-/*!\fn void macphy_data_ind(unsigned char Mod_id,MACPHY_DATA_REQ_RX *Req_rx,unsigned char Pdu_type,unsigned short Index);
-\brief MACPHY_DATA_IND function call.  Called by PHY to upload PDU and measurements in response to a MACPHY_DATA_REQ_RX.
-@param Mod_id MAC instance ID (only useful if multiple MAC instances run in the same machine)
-@param Req_rx Pointer to MACPHY_DTA_REQ_RX received previously
-@param Pdu_type Type of PDU (redundant!)
-@param Index CH Index for CH, UEid for UE
-*/
-void macphy_data_ind(unsigned char Mod_id,
-                     MACPHY_DATA_REQ_RX *Req_rx,
-                     unsigned char Pdu_type,
-                     unsigned short Index);
-
-/*! \brief MACPHY-CONFIG-REQ primitive is used to configure a new instance of OpenAirInterface (static configuration) during initialization*/
-typedef struct {
-  PHY_FRAMING Phy_framing;   /*!< Framing Configuration*/
-  PHY_CHSCH Phy_chsch[8];    /*!< CHSCH Static Configuration*/
-  PHY_CHBCH Phy_chbch;       /*!< CHBCH Static Configuration*/
-  PHY_SCH   Phy_sch[8];      /*!< SCH Static Configuration*/
-  PHY_SACH  Phy_sach;        /*!< SACH Statuc Configuration*/
-} MACPHY_CONFIG_REQ;
-
-/*! \brief MACPHY-CONFIG-SACH-HARQ-REQ primitive is used to configure a new SACH transport channel (dynamic configuration) during logical channel establishment*/
-//typedef struct {
-//  LCHAN_ID Lchan_id;             /*!< This is the identifier of the SACH, which should simply be the logical channel id*/
-//  HARQ_PARAMS Harq_params;           /*!< This is the set of HARQ parameters corresponding to the QoS description of the logical channel*/
-//} MACPHY_CONFIG_SACH_HARQ_REQ;
-
-/** @} */
-
-#define MAX_NUMBER_OF_MAC_INSTANCES 16
-
-#define NULL_PDU 255
-#define CHBCH 0
-#define DL_SACH 1
-#define UL_SACH 2
-#define UL_SACCH_SACH 3
-#define RACH 4
-#define MRBCH 5
-
-
-#define NUMBER_OF_SUBBANDS 64
-#define LCHAN_KEY 0
-#define PDU_TYPE_KEY 1
-#define PHY_RESOURCES_KEY 2
-
-typedef struct Macphy_req_entry_key {
-  unsigned char Key_type;
-  union {
-    LCHAN_ID *Lchan_id;  //SACH, EMULATION
-    unsigned char Pdu_type;//CHBCH, RACH, EMULATION
-    PHY_RESOURCES Phy_resources;//REAL PHY
-  } Key;
-} MACPHY_REQ_ENTRY_KEY;
-
-/** @ingroup _PHY_TRANSPORT_CHANNEL_PROCEDURES_
- * @{
-\var typedef struct Macphy_data_req_table_entry {
-  MACPHY_DATA_REQ Macphy_data_req;
-  unsigned char Active;
-} MACPHY_DATA_REQ_TABLE_ENTRY;
-\brief An entry in the MACPHY_DATA_REQ Table.
-*/
-
-typedef struct Macphy_data_req_table_entry {
-  /// The MACPHY_DATA_REQ Structure itself
-  MACPHY_DATA_REQ Macphy_data_req;
-  /// Active flag.  Active=1 means that the REQ is pending.
-  unsigned char Active;
-} MACPHY_DATA_REQ_TABLE_ENTRY;
-
-/*!\var typedef struct  {
-  MACPHY_DATA_REQ_TABLE_ENTRY *Macphy_req_table_entry;
-  unsigned int Macphy_req_cnt;
-} MACPHY_DATA_REQ_TABLE
-\brief The MACPHY_DATA_REQ interface between MAC and PHY.  This table stores the pending requests from MAC which are serviced by PHY.  The pointer Macphy_req_table_entry points
-to an array of idle reqests allocated during initialization of the MAC-layer.
-*/
-
-typedef struct  {
-  /// Pointer to a MACPHY_DATA_REQ
-  MACPHY_DATA_REQ_TABLE_ENTRY *Macphy_req_table_entry;
-  /// Number of active requests
-  unsigned int Macphy_req_cnt;
-} MACPHY_DATA_REQ_TABLE;
-
-/** @} */
-
-/*typedef struct Tx_Phy_Pdu{                              //H.A
-  PHY_RESOURCES *Phy_resources;
-  MACPHY_DATA_IND *Macphy_data_ind;
-}T_PHY_PDU;
-
-typedef struct Rx_Phy_Pdu{                              //H.A
-  PHY_RESOURCES *Phy_resources;
-  char *Phy_payload;
-  }RX_PHY_PDU;*/
-
-
-typedef struct GRANTED_LCHAN_TABLE_ENTRY {
-  PHY_RESOURCES *Phy_resources;
-  LCHAN_ID Lchan_id;
-} GRANTED_LCHAN_TABLE_ENTRY;
-
-void clear_macphy_data_req(uint8_t);
-//void clean_macphy_interface(void);
-unsigned char phy_resources_compare(PHY_RESOURCES *,PHY_RESOURCES*);
-MACPHY_DATA_REQ_TABLE_ENTRY* find_data_req_entry(uint8_t,MACPHY_REQ_ENTRY_KEY*);
-void print_active_requests(uint8_t);
-void mac_process_meas_ul(uint8_t Mod_id,UL_MEAS *UL_meas, uint16_t Index);
-void mac_process_meas_dl(uint8_t Mod_id,DL_MEAS *DL_meas, uint16_t Index);
-
-
-
-
-MACPHY_DATA_REQ *new_macphy_data_req(uint8_t);
-//PHY_RESOURCES_TABLE_ENTRY *new_phy_resources(void);
-//MACPHY_DATA_IND *new_macphy_data_ind(void);
-#endif
-
-
diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c
index 006f03a63e175be8ca15d847c698356e0ef7a5e5..a03fb51749a74e482bda761a67c727b08011ed2a 100644
--- a/openair2/RRC/LTE/rrc_eNB.c
+++ b/openair2/RRC/LTE/rrc_eNB.c
@@ -104,13 +104,9 @@ static int is_en_dc_supported(LTE_UE_EUTRA_Capability_t *c);
 
 extern RAN_CONTEXT_t RC;
 
-#ifdef PHY_EMUL
-  extern EMULATION_VARS              *Emul_vars;
-#endif
 extern eNB_MAC_INST                *eNB_mac_inst;
 extern UE_MAC_INST                 *UE_mac_inst;
 
-extern uint16_t                     two_tier_hexagonal_cellIds[7];
 
 mui_t                               rrc_eNB_mui = 0;
 
@@ -6120,7 +6116,6 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
   mobilityInfo = CALLOC(1, sizeof(*mobilityInfo));
   memset((void *)mobilityInfo, 0, sizeof(*mobilityInfo));
   mobilityInfo->targetPhysCellId = RC.rrc[ctxt_pP->module_id]->carrier[0].physCellId;
-  //(PhysCellId_t) two_tier_hexagonal_cellIds[ue_context_pP->ue_context.handover_info->modid_t];
   LOG_D(RRC, "[eNB %d] Frame %d: handover preparation: targetPhysCellId: %ld mod_id: %d ue: %x \n",
         ctxt_pP->module_id,
         ctxt_pP->frame,
diff --git a/openair2/RRC/LTE/rrc_extern.h b/openair2/RRC/LTE/rrc_extern.h
index 6564f38ade9e90bbd0c438c94a7cb04306cd36e5..7f7fd6579e088532a36600e15b149a3de83762f1 100644
--- a/openair2/RRC/LTE/rrc_extern.h
+++ b/openair2/RRC/LTE/rrc_extern.h
@@ -47,7 +47,6 @@ extern LTE_LogicalChannelConfig_t SRB2_logicalChannelConfig_defaultValue;
 extern unsigned char NB_INST;
 extern unsigned char NB_eNB_INST;
 extern uint16_t NB_UE_INST;
-extern unsigned short NODE_ID[1];
 extern void* bigphys_malloc(int);
 
 
diff --git a/openair2/RRC/NAS/nas_config.c b/openair2/RRC/NAS/nas_config.c
index 2eb439b9e9891fbd0076cbb2a9f02fbe73c83e5f..31ca8f9eb857a5ea6bfb30d3f182ca935778d3e3 100644
--- a/openair2/RRC/NAS/nas_config.c
+++ b/openair2/RRC/NAS/nas_config.c
@@ -344,6 +344,24 @@ int nas_config(int interface_id, int thirdOctet, int fourthOctet, char *ifname)
     LOG_E(OIP,"Interface %s couldn't be configured (ip address %s, mask %s broadcast address %s)\n",
           interfaceName, ipAddress, netMask, broadcastAddress);
 
+  int res;
+  char command_line[500];
+  res = sprintf(command_line,
+    "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",
+    ipAddress, interface_id - 1 + 10000,
+    ipAddress, interface_id - 1 + 10000,
+    UE_NAS_USE_TUN ? "oaitun_ue" : "oip",
+    interface_id, interface_id - 1 + 10000);
+
+  if (res < 0) {
+    LOG_E(OIP,"Could not create ip rule/route commands string\n");
+    return res;
+  }
+
+  background_system(command_line);
+
   return returnValue;
 }
 
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c
index e36644afb0089375208ded1a1b8834af5b76668e..59c4ae09e54e9ee9de812423f8ce3e177fd6baa6 100755
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c
@@ -419,8 +419,28 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
     nrMultiBandInfo->freqBandIndicatorNR = configuration->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[i];
     ASN_SEQUENCE_ADD(&sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.frequencyBandList.list,nrMultiBandInfo);
   }
-  //sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA = configuration->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->offsetToCarrier;
-  sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA = 86;
+
+  int scs_scaling0 = 1<<(configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing);
+  int scs_scaling  = scs_scaling0;
+  int scs_scaling2 = scs_scaling0;
+  if (configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000) {
+    scs_scaling = scs_scaling0*3;
+  }
+  if (configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666) {
+    scs_scaling = scs_scaling0>>2;
+    scs_scaling2 = scs_scaling0>>2;
+  }
+  uint32_t absolute_diff = (*configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB -
+                             configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
+
+  sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA = scs_scaling2 * (absolute_diff/(12*scs_scaling) - 10);
+
+  LOG_I(NR_RRC,"SIB1 freq: absoluteFrequencySSB %ld, absoluteFrequencyPointA %ld\n",
+                                    *configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB,
+                                    configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
+  LOG_I(NR_RRC,"SIB1 freq: absolute_diff %d, %d*(absolute_diff/(12*%d) - 10) %d\n",
+        absolute_diff,scs_scaling2,scs_scaling,(int)sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA);
+
   for(int i = 0; i< configuration->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.count; i++) {
     ASN_SEQUENCE_ADD(&sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list,configuration->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[i]);
   }
diff --git a/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/extract_asn1_from_spce.pl b/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/extract_asn1_from_spce.pl
index 81193afd1daf62fec0761ec6a83c092604acbc8c..bdcdef59391744827a23b0d9d106be0489e312c6 100755
--- a/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/extract_asn1_from_spce.pl
+++ b/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/extract_asn1_from_spce.pl
@@ -26,38 +26,52 @@ while (<INPUT_FILE>) {
 
     syswrite OUTPUT_FILE,"END\n\n";
 
-	while(<INPUT_FILE>) {
-  	  if( m/NR-UE-Variables DEFINITIONS AUTOMATIC TAGS ::=/){
-         
-          syswrite OUTPUT_FILE,"$_ \n";
-          syswrite OUTPUT_FILE,"BEGIN\n\n";
+	  while(<INPUT_FILE>) {
+      if( m/PC5-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::=/){
+        syswrite OUTPUT_FILE,"$_ \n";
+        syswrite OUTPUT_FILE,"BEGIN\n\n";
 
-          # Get all the text delimited by -- ASN1START and -- ASN1STOP
-          extract_asn1();
+        # Get all the text delimited by -- ASN1START and -- ASN1STOP
+        extract_asn1();
 
-          syswrite OUTPUT_FILE,"END\n\n";
+        syswrite OUTPUT_FILE,"END\n\n";
           
-          	while(<INPUT_FILE>) {
+        while(<INPUT_FILE>) {
+          if( m/NR-UE-Variables DEFINITIONS AUTOMATIC TAGS ::=/){
+            syswrite OUTPUT_FILE,"$_ \n";
+            syswrite OUTPUT_FILE,"BEGIN\n\n";
+
+            # Get all the text delimited by -- ASN1START and -- ASN1STOP
+            extract_asn1();
+            syswrite OUTPUT_FILE,"END\n\n";
+            while(<INPUT_FILE>) {
+              if( m/NR-Sidelink-Preconf DEFINITIONS AUTOMATIC TAGS ::=/){
+                syswrite OUTPUT_FILE,"$_ \n";
+                syswrite OUTPUT_FILE,"BEGIN\n\n";
+
+                # Get all the text delimited by -- ASN1START and -- ASN1STOP
+                extract_asn1();
+
+                syswrite OUTPUT_FILE,"END\n\n";
+                while(<INPUT_FILE>) {
                   if( m/NR-InterNodeDefinitions DEFINITIONS AUTOMATIC TAGS ::=/){
-		  
-          	  syswrite OUTPUT_FILE,"$_ \n";
-          	  syswrite OUTPUT_FILE,"BEGIN\n\n";
+                    syswrite OUTPUT_FILE,"$_ \n";
+                    syswrite OUTPUT_FILE,"BEGIN\n\n";
 
-          	  # Get all the text delimited by -- ASN1START and -- ASN1STOP
-          	  extract_asn1();
+                    # Get all the text delimited by -- ASN1START and -- ASN1STOP
+                    extract_asn1();
 
-          	  syswrite OUTPUT_FILE,"END\n\n";
-
-		  }
+                    syswrite OUTPUT_FILE,"END\n\n";
+                  }
                 }
-
-	  }	
-	}	  
-
+              }
+            }
+          }
+        }
+	    }
+    }
     close(OUTPUT_FILE);
   }
-
-
 }
 
 close(INPUT_FILE);
diff --git a/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-16.4.1.asn1 b/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-16.4.1.asn1
new file mode 100644
index 0000000000000000000000000000000000000000..80112fa2ff689f9b6b3d878bfe3575a99881199d
--- /dev/null
+++ b/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-16.4.1.asn1
@@ -0,0 +1,14304 @@
+NR-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::=
+ 
+BEGIN
+
+-- TAG-BCCH-BCH-MESSAGE-START
+
+BCCH-BCH-Message ::=            SEQUENCE {
+    message                         BCCH-BCH-MessageType
+}
+
+BCCH-BCH-MessageType ::=        CHOICE {
+    mib                             MIB,
+    messageClassExtension           SEQUENCE {}
+}
+
+-- TAG-BCCH-BCH-MESSAGE-STOP
+-- TAG-BCCH-DL-SCH-MESSAGE-START
+
+BCCH-DL-SCH-Message ::=         SEQUENCE {
+    message                         BCCH-DL-SCH-MessageType
+}
+
+BCCH-DL-SCH-MessageType ::=     CHOICE {
+    c1                              CHOICE {
+        systemInformation               SystemInformation,
+        systemInformationBlockType1     SIB1
+    },
+    messageClassExtension           SEQUENCE {}
+}
+
+-- TAG-BCCH-DL-SCH-MESSAGE-STOP
+-- TAG-DL-CCCH-MESSAGE-START
+
+DL-CCCH-Message ::=             SEQUENCE {
+    message                         DL-CCCH-MessageType
+}
+
+DL-CCCH-MessageType ::=         CHOICE {
+    c1                              CHOICE {
+        rrcReject                       RRCReject,
+        rrcSetup                        RRCSetup,
+        spare2                          NULL,
+        spare1                          NULL
+    },
+    messageClassExtension           SEQUENCE {}
+}
+
+-- TAG-DL-CCCH-MESSAGE-STOP
+-- TAG-DL-DCCH-MESSAGE-START
+
+DL-DCCH-Message ::=                  SEQUENCE {
+    message                             DL-DCCH-MessageType
+}
+
+DL-DCCH-MessageType ::=             CHOICE {
+    c1                                  CHOICE {
+        rrcReconfiguration                  RRCReconfiguration,
+        rrcResume                           RRCResume,
+        rrcRelease                          RRCRelease,
+        rrcReestablishment                  RRCReestablishment,
+        securityModeCommand                 SecurityModeCommand,
+        dlInformationTransfer               DLInformationTransfer,
+        ueCapabilityEnquiry                 UECapabilityEnquiry,
+        counterCheck                        CounterCheck,
+        mobilityFromNRCommand               MobilityFromNRCommand,
+        dlDedicatedMessageSegment-r16       DLDedicatedMessageSegment-r16,
+        ueInformationRequest-r16            UEInformationRequest-r16,
+        dlInformationTransferMRDC-r16       DLInformationTransferMRDC-r16,
+        loggedMeasurementConfiguration-r16  LoggedMeasurementConfiguration-r16,
+                spare3 NULL, spare2 NULL, spare1 NULL
+    },
+    messageClassExtension   SEQUENCE {}
+}
+
+-- TAG-DL-DCCH-MESSAGE-STOP
+-- TAG-PCCH-PCH-MESSAGE-START
+
+PCCH-Message ::=                SEQUENCE {
+    message                         PCCH-MessageType
+}
+
+PCCH-MessageType ::=            CHOICE {
+    c1                              CHOICE {
+        paging                          Paging,
+        spare1  NULL
+    },
+    messageClassExtension       SEQUENCE {}
+}
+
+-- TAG-PCCH-PCH-MESSAGE-STOP
+-- TAG-UL-CCCH-MESSAGE-START
+
+
+UL-CCCH-Message ::=             SEQUENCE {
+    message                         UL-CCCH-MessageType
+}
+
+UL-CCCH-MessageType ::=         CHOICE {
+    c1                              CHOICE {
+        rrcSetupRequest                 RRCSetupRequest,
+        rrcResumeRequest                RRCResumeRequest,
+        rrcReestablishmentRequest       RRCReestablishmentRequest,
+        rrcSystemInfoRequest            RRCSystemInfoRequest
+    },
+    messageClassExtension           SEQUENCE {}
+}
+
+-- TAG-UL-CCCH-MESSAGE-STOP
+-- TAG-UL-CCCH1-MESSAGE-START
+
+
+UL-CCCH1-Message ::=            SEQUENCE {
+    message                         UL-CCCH1-MessageType
+}
+
+UL-CCCH1-MessageType ::=        CHOICE {
+    c1                              CHOICE {
+        rrcResumeRequest1               RRCResumeRequest1,
+        spare3 NULL,
+        spare2 NULL,
+        spare1 NULL
+
+    },
+    messageClassExtension SEQUENCE {}
+}
+
+-- TAG-UL-CCCH1-MESSAGE-STOP
+-- TAG-UL-DCCH-MESSAGE-START
+
+UL-DCCH-Message ::=             SEQUENCE {
+    message                         UL-DCCH-MessageType
+}
+
+UL-DCCH-MessageType ::=         CHOICE {
+    c1                              CHOICE {
+        measurementReport               MeasurementReport,
+        rrcReconfigurationComplete      RRCReconfigurationComplete,
+        rrcSetupComplete                RRCSetupComplete,
+        rrcReestablishmentComplete      RRCReestablishmentComplete,
+        rrcResumeComplete               RRCResumeComplete,
+        securityModeComplete            SecurityModeComplete,
+        securityModeFailure             SecurityModeFailure,
+        ulInformationTransfer           ULInformationTransfer,
+        locationMeasurementIndication   LocationMeasurementIndication,
+        ueCapabilityInformation         UECapabilityInformation,
+        counterCheckResponse            CounterCheckResponse,
+        ueAssistanceInformation         UEAssistanceInformation,
+        failureInformation              FailureInformation,
+        ulInformationTransferMRDC       ULInformationTransferMRDC,
+        scgFailureInformation           SCGFailureInformation,
+        scgFailureInformationEUTRA      SCGFailureInformationEUTRA
+    },
+    messageClassExtension           CHOICE {
+        c2                              CHOICE {
+            ulDedicatedMessageSegment-r16    ULDedicatedMessageSegment-r16,
+            dedicatedSIBRequest-r16         DedicatedSIBRequest-r16,
+            mcgFailureInformation-r16       MCGFailureInformation-r16,
+            ueInformationResponse-r16       UEInformationResponse-r16,
+            sidelinkUEInformationNR-r16     SidelinkUEInformationNR-r16,
+            ulInformationTransferIRAT-r16   ULInformationTransferIRAT-r16,
+            iabOtherInformation-r16         IABOtherInformation-r16,
+            spare9 NULL, spare8 NULL, spare7 NULL, spare6 NULL,
+            spare5 NULL, spare4 NULL, spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        messageClassExtensionFuture-r16    SEQUENCE {}
+    }
+}
+
+-- TAG-UL-DCCH-MESSAGE-STOP
+-- TAG-COUNTERCHECK-START
+
+
+CounterCheck ::=                SEQUENCE {
+    rrc-TransactionIdentifier       RRC-TransactionIdentifier,
+    criticalExtensions              CHOICE {
+        counterCheck                    CounterCheck-IEs,
+        criticalExtensionsFuture        SEQUENCE {}
+    }
+}
+
+CounterCheck-IEs ::=            SEQUENCE {
+    drb-CountMSB-InfoList           DRB-CountMSB-InfoList,
+    lateNonCriticalExtension        OCTET STRING                        OPTIONAL,
+    nonCriticalExtension            SEQUENCE {}                         OPTIONAL
+}
+
+DRB-CountMSB-InfoList ::=       SEQUENCE (SIZE (1..maxDRB)) OF DRB-CountMSB-Info
+
+DRB-CountMSB-Info ::=           SEQUENCE {
+    drb-Identity                    DRB-Identity,
+    countMSB-Uplink                 INTEGER(0..33554431),
+    countMSB-Downlink               INTEGER(0..33554431)
+}
+
+-- TAG-COUNTERCHECK-STOP
+-- TAG-COUNTERCHECKRESPONSE-START
+
+CounterCheckResponse ::=        SEQUENCE {
+    rrc-TransactionIdentifier       RRC-TransactionIdentifier,
+    criticalExtensions              CHOICE {
+        counterCheckResponse            CounterCheckResponse-IEs,
+        criticalExtensionsFuture        SEQUENCE {}
+    }
+}
+
+CounterCheckResponse-IEs ::=    SEQUENCE {
+    drb-CountInfoList               DRB-CountInfoList,
+    lateNonCriticalExtension        OCTET STRING                        OPTIONAL,
+    nonCriticalExtension            SEQUENCE {}                         OPTIONAL
+
+}
+
+DRB-CountInfoList ::=           SEQUENCE (SIZE (0..maxDRB)) OF DRB-CountInfo
+
+DRB-CountInfo ::=               SEQUENCE {
+    drb-Identity                    DRB-Identity,
+    count-Uplink                    INTEGER(0..4294967295),
+    count-Downlink                  INTEGER(0..4294967295)
+}
+
+-- TAG-COUNTERCHECKRESPONSE-STOP
+-- TAG-DEDICATEDSIBREQUEST-START
+
+DedicatedSIBRequest-r16 ::=      SEQUENCE {
+    criticalExtensions               CHOICE {
+        dedicatedSIBRequest-r16          DedicatedSIBRequest-r16-IEs,
+        criticalExtensionsFuture         SEQUENCE {}
+    }
+}
+
+DedicatedSIBRequest-r16-IEs ::=  SEQUENCE {
+    onDemandSIB-RequestList-r16       SEQUENCE {
+
+        requestedSIB-List-r16            SEQUENCE (SIZE (1..maxOnDemandSIB-r16)) OF SIB-ReqInfo-r16                OPTIONAL,
+        requestedPosSIB-List-r16         SEQUENCE (SIZE (1..maxOnDemandPosSIB-r16)) OF PosSIB-ReqInfo-r16          OPTIONAL
+    } OPTIONAL,
+    lateNonCriticalExtension         OCTET STRING             OPTIONAL,
+    nonCriticalExtension             SEQUENCE {}              OPTIONAL
+}
+
+SIB-ReqInfo-r16 ::=                   ENUMERATED { sib12, sib13, sib14, spare5, spare4, spare3, spare2, spare1 }
+
+PosSIB-ReqInfo-r16 ::=       SEQUENCE {
+    gnss-id-r16                  GNSS-ID-r16                  OPTIONAL,
+    sbas-id-r16                  SBAS-ID-r16                  OPTIONAL,
+    posSibType-r16               ENUMERATED { posSibType1-1, posSibType1-2, posSibType1-3, posSibType1-4, posSibType1-5, posSibType1-6,
+                                              posSibType1-7, posSibType1-8, posSibType2-1, posSibType2-2, posSibType2-3, posSibType2-4,
+                                              posSibType2-5, posSibType2-6, posSibType2-7, posSibType2-8, posSibType2-9, posSibType2-10,
+                                              posSibType2-11, posSibType2-12, posSibType2-13, posSibType2-14, posSibType2-15,
+                                              posSibType2-16, posSibType2-17, posSibType2-18, posSibType2-19, posSibType2-20,
+                                              posSibType2-21, posSibType2-22, posSibType2-23, posSibType3-1, posSibType4-1,
+                                              posSibType5-1, posSibType6-1, posSibType6-2, posSibType6-3,... }
+}
+
+-- TAG-DEDICATEDSIBREQUEST-STOP
+-- TAG-DLDEDICATEDMESSAGESEGMENT-START
+
+
+DLDedicatedMessageSegment-r16 ::=       SEQUENCE {
+    criticalExtensions                      CHOICE {
+        dlDedicatedMessageSegment-r16           DLDedicatedMessageSegment-r16-IEs,
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+DLDedicatedMessageSegment-r16-IEs ::=   SEQUENCE {
+    segmentNumber-r16                       INTEGER(0..4),
+    rrc-MessageSegmentContainer-r16         OCTET STRING,
+    rrc-MessageSegmentType-r16              ENUMERATED {notLastSegment, lastSegment},
+    lateNonCriticalExtension                OCTET STRING                                  OPTIONAL,
+    nonCriticalExtension                    SEQUENCE {}                                   OPTIONAL
+}
+
+-- TAG-DLDEDICATEDMESSAGESEGMENT-STOP
+-- TAG-DLINFORMATIONTRANSFER-START
+
+DLInformationTransfer ::=           SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        dlInformationTransfer           DLInformationTransfer-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+DLInformationTransfer-IEs ::=       SEQUENCE {
+    dedicatedNAS-Message                DedicatedNAS-Message                OPTIONAL,   -- Need N
+    lateNonCriticalExtension            OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                DLInformationTransfer-v1610-IEs     OPTIONAL
+}
+
+DLInformationTransfer-v1610-IEs ::= SEQUENCE {
+    referenceTimeInfo-r16               ReferenceTimeInfo-r16               OPTIONAL,   -- Need R
+    nonCriticalExtension                SEQUENCE {}                         OPTIONAL
+}
+
+-- TAG-DLINFORMATIONTRANSFER-STOP
+-- TAG-DLINFORMATIONTRANSFERMRDC-START
+
+DLInformationTransferMRDC-r16 ::=       SEQUENCE {
+    criticalExtensions                      CHOICE {
+        c1                                      CHOICE {
+            dlInformationTransferMRDC-r16           DLInformationTransferMRDC-r16-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+DLInformationTransferMRDC-r16-IEs::=    SEQUENCE {
+    dl-DCCH-MessageNR-r16                   OCTET STRING             OPTIONAL, -- Need N
+    dl-DCCH-MessageEUTRA-r16                OCTET STRING             OPTIONAL, -- Need N
+    lateNonCriticalExtension                OCTET STRING             OPTIONAL,
+    nonCriticalExtension                    SEQUENCE {}              OPTIONAL
+}
+
+-- TAG-DLINFORMATIONTRANSFERMRDC-STOP
+-- TAG-FAILUREINFORMATION-START
+
+FailureInformation ::=         SEQUENCE {
+    criticalExtensions             CHOICE {
+        failureInformation             FailureInformation-IEs,
+        criticalExtensionsFuture       SEQUENCE {}
+    }
+}
+
+FailureInformation-IEs ::=     SEQUENCE {
+    failureInfoRLC-Bearer          FailureInfoRLC-Bearer        OPTIONAL,
+    lateNonCriticalExtension       OCTET STRING                 OPTIONAL,
+    nonCriticalExtension           FailureInformation-v1610-IEs OPTIONAL
+}
+
+FailureInfoRLC-Bearer ::=      SEQUENCE {
+    cellGroupId                    CellGroupId,
+    logicalChannelIdentity         LogicalChannelIdentity,
+    failureType                    ENUMERATED {rlc-failure, spare3, spare2, spare1}
+}
+
+FailureInformation-v1610-IEs ::= SEQUENCE {
+    failureInfoDAPS-r16              FailureInfoDAPS-r16        OPTIONAL,
+    nonCriticalExtension             SEQUENCE {}                OPTIONAL
+}
+
+FailureInfoDAPS-r16 ::=          SEQUENCE {
+    failureType-r16                  ENUMERATED {daps-failure, spare3, spare2, spare1}
+}
+
+-- TAG-FAILUREINFORMATION-STOP
+-- TAG-IABOTHERINFORMATION-START
+
+IABOtherInformation-r16 ::=     SEQUENCE {
+    rrc-TransactionIdentifier       RRC-TransactionIdentifier,
+    criticalExtensions              CHOICE {
+        iabOtherInformation-r16         IABOtherInformation-r16-IEs,
+        criticalExtensionsFuture        SEQUENCE {}
+    }
+}
+
+IABOtherInformation-r16-IEs ::=         SEQUENCE {
+    ip-InfoType-r16                         CHOICE {
+        iab-IP-Request-r16                      SEQUENCE {
+            iab-IPv4-AddressNumReq-r16              IAB-IP-AddressNumReq-r16                OPTIONAL,
+            iab-IPv6-AddressReq-r16                 CHOICE {
+                iab-IPv6-AddressNumReq-r16              IAB-IP-AddressNumReq-r16,
+                iab-IPv6-AddressPrefixReq-r16           IAB-IP-AddressPrefixReq-r16,
+                ...
+            }                                                                               OPTIONAL
+        },
+        iab-IP-Report-r16               SEQUENCE {
+            iab-IPv4-AddressReport-r16      IAB-IP-AddressAndTraffic-r16                    OPTIONAL,
+            iab-IPv6-Report-r16             CHOICE {
+                iab-IPv6-AddressReport-r16      IAB-IP-AddressAndTraffic-r16,
+                iab-IPv6-PrefixReport-r16       IAB-IP-PrefixAndTraffic-r16,
+                ...
+            }                                                                               OPTIONAL
+        },
+        ...
+    },
+    lateNonCriticalExtension        OCTET STRING                                            OPTIONAL,
+    nonCriticalExtension            SEQUENCE {}                                             OPTIONAL
+}
+
+IAB-IP-AddressNumReq-r16 ::=    SEQUENCE {
+    all-Traffic-NumReq-r16          INTEGER (1..8)                                  OPTIONAL,
+    f1-C-Traffic-NumReq-r16         INTEGER (1..8)                                  OPTIONAL,
+    f1-U-Traffic-NumReq-r16         INTEGER (1..8)                                  OPTIONAL,
+    non-F1-Traffic-NumReq-r16       INTEGER (1..8)                                  OPTIONAL,
+    ...
+}
+
+IAB-IP-AddressPrefixReq-r16 ::= SEQUENCE {
+    all-Traffic-PrefixReq-r16       ENUMERATED {true}                               OPTIONAL,
+    f1-C-Traffic-PrefixReq-r16      ENUMERATED {true}                               OPTIONAL,
+    f1-U-Traffic-PrefixReq-r16      ENUMERATED {true}                               OPTIONAL,
+    non-F1-Traffic-PrefixReq-r16    ENUMERATED {true}                               OPTIONAL,
+    ...
+}
+
+IAB-IP-AddressAndTraffic-r16 ::= SEQUENCE {
+    all-Traffic-IAB-IP-Address-r16  SEQUENCE (SIZE(1..8)) OF IAB-IP-Address-r16     OPTIONAL,
+    f1-C-Traffic-IP-Address-r16     SEQUENCE (SIZE(1..8)) OF IAB-IP-Address-r16     OPTIONAL,
+    f1-U-Traffic-IP-Address-r16     SEQUENCE (SIZE(1..8)) OF IAB-IP-Address-r16     OPTIONAL,
+    non-F1-Traffic-IP-Address-r16   SEQUENCE (SIZE(1..8)) OF IAB-IP-Address-r16     OPTIONAL
+}
+
+IAB-IP-PrefixAndTraffic-r16 ::= SEQUENCE {
+    all-Traffic-IAB-IP-Address-r16  IAB-IP-Address-r16                              OPTIONAL,
+    f1-C-Traffic-IP-Address-r16     IAB-IP-Address-r16                              OPTIONAL,
+    f1-U-Traffic-IP-Address-r16     IAB-IP-Address-r16                              OPTIONAL,
+    non-F1-Traffic-IP-Address-r16   IAB-IP-Address-r16                              OPTIONAL
+}
+
+-- TAG-IABOTHERINFORMATION-STOP
+-- TAG-LOCATIONMEASUREMENTINDICATION-START
+
+LocationMeasurementIndication ::=           SEQUENCE {
+    criticalExtensions                          CHOICE {
+        locationMeasurementIndication               LocationMeasurementIndication-IEs,
+        criticalExtensionsFuture                    SEQUENCE {}
+    }
+}
+
+LocationMeasurementIndication-IEs ::=       SEQUENCE {
+    measurementIndication                       SetupRelease {LocationMeasurementInfo},
+    lateNonCriticalExtension                    OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                        SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-LOCATIONMEASUREMENTINDICATION-STOP
+-- TAG-LOGGEDMEASUREMENTCONFIGURATION-START
+
+LoggedMeasurementConfiguration-r16 ::=  SEQUENCE {
+    criticalExtensions                      CHOICE {
+        loggedMeasurementConfiguration-r16      LoggedMeasurementConfiguration-r16-IEs,
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+LoggedMeasurementConfiguration-r16-IEs ::=  SEQUENCE {
+    traceReference-r16                          TraceReference-r16,
+    traceRecordingSessionRef-r16                OCTET STRING (SIZE (2)),
+    tce-Id-r16                                  OCTET STRING (SIZE (1)),
+    absoluteTimeInfo-r16                        AbsoluteTimeInfo-r16,
+    areaConfiguration-r16                       AreaConfiguration-r16                    OPTIONAL,  --Need R
+    plmn-IdentityList-r16                       PLMN-IdentityList2-r16                   OPTIONAL,  --Need R
+    bt-NameList-r16                             SetupRelease {BT-NameList-r16}           OPTIONAL,  --Need M
+    wlan-NameList-r16                           SetupRelease {WLAN-NameList-r16}         OPTIONAL,  --Need M
+    sensor-NameList-r16                         SetupRelease {Sensor-NameList-r16}       OPTIONAL,  --Need M
+    loggingDuration-r16                         LoggingDuration-r16,
+    reportType                                  CHOICE {
+        periodical                                  LoggedPeriodicalReportConfig-r16,
+        eventTriggered                              LoggedEventTriggerConfig-r16,
+        ...
+    },
+    lateNonCriticalExtension                    OCTET STRING                             OPTIONAL,
+    nonCriticalExtension                        SEQUENCE {}                              OPTIONAL
+}
+
+LoggedPeriodicalReportConfig-r16 ::=            SEQUENCE {
+    loggingInterval-r16                             LoggingInterval-r16,
+    ...
+ }
+
+LoggedEventTriggerConfig-r16 ::=                SEQUENCE {
+    eventType-r16                                   EventType-r16,
+    loggingInterval-r16                             LoggingInterval-r16,
+    ...
+}
+
+EventType-r16 ::= CHOICE {
+    outOfCoverage     NULL,
+    eventL1           SEQUENCE {
+        l1-Threshold      MeasTriggerQuantity,
+        hysteresis        Hysteresis,
+        timeToTrigger     TimeToTrigger
+    },
+    ...
+}
+
+-- TAG-LOGGEDMEASUREMENTCONFIGURATION-STOP
+-- TAG-MCGFAILUREINFORMATION-START
+
+MCGFailureInformation-r16 ::=    SEQUENCE {
+    criticalExtensions               CHOICE {
+        mcgFailureInformation-r16        MCGFailureInformation-r16-IEs,
+        criticalExtensionsFuture         SEQUENCE {}
+    }
+}
+
+MCGFailureInformation-r16-IEs ::= SEQUENCE {
+    failureReportMCG-r16              FailureReportMCG-r16                             OPTIONAL,
+    lateNonCriticalExtension          OCTET STRING                                     OPTIONAL,
+    nonCriticalExtension              SEQUENCE {}                                      OPTIONAL
+}
+
+FailureReportMCG-r16 ::=          SEQUENCE {
+    failureType-r16                   ENUMERATED {t310-Expiry, randomAccessProblem, rlc-MaxNumRetx,
+                                                         t312-Expiry-r16, lbt-Failure-r16, beamFailureRecoveryFailure-r16,
+                                         bh-RLF-r16, spare1}                                                                            OPTIONAL,
+    measResultFreqList-r16            MeasResultList2NR                                                                     OPTIONAL,
+    measResultFreqListEUTRA-r16       MeasResultList2EUTRA                                                                  OPTIONAL,
+    measResultSCG-r16                 OCTET STRING (CONTAINING MeasResultSCG-Failure)                                       OPTIONAL,
+    measResultSCG-EUTRA-r16           OCTET STRING                                                                          OPTIONAL,
+    measResultFreqListUTRA-FDD-r16    MeasResultList2UTRA                                                                   OPTIONAL,
+    ...
+}
+
+MeasResultList2UTRA ::=    SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2UTRA-FDD-r16
+
+MeasResult2UTRA-FDD-r16 ::=       SEQUENCE {
+    carrierFreq-r16                   ARFCN-ValueUTRA-FDD-r16,
+    measResultNeighCellList-r16       MeasResultListUTRA-FDD-r16
+}
+
+MeasResultList2EUTRA ::=          SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2EUTRA-r16
+
+-- TAG-MCGFAILUREINFORMATION-STOP
+-- TAG-MEASUREMENTREPORT-START
+
+MeasurementReport ::=               SEQUENCE {
+    criticalExtensions                  CHOICE {
+        measurementReport                   MeasurementReport-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+MeasurementReport-IEs ::=           SEQUENCE {
+    measResults                         MeasResults,
+
+    lateNonCriticalExtension                OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                    SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-MEASUREMENTREPORT-STOP
+-- TAG-MIB-START
+
+MIB ::=                             SEQUENCE {
+    systemFrameNumber                   BIT STRING (SIZE (6)),
+    subCarrierSpacingCommon             ENUMERATED {scs15or60, scs30or120},
+    ssb-SubcarrierOffset                INTEGER (0..15),
+    dmrs-TypeA-Position                 ENUMERATED {pos2, pos3},
+    pdcch-ConfigSIB1                    PDCCH-ConfigSIB1,
+    cellBarred                          ENUMERATED {barred, notBarred},
+    intraFreqReselection                ENUMERATED {allowed, notAllowed},
+    spare                               BIT STRING (SIZE (1))
+}
+
+-- TAG-MIB-STOP
+-- TAG-MOBILITYFROMNRCOMMAND-START
+
+MobilityFromNRCommand ::=           SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+            mobilityFromNRCommand           MobilityFromNRCommand-IEs,
+            criticalExtensionsFuture        SEQUENCE {}
+    }
+}
+
+MobilityFromNRCommand-IEs ::=       SEQUENCE {
+    targetRAT-Type                      ENUMERATED { eutra, utra-fdd-v1610, spare2, spare1, ...},
+    targetRAT-MessageContainer          OCTET STRING,
+    nas-SecurityParamFromNR             OCTET STRING                                                OPTIONAL,   -- Cond HO-ToEPCUTRAN
+    lateNonCriticalExtension            OCTET STRING                                                OPTIONAL,
+    nonCriticalExtension                MobilityFromNRCommand-v1610-IEs                             OPTIONAL
+}
+
+MobilityFromNRCommand-v1610-IEs ::=     SEQUENCE {
+    voiceFallbackIndication-r16             ENUMERATED {true}                                       OPTIONAL,   -- Need N
+    nonCriticalExtension                    SEQUENCE {}                                             OPTIONAL
+}
+
+-- TAG-MOBILITYFROMNRCOMMAND-STOP
+-- TAG-PAGING-START
+
+Paging ::=                          SEQUENCE {
+    pagingRecordList                    PagingRecordList                                                        OPTIONAL, -- Need N
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                                              OPTIONAL
+}
+
+PagingRecordList ::=                SEQUENCE (SIZE(1..maxNrofPageRec)) OF PagingRecord
+
+PagingRecord ::=                    SEQUENCE {
+    ue-Identity                         PagingUE-Identity,
+    accessType                          ENUMERATED {non3GPP}    OPTIONAL,   -- Need N
+    ...
+}
+
+PagingUE-Identity ::=               CHOICE {
+    ng-5G-S-TMSI                        NG-5G-S-TMSI,
+    fullI-RNTI                          I-RNTI-Value,
+    ...
+}
+
+-- TAG-PAGING-STOP
+-- TAG-RRCREESTABLISHMENT-START
+
+RRCReestablishment ::=              SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        rrcReestablishment                  RRCReestablishment-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+RRCReestablishment-IEs ::=          SEQUENCE {
+    nextHopChainingCount                NextHopChainingCount,
+    lateNonCriticalExtension            OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                SEQUENCE {}                         OPTIONAL
+}
+
+-- TAG-RRCREESTABLISHMENT-STOP
+-- TAG-RRCREESTABLISHMENTCOMPLETE-START
+
+RRCReestablishmentComplete ::=              SEQUENCE {
+    rrc-TransactionIdentifier                   RRC-TransactionIdentifier,
+    criticalExtensions                          CHOICE {
+        rrcReestablishmentComplete                  RRCReestablishmentComplete-IEs,
+        criticalExtensionsFuture                    SEQUENCE {}
+    }
+}
+
+RRCReestablishmentComplete-IEs ::=          SEQUENCE {
+    lateNonCriticalExtension                    OCTET STRING                            OPTIONAL,
+    nonCriticalExtension                        RRCReestablishmentComplete-v1610-IEs    OPTIONAL
+}
+
+RRCReestablishmentComplete-v1610-IEs ::=    SEQUENCE {
+    ue-MeasurementsAvailable-r16                UE-MeasurementsAvailable-r16    OPTIONAL,
+    nonCriticalExtension                        SEQUENCE {}                     OPTIONAL
+}
+
+-- TAG-RRCREESTABLISHMENTCOMPLETE-STOP
+-- TAG-RRCREESTABLISHMENTREQUEST-START
+
+
+RRCReestablishmentRequest ::=       SEQUENCE {
+    rrcReestablishmentRequest           RRCReestablishmentRequest-IEs
+}
+
+RRCReestablishmentRequest-IEs ::=   SEQUENCE {
+    ue-Identity                         ReestabUE-Identity,
+    reestablishmentCause                ReestablishmentCause,
+    spare                               BIT STRING (SIZE (1))
+}
+
+ReestabUE-Identity ::=              SEQUENCE {
+    c-RNTI                              RNTI-Value,
+    physCellId                          PhysCellId,
+    shortMAC-I                          ShortMAC-I
+}
+
+ReestablishmentCause ::=            ENUMERATED {reconfigurationFailure, handoverFailure, otherFailure, spare1}
+
+-- TAG-RRCREESTABLISHMENTREQUEST-STOP
+-- TAG-RRCRECONFIGURATION-START
+
+RRCReconfiguration ::=                  SEQUENCE {
+    rrc-TransactionIdentifier               RRC-TransactionIdentifier,
+    criticalExtensions                      CHOICE {
+        rrcReconfiguration                      RRCReconfiguration-IEs,
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+RRCReconfiguration-IEs ::=              SEQUENCE {
+    radioBearerConfig                       RadioBearerConfig                                                      OPTIONAL, -- Need M
+    secondaryCellGroup                      OCTET STRING (CONTAINING CellGroupConfig)                              OPTIONAL, -- Cond SCG
+    measConfig                              MeasConfig                                                             OPTIONAL, -- Need M
+    lateNonCriticalExtension                OCTET STRING                                                           OPTIONAL,
+    nonCriticalExtension                    RRCReconfiguration-v1530-IEs                                           OPTIONAL
+}
+
+RRCReconfiguration-v1530-IEs ::=            SEQUENCE {
+    masterCellGroup                         OCTET STRING (CONTAINING CellGroupConfig)                              OPTIONAL, -- Need M
+    fullConfig                              ENUMERATED {true}                                                      OPTIONAL, -- Cond FullConfig
+    dedicatedNAS-MessageList                SEQUENCE (SIZE(1..maxDRB)) OF DedicatedNAS-Message                     OPTIONAL, -- Cond nonHO
+    masterKeyUpdate                         MasterKeyUpdate                                                        OPTIONAL, -- Cond MasterKeyChange
+    dedicatedSIB1-Delivery                  OCTET STRING (CONTAINING SIB1)                                         OPTIONAL, -- Need N
+    dedicatedSystemInformationDelivery      OCTET STRING (CONTAINING SystemInformation)                            OPTIONAL, -- Need N
+    otherConfig                             OtherConfig                                                            OPTIONAL, -- Need M
+    nonCriticalExtension                    RRCReconfiguration-v1540-IEs                                           OPTIONAL
+}
+
+RRCReconfiguration-v1540-IEs ::=        SEQUENCE {
+    otherConfig-v1540                       OtherConfig-v1540                                                      OPTIONAL, -- Need M
+    nonCriticalExtension                    RRCReconfiguration-v1560-IEs                                           OPTIONAL
+}
+
+RRCReconfiguration-v1560-IEs ::=         SEQUENCE {
+    mrdc-SecondaryCellGroupConfig            SetupRelease { MRDC-SecondaryCellGroupConfig }                        OPTIONAL,   -- Need M
+    radioBearerConfig2                       OCTET STRING (CONTAINING RadioBearerConfig)                           OPTIONAL,   -- Need M
+    sk-Counter                               SK-Counter                                                            OPTIONAL,   -- Need N
+    nonCriticalExtension                     RRCReconfiguration-v1610-IEs                                          OPTIONAL
+}
+RRCReconfiguration-v1610-IEs ::=        SEQUENCE {
+    otherConfig-v1610                       OtherConfig-v1610                                                    OPTIONAL, -- Need M
+    bap-Config-r16                          SetupRelease { BAP-Config-r16 }                                      OPTIONAL, -- Need M
+    iab-IP-AddressConfigurationList-r16     IAB-IP-AddressConfigurationList-r16                                  OPTIONAL, -- Need M
+    conditionalReconfiguration-r16          ConditionalReconfiguration-r16                                       OPTIONAL, -- Need M
+    daps-SourceRelease-r16                  ENUMERATED{true}                                                     OPTIONAL, -- Need N
+    t316-r16                                SetupRelease {T316-r16}                                              OPTIONAL, -- Need M
+    needForGapsConfigNR-r16                 SetupRelease {NeedForGapsConfigNR-r16}                               OPTIONAL, -- Need M
+    onDemandSIB-Request-r16                 SetupRelease { OnDemandSIB-Request-r16 }                             OPTIONAL, -- Need M
+    dedicatedPosSysInfoDelivery-r16         OCTET STRING (CONTAINING PosSystemInformation-r16-IEs)               OPTIONAL, -- Need N
+    sl-ConfigDedicatedNR-r16                SetupRelease {SL-ConfigDedicatedNR-r16}                              OPTIONAL, -- Need M
+    sl-ConfigDedicatedEUTRA-Info-r16        SetupRelease {SL-ConfigDedicatedEUTRA-Info-r16}                      OPTIONAL, -- Need M
+    targetCellSMTC-SCG-r16                  SSB-MTC                                                              OPTIONAL, -- Need S
+    nonCriticalExtension                    SEQUENCE {}                                                          OPTIONAL
+}
+
+MRDC-SecondaryCellGroupConfig ::=       SEQUENCE {
+    mrdc-ReleaseAndAdd                      ENUMERATED {true}                                                     OPTIONAL,   -- Need N
+    mrdc-SecondaryCellGroup                 CHOICE {
+        nr-SCG                                  OCTET STRING  (CONTAINING RRCReconfiguration),
+        eutra-SCG                               OCTET STRING
+    }
+}
+
+BAP-Config-r16 ::=                      SEQUENCE {
+    bap-Address-r16                         BIT STRING (SIZE (10))                                    OPTIONAL, -- Need M
+    defaultUL-BAP-RoutingID-r16             BAP-RoutingID-r16                                         OPTIONAL, -- Need M
+    defaultUL-BH-RLC-Channel-r16            BH-RLC-ChannelID-r16                                      OPTIONAL, -- Need M
+    flowControlFeedbackType-r16             ENUMERATED {perBH-RLC-Channel, perRoutingID, both}        OPTIONAL, -- Need R
+    ...
+}
+
+MasterKeyUpdate ::=                 SEQUENCE {
+    keySetChangeIndicator           BOOLEAN,
+    nextHopChainingCount            NextHopChainingCount,
+    nas-Container                   OCTET STRING                                                     OPTIONAL,    -- Cond securityNASC
+    ...
+}
+
+OnDemandSIB-Request-r16 ::=                  SEQUENCE {
+    onDemandSIB-RequestProhibitTimer-r16         ENUMERATED {s0, s0dot5, s1, s2, s5, s10, s20, s30}
+}
+
+T316-r16 ::=         ENUMERATED {ms50, ms100, ms200, ms300, ms400, ms500, ms600, ms1000, ms1500, ms2000}
+
+IAB-IP-AddressConfigurationList-r16 ::= SEQUENCE {
+    iab-IP-AddressToAddModList-r16      SEQUENCE (SIZE(1..maxIAB-IP-Address-r16)) OF IAB-IP-AddressConfiguration-r16 OPTIONAL, -- Need N
+    iab-IP-AddressToReleaseList-r16     SEQUENCE (SIZE(1..maxIAB-IP-Address-r16)) OF IAB-IP-AddressIndex-r16         OPTIONAL, -- Need N
+    ...
+}
+
+IAB-IP-AddressConfiguration-r16 ::=     SEQUENCE {
+    iab-IP-AddressIndex-r16                 IAB-IP-AddressIndex-r16,
+    iab-IP-Address-r16                      IAB-IP-Address-r16                                                OPTIONAL,  -- Need M
+    iab-IP-Usage-r16                        IAB-IP-Usage-r16                                                  OPTIONAL,  -- Need M
+    iab-donor-DU-BAP-Address-r16            BIT STRING (SIZE(10))                                             OPTIONAL,  -- Need M
+...
+}
+
+SL-ConfigDedicatedEUTRA-Info-r16 ::=            SEQUENCE {
+    sl-ConfigDedicatedEUTRA-r16                    OCTET STRING                                              OPTIONAL,  -- Need M
+    sl-TimeOffsetEUTRA-List-r16                    SEQUENCE (SIZE (8)) OF SL-TimeOffsetEUTRA-r16             OPTIONAL    -- Need M
+}
+
+SL-TimeOffsetEUTRA-r16 ::=        ENUMERATED {ms0, ms0dot25, ms0dot5, ms0dot625, ms0dot75, ms1, ms1dot25, ms1dot5, ms1dot75,
+                                              ms2, ms2dot5, ms3, ms4, ms5, ms6, ms8, ms10, ms20}
+
+-- TAG-RRCRECONFIGURATION-STOP
+-- TAG-RRCRECONFIGURATIONCOMPLETE-START
+
+RRCReconfigurationComplete ::=              SEQUENCE {
+    rrc-TransactionIdentifier                   RRC-TransactionIdentifier,
+    criticalExtensions                          CHOICE {
+        rrcReconfigurationComplete                  RRCReconfigurationComplete-IEs,
+        criticalExtensionsFuture                    SEQUENCE {}
+    }
+}
+
+RRCReconfigurationComplete-IEs ::=          SEQUENCE {
+    lateNonCriticalExtension                    OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                        RRCReconfigurationComplete-v1530-IEs                                    OPTIONAL
+}
+
+RRCReconfigurationComplete-v1530-IEs ::=    SEQUENCE {
+    uplinkTxDirectCurrentList                   UplinkTxDirectCurrentList                                               OPTIONAL,
+    nonCriticalExtension                        RRCReconfigurationComplete-v1560-IEs                                    OPTIONAL
+}
+
+RRCReconfigurationComplete-v1560-IEs ::=    SEQUENCE {
+    scg-Response                                CHOICE {
+        nr-SCG-Response                             OCTET STRING (CONTAINING RRCReconfigurationComplete),
+        eutra-SCG-Response                          OCTET STRING
+    }                                                                                                                       OPTIONAL,
+    nonCriticalExtension                        RRCReconfigurationComplete-v1610-IEs                                    OPTIONAL
+}
+
+RRCReconfigurationComplete-v1610-IEs ::=    SEQUENCE {
+    ue-MeasurementsAvailable-r16                UE-MeasurementsAvailable-r16                                            OPTIONAL,
+    needForGapsInfoNR-r16                       NeedForGapsInfoNR-r16                                                   OPTIONAL,
+    nonCriticalExtension                        RRCReconfigurationComplete-v1640-IEs                                    OPTIONAL
+}
+
+RRCReconfigurationComplete-v1640-IEs ::=    SEQUENCE {
+    uplinkTxDirectCurrentTwoCarrierList-r16     UplinkTxDirectCurrentTwoCarrierList-r16                                 OPTIONAL,
+    nonCriticalExtension                        SEQUENCE {}                                                             OPTIONAL
+}
+
+-- TAG-RRCRECONFIGURATIONCOMPLETE-STOP
+-- TAG-RRCREJECT-START
+
+RRCReject ::=                       SEQUENCE {
+    criticalExtensions                  CHOICE {
+        rrcReject                           RRCReject-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+RRCReject-IEs ::=                   SEQUENCE {
+    waitTime                            RejectWaitTime                                                          OPTIONAL,   -- Need N
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-RRCREJECT-STOP
+-- TAG-RRCRELEASE-START
+
+RRCRelease ::=                      SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        rrcRelease                          RRCRelease-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+RRCRelease-IEs ::=                  SEQUENCE {
+    redirectedCarrierInfo               RedirectedCarrierInfo                                                       OPTIONAL,   -- Need N
+    cellReselectionPriorities           CellReselectionPriorities                                                   OPTIONAL,   -- Need R
+    suspendConfig                       SuspendConfig                                                               OPTIONAL,   -- Need R
+    deprioritisationReq                 SEQUENCE {
+        deprioritisationType                ENUMERATED {frequency, nr},
+        deprioritisationTimer               ENUMERATED {min5, min10, min15, min30}
+    }                                                                                                               OPTIONAL,   -- Need N
+    lateNonCriticalExtension                OCTET STRING                                                        OPTIONAL,
+    nonCriticalExtension                    RRCRelease-v1540-IEs                                                OPTIONAL
+}
+
+RRCRelease-v1540-IEs ::=            SEQUENCE {
+    waitTime                           RejectWaitTime                OPTIONAL, -- Need N
+    nonCriticalExtension               RRCRelease-v1610-IEs          OPTIONAL
+}
+
+RRCRelease-v1610-IEs ::=            SEQUENCE {
+    voiceFallbackIndication-r16        ENUMERATED {true}                             OPTIONAL, -- Need N
+    measIdleConfig-r16                 SetupRelease {MeasIdleConfigDedicated-r16}    OPTIONAL, -- Need M
+    nonCriticalExtension               SEQUENCE {}                                   OPTIONAL
+}
+
+RedirectedCarrierInfo ::=           CHOICE {
+    nr                                  CarrierInfoNR,
+    eutra                               RedirectedCarrierInfo-EUTRA,
+    ...
+}
+
+RedirectedCarrierInfo-EUTRA ::=     SEQUENCE {
+    eutraFrequency                      ARFCN-ValueEUTRA,
+    cnType                              ENUMERATED {epc,fiveGC}                                             OPTIONAL    -- Need N
+}
+
+CarrierInfoNR ::=                   SEQUENCE {
+    carrierFreq                         ARFCN-ValueNR,
+    ssbSubcarrierSpacing                SubcarrierSpacing,
+    smtc                                SSB-MTC                                                             OPTIONAL,      -- Need S
+    ...
+}
+
+SuspendConfig ::=                   SEQUENCE {
+    fullI-RNTI                          I-RNTI-Value,
+    shortI-RNTI                         ShortI-RNTI-Value,
+    ran-PagingCycle                     PagingCycle,
+    ran-NotificationAreaInfo            RAN-NotificationAreaInfo                                            OPTIONAL,   -- Need M
+    t380                                PeriodicRNAU-TimerValue                                             OPTIONAL,   -- Need R
+    nextHopChainingCount                NextHopChainingCount,
+    ...
+}
+
+PeriodicRNAU-TimerValue ::=         ENUMERATED { min5, min10, min20, min30, min60, min120, min360, min720}
+
+
+CellReselectionPriorities ::=       SEQUENCE {
+    freqPriorityListEUTRA               FreqPriorityListEUTRA                                               OPTIONAL,       -- Need M
+    freqPriorityListNR                  FreqPriorityListNR                                                  OPTIONAL,       -- Need M
+    t320                                ENUMERATED {min5, min10, min20, min30, min60, min120, min180, spare1} OPTIONAL,     -- Need R
+    ...
+}
+
+PagingCycle ::=                     ENUMERATED {rf32, rf64, rf128, rf256}
+
+FreqPriorityListEUTRA ::=           SEQUENCE (SIZE (1..maxFreq)) OF FreqPriorityEUTRA
+
+FreqPriorityListNR ::=              SEQUENCE (SIZE (1..maxFreq)) OF FreqPriorityNR
+
+FreqPriorityEUTRA ::=               SEQUENCE {
+    carrierFreq                         ARFCN-ValueEUTRA,
+    cellReselectionPriority             CellReselectionPriority,
+    cellReselectionSubPriority          CellReselectionSubPriority                                          OPTIONAL        -- Need R
+}
+
+FreqPriorityNR ::=                  SEQUENCE {
+    carrierFreq                         ARFCN-ValueNR,
+    cellReselectionPriority             CellReselectionPriority,
+    cellReselectionSubPriority          CellReselectionSubPriority                                          OPTIONAL        -- Need R
+}
+
+RAN-NotificationAreaInfo ::=        CHOICE {
+    cellList                            PLMN-RAN-AreaCellList,
+    ran-AreaConfigList                  PLMN-RAN-AreaConfigList,
+    ...
+}
+
+PLMN-RAN-AreaCellList ::=           SEQUENCE (SIZE (1.. maxPLMNIdentities)) OF PLMN-RAN-AreaCell
+
+PLMN-RAN-AreaCell ::=               SEQUENCE {
+    plmn-Identity                       PLMN-Identity                                                       OPTIONAL,   -- Need S
+    ran-AreaCells                       SEQUENCE (SIZE (1..32)) OF  CellIdentity
+}
+
+PLMN-RAN-AreaConfigList ::=         SEQUENCE (SIZE (1..maxPLMNIdentities)) OF PLMN-RAN-AreaConfig
+
+PLMN-RAN-AreaConfig ::=             SEQUENCE {
+    plmn-Identity                       PLMN-Identity                                                       OPTIONAL,   -- Need S
+    ran-Area                            SEQUENCE (SIZE (1..16)) OF  RAN-AreaConfig
+}
+
+RAN-AreaConfig ::=                  SEQUENCE {
+    trackingAreaCode                    TrackingAreaCode,
+    ran-AreaCodeList                    SEQUENCE (SIZE (1..32)) OF  RAN-AreaCode                            OPTIONAL    -- Need R
+}
+
+-- TAG-RRCRELEASE-STOP
+-- TAG-RRCRESUME-START
+
+RRCResume ::=                       SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        rrcResume                           RRCResume-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+RRCResume-IEs ::=                   SEQUENCE {
+    radioBearerConfig                   RadioBearerConfig                                               OPTIONAL, -- Need M
+    masterCellGroup                     OCTET STRING (CONTAINING CellGroupConfig)                       OPTIONAL, -- Need M
+    measConfig                          MeasConfig                                                      OPTIONAL, -- Need M
+    fullConfig                          ENUMERATED {true}                                               OPTIONAL, -- Need N
+    lateNonCriticalExtension            OCTET STRING                                                    OPTIONAL,
+    nonCriticalExtension                RRCResume-v1560-IEs                                             OPTIONAL
+}
+
+RRCResume-v1560-IEs ::=             SEQUENCE {
+    radioBearerConfig2                  OCTET STRING (CONTAINING RadioBearerConfig)                     OPTIONAL, -- Need M
+    sk-Counter                          SK-Counter                                                      OPTIONAL, -- Need N
+    nonCriticalExtension                RRCResume-v1610-IEs                                             OPTIONAL
+}
+
+RRCResume-v1610-IEs ::=             SEQUENCE {
+    idleModeMeasurementReq-r16          ENUMERATED {true}                                               OPTIONAL, -- Need N
+    restoreMCG-SCells-r16               ENUMERATED {true}                                               OPTIONAL, -- Need N
+    restoreSCG-r16                      ENUMERATED {true}                                               OPTIONAL, -- Need N
+    mrdc-SecondaryCellGroup-r16         CHOICE {
+        nr-SCG-r16                          OCTET STRING (CONTAINING RRCReconfiguration),
+        eutra-SCG-r16                       OCTET STRING
+    }                                                                                                   OPTIONAL, -- Cond RestoreSCG
+    needForGapsConfigNR-r16             SetupRelease {NeedForGapsConfigNR-r16}                          OPTIONAL, -- Need M
+    nonCriticalExtension                SEQUENCE{}                                                      OPTIONAL
+}
+
+-- TAG-RRCRESUME-STOP
+-- TAG-RRCRESUMECOMPLETE-START
+
+RRCResumeComplete ::=                   SEQUENCE {
+    rrc-TransactionIdentifier               RRC-TransactionIdentifier,
+    criticalExtensions                      CHOICE {
+        rrcResumeComplete                       RRCResumeComplete-IEs,
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+RRCResumeComplete-IEs ::=               SEQUENCE {
+    dedicatedNAS-Message                    DedicatedNAS-Message                                                    OPTIONAL,
+    selectedPLMN-Identity                   INTEGER (1..maxPLMN)                                                    OPTIONAL,
+    uplinkTxDirectCurrentList               UplinkTxDirectCurrentList                                               OPTIONAL,
+    lateNonCriticalExtension                OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                    RRCResumeComplete-v1610-IEs                                             OPTIONAL
+}
+
+RRCResumeComplete-v1610-IEs ::=         SEQUENCE {
+    idleMeasAvailable-r16                   ENUMERATED {true}                                                       OPTIONAL,
+    measResultIdleEUTRA-r16                 MeasResultIdleEUTRA-r16                                                 OPTIONAL,
+    measResultIdleNR-r16                    MeasResultIdleNR-r16                                                    OPTIONAL,
+    scg-Response-r16                        CHOICE {
+        nr-SCG-Response                         OCTET STRING (CONTAINING RRCReconfigurationComplete),
+        eutra-SCG-Response                      OCTET STRING
+    }                                                                                                               OPTIONAL,
+    ue-MeasurementsAvailable-r16            UE-MeasurementsAvailable-r16                                            OPTIONAL,
+    mobilityHistoryAvail-r16                ENUMERATED {true}                                                       OPTIONAL,
+    mobilityState-r16                       ENUMERATED {normal, medium, high, spare}                                OPTIONAL,
+    needForGapsInfoNR-r16                   NeedForGapsInfoNR-r16                                                   OPTIONAL,
+    nonCriticalExtension                    RRCResumeComplete-v1640-IEs                                             OPTIONAL
+}
+
+RRCResumeComplete-v1640-IEs ::=         SEQUENCE {
+    uplinkTxDirectCurrentTwoCarrierList-r16 UplinkTxDirectCurrentTwoCarrierList-r16                                 OPTIONAL,
+    nonCriticalExtension                    SEQUENCE {}                                                             OPTIONAL
+}
+
+-- TAG-RRCRESUMECOMPLETE-STOP
+-- TAG-RRCRESUMEREQUEST-START
+
+RRCResumeRequest ::=            SEQUENCE {
+        rrcResumeRequest            RRCResumeRequest-IEs
+}
+
+RRCResumeRequest-IEs ::=        SEQUENCE {
+    resumeIdentity                  ShortI-RNTI-Value,
+    resumeMAC-I                     BIT STRING (SIZE (16)),
+    resumeCause                     ResumeCause,
+    spare                           BIT STRING (SIZE (1))
+}
+
+-- TAG-RRCRESUMEREQUEST-STOP
+-- TAG-RRCRESUMEREQUEST1-START
+
+RRCResumeRequest1 ::=         SEQUENCE {
+       rrcResumeRequest1          RRCResumeRequest1-IEs
+}
+
+RRCResumeRequest1-IEs ::=    SEQUENCE {
+    resumeIdentity               I-RNTI-Value,
+    resumeMAC-I                  BIT STRING (SIZE (16)),
+    resumeCause                  ResumeCause,
+    spare                        BIT STRING (SIZE (1))
+}
+
+-- TAG-RRCRESUMEREQUEST1-STOP
+-- TAG-RRCSETUP-START
+
+RRCSetup ::=                        SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        rrcSetup                            RRCSetup-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+RRCSetup-IEs ::=                    SEQUENCE {
+    radioBearerConfig                   RadioBearerConfig,
+    masterCellGroup                     OCTET STRING (CONTAINING CellGroupConfig),
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-RRCSETUP-STOP
+-- TAG-RRCSETUPCOMPLETE-START
+
+RRCSetupComplete ::=                SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        rrcSetupComplete                    RRCSetupComplete-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+RRCSetupComplete-IEs ::=            SEQUENCE {
+    selectedPLMN-Identity               INTEGER (1..maxPLMN),
+    registeredAMF                       RegisteredAMF                                   OPTIONAL,
+    guami-Type                          ENUMERATED {native, mapped}                     OPTIONAL,
+    s-NSSAI-List                        SEQUENCE (SIZE (1..maxNrofS-NSSAI)) OF S-NSSAI  OPTIONAL,
+    dedicatedNAS-Message                DedicatedNAS-Message,
+    ng-5G-S-TMSI-Value                  CHOICE {
+        ng-5G-S-TMSI                        NG-5G-S-TMSI,
+        ng-5G-S-TMSI-Part2                  BIT STRING (SIZE (9))
+    }                                                                                   OPTIONAL,
+    lateNonCriticalExtension            OCTET STRING                                    OPTIONAL,
+    nonCriticalExtension                RRCSetupComplete-v1610-IEs                      OPTIONAL
+}
+
+RRCSetupComplete-v1610-IEs ::=      SEQUENCE {
+    iab-NodeIndication-r16              ENUMERATED {true}                               OPTIONAL,
+    idleMeasAvailable-r16               ENUMERATED {true}                               OPTIONAL,
+    ue-MeasurementsAvailable-r16        UE-MeasurementsAvailable-r16                    OPTIONAL,
+    mobilityHistoryAvail-r16            ENUMERATED {true}                               OPTIONAL,
+    mobilityState-r16                   ENUMERATED {normal, medium, high, spare}        OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                      OPTIONAL
+}
+
+RegisteredAMF ::=                   SEQUENCE {
+    plmn-Identity                       PLMN-Identity                                   OPTIONAL,
+    amf-Identifier                      AMF-Identifier
+}
+
+-- TAG-RRCSETUPCOMPLETE-STOP
+-- TAG-RRCSETUPREQUEST-START
+
+RRCSetupRequest ::=                 SEQUENCE {
+    rrcSetupRequest                     RRCSetupRequest-IEs
+}
+
+RRCSetupRequest-IEs ::=             SEQUENCE {
+    ue-Identity                         InitialUE-Identity,
+    establishmentCause                  EstablishmentCause,
+    spare                               BIT STRING (SIZE (1))
+}
+
+InitialUE-Identity ::=              CHOICE {
+    ng-5G-S-TMSI-Part1                  BIT STRING (SIZE (39)),
+    randomValue                         BIT STRING (SIZE (39))
+}
+
+EstablishmentCause ::=              ENUMERATED {
+                                        emergency, highPriorityAccess, mt-Access, mo-Signalling,
+                                        mo-Data, mo-VoiceCall, mo-VideoCall, mo-SMS, mps-PriorityAccess, mcs-PriorityAccess,
+                                        spare6, spare5, spare4, spare3, spare2, spare1}
+
+-- TAG-RRCSETUPREQUEST-STOP
+-- TAG-RRCSYSTEMINFOREQUEST-START
+
+RRCSystemInfoRequest ::=            SEQUENCE {
+    criticalExtensions                  CHOICE {
+        rrcSystemInfoRequest                RRCSystemInfoRequest-IEs,
+        criticalExtensionsFuture-r16        CHOICE {
+            rrcPosSystemInfoRequest-r16         RRC-PosSystemInfoRequest-r16-IEs,
+            criticalExtensionsFuture            SEQUENCE {}
+        }
+    }
+}
+
+RRCSystemInfoRequest-IEs ::=    SEQUENCE {
+    requested-SI-List                   BIT STRING (SIZE (maxSI-Message)),  --32bits
+    spare                               BIT STRING (SIZE (12))
+}
+
+RRC-PosSystemInfoRequest-r16-IEs ::=  SEQUENCE {
+    requestedPosSI-List                   BIT STRING (SIZE (maxSI-Message)),  --32bits
+    spare                                 BIT STRING (SIZE (11))
+}
+
+-- TAG-RRCSYSTEMINFOREQUEST-STOP
+-- TAG-SCGFAILUREINFORMATION-START
+
+SCGFailureInformation ::=                   SEQUENCE {
+    criticalExtensions                           CHOICE {
+        scgFailureInformation                        SCGFailureInformation-IEs,
+        criticalExtensionsFuture                    SEQUENCE {}
+    }
+}
+
+SCGFailureInformation-IEs ::=            SEQUENCE {
+    failureReportSCG                         FailureReportSCG                    OPTIONAL,
+    nonCriticalExtension                     SCGFailureInformation-v1590-IEs     OPTIONAL
+}
+
+SCGFailureInformation-v1590-IEs ::=       SEQUENCE {
+    lateNonCriticalExtension                OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                    SEQUENCE {}                         OPTIONAL
+}
+
+FailureReportSCG ::=                       SEQUENCE {
+    failureType                                    ENUMERATED {
+                                                               t310-Expiry, randomAccessProblem,
+                                                               rlc-MaxNumRetx,
+                                                               synchReconfigFailureSCG, scg-ReconfigFailure,
+                                                               srb3-IntegrityFailure, other-r16, spare1},
+    measResultFreqList                          MeasResultFreqList                                                      OPTIONAL,
+    measResultSCG-Failure                      OCTET STRING (CONTAINING MeasResultSCG-Failure)                OPTIONAL,
+    ...,
+    [[
+    locationInfo-r16                            LocationInfo-r16            OPTIONAL,
+   failureType-v1610                        ENUMERATED {scg-lbtFailure-r16, beamFailureRecoveryFailure-r16,
+                                                        t312-Expiry-r16, bh-RLF-r16, spare4, spare3, spare2, spare1} OPTIONAL
+    ]]
+}
+
+MeasResultFreqList ::=                   SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2NR
+
+
+-- TAG-SCGFAILUREINFORMATION-STOP
+-- TAG-SCGFAILUREINFORMATIONEUTRA-START
+
+SCGFailureInformationEUTRA ::=                SEQUENCE {
+    criticalExtensions                                CHOICE {
+        scgFailureInformationEUTRA                       SCGFailureInformationEUTRA-IEs,
+        criticalExtensionsFuture                          SEQUENCE {}
+    }
+}
+
+SCGFailureInformationEUTRA-IEs ::=           SEQUENCE {
+    failureReportSCG-EUTRA                           FailureReportSCG-EUTRA                      OPTIONAL,
+    nonCriticalExtension                              SCGFailureInformationEUTRA-v1590-IEs                                    OPTIONAL
+}
+
+SCGFailureInformationEUTRA-v1590-IEs ::=  SEQUENCE {
+    lateNonCriticalExtension                  OCTET STRING            OPTIONAL,
+    nonCriticalExtension                               SEQUENCE {}                  OPTIONAL
+}
+
+FailureReportSCG-EUTRA ::=                       SEQUENCE {
+    failureType                                           ENUMERATED {
+                                                                       t313-Expiry, randomAccessProblem,rlc-MaxNumRetx,
+                                                                             scg-ChangeFailure,scg-lbtFailure-r16,
+                                                                             beamFailureRecoveryFailure-r16, t312-Expiry-r16, spare},
+    measResultFreqListMRDC                             MeasResultFreqListFailMRDC                                                   OPTIONAL,
+    measResultSCG-FailureMRDC                         OCTET STRING                                                         OPTIONAL,
+    ...,
+    [[
+    locationInfo-r16                                    LocationInfo-r16                                                         OPTIONAL
+    ]]
+}
+
+MeasResultFreqListFailMRDC ::=      SEQUENCE (SIZE (1.. maxFreq)) OF MeasResult2EUTRA
+
+-- TAG-SCGFAILUREINFORMATIONEUTRA-STOP
+-- TAG-SECURITYMODECOMMAND-START
+
+SecurityModeCommand ::=             SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        securityModeCommand                 SecurityModeCommand-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+SecurityModeCommand-IEs ::=         SEQUENCE {
+    securityConfigSMC                   SecurityConfigSMC,
+
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                                              OPTIONAL
+}
+
+SecurityConfigSMC ::=               SEQUENCE {
+    securityAlgorithmConfig             SecurityAlgorithmConfig,
+    ...
+}
+
+-- TAG-SECURITYMODECOMMAND-STOP
+-- TAG-SECURITYMODECOMPLETE-START
+
+SecurityModeComplete ::=            SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        securityModeComplete                SecurityModeComplete-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+SecurityModeComplete-IEs ::=        SEQUENCE {
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-SECURITYMODECOMPLETE-STOP
+-- TAG-SECURITYMODEFAILURE-START
+
+SecurityModeFailure ::=             SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        securityModeFailure                 SecurityModeFailure-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+SecurityModeFailure-IEs ::=         SEQUENCE {
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-SECURITYMODEFAILURE-STOP
+-- TAG-SIB1-START
+
+SIB1 ::=        SEQUENCE {
+    cellSelectionInfo                   SEQUENCE {
+        q-RxLevMin                          Q-RxLevMin,
+        q-RxLevMinOffset                    INTEGER (1..8)                                              OPTIONAL,   -- Need S
+        q-RxLevMinSUL                       Q-RxLevMin                                                  OPTIONAL,   -- Need R
+        q-QualMin                           Q-QualMin                                                   OPTIONAL,   -- Need S
+        q-QualMinOffset                     INTEGER (1..8)                                              OPTIONAL    -- Need S
+    }                                                                                                   OPTIONAL,   -- Cond Standalone
+    cellAccessRelatedInfo               CellAccessRelatedInfo,
+    connEstFailureControl               ConnEstFailureControl                                           OPTIONAL,   -- Need R
+    si-SchedulingInfo                   SI-SchedulingInfo                                               OPTIONAL,   -- Need R
+    servingCellConfigCommon             ServingCellConfigCommonSIB                                      OPTIONAL,   -- Need R
+    ims-EmergencySupport                ENUMERATED {true}                                               OPTIONAL,   -- Need R
+    eCallOverIMS-Support                ENUMERATED {true}                                               OPTIONAL,   -- Need R
+    ue-TimersAndConstants               UE-TimersAndConstants                                           OPTIONAL,   -- Need R
+    uac-BarringInfo                     SEQUENCE {
+        uac-BarringForCommon                UAC-BarringPerCatList                                           OPTIONAL,   -- Need S
+        uac-BarringPerPLMN-List             UAC-BarringPerPLMN-List                                         OPTIONAL,   -- Need S
+        uac-BarringInfoSetList              UAC-BarringInfoSetList,
+        uac-AccessCategory1-SelectionAssistanceInfo CHOICE {
+            plmnCommon                           UAC-AccessCategory1-SelectionAssistanceInfo,
+            individualPLMNList                   SEQUENCE (SIZE (2..maxPLMN)) OF UAC-AccessCategory1-SelectionAssistanceInfo
+        }                                                                                                   OPTIONAL    -- Need S
+    }                                                                                                   OPTIONAL,   -- Need R
+    useFullResumeID                     ENUMERATED {true}                                               OPTIONAL,   -- Need R
+    lateNonCriticalExtension            OCTET STRING                                                    OPTIONAL,
+    nonCriticalExtension                SIB1-v1610-IEs                                                  OPTIONAL
+}
+
+SIB1-v1610-IEs ::=               SEQUENCE {
+    idleModeMeasurementsEUTRA-r16    ENUMERATED{true}                                                   OPTIONAL,  -- Need R
+    idleModeMeasurementsNR-r16       ENUMERATED{true}                                                   OPTIONAL,  -- Need R
+    posSI-SchedulingInfo-r16         PosSI-SchedulingInfo-r16                                           OPTIONAL,  -- Need R
+    nonCriticalExtension             SIB1-v1630-IEs                                                     OPTIONAL
+}
+
+SIB1-v1630-IEs ::=               SEQUENCE {
+    uac-BarringInfo-v1630            SEQUENCE {
+        uac-AC1-SelectAssistInfo-r16     SEQUENCE (SIZE (2..maxPLMN)) OF UAC-AC1-SelectAssistInfo-r16
+    }                                                                                                   OPTIONAL,  -- Need R
+    nonCriticalExtension             SEQUENCE {}                                                        OPTIONAL
+}
+
+UAC-AccessCategory1-SelectionAssistanceInfo ::=    ENUMERATED {a, b, c}
+
+UAC-AC1-SelectAssistInfo-r16 ::=     ENUMERATED {a, b, c, notConfigured}
+
+-- TAG-SIB1-STOP
+-- TAG-SIDELINKUEINFORMATIONNR-START
+
+SidelinkUEInformationNR-r16::=         SEQUENCE {
+    criticalExtensions                  CHOICE {
+        sidelinkUEInformationNR-r16         SidelinkUEInformationNR-r16-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+SidelinkUEInformationNR-r16-IEs ::=    SEQUENCE {
+    sl-RxInterestedFreqList-r16            SL-InterestedFreqList-r16           OPTIONAL,
+    sl-TxResourceReqList-r16               SL-TxResourceReqList-r16            OPTIONAL,
+    sl-FailureList-r16                     SL-FailureList-r16                  OPTIONAL,
+    lateNonCriticalExtension               OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                   SEQUENCE {}                         OPTIONAL
+}
+
+SL-InterestedFreqList-r16 ::=          SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF INTEGER (1..maxNrofFreqSL-r16)
+
+SL-TxResourceReqList-r16 ::=           SEQUENCE (SIZE (1..maxNrofSL-Dest-r16)) OF SL-TxResourceReq-r16
+
+SL-TxResourceReq-r16 ::=               SEQUENCE {
+    sl-DestinationIdentity-r16             SL-DestinationIdentity-r16,
+    sl-CastType-r16                        ENUMERATED {broadcast, groupcast, unicast, spare1},
+    sl-RLC-ModeIndicationList-r16          SEQUENCE (SIZE (1.. maxNrofSLRB-r16)) OF SL-RLC-ModeIndication-r16         OPTIONAL,
+    sl-QoS-InfoList-r16                    SEQUENCE (SIZE (1..maxNrofSL-QFIsPerDest-r16)) OF SL-QoS-Info-r16          OPTIONAL,
+    sl-TypeTxSyncList-r16                  SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF SL-TypeTxSync-r16                OPTIONAL,
+    sl-TxInterestedFreqList-r16            SL-TxInterestedFreqList-r16                                                OPTIONAL,
+    sl-CapabilityInformationSidelink-r16   OCTET STRING                                                               OPTIONAL
+}
+
+SL-TxInterestedFreqList-r16 ::=        SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF INTEGER (1..maxNrofFreqSL-r16)
+
+SL-QoS-Info-r16 ::=                    SEQUENCE {
+    sl-QoS-FlowIdentity-r16               SL-QoS-FlowIdentity-r16,
+    sl-QoS-Profile-r16                    SL-QoS-Profile-r16                                                          OPTIONAL
+}
+
+SL-RLC-ModeIndication-r16 ::=          SEQUENCE {
+    sl-Mode-r16                            CHOICE  {
+        sl-AM-Mode-r16                         NULL,
+        sl-UM-Mode-r16                         NULL
+    },
+    sl-QoS-InfoList-r16                SEQUENCE (SIZE (1..maxNrofSL-QFIsPerDest-r16)) OF SL-QoS-Info-r16
+}
+
+SL-FailureList-r16 ::=                 SEQUENCE (SIZE (1..maxNrofSL-Dest-r16)) OF SL-Failure-r16
+
+SL-Failure-r16 ::=                     SEQUENCE {
+    sl-DestinationIdentity-r16             SL-DestinationIdentity-r16,
+    sl-Failure-r16                         ENUMERATED {rlf,configFailure, spare6, spare5, spare4, spare3, spare2, spare1}
+}
+
+-- TAG-SIDELINKUEINFORMATIONNR-STOP
+-- TAG-SYSTEMINFORMATION-START
+
+SystemInformation ::=               SEQUENCE {
+    criticalExtensions                  CHOICE {
+        systemInformation                   SystemInformation-IEs,
+        criticalExtensionsFuture-r16    CHOICE {
+            posSystemInformation-r16        PosSystemInformation-r16-IEs,
+            criticalExtensionsFuture        SEQUENCE {}
+        }
+    }
+}
+
+SystemInformation-IEs ::=           SEQUENCE {
+    sib-TypeAndInfo                     SEQUENCE (SIZE (1..maxSIB)) OF CHOICE {
+        sib2                                SIB2,
+        sib3                                SIB3,
+        sib4                                SIB4,
+        sib5                                SIB5,
+        sib6                                SIB6,
+        sib7                                SIB7,
+        sib8                                SIB8,
+        sib9                                SIB9,
+        ...,
+        sib10-v1610                         SIB10-r16,
+        sib11-v1610                         SIB11-r16,
+        sib12-v1610                         SIB12-r16,
+        sib13-v1610                         SIB13-r16,
+        sib14-v1610                         SIB14-r16
+    },
+
+    lateNonCriticalExtension            OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                SEQUENCE {}                         OPTIONAL
+}
+
+-- TAG-SYSTEMINFORMATION-STOP
+-- TAG-UEASSISTANCEINFORMATION-START
+
+UEAssistanceInformation ::=         SEQUENCE {
+    criticalExtensions                  CHOICE {
+        ueAssistanceInformation             UEAssistanceInformation-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+UEAssistanceInformation-IEs ::=     SEQUENCE {
+    delayBudgetReport                   DelayBudgetReport                   OPTIONAL,
+    lateNonCriticalExtension            OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                UEAssistanceInformation-v1540-IEs   OPTIONAL
+}
+
+DelayBudgetReport::=                CHOICE {
+    type1                               ENUMERATED {
+                                            msMinus1280, msMinus640, msMinus320, msMinus160,msMinus80, msMinus60, msMinus40,
+                                            msMinus20, ms0, ms20,ms40, ms60, ms80, ms160, ms320, ms640, ms1280},
+    ...
+}
+
+UEAssistanceInformation-v1540-IEs ::= SEQUENCE {
+    overheatingAssistance               OverheatingAssistance               OPTIONAL,
+    nonCriticalExtension                UEAssistanceInformation-v1610-IEs   OPTIONAL
+}
+
+OverheatingAssistance ::=           SEQUENCE {
+    reducedMaxCCs                       ReducedMaxCCs-r16                   OPTIONAL,
+    reducedMaxBW-FR1                    ReducedMaxBW-FRx-r16                OPTIONAL,
+    reducedMaxBW-FR2                    ReducedMaxBW-FRx-r16                OPTIONAL,
+    reducedMaxMIMO-LayersFR1            SEQUENCE {
+        reducedMIMO-LayersFR1-DL            MIMO-LayersDL,
+        reducedMIMO-LayersFR1-UL            MIMO-LayersUL
+    } OPTIONAL,
+    reducedMaxMIMO-LayersFR2            SEQUENCE {
+        reducedMIMO-LayersFR2-DL            MIMO-LayersDL,
+        reducedMIMO-LayersFR2-UL            MIMO-LayersUL
+    } OPTIONAL
+}
+
+ReducedAggregatedBandwidth ::= ENUMERATED {mhz0, mhz10, mhz20, mhz30, mhz40, mhz50, mhz60, mhz80, mhz100, mhz200, mhz300, mhz400}
+
+UEAssistanceInformation-v1610-IEs ::= SEQUENCE {
+    idc-Assistance-r16                  IDC-Assistance-r16                  OPTIONAL,
+    drx-Preference-r16                  DRX-Preference-r16                  OPTIONAL,
+    maxBW-Preference-r16                MaxBW-Preference-r16                OPTIONAL,
+    maxCC-Preference-r16                MaxCC-Preference-r16                OPTIONAL,
+    maxMIMO-LayerPreference-r16         MaxMIMO-LayerPreference-r16         OPTIONAL,
+    minSchedulingOffsetPreference-r16   MinSchedulingOffsetPreference-r16   OPTIONAL,
+    releasePreference-r16               ReleasePreference-r16               OPTIONAL,
+    sl-UE-AssistanceInformationNR-r16   SL-UE-AssistanceInformationNR-r16   OPTIONAL,
+    referenceTimeInfoPreference-r16     BOOLEAN                             OPTIONAL,
+    nonCriticalExtension                SEQUENCE {}                         OPTIONAL
+}
+
+IDC-Assistance-r16 ::=                  SEQUENCE {
+    affectedCarrierFreqList-r16             AffectedCarrierFreqList-r16               OPTIONAL,
+    affectedCarrierFreqCombList-r16         AffectedCarrierFreqCombList-r16           OPTIONAL,
+    ...
+}
+
+AffectedCarrierFreqList-r16 ::= SEQUENCE (SIZE (1.. maxFreqIDC-r16)) OF AffectedCarrierFreq-r16
+
+AffectedCarrierFreq-r16 ::=     SEQUENCE {
+    carrierFreq-r16                 ARFCN-ValueNR,
+    interferenceDirection-r16       ENUMERATED {nr, other, both, spare}
+}
+
+AffectedCarrierFreqCombList-r16 ::= SEQUENCE (SIZE (1..maxCombIDC-r16)) OF AffectedCarrierFreqComb-r16
+
+AffectedCarrierFreqComb-r16 ::=     SEQUENCE {
+    affectedCarrierFreqComb-r16         SEQUENCE (SIZE (2..maxNrofServingCells)) OF  ARFCN-ValueNR    OPTIONAL,
+    victimSystemType-r16                VictimSystemType-r16
+}
+
+VictimSystemType-r16 ::=    SEQUENCE {
+    gps-r16                     ENUMERATED {true}        OPTIONAL,
+    glonass-r16                 ENUMERATED {true}        OPTIONAL,
+    bds-r16                     ENUMERATED {true}        OPTIONAL,
+    galileo-r16                 ENUMERATED {true}        OPTIONAL,
+    navIC-r16                   ENUMERATED {true}        OPTIONAL,
+    wlan-r16                    ENUMERATED {true}        OPTIONAL,
+    bluetooth-r16               ENUMERATED {true}        OPTIONAL,
+    ...
+}
+
+DRX-Preference-r16 ::=              SEQUENCE {
+    preferredDRX-InactivityTimer-r16    ENUMERATED {
+                                            ms0, ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60, ms80,
+                                            ms100, ms200, ms300, ms500, ms750, ms1280, ms1920, ms2560, spare9, spare8,
+                                            spare7, spare6, spare5, spare4, spare3, spare2, spare1} OPTIONAL,
+    preferredDRX-LongCycle-r16          ENUMERATED {
+                                            ms10, ms20, ms32, ms40, ms60, ms64, ms70, ms80, ms128, ms160, ms256, ms320, ms512,
+                                            ms640, ms1024, ms1280, ms2048, ms2560, ms5120, ms10240, spare12, spare11, spare10,
+                                            spare9, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 } OPTIONAL,
+    preferredDRX-ShortCycle-r16         ENUMERATED {
+                                            ms2, ms3, ms4, ms5, ms6, ms7, ms8, ms10, ms14, ms16, ms20, ms30, ms32,
+                                            ms35, ms40, ms64, ms80, ms128, ms160, ms256, ms320, ms512, ms640, spare9,
+                                            spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 } OPTIONAL,
+    preferredDRX-ShortCycleTimer-r16    INTEGER (1..16)    OPTIONAL
+}
+
+MaxBW-Preference-r16 ::=            SEQUENCE {
+    reducedMaxBW-FR1-r16                ReducedMaxBW-FRx-r16                     OPTIONAL,
+    reducedMaxBW-FR2-r16                ReducedMaxBW-FRx-r16                     OPTIONAL
+}
+
+MaxCC-Preference-r16 ::=            SEQUENCE {
+    reducedMaxCCs-r16                   ReducedMaxCCs-r16                        OPTIONAL
+}
+
+MaxMIMO-LayerPreference-r16 ::=     SEQUENCE {
+    reducedMaxMIMO-LayersFR1-r16        SEQUENCE {
+        reducedMIMO-LayersFR1-DL-r16        INTEGER (1..8),
+        reducedMIMO-LayersFR1-UL-r16        INTEGER (1..4)
+    } OPTIONAL,
+    reducedMaxMIMO-LayersFR2-r16        SEQUENCE {
+        reducedMIMO-LayersFR2-DL-r16        INTEGER (1..8),
+        reducedMIMO-LayersFR2-UL-r16        INTEGER (1..4)
+    } OPTIONAL
+}
+
+MinSchedulingOffsetPreference-r16 ::= SEQUENCE {
+    preferredK0-r16                       SEQUENCE {
+        preferredK0-SCS-15kHz-r16             ENUMERATED {sl1, sl2, sl4, sl6}              OPTIONAL,
+        preferredK0-SCS-30kHz-r16             ENUMERATED {sl1, sl2, sl4, sl6}              OPTIONAL,
+        preferredK0-SCS-60kHz-r16             ENUMERATED {sl2, sl4, sl8, sl12}             OPTIONAL,
+        preferredK0-SCS-120kHz-r16            ENUMERATED {sl2, sl4, sl8, sl12}             OPTIONAL
+    }                                                                                  OPTIONAL,
+    preferredK2-r16                       SEQUENCE {
+        preferredK2-SCS-15kHz-r16             ENUMERATED {sl1, sl2, sl4, sl6}             OPTIONAL,
+        preferredK2-SCS-30kHz-r16             ENUMERATED {sl1, sl2, sl4, sl6}             OPTIONAL,
+        preferredK2-SCS-60kHz-r16             ENUMERATED {sl2, sl4, sl8, sl12}            OPTIONAL,
+        preferredK2-SCS-120kHz-r16            ENUMERATED {sl2, sl4, sl8, sl12}            OPTIONAL
+    }                                                                                 OPTIONAL
+}
+
+ReleasePreference-r16 ::=           SEQUENCE {
+    preferredRRC-State-r16              ENUMERATED {idle, inactive, connected, outOfConnected}
+}
+
+ReducedMaxBW-FRx-r16 ::=            SEQUENCE {
+    reducedBW-DL-r16                    ReducedAggregatedBandwidth,
+    reducedBW-UL-r16                    ReducedAggregatedBandwidth
+}
+
+ReducedMaxCCs-r16 ::=               SEQUENCE {
+    reducedCCsDL-r16                    INTEGER (0..31),
+    reducedCCsUL-r16                    INTEGER (0..31)
+}
+
+SL-UE-AssistanceInformationNR-r16 ::= SEQUENCE (SIZE (1..maxNrofTrafficPattern-r16)) OF SL-TrafficPatternInfo-r16
+
+SL-TrafficPatternInfo-r16::=          SEQUENCE {
+    trafficPeriodicity-r16                ENUMERATED {ms20, ms50, ms100, ms200, ms300, ms400, ms500, ms600, ms700, ms800, ms900, ms1000},
+    timingOffset-r16                      INTEGER (0..10239),
+    messageSize-r16                       BIT STRING (SIZE (8)),
+    sl-QoS-FlowIdentity-r16               SL-QoS-FlowIdentity-r16
+}
+
+-- TAG-UEASSISTANCEINFORMATION-STOP
+-- TAG-UECAPABILITYENQUIRY-START
+
+UECapabilityEnquiry ::=             SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        ueCapabilityEnquiry                 UECapabilityEnquiry-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+UECapabilityEnquiry-IEs ::=         SEQUENCE {
+    ue-CapabilityRAT-RequestList        UE-CapabilityRAT-RequestList,
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    ue-CapabilityEnquiryExt             OCTET STRING (CONTAINING UECapabilityEnquiry-v1560-IEs)                 OPTIONAL
+}
+
+UECapabilityEnquiry-v1560-IEs ::=   SEQUENCE {
+    capabilityRequestFilterCommon       UE-CapabilityRequestFilterCommon                                        OPTIONAL, -- Need N
+    nonCriticalExtension                UECapabilityEnquiry-v1610-IEs                                           OPTIONAL
+}
+
+UECapabilityEnquiry-v1610-IEs ::=   SEQUENCE {
+    rrc-SegAllowed-r16                    ENUMERATED {enabled}           OPTIONAL, -- Need N
+    nonCriticalExtension                SEQUENCE {}                    OPTIONAL
+}
+
+-- TAG-UECAPABILITYENQUIRY-STOP
+-- TAG-UECAPABILITYINFORMATION-START
+
+UECapabilityInformation ::=         SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        ueCapabilityInformation             UECapabilityInformation-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+UECapabilityInformation-IEs ::=     SEQUENCE {
+    ue-CapabilityRAT-ContainerList      UE-CapabilityRAT-ContainerList                                          OPTIONAL,
+
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-UECAPABILITYINFORMATION-STOP
+-- TAG-UEINFORMATIONREQUEST-START
+
+UEInformationRequest-r16 ::=     SEQUENCE {
+    rrc-TransactionIdentifier        RRC-TransactionIdentifier,
+    criticalExtensions               CHOICE {
+        ueInformationRequest-r16         UEInformationRequest-r16-IEs,
+        criticalExtensionsFuture         SEQUENCE {}
+    }
+}
+
+UEInformationRequest-r16-IEs ::= SEQUENCE {
+    idleModeMeasurementReq-r16       ENUMERATED{true}                         OPTIONAL, -- Need N
+    logMeasReportReq-r16             ENUMERATED {true}                        OPTIONAL, -- Need N
+    connEstFailReportReq-r16         ENUMERATED {true}                        OPTIONAL, -- Need N
+    ra-ReportReq-r16                 ENUMERATED {true}                        OPTIONAL, -- Need N
+    rlf-ReportReq-r16                ENUMERATED {true}                        OPTIONAL, -- Need N
+    mobilityHistoryReportReq-r16       ENUMERATED {true}                        OPTIONAL, -- Need N
+    lateNonCriticalExtension         OCTET STRING                             OPTIONAL,
+    nonCriticalExtension             SEQUENCE {}                              OPTIONAL
+}
+
+-- TAG-UEINFORMATIONREQUEST-STOP
+-- TAG-UEINFORMATIONRESPONSE-START
+
+UEInformationResponse-r16 ::=        SEQUENCE {
+    rrc-TransactionIdentifier            RRC-TransactionIdentifier,
+    criticalExtensions                   CHOICE {
+        ueInformationResponse-r16            UEInformationResponse-r16-IEs,
+        criticalExtensionsFuture             SEQUENCE {}
+    }
+}
+
+UEInformationResponse-r16-IEs ::=    SEQUENCE {
+    measResultIdleEUTRA-r16              MeasResultIdleEUTRA-r16             OPTIONAL,
+    measResultIdleNR-r16                 MeasResultIdleNR-r16                OPTIONAL,
+    logMeasReport-r16                    LogMeasReport-r16                   OPTIONAL,
+    connEstFailReport-r16                ConnEstFailReport-r16               OPTIONAL,
+    ra-ReportList-r16                    RA-ReportList-r16                   OPTIONAL,
+    rlf-Report-r16                       RLF-Report-r16                      OPTIONAL,
+    mobilityHistoryReport-r16            MobilityHistoryReport-r16           OPTIONAL,
+    lateNonCriticalExtension             OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                 SEQUENCE {}                         OPTIONAL
+}
+
+LogMeasReport-r16 ::=                SEQUENCE {
+    absoluteTimeStamp-r16                AbsoluteTimeInfo-r16,
+    traceReference-r16                   TraceReference-r16,
+    traceRecordingSessionRef-r16         OCTET STRING (SIZE (2)),
+    tce-Id-r16                           OCTET STRING (SIZE (1)),
+    logMeasInfoList-r16                  LogMeasInfoList-r16,
+    logMeasAvailable-r16                 ENUMERATED {true}                   OPTIONAL,
+    logMeasAvailableBT-r16               ENUMERATED {true}                   OPTIONAL,
+    logMeasAvailableWLAN-r16             ENUMERATED {true}                   OPTIONAL,
+    ...
+}
+
+LogMeasInfoList-r16 ::=              SEQUENCE (SIZE (1..maxLogMeasReport-r16)) OF LogMeasInfo-r16
+
+LogMeasInfo-r16 ::=                  SEQUENCE {
+    locationInfo-r16                     LocationInfo-r16                    OPTIONAL,
+    relativeTimeStamp-r16                INTEGER (0..7200),
+    servCellIdentity-r16                 CGI-Info-Logging-r16                OPTIONAL,
+    measResultServingCell-r16            MeasResultServingCell-r16           OPTIONAL,
+    measResultNeighCells-r16             SEQUENCE {
+        measResultNeighCellListNR            MeasResultListLogging2NR-r16        OPTIONAL,
+        measResultNeighCellListEUTRA         MeasResultList2EUTRA-r16            OPTIONAL
+    },
+    anyCellSelectionDetected-r16         ENUMERATED {true}                   OPTIONAL,
+    ...
+}
+
+ConnEstFailReport-r16 ::=            SEQUENCE {
+    measResultFailedCell-r16             MeasResultFailedCell-r16,
+    locationInfo-r16                     LocationInfo-r16                    OPTIONAL,
+    measResultNeighCells-r16             SEQUENCE {
+        measResultNeighCellListNR            MeasResultList2NR-r16               OPTIONAL,
+        measResultNeighCellListEUTRA         MeasResultList2EUTRA-r16            OPTIONAL
+    },
+    numberOfConnFail-r16                 INTEGER (1..8),
+    perRAInfoList-r16                            PerRAInfoList-r16,
+    timeSinceFailure-r16                 TimeSinceFailure-r16,
+    ...
+}
+
+MeasResultServingCell-r16 ::=        SEQUENCE {
+    resultsSSB-Cell                      MeasQuantityResults,
+    resultsSSB                           SEQUENCE{
+        best-ssb-Index                       SSB-Index,
+        best-ssb-Results                     MeasQuantityResults,
+        numberOfGoodSSB                      INTEGER (1..maxNrofSSBs-r16)
+    }                                                                        OPTIONAL
+}
+
+MeasResultFailedCell-r16 ::=         SEQUENCE {
+    cgi-Info                             CGI-Info-Logging-r16,
+    measResult-r16                       SEQUENCE {
+        cellResults-r16                      SEQUENCE{
+            resultsSSB-Cell-r16                  MeasQuantityResults
+        },
+        rsIndexResults-r16                   SEQUENCE{
+            resultsSSB-Indexes-r16               ResultsPerSSB-IndexList
+        }
+    }
+}
+
+RA-ReportList-r16 ::= SEQUENCE (SIZE (1..maxRAReport-r16)) OF RA-Report-r16
+
+RA-Report-r16 ::=                    SEQUENCE {
+    cellId-r16                           CHOICE {
+        cellGlobalId-r16                     CGI-Info-Logging-r16,
+        pci-arfcn-r16                        SEQUENCE {
+            physCellId-r16                       PhysCellId,
+            carrierFreq-r16                      ARFCN-ValueNR
+        }
+    },
+    ra-InformationCommon-r16             RA-InformationCommon-r16                         OPTIONAL,
+    raPurpose-r16                        ENUMERATED {accessRelated, beamFailureRecovery, reconfigurationWithSync, ulUnSynchronized,
+                                                    schedulingRequestFailure, noPUCCHResourceAvailable, requestForOtherSI,
+                                                    spare9, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1},
+    ...
+}
+
+RA-InformationCommon-r16 ::=         SEQUENCE {
+    absoluteFrequencyPointA-r16          ARFCN-ValueNR,
+    locationAndBandwidth-r16             INTEGER (0..37949),
+    subcarrierSpacing-r16                SubcarrierSpacing,
+    msg1-FrequencyStart-r16              INTEGER (0..maxNrofPhysicalResourceBlocks-1)     OPTIONAL,
+    msg1-FrequencyStartCFRA-r16          INTEGER (0..maxNrofPhysicalResourceBlocks-1)     OPTIONAL,
+    msg1-SubcarrierSpacing-r16           SubcarrierSpacing                                OPTIONAL,
+    msg1-SubcarrierSpacingCFRA-r16       SubcarrierSpacing                                OPTIONAL,
+    msg1-FDM-r16                         ENUMERATED {one, two, four, eight}               OPTIONAL,
+    msg1-FDMCFRA-r16                     ENUMERATED {one, two, four, eight}               OPTIONAL,
+    perRAInfoList-r16                    PerRAInfoList-r16,
+    ...
+}
+
+PerRAInfoList-r16 ::= SEQUENCE (SIZE (1..200)) OF PerRAInfo-r16
+
+PerRAInfo-r16 ::=                    CHOICE {
+    perRASSBInfoList-r16                 PerRASSBInfo-r16,
+    perRACSI-RSInfoList-r16              PerRACSI-RSInfo-r16
+}
+
+PerRASSBInfo-r16 ::=                 SEQUENCE {
+    ssb-Index-r16                        SSB-Index,
+    numberOfPreamblesSentOnSSB-r16       INTEGER (1..200),
+    perRAAttemptInfoList-r16             PerRAAttemptInfoList-r16
+}
+
+PerRACSI-RSInfo-r16 ::=              SEQUENCE {
+    csi-RS-Index-r16                     CSI-RS-Index,
+    numberOfPreamblesSentOnCSI-RS-r16    INTEGER (1..200)
+}
+
+PerRAAttemptInfoList-r16 ::=         SEQUENCE (SIZE (1..200)) OF PerRAAttemptInfo-r16
+
+PerRAAttemptInfo-r16 ::=             SEQUENCE {
+    contentionDetected-r16               BOOLEAN                OPTIONAL,
+    dlRSRPAboveThreshold-r16             BOOLEAN                OPTIONAL,
+    ...
+}
+
+RLF-Report-r16 ::=                   CHOICE {
+    nr-RLF-Report-r16                    SEQUENCE {
+        measResultLastServCell-r16           MeasResultRLFNR-r16,
+        measResultNeighCells-r16             SEQUENCE {
+            measResultListNR-r16                 MeasResultList2NR-r16       OPTIONAL,
+            measResultListEUTRA-r16              MeasResultList2EUTRA-r16    OPTIONAL
+        }                                                OPTIONAL,
+        c-RNTI-r16                           RNTI-Value,
+        previousPCellId-r16                  CHOICE {
+            nrPreviousCell-r16                   CGI-Info-Logging-r16,
+            eutraPreviousCell-r16                CGI-InfoEUTRALogging
+        }                                                                    OPTIONAL,
+        failedPCellId-r16                    CHOICE {
+            nrFailedPCellId-r16                  CHOICE {
+                cellGlobalId-r16                     CGI-Info-Logging-r16,
+                pci-arfcn-r16                        SEQUENCE {
+                    physCellId-r16                       PhysCellId,
+                    carrierFreq-r16                      ARFCN-ValueNR
+                }
+            },
+            eutraFailedPCellId-r16           CHOICE {
+                cellGlobalId-r16                 CGI-InfoEUTRALogging,
+                pci-arfcn-r16                    SEQUENCE {
+                    physCellId-r16                   EUTRA-PhysCellId,
+                    carrierFreq-r16                  ARFCN-ValueEUTRA
+                }
+            }
+        },
+        reconnectCellId-r16                  CHOICE {
+            nrReconnectCellId-r16                CGI-Info-Logging-r16,
+            eutraReconnectCellId-r16             CGI-InfoEUTRALogging
+        }                                                                                        OPTIONAL,
+        timeUntilReconnection-16             TimeUntilReconnection-16                            OPTIONAL,
+        reestablishmentCellId-r16            CGI-Info-Logging-r16                                OPTIONAL,
+        timeConnFailure-r16                  INTEGER (0..1023)                                   OPTIONAL,
+        timeSinceFailure-r16                 TimeSinceFailure-r16,
+        connectionFailureType-r16            ENUMERATED {rlf, hof},
+        rlf-Cause-r16                        ENUMERATED {t310-Expiry, randomAccessProblem, rlc-MaxNumRetx,
+                                                         beamFailureRecoveryFailure, lbtFailure-r16,
+                                                         bh-rlfRecoveryFailure, spare2, spare1},
+        locationInfo-r16                     LocationInfo-r16                                    OPTIONAL,
+        noSuitableCellFound-r16              ENUMERATED {true}                                   OPTIONAL,
+        ra-InformationCommon-r16             RA-InformationCommon-r16                            OPTIONAL,
+        ...
+    },
+    eutra-RLF-Report-r16                 SEQUENCE {
+        failedPCellId-EUTRA                  CGI-InfoEUTRALogging,
+        measResult-RLF-Report-EUTRA-r16      OCTET STRING,
+        ...
+    }
+}
+
+MeasResultList2NR-r16 ::=            SEQUENCE(SIZE (1..maxFreq)) OF MeasResult2NR-r16
+MeasResultList2EUTRA-r16 ::=         SEQUENCE(SIZE (1..maxFreq)) OF MeasResult2EUTRA-r16
+
+MeasResult2NR-r16 ::=                SEQUENCE {
+    ssbFrequency-r16                     ARFCN-ValueNR                                           OPTIONAL,
+    refFreqCSI-RS-r16                    ARFCN-ValueNR                                           OPTIONAL,
+    measResultList-r16                   MeasResultListNR
+}
+
+MeasResultListLogging2NR-r16 ::=     SEQUENCE(SIZE (1..maxFreq)) OF MeasResultLogging2NR-r16
+
+MeasResultLogging2NR-r16 ::=         SEQUENCE {
+    carrierFreq-r16                      ARFCN-ValueNR,
+    measResultListLoggingNR-r16          MeasResultListLoggingNR-r16
+}
+
+MeasResultListLoggingNR-r16 ::=      SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultLoggingNR-r16
+
+MeasResultLoggingNR-r16 ::=          SEQUENCE {
+    physCellId-r16                       PhysCellId,
+    resultsSSB-Cell-r16                  MeasQuantityResults,
+    numberOfGoodSSB-r16                  INTEGER (1..maxNrofSSBs-r16) OPTIONAL
+}
+
+MeasResult2EUTRA-r16 ::=             SEQUENCE {
+    carrierFreq-r16                      ARFCN-ValueEUTRA,
+    measResultList-r16                   MeasResultListEUTRA
+}
+
+MeasResultRLFNR-r16 ::=              SEQUENCE {
+    measResult-r16                       SEQUENCE {
+        cellResults-r16                      SEQUENCE{
+            resultsSSB-Cell-r16                  MeasQuantityResults                             OPTIONAL,
+            resultsCSI-RS-Cell-r16               MeasQuantityResults                             OPTIONAL
+        },
+        rsIndexResults-r16                   SEQUENCE{
+            resultsSSB-Indexes-r16               ResultsPerSSB-IndexList                         OPTIONAL,
+            ssbRLMConfigBitmap-r16               BIT STRING (SIZE (64))                          OPTIONAL,
+            resultsCSI-RS-Indexes-r16            ResultsPerCSI-RS-IndexList                      OPTIONAL,
+            csi-rsRLMConfigBitmap-r16            BIT STRING (SIZE (96))                          OPTIONAL
+        }                                                                                    OPTIONAL
+    }
+}
+
+TimeSinceFailure-r16 ::= INTEGER (0..172800)
+
+MobilityHistoryReport-r16 ::= VisitedCellInfoList-r16
+
+TimeUntilReconnection-16 ::= INTEGER (0..172800)
+
+-- TAG-UEINFORMATIONRESPONSE-STOP
+-- TAG-ULDEDICATEDMESSAGESEGMENT-START
+
+ULDedicatedMessageSegment-r16 ::=       SEQUENCE {
+    criticalExtensions                      CHOICE {
+        ulDedicatedMessageSegment-r16           ULDedicatedMessageSegment-r16-IEs,
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+ULDedicatedMessageSegment-r16-IEs ::=     SEQUENCE {
+    segmentNumber-r16                         INTEGER (0..15),
+    rrc-MessageSegmentContainer-r16           OCTET STRING,
+    rrc-MessageSegmentType-r16                ENUMERATED {notLastSegment, lastSegment},
+    lateNonCriticalExtension                  OCTET STRING                                  OPTIONAL,
+    nonCriticalExtension                      SEQUENCE {}                                   OPTIONAL
+}
+
+-- TAG-ULDEDICATEDMESSAGESEGMENT-STOP
+-- TAG-ULINFORMATIONTRANSFER-START
+
+ULInformationTransfer ::=           SEQUENCE {
+    criticalExtensions                  CHOICE {
+        ulInformationTransfer               ULInformationTransfer-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+ULInformationTransfer-IEs ::=       SEQUENCE {
+    dedicatedNAS-Message                DedicatedNAS-Message                OPTIONAL,
+    lateNonCriticalExtension            OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                SEQUENCE {}                         OPTIONAL
+}
+
+-- TAG-ULINFORMATIONTRANSFER-STOP
+-- TAG-ULINFORMATIONTRANSFERIRAT-START
+
+ULInformationTransferIRAT-r16 ::=              SEQUENCE {
+    criticalExtensions                                CHOICE {
+        c1                                                   CHOICE {
+            ulInformationTransferIRAT-r16                    ULInformationTransferIRAT-r16-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture                     SEQUENCE {}
+    }
+}
+
+ULInformationTransferIRAT-r16-IEs ::=        SEQUENCE {
+    ul-DCCH-MessageEUTRA-r16                           OCTET STRING             OPTIONAL,
+    lateNonCriticalExtension                           OCTET STRING              OPTIONAL,
+    nonCriticalExtension                                 SEQUENCE {}               OPTIONAL
+}
+
+-- TAG-ULINFORMATIONTRANSFERIRAT-STOP
+-- TAG-ULINFORMATIONTRANSFERMRDC-START
+
+ULInformationTransferMRDC ::=               SEQUENCE {
+    criticalExtensions                          CHOICE {
+        c1                                          CHOICE {
+            ulInformationTransferMRDC                   ULInformationTransferMRDC-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+ULInformationTransferMRDC-IEs::=           SEQUENCE {
+    ul-DCCH-MessageNR                           OCTET STRING                    OPTIONAL,
+    ul-DCCH-MessageEUTRA                        OCTET STRING                    OPTIONAL,
+    lateNonCriticalExtension                    OCTET STRING                    OPTIONAL,
+    nonCriticalExtension                        SEQUENCE {}                     OPTIONAL
+}
+
+-- TAG-ULINFORMATIONTRANSFERMRDC-STOP
+-- TAG-SETUPRELEASE-START
+
+SetupRelease { ElementTypeParam } ::= CHOICE {
+    release         NULL,
+    setup           ElementTypeParam
+}
+
+-- TAG-SETUPRELEASE-STOP
+-- TAG-SIB2-START
+
+SIB2 ::=                            SEQUENCE {
+    cellReselectionInfoCommon           SEQUENCE {
+        nrofSS-BlocksToAverage              INTEGER (2..maxNrofSS-BlocksToAverage)          OPTIONAL,       -- Need S
+        absThreshSS-BlocksConsolidation     ThresholdNR                                     OPTIONAL,       -- Need S
+        rangeToBestCell                     RangeToBestCell                                 OPTIONAL,       -- Need R
+        q-Hyst                              ENUMERATED {
+                                                dB0, dB1, dB2, dB3, dB4, dB5, dB6, dB8, dB10,
+                                                dB12, dB14, dB16, dB18, dB20, dB22, dB24},
+        speedStateReselectionPars           SEQUENCE {
+            mobilityStateParameters             MobilityStateParameters,
+            q-HystSF                        SEQUENCE {
+                sf-Medium                       ENUMERATED {dB-6, dB-4, dB-2, dB0},
+                sf-High                         ENUMERATED {dB-6, dB-4, dB-2, dB0}
+            }
+        }                                                                                   OPTIONAL,       -- Need R
+    ...
+    },
+    cellReselectionServingFreqInfo      SEQUENCE {
+        s-NonIntraSearchP                   ReselectionThreshold                            OPTIONAL,       -- Need S
+        s-NonIntraSearchQ                   ReselectionThresholdQ                           OPTIONAL,       -- Need S
+        threshServingLowP                   ReselectionThreshold,
+        threshServingLowQ                   ReselectionThresholdQ                           OPTIONAL,       -- Need R
+        cellReselectionPriority             CellReselectionPriority,
+        cellReselectionSubPriority          CellReselectionSubPriority                      OPTIONAL,       -- Need R
+        ...
+    },
+    intraFreqCellReselectionInfo        SEQUENCE {
+        q-RxLevMin                          Q-RxLevMin,
+        q-RxLevMinSUL                       Q-RxLevMin                                      OPTIONAL,       -- Need R
+        q-QualMin                           Q-QualMin                                       OPTIONAL,       -- Need S
+        s-IntraSearchP                      ReselectionThreshold,
+        s-IntraSearchQ                      ReselectionThresholdQ                           OPTIONAL,       -- Need S
+        t-ReselectionNR                     T-Reselection,
+        frequencyBandList                   MultiFrequencyBandListNR-SIB                    OPTIONAL,       -- Need S
+        frequencyBandListSUL                MultiFrequencyBandListNR-SIB                    OPTIONAL,       -- Need R
+        p-Max                               P-Max                                           OPTIONAL,       -- Need S
+        smtc                                SSB-MTC                                         OPTIONAL,       -- Need S
+        ss-RSSI-Measurement                 SS-RSSI-Measurement                             OPTIONAL,       -- Need R
+        ssb-ToMeasure                       SSB-ToMeasure                                   OPTIONAL,       -- Need S
+        deriveSSB-IndexFromCell             BOOLEAN,
+        ...,
+        [[
+        t-ReselectionNR-SF                  SpeedStateScaleFactors                          OPTIONAL        -- Need N
+        ]],
+        [[
+        smtc2-LP-r16                        SSB-MTC2-LP-r16                                 OPTIONAL,        -- Need R
+        ssb-PositionQCL-Common-r16          SSB-PositionQCL-Relation-r16                    OPTIONAL         -- Cond SharedSpectrum
+        ]]
+    },
+    ...,
+    [[
+    relaxedMeasurement-r16              SEQUENCE {
+        lowMobilityEvaluation-r16           SEQUENCE {
+            s-SearchDeltaP-r16                  ENUMERATED {
+                                                    dB3, dB6, dB9, dB12, dB15,
+                                                    spare3, spare2, spare1},
+            t-SearchDeltaP-r16                  ENUMERATED {
+                                                    s5, s10, s20, s30, s60, s120, s180,
+                                                    s240, s300, spare7, spare6, spare5,
+                                                    spare4, spare3, spare2, spare1}
+        }                                                                                   OPTIONAL,       -- Need R
+        cellEdgeEvaluation-r16              SEQUENCE {
+            s-SearchThresholdP-r16              ReselectionThreshold,
+            s-SearchThresholdQ-r16              ReselectionThresholdQ                       OPTIONAL        -- Need R
+        }                                                                                   OPTIONAL,       -- Need R
+        combineRelaxedMeasCondition-r16     ENUMERATED {true}                               OPTIONAL,       -- Need R
+        highPriorityMeasRelax-r16           ENUMERATED {true}                               OPTIONAL        -- Need R
+    }                                                                                       OPTIONAL        -- Need R
+    ]]
+}
+
+RangeToBestCell    ::= Q-OffsetRange
+
+-- TAG-SIB2-STOP
+-- TAG-SIB3-START
+
+SIB3 ::=                            SEQUENCE {
+    intraFreqNeighCellList              IntraFreqNeighCellList                                          OPTIONAL,   -- Need R
+    intraFreqBlackCellList              IntraFreqBlackCellList                                          OPTIONAL,   -- Need R
+    lateNonCriticalExtension            OCTET STRING                                                    OPTIONAL,
+    ...,
+    [[
+    intraFreqNeighCellList-v1610        IntraFreqNeighCellList-v1610                                    OPTIONAL,   -- Need R
+    intraFreqWhiteCellList-r16          IntraFreqWhiteCellList-r16                                      OPTIONAL,   -- Cond SharedSpectrum2
+    intraFreqCAG-CellList-r16           SEQUENCE (SIZE (1..maxPLMN)) OF IntraFreqCAG-CellListPerPLMN-r16    OPTIONAL    -- Need R
+    ]]
+}
+
+
+IntraFreqNeighCellList ::=          SEQUENCE (SIZE (1..maxCellIntra)) OF IntraFreqNeighCellInfo
+
+IntraFreqNeighCellList-v1610::=     SEQUENCE (SIZE (1..maxCellIntra)) OF IntraFreqNeighCellInfo-v1610
+
+IntraFreqNeighCellInfo ::=          SEQUENCE {
+    physCellId                          PhysCellId,
+    q-OffsetCell                        Q-OffsetRange,
+    q-RxLevMinOffsetCell                INTEGER (1..8)                                  OPTIONAL,   -- Need R
+    q-RxLevMinOffsetCellSUL             INTEGER (1..8)                                  OPTIONAL,   -- Need R
+    q-QualMinOffsetCell                 INTEGER (1..8)                                  OPTIONAL,   -- Need R
+    ...
+}
+
+IntraFreqNeighCellInfo-v1610 ::=     SEQUENCE {
+    ssb-PositionQCL-r16                 SSB-PositionQCL-Relation-r16                    OPTIONAL   -- Cond SharedSpectrum2
+}
+
+IntraFreqBlackCellList ::=          SEQUENCE (SIZE (1..maxCellBlack)) OF PCI-Range
+
+IntraFreqWhiteCellList-r16 ::=      SEQUENCE (SIZE (1..maxCellWhite)) OF PCI-Range
+
+IntraFreqCAG-CellListPerPLMN-r16 ::= SEQUENCE {
+    plmn-IdentityIndex-r16               INTEGER (1..maxPLMN),
+    cag-CellList-r16                     SEQUENCE (SIZE (1..maxCAG-Cell-r16)) OF PCI-Range
+}
+
+-- TAG-SIB3-STOP
+-- TAG-SIB4-START
+
+SIB4 ::=                            SEQUENCE {
+    interFreqCarrierFreqList            InterFreqCarrierFreqList,
+    lateNonCriticalExtension            OCTET STRING                                OPTIONAL,
+    ...,
+    [[
+    interFreqCarrierFreqList-v1610      InterFreqCarrierFreqList-v1610              OPTIONAL   -- Need R
+    ]]
+}
+
+InterFreqCarrierFreqList ::=        SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo
+
+InterFreqCarrierFreqList-v1610 ::=  SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo-v1610
+
+InterFreqCarrierFreqInfo ::=        SEQUENCE {
+    dl-CarrierFreq                      ARFCN-ValueNR,
+    frequencyBandList                   MultiFrequencyBandListNR-SIB                                OPTIONAL,   -- Cond Mandatory
+    frequencyBandListSUL                MultiFrequencyBandListNR-SIB                                OPTIONAL,   -- Need R
+    nrofSS-BlocksToAverage              INTEGER (2..maxNrofSS-BlocksToAverage)                      OPTIONAL,   -- Need S
+    absThreshSS-BlocksConsolidation     ThresholdNR                                                 OPTIONAL,   -- Need S
+    smtc                                SSB-MTC                                                     OPTIONAL,   -- Need S
+    ssbSubcarrierSpacing                SubcarrierSpacing,
+    ssb-ToMeasure                       SSB-ToMeasure                                               OPTIONAL,   -- Need S
+    deriveSSB-IndexFromCell             BOOLEAN,
+    ss-RSSI-Measurement                 SS-RSSI-Measurement                                         OPTIONAL,
+    q-RxLevMin                          Q-RxLevMin,
+    q-RxLevMinSUL                       Q-RxLevMin                                                  OPTIONAL,   -- Need R
+    q-QualMin                           Q-QualMin                                                   OPTIONAL,   -- Need S
+    p-Max                               P-Max                                                       OPTIONAL,   -- Need S
+    t-ReselectionNR                     T-Reselection,
+    t-ReselectionNR-SF                  SpeedStateScaleFactors                                      OPTIONAL,   -- Need S
+    threshX-HighP                       ReselectionThreshold,
+    threshX-LowP                        ReselectionThreshold,
+    threshX-Q                           SEQUENCE {
+        threshX-HighQ                       ReselectionThresholdQ,
+        threshX-LowQ                        ReselectionThresholdQ
+    }                                                                                               OPTIONAL,   -- Cond RSRQ
+    cellReselectionPriority             CellReselectionPriority                                     OPTIONAL,   -- Need R
+    cellReselectionSubPriority          CellReselectionSubPriority                                  OPTIONAL,   -- Need R
+    q-OffsetFreq                        Q-OffsetRange                                               DEFAULT dB0,
+    interFreqNeighCellList              InterFreqNeighCellList                                      OPTIONAL,   -- Need R
+    interFreqBlackCellList              InterFreqBlackCellList                                      OPTIONAL,   -- Need R
+    ...
+}
+
+InterFreqCarrierFreqInfo-v1610 ::=  SEQUENCE {
+    interFreqNeighCellList-v1610        InterFreqNeighCellList-v1610                                OPTIONAL,    -- Need R
+    smtc2-LP-r16                        SSB-MTC2-LP-r16                                             OPTIONAL,    -- Need R
+    interFreqWhiteCellList-r16          InterFreqWhiteCellList-r16                                  OPTIONAL,    -- Cond SharedSpectrum2
+    ssb-PositionQCL-Common-r16          SSB-PositionQCL-Relation-r16                                OPTIONAL,    -- Cond SharedSpectrum
+    interFreqCAG-CellList-r16           SEQUENCE (SIZE (1..maxPLMN)) OF InterFreqCAG-CellListPerPLMN-r16   OPTIONAL     -- Need R
+}
+
+InterFreqNeighCellList ::=          SEQUENCE (SIZE (1..maxCellInter)) OF InterFreqNeighCellInfo
+
+InterFreqNeighCellList-v1610 ::=    SEQUENCE (SIZE (1..maxCellInter)) OF InterFreqNeighCellInfo-v1610
+
+InterFreqNeighCellInfo ::=          SEQUENCE {
+    physCellId                          PhysCellId,
+    q-OffsetCell                        Q-OffsetRange,
+    q-RxLevMinOffsetCell                INTEGER (1..8)                                              OPTIONAL,   -- Need R
+    q-RxLevMinOffsetCellSUL             INTEGER (1..8)                                              OPTIONAL,   -- Need R
+    q-QualMinOffsetCell                 INTEGER (1..8)                                              OPTIONAL,   -- Need R
+    ...
+}
+
+InterFreqNeighCellInfo-v1610 ::=    SEQUENCE {
+    ssb-PositionQCL-r16                 SSB-PositionQCL-Relation-r16                                OPTIONAL    -- Cond SharedSpectrum2
+}
+
+InterFreqBlackCellList ::=          SEQUENCE (SIZE (1..maxCellBlack)) OF PCI-Range
+
+InterFreqWhiteCellList-r16 ::=      SEQUENCE (SIZE (1..maxCellWhite)) OF PCI-Range
+
+InterFreqCAG-CellListPerPLMN-r16 ::= SEQUENCE {
+    plmn-IdentityIndex-r16              INTEGER (1..maxPLMN),
+    cag-CellList-r16                    SEQUENCE (SIZE (1..maxCAG-Cell-r16)) OF PCI-Range
+}
+
+-- TAG-SIB4-STOP
+-- TAG-SIB5-START
+
+SIB5 ::=                            SEQUENCE {
+    carrierFreqListEUTRA                CarrierFreqListEUTRA                        OPTIONAL,       -- Need R
+    t-ReselectionEUTRA                  T-Reselection,
+    t-ReselectionEUTRA-SF               SpeedStateScaleFactors                      OPTIONAL,       -- Need S
+    lateNonCriticalExtension            OCTET STRING                                OPTIONAL,
+    ...,
+    [[
+    carrierFreqListEUTRA-v1610      CarrierFreqListEUTRA-v1610                      OPTIONAL        -- Need R
+    ]]
+}
+
+CarrierFreqListEUTRA ::=            SEQUENCE (SIZE (1..maxEUTRA-Carrier)) OF CarrierFreqEUTRA
+
+CarrierFreqListEUTRA-v1610 ::=      SEQUENCE (SIZE (1..maxEUTRA-Carrier)) OF CarrierFreqEUTRA-v1610
+
+CarrierFreqEUTRA ::=                SEQUENCE {
+    carrierFreq                         ARFCN-ValueEUTRA,
+    eutra-multiBandInfoList             EUTRA-MultiBandInfoList                     OPTIONAL,       -- Need R
+    eutra-FreqNeighCellList             EUTRA-FreqNeighCellList                     OPTIONAL,       -- Need R
+    eutra-BlackCellList                 EUTRA-FreqBlackCellList                     OPTIONAL,       -- Need R
+    allowedMeasBandwidth                EUTRA-AllowedMeasBandwidth,
+    presenceAntennaPort1                EUTRA-PresenceAntennaPort1,
+    cellReselectionPriority             CellReselectionPriority                     OPTIONAL,       -- Need R
+    cellReselectionSubPriority          CellReselectionSubPriority                  OPTIONAL,       -- Need R
+    threshX-High                        ReselectionThreshold,
+    threshX-Low                         ReselectionThreshold,
+    q-RxLevMin                          INTEGER (-70..-22),
+    q-QualMin                           INTEGER (-34..-3),
+    p-MaxEUTRA                          INTEGER (-30..33),
+    threshX-Q                           SEQUENCE {
+        threshX-HighQ                       ReselectionThresholdQ,
+        threshX-LowQ                        ReselectionThresholdQ
+    }                                                                               OPTIONAL        -- Cond RSRQ
+}
+
+CarrierFreqEUTRA-v1610 ::= SEQUENCE {
+    highSpeedEUTRACarrier-r16       ENUMERATED {true}                               OPTIONAL        -- Need R
+}
+
+EUTRA-FreqBlackCellList ::=         SEQUENCE (SIZE (1..maxEUTRA-CellBlack)) OF EUTRA-PhysCellIdRange
+
+EUTRA-FreqNeighCellList ::=         SEQUENCE (SIZE (1..maxCellEUTRA)) OF EUTRA-FreqNeighCellInfo
+
+EUTRA-FreqNeighCellInfo ::=         SEQUENCE {
+    physCellId                          EUTRA-PhysCellId,
+    dummy                               EUTRA-Q-OffsetRange,
+    q-RxLevMinOffsetCell                INTEGER (1..8)                              OPTIONAL,       -- Need R
+    q-QualMinOffsetCell                 INTEGER (1..8)                              OPTIONAL        -- Need R
+}
+
+-- TAG-SIB5-STOP
+-- TAG-SIB6-START
+
+SIB6 ::=                            SEQUENCE {
+    messageIdentifier                   BIT STRING (SIZE (16)),
+    serialNumber                        BIT STRING (SIZE (16)),
+    warningType                         OCTET STRING (SIZE (2)),
+    lateNonCriticalExtension            OCTET STRING                                OPTIONAL,
+    ...
+}
+
+-- TAG-SIB6-STOP
+-- TAG-SIB7-START
+
+SIB7 ::=                            SEQUENCE {
+    messageIdentifier                   BIT STRING (SIZE (16)),
+    serialNumber                        BIT STRING (SIZE (16)),
+    warningMessageSegmentType           ENUMERATED {notLastSegment, lastSegment},
+    warningMessageSegmentNumber         INTEGER (0..63),
+    warningMessageSegment               OCTET STRING,
+    dataCodingScheme                    OCTET STRING (SIZE (1))                     OPTIONAL,   -- Cond Segment1
+    lateNonCriticalExtension            OCTET STRING                                OPTIONAL,
+    ...
+}
+
+-- TAG-SIB7-STOP
+-- TAG-SIB8-START
+
+SIB8 ::=                        SEQUENCE {
+    messageIdentifier               BIT STRING (SIZE (16)),
+    serialNumber                    BIT STRING (SIZE (16)),
+    warningMessageSegmentType       ENUMERATED {notLastSegment, lastSegment},
+    warningMessageSegmentNumber     INTEGER (0..63),
+    warningMessageSegment           OCTET STRING,
+    dataCodingScheme                OCTET STRING (SIZE (1))                         OPTIONAL,   -- Cond Segment1
+    warningAreaCoordinatesSegment   OCTET STRING                                    OPTIONAL,   -- Need R
+    lateNonCriticalExtension        OCTET STRING                                    OPTIONAL,
+    ...
+}
+
+-- TAG-SIB8-STOP
+-- TAG-SIB9-START
+
+SIB9 ::=                            SEQUENCE {
+    timeInfo                            SEQUENCE {
+        timeInfoUTC                         INTEGER (0..549755813887),
+        dayLightSavingTime                  BIT STRING (SIZE (2))                   OPTIONAL,   -- Need R
+        leapSeconds                         INTEGER (-127..128)                     OPTIONAL,   -- Need R
+        localTimeOffset                     INTEGER (-63..64)                       OPTIONAL    -- Need R
+    }                                                                               OPTIONAL,   -- Need R
+    lateNonCriticalExtension            OCTET STRING                                OPTIONAL,
+    ...,
+     [[
+    referenceTimeInfo-r16           ReferenceTimeInfo-r16                           OPTIONAL    -- Need R
+    ]]
+}
+
+-- TAG-SIB9-STOP
+-- TAG-SIB10-START
+
+SIB10-r16 ::=               SEQUENCE {
+    hrnn-List-r16               HRNN-List-r16                                   OPTIONAL,   -- Need R
+    lateNonCriticalExtension    OCTET STRING                                    OPTIONAL,
+    ...
+}
+
+HRNN-List-r16 ::=           SEQUENCE (SIZE (1..maxNPN-r16)) OF HRNN-r16
+
+HRNN-r16 ::=                SEQUENCE {
+    hrnn-r16                    OCTET STRING (SIZE(1.. maxHRNN-Len-r16))        OPTIONAL   -- Need R
+}
+
+-- TAG-SIB10-STOP
+-- TAG-SIB11-START
+
+SIB11-r16 ::=                    SEQUENCE {
+    measIdleConfigSIB-r16            MeasIdleConfigSIB-r16                       OPTIONAL, -- Need S
+    lateNonCriticalExtension         OCTET STRING                                OPTIONAL,
+    ...
+}
+
+-- TAG-SIB11-STOP
+-- TAG-SIB12-START
+
+SIB12-r16 ::=                 SEQUENCE {
+    segmentNumber-r16             INTEGER (0..63),
+    segmentType-r16               ENUMERATED {notLastSegment, lastSegment},
+    segmentContainer-r16          OCTET STRING
+}
+
+SIB12-IEs-r16 ::=             SEQUENCE {
+    sl-ConfigCommonNR-r16         SL-ConfigCommonNR-r16,
+    lateNonCriticalExtension      OCTET STRING                   OPTIONAL,
+    ...
+}
+
+SL-ConfigCommonNR-r16 ::=        SEQUENCE {
+    sl-FreqInfoList-r16                  SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF SL-FreqConfigCommon-r16      OPTIONAL,    -- Need R
+    sl-UE-SelectedConfig-r16             SL-UE-SelectedConfig-r16                                               OPTIONAL,    -- Need R
+    sl-NR-AnchorCarrierFreqList-r16      SL-NR-AnchorCarrierFreqList-r16                                        OPTIONAL,    -- Need R
+    sl-EUTRA-AnchorCarrierFreqList-r16   SL-EUTRA-AnchorCarrierFreqList-r16                                     OPTIONAL,    -- Need R
+    sl-RadioBearerConfigList-r16         SEQUENCE (SIZE (1..maxNrofSLRB-r16)) OF SL-RadioBearerConfig-r16       OPTIONAL,    -- Need R
+    sl-RLC-BearerConfigList-r16          SEQUENCE (SIZE (1..maxSL-LCID-r16)) OF SL-RLC-BearerConfig-r16         OPTIONAL,    -- Need R
+    sl-MeasConfigCommon-r16              SL-MeasConfigCommon-r16                                                OPTIONAL,    -- Need R
+    sl-CSI-Acquisition-r16               ENUMERATED {enabled}                                                   OPTIONAL,    -- Need R
+    sl-OffsetDFN-r16                     INTEGER (1..1000)                                                      OPTIONAL,    -- Need R
+    t400-r16                             ENUMERATED {ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000} OPTIONAL,    -- Need R
+    sl-MaxNumConsecutiveDTX-r16          ENUMERATED {n1, n2, n3, n4, n6, n8, n16, n32}                          OPTIONAL,    -- Need R
+    sl-SSB-PriorityNR-r16                INTEGER (1..8)                                                         OPTIONAL     -- Need R
+}
+
+SL-NR-AnchorCarrierFreqList-r16 ::=  SEQUENCE (SIZE (1..maxFreqSL-NR-r16)) OF ARFCN-ValueNR
+
+SL-EUTRA-AnchorCarrierFreqList-r16 ::= SEQUENCE (SIZE (1..maxFreqSL-EUTRA-r16)) OF ARFCN-ValueEUTRA
+
+-- TAG-SIB12-STOP
+-- TAG-SIB13-START
+
+SIB13-r16 ::=                       SEQUENCE {
+    sl-V2X-ConfigCommon-r16             OCTET STRING,
+    dummy                               OCTET STRING,
+    tdd-Config-r16                      OCTET STRING,
+    lateNonCriticalExtension            OCTET STRING                          OPTIONAL,
+    ...
+}
+
+-- TAG-SIB13-STOP
+-- TAG-SIB14-START
+
+SIB14-r16 ::=                      SEQUENCE {
+    sl-V2X-ConfigCommonExt-r16         OCTET STRING,
+    lateNonCriticalExtension           OCTET STRING                          OPTIONAL,
+    ...
+}
+
+-- TAG-SIB14-STOP
+-- TAG-POSSYSTEMINFORMATION-R16-IES-START
+
+PosSystemInformation-r16-IEs ::= SEQUENCE {
+    posSIB-TypeAndInfo-r16           SEQUENCE (SIZE (1..maxSIB)) OF CHOICE {
+        posSib1-1-r16                    SIBpos-r16,
+        posSib1-2-r16                    SIBpos-r16,
+        posSib1-3-r16                    SIBpos-r16,
+        posSib1-4-r16                    SIBpos-r16,
+        posSib1-5-r16                    SIBpos-r16,
+        posSib1-6-r16                    SIBpos-r16,
+        posSib1-7-r16                    SIBpos-r16,
+        posSib1-8-r16                    SIBpos-r16,
+        posSib2-1-r16                    SIBpos-r16,
+        posSib2-2-r16                    SIBpos-r16,
+        posSib2-3-r16                    SIBpos-r16,
+        posSib2-4-r16                    SIBpos-r16,
+        posSib2-5-r16                    SIBpos-r16,
+        posSib2-6-r16                    SIBpos-r16,
+        posSib2-7-r16                    SIBpos-r16,
+        posSib2-8-r16                    SIBpos-r16,
+        posSib2-9-r16                    SIBpos-r16,
+        posSib2-10-r16                   SIBpos-r16,
+        posSib2-11-r16                   SIBpos-r16,
+        posSib2-12-r16                   SIBpos-r16,
+        posSib2-13-r16                   SIBpos-r16,
+        posSib2-14-r16                   SIBpos-r16,
+        posSib2-15-r16                   SIBpos-r16,
+        posSib2-16-r16                   SIBpos-r16,
+        posSib2-17-r16                   SIBpos-r16,
+        posSib2-18-r16                   SIBpos-r16,
+        posSib2-19-r16                   SIBpos-r16,
+        posSib2-20-r16                   SIBpos-r16,
+        posSib2-21-r16                   SIBpos-r16,
+        posSib2-22-r16                   SIBpos-r16,
+        posSib2-23-r16                   SIBpos-r16,
+        posSib3-1-r16                    SIBpos-r16,
+        posSib4-1-r16                    SIBpos-r16,
+        posSib5-1-r16                    SIBpos-r16,
+        posSib6-1-r16                    SIBpos-r16,
+        posSib6-2-r16                    SIBpos-r16,
+        posSib6-3-r16                    SIBpos-r16,
+        ...
+    },
+    lateNonCriticalExtension             OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                 SEQUENCE {}                         OPTIONAL
+}
+
+-- TAG-POSSYSTEMINFORMATION-R16-IES-STOP
+-- TAG-POSSI-SCHEDULINGINFO-START
+
+PosSI-SchedulingInfo-r16 ::=               SEQUENCE {
+    posSchedulingInfoList-r16                  SEQUENCE (SIZE (1..maxSI-Message)) OF PosSchedulingInfo-r16,
+    posSI-RequestConfig-r16                        SI-RequestConfig                                 OPTIONAL,  -- Cond MSG-1
+    posSI-RequestConfigSUL-r16                     SI-RequestConfig                                 OPTIONAL,  -- Cond SUL-MSG-1
+    ...
+}
+
+PosSchedulingInfo-r16 ::= SEQUENCE {
+    offsetToSI-Used-r16          ENUMERATED {true}                                              OPTIONAL,  -- Need R
+    posSI-Periodicity-r16        ENUMERATED {rf8, rf16, rf32, rf64, rf128, rf256, rf512},
+    posSI-BroadcastStatus-r16    ENUMERATED {broadcasting, notBroadcasting},
+    posSIB-MappingInfo-r16       PosSIB-MappingInfo-r16,
+    ...
+}
+
+PosSIB-MappingInfo-r16 ::=   SEQUENCE (SIZE (1..maxSIB)) OF PosSIB-Type-r16
+
+PosSIB-Type-r16 ::=          SEQUENCE {
+    encrypted-r16                ENUMERATED { true }                                            OPTIONAL,  -- Need R
+    gnss-id-r16                  GNSS-ID-r16                                                    OPTIONAL,  -- Need R
+    sbas-id-r16                  SBAS-ID-r16                                                    OPTIONAL,  -- Need R
+    posSibType-r16               ENUMERATED { posSibType1-1, posSibType1-2, posSibType1-3, posSibType1-4, posSibType1-5, posSibType1-6,
+                                              posSibType1-7, posSibType1-8, posSibType2-1, posSibType2-2, posSibType2-3, posSibType2-4,
+                                              posSibType2-5, posSibType2-6, posSibType2-7, posSibType2-8, posSibType2-9, posSibType2-10,
+                                              posSibType2-11, posSibType2-12, posSibType2-13, posSibType2-14, posSibType2-15,
+                                              posSibType2-16, posSibType2-17, posSibType2-18, posSibType2-19, posSibType2-20,
+                                              posSibType2-21, posSibType2-22, posSibType2-23, posSibType3-1, posSibType4-1,
+                                              posSibType5-1,posSibType6-1, posSibType6-2, posSibType6-3,... },
+    areaScope-r16                ENUMERATED {true}                                              OPTIONAL -- Need S
+}
+
+GNSS-ID-r16 ::= SEQUENCE {
+    gnss-id-r16              ENUMERATED{gps, sbas, qzss, galileo, glonass, bds, ...},
+    ...
+}
+
+SBAS-ID-r16 ::= SEQUENCE {
+    sbas-id-r16              ENUMERATED { waas, egnos, msas, gagan, ...},
+    ...
+}
+
+-- TAG-POSSI-SCHEDULINGINFO-STOP
+-- TAG-SIPOS-START
+
+SIBpos-r16 ::= SEQUENCE {
+    assistanceDataSIB-Element-r16        OCTET STRING,
+    lateNonCriticalExtension             OCTET STRING                        OPTIONAL,
+    ...
+}
+
+-- TAG-SIPOS-STOP
+-- TAG-ADDITIONALSPECTRUMEMISSION-START
+
+AdditionalSpectrumEmission ::=              INTEGER (0..7)
+
+-- TAG-ADDITIONALSPECTRUMEMISSION-STOP
+-- TAG-ALPHA-START
+
+Alpha ::=                       ENUMERATED {alpha0, alpha04, alpha05, alpha06, alpha07, alpha08, alpha09, alpha1}
+
+-- TAG-ALPHA-STOP
+-- TAG-AMF-IDENTIFIER-START
+
+AMF-Identifier ::=                      BIT STRING (SIZE (24))
+
+-- TAG-AMF-IDENTIFIER-STOP
+-- TAG-ARFCN-VALUEEUTRA-START
+
+ARFCN-ValueEUTRA ::=                INTEGER (0..maxEARFCN)
+
+-- TAG-ARFCN-VALUEEUTRA-STOP
+-- TAG-ARFCN-VALUENR-START
+
+ARFCN-ValueNR ::=               INTEGER (0..maxNARFCN)
+
+-- TAG-ARFCN-VALUENR-STOP
+-- TAG-ARFCN-ValueUTRA-FDD-START
+
+ARFCN-ValueUTRA-FDD-r16 ::=                INTEGER (0..16383)
+
+-- TAG-ARFCN-ValueUTRA-FDD-STOP
+-- TAG-AVAILABILITYCOMBINATIONSPERCELL-START
+
+AvailabilityCombinationsPerCell-r16 ::=     SEQUENCE {
+    availabilityCombinationsPerCellIndex-r16     AvailabilityCombinationsPerCellIndex-r16,
+    iab-DU-CellIdentity-r16                      CellIdentity,
+    positionInDCI-AI-r16                         INTEGER(0..maxAI-DCI-PayloadSize-r16-1)                              OPTIONAL, -- Need M
+    availabilityCombinations-r16                 SEQUENCE (SIZE (1..maxNrofAvailabilityCombinationsPerSet-r16)) OF AvailabilityCombination-r16,
+    ...
+}
+
+AvailabilityCombinationsPerCellIndex-r16 ::= INTEGER(0..maxNrofDUCells-r16)
+
+AvailabilityCombination-r16 ::=         SEQUENCE {
+    availabilityCombinationId-r16           AvailabilityCombinationId-r16,
+    resourceAvailability-r16                SEQUENCE (SIZE (1..maxNrofResourceAvailabilityPerCombination-r16)) OF INTEGER (0..7)
+}
+
+AvailabilityCombinationId-r16 ::=       INTEGER (0..maxNrofAvailabilityCombinationsPerSet-r16-1)
+
+-- TAG-AVAILABILITYCOMBINATIONSPERCELL-STOP
+-- TAG-AVAILABILITYINDICATOR-START
+
+AvailabilityIndicator-r16 ::=    SEQUENCE {
+    ai-RNTI-r16                      AI-RNTI-r16,
+    dci-PayloadSizeAI-r16            INTEGER (1..maxAI-DCI-PayloadSize-r16),
+    availableCombToAddModList-r16    SEQUENCE (SIZE(1..maxNrofDUCells-r16)) OF AvailabilityCombinationsPerCell-r16          OPTIONAL, -- Need N
+    availableCombToReleaseList-r16   SEQUENCE (SIZE(1..maxNrofDUCells-r16)) OF AvailabilityCombinationsPerCellIndex-r16     OPTIONAL, -- Need N
+    ...
+}
+
+AI-RNTI-r16 ::=                      RNTI-Value
+
+-- TAG-AVAILABILITYINDICATOR-STOP
+-- TAG-BAPROUTINGID-START
+
+BAP-RoutingID-r16::=        SEQUENCE{
+    bap-Address-r16              BIT STRING (SIZE (10)),
+    bap-PathId-r16               BIT STRING (SIZE (10))
+}
+
+-- TAG-BAPROUTINGID-STOP
+-- TAG-BEAMFAILURERECOVERYCONFIG-START
+
+BeamFailureRecoveryConfig ::=       SEQUENCE {
+    rootSequenceIndex-BFR               INTEGER (0..137)                                                          OPTIONAL, -- Need M
+    rach-ConfigBFR                      RACH-ConfigGeneric                                                        OPTIONAL, -- Need M
+    rsrp-ThresholdSSB                   RSRP-Range                                                                OPTIONAL, -- Need M
+    candidateBeamRSList                 SEQUENCE (SIZE(1..maxNrofCandidateBeams)) OF PRACH-ResourceDedicatedBFR   OPTIONAL, -- Need M
+    ssb-perRACH-Occasion                ENUMERATED {oneEighth, oneFourth, oneHalf, one, two,
+                                                       four, eight, sixteen}                                      OPTIONAL, -- Need M
+    ra-ssb-OccasionMaskIndex            INTEGER (0..15)                                                           OPTIONAL, -- Need M
+    recoverySearchSpaceId               SearchSpaceId                                                             OPTIONAL, -- Need R
+    ra-Prioritization                   RA-Prioritization                                                         OPTIONAL, -- Need R
+    beamFailureRecoveryTimer            ENUMERATED {ms10, ms20, ms40, ms60, ms80, ms100, ms150, ms200}            OPTIONAL, -- Need M
+    ...,
+    [[
+    msg1-SubcarrierSpacing              SubcarrierSpacing                                                         OPTIONAL  -- Need M
+    ]],
+    [[
+    ra-PrioritizationTwoStep-r16        RA-Prioritization                                                         OPTIONAL, -- Need R
+    candidateBeamRSListExt-v1610        SetupRelease{ CandidateBeamRSListExt-r16 }                                OPTIONAL  -- Need M
+    ]],
+    [[
+    spCell-BFR-CBRA-r16                 ENUMERATED {true}                                                         OPTIONAL  -- Need R
+    ]]
+}
+
+PRACH-ResourceDedicatedBFR ::=      CHOICE {
+    ssb                                 BFR-SSB-Resource,
+    csi-RS                              BFR-CSIRS-Resource
+}
+
+BFR-SSB-Resource ::=                SEQUENCE {
+    ssb                                 SSB-Index,
+    ra-PreambleIndex                    INTEGER (0..63),
+    ...
+}
+
+BFR-CSIRS-Resource ::=              SEQUENCE {
+    csi-RS                              NZP-CSI-RS-ResourceId,
+    ra-OccasionList                     SEQUENCE (SIZE(1..maxRA-OccasionsPerCSIRS)) OF INTEGER (0..maxRA-Occasions-1)   OPTIONAL,   -- Need R
+    ra-PreambleIndex                    INTEGER (0..63)                                                                 OPTIONAL,   -- Need R
+    ...
+}
+
+CandidateBeamRSListExt-r16::=       SEQUENCE (SIZE(1.. maxNrofCandidateBeamsExt-r16)) OF PRACH-ResourceDedicatedBFR
+
+-- TAG-BEAMFAILURERECOVERYCONFIG-STOP
+-- TAG-BEAMFAILURERECOVERYSCELLCONFIG-START
+
+BeamFailureRecoverySCellConfig-r16 ::= SEQUENCE {
+    rsrp-ThresholdBFR-r16                  RSRP-Range                                                               OPTIONAL, -- Need M
+    candidateBeamRSSCellList-r16           SEQUENCE (SIZE(1..maxNrofCandidateBeams-r16)) OF CandidateBeamRS-r16     OPTIONAL, -- Need M
+    ...
+}
+
+CandidateBeamRS-r16 ::=                SEQUENCE {
+    candidateBeamConfig-r16                CHOICE {
+        ssb-r16                                SSB-Index,
+        csi-RS-r16                             NZP-CSI-RS-ResourceId
+    },
+    servingCellId                          ServCellIndex                                                            OPTIONAL  -- Need R
+}
+
+-- TAG-BEAMFAILURERECOVERYSCELLCONFIG-STOP
+-- TAG-BETAOFFSETS-START
+
+BetaOffsets ::=                     SEQUENCE {
+    betaOffsetACK-Index1                INTEGER(0..31)                                                          OPTIONAL, -- Need S
+    betaOffsetACK-Index2                INTEGER(0..31)                                                          OPTIONAL, -- Need S
+    betaOffsetACK-Index3                INTEGER(0..31)                                                          OPTIONAL, -- Need S
+    betaOffsetCSI-Part1-Index1          INTEGER(0..31)                                                          OPTIONAL, -- Need S
+    betaOffsetCSI-Part1-Index2          INTEGER(0..31)                                                          OPTIONAL, -- Need S
+    betaOffsetCSI-Part2-Index1          INTEGER(0..31)                                                          OPTIONAL, -- Need S
+    betaOffsetCSI-Part2-Index2          INTEGER(0..31)                                                          OPTIONAL  -- Need S
+}
+
+-- TAG-BETAOFFSETS-STOP
+-- TAG-BHLOGICALCHANNELIDENTITY-START
+
+BH-LogicalChannelIdentity-r16 ::=    CHOICE {
+    bh-LogicalChannelIdentity-r16        LogicalChannelIdentity,
+    bh-LogicalChannelIdentityExt-r16     BH-LogicalChannelIdentity-Ext-r16
+}
+
+-- TAG-BHLOGICALCHANNELIDENTITY-STOP
+-- TAG-BHLOGICALCHANNELIDENTITYEXT-START
+
+BH-LogicalChannelIdentity-Ext-r16 ::=   INTEGER (320.. maxLC-ID-Iab-r16)
+
+-- TAG-BHLOGICALCHANNELIDENTITYEXT-STOP
+-- TAG-BHRLCCHANNELCONFIG-START
+
+BH-RLC-ChannelConfig-r16::=      SEQUENCE {
+    bh-LogicalChannelIdentity-r16    BH-LogicalChannelIdentity-r16     OPTIONAL,   -- Cond LCH-SetupOnly
+    bh-RLC-ChannelID-r16             BH-RLC-ChannelID-r16,
+    reestablishRLC-r16               ENUMERATED {true}                 OPTIONAL,   -- Need N
+    rlc-Config-r16                   RLC-Config                        OPTIONAL,   -- Cond LCH-Setup
+    mac-LogicalChannelConfig-r16     LogicalChannelConfig              OPTIONAL,   -- Cond LCH-Setup
+    ...
+}
+
+-- TAG-BHRLCCHANNELCONFIG-STOP
+-- TAG-BHRLCCHANNELID-START
+
+BH-RLC-ChannelID-r16 ::=    BIT STRING (SIZE (16))
+
+-- TAG-BHRLCCHANNELID-STOP
+-- TAG-BSR-CONFIG-START
+
+BSR-Config ::=                      SEQUENCE {
+    periodicBSR-Timer                   ENUMERATED { sf1, sf5, sf10, sf16, sf20, sf32, sf40, sf64,
+                                                        sf80, sf128, sf160, sf320, sf640, sf1280, sf2560, infinity },
+    retxBSR-Timer                       ENUMERATED { sf10, sf20, sf40, sf80, sf160, sf320, sf640, sf1280, sf2560,
+                                                        sf5120, sf10240, spare5, spare4, spare3, spare2, spare1},
+    logicalChannelSR-DelayTimer         ENUMERATED { sf20, sf40, sf64, sf128, sf512, sf1024, sf2560, spare1}                OPTIONAL, -- Need R
+    ...
+}
+
+-- TAG-BSR-CONFIG-STOP
+-- TAG-BWP-START
+
+BWP ::=                             SEQUENCE {
+    locationAndBandwidth                INTEGER (0..37949),
+    subcarrierSpacing                   SubcarrierSpacing,
+    cyclicPrefix                        ENUMERATED { extended }                                                 OPTIONAL    -- Need R
+}
+
+-- TAG-BWP-STOP
+-- TAG-BWP-DOWNLINK-START
+
+BWP-Downlink ::=                    SEQUENCE {
+    bwp-Id                              BWP-Id,
+    bwp-Common                          BWP-DownlinkCommon                                         OPTIONAL,   -- Cond SetupOtherBWP
+    bwp-Dedicated                       BWP-DownlinkDedicated                                      OPTIONAL,   -- Cond SetupOtherBWP
+    ...
+}
+
+-- TAG-BWP-DOWNLINK-STOP
+-- TAG-BWP-DOWNLINKCOMMON-START
+
+BWP-DownlinkCommon ::=              SEQUENCE {
+    genericParameters                   BWP,
+    pdcch-ConfigCommon                  SetupRelease { PDCCH-ConfigCommon }                                     OPTIONAL,   -- Need M
+    pdsch-ConfigCommon                  SetupRelease { PDSCH-ConfigCommon }                                     OPTIONAL,   -- Need M
+    ...
+}
+
+-- TAG-BWP-DOWNLINKCOMMON-STOP
+-- TAG-BWP-DOWNLINKDEDICATED-START
+
+BWP-DownlinkDedicated ::=           SEQUENCE {
+    pdcch-Config                        SetupRelease { PDCCH-Config }                                     OPTIONAL,   -- Need M
+    pdsch-Config                        SetupRelease { PDSCH-Config }                                     OPTIONAL,   -- Need M
+    sps-Config                          SetupRelease { SPS-Config }                                       OPTIONAL,   -- Need M
+    radioLinkMonitoringConfig           SetupRelease { RadioLinkMonitoringConfig }                        OPTIONAL,   -- Need M
+    ...,
+    [[
+    sps-ConfigToAddModList-r16          SPS-ConfigToAddModList-r16                                        OPTIONAL,   -- Need N
+    sps-ConfigToReleaseList-r16         SPS-ConfigToReleaseList-r16                                       OPTIONAL,   -- Need N
+    sps-ConfigDeactivationStateList-r16 SPS-ConfigDeactivationStateList-r16                               OPTIONAL,   -- Need R
+    beamFailureRecoverySCellConfig-r16  SetupRelease {BeamFailureRecoverySCellConfig-r16}                 OPTIONAL,   -- Cond SCellOnly
+    sl-PDCCH-Config-r16                 SetupRelease { PDCCH-Config }                                     OPTIONAL,   -- Need M
+    sl-V2X-PDCCH-Config-r16             SetupRelease { PDCCH-Config }                                     OPTIONAL    -- Need M
+    ]]
+}
+
+SPS-ConfigToAddModList-r16 ::=          SEQUENCE (SIZE (1..maxNrofSPS-Config-r16)) OF SPS-Config
+
+SPS-ConfigToReleaseList-r16 ::=         SEQUENCE (SIZE (1..maxNrofSPS-Config-r16)) OF SPS-ConfigIndex-r16
+
+SPS-ConfigDeactivationState-r16 ::=     SEQUENCE (SIZE (1..maxNrofSPS-Config-r16)) OF SPS-ConfigIndex-r16
+
+SPS-ConfigDeactivationStateList-r16 ::= SEQUENCE (SIZE (1..maxNrofSPS-DeactivationState)) OF SPS-ConfigDeactivationState-r16
+
+-- TAG-BWP-DOWNLINKDEDICATED-STOP
+-- TAG-BWP-ID-START
+
+BWP-Id ::=                          INTEGER (0..maxNrofBWPs)
+
+-- TAG-BWP-ID-STOP
+-- TAG-BWP-UPLINK-START
+
+BWP-Uplink ::=                      SEQUENCE {
+    bwp-Id                              BWP-Id,
+    bwp-Common                          BWP-UplinkCommon                                            OPTIONAL,   -- Cond SetupOtherBWP
+    bwp-Dedicated                       BWP-UplinkDedicated                                         OPTIONAL,   -- Cond SetupOtherBWP
+    ...
+}
+
+-- TAG-BWP-UPLINK-STOP
+-- TAG-BWP-UPLINKCOMMON-START
+
+BWP-UplinkCommon ::=                SEQUENCE {
+    genericParameters                   BWP,
+    rach-ConfigCommon                   SetupRelease { RACH-ConfigCommon }                                      OPTIONAL,   -- Need M
+    pusch-ConfigCommon                  SetupRelease { PUSCH-ConfigCommon }                                     OPTIONAL,   -- Need M
+    pucch-ConfigCommon                  SetupRelease { PUCCH-ConfigCommon }                                     OPTIONAL,   -- Need M
+    ...,
+    [[
+    rach-ConfigCommonIAB-r16            SetupRelease { RACH-ConfigCommon }                                      OPTIONAL,   -- Need M
+    useInterlacePUCCH-PUSCH-r16         ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    msgA-ConfigCommon-r16               SetupRelease { MsgA-ConfigCommon-r16 }                                  OPTIONAL    -- Cond SpCellOnly2
+    ]]
+}
+
+-- TAG-BWP-UPLINKCOMMON-STOP
+-- TAG-BWP-UPLINKDEDICATED-START
+
+BWP-UplinkDedicated ::=             SEQUENCE {
+    pucch-Config                        SetupRelease { PUCCH-Config }                                           OPTIONAL,   -- Need M
+    pusch-Config                        SetupRelease { PUSCH-Config }                                           OPTIONAL,   -- Need M
+    configuredGrantConfig               SetupRelease { ConfiguredGrantConfig }                                  OPTIONAL,   -- Need M
+    srs-Config                          SetupRelease { SRS-Config }                                             OPTIONAL,   -- Need M
+    beamFailureRecoveryConfig           SetupRelease { BeamFailureRecoveryConfig }                              OPTIONAL,   -- Cond SpCellOnly
+    ...,
+    [[
+    sl-PUCCH-Config-r16                 SetupRelease { PUCCH-Config }                                           OPTIONAL,   -- Need M
+    cp-ExtensionC2-r16                  INTEGER (1..28)                                                         OPTIONAL,   -- Need R
+    cp-ExtensionC3-r16                  INTEGER (1..28)                                                         OPTIONAL,   -- Need R
+    useInterlacePUCCH-PUSCH-r16         ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    pucch-ConfigurationList-r16         SetupRelease { PUCCH-ConfigurationList-r16 }                            OPTIONAL,   -- Need M
+    lbt-FailureRecoveryConfig-r16       SetupRelease { LBT-FailureRecoveryConfig-r16 }                          OPTIONAL,   -- Need M
+    configuredGrantConfigToAddModList-r16                 ConfiguredGrantConfigToAddModList-r16                 OPTIONAL,   -- Need N
+    configuredGrantConfigToReleaseList-r16                ConfiguredGrantConfigToReleaseList-r16                OPTIONAL,   -- Need N
+    configuredGrantConfigType2DeactivationStateList-r16   ConfiguredGrantConfigType2DeactivationStateList-r16   OPTIONAL    -- Need R
+    ]]
+
+}
+
+ConfiguredGrantConfigToAddModList-r16    ::= SEQUENCE (SIZE (1..maxNrofConfiguredGrantConfig-r16)) OF ConfiguredGrantConfig
+
+ConfiguredGrantConfigToReleaseList-r16   ::= SEQUENCE (SIZE (1..maxNrofConfiguredGrantConfig-r16)) OF ConfiguredGrantConfigIndex-r16
+
+ConfiguredGrantConfigType2DeactivationState-r16 ::= SEQUENCE (SIZE (1..maxNrofConfiguredGrantConfig-r16)) OF ConfiguredGrantConfigIndex-r16
+
+ConfiguredGrantConfigType2DeactivationStateList-r16  ::=
+                             SEQUENCE (SIZE (1..maxNrofCG-Type2DeactivationState)) OF ConfiguredGrantConfigType2DeactivationState-r16
+
+-- TAG-BWP-UPLINKDEDICATED-STOP
+-- TAG-CELLACCESSRELATEDINFO-START
+
+CellAccessRelatedInfo   ::=         SEQUENCE {
+    plmn-IdentityList                   PLMN-IdentityInfoList,
+    cellReservedForOtherUse             ENUMERATED {true}             OPTIONAL,   -- Need R
+    ...,
+    [[
+    cellReservedForFutureUse-r16        ENUMERATED {true}             OPTIONAL,   -- Need R
+    npn-IdentityInfoList-r16            NPN-IdentityInfoList-r16      OPTIONAL    -- Need R
+    ]]
+}
+
+-- TAG-CELLACCESSRELATEDINFO-STOP
+-- TAG-CELLACCESSRELATEDINFOEUTRA-5GC-START
+
+CellAccessRelatedInfo-EUTRA-5GC  ::=    SEQUENCE {
+    plmn-IdentityList-eutra-5gc             PLMN-IdentityList-EUTRA-5GC,
+    trackingAreaCode-eutra-5gc              TrackingAreaCode,
+    ranac-5gc                               RAN-AreaCode                                OPTIONAL,
+    cellIdentity-eutra-5gc                  CellIdentity-EUTRA-5GC
+}
+
+PLMN-IdentityList-EUTRA-5GC::=          SEQUENCE (SIZE (1..maxPLMN)) OF PLMN-Identity-EUTRA-5GC
+
+PLMN-Identity-EUTRA-5GC ::=             CHOICE {
+    plmn-Identity-EUTRA-5GC                 PLMN-Identity,
+    plmn-index                              INTEGER (1..maxPLMN)
+}
+
+CellIdentity-EUTRA-5GC ::=              CHOICE {
+    cellIdentity-EUTRA                      BIT STRING (SIZE (28)),
+    cellId-index                            INTEGER (1..maxPLMN)
+}
+
+-- TAG-CELLACCESSRELATEDINFOEUTRA-5GC-STOP
+-- TAG-CELLACCESSRELATEDINFOEUTRA-EPC-START
+
+CellAccessRelatedInfo-EUTRA-EPC  ::=    SEQUENCE {
+    plmn-IdentityList-eutra-epc             PLMN-IdentityList-EUTRA-EPC,
+    trackingAreaCode-eutra-epc              BIT STRING (SIZE (16)),
+    cellIdentity-eutra-epc                  BIT STRING (SIZE (28))
+}
+
+PLMN-IdentityList-EUTRA-EPC::=          SEQUENCE (SIZE (1..maxPLMN)) OF PLMN-Identity
+
+-- TAG-CELLACCESSRELATEDINFOEUTRA-EPC-STOP
+-- TAG-CELLGROUPCONFIG-START
+
+-- Configuration of one Cell-Group:
+CellGroupConfig ::=                        SEQUENCE {
+    cellGroupId                                CellGroupId,
+    rlc-BearerToAddModList                     SEQUENCE (SIZE(1..maxLC-ID)) OF RLC-BearerConfig                        OPTIONAL,   -- Need N
+    rlc-BearerToReleaseList                    SEQUENCE (SIZE(1..maxLC-ID)) OF LogicalChannelIdentity                  OPTIONAL,   -- Need N
+    mac-CellGroupConfig                        MAC-CellGroupConfig                                                     OPTIONAL,   -- Need M
+    physicalCellGroupConfig                    PhysicalCellGroupConfig                                                 OPTIONAL,   -- Need M
+    spCellConfig                               SpCellConfig                                                            OPTIONAL,   -- Need M
+    sCellToAddModList                          SEQUENCE (SIZE (1..maxNrofSCells)) OF SCellConfig                       OPTIONAL,   -- Need N
+    sCellToReleaseList                         SEQUENCE (SIZE (1..maxNrofSCells)) OF SCellIndex                        OPTIONAL,   -- Need N
+    ...,
+    [[
+    reportUplinkTxDirectCurrent                ENUMERATED {true}                                                   OPTIONAL    -- Cond BWP-Reconfig
+    ]],
+    [[
+    bap-Address-r16                            BIT STRING (SIZE (10))                                                  OPTIONAL,   -- Need M
+    bh-RLC-ChannelToAddModList-r16             SEQUENCE (SIZE(1..maxBH-RLC-ChannelID-r16)) OF BH-RLC-ChannelConfig-r16 OPTIONAL,   -- Need N
+    bh-RLC-ChannelToReleaseList-r16            SEQUENCE (SIZE(1..maxBH-RLC-ChannelID-r16)) OF BH-RLC-ChannelID-r16     OPTIONAL,   -- Need N
+    f1c-TransferPath-r16                       ENUMERATED {lte, nr, both}                                              OPTIONAL,   -- Need M
+    simultaneousTCI-UpdateList1-r16            SEQUENCE (SIZE (1..maxNrofServingCellsTCI-r16)) OF ServCellIndex        OPTIONAL,   -- Need R
+    simultaneousTCI-UpdateList2-r16            SEQUENCE (SIZE (1..maxNrofServingCellsTCI-r16)) OF ServCellIndex        OPTIONAL,   -- Need R
+    simultaneousSpatial-UpdatedList1-r16       SEQUENCE (SIZE (1..maxNrofServingCellsTCI-r16)) OF ServCellIndex        OPTIONAL,   -- Need R
+    simultaneousSpatial-UpdatedList2-r16       SEQUENCE (SIZE (1..maxNrofServingCellsTCI-r16)) OF ServCellIndex        OPTIONAL,   -- Need R
+    uplinkTxSwitchingOption-r16                ENUMERATED {switchedUL, dualUL}                                         OPTIONAL,   -- Need R
+    uplinkTxSwitchingPowerBoosting-r16         ENUMERATED {enabled}                                                    OPTIONAL    -- Need R
+    ]],
+    [[
+    reportUplinkTxDirectCurrentTwoCarrier-r16  ENUMERATED {true}                                                       OPTIONAL    -- Need N
+    ]]
+}
+
+-- Serving cell specific MAC and PHY parameters for a SpCell:
+SpCellConfig ::=                        SEQUENCE {
+    servCellIndex                       ServCellIndex                                               OPTIONAL,   -- Cond SCG
+    reconfigurationWithSync             ReconfigurationWithSync                                     OPTIONAL,   -- Cond ReconfWithSync
+    rlf-TimersAndConstants              SetupRelease { RLF-TimersAndConstants }                     OPTIONAL,   -- Need M
+    rlmInSyncOutOfSyncThreshold         ENUMERATED {n1}                                             OPTIONAL,   -- Need S
+    spCellConfigDedicated               ServingCellConfig                                           OPTIONAL,   -- Need M
+    ...
+}
+
+ReconfigurationWithSync ::=         SEQUENCE {
+    spCellConfigCommon                  ServingCellConfigCommon                                     OPTIONAL,   -- Need M
+    newUE-Identity                      RNTI-Value,
+    t304                                ENUMERATED {ms50, ms100, ms150, ms200, ms500, ms1000, ms2000, ms10000},
+    rach-ConfigDedicated                CHOICE {
+        uplink                              RACH-ConfigDedicated,
+        supplementaryUplink                 RACH-ConfigDedicated
+    }                                                                                               OPTIONAL,   -- Need N
+    ...,
+    [[
+    smtc                                SSB-MTC                                                     OPTIONAL    -- Need S
+    ]],
+    [[
+    daps-UplinkPowerConfig-r16      DAPS-UplinkPowerConfig-r16                                      OPTIONAL    -- Need N
+    ]]
+}
+
+DAPS-UplinkPowerConfig-r16 ::=      SEQUENCE {
+    p-DAPS-Source-r16                   P-Max,
+    p-DAPS-Target-r16                   P-Max,
+    uplinkPowerSharingDAPS-Mode-r16     ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic }
+}
+
+SCellConfig ::=                     SEQUENCE {
+    sCellIndex                          SCellIndex,
+    sCellConfigCommon                   ServingCellConfigCommon                                     OPTIONAL,   -- Cond SCellAdd
+    sCellConfigDedicated                ServingCellConfig                                           OPTIONAL,   -- Cond SCellAddMod
+    ...,
+    [[
+    smtc                                SSB-MTC                                                     OPTIONAL    -- Need S
+    ]],
+    [[
+    sCellState-r16                  ENUMERATED {activated}                                          OPTIONAL,   -- Cond SCellAddSync
+    secondaryDRX-GroupConfig-r16    ENUMERATED {true}                                               OPTIONAL    -- Cond DRX-Config2
+    ]]}
+
+-- TAG-CELLGROUPCONFIG-STOP
+-- TAG-CELLGROUPID-START
+
+CellGroupId ::=                             INTEGER (0.. maxSecondaryCellGroups)
+
+-- TAG-CELLGROUPID-STOP
+-- TAG-CELLIDENTITY-START
+
+CellIdentity ::=                         BIT STRING (SIZE (36))
+
+-- TAG-CELLIDENTITY-STOP
+-- TAG-CELLRESELECTIONPRIORITY-START
+
+CellReselectionPriority ::=             INTEGER (0..7)
+
+-- TAG-CELLRESELECTIONPRIORITY-STOP
+-- TAG-CELLRESELECTIONSUBPRIORITY-START
+
+CellReselectionSubPriority ::=          ENUMERATED {oDot2, oDot4, oDot6, oDot8}
+
+-- TAG-CELLRESELECTIONSUBPRIORITY-STOP
+-- TAG-CGI-INFOEUTRA-START
+
+CGI-InfoEUTRA ::=                        SEQUENCE {
+    cgi-info-EPC                            SEQUENCE {
+            cgi-info-EPC-legacy                 CellAccessRelatedInfo-EUTRA-EPC,
+            cgi-info-EPC-list                   SEQUENCE (SIZE (1..maxPLMN)) OF CellAccessRelatedInfo-EUTRA-EPC             OPTIONAL
+    }                                                                                                                   OPTIONAL,
+    cgi-info-5GC                            SEQUENCE (SIZE (1..maxPLMN)) OF CellAccessRelatedInfo-EUTRA-5GC             OPTIONAL,
+    freqBandIndicator                       FreqBandIndicatorEUTRA,
+    multiBandInfoList                       MultiBandInfoListEUTRA                                                      OPTIONAL,
+    freqBandIndicatorPriority               ENUMERATED {true}                                                           OPTIONAL
+}
+
+-- TAG-CGI-INFOEUTRA-STOP
+-- TAG-CGI-INFOEUTRALOGGING-START
+
+CGI-InfoEUTRALogging ::=         SEQUENCE {
+    plmn-Identity-eutra-5gc          PLMN-Identity                                          OPTIONAL,
+    trackingAreaCode-eutra-5gc       TrackingAreaCode                                       OPTIONAL,
+    cellIdentity-eutra-5gc           BIT STRING (SIZE (28))                                 OPTIONAL,
+    plmn-Identity-eutra-epc          PLMN-Identity                                          OPTIONAL,
+    trackingAreaCode-eutra-epc       BIT STRING (SIZE (16))                                 OPTIONAL,
+    cellIdentity-eutra-epc           BIT STRING (SIZE (28))                                 OPTIONAL
+}
+
+-- TAG-CGI-INFOEUTRALOGGING-STOP
+-- TAG-CGI-INFO-NR-START
+
+CGI-InfoNR ::=                    SEQUENCE {
+    plmn-IdentityInfoList               PLMN-IdentityInfoList               OPTIONAL,
+    frequencyBandList                   MultiFrequencyBandListNR            OPTIONAL,
+    noSIB1                              SEQUENCE {
+        ssb-SubcarrierOffset                INTEGER (0..15),
+        pdcch-ConfigSIB1                    PDCCH-ConfigSIB1
+    }                                                                       OPTIONAL,
+    ...,
+    [[
+    npn-IdentityInfoList-r16            NPN-IdentityInfoList-r16            OPTIONAL
+    ]]
+}
+
+-- TAG-CGI-INFO-NR-STOP
+-- TAG-CGI-INFO-LOGGING-START
+
+CGI-Info-Logging-r16 ::=     SEQUENCE {
+    plmn-Identity-r16                    PLMN-Identity,
+    cellIdentity-r16                     CellIdentity,
+    trackingAreaCode-r16                 TrackingAreaCode               OPTIONAL
+}
+
+-- TAG-CGI-INFO-LOGGING-STOP
+-- TAG-CLI-RSSI-RANGE-START
+
+CLI-RSSI-Range-r16 ::=                      INTEGER(0..76)
+
+-- TAG-CLI-RSSI-RANGE-STOP
+-- TAG-CODEBOOKCONFIG-START
+
+CodebookConfig ::=                                  SEQUENCE {
+    codebookType                                        CHOICE {
+        type1                                               SEQUENCE {
+            subType                                             CHOICE {
+                typeI-SinglePanel                                   SEQUENCE {
+                    nrOfAntennaPorts                                    CHOICE {
+                        two                                                 SEQUENCE {
+                            twoTX-CodebookSubsetRestriction                     BIT STRING (SIZE (6))
+                        },
+                        moreThanTwo                                         SEQUENCE {
+                            n1-n2                                               CHOICE {
+                                two-one-TypeI-SinglePanel-Restriction               BIT STRING (SIZE (8)),
+                                two-two-TypeI-SinglePanel-Restriction               BIT STRING (SIZE (64)),
+                                four-one-TypeI-SinglePanel-Restriction              BIT STRING (SIZE (16)),
+                                three-two-TypeI-SinglePanel-Restriction             BIT STRING (SIZE (96)),
+                                six-one-TypeI-SinglePanel-Restriction               BIT STRING (SIZE (24)),
+                                four-two-TypeI-SinglePanel-Restriction              BIT STRING (SIZE (128)),
+                                eight-one-TypeI-SinglePanel-Restriction             BIT STRING (SIZE (32)),
+                                four-three-TypeI-SinglePanel-Restriction            BIT STRING (SIZE (192)),
+                                six-two-TypeI-SinglePanel-Restriction               BIT STRING (SIZE (192)),
+                                twelve-one-TypeI-SinglePanel-Restriction            BIT STRING (SIZE (48)),
+                                four-four-TypeI-SinglePanel-Restriction             BIT STRING (SIZE (256)),
+                                eight-two-TypeI-SinglePanel-Restriction             BIT STRING (SIZE (256)),
+                                sixteen-one-TypeI-SinglePanel-Restriction           BIT STRING (SIZE (64))
+                            },
+                            typeI-SinglePanel-codebookSubsetRestriction-i2      BIT STRING (SIZE (16))        OPTIONAL    -- Need R
+                        }
+                    },
+                    typeI-SinglePanel-ri-Restriction                    BIT STRING (SIZE (8))
+                },
+                typeI-MultiPanel                                    SEQUENCE {
+                    ng-n1-n2                                                CHOICE {
+                        two-two-one-TypeI-MultiPanel-Restriction                BIT STRING (SIZE (8)),
+                        two-four-one-TypeI-MultiPanel-Restriction               BIT STRING (SIZE (16)),
+                        four-two-one-TypeI-MultiPanel-Restriction               BIT STRING (SIZE (8)),
+                        two-two-two-TypeI-MultiPanel-Restriction                BIT STRING (SIZE (64)),
+                        two-eight-one-TypeI-MultiPanel-Restriction              BIT STRING (SIZE (32)),
+                        four-four-one-TypeI-MultiPanel-Restriction              BIT STRING (SIZE (16)),
+                        two-four-two-TypeI-MultiPanel-Restriction               BIT STRING (SIZE (128)),
+                        four-two-two-TypeI-MultiPanel-Restriction               BIT STRING (SIZE (64))
+                    },
+                    ri-Restriction                          BIT STRING (SIZE (4))
+                }
+            },
+            codebookMode                                        INTEGER (1..2)
+
+        },
+        type2                                   SEQUENCE {
+            subType                                 CHOICE {
+                typeII                                  SEQUENCE {
+                    n1-n2-codebookSubsetRestriction         CHOICE {
+                        two-one                                 BIT STRING (SIZE (16)),
+                        two-two                                 BIT STRING (SIZE (43)),
+                        four-one                                BIT STRING (SIZE (32)),
+                        three-two                               BIT STRING (SIZE (59)),
+                        six-one                                 BIT STRING (SIZE (48)),
+                        four-two                                BIT STRING (SIZE (75)),
+                        eight-one                               BIT STRING (SIZE (64)),
+                        four-three                              BIT STRING (SIZE (107)),
+                        six-two                                 BIT STRING (SIZE (107)),
+                        twelve-one                              BIT STRING (SIZE (96)),
+                        four-four                               BIT STRING (SIZE (139)),
+                        eight-two                               BIT STRING (SIZE (139)),
+                        sixteen-one                             BIT STRING (SIZE (128))
+                    },
+                    typeII-RI-Restriction                   BIT STRING (SIZE (2))
+                },
+                typeII-PortSelection                    SEQUENCE {
+                    portSelectionSamplingSize               ENUMERATED {n1, n2, n3, n4}                   OPTIONAL,       -- Need R
+                    typeII-PortSelectionRI-Restriction      BIT STRING (SIZE (2))
+                }
+            },
+            phaseAlphabetSize                       ENUMERATED {n4, n8},
+            subbandAmplitude                        BOOLEAN,
+            numberOfBeams                           ENUMERATED {two, three, four}
+        }
+    }
+}
+
+CodebookConfig-r16  ::=                SEQUENCE  {
+    codebookType                           CHOICE {
+        type2                                  SEQUENCE {
+            subType                                CHOICE {
+                typeII-r16                             SEQUENCE  {
+                    n1-n2-codebookSubsetRestriction-r16    CHOICE {
+                        two-one                                BIT STRING (SIZE (16)),
+                        two-two                                BIT STRING (SIZE (43)),
+                        four-one                               BIT STRING (SIZE (32)),
+                        three-two                              BIT STRING (SIZE (59)),
+                        six-one                                BIT STRING (SIZE (48)),
+                        four-two                               BIT STRING (SIZE (75)),
+                        eight-one                              BIT STRING (SIZE (64)),
+                        four-three                             BIT STRING (SIZE (107)),
+                        six-two                                BIT STRING (SIZE (107)),
+                        twelve-one                             BIT STRING (SIZE (96)),
+                        four-four                              BIT STRING (SIZE (139)),
+                        eight-two                              BIT STRING (SIZE (139)),
+                        sixteen-one                            BIT STRING (SIZE (128))
+                    },
+                    typeII-RI-Restriction-r16              BIT STRING (SIZE(4))
+                },
+                typeII-PortSelection-r16  SEQUENCE {
+                    portSelectionSamplingSize-r16          ENUMERATED {n1, n2, n3, n4},
+                    typeII-PortSelectionRI-Restriction-r16 BIT STRING (SIZE (4))
+                }
+            },
+        numberOfPMI-SubbandsPerCQI-Subband-r16 INTEGER (1..2),
+        paramCombination-r16                   INTEGER (1..8)
+        }
+    }
+}
+
+-- TAG-CODEBOOKCONFIG-STOP
+-- TAG-COMMONLOCATIONINFO-START
+
+CommonLocationInfo-r16 ::= SEQUENCE {
+    gnss-TOD-msec-r16          OCTET STRING     OPTIONAL,
+    locationTimestamp-r16      OCTET STRING     OPTIONAL,
+    locationCoordinate-r16     OCTET STRING     OPTIONAL,
+    locationError-r16          OCTET STRING     OPTIONAL,
+    locationSource-r16         OCTET STRING     OPTIONAL,
+    velocityEstimate-r16       OCTET STRING     OPTIONAL
+}
+
+-- TAG-COMMONLOCATIONINFO-STOP
+-- TAG-CONDRECONFIGID-START
+
+CondReconfigId-r16 ::=                    INTEGER (1.. maxNrofCondCells-r16)
+
+-- TAG-CONDRECONFIGID-STOP
+-- TAG-CONDRECONFIGTOADDMODLIST-START
+
+CondReconfigToAddModList-r16 ::= SEQUENCE (SIZE (1.. maxNrofCondCells-r16)) OF CondReconfigToAddMod-r16
+
+CondReconfigToAddMod-r16 ::=     SEQUENCE {
+    condReconfigId-r16               CondReconfigId-r16,
+    condExecutionCond-r16            SEQUENCE (SIZE (1..2)) OF MeasId                      OPTIONAL,    -- Cond condReconfigAdd
+    condRRCReconfig-r16              OCTET STRING (CONTAINING RRCReconfiguration)          OPTIONAL,    -- Cond condReconfigAdd
+    ...
+}
+
+-- TAG-CONDRECONFIGTOADDMODLIST-STOP
+-- TAG-CONDITIONALRECONFIGURATION-START
+
+ConditionalReconfiguration-r16 ::=   SEQUENCE {
+    attemptCondReconfig-r16              ENUMERATED {true}              OPTIONAL,   -- Cond CHO
+    condReconfigToRemoveList-r16         CondReconfigToRemoveList-r16   OPTIONAL,   -- Need N
+    condReconfigToAddModList-r16         CondReconfigToAddModList-r16   OPTIONAL,   -- Need N
+    ...
+}
+
+CondReconfigToRemoveList-r16 ::=     SEQUENCE (SIZE (1.. maxNrofCondCells-r16)) OF CondReconfigId-r16
+
+-- TAG-CONDITIONALRECONFIGURATION-STOP
+-- TAG-CONFIGUREDGRANTCONFIG-START
+
+ConfiguredGrantConfig ::=           SEQUENCE {
+    frequencyHopping                    ENUMERATED {intraSlot, interSlot}                                       OPTIONAL,   -- Need S
+    cg-DMRS-Configuration               DMRS-UplinkConfig,
+    mcs-Table                           ENUMERATED {qam256, qam64LowSE}                                         OPTIONAL,   -- Need S
+    mcs-TableTransformPrecoder          ENUMERATED {qam256, qam64LowSE}                                         OPTIONAL,   -- Need S
+    uci-OnPUSCH                         SetupRelease { CG-UCI-OnPUSCH }                                         OPTIONAL,   -- Need M
+    resourceAllocation                  ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch },
+    rbg-Size                            ENUMERATED {config2}                                                    OPTIONAL,   -- Need S
+    powerControlLoopToUse               ENUMERATED {n0, n1},
+    p0-PUSCH-Alpha                      P0-PUSCH-AlphaSetId,
+    transformPrecoder                   ENUMERATED {enabled, disabled}                                          OPTIONAL,   -- Need S
+    nrofHARQ-Processes                  INTEGER(1..16),
+    repK                                ENUMERATED {n1, n2, n4, n8},
+    repK-RV                             ENUMERATED {s1-0231, s2-0303, s3-0000}                                  OPTIONAL,   -- Need R
+    periodicity                         ENUMERATED {
+                                                sym2, sym7, sym1x14, sym2x14, sym4x14, sym5x14, sym8x14, sym10x14, sym16x14, sym20x14,
+                                                sym32x14, sym40x14, sym64x14, sym80x14, sym128x14, sym160x14, sym256x14, sym320x14, sym512x14,
+                                                sym640x14, sym1024x14, sym1280x14, sym2560x14, sym5120x14,
+                                                sym6, sym1x12, sym2x12, sym4x12, sym5x12, sym8x12, sym10x12, sym16x12, sym20x12, sym32x12,
+                                                sym40x12, sym64x12, sym80x12, sym128x12, sym160x12, sym256x12, sym320x12, sym512x12, sym640x12,
+                                                sym1280x12, sym2560x12
+    },
+    configuredGrantTimer                INTEGER (1..64)                                                         OPTIONAL,   -- Need R
+    rrc-ConfiguredUplinkGrant           SEQUENCE {
+        timeDomainOffset                    INTEGER (0..5119),
+        timeDomainAllocation                INTEGER (0..15),
+        frequencyDomainAllocation           BIT STRING (SIZE(18)),
+        antennaPort                         INTEGER (0..31),
+        dmrs-SeqInitialization              INTEGER (0..1)                                                          OPTIONAL,   -- Need R
+        precodingAndNumberOfLayers          INTEGER (0..63),
+        srs-ResourceIndicator               INTEGER (0..15)                                                         OPTIONAL,   -- Need R
+        mcsAndTBS                           INTEGER (0..31),
+        frequencyHoppingOffset              INTEGER (1.. maxNrofPhysicalResourceBlocks-1)                           OPTIONAL,   -- Need R
+        pathlossReferenceIndex              INTEGER (0..maxNrofPUSCH-PathlossReferenceRSs-1),
+        ...,
+        [[
+        pusch-RepTypeIndicator-r16          ENUMERATED {pusch-RepTypeA,pusch-RepTypeB}                              OPTIONAL,   -- Need M
+        frequencyHoppingPUSCH-RepTypeB-r16  ENUMERATED {interRepetition, interSlot}                                 OPTIONAL,   -- Cond RepTypeB
+        timeReferenceSFN-r16                ENUMERATED {sfn512}                                                     OPTIONAL    -- Need S
+        ]]
+    }                                                                                                           OPTIONAL,   -- Need R
+    ...,
+    [[
+    cg-RetransmissionTimer-r16              INTEGER (1..64)                                                     OPTIONAL,   -- Need R
+    cg-minDFI-Delay-r16                     ENUMERATED
+                                                    {sym7, sym1x14, sym2x14, sym3x14, sym4x14, sym5x14, sym6x14, sym7x14, sym8x14,
+                                                     sym9x14, sym10x14, sym11x14, sym12x14, sym13x14, sym14x14,sym15x14, sym16x14
+                                                    }                                                   OPTIONAL,   -- Need R
+    cg-nrofPUSCH-InSlot-r16                 INTEGER (1..7)                                              OPTIONAL,   -- Need R
+    cg-nrofSlots-r16                        INTEGER (1..40)                                             OPTIONAL,   -- Need R
+    cg-StartingOffsets-r16                  CG-StartingOffsets-r16                                      OPTIONAL,   -- Need R
+    cg-UCI-Multiplexing-r16                 ENUMERATED {enabled}                                        OPTIONAL,   -- Need R
+    cg-COT-SharingOffset-r16                INTEGER (1..39)                                             OPTIONAL,   -- Need R
+    betaOffsetCG-UCI-r16                    INTEGER (0..31)                                            OPTIONAL,   -- Need R
+    cg-COT-SharingList-r16                  SEQUENCE (SIZE (1..1709)) OF CG-COT-Sharing-r16             OPTIONAL,   -- Need R
+    harq-ProcID-Offset-r16                  INTEGER (0..15)                                             OPTIONAL,   -- Need M
+    harq-ProcID-Offset2-r16                 INTEGER (0..15)                                             OPTIONAL,   -- Need M
+    configuredGrantConfigIndex-r16          ConfiguredGrantConfigIndex-r16                              OPTIONAL,   -- Cond CG-List
+    configuredGrantConfigIndexMAC-r16       ConfiguredGrantConfigIndexMAC-r16                           OPTIONAL,   -- Cond CG-IndexMAC
+    periodicityExt-r16                      INTEGER (1..5120)                                           OPTIONAL,   -- Need R
+    startingFromRV0-r16                     ENUMERATED {on, off}                                        OPTIONAL,   -- Need R
+    phy-PriorityIndex-r16                   ENUMERATED {p0, p1}                                         OPTIONAL,   -- Need R
+    autonomousTx-r16                        ENUMERATED {enabled}                                        OPTIONAL    -- Cond LCH-BasedPrioritization
+    ]]
+
+}
+
+CG-UCI-OnPUSCH ::= CHOICE {
+    dynamic                                 SEQUENCE (SIZE (1..4)) OF BetaOffsets,
+    semiStatic                              BetaOffsets
+}
+
+CG-COT-Sharing-r16 ::= CHOICE {
+    noCOT-Sharing-r16                   NULL,
+    cot-Sharing-r16                     SEQUENCE {
+         duration-r16                       INTEGER (1..39),
+         offset-r16                         INTEGER (1..39),
+         channelAccessPriority-r16          INTEGER (1..4)
+    }
+}
+
+CG-StartingOffsets-r16 ::= SEQUENCE {
+    cg-StartingFullBW-InsideCOT-r16         SEQUENCE (SIZE (1..7)) OF INTEGER (0..6)             OPTIONAL,   -- Need R
+    cg-StartingFullBW-OutsideCOT-r16        SEQUENCE (SIZE (1..7)) OF INTEGER (0..6)             OPTIONAL,   -- Need R
+    cg-StartingPartialBW-InsideCOT-r16      INTEGER (0..6)                                       OPTIONAL,   -- Need R
+    cg-StartingPartialBW-OutsideCOT-r16     INTEGER (0..6)                                       OPTIONAL    -- Need R
+}
+
+-- TAG-CONFIGUREDGRANTCONFIG-STOP
+-- TAG-CONFIGUREDGRANTCONFIGINDEX-START
+
+ConfiguredGrantConfigIndex-r16 ::= INTEGER (0.. maxNrofConfiguredGrantConfig-r16-1)
+
+-- TAG-CONFIGUREDGRANTCONFIGINDEX-STOP
+-- TAG-CONFIGUREDGRANTCONFIGINDEXMAC-START
+
+ConfiguredGrantConfigIndexMAC-r16 ::= INTEGER (0.. maxNrofConfiguredGrantConfigMAC-r16-1)
+
+-- TAG-CONFIGUREDGRANTCONFIGINDEXMAC-STOP
+-- TAG-CONNESTFAILURECONTROL-START
+
+ConnEstFailureControl ::=   SEQUENCE {
+    connEstFailCount                    ENUMERATED {n1, n2, n3, n4},
+    connEstFailOffsetValidity           ENUMERATED {s30, s60, s120, s240, s300, s420, s600, s900},
+    connEstFailOffset                   INTEGER (0..15)                                                         OPTIONAL    -- Need S
+}
+
+-- TAG-CONNESTFAILURECONTROL-STOP
+-- TAG-CONTROLRESOURCESET-START
+
+ControlResourceSet ::=              SEQUENCE {
+    controlResourceSetId                ControlResourceSetId,
+
+    frequencyDomainResources            BIT STRING (SIZE (45)),
+    duration                            INTEGER (1..maxCoReSetDuration),
+    cce-REG-MappingType                 CHOICE {
+        interleaved                         SEQUENCE {
+            reg-BundleSize                      ENUMERATED {n2, n3, n6},
+            interleaverSize                     ENUMERATED {n2, n3, n6},
+            shiftIndex                          INTEGER(0..maxNrofPhysicalResourceBlocks-1)       OPTIONAL -- Need S
+        },
+        nonInterleaved                      NULL
+    },
+    precoderGranularity                 ENUMERATED {sameAsREG-bundle, allContiguousRBs},
+    tci-StatesPDCCH-ToAddList           SEQUENCE(SIZE (1..maxNrofTCI-StatesPDCCH)) OF TCI-StateId OPTIONAL, -- Cond NotSIB1-initialBWP
+    tci-StatesPDCCH-ToReleaseList       SEQUENCE(SIZE (1..maxNrofTCI-StatesPDCCH)) OF TCI-StateId OPTIONAL, -- Cond NotSIB1-initialBWP
+    tci-PresentInDCI                        ENUMERATED {enabled}                                  OPTIONAL, -- Need S
+    pdcch-DMRS-ScramblingID                 INTEGER (0..65535)                                    OPTIONAL, -- Need S
+    ...,
+    [[
+    rb-Offset-r16                       INTEGER (0..5)                                            OPTIONAL, -- Need S
+    tci-PresentDCI-1-2-r16              INTEGER (1..3)                                            OPTIONAL, -- Need S
+    coresetPoolIndex-r16                INTEGER (0..1)                                            OPTIONAL, -- Need S
+    controlResourceSetId-v1610          ControlResourceSetId-v1610                                OPTIONAL  -- Need S
+    ]]
+}
+
+-- TAG-CONTROLRESOURCESET-STOP
+-- TAG-CONTROLRESOURCESETID-START
+
+ControlResourceSetId ::=                INTEGER (0..maxNrofControlResourceSets-1)
+
+ControlResourceSetId-r16 ::=            INTEGER (0..maxNrofControlResourceSets-1-r16)
+
+ControlResourceSetId-v1610 ::=          INTEGER (maxNrofControlResourceSets..maxNrofControlResourceSets-1-r16)
+
+-- TAG-CONTROLRESOURCESETID-STOP
+-- TAG-CONTROLRESOURCESETZERO-START
+
+ControlResourceSetZero ::=                  INTEGER (0..15)
+
+-- TAG-CONTROLRESOURCESETZERO-STOP
+-- TAG-CROSSCARRIERSCHEDULINGCONFIG-START
+
+CrossCarrierSchedulingConfig ::=        SEQUENCE {
+    schedulingCellInfo                      CHOICE {
+        own                                     SEQUENCE {                  -- Cross carrier scheduling: scheduling cell
+            cif-Presence                            BOOLEAN
+        },
+        other                                   SEQUENCE {                  -- Cross carrier scheduling: scheduled cell
+            schedulingCellId                        ServCellIndex,
+            cif-InSchedulingCell                    INTEGER (1..7)
+        }
+    },
+    ...,
+    [[
+    carrierIndicatorSize-r16            SEQUENCE {
+        carrierIndicatorSizeDCI-1-2-r16        INTEGER (0..3),
+        carrierIndicatorSizeDCI-0-2-r16        INTEGER (0..3)
+    }                                                                                       OPTIONAL,  -- Cond CIF-PRESENCE
+    enableDefaultBeamForCCS-r16         ENUMERATED {enabled}                                OPTIONAL  -- Need S
+    ]]
+}
+
+-- TAG-CROSSCARRIERSCHEDULINGCONFIG-STOP
+-- TAG-CSI-APERIODICTRIGGERSTATELIST-START
+
+CSI-AperiodicTriggerStateList ::=   SEQUENCE (SIZE (1..maxNrOfCSI-AperiodicTriggers)) OF CSI-AperiodicTriggerState
+
+CSI-AperiodicTriggerState ::=       SEQUENCE {
+    associatedReportConfigInfoList      SEQUENCE (SIZE(1..maxNrofReportConfigPerAperiodicTrigger)) OF CSI-AssociatedReportConfigInfo,
+    ...
+}
+
+CSI-AssociatedReportConfigInfo ::=  SEQUENCE {
+    reportConfigId                      CSI-ReportConfigId,
+    resourcesForChannel                 CHOICE {
+        nzp-CSI-RS                          SEQUENCE {
+            resourceSet                         INTEGER (1..maxNrofNZP-CSI-RS-ResourceSetsPerConfig),
+            qcl-info                            SEQUENCE (SIZE(1..maxNrofAP-CSI-RS-ResourcesPerSet)) OF TCI-StateId
+                                                                                                      OPTIONAL  -- Cond Aperiodic
+        },
+        csi-SSB-ResourceSet                 INTEGER (1..maxNrofCSI-SSB-ResourceSetsPerConfig)
+    },
+    csi-IM-ResourcesForInterference     INTEGER(1..maxNrofCSI-IM-ResourceSetsPerConfig)               OPTIONAL, -- Cond CSI-IM-ForInterference
+    nzp-CSI-RS-ResourcesForInterference INTEGER (1..maxNrofNZP-CSI-RS-ResourceSetsPerConfig)          OPTIONAL, -- Cond NZP-CSI-RS-ForInterference
+    ...
+}
+
+-- TAG-CSI-APERIODICTRIGGERSTATELIST-STOP
+-- TAG-CSI-FREQUENCYOCCUPATION-START
+
+CSI-FrequencyOccupation ::=         SEQUENCE {
+    startingRB                          INTEGER (0..maxNrofPhysicalResourceBlocks-1),
+    nrofRBs                             INTEGER (24..maxNrofPhysicalResourceBlocksPlus1),
+    ...
+}
+
+-- TAG-CSI-FREQUENCYOCCUPATION-STOP
+-- TAG-CSI-IM-RESOURCE-START
+
+CSI-IM-Resource ::=                 SEQUENCE {
+    csi-IM-ResourceId                   CSI-IM-ResourceId,
+    csi-IM-ResourceElementPattern           CHOICE {
+        pattern0                                SEQUENCE {
+            subcarrierLocation-p0                   ENUMERATED { s0, s2, s4, s6, s8, s10 },
+            symbolLocation-p0                       INTEGER (0..12)
+        },
+        pattern1                                SEQUENCE {
+            subcarrierLocation-p1                   ENUMERATED { s0, s4, s8 },
+            symbolLocation-p1                       INTEGER (0..13)
+        }
+    }                                                                                   OPTIONAL,   -- Need M
+    freqBand                            CSI-FrequencyOccupation                         OPTIONAL,   -- Need M
+    periodicityAndOffset                CSI-ResourcePeriodicityAndOffset                OPTIONAL,   -- Cond PeriodicOrSemiPersistent
+    ...
+}
+
+-- TAG-CSI-IM-RESOURCE-STOP
+-- TAG-CSI-IM-RESOURCEID-START
+
+CSI-IM-ResourceId ::=               INTEGER (0..maxNrofCSI-IM-Resources-1)
+
+-- TAG-CSI-IM-RESOURCEID-STOP
+-- TAG-CSI-IM-RESOURCESET-START
+
+CSI-IM-ResourceSet ::=              SEQUENCE {
+    csi-IM-ResourceSetId                CSI-IM-ResourceSetId,
+    csi-IM-Resources                    SEQUENCE (SIZE(1..maxNrofCSI-IM-ResourcesPerSet)) OF CSI-IM-ResourceId,
+    ...
+}
+-- TAG-CSI-IM-RESOURCESET-STOP
+-- TAG-CSI-IM-RESOURCESETID-START
+
+CSI-IM-ResourceSetId ::=            INTEGER (0..maxNrofCSI-IM-ResourceSets-1)
+
+-- TAG-CSI-IM-RESOURCESETID-STOP
+-- TAG-CSI-MEASCONFIG-START
+
+CSI-MeasConfig ::=                  SEQUENCE {
+    nzp-CSI-RS-ResourceToAddModList     SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-Resources)) OF NZP-CSI-RS-Resource   OPTIONAL, -- Need N
+    nzp-CSI-RS-ResourceToReleaseList    SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-Resources)) OF NZP-CSI-RS-ResourceId OPTIONAL, -- Need N
+    nzp-CSI-RS-ResourceSetToAddModList  SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-ResourceSets)) OF NZP-CSI-RS-ResourceSet
+                                                                                                                  OPTIONAL, -- Need N
+    nzp-CSI-RS-ResourceSetToReleaseList SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-ResourceSets)) OF NZP-CSI-RS-ResourceSetId
+                                                                                                                  OPTIONAL, -- Need N
+    csi-IM-ResourceToAddModList         SEQUENCE (SIZE (1..maxNrofCSI-IM-Resources)) OF CSI-IM-Resource           OPTIONAL, -- Need N
+    csi-IM-ResourceToReleaseList        SEQUENCE (SIZE (1..maxNrofCSI-IM-Resources)) OF CSI-IM-ResourceId         OPTIONAL, -- Need N
+    csi-IM-ResourceSetToAddModList      SEQUENCE (SIZE (1..maxNrofCSI-IM-ResourceSets)) OF CSI-IM-ResourceSet     OPTIONAL, -- Need N
+    csi-IM-ResourceSetToReleaseList     SEQUENCE (SIZE (1..maxNrofCSI-IM-ResourceSets)) OF CSI-IM-ResourceSetId   OPTIONAL, -- Need N
+    csi-SSB-ResourceSetToAddModList     SEQUENCE (SIZE (1..maxNrofCSI-SSB-ResourceSets)) OF CSI-SSB-ResourceSet   OPTIONAL, -- Need N
+    csi-SSB-ResourceSetToReleaseList    SEQUENCE (SIZE (1..maxNrofCSI-SSB-ResourceSets)) OF CSI-SSB-ResourceSetId OPTIONAL, -- Need N
+    csi-ResourceConfigToAddModList      SEQUENCE (SIZE (1..maxNrofCSI-ResourceConfigurations)) OF CSI-ResourceConfig
+                                                                                                                  OPTIONAL, -- Need N
+    csi-ResourceConfigToReleaseList     SEQUENCE (SIZE (1..maxNrofCSI-ResourceConfigurations)) OF CSI-ResourceConfigId
+                                                                                                                  OPTIONAL, -- Need N
+    csi-ReportConfigToAddModList        SEQUENCE (SIZE (1..maxNrofCSI-ReportConfigurations)) OF CSI-ReportConfig  OPTIONAL, -- Need N
+    csi-ReportConfigToReleaseList       SEQUENCE (SIZE (1..maxNrofCSI-ReportConfigurations)) OF CSI-ReportConfigId
+                                                                                                                  OPTIONAL, -- Need N
+    reportTriggerSize                   INTEGER (0..6)                                                            OPTIONAL, -- Need M
+    aperiodicTriggerStateList           SetupRelease { CSI-AperiodicTriggerStateList }                            OPTIONAL, -- Need M
+    semiPersistentOnPUSCH-TriggerStateList    SetupRelease { CSI-SemiPersistentOnPUSCH-TriggerStateList }         OPTIONAL, -- Need M
+    ...,
+    [[
+    reportTriggerSizeDCI-0-2-r16        INTEGER (0..6)                                                            OPTIONAL -- Need R
+    ]]
+}
+
+-- TAG-CSI-MEASCONFIG-STOP
+-- TAG-CSI-REPORTCONFIG-START
+
+CSI-ReportConfig ::=                SEQUENCE {
+    reportConfigId                          CSI-ReportConfigId,
+    carrier                                 ServCellIndex                   OPTIONAL,   -- Need S
+    resourcesForChannelMeasurement          CSI-ResourceConfigId,
+    csi-IM-ResourcesForInterference         CSI-ResourceConfigId            OPTIONAL,   -- Need R
+    nzp-CSI-RS-ResourcesForInterference     CSI-ResourceConfigId            OPTIONAL,   -- Need R
+    reportConfigType                        CHOICE {
+        periodic                                SEQUENCE {
+            reportSlotConfig                        CSI-ReportPeriodicityAndOffset,
+            pucch-CSI-ResourceList                  SEQUENCE (SIZE (1..maxNrofBWPs)) OF PUCCH-CSI-Resource
+        },
+        semiPersistentOnPUCCH                   SEQUENCE {
+            reportSlotConfig                        CSI-ReportPeriodicityAndOffset,
+            pucch-CSI-ResourceList                  SEQUENCE (SIZE (1..maxNrofBWPs)) OF PUCCH-CSI-Resource
+        },
+        semiPersistentOnPUSCH                   SEQUENCE {
+            reportSlotConfig                        ENUMERATED {sl5, sl10, sl20, sl40, sl80, sl160, sl320},
+            reportSlotOffsetList                SEQUENCE (SIZE (1.. maxNrofUL-Allocations)) OF INTEGER(0..32),
+            p0alpha                                 P0-PUSCH-AlphaSetId
+        },
+        aperiodic                               SEQUENCE {
+            reportSlotOffsetList                SEQUENCE (SIZE (1..maxNrofUL-Allocations)) OF INTEGER(0..32)
+        }
+    },
+    reportQuantity                          CHOICE {
+        none                                    NULL,
+        cri-RI-PMI-CQI                          NULL,
+        cri-RI-i1                               NULL,
+        cri-RI-i1-CQI                           SEQUENCE {
+            pdsch-BundleSizeForCSI                  ENUMERATED {n2, n4}                                         OPTIONAL    -- Need S
+        },
+        cri-RI-CQI                              NULL,
+        cri-RSRP                                NULL,
+        ssb-Index-RSRP                          NULL,
+        cri-RI-LI-PMI-CQI                       NULL
+    },
+    reportFreqConfiguration                 SEQUENCE {
+        cqi-FormatIndicator                     ENUMERATED { widebandCQI, subbandCQI }                          OPTIONAL,   -- Need R
+        pmi-FormatIndicator                     ENUMERATED { widebandPMI, subbandPMI }                          OPTIONAL,   -- Need R
+        csi-ReportingBand                       CHOICE {
+            subbands3                               BIT STRING(SIZE(3)),
+            subbands4                               BIT STRING(SIZE(4)),
+            subbands5                               BIT STRING(SIZE(5)),
+            subbands6                               BIT STRING(SIZE(6)),
+            subbands7                               BIT STRING(SIZE(7)),
+            subbands8                               BIT STRING(SIZE(8)),
+            subbands9                               BIT STRING(SIZE(9)),
+            subbands10                              BIT STRING(SIZE(10)),
+            subbands11                              BIT STRING(SIZE(11)),
+            subbands12                              BIT STRING(SIZE(12)),
+            subbands13                              BIT STRING(SIZE(13)),
+            subbands14                              BIT STRING(SIZE(14)),
+            subbands15                              BIT STRING(SIZE(15)),
+            subbands16                              BIT STRING(SIZE(16)),
+            subbands17                              BIT STRING(SIZE(17)),
+            subbands18                              BIT STRING(SIZE(18)),
+            ...,
+            subbands19-v1530                        BIT STRING(SIZE(19))
+        }   OPTIONAL    -- Need S
+
+    }                                                                                                           OPTIONAL,   -- Need R
+    timeRestrictionForChannelMeasurements           ENUMERATED {configured, notConfigured},
+    timeRestrictionForInterferenceMeasurements      ENUMERATED {configured, notConfigured},
+    codebookConfig                                  CodebookConfig                                              OPTIONAL,   -- Need R
+    dummy                                           ENUMERATED {n1, n2}                                         OPTIONAL,   -- Need R
+    groupBasedBeamReporting                     CHOICE {
+        enabled                                     NULL,
+        disabled                                    SEQUENCE {
+            nrofReportedRS                          ENUMERATED {n1, n2, n3, n4}                                 OPTIONAL    -- Need S
+        }
+    },
+    cqi-Table                   ENUMERATED {table1, table2, table3, spare1}                                     OPTIONAL,   -- Need R
+    subbandSize                 ENUMERATED {value1, value2},
+    non-PMI-PortIndication      SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-ResourcesPerConfig)) OF PortIndexFor8Ranks OPTIONAL,   -- Need R
+    ...,
+    [[
+    semiPersistentOnPUSCH-v1530         SEQUENCE {
+        reportSlotConfig-v1530              ENUMERATED {sl4, sl8, sl16}
+    }                                                                                                           OPTIONAL    -- Need R
+    ]],
+    [[
+    semiPersistentOnPUSCH-v1610         SEQUENCE {
+        reportSlotOffsetListDCI-0-2-r16     SEQUENCE (SIZE (1.. maxNrofUL-Allocations-r16)) OF INTEGER(0..32)   OPTIONAL,    -- Need R
+        reportSlotOffsetListDCI-0-1-r16     SEQUENCE (SIZE (1.. maxNrofUL-Allocations-r16)) OF INTEGER(0..32)   OPTIONAL     -- Need R
+    }                                                                                                           OPTIONAL,    -- Need R
+    aperiodic-v1610                     SEQUENCE {
+        reportSlotOffsetListDCI-0-2-r16     SEQUENCE (SIZE (1.. maxNrofUL-Allocations-r16)) OF INTEGER(0..32)   OPTIONAL,    -- Need R
+        reportSlotOffsetListDCI-0-1-r16     SEQUENCE (SIZE (1.. maxNrofUL-Allocations-r16)) OF INTEGER(0..32)   OPTIONAL     -- Need R
+    }                                                                                                           OPTIONAL,    -- Need R
+    reportQuantity-r16                  CHOICE {
+       cri-SINR-r16                         NULL,
+       ssb-Index-SINR-r16                   NULL
+    }                                                                                                           OPTIONAL,   -- Need R
+    codebookConfig-r16                          CodebookConfig-r16                                              OPTIONAL    -- Need R
+    ]]
+}
+
+CSI-ReportPeriodicityAndOffset ::=  CHOICE {
+    slots4                              INTEGER(0..3),
+    slots5                              INTEGER(0..4),
+    slots8                              INTEGER(0..7),
+    slots10                             INTEGER(0..9),
+    slots16                             INTEGER(0..15),
+    slots20                             INTEGER(0..19),
+    slots40                             INTEGER(0..39),
+    slots80                             INTEGER(0..79),
+    slots160                            INTEGER(0..159),
+    slots320                            INTEGER(0..319)
+}
+
+PUCCH-CSI-Resource ::=              SEQUENCE {
+    uplinkBandwidthPartId               BWP-Id,
+    pucch-Resource                      PUCCH-ResourceId
+}
+
+PortIndexFor8Ranks ::=              CHOICE {
+    portIndex8                          SEQUENCE{
+        rank1-8                             PortIndex8                                                      OPTIONAL,   -- Need R
+        rank2-8                             SEQUENCE(SIZE(2)) OF PortIndex8                                 OPTIONAL,   -- Need R
+        rank3-8                             SEQUENCE(SIZE(3)) OF PortIndex8                                 OPTIONAL,   -- Need R
+        rank4-8                             SEQUENCE(SIZE(4)) OF PortIndex8                                 OPTIONAL,   -- Need R
+        rank5-8                             SEQUENCE(SIZE(5)) OF PortIndex8                                 OPTIONAL,   -- Need R
+        rank6-8                             SEQUENCE(SIZE(6)) OF PortIndex8                                 OPTIONAL,   -- Need R
+        rank7-8                             SEQUENCE(SIZE(7)) OF PortIndex8                                 OPTIONAL,   -- Need R
+        rank8-8                             SEQUENCE(SIZE(8)) OF PortIndex8                                 OPTIONAL    -- Need R
+    },
+    portIndex4                          SEQUENCE{
+        rank1-4                             PortIndex4                                                      OPTIONAL,   -- Need R
+        rank2-4                             SEQUENCE(SIZE(2)) OF PortIndex4                                 OPTIONAL,   -- Need R
+        rank3-4                             SEQUENCE(SIZE(3)) OF PortIndex4                                 OPTIONAL,   -- Need R
+        rank4-4                             SEQUENCE(SIZE(4)) OF PortIndex4                                 OPTIONAL    -- Need R
+    },
+    portIndex2                          SEQUENCE{
+        rank1-2                             PortIndex2                                                      OPTIONAL,   -- Need R
+        rank2-2                             SEQUENCE(SIZE(2)) OF PortIndex2                                 OPTIONAL    -- Need R
+    },
+    portIndex1                          NULL
+}
+
+PortIndex8::=                       INTEGER (0..7)
+PortIndex4::=                       INTEGER (0..3)
+PortIndex2::=                       INTEGER (0..1)
+
+-- TAG-CSI-REPORTCONFIG-STOP
+-- TAG-CSI-REPORTCONFIGID-START
+
+CSI-ReportConfigId ::=              INTEGER (0..maxNrofCSI-ReportConfigurations-1)
+
+-- TAG-CSI-REPORTCONFIGID-STOP
+-- TAG-CSI-RESOURCECONFIG-START
+
+CSI-ResourceConfig ::=      SEQUENCE {
+    csi-ResourceConfigId        CSI-ResourceConfigId,
+    csi-RS-ResourceSetList      CHOICE {
+        nzp-CSI-RS-SSB              SEQUENCE {
+            nzp-CSI-RS-ResourceSetList  SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-ResourceSetsPerConfig)) OF NZP-CSI-RS-ResourceSetId
+                                                                                                                            OPTIONAL, -- Need R
+            csi-SSB-ResourceSetList     SEQUENCE (SIZE (1..maxNrofCSI-SSB-ResourceSetsPerConfig)) OF CSI-SSB-ResourceSetId  OPTIONAL  -- Need R
+        },
+        csi-IM-ResourceSetList      SEQUENCE (SIZE (1..maxNrofCSI-IM-ResourceSetsPerConfig)) OF CSI-IM-ResourceSetId
+    },
+
+    bwp-Id                      BWP-Id,
+    resourceType                ENUMERATED { aperiodic, semiPersistent, periodic },
+    ...
+}
+
+-- TAG-CSI-RESOURCECONFIG-STOP
+-- TAG-CSI-RESOURCECONFIGID-START
+
+CSI-ResourceConfigId ::=            INTEGER (0..maxNrofCSI-ResourceConfigurations-1)
+
+-- TAG-CSI-RESOURCECONFIGID-STOP
+-- TAG-CSI-RESOURCEPERIODICITYANDOFFSET-START
+
+CSI-ResourcePeriodicityAndOffset ::=    CHOICE {
+    slots4                                  INTEGER (0..3),
+    slots5                                  INTEGER (0..4),
+    slots8                                  INTEGER (0..7),
+    slots10                                 INTEGER (0..9),
+    slots16                                 INTEGER (0..15),
+    slots20                                 INTEGER (0..19),
+    slots32                                 INTEGER (0..31),
+    slots40                                 INTEGER (0..39),
+    slots64                                 INTEGER (0..63),
+    slots80                                 INTEGER (0..79),
+    slots160                                INTEGER (0..159),
+    slots320                                INTEGER (0..319),
+    slots640                                INTEGER (0..639)
+}
+
+-- TAG-CSI-RESOURCEPERIODICITYANDOFFSET-STOP
+-- TAG-CSI-RS-RESOURCECONFIGMOBILITY-START
+
+CSI-RS-ResourceConfigMobility ::=   SEQUENCE {
+    subcarrierSpacing                   SubcarrierSpacing,
+    csi-RS-CellList-Mobility            SEQUENCE (SIZE (1..maxNrofCSI-RS-CellsRRM)) OF CSI-RS-CellMobility,
+    ...,
+    [[
+    refServCellIndex                    ServCellIndex                                                           OPTIONAL    -- Need S
+    ]]
+
+
+}
+
+CSI-RS-CellMobility ::=             SEQUENCE {
+    cellId                              PhysCellId,
+    csi-rs-MeasurementBW                SEQUENCE {
+        nrofPRBs                            ENUMERATED { size24, size48, size96, size192, size264},
+        startPRB                            INTEGER(0..2169)
+    },
+    density                             ENUMERATED {d1,d3}                                                      OPTIONAL,   -- Need R
+    csi-rs-ResourceList-Mobility        SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesRRM)) OF CSI-RS-Resource-Mobility
+}
+
+CSI-RS-Resource-Mobility ::=        SEQUENCE {
+    csi-RS-Index                        CSI-RS-Index,
+    slotConfig                          CHOICE {
+        ms4                                 INTEGER (0..31),
+        ms5                                 INTEGER (0..39),
+        ms10                                INTEGER (0..79),
+        ms20                                INTEGER (0..159),
+        ms40                                INTEGER (0..319)
+    },
+    associatedSSB                       SEQUENCE {
+        ssb-Index                           SSB-Index,
+        isQuasiColocated                    BOOLEAN
+    }                                                                                                           OPTIONAL, -- Need R
+    frequencyDomainAllocation           CHOICE {
+        row1                                BIT STRING (SIZE (4)),
+        row2                                BIT STRING (SIZE (12))
+    },
+    firstOFDMSymbolInTimeDomain         INTEGER (0..13),
+    sequenceGenerationConfig            INTEGER (0..1023),
+    ...
+}
+
+CSI-RS-Index ::=                    INTEGER (0..maxNrofCSI-RS-ResourcesRRM-1)
+
+-- TAG-CSI-RS-RESOURCECONFIGMOBILITY-STOP
+-- TAG-CSI-RS-RESOURCEMAPPING-START
+
+CSI-RS-ResourceMapping ::=          SEQUENCE {
+    frequencyDomainAllocation           CHOICE {
+        row1                                BIT STRING (SIZE (4)),
+        row2                                BIT STRING (SIZE (12)),
+        row4                                BIT STRING (SIZE (3)),
+        other                               BIT STRING (SIZE (6))
+    },
+    nrofPorts                           ENUMERATED {p1,p2,p4,p8,p12,p16,p24,p32},
+    firstOFDMSymbolInTimeDomain         INTEGER (0..13),
+    firstOFDMSymbolInTimeDomain2        INTEGER (2..12)                                                         OPTIONAL,   -- Need R
+    cdm-Type                            ENUMERATED {noCDM, fd-CDM2, cdm4-FD2-TD2, cdm8-FD2-TD4},
+    density                             CHOICE {
+        dot5                                ENUMERATED {evenPRBs, oddPRBs},
+        one                                 NULL,
+        three                               NULL,
+        spare                               NULL
+    },
+    freqBand                            CSI-FrequencyOccupation,
+    ...
+}
+
+-- TAG-CSI-RS-RESOURCEMAPPING-STOP
+-- TAG-CSI-SEMIPERSISTENTONPUSCHTRIGGERSTATELIST-START
+
+CSI-SemiPersistentOnPUSCH-TriggerStateList ::= SEQUENCE(SIZE (1..maxNrOfSemiPersistentPUSCH-Triggers)) OF CSI-SemiPersistentOnPUSCH-TriggerState
+
+CSI-SemiPersistentOnPUSCH-TriggerState ::=     SEQUENCE {
+    associatedReportConfigInfo                     CSI-ReportConfigId,
+    ...
+}
+
+-- TAG-CSI-SEMIPERSISTENTONPUSCHTRIGGERSTATELIST-STOP
+-- TAG-CSI-SSB-RESOURCESET-START
+
+CSI-SSB-ResourceSet ::=             SEQUENCE {
+    csi-SSB-ResourceSetId               CSI-SSB-ResourceSetId,
+    csi-SSB-ResourceList                SEQUENCE (SIZE(1..maxNrofCSI-SSB-ResourcePerSet)) OF SSB-Index,
+    ...
+}
+
+-- TAG-CSI-SSB-RESOURCESET-STOP
+-- TAG-CSI-SSB-RESOURCESETID-START
+
+CSI-SSB-ResourceSetId ::=           INTEGER (0..maxNrofCSI-SSB-ResourceSets-1)
+
+-- TAG-CSI-SSB-RESOURCESETID-STOP
+-- TAG-DEDICATED-NAS-MESSAGE-START
+
+DedicatedNAS-Message ::=        OCTET STRING
+
+-- TAG-DEDICATED-NAS-MESSAGE-STOP
+-- TAG-DMRS-DOWNLINKCONFIG-START
+
+DMRS-DownlinkConfig ::=             SEQUENCE {
+    dmrs-Type                           ENUMERATED {type2}                                                      OPTIONAL,   -- Need S
+    dmrs-AdditionalPosition             ENUMERATED {pos0, pos1, pos3}                                           OPTIONAL,   -- Need S
+    maxLength                           ENUMERATED {len2}                                                       OPTIONAL,   -- Need S
+    scramblingID0                       INTEGER (0..65535)                                                      OPTIONAL,   -- Need S
+    scramblingID1                       INTEGER (0..65535)                                                      OPTIONAL,   -- Need S
+    phaseTrackingRS                     SetupRelease { PTRS-DownlinkConfig  }                                   OPTIONAL,   -- Need M
+    ...,
+    [[
+    dmrs-Downlink-r16               ENUMERATED {enabled}                                                        OPTIONAL    -- Need R
+    ]]
+
+}
+
+-- TAG-DMRS-DOWNLINKCONFIG-STOP
+-- TAG-DMRS-UPLINKCONFIG-START
+
+DMRS-UplinkConfig ::=               SEQUENCE {
+    dmrs-Type                           ENUMERATED {type2}                                                  OPTIONAL,   -- Need S
+    dmrs-AdditionalPosition             ENUMERATED {pos0, pos1, pos3}                                       OPTIONAL,   -- Need S
+    phaseTrackingRS                     SetupRelease { PTRS-UplinkConfig }                                  OPTIONAL,   -- Need M
+    maxLength                           ENUMERATED {len2}                                                   OPTIONAL,   -- Need S
+    transformPrecodingDisabled          SEQUENCE {
+        scramblingID0                       INTEGER (0..65535)                                              OPTIONAL,   -- Need S
+        scramblingID1                       INTEGER (0..65535)                                              OPTIONAL,   -- Need S
+        ...,
+        [[
+        dmrs-Uplink-r16                     ENUMERATED {enabled}                                            OPTIONAL    -- Need R
+        ]]
+    }                                                                                                       OPTIONAL,   -- Need R
+    transformPrecodingEnabled           SEQUENCE {
+        nPUSCH-Identity                     INTEGER(0..1007)                                                OPTIONAL,   -- Need S
+        sequenceGroupHopping                ENUMERATED {disabled}                                           OPTIONAL,   -- Need S
+        sequenceHopping                     ENUMERATED {enabled}                                            OPTIONAL,   -- Need S
+        ...,
+        [[
+        dmrs-UplinkTransformPrecoding-r16   SetupRelease {DMRS-UplinkTransformPrecoding-r16}                OPTIONAL    -- Need M
+        ]]
+    }                                                                                                       OPTIONAL,   -- Need R
+    ...
+}
+
+DMRS-UplinkTransformPrecoding-r16  ::=  SEQUENCE {
+    pi2BPSK-ScramblingID0                   INTEGER(0..65535)                                               OPTIONAL,   -- Need S
+    pi2BPSK-ScramblingID1                   INTEGER(0..65535)                                               OPTIONAL    -- Need S
+}
+
+-- TAG-DMRS-UPLINKCONFIG-STOP
+-- TAG-DOWNLINKCONFIGCOMMON-START
+
+DownlinkConfigCommon ::=        SEQUENCE {
+    frequencyInfoDL                 FrequencyInfoDL                                 OPTIONAL,   -- Cond InterFreqHOAndServCellAdd
+    initialDownlinkBWP              BWP-DownlinkCommon                              OPTIONAL,   -- Cond ServCellAdd
+    ...
+}
+
+-- TAG-DOWNLINKCONFIGCOMMON-STOP
+-- TAG-DOWNLINKCONFIGCOMMONSIB-START
+
+DownlinkConfigCommonSIB ::=     SEQUENCE {
+    frequencyInfoDL                 FrequencyInfoDL-SIB,
+    initialDownlinkBWP              BWP-DownlinkCommon,
+    bcch-Config                         BCCH-Config,
+    pcch-Config                         PCCH-Config,
+    ...
+}
+
+
+BCCH-Config ::=                 SEQUENCE {
+    modificationPeriodCoeff         ENUMERATED {n2, n4, n8, n16},
+    ...
+}
+
+
+PCCH-Config ::=             SEQUENCE {
+    defaultPagingCycle                  PagingCycle,
+    nAndPagingFrameOffset               CHOICE {
+        oneT                                NULL,
+        halfT                               INTEGER (0..1),
+        quarterT                            INTEGER (0..3),
+        oneEighthT                          INTEGER (0..7),
+        oneSixteenthT                       INTEGER (0..15)
+    },
+    ns                                  ENUMERATED {four, two, one},
+    firstPDCCH-MonitoringOccasionOfPO   CHOICE {
+        sCS15KHZoneT                                                                SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..139),
+        sCS30KHZoneT-SCS15KHZhalfT                                                  SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..279),
+        sCS60KHZoneT-SCS30KHZhalfT-SCS15KHZquarterT                                 SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..559),
+        sCS120KHZoneT-SCS60KHZhalfT-SCS30KHZquarterT-SCS15KHZoneEighthT             SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..1119),
+        sCS120KHZhalfT-SCS60KHZquarterT-SCS30KHZoneEighthT-SCS15KHZoneSixteenthT    SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..2239),
+        sCS120KHZquarterT-SCS60KHZoneEighthT-SCS30KHZoneSixteenthT                  SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..4479),
+        sCS120KHZoneEighthT-SCS60KHZoneSixteenthT                                   SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..8959),
+        sCS120KHZoneSixteenthT                                                      SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..17919)
+    }      OPTIONAL,           -- Need R
+    ...,
+    [[
+    nrofPDCCH-MonitoringOccasionPerSSB-InPO-r16                                  INTEGER (2..4)             OPTIONAL  -- Cond SharedSpectrum2
+    ]]
+}
+
+-- TAG-DOWNLINKCONFIGCOMMONSIB-STOP
+-- TAG-DOWNLINKPREEMPTION-START
+
+DownlinkPreemption ::=              SEQUENCE {
+    int-RNTI                            RNTI-Value,
+    timeFrequencySet                    ENUMERATED {set0, set1},
+    dci-PayloadSize                     INTEGER (0..maxINT-DCI-PayloadSize),
+    int-ConfigurationPerServingCell     SEQUENCE (SIZE (1..maxNrofServingCells)) OF INT-ConfigurationPerServingCell,
+    ...
+}
+
+INT-ConfigurationPerServingCell ::= SEQUENCE {
+    servingCellId                       ServCellIndex,
+    positionInDCI                       INTEGER (0..maxINT-DCI-PayloadSize-1)
+}
+
+-- TAG-DOWNLINKPREEMPTION-STOP
+-- TAG-DRB-IDENTITY-START
+
+DRB-Identity ::=                    INTEGER (1..32)
+
+-- TAG-DRB-IDENTITY-STOP
+-- TAG-DRX-CONFIG-START
+
+DRX-Config ::=                      SEQUENCE {
+    drx-onDurationTimer                 CHOICE {
+                                            subMilliSeconds INTEGER (1..31),
+                                            milliSeconds    ENUMERATED {
+                                                ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60,
+                                                ms80, ms100, ms200, ms300, ms400, ms500, ms600, ms800, ms1000, ms1200,
+                                                ms1600, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+                                            },
+    drx-InactivityTimer                 ENUMERATED {
+                                            ms0, ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60, ms80,
+                                            ms100, ms200, ms300, ms500, ms750, ms1280, ms1920, ms2560, spare9, spare8,
+                                            spare7, spare6, spare5, spare4, spare3, spare2, spare1},
+    drx-HARQ-RTT-TimerDL                INTEGER (0..56),
+    drx-HARQ-RTT-TimerUL                INTEGER (0..56),
+    drx-RetransmissionTimerDL           ENUMERATED {
+                                            sl0, sl1, sl2, sl4, sl6, sl8, sl16, sl24, sl33, sl40, sl64, sl80, sl96, sl112, sl128,
+                                            sl160, sl320, spare15, spare14, spare13, spare12, spare11, spare10, spare9,
+                                            spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1},
+    drx-RetransmissionTimerUL           ENUMERATED {
+                                            sl0, sl1, sl2, sl4, sl6, sl8, sl16, sl24, sl33, sl40, sl64, sl80, sl96, sl112, sl128,
+                                            sl160, sl320, spare15, spare14, spare13, spare12, spare11, spare10, spare9,
+                                            spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 },
+    drx-LongCycleStartOffset            CHOICE {
+        ms10                                INTEGER(0..9),
+        ms20                                INTEGER(0..19),
+        ms32                                INTEGER(0..31),
+        ms40                                INTEGER(0..39),
+        ms60                                INTEGER(0..59),
+        ms64                                INTEGER(0..63),
+        ms70                                INTEGER(0..69),
+        ms80                                INTEGER(0..79),
+        ms128                               INTEGER(0..127),
+        ms160                               INTEGER(0..159),
+        ms256                               INTEGER(0..255),
+        ms320                               INTEGER(0..319),
+        ms512                               INTEGER(0..511),
+        ms640                               INTEGER(0..639),
+        ms1024                              INTEGER(0..1023),
+        ms1280                              INTEGER(0..1279),
+        ms2048                              INTEGER(0..2047),
+        ms2560                              INTEGER(0..2559),
+        ms5120                              INTEGER(0..5119),
+        ms10240                             INTEGER(0..10239)
+    },
+    shortDRX                            SEQUENCE {
+        drx-ShortCycle                      ENUMERATED  {
+                                                ms2, ms3, ms4, ms5, ms6, ms7, ms8, ms10, ms14, ms16, ms20, ms30, ms32,
+                                                ms35, ms40, ms64, ms80, ms128, ms160, ms256, ms320, ms512, ms640, spare9,
+                                                spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 },
+        drx-ShortCycleTimer                 INTEGER (1..16)
+    }                                                                                                           OPTIONAL,   -- Need R
+    drx-SlotOffset                      INTEGER (0..31)
+}
+
+-- TAG-DRX-CONFIG-STOP
+-- TAG-DRX-CONFIGSECONDARYGROUP-START
+
+DRX-ConfigSecondaryGroup ::=       SEQUENCE {
+    drx-onDurationTimer                CHOICE {
+                                           subMilliSeconds INTEGER (1..31),
+                                           milliSeconds    ENUMERATED {
+                                               ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60,
+                                               ms80, ms100, ms200, ms300, ms400, ms500, ms600, ms800, ms1000, ms1200,
+                                               ms1600, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+                                            },
+    drx-InactivityTimer                ENUMERATED {
+                                           ms0, ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60, ms80,
+                                           ms100, ms200, ms300, ms500, ms750, ms1280, ms1920, ms2560, spare9, spare8,
+                                           spare7, spare6, spare5, spare4, spare3, spare2, spare1}
+}
+
+-- TAG-DRX-CONFIGSECONDARYGROUP-STOP
+-- TAG-FILTERCOEFFICIENT-START
+
+FilterCoefficient ::=       ENUMERATED { fc0, fc1, fc2, fc3, fc4, fc5, fc6, fc7, fc8, fc9, fc11, fc13, fc15, fc17, fc19, spare1, ...}
+
+-- TAG-FILTERCOEFFICIENT-STOP
+-- TAG-FREQBANDINDICATORNR-START
+
+FreqBandIndicatorNR ::=             INTEGER (1..1024)
+
+-- TAG-FREQBANDINDICATORNR-STOP
+-- TAG-FREQUENCYINFODL-START
+
+FrequencyInfoDL ::=                 SEQUENCE {
+    absoluteFrequencySSB                ARFCN-ValueNR                                                   OPTIONAL,   -- Cond SpCellAdd
+    frequencyBandList                   MultiFrequencyBandListNR,
+    absoluteFrequencyPointA             ARFCN-ValueNR,
+    scs-SpecificCarrierList             SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier,
+    ...
+}
+
+-- TAG-FREQUENCYINFODL-STOP
+-- TAG-FREQUENCYINFODL-SIB-START
+
+FrequencyInfoDL-SIB ::=             SEQUENCE {
+    frequencyBandList                   MultiFrequencyBandListNR-SIB,
+    offsetToPointA                      INTEGER (0..2199),
+    scs-SpecificCarrierList             SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier
+}
+
+-- TAG-FREQUENCYINFODL-SIB-STOP
+-- TAG-FREQUENCYINFOUL-START
+
+FrequencyInfoUL ::=                 SEQUENCE {
+    frequencyBandList                   MultiFrequencyBandListNR                                OPTIONAL,   -- Cond FDD-OrSUL
+    absoluteFrequencyPointA             ARFCN-ValueNR                                           OPTIONAL,   -- Cond FDD-OrSUL
+    scs-SpecificCarrierList             SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier,
+    additionalSpectrumEmission          AdditionalSpectrumEmission                              OPTIONAL,   -- Need S
+    p-Max                               P-Max                                                   OPTIONAL,   -- Need S
+    frequencyShift7p5khz                ENUMERATED {true}                                       OPTIONAL,   -- Cond FDD-TDD-OrSUL-Optional
+    ...
+}
+
+-- TAG-FREQUENCYINFOUL-STOP
+-- TAG-FREQUENCYINFOUL-SIB-START
+
+FrequencyInfoUL-SIB ::=                 SEQUENCE {
+    frequencyBandList                   MultiFrequencyBandListNR-SIB                            OPTIONAL,   -- Cond FDD-OrSUL
+    absoluteFrequencyPointA             ARFCN-ValueNR                                           OPTIONAL,   -- Cond FDD-OrSUL
+    scs-SpecificCarrierList             SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier,
+    p-Max                               P-Max                                                   OPTIONAL,   -- Need S
+    frequencyShift7p5khz                ENUMERATED {true}                                       OPTIONAL,   -- Cond FDD-TDD-OrSUL-Optional
+    ...
+}
+
+-- TAG-FREQUENCYINFOUL-SIB-STOP
+-- TAG-HIGHSPEEDCONFIG-START
+
+HighSpeedConfig-r16 ::=  SEQUENCE {
+    highSpeedMeasFlag-r16    ENUMERATED {true}        OPTIONAL,   -- Need R
+    highSpeedDemodFlag-r16   ENUMERATED {true}        OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-HIGHSPEEDCONFIG-STOP
+-- TAG-HYSTERESIS-START
+
+Hysteresis ::=                      INTEGER (0..30)
+
+-- TAG-HYSTERESIS-STOP
+-- TAG-INVALIDSYMBOLPATTERN-START
+
+InvalidSymbolPattern-r16 ::=     SEQUENCE {
+    symbols-r16                      CHOICE {
+        oneSlot                          BIT STRING (SIZE (14)),
+        twoSlots                         BIT STRING (SIZE (28))
+    },
+    periodicityAndPattern-r16        CHOICE {
+        n2                               BIT STRING (SIZE (2)),
+        n4                               BIT STRING (SIZE (4)),
+        n5                               BIT STRING (SIZE (5)),
+        n8                               BIT STRING (SIZE (8)),
+        n10                              BIT STRING (SIZE (10)),
+        n20                              BIT STRING (SIZE (20)),
+        n40                              BIT STRING (SIZE (40))
+    }                                                                OPTIONAL,   -- Need M
+    ...
+}
+
+-- TAG-INVALIDSYMBOLPATTERN-STOP
+-- TAG-I-RNTI-VALUE-START
+
+I-RNTI-Value ::=                        BIT STRING (SIZE(40))
+
+-- TAG-I-RNTI-VALUE-STOP
+-- TAG-LBT-FAILURERECOVERYCONFIG-START
+
+LBT-FailureRecoveryConfig-r16 ::=    SEQUENCE {
+    lbt-FailureInstanceMaxCount-r16      ENUMERATED {n4, n8, n16, n32, n64, n128},
+    lbt-FailureDetectionTimer-r16        ENUMERATED {ms10, ms20, ms40, ms80, ms160, ms320},
+    ...
+}
+
+-- TAG-LBT-FAILURERECOVERYCONFIG-STOP
+-- TAG-LOCATIONINFO-START
+
+LocationInfo-r16 ::=      SEQUENCE {
+    commonLocationInfo-r16    CommonLocationInfo-r16          OPTIONAL,
+    bt-LocationInfo-r16       LogMeasResultListBT-r16         OPTIONAL,
+    wlan-LocationInfo-r16     LogMeasResultListWLAN-r16       OPTIONAL,
+    sensor-LocationInfo-r16   Sensor-LocationInfo-r16         OPTIONAL,
+    ...
+}
+
+-- TAG-LOCATIONINFO-STOP
+-- TAG-LOCATIONMEASUREMENTINFO-START
+
+LocationMeasurementInfo ::=     CHOICE {
+    eutra-RSTD                  EUTRA-RSTD-InfoList,
+    ...,
+    eutra-FineTimingDetection   NULL,
+    nr-PRS-Measurement-r16      NR-PRS-MeasurementInfoList-r16
+}
+
+EUTRA-RSTD-InfoList ::= SEQUENCE (SIZE (1..maxInterRAT-RSTD-Freq)) OF EUTRA-RSTD-Info
+
+EUTRA-RSTD-Info ::= SEQUENCE {
+    carrierFreq                 ARFCN-ValueEUTRA,
+    measPRS-Offset              INTEGER (0..39),
+    ...
+}
+
+NR-PRS-MeasurementInfoList-r16 ::= SEQUENCE (SIZE (1..maxFreqLayers)) OF NR-PRS-MeasurementInfo-r16
+
+NR-PRS-MeasurementInfo-r16 ::=      SEQUENCE {
+    dl-PRS-PointA-r16                   ARFCN-ValueNR,
+    nr-MeasPRS-RepetitionAndOffset-r16  CHOICE {
+        ms20-r16                            INTEGER (0..19),
+        ms40-r16                            INTEGER (0..39),
+        ms80-r16                            INTEGER (0..79),
+        ms160-r16                           INTEGER (0..159),
+        ...
+    },
+    nr-MeasPRS-length-r16               ENUMERATED {ms1dot5, ms3, ms3dot5, ms4, ms5dot5, ms6, ms10, ms20},
+    ...
+}
+
+-- TAG-LOCATIONMEASUREMENTINFO-STOP
+-- TAG-LOGICALCHANNELCONFIG-START
+
+LogicalChannelConfig ::=            SEQUENCE {
+    ul-SpecificParameters               SEQUENCE {
+        priority                            INTEGER (1..16),
+        prioritisedBitRate                  ENUMERATED {kBps0, kBps8, kBps16, kBps32, kBps64, kBps128, kBps256, kBps512,
+                                            kBps1024, kBps2048, kBps4096, kBps8192, kBps16384, kBps32768, kBps65536, infinity},
+        bucketSizeDuration                  ENUMERATED {ms5, ms10, ms20, ms50, ms100, ms150, ms300, ms500, ms1000,
+                                                            spare7, spare6, spare5, spare4, spare3,spare2, spare1},
+        allowedServingCells                 SEQUENCE (SIZE (1..maxNrofServingCells-1)) OF ServCellIndex
+                                                                                                            OPTIONAL,   -- Cond PDCP-CADuplication
+        allowedSCS-List                     SEQUENCE (SIZE (1..maxSCSs)) OF SubcarrierSpacing                   OPTIONAL,   -- Need R
+        maxPUSCH-Duration                   ENUMERATED {ms0p02, ms0p04, ms0p0625, ms0p125, ms0p25, ms0p5, spare2, spare1}
+                                                                                                                OPTIONAL,   -- Need R
+        configuredGrantType1Allowed         ENUMERATED {true}                                                   OPTIONAL,   -- Need R
+        logicalChannelGroup                 INTEGER (0..maxLCG-ID)                                              OPTIONAL,   -- Need R
+        schedulingRequestID                 SchedulingRequestId                                                 OPTIONAL,   -- Need R
+        logicalChannelSR-Mask               BOOLEAN,
+        logicalChannelSR-DelayTimerApplied  BOOLEAN,
+        ...,
+        bitRateQueryProhibitTimer       ENUMERATED {s0, s0dot4, s0dot8, s1dot6, s3, s6, s12, s30}               OPTIONAL,    -- Need R
+        [[
+        allowedCG-List-r16                  SEQUENCE (SIZE (0.. maxNrofConfiguredGrantConfigMAC-r16-1)) OF ConfiguredGrantConfigIndexMAC-r16
+                                                                                                                OPTIONAL,   -- Need S
+        allowedPHY-PriorityIndex-r16        ENUMERATED {p0, p1}                                                 OPTIONAL    -- Need S
+        ]]
+    }                                                                                                       OPTIONAL,   -- Cond UL
+    ...,
+    [[
+    channelAccessPriority-r16           INTEGER (1..4)                                                      OPTIONAL,   -- Need R
+    bitRateMultiplier-r16               ENUMERATED {x40, x70, x100, x200}                                   OPTIONAL    -- Need R
+    ]]
+}
+
+-- TAG-LOGICALCHANNELCONFIG-STOP
+-- TAG-LOGICALCHANNELIDENTITY-START
+
+LogicalChannelIdentity ::=          INTEGER (1..maxLC-ID)
+
+-- TAG-LOGICALCHANNELIDENTITY-STOP
+-- TAG-MAC-CELLGROUPCONFIG-START
+
+MAC-CellGroupConfig ::=             SEQUENCE {
+    drx-Config                          SetupRelease { DRX-Config }                                     OPTIONAL,   -- Need M
+    schedulingRequestConfig             SchedulingRequestConfig                                         OPTIONAL,   -- Need M
+    bsr-Config                          BSR-Config                                                      OPTIONAL,   -- Need M
+    tag-Config                          TAG-Config                                                      OPTIONAL,   -- Need M
+    phr-Config                          SetupRelease { PHR-Config }                                     OPTIONAL,   -- Need M
+    skipUplinkTxDynamic                 BOOLEAN,
+    ...,
+    [[
+    csi-Mask                            BOOLEAN                                                         OPTIONAL,   -- Need M
+    dataInactivityTimer                 SetupRelease { DataInactivityTimer }                            OPTIONAL    -- Cond MCG-Only
+    ]],
+    [[
+    usePreBSR-r16                       ENUMERATED {true}                                               OPTIONAL,   -- Need R
+    schedulingRequestID-LBT-SCell-r16   SchedulingRequestId                                             OPTIONAL,   -- Need R
+    lch-BasedPrioritization-r16         ENUMERATED {enabled}                                            OPTIONAL,   -- Need R
+    schedulingRequestID-BFR-SCell-r16   SchedulingRequestId                                             OPTIONAL,   -- Need R
+    drx-ConfigSecondaryGroup-r16        SetupRelease { DRX-ConfigSecondaryGroup }                       OPTIONAL    -- Need M
+    ]],
+    [[
+    enhancedSkipUplinkTxDynamic-r16     ENUMERATED {true}                                               OPTIONAL,   -- Need R
+    enhancedSkipUplinkTxConfigured-r16  ENUMERATED {true}                                               OPTIONAL    -- Need R
+    ]]
+}
+
+DataInactivityTimer ::=         ENUMERATED {s1, s2, s3, s5, s7, s10, s15, s20, s40, s50, s60, s80, s100, s120, s150, s180}
+
+-- TAG-MAC-CELLGROUPCONFIG-STOP
+-- TAG-MEASCONFIG-START
+
+MeasConfig ::=                      SEQUENCE {
+    measObjectToRemoveList              MeasObjectToRemoveList                                              OPTIONAL,   -- Need N
+    measObjectToAddModList              MeasObjectToAddModList                                              OPTIONAL,   -- Need N
+    reportConfigToRemoveList            ReportConfigToRemoveList                                            OPTIONAL,   -- Need N
+    reportConfigToAddModList            ReportConfigToAddModList                                            OPTIONAL,   -- Need N
+    measIdToRemoveList                  MeasIdToRemoveList                                                  OPTIONAL,   -- Need N
+    measIdToAddModList                  MeasIdToAddModList                                                  OPTIONAL,   -- Need N
+    s-MeasureConfig                     CHOICE {
+        ssb-RSRP                            RSRP-Range,
+        csi-RSRP                            RSRP-Range
+    }                                                                                                       OPTIONAL,   -- Need M
+    quantityConfig                      QuantityConfig                                                      OPTIONAL,   -- Need M
+    measGapConfig                       MeasGapConfig                                                       OPTIONAL,   -- Need M
+    measGapSharingConfig                MeasGapSharingConfig                                                OPTIONAL,   -- Need M
+    ...,
+    [[
+    interFrequencyConfig-NoGap-r16      ENUMERATED {true}                                                   OPTIONAL    -- Need R
+    ]]
+}
+
+MeasObjectToRemoveList ::=              SEQUENCE (SIZE (1..maxNrofObjectId)) OF MeasObjectId
+
+MeasIdToRemoveList ::=                  SEQUENCE (SIZE (1..maxNrofMeasId)) OF MeasId
+
+ReportConfigToRemoveList ::=            SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigId
+
+-- TAG-MEASCONFIG-STOP
+-- TAG-MEASGAPCONFIG-START
+
+MeasGapConfig ::=                   SEQUENCE {
+    gapFR2                              SetupRelease { GapConfig }                                              OPTIONAL,   -- Need M
+    ...,
+    [[
+    gapFR1                              SetupRelease { GapConfig }                                              OPTIONAL,   -- Need M
+    gapUE                               SetupRelease { GapConfig }                                              OPTIONAL    -- Need M
+    ]]
+
+}
+
+GapConfig ::=                       SEQUENCE {
+    gapOffset                           INTEGER (0..159),
+    mgl                                 ENUMERATED {ms1dot5, ms3, ms3dot5, ms4, ms5dot5, ms6},
+    mgrp                                ENUMERATED {ms20, ms40, ms80, ms160},
+    mgta                                ENUMERATED {ms0, ms0dot25, ms0dot5},
+    ...,
+    [[
+    refServCellIndicator                ENUMERATED {pCell, pSCell, mcg-FR2}                                 OPTIONAL   -- Cond NEDCorNRDC
+    ]],
+    [[
+    refFR2ServCellAsyncCA-r16           ServCellIndex                                                       OPTIONAL,   -- Cond AsyncCA
+    mgl-r16                             ENUMERATED {ms10, ms20}                                             OPTIONAL    -- Cond PRS
+    ]]
+}
+
+-- TAG-MEASGAPCONFIG-STOP
+-- TAG-MEASGAPSHARINGCONFIG-START
+
+MeasGapSharingConfig ::=        SEQUENCE {
+    gapSharingFR2                   SetupRelease { MeasGapSharingScheme }       OPTIONAL,   -- Need M
+    ...,
+    [[
+    gapSharingFR1                   SetupRelease { MeasGapSharingScheme }       OPTIONAL,   --Need M
+    gapSharingUE                    SetupRelease { MeasGapSharingScheme }       OPTIONAL    --Need M
+    ]]
+}
+
+MeasGapSharingScheme::=         ENUMERATED {scheme00, scheme01, scheme10, scheme11}
+
+-- TAG-MEASGAPSHARINGCONFIG-STOP
+-- TAG-MEASID-START
+
+MeasId ::=                          INTEGER (1..maxNrofMeasId)
+
+-- TAG-MEASID-STOP
+-- TAG-MEASIDLECONFIG-START
+
+MeasIdleConfigSIB-r16 ::= SEQUENCE {
+    measIdleCarrierListNR-r16       SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierNR-r16          OPTIONAL,     -- Need S
+    measIdleCarrierListEUTRA-r16    SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierEUTRA-r16       OPTIONAL,     -- Need S
+    ...
+}
+
+MeasIdleConfigDedicated-r16 ::= SEQUENCE {
+    measIdleCarrierListNR-r16       SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierNR-r16          OPTIONAL,     -- Need N
+    measIdleCarrierListEUTRA-r16    SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierEUTRA-r16       OPTIONAL,     -- Need N
+    measIdleDuration-r16            ENUMERATED{sec10, sec30, sec60, sec120, sec180, sec240, sec300, spare},
+    validityAreaList-r16            ValidityAreaList-r16                                                   OPTIONAL,     -- Need N
+    ...
+}
+
+ValidityAreaList-r16 ::= SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF ValidityArea-r16
+
+ValidityArea-r16 ::=             SEQUENCE {
+    carrierFreq-r16                  ARFCN-ValueNR,
+    validityCellList-r16             ValidityCellList                                                     OPTIONAL   -- Need N
+}
+
+ValidityCellList ::= SEQUENCE (SIZE (1.. maxCellMeasIdle-r16)) OF PCI-Range
+
+MeasIdleCarrierNR-r16 ::=        SEQUENCE {
+    carrierFreq-r16                  ARFCN-ValueNR,
+    ssbSubcarrierSpacing-r16         SubcarrierSpacing,
+    frequencyBandList                MultiFrequencyBandListNR                                             OPTIONAL,  -- Need R
+    measCellListNR-r16               CellListNR-r16                                                       OPTIONAL,  -- Need R
+    reportQuantities-r16             ENUMERATED {rsrp, rsrq, both},
+    qualityThreshold-r16             SEQUENCE {
+        idleRSRP-Threshold-NR-r16        RSRP-Range                                                           OPTIONAL,  -- Need R
+        idleRSRQ-Threshold-NR-r16        RSRQ-Range                                                           OPTIONAL   -- Need R
+    }                                                                                                     OPTIONAL,  -- Need R
+    ssb-MeasConfig-r16               SEQUENCE {
+        nrofSS-BlocksToAverage-r16          INTEGER (2..maxNrofSS-BlocksToAverage)                            OPTIONAL,   -- Need S
+        absThreshSS-BlocksConsolidation-r16 ThresholdNR                                                       OPTIONAL,   -- Need S
+        smtc-r16                            SSB-MTC                                                           OPTIONAL,   -- Need S
+        ssb-ToMeasure-r16                   SSB-ToMeasure                                                     OPTIONAL,   -- Need S
+        deriveSSB-IndexFromCell-r16         BOOLEAN,
+        ss-RSSI-Measurement-r16             SS-RSSI-Measurement                                               OPTIONAL    -- Need S
+    }                                                                                                     OPTIONAL,  -- Need S
+    beamMeasConfigIdle-r16           BeamMeasConfigIdle-NR-r16                                            OPTIONAL,  -- Need R
+    ...
+}
+
+MeasIdleCarrierEUTRA-r16 ::=     SEQUENCE {
+    carrierFreqEUTRA-r16             ARFCN-ValueEUTRA,
+    allowedMeasBandwidth-r16         EUTRA-AllowedMeasBandwidth,
+    measCellListEUTRA-r16            CellListEUTRA-r16                                                    OPTIONAL,  -- Need R
+    reportQuantitiesEUTRA-r16        ENUMERATED {rsrp, rsrq, both},
+    qualityThresholdEUTRA-r16        SEQUENCE {
+        idleRSRP-Threshold-EUTRA-r16     RSRP-RangeEUTRA                                                      OPTIONAL,  -- Need R
+        idleRSRQ-Threshold-EUTRA-r16     RSRQ-RangeEUTRA-r16                                                  OPTIONAL   -- Need R
+    }                                                                                                     OPTIONAL,  -- Need S
+    ...
+}
+
+CellListNR-r16  ::=       SEQUENCE (SIZE (1..maxCellMeasIdle-r16)) OF PCI-Range
+
+CellListEUTRA-r16  ::=    SEQUENCE (SIZE (1..maxCellMeasIdle-r16)) OF EUTRA-PhysCellIdRange
+
+BeamMeasConfigIdle-NR-r16  ::=   SEQUENCE {
+    reportQuantityRS-Indexes-r16     ENUMERATED {rsrp, rsrq, both},
+    maxNrofRS-IndexesToReport-r16    INTEGER (1.. maxNrofIndexesToReport),
+    includeBeamMeasurements-r16      BOOLEAN
+}
+
+RSRQ-RangeEUTRA-r16 ::=   INTEGER (-30..46)
+
+-- TAG-MEASIDLECONFIG-STOP
+-- TAG-MEASIDTOADDMODLIST-START
+
+MeasIdToAddModList ::=              SEQUENCE (SIZE (1..maxNrofMeasId)) OF MeasIdToAddMod
+
+MeasIdToAddMod ::=                  SEQUENCE {
+    measId                              MeasId,
+    measObjectId                        MeasObjectId,
+    reportConfigId                      ReportConfigId
+}
+
+-- TAG-MEASIDTOADDMODLIST-STOP
+-- TAG-MEASOBJECTCLI-START
+
+MeasObjectCLI-r16 ::=                  SEQUENCE {
+     cli-ResourceConfig-r16               CLI-ResourceConfig-r16,
+    ...
+}
+
+CLI-ResourceConfig-r16 ::=          SEQUENCE {
+    srs-ResourceConfig-r16              SetupRelease { SRS-ResourceListConfigCLI-r16 }                 OPTIONAL,   -- Need M
+    rssi-ResourceConfig-r16             SetupRelease { RSSI-ResourceListConfigCLI-r16 }                OPTIONAL    -- Need M
+}
+
+SRS-ResourceListConfigCLI-r16 ::=   SEQUENCE (SIZE (1.. maxNrofCLI-SRS-Resources-r16)) OF SRS-ResourceConfigCLI-r16
+
+RSSI-ResourceListConfigCLI-r16 ::=  SEQUENCE (SIZE (1.. maxNrofCLI-RSSI-Resources-r16)) OF RSSI-ResourceConfigCLI-r16
+
+SRS-ResourceConfigCLI-r16 ::=       SEQUENCE {
+    srs-Resource-r16                    SRS-Resource,
+    srs-SCS-r16                         SubcarrierSpacing,
+    refServCellIndex-r16                ServCellIndex                                                  OPTIONAL,   -- Need S
+    refBWP-r16                          BWP-Id,
+    ...
+}
+
+RSSI-ResourceConfigCLI-r16 ::=      SEQUENCE {
+    rssi-ResourceId-r16                 RSSI-ResourceId-r16,
+    rssi-SCS-r16                        SubcarrierSpacing,
+    startPRB-r16                        INTEGER (0..2169),
+    nrofPRBs-r16                        INTEGER (4..maxNrofPhysicalResourceBlocksPlus1),
+    startPosition-r16                   INTEGER (0..13),
+    nrofSymbols-r16                     INTEGER (1..14),
+    rssi-PeriodicityAndOffset-r16       RSSI-PeriodicityAndOffset-r16,
+    refServCellIndex-r16                ServCellIndex                                                  OPTIONAL,   -- Need S
+    ...
+}
+
+RSSI-ResourceId-r16 ::=             INTEGER (0.. maxNrofCLI-RSSI-Resources-r16-1)
+
+RSSI-PeriodicityAndOffset-r16 ::=   CHOICE {
+    sl10                                INTEGER(0..9),
+    sl20                                INTEGER(0..19),
+    sl40                                INTEGER(0..39),
+    sl80                                INTEGER(0..79),
+    sl160                               INTEGER(0..159),
+    sl320                               INTEGER(0..319),
+    s1640                               INTEGER(0..639),
+    ...
+}
+
+-- TAG-MEASOBJECTCLI-STOP
+-- TAG-MEASOBJECTEUTRA-START
+
+MeasObjectEUTRA::=                          SEQUENCE {
+    carrierFreq                                 ARFCN-ValueEUTRA,
+    allowedMeasBandwidth                        EUTRA-AllowedMeasBandwidth,
+    cellsToRemoveListEUTRAN                     EUTRA-CellIndexList                                         OPTIONAL,    -- Need N
+    cellsToAddModListEUTRAN                     SEQUENCE (SIZE (1..maxCellMeasEUTRA)) OF EUTRA-Cell         OPTIONAL,    -- Need N
+    blackCellsToRemoveListEUTRAN                EUTRA-CellIndexList                                         OPTIONAL,    -- Need N
+    blackCellsToAddModListEUTRAN                SEQUENCE (SIZE (1..maxCellMeasEUTRA)) OF EUTRA-BlackCell    OPTIONAL,    -- Need N
+    eutra-PresenceAntennaPort1                  EUTRA-PresenceAntennaPort1,
+    eutra-Q-OffsetRange                         EUTRA-Q-OffsetRange                                         OPTIONAL,    -- Need R
+    widebandRSRQ-Meas                           BOOLEAN,
+    ...
+}
+
+EUTRA-CellIndexList ::=                     SEQUENCE (SIZE (1..maxCellMeasEUTRA)) OF EUTRA-CellIndex
+
+EUTRA-CellIndex ::=                         INTEGER (1..maxCellMeasEUTRA)
+
+
+EUTRA-Cell ::=                              SEQUENCE {
+    cellIndexEUTRA                              EUTRA-CellIndex,
+    physCellId                                  EUTRA-PhysCellId,
+    cellIndividualOffset                        EUTRA-Q-OffsetRange
+}
+
+
+EUTRA-BlackCell ::=                         SEQUENCE {
+    cellIndexEUTRA                              EUTRA-CellIndex,
+    physCellIdRange                             EUTRA-PhysCellIdRange
+}
+
+-- TAG-MEASOBJECTEUTRA-STOP
+-- TAG-MEASOBJECTID-START
+
+MeasObjectId ::=                    INTEGER (1..maxNrofObjectId)
+
+-- TAG-MEASOBJECTID-STOP
+-- TAG-MEASOBJECTNR-START
+
+MeasObjectNR ::=                    SEQUENCE {
+    ssbFrequency                        ARFCN-ValueNR                                                   OPTIONAL,   -- Cond SSBorAssociatedSSB
+    ssbSubcarrierSpacing                SubcarrierSpacing                                               OPTIONAL,   -- Cond SSBorAssociatedSSB
+    smtc1                               SSB-MTC                                                         OPTIONAL,   -- Cond SSBorAssociatedSSB
+    smtc2                               SSB-MTC2                                                        OPTIONAL,   -- Cond IntraFreqConnected
+    refFreqCSI-RS                       ARFCN-ValueNR                                                   OPTIONAL,   -- Cond CSI-RS
+    referenceSignalConfig               ReferenceSignalConfig,
+    absThreshSS-BlocksConsolidation     ThresholdNR                                                     OPTIONAL,   -- Need R
+    absThreshCSI-RS-Consolidation       ThresholdNR                                                     OPTIONAL,   -- Need R
+    nrofSS-BlocksToAverage              INTEGER (2..maxNrofSS-BlocksToAverage)                          OPTIONAL,   -- Need R
+    nrofCSI-RS-ResourcesToAverage       INTEGER (2..maxNrofCSI-RS-ResourcesToAverage)                   OPTIONAL,   -- Need R
+    quantityConfigIndex                 INTEGER (1..maxNrofQuantityConfig),
+    offsetMO                            Q-OffsetRangeList,
+    cellsToRemoveList                   PCI-List                                                        OPTIONAL,   -- Need N
+    cellsToAddModList                   CellsToAddModList                                               OPTIONAL,   -- Need N
+    blackCellsToRemoveList              PCI-RangeIndexList                                              OPTIONAL,   -- Need N
+    blackCellsToAddModList              SEQUENCE (SIZE (1..maxNrofPCI-Ranges)) OF PCI-RangeElement      OPTIONAL,   -- Need N
+    whiteCellsToRemoveList              PCI-RangeIndexList                                              OPTIONAL,   -- Need N
+    whiteCellsToAddModList              SEQUENCE (SIZE (1..maxNrofPCI-Ranges)) OF PCI-RangeElement      OPTIONAL,   -- Need N
+    ...,
+    [[
+    freqBandIndicatorNR                 FreqBandIndicatorNR                                             OPTIONAL,   -- Need R
+    measCycleSCell                      ENUMERATED {sf160, sf256, sf320, sf512, sf640, sf1024, sf1280}  OPTIONAL    -- Need R
+    ]],
+    [[
+    smtc3list-r16                     SSB-MTC3List-r16                                                  OPTIONAL,   -- Need R
+    rmtc-Config-r16                     SetupRelease {RMTC-Config-r16}                                  OPTIONAL,   -- Need M
+    t312-r16                            SetupRelease { T312-r16 }                                       OPTIONAL    -- Need M
+    ]]
+}
+
+SSB-MTC3List-r16::=                 SEQUENCE (SIZE(1..4)) OF SSB-MTC3-r16
+
+T312-r16 ::=                        ENUMERATED { ms0, ms50, ms100, ms200, ms300, ms400, ms500, ms1000}
+
+ReferenceSignalConfig::=            SEQUENCE {
+    ssb-ConfigMobility                  SSB-ConfigMobility                                              OPTIONAL,   -- Need M
+    csi-rs-ResourceConfigMobility       SetupRelease { CSI-RS-ResourceConfigMobility }                  OPTIONAL    -- Need M
+}
+
+SSB-ConfigMobility::=               SEQUENCE {
+    ssb-ToMeasure                           SetupRelease { SSB-ToMeasure }                              OPTIONAL,   -- Need M
+    deriveSSB-IndexFromCell             BOOLEAN,
+    ss-RSSI-Measurement                         SS-RSSI-Measurement                                     OPTIONAL,   -- Need M
+    ...,
+    [[
+    ssb-PositionQCL-Common-r16              SSB-PositionQCL-Relation-r16                                OPTIONAL,   -- Cond SharedSpectrum
+    ssb-PositionQCL-CellsToAddModList-r16   SSB-PositionQCL-CellsToAddModList-r16                       OPTIONAL,   -- Need N
+    ssb-PositionQCL-CellsToRemoveList-r16   PCI-List                                                    OPTIONAL    -- Need N
+    ]]
+}
+
+Q-OffsetRangeList ::=               SEQUENCE {
+    rsrpOffsetSSB                       Q-OffsetRange               DEFAULT dB0,
+    rsrqOffsetSSB                       Q-OffsetRange               DEFAULT dB0,
+    sinrOffsetSSB                       Q-OffsetRange               DEFAULT dB0,
+    rsrpOffsetCSI-RS                    Q-OffsetRange               DEFAULT dB0,
+    rsrqOffsetCSI-RS                    Q-OffsetRange               DEFAULT dB0,
+    sinrOffsetCSI-RS                    Q-OffsetRange               DEFAULT dB0
+}
+
+
+ThresholdNR ::=                     SEQUENCE{
+    thresholdRSRP                       RSRP-Range                                                      OPTIONAL,   -- Need R
+    thresholdRSRQ                       RSRQ-Range                                                      OPTIONAL,   -- Need R
+    thresholdSINR                       SINR-Range                                                      OPTIONAL    -- Need R
+}
+
+CellsToAddModList ::=               SEQUENCE (SIZE (1..maxNrofCellMeas)) OF CellsToAddMod
+
+CellsToAddMod ::=                   SEQUENCE {
+    physCellId                          PhysCellId,
+    cellIndividualOffset                Q-OffsetRangeList
+}
+
+RMTC-Config-r16 ::=                 SEQUENCE {
+    rmtc-Periodicity-r16                ENUMERATED {ms40, ms80, ms160, ms320, ms640},
+    rmtc-SubframeOffset-r16             INTEGER(0..639)                                                 OPTIONAL,   -- Need M
+    measDurationSymbols-r16             ENUMERATED {sym1, sym14or12, sym28or24, sym42or36, sym70or60},
+    rmtc-Frequency-r16                  ARFCN-ValueNR,
+    ref-SCS-CP-r16                      ENUMERATED {kHz15, kHz30, kHz60-NCP, kHz60-ECP},
+    ...
+}
+
+SSB-PositionQCL-CellsToAddModList-r16 ::= SEQUENCE (SIZE (1..maxNrofCellMeas)) OF SSB-PositionQCL-CellsToAddMod-r16
+
+SSB-PositionQCL-CellsToAddMod-r16 ::= SEQUENCE {
+    physCellId-r16                        PhysCellId,
+    ssb-PositionQCL-r16                   SSB-PositionQCL-Relation-r16
+}
+
+-- TAG-MEASOBJECTNR-STOP
+-- TAG-MEASOBJECTNR-SL-START
+
+MeasObjectNR-SL-r16 ::=      SEQUENCE {
+    tx-PoolMeasToRemoveList-r16  Tx-PoolMeasList-r16                           OPTIONAL,       -- Need N
+    tx-PoolMeasToAddModList-r16  Tx-PoolMeasList-r16                           OPTIONAL        -- Need N
+}
+
+Tx-PoolMeasList-r16 ::= SEQUENCE (SIZE (1..maxNrofSL-PoolToMeasureNR-r16)) OF SL-ResourcePoolID-r16
+
+-- TAG-MEASOBJECTNR-SL-STOP
+-- TAG-MEASOBJECTTOADDMODLIST-START
+
+MeasObjectToAddModList ::=                  SEQUENCE (SIZE (1..maxNrofObjectId)) OF MeasObjectToAddMod
+
+MeasObjectToAddMod ::=                      SEQUENCE {
+    measObjectId                                MeasObjectId,
+    measObject                                  CHOICE {
+        measObjectNR                                MeasObjectNR,
+        ...,
+        measObjectEUTRA                             MeasObjectEUTRA,
+        measObjectUTRA-FDD-r16                      MeasObjectUTRA-FDD-r16,
+        measObjectNR-SL-r16                         MeasObjectNR-SL-r16,
+        measObjectCLI-r16                           MeasObjectCLI-r16
+    }
+}
+
+-- TAG-MEASOBJECTTOADDMODLIST-STOP
+-- TAG-MEASOBJECTUTRA-FDD-START
+
+MeasObjectUTRA-FDD-r16 ::=                  SEQUENCE {
+    carrierFreq-r16                             ARFCN-ValueUTRA-FDD-r16,
+    utra-FDD-Q-OffsetRange-r16                  UTRA-FDD-Q-OffsetRange-r16              OPTIONAL,         -- Need R
+    cellsToRemoveList-r16                       UTRA-FDD-CellIndexList-r16              OPTIONAL,         -- Need N
+    cellsToAddModList-r16                       CellsToAddModListUTRA-FDD-r16           OPTIONAL,         -- Need N
+    ...
+}
+
+CellsToAddModListUTRA-FDD-r16 ::=           SEQUENCE (SIZE (1..maxCellMeasUTRA-FDD-r16)) OF CellsToAddModUTRA-FDD-r16
+
+CellsToAddModUTRA-FDD-r16 ::=               SEQUENCE {
+    cellIndexUTRA-FDD-r16                       UTRA-FDD-CellIndex-r16,
+    physCellId-r16                              PhysCellIdUTRA-FDD-r16
+}
+
+UTRA-FDD-CellIndexList-r16 ::=              SEQUENCE (SIZE (1..maxCellMeasUTRA-FDD-r16)) OF UTRA-FDD-CellIndex-r16
+
+UTRA-FDD-CellIndex-r16 ::=                  INTEGER (1..maxCellMeasUTRA-FDD-r16)
+
+-- TAG-MEASOBJECTUTRA-FDD-STOP
+-- TAG-MEASRESULTCELLLISTSFTD-NR-START
+
+MeasResultCellListSFTD-NR ::=          SEQUENCE (SIZE (1..maxCellSFTD)) OF MeasResultCellSFTD-NR
+
+MeasResultCellSFTD-NR ::=              SEQUENCE {
+    physCellId                            PhysCellId,
+    sfn-OffsetResult                      INTEGER (0..1023),
+    frameBoundaryOffsetResult             INTEGER (-30720..30719),
+    rsrp-Result                           RSRP-Range                      OPTIONAL
+}
+
+-- TAG-MEASRESULTCELLLISTSFTD-NR-STOP
+-- TAG-MEASRESULTCELLLISTSFTD-EUTRA-START
+
+MeasResultCellListSFTD-EUTRA ::=          SEQUENCE (SIZE (1..maxCellSFTD)) OF MeasResultSFTD-EUTRA
+
+MeasResultSFTD-EUTRA ::=           SEQUENCE {
+    eutra-PhysCellId                    EUTRA-PhysCellId,
+    sfn-OffsetResult                    INTEGER (0..1023),
+    frameBoundaryOffsetResult           INTEGER (-30720..30719),
+    rsrp-Result                         RSRP-Range                      OPTIONAL
+}
+
+-- TAG-MEASRESULTCELLLISTSFTD-EUTRA-STOP
+-- TAG-MEASRESULTS-START
+
+MeasResults ::=                         SEQUENCE {
+    measId                                  MeasId,
+    measResultServingMOList                 MeasResultServMOList,
+    measResultNeighCells                    CHOICE {
+        measResultListNR                        MeasResultListNR,
+        ...,
+        measResultListEUTRA                     MeasResultListEUTRA,
+        measResultListUTRA-FDD-r16              MeasResultListUTRA-FDD-r16
+    }                                                                                                                   OPTIONAL,
+    ...,
+    [[
+    measResultServFreqListEUTRA-SCG         MeasResultServFreqListEUTRA-SCG                                             OPTIONAL,
+    measResultServFreqListNR-SCG            MeasResultServFreqListNR-SCG                                                OPTIONAL,
+    measResultSFTD-EUTRA                    MeasResultSFTD-EUTRA                                                        OPTIONAL,
+    measResultSFTD-NR                       MeasResultCellSFTD-NR                                                       OPTIONAL
+     ]],
+     [[
+    measResultCellListSFTD-NR               MeasResultCellListSFTD-NR                                                   OPTIONAL
+    ]],
+    [[
+    measResultForRSSI-r16                   MeasResultForRSSI-r16                                                       OPTIONAL,
+    locationInfo-r16                        LocationInfo-r16                                                            OPTIONAL,
+    ul-PDCP-DelayValueResultList-r16        UL-PDCP-DelayValueResultList-r16                                            OPTIONAL,
+    measResultsSL-r16                       MeasResultsSL-r16                                                           OPTIONAL,
+    measResultCLI-r16                       MeasResultCLI-r16                                                           OPTIONAL
+    ]]
+
+
+}
+
+MeasResultServMOList ::=                SEQUENCE (SIZE (1..maxNrofServingCells)) OF MeasResultServMO
+
+MeasResultServMO ::=                    SEQUENCE {
+    servCellId                              ServCellIndex,
+    measResultServingCell                   MeasResultNR,
+    measResultBestNeighCell                 MeasResultNR                                                                OPTIONAL,
+    ...
+}
+
+MeasResultListNR ::=                    SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultNR
+
+MeasResultNR ::=                        SEQUENCE {
+    physCellId                              PhysCellId                                                                  OPTIONAL,
+    measResult                              SEQUENCE {
+        cellResults                             SEQUENCE{
+            resultsSSB-Cell                         MeasQuantityResults                                                 OPTIONAL,
+            resultsCSI-RS-Cell                      MeasQuantityResults                                                 OPTIONAL
+        },
+        rsIndexResults                          SEQUENCE{
+            resultsSSB-Indexes                      ResultsPerSSB-IndexList                                             OPTIONAL,
+            resultsCSI-RS-Indexes                   ResultsPerCSI-RS-IndexList                                          OPTIONAL
+        }                                                                                                               OPTIONAL
+    },
+    ...,
+    [[
+    cgi-Info                                CGI-InfoNR                                                                    OPTIONAL
+    ]]
+}
+
+MeasResultListEUTRA ::=                 SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultEUTRA
+
+MeasResultEUTRA ::=                     SEQUENCE {
+    eutra-PhysCellId                        PhysCellId,
+    measResult                              MeasQuantityResultsEUTRA,
+
+    cgi-Info                                CGI-InfoEUTRA                                                               OPTIONAL,
+    ...
+}
+
+MultiBandInfoListEUTRA ::=              SEQUENCE (SIZE (1..maxMultiBands)) OF FreqBandIndicatorEUTRA
+
+MeasQuantityResults ::=                 SEQUENCE {
+    rsrp                                    RSRP-Range                                                                  OPTIONAL,
+    rsrq                                    RSRQ-Range                                                                  OPTIONAL,
+    sinr                                    SINR-Range                                                                  OPTIONAL
+}
+
+MeasQuantityResultsEUTRA ::=            SEQUENCE {
+    rsrp                                    RSRP-RangeEUTRA                                                             OPTIONAL,
+    rsrq                                    RSRQ-RangeEUTRA                                                             OPTIONAL,
+    sinr                                    SINR-RangeEUTRA                                                             OPTIONAL
+}
+
+ResultsPerSSB-IndexList::=              SEQUENCE (SIZE (1..maxNrofIndexesToReport2)) OF ResultsPerSSB-Index
+
+ResultsPerSSB-Index ::=                 SEQUENCE {
+    ssb-Index                               SSB-Index,
+    ssb-Results                             MeasQuantityResults                                                         OPTIONAL
+}
+
+ResultsPerCSI-RS-IndexList::=           SEQUENCE (SIZE (1..maxNrofIndexesToReport2)) OF ResultsPerCSI-RS-Index
+
+ResultsPerCSI-RS-Index ::=              SEQUENCE {
+    csi-RS-Index                            CSI-RS-Index,
+    csi-RS-Results                          MeasQuantityResults                                                         OPTIONAL
+}
+MeasResultServFreqListEUTRA-SCG ::= SEQUENCE (SIZE (1..maxNrofServingCellsEUTRA)) OF MeasResult2EUTRA
+
+MeasResultServFreqListNR-SCG ::= SEQUENCE (SIZE (1..maxNrofServingCells)) OF MeasResult2NR
+
+MeasResultListUTRA-FDD-r16 ::=          SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultUTRA-FDD-r16
+
+MeasResultUTRA-FDD-r16 ::=              SEQUENCE {
+    physCellId-r16                          PhysCellIdUTRA-FDD-r16,
+    measResult-r16                          SEQUENCE {
+        utra-FDD-RSCP-r16                       INTEGER (-5..91)          OPTIONAL,
+        utra-FDD-EcN0-r16                       INTEGER (0..49)           OPTIONAL
+    }
+}
+
+MeasResultForRSSI-r16 ::=        SEQUENCE {
+    rssi-Result-r16                  RSSI-Range-r16,
+    channelOccupancy-r16             INTEGER (0..100)
+}
+
+MeasResultCLI-r16 ::=            SEQUENCE {
+    measResultListSRS-RSRP-r16       MeasResultListSRS-RSRP-r16                                                         OPTIONAL,
+    measResultListCLI-RSSI-r16       MeasResultListCLI-RSSI-r16                                                         OPTIONAL
+}
+
+MeasResultListSRS-RSRP-r16 ::=   SEQUENCE (SIZE (1.. maxCLI-Report-r16)) OF MeasResultSRS-RSRP-r16
+
+MeasResultSRS-RSRP-r16 ::=       SEQUENCE {
+    srs-ResourceId-r16               SRS-ResourceId,
+    srs-RSRP-Result-r16              SRS-RSRP-Range-r16
+}
+
+MeasResultListCLI-RSSI-r16 ::=   SEQUENCE (SIZE (1.. maxCLI-Report-r16)) OF MeasResultCLI-RSSI-r16
+
+MeasResultCLI-RSSI-r16 ::=       SEQUENCE {
+    rssi-ResourceId-r16              RSSI-ResourceId-r16,
+    cli-RSSI-Result-r16              CLI-RSSI-Range-r16
+}
+
+UL-PDCP-DelayValueResultList-r16 ::= SEQUENCE (SIZE (1..maxDRB)) OF UL-PDCP-DelayValueResult-r16
+
+UL-PDCP-DelayValueResult-r16 ::= SEQUENCE {
+    drb-Id-r16                       DRB-Identity,
+    averageDelay-r16                 INTEGER (0..10000),
+    ...
+}
+
+-- TAG-MEASRESULTS-STOP
+-- TAG-MEASRESULT2EUTRA-START
+
+MeasResult2EUTRA ::=       SEQUENCE {
+    carrierFreq                         ARFCN-ValueEUTRA,
+    measResultServingCell               MeasResultEUTRA                 OPTIONAL,
+    measResultBestNeighCell             MeasResultEUTRA                 OPTIONAL,
+    ...
+}
+
+-- TAG-MEASRESULT2EUTRA-STOP
+-- TAG-MEASRESULT2NR-START
+
+MeasResult2NR ::=                   SEQUENCE {
+    ssbFrequency                        ARFCN-ValueNR                           OPTIONAL,
+    refFreqCSI-RS                       ARFCN-ValueNR                           OPTIONAL,
+    measResultServingCell               MeasResultNR                            OPTIONAL,
+    measResultNeighCellListNR           MeasResultListNR                        OPTIONAL,
+    ...
+}
+
+-- TAG-MEASRESULT2NR-STOP
+-- TAG-MEASRESULTIDLEEUTRA-START
+
+MeasResultIdleEUTRA-r16 ::= SEQUENCE {
+    measResultsPerCarrierListIdleEUTRA-r16   SEQUENCE (SIZE (1.. maxFreqIdle-r16)) OF MeasResultsPerCarrierIdleEUTRA-r16,
+    ...
+}
+
+MeasResultsPerCarrierIdleEUTRA-r16 ::=  SEQUENCE {
+    carrierFreqEUTRA-r16                    ARFCN-ValueEUTRA,
+    measResultsPerCellListIdleEUTRA-r16     SEQUENCE (SIZE (1..maxCellMeasIdle-r16)) OF MeasResultsPerCellIdleEUTRA-r16,
+    ...
+}
+
+MeasResultsPerCellIdleEUTRA-r16 ::=     SEQUENCE {
+    eutra-PhysCellId-r16                    EUTRA-PhysCellId,
+    measIdleResultEUTRA-r16                 SEQUENCE {
+       rsrp-ResultEUTRA-r16                     RSRP-RangeEUTRA                                                     OPTIONAL,
+       rsrq-ResultEUTRA-r16                     RSRQ-RangeEUTRA-r16                                                 OPTIONAL
+    },
+    ...
+}
+
+-- TAG-MEASRESULTIDLEEUTRA-STOP
+-- TAG-MEASRESULTIDLENR-START
+
+MeasResultIdleNR-r16 ::=  SEQUENCE {
+    measResultServingCell-r16 SEQUENCE {
+        rsrp-Result-r16           RSRP-Range                                                                        OPTIONAL,
+        rsrq-Result-r16           RSRQ-Range                                                                        OPTIONAL,
+        resultsSSB-Indexes-r16    ResultsPerSSB-IndexList-r16                                                       OPTIONAL
+    },
+    measResultsPerCarrierListIdleNR-r16 SEQUENCE (SIZE (1.. maxFreqIdle-r16)) OF MeasResultsPerCarrierIdleNR-r16    OPTIONAL,
+    ...
+}
+
+MeasResultsPerCarrierIdleNR-r16 ::=   SEQUENCE {
+    carrierFreq-r16                       ARFCN-ValueNR,
+    measResultsPerCellListIdleNR-r16      SEQUENCE (SIZE (1..maxCellMeasIdle-r16)) OF MeasResultsPerCellIdleNR-r16,
+    ...
+}
+
+MeasResultsPerCellIdleNR-r16 ::=  SEQUENCE {
+    physCellId-r16                    PhysCellId,
+    measIdleResultNR-r16              SEQUENCE {
+        rsrp-Result-r16                   RSRP-Range                                                              OPTIONAL,
+        rsrq-Result-r16                   RSRQ-Range                                                              OPTIONAL,
+        resultsSSB-Indexes-r16            ResultsPerSSB-IndexList-r16                                             OPTIONAL
+    },
+    ...
+}
+
+ResultsPerSSB-IndexList-r16 ::=   SEQUENCE (SIZE (1.. maxNrofIndexesToReport)) OF ResultsPerSSB-IndexIdle-r16
+
+ResultsPerSSB-IndexIdle-r16 ::=   SEQUENCE {
+    ssb-Index-r16                     SSB-Index,
+    ssb-Results-r16                   SEQUENCE {
+        ssb-RSRP-Result-r16               RSRP-Range                                                              OPTIONAL,
+        ssb-RSRQ-Result-r16               RSRQ-Range                                                              OPTIONAL
+    }                                                                                                     OPTIONAL
+}
+
+-- TAG-MEASRESULTIDLENR-STOP
+-- TAG-MEASRESULTSCG-FAILURE-START
+
+MeasResultSCG-Failure ::=           SEQUENCE {
+    measResultPerMOList                 MeasResultList2NR,
+    ...,
+    [[
+    locationInfo-r16                    LocationInfo-r16            OPTIONAL
+    ]]
+}
+
+MeasResultList2NR ::=               SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2NR
+
+-- TAG-MEASRESULTSCG-FAILURE-STOP
+-- TAG-MEASRESULTSSL-START
+
+MeasResultsSL-r16 ::=         SEQUENCE {
+    measResultsListSL-r16         CHOICE {
+        measResultNR-SL-r16           MeasResultNR-SL-r16,
+        ...
+    },
+    ...
+}
+
+MeasResultNR-SL-r16 ::=       SEQUENCE {
+    measResultListCBR-NR-r16      SEQUENCE (SIZE (1.. maxNrofSL-PoolToMeasureNR-r16)) OF MeasResultCBR-NR-r16,
+    ...
+}
+
+MeasResultCBR-NR-r16 ::=      SEQUENCE {
+    sl-poolReportIdentity-r16     SL-ResourcePoolID-r16,
+    sl-CBR-ResultsNR-r16          SL-CBR-r16,
+    ...
+}
+
+-- TAG-MEASRESULTSSL-STOP
+-- TAG-MEASTRIGGERQUANTITYEUTRA-START
+
+MeasTriggerQuantityEUTRA::=                 CHOICE {
+    rsrp                                        RSRP-RangeEUTRA,
+    rsrq                                        RSRQ-RangeEUTRA,
+    sinr                                        SINR-RangeEUTRA
+}
+
+RSRP-RangeEUTRA ::=                 INTEGER (0..97)
+
+RSRQ-RangeEUTRA ::=                 INTEGER (0..34)
+
+SINR-RangeEUTRA ::=                 INTEGER (0..127)
+
+-- TAG-MEASTRIGGERQUANTITYEUTRA-STOP
+-- TAG-MOBILITYSTATEPARAMETERS-START
+
+MobilityStateParameters ::=         SEQUENCE{
+    t-Evaluation                        ENUMERATED {
+                                            s30, s60, s120, s180, s240, spare3, spare2, spare1},
+    t-HystNormal                        ENUMERATED {
+                                            s30, s60, s120, s180, s240, spare3, spare2, spare1},
+    n-CellChangeMedium                  INTEGER (1..16),
+    n-CellChangeHigh                    INTEGER (1..16)
+}
+
+-- TAG-MOBILITYSTATEPARAMETERS-STOP
+-- TAG-MSGACONFIGCOMMON-START
+
+MsgA-ConfigCommon-r16 ::=           SEQUENCE {
+    rach-ConfigCommonTwoStepRA-r16      RACH-ConfigCommonTwoStepRA-r16,
+    msgA-PUSCH-Config-r16               MsgA-PUSCH-Config-r16                                      OPTIONAL --Cond InitialBWPConfig
+}
+-- TAG-MSGACONFIGCOMMON-STOP
+-- TAG-MSGA-PUSCH-CONFIG-START
+
+MsgA-PUSCH-Config-r16 ::=                      SEQUENCE {
+    msgA-PUSCH-ResourceGroupA-r16                  MsgA-PUSCH-Resource-r16                                       OPTIONAL, -- Cond InitialBWPConfig
+    msgA-PUSCH-ResourceGroupB-r16                  MsgA-PUSCH-Resource-r16                                       OPTIONAL, -- Cond GroupBConfigured
+    msgA-TransformPrecoder-r16                    ENUMERATED {enabled, disabled}                                 OPTIONAL, -- Need R
+    msgA-DataScramblingIndex-r16                   INTEGER (0..1023)                                             OPTIONAL, -- Need S
+    msgA-DeltaPreamble-r16                         INTEGER (-1..6)                                               OPTIONAL  -- Need R
+}
+
+MsgA-PUSCH-Resource-r16 ::=                    SEQUENCE {
+    msgA-MCS-r16                                   INTEGER (0..15),
+    nrofSlotsMsgA-PUSCH-r16                        INTEGER (1..4),
+    nrofMsgA-PO-PerSlot-r16                        ENUMERATED {one, two, three, six},
+    msgA-PUSCH-TimeDomainOffset-r16                INTEGER (1..32),
+    msgA-PUSCH-TimeDomainAllocation-r16            INTEGER (1..maxNrofUL-Allocations)                            OPTIONAL, -- Need S
+    startSymbolAndLengthMsgA-PO-r16                INTEGER (0..127)                                              OPTIONAL, -- Need S
+    mappingTypeMsgA-PUSCH-r16                      ENUMERATED {typeA, typeB}                                     OPTIONAL, -- Need S
+    guardPeriodMsgA-PUSCH-r16                      INTEGER (0..3)                                                OPTIONAL, -- Need R
+    guardBandMsgA-PUSCH-r16                        INTEGER (0..1),
+    frequencyStartMsgA-PUSCH-r16                   INTEGER (0..maxNrofPhysicalResourceBlocks-1),
+    nrofPRBs-PerMsgA-PO-r16                        INTEGER (1..32),
+    nrofMsgA-PO-FDM-r16                            ENUMERATED {one, two, four, eight},
+    msgA-IntraSlotFrequencyHopping-r16             ENUMERATED {enabled}                                          OPTIONAL, -- Need R
+    msgA-HoppingBits-r16                           BIT STRING (SIZE(2))                                          OPTIONAL, -- Cond FreqHopConfigured
+    msgA-DMRS-Config-r16                           MsgA-DMRS-Config-r16,
+    nrofDMRS-Sequences-r16                         INTEGER (1..2),
+    msgA-Alpha-r16                                 ENUMERATED {alpha0, alpha04, alpha05, alpha06,
+                                                               alpha07, alpha08, alpha09, alpha1}                OPTIONAL, -- Need S
+    interlaceIndexFirstPO-MsgA-PUSCH-r16           INTEGER (1..10)                                               OPTIONAL, -- Need R
+    nrofInterlacesPerMsgA-PO-r16                   INTEGER (1..10)                                               OPTIONAL, -- Need R
+    ...
+}
+
+MsgA-DMRS-Config-r16 ::=                       SEQUENCE {
+    msgA-DMRS-AdditionalPosition-r16               ENUMERATED {pos0, pos1, pos3}                                 OPTIONAL, -- Need S
+    msgA-MaxLength-r16                             ENUMERATED {len2}                                             OPTIONAL, -- Need S
+    msgA-PUSCH-DMRS-CDM-Group-r16                  INTEGER (0..1)                                                OPTIONAL, -- Need S
+    msgA-PUSCH-NrofPorts-r16                       INTEGER (0..1)                                                OPTIONAL, -- Need S
+    msgA-ScramblingID0-r16                         INTEGER (0..65535)                                            OPTIONAL, -- Need S
+    msgA-ScramblingID1-r16                         INTEGER (0..65535)                                            OPTIONAL  -- Need S
+}
+
+-- TAG-MSGA-PUSCH-CONFIG-STOP
+-- TAG-MULTIFREQUENCYBANDLISTNR-START
+
+MultiFrequencyBandListNR ::=        SEQUENCE (SIZE (1..maxNrofMultiBands)) OF FreqBandIndicatorNR
+
+-- TAG-MULTIFREQUENCYBANDLISTNR-STOP
+-- TAG-MULTIFREQUENCYBANDLISTNR-SIB-START
+
+MultiFrequencyBandListNR-SIB ::=            SEQUENCE (SIZE (1.. maxNrofMultiBands)) OF NR-MultiBandInfo
+
+NR-MultiBandInfo ::=                        SEQUENCE {
+    freqBandIndicatorNR                         FreqBandIndicatorNR         OPTIONAL,   -- Cond OptULNotSIB2
+    nr-NS-PmaxList                              NR-NS-PmaxList              OPTIONAL    -- Need S
+}
+
+-- TAG-MULTIFREQUENCYBANDLISTNR-SIB-STOP
+-- TAG-NeedForGapsConfigNR-START
+
+NeedForGapsConfigNR-r16 ::=        SEQUENCE {
+    requestedTargetBandFilterNR-r16       SEQUENCE (SIZE (1..maxBands)) OF FreqBandIndicatorNR               OPTIONAL          -- Need R
+}
+
+-- TAG-NeedForGapsConfigNR-STOP
+-- TAG-NeedForGapsInfoNR-START
+
+NeedForGapsInfoNR-r16 ::=        SEQUENCE {
+    intraFreq-needForGap-r16      NeedForGapsIntraFreqlist-r16,
+    interFreq-needForGap-r16      NeedForGapsBandlistNR-r16
+}
+
+NeedForGapsIntraFreqlist-r16 ::=          SEQUENCE (SIZE (1.. maxNrofServingCells)) OF NeedForGapsIntraFreq-r16
+
+NeedForGapsBandlistNR-r16 ::=             SEQUENCE (SIZE (1..maxBands)) OF NeedForGapsNR-r16
+
+NeedForGapsIntraFreq-r16  ::=                 SEQUENCE {
+    servCellId-r16                               ServCellIndex,
+    gapIndicationIntra-r16                       ENUMERATED {gap, no-gap}
+}
+
+NeedForGapsNR-r16  ::=                        SEQUENCE {
+    bandNR-r16                                   FreqBandIndicatorNR,
+    gapIndication-r16                            ENUMERATED {gap, no-gap}
+}
+
+-- TAG-NeedForGapsInfoNR-STOP
+-- TAG-NEXTHOPCHAININGCOUNT-START
+
+NextHopChainingCount ::=                    INTEGER (0..7)
+
+-- TAG-NEXTHOPCHAININGCOUNT-STOP
+-- TAG-NG-5G-S-TMSI-START
+
+NG-5G-S-TMSI ::=                         BIT STRING (SIZE (48))
+
+-- TAG-NG-5G-S-TMSI-STOP
+-- TAG-NPN-IDENTITY-START
+
+NPN-Identity-r16 ::=             CHOICE {
+    pni-npn-r16                      SEQUENCE {
+        plmn-Identity-r16                PLMN-Identity,
+        cag-IdentityList-r16             SEQUENCE (SIZE (1..maxNPN-r16)) OF CAG-IdentityInfo-r16
+    },
+    snpn-r16                         SEQUENCE {
+        plmn-Identity-r16                PLMN-Identity,
+        nid-List-r16                     SEQUENCE (SIZE (1..maxNPN-r16)) OF NID-r16
+    }
+}
+
+CAG-IdentityInfo-r16 ::=         SEQUENCE {
+    cag-Identity-r16                 BIT STRING (SIZE (32)),
+    manualCAGselectionAllowed-r16    ENUMERATED {true}                         OPTIONAL   -- Need R
+}
+
+NID-r16 ::=                      BIT STRING (SIZE (44))
+
+-- TAG-NPN-IDENTITY-STOP
+-- TAG-NPN-IDENTITYINFOLIST-START
+
+NPN-IdentityInfoList-r16 ::=     SEQUENCE (SIZE (1..maxNPN-r16)) OF NPN-IdentityInfo-r16
+
+
+NPN-IdentityInfo-r16 ::=         SEQUENCE {
+    npn-IdentityList-r16             SEQUENCE (SIZE (1..maxNPN-r16)) OF NPN-Identity-r16,
+    trackingAreaCode-r16             TrackingAreaCode,
+    ranac-r16                        RAN-AreaCode                                                OPTIONAL,       -- Need R
+    cellIdentity-r16                 CellIdentity,
+    cellReservedForOperatorUse-r16   ENUMERATED {reserved, notReserved},
+    iab-Support-r16                  ENUMERATED {true}                                           OPTIONAL,       -- Need S
+    ...
+}
+
+-- TAG-NPN-IDENTITYINFOLIST-STOP
+-- TAG-NR-NS-PMAXLIST-START
+
+NR-NS-PmaxList ::=                      SEQUENCE (SIZE (1..maxNR-NS-Pmax)) OF NR-NS-PmaxValue
+
+NR-NS-PmaxValue ::=                     SEQUENCE {
+    additionalPmax                          P-Max                               OPTIONAL,   -- Need N
+    additionalSpectrumEmission              AdditionalSpectrumEmission
+}
+
+-- TAG-NR-NS-PMAXLIST-STOP
+-- TAG-NZP-CSI-RS-RESOURCE-START
+
+NZP-CSI-RS-Resource ::=             SEQUENCE {
+    nzp-CSI-RS-ResourceId               NZP-CSI-RS-ResourceId,
+    resourceMapping                     CSI-RS-ResourceMapping,
+    powerControlOffset                  INTEGER (-8..15),
+    powerControlOffsetSS                ENUMERATED{db-3, db0, db3, db6}                 OPTIONAL,   -- Need R
+    scramblingID                        ScramblingId,
+    periodicityAndOffset                CSI-ResourcePeriodicityAndOffset                OPTIONAL,   -- Cond PeriodicOrSemiPersistent
+    qcl-InfoPeriodicCSI-RS              TCI-StateId                                     OPTIONAL,   -- Cond Periodic
+    ...
+}
+
+-- TAG-NZP-CSI-RS-RESOURCE-STOP
+-- TAG-NZP-CSI-RS-RESOURCEID-START
+
+NZP-CSI-RS-ResourceId ::=           INTEGER (0..maxNrofNZP-CSI-RS-Resources-1)
+
+-- TAG-NZP-CSI-RS-RESOURCEID-STOP
+-- TAG-NZP-CSI-RS-RESOURCESET-START
+NZP-CSI-RS-ResourceSet ::=          SEQUENCE {
+    nzp-CSI-ResourceSetId               NZP-CSI-RS-ResourceSetId,
+    nzp-CSI-RS-Resources                SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-ResourcesPerSet)) OF NZP-CSI-RS-ResourceId,
+    repetition                          ENUMERATED { on, off }                                                  OPTIONAL,   -- Need S
+    aperiodicTriggeringOffset           INTEGER(0..6)                                                           OPTIONAL,   -- Need S
+    trs-Info                            ENUMERATED {true}                                                       OPTIONAL,   -- Need R
+    ...,
+    [[
+    aperiodicTriggeringOffset-r16       INTEGER(0..31)                                                          OPTIONAL   -- Need S
+    ]]
+}
+
+-- TAG-NZP-CSI-RS-RESOURCESET-STOP
+-- TAG-NZP-CSI-RS-RESOURCESETID-START
+
+NZP-CSI-RS-ResourceSetId ::=        INTEGER (0..maxNrofNZP-CSI-RS-ResourceSets-1)
+
+-- TAG-NZP-CSI-RS-RESOURCESETID-STOP
+-- TAG-P-MAX-START
+
+P-Max ::=                           INTEGER (-30..33)
+
+-- TAG-P-MAX-STOP
+-- TAG-PCI-LIST-START
+
+PCI-List ::=                        SEQUENCE (SIZE (1..maxNrofCellMeas)) OF PhysCellId
+
+-- TAG-PCI-LIST-STOP
+-- TAG-PCI-RANGE-START
+
+PCI-Range ::=                       SEQUENCE {
+    start                               PhysCellId,
+    range                               ENUMERATED {n4, n8, n12, n16, n24, n32, n48, n64, n84,
+                                                    n96, n128, n168, n252, n504, n1008,spare1}                  OPTIONAL    -- Need S
+}
+
+-- TAG-PCI-RANGE-STOP
+-- TAG-PCI-RANGEELEMENT-START
+
+PCI-RangeElement ::=                SEQUENCE {
+    pci-RangeIndex                      PCI-RangeIndex,
+    pci-Range                           PCI-Range
+}
+
+-- TAG-PCI-RANGEELEMENT-STOP
+-- TAG-PCI-RANGEINDEX-START
+
+PCI-RangeIndex ::=                  INTEGER (1..maxNrofPCI-Ranges)
+
+-- TAG-PCI-RANGEINDEX-STOP
+-- TAG-PCI-RANGEINDEXLIST-START
+
+PCI-RangeIndexList ::=              SEQUENCE (SIZE (1..maxNrofPCI-Ranges)) OF PCI-RangeIndex
+
+-- TAG-PCI-RANGEINDEXLIST-STOP
+-- TAG-PDCCH-CONFIG-START
+
+PDCCH-Config ::=                    SEQUENCE {
+    controlResourceSetToAddModList      SEQUENCE(SIZE (1..3)) OF ControlResourceSet                      OPTIONAL,   -- Need N
+    controlResourceSetToReleaseList     SEQUENCE(SIZE (1..3)) OF ControlResourceSetId                    OPTIONAL,   -- Need N
+    searchSpacesToAddModList            SEQUENCE(SIZE (1..10)) OF SearchSpace                            OPTIONAL,   -- Need N
+    searchSpacesToReleaseList           SEQUENCE(SIZE (1..10)) OF SearchSpaceId                          OPTIONAL,   -- Need N
+    downlinkPreemption                  SetupRelease { DownlinkPreemption }                              OPTIONAL,   -- Need M
+    tpc-PUSCH                           SetupRelease { PUSCH-TPC-CommandConfig }                         OPTIONAL,   -- Need M
+    tpc-PUCCH                           SetupRelease { PUCCH-TPC-CommandConfig }                         OPTIONAL,   -- Need M
+    tpc-SRS                             SetupRelease { SRS-TPC-CommandConfig}                            OPTIONAL,   -- Need M
+    ...,
+    [[
+    controlResourceSetToAddModListSizeExt-v1610 SEQUENCE (SIZE (1..2)) OF ControlResourceSet             OPTIONAL,   -- Need N
+    controlResourceSetToReleaseListSizeExt-r16 SEQUENCE (SIZE (1..5)) OF ControlResourceSetId-r16        OPTIONAL,   -- Need N
+    searchSpacesToAddModListExt-r16     SEQUENCE(SIZE (1..10)) OF SearchSpaceExt-r16                     OPTIONAL,   -- Need N
+    uplinkCancellation-r16              SetupRelease { UplinkCancellation-r16 }                          OPTIONAL,   -- Need M
+    monitoringCapabilityConfig-r16      ENUMERATED { r15monitoringcapability,r16monitoringcapability }   OPTIONAL,   -- Need M
+    searchSpaceSwitchConfig-r16         SearchSpaceSwitchConfig-r16                                      OPTIONAL    -- Need R
+    ]]
+}
+
+SearchSpaceSwitchConfig-r16 ::=     SEQUENCE {
+    cellGroupsForSwitchList-r16         SEQUENCE(SIZE (1..4)) OF CellGroupForSwitch-r16                  OPTIONAL,   -- Need R
+    searchSpaceSwitchDelay-r16          INTEGER (10..52)                                                 OPTIONAL    -- Need R
+}
+
+CellGroupForSwitch-r16 ::=          SEQUENCE(SIZE (1..16)) OF ServCellIndex
+
+-- TAG-PDCCH-CONFIG-STOP
+-- TAG-PDCCH-CONFIGCOMMON-START
+
+PDCCH-ConfigCommon ::=              SEQUENCE {
+    controlResourceSetZero              ControlResourceSetZero                                  OPTIONAL,   -- Cond InitialBWP-Only
+    commonControlResourceSet            ControlResourceSet                                      OPTIONAL,   -- Need R
+    searchSpaceZero                     SearchSpaceZero                                         OPTIONAL,   -- Cond InitialBWP-Only
+    commonSearchSpaceList               SEQUENCE (SIZE(1..4)) OF SearchSpace                    OPTIONAL,   -- Need R
+    searchSpaceSIB1                     SearchSpaceId                                           OPTIONAL,   -- Need S
+    searchSpaceOtherSystemInformation   SearchSpaceId                                           OPTIONAL,   -- Need S
+    pagingSearchSpace                   SearchSpaceId                                           OPTIONAL,   -- Need S
+    ra-SearchSpace                      SearchSpaceId                                           OPTIONAL,   -- Need S
+    ...,
+    [[
+    firstPDCCH-MonitoringOccasionOfPO   CHOICE {
+        sCS15KHZoneT                                                             SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..139),
+        sCS30KHZoneT-SCS15KHZhalfT                                               SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..279),
+        sCS60KHZoneT-SCS30KHZhalfT-SCS15KHZquarterT                              SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..559),
+        sCS120KHZoneT-SCS60KHZhalfT-SCS30KHZquarterT-SCS15KHZoneEighthT          SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..1119),
+        sCS120KHZhalfT-SCS60KHZquarterT-SCS30KHZoneEighthT-SCS15KHZoneSixteenthT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..2239),
+        sCS120KHZquarterT-SCS60KHZoneEighthT-SCS30KHZoneSixteenthT               SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..4479),
+        sCS120KHZoneEighthT-SCS60KHZoneSixteenthT                                SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..8959),
+        sCS120KHZoneSixteenthT                                                   SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..17919)
+    }                                                                                           OPTIONAL    -- Cond OtherBWP
+    ]],
+    [[
+    commonSearchSpaceListExt-r16                                             SEQUENCE (SIZE(1..4)) OF SearchSpaceExt-r16     OPTIONAL  -- Need R
+    ]]
+}
+
+-- TAG-PDCCH-CONFIGCOMMON-STOP
+-- TAG-PDCCH-CONFIGSIB1-START
+
+PDCCH-ConfigSIB1 ::=                SEQUENCE {
+    controlResourceSetZero              ControlResourceSetZero,
+    searchSpaceZero                     SearchSpaceZero
+}
+
+-- TAG-PDCCH-CONFIGSIB1-STOP
+-- TAG-PDCCH-SERVINGCELLCONFIG-START
+
+PDCCH-ServingCellConfig ::=         SEQUENCE {
+    slotFormatIndicator                 SetupRelease { SlotFormatIndicator }                                OPTIONAL,   -- Need M
+    ...,
+    [[
+    availabilityIndicator-r16           SetupRelease {AvailabilityIndicator-r16}                            OPTIONAL,   -- Need M
+    searchSpaceSwitchTimer-r16          INTEGER (1..80)                                                     OPTIONAL    -- Need R
+    ]]
+}
+
+-- TAG-PDCCH-SERVINGCELLCONFIG-STOP
+-- TAG-PDCP-CONFIG-START
+
+PDCP-Config ::=         SEQUENCE {
+    drb                     SEQUENCE {
+        discardTimer            ENUMERATED {ms10, ms20, ms30, ms40, ms50, ms60, ms75, ms100, ms150, ms200,
+                                            ms250, ms300, ms500, ms750, ms1500, infinity}       OPTIONAL, -- Cond Setup
+        pdcp-SN-SizeUL          ENUMERATED {len12bits, len18bits}                               OPTIONAL, -- Cond Setup2
+        pdcp-SN-SizeDL          ENUMERATED {len12bits, len18bits}                               OPTIONAL, -- Cond Setup2
+        headerCompression       CHOICE {
+            notUsed                 NULL,
+            rohc                    SEQUENCE {
+                maxCID                  INTEGER (1..16383)                                      DEFAULT 15,
+                profiles                SEQUENCE {
+                    profile0x0001           BOOLEAN,
+                    profile0x0002           BOOLEAN,
+                    profile0x0003           BOOLEAN,
+                    profile0x0004           BOOLEAN,
+                    profile0x0006           BOOLEAN,
+                    profile0x0101           BOOLEAN,
+                    profile0x0102           BOOLEAN,
+                    profile0x0103           BOOLEAN,
+                    profile0x0104           BOOLEAN
+                },
+                drb-ContinueROHC            ENUMERATED { true }                                 OPTIONAL    -- Need N
+            },
+            uplinkOnlyROHC          SEQUENCE {
+                maxCID                  INTEGER (1..16383)                                      DEFAULT 15,
+                profiles                SEQUENCE {
+                    profile0x0006           BOOLEAN
+                },
+                drb-ContinueROHC            ENUMERATED { true }                                 OPTIONAL    -- Need N
+            },
+            ...
+        },
+        integrityProtection     ENUMERATED { enabled }                                          OPTIONAL,   -- Cond ConnectedTo5GC1
+        statusReportRequired    ENUMERATED { true }                                             OPTIONAL,   -- Cond Rlc-AM-UM
+        outOfOrderDelivery      ENUMERATED { true }                                             OPTIONAL    -- Need R
+    }                                                                                           OPTIONAL,   -- Cond DRB
+    moreThanOneRLC          SEQUENCE {
+        primaryPath             SEQUENCE {
+            cellGroup               CellGroupId                                                 OPTIONAL,   -- Need R
+            logicalChannel          LogicalChannelIdentity                                      OPTIONAL    -- Need R
+        },
+        ul-DataSplitThreshold   UL-DataSplitThreshold                                           OPTIONAL,   -- Cond SplitBearer
+        pdcp-Duplication            BOOLEAN                                                     OPTIONAL    -- Need R
+    }                                                                                           OPTIONAL,   -- Cond MoreThanOneRLC
+
+    t-Reordering                ENUMERATED {
+                                    ms0, ms1, ms2, ms4, ms5, ms8, ms10, ms15, ms20, ms30, ms40,
+                                    ms50, ms60, ms80, ms100, ms120, ms140, ms160, ms180, ms200, ms220,
+                                    ms240, ms260, ms280, ms300, ms500, ms750, ms1000, ms1250,
+                                    ms1500, ms1750, ms2000, ms2250, ms2500, ms2750,
+                                    ms3000, spare28, spare27, spare26, spare25, spare24,
+                                    spare23, spare22, spare21, spare20,
+                                    spare19, spare18, spare17, spare16, spare15, spare14,
+                                    spare13, spare12, spare11, spare10, spare09,
+                                    spare08, spare07, spare06, spare05, spare04, spare03,
+                                    spare02, spare01 }                                          OPTIONAL, -- Need S
+    ...,
+    [[
+    cipheringDisabled       ENUMERATED {true}                                                   OPTIONAL    -- Cond ConnectedTo5GC
+    ]],
+    [[
+    discardTimerExt-r16     SetupRelease { DiscardTimerExt-r16 }                                OPTIONAL,    -- Cond DRB2
+    moreThanTwoRLC-DRB-r16  SEQUENCE {
+        splitSecondaryPath-r16  LogicalChannelIdentity                                          OPTIONAL,   -- Cond SplitBearer2
+        duplicationState-r16    SEQUENCE (SIZE (3)) OF BOOLEAN                                  OPTIONAL    -- Need S
+    }                                                                                           OPTIONAL,   -- Cond MoreThanTwoRLC-DRB
+    ethernetHeaderCompression-r16  SetupRelease { EthernetHeaderCompression-r16 }               OPTIONAL    -- Need M
+    ]]
+}
+
+EthernetHeaderCompression-r16 ::=  SEQUENCE {
+    ehc-Common-r16                     SEQUENCE {
+        ehc-CID-Length-r16                 ENUMERATED { bits7, bits15 },
+         ...
+    },
+    ehc-Downlink-r16               SEQUENCE {
+        drb-ContinueEHC-DL-r16         ENUMERATED { true }                                      OPTIONAL,   -- Need R
+        ...
+    }                                                                                           OPTIONAL,   -- Need M
+    ehc-Uplink-r16                 SEQUENCE {
+        maxCID-EHC-UL-r16              INTEGER (1..32767),
+        drb-ContinueEHC-UL-r16         ENUMERATED { true }                                      OPTIONAL,   -- Need R
+        ...
+    }                                                                                           OPTIONAL    -- Need M
+}
+
+UL-DataSplitThreshold ::= ENUMERATED {
+                                            b0, b100, b200, b400, b800, b1600, b3200, b6400, b12800, b25600, b51200, b102400, b204800,
+                                            b409600, b819200, b1228800, b1638400, b2457600, b3276800, b4096000, b4915200, b5734400,
+                                            b6553600, infinity, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1}
+
+DiscardTimerExt-r16 ::= ENUMERATED {ms0dot5, ms1, ms2, ms4, ms6, ms8, spare2, spare1}
+
+-- TAG-PDCP-CONFIG-STOP
+-- TAG-PDSCH-CONFIG-START
+
+PDSCH-Config ::=                        SEQUENCE {
+    dataScramblingIdentityPDSCH             INTEGER (0..1023)                                                   OPTIONAL,   -- Need S
+    dmrs-DownlinkForPDSCH-MappingTypeA      SetupRelease { DMRS-DownlinkConfig }                                OPTIONAL,   -- Need M
+    dmrs-DownlinkForPDSCH-MappingTypeB      SetupRelease { DMRS-DownlinkConfig }                                OPTIONAL,   -- Need M
+
+    tci-StatesToAddModList                  SEQUENCE (SIZE(1..maxNrofTCI-States)) OF TCI-State                  OPTIONAL,   -- Need N
+    tci-StatesToReleaseList                 SEQUENCE (SIZE(1..maxNrofTCI-States)) OF TCI-StateId                OPTIONAL,   -- Need N
+    vrb-ToPRB-Interleaver                   ENUMERATED {n2, n4}                                                 OPTIONAL,   -- Need S
+    resourceAllocation                      ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch},
+    pdsch-TimeDomainAllocationList          SetupRelease { PDSCH-TimeDomainResourceAllocationList }             OPTIONAL,   -- Need M
+    pdsch-AggregationFactor                 ENUMERATED { n2, n4, n8 }                                           OPTIONAL,   -- Need S
+    rateMatchPatternToAddModList            SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPattern   OPTIONAL,   -- Need N
+    rateMatchPatternToReleaseList           SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPatternId OPTIONAL,   -- Need N
+    rateMatchPatternGroup1                  RateMatchPatternGroup                                               OPTIONAL,   -- Need R
+    rateMatchPatternGroup2                  RateMatchPatternGroup                                               OPTIONAL,   -- Need R
+
+    rbg-Size                                ENUMERATED {config1, config2},
+    mcs-Table                               ENUMERATED {qam256, qam64LowSE}                                     OPTIONAL,   -- Need S
+    maxNrofCodeWordsScheduledByDCI          ENUMERATED {n1, n2}                                                 OPTIONAL,   -- Need R
+
+    prb-BundlingType                        CHOICE {
+        staticBundling                          SEQUENCE {
+            bundleSize                              ENUMERATED { n4, wideband }                                 OPTIONAL    -- Need S
+        },
+        dynamicBundling                     SEQUENCE {
+            bundleSizeSet1                      ENUMERATED { n4, wideband, n2-wideband, n4-wideband }           OPTIONAL,   -- Need S
+            bundleSizeSet2                      ENUMERATED { n4, wideband }                                     OPTIONAL    -- Need S
+        }
+    },
+    zp-CSI-RS-ResourceToAddModList                  SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-Resources)) OF ZP-CSI-RS-Resource
+                                                                                                                OPTIONAL,   -- Need N
+    zp-CSI-RS-ResourceToReleaseList                 SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-Resources)) OF ZP-CSI-RS-ResourceId
+                                                                                                                OPTIONAL,   -- Need N
+    aperiodic-ZP-CSI-RS-ResourceSetsToAddModList    SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSet
+                                                                                                                OPTIONAL,   -- Need N
+    aperiodic-ZP-CSI-RS-ResourceSetsToReleaseList SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSetId
+                                                                                                                OPTIONAL,   -- Need N
+    sp-ZP-CSI-RS-ResourceSetsToAddModList   SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSet
+                                                                                                                OPTIONAL,   -- Need N
+    sp-ZP-CSI-RS-ResourceSetsToReleaseList  SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSetId
+                                                                                                                OPTIONAL,   -- Need N
+    p-ZP-CSI-RS-ResourceSet                 SetupRelease { ZP-CSI-RS-ResourceSet }
+                                                                                                                OPTIONAL,   -- Need M
+    ...,
+    [[
+    maxMIMO-Layers-r16                      SetupRelease { MaxMIMO-LayersDL-r16 }                               OPTIONAL,   -- Need M
+    minimumSchedulingOffsetK0-r16           SetupRelease { MinSchedulingOffsetK0-Values-r16 }                   OPTIONAL,   -- Need M
+
+    -- Start of the parameters for DCI format 1_2 introduced in V16.1.0
+    antennaPortsFieldPresenceDCI-1-2-r16            ENUMERATED {enabled}                                        OPTIONAL,   -- Need S
+    aperiodicZP-CSI-RS-ResourceSetsToAddModListDCI-1-2-r16  SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSet                                                                                          
+                                                                                                                OPTIONAL,   -- Need N
+    aperiodicZP-CSI-RS-ResourceSetsToReleaseListDCI-1-2-r16 SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSetId                                                                                              
+                                                                                                                OPTIONAL,   -- Need N
+    dmrs-DownlinkForPDSCH-MappingTypeA-DCI-1-2-r16  SetupRelease { DMRS-DownlinkConfig }                        OPTIONAL,   -- Need M
+    dmrs-DownlinkForPDSCH-MappingTypeB-DCI-1-2-r16  SetupRelease { DMRS-DownlinkConfig }                        OPTIONAL,   -- Need M
+    dmrs-SequenceInitializationDCI-1-2-r16          ENUMERATED {enabled}                                        OPTIONAL,   -- Need S
+    harq-ProcessNumberSizeDCI-1-2-r16               INTEGER (0..4)                                              OPTIONAL,   -- Need R
+    mcs-TableDCI-1-2-r16                            ENUMERATED {qam256, qam64LowSE}                             OPTIONAL,   -- Need S
+    numberOfBitsForRV-DCI-1-2-r16                   INTEGER (0..2)                                              OPTIONAL,   -- Need R
+    pdsch-TimeDomainAllocationListDCI-1-2-r16       SetupRelease { PDSCH-TimeDomainResourceAllocationList-r16 }
+                                                                                                                OPTIONAL,   -- Need M
+    prb-BundlingTypeDCI-1-2-r16             CHOICE {
+        staticBundling-r16                      SEQUENCE {
+            bundleSize-r16                          ENUMERATED { n4, wideband }                                 OPTIONAL    -- Need S
+        },
+        dynamicBundling-r16                     SEQUENCE {
+            bundleSizeSet1-r16                      ENUMERATED { n4, wideband, n2-wideband, n4-wideband }       OPTIONAL,   -- Need S
+            bundleSizeSet2-r16                      ENUMERATED { n4, wideband }                                 OPTIONAL    -- Need S
+        }
+    }                                                                                                           OPTIONAL,   -- Need R
+    priorityIndicatorDCI-1-2-r16                ENUMERATED {enabled}                                            OPTIONAL,   -- Need S
+    rateMatchPatternGroup1DCI-1-2-r16           RateMatchPatternGroup                                           OPTIONAL,   -- Need R
+    rateMatchPatternGroup2DCI-1-2-r16           RateMatchPatternGroup                                           OPTIONAL,   -- Need R
+    resourceAllocationType1GranularityDCI-1-2-r16  ENUMERATED {n2,n4,n8,n16}                                    OPTIONAL,   -- Need S
+    vrb-ToPRB-InterleaverDCI-1-2-r16            ENUMERATED {n2, n4}                                             OPTIONAL,   -- Need S
+    referenceOfSLIVDCI-1-2-r16                  ENUMERATED {enabled}                                            OPTIONAL,   -- Need S
+    resourceAllocationDCI-1-2-r16               ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch}
+                                                                                                                OPTIONAL,   -- Need M
+    -- End of the parameters for DCI format 1_2 introduced in V16.1.0
+
+    priorityIndicatorDCI-1-1-r16             ENUMERATED {enabled}                                               OPTIONAL,   -- Need S
+    dataScramblingIdentityPDSCH2-r16         INTEGER (0..1023)                                                  OPTIONAL,   -- Need R
+    pdsch-TimeDomainAllocationList-r16       SetupRelease { PDSCH-TimeDomainResourceAllocationList-r16 }        OPTIONAL,   -- Need M
+    repetitionSchemeConfig-r16               SetupRelease { RepetitionSchemeConfig-r16}                         OPTIONAL    -- Need M
+    ]],
+    [[
+    repetitionSchemeConfig-v1630             SetupRelease { RepetitionSchemeConfig-v1630}                       OPTIONAL    -- Need M
+    ]]
+}
+
+RateMatchPatternGroup ::=               SEQUENCE (SIZE (1..maxNrofRateMatchPatternsPerGroup)) OF CHOICE {
+    cellLevel                               RateMatchPatternId,
+    bwpLevel                                RateMatchPatternId
+}
+
+MinSchedulingOffsetK0-Values-r16 ::=    SEQUENCE (SIZE (1..maxNrOfMinSchedulingOffsetValues-r16)) OF INTEGER (0..maxK0-SchedulingOffset-r16)
+
+MaxMIMO-LayersDL-r16 ::=                INTEGER (1..8)
+
+-- TAG-PDSCH-CONFIG-STOP
+-- TAG-PDSCH-CONFIGCOMMON-START
+
+PDSCH-ConfigCommon ::=                  SEQUENCE {
+    pdsch-TimeDomainAllocationList                  PDSCH-TimeDomainResourceAllocationList          OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-PDSCH-CONFIGCOMMON-STOP
+-- TAG-PDSCH-SERVINGCELLCONFIG-START
+
+PDSCH-ServingCellConfig ::=             SEQUENCE {
+    codeBlockGroupTransmission              SetupRelease { PDSCH-CodeBlockGroupTransmission }              OPTIONAL,   -- Need M
+    xOverhead                               ENUMERATED { xOh6, xOh12, xOh18 }                              OPTIONAL,   -- Need S
+    nrofHARQ-ProcessesForPDSCH              ENUMERATED {n2, n4, n6, n10, n12, n16}                         OPTIONAL,   -- Need S
+    pucch-Cell                              ServCellIndex                                                  OPTIONAL,   -- Cond SCellAddOnly
+    ...,
+    [[
+    maxMIMO-Layers                          INTEGER (1..8)                                                 OPTIONAL,   -- Need M
+    processingType2Enabled                  BOOLEAN                                                        OPTIONAL    -- Need M
+    ]],
+    [[
+    pdsch-CodeBlockGroupTransmissionList-r16 SetupRelease { PDSCH-CodeBlockGroupTransmissionList-r16 }     OPTIONAL    -- Need M
+    ]]
+}
+
+PDSCH-CodeBlockGroupTransmission ::=    SEQUENCE {
+    maxCodeBlockGroupsPerTransportBlock     ENUMERATED {n2, n4, n6, n8},
+    codeBlockGroupFlushIndicator            BOOLEAN,
+    ...
+}
+
+PDSCH-CodeBlockGroupTransmissionList-r16 ::=    SEQUENCE (SIZE (1..2)) OF PDSCH-CodeBlockGroupTransmission
+
+-- TAG-PDSCH-SERVINGCELLCONFIG-STOP
+-- TAG-PDSCH-TIMEDOMAINRESOURCEALLOCATIONLIST-START
+
+
+PDSCH-TimeDomainResourceAllocationList ::=  SEQUENCE (SIZE(1..maxNrofDL-Allocations)) OF PDSCH-TimeDomainResourceAllocation
+
+PDSCH-TimeDomainResourceAllocation ::=   SEQUENCE {
+    k0                                      INTEGER(0..32)                                                  OPTIONAL,   -- Need S
+    mappingType                             ENUMERATED {typeA, typeB},
+    startSymbolAndLength                    INTEGER (0..127)
+}
+
+PDSCH-TimeDomainResourceAllocationList-r16 ::=  SEQUENCE (SIZE(1..maxNrofDL-Allocations)) OF PDSCH-TimeDomainResourceAllocation-r16
+
+PDSCH-TimeDomainResourceAllocation-r16 ::=  SEQUENCE {
+    k0-r16                                     INTEGER(0..32)                                              OPTIONAL,   -- Need S
+    mappingType-r16                            ENUMERATED {typeA, typeB},
+    startSymbolAndLength-r16                   INTEGER (0..127),
+    repetitionNumber-r16                       ENUMERATED {n2, n3, n4, n5, n6, n7, n8, n16}                OPTIONAL,   -- Cond Formats1-0and1-1
+    ...
+}
+
+-- TAG-PDSCH-TIMEDOMAINRESOURCEALLOCATIONLIST-STOP
+-- TAG-PHR-CONFIG-START
+
+PHR-Config ::=                      SEQUENCE {
+    phr-PeriodicTimer                   ENUMERATED {sf10, sf20, sf50, sf100, sf200,sf500, sf1000, infinity},
+    phr-ProhibitTimer                   ENUMERATED {sf0, sf10, sf20, sf50, sf100,sf200, sf500, sf1000},
+    phr-Tx-PowerFactorChange            ENUMERATED {dB1, dB3, dB6, infinity},
+    multiplePHR                         BOOLEAN,
+    dummy                               BOOLEAN,
+    phr-Type2OtherCell                  BOOLEAN,
+    phr-ModeOtherCG                     ENUMERATED {real, virtual},
+    ...,
+    [[
+    mpe-Reporting-FR2-r16               SetupRelease { MPE-Config-FR2-r16 }                     OPTIONAL     -- Need M
+    ]]
+}
+
+MPE-Config-FR2-r16 ::=              SEQUENCE {
+    mpe-ProhibitTimer-r16               ENUMERATED {sf0, sf10, sf20, sf50, sf100, sf200, sf500, sf1000},
+    mpe-Threshold-r16                   ENUMERATED {dB3, dB6, dB9, dB12}
+}
+
+-- TAG-PHR-CONFIG-STOP
+-- TAG-PHYSCELLID-START
+
+PhysCellId ::=                      INTEGER (0..1007)
+
+-- TAG-PHYSCELLID-STOP
+-- TAG-PHYSICALCELLGROUPCONFIG-START
+
+PhysicalCellGroupConfig ::=         SEQUENCE {
+    harq-ACK-SpatialBundlingPUCCH       ENUMERATED {true}                                               OPTIONAL,   -- Need S
+    harq-ACK-SpatialBundlingPUSCH       ENUMERATED {true}                                               OPTIONAL,   -- Need S
+    p-NR-FR1                            P-Max                                                           OPTIONAL,   -- Need R
+    pdsch-HARQ-ACK-Codebook             ENUMERATED {semiStatic, dynamic},
+    tpc-SRS-RNTI                        RNTI-Value                                                      OPTIONAL,   -- Need R
+    tpc-PUCCH-RNTI                      RNTI-Value                                                      OPTIONAL,   -- Need R
+    tpc-PUSCH-RNTI                      RNTI-Value                                                      OPTIONAL,   -- Need R
+    sp-CSI-RNTI                         RNTI-Value                                                      OPTIONAL,   -- Need R
+    cs-RNTI                             SetupRelease { RNTI-Value }                                     OPTIONAL,   -- Need M
+    ...,
+    [[
+    mcs-C-RNTI                          RNTI-Value                                                      OPTIONAL,   -- Need R
+    p-UE-FR1                            P-Max                                                           OPTIONAL    -- Cond MCG-Only
+    ]],
+    [[
+    xScale                              ENUMERATED {dB0, dB6, spare2, spare1}                           OPTIONAL    -- Cond SCG-Only
+    ]],
+    [[
+    pdcch-BlindDetection                SetupRelease { PDCCH-BlindDetection }                           OPTIONAL    -- Need M
+    ]],
+    [[
+    dcp-Config-r16                      SetupRelease { DCP-Config-r16 }                                 OPTIONAL,   -- Need M
+    harq-ACK-SpatialBundlingPUCCH-secondaryPUCCHgroup-r16    ENUMERATED {enabled, disabled}             OPTIONAL,   -- Cond twoPUCCHgroup
+    harq-ACK-SpatialBundlingPUSCH-secondaryPUCCHgroup-r16    ENUMERATED {enabled, disabled}             OPTIONAL,   -- Cond twoPUCCHgroup
+    pdsch-HARQ-ACK-Codebook-secondaryPUCCHgroup-r16          ENUMERATED {semiStatic, dynamic}           OPTIONAL,   -- Cond twoPUCCHgroup
+    p-NR-FR2-r16                                              P-Max                                     OPTIONAL,   -- Need R
+    p-UE-FR2-r16                                              P-Max                                     OPTIONAL,   -- Cond MCG-Only
+    nrdc-PCmode-FR1-r16                ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic}       OPTIONAL,   -- Cond MCG-Only
+    nrdc-PCmode-FR2-r16                ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic}       OPTIONAL,   -- Cond MCG-Only
+    pdsch-HARQ-ACK-Codebook-r16            ENUMERATED {enhancedDynamic}                                 OPTIONAL,   -- Need R
+    nfi-TotalDAI-Included-r16              ENUMERATED {true}                                            OPTIONAL,   -- Need R
+    ul-TotalDAI-Included-r16               ENUMERATED {true}                                            OPTIONAL,   -- Need R
+    pdsch-HARQ-ACK-OneShotFeedback-r16     ENUMERATED {true}                                            OPTIONAL,   -- Need R
+    pdsch-HARQ-ACK-OneShotFeedbackNDI-r16  ENUMERATED {true}                                            OPTIONAL,   -- Need R
+    pdsch-HARQ-ACK-OneShotFeedbackCBG-r16  ENUMERATED {true}                                            OPTIONAL,   -- Need R
+    downlinkAssignmentIndexDCI-0-2-r16     ENUMERATED { enabled }                                       OPTIONAL,   -- Need S
+    downlinkAssignmentIndexDCI-1-2-r16     ENUMERATED {n1, n2, n4}                                      OPTIONAL,   -- Need S
+    pdsch-HARQ-ACK-CodebookList-r16        SetupRelease {PDSCH-HARQ-ACK-CodebookList-r16}               OPTIONAL,   -- Need M
+    ackNackFeedbackMode-r16                ENUMERATED {joint, separate}                                 OPTIONAL,   -- Need R
+    pdcch-BlindDetectionCA-CombIndicator-r16 SetupRelease { PDCCH-BlindDetectionCA-CombIndicator-r16 }  OPTIONAL,   -- Need M
+    pdcch-BlindDetection2-r16                SetupRelease { PDCCH-BlindDetection2-r16 }                 OPTIONAL,   -- Need M
+    pdcch-BlindDetection3-r16                SetupRelease { PDCCH-BlindDetection3-r16 }                 OPTIONAL,   -- Need M
+    bdFactorR-r16                          ENUMERATED {n1}                                              OPTIONAL    -- Need R
+    ]]
+}
+
+PDCCH-BlindDetection ::=                INTEGER (1..15)
+
+DCP-Config-r16 ::=                  SEQUENCE {
+    ps-RNTI-r16                         RNTI-Value,
+    ps-Offset-r16                       INTEGER (1..120),
+    sizeDCI-2-6-r16                     INTEGER (1..maxDCI-2-6-Size-r16),
+    ps-PositionDCI-2-6-r16              INTEGER (0..maxDCI-2-6-Size-1-r16),
+    ps-WakeUp-r16                       ENUMERATED {true}                                               OPTIONAL,   -- Need S
+    ps-TransmitPeriodicL1-RSRP-r16      ENUMERATED {true}                                               OPTIONAL,   -- Need S
+    ps-TransmitOtherPeriodicCSI-r16     ENUMERATED {true}                                               OPTIONAL    -- Need S
+}
+
+PDSCH-HARQ-ACK-CodebookList-r16 ::=     SEQUENCE (SIZE (1..2)) OF ENUMERATED {semiStatic, dynamic}
+
+PDCCH-BlindDetectionCA-CombIndicator-r16 ::= SEQUENCE {
+    pdcch-BlindDetectionCA1-r16                  INTEGER (1..15),
+    pdcch-BlindDetectionCA2-r16                  INTEGER (1..15)
+}
+
+PDCCH-BlindDetection2-r16 ::=                INTEGER (1..15)
+
+PDCCH-BlindDetection3-r16 ::=                INTEGER (1..15)
+
+-- TAG-PHYSICALCELLGROUPCONFIG-STOP
+-- TAG-PLMN-IDENTITY-START
+
+PLMN-Identity ::=                   SEQUENCE {
+    mcc                                 MCC                 OPTIONAL,                   -- Cond MCC
+    mnc                                 MNC
+}
+
+MCC ::=                             SEQUENCE (SIZE (3)) OF MCC-MNC-Digit
+
+MNC ::=                             SEQUENCE (SIZE (2..3)) OF MCC-MNC-Digit
+
+MCC-MNC-Digit ::=                   INTEGER (0..9)
+
+-- TAG-PLMN-IDENTITY-STOP
+-- TAG-PLMN-IDENTITYINFOLIST-START
+
+PLMN-IdentityInfoList ::=               SEQUENCE (SIZE (1..maxPLMN)) OF PLMN-IdentityInfo
+
+PLMN-IdentityInfo ::=                   SEQUENCE {
+    plmn-IdentityList                       SEQUENCE (SIZE (1..maxPLMN)) OF PLMN-Identity,
+    trackingAreaCode                        TrackingAreaCode                                            OPTIONAL,       -- Need R
+    ranac                                   RAN-AreaCode                                                OPTIONAL,       -- Need R
+    cellIdentity                            CellIdentity,
+    cellReservedForOperatorUse              ENUMERATED {reserved, notReserved},
+    ...,
+    [[
+    iab-Support-r16                     ENUMERATED {true}                                               OPTIONAL       -- Need S
+    ]]
+}
+-- TAG-PLMN-IDENTITYINFOLIST-STOP
+-- TAG-PLMNIDENTITYLIST2-START
+
+PLMN-IdentityList2-r16 ::= SEQUENCE (SIZE (1..16)) OF PLMN-Identity
+
+-- TAG-PLMNIDENTITYLIST2-STOP
+-- TAG-PRB-ID-START
+
+PRB-Id ::=                          INTEGER (0..maxNrofPhysicalResourceBlocks-1)
+
+-- TAG-PRB-ID-STOP
+-- TAG-PTRS-DOWNLINKCONFIG-START
+
+PTRS-DownlinkConfig ::=             SEQUENCE {
+    frequencyDensity                    SEQUENCE (SIZE (2)) OF INTEGER (1..276)                                 OPTIONAL,   -- Need S
+    timeDensity                         SEQUENCE (SIZE (3)) OF INTEGER (0..29)                                  OPTIONAL,   -- Need S
+    epre-Ratio                          INTEGER (0..3)                                                          OPTIONAL,   -- Need S
+    resourceElementOffset               ENUMERATED { offset01, offset10, offset11 }                             OPTIONAL,   -- Need S
+    ...,
+    [[
+    maxNrofPorts-r16                    ENUMERATED {n1, n2}                                                     OPTIONAL    -- Need R
+    ]]
+
+}
+
+-- TAG-PTRS-DOWNLINKCONFIG-STOP
+-- TAG-PTRS-UPLINKCONFIG-START
+
+PTRS-UplinkConfig ::=                   SEQUENCE {
+    transformPrecoderDisabled               SEQUENCE {
+        frequencyDensity                    SEQUENCE (SIZE (2)) OF INTEGER (1..276)                 OPTIONAL,   -- Need S
+        timeDensity                         SEQUENCE (SIZE (3)) OF INTEGER (0..29)                  OPTIONAL,   -- Need S
+        maxNrofPorts                        ENUMERATED {n1, n2},
+        resourceElementOffset               ENUMERATED {offset01, offset10, offset11 }              OPTIONAL,   -- Need S
+        ptrs-Power                          ENUMERATED {p00, p01, p10, p11}
+    }                                                                                               OPTIONAL,   -- Need R
+    transformPrecoderEnabled                SEQUENCE {
+        sampleDensity                           SEQUENCE (SIZE (5)) OF INTEGER (1..276),
+        timeDensityTransformPrecoding           ENUMERATED {d2}                                     OPTIONAL    -- Need S
+    }                                                                                               OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-PTRS-UPLINKCONFIG-STOP
+-- TAG-PUCCH-CONFIG-START
+
+PUCCH-Config ::=                        SEQUENCE {
+    resourceSetToAddModList                 SEQUENCE (SIZE (1..maxNrofPUCCH-ResourceSets)) OF PUCCH-ResourceSet   OPTIONAL, -- Need N
+    resourceSetToReleaseList                SEQUENCE (SIZE (1..maxNrofPUCCH-ResourceSets)) OF PUCCH-ResourceSetId OPTIONAL, -- Need N
+    resourceToAddModList                    SEQUENCE (SIZE (1..maxNrofPUCCH-Resources)) OF PUCCH-Resource         OPTIONAL, -- Need N
+    resourceToReleaseList                   SEQUENCE (SIZE (1..maxNrofPUCCH-Resources)) OF PUCCH-ResourceId       OPTIONAL, -- Need N
+    format1                                 SetupRelease { PUCCH-FormatConfig }                                   OPTIONAL, -- Need M
+    format2                                 SetupRelease { PUCCH-FormatConfig }                                   OPTIONAL, -- Need M
+    format3                                 SetupRelease { PUCCH-FormatConfig }                                   OPTIONAL, -- Need M
+    format4                                 SetupRelease { PUCCH-FormatConfig }                                   OPTIONAL, -- Need M
+    schedulingRequestResourceToAddModList   SEQUENCE (SIZE (1..maxNrofSR-Resources)) OF SchedulingRequestResourceConfig
+                                                                                                                  OPTIONAL, -- Need N
+    schedulingRequestResourceToReleaseList  SEQUENCE (SIZE (1..maxNrofSR-Resources)) OF SchedulingRequestResourceId
+                                                                                                                  OPTIONAL, -- Need N
+    multi-CSI-PUCCH-ResourceList            SEQUENCE (SIZE (1..2)) OF PUCCH-ResourceId                            OPTIONAL, -- Need M
+    dl-DataToUL-ACK                         SEQUENCE (SIZE (1..8)) OF INTEGER (0..15)                             OPTIONAL, -- Need M
+    spatialRelationInfoToAddModList         SEQUENCE (SIZE (1..maxNrofSpatialRelationInfos)) OF PUCCH-SpatialRelationInfo
+                                                                                                                  OPTIONAL, -- Need N
+    spatialRelationInfoToReleaseList        SEQUENCE (SIZE (1..maxNrofSpatialRelationInfos)) OF PUCCH-SpatialRelationInfoId
+                                                                                                                  OPTIONAL, -- Need N
+    pucch-PowerControl                      PUCCH-PowerControl                                                    OPTIONAL, -- Need M
+    ...,
+    [[
+    resourceToAddModListExt-r16             SEQUENCE (SIZE (1..maxNrofPUCCH-Resources)) OF PUCCH-ResourceExt-r16  OPTIONAL, -- Need N
+    dl-DataToUL-ACK-r16                     SetupRelease { DL-DataToUL-ACK-r16 }                                  OPTIONAL, -- Need M
+    ul-AccessConfigListDCI-1-1-r16          SetupRelease { UL-AccessConfigListDCI-1-1-r16 }                       OPTIONAL, -- Need M
+    subslotLengthForPUCCH-r16               CHOICE {
+            normalCP-r16                        ENUMERATED {n2,n7},
+            extendedCP-r16                      ENUMERATED {n2,n6}
+    }                                                                                                             OPTIONAL, -- Need R
+    dl-DataToUL-ACK-DCI-1-2-r16             SetupRelease { DL-DataToUL-ACK-DCI-1-2-r16}                           OPTIONAL, -- Need M
+    numberOfBitsForPUCCH-ResourceIndicatorDCI-1-2-r16  INTEGER (0..3)                                             OPTIONAL, -- Need R
+    dmrs-UplinkTransformPrecodingPUCCH-r16  ENUMERATED {enabled}                                                  OPTIONAL,  -- Cond PI2-BPSK
+    spatialRelationInfoToAddModListSizeExt-v1610    SEQUENCE (SIZE (1..maxNrofSpatialRelationInfosDiff-r16)) OF PUCCH-SpatialRelationInfo
+                                                                                                                  OPTIONAL, -- Need N
+    spatialRelationInfoToReleaseListSizeExt-v1610   SEQUENCE (SIZE (1..maxNrofSpatialRelationInfosDiff-r16)) OF PUCCH-SpatialRelationInfoId
+                                                                                                                  OPTIONAL, -- Need N
+    spatialRelationInfoToAddModListExt-v1610  SEQUENCE (SIZE (1..maxNrofSpatialRelationInfos-r16)) OF PUCCH-SpatialRelationInfoExt-r16
+                                                                                                                  OPTIONAL, -- Need N
+    spatialRelationInfoToReleaseListExt-v1610    SEQUENCE (SIZE (1..maxNrofSpatialRelationInfos-r16)) OF
+                                                                            PUCCH-SpatialRelationInfoId-r16       OPTIONAL, -- Need N
+    resourceGroupToAddModList-r16           SEQUENCE (SIZE (1..maxNrofPUCCH-ResourceGroups-r16)) OF PUCCH-ResourceGroup-r16
+                                                                                                                  OPTIONAL, -- Need N
+    resourceGroupToReleaseList-r16          SEQUENCE (SIZE (1..maxNrofPUCCH-ResourceGroups-r16)) OF PUCCH-ResourceGroupId-r16
+                                                                                                                  OPTIONAL, -- Need N
+    sps-PUCCH-AN-List-r16                   SetupRelease { SPS-PUCCH-AN-List-r16 }                                OPTIONAL,  -- Need M
+    schedulingRequestResourceToAddModListExt-v1610   SEQUENCE (SIZE (1..maxNrofSR-Resources)) OF SchedulingRequestResourceConfigExt-v1610
+                                                                                                                  OPTIONAL -- Need N
+    ]]
+}
+
+PUCCH-FormatConfig ::=                  SEQUENCE {
+    interslotFrequencyHopping               ENUMERATED {enabled}                                                  OPTIONAL, -- Need R
+    additionalDMRS                          ENUMERATED {true}                                                     OPTIONAL, -- Need R
+    maxCodeRate                             PUCCH-MaxCodeRate                                                     OPTIONAL, -- Need R
+    nrofSlots                               ENUMERATED {n2,n4,n8}                                                 OPTIONAL, -- Need S
+    pi2BPSK                                 ENUMERATED {enabled}                                                  OPTIONAL, -- Need R
+    simultaneousHARQ-ACK-CSI                ENUMERATED {true}                                                     OPTIONAL  -- Need R
+}
+
+PUCCH-MaxCodeRate ::=                   ENUMERATED {zeroDot08, zeroDot15, zeroDot25, zeroDot35, zeroDot45, zeroDot60, zeroDot80}
+
+-- A set with one or more PUCCH resources
+PUCCH-ResourceSet ::=                   SEQUENCE {
+    pucch-ResourceSetId                     PUCCH-ResourceSetId,
+    resourceList                            SEQUENCE (SIZE (1..maxNrofPUCCH-ResourcesPerSet)) OF PUCCH-ResourceId,
+    maxPayloadSize                          INTEGER (4..256)                                                      OPTIONAL  -- Need R
+}
+
+PUCCH-ResourceSetId ::=                 INTEGER (0..maxNrofPUCCH-ResourceSets-1)
+
+PUCCH-Resource ::=                      SEQUENCE {
+    pucch-ResourceId                        PUCCH-ResourceId,
+    startingPRB                             PRB-Id,
+    intraSlotFrequencyHopping               ENUMERATED { enabled }                                                OPTIONAL, -- Need R
+    secondHopPRB                            PRB-Id                                                                OPTIONAL, -- Need R
+    format                                  CHOICE {
+        format0                                 PUCCH-format0,
+        format1                                 PUCCH-format1,
+        format2                                 PUCCH-format2,
+        format3                                 PUCCH-format3,
+        format4                                 PUCCH-format4
+    }
+}
+
+PUCCH-ResourceExt-r16 ::=               SEQUENCE {
+    interlaceAllocation-r16                 SEQUENCE {
+        rb-SetIndex                             INTEGER (0..4),
+        interlace0                              CHOICE {
+            scs15                                   INTEGER (0..9),
+            scs30                                   INTEGER (0..4)
+        }
+    }                                                                                                             OPTIONAL,  --Need R
+    formatExt-v1610                         CHOICE {
+        interlace1-v1610                            INTEGER (0..9),
+        occ-v1610                                   SEQUENCE {
+            occ-Length-v1610                                ENUMERATED {n2,n4}                                       OPTIONAL, -- Need M
+            occ-Index-v1610                                 ENUMERATED {n0,n1,n2,n3}                                 OPTIONAL  -- Need M
+        }
+    }                                                                                                            OPTIONAL,  -- Need R
+    ...
+}
+
+PUCCH-ResourceId ::=                    INTEGER (0..maxNrofPUCCH-Resources-1)
+
+
+PUCCH-format0 ::=                               SEQUENCE {
+    initialCyclicShift                              INTEGER(0..11),
+    nrofSymbols                                     INTEGER (1..2),
+    startingSymbolIndex                             INTEGER(0..13)
+}
+
+PUCCH-format1 ::=                               SEQUENCE {
+    initialCyclicShift                              INTEGER(0..11),
+    nrofSymbols                                     INTEGER (4..14),
+    startingSymbolIndex                             INTEGER(0..10),
+    timeDomainOCC                                   INTEGER(0..6)
+}
+
+PUCCH-format2 ::=                               SEQUENCE {
+    nrofPRBs                                        INTEGER (1..16),
+    nrofSymbols                                     INTEGER (1..2),
+    startingSymbolIndex                             INTEGER(0..13)
+}
+
+PUCCH-format3 ::=                               SEQUENCE {
+    nrofPRBs                                        INTEGER (1..16),
+    nrofSymbols                                     INTEGER (4..14),
+    startingSymbolIndex                             INTEGER(0..10)
+}
+
+PUCCH-format4 ::=                               SEQUENCE {
+    nrofSymbols                                     INTEGER (4..14),
+    occ-Length                                      ENUMERATED {n2,n4},
+    occ-Index                                       ENUMERATED {n0,n1,n2,n3},
+    startingSymbolIndex                             INTEGER(0..10)
+}
+
+PUCCH-ResourceGroup-r16 ::=                SEQUENCE {
+    pucch-ResourceGroupId-r16                  PUCCH-ResourceGroupId-r16,
+    resourcePerGroupList-r16                   SEQUENCE (SIZE (1..maxNrofPUCCH-ResourcesPerGroup-r16)) OF PUCCH-ResourceId
+}
+
+PUCCH-ResourceGroupId-r16 ::=              INTEGER (0..maxNrofPUCCH-ResourceGroups-1-r16)
+
+DL-DataToUL-ACK-r16 ::=                    SEQUENCE (SIZE (1..8)) OF INTEGER (-1..15)
+
+DL-DataToUL-ACK-DCI-1-2-r16 ::=            SEQUENCE (SIZE (1..8)) OF INTEGER (0..15)
+
+UL-AccessConfigListDCI-1-1-r16 ::=         SEQUENCE (SIZE (1..16)) OF INTEGER (0..15)
+
+-- TAG-PUCCH-CONFIG-STOP
+-- TAG-PUCCH-CONFIGCOMMON-START
+
+PUCCH-ConfigCommon ::=              SEQUENCE {
+    pucch-ResourceCommon                INTEGER (0..15)                                      OPTIONAL,   -- Cond InitialBWP-Only
+    pucch-GroupHopping                  ENUMERATED { neither, enable, disable },
+    hoppingId                           INTEGER (0..1023)                                    OPTIONAL,   -- Need R
+    p0-nominal                          INTEGER (-202..24)                                   OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-PUCCH-CONFIGCOMMON-STOP
+-- TAG-PUCCH-CONFIGURATIONLIST-START
+
+PUCCH-ConfigurationList-r16  ::=     SEQUENCE (SIZE (1..2)) OF PUCCH-Config
+
+-- TAG-PUCCH-CONFIGURATIONLIST-STOP
+-- TAG-PUCCH-PATHLOSSREFERENCERS-ID-START
+
+PUCCH-PathlossReferenceRS-Id ::=            INTEGER (0..maxNrofPUCCH-PathlossReferenceRSs-1)
+
+PUCCH-PathlossReferenceRS-Id-v1610 ::=      INTEGER (maxNrofPUCCH-PathlossReferenceRSs..maxNrofPUCCH-PathlossReferenceRSs-1-r16)
+
+-- TAG-PUCCH-PATHLOSSREFERENCERS-ID-STOP
+-- TAG-PUCCH-POWERCONTROL-START
+PUCCH-PowerControl ::=              SEQUENCE {
+    deltaF-PUCCH-f0                     INTEGER (-16..15)                                                       OPTIONAL, -- Need R
+    deltaF-PUCCH-f1                     INTEGER (-16..15)                                                       OPTIONAL, -- Need R
+    deltaF-PUCCH-f2                     INTEGER (-16..15)                                                       OPTIONAL, -- Need R
+    deltaF-PUCCH-f3                     INTEGER (-16..15)                                                       OPTIONAL, -- Need R
+    deltaF-PUCCH-f4                     INTEGER (-16..15)                                                       OPTIONAL, -- Need R
+    p0-Set                              SEQUENCE (SIZE (1..maxNrofPUCCH-P0-PerSet)) OF P0-PUCCH                 OPTIONAL, -- Need M
+    pathlossReferenceRSs                SEQUENCE (SIZE (1..maxNrofPUCCH-PathlossReferenceRSs)) OF PUCCH-PathlossReferenceRS
+                                                                                                                OPTIONAL, -- Need M
+    twoPUCCH-PC-AdjustmentStates        ENUMERATED {twoStates}                                                  OPTIONAL, -- Need S
+    ...,
+    [[
+    pathlossReferenceRSs-v1610          SetupRelease { PathlossReferenceRSs-v1610 }                             OPTIONAL -- Need M
+    ]]
+}
+
+P0-PUCCH ::=                            SEQUENCE {
+    p0-PUCCH-Id                             P0-PUCCH-Id,
+    p0-PUCCH-Value                          INTEGER (-16..15)
+}
+
+P0-PUCCH-Id ::=                         INTEGER (1..8)
+
+PathlossReferenceRSs-v1610 ::=          SEQUENCE (SIZE (1..maxNrofPUCCH-PathlossReferenceRSsDiff-r16)) OF PUCCH-PathlossReferenceRS-r16
+
+PUCCH-PathlossReferenceRS ::=                   SEQUENCE {
+    pucch-PathlossReferenceRS-Id                PUCCH-PathlossReferenceRS-Id,
+    referenceSignal                             CHOICE {
+        ssb-Index                                   SSB-Index,
+        csi-RS-Index                                NZP-CSI-RS-ResourceId
+    }
+}
+
+PUCCH-PathlossReferenceRS-r16 ::=                   SEQUENCE {
+    pucch-PathlossReferenceRS-Id-r16                    PUCCH-PathlossReferenceRS-Id-v1610,
+    referenceSignal-r16                                 CHOICE {
+        ssb-Index-r16                                       SSB-Index,
+        csi-RS-Index-r16                                    NZP-CSI-RS-ResourceId
+    }
+}
+
+-- TAG-PUCCH-POWERCONTROL-STOP
+-- TAG-PUCCH-SPATIALRELATIONINFO-START
+
+PUCCH-SpatialRelationInfo ::=           SEQUENCE {
+    pucch-SpatialRelationInfoId         PUCCH-SpatialRelationInfoId,
+    servingCellId                           ServCellIndex                                                    OPTIONAL,   -- Need S
+    referenceSignal                         CHOICE {
+        ssb-Index                               SSB-Index,
+        csi-RS-Index                            NZP-CSI-RS-ResourceId,
+        srs                                     PUCCH-SRS
+    },
+    pucch-PathlossReferenceRS-Id            PUCCH-PathlossReferenceRS-Id,
+    p0-PUCCH-Id                             P0-PUCCH-Id,
+    closedLoopIndex                         ENUMERATED { i0, i1 }
+}
+
+PUCCH-SpatialRelationInfoExt-r16 ::=       SEQUENCE {
+    pucch-SpatialRelationInfoId-v1610         PUCCH-SpatialRelationInfoId-v1610                              OPTIONAL,   -- Cond SetupOnly
+    pucch-PathlossReferenceRS-Id-v1610        PUCCH-PathlossReferenceRS-Id-v1610                             OPTIONAL,    --Need R
+    ...
+}
+
+PUCCH-SRS ::=                       SEQUENCE {
+    resource                            SRS-ResourceId,
+    uplinkBWP                           BWP-Id
+}
+-- TAG-PUCCH-SPATIALRELATIONINFO-STOP
+-- TAG-PUCCH-SPATIALRELATIONINFO-START
+
+PUCCH-SpatialRelationInfoId ::=         INTEGER (1..maxNrofSpatialRelationInfos)
+
+PUCCH-SpatialRelationInfoId-r16 ::=     INTEGER (1..maxNrofSpatialRelationInfos-r16)
+
+PUCCH-SpatialRelationInfoId-v1610::=    INTEGER (maxNrofSpatialRelationInfos-plus-1..maxNrofSpatialRelationInfos-r16)
+
+-- TAG-PUCCH-SPATIALRELATIONINFO-STOP
+-- TAG-PUCCH-TPC-COMMANDCONFIG-START
+
+PUCCH-TPC-CommandConfig ::=             SEQUENCE {
+    tpc-IndexPCell                          INTEGER (1..15)                         OPTIONAL,   -- Cond PDCCH-OfSpcell
+    tpc-IndexPUCCH-SCell                    INTEGER (1..15)                         OPTIONAL,   -- Cond PDCCH-ofSpCellOrPUCCH-SCell
+    ...
+}
+
+-- TAG-PUCCH-TPC-COMMANDCONFIG-STOP
+-- TAG-PUSCH-CONFIG-START
+
+PUSCH-Config ::=                        SEQUENCE {
+    dataScramblingIdentityPUSCH             INTEGER (0..1023)                                                   OPTIONAL,   -- Need S
+    txConfig                                ENUMERATED {codebook, nonCodebook}                                  OPTIONAL,   -- Need S
+    dmrs-UplinkForPUSCH-MappingTypeA        SetupRelease { DMRS-UplinkConfig }                                  OPTIONAL,   -- Need M
+    dmrs-UplinkForPUSCH-MappingTypeB        SetupRelease { DMRS-UplinkConfig }                                  OPTIONAL,   -- Need M
+    pusch-PowerControl                      PUSCH-PowerControl                                                  OPTIONAL,   -- Need M
+    frequencyHopping                        ENUMERATED {intraSlot, interSlot}                                   OPTIONAL,   -- Need S
+    frequencyHoppingOffsetLists             SEQUENCE (SIZE (1..4)) OF INTEGER (1.. maxNrofPhysicalResourceBlocks-1)
+                                                                                                                OPTIONAL,   -- Need M
+    resourceAllocation                      ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch},
+    pusch-TimeDomainAllocationList          SetupRelease { PUSCH-TimeDomainResourceAllocationList }             OPTIONAL,   -- Need M
+    pusch-AggregationFactor                 ENUMERATED { n2, n4, n8 }                                           OPTIONAL,   -- Need S
+    mcs-Table                               ENUMERATED {qam256, qam64LowSE}                                     OPTIONAL,   -- Need S
+    mcs-TableTransformPrecoder              ENUMERATED {qam256, qam64LowSE}                                     OPTIONAL,   -- Need S
+    transformPrecoder                       ENUMERATED {enabled, disabled}                                      OPTIONAL,   -- Need S
+    codebookSubset                          ENUMERATED {fullyAndPartialAndNonCoherent, partialAndNonCoherent,nonCoherent}
+                                                                                                          OPTIONAL, -- Cond codebookBased
+    maxRank                                 INTEGER (1..4)                                                OPTIONAL, -- Cond codebookBased
+    rbg-Size                                ENUMERATED { config2}                                         OPTIONAL, -- Need S
+    uci-OnPUSCH                             SetupRelease { UCI-OnPUSCH}                                   OPTIONAL, -- Need M
+    tp-pi2BPSK                              ENUMERATED {enabled}                                          OPTIONAL, -- Need S
+    ...,
+    [[
+    minimumSchedulingOffsetK2-r16           SetupRelease { MinSchedulingOffsetK2-Values-r16 }             OPTIONAL,  -- Need M
+    ul-AccessConfigListDCI-0-1-r16          SetupRelease { UL-AccessConfigListDCI-0-1-r16 }               OPTIONAL,  -- Need M
+    -- Start of the parameters for DCI format 0_2 introduced in V16.1.0
+    harq-ProcessNumberSizeDCI-0-2-r16                       INTEGER (0..4)                                OPTIONAL,   -- Need R
+    dmrs-SequenceInitializationDCI-0-2-r16                  ENUMERATED {enabled}                          OPTIONAL,   -- Need S
+    numberOfBitsForRV-DCI-0-2-r16                           INTEGER (0..2)                                OPTIONAL,   -- Need R
+    antennaPortsFieldPresenceDCI-0-2-r16                    ENUMERATED {enabled}                          OPTIONAL,   -- Need S
+    dmrs-UplinkForPUSCH-MappingTypeA-DCI-0-2-r16            SetupRelease { DMRS-UplinkConfig }            OPTIONAL,   -- Need M
+    dmrs-UplinkForPUSCH-MappingTypeB-DCI-0-2-r16            SetupRelease { DMRS-UplinkConfig }            OPTIONAL,   -- Need M
+    frequencyHoppingDCI-0-2-r16                             CHOICE {
+        pusch-RepTypeA                                          ENUMERATED {intraSlot, interSlot},
+        pusch-RepTypeB                                          ENUMERATED {interRepetition, interSlot}
+    }                                                                                                     OPTIONAL,   -- Need S
+    frequencyHoppingOffsetListsDCI-0-2-r16  SetupRelease { FrequencyHoppingOffsetListsDCI-0-2-r16}        OPTIONAL,  -- Need M
+    codebookSubsetDCI-0-2-r16               ENUMERATED {fullyAndPartialAndNonCoherent, partialAndNonCoherent,nonCoherent}
+                                                                                                          OPTIONAL,   -- Cond codebookBased
+    invalidSymbolPatternIndicatorDCI-0-2-r16                ENUMERATED {enabled}                          OPTIONAL,   -- Need S
+    maxRankDCI-0-2-r16                                      INTEGER (1..4)                                OPTIONAL,   -- Cond codebookBased
+    mcs-TableDCI-0-2-r16                                    ENUMERATED {qam256, qam64LowSE}               OPTIONAL,   -- Need S
+    mcs-TableTransformPrecoderDCI-0-2-r16                   ENUMERATED {qam256, qam64LowSE}               OPTIONAL,   -- Need S
+    priorityIndicatorDCI-0-2-r16                            ENUMERATED {enabled}                          OPTIONAL,   -- Need S
+    pusch-RepTypeIndicatorDCI-0-2-r16                       ENUMERATED { pusch-RepTypeA, pusch-RepTypeB}  OPTIONAL,  -- Need R
+    resourceAllocationDCI-0-2-r16                           ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch}
+                                                                                                          OPTIONAL,   -- Need M
+    resourceAllocationType1GranularityDCI-0-2-r16           ENUMERATED { n2,n4,n8,n16 }                   OPTIONAL,   -- Need S
+    uci-OnPUSCH-ListDCI-0-2-r16                             SetupRelease { UCI-OnPUSCH-ListDCI-0-2-r16}   OPTIONAL,   -- Need M
+    pusch-TimeDomainAllocationListDCI-0-2-r16               SetupRelease { PUSCH-TimeDomainResourceAllocationList-r16 }
+                                                                                                          OPTIONAL,   -- Need M
+    -- End of the parameters for DCI format 0_2 introduced in V16.1.0
+    -- Start of the parameters for DCI format 0_1 introduced in V16.1.0
+    pusch-TimeDomainAllocationListDCI-0-1-r16               SetupRelease { PUSCH-TimeDomainResourceAllocationList-r16 }
+                                                                                                          OPTIONAL,   -- Need M
+    invalidSymbolPatternIndicatorDCI-0-1-r16          ENUMERATED {enabled}                                OPTIONAL,   -- Need S
+    priorityIndicatorDCI-0-1-r16                      ENUMERATED {enabled}                                OPTIONAL,   -- Need S
+    pusch-RepTypeIndicatorDCI-0-1-r16                 ENUMERATED { pusch-RepTypeA, pusch-RepTypeB}        OPTIONAL,   -- Need R
+    frequencyHoppingDCI-0-1-r16                 ENUMERATED {interRepetition, interSlot}                   OPTIONAL,   -- Cond RepTypeB
+    uci-OnPUSCH-ListDCI-0-1-r16                 SetupRelease { UCI-OnPUSCH-ListDCI-0-1-r16  }             OPTIONAL,  -- Need M
+    -- End of the parameters for DCI format 0_1 introduced in V16.1.0
+    invalidSymbolPattern-r16                    InvalidSymbolPattern-r16                                  OPTIONAL,   -- Need S
+    pusch-PowerControl-v1610                SetupRelease {PUSCH-PowerControl-v1610}                       OPTIONAL,   -- Need M
+    ul-FullPowerTransmission-r16            ENUMERATED {fullpower, fullpowerMode1, fullpowerMode2}         OPTIONAL,   -- Need R
+    pusch-TimeDomainAllocationListForMultiPUSCH-r16  SetupRelease { PUSCH-TimeDomainResourceAllocationList-r16 }
+                                                                                                          OPTIONAL,  --  Need M
+    numberOfInvalidSymbolsForDL-UL-Switching-r16        INTEGER (1..4)                                    OPTIONAL    -- Cond RepTypeB2
+    ]]
+}
+
+UCI-OnPUSCH ::=                         SEQUENCE {
+    betaOffsets                             CHOICE {
+        dynamic                             SEQUENCE (SIZE (4)) OF BetaOffsets,
+        semiStatic                          BetaOffsets
+    }                                                                                                 OPTIONAL, -- Need M
+    scaling                                 ENUMERATED { f0p5, f0p65, f0p8, f1 }
+}
+
+MinSchedulingOffsetK2-Values-r16 ::=    SEQUENCE (SIZE (1..maxNrOfMinSchedulingOffsetValues-r16)) OF INTEGER (0..maxK2-SchedulingOffset-r16)
+
+UCI-OnPUSCH-DCI-0-2-r16 ::=             SEQUENCE {
+    betaOffsetsDCI-0-2-r16                  CHOICE {
+        dynamicDCI-0-2-r16                      CHOICE {
+            oneBit-r16                              SEQUENCE (SIZE (2)) OF BetaOffsets,
+            twoBits-r16                             SEQUENCE (SIZE (4)) OF BetaOffsets
+        },
+        semiStaticDCI-0-2-r16          BetaOffsets
+    }                                                                                                 OPTIONAL,   -- Need M
+    scalingDCI-0-2-r16                 ENUMERATED { f0p5, f0p65, f0p8, f1 }
+}
+
+FrequencyHoppingOffsetListsDCI-0-2-r16 ::=  SEQUENCE (SIZE (1..4)) OF INTEGER (1.. maxNrofPhysicalResourceBlocks-1)
+
+UCI-OnPUSCH-ListDCI-0-2-r16 ::=  SEQUENCE (SIZE (1..2)) OF UCI-OnPUSCH-DCI-0-2-r16
+
+UCI-OnPUSCH-ListDCI-0-1-r16 ::=  SEQUENCE (SIZE (1..2)) OF UCI-OnPUSCH
+
+UL-AccessConfigListDCI-0-1-r16 ::= SEQUENCE (SIZE (1..64)) OF INTEGER (0..63)
+
+-- TAG-PUSCH-CONFIG-STOP
+-- TAG-PUSCH-CONFIGCOMMON-START
+
+PUSCH-ConfigCommon ::=                  SEQUENCE {
+    groupHoppingEnabledTransformPrecoding   ENUMERATED {enabled}                                                OPTIONAL,   -- Need R
+    pusch-TimeDomainAllocationList          PUSCH-TimeDomainResourceAllocationList                              OPTIONAL,   -- Need R
+    msg3-DeltaPreamble                      INTEGER (-1..6)                                                     OPTIONAL,   -- Need R
+    p0-NominalWithGrant                     INTEGER (-202..24)                                                  OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-PUSCH-CONFIGCOMMON-STOP
+-- TAG-PUSCH-POWERCONTROL-START
+
+PUSCH-PowerControl ::=              SEQUENCE {
+    tpc-Accumulation                    ENUMERATED { disabled }                                                 OPTIONAL, -- Need S
+    msg3-Alpha                          Alpha                                                                   OPTIONAL, -- Need S
+    p0-NominalWithoutGrant              INTEGER (-202..24)                                                      OPTIONAL, -- Need M
+    p0-AlphaSets                        SEQUENCE (SIZE (1..maxNrofP0-PUSCH-AlphaSets)) OF P0-PUSCH-AlphaSet     OPTIONAL, -- Need M
+    pathlossReferenceRSToAddModList     SEQUENCE (SIZE (1..maxNrofPUSCH-PathlossReferenceRSs)) OF PUSCH-PathlossReferenceRS
+                                                                                                                OPTIONAL, -- Need N
+    pathlossReferenceRSToReleaseList    SEQUENCE (SIZE (1..maxNrofPUSCH-PathlossReferenceRSs)) OF PUSCH-PathlossReferenceRS-Id
+                                                                                                                OPTIONAL,  -- Need N
+    twoPUSCH-PC-AdjustmentStates        ENUMERATED {twoStates}                                                  OPTIONAL, -- Need S
+    deltaMCS                            ENUMERATED {enabled}                                                    OPTIONAL, -- Need S
+    sri-PUSCH-MappingToAddModList       SEQUENCE (SIZE (1..maxNrofSRI-PUSCH-Mappings)) OF SRI-PUSCH-PowerControl
+                                                                                                                OPTIONAL, -- Need N
+    sri-PUSCH-MappingToReleaseList      SEQUENCE (SIZE (1..maxNrofSRI-PUSCH-Mappings)) OF SRI-PUSCH-PowerControlId
+                                                                                                                OPTIONAL  -- Need N
+}
+
+P0-PUSCH-AlphaSet ::=               SEQUENCE {
+    p0-PUSCH-AlphaSetId                 P0-PUSCH-AlphaSetId,
+    p0                                  INTEGER (-16..15)                                                       OPTIONAL, -- Need S
+    alpha                               Alpha                                                                   OPTIONAL  -- Need S
+}
+
+P0-PUSCH-AlphaSetId ::=             INTEGER (0..maxNrofP0-PUSCH-AlphaSets-1)
+
+PUSCH-PathlossReferenceRS ::=       SEQUENCE {
+    pusch-PathlossReferenceRS-Id        PUSCH-PathlossReferenceRS-Id,
+    referenceSignal                     CHOICE {
+        ssb-Index                           SSB-Index,
+        csi-RS-Index                        NZP-CSI-RS-ResourceId
+    }
+}
+
+PUSCH-PathlossReferenceRS-r16 ::=   SEQUENCE {
+    pusch-PathlossReferenceRS-Id-r16    PUSCH-PathlossReferenceRS-Id-v1610,
+    referenceSignal-r16                 CHOICE {
+        ssb-Index-r16                       SSB-Index,
+        csi-RS-Index-r16                    NZP-CSI-RS-ResourceId
+    }
+}
+
+PUSCH-PathlossReferenceRS-Id ::=    INTEGER (0..maxNrofPUSCH-PathlossReferenceRSs-1)
+
+PUSCH-PathlossReferenceRS-Id-v1610 ::= INTEGER (maxNrofPUSCH-PathlossReferenceRSs..maxNrofPUSCH-PathlossReferenceRSs-1-r16)
+
+SRI-PUSCH-PowerControl ::=          SEQUENCE {
+    sri-PUSCH-PowerControlId            SRI-PUSCH-PowerControlId,
+    sri-PUSCH-PathlossReferenceRS-Id    PUSCH-PathlossReferenceRS-Id,
+    sri-P0-PUSCH-AlphaSetId             P0-PUSCH-AlphaSetId,
+    sri-PUSCH-ClosedLoopIndex           ENUMERATED { i0, i1 }
+}
+
+SRI-PUSCH-PowerControlId ::=        INTEGER (0..maxNrofSRI-PUSCH-Mappings-1)
+
+PUSCH-PowerControl-v1610 ::=        SEQUENCE {
+    pathlossReferenceRSToAddModListSizeExt-v1610   SEQUENCE (SIZE (1..maxNrofPUSCH-PathlossReferenceRSsDiff-r16)) OF PUSCH-PathlossReferenceRS-r16
+                                                                                                                OPTIONAL, -- Need N
+    pathlossReferenceRSToReleaseListSizeExt-v1610  SEQUENCE (SIZE (1..maxNrofPUSCH-PathlossReferenceRSsDiff-r16)) OF PUSCH-PathlossReferenceRS-Id-v1610
+                                                                                                                OPTIONAL, -- Need N
+    p0-PUSCH-SetList-r16                SEQUENCE (SIZE (1..maxNrofSRI-PUSCH-Mappings)) OF P0-PUSCH-Set-r16      OPTIONAL, -- Need R
+    olpc-ParameterSet                   SEQUENCE {
+        olpc-ParameterSetDCI-0-1-r16        INTEGER (1..2)                                                      OPTIONAL, -- Need R
+        olpc-ParameterSetDCI-0-2-r16        INTEGER (1..2)                                                      OPTIONAL  -- Need R
+    }                                                                                                           OPTIONAL, -- Need M
+    ...
+}
+
+P0-PUSCH-Set-r16 ::=                SEQUENCE {
+    p0-PUSCH-SetId-r16                  P0-PUSCH-SetId-r16,
+    p0-List-r16                         SEQUENCE (SIZE (1..maxNrofP0-PUSCH-Set-r16)) OF P0-PUSCH-r16            OPTIONAL, -- Need R
+    ...
+}
+
+P0-PUSCH-SetId-r16 ::=              INTEGER (0..maxNrofSRI-PUSCH-Mappings-1)
+
+P0-PUSCH-r16 ::=                    INTEGER (-16..15)
+
+-- TAG-PUSCH-POWERCONTROL-STOP
+-- TAG-PUSCH-SERVINGCELLCONFIG-START
+
+PUSCH-ServingCellConfig ::=             SEQUENCE {
+    codeBlockGroupTransmission              SetupRelease { PUSCH-CodeBlockGroupTransmission }       OPTIONAL,   -- Need M
+    rateMatching                            ENUMERATED {limitedBufferRM}                            OPTIONAL,   -- Need S
+    xOverhead                               ENUMERATED {xoh6, xoh12, xoh18}                         OPTIONAL,   -- Need S
+    ...,
+    [[
+    maxMIMO-Layers                          INTEGER (1..4)                                          OPTIONAL,   -- Need M
+    processingType2Enabled                  BOOLEAN                                                 OPTIONAL    -- Need M
+    ]],
+    [[
+    maxMIMO-LayersDCI-0-2-r16               SetupRelease { MaxMIMO-LayersDCI-0-2-r16}               OPTIONAL    -- Need M
+    ]]
+}
+
+PUSCH-CodeBlockGroupTransmission ::=    SEQUENCE {
+    maxCodeBlockGroupsPerTransportBlock     ENUMERATED {n2, n4, n6, n8},
+    ...
+}
+
+MaxMIMO-LayersDCI-0-2-r16 ::=           INTEGER (1..4)
+
+-- TAG-PUSCH-SERVINGCELLCONFIG-STOP
+-- TAG-PUSCH-TIMEDOMAINRESOURCEALLOCATIONLIST-START
+
+PUSCH-TimeDomainResourceAllocationList ::=  SEQUENCE (SIZE(1..maxNrofUL-Allocations)) OF PUSCH-TimeDomainResourceAllocation
+
+PUSCH-TimeDomainResourceAllocation ::=  SEQUENCE {
+    k2                                      INTEGER(0..32)                                  OPTIONAL,   -- Need S
+    mappingType                             ENUMERATED {typeA, typeB},
+    startSymbolAndLength                    INTEGER (0..127)
+}
+
+PUSCH-TimeDomainResourceAllocationList-r16 ::=  SEQUENCE (SIZE(1..maxNrofUL-Allocations-r16)) OF PUSCH-TimeDomainResourceAllocation-r16
+
+PUSCH-TimeDomainResourceAllocation-r16 ::=  SEQUENCE {
+    k2-r16                                     INTEGER(0..32)          OPTIONAL,   -- Need S
+    puschAllocationList-r16                    SEQUENCE (SIZE(1..maxNrofMultiplePUSCHs-r16)) OF PUSCH-Allocation-r16,
+...
+}
+
+PUSCH-Allocation-r16 ::=  SEQUENCE {
+    mappingType-r16                           ENUMERATED {typeA, typeB}                     OPTIONAL,   -- Cond NotFormat01-02-Or-TypeA
+    startSymbolAndLength-r16                  INTEGER (0..127)                              OPTIONAL,   -- Cond NotFormat01-02-Or-TypeA
+    startSymbol-r16                           INTEGER (0..13)                               OPTIONAL,   -- Cond RepTypeB
+    length-r16                                INTEGER (1..14)                               OPTIONAL,   -- Cond RepTypeB
+    numberOfRepetitions-r16                   ENUMERATED {n1, n2, n3, n4, n7, n8, n12, n16} OPTIONAL,   -- Cond Format01-02
+    ...
+}
+
+-- TAG-PUSCH-TIMEDOMAINRESOURCEALLOCATIONLIST-STOP
+-- TAG-PUSCH-TPC-COMMANDCONFIG-START
+
+PUSCH-TPC-CommandConfig ::=         SEQUENCE {
+    tpc-Index                           INTEGER (1..15)                                                 OPTIONAL,   -- Cond SUL
+    tpc-IndexSUL                        INTEGER (1..15)                                                 OPTIONAL,   -- Cond SUL-Only
+    targetCell                          ServCellIndex                                                   OPTIONAL,   -- Need S
+    ...
+}
+
+-- TAG-PUSCH-TPC-COMMANDCONFIG-STOP
+-- TAG-Q-OFFSETRANGE-START
+
+Q-OffsetRange ::=                   ENUMERATED {
+                                                dB-24, dB-22, dB-20, dB-18, dB-16, dB-14,
+                                                dB-12, dB-10, dB-8, dB-6, dB-5, dB-4, dB-3,
+                                                dB-2, dB-1, dB0, dB1, dB2, dB3, dB4, dB5,
+                                                dB6, dB8, dB10, dB12, dB14, dB16, dB18,
+                                                dB20, dB22, dB24}
+
+-- TAG-Q-OFFSETRANGE-STOP
+-- TAG-Q-QUALMIN-START
+
+Q-QualMin ::=                       INTEGER (-43..-12)
+
+-- TAG-Q-QUALMIN-STOP
+-- TAG-Q-RXLEVMIN-START
+
+Q-RxLevMin ::=                      INTEGER (-70..-22)
+
+-- TAG-Q-RXLEVMIN-STOP
+-- TAG-QUANTITYCONFIG-START
+
+
+QuantityConfig ::=                  SEQUENCE {
+    quantityConfigNR-List               SEQUENCE (SIZE (1..maxNrofQuantityConfig)) OF QuantityConfigNR          OPTIONAL,   -- Need M
+    ...,
+    [[
+    quantityConfigEUTRA                 FilterConfig                                                            OPTIONAL    -- Need M
+    ]],
+    [[
+    quantityConfigUTRA-FDD-r16          QuantityConfigUTRA-FDD-r16                                              OPTIONAL,   -- Need M
+    quantityConfigCLI-r16               FilterConfigCLI-r16                                                     OPTIONAL    -- Need M
+    ]]
+}
+
+QuantityConfigNR::=                 SEQUENCE {
+    quantityConfigCell                  QuantityConfigRS,
+    quantityConfigRS-Index              QuantityConfigRS                                                        OPTIONAL    -- Need M
+}
+
+QuantityConfigRS ::=                SEQUENCE {
+    ssb-FilterConfig                    FilterConfig,
+    csi-RS-FilterConfig                 FilterConfig
+}
+
+FilterConfig ::=                    SEQUENCE {
+    filterCoefficientRSRP               FilterCoefficient                                       DEFAULT fc4,
+    filterCoefficientRSRQ               FilterCoefficient                                       DEFAULT fc4,
+    filterCoefficientRS-SINR            FilterCoefficient                                       DEFAULT fc4
+}
+
+FilterConfigCLI-r16 ::=             SEQUENCE {
+    filterCoefficientSRS-RSRP-r16       FilterCoefficient                                       DEFAULT fc4,
+    filterCoefficientCLI-RSSI-r16       FilterCoefficient                                       DEFAULT fc4
+}
+
+QuantityConfigUTRA-FDD-r16 ::=      SEQUENCE {
+    filterCoefficientRSCP-r16           FilterCoefficient                                       DEFAULT fc4,
+    filterCoefficientEcNO-r16           FilterCoefficient                                       DEFAULT fc4
+}
+
+-- TAG-QUANTITYCONFIG-STOP
+-- TAG-RACH-CONFIGCOMMON-START
+
+RACH-ConfigCommon ::=               SEQUENCE {
+    rach-ConfigGeneric                  RACH-ConfigGeneric,
+    totalNumberOfRA-Preambles           INTEGER (1..63)                                                     OPTIONAL,   -- Need S
+    ssb-perRACH-OccasionAndCB-PreamblesPerSSB   CHOICE {
+        oneEighth                                   ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        oneFourth                                   ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        oneHalf                                     ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        one                                         ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        two                                         ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32},
+        four                                        INTEGER (1..16),
+        eight                                       INTEGER (1..8),
+        sixteen                                     INTEGER (1..4)
+    }                                                                                                       OPTIONAL,   -- Need M
+
+    groupBconfigured                    SEQUENCE {
+        ra-Msg3SizeGroupA                   ENUMERATED {b56, b144, b208, b256, b282, b480, b640,
+                                                        b800, b1000, b72, spare6, spare5,spare4, spare3, spare2, spare1},
+        messagePowerOffsetGroupB            ENUMERATED { minusinfinity, dB0, dB5, dB8, dB10, dB12, dB15, dB18},
+        numberOfRA-PreamblesGroupA          INTEGER (1..64)
+    }                                                                                                       OPTIONAL,   -- Need R
+    ra-ContentionResolutionTimer            ENUMERATED { sf8, sf16, sf24, sf32, sf40, sf48, sf56, sf64},
+    rsrp-ThresholdSSB                       RSRP-Range                                                      OPTIONAL,   -- Need R
+    rsrp-ThresholdSSB-SUL                   RSRP-Range                                                      OPTIONAL,   -- Cond SUL
+    prach-RootSequenceIndex                 CHOICE {
+        l839                                    INTEGER (0..837),
+        l139                                    INTEGER (0..137)
+    },
+    msg1-SubcarrierSpacing                  SubcarrierSpacing                                               OPTIONAL,   -- Cond L139
+    restrictedSetConfig                     ENUMERATED {unrestrictedSet, restrictedSetTypeA, restrictedSetTypeB},
+    msg3-transformPrecoder                  ENUMERATED {enabled}                                            OPTIONAL,   -- Need R
+    ...,
+    [[
+    ra-PrioritizationForAccessIdentity-r16  SEQUENCE {
+        ra-Prioritization-r16                   RA-Prioritization,
+        ra-PrioritizationForAI-r16              BIT STRING (SIZE (2))
+    }                                                                                                       OPTIONAL,   -- Cond InitialBWP-Only
+    prach-RootSequenceIndex-r16             CHOICE {
+        l571                                    INTEGER (0..569),
+        l1151                                   INTEGER (0..1149)
+    }   OPTIONAL   -- Need R
+    ]]
+}
+
+-- TAG-RACH-CONFIGCOMMON-STOP
+-- TAG-RACH-CONFIGCOMMONTWOSTEPRA-START
+
+RACH-ConfigCommonTwoStepRA-r16 ::=                   SEQUENCE {
+    rach-ConfigGenericTwoStepRA-r16                      RACH-ConfigGenericTwoStepRA-r16,
+    msgA-TotalNumberOfRA-Preambles-r16                   INTEGER (1..63)                                    OPTIONAL, -- Need S
+    msgA-SSB-PerRACH-OccasionAndCB-PreamblesPerSSB-r16   CHOICE {
+        oneEighth                                            ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        oneFourth                                            ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        oneHalf                                              ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        one                                                  ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        two                                                  ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32},
+        four                                                 INTEGER (1..16),
+        eight                                                INTEGER (1..8),
+        sixteen                                              INTEGER (1..4)
+    }                                                                                                                   OPTIONAL, -- Cond 2StepOnly
+    msgA-CB-PreamblesPerSSB-PerSharedRO-r16              INTEGER (1..60)                                                OPTIONAL, -- Cond SharedRO
+    msgA-SSB-SharedRO-MaskIndex-r16                      INTEGER (1..15)                                                OPTIONAL, -- Need S
+    groupB-ConfiguredTwoStepRA-r16                       GroupB-ConfiguredTwoStepRA-r16                                 OPTIONAL, -- Need S
+    msgA-PRACH-RootSequenceIndex-r16                     CHOICE {
+        l839                                                 INTEGER (0..837),
+        l139                                                 INTEGER (0..137),
+        l571                                                 INTEGER (0..569),
+        l1151                                                INTEGER (0..1149)
+    }                                                                                                                   OPTIONAL, -- Cond 2StepOnly
+    msgA-TransMax-r16                                    ENUMERATED {n1, n2, n4, n6, n8, n10, n20, n50, n100, n200}     OPTIONAL, -- Need R
+    msgA-RSRP-Threshold-r16                              RSRP-Range                                                     OPTIONAL, -- Cond 2Step4Step
+    msgA-RSRP-ThresholdSSB-r16                           RSRP-Range                                                     OPTIONAL, -- Need R
+    msgA-SubcarrierSpacing-r16                           SubcarrierSpacing                                              OPTIONAL, -- Cond 2StepOnlyL139
+    msgA-RestrictedSetConfig-r16                         ENUMERATED {unrestrictedSet, restrictedSetTypeA,
+                                                                     restrictedSetTypeB}                                OPTIONAL, -- Cond 2StepOnly
+    ra-PrioritizationForAccessIdentityTwoStep-r16        SEQUENCE {
+        ra-Prioritization-r16                                RA-Prioritization,
+        ra-PrioritizationForAI-r16                           BIT STRING (SIZE (2))
+    }                                                                                                                   OPTIONAL, -- Cond InitialBWP-Only
+    ra-ContentionResolutionTimer-r16                     ENUMERATED {sf8, sf16, sf24, sf32, sf40, sf48, sf56, sf64}     OPTIONAL, -- Cond 2StepOnly
+    ...
+}
+
+GroupB-ConfiguredTwoStepRA-r16 ::=                       SEQUENCE {
+    ra-MsgA-SizeGroupA                                   ENUMERATED {b56, b144, b208, b256, b282, b480, b640, b800,
+                                                                     b1000, b72, spare6, spare5, spare4, spare3, spare2, spare1},
+    messagePowerOffsetGroupB                             ENUMERATED {minusinfinity, dB0, dB5, dB8, dB10, dB12, dB15, dB18},
+    numberOfRA-PreamblesGroupA                           INTEGER (1..64)
+}
+
+-- TAG-RACH-CONFIGCOMMONTWOSTEPRA-STOP
+-- TAG-RACH-CONFIGDEDICATED-START
+
+
+RACH-ConfigDedicated ::=        SEQUENCE {
+    cfra                            CFRA                                                                    OPTIONAL, -- Need S
+    ra-Prioritization               RA-Prioritization                                                       OPTIONAL, -- Need N
+    ...,
+    [[
+    ra-PrioritizationTwoStep-r16    RA-Prioritization                                                       OPTIONAL, -- Need N
+    cfra-TwoStep-r16                CFRA-TwoStep-r16                                                        OPTIONAL  -- Need S
+    ]]
+}
+
+CFRA ::=                    SEQUENCE {
+    occasions                       SEQUENCE {
+        rach-ConfigGeneric              RACH-ConfigGeneric,
+        ssb-perRACH-Occasion            ENUMERATED {oneEighth, oneFourth, oneHalf, one, two, four, eight, sixteen}
+                                                                                                            OPTIONAL  -- Cond Mandatory
+    }                                                                                                       OPTIONAL, -- Need S
+    resources                       CHOICE {
+        ssb                             SEQUENCE {
+            ssb-ResourceList                SEQUENCE (SIZE(1..maxRA-SSB-Resources)) OF CFRA-SSB-Resource,
+            ra-ssb-OccasionMaskIndex        INTEGER (0..15)
+        },
+        csirs                           SEQUENCE {
+            csirs-ResourceList              SEQUENCE (SIZE(1..maxRA-CSIRS-Resources)) OF CFRA-CSIRS-Resource,
+            rsrp-ThresholdCSI-RS            RSRP-Range
+        }
+    },
+    ...,
+    [[
+    totalNumberOfRA-Preambles INTEGER (1..63)                                                             OPTIONAL -- Cond Occasions
+    ]]
+}
+
+CFRA-TwoStep-r16 ::=                    SEQUENCE {
+    occasionsTwoStepRA-r16                  SEQUENCE {
+        rach-ConfigGenericTwoStepRA-r16         RACH-ConfigGenericTwoStepRA-r16,
+        ssb-PerRACH-OccasionTwoStepRA-r16       ENUMERATED {oneEighth, oneFourth, oneHalf, one,
+                                                            two, four, eight, sixteen}
+    }                                                                                                     OPTIONAL, -- Need S
+    msgA-CFRA-PUSCH-r16                     MsgA-PUSCH-Resource-r16,
+    msgA-TransMax-r16                       ENUMERATED {n1, n2, n4, n6, n8, n10, n20, n50, n100, n200}    OPTIONAL, -- Need S
+    resourcesTwoStep-r16                    SEQUENCE {
+        ssb-ResourceList                        SEQUENCE (SIZE(1..maxRA-SSB-Resources)) OF CFRA-SSB-Resource,
+        ra-ssb-OccasionMaskIndex                INTEGER (0..15)
+    },
+    ...
+}
+
+CFRA-SSB-Resource ::=           SEQUENCE {
+    ssb                             SSB-Index,
+    ra-PreambleIndex                INTEGER (0..63),
+    ...,
+    [[
+    msgA-PUSCH-Resource-Index-r16   INTEGER (0..3071)     OPTIONAL  -- Cond 2StepCFRA
+    ]]
+
+}
+
+CFRA-CSIRS-Resource ::=         SEQUENCE {
+    csi-RS                          CSI-RS-Index,
+    ra-OccasionList                 SEQUENCE (SIZE(1..maxRA-OccasionsPerCSIRS)) OF INTEGER (0..maxRA-Occasions-1),
+    ra-PreambleIndex                INTEGER (0..63),
+    ...
+}
+
+-- TAG-RACH-CONFIGDEDICATED-STOP
+-- TAG-RACH-CONFIGGENERIC-START
+
+RACH-ConfigGeneric ::=              SEQUENCE {
+    prach-ConfigurationIndex            INTEGER (0..255),
+    msg1-FDM                            ENUMERATED {one, two, four, eight},
+    msg1-FrequencyStart                 INTEGER (0..maxNrofPhysicalResourceBlocks-1),
+    zeroCorrelationZoneConfig           INTEGER(0..15),
+    preambleReceivedTargetPower         INTEGER (-202..-60),
+    preambleTransMax                    ENUMERATED {n3, n4, n5, n6, n7, n8, n10, n20, n50, n100, n200},
+    powerRampingStep                    ENUMERATED {dB0, dB2, dB4, dB6},
+    ra-ResponseWindow                   ENUMERATED {sl1, sl2, sl4, sl8, sl10, sl20, sl40, sl80},
+    ...,
+    [[
+    prach-ConfigurationPeriodScaling-IAB-r16    ENUMERATED {scf1,scf2,scf4,scf8,scf16,scf32,scf64}                    OPTIONAL,   -- Need R
+    prach-ConfigurationFrameOffset-IAB-r16      INTEGER (0..63)                                                       OPTIONAL,   -- Need R
+    prach-ConfigurationSOffset-IAB-r16          INTEGER (0..39)                                                       OPTIONAL,   -- Need R
+    ra-ResponseWindow-v1610                     ENUMERATED { sl60, sl160}                                             OPTIONAL, -- Need R
+    prach-ConfigurationIndex-v1610              INTEGER (256..262)                                                    OPTIONAL  -- Need R
+    ]]
+}
+
+-- TAG-RACH-CONFIGGENERIC-STOP
+-- TAG-RACH-CONFIGGENERICTWOSTEPRA-START
+
+RACH-ConfigGenericTwoStepRA-r16 ::=     SEQUENCE {
+    msgA-PRACH-ConfigurationIndex-r16       INTEGER (0..262)                                                OPTIONAL, -- Cond 2StepOnly
+    msgA-RO-FDM-r16                         ENUMERATED {one, two, four, eight}                              OPTIONAL, -- Cond 2StepOnly
+    msgA-RO-FrequencyStart-r16              INTEGER (0..maxNrofPhysicalResourceBlocks-1)                    OPTIONAL, -- Cond 2StepOnly
+    msgA-ZeroCorrelationZoneConfig-r16      INTEGER (0..15)                                                 OPTIONAL, -- Cond 2StepOnly
+    msgA-PreamblePowerRampingStep-r16       ENUMERATED {dB0, dB2, dB4, dB6}                                 OPTIONAL, -- Cond 2StepOnlyNoCFRA
+    msgA-PreambleReceivedTargetPower-r16    INTEGER (-202..-60)                                             OPTIONAL, -- Cond 2StepOnlyNoCFRA
+    msgB-ResponseWindow-r16                 ENUMERATED {sl1, sl2, sl4, sl8, sl10, sl20, sl40, sl80, sl160, sl320}
+                                                                                                            OPTIONAL, -- Cond NoCFRA
+    preambleTransMax-r16                    ENUMERATED {n3, n4, n5, n6, n7, n8, n10, n20, n50, n100, n200}  OPTIONAL, -- Cond 2StepOnlyNoCFRA
+    ...
+}
+
+-- TAG-RACH-CONFIGGENERICTWOSTEPRA-STOP
+-- TAG-RA-PRIORITIZATION-START
+
+RA-Prioritization ::=           SEQUENCE {
+    powerRampingStepHighPriority    ENUMERATED {dB0, dB2, dB4, dB6},
+    scalingFactorBI                 ENUMERATED {zero, dot25, dot5, dot75}                               OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-RA-PRIORITIZATION-STOP
+-- TAG-RADIOBEARERCONFIG-START
+
+RadioBearerConfig ::=                   SEQUENCE {
+    srb-ToAddModList                        SRB-ToAddModList                                        OPTIONAL,   -- Cond HO-Conn
+    srb3-ToRelease                          ENUMERATED{true}                                        OPTIONAL,   -- Need N
+    drb-ToAddModList                        DRB-ToAddModList                                        OPTIONAL,   -- Cond HO-toNR
+    drb-ToReleaseList                       DRB-ToReleaseList                                       OPTIONAL,   -- Need N
+    securityConfig                          SecurityConfig                                          OPTIONAL,   -- Need M
+    ...
+}
+
+SRB-ToAddModList ::=                    SEQUENCE (SIZE (1..2)) OF SRB-ToAddMod
+SRB-ToAddMod ::=                        SEQUENCE {
+    srb-Identity                            SRB-Identity,
+    reestablishPDCP                         ENUMERATED{true}                                        OPTIONAL,   -- Need N
+    discardOnPDCP                           ENUMERATED{true}                                        OPTIONAL,   -- Need N
+    pdcp-Config                             PDCP-Config                                             OPTIONAL,   -- Cond PDCP
+    ...
+}
+
+DRB-ToAddModList ::=                    SEQUENCE (SIZE (1..maxDRB)) OF DRB-ToAddMod
+
+DRB-ToAddMod ::=                        SEQUENCE {
+    cnAssociation                           CHOICE {
+        eps-BearerIdentity                      INTEGER (0..15),
+        sdap-Config                             SDAP-Config
+    }                                                                                               OPTIONAL,   -- Cond DRBSetup
+    drb-Identity                            DRB-Identity,
+    reestablishPDCP                         ENUMERATED{true}                                        OPTIONAL,   -- Need N
+    recoverPDCP                             ENUMERATED{true}                                        OPTIONAL,   -- Need N
+    pdcp-Config                             PDCP-Config                                             OPTIONAL,   -- Cond PDCP
+    ...,
+    [[
+    daps-Config-r16                         ENUMERATED{true}                                        OPTIONAL    -- Cond DAPS
+    ]]
+}
+DRB-ToReleaseList ::=                   SEQUENCE (SIZE (1..maxDRB)) OF DRB-Identity
+
+SecurityConfig ::=                      SEQUENCE {
+    securityAlgorithmConfig                 SecurityAlgorithmConfig                                 OPTIONAL,   -- Cond RBTermChange1
+    keyToUse                                ENUMERATED{master, secondary}                           OPTIONAL,   -- Cond RBTermChange
+    ...
+}
+
+-- TAG-RADIOBEARERCONFIG-STOP
+-- TAG-RADIOLINKMONITORINGCONFIG-START
+
+RadioLinkMonitoringConfig ::=       SEQUENCE {
+    failureDetectionResourcesToAddModList   SEQUENCE (SIZE(1..maxNrofFailureDetectionResources)) OF RadioLinkMonitoringRS
+                                                                                                                  OPTIONAL, -- Need N
+    failureDetectionResourcesToReleaseList  SEQUENCE (SIZE(1..maxNrofFailureDetectionResources)) OF RadioLinkMonitoringRS-Id
+                                                                                                                  OPTIONAL, -- Need N
+    beamFailureInstanceMaxCount             ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10}                          OPTIONAL, -- Need R
+    beamFailureDetectionTimer               ENUMERATED {pbfd1, pbfd2, pbfd3, pbfd4, pbfd5, pbfd6, pbfd8, pbfd10}  OPTIONAL, -- Need R
+    ...
+}
+
+RadioLinkMonitoringRS ::=           SEQUENCE {
+    radioLinkMonitoringRS-Id            RadioLinkMonitoringRS-Id,
+    purpose                             ENUMERATED {beamFailure, rlf, both},
+    detectionResource                   CHOICE {
+        ssb-Index                           SSB-Index,
+        csi-RS-Index                        NZP-CSI-RS-ResourceId
+    },
+    ...
+}
+
+-- TAG-RADIOLINKMONITORINGCONFIG-STOP
+-- TAG-RADIOLINKMONITORINGRS-ID-START
+
+RadioLinkMonitoringRS-Id ::=            INTEGER (0..maxNrofFailureDetectionResources-1)
+
+-- TAG-RADIOLINKMONITORINGRS-ID-STOP
+-- TAG-RAN-AREACODE-START
+
+RAN-AreaCode ::=                INTEGER (0..255)
+
+-- TAG-RAN-AREACODE-STOP
+-- TAG-RATEMATCHPATTERN-START
+
+RateMatchPattern ::=                SEQUENCE {
+    rateMatchPatternId                  RateMatchPatternId,
+
+    patternType                         CHOICE {
+        bitmaps                             SEQUENCE {
+            resourceBlocks                      BIT STRING (SIZE (275)),
+            symbolsInResourceBlock              CHOICE {
+                oneSlot                             BIT STRING (SIZE (14)),
+                twoSlots                            BIT STRING (SIZE (28))
+            },
+            periodicityAndPattern               CHOICE {
+                n2                                  BIT STRING (SIZE (2)),
+                n4                                  BIT STRING (SIZE (4)),
+                n5                                  BIT STRING (SIZE (5)),
+                n8                                  BIT STRING (SIZE (8)),
+                n10                                 BIT STRING (SIZE (10)),
+                n20                                 BIT STRING (SIZE (20)),
+                n40                                 BIT STRING (SIZE (40))
+            }                                                                                           OPTIONAL,   -- Need S
+            ...
+        },
+        controlResourceSet                  ControlResourceSetId
+    },
+    subcarrierSpacing                   SubcarrierSpacing                                               OPTIONAL,   -- Cond CellLevel
+    dummy                               ENUMERATED { dynamic, semiStatic },
+    ...,
+    [[
+    controlResourceSet-r16              ControlResourceSetId-r16                                        OPTIONAL    -- Need R
+    ]]
+
+}
+
+-- TAG-RATEMATCHPATTERN-STOP
+-- TAG-RATEMATCHPATTERNID-START
+
+RateMatchPatternId ::=              INTEGER (0..maxNrofRateMatchPatterns-1)
+
+-- TAG-RATEMATCHPATTERNID-STOP
+-- TAG-RATEMATCHPATTERNLTE-CRS-START
+
+RateMatchPatternLTE-CRS ::=         SEQUENCE {
+    carrierFreqDL                       INTEGER (0..16383),
+    carrierBandwidthDL                  ENUMERATED {n6, n15, n25, n50, n75, n100, spare2, spare1},
+    mbsfn-SubframeConfigList            EUTRA-MBSFN-SubframeConfigList                                          OPTIONAL,   -- Need M
+    nrofCRS-Ports                       ENUMERATED {n1, n2, n4},
+    v-Shift                             ENUMERATED {n0, n1, n2, n3, n4, n5}
+}
+
+LTE-CRS-PatternList-r16 ::=         SEQUENCE (SIZE (1..maxLTE-CRS-Patterns-r16)) OF RateMatchPatternLTE-CRS
+
+-- TAG-RATEMATCHPATTERNLTE-CRS-STOP
+-- TAG-REFERENCETIMEINFO-START
+
+ReferenceTimeInfo-r16 ::= SEQUENCE {
+    time-r16                            ReferenceTime-r16,
+    uncertainty-r16                     INTEGER (0..32767)          OPTIONAL,   -- Need S
+    timeInfoType-r16                    ENUMERATED {localClock}     OPTIONAL,   -- Need S
+    referenceSFN-r16                    INTEGER (0..1023)           OPTIONAL    -- Cond RefTime
+}
+
+ReferenceTime-r16 ::=           SEQUENCE {
+    refDays-r16                         INTEGER (0..72999),
+    refSeconds-r16                      INTEGER (0..86399),
+    refMilliSeconds-r16                 INTEGER (0..999),
+    refTenNanoSeconds-r16               INTEGER (0..99999)
+}
+
+-- TAG-REFERENCETIMEINFO-STOP
+-- TAG-REJECTWAITTIME-START
+
+RejectWaitTime ::=                  INTEGER (1..16)
+
+-- TAG-REJECTWAITTIME-STOP
+-- TAG-REPETITIONSCHEMECONFIG-START
+
+RepetitionSchemeConfig-r16 ::= CHOICE {
+    fdm-TDM-r16                        SetupRelease { FDM-TDM-r16 },
+    slotBased-r16                      SetupRelease { SlotBased-r16 }
+}
+
+RepetitionSchemeConfig-v1630 ::=   SEQUENCE {
+    slotBased-v1630                    SetupRelease { SlotBased-v1630 }
+}
+
+FDM-TDM-r16 ::=                SEQUENCE {
+    repetitionScheme-r16           ENUMERATED {fdmSchemeA, fdmSchemeB,tdmSchemeA },
+    startingSymbolOffsetK-r16      INTEGER (0..7)                                    OPTIONAL  -- Need R
+}
+
+SlotBased-r16 ::=              SEQUENCE {
+    tciMapping-r16                 ENUMERATED {cyclicMapping, sequentialMapping},
+    sequenceOffsetForRV-r16        INTEGER (1..3)
+}
+
+SlotBased-v1630 ::=            SEQUENCE {
+    tciMapping-r16                 ENUMERATED {cyclicMapping, sequentialMapping},
+    sequenceOffsetForRV-r16        INTEGER (0)
+}
+
+-- TAG-REPETITIONSCHEMECONFIG-STOP
+-- TAG-REPORTCONFIGID-START
+
+ReportConfigId ::=                          INTEGER (1..maxReportConfigId)
+
+-- TAG-REPORTCONFIGID-STOP
+-- TAG-REPORTCONFIGINTERRAT-START
+
+ReportConfigInterRAT ::=                    SEQUENCE {
+    reportType                                  CHOICE {
+        periodical                                  PeriodicalReportConfigInterRAT,
+        eventTriggered                              EventTriggerConfigInterRAT,
+        reportCGI                                   ReportCGI-EUTRA,
+        ...,
+        reportSFTD                                  ReportSFTD-EUTRA
+    }
+}
+
+ReportCGI-EUTRA ::=                         SEQUENCE {
+    cellForWhichToReportCGI         EUTRA-PhysCellId,
+    ...,
+    [[
+    useAutonomousGaps-r16           ENUMERATED {setup}                OPTIONAL     -- Need R
+    ]]
+}
+
+ReportSFTD-EUTRA ::=                     SEQUENCE {
+    reportSFTD-Meas                            BOOLEAN,
+    reportRSRP                                 BOOLEAN,
+    ...
+}
+
+EventTriggerConfigInterRAT ::=              SEQUENCE {
+    eventId                                     CHOICE {
+        eventB1                                     SEQUENCE {
+            b1-ThresholdEUTRA                           MeasTriggerQuantityEUTRA,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger,
+            ...
+        },
+        eventB2                                     SEQUENCE {
+            b2-Threshold1                               MeasTriggerQuantity,
+            b2-Threshold2EUTRA                          MeasTriggerQuantityEUTRA,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger,
+            ...
+        },
+        ...,
+        [[
+        eventB1-UTRA-FDD-r16                         SEQUENCE {
+            b1-ThresholdUTRA-FDD-r16                    MeasTriggerQuantityUTRA-FDD-r16,
+            reportOnLeave-r16                           BOOLEAN,
+            hysteresis-r16                              Hysteresis,
+            timeToTrigger-r16                           TimeToTrigger,
+            ...
+        },
+        eventB2-UTRA-FDD-r16                         SEQUENCE {
+            b2-Threshold1-r16                           MeasTriggerQuantity,
+            b2-Threshold2UTRA-FDD-r16                   MeasTriggerQuantityUTRA-FDD-r16,
+            reportOnLeave-r16                           BOOLEAN,
+            hysteresis-r16                              Hysteresis,
+            timeToTrigger-r16                           TimeToTrigger,
+            ...
+        }
+        ]]
+    },
+    rsType                              NR-RS-Type,
+
+    reportInterval                      ReportInterval,
+    reportAmount                        ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    reportQuantity                      MeasReportQuantity,
+    maxReportCells                      INTEGER (1..maxCellReport),
+    ...,
+    [[
+    reportQuantityUTRA-FDD-r16          MeasReportQuantityUTRA-FDD-r16         OPTIONAL   -- Need R
+    ]]
+
+
+}
+
+PeriodicalReportConfigInterRAT ::=              SEQUENCE {
+    reportInterval                                  ReportInterval,
+    reportAmount                                    ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    reportQuantity                                  MeasReportQuantity,
+    maxReportCells                                  INTEGER (1..maxCellReport),
+    ...,
+    [[
+    reportQuantityUTRA-FDD-r16                      MeasReportQuantityUTRA-FDD-r16         OPTIONAL   -- Need R
+    ]]
+}
+
+MeasTriggerQuantityUTRA-FDD-r16 ::=          CHOICE{
+    utra-FDD-RSCP-r16                            INTEGER (-5..91),
+    utra-FDD-EcN0-r16                            INTEGER (0..49)
+}
+
+MeasReportQuantityUTRA-FDD-r16 ::=        SEQUENCE {
+    cpich-RSCP                                BOOLEAN,
+    cpich-EcN0                                BOOLEAN
+}
+
+-- TAG-REPORTCONFIGINTERRAT-STOP
+-- TAG-REPORTCONFIGNR-START
+
+ReportConfigNR ::=                          SEQUENCE {
+    reportType                                  CHOICE {
+        periodical                                  PeriodicalReportConfig,
+        eventTriggered                              EventTriggerConfig,
+        ...,
+        reportCGI                                   ReportCGI,
+        reportSFTD                                  ReportSFTD-NR,
+        condTriggerConfig-r16                       CondTriggerConfig-r16,
+        cli-Periodical-r16                          CLI-PeriodicalReportConfig-r16,
+        cli-EventTriggered-r16                      CLI-EventTriggerConfig-r16
+    }
+}
+
+ReportCGI ::=                     SEQUENCE {
+    cellForWhichToReportCGI          PhysCellId,
+        ...,
+    [[
+    useAutonomousGaps-r16            ENUMERATED {setup}                OPTIONAL   -- Need R
+    ]]
+
+}
+
+ReportSFTD-NR ::=                 SEQUENCE {
+    reportSFTD-Meas                  BOOLEAN,
+    reportRSRP                       BOOLEAN,
+    ...,
+    [[
+    reportSFTD-NeighMeas             ENUMERATED {true}                                OPTIONAL,   -- Need R
+    drx-SFTD-NeighMeas               ENUMERATED {true}                                OPTIONAL,   -- Need R
+    cellsForWhichToReportSFTD        SEQUENCE (SIZE (1..maxCellSFTD)) OF PhysCellId   OPTIONAL    -- Need R
+    ]]
+}
+
+CondTriggerConfig-r16 ::=        SEQUENCE {
+    condEventId                      CHOICE {
+        condEventA3                      SEQUENCE {
+            a3-Offset                        MeasTriggerQuantityOffset,
+            hysteresis                       Hysteresis,
+            timeToTrigger                    TimeToTrigger
+        },
+        condEventA5                      SEQUENCE {
+            a5-Threshold1                    MeasTriggerQuantity,
+            a5-Threshold2                    MeasTriggerQuantity,
+            hysteresis                       Hysteresis,
+            timeToTrigger                    TimeToTrigger
+        },
+        ...
+    },
+    rsType-r16                       NR-RS-Type,
+    ...
+}
+
+EventTriggerConfig::=                       SEQUENCE {
+    eventId                                     CHOICE {
+        eventA1                                     SEQUENCE {
+            a1-Threshold                                MeasTriggerQuantity,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger
+        },
+        eventA2                                     SEQUENCE {
+            a2-Threshold                                MeasTriggerQuantity,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger
+        },
+        eventA3                                     SEQUENCE {
+            a3-Offset                                   MeasTriggerQuantityOffset,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger,
+            useWhiteCellList                            BOOLEAN
+        },
+        eventA4                                     SEQUENCE {
+            a4-Threshold                                MeasTriggerQuantity,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger,
+            useWhiteCellList                            BOOLEAN
+        },
+        eventA5                                     SEQUENCE {
+            a5-Threshold1                               MeasTriggerQuantity,
+            a5-Threshold2                               MeasTriggerQuantity,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger,
+            useWhiteCellList                            BOOLEAN
+        },
+        eventA6                                     SEQUENCE {
+            a6-Offset                                   MeasTriggerQuantityOffset,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger,
+            useWhiteCellList                            BOOLEAN
+        },
+        ...
+    },
+    rsType                                      NR-RS-Type,
+    reportInterval                              ReportInterval,
+    reportAmount                                ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    reportQuantityCell                          MeasReportQuantity,
+    maxReportCells                              INTEGER (1..maxCellReport),
+    reportQuantityRS-Indexes                     MeasReportQuantity                                            OPTIONAL,   -- Need R
+    maxNrofRS-IndexesToReport                   INTEGER (1..maxNrofIndexesToReport)                            OPTIONAL,   -- Need R
+    includeBeamMeasurements                     BOOLEAN,
+    reportAddNeighMeas                          ENUMERATED {setup}                                             OPTIONAL,   -- Need R
+    ...,
+    [[
+    measRSSI-ReportConfig-r16                   MeasRSSI-ReportConfig-r16                                      OPTIONAL,   -- Need R
+    useT312-r16                                 BOOLEAN                                                        OPTIONAL,   -- Need M
+    includeCommonLocationInfo-r16               ENUMERATED {true}                                              OPTIONAL,   -- Need R
+    includeBT-Meas-r16                          SetupRelease {BT-NameList-r16}                                 OPTIONAL,   -- Need M
+    includeWLAN-Meas-r16                        SetupRelease {WLAN-NameList-r16}                               OPTIONAL,   -- Need M
+    includeSensor-Meas-r16                      SetupRelease {Sensor-NameList-r16}                             OPTIONAL    -- Need M
+    ]]
+}
+
+PeriodicalReportConfig ::=                  SEQUENCE {
+    rsType                                      NR-RS-Type,
+    reportInterval                              ReportInterval,
+    reportAmount                                ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    reportQuantityCell                          MeasReportQuantity,
+    maxReportCells                              INTEGER (1..maxCellReport),
+    reportQuantityRS-Indexes                    MeasReportQuantity                                             OPTIONAL,   -- Need R
+    maxNrofRS-IndexesToReport                   INTEGER (1..maxNrofIndexesToReport)                            OPTIONAL,   -- Need R
+    includeBeamMeasurements                     BOOLEAN,
+    useWhiteCellList                            BOOLEAN,
+    ...,
+    [[
+    measRSSI-ReportConfig-r16                   MeasRSSI-ReportConfig-r16                                      OPTIONAL,   -- Need R
+    includeCommonLocationInfo-r16               ENUMERATED {true}                                              OPTIONAL,   -- Need R
+    includeBT-Meas-r16                          SetupRelease {BT-NameList-r16}                                 OPTIONAL,   -- Need M
+    includeWLAN-Meas-r16                        SetupRelease {WLAN-NameList-r16}                               OPTIONAL,   -- Need M
+    includeSensor-Meas-r16                      SetupRelease {Sensor-NameList-r16}                             OPTIONAL,   -- Need M
+    ul-DelayValueConfig-r16                     SetupRelease { UL-DelayValueConfig-r16 }                       OPTIONAL,   -- Need M
+    reportAddNeighMeas-r16                      ENUMERATED {setup}                                             OPTIONAL    -- Need R
+    ]]
+}
+
+NR-RS-Type ::=                              ENUMERATED {ssb, csi-rs}
+
+MeasTriggerQuantity ::=                     CHOICE {
+    rsrp                                        RSRP-Range,
+    rsrq                                        RSRQ-Range,
+    sinr                                        SINR-Range
+}
+
+MeasTriggerQuantityOffset ::=               CHOICE {
+    rsrp                                        INTEGER (-30..30),
+    rsrq                                        INTEGER (-30..30),
+    sinr                                        INTEGER (-30..30)
+}
+
+
+MeasReportQuantity ::=                      SEQUENCE {
+    rsrp                                        BOOLEAN,
+    rsrq                                        BOOLEAN,
+    sinr                                        BOOLEAN
+}
+
+MeasRSSI-ReportConfig-r16 ::=               SEQUENCE {
+    channelOccupancyThreshold-r16               RSSI-Range-r16         OPTIONAL   -- Need R
+}
+
+CLI-EventTriggerConfig-r16 ::=              SEQUENCE {
+    eventId-r16                                 CHOICE {
+        eventI1-r16                                 SEQUENCE {
+            i1-Threshold-r16                            MeasTriggerQuantityCLI-r16,
+            reportOnLeave-r16                           BOOLEAN,
+            hysteresis-r16                              Hysteresis,
+            timeToTrigger-r16                           TimeToTrigger
+        },
+    ...
+    },
+    reportInterval-r16                          ReportInterval,
+    reportAmount-r16                            ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    maxReportCLI-r16                            INTEGER (1..maxCLI-Report-r16),
+    ...
+}
+
+CLI-PeriodicalReportConfig-r16 ::=          SEQUENCE {
+    reportInterval-r16                          ReportInterval,
+    reportAmount-r16                            ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    reportQuantityCLI-r16                       MeasReportQuantityCLI-r16,
+    maxReportCLI-r16                            INTEGER (1..maxCLI-Report-r16),
+    ...
+}
+
+MeasTriggerQuantityCLI-r16 ::=              CHOICE {
+    srs-RSRP-r16                                SRS-RSRP-Range-r16,
+    cli-RSSI-r16                                CLI-RSSI-Range-r16
+}
+
+MeasReportQuantityCLI-r16 ::=               ENUMERATED {srs-rsrp, cli-rssi}
+
+-- TAG-REPORTCONFIGNR-STOP
+-- TAG-REPORTCONFIGNR-SL-START
+
+ReportConfigNR-SL-r16 ::=            SEQUENCE {
+    reportType-r16                       CHOICE {
+        periodical-r16                       PeriodicalReportConfigNR-SL-r16,
+        eventTriggered-r16                   EventTriggerConfigNR-SL-r16
+    }
+}
+
+EventTriggerConfigNR-SL-r16::=       SEQUENCE {
+    eventId-r16                          CHOICE {
+        eventC1                              SEQUENCE {
+            c1-Threshold-r16                     SL-CBR-r16,
+            hysteresis-r16                       Hysteresis,
+            timeToTrigger-r16                    TimeToTrigger
+        },
+        eventC2-r16                  SEQUENCE {
+            c2-Threshold-r16             SL-CBR-r16,
+            hysteresis-r16               Hysteresis,
+            timeToTrigger-r16            TimeToTrigger
+        },
+        ...
+    },
+    reportInterval-r16               ReportInterval,
+    reportAmount-r16                 ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    reportQuantity-r16               MeasReportQuantity-r16,
+    ...
+}
+
+PeriodicalReportConfigNR-SL-r16 ::=  SEQUENCE {
+    reportInterval-r16                   ReportInterval,
+    reportAmount-r16                     ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    reportQuantity-r16                   MeasReportQuantity-r16,
+    ...
+}
+
+MeasReportQuantity-r16 ::=           SEQUENCE {
+    cbr-r16                              BOOLEAN,
+    ...
+}
+
+-- TAG-REPORTCONFIGNR-SL-STOP
+-- TAG-REPORTCONFIGTOADDMODLIST-START
+
+ReportConfigToAddModList ::=        SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigToAddMod
+
+ReportConfigToAddMod ::=            SEQUENCE {
+    reportConfigId                      ReportConfigId,
+    reportConfig                        CHOICE {
+        reportConfigNR                      ReportConfigNR,
+        ...,
+        reportConfigInterRAT                ReportConfigInterRAT,
+        reportConfigNR-SL-r16               ReportConfigNR-SL-r16
+    }
+}
+
+-- TAG-REPORTCONFIGTOADDMODLIST-STOP
+-- TAG-REPORTINTERVAL-START
+
+ReportInterval ::=                  ENUMERATED {ms120, ms240, ms480, ms640, ms1024, ms2048, ms5120, ms10240, ms20480, ms40960,
+                                                    min1,min6, min12, min30 }
+
+-- TAG-REPORTINTERVAL-STOP
+-- TAG-RESELECTIONTHRESHOLD-START
+
+ReselectionThreshold ::=                INTEGER (0..31)
+
+-- TAG-RESELECTIONTHRESHOLD-STOP
+-- TAG-RESELECTIONTHRESHOLDQ-START
+
+ReselectionThresholdQ ::=           INTEGER (0..31)
+
+-- TAG-RESELECTIONTHRESHOLDQ-STOP
+-- TAG-RESUMECAUSE-START
+
+ResumeCause ::=             ENUMERATED {emergency, highPriorityAccess, mt-Access, mo-Signalling,
+                                        mo-Data, mo-VoiceCall, mo-VideoCall, mo-SMS, rna-Update, mps-PriorityAccess,
+                                        mcs-PriorityAccess, spare1, spare2, spare3, spare4, spare5 }
+
+-- TAG-RESUMECAUSE-STOP
+-- TAG-RLC-BEARERCONFIG-START
+
+RLC-BearerConfig ::=                        SEQUENCE {
+    logicalChannelIdentity                      LogicalChannelIdentity,
+    servedRadioBearer                           CHOICE {
+        srb-Identity                                SRB-Identity,
+        drb-Identity                                DRB-Identity
+    }                                                                                               OPTIONAL,   -- Cond LCH-SetupOnly
+    reestablishRLC                              ENUMERATED {true}                                   OPTIONAL,   -- Need N
+    rlc-Config                                  RLC-Config                                          OPTIONAL,   -- Cond LCH-Setup
+    mac-LogicalChannelConfig                    LogicalChannelConfig                                OPTIONAL,   -- Cond LCH-Setup
+    ...,
+    [[
+    rlc-Config-v1610                            RLC-Config-v1610                                    OPTIONAL    -- Need R
+    ]]
+}
+
+-- TAG-RLC-BEARERCONFIG-STOP
+-- TAG-RLC-CONFIG-START
+
+RLC-Config ::=                      CHOICE {
+    am                                  SEQUENCE {
+        ul-AM-RLC                           UL-AM-RLC,
+        dl-AM-RLC                           DL-AM-RLC
+    },
+    um-Bi-Directional                   SEQUENCE {
+        ul-UM-RLC                           UL-UM-RLC,
+        dl-UM-RLC                           DL-UM-RLC
+    },
+    um-Uni-Directional-UL               SEQUENCE {
+        ul-UM-RLC                           UL-UM-RLC
+    },
+    um-Uni-Directional-DL               SEQUENCE {
+        dl-UM-RLC                           DL-UM-RLC
+    },
+    ...
+}
+
+UL-AM-RLC ::=                       SEQUENCE {
+    sn-FieldLength                      SN-FieldLengthAM                                    OPTIONAL,   -- Cond Reestab
+    t-PollRetransmit                    T-PollRetransmit,
+    pollPDU                             PollPDU,
+    pollByte                            PollByte,
+    maxRetxThreshold                    ENUMERATED { t1, t2, t3, t4, t6, t8, t16, t32 }
+}
+
+DL-AM-RLC ::=                       SEQUENCE {
+    sn-FieldLength                      SN-FieldLengthAM                                    OPTIONAL,   -- Cond Reestab
+    t-Reassembly                        T-Reassembly,
+    t-StatusProhibit                    T-StatusProhibit
+}
+
+UL-UM-RLC ::=                       SEQUENCE {
+    sn-FieldLength                      SN-FieldLengthUM                                    OPTIONAL    -- Cond Reestab
+}
+
+DL-UM-RLC ::=                       SEQUENCE {
+    sn-FieldLength                      SN-FieldLengthUM                                    OPTIONAL,   -- Cond Reestab
+    t-Reassembly                        T-Reassembly
+}
+
+T-PollRetransmit ::=                ENUMERATED {
+                                        ms5, ms10, ms15, ms20, ms25, ms30, ms35,
+                                        ms40, ms45, ms50, ms55, ms60, ms65, ms70,
+                                        ms75, ms80, ms85, ms90, ms95, ms100, ms105,
+                                        ms110, ms115, ms120, ms125, ms130, ms135,
+                                        ms140, ms145, ms150, ms155, ms160, ms165,
+                                        ms170, ms175, ms180, ms185, ms190, ms195,
+                                        ms200, ms205, ms210, ms215, ms220, ms225,
+                                        ms230, ms235, ms240, ms245, ms250, ms300,
+                                        ms350, ms400, ms450, ms500, ms800, ms1000,
+                                        ms2000, ms4000, ms1-v1610, ms2-v1610, ms3-v1610,
+                                        ms4-v1610, spare1}
+
+
+PollPDU ::=                         ENUMERATED {
+                                        p4, p8, p16, p32, p64, p128, p256, p512, p1024, p2048, p4096, p6144, p8192, p12288, p16384,p20480,
+                                        p24576, p28672, p32768, p40960, p49152, p57344, p65536, infinity, spare8, spare7, spare6, spare5, spare4,
+                                        spare3, spare2, spare1}
+
+PollByte ::=                        ENUMERATED {
+                                        kB1, kB2, kB5, kB8, kB10, kB15, kB25, kB50, kB75,
+                                        kB100, kB125, kB250, kB375, kB500, kB750, kB1000,
+                                        kB1250, kB1500, kB2000, kB3000, kB4000, kB4500,
+                                        kB5000, kB5500, kB6000, kB6500, kB7000, kB7500,
+                                        mB8, mB9, mB10, mB11, mB12, mB13, mB14, mB15,
+                                        mB16, mB17, mB18, mB20, mB25, mB30, mB40, infinity,
+                                        spare20, spare19, spare18, spare17, spare16,
+                                        spare15, spare14, spare13, spare12, spare11,
+                                        spare10, spare9, spare8, spare7, spare6, spare5,
+                                        spare4, spare3, spare2, spare1}
+
+T-Reassembly ::=                    ENUMERATED {
+                                        ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35,
+                                        ms40, ms45, ms50, ms55, ms60, ms65, ms70,
+                                        ms75, ms80, ms85, ms90, ms95, ms100, ms110,
+                                        ms120, ms130, ms140, ms150, ms160, ms170,
+                                        ms180, ms190, ms200, spare1}
+
+T-StatusProhibit ::=                ENUMERATED {
+                                        ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35,
+                                        ms40, ms45, ms50, ms55, ms60, ms65, ms70,
+                                        ms75, ms80, ms85, ms90, ms95, ms100, ms105,
+                                        ms110, ms115, ms120, ms125, ms130, ms135,
+                                        ms140, ms145, ms150, ms155, ms160, ms165,
+                                        ms170, ms175, ms180, ms185, ms190, ms195,
+                                        ms200, ms205, ms210, ms215, ms220, ms225,
+                                        ms230, ms235, ms240, ms245, ms250, ms300,
+                                        ms350, ms400, ms450, ms500, ms800, ms1000,
+                                        ms1200, ms1600, ms2000, ms2400, spare2, spare1}
+
+SN-FieldLengthUM ::=                ENUMERATED {size6, size12}
+SN-FieldLengthAM ::=                ENUMERATED {size12, size18}
+
+RLC-Config-v1610 ::=                SEQUENCE {
+    dl-AM-RLC-v1610                     DL-AM-RLC-v1610
+}
+
+DL-AM-RLC-v1610 ::=                 SEQUENCE {
+    t-StatusProhibit-v1610              T-StatusProhibit-v1610                               OPTIONAL,   -- Need N
+    ...
+}
+
+T-StatusProhibit-v1610 ::=          ENUMERATED { ms1, ms2, ms3, ms4, spare4, spare3, spare2, spare1}
+
+-- TAG-RLC-CONFIG-STOP
+-- TAG-RLF-TIMERSANDCONSTANTS-START
+
+RLF-TimersAndConstants ::=          SEQUENCE {
+    t310                                ENUMERATED {ms0, ms50, ms100, ms200, ms500, ms1000, ms2000, ms4000, ms6000},
+    n310                                ENUMERATED {n1, n2, n3, n4, n6, n8, n10, n20},
+    n311                                ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10},
+    ...,
+    [[
+    t311                                ENUMERATED {ms1000, ms3000, ms5000, ms10000, ms15000, ms20000, ms30000}
+    ]]
+}
+
+-- TAG-RLF-TIMERSANDCONSTANTS-STOP
+-- TAG-RNTI-VALUE-START
+
+RNTI-Value ::=                      INTEGER (0..65535)
+
+-- TAG-RNTI-VALUE-STOP
+-- TAG-RSRP-RANGE-START
+
+RSRP-Range ::=                      INTEGER(0..127)
+
+-- TAG-RSRP-RANGE-STOP
+-- TAG-RSRQ-RANGE-START
+
+RSRQ-Range ::=                      INTEGER(0..127)
+
+-- TAG-RSRQ-RANGE-STOP
+-- TAG-RSSI-RANGE-START
+
+RSSI-Range-r16 ::=                  INTEGER(0..76)
+
+-- TAG-RSSI-RANGE-STOP
+-- TAG-SCELLINDEX-START
+
+SCellIndex ::=                      INTEGER (1..31)
+
+-- TAG-SCELLINDEX-STOP
+-- TAG-SCHEDULINGREQUESTCONFIG-START
+
+SchedulingRequestConfig ::=         SEQUENCE {
+    schedulingRequestToAddModList       SEQUENCE (SIZE (1..maxNrofSR-ConfigPerCellGroup)) OF SchedulingRequestToAddMod
+                                                                                                          OPTIONAL, -- Need N
+    schedulingRequestToReleaseList      SEQUENCE (SIZE (1..maxNrofSR-ConfigPerCellGroup)) OF SchedulingRequestId
+                                                                                                          OPTIONAL  -- Need N
+}
+
+SchedulingRequestToAddMod ::=       SEQUENCE {
+    schedulingRequestId                 SchedulingRequestId,
+    sr-ProhibitTimer                    ENUMERATED {ms1, ms2, ms4, ms8, ms16, ms32, ms64, ms128}          OPTIONAL, -- Need S
+    sr-TransMax                         ENUMERATED { n4, n8, n16, n32, n64, spare3, spare2, spare1}
+}
+
+
+
+-- TAG-SCHEDULINGREQUESTCONFIG-STOP
+-- TAG-SCHEDULINGREQUESTID-START
+
+SchedulingRequestId ::=             INTEGER (0..7)
+
+-- TAG-SCHEDULINGREQUESTID-STOP
+-- TAG-SCHEDULINGREQUESTRESOURCECONFIG-START
+
+SchedulingRequestResourceConfig ::=     SEQUENCE {
+    schedulingRequestResourceId             SchedulingRequestResourceId,
+    schedulingRequestID                     SchedulingRequestId,
+    periodicityAndOffset                    CHOICE {
+        sym2                                    NULL,
+        sym6or7                                 NULL,
+        sl1                                     NULL,                       -- Recurs in every slot
+        sl2                                     INTEGER (0..1),
+        sl4                                     INTEGER (0..3),
+        sl5                                     INTEGER (0..4),
+        sl8                                     INTEGER (0..7),
+        sl10                                    INTEGER (0..9),
+        sl16                                    INTEGER (0..15),
+        sl20                                    INTEGER (0..19),
+        sl40                                    INTEGER (0..39),
+        sl80                                    INTEGER (0..79),
+        sl160                                   INTEGER (0..159),
+        sl320                                   INTEGER (0..319),
+        sl640                                   INTEGER (0..639)
+    }                                                                                                       OPTIONAL,   -- Need M
+    resource                                PUCCH-ResourceId                                                OPTIONAL    -- Need M
+}
+
+SchedulingRequestResourceConfigExt-v1610 ::=   SEQUENCE {
+    phy-PriorityIndex-r16                       ENUMERATED {p0, p1}                                         OPTIONAL,   -- Need M
+    ...
+}
+
+-- TAG-SCHEDULINGREQUESTRESOURCECONFIG-STOP
+-- TAG-SCHEDULINGREQUESTRESOURCEID-START
+
+SchedulingRequestResourceId ::=     INTEGER (1..maxNrofSR-Resources)
+
+-- TAG-SCHEDULINGREQUESTRESOURCEID-STOP
+-- TAG-SCRAMBLINGID-START
+
+ScramblingId ::=                    INTEGER(0..1023)
+
+-- TAG-SCRAMBLINGID-STOP
+-- TAG-SCS-SPECIFICCARRIER-START
+
+SCS-SpecificCarrier ::=             SEQUENCE {
+    offsetToCarrier                     INTEGER (0..2199),
+    subcarrierSpacing                   SubcarrierSpacing,
+    carrierBandwidth                    INTEGER (1..maxNrofPhysicalResourceBlocks),
+    ...,
+    [[
+    txDirectCurrentLocation         INTEGER (0..4095)                                       OPTIONAL            -- Need S
+    ]]
+}
+
+-- TAG-SCS-SPECIFICCARRIER-STOP
+-- TAG-SDAP-CONFIG-START
+
+SDAP-Config ::=                     SEQUENCE {
+    pdu-Session                         PDU-SessionID,
+    sdap-HeaderDL                       ENUMERATED {present, absent},
+    sdap-HeaderUL                       ENUMERATED {present, absent},
+    defaultDRB                          BOOLEAN,
+    mappedQoS-FlowsToAdd                SEQUENCE (SIZE (1..maxNrofQFIs)) OF QFI                                 OPTIONAL, -- Need N
+    mappedQoS-FlowsToRelease            SEQUENCE (SIZE (1..maxNrofQFIs)) OF QFI                                 OPTIONAL, -- Need N
+    ...
+}
+
+QFI ::=                             INTEGER (0..maxQFI)
+
+PDU-SessionID ::=                   INTEGER (0..255)
+
+-- TAG-SDAP-CONFIG-STOP
+-- TAG-SEARCHSPACE-START
+
+SearchSpace ::=                         SEQUENCE {
+    searchSpaceId                           SearchSpaceId,
+    controlResourceSetId                    ControlResourceSetId                                        OPTIONAL,   -- Cond SetupOnly
+    monitoringSlotPeriodicityAndOffset      CHOICE {
+        sl1                                     NULL,
+        sl2                                     INTEGER (0..1),
+        sl4                                     INTEGER (0..3),
+        sl5                                     INTEGER (0..4),
+        sl8                                     INTEGER (0..7),
+        sl10                                    INTEGER (0..9),
+        sl16                                    INTEGER (0..15),
+        sl20                                    INTEGER (0..19),
+        sl40                                    INTEGER (0..39),
+        sl80                                    INTEGER (0..79),
+        sl160                                   INTEGER (0..159),
+        sl320                                   INTEGER (0..319),
+        sl640                                   INTEGER (0..639),
+        sl1280                                  INTEGER (0..1279),
+        sl2560                                  INTEGER (0..2559)
+    }                                                                                                   OPTIONAL,   -- Cond Setup
+    duration                                INTEGER (2..2559)                                           OPTIONAL,   -- Need R
+    monitoringSymbolsWithinSlot             BIT STRING (SIZE (14))                                      OPTIONAL,   -- Cond Setup
+    nrofCandidates                          SEQUENCE {
+        aggregationLevel1                       ENUMERATED {n0, n1, n2, n3, n4, n5, n6, n8},
+        aggregationLevel2                       ENUMERATED {n0, n1, n2, n3, n4, n5, n6, n8},
+        aggregationLevel4                       ENUMERATED {n0, n1, n2, n3, n4, n5, n6, n8},
+        aggregationLevel8                       ENUMERATED {n0, n1, n2, n3, n4, n5, n6, n8},
+        aggregationLevel16                      ENUMERATED {n0, n1, n2, n3, n4, n5, n6, n8}
+    }                                                                                                   OPTIONAL,   -- Cond Setup
+    searchSpaceType                         CHOICE {
+        common                                  SEQUENCE {
+            dci-Format0-0-AndFormat1-0              SEQUENCE {
+                ...
+            }                                                                                           OPTIONAL,   -- Need R
+            dci-Format2-0                           SEQUENCE {
+                nrofCandidates-SFI                      SEQUENCE {
+                    aggregationLevel1                       ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel2                       ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel4                       ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel8                       ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel16                      ENUMERATED {n1, n2}                         OPTIONAL    -- Need R
+                },
+                ...
+            }                                                                                           OPTIONAL,   -- Need R
+            dci-Format2-1                           SEQUENCE {
+                ...
+            }                                                                                           OPTIONAL,   -- Need R
+            dci-Format2-2                           SEQUENCE {
+                ...
+            }                                                                                           OPTIONAL,   -- Need R
+            dci-Format2-3                           SEQUENCE {
+                dummy1                                  ENUMERATED {sl1, sl2, sl4, sl5, sl8, sl10, sl16, sl20}  OPTIONAL,   -- Cond Setup
+                dummy2                                  ENUMERATED {n1, n2},
+                ...
+            }                                                                                           OPTIONAL    -- Need R
+        },
+        ue-Specific                                 SEQUENCE {
+            dci-Formats                                 ENUMERATED {formats0-0-And-1-0, formats0-1-And-1-1},
+            ...,
+            [[
+            dci-Formats-MT-r16                   ENUMERATED {formats2-5}                                OPTIONAL,    -- Need R
+            dci-FormatsSL-r16                    ENUMERATED {formats0-0-And-1-0, formats0-1-And-1-1, formats3-0, formats3-1,
+                                                             formats3-0-And-3-1}                        OPTIONAL,    -- Need R
+            dci-FormatsExt-r16                   ENUMERATED {formats0-2-And-1-2, formats0-1-And-1-1And-0-2-And-1-2}
+                                                                                                        OPTIONAL     -- Need R
+            ]]
+        }
+    }                                                                                                   OPTIONAL    -- Cond Setup2
+}
+
+SearchSpaceExt-r16 ::=                   SEQUENCE {
+    controlResourceSetId-r16                ControlResourceSetId-r16                                    OPTIONAL,   -- Cond SetupOnly2
+    searchSpaceType-r16                     SEQUENCE {
+        common-r16                              SEQUENCE {
+            dci-Format2-4-r16                       SEQUENCE {
+                nrofCandidates-CI-r16                   SEQUENCE {
+                    aggregationLevel1-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel2-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel4-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel8-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel16-r16                  ENUMERATED {n1, n2}                         OPTIONAL    -- Need R
+                },
+                ...
+            }                                                                                           OPTIONAL,   -- Need R
+            dci-Format2-5-r16                      SEQUENCE {
+                nrofCandidates-IAB-r16                  SEQUENCE {
+                    aggregationLevel1-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel2-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel4-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel8-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel16-r16                  ENUMERATED {n1, n2}                         OPTIONAL    -- Need R
+                },
+                ...
+            }                                                                                           OPTIONAL,   -- Need R
+            dci-Format2-6-r16                       SEQUENCE {
+                ...
+            }                                                                                           OPTIONAL,   -- Need R
+            ...
+        }
+    }                                                                                                   OPTIONAL,    -- Cond Setup3
+    searchSpaceGroupIdList-r16                      SEQUENCE (SIZE (1.. 2)) OF INTEGER (0..1)           OPTIONAL,    -- Need R
+    freqMonitorLocations-r16                        BIT STRING (SIZE (5))                               OPTIONAL     -- Need R
+}
+
+-- TAG-SEARCHSPACE-STOP
+-- TAG-SEARCHSPACEID-START
+
+SearchSpaceId ::=                   INTEGER (0..maxNrofSearchSpaces-1)
+
+-- TAG-SEARCHSPACEID-STOP
+-- TAG-SEARCHSPACEZERO-START
+
+SearchSpaceZero ::=                 INTEGER (0..15)
+
+-- TAG-SEARCHSPACEZERO-STOP
+-- TAG-SECURITYALGORITHMCONFIG-START
+
+SecurityAlgorithmConfig ::=         SEQUENCE {
+    cipheringAlgorithm                  CipheringAlgorithm,
+    integrityProtAlgorithm              IntegrityProtAlgorithm          OPTIONAL,   -- Need R
+    ...
+}
+
+IntegrityProtAlgorithm ::=          ENUMERATED {
+                                        nia0, nia1, nia2, nia3, spare4, spare3,
+                                        spare2, spare1, ...}
+
+CipheringAlgorithm ::=              ENUMERATED {
+                                        nea0, nea1, nea2, nea3, spare4, spare3,
+                                        spare2, spare1, ...}
+
+-- TAG-SECURITYALGORITHMCONFIG-STOP
+-- TAG-SEMISTATICCHANNELACCESSCONFIG-START
+
+SemiStaticChannelAccessConfig-r16 ::=    SEQUENCE {
+    period                                   ENUMERATED {ms1, ms2, ms2dot5, ms4, ms5, ms10}
+}
+
+-- TAG-SEMISTATICCHANNELACCESSCONFIG-STOP
+-- TAG-SENSORLOCATIONINFO-START
+
+Sensor-LocationInfo-r16 ::= SEQUENCE {
+    sensor-MeasurementInformation-r16    OCTET STRING    OPTIONAL,
+    sensor-MotionInformation-r16         OCTET STRING    OPTIONAL,
+    ...
+}
+
+-- TAG-SENSORLOCATIONINFO-STOP
+-- TAG-SERVCELLINDEX-START
+
+ServCellIndex ::=                   INTEGER (0..maxNrofServingCells-1)
+
+-- TAG-SERVCELLINDEX-STOP
+-- TAG-SERVINGCELLCONFIG-START
+
+ServingCellConfig ::=               SEQUENCE {
+    tdd-UL-DL-ConfigurationDedicated    TDD-UL-DL-ConfigDedicated                                                OPTIONAL,   -- Cond TDD
+    initialDownlinkBWP                  BWP-DownlinkDedicated                                                    OPTIONAL,   -- Need M
+    downlinkBWP-ToReleaseList           SEQUENCE (SIZE (1..maxNrofBWPs)) OF BWP-Id                               OPTIONAL,   -- Need N
+    downlinkBWP-ToAddModList            SEQUENCE (SIZE (1..maxNrofBWPs)) OF BWP-Downlink                         OPTIONAL,   -- Need N
+    firstActiveDownlinkBWP-Id           BWP-Id                                                                   OPTIONAL,   -- Cond SyncAndCellAdd
+    bwp-InactivityTimer                 ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
+                                                    ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
+                                                    ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
+                                                    spare7, spare6, spare5, spare4, spare3, spare2, spare1 }    OPTIONAL,   --Need R
+    defaultDownlinkBWP-Id               BWP-Id                                                                  OPTIONAL,   -- Need S
+    uplinkConfig                        UplinkConfig                                                            OPTIONAL,   -- Need M
+    supplementaryUplink                 UplinkConfig                                                            OPTIONAL,   -- Need M
+    pdcch-ServingCellConfig             SetupRelease { PDCCH-ServingCellConfig }                                OPTIONAL,   -- Need M
+    pdsch-ServingCellConfig             SetupRelease { PDSCH-ServingCellConfig }                                OPTIONAL,   -- Need M
+    csi-MeasConfig                      SetupRelease { CSI-MeasConfig }                                         OPTIONAL,   -- Need M
+    sCellDeactivationTimer              ENUMERATED {ms20, ms40, ms80, ms160, ms200, ms240,
+                                                    ms320, ms400, ms480, ms520, ms640, ms720,
+                                                    ms840, ms1280, spare2,spare1}       OPTIONAL,   -- Cond ServingCellWithoutPUCCH
+    crossCarrierSchedulingConfig        CrossCarrierSchedulingConfig                                            OPTIONAL,   -- Need M
+    tag-Id                              TAG-Id,
+    dummy1                              ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    pathlossReferenceLinking            ENUMERATED {spCell, sCell}                                              OPTIONAL,   -- Cond SCellOnly
+    servingCellMO                       MeasObjectId                                                            OPTIONAL,   -- Cond MeasObject
+    ...,
+    [[
+    lte-CRS-ToMatchAround               SetupRelease { RateMatchPatternLTE-CRS }                                OPTIONAL,   -- Need M
+    rateMatchPatternToAddModList        SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPattern       OPTIONAL,   -- Need N
+    rateMatchPatternToReleaseList       SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPatternId     OPTIONAL,   -- Need N
+    downlinkChannelBW-PerSCS-List       SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier                     OPTIONAL    -- Need S
+    ]],
+    [[
+    supplementaryUplinkRelease-r16      ENUMERATED {true}                                                       OPTIONAL,   -- Need N
+    tdd-UL-DL-ConfigurationDedicated-IAB-MT-r16    TDD-UL-DL-ConfigDedicated-IAB-MT-r16                         OPTIONAL,   -- Cond TDD_IAB
+    dormantBWP-Config-r16               SetupRelease { DormantBWP-Config-r16 }                                  OPTIONAL,   -- Need M
+    ca-SlotOffset-r16                   CHOICE {
+        refSCS15kHz                         INTEGER (-2..2),
+        refSCS30KHz                         INTEGER (-5..5),
+        refSCS60KHz                         INTEGER (-10..10),
+        refSCS120KHz                        INTEGER (-20..20)
+    }                                                                                                           OPTIONAL,   -- Cond AsyncCA
+    dummy2                              SetupRelease { DummyJ }                                                 OPTIONAL,   -- Need M
+    intraCellGuardBandsDL-List-r16      SEQUENCE (SIZE (1..maxSCSs)) OF IntraCellGuardBandsPerSCS-r16           OPTIONAL,   -- Need S
+    intraCellGuardBandsUL-List-r16      SEQUENCE (SIZE (1..maxSCSs)) OF IntraCellGuardBandsPerSCS-r16           OPTIONAL,   -- Need S
+    csi-RS-ValidationWithDCI-r16       ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    lte-CRS-PatternList1-r16            SetupRelease { LTE-CRS-PatternList-r16 }                                OPTIONAL,   -- Need M
+    lte-CRS-PatternList2-r16            SetupRelease { LTE-CRS-PatternList-r16 }                                OPTIONAL,   -- Need M
+    crs-RateMatch-PerCORESETPoolIndex-r16  ENUMERATED {enabled}                                                 OPTIONAL,   -- Need R
+    enableTwoDefaultTCI-States-r16      ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    enableDefaultTCI-StatePerCoresetPoolIndex-r16 ENUMERATED {enabled}                                          OPTIONAL,   -- Need R
+    enableBeamSwitchTiming-r16          ENUMERATED {true}                                                       OPTIONAL,   -- Need R
+    cbg-TxDiffTBsProcessingType1-r16    ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    cbg-TxDiffTBsProcessingType2-r16    ENUMERATED {enabled}                                                    OPTIONAL    -- Need R
+    ]],
+    [[
+    directionalCollisionHandling-r16    ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    channelAccessConfig-r16             SetupRelease { ChannelAccessConfig-r16 }                                OPTIONAL    -- Need M
+    ]]
+}
+
+UplinkConfig ::=                    SEQUENCE {
+    initialUplinkBWP                    BWP-UplinkDedicated                                                     OPTIONAL,   -- Need M
+    uplinkBWP-ToReleaseList             SEQUENCE (SIZE (1..maxNrofBWPs)) OF BWP-Id                              OPTIONAL,   -- Need N
+    uplinkBWP-ToAddModList              SEQUENCE (SIZE (1..maxNrofBWPs)) OF BWP-Uplink                          OPTIONAL,   -- Need N
+    firstActiveUplinkBWP-Id             BWP-Id                                                                  OPTIONAL,   -- Cond SyncAndCellAdd
+    pusch-ServingCellConfig             SetupRelease { PUSCH-ServingCellConfig }                                OPTIONAL,   -- Need M
+    carrierSwitching                    SetupRelease { SRS-CarrierSwitching }                                   OPTIONAL,   -- Need M
+    ...,
+    [[
+    powerBoostPi2BPSK                   BOOLEAN                                                                 OPTIONAL,   -- Need M
+    uplinkChannelBW-PerSCS-List         SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier                     OPTIONAL    -- Need S
+    ]],
+    [[
+    enablePL-RS-UpdateForPUSCH-SRS-r16  ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    enableDefaultBeamPL-ForPUSCH0-0-r16 ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    enableDefaultBeamPL-ForPUCCH-r16    ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    enableDefaultBeamPL-ForSRS-r16      ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    uplinkTxSwitching-r16               SetupRelease { UplinkTxSwitching-r16 }                                  OPTIONAL,   -- Need M
+    mpr-PowerBoost-FR2-r16              ENUMERATED {true}                                                       OPTIONAL    -- Need R
+    ]]
+}
+
+DummyJ ::=                          SEQUENCE {
+    maxEnergyDetectionThreshold-r16         INTEGER(-85..-52),
+    energyDetectionThresholdOffset-r16      INTEGER (-20..-13),
+    ul-toDL-COT-SharingED-Threshold-r16     INTEGER (-85..-52)                                                  OPTIONAL,   -- Need R
+    absenceOfAnyOtherTechnology-r16         ENUMERATED {true}                                                   OPTIONAL    -- Need R
+}
+
+ChannelAccessConfig-r16 ::=         SEQUENCE {
+    energyDetectionConfig-r16           CHOICE {
+        maxEnergyDetectionThreshold-r16         INTEGER (-85..-52),
+        energyDetectionThresholdOffset-r16      INTEGER (-13..20)
+    }                                                                                                           OPTIONAL,   -- Need R
+    ul-toDL-COT-SharingED-Threshold-r16         INTEGER (-85..-52)                                              OPTIONAL,   -- Need R
+    absenceOfAnyOtherTechnology-r16             ENUMERATED {true}                                               OPTIONAL    -- Need R
+}
+
+IntraCellGuardBandsPerSCS-r16 ::=      SEQUENCE {
+    guardBandSCS-r16                       SubcarrierSpacing,
+    intraCellGuardBands-r16                SEQUENCE (SIZE (1..4)) OF GuardBand-r16
+}
+
+GuardBand-r16 ::=                      SEQUENCE {
+     startCRB-r16                          INTEGER (0..274),
+     nrofCRBs-r16                          INTEGER (0..15)
+}
+
+DormancyGroupID-r16 ::=         INTEGER (0..4)
+
+DormantBWP-Config-r16::=               SEQUENCE {
+    dormantBWP-Id-r16                      BWP-Id                                                           OPTIONAL,   -- Need M
+    withinActiveTimeConfig-r16             SetupRelease { WithinActiveTimeConfig-r16 }                      OPTIONAL,   -- Need M
+    outsideActiveTimeConfig-r16            SetupRelease { OutsideActiveTimeConfig-r16 }                     OPTIONAL    -- Need M
+}
+
+WithinActiveTimeConfig-r16 ::=         SEQUENCE {
+   firstWithinActiveTimeBWP-Id-r16         BWP-Id                                                           OPTIONAL,   -- Need M
+   dormancyGroupWithinActiveTime-r16       DormancyGroupID-r16                                              OPTIONAL    -- Need R
+}
+
+OutsideActiveTimeConfig-r16 ::=        SEQUENCE {
+   firstOutsideActiveTimeBWP-Id-r16        BWP-Id                                                           OPTIONAL,   -- Need M
+   dormancyGroupOutsideActiveTime-r16      DormancyGroupID-r16                                              OPTIONAL    -- Need R
+}
+
+UplinkTxSwitching-r16 ::=              SEQUENCE {
+    uplinkTxSwitchingPeriodLocation-r16    BOOLEAN,
+    uplinkTxSwitchingCarrier-r16           ENUMERATED {carrier1, carrier2}
+}
+
+-- TAG-SERVINGCELLCONFIG-STOP
+-- TAG-SERVINGCELLCONFIGCOMMON-START
+
+ServingCellConfigCommon ::=         SEQUENCE {
+    physCellId                          PhysCellId                                                          OPTIONAL,   -- Cond HOAndServCellAdd,
+    downlinkConfigCommon                DownlinkConfigCommon                                                OPTIONAL,   -- Cond HOAndServCellAdd
+    uplinkConfigCommon                  UplinkConfigCommon                                                  OPTIONAL,   -- Need M
+    supplementaryUplinkConfig           UplinkConfigCommon                                                  OPTIONAL,   -- Need S
+    n-TimingAdvanceOffset               ENUMERATED { n0, n25600, n39936 }                                   OPTIONAL,   -- Need S
+    ssb-PositionsInBurst                CHOICE {
+        shortBitmap                         BIT STRING (SIZE (4)),
+        mediumBitmap                        BIT STRING (SIZE (8)),
+        longBitmap                          BIT STRING (SIZE (64))
+    }                                                                                                       OPTIONAL, -- Cond AbsFreqSSB
+    ssb-periodicityServingCell          ENUMERATED { ms5, ms10, ms20, ms40, ms80, ms160, spare2, spare1 }   OPTIONAL, -- Need S
+    dmrs-TypeA-Position                 ENUMERATED {pos2, pos3},
+    lte-CRS-ToMatchAround               SetupRelease { RateMatchPatternLTE-CRS }                            OPTIONAL, -- Need M
+    rateMatchPatternToAddModList        SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPattern   OPTIONAL, -- Need N
+    rateMatchPatternToReleaseList       SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPatternId OPTIONAL, -- Need N
+    ssbSubcarrierSpacing                SubcarrierSpacing                                                   OPTIONAL, -- Cond HOAndServCellWithSSB
+    tdd-UL-DL-ConfigurationCommon       TDD-UL-DL-ConfigCommon                                              OPTIONAL, -- Cond TDD
+    ss-PBCH-BlockPower                  INTEGER (-60..50),
+    ...,
+    [[
+    channelAccessMode-r16               CHOICE {
+        dynamic                             NULL,
+        semiStatic                          SemiStaticChannelAccessConfig-r16
+    }                                                                                                       OPTIONAL, -- Cond SharedSpectrum
+    discoveryBurstWindowLength-r16          ENUMERATED {ms0dot5, ms1, ms2, ms3, ms4, ms5}                   OPTIONAL, -- Need R
+    ssb-PositionQCL-r16                     SSB-PositionQCL-Relation-r16                                    OPTIONAL, -- Cond SharedSpectrum
+    highSpeedConfig-r16                     HighSpeedConfig-r16                                             OPTIONAL  -- Need R
+    ]]
+}
+
+-- TAG-SERVINGCELLCONFIGCOMMON-STOP
+-- TAG-SERVINGCELLCONFIGCOMMONSIB-START
+
+ServingCellConfigCommonSIB ::=      SEQUENCE {
+    downlinkConfigCommon                DownlinkConfigCommonSIB,
+    uplinkConfigCommon                  UplinkConfigCommonSIB                                       OPTIONAL, -- Need R
+    supplementaryUplink                 UplinkConfigCommonSIB                                       OPTIONAL, -- Need R
+    n-TimingAdvanceOffset               ENUMERATED { n0, n25600, n39936 }                           OPTIONAL, -- Need S
+    ssb-PositionsInBurst                SEQUENCE {
+        inOneGroup                          BIT STRING (SIZE (8)),
+        groupPresence                       BIT STRING (SIZE (8))                                   OPTIONAL  -- Cond FR2-Only
+    },
+    ssb-PeriodicityServingCell          ENUMERATED {ms5, ms10, ms20, ms40, ms80, ms160},
+    tdd-UL-DL-ConfigurationCommon       TDD-UL-DL-ConfigCommon                                      OPTIONAL, -- Cond TDD
+    ss-PBCH-BlockPower                  INTEGER (-60..50),
+    ...,
+    [[
+    channelAccessMode-r16               CHOICE {
+        dynamic                             NULL,
+        semiStatic                          SemiStaticChannelAccessConfig-r16
+    }                                                                                               OPTIONAL, -- Cond SharedSpectrum
+    discoveryBurstWindowLength-r16      ENUMERATED {ms0dot5, ms1, ms2, ms3, ms4, ms5}               OPTIONAL, -- Need R
+    highSpeedConfig-r16                 HighSpeedConfig-r16                                         OPTIONAL  -- Need R
+    ]]
+}
+
+-- TAG-SERVINGCELLCONFIGCOMMONSIB-STOP
+-- TAG-SHORTI-RNTI-VALUE-START
+
+ShortI-RNTI-Value ::=   BIT STRING (SIZE(24))
+
+-- TAG-SHORTI-RNTI-VALUE-STOP
+-- TAG-SHORTMAC-I-START
+
+ShortMAC-I ::=                      BIT STRING (SIZE (16))
+
+-- TAG-SHORTMAC-I-STOP
+-- TAG-SINR-RANGE-START
+
+SINR-Range ::=                      INTEGER(0..127)
+
+-- TAG-SINR-RANGE-STOP
+-- TAG-SI-REQUESTCONFIG-START
+
+SI-RequestConfig::=                 SEQUENCE {
+    rach-OccasionsSI                    SEQUENCE {
+        rach-ConfigSI                       RACH-ConfigGeneric,
+        ssb-perRACH-Occasion                ENUMERATED {oneEighth, oneFourth, oneHalf, one, two, four, eight, sixteen}
+    }                                                                                                       OPTIONAL,   -- Need R
+    si-RequestPeriod                    ENUMERATED {one, two, four, six, eight, ten, twelve, sixteen}       OPTIONAL,   -- Need R
+    si-RequestResources                 SEQUENCE (SIZE (1..maxSI-Message)) OF SI-RequestResources
+}
+
+SI-RequestResources ::=             SEQUENCE {
+    ra-PreambleStartIndex               INTEGER (0..63),
+    ra-AssociationPeriodIndex           INTEGER (0..15)                                                     OPTIONAL,   -- Need R
+    ra-ssb-OccasionMaskIndex            INTEGER (0..15)                                                     OPTIONAL    -- Need R
+}
+
+-- TAG-SI-SCHEDULINGINFO-START
+
+SI-SchedulingInfo ::=               SEQUENCE {
+    schedulingInfoList                  SEQUENCE (SIZE (1..maxSI-Message)) OF SchedulingInfo,
+    si-WindowLength                     ENUMERATED {s5, s10, s20, s40, s80, s160, s320, s640, s1280},
+    si-RequestConfig                    SI-RequestConfig                                                OPTIONAL,  -- Cond MSG-1
+    si-RequestConfigSUL                 SI-RequestConfig                                                OPTIONAL,  -- Cond SUL-MSG-1
+    systemInformationAreaID             BIT STRING (SIZE (24))                                          OPTIONAL,   -- Need R
+    ...
+}
+
+SchedulingInfo ::=                  SEQUENCE {
+    si-BroadcastStatus                  ENUMERATED {broadcasting, notBroadcasting},
+    si-Periodicity                      ENUMERATED {rf8, rf16, rf32, rf64, rf128, rf256, rf512},
+    sib-MappingInfo                     SIB-Mapping
+}
+
+SIB-Mapping ::=                     SEQUENCE (SIZE (1..maxSIB)) OF SIB-TypeInfo
+
+SIB-TypeInfo ::=                    SEQUENCE {
+    type                                ENUMERATED {sibType2, sibType3, sibType4, sibType5, sibType6, sibType7, sibType8, sibType9,
+                                                     sibType10-v1610, sibType11-v1610, sibType12-v1610, sibType13-v1610, sibType14-v1610,
+                                                    spare3, spare2, spare1,... },
+    valueTag                            INTEGER (0..31)                                                  OPTIONAL, -- Cond SIB-TYPE
+    areaScope                           ENUMERATED {true}                                                OPTIONAL -- Need S
+}
+
+-- TAG-SI-SCHEDULINGINFO-STOP
+-- TAG-SKCOUNTER-START
+
+SK-Counter ::=  INTEGER (0..65535)
+
+-- TAG-SKCOUNTER-STOP
+-- TAG-SLOTFORMATCOMBINATIONSPERCELL-START
+
+SlotFormatCombinationsPerCell ::=   SEQUENCE {
+    servingCellId                       ServCellIndex,
+    subcarrierSpacing                   SubcarrierSpacing,
+    subcarrierSpacing2                  SubcarrierSpacing                                                         OPTIONAL, -- Need R
+    slotFormatCombinations              SEQUENCE (SIZE (1..maxNrofSlotFormatCombinationsPerSet)) OF SlotFormatCombination
+                                                                                                                  OPTIONAL, -- Need M
+    positionInDCI                       INTEGER(0..maxSFI-DCI-PayloadSize-1)                                      OPTIONAL, -- Need M
+    ...,
+    [[
+    enableConfiguredUL-r16              ENUMERATED {enabled}                                                      OPTIONAL  -- Need R
+    ]]
+
+}
+
+SlotFormatCombination ::=           SEQUENCE {
+    slotFormatCombinationId             SlotFormatCombinationId,
+    slotFormats                         SEQUENCE (SIZE (1..maxNrofSlotFormatsPerCombination)) OF INTEGER (0..255)
+}
+
+SlotFormatCombinationId ::=         INTEGER (0..maxNrofSlotFormatCombinationsPerSet-1)
+
+-- TAG-SLOTFORMATCOMBINATIONSPERCELL-STOP
+-- TAG-SLOTFORMATINDICATOR-START
+
+SlotFormatIndicator ::=     SEQUENCE {
+    sfi-RNTI                    RNTI-Value,
+    dci-PayloadSize             INTEGER (1..maxSFI-DCI-PayloadSize),
+    slotFormatCombToAddModList  SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF SlotFormatCombinationsPerCell
+                                                                                                                              OPTIONAL, -- Need N
+    slotFormatCombToReleaseList SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF ServCellIndex                       OPTIONAL, -- Need N
+    ...,
+    [[
+    availableRB-SetsToAddModList-r16  SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF AvailableRB-SetsPerCell-r16   OPTIONAL, -- Need N
+    availableRB-SetsToReleaseList-r16 SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF ServCellIndex                 OPTIONAL, -- Need N
+    switchTriggerToAddModList-r16     SEQUENCE (SIZE(1..4)) OF SearchSpaceSwitchTrigger-r16                                   OPTIONAL, -- Need N
+    switchTriggerToReleaseList-r16    SEQUENCE (SIZE(1..4)) OF ServCellIndex                                                  OPTIONAL, -- Need N
+    co-DurationsPerCellToAddModList-r16 SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF CO-DurationsPerCell-r16     OPTIONAL, -- Need N
+    co-DurationsPerCellToReleaseList-r16 SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF ServCellIndex              OPTIONAL  -- Need N
+    ]]
+}
+
+CO-DurationsPerCell-r16 ::=   SEQUENCE {
+    servingCellId-r16            ServCellIndex,
+    positionInDCI-r16            INTEGER(0..maxSFI-DCI-PayloadSize-1),
+    subcarrierSpacing-r16        SubcarrierSpacing,
+    co-DurationList-r16          SEQUENCE (SIZE(1..64)) OF CO-Duration-r16
+}
+
+CO-Duration-r16 ::=    INTEGER (0..1120)
+
+AvailableRB-SetsPerCell-r16 ::=   SEQUENCE {
+    servingCellId-r16                 ServCellIndex,
+    positionInDCI-r16                 INTEGER(0..maxSFI-DCI-PayloadSize-1)
+}
+
+SearchSpaceSwitchTrigger-r16 ::=   SEQUENCE {
+    servingCellId-r16                  ServCellIndex,
+    positionInDCI-r16                  INTEGER(0..maxSFI-DCI-PayloadSize-1)
+}
+
+-- TAG-SLOTFORMATINDICATOR-STOP
+-- TAG-S-NSSAI-START
+
+S-NSSAI  ::=                        CHOICE{
+    sst                                 BIT STRING (SIZE (8)),
+    sst-SD                              BIT STRING (SIZE (32))
+}
+
+-- TAG-S-NSSAI-STOP
+-- TAG-SPEEDSTATESCALEFACTORS-START
+
+SpeedStateScaleFactors ::=          SEQUENCE {
+    sf-Medium                           ENUMERATED {oDot25, oDot5, oDot75, lDot0},
+    sf-High                             ENUMERATED {oDot25, oDot5, oDot75, lDot0}
+}
+-- TAG-SPEEDSTATESCALEFACTORS-STOP
+-- TAG-SPS-CONFIG-START
+
+SPS-Config ::=                  SEQUENCE {
+    periodicity                     ENUMERATED {ms10, ms20, ms32, ms40, ms64, ms80, ms128, ms160, ms320, ms640,
+                                                        spare6, spare5, spare4, spare3, spare2, spare1},
+    nrofHARQ-Processes              INTEGER (1..8),
+    n1PUCCH-AN                      PUCCH-ResourceId                                                                OPTIONAL,   -- Need M
+    mcs-Table                       ENUMERATED {qam64LowSE}                                                         OPTIONAL,   -- Need S
+    ...,
+    [[
+    sps-ConfigIndex-r16             SPS-ConfigIndex-r16                                                             OPTIONAL,   -- Cond SPS-List
+    harq-ProcID-Offset-r16          INTEGER (0..15)                                                                 OPTIONAL,   -- Need R
+    periodicityExt-r16              INTEGER (1..5120)                                                               OPTIONAL,   -- Need R
+    harq-CodebookID-r16             INTEGER (1..2)                                                                  OPTIONAL,   -- Need R
+    pdsch-AggregationFactor-r16     ENUMERATED {n1, n2, n4, n8 }                                                    OPTIONAL    -- Need S
+    ]]
+}
+
+-- TAG-SPS-CONFIG-STOP
+-- TAG-SPS-CONFIGINDEX-START
+
+SPS-ConfigIndex-r16             ::= INTEGER (0.. maxNrofSPS-Config-r16-1)
+
+-- TAG-SPS-CONFIGINDEX-STOP
+-- TAG-SPS-PUCCH-AN-START
+
+SPS-PUCCH-AN-r16  ::=           SEQUENCE {
+    sps-PUCCH-AN-ResourceID-r16     PUCCH-ResourceId,
+    maxPayloadSize-r16              INTEGER (4..256)                     OPTIONAL    -- Need R
+}
+
+-- TAG-SPS-PUCCH-AN-STOP
+-- TAG-SPS-PUCCH-AN-LIST-START
+
+SPS-PUCCH-AN-List-r16 ::=      SEQUENCE (SIZE(1..4)) OF SPS-PUCCH-AN-r16
+
+-- TAG-SPS-PUCCH-AN-LIST-STOP
+-- TAG-SRB-IDENTITY-START
+
+SRB-Identity ::=                    INTEGER (1..3)
+
+-- TAG-SRB-IDENTITY-STOP
+-- TAG-SRS-CARRIERSWITCHING-START
+
+SRS-CarrierSwitching ::=            SEQUENCE {
+    srs-SwitchFromServCellIndex         INTEGER (0..31)                                                         OPTIONAL,   -- Need M
+    srs-SwitchFromCarrier               ENUMERATED {sUL, nUL},
+    srs-TPC-PDCCH-Group                 CHOICE {
+        typeA                               SEQUENCE (SIZE (1..32)) OF SRS-TPC-PDCCH-Config,
+        typeB                               SRS-TPC-PDCCH-Config
+    }                                                                                                           OPTIONAL,   -- Need M
+    monitoringCells                     SEQUENCE (SIZE (1..maxNrofServingCells)) OF ServCellIndex               OPTIONAL,   -- Need M
+    ...
+}
+
+SRS-TPC-PDCCH-Config ::=            SEQUENCE {
+    srs-CC-SetIndexlist                 SEQUENCE (SIZE(1..4)) OF SRS-CC-SetIndex                                OPTIONAL    -- Need M
+}
+
+SRS-CC-SetIndex ::=                 SEQUENCE {
+    cc-SetIndex                         INTEGER (0..3)                                                          OPTIONAL,   -- Need M
+    cc-IndexInOneCC-Set                 INTEGER (0..7)                                                          OPTIONAL    -- Need M
+}
+
+-- TAG-SRS-CARRIERSWITCHING-STOP
+-- TAG-SRS-CONFIG-START
+
+SRS-Config ::=                          SEQUENCE {
+    srs-ResourceSetToReleaseList            SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSetId                OPTIONAL,   -- Need N
+    srs-ResourceSetToAddModList             SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSet                  OPTIONAL,   -- Need N
+    srs-ResourceToReleaseList               SEQUENCE (SIZE(1..maxNrofSRS-Resources)) OF SRS-ResourceId                      OPTIONAL,   -- Need N
+    srs-ResourceToAddModList                SEQUENCE (SIZE(1..maxNrofSRS-Resources)) OF SRS-Resource                        OPTIONAL,   -- Need N
+    tpc-Accumulation                        ENUMERATED {disabled}                                                           OPTIONAL,   -- Need S
+    ...,
+    [[
+    srs-RequestDCI-1-2-r16                  INTEGER (1..2)                                                          OPTIONAL, -- Need S
+    srs-RequestDCI-0-2-r16                  INTEGER (1..2)                                                          OPTIONAL, -- Need S
+    srs-ResourceSetToAddModListDCI-0-2-r16  SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSet          OPTIONAL, -- Need N
+    srs-ResourceSetToReleaseListDCI-0-2-r16 SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSetId        OPTIONAL, -- Need N
+    srs-PosResourceSetToReleaseList-r16     SEQUENCE (SIZE(1..maxNrofSRS-PosResourceSets-r16)) OF SRS-PosResourceSetId-r16
+                                                                                                                    OPTIONAL, -- Need N
+    srs-PosResourceSetToAddModList-r16      SEQUENCE (SIZE(1..maxNrofSRS-PosResourceSets-r16)) OF SRS-PosResourceSet-r16        OPTIONAL,-- Need N
+    srs-PosResourceToReleaseList-r16        SEQUENCE (SIZE(1..maxNrofSRS-PosResources-r16)) OF SRS-PosResourceId-r16            OPTIONAL,-- Need N
+    srs-PosResourceToAddModList-r16         SEQUENCE (SIZE(1..maxNrofSRS-PosResources-r16)) OF SRS-PosResource-r16              OPTIONAL -- Need N
+    ]]
+}
+
+SRS-ResourceSet ::=                     SEQUENCE {
+    srs-ResourceSetId                       SRS-ResourceSetId,
+    srs-ResourceIdList                      SEQUENCE (SIZE(1..maxNrofSRS-ResourcesPerSet)) OF SRS-ResourceId    OPTIONAL, -- Cond Setup
+    resourceType                            CHOICE {
+        aperiodic                               SEQUENCE {
+            aperiodicSRS-ResourceTrigger            INTEGER (1..maxNrofSRS-TriggerStates-1),
+            csi-RS                                  NZP-CSI-RS-ResourceId                                  OPTIONAL, -- Cond NonCodebook
+            slotOffset                              INTEGER (1..32)                                        OPTIONAL, -- Need S
+            ...,
+            [[
+            aperiodicSRS-ResourceTriggerList            SEQUENCE (SIZE(1..maxNrofSRS-TriggerStates-2))
+                                                            OF INTEGER (1..maxNrofSRS-TriggerStates-1)     OPTIONAL  -- Need M
+            ]]
+        },
+        semi-persistent                         SEQUENCE {
+            associatedCSI-RS                        NZP-CSI-RS-ResourceId                                  OPTIONAL, -- Cond NonCodebook
+            ...
+        },
+        periodic                                SEQUENCE {
+            associatedCSI-RS                        NZP-CSI-RS-ResourceId                                  OPTIONAL, -- Cond NonCodebook
+            ...
+        }
+    },
+    usage                                   ENUMERATED {beamManagement, codebook, nonCodebook, antennaSwitching},
+    alpha                                   Alpha                                                          OPTIONAL, -- Need S
+    p0                                      INTEGER (-202..24)                                             OPTIONAL, -- Cond Setup
+    pathlossReferenceRS                     PathlossReferenceRS-Config                                     OPTIONAL, -- Need M
+    srs-PowerControlAdjustmentStates        ENUMERATED { sameAsFci2, separateClosedLoop}                   OPTIONAL, -- Need S
+    ...,
+    [[
+    pathlossReferenceRSList-r16             SetupRelease { PathlossReferenceRSList-r16}                    OPTIONAL  -- Need M
+    ]]
+}
+
+PathlossReferenceRS-Config ::=              CHOICE {
+    ssb-Index                                   SSB-Index,
+    csi-RS-Index                                NZP-CSI-RS-ResourceId
+}
+
+PathlossReferenceRSList-r16 ::=             SEQUENCE (SIZE (1..maxNrofSRS-PathlossReferenceRS-r16)) OF PathlossReferenceRS-r16
+
+PathlossReferenceRS-r16 ::=                 SEQUENCE {
+    srs-PathlossReferenceRS-Id-r16              SRS-PathlossReferenceRS-Id-r16,
+    pathlossReferenceRS-r16                     PathlossReferenceRS-Config
+}
+
+SRS-PathlossReferenceRS-Id-r16 ::=          INTEGER (0..maxNrofSRS-PathlossReferenceRS-1-r16)
+
+SRS-PosResourceSet-r16 ::=                  SEQUENCE {
+    srs-PosResourceSetId-r16                    SRS-PosResourceSetId-r16,
+    srs-PosResourceIdList-r16                   SEQUENCE (SIZE(1..maxNrofSRS-ResourcesPerSet)) OF SRS-PosResourceId-r16
+                                                                                                           OPTIONAL, -- Cond Setup
+    resourceType-r16                            CHOICE {
+        aperiodic-r16                               SEQUENCE {
+            aperiodicSRS-ResourceTriggerList-r16        SEQUENCE (SIZE(1..maxNrofSRS-TriggerStates-1))
+                                                            OF INTEGER (1..maxNrofSRS-TriggerStates-1)     OPTIONAL, -- Need M
+            ...
+        },
+        semi-persistent-r16                         SEQUENCE {
+            ...
+        },
+        periodic-r16                                SEQUENCE {
+            ...
+        }
+    },
+    alpha-r16                                   Alpha                                                      OPTIONAL, -- Need S
+    p0-r16                                      INTEGER (-202..24)                                         OPTIONAL, -- Cond Setup
+    pathlossReferenceRS-Pos-r16                 CHOICE {
+        ssb-IndexServing-r16                        SSB-Index,
+        ssb-Ncell-r16                               SSB-InfoNcell-r16,
+        dl-PRS-r16                                  DL-PRS-Info-r16
+    }                                                                                                      OPTIONAL, -- Need M
+    ...
+}
+
+SRS-ResourceSetId ::=                   INTEGER (0..maxNrofSRS-ResourceSets-1)
+
+SRS-PosResourceSetId-r16 ::=            INTEGER (0..maxNrofSRS-PosResourceSets-1-r16)
+
+SRS-Resource ::=                        SEQUENCE {
+    srs-ResourceId                          SRS-ResourceId,
+    nrofSRS-Ports                           ENUMERATED {port1, ports2, ports4},
+    ptrs-PortIndex                          ENUMERATED {n0, n1 }                                           OPTIONAL,   -- Need R
+    transmissionComb                        CHOICE {
+        n2                                      SEQUENCE {
+            combOffset-n2                           INTEGER (0..1),
+            cyclicShift-n2                          INTEGER (0..7)
+        },
+        n4                                      SEQUENCE {
+            combOffset-n4                           INTEGER (0..3),
+            cyclicShift-n4                          INTEGER (0..11)
+        }
+    },
+    resourceMapping                         SEQUENCE {
+        startPosition                           INTEGER (0..5),
+        nrofSymbols                             ENUMERATED {n1, n2, n4},
+        repetitionFactor                        ENUMERATED {n1, n2, n4}
+    },
+    freqDomainPosition                      INTEGER (0..67),
+    freqDomainShift                         INTEGER (0..268),
+    freqHopping                             SEQUENCE {
+        c-SRS                                   INTEGER (0..63),
+        b-SRS                                   INTEGER (0..3),
+        b-hop                                   INTEGER (0..3)
+    },
+    groupOrSequenceHopping                  ENUMERATED { neither, groupHopping, sequenceHopping },
+    resourceType                            CHOICE {
+        aperiodic                               SEQUENCE {
+            ...
+        },
+        semi-persistent                         SEQUENCE {
+            periodicityAndOffset-sp                     SRS-PeriodicityAndOffset,
+            ...
+        },
+        periodic                                SEQUENCE {
+            periodicityAndOffset-p                      SRS-PeriodicityAndOffset,
+            ...
+        }
+    },
+    sequenceId                              INTEGER (0..1023),
+    spatialRelationInfo                     SRS-SpatialRelationInfo                                        OPTIONAL,   -- Need R
+    ...,
+    [[
+    resourceMapping-r16                     SEQUENCE {
+        startPosition-r16                       INTEGER (0..13),
+        nrofSymbols-r16                         ENUMERATED {n1, n2, n4},
+        repetitionFactor-r16                    ENUMERATED {n1, n2, n4}
+    }                                                                                                      OPTIONAL    -- Need R
+    ]]
+
+}
+
+SRS-PosResource-r16::=                  SEQUENCE {
+    srs-PosResourceId-r16                   SRS-PosResourceId-r16,
+    transmissionComb-r16                    CHOICE {
+        n2-r16                                  SEQUENCE {
+            combOffset-n2-r16                       INTEGER (0..1),
+            cyclicShift-n2-r16                      INTEGER (0..7)
+        },
+        n4-r16                                  SEQUENCE {
+            combOffset-n4-16                        INTEGER (0..3),
+            cyclicShift-n4-r16                      INTEGER (0..11)
+        },
+        n8-r16                                  SEQUENCE {
+            combOffset-n8-r16                       INTEGER (0..7),
+            cyclicShift-n8-r16                      INTEGER (0..5)
+        },
+    ...
+    },
+    resourceMapping-r16                       SEQUENCE {
+        startPosition-r16                           INTEGER (0..13),
+        nrofSymbols-r16                             ENUMERATED {n1, n2, n4, n8, n12}
+    },
+    freqDomainShift-r16                       INTEGER (0..268),
+    freqHopping-r16                           SEQUENCE {
+        c-SRS-r16                                 INTEGER (0..63),
+        ...
+    },
+    groupOrSequenceHopping-r16                ENUMERATED { neither, groupHopping, sequenceHopping },
+    resourceType-r16                          CHOICE {
+        aperiodic-r16                             SEQUENCE {
+            slotOffset-r16                            INTEGER (1..32)                                      OPTIONAL,   -- Need S
+            ...
+        },
+        semi-persistent-r16                       SEQUENCE {
+            periodicityAndOffset-sp-r16               SRS-PeriodicityAndOffset-r16,
+            ...
+        },
+        periodic-r16                              SEQUENCE {
+            periodicityAndOffset-p-r16                SRS-PeriodicityAndOffset-r16,
+            ...
+        }
+    },
+    sequenceId-r16                            INTEGER (0..65535),
+    spatialRelationInfoPos-r16                SRS-SpatialRelationInfoPos-r16                               OPTIONAL,   -- Need R
+    ...
+}
+
+SRS-SpatialRelationInfo ::=     SEQUENCE {
+    servingCellId                       ServCellIndex                                                      OPTIONAL,   -- Need S
+    referenceSignal                     CHOICE {
+        ssb-Index                           SSB-Index,
+        csi-RS-Index                        NZP-CSI-RS-ResourceId,
+        srs                                 SEQUENCE {
+            resourceId                          SRS-ResourceId,
+            uplinkBWP                           BWP-Id
+        }
+    }
+}
+
+SRS-SpatialRelationInfoPos-r16 ::=      CHOICE {
+    servingRS-r16                           SEQUENCE {
+        servingCellId                           ServCellIndex                                              OPTIONAL,   -- Need S
+        referenceSignal-r16                     CHOICE {
+            ssb-IndexServing-r16                    SSB-Index,
+            csi-RS-IndexServing-r16                 NZP-CSI-RS-ResourceId,
+            srs-SpatialRelation-r16                 SEQUENCE {
+                resourceSelection-r16                   CHOICE {
+                    srs-ResourceId-r16                      SRS-ResourceId,
+                    srs-PosResourceId-r16                   SRS-PosResourceId-r16
+                },
+                uplinkBWP-r16                           BWP-Id
+            }
+        }
+    },
+    ssb-Ncell-r16                           SSB-InfoNcell-r16,
+    dl-PRS-r16                              DL-PRS-Info-r16
+}
+
+SSB-Configuration-r16  ::=          SEQUENCE {
+    ssb-Freq-r16                     ARFCN-ValueNR,
+    halfFrameIndex-r16                  ENUMERATED {zero, one},
+    ssbSubcarrierSpacing-r16            SubcarrierSpacing,
+    ssb-Periodicity-r16                 ENUMERATED { ms5, ms10, ms20, ms40, ms80, ms160, spare2,spare1 }   OPTIONAL, -- Need S
+    sfn0-Offset-r16                     SEQUENCE {
+        sfn-Offset-r16                      INTEGER (0..1023),
+        integerSubframeOffset-r16           INTEGER (0..9)                                                 OPTIONAL  -- Need R
+    }                                                                                                      OPTIONAL, -- Need R
+    sfn-SSB-Offset-r16                  INTEGER (0..15),
+    ss-PBCH-BlockPower-r16              INTEGER (-60..50)                                                  OPTIONAL  -- Cond Pathloss
+}
+
+SSB-InfoNcell-r16  ::=              SEQUENCE {
+    physicalCellId-r16                  PhysCellId,
+    ssb-IndexNcell-r16                  SSB-Index                                                          OPTIONAL, -- Need S
+    ssb-Configuration-r16               SSB-Configuration-r16                                              OPTIONAL  -- Need S
+}
+
+DL-PRS-Info-r16  ::=                SEQUENCE {
+    dl-PRS-ID-r16                      INTEGER (0..255),
+    dl-PRS-ResourceSetId-r16           INTEGER (0..7),
+    dl-PRS-ResourceId-r16              INTEGER (0..63)                                                     OPTIONAL  -- Need S
+}
+
+SRS-ResourceId ::=                      INTEGER (0..maxNrofSRS-Resources-1)
+SRS-PosResourceId-r16 ::=               INTEGER (0..maxNrofSRS-PosResources-1-r16)
+
+SRS-PeriodicityAndOffset ::=            CHOICE {
+    sl1                                     NULL,
+    sl2                                     INTEGER(0..1),
+    sl4                                     INTEGER(0..3),
+    sl5                                     INTEGER(0..4),
+    sl8                                     INTEGER(0..7),
+    sl10                                    INTEGER(0..9),
+    sl16                                    INTEGER(0..15),
+    sl20                                    INTEGER(0..19),
+    sl32                                    INTEGER(0..31),
+    sl40                                    INTEGER(0..39),
+    sl64                                    INTEGER(0..63),
+    sl80                                    INTEGER(0..79),
+    sl160                                   INTEGER(0..159),
+    sl320                                   INTEGER(0..319),
+    sl640                                   INTEGER(0..639),
+    sl1280                                  INTEGER(0..1279),
+    sl2560                                  INTEGER(0..2559)
+}
+
+SRS-PeriodicityAndOffset-r16 ::=        CHOICE {
+    sl1                                     NULL,
+    sl2                                     INTEGER(0..1),
+    sl4                                     INTEGER(0..3),
+    sl5                                     INTEGER(0..4),
+    sl8                                     INTEGER(0..7),
+    sl10                                    INTEGER(0..9),
+    sl16                                    INTEGER(0..15),
+    sl20                                    INTEGER(0..19),
+    sl32                                    INTEGER(0..31),
+    sl40                                    INTEGER(0..39),
+    sl64                                    INTEGER(0..63),
+    sl80                                    INTEGER(0..79),
+    sl160                                   INTEGER(0..159),
+    sl320                                   INTEGER(0..319),
+    sl640                                   INTEGER(0..639),
+    sl1280                                  INTEGER(0..1279),
+    sl2560                                  INTEGER(0..2559),
+    sl5120                                  INTEGER(0..5119),
+    sl10240                                 INTEGER(0..10239),
+    sl40960                                 INTEGER(0..40959),
+    sl81920                                 INTEGER(0..81919),
+    ...
+}
+
+-- TAG-SRS-CONFIG-STOP
+-- TAG-SRS-RSRP-RANGE-START
+
+SRS-RSRP-Range-r16 ::=                      INTEGER(0..98)
+
+-- TAG-SRS-RSRP-RANGE-STOP
+-- TAG-SRS-TPC-COMMANDCONFIG-START
+
+SRS-TPC-CommandConfig ::=               SEQUENCE {
+    startingBitOfFormat2-3                  INTEGER (1..31)                                                     OPTIONAL,   -- Need R
+    fieldTypeFormat2-3                      INTEGER (0..1)                                                      OPTIONAL,   -- Need R
+    ...,
+    [[
+    startingBitOfFormat2-3SUL               INTEGER (1..31)                                                     OPTIONAL    -- Need R
+    ]]
+}
+
+-- TAG-SRS-TPC-COMMANDCONFIG-STOP
+-- TAG-SSB-INDEX-START
+
+SSB-Index ::=                       INTEGER (0..maxNrofSSBs-1)
+
+-- TAG-SSB-INDEX-STOP
+-- TAG-SSB-MTC-START
+
+SSB-MTC ::=                             SEQUENCE {
+    periodicityAndOffset                    CHOICE {
+        sf5                                 INTEGER (0..4),
+        sf10                                    INTEGER (0..9),
+        sf20                                    INTEGER (0..19),
+        sf40                                    INTEGER (0..39),
+        sf80                                    INTEGER (0..79),
+        sf160                                   INTEGER (0..159)
+    },
+    duration                                ENUMERATED { sf1, sf2, sf3, sf4, sf5 }
+}
+
+SSB-MTC2 ::=                        SEQUENCE {
+    pci-List                            SEQUENCE (SIZE (1..maxNrofPCIsPerSMTC)) OF PhysCellId                   OPTIONAL,   -- Need M
+    periodicity                         ENUMERATED {sf5, sf10, sf20, sf40, sf80, spare3, spare2, spare1}
+}
+
+SSB-MTC2-LP-r16 ::=                 SEQUENCE {
+    pci-List                            SEQUENCE (SIZE (1..maxNrofPCIsPerSMTC)) OF PhysCellId                   OPTIONAL,   -- Need R
+    periodicity                         ENUMERATED {sf10, sf20, sf40, sf80, sf160, spare3, spare2, spare1}
+}
+
+SSB-MTC3-r16 ::=                    SEQUENCE {
+    periodicityAndOffset-r16            CHOICE {
+        sf5-r16                                     INTEGER (0..4),
+        sf10-r16                                    INTEGER (0..9),
+        sf20-r16                                    INTEGER (0..19),
+        sf40-r16                                    INTEGER (0..39),
+        sf80-r16                                    INTEGER (0..79),
+        sf160-r16                                   INTEGER (0..159),
+        sf320-r16                                   INTEGER (0..319),
+        sf640-r16                                   INTEGER (0..639),
+        sf1280-r16                                  INTEGER (0..1279)
+    },
+    duration-r16                        ENUMERATED {sf1, sf2, sf3, sf4, sf5},
+    pci-List-r16                        SEQUENCE (SIZE (1..maxNrofPCIsPerSMTC)) OF PhysCellId                   OPTIONAL,  -- Need M
+    ssb-ToMeasure-r16                   SetupRelease { SSB-ToMeasure }                                          OPTIONAL   -- Need M
+}
+
+
+-- TAG-SSB-MTC-STOP
+-- TAG-SSB-POSITIONQCL-RELATION-START
+
+SSB-PositionQCL-Relation-r16 ::=  ENUMERATED {n1,n2,n4,n8}
+
+-- TAG-SSB-POSITIONQCL-RELATION-STOP
+-- TAG-SSB-TOMEASURE-START
+
+SSB-ToMeasure ::=                   CHOICE {
+    shortBitmap                         BIT STRING (SIZE (4)),
+    mediumBitmap                        BIT STRING (SIZE (8)),
+    longBitmap                          BIT STRING (SIZE (64))
+}
+
+-- TAG-SSB-TOMEASURE-STOP
+-- TAG-SS-RSSI-MEASUREMENT-START
+
+SS-RSSI-Measurement ::=             SEQUENCE {
+    measurementSlots                    BIT STRING (SIZE (1..80)),
+    endSymbol                           INTEGER(0..3)
+}
+
+-- TAG-SS-RSSI-MEASUREMENT-STOP
+-- TAG-SUBCARRIERSPACING-START
+
+SubcarrierSpacing ::=               ENUMERATED {kHz15, kHz30, kHz60, kHz120, kHz240, spare3, spare2, spare1}
+
+-- TAG-SUBCARRIERSPACING-STOP
+-- TAG-TAG-CONFIG-START
+
+TAG-Config ::=                      SEQUENCE {
+    tag-ToReleaseList                   SEQUENCE (SIZE (1..maxNrofTAGs)) OF TAG-Id                          OPTIONAL,   -- Need N
+    tag-ToAddModList                    SEQUENCE (SIZE (1..maxNrofTAGs)) OF TAG                             OPTIONAL    -- Need N
+}
+
+TAG ::=                             SEQUENCE {
+    tag-Id                              TAG-Id,
+    timeAlignmentTimer                  TimeAlignmentTimer,
+    ...
+}
+
+TAG-Id ::=                          INTEGER (0..maxNrofTAGs-1)
+
+TimeAlignmentTimer ::=              ENUMERATED {ms500, ms750, ms1280, ms1920, ms2560, ms5120, ms10240, infinity}
+
+-- TAG-TAG-CONFIG-STOP
+-- TAG-TCI-STATE-START
+
+TCI-State ::=                       SEQUENCE {
+    tci-StateId                         TCI-StateId,
+    qcl-Type1                           QCL-Info,
+    qcl-Type2                           QCL-Info                                                    OPTIONAL,   -- Need R
+    ...
+}
+
+QCL-Info ::=                        SEQUENCE {
+    cell                                ServCellIndex                                               OPTIONAL,   -- Need R
+    bwp-Id                              BWP-Id                                                      OPTIONAL, -- Cond CSI-RS-Indicated
+    referenceSignal                     CHOICE {
+        csi-rs                              NZP-CSI-RS-ResourceId,
+        ssb                                 SSB-Index
+    },
+    qcl-Type                            ENUMERATED {typeA, typeB, typeC, typeD},
+    ...
+}
+
+-- TAG-TCI-STATE-STOP
+-- TAG-TCI-STATEID-START
+
+TCI-StateId ::=                     INTEGER (0..maxNrofTCI-States-1)
+
+-- TAG-TCI-STATEID-STOP
+-- TAG-TDD-UL-DL-CONFIGCOMMON-START
+
+TDD-UL-DL-ConfigCommon ::=          SEQUENCE {
+    referenceSubcarrierSpacing          SubcarrierSpacing,
+    pattern1                            TDD-UL-DL-Pattern,
+    pattern2                            TDD-UL-DL-Pattern                                                       OPTIONAL, -- Need R
+    ...
+}
+
+TDD-UL-DL-Pattern ::=               SEQUENCE {
+    dl-UL-TransmissionPeriodicity       ENUMERATED {ms0p5, ms0p625, ms1, ms1p25, ms2, ms2p5, ms5, ms10},
+    nrofDownlinkSlots                   INTEGER (0..maxNrofSlots),
+    nrofDownlinkSymbols                 INTEGER (0..maxNrofSymbols-1),
+    nrofUplinkSlots                     INTEGER (0..maxNrofSlots),
+    nrofUplinkSymbols                   INTEGER (0..maxNrofSymbols-1),
+    ...,
+    [[
+    dl-UL-TransmissionPeriodicity-v1530     ENUMERATED {ms3, ms4}                                               OPTIONAL -- Need R
+    ]]
+}
+
+-- TAG-TDD-UL-DL-CONFIGCOMMON-STOP
+-- TAG-TDD-UL-DL-CONFIGDEDICATED-START
+
+TDD-UL-DL-ConfigDedicated ::=       SEQUENCE {
+    slotSpecificConfigurationsToAddModList      SEQUENCE (SIZE (1..maxNrofSlots)) OF TDD-UL-DL-SlotConfig       OPTIONAL, -- Need N
+    slotSpecificConfigurationsToReleaseList     SEQUENCE (SIZE (1..maxNrofSlots)) OF TDD-UL-DL-SlotIndex        OPTIONAL, -- Need N
+    ...
+}
+
+TDD-UL-DL-ConfigDedicated-IAB-MT-r16::=         SEQUENCE {
+    slotSpecificConfigurationsToAddModList-IAB-MT-r16  SEQUENCE (SIZE (1..maxNrofSlots)) OF TDD-UL-DL-SlotConfig-IAB-MT-r16      OPTIONAL, -- Need N
+    slotSpecificConfigurationsToReleaseList-IAB-MT-r16 SEQUENCE (SIZE (1..maxNrofSlots)) OF TDD-UL-DL-SlotIndex                  OPTIONAL, -- Need N
+    ...
+}
+
+TDD-UL-DL-SlotConfig ::=            SEQUENCE {
+    slotIndex                           TDD-UL-DL-SlotIndex,
+    symbols                             CHOICE {
+        allDownlink                         NULL,
+        allUplink                           NULL,
+        explicit                            SEQUENCE {
+            nrofDownlinkSymbols                 INTEGER (1..maxNrofSymbols-1)                                   OPTIONAL, -- Need S
+            nrofUplinkSymbols                   INTEGER (1..maxNrofSymbols-1)                                   OPTIONAL  -- Need S
+        }
+    }
+}
+
+TDD-UL-DL-SlotConfig-IAB-MT-r16::=    SEQUENCE {
+    slotIndex-r16                           TDD-UL-DL-SlotIndex,
+    symbols-IAB-MT-r16                      CHOICE {
+        allDownlink-r16                         NULL,
+        allUplink-r16                           NULL,
+        explicit-r16                            SEQUENCE {
+            nrofDownlinkSymbols-r16                 INTEGER (1..maxNrofSymbols-1)                               OPTIONAL, -- Need S
+            nrofUplinkSymbols-r16                   INTEGER (1..maxNrofSymbols-1)                               OPTIONAL  -- Need S
+        },
+        explicit-IAB-MT-r16                     SEQUENCE {
+            nrofDownlinkSymbols-r16                 INTEGER (1..maxNrofSymbols-1)                               OPTIONAL, -- Need S
+            nrofUplinkSymbols-r16                   INTEGER (1..maxNrofSymbols-1)                               OPTIONAL  -- Need S
+        }
+    }
+}
+
+TDD-UL-DL-SlotIndex ::=             INTEGER (0..maxNrofSlots-1)
+
+-- TAG-TDD-UL-DL-CONFIGDEDICATED-STOP
+-- TAG-TRACKINGAREACODE-START
+
+TrackingAreaCode ::= BIT STRING (SIZE (24))
+
+-- TAG-TRACKINGAREACODE-STOP
+-- TAG-TRESELECTION-START
+
+T-Reselection ::=                   INTEGER (0..7)
+
+-- TAG-TRESELECTION-STOP
+-- TAG-TIMETOTRIGGER-START
+
+TimeToTrigger ::=                   ENUMERATED {
+                                        ms0, ms40, ms64, ms80, ms100, ms128, ms160, ms256,
+                                        ms320, ms480, ms512, ms640, ms1024, ms1280, ms2560,
+                                        ms5120}
+
+-- TAG-TIMETOTRIGGER-STOP
+-- TAG-UAC-BARRINGINFOSETINDEX-START
+
+UAC-BarringInfoSetIndex ::=                INTEGER (1..maxBarringInfoSet)
+
+-- TAG-UAC-BARRINGINFOSETINDEX-STOP
+-- TAG-UAC-BARRINGINFOSETLIST-START
+
+UAC-BarringInfoSetList ::=          SEQUENCE (SIZE(1..maxBarringInfoSet)) OF UAC-BarringInfoSet
+
+UAC-BarringInfoSet ::=              SEQUENCE {
+    uac-BarringFactor                   ENUMERATED {p00, p05, p10, p15, p20, p25, p30, p40,
+                                                    p50, p60, p70, p75, p80, p85, p90, p95},
+    uac-BarringTime                     ENUMERATED {s4, s8, s16, s32, s64, s128, s256, s512},
+    uac-BarringForAccessIdentity        BIT STRING (SIZE(7))
+}
+
+-- TAG-UAC-BARRINGINFOSETLIST-STOP
+-- TAG-UAC-BARRINGPERCATLIST-START
+
+UAC-BarringPerCatList ::=           SEQUENCE (SIZE (1..maxAccessCat-1)) OF UAC-BarringPerCat
+
+UAC-BarringPerCat ::=               SEQUENCE {
+   accessCategory                       INTEGER (1..maxAccessCat-1),
+   uac-barringInfoSetIndex              UAC-BarringInfoSetIndex
+}
+
+-- TAG-UAC-BARRINGPERCATLIST-STOP
+-- TAG-UAC-BARRINGPERPLMN-LIST-START
+
+UAC-BarringPerPLMN-List ::=         SEQUENCE (SIZE (1.. maxPLMN)) OF UAC-BarringPerPLMN
+
+UAC-BarringPerPLMN ::=              SEQUENCE {
+    plmn-IdentityIndex                  INTEGER (1..maxPLMN),
+    uac-ACBarringListType               CHOICE{
+        uac-ImplicitACBarringList           SEQUENCE (SIZE(maxAccessCat-1)) OF UAC-BarringInfoSetIndex,
+        uac-ExplicitACBarringList           UAC-BarringPerCatList
+    }                                                                                                     OPTIONAL     -- Need S
+}
+
+-- TAG-UAC-BARRINGPERPLMN-LIST-STOP
+-- TAG-UE-TIMERSANDCONSTANTS-START
+
+UE-TimersAndConstants ::=           SEQUENCE {
+    t300                                ENUMERATED {ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000},
+    t301                                ENUMERATED {ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000},
+    t310                                ENUMERATED {ms0, ms50, ms100, ms200, ms500, ms1000, ms2000},
+    n310                                ENUMERATED {n1, n2, n3, n4, n6, n8, n10, n20},
+    t311                                ENUMERATED {ms1000, ms3000, ms5000, ms10000, ms15000, ms20000, ms30000},
+    n311                                ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10},
+    t319                                ENUMERATED {ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000},
+    ...
+}
+
+-- TAG-UE-TIMERSANDCONSTANTS-STOP
+-- TAG-ULDELAYVALUECONFIG-START
+
+UL-DelayValueConfig-r16 ::=  SEQUENCE {
+    delay-DRBlist                SEQUENCE (SIZE(1..maxDRB)) OF DRB-Identity
+}
+
+-- TAG-ULDELAYVALUECONFIG-STOP
+-- TAG-UPLINKCANCELLATION-START
+
+UplinkCancellation-r16 ::=           SEQUENCE {
+    ci-RNTI-r16                          RNTI-Value,
+    dci-PayloadSizeForCI-r16             INTEGER (0..maxCI-DCI-PayloadSize-r16),
+    ci-ConfigurationPerServingCell-r16   SEQUENCE (SIZE (1..maxNrofServingCells)) OF CI-ConfigurationPerServingCell-r16,
+    ...
+}
+
+CI-ConfigurationPerServingCell-r16 ::=   SEQUENCE {
+    servingCellId                            ServCellIndex,
+    positionInDCI-r16                        INTEGER (0..maxCI-DCI-PayloadSize-r16-1),
+    positionInDCI-ForSUL-r16                 INTEGER (0..maxCI-DCI-PayloadSize-r16-1)                             OPTIONAL,   -- Cond SUL-Only
+    ci-PayloadSize-r16                       ENUMERATED {n1, n2, n4, n5, n7, n8, n10, n14, n16, n20, n28, n32, n35, n42, n56, n112},
+    timeFrequencyRegion-r16                  SEQUENCE {
+        timeDurationForCI-r16                    ENUMERATED {n2, n4, n7, n14}                                      OPTIONAL,   -- Cond SymbolPeriodicity
+        timeGranularityForCI-r16                 ENUMERATED {n1, n2, n4, n7, n14, n28},
+        frequencyRegionForCI-r16                 INTEGER (0..37949),
+        deltaOffset-r16                          INTEGER (0..2),
+        ...
+    },
+    uplinkCancellationPriority-v1610         ENUMERATED {enabled}                                                  OPTIONAL    -- Need S
+}
+
+-- TAG-UPLINKCANCELLATION-STOP
+-- TAG-UPLINKCONFIGCOMMON-START
+
+UplinkConfigCommon ::=              SEQUENCE {
+    frequencyInfoUL                     FrequencyInfoUL                                 OPTIONAL,   -- Cond InterFreqHOAndServCellAdd
+    initialUplinkBWP                    BWP-UplinkCommon                                OPTIONAL,   -- Cond ServCellAdd
+    dummy                               TimeAlignmentTimer
+}
+
+-- TAG-UPLINKCONFIGCOMMON-STOP
+-- TAG-UPLINKCONFIGCOMMONSIB-START
+
+UplinkConfigCommonSIB ::=               SEQUENCE {
+    frequencyInfoUL                         FrequencyInfoUL-SIB,
+    initialUplinkBWP                        BWP-UplinkCommon,
+    timeAlignmentTimerCommon                TimeAlignmentTimer
+}
+
+-- TAG-UPLINKCONFIGCOMMONSIB-STOP
+-- TAG-UPLINKTXDIRECTCURRENTLIST-START
+
+UplinkTxDirectCurrentList ::=           SEQUENCE (SIZE (1..maxNrofServingCells)) OF UplinkTxDirectCurrentCell
+
+UplinkTxDirectCurrentCell ::=           SEQUENCE {
+    servCellIndex                           ServCellIndex,
+    uplinkDirectCurrentBWP                  SEQUENCE (SIZE (1..maxNrofBWPs)) OF UplinkTxDirectCurrentBWP,
+    ...,
+    [[
+    uplinkDirectCurrentBWP-SUL              SEQUENCE (SIZE (1..maxNrofBWPs)) OF UplinkTxDirectCurrentBWP               OPTIONAL
+    ]]
+}
+
+UplinkTxDirectCurrentBWP ::=            SEQUENCE {
+    bwp-Id                                  BWP-Id,
+    shift7dot5kHz                           BOOLEAN,
+    txDirectCurrentLocation                 INTEGER (0..3301)
+}
+
+-- TAG-UPLINKTXDIRECTCURRENTLIST-STOP
+-- TAG-UPLINKTXDIRECTCURRENTTWOCARRIERLIST-START
+
+UplinkTxDirectCurrentTwoCarrierList-r16 ::=   SEQUENCE (SIZE (1..maxNrofTxDC-TwoCarrier-r16)) OF UplinkTxDirectCurrentTwoCarrier-r16
+
+UplinkTxDirectCurrentTwoCarrier-r16 ::=       SEQUENCE {
+    carrierOneInfo-r16                            UplinkTxDirectCurrentCarrierInfo-r16,
+    carrierTwoInfo-r16                            UplinkTxDirectCurrentCarrierInfo-r16,
+    singlePA-TxDirectCurrent-r16                  UplinkTxDirectCurrentTwoCarrierInfo-r16,
+    secondPA-TxDirectCurrent-r16                  UplinkTxDirectCurrentTwoCarrierInfo-r16            OPTIONAL
+}
+
+UplinkTxDirectCurrentCarrierInfo-r16 ::=      SEQUENCE {
+    servCellIndex-r16                             ServCellIndex,
+    servCellInfo-r16                              CHOICE {
+        bwp-Id-r16                                    BWP-Id,
+        deactivatedCarrier-r16                        ENUMERATED {deactivated}
+    }
+}
+
+UplinkTxDirectCurrentTwoCarrierInfo-r16 ::=   SEQUENCE {
+    referenceCarrierIndex-r16                     ServCellIndex,
+    shift7dot5kHz-r16                             BOOLEAN,
+    txDirectCurrentLocation-r16                   INTEGER (0..3301)
+}
+
+-- TAG-UPLINKTXDIRECTCURRENTTWOCARRIERLIST-STOP
+-- TAG-ZP-CSI-RS-RESOURCE-START
+
+ZP-CSI-RS-Resource ::=              SEQUENCE {
+    zp-CSI-RS-ResourceId                ZP-CSI-RS-ResourceId,
+    resourceMapping                     CSI-RS-ResourceMapping,
+    periodicityAndOffset                CSI-ResourcePeriodicityAndOffset                OPTIONAL, --Cond PeriodicOrSemiPersistent
+    ...
+}
+
+ZP-CSI-RS-ResourceId ::=            INTEGER (0..maxNrofZP-CSI-RS-Resources-1)
+
+-- TAG-ZP-CSI-RS-RESOURCE-STOP
+-- TAG-ZP-CSI-RS-RESOURCESET-START
+
+ZP-CSI-RS-ResourceSet ::=           SEQUENCE {
+    zp-CSI-RS-ResourceSetId             ZP-CSI-RS-ResourceSetId,
+    zp-CSI-RS-ResourceIdList            SEQUENCE (SIZE(1..maxNrofZP-CSI-RS-ResourcesPerSet)) OF ZP-CSI-RS-ResourceId,
+    ...
+}
+
+-- TAG-ZP-CSI-RS-RESOURCESET-STOP
+-- TAG-ZP-CSI-RS-RESOURCESETID-START
+
+ZP-CSI-RS-ResourceSetId ::=                     INTEGER (0..maxNrofZP-CSI-RS-ResourceSets-1)
+
+-- TAG-ZP-CSI-RS-RESOURCESETID-STOP
+-- TAG-ACCESSSTRATUMRELEASE-START
+
+AccessStratumRelease ::= ENUMERATED {
+                            rel15, rel16, spare6, spare5, spare4, spare3, spare2, spare1, ... }
+
+-- TAG-ACCESSSTRATUMRELEASE-STOP
+-- TAG-BANDCOMBINATIONLIST-START
+
+BandCombinationList ::=             SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination
+
+BandCombinationList-v1540 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1540
+
+BandCombinationList-v1550 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1550
+
+BandCombinationList-v1560 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1560
+
+BandCombinationList-v1570 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1570
+
+BandCombinationList-v1580 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1580
+
+BandCombinationList-v1590 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1590
+
+BandCombinationList-v1610 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1610
+
+BandCombinationList-v1630 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1630
+
+BandCombinationList-v1640 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1640
+
+BandCombinationList-UplinkTxSwitch-r16 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-UplinkTxSwitch-r16
+
+BandCombinationList-UplinkTxSwitch-v1630 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-UplinkTxSwitch-v1630
+
+BandCombinationList-UplinkTxSwitch-v1640 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-UplinkTxSwitch-v1640
+
+BandCombination ::=                 SEQUENCE {
+    bandList                            SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParameters,
+    featureSetCombination               FeatureSetCombinationId,
+    ca-ParametersEUTRA                  CA-ParametersEUTRA                          OPTIONAL,
+    ca-ParametersNR                     CA-ParametersNR                             OPTIONAL,
+    mrdc-Parameters                     MRDC-Parameters                             OPTIONAL,
+    supportedBandwidthCombinationSet    BIT STRING (SIZE (1..32))                   OPTIONAL,
+    powerClass-v1530                    ENUMERATED {pc2}                            OPTIONAL
+}
+
+BandCombination-v1540::=            SEQUENCE {
+    bandList-v1540                      SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParameters-v1540,
+    ca-ParametersNR-v1540               CA-ParametersNR-v1540                       OPTIONAL
+}
+
+BandCombination-v1550 ::=           SEQUENCE {
+    ca-ParametersNR-v1550               CA-ParametersNR-v1550
+}
+BandCombination-v1560::=            SEQUENCE {
+    ne-DC-BC                                ENUMERATED {supported}                 OPTIONAL,
+    ca-ParametersNRDC                       CA-ParametersNRDC                      OPTIONAL,
+    ca-ParametersEUTRA-v1560                CA-ParametersEUTRA-v1560               OPTIONAL,
+    ca-ParametersNR-v1560                   CA-ParametersNR-v1560                  OPTIONAL
+}
+
+BandCombination-v1570 ::=           SEQUENCE {
+    ca-ParametersEUTRA-v1570            CA-ParametersEUTRA-v1570
+}
+
+BandCombination-v1580 ::=           SEQUENCE {
+    mrdc-Parameters-v1580               MRDC-Parameters-v1580
+}
+
+BandCombination-v1590::=            SEQUENCE {
+    supportedBandwidthCombinationSetIntraENDC  BIT STRING (SIZE (1..32))           OPTIONAL,
+    mrdc-Parameters-v1590                      MRDC-Parameters-v1590
+}
+
+BandCombination-v1610 ::=          SEQUENCE {
+    bandList-v1610                      SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParameters-v1610  OPTIONAL,
+        ca-ParametersNR-v1610               CA-ParametersNR-v1610                  OPTIONAL,
+        ca-ParametersNRDC-v1610             CA-ParametersNRDC-v1610                OPTIONAL,
+        powerClass-v1610                    ENUMERATED {pc1dot5}                   OPTIONAL,
+        powerClassNRPart-r16                ENUMERATED {pc1, pc2, pc3, pc5}        OPTIONAL,
+        featureSetCombinationDAPS-r16       FeatureSetCombinationId                OPTIONAL,
+        mrdc-Parameters-v1620               MRDC-Parameters-v1620                  OPTIONAL
+}
+
+BandCombination-v1630 ::=                   SEQUENCE {
+    ca-ParametersNR-v1630                       CA-ParametersNR-v1630                                             OPTIONAL,
+    ca-ParametersNRDC-v1630                     CA-ParametersNRDC-v1630                                           OPTIONAL,
+    mrdc-Parameters-v1630                       MRDC-Parameters-v1630                                             OPTIONAL,
+    supportedTxBandCombListPerBC-Sidelink-r16   BIT STRING (SIZE (1..maxBandComb))                                OPTIONAL,
+    supportedRxBandCombListPerBC-Sidelink-r16   BIT STRING (SIZE (1..maxBandComb))                                OPTIONAL,
+    scalingFactorTxSidelink-r16                 SEQUENCE (SIZE (1..maxBandComb)) OF ScalingFactorSidelink-r16     OPTIONAL,
+    scalingFactorRxSidelink-r16                 SEQUENCE (SIZE (1..maxBandComb)) OF ScalingFactorSidelink-r16     OPTIONAL
+}
+
+BandCombination-v1640 ::=                   SEQUENCE {
+    ca-ParametersNR-v1640                       CA-ParametersNR-v1640                                             OPTIONAL,
+    ca-ParametersNRDC-v1640                     CA-ParametersNRDC-v1640                                           OPTIONAL
+}
+
+BandCombination-UplinkTxSwitch-r16 ::= SEQUENCE {
+    bandCombination-r16                 BandCombination,
+    bandCombination-v1540               BandCombination-v1540                      OPTIONAL,
+    bandCombination-v1560               BandCombination-v1560                      OPTIONAL,
+    bandCombination-v1570               BandCombination-v1570                      OPTIONAL,
+    bandCombination-v1580               BandCombination-v1580                      OPTIONAL,
+    bandCombination-v1590               BandCombination-v1590                      OPTIONAL,
+    bandCombination-v1610               BandCombination-v1610                      OPTIONAL,
+    supportedBandPairListNR-r16         SEQUENCE (SIZE (1..maxULTxSwitchingBandPairs)) OF ULTxSwitchingBandPair-r16,
+    uplinkTxSwitching-OptionSupport-r16 ENUMERATED {switchedUL, dualUL, both}      OPTIONAL,
+    uplinkTxSwitching-PowerBoosting-r16 ENUMERATED {supported}                     OPTIONAL,
+    ...
+}
+
+BandCombination-UplinkTxSwitch-v1630 ::=    SEQUENCE {
+    bandCombination-v1630                       BandCombination-v1630              OPTIONAL
+}
+
+BandCombination-UplinkTxSwitch-v1640 ::=    SEQUENCE {
+    bandCombination-v1640                       BandCombination-v1640              OPTIONAL
+}
+
+ULTxSwitchingBandPair-r16 ::=       SEQUENCE {
+    bandIndexUL1-r16                    INTEGER(1..maxSimultaneousBands),
+    bandIndexUL2-r16                    INTEGER(1..maxSimultaneousBands),
+    uplinkTxSwitchingPeriod-r16         ENUMERATED {n35us, n140us, n210us},
+    uplinkTxSwitching-DL-Interruption-r16 BIT STRING (SIZE(1..maxSimultaneousBands)) OPTIONAL
+}
+
+BandParameters ::=                      CHOICE {
+    eutra                               SEQUENCE {
+        bandEUTRA                           FreqBandIndicatorEUTRA,
+        ca-BandwidthClassDL-EUTRA           CA-BandwidthClassEUTRA                 OPTIONAL,
+        ca-BandwidthClassUL-EUTRA           CA-BandwidthClassEUTRA                 OPTIONAL
+    },
+    nr                                  SEQUENCE {
+        bandNR                              FreqBandIndicatorNR,
+        ca-BandwidthClassDL-NR              CA-BandwidthClassNR                    OPTIONAL,
+        ca-BandwidthClassUL-NR              CA-BandwidthClassNR                    OPTIONAL
+    }
+}
+
+BandParameters-v1540 ::=            SEQUENCE {
+    srs-CarrierSwitch                   CHOICE {
+        nr                                  SEQUENCE {
+            srs-SwitchingTimesListNR            SEQUENCE (SIZE (1..maxSimultaneousBands)) OF SRS-SwitchingTimeNR
+        },
+        eutra                               SEQUENCE {
+            srs-SwitchingTimesListEUTRA         SEQUENCE (SIZE (1..maxSimultaneousBands)) OF SRS-SwitchingTimeEUTRA
+        }
+    }                                                                              OPTIONAL,
+    srs-TxSwitch                    SEQUENCE {
+        supportedSRS-TxPortSwitch       ENUMERATED {t1r2, t1r4, t2r4, t1r4-t2r4, t1r1, t2r2, t4r4, notSupported},
+        txSwitchImpactToRx              INTEGER (1..32)                            OPTIONAL,
+        txSwitchWithAnotherBand         INTEGER (1..32)                            OPTIONAL
+    }                                                                              OPTIONAL
+}
+
+BandParameters-v1610 ::=         SEQUENCE {
+    srs-TxSwitch-v1610               SEQUENCE {
+        supportedSRS-TxPortSwitch-v1610  ENUMERATED {t1r1-t1r2, t1r1-t1r2-t1r4, t1r1-t1r2-t2r2-t2r4, t1r1-t1r2-t2r2-t1r4-t2r4,
+                                                         t1r1-t2r2, t1r1-t2r2-t4r4}
+    }                                                                              OPTIONAL
+}
+
+ScalingFactorSidelink-r16 ::=       ENUMERATED {f0p4, f0p75, f0p8, f1}
+
+-- TAG-BANDCOMBINATIONLIST-STOP
+-- TAG-BANDCOMBINATIONLISTSIDELINKEUTRANR-START
+
+BandCombinationListSidelinkEUTRA-NR-r16 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombinationParametersSidelinkEUTRA-NR-r16
+
+BandCombinationListSidelinkEUTRA-NR-v1630 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombinationParametersSidelinkEUTRA-NR-v1630
+
+BandCombinationParametersSidelinkEUTRA-NR-r16 ::= SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParametersSidelinkEUTRA-NR-r16
+
+BandCombinationParametersSidelinkEUTRA-NR-v1630 ::= SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParametersSidelinkEUTRA-NR-v1630
+
+BandParametersSidelinkEUTRA-NR-r16 ::= CHOICE {
+    eutra                                  SEQUENCE {
+        bandParametersSidelinkEUTRA1-r16       OCTET STRING                         OPTIONAL,
+        bandParametersSidelinkEUTRA2-r16       OCTET STRING                         OPTIONAL
+    },
+    nr                                     SEQUENCE {
+        bandParametersSidelinkNR-r16           BandParametersSidelink-r16
+    }
+}
+
+BandParametersSidelinkEUTRA-NR-v1630 ::= CHOICE {
+    eutra                                    NULL,
+    nr                                       SEQUENCE {
+        tx-Sidelink-r16                          ENUMERATED {supported}                          OPTIONAL,
+        rx-Sidelink-r16                          ENUMERATED {supported}                          OPTIONAL,
+        sl-CrossCarrierScheduling-r16            ENUMERATED {supported}                          OPTIONAL
+    }
+}
+
+BandParametersSidelink-r16 ::= SEQUENCE {
+    freqBandSidelink-r16           FreqBandIndicatorNR
+}
+
+-- TAG-BANDCOMBINATIONLISTSIDELINKEUTRANR-STOP
+-- TAG-CA-BANDWIDTHCLASSEUTRA-START
+
+CA-BandwidthClassEUTRA ::=          ENUMERATED {a, b, c, d, e, f, ...}
+
+-- TAG-CA-BANDWIDTHCLASSEUTRA-STOP
+-- TAG-CA-BANDWIDTHCLASSNR-START
+
+CA-BandwidthClassNR ::=             ENUMERATED {a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, ...}
+
+-- TAG-CA-BANDWIDTHCLASSNR-STOP
+-- TAG-CA-PARAMETERSEUTRA-START
+
+CA-ParametersEUTRA ::=                          SEQUENCE {
+    multipleTimingAdvance                           ENUMERATED {supported}                          OPTIONAL,
+    simultaneousRx-Tx                               ENUMERATED {supported}                          OPTIONAL,
+    supportedNAICS-2CRS-AP                          BIT STRING (SIZE (1..8))                        OPTIONAL,
+    additionalRx-Tx-PerformanceReq                  ENUMERATED {supported}                          OPTIONAL,
+    ue-CA-PowerClass-N                              ENUMERATED {class2}                             OPTIONAL,
+    supportedBandwidthCombinationSetEUTRA-v1530     BIT STRING (SIZE (1..32))                       OPTIONAL,
+    ...
+}
+
+CA-ParametersEUTRA-v1560 ::=                    SEQUENCE {
+    fd-MIMO-TotalWeightedLayers                     INTEGER (2..128)                                OPTIONAL
+}
+
+CA-ParametersEUTRA-v1570 ::=                    SEQUENCE {
+    dl-1024QAM-TotalWeightedLayers                  INTEGER (0..10)                                 OPTIONAL
+}
+
+-- TAG-CA-PARAMETERSEUTRA-STOP
+-- TAG-CA-PARAMETERSNR-START
+
+CA-ParametersNR ::=                 SEQUENCE {
+    dummy                                         ENUMERATED {supported}      OPTIONAL,
+    parallelTxSRS-PUCCH-PUSCH                     ENUMERATED {supported}      OPTIONAL,
+    parallelTxPRACH-SRS-PUCCH-PUSCH               ENUMERATED {supported}      OPTIONAL,
+    simultaneousRxTxInterBandCA                   ENUMERATED {supported}      OPTIONAL,
+    simultaneousRxTxSUL                           ENUMERATED {supported}      OPTIONAL,
+    diffNumerologyAcrossPUCCH-Group               ENUMERATED {supported}      OPTIONAL,
+    diffNumerologyWithinPUCCH-GroupSmallerSCS     ENUMERATED {supported}      OPTIONAL,
+    supportedNumberTAG                            ENUMERATED {n2, n3, n4}     OPTIONAL,
+    ...
+}
+
+CA-ParametersNR-v1540 ::=           SEQUENCE {
+    simultaneousSRS-AssocCSI-RS-AllCC                       INTEGER (5..32)         OPTIONAL,
+    csi-RS-IM-ReceptionForFeedbackPerBandComb               SEQUENCE {
+        maxNumberSimultaneousNZP-CSI-RS-ActBWP-AllCC            INTEGER (1..64)     OPTIONAL,
+        totalNumberPortsSimultaneousNZP-CSI-RS-ActBWP-AllCC     INTEGER (2..256)    OPTIONAL
+    }                                                                               OPTIONAL,
+    simultaneousCSI-ReportsAllCC                            INTEGER (5..32)         OPTIONAL,
+    dualPA-Architecture                                     ENUMERATED {supported}  OPTIONAL
+}
+
+CA-ParametersNR-v1550 ::=           SEQUENCE {
+    dummy                               ENUMERATED {supported}                      OPTIONAL
+}
+
+CA-ParametersNR-v1560 ::=           SEQUENCE {
+    diffNumerologyWithinPUCCH-GroupLargerSCS      ENUMERATED {supported}            OPTIONAL
+}
+
+CA-ParametersNR-v1610 ::=           SEQUENCE {
+     -- R1 9-3: Parallel MsgA and SRS/PUCCH/PUSCH transmissions across CCs in inter-band CA
+    parallelTxMsgA-SRS-PUCCH-PUSCH-r16                ENUMERATED {supported}        OPTIONAL,
+     -- R1 9-4: MsgA operation in a band combination including SUL
+    msgA-SUL-r16                                      ENUMERATED {supported}        OPTIONAL,
+    -- R1 10-9c: Joint search space group switching across multiple cells
+    jointSearchSpaceGroupSwitchingAcrossCells-r16     ENUMERATED {supported}        OPTIONAL,
+    -- R1 14-5: Half-duplex UE behaviour in TDD CA for same SCS
+    half-DuplexTDD-CA-SameSCS-r16                     ENUMERATED {supported}        OPTIONAL,
+    -- R1 18-4: SCell dormancy within active time
+    scellDormancyWithinActiveTime-r16                 ENUMERATED {supported}        OPTIONAL,
+    -- R1 18-4a: SCell dormancy outside active time
+    scellDormancyOutsideActiveTime-r16                ENUMERATED {supported}        OPTIONAL,
+    -- R1 18-6: Cross-carrier A-CSI RS triggering with different SCS
+    crossCarrierA-CSI-trigDiffSCS-r16                 ENUMERATED {higherA-CSI-SCS,lowerA-CSI-SCS,both}   OPTIONAL,
+    -- R1 18-6a: Default QCL assumption for cross-carrier A-CSI-RS triggering
+    defaultQCL-CrossCarrierA-CSI-Trig-r16             ENUMERATED {diffOnly, both}   OPTIONAL,
+    -- R1 18-7: CA with non-aligned frame boundaries for inter-band CA
+    interCA-NonAlignedFrame-r16                       ENUMERATED {supported}        OPTIONAL,
+    simul-SRS-Trans-BC-r16                            ENUMERATED {n2}               OPTIONAL,
+    interFreqDAPS-r16                                 SEQUENCE {
+        interFreqAsyncDAPS-r16                            ENUMERATED {supported}    OPTIONAL,
+        interFreqDiffSCS-DAPS-r16                         ENUMERATED {supported}    OPTIONAL,
+        interFreqMultiUL-TransmissionDAPS-r16             ENUMERATED {supported}    OPTIONAL,
+        interFreqSemiStaticPowerSharingDAPS-Mode1-r16     ENUMERATED {supported}    OPTIONAL,
+        interFreqSemiStaticPowerSharingDAPS-Mode2-r16     ENUMERATED {supported}    OPTIONAL,
+        interFreqDynamicPowerSharingDAPS-r16              ENUMERATED {short, long}  OPTIONAL,
+        interFreqUL-TransCancellationDAPS-r16             ENUMERATED {supported}    OPTIONAL
+    }                                                                               OPTIONAL,
+    codebookParametersPerBC-r16                       CodebookParameters-v1610      OPTIONAL,
+    -- R1 16-2a-10 Value of R for BD/CCE
+    blindDetectFactor-r16                             INTEGER (1..2)                OPTIONAL,
+    -- R1 11-2a: Capability on the number of CCs for monitoring a maximum number of BDs and non-overlapped CCEs per span when configured
+    -- with DL CA with Rel-16 PDCCH monitoring capability on all the serving cells
+    pdcch-MonitoringCA-r16                            SEQUENCE {
+        maxNumberOfMonitoringCC-r16                       INTEGER (2..16),
+        supportedSpanArrangement-r16                      ENUMERATED {alignedOnly, alignedAndNonAligned}
+    }                                                                               OPTIONAL,
+    -- R1 11-2c: Number of carriers for CCE/BD scaling with DL CA with mix of Rel. 16 and Rel. 15 PDCCH monitoring capabilities on
+    -- different carriers
+    pdcch-BlindDetectionCA-Mixed-r16                  SEQUENCE {
+        pdcch-BlindDetectionCA1-r16                       INTEGER (1..15),
+        pdcch-BlindDetectionCA2-r16                       INTEGER (1..15),
+        supportedSpanArrangement-r16                      ENUMERATED {alignedOnly, alignedAndNonAligned}
+    }                                                                               OPTIONAL,
+    -- R1 11-2d: Capability on the number of CCs for monitoring a maximum number of BDs and non-overlapped CCEs per span for MCG and for
+    -- SCG when configured for NR-DC operation with Rel-16 PDCCH monitoring capability on all the serving cells
+    pdcch-BlindDetectionMCG-UE-r16                    INTEGER (1..14)               OPTIONAL,
+    pdcch-BlindDetectionSCG-UE-r16                    INTEGER (1..14)               OPTIONAL,
+    -- R1 11-2e: Number of carriers for CCE/BD scaling for MCG and for SCG when configured for NR-DC operation with mix of Rel. 16 and
+    -- Rel. 15 PDCCH monitoring capabilities on different carriers
+    pdcch-BlindDetectionMCG-UE-Mixed-r16              SEQUENCE {
+        pdcch-BlindDetectionMCG-UE1-r16                   INTEGER (0..15),
+        pdcch-BlindDetectionMCG-UE2-r16                   INTEGER (0..15)
+    }                                                                               OPTIONAL,
+    pdcch-BlindDetectionSCG-UE-Mixed-r16              SEQUENCE {
+        pdcch-BlindDetectionSCG-UE1-r16                   INTEGER (0..15),
+        pdcch-BlindDetectionSCG-UE2-r16                   INTEGER (0..15)
+    }                                                                               OPTIONAL,
+     -- R1 18-5 cross-carrier scheduling with different SCS in DL CA
+    crossCarrierSchedulingDL-DiffSCS-r16              ENUMERATED {low-to-high, high-to-low, both} OPTIONAL,
+    -- R1 18-5a Default QCL assumption for cross-carrier scheduling
+    crossCarrierSchedulingDefaultQCL-r16              ENUMERATED {diff-only, both}  OPTIONAL,
+    -- R1 18-5b cross-carrier scheduling with different SCS in UL CA
+    crossCarrierSchedulingUL-DiffSCS-r16              ENUMERATED {low-to-high, high-to-low, both} OPTIONAL,
+    -- R1 13.19a Simultaneous positioning SRS and MIMO SRS transmission for a given BC
+    simul-SRS-MIMO-Trans-BC-r16                       ENUMERATED {n2}               OPTIONAL,
+    -- R1 16-3a, 16-3a-1, 16-3b, 16-3b-1: New Individual Codebook
+    codebookParametersAdditionPerBC-r16               CodebookParametersAdditionPerBC-r16         OPTIONAL,
+    -- R1 16-8: Mixed codebook
+    codebookComboParametersAdditionPerBC-r16          CodebookComboParametersAdditionPerBC-r16    OPTIONAL
+}
+
+CA-ParametersNR-v1630 ::= SEQUENCE {
+    -- R1 22-5b: Simultaneous transmission of SRS for antenna switching and SRS for CB/NCB /BM for inter-band UL CA
+    -- R1 22-5d: Simultaneous transmission of SRS for antenna switching for inter-band UL CA	
+    simulTX-SRS-AntSwitchingInterBandUL-CA-r16        SimulSRS-ForAntennaSwitching-r16            OPTIONAL,
+    -- R4 8-5: supported beam management type for inter-band CA	
+    beamManagementType-r16                            ENUMERATED {ibm, cbm}                       OPTIONAL,
+    -- R4 7-3a: UL frequency separation class with aggregate BW and Gap BW
+    intraBandFreqSeparationUL-AggBW-GapBW-r16         ENUMERATED {classI, classII, classIII}      OPTIONAL,
+    -- RAN 89: Case B in case of Inter-band CA with non-aligned frame boundaries
+    interCA-NonAlignedFrame-B-r16                     ENUMERATED {supported}                      OPTIONAL
+}
+
+CA-ParametersNR-v1640 ::= SEQUENCE {
+    -- R4 7-5: Support of reporting UL Tx DC locations for uplink intra-band CA.
+    uplinkTxDC-TwoCarrierReport-r16                               ENUMERATED {supported}          OPTIONAL,
+    -- RAN 22-6: Support of up to 3 different numerologies in the same NR PUCCH group for NR part of EN-DC, NGEN-DC, NE-DC and NR-CA 
+    -- where UE is not configured with two NR PUCCH groups
+    maxUpTo3Diff-NumerologiesConfigSinglePUCCH-grp-r16            PUCCH-Grp-CarrierTypes-r16      OPTIONAL,
+    -- RAN 22-6a: Support of up to 4 different numerologies in the same NR PUCCH group for NR part of EN-DC, NGEN-DC, NE-DC and NR-CA 
+    -- where UE is not configured with two NR PUCCH groups
+    maxUpTo4Diff-NumerologiesConfigSinglePUCCH-grp-r16            PUCCH-Grp-CarrierTypes-r16      OPTIONAL,
+    -- RAN 22-7: Support two PUCCH groups for NR-CA with 3 or more bands with at least two carrier types 
+    twoPUCCH-Grp-ConfigurationsList-r16 SEQUENCE (SIZE (1..maxTwoPUCCH-Grp-ConfigList-r16)) OF TwoPUCCH-Grp-Configurations-r16 OPTIONAL,
+    -- R1 22-7a: Different numerology across NR PUCCH groups
+    diffNumerologyAcrossPUCCH-Group-CarrierTypes-r16              ENUMERATED {supported}          OPTIONAL,
+    -- R1 22-7b: Different numerologies across NR carriers within the same NR PUCCH group, with PUCCH on a carrier of smaller SCS
+    diffNumerologyWithinPUCCH-GroupSmallerSCS-CarrierTypes-r16    ENUMERATED {supported}          OPTIONAL,
+    -- R1 22-7c: Different numerologies across NR carriers within the same NR PUCCH group, with PUCCH on a carrier of larger SCS
+    diffNumerologyWithinPUCCH-GroupLargerSCS-CarrierTypes-r16     ENUMERATED {supported}          OPTIONAL,
+    -- R1 11-2f: add the replicated FGs of 11-2a/c with restriction for non-aligned span case
+    -- with DL CA with Rel-16 PDCCH monitoring capability on all the serving cells
+    pdcch-MonitoringCA-NonAlignedSpan-r16                         INTEGER (2..16)                 OPTIONAL,
+    -- R1 11-2g: add the replicated FGs of 11-2a/c with restriction for non-aligned span case
+    pdcch-BlindDetectionCA-Mixed-NonAlignedSpan-r16               SEQUENCE {
+        pdcch-BlindDetectionCA1-r16                                   INTEGER (1..15),
+        pdcch-BlindDetectionCA2-r16                                   INTEGER (1..15)
+    }                                                                                             OPTIONAL
+}
+
+SimulSRS-ForAntennaSwitching-r16 ::= SEQUENCE {
+    supportSRS-xTyR-xLessThanY-r16       ENUMERATED {supported}                     OPTIONAL,
+    supportSRS-xTyR-xEqualToY-r16        ENUMERATED {supported}                     OPTIONAL,
+    supportSRS-AntennaSwitching-r16      ENUMERATED {supported}                     OPTIONAL
+}
+
+TwoPUCCH-Grp-Configurations-r16 ::=  SEQUENCE {
+    pucch-PrimaryGroupMapping-r16        TwoPUCCH-Grp-ConfigParams-r16,
+    pucch-SecondaryGroupMapping-r16      TwoPUCCH-Grp-ConfigParams-r16
+}
+
+TwoPUCCH-Grp-ConfigParams-r16 ::=    SEQUENCE {
+    pucch-GroupMapping-r16               PUCCH-Grp-CarrierTypes-r16,
+    pucch-TX-r16                         PUCCH-Grp-CarrierTypes-r16
+}
+
+PUCCH-Grp-CarrierTypes-r16 ::=       SEQUENCE {
+    fr1-NonSharedTDD-r16                 ENUMERATED {supported}                     OPTIONAL,
+    fr1-SharedTDD-r16                    ENUMERATED {supported}                     OPTIONAL,
+    fr1-NonSharedFDD-r16                 ENUMERATED {supported}                     OPTIONAL,
+    fr2-r16                              ENUMERATED {supported}                     OPTIONAL
+}
+
+-- TAG-CA-PARAMETERSNR-STOP
+-- TAG-CA-PARAMETERS-NRDC-START
+
+CA-ParametersNRDC ::=                         SEQUENCE {
+     ca-ParametersNR-ForDC                       CA-ParametersNR                              OPTIONAL,
+     ca-ParametersNR-ForDC-v1540                 CA-ParametersNR-v1540                        OPTIONAL,
+     ca-ParametersNR-ForDC-v1550                 CA-ParametersNR-v1550                        OPTIONAL,
+     ca-ParametersNR-ForDC-v1560                 CA-ParametersNR-v1560                        OPTIONAL,
+     featureSetCombinationDC                     FeatureSetCombinationId                      OPTIONAL
+}
+
+CA-ParametersNRDC-v1610 ::= SEQUENCE {
+    -- R1 18-1: Semi-static power sharing mode1 between MCG and SCG cells of same FR for NR dual connectivity
+    intraFR-NR-DC-PwrSharingMode1-r16        ENUMERATED {supported}         OPTIONAL,
+    -- R1 18-1a: Semi-static power sharing mode 2 between MCG and SCG cells of same FR for NR dual connectivity
+    intraFR-NR-DC-PwrSharingMode2-r16        ENUMERATED {supported}         OPTIONAL,
+    -- R1 18-1b: Dynamic power sharing between MCG and SCG cells of same FR for NR dual connectivity
+    intraFR-NR-DC-DynamicPwrSharing-r16      ENUMERATED {short, long}       OPTIONAL,
+    asyncNRDC-r16                            ENUMERATED {supported}         OPTIONAL
+}
+
+CA-ParametersNRDC-v1630 ::=                         SEQUENCE {
+     ca-ParametersNR-ForDC-v1610                 CA-ParametersNR-v1610                        OPTIONAL,
+     ca-ParametersNR-ForDC-v1630                 CA-ParametersNR-v1630                        OPTIONAL
+}
+
+CA-ParametersNRDC-v1640 ::=                  SEQUENCE {
+    ca-ParametersNR-ForDC-v1640                  CA-ParametersNR-v1640                        OPTIONAL
+}
+
+-- TAG-CA-PARAMETERS-NRDC-STOP
+-- TAG-CARRIERAGGREGATIONVARIANT-START
+
+CarrierAggregationVariant ::=          SEQUENCE {
+    fr1fdd-FR1TDD-CA-SpCellOnFR1FDD         ENUMERATED {supported}                      OPTIONAL,
+    fr1fdd-FR1TDD-CA-SpCellOnFR1TDD         ENUMERATED {supported}                      OPTIONAL,
+    fr1fdd-FR2TDD-CA-SpCellOnFR1FDD         ENUMERATED {supported}                      OPTIONAL,
+    fr1fdd-FR2TDD-CA-SpCellOnFR2TDD         ENUMERATED {supported}                      OPTIONAL,
+    fr1tdd-FR2TDD-CA-SpCellOnFR1TDD         ENUMERATED {supported}                      OPTIONAL,
+    fr1tdd-FR2TDD-CA-SpCellOnFR2TDD         ENUMERATED {supported}                      OPTIONAL,
+    fr1fdd-FR1TDD-FR2TDD-CA-SpCellOnFR1FDD  ENUMERATED {supported}                      OPTIONAL,
+    fr1fdd-FR1TDD-FR2TDD-CA-SpCellOnFR1TDD  ENUMERATED {supported}                      OPTIONAL,
+    fr1fdd-FR1TDD-FR2TDD-CA-SpCellOnFR2TDD  ENUMERATED {supported}                      OPTIONAL
+}
+
+-- TAG-CARRIERAGGREGATIONVARIANT-STOP
+-- TAG-CODEBOOKPARAMETERS-START
+
+CodebookParameters ::=             SEQUENCE {
+    type1                                  SEQUENCE {
+        singlePanel                           SEQUENCE {
+            supportedCSI-RS-ResourceList      SEQUENCE (SIZE (1.. maxNrofCSI-RS-Resources)) OF SupportedCSI-RS-Resource,
+            modes                                  ENUMERATED {mode1, mode1andMode2},
+            maxNumberCSI-RS-PerResourceSet    INTEGER (1..8)
+        },
+        multiPanel                            SEQUENCE {
+            supportedCSI-RS-ResourceList      SEQUENCE (SIZE (1.. maxNrofCSI-RS-Resources)) OF SupportedCSI-RS-Resource,
+            modes                                  ENUMERATED {mode1, mode2, both},
+            nrofPanels                            ENUMERATED {n2, n4},
+            maxNumberCSI-RS-PerResourceSet    INTEGER (1..8)
+        }                                                                                                               OPTIONAL
+    },
+    type2                                  SEQUENCE {
+        supportedCSI-RS-ResourceList        SEQUENCE (SIZE (1.. maxNrofCSI-RS-Resources)) OF SupportedCSI-RS-Resource,
+        parameterLx                           INTEGER (2..4),
+        amplitudeScalingType                 ENUMERATED {wideband, widebandAndSubband},
+        amplitudeSubsetRestriction          ENUMERATED {supported}              OPTIONAL
+    }                                                                                                                   OPTIONAL,
+    type2-PortSelection                  SEQUENCE {
+        supportedCSI-RS-ResourceList        SEQUENCE (SIZE (1.. maxNrofCSI-RS-Resources)) OF SupportedCSI-RS-Resource,
+        parameterLx                           INTEGER (2..4),
+        amplitudeScalingType                 ENUMERATED {wideband, widebandAndSubband}
+    }                                                                                                                   OPTIONAL
+}
+
+CodebookParameters-v1610 ::=        SEQUENCE {
+    supportedCSI-RS-ResourceListAlt-r16  SEQUENCE {
+        type1-SinglePanel-r16                SEQUENCE (SIZE (1..maxNrofCSI-RS-Resources)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)  OPTIONAL,
+        type1-MultiPanel-r16                 SEQUENCE (SIZE (1..maxNrofCSI-RS-Resources)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)  OPTIONAL,
+        type2-r16                            SEQUENCE (SIZE (1..maxNrofCSI-RS-Resources)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)  OPTIONAL,
+        type2-PortSelection-r16              SEQUENCE (SIZE (1..maxNrofCSI-RS-Resources)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)  OPTIONAL
+    }                                                                                                                                       OPTIONAL
+}
+
+CodebookParametersAddition-r16 ::=      SEQUENCE {
+    etype2-r16                             SEQUENCE {
+        -- R1 16-3a Regular eType 2 R=1
+        etype2R1-r16                           SEQUENCE {
+            supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF
+                                                                                              INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+        },
+        -- R1 16-3a-1 Regular eType 2 R=2
+        etype2R2-r16                           SEQUENCE {
+            supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF
+                                                                                              INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+        }                                                                  OPTIONAL,
+        -- R1 16-3a-2: Support of parameter combinations 7-8
+        paramComb7-8-r16                       ENUMERATED {supported}      OPTIONAL,
+        -- R1 16-3a-3: Support of rank 3,4
+        rank3-4-r16                            ENUMERATED {supported}      OPTIONAL,
+        -- R1 16-3a-4: CBSR with soft amplitude restriction
+        amplitudeSubsetRestriction-r16         ENUMERATED {supported}      OPTIONAL
+    }                                                                      OPTIONAL,
+    etype2-PS-r16                          SEQUENCE {
+        -- R1 16-3b Regular eType 2 R=1 PortSelection
+        etype2R1-PortSelection-r16             SEQUENCE {
+            supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF
+                                                                                              INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+        },
+        -- R1 16-3b-1 Regular eType 2 R=2 PortSelection
+        etype2R2-PortSelection-r16             SEQUENCE {
+            supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF
+                                                                                              INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+        }                                                                  OPTIONAL,
+        -- R1 16-3b-2: Support of rank 3,4
+        rank3-4-r16                            ENUMERATED {supported}      OPTIONAL
+    }                                                                      OPTIONAL
+}
+
+CodebookComboParametersAddition-r16 ::= SEQUENCE {
+    -- R1 16-8 Mixed codebook types
+    type1SP-Type2-null-r16                 SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1SP-Type2PS-null-r16               SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1SP-eType2R1-null-r16              SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1SP-eType2R2-null-r16              SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1SP-eType2R1PS-null-r16            SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1SP-eType2R2PS-null-r16            SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1SP-Type2-Type2PS-r16              SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1MP-Type2-null-r16                 SEQUENCE {
+    supportedCSI-RS-ResourceListAdd-r16        SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1MP-Type2PS-null-r16               SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1MP-eType2R1-null-r16              SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1MP-eType2R2-null-r16              SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1MP-eType2R1PS-null-r16            SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1MP-eType2R2PS-null-r16            SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1MP-Type2-Type2PS-r16              SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL
+}
+
+CodebookParametersAdditionPerBC-r16::=  SEQUENCE {
+    -- R1 16-3a Regular eType 2 R=1
+    etype2R1-r16                    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    -- R1 16-3a-1 Regular eType 2 R=2
+    etype2R2-r16                    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                                      OPTIONAL,
+    -- R1 16-3b Regular eType 2 R=1 PortSelection
+    etype2R1-PortSelection-r16      SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    -- R1 16-3b-1 Regular eType 2 R=2 PortSelection
+    etype2R2-PortSelection-r16      SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL
+}
+
+CodebookComboParametersAdditionPerBC-r16::= SEQUENCE {
+    -- R1 16-8 Mixed codebook types
+    type1SP-Type2-null-r16          SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1SP-Type2PS-null-r16        SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1SP-eType2R1-null-r16       SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                              OPTIONAL,
+    type1SP-eType2R2-null-r16       SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1SP-eType2R1PS-null-r16     SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1SP-eType2R2PS-null-r16     SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1SP-Type2-Type2PS-r16       SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1MP-Type2-null-r16          SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1MP-Type2PS-null-r16        SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1MP-eType2R1-null-r16       SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1MP-eType2R2-null-r16       SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1MP-eType2R1PS-null-r16     SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1MP-eType2R2PS-null-r16     SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1MP-Type2-Type2PS-r16       SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL
+}
+
+CodebookVariantsList-r16 ::= SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesAlt-r16)) OF SupportedCSI-RS-Resource
+
+SupportedCSI-RS-Resource ::=     SEQUENCE {
+    maxNumberTxPortsPerResource      ENUMERATED {p2, p4, p8, p12, p16, p24, p32},
+    maxNumberResourcesPerBand        INTEGER (1..64),
+    totalNumberTxPortsPerBand        INTEGER (2..256)
+}
+
+-- TAG-CODEBOOKPARAMETERS-STOP
+-- TAG-FEATURESETCOMBINATION-START
+
+FeatureSetCombination ::=       SEQUENCE (SIZE (1..maxSimultaneousBands)) OF FeatureSetsPerBand
+
+FeatureSetsPerBand ::=          SEQUENCE (SIZE (1..maxFeatureSetsPerBand)) OF FeatureSet
+
+FeatureSet ::=                  CHOICE {
+    eutra                           SEQUENCE {
+        downlinkSetEUTRA                FeatureSetEUTRA-DownlinkId,
+        uplinkSetEUTRA                  FeatureSetEUTRA-UplinkId
+    },
+    nr                              SEQUENCE {
+        downlinkSetNR                   FeatureSetDownlinkId,
+        uplinkSetNR                     FeatureSetUplinkId
+    }
+}
+
+-- TAG-FEATURESETCOMBINATION-STOP
+-- TAG-FEATURESETCOMBINATIONID-START
+
+FeatureSetCombinationId ::=         INTEGER (0.. maxFeatureSetCombinations)
+
+-- TAG-FEATURESETCOMBINATIONID-STOP
+-- TAG-FEATURESETDOWNLINK-START
+
+FeatureSetDownlink ::=                  SEQUENCE {
+    featureSetListPerDownlinkCC             SEQUENCE (SIZE (1..maxNrofServingCells)) OF FeatureSetDownlinkPerCC-Id,
+
+    intraBandFreqSeparationDL               FreqSeparationClass                                                     OPTIONAL,
+    scalingFactor                           ENUMERATED {f0p4, f0p75, f0p8}                                          OPTIONAL,
+    dummy8                                  ENUMERATED {supported}                                                  OPTIONAL,
+    scellWithoutSSB                         ENUMERATED {supported}                                                  OPTIONAL,
+    csi-RS-MeasSCellWithoutSSB              ENUMERATED {supported}                                                  OPTIONAL,
+    dummy1                                  ENUMERATED {supported}                                                  OPTIONAL,
+    type1-3-CSS                             ENUMERATED {supported}                                                  OPTIONAL,
+    pdcch-MonitoringAnyOccasions            ENUMERATED {withoutDCI-Gap, withDCI-Gap}                                OPTIONAL,
+    dummy2                                  ENUMERATED {supported}                                                  OPTIONAL,
+    ue-SpecificUL-DL-Assignment             ENUMERATED {supported}                                                  OPTIONAL,
+    searchSpaceSharingCA-DL                 ENUMERATED {supported}                                                  OPTIONAL,
+    timeDurationForQCL                      SEQUENCE {
+        scs-60kHz                           ENUMERATED {s7, s14, s28}                                               OPTIONAL,
+        scs-120kHz                          ENUMERATED {s14, s28}                                                   OPTIONAL
+    }                                                                                                           OPTIONAL,
+    pdsch-ProcessingType1-DifferentTB-PerSlot SEQUENCE {
+        scs-15kHz                               ENUMERATED {upto2, upto4, upto7}                                    OPTIONAL,
+        scs-30kHz                               ENUMERATED {upto2, upto4, upto7}                                    OPTIONAL,
+        scs-60kHz                               ENUMERATED {upto2, upto4, upto7}                                    OPTIONAL,
+        scs-120kHz                              ENUMERATED {upto2, upto4, upto7}                                    OPTIONAL
+    }                                                                                                           OPTIONAL,
+    dummy3                                  DummyA                                                                  OPTIONAL,
+    dummy4                                  SEQUENCE (SIZE (1.. maxNrofCodebooks)) OF DummyB                        OPTIONAL,
+    dummy5                                  SEQUENCE (SIZE (1.. maxNrofCodebooks)) OF DummyC                        OPTIONAL,
+    dummy6                                  SEQUENCE (SIZE (1.. maxNrofCodebooks)) OF DummyD                        OPTIONAL,
+    dummy7                                  SEQUENCE (SIZE (1.. maxNrofCodebooks)) OF DummyE                        OPTIONAL
+}
+
+FeatureSetDownlink-v1540 ::= SEQUENCE {
+    oneFL-DMRS-TwoAdditionalDMRS-DL         ENUMERATED {supported}                       OPTIONAL,
+    additionalDMRS-DL-Alt                   ENUMERATED {supported}                       OPTIONAL,
+    twoFL-DMRS-TwoAdditionalDMRS-DL         ENUMERATED {supported}                       OPTIONAL,
+    oneFL-DMRS-ThreeAdditionalDMRS-DL       ENUMERATED {supported}                       OPTIONAL,
+    pdcch-MonitoringAnyOccasionsWithSpanGap SEQUENCE {
+        scs-15kHz                               ENUMERATED {set1, set2, set3}                OPTIONAL,
+        scs-30kHz                               ENUMERATED {set1, set2, set3}                OPTIONAL,
+        scs-60kHz                               ENUMERATED {set1, set2, set3}                OPTIONAL,
+        scs-120kHz                              ENUMERATED {set1, set2, set3}                OPTIONAL
+    }                                                                                    OPTIONAL,
+    pdsch-SeparationWithGap                 ENUMERATED {supported}                       OPTIONAL,
+    pdsch-ProcessingType2                   SEQUENCE {
+        scs-15kHz                               ProcessingParameters                         OPTIONAL,
+        scs-30kHz                               ProcessingParameters                         OPTIONAL,
+        scs-60kHz                               ProcessingParameters                         OPTIONAL
+    } OPTIONAL,
+    pdsch-ProcessingType2-Limited           SEQUENCE {
+        differentTB-PerSlot-SCS-30kHz           ENUMERATED {upto1, upto2, upto4, upto7}
+    } OPTIONAL,
+    dl-MCS-TableAlt-DynamicIndication       ENUMERATED {supported}                       OPTIONAL
+}
+
+FeatureSetDownlink-v15a0 ::= SEQUENCE {
+    supportedSRS-Resources              SRS-Resources                                    OPTIONAL
+}
+
+FeatureSetDownlink-v1610 ::=   SEQUENCE {
+    -- R1 22-4e/4f/4g/4h: CBG based reception for DL with unicast PDSCH(s) per slot per CC with UE processing time Capability 1
+    cbgPDSCH-ProcessingType1-DifferentTB-PerSlot-r16   SEQUENCE {
+        scs-15kHz-r16        ENUMERATED {one, upto2, upto4, upto7} OPTIONAL,
+        scs-30kHz-r16        ENUMERATED {one, upto2, upto4, upto7} OPTIONAL,
+        scs-60kHz-r16        ENUMERATED {one, upto2, upto4, upto7} OPTIONAL,
+        scs-120kHz-r16       ENUMERATED {one, upto2, upto4, upto7} OPTIONAL
+    } OPTIONAL,
+
+    -- R1 22-3e/3f/3g/3h: CBG based reception for DL with unicast PDSCH(s) per slot per CC with UE processing time Capability 2
+    cbgPDSCH-ProcessingType2-DifferentTB-PerSlot-r16   SEQUENCE {
+        scs-15kHz-r16        ENUMERATED {one, upto2, upto4, upto7} OPTIONAL,
+        scs-30kHz-r16        ENUMERATED {one, upto2, upto4, upto7} OPTIONAL,
+        scs-60kHz-r16        ENUMERATED {one, upto2, upto4, upto7} OPTIONAL,
+        scs-120kHz-r16       ENUMERATED {one, upto2, upto4, upto7} OPTIONAL
+    } OPTIONAL,
+    intraFreqDAPS-r16                  SEQUENCE {
+        intraFreqDiffSCS-DAPS-r16          ENUMERATED {supported}            OPTIONAL,
+        intraFreqAsyncDAPS-r16             ENUMERATED {supported}            OPTIONAL
+    }                                                                        OPTIONAL,
+    intraBandFreqSeparationDL-v1620    FreqSeparationClassDL-v1620           OPTIONAL,
+    intraBandFreqSeparationDL-Only-r16 FreqSeparationClassDL-Only-r16        OPTIONAL,
+
+    -- R1 11-2: Rel-16 PDCCH monitoring capability
+    pdcch-Monitoring-r16               SEQUENCE {
+        pdsch-ProcessingType1-r16          SEQUENCE {
+            scs-15kHz-r16                      PDCCH-MonitoringOccasions-r16 OPTIONAL,
+            scs-30kHz-r16                      PDCCH-MonitoringOccasions-r16 OPTIONAL
+        }                                                                    OPTIONAL,
+        pdsch-ProcessingType2-r16      SEQUENCE {
+            scs-15kHz-r16                  PDCCH-MonitoringOccasions-r16     OPTIONAL,
+            scs-30kHz-r16                  PDCCH-MonitoringOccasions-r16     OPTIONAL
+        }                                                                    OPTIONAL
+    }                                                                        OPTIONAL,
+
+    -- R1 11-2b: Mix of Rel. 16 PDCCH monitoring capability and Rel. 15 PDCCH monitoring capability on different carriers
+    pdcch-MonitoringMixed-r16          ENUMERATED {supported}                OPTIONAL,
+
+    -- R1 18-5c: Processing up to X unicast DCI scheduling for DL per scheduled CC
+    crossCarrierSchedulingProcessing-DiffSCS-r16  SEQUENCE {
+        scs-15kHz-120kHz-r16               ENUMERATED {n1,n2,n4}             OPTIONAL,
+        scs-15kHz-60kHz-r16                ENUMERATED {n1,n2,n4}             OPTIONAL,
+        scs-30kHz-120kHz-r16               ENUMERATED {n1,n2,n4}             OPTIONAL,
+        scs-15kHz-30kHz-r16                ENUMERATED {n2}                   OPTIONAL,
+        scs-30kHz-60kHz-r16                ENUMERATED {n2}                   OPTIONAL,
+        scs-60kHz-120kHz-r16               ENUMERATED {n2}                   OPTIONAL
+    }                                                                        OPTIONAL,
+
+    -- R1 16-2b-1: Support of single-DCI based SDM scheme
+    singleDCI-SDM-scheme-r16           ENUMERATED {supported}                OPTIONAL
+}
+
+PDCCH-MonitoringOccasions-r16 ::= SEQUENCE {
+    period7span3-r16                  ENUMERATED {supported}                 OPTIONAL,
+    period4span3-r16                  ENUMERATED {supported}                 OPTIONAL,
+    period2span2-r16                  ENUMERATED {supported}                 OPTIONAL
+}
+
+DummyA ::=      SEQUENCE {
+    maxNumberNZP-CSI-RS-PerCC                   INTEGER (1..32),
+    maxNumberPortsAcrossNZP-CSI-RS-PerCC        ENUMERATED {p2, p4, p8, p12, p16, p24, p32, p40, p48, p56, p64, p72, p80,
+                                                            p88, p96, p104, p112, p120, p128, p136, p144, p152, p160, p168,
+                                                            p176, p184, p192, p200, p208, p216, p224, p232, p240, p248, p256},
+    maxNumberCS-IM-PerCC                        ENUMERATED {n1, n2, n4, n8, n16, n32},
+    maxNumberSimultaneousCSI-RS-ActBWP-AllCC    ENUMERATED {n5, n6, n7, n8, n9, n10, n12, n14, n16, n18, n20, n22, n24, n26,
+                                                                n28, n30, n32, n34, n36, n38, n40, n42, n44, n46, n48, n50, n52,
+                                                                n54, n56, n58, n60, n62, n64},
+    totalNumberPortsSimultaneousCSI-RS-ActBWP-AllCC ENUMERATED {p8, p12, p16, p24, p32, p40, p48, p56, p64, p72, p80,
+                                                                p88, p96, p104, p112, p120, p128, p136, p144, p152, p160, p168,
+                                                                p176, p184, p192, p200, p208, p216, p224, p232, p240, p248, p256}
+}
+
+DummyB ::=       SEQUENCE {
+    maxNumberTxPortsPerResource         ENUMERATED {p2, p4, p8, p12, p16, p24, p32},
+    maxNumberResources                  INTEGER (1..64),
+    totalNumberTxPorts                  INTEGER (2..256),
+    supportedCodebookMode               ENUMERATED {mode1, mode1AndMode2},
+    maxNumberCSI-RS-PerResourceSet      INTEGER (1..8)
+}
+
+DummyC ::=        SEQUENCE {
+    maxNumberTxPortsPerResource         ENUMERATED {p8, p16, p32},
+    maxNumberResources                  INTEGER (1..64),
+    totalNumberTxPorts                  INTEGER (2..256),
+    supportedCodebookMode               ENUMERATED {mode1, mode2, both},
+    supportedNumberPanels               ENUMERATED {n2, n4},
+    maxNumberCSI-RS-PerResourceSet      INTEGER (1..8)
+}
+
+DummyD ::=                 SEQUENCE {
+    maxNumberTxPortsPerResource         ENUMERATED {p4, p8, p12, p16, p24, p32},
+    maxNumberResources                  INTEGER (1..64),
+    totalNumberTxPorts                  INTEGER (2..256),
+    parameterLx                         INTEGER (2..4),
+    amplitudeScalingType                ENUMERATED {wideband, widebandAndSubband},
+    amplitudeSubsetRestriction          ENUMERATED {supported}                          OPTIONAL,
+    maxNumberCSI-RS-PerResourceSet      INTEGER (1..8)
+}
+
+DummyE ::=    SEQUENCE {
+    maxNumberTxPortsPerResource         ENUMERATED {p4, p8, p12, p16, p24, p32},
+    maxNumberResources                  INTEGER (1..64),
+    totalNumberTxPorts                  INTEGER (2..256),
+    parameterLx                         INTEGER (2..4),
+    amplitudeScalingType                ENUMERATED {wideband, widebandAndSubband},
+    maxNumberCSI-RS-PerResourceSet      INTEGER (1..8)
+}
+
+-- TAG-FEATURESETDOWNLINK-STOP
+-- TAG-FEATURESETDOWNLINKID-START
+
+FeatureSetDownlinkId ::=            INTEGER (0..maxDownlinkFeatureSets)
+
+-- TAG-FEATURESETDOWNLINKID-STOP
+-- TAG-FEATURESETDOWNLINKPERCC-START
+
+FeatureSetDownlinkPerCC ::=         SEQUENCE {
+    supportedSubcarrierSpacingDL        SubcarrierSpacing,
+    supportedBandwidthDL                SupportedBandwidth,
+    channelBW-90mhz                     ENUMERATED {supported}                                                  OPTIONAL,
+    maxNumberMIMO-LayersPDSCH           MIMO-LayersDL                                                           OPTIONAL,
+    supportedModulationOrderDL          ModulationOrder                                                         OPTIONAL
+}
+
+FeatureSetDownlinkPerCC-v1620 ::=   SEQUENCE {
+    -- R1 16-2a: Mulit-DCI based multi-TRP
+    multiDCI-MultiTRP-r16               MultiDCI-MultiTRP-r16                                                   OPTIONAL,
+    -- R1 16-2b-3: Support of single-DCI based FDMSchemeB
+    supportFDM-SchemeB-r16              ENUMERATED {supported}                                                  OPTIONAL
+}
+
+MultiDCI-MultiTRP-r16 ::=           SEQUENCE {
+    maxNumberCORESET-r16                ENUMERATED {n2, n3, n4, n5},
+    maxNumberCORESETPerPoolIndex-r16    INTEGER (1..3),
+    maxNumberUnicastPDSCH-PerPool-r16   ENUMERATED {n1, n2, n3, n4, n7}
+}
+
+-- TAG-FEATURESETDOWNLINKPERCC-STOP
+-- TAG-FEATURESETDOWNLINKPERCC-ID-START
+
+FeatureSetDownlinkPerCC-Id ::=      INTEGER (1..maxPerCC-FeatureSets)
+
+-- TAG-FEATURESETDOWNLINKPERCC-ID-STOP
+-- TAG-FEATURESETEUTRADOWNLINKID-START
+
+FeatureSetEUTRA-DownlinkId ::=      INTEGER (0..maxEUTRA-DL-FeatureSets)
+
+-- TAG-FEATURESETEUTRADOWNLINKID-STOP
+-- TAG-FEATURESETEUTRAUPLINKID-START
+
+FeatureSetEUTRA-UplinkId ::=                    INTEGER (0..maxEUTRA-UL-FeatureSets)
+
+-- TAG-FEATURESETEUTRAUPLINKID-STOP
+-- TAG-FEATURESETS-START
+
+FeatureSets ::=    SEQUENCE {
+    featureSetsDownlink                 SEQUENCE (SIZE (1..maxDownlinkFeatureSets)) OF FeatureSetDownlink               OPTIONAL,
+    featureSetsDownlinkPerCC            SEQUENCE (SIZE (1..maxPerCC-FeatureSets)) OF FeatureSetDownlinkPerCC            OPTIONAL,
+    featureSetsUplink                   SEQUENCE (SIZE (1..maxUplinkFeatureSets)) OF FeatureSetUplink                   OPTIONAL,
+    featureSetsUplinkPerCC              SEQUENCE (SIZE (1..maxPerCC-FeatureSets)) OF FeatureSetUplinkPerCC              OPTIONAL,
+    ...,
+    [[
+    featureSetsDownlink-v1540           SEQUENCE (SIZE (1..maxDownlinkFeatureSets)) OF FeatureSetDownlink-v1540         OPTIONAL,
+    featureSetsUplink-v1540             SEQUENCE (SIZE (1..maxUplinkFeatureSets)) OF FeatureSetUplink-v1540             OPTIONAL,
+    featureSetsUplinkPerCC-v1540        SEQUENCE (SIZE (1..maxPerCC-FeatureSets)) OF FeatureSetUplinkPerCC-v1540        OPTIONAL
+    ]],
+    [[
+    featureSetsDownlink-v15a0           SEQUENCE (SIZE (1..maxDownlinkFeatureSets)) OF FeatureSetDownlink-v15a0         OPTIONAL
+    ]],
+    [[
+    featureSetsDownlink-v1610           SEQUENCE (SIZE (1..maxDownlinkFeatureSets)) OF FeatureSetDownlink-v1610         OPTIONAL,
+    featureSetsUplink-v1610             SEQUENCE (SIZE (1..maxUplinkFeatureSets)) OF FeatureSetUplink-v1610             OPTIONAL,
+    featureSetDownlinkPerCC-v1620       SEQUENCE (SIZE (1..maxPerCC-FeatureSets)) OF FeatureSetDownlinkPerCC-v1620      OPTIONAL
+    ]],
+    [[
+    featureSetsUplink-v1630             SEQUENCE (SIZE (1..maxUplinkFeatureSets)) OF FeatureSetUplink-v1630             OPTIONAL
+    ]],
+    [[
+    featureSetsUplink-v1640             SEQUENCE (SIZE (1..maxUplinkFeatureSets)) OF FeatureSetUplink-v1640             OPTIONAL
+    ]]
+}
+
+-- TAG-FEATURESETS-STOP
+-- TAG-FEATURESETUPLINK-START
+
+FeatureSetUplink ::=                SEQUENCE {
+    featureSetListPerUplinkCC           SEQUENCE (SIZE (1.. maxNrofServingCells)) OF FeatureSetUplinkPerCC-Id,
+    scalingFactor                       ENUMERATED {f0p4, f0p75, f0p8}                                          OPTIONAL,
+    dummy3                              ENUMERATED {supported}                                                  OPTIONAL,
+    intraBandFreqSeparationUL           FreqSeparationClass                                                     OPTIONAL,
+    searchSpaceSharingCA-UL             ENUMERATED {supported}                                                  OPTIONAL,
+    dummy1                              DummyI                                                                  OPTIONAL,
+    supportedSRS-Resources              SRS-Resources                                                           OPTIONAL,
+    twoPUCCH-Group                      ENUMERATED {supported}                                                  OPTIONAL,
+    dynamicSwitchSUL                    ENUMERATED {supported}                                                  OPTIONAL,
+    simultaneousTxSUL-NonSUL            ENUMERATED {supported}                                                  OPTIONAL,
+    pusch-ProcessingType1-DifferentTB-PerSlot SEQUENCE {
+        scs-15kHz                                 ENUMERATED {upto2, upto4, upto7}                                  OPTIONAL,
+        scs-30kHz                                 ENUMERATED {upto2, upto4, upto7}                                  OPTIONAL,
+        scs-60kHz                                 ENUMERATED {upto2, upto4, upto7}                                  OPTIONAL,
+        scs-120kHz                                ENUMERATED {upto2, upto4, upto7}                                  OPTIONAL
+    }                                                                                                           OPTIONAL,
+    dummy2                               DummyF                                                                 OPTIONAL
+}
+
+FeatureSetUplink-v1540 ::=           SEQUENCE {
+    zeroSlotOffsetAperiodicSRS           ENUMERATED {supported}                     OPTIONAL,
+    pa-PhaseDiscontinuityImpacts         ENUMERATED {supported}                     OPTIONAL,
+    pusch-SeparationWithGap              ENUMERATED {supported}                     OPTIONAL,
+    pusch-ProcessingType2                SEQUENCE {
+        scs-15kHz                            ProcessingParameters                       OPTIONAL,
+        scs-30kHz                            ProcessingParameters                       OPTIONAL,
+        scs-60kHz                            ProcessingParameters                       OPTIONAL
+    }                                                                               OPTIONAL,
+    ul-MCS-TableAlt-DynamicIndication    ENUMERATED {supported}                     OPTIONAL
+}
+
+FeatureSetUplink-v1610 ::=       SEQUENCE {
+    -- R1 11-5: PUsCH repetition Type B
+    pusch-RepetitionTypeB-r16        SEQUENCE {
+        maxNumberPUSCH-Tx-r16            ENUMERATED {n2, n3, n4, n7, n8, n12},
+        hoppingScheme-r16                ENUMERATED {interSlotHopping, interRepetitionHopping, both}
+    }                                                                              OPTIONAL,
+    -- R1 11-7: UL cancelation scheme for self-carrier
+    ul-CancellationSelfCarrier-r16       ENUMERATED {supported}                    OPTIONAL,
+    -- R1 11-7a: UL cancelation scheme for cross-carrier
+    ul-CancellationCrossCarrier-r16      ENUMERATED {supported}                    OPTIONAL,
+    -- R1 16-5c: The maximum number of SRS resources in one SRS resource set with usage set to 'codebook' for Mode 2
+    ul-FullPwrMode2-MaxSRS-ResInSet-r16  ENUMERATED {n1, n2, n4}                   OPTIONAL,
+
+    -- R1 22-4a/4b/4c/4d: CBG based transmission for UL with unicast PUSCH(s) per slot per CC with UE processing time Capability 1
+    cbgPUSCH-ProcessingType1-DifferentTB-PerSlot-r16    SEQUENCE {
+        scs-15kHz-r16        ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL,
+        scs-30kHz-r16        ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL,
+        scs-60kHz-r16        ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL,
+        scs-120kHz-r16       ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL
+     } OPTIONAL,
+
+    -- R1 22-3a/3b/3c/3d: CBG based transmission for UL with unicast PUSCH(s) per slot per CC with UE processing time Capability 2
+    cbgPUSCH-ProcessingType2-DifferentTB-PerSlot-r16    SEQUENCE {
+        scs-15kHz-r16        ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL,
+        scs-30kHz-r16        ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL,
+        scs-60kHz-r16        ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL,
+        scs-120kHz-r16       ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL
+     } OPTIONAL,
+    supportedSRS-PosResources-r16              SRS-AllPosResources-r16             OPTIONAL,
+    intraFreqDAPS-UL-r16                             SEQUENCE {
+        dummy                                            ENUMERATED {supported}    OPTIONAL,
+        intraFreqTwoTAGs-DAPS-r16                        ENUMERATED {supported}    OPTIONAL,
+        dummy1                                           ENUMERATED {supported}    OPTIONAL,
+        dummy2                                           ENUMERATED {supported}    OPTIONAL,
+        dummy3                                           ENUMERATED {short, long}  OPTIONAL
+    }                                                                              OPTIONAL,
+    intraBandFreqSeparationUL-v1620                  FreqSeparationClassUL-v1620   OPTIONAL,
+
+    -- R1 11-3: More than one PUCCH for HARQ-ACK transmission within a slot
+    multiPUCCH-r16                        SEQUENCE {
+        sub-SlotConfig-NCP-r16                ENUMERATED {set1, set2}              OPTIONAL,
+        sub-SlotConfig-ECP-r16                ENUMERATED {set1, set2}              OPTIONAL
+    }                                                                              OPTIONAL,
+    -- R1 11-3c: 2 PUCCH of format 0 or 2 for a single 7*2-symbol subslot based HARQ-ACK codebook
+    twoPUCCH-Type1-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-3d: 2 PUCCH of format 0 or 2 for a single 2*7-symbol subslot based HARQ-ACK codebook
+    twoPUCCH-Type2-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-3e: 1 PUCCH format 0 or 2 and 1 PUCCH format 1, 3 or 4 in the same subslot for a single 2*7-symbol HARQ-ACK codebooks
+    twoPUCCH-Type3-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-3f: 2 PUCCH transmissions in the same subslot for a single 2*7-symbol HARQ-ACK codebooks which are not covered by 11-3d and
+    -- 11-3e
+    twoPUCCH-Type4-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-3g: SR/HARQ-ACK multiplexing once per subslot using a PUCCH (or HARQ-ACK piggybacked on a PUSCH) when SR/HARQ-ACK
+    -- are supposed to be sent with different starting symbols in a subslot
+    mux-SR-HARQ-ACK-r16                   ENUMERATED {supported}                   OPTIONAL,
+    dummy1                                ENUMERATED {supported}                   OPTIONAL,
+    dummy2                                ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-4c: 2 PUCCH of format 0 or 2 for two HARQ-ACK codebooks with one 7*2-symbol sub-slot based HARQ-ACK codebook
+    twoPUCCH-Type5-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-4d: 2 PUCCH of format 0 or 2 in consecutive symbols for two HARQ-ACK codebooks with one 2*7-symbol sub-slot based HARQ-ACK
+    -- codebook
+    twoPUCCH-Type6-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-4e: 2 PUCCH of format 0 or 2 for two subslot based HARQ-ACK codebooks
+    twoPUCCH-Type7-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-4f: 1 PUCCH format 0 or 2 and 1 PUCCH format 1, 3 or 4 in the same subslot for HARQ-ACK codebooks with one 2*7-symbol
+    -- subslot based HARQ-ACK codebook
+    twoPUCCH-Type8-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-4g: 1 PUCCH format 0 or 2 and 1 PUCCH format 1, 3 or 4 in the same subslot for two subslot based HARQ-ACK codebooks
+    twoPUCCH-Type9-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-4h: 2 PUCCH transmissions in the same subslot for two HARQ-ACK codebooks with one 2*7-symbol subslot which are not covered
+    -- by 11-4c and 11-4e
+    twoPUCCH-Type10-r16                   ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-4i: 2 PUCCH transmissions in the same subslot for two subslot based HARQ-ACK codebooks which are not covered by 11-4d and
+    -- 11-4f
+    twoPUCCH-Type11-r16                   ENUMERATED {supported}                   OPTIONAL,
+    -- R1 12-1: UL intra-UE multiplexing/prioritization of overlapping channel/signals with two priority levels in physical layer
+    ul-IntraUE-Mux-r16                    SEQUENCE {
+        pusch-PreparationLowPriority-r16      ENUMERATED {sym0, sym1, sym2},
+        pusch-PreparationHighPriority-r16     ENUMERATED {sym0, sym1, sym2}
+    }                                                                              OPTIONAL,
+    -- R1 16-5a: Supported UL full power transmission mode of fullpower
+    ul-FullPwrMode-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 18-5d: Processing up to X unicast DCI scheduling for UL per scheduled CC
+    crossCarrierSchedulingProcessing-DiffSCS-r16    SEQUENCE {
+        scs-15kHz-120kHz-r16                  ENUMERATED {n1,n2,n4}                OPTIONAL,
+        scs-15kHz-60kHz-r16                   ENUMERATED {n1,n2,n4}                OPTIONAL,
+        scs-30kHz-120kHz-r16                  ENUMERATED {n1,n2,n4}                OPTIONAL,
+        scs-15kHz-30kHz-r16                   ENUMERATED {n2}                      OPTIONAL,
+        scs-30kHz-60kHz-r16                   ENUMERATED {n2}                      OPTIONAL,
+        scs-60kHz-120kHz-r16                  ENUMERATED {n2}                      OPTIONAL
+    }                                                                              OPTIONAL,
+    -- R1 16-5b: Supported UL full power transmission mode of fullpowerMode1
+    ul-FullPwrMode1-r16                   ENUMERATED {supported}                   OPTIONAL,
+    -- R1 16-5c-2: Ports configuration for Mode 2
+    ul-FullPwrMode2-SRSConfig-diffNumSRSPorts-r16  ENUMERATED {p1-2, p1-4, p1-2-4} OPTIONAL,
+    -- R1 16-5c-3: TPMI group for Mode 2
+    ul-FullPwrMode2-TPMIGroup-r16         SEQUENCE {
+        twoPorts-r16                          BIT STRING(SIZE(2))                      OPTIONAL,
+        fourPortsNonCoherent-r16              ENUMERATED{g0, g1, g2, g3}               OPTIONAL,
+        fourPortsPartialCoherent-r16          ENUMERATED{g0, g1, g2, g3, g4, g5, g6}   OPTIONAL
+    }                                                                                  OPTIONAL
+}
+
+FeatureSetUplink-v1630 ::=       SEQUENCE {
+    -- R1 22-8: For SRS for CB PUSCH and antenna switching on FR1 with symbol level offset for aperiodic SRS transmission
+    offsetSRS-CB-PUSCH-Ant-Switch-fr1-r16                       ENUMERATED {supported}                   OPTIONAL,
+    -- R1 22-8a: PDCCH monitoring on any span of up to 3 consecutive OFDM symbols of a slot and constrained timeline for SRS for CB
+    -- PUSCH and antenna switching on FR1
+    offsetSRS-CB-PUSCH-PDCCH-MonitorSingleOcc-fr1-r16           ENUMERATED {supported}                   OPTIONAL,
+    -- R1 22-8b: For type 1 CSS with dedicated RRC configuration, type 3 CSS, and UE-SS, monitoring occasion can be any OFDM symbol(s)
+    -- of a slot for Case 2 and constrained timeline for SRS for CB PUSCH and antenna switching on FR1
+    offsetSRS-CB-PUSCH-PDCCH-MonitorAnyOccWithoutGap-fr1-r16    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 22-8c: For type 1 CSS with dedicated RRC configuration, type 3 CSS, and UE-SS, monitoring occasion can be any OFDM symbol(s)
+    -- of a slot for Case 2 with a DCI gap and constrained timeline for SRS for CB PUSCH and antenna switching on FR1
+    offsetSRS-CB-PUSCH-PDCCH-MonitorAnyOccWithGap-fr1-r16       ENUMERATED {supported}                   OPTIONAL,
+    dummy                                                       ENUMERATED {supported}                   OPTIONAL,
+    -- R1 22-9: Cancellation of PUCCH, PUSCH or PRACH with a DCI scheduling a PDSCH or CSI-RS or a DCI format 2_0 for SFI
+    partialCancellationPUCCH-PUSCH-PRACH-TX-r16                 ENUMERATED {supported}                   OPTIONAL
+}
+
+FeatureSetUplink-v1640 ::=              SEQUENCE {
+   -- R1 11-4: Two HARQ-ACK codebooks with up to one sub-slot based HARQ-ACK codebook (i.e. slot-based + slot-based, or slot-based +
+    -- sub-slot based) simultaneously constructed for supporting HARQ-ACK codebooks with different priorities at a UE
+    twoHARQ-ACK-Codebook-type1-r16          SubSlot-Config-r16      OPTIONAL,
+    -- R1 11-4a: Two sub-slot based HARQ-ACK codebooks simultaneously constructed for supporting HARQ-ACK codebooks with different
+    -- priorities at a UE
+    twoHARQ-ACK-Codebook-type2-r16          SubSlot-Config-r16      OPTIONAL,
+    -- R1 22-8d: All PDCCH monitoring occasion can be any OFDM symbol(s) of a slot for Case 2 with a span gap and constrained timeline
+    -- for SRS for CB PUSCH and antenna switching on FR1
+    offsetSRS-CB-PUSCH-PDCCH-MonitorAnyOccWithSpanGap-fr1-r16 SEQUENCE {
+        scs-15kHz-r16                                 ENUMERATED {set1, set2, set3}                             OPTIONAL,
+        scs-30kHz-r16                                 ENUMERATED {set1, set2, set3}                             OPTIONAL,
+        scs-60kHz-r16                                 ENUMERATED {set1, set2, set3}                             OPTIONAL
+    }                                                                                                           OPTIONAL
+}
+
+SubSlot-Config-r16 ::=                  SEQUENCE {
+    sub-SlotConfig-NCP-r16                  ENUMERATED {n4,n5,n6,n7}              OPTIONAL,
+    sub-SlotConfig-ECP-r16                  ENUMERATED {n4,n5,n6}                 OPTIONAL
+}
+
+SRS-AllPosResources-r16 ::=               SEQUENCE {
+    srs-PosResources-r16                      SRS-PosResources-r16,
+    srs-PosResourceAP-r16                     SRS-PosResourceAP-r16                OPTIONAL,
+    srs-PosResourceSP-r16                     SRS-PosResourceSP-r16                OPTIONAL
+}
+
+SRS-PosResources-r16 ::=                       SEQUENCE {
+    maxNumberSRS-PosResourceSetPerBWP-r16                ENUMERATED {n1, n2, n4, n8, n12, n16},
+    maxNumberSRS-PosResourcesPerBWP-r16                  ENUMERATED {n1, n2, n4, n8, n16, n32, n64},
+    maxNumberSRS-ResourcesPerBWP-PerSlot-r16             ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10, n12, n14},
+    maxNumberPeriodicSRS-PosResourcesPerBWP-r16          ENUMERATED {n1, n2, n4, n8, n16, n32, n64},
+    maxNumberPeriodicSRS-PosResourcesPerBWP-PerSlot-r16  ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10, n12, n14}
+}
+
+SRS-PosResourceAP-r16 ::=                SEQUENCE {
+    maxNumberAP-SRS-PosResourcesPerBWP-r16         ENUMERATED {n1, n2, n4, n8, n16, n32, n64},
+    maxNumberAP-SRS-PosResourcesPerBWP-PerSlot-r16 ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10, n12, n14}
+}
+
+SRS-PosResourceSP-r16 ::=                       SEQUENCE {
+    maxNumberSP-SRS-PosResourcesPerBWP-r16               ENUMERATED {n1, n2, n4, n8, n16, n32, n64},
+    maxNumberSP-SRS-PosResourcesPerBWP-PerSlot-r16       ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10, n12, n14}
+}
+
+SRS-Resources ::=                           SEQUENCE {
+    maxNumberAperiodicSRS-PerBWP                ENUMERATED {n1, n2, n4, n8, n16},
+    maxNumberAperiodicSRS-PerBWP-PerSlot        INTEGER (1..6),
+    maxNumberPeriodicSRS-PerBWP                 ENUMERATED {n1, n2, n4, n8, n16},
+    maxNumberPeriodicSRS-PerBWP-PerSlot         INTEGER (1..6),
+    maxNumberSemiPersistentSRS-PerBWP           ENUMERATED {n1, n2, n4, n8, n16},
+    maxNumberSemiPersistentSRS-PerBWP-PerSlot   INTEGER (1..6),
+    maxNumberSRS-Ports-PerResource              ENUMERATED {n1, n2, n4}
+}
+
+DummyF ::=                                  SEQUENCE {
+    maxNumberPeriodicCSI-ReportPerBWP           INTEGER (1..4),
+    maxNumberAperiodicCSI-ReportPerBWP          INTEGER (1..4),
+    maxNumberSemiPersistentCSI-ReportPerBWP     INTEGER (0..4),
+    simultaneousCSI-ReportsAllCC                INTEGER (5..32)
+}
+
+-- TAG-FEATURESETUPLINK-STOP
+-- TAG-FEATURESETUPLINKID-START
+
+FeatureSetUplinkId ::=                  INTEGER (0..maxUplinkFeatureSets)
+
+-- TAG-FEATURESETUPLINKID-STOP
+-- TAG-FEATURESETUPLINKPERCC-START
+
+FeatureSetUplinkPerCC ::=               SEQUENCE {
+    supportedSubcarrierSpacingUL            SubcarrierSpacing,
+    supportedBandwidthUL                    SupportedBandwidth,
+    channelBW-90mhz                         ENUMERATED {supported}                      OPTIONAL,
+    mimo-CB-PUSCH                           SEQUENCE {
+        maxNumberMIMO-LayersCB-PUSCH            MIMO-LayersUL                               OPTIONAL,
+        maxNumberSRS-ResourcePerSet             INTEGER (1..2)
+    }                                                                                   OPTIONAL,
+    maxNumberMIMO-LayersNonCB-PUSCH         MIMO-LayersUL                               OPTIONAL,
+    supportedModulationOrderUL              ModulationOrder                             OPTIONAL
+}
+FeatureSetUplinkPerCC-v1540 ::=       SEQUENCE {
+    mimo-NonCB-PUSCH                      SEQUENCE {
+        maxNumberSRS-ResourcePerSet           INTEGER (1..4),
+        maxNumberSimultaneousSRS-ResourceTx   INTEGER (1..4)
+    } OPTIONAL
+}
+
+-- TAG-FEATURESETUPLINKPERCC-STOP
+-- TAG-FEATURESETUPLINKPERCC-ID-START
+
+FeatureSetUplinkPerCC-Id ::=            INTEGER (1..maxPerCC-FeatureSets)
+
+-- TAG-FEATURESETUPLINKPERCC-ID-STOP
+-- TAG-FREQBANDINDICATOREUTRA-START
+
+FreqBandIndicatorEUTRA ::=  INTEGER (1..maxBandsEUTRA)
+
+-- TAG-FREQBANDINDICATOREUTRA-STOP
+-- TAG-FREQBANDLIST-START
+
+FreqBandList ::=                SEQUENCE (SIZE (1..maxBandsMRDC)) OF FreqBandInformation
+
+FreqBandInformation ::=         CHOICE {
+    bandInformationEUTRA            FreqBandInformationEUTRA,
+    bandInformationNR               FreqBandInformationNR
+}
+
+FreqBandInformationEUTRA ::=    SEQUENCE {
+    bandEUTRA                       FreqBandIndicatorEUTRA,
+    ca-BandwidthClassDL-EUTRA       CA-BandwidthClassEUTRA                  OPTIONAL,   -- Need N
+    ca-BandwidthClassUL-EUTRA       CA-BandwidthClassEUTRA                  OPTIONAL    -- Need N
+}
+
+FreqBandInformationNR ::=       SEQUENCE {
+    bandNR                          FreqBandIndicatorNR,
+    maxBandwidthRequestedDL         AggregatedBandwidth                     OPTIONAL,   -- Need N
+    maxBandwidthRequestedUL         AggregatedBandwidth                     OPTIONAL,   -- Need N
+    maxCarriersRequestedDL          INTEGER (1..maxNrofServingCells)        OPTIONAL,   -- Need N
+    maxCarriersRequestedUL          INTEGER (1..maxNrofServingCells)        OPTIONAL    -- Need N
+}
+
+AggregatedBandwidth ::=         ENUMERATED {mhz50, mhz100, mhz150, mhz200, mhz250, mhz300, mhz350,
+                                            mhz400, mhz450, mhz500, mhz550, mhz600, mhz650, mhz700, mhz750, mhz800}
+
+-- TAG-FREQBANDLIST-STOP
+-- TAG-FREQSEPARATIONCLASS-START
+
+FreqSeparationClass ::= ENUMERATED { mhz800, mhz1200, mhz1400, ...}
+
+FreqSeparationClassDL-v1620 ::= ENUMERATED {mhz1000, mhz1600, mhz1800, mhz2000, mhz2200, mhz2400}
+
+FreqSeparationClassUL-v1620 ::= ENUMERATED {mhz1000}
+
+-- TAG-FREQSEPARATIONCLASS-STOP
+-- TAG-FREQSEPARATIONCLASSDL-Only-START
+
+FreqSeparationClassDL-Only-r16 ::= ENUMERATED {mhz200, mhz400, mhz600, mhz800, mhz1000, mhz1200}
+
+-- TAG-FREQSEPARATIONCLASSDL-Only-STOP
+-- TAG-HIGHSPEEDPARAMETERS-START
+
+HighSpeedParameters-r16 ::= SEQUENCE {
+    measurementEnhancement-r16       ENUMERATED {supported}   OPTIONAL,
+    demodulationEnhancement-r16      ENUMERATED {supported}   OPTIONAL
+}
+
+-- TAG-HIGHSPEEDPARAMETERS-STOP
+-- TAG-IMS-PARAMETERS-START
+
+IMS-Parameters ::=         SEQUENCE {
+    ims-ParametersCommon       IMS-ParametersCommon                  OPTIONAL,
+    ims-ParametersFRX-Diff     IMS-ParametersFRX-Diff                OPTIONAL,
+    ...
+}
+
+IMS-ParametersCommon ::=   SEQUENCE {
+    voiceOverEUTRA-5GC                  ENUMERATED {supported}                OPTIONAL,
+    ...,
+    [[
+    voiceOverSCG-BearerEUTRA-5GC        ENUMERATED {supported}                OPTIONAL
+    ]],
+    [[
+    voiceFallbackIndicationEPS-r16         ENUMERATED {supported}                    OPTIONAL
+    ]]
+}
+
+IMS-ParametersFRX-Diff ::= SEQUENCE {
+    voiceOverNR                ENUMERATED {supported}                OPTIONAL,
+    ...
+}
+
+-- TAG-IMS-PARAMETERS-STOP
+-- TAG-INTERRAT-PARAMETERS-START
+
+InterRAT-Parameters ::=             SEQUENCE {
+    eutra                               EUTRA-Parameters                OPTIONAL,
+    ...,
+    [[
+    utra-FDD-r16                        UTRA-FDD-Parameters-r16         OPTIONAL
+    ]]
+
+}
+
+EUTRA-Parameters ::=                SEQUENCE {
+    supportedBandListEUTRA          SEQUENCE (SIZE (1..maxBandsEUTRA)) OF FreqBandIndicatorEUTRA,
+    eutra-ParametersCommon              EUTRA-ParametersCommon                                      OPTIONAL,
+    eutra-ParametersXDD-Diff            EUTRA-ParametersXDD-Diff                                    OPTIONAL,
+    ...
+}
+
+EUTRA-ParametersCommon ::=      SEQUENCE {
+    mfbi-EUTRA                          ENUMERATED {supported}          OPTIONAL,
+    modifiedMPR-BehaviorEUTRA           BIT STRING (SIZE (32))          OPTIONAL,
+    multiNS-Pmax-EUTRA                  ENUMERATED {supported}          OPTIONAL,
+    rs-SINR-MeasEUTRA                   ENUMERATED {supported}          OPTIONAL,
+    ...,
+    [[
+    ne-DC                               ENUMERATED {supported}          OPTIONAL
+    ]],
+    [[
+    nr-HO-ToEN-DC-r16                   ENUMERATED {supported}          OPTIONAL
+    ]]
+}
+
+EUTRA-ParametersXDD-Diff ::=        SEQUENCE {
+    rsrqMeasWidebandEUTRA               ENUMERATED {supported}          OPTIONAL,
+    ...
+}
+
+UTRA-FDD-Parameters-r16 ::=                SEQUENCE {
+    supportedBandListUTRA-FDD-r16              SEQUENCE (SIZE (1..maxBandsUTRA-FDD-r16)) OF SupportedBandUTRA-FDD-r16,
+    ...
+}
+
+SupportedBandUTRA-FDD-r16 ::=           ENUMERATED {
+                                            bandI, bandII, bandIII, bandIV, bandV, bandVI,
+                                            bandVII, bandVIII, bandIX, bandX, bandXI,
+                                            bandXII, bandXIII, bandXIV, bandXV, bandXVI,
+                                            bandXVII, bandXVIII, bandXIX, bandXX,
+                                            bandXXI, bandXXII, bandXXIII, bandXXIV,
+                                            bandXXV, bandXXVI, bandXXVII, bandXXVIII,
+                                            bandXXIX, bandXXX, bandXXXI, bandXXXII}
+
+-- TAG-INTERRAT-PARAMETERS-STOP
+-- TAG-MAC-PARAMETERS-START
+
+MAC-Parameters ::= SEQUENCE {
+    mac-ParametersCommon            MAC-ParametersCommon        OPTIONAL,
+    mac-ParametersXDD-Diff          MAC-ParametersXDD-Diff      OPTIONAL
+}
+
+MAC-Parameters-v1610 ::= SEQUENCE {
+    mac-ParametersFRX-Diff-r16      MAC-ParametersFRX-Diff-r16  OPTIONAL
+}
+
+MAC-ParametersCommon ::=    SEQUENCE {
+    lcp-Restriction                         ENUMERATED {supported}      OPTIONAL,
+    dummy                                   ENUMERATED {supported}      OPTIONAL,
+    lch-ToSCellRestriction                  ENUMERATED {supported}      OPTIONAL,
+    ...,
+    [[
+    recommendedBitRate                      ENUMERATED {supported}      OPTIONAL,
+    recommendedBitRateQuery                 ENUMERATED {supported}      OPTIONAL
+    ]],
+    [[
+    recommendedBitRateMultiplier-r16         ENUMERATED {supported}     OPTIONAL,
+    preEmptiveBSR-r16                        ENUMERATED {supported}     OPTIONAL,
+    autonomousTransmission-r16               ENUMERATED {supported}     OPTIONAL,
+    lch-PriorityBasedPrioritization-r16      ENUMERATED {supported}     OPTIONAL,
+    lch-ToConfiguredGrantMapping-r16         ENUMERATED {supported}     OPTIONAL,
+    lch-ToGrantPriorityRestriction-r16       ENUMERATED {supported}     OPTIONAL,
+    singlePHR-P-r16                          ENUMERATED {supported}     OPTIONAL,
+    ul-LBT-FailureDetectionRecovery-r16      ENUMERATED {supported}     OPTIONAL,
+    -- R4 8-1: MPE
+    tdd-MPE-P-MPR-Reporting-r16              ENUMERATED {supported}     OPTIONAL,
+    lcid-ExtensionIAB-r16                    ENUMERATED {supported}     OPTIONAL
+    ]],
+    [[
+    spCell-BFR-CBRA-r16                      ENUMERATED {supported}     OPTIONAL
+    ]]
+}
+
+MAC-ParametersFRX-Diff-r16 ::=  SEQUENCE {
+    directMCG-SCellActivation-r16           ENUMERATED {supported}      OPTIONAL,
+    directMCG-SCellActivationResume-r16     ENUMERATED {supported}      OPTIONAL,
+    directSCG-SCellActivation-r16           ENUMERATED {supported}      OPTIONAL,
+    directSCG-SCellActivationResume-r16     ENUMERATED {supported}      OPTIONAL,
+    -- R1 19-1: DRX Adaptation
+    drx-Adaptation-r16          SEQUENCE {
+        non-SharedSpectrumChAccess-r16      MinTimeGap-r16              OPTIONAL,
+        sharedSpectrumChAccess-r16          MinTimeGap-r16              OPTIONAL
+    }                                                                   OPTIONAL,
+    ...
+}
+
+MAC-ParametersXDD-Diff ::=  SEQUENCE {
+    skipUplinkTxDynamic                     ENUMERATED {supported}     OPTIONAL,
+    logicalChannelSR-DelayTimer             ENUMERATED {supported}     OPTIONAL,
+    longDRX-Cycle                           ENUMERATED {supported}     OPTIONAL,
+    shortDRX-Cycle                          ENUMERATED {supported}     OPTIONAL,
+    multipleSR-Configurations               ENUMERATED {supported}     OPTIONAL,
+    multipleConfiguredGrants                ENUMERATED {supported}     OPTIONAL,
+    ...,
+    [[
+    secondaryDRX-Group-r16                  ENUMERATED {supported}     OPTIONAL
+    ]],
+    [[
+    enhancedSkipUplinkTxDynamic-r16         ENUMERATED {supported}     OPTIONAL,
+    enhancedSkipUplinkTxConfigured-r16      ENUMERATED {supported}     OPTIONAL
+    ]]
+}
+
+MinTimeGap-r16 ::=    SEQUENCE {
+    scs-15kHz-r16                         ENUMERATED {sl1, sl3}        OPTIONAL,
+    scs-30kHz-r16                         ENUMERATED {sl1, sl6}        OPTIONAL,
+    scs-60kHz-r16                         ENUMERATED {sl1, sl12}       OPTIONAL,
+    scs-120kHz-r16                        ENUMERATED {sl2, sl24}       OPTIONAL
+}
+
+-- TAG-MAC-PARAMETERS-STOP
+-- TAG-MEASANDMOBPARAMETERS-START
+
+MeasAndMobParameters ::=                    SEQUENCE {
+    measAndMobParametersCommon              MeasAndMobParametersCommon              OPTIONAL,
+    measAndMobParametersXDD-Diff                MeasAndMobParametersXDD-Diff        OPTIONAL,
+    measAndMobParametersFRX-Diff                MeasAndMobParametersFRX-Diff        OPTIONAL
+}
+
+MeasAndMobParametersCommon ::=          SEQUENCE {
+    supportedGapPattern                     BIT STRING (SIZE (22))                  OPTIONAL,
+    ssb-RLM                                 ENUMERATED {supported}                  OPTIONAL,
+    ssb-AndCSI-RS-RLM                       ENUMERATED {supported}                  OPTIONAL,
+    ...,
+    [[
+    eventB-MeasAndReport                    ENUMERATED {supported}                  OPTIONAL,
+    handoverFDD-TDD                         ENUMERATED {supported}                  OPTIONAL,
+    eutra-CGI-Reporting                     ENUMERATED {supported}                  OPTIONAL,
+    nr-CGI-Reporting                        ENUMERATED {supported}                  OPTIONAL
+    ]],
+    [[
+    independentGapConfig                    ENUMERATED {supported}                  OPTIONAL,
+    periodicEUTRA-MeasAndReport             ENUMERATED {supported}                  OPTIONAL,
+    handoverFR1-FR2                         ENUMERATED {supported}                  OPTIONAL,
+    maxNumberCSI-RS-RRM-RS-SINR             ENUMERATED {n4, n8, n16, n32, n64, n96} OPTIONAL
+    ]],
+    [[
+    nr-CGI-Reporting-ENDC                   ENUMERATED {supported}                  OPTIONAL
+    ]],
+    [[
+    eutra-CGI-Reporting-NEDC                ENUMERATED {supported}                  OPTIONAL,
+    eutra-CGI-Reporting-NRDC                ENUMERATED {supported}                  OPTIONAL,
+    nr-CGI-Reporting-NEDC                   ENUMERATED {supported}                  OPTIONAL,
+    nr-CGI-Reporting-NRDC                   ENUMERATED {supported}                  OPTIONAL
+    ]],
+    [[
+    reportAddNeighMeasForPeriodic-r16       ENUMERATED {supported}                  OPTIONAL,
+    condHandoverParametersCommon-r16        SEQUENCE {
+       condHandoverFDD-TDD-r16                  ENUMERATED {supported}              OPTIONAL,
+       condHandoverFR1-FR2-r16                  ENUMERATED {supported}              OPTIONAL
+    }                                                                               OPTIONAL,
+    nr-NeedForGap-Reporting-r16             ENUMERATED {supported}                  OPTIONAL,
+    supportedGapPattern-NRonly-r16          BIT STRING (SIZE (10))                  OPTIONAL,
+    supportedGapPattern-NRonly-NEDC-r16     ENUMERATED {supported}                  OPTIONAL,
+    maxNumberCLI-RSSI-r16                   ENUMERATED {n8, n16, n32, n64}          OPTIONAL,
+    maxNumberCLI-SRS-RSRP-r16               ENUMERATED {n4, n8, n16, n32}           OPTIONAL,
+    maxNumberPerSlotCLI-SRS-RSRP-r16        ENUMERATED {n2, n4, n8}                 OPTIONAL,
+    mfbi-IAB-r16                            ENUMERATED {supported}                  OPTIONAL,
+    dummy                                   ENUMERATED {supported}                  OPTIONAL,
+    nr-CGI-Reporting-NPN-r16                ENUMERATED {supported}                  OPTIONAL,
+    idleInactiveEUTRA-MeasReport-r16        ENUMERATED {supported}                  OPTIONAL,
+    idleInactive-ValidityArea-r16           ENUMERATED {supported}                  OPTIONAL,
+    eutra-AutonomousGaps-r16                ENUMERATED {supported}                  OPTIONAL,
+    eutra-AutonomousGaps-NEDC-r16           ENUMERATED {supported}                  OPTIONAL,
+    eutra-AutonomousGaps-NRDC-r16           ENUMERATED {supported}                  OPTIONAL,
+    pcellT312-r16                           ENUMERATED {supported}                  OPTIONAL,
+    supportedGapPattern-r16                 BIT STRING (SIZE (2))                   OPTIONAL
+    ]]
+}
+
+MeasAndMobParametersXDD-Diff ::=        SEQUENCE {
+    intraAndInterF-MeasAndReport            ENUMERATED {supported}                  OPTIONAL,
+    eventA-MeasAndReport                    ENUMERATED {supported}                  OPTIONAL,
+    ...,
+    [[
+    handoverInterF                          ENUMERATED {supported}                  OPTIONAL,
+    handoverLTE-EPC                         ENUMERATED {supported}                  OPTIONAL,
+    handoverLTE-5GC                         ENUMERATED {supported}                  OPTIONAL
+    ]],
+    [[
+    sftd-MeasNR-Neigh                       ENUMERATED {supported}                  OPTIONAL,
+    sftd-MeasNR-Neigh-DRX                   ENUMERATED {supported}                  OPTIONAL
+    ]],
+    [[
+    dummy                                   ENUMERATED {supported}                  OPTIONAL
+    ]]
+}
+
+MeasAndMobParametersFRX-Diff ::=            SEQUENCE {
+    ss-SINR-Meas                                ENUMERATED {supported}              OPTIONAL,
+    csi-RSRP-AndRSRQ-MeasWithSSB                ENUMERATED {supported}              OPTIONAL,
+    csi-RSRP-AndRSRQ-MeasWithoutSSB             ENUMERATED {supported}              OPTIONAL,
+    csi-SINR-Meas                               ENUMERATED {supported}              OPTIONAL,
+    csi-RS-RLM                                  ENUMERATED {supported}              OPTIONAL,
+    ...,
+    [[
+    handoverInterF                              ENUMERATED {supported}              OPTIONAL,
+    handoverLTE-EPC                             ENUMERATED {supported}              OPTIONAL,
+    handoverLTE-5GC                             ENUMERATED {supported}              OPTIONAL
+    ]],
+    [[
+    maxNumberResource-CSI-RS-RLM                ENUMERATED {n2, n4, n6, n8}         OPTIONAL
+    ]],
+    [[
+    simultaneousRxDataSSB-DiffNumerology        ENUMERATED {supported}              OPTIONAL
+    ]],
+    [[
+    nr-AutonomousGaps-r16                       ENUMERATED {supported}              OPTIONAL,
+    nr-AutonomousGaps-ENDC-r16                  ENUMERATED {supported}              OPTIONAL,
+    nr-AutonomousGaps-NEDC-r16                  ENUMERATED {supported}              OPTIONAL,
+    nr-AutonomousGaps-NRDC-r16                  ENUMERATED {supported}              OPTIONAL,
+    dummy                                       ENUMERATED {supported}              OPTIONAL,
+    cli-RSSI-Meas-r16                           ENUMERATED {supported}              OPTIONAL,
+    cli-SRS-RSRP-Meas-r16                       ENUMERATED {supported}              OPTIONAL,
+    interFrequencyMeas-NoGap-r16                ENUMERATED {supported}              OPTIONAL,
+    simultaneousRxDataSSB-DiffNumerology-Inter-r16  ENUMERATED {supported}          OPTIONAL,
+    idleInactiveNR-MeasReport-r16               ENUMERATED {supported}              OPTIONAL,
+    -- R4 6-2: Support of beam level Early Measurement Reporting
+    idleInactiveNR-MeasBeamReport-r16           ENUMERATED {supported}              OPTIONAL
+    ]],
+    [[
+    increasedNumberofCSIRSPerMO-r16             ENUMERATED {supported}              OPTIONAL
+    ]]
+}
+
+-- TAG-MEASANDMOBPARAMETERS-STOP
+-- TAG-MEASANDMOBPARAMETERSMRDC-START
+
+MeasAndMobParametersMRDC ::=            SEQUENCE {
+    measAndMobParametersMRDC-Common         MeasAndMobParametersMRDC-Common                 OPTIONAL,
+    measAndMobParametersMRDC-XDD-Diff       MeasAndMobParametersMRDC-XDD-Diff               OPTIONAL,
+    measAndMobParametersMRDC-FRX-Diff       MeasAndMobParametersMRDC-FRX-Diff               OPTIONAL
+}
+
+MeasAndMobParametersMRDC-v1560 ::=      SEQUENCE {
+    measAndMobParametersMRDC-XDD-Diff-v1560    MeasAndMobParametersMRDC-XDD-Diff-v1560      OPTIONAL
+}
+
+MeasAndMobParametersMRDC-v1610 ::=      SEQUENCE {
+    measAndMobParametersMRDC-Common-v1610      MeasAndMobParametersMRDC-Common-v1610        OPTIONAL,
+    interNR-MeasEUTRA-IAB-r16                  ENUMERATED {supported}                       OPTIONAL
+}
+
+MeasAndMobParametersMRDC-Common ::=     SEQUENCE {
+    independentGapConfig                    ENUMERATED {supported}                          OPTIONAL
+}
+
+MeasAndMobParametersMRDC-Common-v1610 ::=   SEQUENCE {
+    condPSCellChangeParametersCommon-r16        SEQUENCE {
+        condPSCellChangeFDD-TDD-r16                 ENUMERATED {supported}                  OPTIONAL,
+        condPSCellChangeFR1-FR2-r16                 ENUMERATED {supported}                  OPTIONAL
+    }                                                                                       OPTIONAL,
+    pscellT312-r16                              ENUMERATED {supported}                      OPTIONAL
+}
+
+MeasAndMobParametersMRDC-XDD-Diff ::=   SEQUENCE {
+    sftd-MeasPSCell                         ENUMERATED {supported}                          OPTIONAL,
+    sftd-MeasNR-Cell                        ENUMERATED {supported}                          OPTIONAL
+}
+
+MeasAndMobParametersMRDC-XDD-Diff-v1560 ::=    SEQUENCE {
+    sftd-MeasPSCell-NEDC                           ENUMERATED {supported}                   OPTIONAL
+}
+
+MeasAndMobParametersMRDC-FRX-Diff ::=          SEQUENCE {
+    simultaneousRxDataSSB-DiffNumerology           ENUMERATED {supported}                   OPTIONAL
+}
+
+-- TAG-MEASANDMOBPARAMETERSMRDC-STOP
+-- TAG-MIMO-LAYERS-START
+
+MIMO-LayersDL ::=   ENUMERATED {twoLayers, fourLayers, eightLayers}
+
+MIMO-LayersUL ::=   ENUMERATED {oneLayer, twoLayers, fourLayers}
+
+-- TAG-MIMO-LAYERS-STOP
+-- TAG-MIMO-PARAMETERSPERBAND-START
+
+MIMO-ParametersPerBand ::=          SEQUENCE {
+    tci-StatePDSCH                      SEQUENCE {
+        maxNumberConfiguredTCIstatesPerCC   ENUMERATED {n4, n8, n16, n32, n64, n128}                                   OPTIONAL,
+        maxNumberActiveTCI-PerBWP           ENUMERATED {n1, n2, n4, n8}                                                OPTIONAL
+    }                                                                                                              OPTIONAL,
+    additionalActiveTCI-StatePDCCH              ENUMERATED {supported}                                             OPTIONAL,
+    pusch-TransCoherence                        ENUMERATED {nonCoherent, partialCoherent, fullCoherent}            OPTIONAL,
+    beamCorrespondenceWithoutUL-BeamSweeping    ENUMERATED {supported}                                             OPTIONAL,
+    periodicBeamReport                          ENUMERATED {supported}                                             OPTIONAL,
+    aperiodicBeamReport                         ENUMERATED {supported}                                             OPTIONAL,
+    sp-BeamReportPUCCH                          ENUMERATED {supported}                                             OPTIONAL,
+    sp-BeamReportPUSCH                          ENUMERATED {supported}                                             OPTIONAL,
+    dummy1                                      DummyG                                                             OPTIONAL,
+    maxNumberRxBeam                             INTEGER (2..8)                                                     OPTIONAL,
+    maxNumberRxTxBeamSwitchDL                   SEQUENCE {
+        scs-15kHz                                   ENUMERATED {n4, n7, n14}                                           OPTIONAL,
+        scs-30kHz                                   ENUMERATED {n4, n7, n14}                                           OPTIONAL,
+        scs-60kHz                                   ENUMERATED {n4, n7, n14}                                           OPTIONAL,
+        scs-120kHz                                  ENUMERATED {n4, n7, n14}                                           OPTIONAL,
+        scs-240kHz                                  ENUMERATED {n4, n7, n14}                                           OPTIONAL
+    }                                                                                                              OPTIONAL,
+    maxNumberNonGroupBeamReporting              ENUMERATED {n1, n2, n4}                                            OPTIONAL,
+    groupBeamReporting                          ENUMERATED {supported}                                             OPTIONAL,
+    uplinkBeamManagement                        SEQUENCE {
+        maxNumberSRS-ResourcePerSet-BM              ENUMERATED {n2, n4, n8, n16},
+        maxNumberSRS-ResourceSet                    INTEGER (1..8)
+    }                                                                                                              OPTIONAL,
+    maxNumberCSI-RS-BFD                 INTEGER (1..64)                                                            OPTIONAL,
+    maxNumberSSB-BFD                    INTEGER (1..64)                                                            OPTIONAL,
+    maxNumberCSI-RS-SSB-CBD             INTEGER (1..256)                                                           OPTIONAL,
+    dummy2                              ENUMERATED {supported}                                                     OPTIONAL,
+    twoPortsPTRS-UL                     ENUMERATED {supported}                                                     OPTIONAL,
+    dummy5                              SRS-Resources                                                              OPTIONAL,
+    dummy3                              INTEGER (1..4)                                                             OPTIONAL,
+    beamReportTiming                    SEQUENCE {
+        scs-15kHz                           ENUMERATED {sym2, sym4, sym8}                                              OPTIONAL,
+        scs-30kHz                           ENUMERATED {sym4, sym8, sym14, sym28}                                      OPTIONAL,
+        scs-60kHz                           ENUMERATED {sym8, sym14, sym28}                                            OPTIONAL,
+        scs-120kHz                          ENUMERATED {sym14, sym28, sym56}                                           OPTIONAL
+    }                                                                                                              OPTIONAL,
+    ptrs-DensityRecommendationSetDL     SEQUENCE {
+        scs-15kHz                           PTRS-DensityRecommendationDL                                               OPTIONAL,
+        scs-30kHz                           PTRS-DensityRecommendationDL                                               OPTIONAL,
+        scs-60kHz                           PTRS-DensityRecommendationDL                                               OPTIONAL,
+        scs-120kHz                          PTRS-DensityRecommendationDL                                               OPTIONAL
+    }                                                                                                              OPTIONAL,
+    ptrs-DensityRecommendationSetUL     SEQUENCE {
+        scs-15kHz                           PTRS-DensityRecommendationUL                                               OPTIONAL,
+        scs-30kHz                           PTRS-DensityRecommendationUL                                               OPTIONAL,
+        scs-60kHz                           PTRS-DensityRecommendationUL                                               OPTIONAL,
+        scs-120kHz                          PTRS-DensityRecommendationUL                                               OPTIONAL
+    }                                                                                                              OPTIONAL,
+    dummy4                              DummyH                                                                     OPTIONAL,
+    aperiodicTRS                        ENUMERATED {supported}                                                     OPTIONAL,
+    ...,
+    [[
+    dummy6                              ENUMERATED {true}                                                          OPTIONAL,
+    beamManagementSSB-CSI-RS            BeamManagementSSB-CSI-RS                                                   OPTIONAL,
+    beamSwitchTiming                    SEQUENCE {
+        scs-60kHz                           ENUMERATED {sym14, sym28, sym48, sym224, sym336}                           OPTIONAL,
+        scs-120kHz                          ENUMERATED {sym14, sym28, sym48, sym224, sym336}                           OPTIONAL
+    }                                                                                                              OPTIONAL,
+    codebookParameters                  CodebookParameters                                                         OPTIONAL,
+    csi-RS-IM-ReceptionForFeedback      CSI-RS-IM-ReceptionForFeedback                                             OPTIONAL,
+    csi-RS-ProcFrameworkForSRS          CSI-RS-ProcFrameworkForSRS                                                 OPTIONAL,
+    csi-ReportFramework                 CSI-ReportFramework                                                        OPTIONAL,
+    csi-RS-ForTracking                  CSI-RS-ForTracking                                                         OPTIONAL,
+    srs-AssocCSI-RS                     SEQUENCE (SIZE (1.. maxNrofCSI-RS-Resources)) OF SupportedCSI-RS-Resource  OPTIONAL,
+    spatialRelations                    SpatialRelations                                                           OPTIONAL
+    ]],
+    [[
+    -- R1 16-2b-0: Support of default QCL assumption with two TCI states
+    defaultQCL-TwoTCI-r16               ENUMERATED {supported}                                                     OPTIONAL,
+    codebookParametersPerBand-r16       CodebookParameters-v1610                                                   OPTIONAL,
+    -- R1 16-1b-3: Support of PUCCH resource groups per BWP for simultaneous spatial relation update
+    simul-SpatialRelationUpdatePUCCHResGroup-r16    ENUMERATED {supported}                                         OPTIONAL,
+
+    -- R1 16-1f: Maximum number of SCells configured for SCell beam failure recovery simultaneously
+    maxNumberSCellBFR-r16                           ENUMERATED {n1,n2,n4,n8}                                       OPTIONAL,
+
+    -- R1 16-2c: Supports simultaneous reception with different Type-D for FR2 only
+    simultaneousReceptionDiffTypeD-r16              ENUMERATED {supported}                                         OPTIONAL,
+    -- R1 16-1a-1: SSB/CSI-RS for L1-SINR measurement
+    ssb-csirs-SINR-measurement-r16      SEQUENCE {
+        maxNumberSSB-CSIRS-OneTx-CMR-r16    ENUMERATED {n8, n16, n32, n64},
+        maxNumberCSI-IM-NZP-IMR-res-r16     ENUMERATED {n8, n16, n32, n64},
+        maxNumberCSIRS-2Tx-res-r16          ENUMERATED {n0, n4, n8, n16, n32, n64},
+        maxNumberSSB-CSIRS-res-r16          ENUMERATED {n8, n16, n32, n64, n128},
+        maxNumberCSI-IM-NZP-IMR-res-mem-r16 ENUMERATED {n8, n16, n32, n64, n128},
+        supportedCSI-RS-Density-CMR-r16     ENUMERATED {one, three, oneAndThree},
+        maxNumberAperiodicCSI-RS-Res-r16    ENUMERATED {n2, n4, n8, n16, n32, n64},
+        supportedSINR-meas-r16              ENUMERATED {ssbWithCSI-IM, ssbWithNZP-IMR, csirsWithNZP-IMR, csi-RSWithoutIMR}  OPTIONAL
+    }                                                                                                              OPTIONAL,
+    -- R1 16-1a-2: Non-group based L1-SINR reporting
+    nonGroupSINR-reporting-r16              ENUMERATED {n1, n2, n4}                                                OPTIONAL,
+    -- R1 16-1a-3: Non-group based L1-SINR reporting
+    groupSINR-reporting-r16                 ENUMERATED {supported}                                                 OPTIONAL,
+
+    multiDCI-multiTRP-Parameters-r16        SEQUENCE {
+        -- R1 16-2a-0: Overlapping PDSCHs in time and fully overlapping in frequency and time
+        overlapPDSCHsFullyFreqTime-r16          INTEGER (1..2)                                                     OPTIONAL,
+        -- R1 16-2a-1: Overlapping PDSCHs in time and partially overlapping in frequency and time
+        overlapPDSCHsInTimePartiallyFreq-r16    ENUMERATED {supported}                                             OPTIONAL,
+        -- R1 16-2a-2: Out of order operation for DL
+        outOfOrderOperationDL-r16               SEQUENCE {
+            supportPDCCH-ToPDSCH-r16                ENUMERATED {supported}                                         OPTIONAL,
+            supportPDSCH-ToHARQ-ACK-r16             ENUMERATED {supported}                                         OPTIONAL
+        }                                                                                                          OPTIONAL,
+        -- R1 16-2a-3: Out of order operation for UL
+        outOfOrderOperationUL-r16               ENUMERATED {supported}                                             OPTIONAL,
+        -- R1 16-2a-5: Separate CRS rate matching
+        separateCRS-RateMatching-r16            ENUMERATED {supported}                                             OPTIONAL,
+        -- R1 16-2a-6: Default QCL enhancement for multi-DCI based multi-TRP
+        defaultQCL-PerCORESETPoolIndex-r16      ENUMERATED {supported}                                             OPTIONAL,
+        -- R1 16-2a-7: Maximum number of activated TCI states
+        maxNumberActivatedTCI-States-r16        SEQUENCE {
+            maxNumberPerCORESET-Pool-r16            ENUMERATED {n1, n2, n4, n8},
+            maxTotalNumberAcrossCORESET-Pool-r16    ENUMERATED {n2, n4, n8, n16}
+        }                                                                                                          OPTIONAL
+    }                                                                                                              OPTIONAL,
+    singleDCI-SDM-scheme-Parameters-r16         SEQUENCE {
+        -- R1 16-2b-1b: Single-DCI based SDM scheme - Support of new DMRS port entry
+        supportNewDMRS-Port-r16                     ENUMERATED {n0, n2, n3}                                        OPTIONAL,
+        -- R1 16-2b-1a: Support of s-port DL PTRS
+        supportTwoPortDL-PTRS-r16                   ENUMERATED {supported}                                         OPTIONAL
+    }                                                                                                              OPTIONAL,
+    -- R1 16-2b-2: Support of single-DCI based FDMSchemeA
+    supportFDM-SchemeA-r16                      ENUMERATED {supported}                                             OPTIONAL,
+    -- R1 16-2b-3a: Single-DCI based FDMSchemeB CW soft combining
+    supportCodeWordSoftCombining-r16            ENUMERATED {supported}                                             OPTIONAL,
+    -- R1 16-2b-4: Single-DCI based TDMSchemeA	
+    supportTDM-SchemeA-r16                      ENUMERATED {kb3, kb5, kb10, kb20, noRestriction}                   OPTIONAL,
+    -- R1 16-2b-5: Single-DCI based inter-slot TDM
+    supportInter-slotTDM-r16                    SEQUENCE {
+        supportRepNumPDSCH-TDRA-r16                 ENUMERATED {n2, n3, n4, n5, n6, n7, n8, n16},
+        maxTBS-Size-r16                             ENUMERATED {kb3, kb5, kb10, kb20, noRestriction},
+        maxNumberTCI-states-r16                     INTEGER (1..2)
+    }                                                                                                              OPTIONAL,
+    -- R1 16-4: Low PAPR DMRS for PDSCH
+    lowPAPR-DMRS-PDSCH-r16                      ENUMERATED {supported}                                             OPTIONAL,
+    -- R1 16-6a: Low PAPR DMRS for PUSCH without transform precoding
+    lowPAPR-DMRS-PUSCHwithoutPrecoding-r16      ENUMERATED {supported}                                             OPTIONAL,
+    -- R1 16-6b: Low PAPR DMRS for PUCCH
+    lowPAPR-DMRS-PUCCH-r16                      ENUMERATED {supported}                                             OPTIONAL,
+    -- R1 16-6c: Low PAPR DMRS for PUSCH with transform precoding & pi/2 BPSK
+    lowPAPR-DMRS-PUSCHwithPrecoding-r16         ENUMERATED {supported}                                             OPTIONAL,
+    -- R1 16-7: Extension of the maximum number of configured aperiodic CSI report settings
+    csi-ReportFrameworkExt-r16                  CSI-ReportFrameworkExt-r16                                         OPTIONAL,
+    -- R1 16-3a, 16-3a-1, 16-3b, 16-3b-1, 16-8: Individual new codebook types
+    codebookParametersAddition-r16              CodebookParametersAddition-r16                                     OPTIONAL,
+    -- R1 16-8: Mixed codebook types
+    codebookComboParametersAddition-r16         CodebookComboParametersAddition-r16                                OPTIONAL,
+    -- R4 8-2: SSB based beam correspondence
+    beamCorrespondenceSSB-based-r16             ENUMERATED {supported}                                             OPTIONAL,
+    -- R4 8-3: CSI-RS based beam correspondence
+    beamCorrespondenceCSI-RS-based-r16          ENUMERATED {supported}                                             OPTIONAL,
+    beamSwitchTiming-r16                        SEQUENCE {
+        scs-60kHz-r16                               ENUMERATED {sym224, sym336}                                    OPTIONAL,
+        scs-120kHz-r16                              ENUMERATED {sym224, sym336}                                    OPTIONAL
+    }                                                                                                              OPTIONAL
+    ]],
+    [[
+    -- R1 16-1a-4: Semi-persistent L1-SINR report on PUCCH
+    semi-PersistentL1-SINR-Report-PUCCH-r16     SEQUENCE {
+        supportReportFormat1-2OFDM-syms-r16         ENUMERATED {supported}                                     OPTIONAL,
+        supportReportFormat4-14OFDM-syms-r16        ENUMERATED {supported}                                     OPTIONAL
+    }                                                                                                          OPTIONAL,
+    -- R1 16-1a-5: Semi-persistent L1-SINR report on PUSCH
+    semi-PersistentL1-SINR-Report-PUSCH-r16     ENUMERATED {supported}                                         OPTIONAL
+    ]],
+    [[
+    -- R1 16-1h: Support of 64 configured PUCCH spatial relations
+    spatialRelations-v1640                      SEQUENCE {
+        maxNumberConfiguredSpatialRelations-v1640   ENUMERATED {n96, n128, n160, n192, n224, n256, n288, n320}
+    }                                                                                                          OPTIONAL,
+    -- R1 16-1i: Support of 64 configured candidate beam RSs for BFR
+    support64CandidateBeamRS-BFR-r16            ENUMERATED {supported}                                         OPTIONAL
+    ]]
+}
+
+DummyG ::=                          SEQUENCE {
+    maxNumberSSB-CSI-RS-ResourceOneTx   ENUMERATED {n8, n16, n32, n64},
+    maxNumberSSB-CSI-RS-ResourceTwoTx   ENUMERATED {n0, n4, n8, n16, n32, n64},
+    supportedCSI-RS-Density             ENUMERATED {one, three, oneAndThree}
+}
+
+BeamManagementSSB-CSI-RS ::=        SEQUENCE {
+    maxNumberSSB-CSI-RS-ResourceOneTx   ENUMERATED {n0, n8, n16, n32, n64},
+    maxNumberCSI-RS-Resource            ENUMERATED {n0, n4, n8, n16, n32, n64},
+    maxNumberCSI-RS-ResourceTwoTx       ENUMERATED {n0, n4, n8, n16, n32, n64},
+    supportedCSI-RS-Density             ENUMERATED {one, three, oneAndThree}                                       OPTIONAL,
+    maxNumberAperiodicCSI-RS-Resource   ENUMERATED {n0, n1, n4, n8, n16, n32, n64}
+}
+
+DummyH ::=                          SEQUENCE {
+    burstLength                         INTEGER (1..2),
+    maxSimultaneousResourceSetsPerCC    INTEGER (1..8),
+    maxConfiguredResourceSetsPerCC      INTEGER (1..64),
+    maxConfiguredResourceSetsAllCC      INTEGER (1..128)
+}
+
+CSI-RS-ForTracking ::=              SEQUENCE {
+    maxBurstLength                      INTEGER (1..2),
+    maxSimultaneousResourceSetsPerCC    INTEGER (1..8),
+    maxConfiguredResourceSetsPerCC      INTEGER (1..64),
+    maxConfiguredResourceSetsAllCC      INTEGER (1..256)
+}
+
+CSI-RS-IM-ReceptionForFeedback ::=              SEQUENCE {
+    maxConfigNumberNZP-CSI-RS-PerCC                 INTEGER (1..64),
+    maxConfigNumberPortsAcrossNZP-CSI-RS-PerCC      INTEGER (2..256),
+    maxConfigNumberCSI-IM-PerCC                     ENUMERATED {n1, n2, n4, n8, n16, n32},
+    maxNumberSimultaneousNZP-CSI-RS-PerCC           INTEGER (1..64),
+    totalNumberPortsSimultaneousNZP-CSI-RS-PerCC    INTEGER (2..256)
+}
+
+CSI-RS-ProcFrameworkForSRS ::=                  SEQUENCE {
+    maxNumberPeriodicSRS-AssocCSI-RS-PerBWP         INTEGER (1..4),
+    maxNumberAperiodicSRS-AssocCSI-RS-PerBWP        INTEGER (1..4),
+    maxNumberSP-SRS-AssocCSI-RS-PerBWP              INTEGER (0..4),
+    simultaneousSRS-AssocCSI-RS-PerCC               INTEGER (1..8)
+}
+
+CSI-ReportFramework ::=                         SEQUENCE {
+    maxNumberPeriodicCSI-PerBWP-ForCSI-Report       INTEGER (1..4),
+    maxNumberAperiodicCSI-PerBWP-ForCSI-Report      INTEGER (1..4),
+    maxNumberSemiPersistentCSI-PerBWP-ForCSI-Report INTEGER (0..4),
+    maxNumberPeriodicCSI-PerBWP-ForBeamReport       INTEGER (1..4),
+    maxNumberAperiodicCSI-PerBWP-ForBeamReport      INTEGER (1..4),
+    maxNumberAperiodicCSI-triggeringStatePerCC      ENUMERATED {n3, n7, n15, n31, n63, n128},
+    maxNumberSemiPersistentCSI-PerBWP-ForBeamReport INTEGER (0..4),
+    simultaneousCSI-ReportsPerCC                    INTEGER (1..8)
+}
+
+CSI-ReportFrameworkExt-r16 ::=                      SEQUENCE {
+    maxNumberAperiodicCSI-PerBWP-ForCSI-ReportExt-r16   INTEGER (5..8)
+}
+
+PTRS-DensityRecommendationDL ::=    SEQUENCE {
+    frequencyDensity1                   INTEGER (1..276),
+    frequencyDensity2                   INTEGER (1..276),
+    timeDensity1                        INTEGER (0..29),
+    timeDensity2                        INTEGER (0..29),
+    timeDensity3                        INTEGER (0..29)
+}
+
+PTRS-DensityRecommendationUL ::=    SEQUENCE {
+    frequencyDensity1                   INTEGER (1..276),
+    frequencyDensity2                   INTEGER (1..276),
+    timeDensity1                        INTEGER (0..29),
+    timeDensity2                        INTEGER (0..29),
+    timeDensity3                        INTEGER (0..29),
+    sampleDensity1                      INTEGER (1..276),
+    sampleDensity2                      INTEGER (1..276),
+    sampleDensity3                      INTEGER (1..276),
+    sampleDensity4                      INTEGER (1..276),
+    sampleDensity5                      INTEGER (1..276)
+}
+
+SpatialRelations ::=                    SEQUENCE {
+    maxNumberConfiguredSpatialRelations     ENUMERATED {n4, n8, n16, n32, n64, n96},
+    maxNumberActiveSpatialRelations         ENUMERATED {n1, n2, n4, n8, n14},
+    additionalActiveSpatialRelationPUCCH    ENUMERATED {supported}                              OPTIONAL,
+    maxNumberDL-RS-QCL-TypeD                ENUMERATED {n1, n2, n4, n8, n14}
+}
+
+DummyI ::=               SEQUENCE {
+    supportedSRS-TxPortSwitch           ENUMERATED {t1r2, t1r4, t2r4, t1r4-t2r4, tr-equal},
+    txSwitchImpactToRx                  ENUMERATED {true}                                       OPTIONAL
+}
+
+-- TAG-MIMO-PARAMETERSPERBAND-STOP
+-- TAG-MODULATIONORDER-START
+
+ModulationOrder ::= ENUMERATED {bpsk-halfpi, bpsk, qpsk, qam16, qam64, qam256}
+
+-- TAG-MODULATIONORDER-STOP
+-- TAG-MRDC-PARAMETERS-START
+
+MRDC-Parameters ::= SEQUENCE {
+    singleUL-Transmission               ENUMERATED {supported}              OPTIONAL,
+    dynamicPowerSharingENDC             ENUMERATED {supported}              OPTIONAL,
+    tdm-Pattern                         ENUMERATED {supported}              OPTIONAL,
+    ul-SharingEUTRA-NR                  ENUMERATED {tdm, fdm, both}         OPTIONAL,
+    ul-SwitchingTimeEUTRA-NR            ENUMERATED {type1, type2}           OPTIONAL,
+    simultaneousRxTxInterBandENDC       ENUMERATED {supported}              OPTIONAL,
+    asyncIntraBandENDC                  ENUMERATED {supported}              OPTIONAL,
+    ...,
+    [[
+    dualPA-Architecture                 ENUMERATED {supported}              OPTIONAL,
+    intraBandENDC-Support               ENUMERATED {non-contiguous, both}   OPTIONAL,
+    ul-TimingAlignmentEUTRA-NR          ENUMERATED {required}               OPTIONAL
+    ]]
+}
+
+MRDC-Parameters-v1580 ::= SEQUENCE {
+	dynamicPowerSharingNEDC             ENUMERATED {supported}              OPTIONAL
+}
+
+MRDC-Parameters-v1590 ::=	SEQUENCE {
+	interBandContiguousMRDC             ENUMERATED {supported}              OPTIONAL
+}
+
+MRDC-Parameters-v1620 ::=    SEQUENCE {
+    maxUplinkDutyCycle-interBandENDC-TDD-PC2-r16    SEQUENCE{
+        eutra-TDD-Config0-r16    ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL,
+        eutra-TDD-Config1-r16    ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL,
+        eutra-TDD-Config2-r16    ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL,
+        eutra-TDD-Config3-r16    ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL,
+        eutra-TDD-Config4-r16    ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL,
+        eutra-TDD-Config5-r16    ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL,
+        eutra-TDD-Config6-r16    ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL
+    }                                                                                    OPTIONAL,
+    -- R1 18-2 Single UL TX operation for TDD PCell in EN-DC
+    tdm-restrictionTDD-endc-r16          ENUMERATED {supported}                          OPTIONAL,
+    -- R1 18-2a Single UL TX operation for FDD PCell in EN-DC
+    tdm-restrictionFDD-endc-r16          ENUMERATED {supported}                          OPTIONAL,
+    --  R1 18-2b Support of HARQ-offset for SUO case1 in EN-DC with LTE TDD PCell for type 1 UE
+    singleUL-HARQ-offsetTDD-PCell-r16    ENUMERATED {supported}                          OPTIONAL,
+    --  R1 18-3 Dual Tx transmission for EN-DC with FDD PCell(TDM pattern for dual Tx UE)
+    tdm-restrictionDualTX-FDD-endc-r16   ENUMERATED {supported}                          OPTIONAL
+}
+
+MRDC-Parameters-v1630 ::= 	SEQUENCE {
+    -- R4 2-20 Maximum uplink duty cycle for FDD+TDD EN-DC power class 2
+    maxUplinkDutyCycle-interBandENDC-FDD-TDD-PC2-r16  SEQUENCE {
+        maxUplinkDutyCycle-FDD-TDD-EN-DC1-r16             ENUMERATED {n30, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL,
+        maxUplinkDutyCycle-FDD-TDD-EN-DC2-r16             ENUMERATED {n30, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL
+    }                                                                                                             OPTIONAL,
+
+    -- R4 2-19 FDD-FDD or TDD-TDD inter-band MR-DC with overlapping or partially overlapping DL spectrum
+    interBandMRDC-WithOverlapDL-Bands-r16       ENUMERATED {supported}                   OPTIONAL
+}
+
+-- TAG-MRDC-PARAMETERS-STOP
+-- TAG-NRDC-PARAMETERS-START
+
+NRDC-Parameters ::=                 SEQUENCE {
+    measAndMobParametersNRDC            MeasAndMobParametersMRDC                    OPTIONAL,
+    generalParametersNRDC               GeneralParametersMRDC-XDD-Diff              OPTIONAL,
+    fdd-Add-UE-NRDC-Capabilities        UE-MRDC-CapabilityAddXDD-Mode               OPTIONAL,
+    tdd-Add-UE-NRDC-Capabilities        UE-MRDC-CapabilityAddXDD-Mode               OPTIONAL,
+    fr1-Add-UE-NRDC-Capabilities        UE-MRDC-CapabilityAddFRX-Mode               OPTIONAL,
+    fr2-Add-UE-NRDC-Capabilities        UE-MRDC-CapabilityAddFRX-Mode               OPTIONAL,
+    dummy2                              OCTET STRING                                OPTIONAL,
+    dummy                               SEQUENCE {}                                 OPTIONAL
+}
+
+NRDC-Parameters-v1570 ::=           SEQUENCE {
+    sfn-SyncNRDC                        ENUMERATED {supported}                      OPTIONAL
+}
+
+NRDC-Parameters-v15c0 ::=           SEQUENCE {
+    pdcp-DuplicationSplitSRB            ENUMERATED {supported}                      OPTIONAL,
+    pdcp-DuplicationSplitDRB            ENUMERATED {supported}                      OPTIONAL
+}
+
+NRDC-Parameters-v1610 ::=           SEQUENCE {
+    measAndMobParametersNRDC-v1610      MeasAndMobParametersMRDC-v1610              OPTIONAL
+}
+
+
+-- TAG-NRDC-PARAMETERS-STOP
+-- TAG-OLPC-SRS-POS-START
+
+OLPC-SRS-Pos-r16 ::=        SEQUENCE {
+    olpc-SRS-PosBasedOnPRS-Serving-r16         ENUMERATED {supported}               OPTIONAL,
+    olpc-SRS-PosBasedOnSSB-Neigh-r16           ENUMERATED {supported}               OPTIONAL,
+    olpc-SRS-PosBasedOnPRS-Neigh-r16           ENUMERATED {supported}               OPTIONAL,
+    maxNumberPathLossEstimatePerServing-r16    ENUMERATED {n1, n4, n8, n16}         OPTIONAL
+}
+
+--TAG-OLPC-SRS-POS-STOP
+-- TAG-PDCP-PARAMETERS-START
+
+PDCP-Parameters ::=         SEQUENCE {
+    supportedROHC-Profiles      SEQUENCE {
+        profile0x0000               BOOLEAN,
+        profile0x0001               BOOLEAN,
+        profile0x0002               BOOLEAN,
+        profile0x0003               BOOLEAN,
+        profile0x0004               BOOLEAN,
+        profile0x0006               BOOLEAN,
+        profile0x0101               BOOLEAN,
+        profile0x0102               BOOLEAN,
+        profile0x0103               BOOLEAN,
+        profile0x0104               BOOLEAN
+    },
+    maxNumberROHC-ContextSessions       ENUMERATED {cs2, cs4, cs8, cs12, cs16, cs24, cs32, cs48, cs64,
+                                                cs128, cs256, cs512, cs1024, cs16384, spare2, spare1},
+    uplinkOnlyROHC-Profiles             ENUMERATED {supported}      OPTIONAL,
+    continueROHC-Context                ENUMERATED {supported}      OPTIONAL,
+    outOfOrderDelivery                  ENUMERATED {supported}      OPTIONAL,
+    shortSN                             ENUMERATED {supported}      OPTIONAL,
+    pdcp-DuplicationSRB                 ENUMERATED {supported}      OPTIONAL,
+    pdcp-DuplicationMCG-OrSCG-DRB       ENUMERATED {supported}      OPTIONAL,
+    ...,
+    [[
+    drb-IAB-r16                         ENUMERATED {supported}      OPTIONAL,
+    non-DRB-IAB-r16                     ENUMERATED {supported}      OPTIONAL,
+    extendedDiscardTimer-r16            ENUMERATED {supported}      OPTIONAL,
+    continueEHC-Context-r16             ENUMERATED {supported}      OPTIONAL,
+    ehc-r16                             ENUMERATED {supported}      OPTIONAL,
+    maxNumberEHC-Contexts-r16           ENUMERATED {cs2, cs4, cs8, cs16, cs32, cs64, cs128, cs256, cs512,
+                                                    cs1024, cs2048, cs4096, cs8192, cs16384, cs32768, cs65536}    OPTIONAL,
+    jointEHC-ROHC-Config-r16            ENUMERATED {supported}      OPTIONAL,
+    pdcp-DuplicationMoreThanTwoRLC-r16  ENUMERATED {supported}      OPTIONAL
+    ]]
+}
+
+-- TAG-PDCP-PARAMETERS-STOP
+-- TAG-PDCP-PARAMETERSMRDC-START
+
+PDCP-ParametersMRDC ::=                 SEQUENCE {
+    pdcp-DuplicationSplitSRB                ENUMERATED {supported}      OPTIONAL,
+    pdcp-DuplicationSplitDRB                ENUMERATED {supported}      OPTIONAL
+}
+
+PDCP-ParametersMRDC-v1610 ::= SEQUENCE {
+    scg-DRB-NR-IAB-r16                  ENUMERATED {supported}          OPTIONAL
+}
+
+-- TAG-PDCP-PARAMETERSMRDC-STOP
+-- TAG-PHY-PARAMETERS-START
+
+Phy-Parameters ::=                  SEQUENCE {
+    phy-ParametersCommon                Phy-ParametersCommon                        OPTIONAL,
+    phy-ParametersXDD-Diff              Phy-ParametersXDD-Diff                      OPTIONAL,
+    phy-ParametersFRX-Diff              Phy-ParametersFRX-Diff                      OPTIONAL,
+    phy-ParametersFR1                   Phy-ParametersFR1                           OPTIONAL,
+    phy-ParametersFR2                   Phy-ParametersFR2                           OPTIONAL
+}
+
+Phy-ParametersCommon ::=            SEQUENCE {
+    csi-RS-CFRA-ForHO                   ENUMERATED {supported}                      OPTIONAL,
+    dynamicPRB-BundlingDL               ENUMERATED {supported}                      OPTIONAL,
+    sp-CSI-ReportPUCCH                  ENUMERATED {supported}                      OPTIONAL,
+    sp-CSI-ReportPUSCH                  ENUMERATED {supported}                      OPTIONAL,
+    nzp-CSI-RS-IntefMgmt                ENUMERATED {supported}                      OPTIONAL,
+    type2-SP-CSI-Feedback-LongPUCCH     ENUMERATED {supported}                      OPTIONAL,
+    precoderGranularityCORESET          ENUMERATED {supported}                      OPTIONAL,
+    dynamicHARQ-ACK-Codebook            ENUMERATED {supported}                      OPTIONAL,
+    semiStaticHARQ-ACK-Codebook         ENUMERATED {supported}                      OPTIONAL,
+    spatialBundlingHARQ-ACK             ENUMERATED {supported}                      OPTIONAL,
+    dynamicBetaOffsetInd-HARQ-ACK-CSI   ENUMERATED {supported}                      OPTIONAL,
+    pucch-Repetition-F1-3-4             ENUMERATED {supported}                      OPTIONAL,
+    ra-Type0-PUSCH                      ENUMERATED {supported}                      OPTIONAL,
+    dynamicSwitchRA-Type0-1-PDSCH       ENUMERATED {supported}                      OPTIONAL,
+    dynamicSwitchRA-Type0-1-PUSCH       ENUMERATED {supported}                      OPTIONAL,
+    pdsch-MappingTypeA                  ENUMERATED {supported}                      OPTIONAL,
+    pdsch-MappingTypeB                  ENUMERATED {supported}                      OPTIONAL,
+    interleavingVRB-ToPRB-PDSCH         ENUMERATED {supported}                      OPTIONAL,
+    interSlotFreqHopping-PUSCH          ENUMERATED {supported}                      OPTIONAL,
+    type1-PUSCH-RepetitionMultiSlots    ENUMERATED {supported}                      OPTIONAL,
+    type2-PUSCH-RepetitionMultiSlots    ENUMERATED {supported}                      OPTIONAL,
+    pusch-RepetitionMultiSlots          ENUMERATED {supported}                      OPTIONAL,
+    pdsch-RepetitionMultiSlots          ENUMERATED {supported}                      OPTIONAL,
+    downlinkSPS                         ENUMERATED {supported}                      OPTIONAL,
+    configuredUL-GrantType1             ENUMERATED {supported}                      OPTIONAL,
+    configuredUL-GrantType2             ENUMERATED {supported}                      OPTIONAL,
+    pre-EmptIndication-DL               ENUMERATED {supported}                      OPTIONAL,
+    cbg-TransIndication-DL              ENUMERATED {supported}                      OPTIONAL,
+    cbg-TransIndication-UL              ENUMERATED {supported}                      OPTIONAL,
+    cbg-FlushIndication-DL              ENUMERATED {supported}                      OPTIONAL,
+    dynamicHARQ-ACK-CodeB-CBG-Retx-DL   ENUMERATED {supported}                      OPTIONAL,
+    rateMatchingResrcSetSemi-Static     ENUMERATED {supported}                      OPTIONAL,
+    rateMatchingResrcSetDynamic         ENUMERATED {supported}                      OPTIONAL,
+    bwp-SwitchingDelay                  ENUMERATED {type1, type2}                   OPTIONAL,
+    ...,
+    [[
+    dummy                               ENUMERATED {supported}                      OPTIONAL
+    ]],
+    [[
+    maxNumberSearchSpaces               ENUMERATED {n10}                            OPTIONAL,
+    rateMatchingCtrlResrcSetDynamic     ENUMERATED {supported}                      OPTIONAL,
+    maxLayersMIMO-Indication            ENUMERATED {supported}                      OPTIONAL
+    ]],
+    [[
+    spCellPlacement                             CarrierAggregationVariant           OPTIONAL
+    ]],
+    [[
+    -- R1 9-1: Basic channel structure and procedure of 2-step RACH
+    twoStepRACH-r16                             ENUMERATED {supported}              OPTIONAL,
+    -- R1 11-1: Monitoring DCI format 1_2 and DCI format 0_2
+    dci-Format1-2And0-2-r16                     ENUMERATED {supported}              OPTIONAL,
+    -- R1 11-1a: Monitoring both DCI format 0_1/1_1 and DCI format 0_2/1_2 in the same search space
+    monitoringDCI-SameSearchSpace-r16           ENUMERATED {supported}              OPTIONAL,
+    -- R1 11-10: Type 2 configured grant release by DCI format 0_1
+    type2-CG-ReleaseDCI-0-1-r16                 ENUMERATED {supported}              OPTIONAL,
+    -- R1 11-11: Type 2 configured grant release by DCI format 0_2
+    type2-CG-ReleaseDCI-0-2-r16                 ENUMERATED {supported}              OPTIONAL,
+    -- R1 12-3: SPS release by DCI format 1_1
+    sps-ReleaseDCI-1-1-r16                      ENUMERATED {supported}              OPTIONAL,
+    -- R1 12-3a: SPS release by DCI format 1_2
+    sps-ReleaseDCI-1-2-r16                      ENUMERATED {supported}              OPTIONAL,
+    -- R1 14-8: CSI trigger states containing non-active BWP
+    csi-TriggerStateNon-ActiveBWP-r16           ENUMERATED {supported}              OPTIONAL,
+    -- R1 20-2: Support up to 4 SMTCs configured for an IAB node MT per frequency location, including IAB-specific SMTC window periodicities
+    seperateSMTC-InterIAB-Support-r16           ENUMERATED {supported}              OPTIONAL,
+    -- R1 20-3: Support RACH configuration separately from the RACH configuration for UE access, including new IAB-specific offset and scaling factors
+    seperateRACH-IAB-Support-r16                ENUMERATED {supported}              OPTIONAL,
+    -- R1 20-5a: Support semi-static configuration/indication of UL-Flexible-DL slot formats for IAB-MT resources
+    ul-flexibleDL-SlotFormatSemiStatic-IAB-r16  ENUMERATED {supported}              OPTIONAL,
+    -- R1 20-5b: Support dynamic indication of UL-Flexible-DL slot formats for IAB-MT resources
+    ul-flexibleDL-SlotFormatDynamics-IAB-r16    ENUMERATED {supported}              OPTIONAL,
+    dft-S-OFDM-WaveformUL-IAB-r16               ENUMERATED {supported}              OPTIONAL,
+    -- R1 20-6: Support DCI Format 2_5 based indication of soft resource availability to an IAB node
+    dci-25-AI-RNTI-Support-IAB-r16              ENUMERATED {supported}              OPTIONAL,
+    -- R1 20-7: Support T_delta reception.
+    t-DeltaReceptionSupport-IAB-r16             ENUMERATED {supported}              OPTIONAL,
+    -- R1 20-8: Support of Desired guard symbol reporting and provided guard symbok reception.
+    guardSymbolReportReception-IAB-r16          ENUMERATED {supported}              OPTIONAL,
+    -- R1 18-8 HARQ-ACK codebook type and spatial bundling per PUCCH group
+    harqACK-CB-SpatialBundlingPUCCH-Group-r16   ENUMERATED {supported}              OPTIONAL,
+    -- R1 19-2: Cross Slot Scheduling
+    crossSlotScheduling-r16                     SEQUENCE {
+        non-SharedSpectrumChAccess-r16              ENUMERATED {supported}          OPTIONAL,
+        sharedSpectrumChAccess-r16                  ENUMERATED {supported}          OPTIONAL
+    }                                                                               OPTIONAL,
+    maxNumberSRS-PosPathLossEstimateAllServingCells-r16  ENUMERATED {n1, n4, n8, n16}         OPTIONAL,
+    extendedCG-Periodicities-r16                ENUMERATED {supported}              OPTIONAL,
+    extendedSPS-Periodicities-r16               ENUMERATED {supported}              OPTIONAL,
+    codebookVariantsList-r16                    CodebookVariantsList-r16            OPTIONAL,
+    -- R1 11-6: PUSCH repetition Type A
+    pusch-RepetitionTypeA-r16                   SEQUENCE {
+        sharedSpectrumChAccess-r16                  ENUMERATED {supported}          OPTIONAL,
+        non-SharedSpectrumChAccess-r16              ENUMERATED {supported}          OPTIONAL
+    }                                                                               OPTIONAL,
+    -- R1 11-4b: DL priority indication in DCI with mixed DCI formats
+    dci-DL-PriorityIndicator-r16                ENUMERATED {supported}              OPTIONAL,
+    -- R1 12-1a: UL priority indication in DCI with mixed DCI formats
+    dci-UL-PriorityIndicator-r16                ENUMERATED {supported}              OPTIONAL,
+    -- R1 16-1e: Maximum number of configured pathloss reference RSs for PUSCH/PUCCH/SRS by RRC for MAC-CE based pathloss reference RS update
+    maxNumberPathlossRS-Update-r16              ENUMERATED {n4, n8, n16, n32, n64}  OPTIONAL,
+
+    -- R1 18-9: Usage of the PDSCH starting time for HARQ-ACK type 2 codebook
+    type2-HARQ-ACK-Codebook-r16                 ENUMERATED {supported}              OPTIONAL,
+    -- R1 16-1g-1: Resources for beam management, pathloss measurement, BFD, RLM and new beam identification across frequency ranges
+    maxTotalResourcesForAcrossFreqRanges-r16    SEQUENCE {
+        maxNumberResWithinSlotAcrossCC-AcrossFR-r16 ENUMERATED {n2, n4, n8, n12, n16, n32, n64, n128}        OPTIONAL,
+        maxNumberResAcrossCC-AcrossFR-r16           ENUMERATED {n2, n4, n8, n12, n16, n32, n40, n48, n64, n72, n80, n96, n128, n256}
+                                                                                    OPTIONAL
+    }                                                                               OPTIONAL,
+    -- R1 16-2a-4: HARQ-ACK for multi-DCI based multi-TRP - separate
+    harqACK-separateMultiDCI-MultiTRP-r16       SEQUENCE {
+    maxNumberLongPUCCHs-r16                         ENUMERATED {longAndLong, longAndShort, shortAndShort}    OPTIONAL
+    }                                                                               OPTIONAL,
+    -- R1 16-2a-4: HARQ-ACK for multi-DCI based multi-TRP - joint
+    harqACK-jointMultiDCI-MultiTRP-r16          ENUMERATED {supported}              OPTIONAL,
+    -- R4 9-1: BWP switching on multiple CCs RRM requirements
+    bwp-SwitchingMultiCCs-r16                   CHOICE {
+        type1-r16                                   ENUMERATED {us100, us200},
+        type2-r16                                   ENUMERATED {us200, us400, us800, us1000}
+    }                                                                               OPTIONAL
+    ]],
+    [[
+    targetSMTC-SCG-r16                          ENUMERATED {supported}              OPTIONAL,
+    supportRepetitionZeroOffsetRV-r16           ENUMERATED {supported}              OPTIONAL,
+    -- R1 11-12: in-order CBG-based re-transmission
+    cbg-TransInOrderPUSCH-UL-r16                ENUMERATED {supported}              OPTIONAL
+    ]],
+    [[
+    -- R4 6-3: Dormant BWP switching on multiple CCs RRM requirements
+    bwp-SwitchingMultiDormancyCCs-r16           CHOICE {
+        type1-r16                                   ENUMERATED {us100, us200},
+        type2-r16                                   ENUMERATED {us200, us400, us800, us1000}
+    }                                                                               OPTIONAL,
+    -- R1 16-2a-8: Indicates that retransmission scheduled by a different CORESETPoolIndex for multi-DCI multi-TRP is not supported.
+    supportRetx-Diff-CoresetPool-Multi-DCI-TRP-r16               ENUMERATED {notSupported}          OPTIONAL,
+    -- R1 22-10: Support of pdcch-MonitoringAnyOccasionsWithSpanGap in case of cross-carrier scheduling with different SCSs
+    pdcch-MonitoringAnyOccasionsWithSpanGapCrossCarrierSch-r16   ENUMERATED {mode2, mode3}          OPTIONAL
+    ]]
+}
+
+Phy-ParametersXDD-Diff ::=          SEQUENCE {
+    dynamicSFI                          ENUMERATED {supported}                      OPTIONAL,
+    twoPUCCH-F0-2-ConsecSymbols         ENUMERATED {supported}                      OPTIONAL,
+    twoDifferentTPC-Loop-PUSCH          ENUMERATED {supported}                      OPTIONAL,
+    twoDifferentTPC-Loop-PUCCH          ENUMERATED {supported}                      OPTIONAL,
+    ...,
+    [[
+    dl-SchedulingOffset-PDSCH-TypeA     ENUMERATED {supported}                      OPTIONAL,
+    dl-SchedulingOffset-PDSCH-TypeB     ENUMERATED {supported}                      OPTIONAL,
+    ul-SchedulingOffset                 ENUMERATED {supported}                      OPTIONAL
+    ]]
+}
+
+Phy-ParametersFRX-Diff ::=                  SEQUENCE {
+    dynamicSFI                                  ENUMERATED {supported}                      OPTIONAL,
+    dummy1                                      BIT STRING (SIZE (2))                       OPTIONAL,
+    twoFL-DMRS                                  BIT STRING (SIZE (2))                       OPTIONAL,
+    dummy2                                      BIT STRING (SIZE (2))                       OPTIONAL,
+    dummy3                                      BIT STRING (SIZE (2))                       OPTIONAL,
+    supportedDMRS-TypeDL                        ENUMERATED {type1, type1And2}               OPTIONAL,
+    supportedDMRS-TypeUL                        ENUMERATED {type1, type1And2}               OPTIONAL,
+    semiOpenLoopCSI                             ENUMERATED {supported}                      OPTIONAL,
+    csi-ReportWithoutPMI                        ENUMERATED {supported}                      OPTIONAL,
+    csi-ReportWithoutCQI                        ENUMERATED {supported}                      OPTIONAL,
+    onePortsPTRS                                BIT STRING (SIZE (2))                       OPTIONAL,
+    twoPUCCH-F0-2-ConsecSymbols                 ENUMERATED {supported}                      OPTIONAL,
+    pucch-F2-WithFH                             ENUMERATED {supported}                      OPTIONAL,
+    pucch-F3-WithFH                             ENUMERATED {supported}                      OPTIONAL,
+    pucch-F4-WithFH                             ENUMERATED {supported}                      OPTIONAL,
+    pucch-F0-2WithoutFH                         ENUMERATED {notSupported}                   OPTIONAL,
+    pucch-F1-3-4WithoutFH                       ENUMERATED {notSupported}                   OPTIONAL,
+    mux-SR-HARQ-ACK-CSI-PUCCH-MultiPerSlot      ENUMERATED {supported}                      OPTIONAL,
+    uci-CodeBlockSegmentation                   ENUMERATED {supported}                      OPTIONAL,
+    onePUCCH-LongAndShortFormat                 ENUMERATED {supported}                      OPTIONAL,
+    twoPUCCH-AnyOthersInSlot                    ENUMERATED {supported}                      OPTIONAL,
+    intraSlotFreqHopping-PUSCH                  ENUMERATED {supported}                      OPTIONAL,
+    pusch-LBRM                                  ENUMERATED {supported}                      OPTIONAL,
+    pdcch-BlindDetectionCA                      INTEGER (4..16)                             OPTIONAL,
+    tpc-PUSCH-RNTI                              ENUMERATED {supported}                      OPTIONAL,
+    tpc-PUCCH-RNTI                              ENUMERATED {supported}                      OPTIONAL,
+    tpc-SRS-RNTI                                ENUMERATED {supported}                      OPTIONAL,
+    absoluteTPC-Command                         ENUMERATED {supported}                      OPTIONAL,
+    twoDifferentTPC-Loop-PUSCH                  ENUMERATED {supported}                      OPTIONAL,
+    twoDifferentTPC-Loop-PUCCH                  ENUMERATED {supported}                      OPTIONAL,
+    pusch-HalfPi-BPSK                           ENUMERATED {supported}                      OPTIONAL,
+    pucch-F3-4-HalfPi-BPSK                      ENUMERATED {supported}                      OPTIONAL,
+    almostContiguousCP-OFDM-UL                  ENUMERATED {supported}                      OPTIONAL,
+    sp-CSI-RS                                   ENUMERATED {supported}                      OPTIONAL,
+    sp-CSI-IM                                   ENUMERATED {supported}                      OPTIONAL,
+    tdd-MultiDL-UL-SwitchPerSlot                ENUMERATED {supported}                      OPTIONAL,
+    multipleCORESET                             ENUMERATED {supported}                      OPTIONAL,
+    ...,
+    [[
+    csi-RS-IM-ReceptionForFeedback              CSI-RS-IM-ReceptionForFeedback              OPTIONAL,
+    csi-RS-ProcFrameworkForSRS                  CSI-RS-ProcFrameworkForSRS                  OPTIONAL,
+    csi-ReportFramework                         CSI-ReportFramework                         OPTIONAL,
+    mux-SR-HARQ-ACK-CSI-PUCCH-OncePerSlot       SEQUENCE {
+        sameSymbol                                  ENUMERATED {supported}                      OPTIONAL,
+        diffSymbol                                  ENUMERATED {supported}                      OPTIONAL
+    }                                                                                       OPTIONAL,
+    mux-SR-HARQ-ACK-PUCCH                       ENUMERATED {supported}                      OPTIONAL,
+    mux-MultipleGroupCtrlCH-Overlap             ENUMERATED {supported}                      OPTIONAL,
+    dl-SchedulingOffset-PDSCH-TypeA             ENUMERATED {supported}                      OPTIONAL,
+    dl-SchedulingOffset-PDSCH-TypeB             ENUMERATED {supported}                      OPTIONAL,
+    ul-SchedulingOffset                         ENUMERATED {supported}                      OPTIONAL,
+    dl-64QAM-MCS-TableAlt                       ENUMERATED {supported}                      OPTIONAL,
+    ul-64QAM-MCS-TableAlt                       ENUMERATED {supported}                      OPTIONAL,
+    cqi-TableAlt                                ENUMERATED {supported}                      OPTIONAL,
+    oneFL-DMRS-TwoAdditionalDMRS-UL             ENUMERATED {supported}                      OPTIONAL,
+    twoFL-DMRS-TwoAdditionalDMRS-UL             ENUMERATED {supported}                      OPTIONAL,
+    oneFL-DMRS-ThreeAdditionalDMRS-UL           ENUMERATED {supported}                      OPTIONAL
+    ]],
+    [[
+    pdcch-BlindDetectionNRDC                SEQUENCE {
+        pdcch-BlindDetectionMCG-UE              INTEGER (1..15),
+        pdcch-BlindDetectionSCG-UE              INTEGER (1..15)
+    }                                                                                       OPTIONAL,
+    mux-HARQ-ACK-PUSCH-DiffSymbol               ENUMERATED {supported}                      OPTIONAL
+    ]],
+    [[
+    -- R1 11-1b: Type 1 HARQ-ACK codebook support for relative TDRA for DL
+    type1-HARQ-ACK-Codebook-r16                 ENUMERATED {supported}                      OPTIONAL,
+    -- R1 11-8: Enhanced UL power control scheme
+    enhancedPowerControl-r16                    ENUMERATED {supported}                      OPTIONAL,
+    -- R1 16-1b-1: TCI state activation across multiple CCs
+    simultaneousTCI-ActMultipleCC-r16           ENUMERATED {supported}                      OPTIONAL,
+    -- R1 16-1b-2: Spatial relation update across multiple CCs
+    simultaneousSpatialRelationMultipleCC-r16   ENUMERATED {supported}                      OPTIONAL,
+    cli-RSSI-FDM-DL-r16                         ENUMERATED {supported}                      OPTIONAL,
+    cli-SRS-RSRP-FDM-DL-r16                     ENUMERATED {supported}                      OPTIONAL,
+    -- R1 19-3: Maximum MIMO Layer Adaptation
+    maxLayersMIMO-Adaptation-r16                ENUMERATED {supported}                      OPTIONAL,
+    -- R1 12-5: Configuration of aggregation factor per SPS configuration
+    aggregationFactorSPS-DL-r16                 ENUMERATED {supported}                      OPTIONAL,
+    -- R1 16-1g: Resources for beam management, pathloss measurement, BFD, RLM and new beam identification
+    maxTotalResourcesForOneFreqRange-r16        SEQUENCE {
+        maxNumberResWithinSlotAcrossCC-OneFR-r16    ENUMERATED {n2, n4, n8, n12, n16, n32, n64, n128}    OPTIONAL,
+        maxNumberResAcrossCC-OneFR-r16              ENUMERATED {n2, n4, n8, n12, n16, n32, n40, n48, n64, n72, n80, n96, n128, n256}
+                                                                                            OPTIONAL
+    }                                           OPTIONAL,
+    -- R1 16-7: Extension of the maximum number of configured aperiodic CSI report settings
+    csi-ReportFrameworkExt-r16                  CSI-ReportFrameworkExt-r16                  OPTIONAL
+    ]],
+    [[
+    twoTCI-Act-servingCellInCC-List-r16         ENUMERATED {supported}                      OPTIONAL
+    ]]
+}
+
+Phy-ParametersFR1 ::=                       SEQUENCE {
+    pdcch-MonitoringSingleOccasion              ENUMERATED {supported}                      OPTIONAL,
+    scs-60kHz                                   ENUMERATED {supported}                      OPTIONAL,
+    pdsch-256QAM-FR1                            ENUMERATED {supported}                      OPTIONAL,
+    pdsch-RE-MappingFR1-PerSymbol               ENUMERATED {n10, n20}                       OPTIONAL,
+    ...,
+    [[
+    pdsch-RE-MappingFR1-PerSlot                 ENUMERATED {n16, n32, n48, n64, n80, n96, n112, n128,
+                                                n144, n160, n176, n192, n208, n224, n240, n256}         OPTIONAL
+    ]]
+}
+
+Phy-ParametersFR2 ::=                       SEQUENCE {
+    dummy                                       ENUMERATED {supported}                                  OPTIONAL,
+    pdsch-RE-MappingFR2-PerSymbol               ENUMERATED {n6, n20}                                    OPTIONAL,
+    ...,
+    [[
+    pCell-FR2                                   ENUMERATED {supported}                                  OPTIONAL,
+    pdsch-RE-MappingFR2-PerSlot                 ENUMERATED {n16, n32, n48, n64, n80, n96, n112, n128,
+                                                    n144, n160, n176, n192, n208, n224, n240, n256}     OPTIONAL
+    ]],
+    [[
+    -- R1 16-1c: Support of default spatial relation and pathloss reference RS for dedicated-PUCCH/SRS and PUSCH
+    defaultSpatialRelationPathlossRS-r16        ENUMERATED {supported}                                  OPTIONAL,
+    -- R1 16-1d: Support of spatial relation update for AP-SRS via MAC CE
+    spatialRelationUpdateAP-SRS-r16             ENUMERATED {supported}                                  OPTIONAL,
+    maxNumberSRS-PosSpatialRelationsAllServingCells-r16  ENUMERATED {n0, n1, n2, n4, n8, n16}           OPTIONAL
+    ]]
+}
+
+-- TAG-PHY-PARAMETERS-STOP
+-- TAG-PHY-PARAMETERSMRDC-START
+
+Phy-ParametersMRDC ::=              SEQUENCE {
+    naics-Capability-List               SEQUENCE (SIZE (1..maxNrofNAICS-Entries)) OF NAICS-Capability-Entry         OPTIONAL,
+    ...,
+    [[
+    spCellPlacement                     CarrierAggregationVariant                                                   OPTIONAL
+    ]],
+    [[
+    -- R1 18-3b: Semi-statically configured LTE UL transmissions in all UL subframes not limited to tdm-pattern in case of TDD PCell
+    tdd-PCellUL-TX-AllUL-Subframe-r16   ENUMERATED {supported}                                                      OPTIONAL,
+    -- R1 18-3a: Semi-statically configured LTE UL transmissions in all UL subframes not limited to tdm-pattern in case of FDD PCell
+    fdd-PCellUL-TX-AllUL-Subframe-r16   ENUMERATED {supported}                                                      OPTIONAL
+    ]]
+}
+
+NAICS-Capability-Entry ::=          SEQUENCE {
+    numberOfNAICS-CapableCC             INTEGER(1..5),
+    numberOfAggregatedPRB               ENUMERATED {n50, n75, n100, n125, n150, n175, n200, n225,
+                                                    n250, n275, n300, n350, n400, n450, n500, spare},
+    ...
+}
+
+-- TAG-PHY-PARAMETERSMRDC-STOP
+-- TAG-PHY-PARAMETERSSHAREDSPECTRUMCHACCESS-START
+
+Phy-ParametersSharedSpectrumChAccess-r16 ::=    SEQUENCE {
+    -- 10-32 (1-2): SS block based SINR measurement (SS-SINR) for unlicensed spectrum
+    ss-SINR-Meas-r16                                ENUMERATED {supported}                      OPTIONAL,
+    -- 10-33 (2-32a): Semi-persistent CSI report on PUCCH for unlicensed spectrum
+    sp-CSI-ReportPUCCH-r16                          ENUMERATED {supported}                      OPTIONAL,
+    -- 10-33a (2-32b): Semi-persistent CSI report on PUSCH for unlicensed spectrum
+    sp-CSI-ReportPUSCH-r16                          ENUMERATED {supported}                      OPTIONAL,
+    -- 10-34 (3-6): Dynamic SFI monitoring for unlicensed spectrum
+    dynamicSFI-r16                                  ENUMERATED {supported}                      OPTIONAL,
+    -- 10-35c (4-19c): SR/HARQ-ACK/CSI multiplexing once per slot using a PUCCH (or HARQ-ACK/CSI piggybacked on a PUSCH) when SR/HARQ-
+    -- ACK/CSI are supposed to be sent with different starting symbols in a slot for unlicensed spectrum
+    -- 10-35 (4-19): SR/HARQ-ACK/CSI multiplexing once per slot using a PUCCH (or HARQ-ACK/CSI piggybacked on a PUSCH) when SR/HARQ-
+    -- ACK/CSI are supposed to be sent with the same starting symbol on the PUCCH resources in a slot for unlicensed spectrum
+    mux-SR-HARQ-ACK-CSI-PUCCH-OncePerSlot-r16       SEQUENCE {
+        sameSymbol-r16                                  ENUMERATED {supported}                  OPTIONAL,
+        diffSymbol-r16                                  ENUMERATED {supported}                  OPTIONAL
+    }                                                                                           OPTIONAL,
+    -- 10-35a (4-19a): Overlapping PUCCH resources have different starting symbols in a slot for unlicensed spectrum
+    mux-SR-HARQ-ACK-PUCCH-r16                       ENUMERATED {supported}                      OPTIONAL,
+    -- 10-35b (4-19b): SR/HARQ-ACK/CSI multiplexing more than once per slot using a PUCCH (or HARQ-ACK/CSI piggybacked on a PUSCH) when
+    -- SR/HARQ ACK/CSI are supposed to be sent with the same or different starting symbol in a slot for unlicensed spectrum
+    mux-SR-HARQ-ACK-CSI-PUCCH-MultiPerSlot-r16      ENUMERATED {supported}                      OPTIONAL,
+    -- 10-36 (4-28): HARQ-ACK multiplexing on PUSCH with different PUCCH/PUSCH starting OFDM symbols for unlicensed spectrum
+    mux-HARQ-ACK-PUSCH-DiffSymbol-r16               ENUMERATED {supported}                      OPTIONAL,
+    -- 10-37 (4-23): Repetitions for PUCCH format 1, 3, and 4 over multiple slots with K = 2, 4, 8 for unlicensed spectrum
+    pucch-Repetition-F1-3-4-r16                     ENUMERATED {supported}                      OPTIONAL,
+    -- 10-38 (5-14): Type 1 configured PUSCH repetitions over multiple slots for unlicensed spectrum
+    type1-PUSCH-RepetitionMultiSlots-r16            ENUMERATED {supported}                      OPTIONAL,
+    -- 10-39 (5-16): Type 2 configured PUSCH repetitions over multiple slots for unlicensed spectrum
+    type2-PUSCH-RepetitionMultiSlots-r16            ENUMERATED {supported}                      OPTIONAL,
+    -- 10-40 (5-17): PUSCH repetitions over multiple slots for unlicensed spectrum
+    pusch-RepetitionMultiSlots-r16                  ENUMERATED {supported}                      OPTIONAL,
+    -- 10-40a (5-17a): PDSCH repetitions over multiple slots for unlicensed spectrum
+    pdsch-RepetitionMultiSlots-r16                  ENUMERATED {supported}                      OPTIONAL,
+    -- 10-41 (5-18): DL SPS
+    downlinkSPS-r16                                 ENUMERATED {supported}                      OPTIONAL,
+    -- 10-42 (5-19): Type 1 Configured UL grant
+    configuredUL-GrantType1-r16                     ENUMERATED {supported}                      OPTIONAL,
+    -- 10-43 (5-20): Type 2 Configured UL grant
+    configuredUL-GrantType2-r16                     ENUMERATED {supported}                      OPTIONAL,
+    -- 10-44 (5-21): Pre-emption indication for DL
+    pre-EmptIndication-DL-r16                       ENUMERATED {supported}                      OPTIONAL,
+    ...
+}
+
+-- TAG-PHY-PARAMETERSSHAREDSPECTRUMCHACCESS-STOP
+-- TAG-POWSAV-PARAMETERS-START
+
+PowSav-Parameters-r16 ::=         SEQUENCE {
+    powSav-ParametersCommon-r16               PowSav-ParametersCommon-r16                                        OPTIONAL,
+    powSav-ParametersFRX-Diff-r16             PowSav-ParametersFRX-Diff-r16                                      OPTIONAL,
+    ...
+}
+
+PowSav-ParametersCommon-r16 ::=    SEQUENCE {
+    drx-Preference-r16                        ENUMERATED {supported}                                             OPTIONAL,
+    maxCC-Preference-r16                      ENUMERATED {supported}                                             OPTIONAL,
+    releasePreference-r16                     ENUMERATED {supported}                                             OPTIONAL,
+    -- R1 19-4a: UE assistance information
+    minSchedulingOffsetPreference-r16         ENUMERATED {supported}                                             OPTIONAL,
+    ...
+}
+
+PowSav-ParametersFRX-Diff-r16 ::=    SEQUENCE {
+    maxBW-Preference-r16                      ENUMERATED {supported}                                             OPTIONAL,
+    maxMIMO-LayerPreference-r16               ENUMERATED {supported}                                             OPTIONAL,
+    ...
+}
+
+-- TAG-POWSAV-PARAMETERS-STOP
+-- TAG-PROCESSINGPARAMETERS-START
+
+ProcessingParameters ::=        SEQUENCE {
+    fallback                        ENUMERATED {sc, cap1-only},
+    differentTB-PerSlot              SEQUENCE {
+        upto1                          NumberOfCarriers                    OPTIONAL,
+        upto2                          NumberOfCarriers                    OPTIONAL,
+        upto4                          NumberOfCarriers                    OPTIONAL,
+        upto7                          NumberOfCarriers                    OPTIONAL
+    }                                                                 OPTIONAL
+}
+
+NumberOfCarriers ::=    INTEGER (1..16)
+
+-- TAG-PROCESSINGPARAMETERS-STOP
+-- TAG-RAT-TYPE-START
+
+RAT-Type ::= ENUMERATED {nr, eutra-nr, eutra, utra-fdd-v1610, ...}
+
+-- TAG-RAT-TYPE-STOP
+-- TAG-RF-PARAMETERS-START
+
+RF-Parameters ::=                                   SEQUENCE {
+    supportedBandListNR                                 SEQUENCE (SIZE (1..maxBands)) OF BandNR,
+    supportedBandCombinationList                        BandCombinationList                         OPTIONAL,
+    appliedFreqBandListFilter                           FreqBandList                                OPTIONAL,
+    ...,
+    [[
+    supportedBandCombinationList-v1540                  BandCombinationList-v1540                   OPTIONAL,
+    srs-SwitchingTimeRequested                          ENUMERATED {true}                           OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1550                  BandCombinationList-v1550                   OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1560                  BandCombinationList-v1560                   OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1610                  BandCombinationList-v1610                   OPTIONAL,
+    supportedBandCombinationListSidelinkEUTRA-NR-r16    BandCombinationListSidelinkEUTRA-NR-r16     OPTIONAL,
+    supportedBandCombinationList-UplinkTxSwitch-r16     BandCombinationList-UplinkTxSwitch-r16      OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1630                  BandCombinationList-v1630                   OPTIONAL,
+    supportedBandCombinationListSidelinkEUTRA-NR-v1630  BandCombinationListSidelinkEUTRA-NR-v1630   OPTIONAL,
+    supportedBandCombinationList-UplinkTxSwitch-v1630   BandCombinationList-UplinkTxSwitch-v1630    OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1640                  BandCombinationList-v1640                   OPTIONAL,
+    supportedBandCombinationList-UplinkTxSwitch-v1640   BandCombinationList-UplinkTxSwitch-v1640    OPTIONAL
+    ]]
+
+}
+
+BandNR ::=                          SEQUENCE {
+    bandNR                              FreqBandIndicatorNR,
+    modifiedMPR-Behaviour               BIT STRING (SIZE (8))                           OPTIONAL,
+    mimo-ParametersPerBand              MIMO-ParametersPerBand                          OPTIONAL,
+    extendedCP                          ENUMERATED {supported}                          OPTIONAL,
+    multipleTCI                         ENUMERATED {supported}                          OPTIONAL,
+    bwp-WithoutRestriction              ENUMERATED {supported}                          OPTIONAL,
+    bwp-SameNumerology                  ENUMERATED {upto2, upto4}                       OPTIONAL,
+    bwp-DiffNumerology                  ENUMERATED {upto4}                              OPTIONAL,
+    crossCarrierScheduling-SameSCS      ENUMERATED {supported}                          OPTIONAL,
+    pdsch-256QAM-FR2                    ENUMERATED {supported}                          OPTIONAL,
+    pusch-256QAM                        ENUMERATED {supported}                          OPTIONAL,
+    ue-PowerClass                       ENUMERATED {pc1, pc2, pc3, pc4}                 OPTIONAL,
+    rateMatchingLTE-CRS                 ENUMERATED {supported}                          OPTIONAL,
+    channelBWs-DL                       CHOICE {
+        fr1                                 SEQUENCE {
+            scs-15kHz                           BIT STRING (SIZE (10))                      OPTIONAL,
+            scs-30kHz                           BIT STRING (SIZE (10))                      OPTIONAL,
+            scs-60kHz                           BIT STRING (SIZE (10))                      OPTIONAL
+        },
+        fr2                                 SEQUENCE {
+            scs-60kHz                           BIT STRING (SIZE (3))                       OPTIONAL,
+            scs-120kHz                          BIT STRING (SIZE (3))                       OPTIONAL
+        }
+    }                                                                                   OPTIONAL,
+    channelBWs-UL                       CHOICE {
+        fr1                                 SEQUENCE {
+            scs-15kHz                           BIT STRING (SIZE (10))                      OPTIONAL,
+            scs-30kHz                           BIT STRING (SIZE (10))                      OPTIONAL,
+            scs-60kHz                           BIT STRING (SIZE (10))                      OPTIONAL
+        },
+        fr2                                 SEQUENCE {
+            scs-60kHz                           BIT STRING (SIZE (3))                       OPTIONAL,
+            scs-120kHz                          BIT STRING (SIZE (3))                       OPTIONAL
+        }
+    }                                                                                   OPTIONAL,
+    ...,
+    [[
+    maxUplinkDutyCycle-PC2-FR1                  ENUMERATED {n60, n70, n80, n90, n100}   OPTIONAL
+    ]],
+    [[
+    pucch-SpatialRelInfoMAC-CE          ENUMERATED {supported}                          OPTIONAL,
+    powerBoosting-pi2BPSK               ENUMERATED {supported}                          OPTIONAL
+    ]],
+    [[
+    maxUplinkDutyCycle-FR2          ENUMERATED {n15, n20, n25, n30, n40, n50, n60, n70, n80, n90, n100}     OPTIONAL
+    ]],
+    [[
+    channelBWs-DL-v1590                 CHOICE {
+        fr1                                 SEQUENCE {
+            scs-15kHz                           BIT STRING (SIZE (16))              OPTIONAL,
+            scs-30kHz                           BIT STRING (SIZE (16))              OPTIONAL,
+            scs-60kHz                           BIT STRING (SIZE (16))              OPTIONAL
+        },
+        fr2                                 SEQUENCE {
+            scs-60kHz                           BIT STRING (SIZE (8))               OPTIONAL,
+            scs-120kHz                          BIT STRING (SIZE (8))               OPTIONAL
+        }
+    }                                                                               OPTIONAL,
+    channelBWs-UL-v1590                 CHOICE {
+        fr1                                 SEQUENCE {
+            scs-15kHz                           BIT STRING (SIZE (16))              OPTIONAL,
+            scs-30kHz                           BIT STRING (SIZE (16))              OPTIONAL,
+            scs-60kHz                           BIT STRING (SIZE (16))              OPTIONAL
+        },
+        fr2                                 SEQUENCE {
+            scs-60kHz                           BIT STRING (SIZE (8))               OPTIONAL,
+            scs-120kHz                          BIT STRING (SIZE (8))               OPTIONAL
+        }
+    }                                                                               OPTIONAL
+    ]],
+    [[
+    asymmetricBandwidthCombinationSet     BIT STRING (SIZE (1..32))           OPTIONAL
+    ]],
+    [[
+    -- R1 10: NR-unlicensed
+    sharedSpectrumChAccessParamsPerBand-r16 SharedSpectrumChAccessParamsPerBand-r16 OPTIONAL,
+    -- R1 11-7b: Independent cancellation of the overlapping PUSCHs in an intra-band UL CA
+    cancelOverlappingPUSCH-r16              ENUMERATED {supported}                  OPTIONAL,
+    -- R1 14-1: Multiple LTE-CRS rate matching patterns
+    multipleRateMatchingEUTRA-CRS-r16       SEQUENCE {
+        maxNumberPatterns-r16               INTEGER (2..6),
+        maxNumberNon-OverlapPatterns-r16    INTEGER (1..3)
+    }                                                                               OPTIONAL,
+    -- R1 14-1a: Two LTE-CRS overlapping rate matching patterns within a part of NR carrier using 15 kHz overlapping with a LTE carrier
+    overlapRateMatchingEUTRA-CRS-r16        ENUMERATED {supported}                  OPTIONAL,
+    -- R1 14-2: PDSCH Type B mapping of length 9 and 10 OFDM symbols
+    pdsch-MappingTypeB-Alt-r16              ENUMERATED {supported}                  OPTIONAL,
+    -- R1 14-3: One slot periodic TRS configuration for FR1
+    oneSlotPeriodicTRS-r16                  ENUMERATED {supported}                  OPTIONAL,
+    olpc-SRS-Pos-r16                        OLPC-SRS-Pos-r16                        OPTIONAL,
+    spatialRelationsSRS-Pos-r16             SpatialRelationsSRS-Pos-r16             OPTIONAL,
+    simulSRS-MIMO-TransWithinBand-r16       ENUMERATED {n2}                         OPTIONAL,
+    channelBW-DL-IAB-r16                    CHOICE {
+        fr1-100mhz                              SEQUENCE {
+            scs-15kHz                               ENUMERATED {supported}          OPTIONAL,
+            scs-30kHz                               ENUMERATED {supported}          OPTIONAL,
+            scs-60kHz                               ENUMERATED {supported}          OPTIONAL
+        },
+        fr2-200mhz                          SEQUENCE {
+            scs-60kHz                           ENUMERATED {supported}              OPTIONAL,
+            scs-120kHz                          ENUMERATED {supported}              OPTIONAL
+        }
+    }                                                                               OPTIONAL,
+    channelBW-UL-IAB-r16                    CHOICE {
+        fr1-100mhz                              SEQUENCE {
+            scs-15kHz                               ENUMERATED {supported}          OPTIONAL,
+            scs-30kHz                               ENUMERATED {supported}          OPTIONAL,
+            scs-60kHz                               ENUMERATED {supported}          OPTIONAL
+        },
+        fr2-200mhz                              SEQUENCE {
+            scs-60kHz                               ENUMERATED {supported}          OPTIONAL,
+            scs-120kHz                              ENUMERATED {supported}          OPTIONAL
+        }
+    }                                                                               OPTIONAL,
+    rasterShift7dot5-IAB-r16                ENUMERATED {supported}                  OPTIONAL,
+    ue-PowerClass-v1610                     ENUMERATED {pc1dot5}                    OPTIONAL,
+    condHandover-r16                        ENUMERATED {supported}                  OPTIONAL,
+    condHandoverFailure-r16                 ENUMERATED {supported}                  OPTIONAL,
+    condHandoverTwoTriggerEvents-r16        ENUMERATED {supported}                  OPTIONAL,
+    condPSCellChange-r16                    ENUMERATED {supported}                  OPTIONAL,
+    condPSCellChangeTwoTriggerEvents-r16    ENUMERATED {supported}                  OPTIONAL,
+    mpr-PowerBoost-FR2-r16                  ENUMERATED {supported}                  OPTIONAL,
+
+    -- R1 11-9: Multiple active configured grant configurations for a BWP of a serving cell
+    activeConfiguredGrant-r16               SEQUENCE {
+    maxNumberConfigsPerBWP-r16                  ENUMERATED {n1, n2, n4, n8, n12},
+    maxNumberConfigsAllCC-r16                   INTEGER (2..32)
+    }                                                                               OPTIONAL,
+    -- R1 11-9a: Joint release in a DCI for two or more configured grant Type 2 configurations for a given BWP of a serving cell
+    jointReleaseConfiguredGrantType2-r16    ENUMERATED {supported}                  OPTIONAL,
+    -- R1 12-2: Multiple SPS configurations
+    sps-r16                                 SEQUENCE {
+    maxNumberConfigsPerBWP-r16                  INTEGER (1..8),
+    maxNumberConfigsAllCC-r16                   INTEGER (2..32)
+    }                                                                               OPTIONAL,
+    -- R1 12-2a: Joint release in a DCI for two or more SPS configurations for a given BWP of a serving cell
+    jointReleaseSPS-r16                     ENUMERATED {supported}                  OPTIONAL,
+    -- R1 13-19: Simultaneous positioning SRS and MIMO SRS transmission within a band across multiple CCs
+    simulSRS-TransWithinBand-r16            ENUMERATED {n2}                         OPTIONAL,
+    trs-AdditionalBandwidth-r16             ENUMERATED {trs-AddBW-Set1, trs-AddBW-Set2}  OPTIONAL,
+    handoverIntraF-IAB-r16                  ENUMERATED {supported}                  OPTIONAL
+    ]],
+    [[
+    -- R1 22-5a: Simultaneous transmission of SRS for antenna switching and SRS for CB/NCB /BM for intra-band UL CA
+    -- R1 22-5c: Simultaneous transmission of SRS for antenna switching and SRS for antenna switching for intra-band UL CA
+    simulTX-SRS-AntSwitchingIntraBandUL-CA-r16  SimulSRS-ForAntennaSwitching-r16            OPTIONAL,
+    -- R1 10: NR-unlicensed
+    sharedSpectrumChAccessParamsPerBand-v1630   SharedSpectrumChAccessParamsPerBand-v1630   OPTIONAL
+    ]],
+    [[
+    handoverUTRA-FDD-r16                      ENUMERATED {supported}                       OPTIONAL,
+    -- R4 7-4: Report the shorter transient capability supported by the UE: 2, 4 or 7us
+    enhancedUL-TransientPeriod-r16            ENUMERATED {us2, us4, us7}                   OPTIONAL,
+    sharedSpectrumChAccessParamsPerBand-v1640 SharedSpectrumChAccessParamsPerBand-v1640    OPTIONAL
+    ]]
+}
+
+-- TAG-RF-PARAMETERS-STOP
+-- TAG-RF-PARAMETERSMRDC-START
+
+RF-ParametersMRDC ::=                   SEQUENCE {
+    supportedBandCombinationList            BandCombinationList                             OPTIONAL,
+    appliedFreqBandListFilter               FreqBandList                                    OPTIONAL,
+    ...,
+    [[
+    srs-SwitchingTimeRequested              ENUMERATED {true}                               OPTIONAL,
+    supportedBandCombinationList-v1540      BandCombinationList-v1540                       OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1550      BandCombinationList-v1550                       OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1560      BandCombinationList-v1560                       OPTIONAL,
+    supportedBandCombinationListNEDC-Only   BandCombinationList                             OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1570      BandCombinationList-v1570                       OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1580      BandCombinationList-v1580                       OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1590      BandCombinationList-v1590                       OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationListNEDC-Only-v15a0    SEQUENCE {
+        supportedBandCombinationList-v1540      BandCombinationList-v1540                   OPTIONAL,
+        supportedBandCombinationList-v1560      BandCombinationList-v1560                   OPTIONAL,
+        supportedBandCombinationList-v1570      BandCombinationList-v1570                   OPTIONAL,
+        supportedBandCombinationList-v1580      BandCombinationList-v1580                   OPTIONAL,
+        supportedBandCombinationList-v1590      BandCombinationList-v1590                   OPTIONAL
+    }                                                                                       OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1610      BandCombinationList-v1610                       OPTIONAL,
+    supportedBandCombinationListNEDC-Only-v1610   BandCombinationList-v1610                 OPTIONAL,
+    supportedBandCombinationList-UplinkTxSwitch-r16 BandCombinationList-UplinkTxSwitch-r16  OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1630                  BandCombinationList-v1630                   OPTIONAL,
+    supportedBandCombinationListNEDC-Only-v1630         BandCombinationList-v1630                   OPTIONAL,
+    supportedBandCombinationList-UplinkTxSwitch-v1630   BandCombinationList-UplinkTxSwitch-v1630    OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1640                  BandCombinationList-v1640                   OPTIONAL,
+    supportedBandCombinationListNEDC-Only-v1640         BandCombinationList-v1640                   OPTIONAL,
+    supportedBandCombinationList-UplinkTxSwitch-v1640   BandCombinationList-UplinkTxSwitch-v1640    OPTIONAL
+    ]]
+}
+
+-- TAG-RF-PARAMETERSMRDC-STOP
+-- TAG-RLC-PARAMETERS-START
+
+RLC-Parameters ::= SEQUENCE {
+    am-WithShortSN                  ENUMERATED {supported}  OPTIONAL,
+    um-WithShortSN                  ENUMERATED {supported}  OPTIONAL,
+    um-WithLongSN                   ENUMERATED {supported}  OPTIONAL,
+    ...,
+    [[
+    extendedT-PollRetransmit-r16    ENUMERATED {supported}  OPTIONAL,
+    extendedT-StatusProhibit-r16    ENUMERATED {supported}  OPTIONAL
+    ]]
+}
+
+-- TAG-RLC-PARAMETERS-STOP
+-- TAG-SDAP-PARAMETERS-START
+
+SDAP-Parameters ::= SEQUENCE {
+    as-ReflectiveQoS                 ENUMERATED {true}               OPTIONAL,
+    ...,
+    [[
+    sdap-QOS-IAB-r16              ENUMERATED {supported}       OPTIONAL,
+    sdapHeaderIAB-r16             ENUMERATED {supported}       OPTIONAL
+    ]]
+
+}
+
+-- TAG-SDAP-PARAMETERS-STOP
+-- TAG-SIDELINKPARAMETERS-START
+
+SidelinkParameters-r16 ::=    SEQUENCE {
+    sidelinkParametersNR-r16                  SidelinkParametersNR-r16                                                  OPTIONAL,
+    sidelinkParametersEUTRA-r16               SidelinkParametersEUTRA-r16                                               OPTIONAL
+}
+
+SidelinkParametersNR-r16 ::= SEQUENCE {
+    rlc-ParametersSidelink-r16                RLC-ParametersSidelink-r16                                                OPTIONAL,
+    mac-ParametersSidelink-r16                MAC-ParametersSidelink-r16                                                OPTIONAL,
+    fdd-Add-UE-Sidelink-Capabilities-r16      UE-SidelinkCapabilityAddXDD-Mode-r16                                      OPTIONAL,
+    tdd-Add-UE-Sidelink-Capabilities-r16      UE-SidelinkCapabilityAddXDD-Mode-r16                                      OPTIONAL,
+    supportedBandListSidelink-r16             SEQUENCE (SIZE (1..maxBands)) OF BandSidelink-r16                         OPTIONAL,
+    ...
+}
+
+SidelinkParametersEUTRA-r16 ::= SEQUENCE {
+    sl-ParametersEUTRA1-r16                   OCTET STRING                                                              OPTIONAL,
+    sl-ParametersEUTRA2-r16                   OCTET STRING                                                              OPTIONAL,
+    sl-ParametersEUTRA3-r16                   OCTET STRING                                                              OPTIONAL,
+    supportedBandListSidelinkEUTRA-r16        SEQUENCE (SIZE (1..maxBandsEUTRA)) OF BandSidelinkEUTRA-r16               OPTIONAL,
+    ...
+}
+
+RLC-ParametersSidelink-r16 ::= SEQUENCE {
+    am-WithLongSN-Sidelink-r16                ENUMERATED {supported}                                                    OPTIONAL,
+    um-WithLongSN-Sidelink-r16                ENUMERATED {supported}                                                    OPTIONAL,
+    ...
+}
+
+MAC-ParametersSidelink-r16 ::= SEQUENCE {
+    mac-ParametersSidelinkCommon-r16          MAC-ParametersSidelinkCommon-r16                                          OPTIONAL,
+    mac-ParametersSidelinkXDD-Diff-r16        MAC-ParametersSidelinkXDD-Diff-r16                                        OPTIONAL,
+    ...
+}
+
+UE-SidelinkCapabilityAddXDD-Mode-r16 ::=  SEQUENCE {
+    mac-ParametersSidelinkXDD-Diff-r16        MAC-ParametersSidelinkXDD-Diff-r16                                        OPTIONAL
+}
+
+MAC-ParametersSidelinkCommon-r16 ::= SEQUENCE {
+    lcp-RestrictionSidelink-r16               ENUMERATED {supported}                                                    OPTIONAL,
+    multipleConfiguredGrantsSidelink-r16      ENUMERATED {supported}                                                    OPTIONAL,
+    ...
+}
+
+MAC-ParametersSidelinkXDD-Diff-r16 ::=  SEQUENCE {
+    multipleSR-ConfigurationsSidelink-r16     ENUMERATED {supported}                                                    OPTIONAL,
+    logicalChannelSR-DelayTimerSidelink-r16   ENUMERATED {supported}                                                    OPTIONAL,
+    ...
+}
+
+BandSidelinkEUTRA-r16 ::=               SEQUENCE {
+    freqBandSidelinkEUTRA-r16               FreqBandIndicatorEUTRA,
+    -- R1 15-7: Transmitting LTE sidelink mode 3 scheduled by NR Uu
+    gnb-ScheduledMode3SidelinkEUTRA-r16     SEQUENCE {
+        gnb-ScheduledMode3DelaySidelinkEUTRA-r16 ENUMERATED {ms0, ms0dot25, ms0dot5, ms0dot625, ms0dot75, ms1,
+                                                             ms1dot25, ms1dot5, ms1dot75, ms2, ms2dot5, ms3, ms4,
+                                                             ms5, ms6, ms8, ms10, ms20}
+    }                                                                                                                   OPTIONAL,
+    -- R1 15-9: Transmitting LTE sidelink mode 4 configured by NR Uu
+    gnb-ScheduledMode4SidelinkEUTRA-r16     ENUMERATED {supported}                                                      OPTIONAL
+}
+
+BandSidelink-r16 ::=  SEQUENCE {
+    freqBandSidelink-r16                          FreqBandIndicatorNR,
+    --15-1
+    sl-Reception-r16                              SEQUENCE {
+        harq-RxProcessSidelink-r16                    ENUMERATED {n16, n24, n32, n48, n64},
+        pscch-RxSidelink-r16                          ENUMERATED {value1, value2},
+        scs-CP-PatternRxSidelink-r16                  CHOICE {
+            fr1-r16                                       SEQUENCE {
+                scs-15kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL,
+                scs-30kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL,
+                scs-60kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL
+            },
+            fr2-r16                                       SEQUENCE {
+                scs-60kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL,
+                scs-120kHz-r16                                BIT STRING (SIZE (16))                OPTIONAL
+            }
+        }                                                                                           OPTIONAL,
+        extendedCP-RxSidelink-r16                     ENUMERATED {supported}                        OPTIONAL
+    }                                                                                               OPTIONAL,
+    --15-2
+    sl-TransmissionMode1-r16                      SEQUENCE {
+        harq-TxProcessModeOneSidelink-r16             ENUMERATED {n8, n16},
+        scs-CP-PatternTxSidelinkModeOne-r16           CHOICE {
+            fr1-r16                                       SEQUENCE {
+                scs-15kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL,
+                scs-30kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL,
+                scs-60kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL
+            },
+            fr2-r16                                       SEQUENCE {
+                scs-60kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL,
+                scs-120kHz-r16                                BIT STRING (SIZE (16))                OPTIONAL
+            }
+        },
+        extendedCP-TxSidelink-r16                     ENUMERATED {supported}                        OPTIONAL,
+        harq-ReportOnPUCCH-r16                        ENUMERATED {supported}                        OPTIONAL
+    }                                                                                               OPTIONAL,
+    --15-4
+    sync-Sidelink-r16                             SEQUENCE {
+        gNB-Sync-r16                                  ENUMERATED {supported}                        OPTIONAL,
+        gNB-GNSS-UE-SyncWithPriorityOnGNB-ENB-r16     ENUMERATED {supported}                        OPTIONAL,
+        gNB-GNSS-UE-SyncWithPriorityOnGNSS-r16        ENUMERATED {supported}                        OPTIONAL
+    }                                                                                               OPTIONAL,
+    --15-10
+    sl-Tx-256QAM-r16                              ENUMERATED {supported}                            OPTIONAL,
+    --15-11
+    psfch-FormatZeroSidelink-r16                  SEQUENCE {
+        psfch-RxNumber                                ENUMERATED {n5, n15, n25, n32, n35, n45, n50, n64},
+        psfch-TxNumber                                ENUMERATED {n4, n8, n16}
+    }                                                                                               OPTIONAL,
+    --15-12
+    lowSE-64QAM-MCS-TableSidelink-r16             ENUMERATED {supported}                            OPTIONAL,
+    --15-15
+    enb-sync-Sidelink-r16                         ENUMERATED {supported}                            OPTIONAL,
+    ...,
+    [[
+    --15-3
+    sl-TransmissionMode2-r16                      SEQUENCE {
+        harq-TxProcessModeTwoSidelink-r16              ENUMERATED {n8, n16},
+        scs-CP-PatternTxSidelinkModeTwo-r16           ENUMERATED {supported}                        OPTIONAL,
+        dl-openLoopPC-Sidelink-r16                    ENUMERATED {supported}                        OPTIONAL
+    }                                                                                               OPTIONAL,
+    --15-5
+    congestionControlSidelink-r16                 SEQUENCE {
+        cbr-ReportSidelink-r16                        ENUMERATED {supported}                        OPTIONAL,
+        cbr-CR-TimeLimitSidelink-r16                  ENUMERATED {time1, time2}
+    }                                                                                               OPTIONAL,
+    --15-22
+    fewerSymbolSlotSidelink-r16                   ENUMERATED {supported}                            OPTIONAL,
+    --15-23
+    sl-openLoopPC-RSRP-ReportSidelink-r16         ENUMERATED {supported}                            OPTIONAL,
+    --13-1
+    sl-Rx-256QAM-r16                              ENUMERATED {supported}                            OPTIONAL
+    ]]
+}
+
+-- TAG-SIDELINKPARAMETERS-STOP
+-- TAG-SON-PARAMETERS-START
+
+SON-Parameters-r16 ::= SEQUENCE {
+    rach-Report-r16        ENUMERATED {supported}    OPTIONAL,
+    ...
+}
+
+-- TAG-SON-PARAMETERS-STOP
+-- TAG-SPATIALRELATIONSSRS-POS-START
+
+SpatialRelationsSRS-Pos-r16 ::=                    SEQUENCE {
+    spatialRelation-SRS-PosBasedOnSSB-Serving-r16      ENUMERATED {supported}                OPTIONAL,
+    spatialRelation-SRS-PosBasedOnCSI-RS-Serving-r16   ENUMERATED {supported}                OPTIONAL,
+    spatialRelation-SRS-PosBasedOnPRS-Serving-r16      ENUMERATED {supported}                OPTIONAL,
+    spatialRelation-SRS-PosBasedOnSRS-r16              ENUMERATED {supported}                OPTIONAL,
+    spatialRelation-SRS-PosBasedOnSSB-Neigh-r16        ENUMERATED {supported}                OPTIONAL,
+    spatialRelation-SRS-PosBasedOnPRS-Neigh-r16        ENUMERATED {supported}                OPTIONAL
+}
+
+--TAG-SPATIALRELATIONSSRS-POS-STOP
+-- TAG-SRS-SWITCHINGTIMENR-START
+
+SRS-SwitchingTimeNR ::= SEQUENCE {
+    switchingTimeDL         ENUMERATED {n0us, n30us, n100us, n140us, n200us, n300us, n500us, n900us}  OPTIONAL,
+    switchingTimeUL         ENUMERATED {n0us, n30us, n100us, n140us, n200us, n300us, n500us, n900us}  OPTIONAL
+}
+
+-- TAG-SRS-SWITCHINGTIMENR-STOP
+-- TAG-SRS-SWITCHINGTIMEEUTRA-START
+
+SRS-SwitchingTimeEUTRA ::= SEQUENCE {
+    switchingTimeDL            ENUMERATED {n0, n0dot5, n1, n1dot5, n2, n2dot5, n3, n3dot5, n4, n4dot5, n5, n5dot5, n6, n6dot5, n7}
+                                                                                               OPTIONAL,
+    switchingTimeUL            ENUMERATED {n0, n0dot5, n1, n1dot5, n2, n2dot5, n3, n3dot5, n4, n4dot5, n5, n5dot5, n6, n6dot5, n7}
+                                                                                               OPTIONAL
+}
+-- TAG-SRS-SWITCHINGTIMEEUTRA-STOP
+-- TAG-SUPPORTEDBANDWIDTH-START
+
+SupportedBandwidth ::=      CHOICE {
+    fr1                         ENUMERATED {mhz5, mhz10, mhz15, mhz20, mhz25, mhz30, mhz40, mhz50, mhz60, mhz80, mhz100},
+    fr2                         ENUMERATED {mhz50, mhz100, mhz200, mhz400}
+}
+
+-- TAG-SUPPORTEDBANDWIDTH-STOP
+-- TAG-UE-BASEDPERFMEAS-PARAMETERS-START
+
+UE-BasedPerfMeas-Parameters-r16 ::= SEQUENCE {
+    barometerMeasReport-r16      ENUMERATED {supported}        OPTIONAL,
+    immMeasBT-r16                ENUMERATED {supported}        OPTIONAL,
+    immMeasWLAN-r16              ENUMERATED {supported}        OPTIONAL,
+    loggedMeasBT-r16             ENUMERATED {supported}        OPTIONAL,
+    loggedMeasurements-r16       ENUMERATED {supported}        OPTIONAL,
+    loggedMeasWLAN-r16           ENUMERATED {supported}        OPTIONAL,
+    orientationMeasReport-r16    ENUMERATED {supported}        OPTIONAL,
+    speedMeasReport-r16          ENUMERATED {supported}        OPTIONAL,
+    gnss-Location-r16            ENUMERATED {supported}        OPTIONAL,
+    ulPDCP-Delay-r16             ENUMERATED {supported}        OPTIONAL,
+   ...
+}
+
+-- TAG-UE-BASEDPERFMEAS-PARAMETERS-STOP
+-- TAG-UE-CAPABILITYRAT-CONTAINERLIST-START
+
+UE-CapabilityRAT-ContainerList ::=    SEQUENCE (SIZE (0..maxRAT-CapabilityContainers)) OF UE-CapabilityRAT-Container
+
+UE-CapabilityRAT-Container ::=        SEQUENCE {
+    rat-Type                              RAT-Type,
+    ue-CapabilityRAT-Container            OCTET STRING
+}
+
+-- TAG-UE-CAPABILITYRAT-CONTAINERLIST-STOP
+-- TAG-UE-CAPABILITYRAT-REQUESTLIST-START
+
+UE-CapabilityRAT-RequestList ::=        SEQUENCE (SIZE (1..maxRAT-CapabilityContainers)) OF UE-CapabilityRAT-Request
+
+UE-CapabilityRAT-Request ::=            SEQUENCE {
+    rat-Type                                RAT-Type,
+    capabilityRequestFilter                 OCTET STRING                    OPTIONAL,   -- Need N
+    ...
+}
+
+-- TAG-UE-CAPABILITYRAT-REQUESTLIST-STOP
+-- TAG-UE-CAPABILITYREQUESTFILTERCOMMON-START
+
+UE-CapabilityRequestFilterCommon ::=            SEQUENCE {
+    mrdc-Request                                SEQUENCE {
+        omitEN-DC                                   ENUMERATED {true}                      OPTIONAL,    -- Need N
+        includeNR-DC                                ENUMERATED {true}                      OPTIONAL,    -- Need N
+        includeNE-DC                                ENUMERATED {true}                      OPTIONAL     -- Need N
+    }                                                                                  OPTIONAL,        -- Need N
+    ...,
+    [[
+    codebookTypeRequest-r16        SEQUENCE {
+        type1-SinglePanel-r16          ENUMERATED {true}                                    OPTIONAL,    -- Need N
+        type1-MultiPanel-r16           ENUMERATED {true}                                    OPTIONAL,    -- Need N
+        type2-r16                      ENUMERATED {true}                                    OPTIONAL,    -- Need N
+        type2-PortSelection-r16        ENUMERATED {true}                                    OPTIONAL     -- Need N
+    }                                                                                   OPTIONAL,    -- Need N
+    uplinkTxSwitchRequest-r16      ENUMERATED {true}                                    OPTIONAL     -- Need N
+    ]]
+}
+
+-- TAG-UE-CAPABILITYREQUESTFILTERCOMMON-STOP
+-- TAG-UE-CAPABILITYREQUESTFILTERNR-START
+
+UE-CapabilityRequestFilterNR ::=            SEQUENCE {
+    frequencyBandListFilter                     FreqBandList                          OPTIONAL,   -- Need N
+    nonCriticalExtension                        UE-CapabilityRequestFilterNR-v1540    OPTIONAL
+}
+
+UE-CapabilityRequestFilterNR-v1540 ::=      SEQUENCE {
+    srs-SwitchingTimeRequest                    ENUMERATED {true}                     OPTIONAL,  -- Need N
+    nonCriticalExtension                        SEQUENCE {}                           OPTIONAL
+}
+
+-- TAG-UE-CAPABILITYREQUESTFILTERNR-STOP
+-- TAG-UE-MRDC-CAPABILITY-START
+
+UE-MRDC-Capability ::=              SEQUENCE {
+    measAndMobParametersMRDC            MeasAndMobParametersMRDC                                                        OPTIONAL,
+    phy-ParametersMRDC-v1530            Phy-ParametersMRDC                                                              OPTIONAL,
+    rf-ParametersMRDC                   RF-ParametersMRDC,
+    generalParametersMRDC               GeneralParametersMRDC-XDD-Diff                                                  OPTIONAL,
+    fdd-Add-UE-MRDC-Capabilities        UE-MRDC-CapabilityAddXDD-Mode                                                   OPTIONAL,
+    tdd-Add-UE-MRDC-Capabilities        UE-MRDC-CapabilityAddXDD-Mode                                                   OPTIONAL,
+    fr1-Add-UE-MRDC-Capabilities        UE-MRDC-CapabilityAddFRX-Mode                                                   OPTIONAL,
+    fr2-Add-UE-MRDC-Capabilities        UE-MRDC-CapabilityAddFRX-Mode                                                   OPTIONAL,
+    featureSetCombinations              SEQUENCE (SIZE (1..maxFeatureSetCombinations)) OF FeatureSetCombination         OPTIONAL,
+    pdcp-ParametersMRDC-v1530           PDCP-ParametersMRDC                                                             OPTIONAL,
+    lateNonCriticalExtension            OCTET STRING                                                                    OPTIONAL,
+    nonCriticalExtension                UE-MRDC-Capability-v1560                                                        OPTIONAL
+}
+
+UE-MRDC-Capability-v1560 ::=        SEQUENCE {
+    receivedFilters                     OCTET STRING (CONTAINING UECapabilityEnquiry-v1560-IEs)                         OPTIONAL,
+    measAndMobParametersMRDC-v1560      MeasAndMobParametersMRDC-v1560                                                  OPTIONAL,
+    fdd-Add-UE-MRDC-Capabilities-v1560  UE-MRDC-CapabilityAddXDD-Mode-v1560                                             OPTIONAL,
+    tdd-Add-UE-MRDC-Capabilities-v1560  UE-MRDC-CapabilityAddXDD-Mode-v1560                                             OPTIONAL,
+    nonCriticalExtension                UE-MRDC-Capability-v1610                                                        OPTIONAL
+}
+
+UE-MRDC-Capability-v1610 ::=        SEQUENCE {
+    measAndMobParametersMRDC-v1610      MeasAndMobParametersMRDC-v1610                                                  OPTIONAL,
+    generalParametersMRDC-v1610         GeneralParametersMRDC-v1610                                                     OPTIONAL,
+    pdcp-ParametersMRDC-v1610           PDCP-ParametersMRDC-v1610                                                       OPTIONAL,
+    nonCriticalExtension                SEQUENCE {}                                                                     OPTIONAL
+}
+
+UE-MRDC-CapabilityAddXDD-Mode ::=   SEQUENCE {
+    measAndMobParametersMRDC-XDD-Diff       MeasAndMobParametersMRDC-XDD-Diff                                           OPTIONAL,
+    generalParametersMRDC-XDD-Diff          GeneralParametersMRDC-XDD-Diff                                              OPTIONAL
+}
+
+UE-MRDC-CapabilityAddXDD-Mode-v1560 ::=    SEQUENCE {
+    measAndMobParametersMRDC-XDD-Diff-v1560    MeasAndMobParametersMRDC-XDD-Diff-v1560                                  OPTIONAL
+}
+
+UE-MRDC-CapabilityAddFRX-Mode ::=   SEQUENCE {
+    measAndMobParametersMRDC-FRX-Diff       MeasAndMobParametersMRDC-FRX-Diff
+}
+
+
+GeneralParametersMRDC-XDD-Diff ::= SEQUENCE {
+    splitSRB-WithOneUL-Path             ENUMERATED {supported}                                                          OPTIONAL,
+    splitDRB-withUL-Both-MCG-SCG        ENUMERATED {supported}                                                          OPTIONAL,
+    srb3                                ENUMERATED {supported}                                                          OPTIONAL,
+    dummy                               ENUMERATED {supported}                                                          OPTIONAL,
+    ...
+}
+
+GeneralParametersMRDC-v1610 ::= SEQUENCE {
+    f1c-OverEUTRA-r16                   ENUMERATED {supported}                                                          OPTIONAL
+}
+
+-- TAG-UE-MRDC-CAPABILITY-STOP
+-- TAG-UE-NR-CAPABILITY-START
+
+UE-NR-Capability ::=            SEQUENCE {
+    accessStratumRelease            AccessStratumRelease,
+    pdcp-Parameters                 PDCP-Parameters,
+    rlc-Parameters                  RLC-Parameters                                                        OPTIONAL,
+    mac-Parameters                  MAC-Parameters                                                        OPTIONAL,
+    phy-Parameters                  Phy-Parameters,
+    rf-Parameters                   RF-Parameters,
+    measAndMobParameters            MeasAndMobParameters                                                  OPTIONAL,
+    fdd-Add-UE-NR-Capabilities      UE-NR-CapabilityAddXDD-Mode                                           OPTIONAL,
+    tdd-Add-UE-NR-Capabilities      UE-NR-CapabilityAddXDD-Mode                                           OPTIONAL,
+    fr1-Add-UE-NR-Capabilities      UE-NR-CapabilityAddFRX-Mode                                           OPTIONAL,
+    fr2-Add-UE-NR-Capabilities      UE-NR-CapabilityAddFRX-Mode                                           OPTIONAL,
+    featureSets                     FeatureSets                                                           OPTIONAL,
+    featureSetCombinations          SEQUENCE (SIZE (1..maxFeatureSetCombinations)) OF FeatureSetCombination         OPTIONAL,
+    lateNonCriticalExtension        OCTET STRING (CONTAINING UE-NR-Capability-v15c0)                      OPTIONAL,
+    nonCriticalExtension            UE-NR-Capability-v1530                                                OPTIONAL
+}
+
+-- Regular non-critical extensions:
+UE-NR-Capability-v1530 ::=               SEQUENCE {
+    fdd-Add-UE-NR-Capabilities-v1530         UE-NR-CapabilityAddXDD-Mode-v1530                            OPTIONAL,
+    tdd-Add-UE-NR-Capabilities-v1530         UE-NR-CapabilityAddXDD-Mode-v1530                            OPTIONAL,
+    dummy                                    ENUMERATED {supported}                                       OPTIONAL,
+    interRAT-Parameters                      InterRAT-Parameters                                          OPTIONAL,
+    inactiveState                            ENUMERATED {supported}                                       OPTIONAL,
+    delayBudgetReporting                     ENUMERATED {supported}                                       OPTIONAL,
+    nonCriticalExtension                     UE-NR-Capability-v1540                                       OPTIONAL
+}
+
+UE-NR-Capability-v1540 ::=              SEQUENCE {
+    sdap-Parameters                         SDAP-Parameters                                               OPTIONAL,
+    overheatingInd                          ENUMERATED {supported}                                        OPTIONAL,
+    ims-Parameters                          IMS-Parameters                                                OPTIONAL,
+    fr1-Add-UE-NR-Capabilities-v1540        UE-NR-CapabilityAddFRX-Mode-v1540                             OPTIONAL,
+    fr2-Add-UE-NR-Capabilities-v1540        UE-NR-CapabilityAddFRX-Mode-v1540                             OPTIONAL,
+    fr1-fr2-Add-UE-NR-Capabilities          UE-NR-CapabilityAddFRX-Mode                                   OPTIONAL,
+    nonCriticalExtension                    UE-NR-Capability-v1550                                        OPTIONAL
+}
+
+UE-NR-Capability-v1550 ::=               SEQUENCE {
+    reducedCP-Latency                        ENUMERATED {supported}                                       OPTIONAL,
+    nonCriticalExtension                     UE-NR-Capability-v1560                                       OPTIONAL
+}
+
+UE-NR-Capability-v1560 ::=               SEQUENCE {
+    nrdc-Parameters                         NRDC-Parameters                                               OPTIONAL,
+    receivedFilters                         OCTET STRING (CONTAINING UECapabilityEnquiry-v1560-IEs)       OPTIONAL,
+    nonCriticalExtension                    UE-NR-Capability-v1570                                        OPTIONAL
+}
+
+UE-NR-Capability-v1570 ::=               SEQUENCE {
+    nrdc-Parameters-v1570                   NRDC-Parameters-v1570                                         OPTIONAL,
+    nonCriticalExtension                    UE-NR-Capability-v1610                                        OPTIONAL
+}
+
+-- Late non-critical extensions:
+UE-NR-Capability-v15c0 ::=               SEQUENCE {
+    nrdc-Parameters-v15c0                    NRDC-Parameters-v15c0                                        OPTIONAL,
+    partialFR2-FallbackRX-Req                ENUMERATED {true}                                            OPTIONAL,
+    nonCriticalExtension                     SEQUENCE {}                                                  OPTIONAL
+}
+
+-- Regular non-critical extensions:
+UE-NR-Capability-v1610 ::=               SEQUENCE {
+    inDeviceCoexInd-r16                     ENUMERATED {supported}                                        OPTIONAL,
+    dl-DedicatedMessageSegmentation-r16     ENUMERATED {supported}                                        OPTIONAL,
+    nrdc-Parameters-v1610                   NRDC-Parameters-v1610                                         OPTIONAL,
+    powSav-Parameters-r16                   PowSav-Parameters-r16                                         OPTIONAL,
+    fr1-Add-UE-NR-Capabilities-v1610        UE-NR-CapabilityAddFRX-Mode-v1610                             OPTIONAL,
+    fr2-Add-UE-NR-Capabilities-v1610        UE-NR-CapabilityAddFRX-Mode-v1610                             OPTIONAL,
+    bh-RLF-Indication-r16                   ENUMERATED {supported}                                        OPTIONAL,
+    directSN-AdditionFirstRRC-IAB-r16       ENUMERATED {supported}                                        OPTIONAL,
+    bap-Parameters-r16                      BAP-Parameters-r16                                            OPTIONAL,
+    referenceTimeProvision-r16              ENUMERATED {supported}                                        OPTIONAL,
+    sidelinkParameters-r16                  SidelinkParameters-r16                                        OPTIONAL,
+    highSpeedParameters-r16                 HighSpeedParameters-r16                                       OPTIONAL,
+    mac-Parameters-v1610                    MAC-Parameters-v1610                                          OPTIONAL,
+    mcgRLF-RecoveryViaSCG-r16               ENUMERATED {supported}                                        OPTIONAL,
+    resumeWithStoredMCG-SCells-r16          ENUMERATED {supported}                                        OPTIONAL,
+    resumeWithStoredSCG-r16                 ENUMERATED {supported}                                        OPTIONAL,
+    resumeWithSCG-Config-r16                ENUMERATED {supported}                                        OPTIONAL,
+    ue-BasedPerfMeas-Parameters-r16         UE-BasedPerfMeas-Parameters-r16                               OPTIONAL,
+    son-Parameters-r16                      SON-Parameters-r16                                            OPTIONAL,
+    onDemandSIB-Connected-r16               ENUMERATED {supported}                                        OPTIONAL,
+    nonCriticalExtension                    UE-NR-Capability-v1640                                        OPTIONAL
+}
+
+UE-NR-Capability-v1640 ::=               SEQUENCE {
+    redirectAtResumeByNAS-r16               ENUMERATED {supported}                                        OPTIONAL,
+    phy-ParametersSharedSpectrumChAccess-r16  Phy-ParametersSharedSpectrumChAccess-r16                    OPTIONAL,
+    nonCriticalExtension                    SEQUENCE {}                                                   OPTIONAL
+}
+
+UE-NR-CapabilityAddXDD-Mode ::=         SEQUENCE {
+    phy-ParametersXDD-Diff                  Phy-ParametersXDD-Diff                                        OPTIONAL,
+    mac-ParametersXDD-Diff                  MAC-ParametersXDD-Diff                                        OPTIONAL,
+    measAndMobParametersXDD-Diff            MeasAndMobParametersXDD-Diff                                  OPTIONAL
+}
+
+UE-NR-CapabilityAddXDD-Mode-v1530 ::=    SEQUENCE {
+    eutra-ParametersXDD-Diff                 EUTRA-ParametersXDD-Diff
+}
+
+UE-NR-CapabilityAddFRX-Mode ::= SEQUENCE {
+    phy-ParametersFRX-Diff              Phy-ParametersFRX-Diff                                            OPTIONAL,
+    measAndMobParametersFRX-Diff        MeasAndMobParametersFRX-Diff                                      OPTIONAL
+}
+
+UE-NR-CapabilityAddFRX-Mode-v1540 ::=    SEQUENCE {
+    ims-ParametersFRX-Diff                   IMS-ParametersFRX-Diff                                       OPTIONAL
+}
+
+UE-NR-CapabilityAddFRX-Mode-v1610 ::=    SEQUENCE {
+    powSav-ParametersFRX-Diff-r16            PowSav-ParametersFRX-Diff-r16                                OPTIONAL,
+    mac-ParametersFRX-Diff-r16               MAC-ParametersFRX-Diff-r16                                   OPTIONAL
+}
+
+BAP-Parameters-r16 ::=                   SEQUENCE {
+    flowControlBH-RLC-ChannelBased-r16       ENUMERATED {supported}                                       OPTIONAL,
+    flowControlRouting-ID-Based-r16          ENUMERATED {supported}                                       OPTIONAL
+}
+
+-- TAG-UE-NR-CAPABILITY-STOP
+-- TAG-SHAREDSPECTRUMCHACCESSPARAMSPERBAND-START
+
+SharedSpectrumChAccessParamsPerBand-r16 ::=           SEQUENCE {
+
+    -- R1 10-1: UL channel access for dynamic channel access mode
+    ul-DynamicChAccess-r16                              ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-1a: UL channel access for semi-static channel access mode
+    ul-Semi-StaticChAccess-r16                          ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2: SSB-based RRM for dynamic channel access mode
+    ssb-RRM-DynamicChAccess-r16                         ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2a: SSB-based RRM for semi-static channel access mode
+    ssb-RRM-Semi-StaticChAccess-r16                     ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2b: MIB reading on unlicensed cell
+    mib-Acquisition-r16                                 ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2c: SSB-based RLM for dynamic channel access mode
+    ssb-RLM-DynamicChAccess-r16                         ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2d: SSB-based RLM for semi-static channel access mode
+    ssb-RLM-Semi-StaticChAccess-r16                     ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2e: SIB1 reception on unlicensed cell
+    sib1-Acquisition-r16                                ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2f: Support monitoring of extended RAR window
+    extRA-ResponseWindow-r16                            ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2g: SSB-based BFD/CBD for dynamic channel access mode
+    ssb-BFD-CBD-dynamicChannelAccess-r16                ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2h: SSB-based BFD/CBD for semi-static channel access mode
+    ssb-BFD-CBD-semi-staticChannelAccess-r16            ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2i: CSI-RS-based BFD/CBD for NR-U
+    csi-RS-BFD-CBD-r16                                  ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-7: UL channel access for 10 MHz SCell
+    ul-ChannelBW-SCell-10mhz-r16                        ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-10: RSSI and channel occupancy measurement and reporting
+    rssi-ChannelOccupancyReporting-r16                  ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-11:SRS starting position at any OFDM symbol in a slot
+    srs-StartAnyOFDM-Symbol-r16                         ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-20: Support search space set configuration with freqMonitorLocation-r16
+    searchSpaceFreqMonitorLocation-r16                  INTEGER (1..5)                    OPTIONAL,
+    -- R1 10-20a: Support coreset configuration with rb-Offset
+    coreset-RB-Offset-r16                               ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-23:CGI reading on unlicensed cell for ANR functionality
+    cgi-Acquisition-r16                                 ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-25: Enable configured UL transmissions when DCI 2_0 is configured but not detected
+    configuredUL-Tx-r16                                  ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-27: Wideband PRACH
+    prach-Wideband-r16                                  ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-29: Support available RB set indicator field in DCI 2_0
+    dci-AvailableRB-Set-r16                             ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-30: Support channel occupancy duration indicator field in DCI 2_0
+    dci-ChOccupancyDuration-r16                         ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-8: Type B PDSCH length {3, 5, 6, 8, 9, 10, 11, 12, 13} without DMRS shift due to CRS collision
+    typeB-PDSCH-length-r16                              ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-9: Search space set group switching with explicit DCI 2_0 bit field trigger or with implicit PDCCH decoding with DCI 2_0 monitoring
+    searchSpaceSetGroupSwitchingwithDCI-r16             ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-9b: Search space set group switching with implicit PDCCH decoding without DCI 2_0 monitoring FFS:per band or per UE
+    searchSpaceSetGroupSwitchingwithoutDCI-r16          ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-9d: Support Search space set group switching capability 2
+    searchSpaceSetGroupSwitchingcapability2-r16         ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-14: Non-numerical PDSCH to HARQ-ACK timing
+    non-numericalPDSCH-HARQ-timing-r16                  ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-15: Enhanced dynamic HARQ codebook
+    enhancedDynamicHARQ-codebook-r16                    ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-16: One-shot HARQ ACK feedback
+    oneShotHARQ-feedback-r16                            ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-17: Multi-PUSCH UL grant
+    multiPUSCH-UL-grant-r16                             ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-26: CSI-RS based RLM for NR-U
+    csi-RS-RLM-r16                                      ENUMERATED {supported}            OPTIONAL,
+    dummy                                              ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-31: Support of P/SP-CSI-RS reception with CSI-RS-ValidationWith-DCI-r16 configured
+    periodicAndSemi-PersistentCSI-RS-r16                ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-3: PRB interlace mapping for PUSCH
+    pusch-PRB-interlace-r16                             ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-3a: PRB interlace mapping for PUCCH
+    pucch-F0-F1-PRB-Interlace-r16                       ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-12: OCC for PRB interlace mapping for PF2 and PF3
+    occ-PRB-PF2-PF3-r16                                 ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-13a: Extended CP range of more than one symbol for CG-PUSCH
+    extCP-rangeCG-PUSCH-r16                             ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-18: Configured grant with retransmission in CG resources
+    configuredGrantWithReTx-r16                         ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-21a: Support using ED threshold given by gNB for UL to DL COT sharing
+    ed-Threshold-r16                                    ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-21b: Support UL to DL COT sharing
+    ul-DL-COT-Sharing-r16                               ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-24: CG-UCI multiplexing with HARQ ACK
+    mux-CG-UCI-HARQ-ACK-r16                             ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-28: Configured grant with Rel-16 enhanced resource configuration
+    cg-resourceConfig-r16                               ENUMERATED {supported}            OPTIONAL
+}
+
+SharedSpectrumChAccessParamsPerBand-v1630 ::=       SEQUENCE {
+    -- R4 4-1: DL reception in intra-carrier guardband
+    dl-ReceptionIntraCellGuardband-r16                  ENUMERATED {supported}            OPTIONAL,
+    -- R4 4-2: DL reception when gNB does not transmit on all RB sets of a carrier as a result of LBT
+    dl-ReceptionLBT-subsetRB-r16                        ENUMERATED {supported}            OPTIONAL
+}
+
+SharedSpectrumChAccessParamsPerBand-v1640 ::=       SEQUENCE {
+    -- 10-26b(1-4): CSI-RS based RRM measurement with associated SS-block
+    csi-RSRP-AndRSRQ-MeasWithSSB-r16                ENUMERATED {supported}              OPTIONAL,
+    -- 10-26c(1-5): CSI-RS based RRM measurement without associated SS-block
+    csi-RSRP-AndRSRQ-MeasWithoutSSB-r16             ENUMERATED {supported}              OPTIONAL,
+    -- 10-26d(1-6): CSI-RS based RS-SINR measurement
+    csi-SINR-Meas-r16                               ENUMERATED {supported}              OPTIONAL,
+    -- 10-26e(1-8): RLM based on a mix of SS block and CSI-RS signals within active BWP
+    ssb-AndCSI-RS-RLM-r16                       	ENUMERATED {supported}              OPTIONAL,
+    -- 10-26f(1-9): CSI-RS based contention free RA for HO
+    csi-RS-CFRA-ForHO-r16                   		ENUMERATED {supported}              OPTIONAL
+}
+-- TAG-SHAREDSPECTRUMCHACCESSPARAMSPERBAND-STOP
+-- TAG-ABSOLUTETIMEINFO-START
+
+AbsoluteTimeInfo-r16 ::= BIT STRING (SIZE (48))
+
+-- TAG-ABSOLUTETIMEINFO-STOP
+-- TAG-AREACONFIGURATION-START
+
+AreaConfiguration-r16 ::=        SEQUENCE {
+    areaConfig-r16                   AreaConfig-r16,
+    interFreqTargetList-r16          SEQUENCE(SIZE (1..maxFreq)) OF InterFreqTargetInfo-r16              OPTIONAL  -- Need R
+}
+
+AreaConfig-r16 ::=     CHOICE {
+    cellGlobalIdList-r16             CellGlobalIdList-r16,
+    trackingAreaCodeList-r16         TrackingAreaCodeList-r16,
+    trackingAreaIdentityList-r16     TrackingAreaIdentityList-r16
+}
+
+InterFreqTargetInfo-r16    ::=   SEQUENCE {
+    dl-CarrierFreq	                ARFCN-ValueNR,
+    cellList                         SEQUENCE (SIZE (1..32)) OF  PhysCellId  OPTIONAL
+}
+
+CellGlobalIdList-r16 ::=         SEQUENCE (SIZE (1..32)) OF CGI-Info-Logging-r16
+
+TrackingAreaCodeList-r16 ::=     SEQUENCE (SIZE (1..8)) OF TrackingAreaCode
+
+TrackingAreaIdentityList-r16 ::= SEQUENCE (SIZE (1..8)) OF TrackingAreaIdentity-r16
+
+TrackingAreaIdentity-r16 ::=     SEQUENCE {
+    plmn-Identity-r16                PLMN-Identity,
+    trackingAreaCode-r16             TrackingAreaCode
+}
+
+-- TAG-AREACONFIGURATION-STOP
+-- TAG-BTNAMELIST-START
+
+BT-NameList-r16 ::=                SEQUENCE (SIZE (1..maxBT-Name-r16)) OF BT-Name-r16
+
+BT-Name-r16 ::=                    OCTET STRING (SIZE (1..248))
+
+-- TAG-BTNAMELIST-STOP
+-- TAG-EUTRA-ALLOWEDMEASBANDWIDTH-START
+
+EUTRA-AllowedMeasBandwidth ::=              ENUMERATED {mbw6, mbw15, mbw25, mbw50, mbw75, mbw100}
+
+-- TAG-EUTRA-ALLOWEDMEASBANDWIDTH-STOP
+-- TAG-EUTRA-MBSFN-SUBFRAMECONFIGLIST-START
+
+EUTRA-MBSFN-SubframeConfigList ::= SEQUENCE (SIZE (1..maxMBSFN-Allocations)) OF EUTRA-MBSFN-SubframeConfig
+
+EUTRA-MBSFN-SubframeConfig ::=      SEQUENCE {
+    radioframeAllocationPeriod          ENUMERATED {n1, n2, n4, n8, n16, n32},
+    radioframeAllocationOffset          INTEGER (0..7),
+    subframeAllocation1                 CHOICE {
+        oneFrame                            BIT STRING (SIZE(6)),
+        fourFrames                          BIT STRING (SIZE(24))
+    },
+    subframeAllocation2                 CHOICE {
+        oneFrame                            BIT STRING (SIZE(2)),
+        fourFrames                          BIT STRING (SIZE(8))
+    }                                                                                                       OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-EUTRA-MBSFN-SUBFRAMECONFIGLIST-STOP
+-- TAG-EUTRA-MULTIBANDINFOLIST-START
+
+EUTRA-MultiBandInfoList ::=     SEQUENCE (SIZE (1..maxMultiBands)) OF EUTRA-MultiBandInfo
+
+EUTRA-MultiBandInfo ::=         SEQUENCE {
+    eutra-FreqBandIndicator         FreqBandIndicatorEUTRA,
+    eutra-NS-PmaxList               EUTRA-NS-PmaxList                           OPTIONAL    -- Need R
+}
+
+-- TAG-EUTRA-MULTIBANDINFOLIST-STOP
+-- TAG-EUTRA-NS-PMAXLIST-START
+
+EUTRA-NS-PmaxList ::=               SEQUENCE (SIZE (1..maxEUTRA-NS-Pmax)) OF EUTRA-NS-PmaxValue
+
+EUTRA-NS-PmaxValue ::=              SEQUENCE {
+    additionalPmax                      INTEGER (-30..33)                       OPTIONAL,   -- Need R
+    additionalSpectrumEmission          INTEGER (1..288)                        OPTIONAL    -- Need R
+}
+
+-- TAG-EUTRA-NS-PMAXLIST-STOP
+-- TAG-EUTRA-PHYSCELLID-START
+
+EUTRA-PhysCellId ::=                        INTEGER (0..503)
+
+-- TAG-EUTRA-PHYSCELLID-STOP
+-- TAG-EUTRA-PHYSCELLIDRANGE-START
+
+EUTRA-PhysCellIdRange ::=       SEQUENCE {
+    start                           EUTRA-PhysCellId,
+    range                           ENUMERATED {n4, n8, n12, n16, n24, n32, n48, n64, n84, n96,
+                                                n128, n168, n252, n504, spare2, spare1}                         OPTIONAL    -- Need N
+}
+
+-- TAG-EUTRA-PHYSCELLIDRANGE-STOP
+-- TAG-EUTRA-PRESENCEANTENNAPORT1-START
+
+EUTRA-PresenceAntennaPort1 ::=              BOOLEAN
+
+-- TAG-EUTRA-PRESENCEANTENNAPORT1-STOP
+-- TAG-EUTRA-Q-OFFSETRANGE-START
+
+EUTRA-Q-OffsetRange ::=                     ENUMERATED {
+                                                dB-24, dB-22, dB-20, dB-18, dB-16, dB-14,
+                                                dB-12, dB-10, dB-8, dB-6, dB-5, dB-4, dB-3,
+                                                dB-2, dB-1, dB0, dB1, dB2, dB3, dB4, dB5,
+                                                dB6, dB8, dB10, dB12, dB14, dB16, dB18,
+                                                dB20, dB22, dB24}
+
+-- TAG-EUTRA-Q-OFFSETRANGE-STOP
+-- TAG-IABIPADDRESS-START
+
+IAB-IP-Address-r16 ::=  CHOICE {
+    iPv4-Address-r16                BIT STRING (SIZE(32)),
+    iPv6-Address-r16                BIT STRING (SIZE(128)),
+    iPv6-Prefix-r16                 BIT STRING (SIZE(64)),
+    ...
+}
+
+-- TAG-IABIPADDRESS-STOP
+-- TAG-IABIPADDRESSINDEX-START
+
+IAB-IP-AddressIndex-r16 ::= INTEGER (1..maxIAB-IP-Address-r16)
+
+-- TAG-IABIPADDRESSINDEX-STOP
+-- TAG-IAB-IP-USAGE-START
+
+IAB-IP-Usage-r16 ::= ENUMERATED {f1-C, f1-U, non-F1, spare}
+
+-- TAG-IAB-IP-USAGE-STOP
+-- TAG-LOGGINGDURATION-START
+
+LoggingDuration-r16 ::=   ENUMERATED {
+                              min10, min20, min40, min60, min90, min120, spare2, spare1}
+
+-- TAG-LOGGINGDURATION-STOP
+-- TAG-LOGGINGINTERVAL-START
+
+LoggingInterval-r16 ::=   ENUMERATED {
+                              ms320, ms640, ms1280, ms2560, ms5120, ms10240, ms20480,
+                              ms30720, ms40960, ms61440 , infinity}
+
+-- TAG-LOGGINGINTERVAL-STOP
+-- TAG-LOGMEASRESULTLISTBT-START
+
+LogMeasResultListBT-r16 ::= SEQUENCE (SIZE (1..maxBT-IdReport-r16)) OF LogMeasResultBT-r16
+
+LogMeasResultBT-r16 ::= SEQUENCE {
+    bt-Addr-r16             BIT STRING (SIZE (48)),
+    rssi-BT-r16             INTEGER (-128..127)        OPTIONAL,
+    ...
+}
+
+-- TAG-LOGMEASRESULTLISTBT-STOP
+-- TAG-LOGMEASRESULTLISTWLAN-START
+
+LogMeasResultListWLAN-r16 ::=    SEQUENCE (SIZE (1..maxWLAN-Id-Report-r16)) OF LogMeasResultWLAN-r16
+
+LogMeasResultWLAN-r16 ::=        SEQUENCE {
+    wlan-Identifiers-r16             WLAN-Identifiers-r16,
+    rssiWLAN-r16                     WLAN-RSSI-Range-r16          OPTIONAL,
+    rtt-WLAN-r16                     WLAN-RTT-r16                 OPTIONAL,
+    ...
+}
+
+WLAN-Identifiers-r16 ::=         SEQUENCE {
+    ssid-r16                         OCTET STRING (SIZE (1..32))  OPTIONAL,
+    bssid-r16                        OCTET STRING (SIZE (6))      OPTIONAL,
+    hessid-r16                       OCTET STRING (SIZE (6))      OPTIONAL,
+    ...
+}
+
+WLAN-RSSI-Range-r16 ::= INTEGER(0..141)
+
+WLAN-RTT-r16 ::=                 SEQUENCE {
+    rttValue-r16                     INTEGER (0..16777215),
+    rttUnits-r16                     ENUMERATED {
+                                         microseconds,
+                                         hundredsofnanoseconds,
+                                         tensofnanoseconds,
+                                         nanoseconds,
+                                         tenthsofnanoseconds,
+                                         ...},
+    rttAccuracy-r16                  INTEGER (0..255)             OPTIONAL,
+    ...
+}
+
+-- TAG-OTHERCONFIG-START
+
+OtherConfig ::=                 SEQUENCE {
+    delayBudgetReportingConfig  CHOICE{
+        release                 NULL,
+        setup                   SEQUENCE{
+            delayBudgetReportingProhibitTimer   ENUMERATED {s0, s0dot4, s0dot8, s1dot6, s3, s6, s12, s30}
+        }
+    }                                                                                                     OPTIONAL        -- Need M
+}
+
+OtherConfig-v1540 ::=           SEQUENCE {
+    overheatingAssistanceConfig     SetupRelease {OverheatingAssistanceConfig}                            OPTIONAL, -- Need M
+    ...
+}
+CandidateServingFreqListNR-r16 ::= SEQUENCE (SIZE (1..maxFreqIDC-r16)) OF ARFCN-ValueNR
+
+OtherConfig-v1610 ::=                   SEQUENCE {
+    idc-AssistanceConfig-r16                SetupRelease {IDC-AssistanceConfig-r16}                       OPTIONAL, -- Need M
+    drx-PreferenceConfig-r16                SetupRelease {DRX-PreferenceConfig-r16}                       OPTIONAL, -- Need M
+    maxBW-PreferenceConfig-r16              SetupRelease {MaxBW-PreferenceConfig-r16}                     OPTIONAL, -- Need M
+    maxCC-PreferenceConfig-r16              SetupRelease {MaxCC-PreferenceConfig-r16}                     OPTIONAL, -- Need M
+    maxMIMO-LayerPreferenceConfig-r16       SetupRelease {MaxMIMO-LayerPreferenceConfig-r16}              OPTIONAL, -- Need M
+    minSchedulingOffsetPreferenceConfig-r16 SetupRelease {MinSchedulingOffsetPreferenceConfig-r16}        OPTIONAL, -- Need M
+    releasePreferenceConfig-r16             SetupRelease {ReleasePreferenceConfig-r16}                    OPTIONAL, -- Need M
+    referenceTimePreferenceReporting-r16    ENUMERATED {true}                                             OPTIONAL,  -- Need R
+    btNameList-r16                          SetupRelease {BT-NameList-r16}                                OPTIONAL, -- Need M
+    wlanNameList-r16                        SetupRelease {WLAN-NameList-r16}                              OPTIONAL, -- Need M
+    sensorNameList-r16                      SetupRelease {Sensor-NameList-r16}                            OPTIONAL, -- Need M
+    obtainCommonLocation-r16                ENUMERATED {true}                                             OPTIONAL,  -- Need R
+    sl-AssistanceConfigNR-r16               ENUMERATED{true}                                              OPTIONAL -- Need R
+}
+
+OverheatingAssistanceConfig ::= SEQUENCE {
+    overheatingIndicationProhibitTimer    ENUMERATED {s0, s0dot5, s1, s2, s5, s10, s20, s30,
+                                          s60, s90, s120, s300, s600, spare3, spare2, spare1}
+}
+
+IDC-AssistanceConfig-r16 ::=    SEQUENCE {
+    candidateServingFreqListNR-r16  CandidateServingFreqListNR-r16                     OPTIONAL, -- Need R
+    ...
+}
+
+DRX-PreferenceConfig-r16 ::=          SEQUENCE {
+    drx-PreferenceProhibitTimer-r16       ENUMERATED {
+                                              s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+                                              s8, s9, s10, s20, s30, spare2, spare1}
+}
+
+MaxBW-PreferenceConfig-r16 ::=        SEQUENCE {
+    maxBW-PreferenceProhibitTimer-r16     ENUMERATED {
+                                              s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+                                              s8, s9, s10, s20, s30, spare2, spare1}
+}
+
+MaxCC-PreferenceConfig-r16 ::=        SEQUENCE {
+    maxCC-PreferenceProhibitTimer-r16     ENUMERATED {
+                                              s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+                                              s8, s9, s10, s20, s30, spare2, spare1}
+}
+
+MaxMIMO-LayerPreferenceConfig-r16 ::= SEQUENCE {
+    maxMIMO-LayerPreferenceProhibitTimer-r16 ENUMERATED {
+                                                 s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+                                                 s8, s9, s10, s20, s30, spare2, spare1}
+}
+
+MinSchedulingOffsetPreferenceConfig-r16 ::=   SEQUENCE {
+    minSchedulingOffsetPreferenceProhibitTimer-r16 ENUMERATED {
+                                                       s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+                                                       s8, s9, s10, s20, s30, spare2, spare1}
+}
+
+ReleasePreferenceConfig-r16 ::=       SEQUENCE {
+    releasePreferenceProhibitTimer-r16    ENUMERATED {
+                                              s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+                                              s8, s9, s10, s20, s30, infinity, spare1},
+    connectedReporting                    ENUMERATED {true}                                               OPTIONAL  -- Need R
+}
+
+-- TAG-OTHERCONFIG-STOP
+-- TAG-PHYSCELLIDUTRA-FDD-START
+
+PhysCellIdUTRA-FDD-r16 ::=        INTEGER (0..511)
+
+-- TAG-PHYSCELLIDUTRA-FDD-STOP
+-- TAG-RRC-TRANSACTIONIDENTIFIER-START
+
+RRC-TransactionIdentifier ::=       INTEGER (0..3)
+
+-- TAG-RRC-TRANSACTIONIDENTIFIER-STOP
+-- TAG-SENSORNAMELIST-START
+
+Sensor-NameList-r16 ::= SEQUENCE {
+    measUncomBarPre-r16     ENUMERATED {true}            OPTIONAL,  -- Need R
+    measUeSpeed             ENUMERATED {true}            OPTIONAL,  -- Need R
+    measUeOrientation       ENUMERATED {true}            OPTIONAL   -- Need R
+}
+
+-- TAG-SENSORNAMELIST-STOP
+-- TAG-TRACEREFERENCE-START
+
+TraceReference-r16 ::= SEQUENCE {
+    plmn-Identity-r16      PLMN-Identity,
+    traceId-r16            OCTET STRING (SIZE (3))
+}
+
+-- TAG-TRACEREFERENCE-STOP
+-- TAG-UE-MeasurementsAvailable-START
+
+UE-MeasurementsAvailable-r16 ::=              SEQUENCE {
+    logMeasAvailable-r16                         ENUMERATED {true}               OPTIONAL,
+    logMeasAvailableBT-r16                       ENUMERATED {true}               OPTIONAL,
+    logMeasAvailableWLAN-r16                     ENUMERATED {true}               OPTIONAL,
+    connEstFailInfoAvailable-r16                 ENUMERATED {true}               OPTIONAL,
+    rlf-InfoAvailable-r16                        ENUMERATED {true}               OPTIONAL,
+    ...
+}
+
+-- TAG-UE-MeasurementsAvailable-STOP
+-- TAG-UTRA-FDD-Q-OFFSETRANGE-START
+
+UTRA-FDD-Q-OffsetRange-r16 ::=              ENUMERATED {
+                                                dB-24, dB-22, dB-20, dB-18, dB-16, dB-14,
+                                                dB-12, dB-10, dB-8, dB-6, dB-5, dB-4, dB-3,
+                                                dB-2, dB-1, dB0, dB1, dB2, dB3, dB4, dB5,
+                                                dB6, dB8, dB10, dB12, dB14, dB16, dB18,
+                                                dB20, dB22, dB24}
+
+-- TAG-UTRA-FDD-Q-OFFSETRANGE-STOP
+-- TAG-VISITEDCELLINFOLIST-START
+
+VisitedCellInfoList-r16 ::= SEQUENCE (SIZE (1..maxCellHistory-r16)) OF VisitedCellInfo-r16
+
+VisitedCellInfo-r16 ::=  SEQUENCE {
+    visitedCellId-r16        CHOICE {
+        nr-CellId-r16            CHOICE {
+            cgi-Info                 CGI-Info-Logging-r16,
+            pci-arfcn-r16            SEQUENCE {
+                physCellId-r16           PhysCellId,
+                carrierFreq-r16          ARFCN-ValueNR
+            }
+        },
+        eutra-CellId-r16         CHOICE {
+            cellGlobalId-r16         CGI-InfoEUTRA,
+            pci-arfcn-r16                SEQUENCE {
+                physCellId-r16               EUTRA-PhysCellId,
+                carrierFreq-r16              ARFCN-ValueEUTRA
+            }
+        }
+    }                                        OPTIONAL,
+    timeSpent-r16            INTEGER (0..4095),
+    ...
+}
+
+-- TAG-VISITEDCELLINFOLIST-STOP
+-- TAG-WLANNAMELIST-START
+
+WLAN-NameList-r16 ::= SEQUENCE (SIZE (1..maxWLAN-Name-r16)) OF WLAN-Name-r16
+
+WLAN-Name-r16 ::= OCTET STRING (SIZE (1..32))
+
+-- TAG-SL-BWP-CONFIG-START
+
+SL-BWP-Config-r16 ::=                    SEQUENCE {
+    sl-BWP-Id                                BWP-Id,
+    sl-BWP-Generic-r16                       SL-BWP-Generic-r16                                   OPTIONAL,    -- Need M
+    sl-BWP-PoolConfig-r16                    SL-BWP-PoolConfig-r16                                OPTIONAL,    -- Need M
+    ...
+}
+
+SL-BWP-Generic-r16 ::=                   SEQUENCE {
+    sl-BWP-r16                               BWP                                                                OPTIONAL,    -- Need M
+    sl-LengthSymbols-r16                     ENUMERATED {sym7, sym8, sym9, sym10, sym11, sym12, sym13, sym14}   OPTIONAL,    -- Need M
+    sl-StartSymbol-r16                       ENUMERATED {sym0, sym1, sym2, sym3, sym4, sym5, sym6, sym7}        OPTIONAL,    -- Need M
+    sl-PSBCH-Config-r16                      SetupRelease {SL-PSBCH-Config-r16}                                 OPTIONAL,    -- Need M
+    sl-TxDirectCurrentLocation-r16           INTEGER (0..3301)                                                  OPTIONAL,    -- Need M
+    ...
+}
+
+-- TAG-SL-BWP-CONFIG-STOP
+-- TAG-SL-BWP-CONFIGCOMMON-START
+
+SL-BWP-ConfigCommon-r16 ::=              SEQUENCE {
+    sl-BWP-Generic-r16                       SL-BWP-Generic-r16                                         OPTIONAL,    -- Need R
+    sl-BWP-PoolConfigCommon-r16              SL-BWP-PoolConfigCommon-r16                                OPTIONAL,    -- Need R
+    ...
+}
+
+-- TAG-SL-BWP-CONFIGCOMMON-STOP
+-- TAG-SL-BWP-POOLCONFIG-START
+
+SL-BWP-PoolConfig-r16 ::=        SEQUENCE {
+    sl-RxPool-r16                    SEQUENCE (SIZE (1..maxNrofRXPool-r16)) OF SL-ResourcePool-r16        OPTIONAL,    -- Cond HO
+    sl-TxPoolSelectedNormal-r16      SL-TxPoolDedicated-r16                                               OPTIONAL,    -- Need M
+    sl-TxPoolScheduling-r16          SL-TxPoolDedicated-r16                                               OPTIONAL,    -- Need N
+    sl-TxPoolExceptional-r16         SL-ResourcePoolConfig-r16                                            OPTIONAL     -- Need M
+}
+
+SL-TxPoolDedicated-r16 ::=       SEQUENCE {
+    sl-PoolToReleaseList-r16         SEQUENCE (SIZE (1..maxNrofTXPool-r16)) OF SL-ResourcePoolID-r16      OPTIONAL,    -- Need N
+    sl-PoolToAddModList-r16          SEQUENCE (SIZE (1..maxNrofTXPool-r16)) OF SL-ResourcePoolConfig-r16  OPTIONAL     -- Need N
+}
+
+SL-ResourcePoolConfig-r16 ::=    SEQUENCE {
+    sl-ResourcePoolID-r16            SL-ResourcePoolID-r16,
+    sl-ResourcePool-r16              SL-ResourcePool-r16                                                  OPTIONAL    -- Need M
+}
+
+SL-ResourcePoolID-r16 ::=        INTEGER (1..maxNrofPoolID-r16)
+
+-- TAG-SL-BWP-POOLCONFIG-STOP
+-- TAG-SL-BWP-POOLCONFIGCOMMON-START
+
+SL-BWP-PoolConfigCommon-r16 ::=      SEQUENCE {
+    sl-RxPool-r16                        SEQUENCE (SIZE (1..maxNrofRXPool-r16)) OF SL-ResourcePool-r16         OPTIONAL,    -- Need R
+    sl-TxPoolSelectedNormal-r16          SEQUENCE (SIZE (1..maxNrofTXPool-r16)) OF SL-ResourcePoolConfig-r16   OPTIONAL,    -- Need R
+    sl-TxPoolExceptional-r16             SL-ResourcePoolConfig-r16                                             OPTIONAL     -- Need R
+}
+
+-- TAG-SL-BWP-POOLCONFIGCOMMON-STOP
+-- TAG-SL-CBR-PRIORITYTXCONFIGLIST-START
+
+SL-CBR-PriorityTxConfigList-r16 ::= SEQUENCE (SIZE (1..8)) OF SL-PriorityTxConfigIndex-r16
+
+SL-PriorityTxConfigIndex-r16 ::=    SEQUENCE {
+    sl-PriorityThreshold-r16             INTEGER (1..8)                                                   OPTIONAL,    -- Need M
+    sl-DefaultTxConfigIndex-r16          INTEGER (0..maxCBR-Level-1-r16)                                  OPTIONAL,    -- Need M
+    sl-CBR-ConfigIndex-r16               INTEGER (0..maxCBR-Config-1-r16)                                 OPTIONAL,    -- Need M
+    sl-Tx-ConfigIndexList-r16            SEQUENCE (SIZE (1.. maxCBR-Level-r16)) OF SL-TxConfigIndex-r16   OPTIONAL     -- Need M
+}
+
+SL-TxConfigIndex-r16 ::=             INTEGER (0..maxTxConfig-1-r16)
+
+-- TAG-SL-CBR-PRIORITYTXCONFIGLIST-STOP
+-- TAG-SL-CBR-COMMONTXCONFIGLIST-START
+
+SL-CBR-CommonTxConfigList-r16 ::=     SEQUENCE {
+    sl-CBR-RangeConfigList-r16            SEQUENCE (SIZE (1..maxCBR-Config-r16)) OF SL-CBR-LevelsConfig-r16     OPTIONAL,   -- Need M
+    sl-CBR-PSSCH-TxConfigList-r16         SEQUENCE (SIZE (1.. maxTxConfig-r16)) OF SL-CBR-PSSCH-TxConfig-r16    OPTIONAL    -- Need M
+}
+
+SL-CBR-LevelsConfig-r16 ::=           SEQUENCE (SIZE (1..maxCBR-Level-r16)) OF SL-CBR-r16
+
+SL-CBR-PSSCH-TxConfig-r16 ::=         SEQUENCE {
+    sl-CR-Limit-r16                       INTEGER(0..10000)                                                     OPTIONAL,   -- Need M
+    sl-TxParameters-r16                   SL-PSSCH-TxParameters-r16                                             OPTIONAL    -- Need M
+}
+
+SL-CBR-r16 ::=                        INTEGER (0..100)
+
+-- TAG-SL-CBR-COMMONTXCONFIGLIST-STOP
+-- TAG-SL-CONFIGDEDICATEDNR-START
+
+SL-ConfigDedicatedNR-r16 ::=         SEQUENCE {
+    sl-PHY-MAC-RLC-Config-r16            SL-PHY-MAC-RLC-Config-r16                                              OPTIONAL,    -- Need M
+    sl-RadioBearerToReleaseList-r16      SEQUENCE (SIZE (1..maxNrofSLRB-r16)) OF SLRB-Uu-ConfigIndex-r16        OPTIONAL,    -- Need N
+    sl-RadioBearerToAddModList-r16       SEQUENCE (SIZE (1..maxNrofSLRB-r16)) OF SL-RadioBearerConfig-r16       OPTIONAL,    -- Need N
+    sl-MeasConfigInfoToReleaseList-r16   SEQUENCE (SIZE (1..maxNrofSL-Dest-r16)) OF SL-DestinationIndex-r16     OPTIONAL,    -- Need N
+    sl-MeasConfigInfoToAddModList-r16    SEQUENCE (SIZE (1..maxNrofSL-Dest-r16)) OF SL-MeasConfigInfo-r16       OPTIONAL,    -- Need M
+    t400-r16                             ENUMERATED {ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000} OPTIONAL,    -- Need M
+    ...
+}
+
+SL-DestinationIndex-r16  ::=             INTEGER (0..maxNrofSL-Dest-1-r16)
+
+SL-PHY-MAC-RLC-Config-r16::=         SEQUENCE {
+    sl-ScheduledConfig-r16               SetupRelease { SL-ScheduledConfig-r16 }                                OPTIONAL,    -- Need M
+    sl-UE-SelectedConfig-r16             SetupRelease { SL-UE-SelectedConfig-r16 }                              OPTIONAL,    -- Need M
+    sl-FreqInfoToReleaseList-r16         SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF SL-Freq-Id-r16               OPTIONAL,    -- Need N
+    sl-FreqInfoToAddModList-r16          SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF SL-FreqConfig-r16            OPTIONAL,    -- Need N
+    sl-RLC-BearerToReleaseList-r16       SEQUENCE (SIZE (1..maxSL-LCID-r16)) OF SL-RLC-BearerConfigIndex-r16    OPTIONAL,    -- Need N
+    sl-RLC-BearerToAddModList-r16        SEQUENCE (SIZE (1..maxSL-LCID-r16)) OF SL-RLC-BearerConfig-r16         OPTIONAL,    -- Need N
+    sl-MaxNumConsecutiveDTX-r16          ENUMERATED {n1, n2, n3, n4, n6, n8, n16, n32}                          OPTIONAL,    -- Need M
+    sl-CSI-Acquisition-r16               ENUMERATED {enabled}                                                   OPTIONAL,    -- Need R
+    sl-CSI-SchedulingRequestId-r16       SetupRelease {SchedulingRequestId}                                     OPTIONAL,    -- Need M
+    sl-SSB-PriorityNR-r16                INTEGER (1..8)                                                         OPTIONAL,    -- Need R
+    networkControlledSyncTx-r16          ENUMERATED {on, off}                                                   OPTIONAL     -- Need M
+}
+
+-- TAG-SL-CONFIGDEDICATEDNR-STOP
+-- TAG-SL-CONFIGUREDGRANTCONFIG-START
+
+SL-ConfiguredGrantConfig-r16 ::=           SEQUENCE {
+    sl-ConfigIndexCG-r16                       SL-ConfigIndexCG-r16,
+    sl-PeriodCG-r16                            SL-PeriodCG-r16                                                       OPTIONAL, -- Need M
+    sl-NrOfHARQ-Processes-r16                  INTEGER (1..16)                                                       OPTIONAL, -- Need M
+    sl-HARQ-ProcID-offset-r16                  INTEGER (0..15)                                                       OPTIONAL, -- Need M
+    sl-CG-MaxTransNumList-r16                  SL-CG-MaxTransNumList-r16                                             OPTIONAL, -- Need M
+    rrc-ConfiguredSidelinkGrant-r16            SEQUENCE {
+        sl-TimeResourceCG-Type1-r16                INTEGER (0..496)                                                  OPTIONAL, -- Need M
+        sl-StartSubchannelCG-Type1-r16             INTEGER (0..26)                                                   OPTIONAL, -- Need M
+        sl-FreqResourceCG-Type1-r16                INTEGER (0..6929)                                                 OPTIONAL, -- Need M
+        sl-TimeOffsetCG-Type1-r16                  INTEGER (0..7999)                                                 OPTIONAL, -- Need R
+        sl-N1PUCCH-AN-r16                          PUCCH-ResourceId                                                  OPTIONAL, -- Need M
+        sl-PSFCH-ToPUCCH-CG-Type1-r16              INTEGER (0..15)                                                   OPTIONAL, -- Need M
+        sl-ResourcePoolID-r16                      SL-ResourcePoolID-r16                                             OPTIONAL, -- Need M
+        sl-TimeReferenceSFN-Type1-r16              ENUMERATED {sfn512}                                               OPTIONAL  -- Need S
+    }                                                                                                                OPTIONAL, -- Need M
+    ...
+}
+
+SL-ConfigIndexCG-r16 ::=          INTEGER (0..maxNrofCG-SL-r16-1)
+
+SL-CG-MaxTransNumList-r16 ::=     SEQUENCE (SIZE (1..8)) OF SL-CG-MaxTransNum-r16
+
+SL-CG-MaxTransNum-r16 ::=                  SEQUENCE {
+    sl-Priority-r16                            INTEGER (1..8),
+    sl-MaxTransNum-r16                         INTEGER (1..32)
+}
+
+SL-PeriodCG-r16 ::=            CHOICE{
+    sl-PeriodCG1-r16               ENUMERATED {ms100, ms200, ms300, ms400, ms500, ms600, ms700, ms800, ms900, ms1000, spare6,
+                                               spare5, spare4, spare3, spare2, spare1},
+    sl-PeriodCG2-r16               INTEGER (1..99)
+}
+
+-- TAG-SL-CONFIGUREDGRANTCONFIG-STOP
+-- TAG-SL-DESTINATIONIDENTITY-START
+
+SL-DestinationIdentity-r16 ::=           BIT STRING (SIZE (24))
+
+-- TAG-SL-DESTINATIONIDENTITY-STOP
+-- TAG-SL-FREQCONFIG-START
+
+SL-FreqConfig-r16 ::=              SEQUENCE {
+    sl-Freq-Id-r16                     SL-Freq-Id-r16,
+    sl-SCS-SpecificCarrierList-r16     SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier,
+    sl-AbsoluteFrequencyPointA-r16     ARFCN-ValueNR                                                   OPTIONAL,  -- Need M
+    sl-AbsoluteFrequencySSB-r16        ARFCN-ValueNR                                                   OPTIONAL,  -- Need R
+    frequencyShift7p5khzSL-r16         ENUMERATED {true}                                               OPTIONAL,  -- Cond V2X-SL-Shared
+    valueN-r16                         INTEGER (-1..1),
+    sl-BWP-ToReleaseList-r16           SEQUENCE (SIZE (1..maxNrofSL-BWPs-r16)) OF BWP-Id               OPTIONAL,  -- Need N
+    sl-BWP-ToAddModList-r16            SEQUENCE (SIZE (1..maxNrofSL-BWPs-r16)) OF SL-BWP-Config-r16    OPTIONAL,  -- Need N
+    sl-SyncConfigList-r16              SL-SyncConfigList-r16                                           OPTIONAL,  -- Need M
+    sl-SyncPriority-r16                ENUMERATED {gnss, gnbEnb}                                       OPTIONAL   -- Need M
+}
+
+SL-Freq-Id-r16 ::=                     INTEGER (1.. maxNrofFreqSL-r16)
+
+-- TAG-SL-FREQCONFIG-STOP
+-- TAG-SL-FREQCONFIGCOMMON-START
+
+SL-FreqConfigCommon-r16 ::=      SEQUENCE {
+    sl-SCS-SpecificCarrierList-r16   SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier,
+    sl-AbsoluteFrequencyPointA-r16   ARFCN-ValueNR,
+    sl-AbsoluteFrequencySSB-r16      ARFCN-ValueNR                                                       OPTIONAL, -- Need R
+    frequencyShift7p5khzSL-r16       ENUMERATED {true}                                                   OPTIONAL, -- Cond V2X-SL-Shared
+    valueN-r16                       INTEGER (-1..1),
+    sl-BWP-List-r16                  SEQUENCE (SIZE (1..maxNrofSL-BWPs-r16)) OF SL-BWP-ConfigCommon-r16  OPTIONAL, -- Need R
+    sl-SyncPriority-r16              ENUMERATED {gnss, gnbEnb}                                           OPTIONAL, -- Need R
+    sl-NbAsSync-r16                  BOOLEAN                                                             OPTIONAL, -- Need R
+    sl-SyncConfigList-r16            SL-SyncConfigList-r16                                               OPTIONAL, -- Need R
+    ...
+}
+-- TAG-SL-FREQCONFIGCOMMON-STOP
+-- TAG-SL-LOGICALCHANNELCONFIG-START
+
+SL-LogicalChannelConfig-r16 ::=            SEQUENCE {
+    sl-Priority-r16                            INTEGER (1..8),
+    sl-PrioritisedBitRate-r16                  ENUMERATED {kBps0, kBps8, kBps16, kBps32, kBps64, kBps128, kBps256, kBps512,
+                                               kBps1024, kBps2048, kBps4096, kBps8192, kBps16384, kBps32768, kBps65536, infinity},
+    sl-BucketSizeDuration-r16                  ENUMERATED {ms5, ms10, ms20, ms50, ms100, ms150, ms300, ms500, ms1000,
+                                               spare7, spare6, spare5, spare4, spare3,spare2, spare1},
+    sl-ConfiguredGrantType1Allowed-r16         ENUMERATED {true}                                                        OPTIONAL,   -- Need R
+    sl-HARQ-FeedbackEnabled-r16                ENUMERATED {enabled, disabled }                                          OPTIONAL,   -- Need R
+    sl-AllowedCG-List-r16                      SEQUENCE (SIZE (0.. maxNrofCG-SL-r16-1)) OF SL-ConfigIndexCG-r16
+                                                                                                                        OPTIONAL,   -- Need R
+    sl-AllowedSCS-List-r16                     SEQUENCE (SIZE (1..maxSCSs)) OF SubcarrierSpacing                        OPTIONAL,   -- Need R
+    sl-MaxPUSCH-Duration-r16                   ENUMERATED {ms0p02, ms0p04, ms0p0625, ms0p125, ms0p25, ms0p5, spare2, spare1}
+                                                                                                                        OPTIONAL,   -- Need R
+    sl-LogicalChannelGroup-r16                 INTEGER (0..maxLCG-ID)                                                   OPTIONAL,   -- Need R
+    sl-SchedulingRequestId-r16                 SchedulingRequestId                                                      OPTIONAL,   -- Need R
+    sl-LogicalChannelSR-DelayTimerApplied-r16  BOOLEAN                                                                  OPTIONAL,   -- Need R
+    ...
+}
+-- TAG-SL-LOGICALCHANNELCONFIG-STOP
+-- TAG-SL-MEASCONFIGCOMMON-START
+
+SL-MeasConfigCommon-r16 ::=          SEQUENCE {
+    sl-MeasObjectListCommon-r16          SL-MeasObjectList-r16                                           OPTIONAL,   -- Need R
+    sl-ReportConfigListCommon-r16        SL-ReportConfigList-r16                                         OPTIONAL,   -- Need R
+    sl-MeasIdListCommon-r16              SL-MeasIdList-r16                                               OPTIONAL,   -- Need R
+    sl-QuantityConfigCommon-r16          SL-QuantityConfig-r16                                           OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-SL-MEASCONFIGCOMMON-STOP
+-- TAG-SL-MEASCONFIGINFO-START
+
+SL-MeasConfigInfo-r16 ::=           SEQUENCE {
+    sl-DestinationIndex-r16             SL-DestinationIndex-r16,
+    sl-MeasConfig-r16                   SL-MeasConfig-r16,
+    ...
+}
+
+SL-MeasConfig-r16 ::=               SEQUENCE {
+    sl-MeasObjectToRemoveList-r16       SL-MeasObjectToRemoveList-r16                                           OPTIONAL,   -- Need N
+    sl-MeasObjectToAddModList-r16       SL-MeasObjectList-r16                                                   OPTIONAL,   -- Need N
+    sl-ReportConfigToRemoveList-r16     SL-ReportConfigToRemoveList-r16                                         OPTIONAL,   -- Need N
+    sl-ReportConfigToAddModList-r16     SL-ReportConfigList-r16                                                 OPTIONAL,   -- Need N
+    sl-MeasIdToRemoveList-r16           SL-MeasIdToRemoveList-r16                                               OPTIONAL,   -- Need N
+    sl-MeasIdToAddModList-r16           SL-MeasIdList-r16                                                       OPTIONAL,   -- Need N
+    sl-QuantityConfig-r16               SL-QuantityConfig-r16                                                   OPTIONAL,   -- Need M
+    ...
+}
+
+SL-MeasObjectToRemoveList-r16 ::=   SEQUENCE (SIZE (1..maxNrofSL-ObjectId-r16)) OF SL-MeasObjectId-r16
+
+SL-ReportConfigToRemoveList-r16 ::= SEQUENCE (SIZE (1..maxNrofSL-ReportConfigId-r16)) OF SL-ReportConfigId-r16
+
+SL-MeasIdToRemoveList-r16 ::=       SEQUENCE (SIZE (1..maxNrofSL-MeasId-r16)) OF SL-MeasId-r16
+
+-- TAG-SL-MEASCONFIGINFO-STOP
+-- TAG-SL-MEASIDLIST-START
+
+SL-MeasIdList-r16 ::=               SEQUENCE (SIZE (1..maxNrofSL-MeasId-r16)) OF SL-MeasIdInfo-r16
+
+SL-MeasIdInfo-r16 ::=               SEQUENCE {
+    sl-MeasId-r16                       SL-MeasId-r16,
+    sl-MeasObjectId-r16                 SL-MeasObjectId-r16,
+    sl-ReportConfigId-r16               SL-ReportConfigId-r16,
+    ...
+}
+
+SL-MeasId-r16 ::=                   INTEGER (1..maxNrofSL-MeasId-r16)
+
+-- TAG-SL-MEASIDLIST-STOP
+-- TAG-SL-MEASOBJECTLIST-START
+
+SL-MeasObjectList-r16 ::=               SEQUENCE (SIZE (1..maxNrofSL-ObjectId-r16)) OF SL-MeasObjectInfo-r16
+
+SL-MeasObjectInfo-r16 ::=               SEQUENCE {
+    sl-MeasObjectId-r16                     SL-MeasObjectId-r16,
+    sl-MeasObject-r16                       SL-MeasObject-r16,
+    ...
+}
+
+SL-MeasObjectId-r16 ::=                 INTEGER (1..maxNrofSL-ObjectId-r16)
+
+SL-MeasObject-r16 ::=                   SEQUENCE {
+    frequencyInfoSL-r16                     ARFCN-ValueNR,
+    ...
+}
+
+-- TAG-SL-MEASOBJECTLIST-STOP
+-- TAG-SL-PDCP-CONFIG-START
+
+SL-PDCP-Config-r16 ::=       SEQUENCE {
+    sl-DiscardTimer-r16          ENUMERATED {ms3, ms10, ms20, ms25, ms30, ms40, ms50, ms60, ms75, ms100, ms150, ms200,
+                                 ms250, ms300, ms500, ms750, ms1500, infinity}                                           OPTIONAL, -- Cond Setup
+    sl-PDCP-SN-Size-r16          ENUMERATED {len12bits, len18bits}                                                       OPTIONAL, -- Cond Setup2
+    sl-OutOfOrderDelivery        ENUMERATED { true }                                                                     OPTIONAL,    -- Need R
+    ...
+}
+
+-- TAG-SL-PDCP-CONFIG-STOP
+-- TAG-SL-PSBCH-CONFIG-START
+
+SL-PSBCH-Config-r16 ::= SEQUENCE {
+    dl-P0-PSBCH-r16         INTEGER (-16..15)                                                                   OPTIONAL,    -- Need M
+    dl-Alpha-PSBCH-r16      ENUMERATED {alpha0, alpha04, alpha05, alpha06, alpha07, alpha08, alpha09, alpha1}   OPTIONAL,    -- Need M
+    ...
+}
+
+-- TAG-SL-PSBCH-CONFIG-STOP
+-- TAG-SL-PSSCH-TXCONFIGLIST-START
+
+SL-PSSCH-TxConfigList-r16 ::=    SEQUENCE (SIZE (1..maxPSSCH-TxConfig-r16)) OF SL-PSSCH-TxConfig-r16
+
+SL-PSSCH-TxConfig-r16 ::=        SEQUENCE {
+    sl-TypeTxSync-r16                SL-TypeTxSync-r16                                   OPTIONAL,    -- Need R
+    sl-ThresUE-Speed-r16             ENUMERATED {kmph60, kmph80, kmph100, kmph120,
+                                                kmph140, kmph160, kmph180, kmph200},
+    sl-ParametersAboveThres-r16      SL-PSSCH-TxParameters-r16,
+    sl-ParametersBelowThres-r16      SL-PSSCH-TxParameters-r16,
+    ...
+}
+
+
+SL-PSSCH-TxParameters-r16 ::=    SEQUENCE {
+    sl-MinMCS-PSSCH-r16              INTEGER (0..27),
+    sl-MaxMCS-PSSCH-r16              INTEGER (0..31),
+    sl-MinSubChannelNumPSSCH-r16     INTEGER (1..27),
+    sl-MaxSubchannelNumPSSCH-r16     INTEGER (1..27),
+    sl-MaxTxTransNumPSSCH-r16        INTEGER (1..32),
+    sl-MaxTxPower-r16                SL-TxPower-r16                                      OPTIONAL    -- Cond CBR
+}
+
+-- TAG-SL-PSSCH-TXCONFIGLIST-STOP
+-- TAG-SL-QOS-FLOWIDENTITY-START
+
+SL-QoS-FlowIdentity-r16 ::=                    INTEGER (1..maxNrofSL-QFIs-r16)
+
+-- TAG-SL-QOS-FLOWIDENTITY-STOP
+-- TAG-SL-QOS-PROFILE-START
+
+SL-QoS-Profile-r16 ::=        SEQUENCE {
+    sl-PQI-r16                    SL-PQI-r16                                                  OPTIONAL,   -- Need R
+    sl-GFBR-r16                   INTEGER (0..4000000000)                                     OPTIONAL,   -- Need R
+    sl-MFBR-r16                   INTEGER (0..4000000000)                                     OPTIONAL,   -- Need R
+    sl-Range-r16                  INTEGER (1..1000)                                           OPTIONAL,   -- Need R
+    ...
+}
+
+SL-PQI-r16 ::=                CHOICE {
+    sl-StandardizedPQI-r16        INTEGER (0..255),
+    sl-Non-StandardizedPQI-r16    SEQUENCE {
+        sl-ResourceType-r16           ENUMERATED {gbr, non-GBR, delayCriticalGBR, spare1}     OPTIONAL,   -- Need R
+        sl-PriorityLevel-r16          INTEGER (1..8)                                          OPTIONAL,   -- Need R
+        sl-PacketDelayBudget-r16      INTEGER (0..1023)                                       OPTIONAL,   -- Need R
+        sl-PacketErrorRate-r16        INTEGER (0..9)                                          OPTIONAL,   -- Need R
+        sl-AveragingWindow-r16        INTEGER (0..4095)                                       OPTIONAL,   -- Need R
+        sl-MaxDataBurstVolume-r16     INTEGER (0..4095)                                       OPTIONAL,   -- Need R
+    ...
+   }
+}
+
+-- TAG-SL-QOS-PROFILE-STOP
+-- TAG-SL-QUANTITYCONFIG-START
+
+SL-QuantityConfig-r16 ::=               SEQUENCE {
+    sl-FilterCoefficientDMRS-r16            FilterCoefficient                             DEFAULT fc4,
+    ...
+}
+
+-- TAG-SL-QuantityConfig-STOP
+-- TAG-SL-RADIOBEARERCONFIG-START
+
+SL-RadioBearerConfig-r16 ::=     SEQUENCE {
+    slrb-Uu-ConfigIndex-r16           SLRB-Uu-ConfigIndex-r16,
+    sl-SDAP-Config-r16                SL-SDAP-Config-r16                                                 OPTIONAL,    -- Cond SLRBSetup
+    sl-PDCP-Config-r16                SL-PDCP-Config-r16                                                 OPTIONAL,    -- Cond SLRBSetup
+    sl-TransRange-r16                 ENUMERATED {m20, m50, m80, m100, m120, m150, m180, m200, m220, m250, m270, m300, m350, m370,
+                                                 m400, m420, m450, m480, m500, m550, m600, m700, m1000, spare9, spare8, spare7, spare6,
+                                                 spare5, spare4, spare3, spare2, spare1}                OPTIONAL,    -- Need R
+    ...
+}
+
+-- TAG-SL-RADIOBEARERCONFIG-STOP
+-- TAG-SL-REPORTCONFIGLIST-START
+
+SL-ReportConfigList-r16 ::=           SEQUENCE (SIZE (1..maxNrofSL-ReportConfigId-r16)) OF SL-ReportConfigInfo-r16
+
+SL-ReportConfigInfo-r16 ::=           SEQUENCE {
+    sl-ReportConfigId-r16                     SL-ReportConfigId-r16,
+    sl-ReportConfig-r16                       SL-ReportConfig-r16,
+    ...
+}
+
+SL-ReportConfigId-r16 ::=             INTEGER (1..maxNrofSL-ReportConfigId-r16)
+
+SL-ReportConfig-r16 ::=               SEQUENCE {
+    sl-ReportType-r16                     CHOICE {
+        sl-Periodical-r16                     SL-PeriodicalReportConfig-r16,
+        sl-EventTriggered-r16                 SL-EventTriggerConfig-r16,
+        ...
+    },
+    ...
+}
+
+SL-PeriodicalReportConfig-r16 ::=     SEQUENCE {
+    sl-ReportInterval-r16                 ReportInterval,
+    sl-ReportAmount-r16                   ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    sl-ReportQuantity-r16                 SL-MeasReportQuantity-r16,
+    sl-RS-Type-r16                        SL-RS-Type-r16,
+    ...
+}
+
+SL-EventTriggerConfig-r16 ::=        SEQUENCE {
+    sl-EventId-r16                       CHOICE {
+        eventS1-r16                          SEQUENCE {
+            s1-Threshold-r16                     SL-MeasTriggerQuantity-r16,
+            sl-ReportOnLeave-r16                 BOOLEAN,
+            sl-Hysteresis-r16                    Hysteresis,
+            sl-TimeToTrigger-r16                 TimeToTrigger,
+            ...
+        },
+        eventS2-r16                          SEQUENCE {
+            s2-Threshold-r16                     SL-MeasTriggerQuantity-r16,
+            sl-ReportOnLeave-r16                 BOOLEAN,
+            sl-Hysteresis-r16                    Hysteresis,
+            sl-TimeToTrigger-r16                 TimeToTrigger,
+            ...
+        },
+        ...
+    },
+    sl-ReportInterval-r16                ReportInterval,
+    sl-ReportAmount-r16                      ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    sl-ReportQuantity-r16                    SL-MeasReportQuantity-r16,
+    sl-RS-Type-r16                           SL-RS-Type-r16,
+    ...
+}
+
+SL-MeasReportQuantity-r16 ::=         CHOICE {
+    sl-RSRP-r16                           BOOLEAN,
+    ...
+}
+
+SL-MeasTriggerQuantity-r16 ::=        CHOICE {
+    sl-RSRP-r16                           RSRP-Range,
+    ...
+}
+
+SL-RS-Type-r16 ::=                    ENUMERATED {dmrs, spare3, spare2, spare1}
+
+-- TAG-SL-REPORTCONFIGLIST-STOP
+-- TAG-SL-RESOURCEPOOL-START
+
+SL-ResourcePool-r16 ::=            SEQUENCE {
+    sl-PSCCH-Config-r16                SetupRelease { SL-PSCCH-Config-r16 }                                  OPTIONAL,   -- Need M
+    sl-PSSCH-Config-r16                SetupRelease { SL-PSSCH-Config-r16 }                                  OPTIONAL,   -- Need M
+    sl-PSFCH-Config-r16                SetupRelease { SL-PSFCH-Config-r16 }                                  OPTIONAL,   -- Need M
+    sl-SyncAllowed-r16                 SL-SyncAllowed-r16                                                    OPTIONAL,   -- Need M
+    sl-SubchannelSize-r16              ENUMERATED {n10, n12, n15, n20, n25, n50, n75, n100}                  OPTIONAL,   -- Need M
+    dummy                              INTEGER (10..160)                                                     OPTIONAL,   -- Need M
+    sl-StartRB-Subchannel-r16          INTEGER (0..265)                                                      OPTIONAL,   -- Need M
+    sl-NumSubchannel-r16               INTEGER (1..27)                                                       OPTIONAL,   -- Need M
+    sl-Additional-MCS-Table-r16        ENUMERATED {qam256, qam64LowSE, qam256-qam64LowSE }                   OPTIONAL,   -- Need M
+    sl-ThreshS-RSSI-CBR-r16            INTEGER (0..45)                                                       OPTIONAL,   -- Need M
+    sl-TimeWindowSizeCBR-r16           ENUMERATED {ms100, slot100}                                           OPTIONAL,   -- Need M
+    sl-TimeWindowSizeCR-r16            ENUMERATED {ms1000, slot1000}                                         OPTIONAL,   -- Need M
+    sl-PTRS-Config-r16                 SL-PTRS-Config-r16                                                    OPTIONAL,    -- Need M
+    sl-UE-SelectedConfigRP-r16         SL-UE-SelectedConfigRP-r16                                            OPTIONAL,   -- Need M
+    sl-RxParametersNcell-r16           SEQUENCE {
+        sl-TDD-Configuration-r16           TDD-UL-DL-ConfigCommon                                            OPTIONAL,   -- Need M
+        sl-SyncConfigIndex-r16             INTEGER (0..15)
+    }                                                                                                        OPTIONAL,   -- Need M
+    sl-ZoneConfigMCR-List-r16          SEQUENCE (SIZE (16)) OF SL-ZoneConfigMCR-r16                          OPTIONAL,   -- Need M
+    sl-FilterCoefficient-r16           FilterCoefficient                                                     OPTIONAL,   -- Need M
+    sl-RB-Number-r16                   INTEGER (10..275)                                                     OPTIONAL,   -- Need M
+    sl-PreemptionEnable-r16            ENUMERATED {enabled, pl1, pl2, pl3, pl4, pl5, pl6, pl7, pl8}          OPTIONAL,   -- Need R
+    sl-PriorityThreshold-UL-URLLC-r16  INTEGER (1..9)                                                        OPTIONAL,   -- Need M
+    sl-PriorityThreshold-r16           INTEGER (1..9)                                                        OPTIONAL,   -- Need M
+    sl-X-Overhead-r16                  ENUMERATED {n0,n3, n6, n9}                                            OPTIONAL,   -- Need S
+    sl-PowerControl-r16                SL-PowerControl-r16                                                   OPTIONAL,   -- Need M
+    sl-TxPercentageList-r16            SL-TxPercentageList-r16                                               OPTIONAL,   -- Need M
+    sl-MinMaxMCS-List-r16              SL-MinMaxMCS-List-r16                                                 OPTIONAL,   -- Need M
+    ...,
+    [[
+    sl-TimeResource-r16                BIT STRING (SIZE (10..160))                                           OPTIONAL    -- Need M
+    ]]
+}
+
+SL-ZoneConfigMCR-r16 ::=               SEQUENCE {
+    sl-ZoneConfigMCR-Index-r16             INTEGER (0..15),
+    sl-TransRange-r16                      ENUMERATED {m20, m50, m80, m100, m120, m150, m180, m200, m220, m250, m270, m300, m350,
+                                                       m370, m400, m420, m450, m480, m500, m550, m600, m700, m1000, spare9, spare8,
+                                                       spare7, spare6, spare5, spare4, spare3, spare2, spare1}
+                                                                                                             OPTIONAL,   -- Need M
+    sl-ZoneConfig-r16                      SL-ZoneConfig-r16                                                 OPTIONAL,   -- Need M
+    ...
+}
+
+SL-SyncAllowed-r16 ::=                 SEQUENCE {
+    gnss-Sync-r16                          ENUMERATED {true}                                                 OPTIONAL,   -- Need R
+    gnbEnb-Sync-r16                        ENUMERATED {true}                                                 OPTIONAL,   -- Need R
+    ue-Sync-r16                            ENUMERATED {true}                                                 OPTIONAL    -- Need R
+}
+
+SL-PSCCH-Config-r16 ::=                SEQUENCE {
+    sl-TimeResourcePSCCH-r16               ENUMERATED {n2, n3}                                               OPTIONAL,   -- Need M
+    sl-FreqResourcePSCCH-r16               ENUMERATED {n10,n12, n15, n20, n25}                               OPTIONAL,   -- Need M
+    sl-DMRS-ScrambleID-r16                 INTEGER (0..65535)                                                OPTIONAL,   -- Need M
+    sl-NumReservedBits-r16                 INTEGER (2..4)                                                    OPTIONAL,   -- Need M
+   ...
+}
+
+SL-PSSCH-Config-r16 ::=                SEQUENCE {
+    sl-PSSCH-DMRS-TimePatternList-r16      SEQUENCE (SIZE (1..3)) OF INTEGER (2..4)                          OPTIONAL,   -- Need M
+    sl-BetaOffsets2ndSCI-r16               SEQUENCE (SIZE (4)) OF SL-BetaOffsets-r16                         OPTIONAL,   -- Need M
+    sl-Scaling-r16                         ENUMERATED {f0p5, f0p65, f0p8, f1}                                OPTIONAL,   -- Need M
+   ...
+}
+
+SL-PSFCH-Config-r16 ::=                SEQUENCE {
+    sl-PSFCH-Period-r16                    ENUMERATED {sl0, sl1, sl2, sl4}                                   OPTIONAL,   -- Need M
+    sl-PSFCH-RB-Set-r16                    BIT STRING (SIZE (10..275))                                       OPTIONAL,   -- Need M
+    sl-NumMuxCS-Pair-r16                   ENUMERATED {n1, n2, n3, n6}                                       OPTIONAL,   -- Need M
+    sl-MinTimeGapPSFCH-r16                 ENUMERATED {sl2, sl3}                                             OPTIONAL,   -- Need M
+    sl-PSFCH-HopID-r16                     INTEGER (0..1023)                                                 OPTIONAL,   -- Need M
+    sl-PSFCH-CandidateResourceType-r16     ENUMERATED {startSubCH, allocSubCH}                               OPTIONAL,   -- Need M
+   ...
+}
+SL-PTRS-Config-r16 ::=                 SEQUENCE {
+    sl-PTRS-FreqDensity-r16                SEQUENCE (SIZE (2)) OF INTEGER (1..276)                           OPTIONAL,   -- Need M
+    sl-PTRS-TimeDensity-r16                SEQUENCE (SIZE (3)) OF INTEGER (0..29)                            OPTIONAL,   -- Need M
+    sl-PTRS-RE-Offset-r16                  ENUMERATED {offset01, offset10, offset11}                         OPTIONAL,   -- Need M
+    ...
+}
+
+SL-UE-SelectedConfigRP-r16 ::=         SEQUENCE {
+    sl-CBR-PriorityTxConfigList-r16        SL-CBR-PriorityTxConfigList-r16                                  OPTIONAL,   -- Need M
+    sl-Thres-RSRP-List-r16                 SL-Thres-RSRP-List-r16                                            OPTIONAL,   -- Need M
+    sl-MultiReserveResource-r16            ENUMERATED {enabled}                                              OPTIONAL,   -- Need M
+    sl-MaxNumPerReserve-r16                ENUMERATED {n2, n3}                                               OPTIONAL,   -- Need M
+    sl-SensingWindow-r16                   ENUMERATED {ms100, ms1100}                                        OPTIONAL,   -- Need M
+    sl-SelectionWindowList-r16             SL-SelectionWindowList-r16                                        OPTIONAL,   -- Need M
+    sl-ResourceReservePeriodList-r16       SEQUENCE (SIZE (1..16)) OF SL-ResourceReservePeriod-r16           OPTIONAL,   -- Need M
+    sl-RS-ForSensing-r16                   ENUMERATED {pscch, pssch},
+    ...
+}
+
+SL-ResourceReservePeriod-r16 ::=       CHOICE {
+    sl-ResourceReservePeriod1-r16          ENUMERATED {ms0, ms100, ms200, ms300, ms400, ms500, ms600, ms700, ms800, ms900, ms1000},
+    sl-ResourceReservePeriod2-r16          INTEGER (1..99)
+}
+
+SL-SelectionWindowList-r16 ::=         SEQUENCE (SIZE (8)) OF SL-SelectionWindowConfig-r16
+
+SL-SelectionWindowConfig-r16 ::=       SEQUENCE {
+    sl-Priority-r16                        INTEGER (1..8),
+    sl-SelectionWindow-r16                 ENUMERATED {n1, n5, n10, n20}
+}
+
+SL-TxPercentageList-r16 ::=            SEQUENCE (SIZE (8)) OF SL-TxPercentageConfig-r16
+
+SL-TxPercentageConfig-r16 ::=          SEQUENCE {
+    sl-Priority-r16                        INTEGER (1..8),
+    sl-TxPercentage-r16                    ENUMERATED {p20, p35, p50}
+}
+
+SL-MinMaxMCS-List-r16 ::=              SEQUENCE (SIZE (1..3)) OF SL-MinMaxMCS-Config-r16
+
+SL-MinMaxMCS-Config-r16 ::=            SEQUENCE {
+    sl-MCS-Table-r16                       ENUMERATED {qam64, qam256, qam64LowSE},
+    sl-MinMCS-PSSCH-r16                    INTEGER (0..27),
+    sl-MaxMCS-PSSCH-r16                    INTEGER (0..31)
+}
+
+SL-BetaOffsets-r16 ::=                 INTEGER (0..31)
+
+SL-PowerControl-r16 ::=    SEQUENCE {
+    sl-MaxTransPower-r16       INTEGER (-30..33),
+    sl-Alpha-PSSCH-PSCCH-r16   ENUMERATED {alpha0, alpha04, alpha05, alpha06, alpha07, alpha08, alpha09, alpha1}  OPTIONAL,   -- Need M
+    dl-Alpha-PSSCH-PSCCH-r16   ENUMERATED {alpha0, alpha04, alpha05, alpha06, alpha07, alpha08, alpha09, alpha1}  OPTIONAL,   -- Need S
+    sl-P0-PSSCH-PSCCH-r16      INTEGER (-16..15)                                                                  OPTIONAL,   -- Need S
+    dl-P0-PSSCH-PSCCH-r16      INTEGER (-16..15)                                                                  OPTIONAL,   -- Need M
+    dl-Alpha-PSFCH-r16         ENUMERATED {alpha0, alpha04, alpha05, alpha06, alpha07, alpha08, alpha09, alpha1}  OPTIONAL,   -- Need S
+    dl-P0-PSFCH-r16            INTEGER (-16..15)                                                                  OPTIONAL,   -- Need M
+    ...
+}
+
+-- TAG-SL-RESOURCEPOOL-STOP
+-- TAG-SL-RLC-BEARERCONFIG-START
+
+SL-RLC-BearerConfig-r16 ::=                   SEQUENCE {
+    sl-RLC-BearerConfigIndex-r16                  SL-RLC-BearerConfigIndex-r16,
+    sl-ServedRadioBearer-r16                      SLRB-Uu-ConfigIndex-r16                          OPTIONAL,   -- Cond LCH-SetupOnly
+    sl-RLC-Config-r16                             SL-RLC-Config-r16                                OPTIONAL,   -- Cond LCH-Setup
+    sl-MAC-LogicalChannelConfig-r16               SL-LogicalChannelConfig-r16                      OPTIONAL,   -- Cond LCH-Setup
+    ...
+}
+
+-- TAG-SL-RLC-BEARERCONFIG-STOP
+-- TAG-SL-RLC-BEARERCONFIGINDEX-START
+
+SL-RLC-BearerConfigIndex-r16 ::=                    INTEGER (1..maxSL-LCID-r16)
+
+-- TAG-RLC-BEARERCONFIGINDEX-STOP
+-- TAG-SL-RLC-CONFIG-START
+
+SL-RLC-Config-r16 ::=                        CHOICE {
+    sl-AM-RLC-r16                                SEQUENCE {
+        sl-SN-FieldLengthAM-r16                      SN-FieldLengthAM                               OPTIONAL,   -- Cond SLRBSetup
+        sl-T-PollRetransmit-r16                      T-PollRetransmit,
+        sl-PollPDU-r16                                   PollPDU,
+        sl-PollByte-r16                                  PollByte,
+        sl-MaxRetxThreshold-r16                          ENUMERATED { t1, t2, t3, t4, t6, t8, t16, t32 },
+    ...
+    },
+    sl-UM-RLC-r16                                SEQUENCE {
+        sl-SN-FieldLengthUM-r16                      SN-FieldLengthUM                               OPTIONAL,    -- Cond SLRBSetup
+    ...
+    },
+    ...
+}
+
+-- TAG-SL-RLC-CONFIG-STOP
+-- TAG-SL-SCHEDULEDCONFIG-START
+
+SL-ScheduledConfig-r16 ::=                   SEQUENCE {
+    sl-RNTI-r16                                  RNTI-Value,
+    mac-MainConfigSL-r16                         MAC-MainConfigSL-r16                                     OPTIONAL,    -- Need M
+    sl-CS-RNTI-r16                               RNTI-Value                                               OPTIONAL,    -- Need M
+    sl-PSFCH-ToPUCCH-r16                         SEQUENCE (SIZE (1..8)) OF INTEGER (0..15)                OPTIONAL,    -- Need M
+    sl-ConfiguredGrantConfigList-r16             SL-ConfiguredGrantConfigList-r16                         OPTIONAL,    -- Need M
+    ...,
+    [[
+    sl-DCI-ToSL-Trans-r16                        SEQUENCE (SIZE (1..8)) OF INTEGER (1..32)                OPTIONAL     -- Need M
+    ]]
+}
+
+MAC-MainConfigSL-r16 ::=                     SEQUENCE {
+    sl-BSR-Config-r16                            BSR-Config                                           OPTIONAL,    -- Need M
+    ul-PrioritizationThres-r16                   INTEGER (1..16)                                      OPTIONAL,    -- Need M
+    sl-PrioritizationThres-r16                   INTEGER (1..8)                                       OPTIONAL,    -- Need M
+    ...
+}
+
+SL-ConfiguredGrantConfigList-r16 ::=       SEQUENCE {
+    sl-ConfiguredGrantConfigToReleaseList-r16  SEQUENCE (SIZE (1..maxNrofCG-SL-r16)) OF SL-ConfigIndexCG-r16         OPTIONAL, -- Need N
+    sl-ConfiguredGrantConfigToAddModList-r16   SEQUENCE (SIZE (1..maxNrofCG-SL-r16)) OF SL-ConfiguredGrantConfig-r16 OPTIONAL  -- Need N
+}
+
+-- TAG-SL-SCHEDULEDCONFIG-STOP
+-- TAG-SL-SDAP-CONFIG-START
+
+SL-SDAP-Config-r16 ::=                  SEQUENCE {
+    sl-SDAP-Header-r16                      ENUMERATED {present, absent},
+    sl-DefaultRB-r16                        BOOLEAN,
+    sl-MappedQoS-Flows-r16                  CHOICE {
+        sl-MappedQoS-FlowsList-r16              SEQUENCE (SIZE (1..maxNrofSL-QFIs-r16)) OF SL-QoS-Profile-r16,
+        sl-MappedQoS-FlowsListDedicated-r16     SL-MappedQoS-FlowsListDedicated-r16
+    }                                                                                                           OPTIONAL,   -- Need M
+    sl-CastType-r16                        ENUMERATED {broadcast, groupcast, unicast, spare1}                   OPTIONAL,   -- Need M
+    ...
+}
+
+SL-MappedQoS-FlowsListDedicated-r16 ::= SEQUENCE {
+    sl-MappedQoS-FlowsToAddList-r16         SEQUENCE (SIZE (1..maxNrofSL-QFIs-r16)) OF SL-QoS-FlowIdentity-r16  OPTIONAL,    -- Need N
+    sl-MappedQoS-FlowsToReleaseList-16      SEQUENCE (SIZE (1..maxNrofSL-QFIs-r16)) OF SL-QoS-FlowIdentity-r16  OPTIONAL     -- Need N
+}
+
+-- TAG-SL-SDAP-CONFIG-STOP
+-- TAG-SL-SYNCCONFIG-START
+
+SL-SyncConfigList-r16 ::=          SEQUENCE (SIZE (1..maxSL-SyncConfig-r16)) OF SL-SyncConfig-r16
+
+SL-SyncConfig-r16 ::=              SEQUENCE {
+    sl-SyncRefMinHyst-r16              ENUMERATED {dB0, dB3, dB6, dB9, dB12}                                   OPTIONAL,    -- Need R
+    sl-SyncRefDiffHyst-r16             ENUMERATED {dB0, dB3, dB6, dB9, dB12, dBinf}                            OPTIONAL,    -- Need R
+    sl-filterCoefficient-r16           FilterCoefficient                                                       OPTIONAL,    -- Need R
+    sl-SSB-TimeAllocation1-r16         SL-SSB-TimeAllocation-r16                                               OPTIONAL,    -- Need R
+    sl-SSB-TimeAllocation2-r16         SL-SSB-TimeAllocation-r16                                               OPTIONAL,    -- Need R
+    sl-SSB-TimeAllocation3-r16         SL-SSB-TimeAllocation-r16                                               OPTIONAL,    -- Need R
+    sl-SSID-r16                        INTEGER (0..671)                                                        OPTIONAL,    -- Need R
+    txParameters-r16                   SEQUENCE {
+        syncTxThreshIC-r16                 SL-RSRP-Range-r16                                                   OPTIONAL,    -- Need R
+        syncTxThreshOoC-r16                SL-RSRP-Range-r16                                                   OPTIONAL,    -- Need R
+        syncInfoReserved-r16               BIT STRING (SIZE (2))                                               OPTIONAL     -- Need R
+    },
+    gnss-Sync-r16                      ENUMERATED {true}                                                       OPTIONAL,    -- Need R
+    ...
+}
+
+SL-RSRP-Range-r16 ::=                  INTEGER (0..13)
+
+SL-SSB-TimeAllocation-r16 ::=          SEQUENCE {
+    sl-NumSSB-WithinPeriod-r16             ENUMERATED {n1, n2, n4, n8, n16, n32, n64}                          OPTIONAL,    -- Need R
+    sl-TimeOffsetSSB-r16                   INTEGER (0..1279)                                                   OPTIONAL,    -- Need R
+    sl-TimeInterval-r16                    INTEGER (0..639)                                                    OPTIONAL     -- Need R
+}
+
+-- TAG-SL-SYNCCONFIG-STOP
+-- TAG-SL-THRES-RSRP-LIST-START
+
+SL-Thres-RSRP-List-r16 ::=    SEQUENCE (SIZE (64)) OF SL-Thres-RSRP-r16
+
+SL-Thres-RSRP-r16 ::=         INTEGER (0..66)
+
+-- TAG-SL-THRES-RSRP-LIST-STOP
+-- TAG-SL-TXPOWER-START
+
+SL-TxPower-r16 ::=                    CHOICE{
+    minusinfinity-r16                     NULL,
+    txPower-r16                           INTEGER (-30..33)
+}
+
+-- TAG-SL-TXPOWER-STOP
+-- TAG-SL-TYPETXSYNC-START
+
+SL-TypeTxSync-r16 ::=                     ENUMERATED {gnss, gnbEnb, ue}
+
+-- TAG-SL-TYPETXSYNC-STOP
+-- TAG-SL-UE-SELECTEDCONFIG-START
+
+SL-UE-SelectedConfig-r16 ::=                 SEQUENCE {
+    sl-PSSCH-TxConfigList-r16                    SL-PSSCH-TxConfigList-r16                                   OPTIONAL,    -- Need R
+    sl-ProbResourceKeep-r16                      ENUMERATED {v0, v0dot2, v0dot4, v0dot6, v0dot8}             OPTIONAL,    -- Need R
+    sl-ReselectAfter-r16                         ENUMERATED {n1, n2, n3, n4, n5, n6, n7, n8, n9}             OPTIONAL,    -- Need R
+    sl-CBR-CommonTxConfigList-r16                SL-CBR-CommonTxConfigList-r16                               OPTIONAL,    -- Need R
+    ul-PrioritizationThres-r16                   INTEGER (1..16)                                             OPTIONAL,    -- Need R
+    sl-PrioritizationThres-r16                   INTEGER (1..8)                                              OPTIONAL,    -- Need R
+    ...
+}
+
+-- TAG-SL-UE-SELECTEDCONFIG-STOP
+-- TAG-SL-ZONECONFIG-START
+
+SL-ZoneConfig-r16 ::=              SEQUENCE {
+    sl-ZoneLength-r16                  ENUMERATED { m5, m10, m20, m30, m40, m50, spare2, spare1},
+    ...
+}
+
+-- TAG-SL-ZONECONFIG-STOP
+-- TAG-SLRB-UU-CONFIGINDEX-START
+
+SLRB-Uu-ConfigIndex-r16 ::=                    INTEGER (1..maxNrofSLRB-r16)
+
+-- TAG-SLRB-UU-CONFIGINDEX-STOP
+-- TAG-MULTIPLICITY-AND-TYPE-CONSTRAINT-DEFINITIONS-START
+
+maxAI-DCI-PayloadSize-r16               INTEGER ::= 128      --Maximum size of the DCI payload scrambled with ai-RNTI
+maxAI-DCI-PayloadSize-r16-1             INTEGER ::= 127      --Maximum size of the DCI payload scrambled with ai-RNTI minus 1
+maxBandComb                             INTEGER ::= 65536   -- Maximum number of DL band combinations
+maxBandsUTRA-FDD-r16                    INTEGER ::= 64      -- Maximum number of bands listed in UTRA-FDD UE caps
+maxBH-RLC-ChannelID-r16                 INTEGER ::= 65536   -- Maximum value of BH RLC Channel ID
+maxBT-IdReport-r16                      INTEGER ::= 32      -- Maximum number of Bluetooth IDs to report
+maxBT-Name-r16                          INTEGER ::= 4       -- Maximum number of Bluetooth name
+maxCAG-Cell-r16                         INTEGER ::= 16      -- Maximum number of NR CAG cell ranges in SIB3, SIB4
+maxTwoPUCCH-Grp-ConfigList-r16          INTEGER ::= 32      -- Maximum number of supported configuration(s) of {primary PUCCH group
+                                                            -- config, secondary PUCCH group config}
+maxCBR-Config-r16                       INTEGER ::= 8       -- Maximum number of CBR range configurations for sidelink communication
+                                                            -- congestion control
+maxCBR-Config-1-r16                     INTEGER ::= 7       -- Maximum number of CBR range configurations for sidelink communication
+                                                            -- congestion control minus 1
+maxCBR-Level-r16                        INTEGER ::= 16      -- Maximum nuber of CBR levels
+maxCBR-Level-1-r16                      INTEGER ::= 15      -- Maximum number of CBR levels minus 1
+maxCellBlack                            INTEGER ::= 16      -- Maximum number of NR blacklisted cell ranges in SIB3, SIB4
+maxCellHistory-r16                      INTEGER ::= 16      -- Maximum number of visited cells reported
+maxCellInter                            INTEGER ::= 16      -- Maximum number of inter-Freq cells listed in SIB4
+maxCellIntra                            INTEGER ::= 16      -- Maximum number of intra-Freq cells listed in SIB3
+maxCellMeasEUTRA                        INTEGER ::= 32      -- Maximum number of cells in E-UTRAN
+maxCellMeasIdle-r16                     INTEGER ::= 8       -- Maximum number of cells per carrier for idle/inactive measurements
+maxCellMeasUTRA-FDD-r16                 INTEGER ::= 32      -- Maximum number of cells in FDD UTRAN
+maxCellWhite                            INTEGER ::= 16      -- Maximum number of NR whitelisted cell ranges in SIB3, SIB4
+maxEARFCN                               INTEGER ::= 262143  -- Maximum value of E-UTRA carrier frequency
+maxEUTRA-CellBlack                      INTEGER ::= 16      -- Maximum number of E-UTRA blacklisted physical cell identity ranges
+                                                            -- in SIB5
+maxEUTRA-NS-Pmax                        INTEGER ::= 8       -- Maximum number of NS and P-Max values per band
+maxLogMeasReport-r16                    INTEGER ::= 520     -- Maximum number of entries for logged measurements
+maxMultiBands                           INTEGER ::= 8       -- Maximum number of additional frequency bands that a cell belongs to
+maxNARFCN                               INTEGER ::= 3279165 -- Maximum value of NR carrier frequency
+maxNR-NS-Pmax                           INTEGER ::= 8       -- Maximum number of NS and P-Max values per band
+maxFreqIdle-r16                         INTEGER ::= 8       -- Maximum number of carrier frequencies for idle/inactive measurements
+maxNrofServingCells                     INTEGER ::= 32      -- Max number of serving cells (SpCells + SCells)
+maxNrofServingCells-1                   INTEGER ::= 31      -- Max number of serving cells (SpCell + SCells) per cell group
+maxNrofAggregatedCellsPerCellGroup      INTEGER ::= 16
+maxNrofDUCells-r16                      INTEGER ::= 512     -- Max number of cells configured on the collocated IAB-DU
+maxNrofAssociatedDUCellsPerMT-r16       INTEGER ::= 65535
+maxNrofAvailabilityCombinationsPerSet-r16   INTEGER ::= 512 -- Max number of AvailabilityCombinationId used in the DCI format 2_5
+maxNrofAvailabilityCombinationsPerSet-r16-1 INTEGER ::= 511 -- Max number of AvailabilityCombinationId used in the DCI format 2_5 minus 1
+maxNrofSCells                           INTEGER ::= 31      -- Max number of secondary serving cells per cell group
+maxNrofCellMeas                         INTEGER ::= 32      -- Maximum number of entries in each of the cell lists in a measurement object
+maxNrofCG-SL-r16                        INTEGER ::= 8       -- Max number of sidelink configured grant
+maxNrofCG-SL-r16-1                      INTEGER ::= 7       -- Max number of sidelink configured grant minus 1
+maxNrofSS-BlocksToAverage               INTEGER ::= 16      -- Max number for the (max) number of SS blocks to average to determine cell measurement
+maxNrofCondCells-r16                    INTEGER ::= 8       -- Max number of conditional candidate SpCells
+maxNrofCSI-RS-ResourcesToAverage        INTEGER ::= 16      -- Max number for the (max) number of CSI-RS to average to determine cell measurement
+maxNrofDL-Allocations                   INTEGER ::= 16      -- Maximum number of PDSCH time domain resource allocations
+maxNrofSR-ConfigPerCellGroup            INTEGER ::= 8       -- Maximum number of SR configurations per cell group
+maxLCG-ID                               INTEGER ::= 7       -- Maximum value of LCG ID
+maxLC-ID                                INTEGER ::= 32      -- Maximum value of Logical Channel ID
+maxLC-ID-Iab-r16                        INTEGER ::= 65855   -- Maximum value of BH Logical Channel ID extension
+maxLTE-CRS-Patterns-r16                 INTEGER ::= 3       -- Maximum number of additional LTE CRS rate matching patterns
+maxNrofTAGs                             INTEGER ::= 4       -- Maximum number of Timing Advance Groups
+maxNrofTAGs-1                           INTEGER ::= 3       -- Maximum number of Timing Advance Groups minus 1
+maxNrofBWPs                             INTEGER ::= 4       -- Maximum number of BWPs per serving cell
+maxNrofCombIDC                          INTEGER ::= 128     -- Maximum number of reported MR-DC combinations for IDC
+maxNrofSymbols-1                        INTEGER ::= 13      -- Maximum index identifying a symbol within a slot (14 symbols, indexed from 0..13)
+maxNrofSlots                            INTEGER ::= 320     -- Maximum number of slots in a 10 ms period
+maxNrofSlots-1                          INTEGER ::= 319     -- Maximum number of slots in a 10 ms period minus 1
+maxNrofPhysicalResourceBlocks           INTEGER ::= 275     -- Maximum number of PRBs
+maxNrofPhysicalResourceBlocks-1         INTEGER ::= 274     -- Maximum number of PRBs minus 1
+maxNrofPhysicalResourceBlocksPlus1      INTEGER ::= 276     -- Maximum number of PRBs plus 1
+maxNrofControlResourceSets              INTEGER ::= 12      -- Max number of CoReSets configurable on a serving cell
+maxNrofControlResourceSets-1            INTEGER ::= 11      -- Max number of CoReSets configurable on a serving cell minus 1
+maxNrofControlResourceSets-1-r16        INTEGER ::= 15      -- Max number of CoReSets configurable on a serving cell extended in minus 1
+maxNrofCoresetPools-r16                 INTEGER ::= 2       -- Maximum number of CORESET pools
+maxCoReSetDuration                      INTEGER ::= 3       -- Max number of OFDM symbols in a control resource set
+maxNrofSearchSpaces-1                   INTEGER ::= 39      -- Max number of Search Spaces minus 1
+maxSFI-DCI-PayloadSize                  INTEGER ::= 128     -- Max number payload of a DCI scrambled with SFI-RNTI
+maxSFI-DCI-PayloadSize-1                INTEGER ::= 127     -- Max number payload of a DCI scrambled with SFI-RNTI minus 1
+maxIAB-IP-Address-r16                   INTEGER ::= 32      -- Max number of assigned IP addresses
+maxINT-DCI-PayloadSize                  INTEGER ::= 126     -- Max number payload of a DCI scrambled with INT-RNTI
+maxINT-DCI-PayloadSize-1                INTEGER ::= 125     -- Max number payload of a DCI scrambled with INT-RNTI minus 1
+maxNrofRateMatchPatterns                INTEGER ::= 4       -- Max number of rate matching patterns that may be configured
+maxNrofRateMatchPatterns-1              INTEGER ::= 3       -- Max number of rate matching patterns that may be configured minus 1
+maxNrofRateMatchPatternsPerGroup        INTEGER ::= 8       -- Max number of rate matching patterns that may be configured in one group
+maxNrofCSI-ReportConfigurations         INTEGER ::= 48      -- Maximum number of report configurations
+maxNrofCSI-ReportConfigurations-1       INTEGER ::= 47      -- Maximum number of report configurations minus 1
+maxNrofCSI-ResourceConfigurations       INTEGER ::= 112     -- Maximum number of resource configurations
+maxNrofCSI-ResourceConfigurations-1     INTEGER ::= 111     -- Maximum number of resource configurations minus 1
+maxNrofAP-CSI-RS-ResourcesPerSet        INTEGER ::= 16
+maxNrOfCSI-AperiodicTriggers            INTEGER ::= 128     -- Maximum number of triggers for aperiodic CSI reporting
+maxNrofReportConfigPerAperiodicTrigger  INTEGER ::= 16      -- Maximum number of report configurations per trigger state for aperiodic reporting
+maxNrofNZP-CSI-RS-Resources             INTEGER ::= 192     -- Maximum number of Non-Zero-Power (NZP) CSI-RS resources
+maxNrofNZP-CSI-RS-Resources-1           INTEGER ::= 191     -- Maximum number of Non-Zero-Power (NZP) CSI-RS resources minus 1
+maxNrofNZP-CSI-RS-ResourcesPerSet       INTEGER ::= 64      -- Maximum number of NZP CSI-RS resources per resource set
+maxNrofNZP-CSI-RS-ResourceSets          INTEGER ::= 64      -- Maximum number of NZP CSI-RS resources per cell
+maxNrofNZP-CSI-RS-ResourceSets-1        INTEGER ::= 63      -- Maximum number of NZP CSI-RS resources per cell minus 1
+maxNrofNZP-CSI-RS-ResourceSetsPerConfig INTEGER ::= 16      -- Maximum number of resource sets per resource configuration
+maxNrofNZP-CSI-RS-ResourcesPerConfig    INTEGER ::= 128     -- Maximum number of resources per resource configuration
+maxNrofZP-CSI-RS-Resources              INTEGER ::= 32      -- Maximum number of Zero-Power (ZP) CSI-RS resources
+maxNrofZP-CSI-RS-Resources-1            INTEGER ::= 31      -- Maximum number of Zero-Power (ZP) CSI-RS resources minus 1
+maxNrofZP-CSI-RS-ResourceSets-1         INTEGER ::= 15
+maxNrofZP-CSI-RS-ResourcesPerSet        INTEGER ::= 16
+maxNrofZP-CSI-RS-ResourceSets           INTEGER ::= 16
+maxNrofCSI-IM-Resources                 INTEGER ::= 32      -- Maximum number of CSI-IM resources. See CSI-IM-ResourceMax in 38.214.
+maxNrofCSI-IM-Resources-1               INTEGER ::= 31      -- Maximum number of CSI-IM resources minus 1. See CSI-IM-ResourceMax in 38.214.
+maxNrofCSI-IM-ResourcesPerSet           INTEGER ::= 8       -- Maximum number of CSI-IM resources per set. See CSI-IM-ResourcePerSetMax in 38.214
+maxNrofCSI-IM-ResourceSets              INTEGER ::= 64      -- Maximum number of NZP CSI-IM resources per cell
+maxNrofCSI-IM-ResourceSets-1            INTEGER ::= 63      -- Maximum number of NZP CSI-IM resources per cell minus 1
+maxNrofCSI-IM-ResourceSetsPerConfig     INTEGER ::= 16      -- Maximum number of CSI IM resource sets per resource configuration
+maxNrofCSI-SSB-ResourcePerSet           INTEGER ::= 64      -- Maximum number of SSB resources in a resource set
+maxNrofCSI-SSB-ResourceSets             INTEGER ::= 64      -- Maximum number of CSI SSB resource sets per cell
+maxNrofCSI-SSB-ResourceSets-1           INTEGER ::= 63      -- Maximum number of CSI SSB resource sets per cell minus 1
+maxNrofCSI-SSB-ResourceSetsPerConfig    INTEGER ::= 1       -- Maximum number of CSI SSB resource sets per resource configuration
+maxNrofFailureDetectionResources        INTEGER ::= 10      -- Maximum number of failure detection resources
+maxNrofFailureDetectionResources-1      INTEGER ::= 9       -- Maximum number of failure detection resources minus 1
+maxNrofFreqSL-r16                       INTEGER ::= 8       -- Maximum number of carrier frequncy for for NR sidelink communication
+maxNrofSL-BWPs-r16                      INTEGER ::= 4       -- Maximum number of BWP for for NR sidelink communication
+maxFreqSL-EUTRA-r16                     INTEGER ::= 8       -- Maximum number of EUTRA anchor carrier frequncy for NR sidelink communication
+maxNrofSL-MeasId-r16                    INTEGER ::= 64      -- Maximum number of sidelink measurement identity (RSRP) per destination
+maxNrofSL-ObjectId-r16                  INTEGER ::= 64      -- Maximum number of sidelink measurement objects (RSRP) per destination
+maxNrofSL-ReportConfigId-r16            INTEGER ::= 64      -- Maximum number of sidelink measurement reporting configuration(RSRP) per destination
+maxNrofSL-PoolToMeasureNR-r16           INTEGER ::= 8       -- Maximum number of resoure pool for NR sidelink measurement to measure for
+                                                            -- each measurement object (for CBR)
+maxFreqSL-NR-r16                        INTEGER ::= 8       -- Maximum number of NR anchor carrier frequncy for NR sidelink communication
+maxNrofSL-QFIs-r16                      INTEGER ::= 2048    -- Maximum number of QoS flow for NR sidelink communication per UE
+maxNrofSL-QFIsPerDest-r16               INTEGER ::= 64      -- Maximum number of QoS flow per destination for NR sidelink communication
+maxNrofObjectId                         INTEGER ::= 64      -- Maximum number of measurement objects
+maxNrofPageRec                          INTEGER ::= 32      -- Maximum number of page records
+maxNrofPCI-Ranges                       INTEGER ::= 8       -- Maximum number of PCI ranges
+maxPLMN                                 INTEGER ::= 12      -- Maximum number of PLMNs broadcast and reported by UE at establisghment
+maxNrofCSI-RS-ResourcesRRM              INTEGER ::= 96      -- Maximum number of CSI-RS resources per cell for an RRM measurement object
+maxNrofCSI-RS-ResourcesRRM-1            INTEGER ::= 95      -- Maximum number of CSI-RS resources per cell for an RRM measurement object minus 1
+maxNrofMeasId                           INTEGER ::= 64      -- Maximum number of configured measurements
+maxNrofQuantityConfig                   INTEGER ::= 2       -- Maximum number of quantity configurations
+maxNrofCSI-RS-CellsRRM                  INTEGER ::= 96      -- Maximum number of cells with CSI-RS resources for an RRM measurement object
+maxNrofSL-Dest-r16                      INTEGER ::= 32      -- Maximum number of destination for NR sidelink communication
+maxNrofSL-Dest-1-r16                    INTEGER ::= 31      -- Highest index of destination for NR sidelink communication
+maxNrofSLRB-r16                         INTEGER ::= 512     -- Maximum number of radio bearer for NR sidelink communication per UE
+maxSL-LCID-r16                          INTEGER ::= 512     -- Maximum number of RLC bearer for NR sidelink communication per UE
+maxSL-SyncConfig-r16                    INTEGER ::= 16      -- Maximum number of sidelink Sync configurations
+maxNrofRXPool-r16                       INTEGER ::= 16      -- Maximum number of Rx resource poolfor NR sidelink communication
+maxNrofTXPool-r16                       INTEGER ::= 8       -- Maximum number of Tx resourcepoolfor NR sidelink communication
+maxNrofPoolID-r16                       INTEGER ::= 16      -- Maximum index of resource pool for NR sidelink communication
+maxNrofSRS-PathlossReferenceRS-r16      INTEGER ::= 64      -- Maximum number of RSs used as pathloss reference for SRS power control.
+maxNrofSRS-PathlossReferenceRS-1-r16    INTEGER ::= 63      -- Maximum number of RSs used as pathloss reference for SRS power control-1.
+maxNrofSRS-ResourceSets                 INTEGER ::= 16      -- Maximum number of SRS resource sets in a BWP.
+maxNrofSRS-ResourceSets-1               INTEGER ::= 15      -- Maximum number of SRS resource sets in a BWP minus 1.
+maxNrofSRS-PosResourceSets-r16          INTEGER ::= 16      -- Maximum number of SRS Positioning resource sets in a BWP.
+maxNrofSRS-PosResourceSets-1-r16        INTEGER ::= 15      -- Maximum number of SRS Positioning resource sets in a BWP minus 1.
+maxNrofSRS-Resources                    INTEGER ::= 64      -- Maximum number of SRS resources.
+maxNrofSRS-Resources-1                  INTEGER ::= 63      -- Maximum number of SRS resources minus 1.
+maxNrofSRS-PosResources-r16             INTEGER ::= 64      -- Maximum number of SRS Positioning resources.
+maxNrofSRS-PosResources-1-r16           INTEGER ::= 63      -- Maximum number of SRS Positioning resources in an SRS Positioning
+                                                            -- resource set minus 1.
+maxNrofSRS-ResourcesPerSet              INTEGER ::= 16      -- Maximum number of SRS resources in an SRS resource set
+maxNrofSRS-TriggerStates-1              INTEGER ::= 3       -- Maximum number of SRS trigger states minus 1, i.e., the largest code point.
+maxNrofSRS-TriggerStates-2              INTEGER ::= 2       -- Maximum number of SRS trigger states minus 2.
+maxRAT-CapabilityContainers             INTEGER ::= 8       -- Maximum number of interworking RAT containers (incl NR and MRDC)
+maxSimultaneousBands                    INTEGER ::= 32      -- Maximum number of simultaneously aggregated bands
+maxULTxSwitchingBandPairs               INTEGER ::= 32      -- Maximum number of band pairs supporting dynamic UL Tx switching in a band combination
+maxNrofSlotFormatCombinationsPerSet     INTEGER ::= 512     -- Maximum number of Slot Format Combinations in a SF-Set.
+maxNrofSlotFormatCombinationsPerSet-1   INTEGER ::= 511     -- Maximum number of Slot Format Combinations in a SF-Set minus 1.
+maxNrofTrafficPattern-r16               INTEGER ::= 8       -- Maximum number of Traffic Pattern for NR sidelink communication.
+maxNrofPUCCH-Resources                  INTEGER ::= 128
+maxNrofPUCCH-Resources-1                INTEGER ::= 127
+maxNrofPUCCH-ResourceSets               INTEGER ::= 4       -- Maximum number of PUCCH Resource Sets
+maxNrofPUCCH-ResourceSets-1             INTEGER ::= 3       -- Maximum number of PUCCH Resource Sets minus 1.
+maxNrofPUCCH-ResourcesPerSet            INTEGER ::= 32      -- Maximum number of PUCCH Resources per PUCCH-ResourceSet
+maxNrofPUCCH-P0-PerSet                  INTEGER ::= 8       -- Maximum number of P0-pucch present in a p0-pucch set
+maxNrofPUCCH-PathlossReferenceRSs       INTEGER ::= 4       -- Maximum number of RSs used as pathloss reference for PUCCH power control.
+maxNrofPUCCH-PathlossReferenceRSs-1     INTEGER ::= 3       -- Maximum number of RSs used as pathloss reference for PUCCH power control minus 1.
+maxNrofPUCCH-PathlossReferenceRSs-r16   INTEGER ::= 64      -- Maximum number of RSs used as pathloss reference for PUCCH power control extended.
+maxNrofPUCCH-PathlossReferenceRSs-1-r16 INTEGER ::= 63      -- Maximum number of RSs used as pathloss reference for PUCCH power control
+                                                            -- minus 1 extended.
+maxNrofPUCCH-PathlossReferenceRSsDiff-r16 INTEGER ::= 60    -- Difference between the extended maximum and the non-extended maximum
+maxNrofPUCCH-ResourceGroups-r16         INTEGER ::= 4       -- Maximum number of PUCCH resources groups.
+maxNrofPUCCH-ResourcesPerGroup-r16      INTEGER ::= 128     -- Maximum number of PUCCH resources in a PUCCH group.
+maxNrofMultiplePUSCHs-r16               INTEGER ::= 8       -- Maximum number of multiple PUSCHs in PUSCH TDRA list
+maxNrofP0-PUSCH-AlphaSets               INTEGER ::= 30      -- Maximum number of P0-pusch-alpha-sets (see 38,213, clause 7.1)
+maxNrofP0-PUSCH-AlphaSets-1             INTEGER ::= 29      -- Maximum number of P0-pusch-alpha-sets minus 1 (see 38,213, clause 7.1)
+maxNrofPUSCH-PathlossReferenceRSs       INTEGER ::= 4       -- Maximum number of RSs used as pathloss reference for PUSCH power control.
+maxNrofPUSCH-PathlossReferenceRSs-1     INTEGER ::= 3       -- Maximum number of RSs used as pathloss reference for PUSCH power control minus 1.
+maxNrofPUSCH-PathlossReferenceRSs-r16   INTEGER ::= 64      -- Maximum number of RSs used as pathloss reference for PUSCH power control extended
+maxNrofPUSCH-PathlossReferenceRSs-1-r16 INTEGER ::= 63      -- Maximum number of RSs used as pathloss reference for PUSCH power control minus 1
+maxNrofPUSCH-PathlossReferenceRSsDiff-r16  INTEGER ::= 60   -- Difference between maxNrofPUSCH-PathlossReferenceRSs-r16 and
+                                                            -- maxNrofPUSCH-PathlossReferenceRSs
+maxNrofNAICS-Entries                    INTEGER ::= 8       -- Maximum number of supported NAICS capability set
+maxBands                                INTEGER ::= 1024    -- Maximum number of supported bands in UE capability.
+maxBandsMRDC                            INTEGER ::= 1280
+maxBandsEUTRA                           INTEGER ::= 256
+maxCellReport                           INTEGER ::= 8
+maxDRB                                  INTEGER ::= 29      -- Maximum number of DRBs (that can be added in DRB-ToAddModLIst).
+maxFreq                                 INTEGER ::= 8       -- Max number of frequencies.
+maxFreqLayers                           INTEGER ::= 4       -- Max number of frequency layers.
+maxFreqIDC-r16                          INTEGER ::= 128     -- Max number of frequencies for IDC indication.
+maxCombIDC-r16                          INTEGER ::= 128     -- Max number of reported UL CA for IDC indication.
+maxFreqIDC-MRDC                         INTEGER ::= 32      -- Maximum number of candidate NR frequencies for MR-DC IDC indication
+maxNrofCandidateBeams                   INTEGER ::= 16      -- Max number of PRACH-ResourceDedicatedBFR that in BFR config.
+maxNrofCandidateBeams-r16               INTEGER ::= 64      -- Max number of candidate beam resources in BFR config.
+maxNrofCandidateBeamsExt-r16            INTEGER ::= 48      -- Max number of PRACH-ResourceDedicatedBFR in the CandidateBeamRSListExt
+maxNrofPCIsPerSMTC                      INTEGER ::= 64      -- Maximun number of PCIs per SMTC.
+maxNrofQFIs                             INTEGER ::= 64
+maxNrofResourceAvailabilityPerCombination-r16 INTEGER ::= 256
+maxNrOfSemiPersistentPUSCH-Triggers     INTEGER ::= 64      -- Maximum number of triggers for semi persistent reporting on PUSCH
+maxNrofSR-Resources                     INTEGER ::= 8       -- Maximum number of SR resources per BWP in a cell.
+maxNrofSlotFormatsPerCombination        INTEGER ::= 256
+maxNrofSpatialRelationInfos             INTEGER ::= 8
+maxNrofSpatialRelationInfos-plus-1      INTEGER ::= 9
+maxNrofSpatialRelationInfos-r16         INTEGER ::= 64
+maxNrofSpatialRelationInfosDiff-r16     INTEGER ::= 56      -- Difference between maxNrofSpatialRelationInfos-r16 and maxNrofSpatialRelationInfos
+maxNrofIndexesToReport                  INTEGER ::= 32
+maxNrofIndexesToReport2                 INTEGER ::= 64
+maxNrofSSBs-r16                         INTEGER ::= 64      -- Maximum number of SSB resources in a resource set.
+maxNrofSSBs-1                           INTEGER ::= 63      -- Maximum number of SSB resources in a resource set minus 1.
+maxNrofS-NSSAI                          INTEGER ::= 8       -- Maximum number of S-NSSAI.
+maxNrofTCI-StatesPDCCH                  INTEGER ::= 64
+maxNrofTCI-States                       INTEGER ::= 128     -- Maximum number of TCI states.
+maxNrofTCI-States-1                     INTEGER ::= 127     -- Maximum number of TCI states minus 1.
+maxNrofUL-Allocations                   INTEGER ::= 16      -- Maximum number of PUSCH time domain resource allocations.
+maxQFI                                  INTEGER ::= 63
+maxRA-CSIRS-Resources                   INTEGER ::= 96
+maxRA-OccasionsPerCSIRS                 INTEGER ::= 64      -- Maximum number of RA occasions for one CSI-RS
+maxRA-Occasions-1                       INTEGER ::= 511     -- Maximum number of RA occasions in the system
+maxRA-SSB-Resources                     INTEGER ::= 64
+maxSCSs                                 INTEGER ::= 5
+maxSecondaryCellGroups                  INTEGER ::= 3
+maxNrofServingCellsEUTRA                INTEGER ::= 32
+maxMBSFN-Allocations                    INTEGER ::= 8
+maxNrofMultiBands                       INTEGER ::= 8
+maxCellSFTD                             INTEGER ::= 3       -- Maximum number of cells for SFTD reporting
+maxReportConfigId                       INTEGER ::= 64
+maxNrofCodebooks                        INTEGER ::= 16      -- Maximum number of codebooks suppoted by the UE
+maxNrofCSI-RS-ResourcesExt-r16          INTEGER ::= 16      -- Maximum number of codebook resources supported by the UE for eType2/Codebook combo
+maxNrofCSI-RS-Resources                 INTEGER ::= 7       -- Maximum number of codebook resources supported by the UE
+maxNrofCSI-RS-ResourcesAlt-r16          INTEGER ::= 512     -- Maximum number of alternative codebook resources supported by the UE
+maxNrofCSI-RS-ResourcesAlt-1-r16        INTEGER ::= 511     -- Maximum number of alternative codebook resources supported by the UE minus 1
+maxNrofSRI-PUSCH-Mappings               INTEGER ::= 16
+maxNrofSRI-PUSCH-Mappings-1             INTEGER ::= 15
+maxSIB                                  INTEGER::= 32       -- Maximum number of SIBs
+maxSI-Message                           INTEGER::= 32       -- Maximum number of SI messages
+maxPO-perPF                             INTEGER ::= 4       -- Maximum number of paging occasion per paging frame
+maxAccessCat-1                          INTEGER ::= 63      -- Maximum number of Access Categories minus 1
+maxBarringInfoSet                       INTEGER ::= 8       -- Maximum number of Access Categories
+maxCellEUTRA                            INTEGER ::= 8       -- Maximum number of E-UTRA cells in SIB list
+maxEUTRA-Carrier                        INTEGER ::= 8       -- Maximum number of E-UTRA carriers in SIB list
+maxPLMNIdentities                       INTEGER ::= 8       -- Maximum number of PLMN identites in RAN area configurations
+maxDownlinkFeatureSets                  INTEGER ::= 1024    -- (for NR DL) Total number of FeatureSets (size of the pool)
+maxUplinkFeatureSets                    INTEGER ::= 1024    -- (for NR UL) Total number of FeatureSets (size of the pool)
+maxEUTRA-DL-FeatureSets                 INTEGER ::= 256     -- (for E-UTRA) Total number of FeatureSets (size of the pool)
+maxEUTRA-UL-FeatureSets                 INTEGER ::= 256     -- (for E-UTRA) Total number of FeatureSets (size of the pool)
+maxFeatureSetsPerBand                   INTEGER ::= 128     -- (for NR) The number of feature sets associated with one band.
+maxPerCC-FeatureSets                    INTEGER ::= 1024    -- (for NR) Total number of CC-specific FeatureSets (size of the pool)
+maxFeatureSetCombinations               INTEGER ::= 1024    -- (for MR-DC/NR)Total number of Feature set combinations (size of the pool)
+maxInterRAT-RSTD-Freq                   INTEGER ::= 3
+maxHRNN-Len-r16                         INTEGER ::= 48      -- Maximum length of HRNNs
+maxNPN-r16                              INTEGER ::= 12      -- Maximum number of NPNs broadcast and reported by UE at establishment
+maxNrOfMinSchedulingOffsetValues-r16    INTEGER ::= 2       -- Maximum number of min. scheduling offset (K0/K2) configurations
+maxK0-SchedulingOffset-r16              INTEGER ::= 16      -- Maximum number of slots configured as min. scheduling offset (K0)
+maxK2-SchedulingOffset-r16              INTEGER ::= 16      -- Maximum number of slots configured as min. scheduling offset (K2)
+maxDCI-2-6-Size-r16                     INTEGER ::= 140     -- Maximum size of DCI format 2-6
+maxDCI-2-6-Size-1-r16                   INTEGER ::= 139     -- Maximum DCI format 2-6 size minus 1
+maxNrofUL-Allocations-r16               INTEGER ::= 64      -- Maximum number of PUSCH time domain resource allocations
+maxNrofP0-PUSCH-Set-r16                 INTEGER ::= 2       -- Maximum number of P0 PUSCH set(s)
+maxOnDemandSIB-r16                      INTEGER ::= 8       -- Maximum number of SIB(s) that can be requested on-demand
+maxOnDemandPosSIB-r16                   INTEGER ::= 32      -- Maximum number of posSIB(s) that can be requested on-demand
+maxCI-DCI-PayloadSize-r16               INTEGER ::= 126     -- Maximum number of the DCI size for CI
+maxCI-DCI-PayloadSize-r16-1             INTEGER ::= 125     -- Maximum number of the DCI size for CI minus 1
+maxWLAN-Id-Report-r16                   INTEGER ::= 32      -- Maximum number of WLAN IDs to report
+maxWLAN-Name-r16                        INTEGER ::= 4       -- Maximum number of WLAN name
+maxRAReport-r16                         INTEGER ::= 8       -- Maximum number of RA procedures information to be included in the RA report
+maxTxConfig-r16                         INTEGER ::= 64      -- Maximum number of sidelink transmission parameters configurations
+maxTxConfig-1-r16                       INTEGER ::= 63      -- Maximum number of sidelink transmission parameters configurations minus 1
+maxPSSCH-TxConfig-r16                   INTEGER ::= 16      -- Maximum number of PSSCH TX configurations
+maxNrofCLI-RSSI-Resources-r16           INTEGER ::= 64      -- Maximum number of CLI-RSSI resources for UE
+maxNrofCLI-RSSI-Resources-r16-1         INTEGER ::= 63      -- Maximum number of CLI-RSSI resources for UE minus 1
+maxNrofCLI-SRS-Resources-r16             INTEGER ::= 32      -- Maximum number of SRS resources for CLI measurement for UE
+maxCLI-Report-r16                       INTEGER ::= 8
+maxNrofConfiguredGrantConfig-r16        INTEGER ::= 12      -- Maximum number of configured grant configurations per BWP
+maxNrofConfiguredGrantConfig-r16-1      INTEGER ::= 11      -- Maximum number of configured grant configurations per BWP minus 1
+maxNrofCG-Type2DeactivationState        INTEGER ::= 16      -- Maximum number of deactivation state for type 2 configured grants per BWP
+maxNrofConfiguredGrantConfigMAC-r16     INTEGER ::= 32      -- Maximum number of configured grant configurations per MAC entity
+maxNrofConfiguredGrantConfigMAC-r16-1   INTEGER ::= 31      -- Maximum number of configured grant configurations per MAC entity minus 1
+maxNrofSPS-Config-r16                   INTEGER ::= 8       -- Maximum number of SPS configurations per BWP
+maxNrofSPS-Config-r16-1                 INTEGER ::= 7       -- Maximum number of SPS configurations per BWP minus 1
+maxNrofSPS-DeactivationState            INTEGER ::= 16      -- Maximum number of deactivation state for SPS per BWP
+maxNrofDormancyGroups                   INTEGER ::= 5       --
+maxNrofPUCCH-ResourceGroups-1-r16       INTEGER ::= 3       --
+maxNrofServingCellsTCI-r16              INTEGER ::= 32      -- Maximum number of serving cells in simultaneousTCI-UpdateList
+maxNrofTxDC-TwoCarrier-r16              INTEGER ::= 64      -- Maximum number of UL Tx DC locations reported by the UE for 2CC uplink CA
+
+-- TAG-MULTIPLICITY-AND-TYPE-CONSTRAINT-DEFINITIONS-STOP
+
+END
+
+-- TAG-PC5-RRC-DEFINITIONS-START
+						
+PC5-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::=
+ 
+BEGIN
+
+IMPORTS
+	SetupRelease,
+	RRC-TransactionIdentifier,
+	SN-FieldLengthAM,
+	SN-FieldLengthUM,
+	LogicalChannelIdentity,
+	maxNrofSLRB-r16,
+	maxNrofSL-QFIs-r16,
+	maxNrofSL-QFIsPerDest-r16,
+	RSRP-Range,
+	SL-MeasConfig-r16,
+	SL-MeasId-r16,
+	FreqBandList,
+	FreqBandIndicatorNR,
+	maxSimultaneousBands,
+	maxBandComb,
+	maxBands,
+	BandParametersSidelink-r16,
+	RLC-ParametersSidelink-r16
+
+
+FROM NR-RRC-Definitions;
+
+-- TAG-PC5-RRC-DEFINITIONS-STOP
+	
+
+-- TAG-SBCCH-SL-BCH-MESSAGE-START
+
+SBCCH-SL-BCH-Message ::= SEQUENCE {
+    message                  SBCCH-SL-BCH-MessageType
+}
+
+SBCCH-SL-BCH-MessageType::=     CHOICE {
+    c1                              CHOICE {
+        masterInformationBlockSidelink              MasterInformationBlockSidelink,
+        spare1 NULL
+    },
+    messageClassExtension   SEQUENCE {}
+}
+
+-- TAG-SBCCH-SL-BCH-MESSAGE-STOP
+-- TAG-SCCH-MESSAGE-START
+
+SCCH-Message ::=             SEQUENCE {
+    message                         SCCH-MessageType
+}
+
+SCCH-MessageType ::=         CHOICE {
+    c1                              CHOICE {
+        measurementReportSidelink                MeasurementReportSidelink,
+        rrcReconfigurationSidelink               RRCReconfigurationSidelink,
+        rrcReconfigurationCompleteSidelink       RRCReconfigurationCompleteSidelink,
+        rrcReconfigurationFailureSidelink        RRCReconfigurationFailureSidelink,
+        ueCapabilityEnquirySidelink              UECapabilityEnquirySidelink,
+        ueCapabilityInformationSidelink          UECapabilityInformationSidelink,
+        spare2 NULL, spare1 NULL
+    },
+    messageClassExtension           SEQUENCE {}
+}
+
+-- TAG-SCCH-MESSAGE-STOP
+-- TAG-MASTERINFORMATIONBLOCKSIDELINK-START
+
+MasterInformationBlockSidelink ::=           SEQUENCE {
+    sl-TDD-Config-r16                            BIT STRING (SIZE (12)),
+    inCoverage-r16                               BOOLEAN,
+    directFrameNumber-r16                        BIT STRING (SIZE (10)),
+    slotIndex-r16                                BIT STRING (SIZE (7)),
+    reservedBits-r16                             BIT STRING (SIZE (2))
+}
+
+-- TAG-MASTERINFORMATIONBLOCKSIDELINK-STOP
+-- TAG-MEASUREMENTREPORTSIDELINK-START
+
+MeasurementReportSidelink ::=                   SEQUENCE {
+    criticalExtensions                              CHOICE {
+        measurementReportSidelink-r16                   MeasurementReportSidelink-IEs-r16,
+        criticalExtensionsFuture                        SEQUENCE {}
+    }
+}
+
+MeasurementReportSidelink-IEs-r16 ::=           SEQUENCE {
+    sl-measResults-r16                              SL-MeasResults-r16,
+    lateNonCriticalExtension                        OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                            SEQUENCE{}                                                              OPTIONAL
+}
+
+SL-MeasResults-r16 ::=                          SEQUENCE {
+    sl-MeasId-r16                                   SL-MeasId-r16,
+    sl-MeasResult-r16                               SL-MeasResult-r16,
+    ...
+}
+
+SL-MeasResult-r16 ::=                           SEQUENCE {
+    sl-ResultDMRS-r16                               SL-MeasQuantityResult-r16                                               OPTIONAL,
+    ...
+}
+
+SL-MeasQuantityResult-r16 ::=                   SEQUENCE {
+    sl-RSRP-r16                                     RSRP-Range                                                              OPTIONAL,
+    ...
+}
+
+-- TAG-MEASUREMENTREPORTSIDELINK-STOP
+-- TAG-RRCRECONFIGURATIONSIDELINK-START
+
+RRCReconfigurationSidelink ::=          SEQUENCE {
+    rrc-TransactionIdentifier-r16           RRC-TransactionIdentifier,
+    criticalExtensions                      CHOICE {
+        rrcReconfigurationSidelink-r16          RRCReconfigurationSidelink-IEs-r16,
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+RRCReconfigurationSidelink-IEs-r16 ::=  SEQUENCE {
+    slrb-ConfigToAddModList-r16             SEQUENCE (SIZE (1..maxNrofSLRB-r16)) OF SLRB-Config-r16             OPTIONAL, -- Need N
+    slrb-ConfigToReleaseList-r16            SEQUENCE (SIZE (1..maxNrofSLRB-r16)) OF SLRB-PC5-ConfigIndex-r16    OPTIONAL, -- Need N
+    sl-MeasConfig-r16                       SetupRelease {SL-MeasConfig-r16}                                    OPTIONAL, -- Need M
+    sl-CSI-RS-Config-r16                    SetupRelease {SL-CSI-RS-Config-r16}                                 OPTIONAL, -- Need M
+    sl-ResetConfig-r16                      ENUMERATED {true}                                                   OPTIONAL, -- Need N
+    sl-LatencyBoundCSI-Report-r16           INTEGER (3..160)                                                    OPTIONAL, -- Need M
+    lateNonCriticalExtension                OCTET STRING                                                        OPTIONAL,
+    nonCriticalExtension                    SEQUENCE {}                                                         OPTIONAL
+}
+
+SLRB-Config-r16::=                      SEQUENCE {
+    slrb-PC5-ConfigIndex-r16                SLRB-PC5-ConfigIndex-r16,
+    sl-SDAP-ConfigPC5-r16                   SL-SDAP-ConfigPC5-r16                                               OPTIONAL, -- Need M
+    sl-PDCP-ConfigPC5-r16                   SL-PDCP-ConfigPC5-r16                                               OPTIONAL, -- Need M
+    sl-RLC-ConfigPC5-r16                    SL-RLC-ConfigPC5-r16                                                OPTIONAL, -- Need M
+    sl-MAC-LogicalChannelConfigPC5-r16      SL-LogicalChannelConfigPC5-r16                                      OPTIONAL, -- Need M
+    ...
+}
+
+SLRB-PC5-ConfigIndex-r16 ::=            INTEGER (1..maxNrofSLRB-r16)
+
+SL-SDAP-ConfigPC5-r16 ::=               SEQUENCE {
+    sl-MappedQoS-FlowsToAddList-r16         SEQUENCE (SIZE (1.. maxNrofSL-QFIsPerDest-r16)) OF SL-PQFI-r16      OPTIONAL, -- Need N
+    sl-MappedQoS-FlowsToReleaseList-r16     SEQUENCE (SIZE (1.. maxNrofSL-QFIsPerDest-r16)) OF SL-PQFI-r16      OPTIONAL, -- Need N
+    sl-SDAP-Header-r16                      ENUMERATED {present, absent},
+    ...
+}
+
+SL-PDCP-ConfigPC5-r16 ::=               SEQUENCE {
+    sl-PDCP-SN-Size-r16                     ENUMERATED {len12bits, len18bits}                                   OPTIONAL, -- Need M
+    sl-OutOfOrderDelivery-r16               ENUMERATED { true }                                                 OPTIONAL,  -- Need R
+    ...
+}
+
+SL-RLC-ConfigPC5-r16 ::=                CHOICE {
+    sl-AM-RLC-r16                           SEQUENCE {
+        sl-SN-FieldLengthAM-r16                 SN-FieldLengthAM                                                OPTIONAL, -- Need M
+        ...
+    },
+    sl-UM-Bi-Directional-RLC-r16            SEQUENCE {
+        sl-SN-FieldLengthUM-r16                 SN-FieldLengthUM                                                OPTIONAL, -- Need M
+        ...
+    },
+    sl-UM-Uni-Directional-RLC-r16           SEQUENCE {
+        sl-SN-FieldLengthUM-r16                 SN-FieldLengthUM                                                OPTIONAL, -- Need M
+        ...
+    }
+}
+
+SL-LogicalChannelConfigPC5-r16 ::=      SEQUENCE {
+    sl-LogicalChannelIdentity-r16           LogicalChannelIdentity,
+    ...
+}
+
+SL-PQFI-r16 ::=                         INTEGER (1..64)
+
+SL-CSI-RS-Config-r16 ::=                SEQUENCE {
+    sl-CSI-RS-FreqAllocation-r16            CHOICE {
+        sl-OneAntennaPort-r16                   BIT STRING (SIZE (12)),
+        sl-TwoAntennaPort-r16                   BIT STRING (SIZE (6))
+    }                                                                                                           OPTIONAL, -- Need M
+    sl-CSI-RS-FirstSymbol-r16               INTEGER (3..12)                                                     OPTIONAL, -- Need M
+    ...
+}
+
+-- TAG-RRCRECONFIGURATIONSIDELINK-STOP
+-- TAG-RRCRECONFIGURATIONCOMPLETESIDELINK-START
+
+RRCReconfigurationCompleteSidelink ::=         SEQUENCE {
+    rrc-TransactionIdentifier-r16                  RRC-TransactionIdentifier,
+    criticalExtensions                             CHOICE {
+        rrcReconfigurationCompleteSidelink-r16         RRCReconfigurationCompleteSidelink-IEs-r16,
+        criticalExtensionsFuture                       SEQUENCE {}
+    }
+}
+
+RRCReconfigurationCompleteSidelink-IEs-r16 ::= SEQUENCE {
+    lateNonCriticalExtension                       OCTET STRING                                                       OPTIONAL,
+    nonCriticalExtension                           SEQUENCE {}                                                        OPTIONAL
+}
+
+-- TAG-RRCRECONFIGURATIONCOMPLETESIDELINK-STOP
+-- TAG-RRCRECONFIGURATIONFAILURESIDELINK-START
+
+RRCReconfigurationFailureSidelink ::=         SEQUENCE {
+    rrc-TransactionIdentifier-r16                 RRC-TransactionIdentifier,
+    criticalExtensions                            CHOICE {
+        rrcReconfigurationFailureSidelink-r16         RRCReconfigurationFailureSidelink-IEs-r16,
+        criticalExtensionsFuture                      SEQUENCE {}
+    }
+}
+
+RRCReconfigurationFailureSidelink-IEs-r16 ::= SEQUENCE {
+    lateNonCriticalExtension                      OCTET STRING                                                         OPTIONAL,
+    nonCriticalExtension                          SEQUENCE {}                                                          OPTIONAL
+}
+
+-- TAG-RRCRECONFIGURATIONFAILURESIDELINK-STOP
+-- TAG-UECAPABILITYENQUIRYSIDELINK-START
+
+UECapabilityEnquirySidelink ::=         SEQUENCE {
+    rrc-TransactionIdentifier-r16           RRC-TransactionIdentifier,
+    criticalExtensions                      CHOICE {
+        ueCapabilityEnquirySidelink-r16         UECapabilityEnquirySidelink-IEs-r16,
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+UECapabilityEnquirySidelink-IEs-r16 ::= SEQUENCE {
+    frequencyBandListFilterSidelink-r16     FreqBandList                                                            OPTIONAL, -- Need N
+    ue-CapabilityInformationSidelink-r16    OCTET STRING                                                            OPTIONAL,
+    lateNonCriticalExtension                OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                    SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-UECAPABILITYENQUIRYSIDELINK-STOP
+-- TAG-UECAPABILITYINFORMATIONSIDELINK-START
+
+UECapabilityInformationSidelink ::=         SEQUENCE {
+    rrc-TransactionIdentifier-r16               RRC-TransactionIdentifier,
+    criticalExtensions                          CHOICE {
+        ueCapabilityInformationSidelink-r16         UECapabilityInformationSidelink-IEs-r16,
+        criticalExtensionsFuture                    SEQUENCE {}
+    }
+}
+
+UECapabilityInformationSidelink-IEs-r16 ::= SEQUENCE {
+    accessStratumReleaseSidelink-r16            AccessStratumReleaseSidelink-r16,
+    pdcp-ParametersSidelink-r16                 PDCP-ParametersSidelink-r16                                             OPTIONAL,
+    rlc-ParametersSidelink-r16                  RLC-ParametersSidelink-r16                                              OPTIONAL,
+    supportedBandCombinationListSidelinkNR-r16  BandCombinationListSidelinkNR-r16                                       OPTIONAL,
+    supportedBandListSidelink-r16               SEQUENCE (SIZE (1..maxBands)) OF BandSidelinkPC5-r16                    OPTIONAL,
+    appliedFreqBandListFilter-r16               FreqBandList                                                            OPTIONAL,
+    lateNonCriticalExtension                    OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                        SEQUENCE{}                                                              OPTIONAL
+}
+
+AccessStratumReleaseSidelink-r16 ::= ENUMERATED { rel16, spare7, spare6, spare5, spare4, spare3, spare2, spare1, ... }
+
+PDCP-ParametersSidelink-r16 ::= SEQUENCE {
+    outOfOrderDeliverySidelink-r16              ENUMERATED {supported}      OPTIONAL,
+    ...
+}
+
+BandCombinationListSidelinkNR-r16 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombinationParametersSidelinkNR-r16
+
+BandCombinationParametersSidelinkNR-r16 ::= SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParametersSidelink-r16
+
+BandSidelinkPC5-r16 ::=           SEQUENCE {
+    freqBandSidelink-r16              FreqBandIndicatorNR,
+    --15-1
+    sl-Reception-r16                  SEQUENCE {
+        harq-RxProcessSidelink-r16        ENUMERATED {n16, n24, n32, n64},
+        pscch-RxSidelink-r16              ENUMERATED {value1, value2},
+        scs-CP-PatternRxSidelink-r16      CHOICE {
+            fr1-r16                           SEQUENCE {
+                scs-15kHz-r16                     BIT STRING (SIZE (16))                            OPTIONAL,
+                scs-30kHz-r16                     BIT STRING (SIZE (16))                            OPTIONAL,
+                scs-60kHz-r16                     BIT STRING (SIZE (16))                            OPTIONAL
+            },
+            fr2-r16                           SEQUENCE {
+                scs-60kHz-r16                     BIT STRING (SIZE (16))                            OPTIONAL,
+                scs-120kHz-r16                    BIT STRING (SIZE (16))                            OPTIONAL
+            }
+        }                                                                                           OPTIONAL,
+        extendedCP-RxSidelink-r16         ENUMERATED {supported}                                    OPTIONAL
+    }                                                                                               OPTIONAL,
+    --15-10
+    sl-Tx-256QAM-r16                  ENUMERATED {supported}                                        OPTIONAL,
+    --15-12
+    lowSE-64QAM-MCS-TableSidelink-r16 ENUMERATED {supported}                                        OPTIONAL,
+    ...,
+    [[
+    --15-14
+    csi-ReportSidelink-r16                SEQUENCE {
+        csi-RS-PortsSidelink-r16              ENUMERATED {p1, p2}
+    }                                                                                               OPTIONAL,
+    --15-19
+    rankTwoReception-r16                  ENUMERATED {supported}                                    OPTIONAL,
+    --15-23
+    sl-openLoopPC-RSRP-ReportSidelink-r16 ENUMERATED {supported}                                    OPTIONAL,
+    --13-1
+    sl-Rx-256QAM-r16                      ENUMERATED {supported}                                    OPTIONAL
+    ]]
+}
+
+-- TAG-UECAPABILITYINFORMATIONSIDELINK-STOP
+
+END
+
+-- NR-UE-VARIABLES-START
+NR-UE-Variables DEFINITIONS AUTOMATIC TAGS ::=
+ 
+BEGIN
+
+IMPORTS	   
+    ARFCN-ValueNR,
+    CellIdentity,
+    EUTRA-PhysCellId,
+    MeasId,
+    MeasIdToAddModList,
+    MeasIdleCarrierEUTRA-r16,
+    MeasIdleCarrierNR-r16,
+    MeasResultIdleEUTRA-r16,
+    MeasResultIdleNR-r16,
+    MeasObjectToAddModList,
+    PhysCellId,
+    RNTI-Value,
+    ReportConfigToAddModList,
+    RSRP-Range,
+    SL-MeasId-r16,
+    SL-MeasIdList-r16,
+    SL-MeasObjectList-r16,
+    SL-ReportConfigList-r16,
+    SL-QuantityConfig-r16,
+    Tx-PoolMeasList-r16,
+    QuantityConfig,
+    maxNrofCellMeas,
+    maxNrofMeasId,
+    maxFreqIdle-r16,
+    PhysCellIdUTRA-FDD-r16,
+    ValidityAreaList-r16,
+    CondReconfigToAddModList-r16,
+    ConnEstFailReport-r16,
+    LoggingDuration-r16,
+    LoggingInterval-r16,
+    LogMeasInfoList-r16,
+    LogMeasInfo-r16,
+    RA-Report-r16,
+    RLF-Report-r16,
+    TraceReference-r16,
+    WLAN-Identifiers-r16,
+    WLAN-NameList-r16,
+    BT-NameList-r16,
+    PLMN-Identity,
+    maxPLMN,
+    RA-ReportList-r16,
+    VisitedCellInfoList-r16,
+    AbsoluteTimeInfo-r16,
+    LoggedEventTriggerConfig-r16,
+    LoggedPeriodicalReportConfig-r16,
+    Sensor-NameList-r16,
+    PLMN-IdentityList2-r16,
+    AreaConfiguration-r16,
+    maxNrofSL-MeasId-r16,
+    maxNrofFreqSL-r16,
+    maxNrofCLI-RSSI-Resources-r16,
+    maxNrofCLI-SRS-Resources-r16,
+    RSSI-ResourceId-r16,
+    SRS-ResourceId
+FROM NR-RRC-Definitions;
+
+-- NR-UE-VARIABLES-STOP	
+-- TAG-VARCONDITIONALRECONFIG-START
+
+VarConditionalReconfig ::=     SEQUENCE {
+    condReconfigList               CondReconfigToAddModList-r16        OPTIONAL
+}
+
+
+-- TAG-VARCONDITIONALRECONFIG-STOP
+-- TAG-VARCONNESTFAILREPORT-START
+
+VarConnEstFailReport-r16 ::= SEQUENCE {
+    connEstFailReport-r16        ConnEstFailReport-r16,
+    plmn-Identity-r16            PLMN-Identity
+}
+
+-- TAG-VARCONNESTFAILREPORT-STOP
+-- TAG-VARLOGMEASCONFIG-START
+
+VarLogMeasConfig-r16-IEs ::= SEQUENCE {
+    areaConfiguration-r16        AreaConfiguration-r16        OPTIONAL,
+    bt-NameList-r16              BT-NameList-r16              OPTIONAL,
+    wlan-NameList-r16            WLAN-NameList-r16            OPTIONAL,
+    sensor-NameList-r16          Sensor-NameList-r16          OPTIONAL,
+    loggingDuration-r16          LoggingDuration-r16,
+    reportType                   CHOICE {
+        periodical                   LoggedPeriodicalReportConfig-r16,
+        eventTriggered               LoggedEventTriggerConfig-r16
+    }
+}
+-- TAG-VARLOGMEASCONFIG-STOP
+-- TAG-VARLOGMEASREPORT-START
+
+VarLogMeasReport-r16 ::=     SEQUENCE {
+    absoluteTimeInfo-r16         AbsoluteTimeInfo-r16,
+    traceReference-r16           TraceReference-r16,
+    traceRecordingSessionRef-r16 OCTET STRING (SIZE (2)),
+    tce-Id-r16                   OCTET STRING (SIZE (1)),
+    logMeasInfoList-r16          LogMeasInfoList-r16,
+    plmn-IdentityList-r16        PLMN-IdentityList2-r16
+}
+
+-- TAG-VARLOGMEASREPORT-STOP
+-- TAG-VARMEASCONFIG-START
+
+VarMeasConfig ::=                   SEQUENCE {
+    -- Measurement identities
+    measIdList                          MeasIdToAddModList                  OPTIONAL,
+    -- Measurement objects
+    measObjectList                      MeasObjectToAddModList              OPTIONAL,
+    -- Reporting configurations
+    reportConfigList                    ReportConfigToAddModList            OPTIONAL,
+    -- Other parameters
+    quantityConfig                      QuantityConfig                      OPTIONAL,
+    s-MeasureConfig                         CHOICE {
+        ssb-RSRP                                RSRP-Range,
+        csi-RSRP                                RSRP-Range
+    }                                                                       OPTIONAL
+
+}
+
+-- TAG-VARMEASCONFIG-STOP
+-- TAG-VARMEASCONFIGSL-START
+
+VarMeasConfigSL-r16 ::=                        SEQUENCE {
+    -- NR sidelink measurement identities
+    sl-MeasIdList-r16                              SL-MeasIdList-r16                          OPTIONAL,
+    -- NR sidelink measurement objects
+    sl-MeasObjectList-r16                          SL-MeasObjectList-r16                      OPTIONAL,
+    -- NR sidelink reporting configurations
+    sl-reportConfigList-r16                        SL-ReportConfigList-r16                    OPTIONAL,
+    -- Other parameters
+    sl-QuantityConfig-r16                          SL-QuantityConfig-r16                      OPTIONAL
+}
+
+-- TAG-VARMEASCONFIGSL-STOP
+-- TAG-VARMEASIDLECONFIG-START
+
+VarMeasIdleConfig-r16 ::=     SEQUENCE {
+    measIdleCarrierListNR-r16     SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierNR-r16                  OPTIONAL,
+    measIdleCarrierListEUTRA-r16  SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierEUTRA-r16               OPTIONAL,
+    measIdleDuration-r16          ENUMERATED {sec10, sec30, sec60, sec120, sec180, sec240, sec300, spare},
+    validityAreaList-r16          ValidityAreaList-r16                                                           OPTIONAL
+}
+
+-- TAG-VARMEASIDLECONFIG-STOP
+-- TAG-VARMEASIDLEREPORT-START
+
+VarMeasIdleReport-r16 ::=    SEQUENCE {
+    measReportIdleNR-r16         MeasResultIdleNR-r16                     OPTIONAL,
+    measReportIdleEUTRA-r16      MeasResultIdleEUTRA-r16                  OPTIONAL
+}
+
+-- TAG-VARMEASIDLEREPORT-STOP
+-- TAG-VARMEASREPORTLIST-START
+
+VarMeasReportList ::=               SEQUENCE (SIZE (1..maxNrofMeasId)) OF VarMeasReport
+
+VarMeasReport ::=                   SEQUENCE {
+    -- List of measurement that have been triggered
+    measId                              MeasId,
+    cellsTriggeredList                  CellsTriggeredList              OPTIONAL,
+    numberOfReportsSent                 INTEGER,
+    cli-TriggeredList-r16               CLI-TriggeredList-r16           OPTIONAL,
+    tx-PoolMeasToAddModListNR-r16       Tx-PoolMeasList-r16             OPTIONAL
+}
+
+CellsTriggeredList ::=              SEQUENCE (SIZE (1..maxNrofCellMeas)) OF CHOICE {
+    physCellId                          PhysCellId,
+    physCellIdEUTRA                     EUTRA-PhysCellId,
+    physCellIdUTRA-FDD-r16              PhysCellIdUTRA-FDD-r16
+    }
+
+CLI-TriggeredList-r16 ::=           CHOICE {
+    srs-RSRP-TriggeredList-r16          SRS-RSRP-TriggeredList-r16,
+    cli-RSSI-TriggeredList-r16          CLI-RSSI-TriggeredList-r16
+    }
+
+SRS-RSRP-TriggeredList-r16 ::=      SEQUENCE (SIZE (1.. maxNrofCLI-SRS-Resources-r16)) OF SRS-ResourceId
+
+CLI-RSSI-TriggeredList-r16 ::=      SEQUENCE (SIZE (1.. maxNrofCLI-RSSI-Resources-r16)) OF RSSI-ResourceId-r16
+
+-- TAG-VARMEASREPORTLIST-STOP
+-- TAG-VARMEASREPORTLISTSL-START
+
+VarMeasReportListSL-r16 ::=               SEQUENCE (SIZE (1..maxNrofSL-MeasId-r16)) OF VarMeasReportSL-r16
+
+VarMeasReportSL-r16 ::=                   SEQUENCE {
+    -- List of NR sidelink measurement that have been triggered
+    sl-MeasId-r16                             SL-MeasId-r16,
+    sl-FrequencyTriggeredList-r16             SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF ARFCN-ValueNR              OPTIONAL,
+    sl-NumberOfReportsSent-r16                INTEGER
+}
+
+-- TAG-VARMEASREPORTLISTSL-STOP
+-- TAG-VARMOBILITYHISTORYREPORT-START
+
+VarMobilityHistoryReport-r16 ::= VisitedCellInfoList-r16
+
+-- TAG-VARMOBILITYHISTORYREPORT-STOP
+-- TAG-VARPENDINGRNA-UPDATE-START
+
+VarPendingRNA-Update ::=                    SEQUENCE {
+    pendingRNA-Update                   BOOLEAN                             OPTIONAL
+}
+
+-- TAG-VARPENDINGRNA-UPDATE-STOP
+-- TAG-VARRA-REPORT-START
+
+VarRA-Report-r16 ::=      SEQUENCE {
+    ra-ReportList-r16         RA-ReportList-r16,
+    plmn-IdentityList-r16     PLMN-IdentityList-r16
+}
+
+PLMN-IdentityList-r16 ::= SEQUENCE (SIZE (1..maxPLMN)) OF PLMN-Identity
+
+-- TAG-VARRA-REPORT-STOP
+-- TAG-VARRESUMEMAC-INPUT-START
+
+VarResumeMAC-Input  ::=     SEQUENCE {
+    sourcePhysCellId                        PhysCellId,
+    targetCellIdentity                      CellIdentity,
+    source-c-RNTI                           RNTI-Value
+
+}
+
+-- TAG-VARRESUMEMAC-INPUT-STOP
+-- TAG-VARRLF-REPORT-START
+
+VarRLF-Report-r16 ::=    SEQUENCE {
+    rlf-Report-r16           RLF-Report-r16,
+    plmn-IdentityList-r16    PLMN-IdentityList2-r16
+}
+
+-- TAG-VARRLF-REPORT-STOP
+-- TAG-VARSHORTMAC-INPUT-START
+
+VarShortMAC-Input   ::=                 SEQUENCE {
+    sourcePhysCellId                        PhysCellId,
+    targetCellIdentity                      CellIdentity,
+    source-c-RNTI                           RNTI-Value
+}
+
+-- TAG-VARSHORTMAC-INPUT-STOP
+
+END
+
+-- TAG-NR-SIDELINK-PRECONF-DEFINITIONS-START
+
+NR-Sidelink-Preconf DEFINITIONS AUTOMATIC TAGS ::=
+ 
+BEGIN
+
+IMPORTS
+	SL-CBR-CommonTxConfigList-r16,
+	SL-FreqConfigCommon-r16,
+	SL-RadioBearerConfig-r16,
+	SL-RLC-BearerConfig-r16,
+	SL-EUTRA-AnchorCarrierFreqList-r16,
+	SL-NR-AnchorCarrierFreqList-r16,
+	SL-MeasConfigCommon-r16,
+	SL-UE-SelectedConfig-r16,
+	TDD-UL-DL-ConfigCommon,
+	maxNrofFreqSL-r16,
+	maxNrofSLRB-r16,
+	maxSL-LCID-r16
+FROM NR-RRC-Definitions;
+
+-- TAG-NR-SIDELINK-PRECONF-DEFINITIONS-STOP
+
+-- TAG-SL-PRECONFIGURATIONNR-START
+
+SL-PreconfigurationNR-r16 ::=             SEQUENCE {
+    sidelinkPreconfigNR-r16                   SidelinkPreconfigNR-r16,
+    ...
+}
+
+SidelinkPreconfigNR-r16 ::=                 SEQUENCE {
+    sl-PreconfigFreqInfoList-r16                SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF SL-FreqConfigCommon-r16     OPTIONAL,
+    sl-PreconfigNR-AnchorCarrierFreqList-r16    SL-NR-AnchorCarrierFreqList-r16                                       OPTIONAL,
+    sl-PreconfigEUTRA-AnchorCarrierFreqList-r16 SL-EUTRA-AnchorCarrierFreqList-r16                                    OPTIONAL,
+    sl-RadioBearerPreConfigList-r16             SEQUENCE (SIZE (1..maxNrofSLRB-r16)) OF SL-RadioBearerConfig-r16      OPTIONAL,
+    sl-RLC-BearerPreConfigList-r16              SEQUENCE (SIZE (1..maxSL-LCID-r16)) OF SL-RLC-BearerConfig-r16        OPTIONAL,
+    sl-MeasPreConfig-r16                        SL-MeasConfigCommon-r16                                               OPTIONAL,
+    sl-OffsetDFN-r16                            INTEGER (1..1000)                                                     OPTIONAL,
+    t400-r16                                    ENUMERATED{ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000} OPTIONAL,
+    sl-MaxNumConsecutiveDTX-r16                 ENUMERATED {n1, n2, n3, n4, n6, n8, n16, n32}	                      OPTIONAL,
+    sl-SSB-PriorityNR-r16                       INTEGER (1..8)                                                        OPTIONAL,
+    sl-PreconfigGeneral-r16                     SL-PreconfigGeneral-r16                                               OPTIONAL,
+    sl-UE-SelectedPreConfig-r16                 SL-UE-SelectedConfig-r16                                              OPTIONAL,
+    sl-CSI-Acquisition-r16                      ENUMERATED {enabled}                                                  OPTIONAL,
+    sl-RoHC-Profiles-r16                        SL-RoHC-Profiles-r16                                                  OPTIONAL,
+    sl-MaxCID-r16                               INTEGER (1..16383)                                                    DEFAULT 15,
+    ...
+}
+
+SL-PreconfigGeneral-r16 ::=                 SEQUENCE {
+    sl-TDD-Configuration-r16                    TDD-UL-DL-ConfigCommon                                                OPTIONAL,
+    reservedBits-r16                            BIT STRING (SIZE (2))                                                 OPTIONAL,
+    ...
+}
+
+SL-RoHC-Profiles-r16 ::=              SEQUENCE {
+    profile0x0001-r16                     BOOLEAN,
+    profile0x0002-r16                     BOOLEAN,
+    profile0x0003-r16                     BOOLEAN,
+    profile0x0004-r16                     BOOLEAN,
+    profile0x0006-r16                     BOOLEAN,
+    profile0x0101-r16                     BOOLEAN,
+    profile0x0102-r16                     BOOLEAN,
+    profile0x0103-r16                     BOOLEAN,
+    profile0x0104-r16                     BOOLEAN
+}
+
+-- TAG-SL-PRECONFIGURATIONNR-STOP
+
+END
+
+-- TAG-NR-INTER-NODE-DEFINITIONS-START									  
+NR-InterNodeDefinitions DEFINITIONS AUTOMATIC TAGS ::=
+ 
+BEGIN
+
+IMPORTS
+    ARFCN-ValueNR,
+    ARFCN-ValueEUTRA,
+    CellIdentity,
+    CGI-InfoEUTRA,
+    CGI-InfoNR,
+    CSI-RS-Index,
+    CSI-RS-CellMobility,
+    DRX-Config,
+    EUTRA-PhysCellId,
+    FeatureSetDownlinkPerCC-Id,
+    FeatureSetUplinkPerCC-Id,
+    FreqBandIndicatorNR,
+    GapConfig,
+    maxBandComb,
+    maxBands,
+    maxCellSFTD,
+    maxFeatureSetsPerBand,
+    maxFreqIDC-MRDC,
+    maxNrofCombIDC,
+    maxNrofPhysicalResourceBlocks,
+    maxNrofSCells,
+    maxNrofServingCells,
+    maxNrofServingCells-1,
+    maxNrofServingCellsEUTRA,
+    maxNrofIndexesToReport,
+    maxSimultaneousBands,
+    MeasQuantityResults,
+    MeasResultCellListSFTD-EUTRA,
+    MeasResultCellListSFTD-NR,
+    MeasResultList2NR,
+    MeasResultSCG-Failure,
+    MeasResultServFreqListEUTRA-SCG,
+    NeedForGapsInfoNR-r16,
+    OverheatingAssistance,
+    P-Max,
+    PhysCellId,
+    RadioBearerConfig,
+    RAN-NotificationAreaInfo,
+    RRCReconfiguration,
+    ServCellIndex,
+    SetupRelease,
+    SSB-Index,
+    SSB-MTC,
+    SSB-ToMeasure,
+    SS-RSSI-Measurement,
+    ShortMAC-I,
+    SubcarrierSpacing,
+    UEAssistanceInformation,
+    UE-CapabilityRAT-ContainerList,
+    maxNrofCLI-RSSI-Resources-r16,
+    maxNrofCLI-SRS-Resources-r16,
+    RSSI-ResourceId-r16,
+    SidelinkUEInformationNR-r16,
+    SRS-ResourceId
+FROM NR-RRC-Definitions;
+
+-- TAG-NR-INTER-NODE-DEFINITIONS-STOP						
+-- TAG-HANDOVER-COMMAND-START
+
+HandoverCommand ::=                 SEQUENCE {
+    criticalExtensions                  CHOICE {
+        c1                                  CHOICE{
+            handoverCommand                     HandoverCommand-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+HandoverCommand-IEs ::=             SEQUENCE {
+    handoverCommandMessage              OCTET STRING (CONTAINING RRCReconfiguration),
+    nonCriticalExtension                SEQUENCE {}                                        OPTIONAL
+}
+
+-- TAG-HANDOVER-COMMAND-STOP
+-- TAG-HANDOVER-PREPARATION-INFORMATION-START
+
+HandoverPreparationInformation ::=      SEQUENCE {
+    criticalExtensions                      CHOICE {
+        c1                                      CHOICE{
+            handoverPreparationInformation          HandoverPreparationInformation-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+HandoverPreparationInformation-IEs ::=  SEQUENCE {
+    ue-CapabilityRAT-List                   UE-CapabilityRAT-ContainerList,
+    sourceConfig                            AS-Config                                       OPTIONAL, -- Cond HO
+    rrm-Config                              RRM-Config                                      OPTIONAL,
+    as-Context                              AS-Context                                      OPTIONAL,
+    nonCriticalExtension                    SEQUENCE {}                                     OPTIONAL
+}
+
+AS-Config ::=                           SEQUENCE {
+    rrcReconfiguration                      OCTET STRING (CONTAINING RRCReconfiguration),
+    ...,
+    [[
+    sourceRB-SN-Config                      OCTET STRING (CONTAINING RadioBearerConfig)     OPTIONAL,
+    sourceSCG-NR-Config                     OCTET STRING (CONTAINING RRCReconfiguration)    OPTIONAL,
+    sourceSCG-EUTRA-Config                  OCTET STRING                                    OPTIONAL
+    ]],
+    [[
+    sourceSCG-Configured                    ENUMERATED {true}                               OPTIONAL
+    ]]
+
+}
+
+AS-Context ::=                          SEQUENCE {
+    reestablishmentInfo                     ReestablishmentInfo                                 OPTIONAL,
+    configRestrictInfo                      ConfigRestrictInfoSCG                               OPTIONAL,
+    ...,
+    [[  ran-NotificationAreaInfo            RAN-NotificationAreaInfo                            OPTIONAL
+    ]],
+    [[  ueAssistanceInformation             OCTET STRING (CONTAINING UEAssistanceInformation)   OPTIONAL   -- Cond HO2
+    ]],
+    [[
+    selectedBandCombinationSN               BandCombinationInfoSN                               OPTIONAL
+    ]],
+    [[
+    configRestrictInfoDAPS-r16              ConfigRestrictInfoDAPS-r16                          OPTIONAL,
+    sidelinkUEInformationNR-r16             OCTET STRING                                        OPTIONAL,
+    sidelinkUEInformationEUTRA-r16          OCTET STRING                                        OPTIONAL,
+    ueAssistanceInformationEUTRA-r16        OCTET STRING                                        OPTIONAL,
+    ueAssistanceInformationSCG-r16          OCTET STRING (CONTAINING UEAssistanceInformation)   OPTIONAL,   -- Cond HO2
+    needForGapsInfoNR-r16                   NeedForGapsInfoNR-r16                               OPTIONAL
+    ]],
+    [[
+    configRestrictInfoDAPS-v1640            ConfigRestrictInfoDAPS-v1640                        OPTIONAL
+    ]]
+}
+
+ConfigRestrictInfoDAPS-r16 ::=          SEQUENCE {
+    powerCoordination-r16                   SEQUENCE {
+        p-DAPS-Source-r16                       P-Max,
+        p-DAPS-Target-r16                       P-Max,
+        uplinkPowerSharingDAPS-Mode-r16          ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic }
+    }                                                                                                       OPTIONAL
+}
+
+ConfigRestrictInfoDAPS-v1640 ::=    SEQUENCE {
+    sourceFeatureSetPerDownlinkCC-r16   FeatureSetDownlinkPerCC-Id,
+    sourceFeatureSetPerUplinkCC-r16     FeatureSetUplinkPerCC-Id
+}
+
+ReestablishmentInfo ::=             SEQUENCE {
+    sourcePhysCellId                        PhysCellId,
+    targetCellShortMAC-I                    ShortMAC-I,
+    additionalReestabInfoList               ReestabNCellInfoList                            OPTIONAL
+}
+
+ReestabNCellInfoList ::=             SEQUENCE ( SIZE (1..maxCellPrep) ) OF ReestabNCellInfo
+
+ReestabNCellInfo::= SEQUENCE{
+    cellIdentity                            CellIdentity,
+    key-gNodeB-Star                         BIT STRING (SIZE (256)),
+    shortMAC-I                              ShortMAC-I
+}
+
+RRM-Config ::=              SEQUENCE {
+    ue-InactiveTime             ENUMERATED {
+                                    s1, s2, s3, s5, s7, s10, s15, s20,
+                                    s25, s30, s40, s50, min1, min1s20, min1s40,
+                                    min2, min2s30, min3, min3s30, min4, min5, min6,
+                                    min7, min8, min9, min10, min12, min14, min17, min20,
+                                    min24, min28, min33, min38, min44, min50, hr1,
+                                    hr1min30, hr2, hr2min30, hr3, hr3min30, hr4, hr5, hr6,
+                                    hr8, hr10, hr13, hr16, hr20, day1, day1hr12, day2,
+                                    day2hr12, day3, day4, day5, day7, day10, day14, day19,
+                                    day24, day30, dayMoreThan30}                            OPTIONAL,
+    candidateCellInfoList       MeasResultList2NR                                           OPTIONAL,
+    ...,
+    [[
+    candidateCellInfoListSN-EUTRA      MeasResultServFreqListEUTRA-SCG                      OPTIONAL
+    ]]
+}
+
+-- TAG-HANDOVER-PREPARATION-INFORMATION-STOP
+-- TAG-CG-CONFIG-START
+
+CG-Config ::=                   SEQUENCE {
+    criticalExtensions                  CHOICE {
+        c1                                  CHOICE{
+            cg-Config                           CG-Config-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+CG-Config-IEs ::=                   SEQUENCE {
+    scg-CellGroupConfig                 OCTET STRING (CONTAINING RRCReconfiguration)    OPTIONAL,
+    scg-RB-Config                       OCTET STRING (CONTAINING RadioBearerConfig)     OPTIONAL,
+    configRestrictModReq                ConfigRestrictModReqSCG                         OPTIONAL,
+    drx-InfoSCG                         DRX-Info                                        OPTIONAL,
+    candidateCellInfoListSN             OCTET STRING (CONTAINING MeasResultList2NR)     OPTIONAL,
+    measConfigSN                        MeasConfigSN                                    OPTIONAL,
+    selectedBandCombination             BandCombinationInfoSN                           OPTIONAL,
+    fr-InfoListSCG                      FR-InfoList                                     OPTIONAL,
+    candidateServingFreqListNR          CandidateServingFreqListNR                      OPTIONAL,
+    nonCriticalExtension                CG-Config-v1540-IEs                             OPTIONAL
+}
+
+CG-Config-v1540-IEs ::=             SEQUENCE {
+    pSCellFrequency                     ARFCN-ValueNR                                   OPTIONAL,
+    reportCGI-RequestNR                 SEQUENCE {
+        requestedCellInfo                   SEQUENCE {
+            ssbFrequency                        ARFCN-ValueNR,
+            cellForWhichToReportCGI             PhysCellId
+        }                                                                               OPTIONAL
+    }                                                                                   OPTIONAL,
+    ph-InfoSCG                          PH-TypeListSCG                                  OPTIONAL,
+    nonCriticalExtension                CG-Config-v1560-IEs                             OPTIONAL
+}
+
+CG-Config-v1560-IEs ::=             SEQUENCE {
+    pSCellFrequencyEUTRA                ARFCN-ValueEUTRA                                OPTIONAL,
+    scg-CellGroupConfigEUTRA            OCTET STRING                                    OPTIONAL,
+    candidateCellInfoListSN-EUTRA       OCTET STRING                                    OPTIONAL,
+    candidateServingFreqListEUTRA       CandidateServingFreqListEUTRA                   OPTIONAL,
+    needForGaps                         ENUMERATED {true}                               OPTIONAL,
+    drx-ConfigSCG                       DRX-Config                                      OPTIONAL,
+    reportCGI-RequestEUTRA              SEQUENCE {
+        requestedCellInfoEUTRA          SEQUENCE {
+            eutraFrequency                             ARFCN-ValueEUTRA,
+            cellForWhichToReportCGI-EUTRA              EUTRA-PhysCellId
+        }                                                                               OPTIONAL
+    }                                                                                   OPTIONAL,
+    nonCriticalExtension                CG-Config-v1590-IEs                             OPTIONAL
+}
+
+CG-Config-v1590-IEs ::=             SEQUENCE {
+    scellFrequenciesSN-NR               SEQUENCE (SIZE (1.. maxNrofServingCells-1)) OF  ARFCN-ValueNR          OPTIONAL,
+    scellFrequenciesSN-EUTRA            SEQUENCE (SIZE (1.. maxNrofServingCells-1)) OF  ARFCN-ValueEUTRA       OPTIONAL,
+    nonCriticalExtension                CG-Config-v1610-IEs                                                    OPTIONAL
+}
+
+CG-Config-v1610-IEs ::=             SEQUENCE {
+    drx-InfoSCG2                        DRX-Info2                                       OPTIONAL,
+    nonCriticalExtension                CG-Config-v1620-IEs                             OPTIONAL
+}
+
+CG-Config-v1620-IEs ::=             SEQUENCE {
+    ueAssistanceInformationSCG-r16      OCTET STRING (CONTAINING UEAssistanceInformation)  OPTIONAL,
+    nonCriticalExtension                CG-Config-v1630-IEs                                OPTIONAL
+}
+
+CG-Config-v1630-IEs ::=             SEQUENCE {
+    selectedToffset-r16                 T-Offset-r16                                       OPTIONAL,
+    nonCriticalExtension                CG-Config-v1640-IEs                                OPTIONAL
+}
+
+CG-Config-v1640-IEs ::=             SEQUENCE {
+    servCellInfoListSCG-NR-r16          ServCellInfoListSCG-NR-r16                      OPTIONAL,
+    servCellInfoListSCG-EUTRA-r16       ServCellInfoListSCG-EUTRA-r16                   OPTIONAL,
+    nonCriticalExtension            SEQUENCE {}                                         OPTIONAL
+}
+
+ServCellInfoListSCG-NR-r16 ::=      SEQUENCE (SIZE (1.. maxNrofServingCells)) OF  ServCellInfoXCG-NR-r16
+
+ServCellInfoXCG-NR-r16 ::=          SEQUENCE {
+    dl-FreqInfo-NR-r16                  FrequencyConfig-NR-r16                          OPTIONAL,
+    ul-FreqInfo-NR-r16                  FrequencyConfig-NR-r16                          OPTIONAL, -- Cond FDD
+    ...
+}
+
+FrequencyConfig-NR-r16 ::=          SEQUENCE {
+    freqBandIndicatorNR-r16             FreqBandIndicatorNR,
+    carrierCenterFreq-NR-r16            ARFCN-ValueNR,
+    carrierBandwidth-NR-r16             INTEGER (1..maxNrofPhysicalResourceBlocks),
+    subcarrierSpacing-NR-r16            SubcarrierSpacing
+}
+
+ServCellInfoListSCG-EUTRA-r16 ::=   SEQUENCE (SIZE (1.. maxNrofServingCellsEUTRA)) OF ServCellInfoXCG-EUTRA-r16
+
+ServCellInfoXCG-EUTRA-r16 ::=       SEQUENCE {
+    dl-CarrierFreq-EUTRA-r16            ARFCN-ValueEUTRA                                OPTIONAL,
+    ul-CarrierFreq-EUTRA-r16            ARFCN-ValueEUTRA                                OPTIONAL, -- Cond FDD
+    transmissionBandwidth-EUTRA-r16     TransmissionBandwidth-EUTRA-r16                 OPTIONAL,
+    ...
+}
+
+TransmissionBandwidth-EUTRA-r16 ::= ENUMERATED {rb6, rb15, rb25, rb50, rb75, rb100}
+
+PH-TypeListSCG ::=                  SEQUENCE (SIZE (1..maxNrofServingCells)) OF PH-InfoSCG
+
+PH-InfoSCG ::=                      SEQUENCE {
+    servCellIndex                       ServCellIndex,
+    ph-Uplink                           PH-UplinkCarrierSCG,
+    ph-SupplementaryUplink              PH-UplinkCarrierSCG                             OPTIONAL,
+    ...
+}
+
+PH-UplinkCarrierSCG ::=             SEQUENCE{
+    ph-Type1or3                         ENUMERATED {type1, type3},
+    ...
+}
+
+MeasConfigSN ::=                    SEQUENCE {
+    measuredFrequenciesSN               SEQUENCE (SIZE (1..maxMeasFreqsSN)) OF NR-FreqInfo  OPTIONAL,
+    ...
+}
+
+NR-FreqInfo ::=                     SEQUENCE {
+    measuredFrequency                   ARFCN-ValueNR                                       OPTIONAL,
+    ...
+}
+
+ConfigRestrictModReqSCG ::=         SEQUENCE {
+    requestedBC-MRDC                    BandCombinationInfoSN                               OPTIONAL,
+    requestedP-MaxFR1                   P-Max                                               OPTIONAL,
+    ...,
+    [[
+    requestedPDCCH-BlindDetectionSCG    INTEGER (1..15)                                     OPTIONAL,
+    requestedP-MaxEUTRA                 P-Max                                               OPTIONAL
+    ]],
+    [[
+    requestedP-MaxFR2-r16               P-Max                                               OPTIONAL,
+    requestedMaxInterFreqMeasIdSCG-r16  INTEGER(1..maxMeasIdentitiesMN)                     OPTIONAL,
+    requestedMaxIntraFreqMeasIdSCG-r16  INTEGER(1..maxMeasIdentitiesMN)                     OPTIONAL,
+    requestedToffset-r16                T-Offset-r16                                        OPTIONAL
+    ]]
+}
+
+BandCombinationIndex ::= INTEGER (1..maxBandComb)
+
+BandCombinationInfoSN ::=           SEQUENCE {
+    bandCombinationIndex                BandCombinationIndex,
+    requestedFeatureSets                FeatureSetEntryIndex
+}
+
+FR-InfoList ::= SEQUENCE (SIZE (1..maxNrofServingCells-1)) OF FR-Info
+
+FR-Info ::= SEQUENCE {
+    servCellIndex       ServCellIndex,
+    fr-Type             ENUMERATED {fr1, fr2}
+}
+
+CandidateServingFreqListNR ::= SEQUENCE (SIZE (1.. maxFreqIDC-MRDC)) OF ARFCN-ValueNR
+
+CandidateServingFreqListEUTRA ::= SEQUENCE (SIZE (1.. maxFreqIDC-MRDC)) OF ARFCN-ValueEUTRA
+
+T-Offset-r16 ::= ENUMERATED {ms0dot5, ms0dot75, ms1, ms1dot5, ms2, ms2dot5, ms3, spare1}
+
+-- TAG-CG-CONFIG-STOP
+-- TAG-CG-CONFIG-INFO-START
+
+CG-ConfigInfo ::=               SEQUENCE {
+    criticalExtensions              CHOICE {
+        c1                              CHOICE{
+            cg-ConfigInfo               CG-ConfigInfo-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture        SEQUENCE {}
+    }
+}
+
+CG-ConfigInfo-IEs ::=           SEQUENCE {
+    ue-CapabilityInfo               OCTET STRING (CONTAINING UE-CapabilityRAT-ContainerList)          OPTIONAL,-- Cond SN-AddMod
+    candidateCellInfoListMN         MeasResultList2NR                                                 OPTIONAL,
+    candidateCellInfoListSN         OCTET STRING (CONTAINING MeasResultList2NR)                       OPTIONAL,
+    measResultCellListSFTD-NR       MeasResultCellListSFTD-NR                                         OPTIONAL,
+    scgFailureInfo                  SEQUENCE {
+        failureType                     ENUMERATED { t310-Expiry, randomAccessProblem,
+                                                     rlc-MaxNumRetx, synchReconfigFailure-SCG,
+                                                     scg-reconfigFailure,
+                                                     srb3-IntegrityFailure},
+        measResultSCG                   OCTET STRING (CONTAINING MeasResultSCG-Failure)
+    }                                                                                                 OPTIONAL,
+    configRestrictInfo              ConfigRestrictInfoSCG                                             OPTIONAL,
+    drx-InfoMCG                     DRX-Info                                                          OPTIONAL,
+    measConfigMN                    MeasConfigMN                                                      OPTIONAL,
+    sourceConfigSCG                 OCTET STRING (CONTAINING RRCReconfiguration)                      OPTIONAL,
+    scg-RB-Config                   OCTET STRING (CONTAINING RadioBearerConfig)                       OPTIONAL,
+    mcg-RB-Config                   OCTET STRING (CONTAINING RadioBearerConfig)                       OPTIONAL,
+    mrdc-AssistanceInfo             MRDC-AssistanceInfo                                               OPTIONAL,
+    nonCriticalExtension            CG-ConfigInfo-v1540-IEs                                           OPTIONAL
+}
+
+CG-ConfigInfo-v1540-IEs ::=     SEQUENCE {
+    ph-InfoMCG                      PH-TypeListMCG                                                    OPTIONAL,
+    measResultReportCGI             SEQUENCE {
+        ssbFrequency                    ARFCN-ValueNR,
+        cellForWhichToReportCGI         PhysCellId,
+        cgi-Info                        CGI-InfoNR
+    }                                                                                                 OPTIONAL,
+    nonCriticalExtension            CG-ConfigInfo-v1560-IEs                                           OPTIONAL
+}
+
+CG-ConfigInfo-v1560-IEs ::=	 SEQUENCE {
+    candidateCellInfoListMN-EUTRA       OCTET STRING                                                  OPTIONAL,
+    candidateCellInfoListSN-EUTRA       OCTET STRING                                                  OPTIONAL,
+    sourceConfigSCG-EUTRA               OCTET STRING                                                  OPTIONAL,
+    scgFailureInfoEUTRA                 SEQUENCE {
+        failureTypeEUTRA                    ENUMERATED { t313-Expiry, randomAccessProblem,
+                                                    rlc-MaxNumRetx, scg-ChangeFailure},
+        measResultSCG-EUTRA                 OCTET STRING
+    }                                                                                                 OPTIONAL,
+    drx-ConfigMCG                       DRX-Config                                                    OPTIONAL,
+    measResultReportCGI-EUTRA               SEQUENCE {
+        eutraFrequency                      ARFCN-ValueEUTRA,
+        cellForWhichToReportCGI-EUTRA           EUTRA-PhysCellId,
+        cgi-InfoEUTRA                           CGI-InfoEUTRA
+    }                                                                                                 OPTIONAL,
+    measResultCellListSFTD-EUTRA        MeasResultCellListSFTD-EUTRA                                  OPTIONAL,
+    fr-InfoListMCG                      FR-InfoList                                                   OPTIONAL,
+    nonCriticalExtension                CG-ConfigInfo-v1570-IEs                                       OPTIONAL
+}
+
+CG-ConfigInfo-v1570-IEs ::=  SEQUENCE {
+    sftdFrequencyList-NR                SFTD-FrequencyList-NR                                         OPTIONAL,
+    sftdFrequencyList-EUTRA             SFTD-FrequencyList-EUTRA                                      OPTIONAL,
+    nonCriticalExtension                CG-ConfigInfo-v1590-IEs                                       OPTIONAL
+}
+
+CG-ConfigInfo-v1590-IEs ::=  SEQUENCE {
+    servFrequenciesMN-NR            SEQUENCE (SIZE (1.. maxNrofServingCells-1)) OF  ARFCN-ValueNR     OPTIONAL,
+    nonCriticalExtension            CG-ConfigInfo-v1610-IEs                                           OPTIONAL
+}
+
+CG-ConfigInfo-v1610-IEs ::=  SEQUENCE {
+    drx-InfoMCG2                 DRX-Info2                                                            OPTIONAL,
+    alignedDRX-Indication        ENUMERATED {true}                                                    OPTIONAL,
+    scgFailureInfo-r16                  SEQUENCE {
+        failureType-r16                     ENUMERATED { scg-lbtFailure-r16, beamFailureRecoveryFailure-r16,
+                                                         t312-Expiry-r16, bh-RLF-r16,
+                                                         spare4, spare3, spare2, spare1},
+        measResultSCG-r16                   OCTET STRING (CONTAINING MeasResultSCG-Failure)
+    }                                                                                                 OPTIONAL,
+    scgFailureInfoEUTRA-r16                 SEQUENCE {
+        failureTypeEUTRA-r16                    ENUMERATED { scg-lbtFailure-r16, beamFailureRecoveryFailure-r16,
+                                                         t312-Expiry-r16, spare5,
+                                                                     spare4, spare3, spare2, spare1},
+        measResultSCG-EUTRA-r16                 OCTET STRING
+    }                                                                                                 OPTIONAL,
+    sidelinkUEInformationNR-r16      OCTET STRING (CONTAINING SidelinkUEInformationNR-r16)            OPTIONAL,
+    sidelinkUEInformationEUTRA-r16   OCTET STRING                                                     OPTIONAL,
+    nonCriticalExtension             CG-ConfigInfo-v1620-IEs                                          OPTIONAL
+}
+
+CG-ConfigInfo-v1620-IEs ::=             SEQUENCE {
+    ueAssistanceInformationSourceSCG-r16    OCTET STRING (CONTAINING UEAssistanceInformation)         OPTIONAL,
+    nonCriticalExtension                    CG-ConfigInfo-v1640-IEs                                   OPTIONAL
+}
+
+CG-ConfigInfo-v1640-IEs ::=             SEQUENCE {
+	servCellInfoListMCG-NR-r16              ServCellInfoListMCG-NR-r16                   OPTIONAL,
+	servCellInfoListMCG-EUTRA-r16           ServCellInfoListMCG-EUTRA-r16                OPTIONAL,
+	nonCriticalExtension                    SEQUENCE {}                                  OPTIONAL
+}
+
+ServCellInfoListMCG-NR-r16 ::=          SEQUENCE (SIZE (1.. maxNrofServingCells)) OF  ServCellInfoXCG-NR-r16
+
+ServCellInfoListMCG-EUTRA-r16 ::=       SEQUENCE (SIZE (1.. maxNrofServingCellsEUTRA)) OF ServCellInfoXCG-EUTRA-r16
+
+SFTD-FrequencyList-NR ::=               SEQUENCE (SIZE (1..maxCellSFTD)) OF ARFCN-ValueNR
+
+SFTD-FrequencyList-EUTRA ::=            SEQUENCE (SIZE (1..maxCellSFTD)) OF ARFCN-ValueEUTRA
+
+ConfigRestrictInfoSCG ::=       SEQUENCE {
+    allowedBC-ListMRDC              BandCombinationInfoList                                           OPTIONAL,
+    powerCoordination-FR1               SEQUENCE {
+        p-maxNR-FR1                     P-Max                                                         OPTIONAL,
+        p-maxEUTRA                      P-Max                                                         OPTIONAL,
+        p-maxUE-FR1                     P-Max                                                         OPTIONAL
+    }                                                                                                 OPTIONAL,
+    servCellIndexRangeSCG           SEQUENCE {
+        lowBound                        ServCellIndex,
+        upBound                         ServCellIndex
+    }                                                                                                 OPTIONAL,   -- Cond SN-AddMod
+    maxMeasFreqsSCG                     INTEGER(1..maxMeasFreqsMN)                                    OPTIONAL,
+    dummy                               INTEGER(1..maxMeasIdentitiesMN)                               OPTIONAL,
+    ...,
+    [[
+    selectedBandEntriesMNList        SEQUENCE (SIZE (1..maxBandComb)) OF SelectedBandEntriesMN        OPTIONAL,
+    pdcch-BlindDetectionSCG          INTEGER (1..15)                                                  OPTIONAL,
+    maxNumberROHC-ContextSessionsSN  INTEGER(0.. 16384)                                               OPTIONAL
+    ]],
+    [[
+    maxIntraFreqMeasIdentitiesSCG     INTEGER(1..maxMeasIdentitiesMN)                                 OPTIONAL,
+    maxInterFreqMeasIdentitiesSCG     INTEGER(1..maxMeasIdentitiesMN)                                 OPTIONAL
+    ]],
+    [[
+    p-maxNR-FR1-MCG-r16               P-Max                                                           OPTIONAL,
+    powerCoordination-FR2-r16         SEQUENCE {
+        p-maxNR-FR2-MCG-r16                P-Max                                                      OPTIONAL,
+        p-maxNR-FR2-SCG-r16                P-Max                                                      OPTIONAL,
+        p-maxUE-FR2-r16                    P-Max                                                      OPTIONAL
+    }                                                                                                 OPTIONAL,
+    nrdc-PC-mode-FR1-r16    ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic}                OPTIONAL,
+    nrdc-PC-mode-FR2-r16    ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic}                OPTIONAL,
+    maxMeasSRS-ResourceSCG-r16       INTEGER(0..maxNrofCLI-SRS-Resources-r16)                         OPTIONAL,
+    maxMeasCLI-ResourceSCG-r16       INTEGER(0..maxNrofCLI-RSSI-Resources-r16)                        OPTIONAL,
+    maxNumberEHC-ContextsSN-r16      INTEGER(0..65536)                                                OPTIONAL,
+    allowedReducedConfigForOverheating-r16      OverheatingAssistance                                 OPTIONAL,
+    maxToffset-r16                   T-Offset-r16                                                     OPTIONAL
+    ]]
+}
+
+SelectedBandEntriesMN ::=       SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandEntryIndex
+
+BandEntryIndex ::=              INTEGER (0.. maxNrofServingCells)
+
+PH-TypeListMCG ::=              SEQUENCE (SIZE (1..maxNrofServingCells)) OF PH-InfoMCG
+
+PH-InfoMCG ::=                  SEQUENCE {
+    servCellIndex                       ServCellIndex,
+    ph-Uplink                           PH-UplinkCarrierMCG,
+    ph-SupplementaryUplink              PH-UplinkCarrierMCG                                           OPTIONAL,
+    ...
+}
+
+PH-UplinkCarrierMCG ::=         SEQUENCE{
+    ph-Type1or3                         ENUMERATED {type1, type3},
+    ...
+}
+
+BandCombinationInfoList ::=     SEQUENCE (SIZE (1..maxBandComb)) OF BandCombinationInfo
+
+BandCombinationInfo ::=         SEQUENCE {
+    bandCombinationIndex            BandCombinationIndex,
+    allowedFeatureSetsList          SEQUENCE (SIZE (1..maxFeatureSetsPerBand)) OF FeatureSetEntryIndex
+}
+
+FeatureSetEntryIndex ::=        INTEGER (1.. maxFeatureSetsPerBand)
+
+DRX-Info ::=                    SEQUENCE {
+    drx-LongCycleStartOffset        CHOICE {
+        ms10                            INTEGER(0..9),
+        ms20                            INTEGER(0..19),
+        ms32                            INTEGER(0..31),
+        ms40                            INTEGER(0..39),
+        ms60                            INTEGER(0..59),
+        ms64                            INTEGER(0..63),
+        ms70                            INTEGER(0..69),
+        ms80                            INTEGER(0..79),
+        ms128                           INTEGER(0..127),
+        ms160                           INTEGER(0..159),
+        ms256                           INTEGER(0..255),
+        ms320                           INTEGER(0..319),
+        ms512                           INTEGER(0..511),
+        ms640                           INTEGER(0..639),
+        ms1024                          INTEGER(0..1023),
+        ms1280                          INTEGER(0..1279),
+        ms2048                          INTEGER(0..2047),
+        ms2560                          INTEGER(0..2559),
+        ms5120                          INTEGER(0..5119),
+        ms10240                         INTEGER(0..10239)
+    },
+    shortDRX                            SEQUENCE {
+        drx-ShortCycle                      ENUMERATED  {
+                                                ms2, ms3, ms4, ms5, ms6, ms7, ms8, ms10, ms14, ms16, ms20, ms30, ms32,
+                                                ms35, ms40, ms64, ms80, ms128, ms160, ms256, ms320, ms512, ms640, spare9,
+                                                spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 },
+        drx-ShortCycleTimer                 INTEGER (1..16)
+    }                                                                                             OPTIONAL
+}
+
+DRX-Info2 ::=          SEQUENCE {
+    drx-onDurationTimer    CHOICE {
+                               subMilliSeconds INTEGER (1..31),
+                               milliSeconds    ENUMERATED {
+                                   ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60,
+                                   ms80, ms100, ms200, ms300, ms400, ms500, ms600, ms800, ms1000, ms1200,
+                                   ms1600, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+                           }
+}
+
+MeasConfigMN ::= SEQUENCE {
+    measuredFrequenciesMN               SEQUENCE (SIZE (1..maxMeasFreqsMN)) OF NR-FreqInfo        OPTIONAL,
+    measGapConfig                       SetupRelease { GapConfig }                                OPTIONAL,
+    gapPurpose                          ENUMERATED {perUE, perFR1}                                OPTIONAL,
+    ...,
+    [[
+    measGapConfigFR2                    SetupRelease { GapConfig }                                OPTIONAL
+    ]]
+
+}
+
+MRDC-AssistanceInfo ::= SEQUENCE {
+    affectedCarrierFreqCombInfoListMRDC     SEQUENCE (SIZE (1..maxNrofCombIDC)) OF AffectedCarrierFreqCombInfoMRDC,
+    ...,
+    [[
+    overheatingAssistanceSCG-r16            OCTET STRING (CONTAINING OverheatingAssistance)       OPTIONAL
+    ]]
+}
+
+AffectedCarrierFreqCombInfoMRDC ::= SEQUENCE {
+    victimSystemType                    VictimSystemType,
+    interferenceDirectionMRDC           ENUMERATED {eutra-nr, nr, other, utra-nr-other, nr-other, spare3, spare2, spare1},
+    affectedCarrierFreqCombMRDC         SEQUENCE    {
+        affectedCarrierFreqCombEUTRA        AffectedCarrierFreqCombEUTRA                          OPTIONAL,
+        affectedCarrierFreqCombNR           AffectedCarrierFreqCombNR
+    }                                                                                             OPTIONAL
+}
+
+VictimSystemType ::= SEQUENCE {
+    gps                         ENUMERATED {true}               OPTIONAL,
+    glonass                     ENUMERATED {true}               OPTIONAL,
+    bds                         ENUMERATED {true}               OPTIONAL,
+    galileo                     ENUMERATED {true}               OPTIONAL,
+    wlan                        ENUMERATED {true}               OPTIONAL,
+    bluetooth                   ENUMERATED {true}               OPTIONAL
+}
+
+AffectedCarrierFreqCombEUTRA ::= SEQUENCE (SIZE (1..maxNrofServingCellsEUTRA)) OF ARFCN-ValueEUTRA
+
+AffectedCarrierFreqCombNR ::= SEQUENCE (SIZE (1..maxNrofServingCells)) OF ARFCN-ValueNR
+
+-- TAG-CG-CONFIG-INFO-STOP
+-- TAG-MEASUREMENT-TIMING-CONFIGURATION-START
+
+MeasurementTimingConfiguration ::=      SEQUENCE {
+    criticalExtensions                      CHOICE {
+        c1                                      CHOICE{
+            measTimingConf                          MeasurementTimingConfiguration-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture        SEQUENCE {}
+    }
+}
+
+MeasurementTimingConfiguration-IEs ::=  SEQUENCE {
+    measTiming                              MeasTimingList                                      OPTIONAL,
+    nonCriticalExtension                    MeasurementTimingConfiguration-v1550-IEs            OPTIONAL
+}
+
+MeasurementTimingConfiguration-v1550-IEs ::= SEQUENCE {
+    campOnFirstSSB                               BOOLEAN,
+    psCellOnlyOnFirstSSB                         BOOLEAN,
+    nonCriticalExtension                         MeasurementTimingConfiguration-v1610-IEs       OPTIONAL
+}
+
+MeasurementTimingConfiguration-v1610-IEs ::=  SEQUENCE {
+    csi-RS-Config-r16                             SEQUENCE {
+        csi-RS-SubcarrierSpacing-r16                  SubcarrierSpacing,
+        csi-RS-CellMobility-r16                       CSI-RS-CellMobility,
+        refSSBFreq-r16                                ARFCN-ValueNR
+    },
+    nonCriticalExtension                          SEQUENCE {}                                   OPTIONAL
+}
+
+MeasTimingList ::= SEQUENCE (SIZE (1..maxMeasFreqsMN)) OF MeasTiming
+
+MeasTiming ::= SEQUENCE {
+    frequencyAndTiming                      SEQUENCE {
+        carrierFreq                             ARFCN-ValueNR,
+        ssbSubcarrierSpacing                    SubcarrierSpacing,
+        ssb-MeasurementTimingConfiguration      SSB-MTC,
+        ss-RSSI-Measurement                     SS-RSSI-Measurement                             OPTIONAL
+    }                                                                                           OPTIONAL,
+    ...,
+    [[
+    ssb-ToMeasure                           SSB-ToMeasure                                       OPTIONAL,
+    physCellId                              PhysCellId                                          OPTIONAL
+    ]]
+}
+
+-- TAG-MEASUREMENT-TIMING-CONFIGURATION-STOP
+-- TAG-UE-RADIO-PAGING-INFORMATION-START
+
+UERadioPagingInformation ::= SEQUENCE {
+    criticalExtensions                  CHOICE {
+        c1                                  CHOICE{
+            ueRadioPagingInformation            UERadioPagingInformation-IEs,
+            spare7 NULL,
+            spare6 NULL, spare5 NULL, spare4 NULL,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+UERadioPagingInformation-IEs ::=    SEQUENCE {
+    supportedBandListNRForPaging        SEQUENCE (SIZE (1..maxBands)) OF FreqBandIndicatorNR    OPTIONAL,
+    nonCriticalExtension                SEQUENCE {}                                             OPTIONAL
+}
+
+
+-- TAG-UE-RADIO-PAGING-INFORMATION-STOP
+-- TAG-UE-RADIO-ACCESS-CAPABILITY-INFORMATION-START
+
+UERadioAccessCapabilityInformation ::= SEQUENCE {
+    criticalExtensions                  CHOICE {
+        c1                                  CHOICE{
+            ueRadioAccessCapabilityInformation    UERadioAccessCapabilityInformation-IEs,
+            spare7 NULL,
+            spare6 NULL, spare5 NULL, spare4 NULL,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+UERadioAccessCapabilityInformation-IEs ::= SEQUENCE {
+    ue-RadioAccessCapabilityInfo               OCTET STRING (CONTAINING UE-CapabilityRAT-ContainerList),
+    nonCriticalExtension                       SEQUENCE {}                                                   OPTIONAL
+}
+
+-- TAG-UE-RADIO-ACCESS-CAPABILITY-INFORMATION-STOP
+-- TAG-NR-MULTIPLICITY-AND-CONSTRAINTS-START
+
+maxMeasFreqsMN              INTEGER ::= 32  -- Maximum number of MN-configured measurement frequencies
+maxMeasFreqsSN              INTEGER ::= 32  -- Maximum number of SN-configured measurement frequencies
+maxMeasIdentitiesMN         INTEGER ::= 62  -- Maximum number of measurement identities that a UE can be configured with
+maxCellPrep                 INTEGER ::= 32  -- Maximum number of cells prepared for handover
+
+-- TAG-NR-MULTIPLICITY-AND-CONSTRAINTS-STOP
+-- TAG-NR-INTER-NODE-DEFINITIONS-END-START
+
+END
+
+-- TAG-NR-INTER-NODE-DEFINITIONS-END-STOP													
diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h
index 5fd9b5d638076623cc2b3c93737094a0724fbd90..c8b412df1f3d94e9f57022789bc60e16c4551fd7 100644
--- a/openair2/RRC/NR/nr_rrc_defs.h
+++ b/openair2/RRC/NR/nr_rrc_defs.h
@@ -443,11 +443,13 @@ typedef struct {
   NR_SIB2_t                                *sib2;
   NR_SIB3_t                                *sib3;
   NR_BCCH_DL_SCH_Message_t                  systemInformation; // SIB23
-  int ssb_SubcarrierOffset;                  
+  int ssb_SubcarrierOffset;
+  int sib1_tda;
   int pdsch_AntennaPorts;
   int pusch_AntennaPorts;
   int pusch_TargetSNRx10;
   int pucch_TargetSNRx10;
+  int do_CSIRS;
   NR_BCCH_DL_SCH_Message_t                  *siblock1;
   NR_ServingCellConfigCommon_t              *servingcellconfigcommon;
   NR_PDCCH_ConfigSIB1_t                     *pdcch_ConfigSIB1;
diff --git a/openair2/RRC/NR/nr_rrc_extern.h b/openair2/RRC/NR/nr_rrc_extern.h
index 04e0392236bf5ada098861923a84bf3a2da13b4a..3b08a240279d55d0420e882e111c2cf0b3e67771 100644
--- a/openair2/RRC/NR/nr_rrc_extern.h
+++ b/openair2/RRC/NR/nr_rrc_extern.h
@@ -47,7 +47,6 @@ extern NR_LogicalChannelConfig_t NR_SRB3_logicalChannelConfig_defaultValue;
 extern unsigned char NB_INST;
 extern unsigned char NB_eNB_INST;
 extern uint16_t NB_UE_INST;
-extern unsigned short NODE_ID[1];
 extern void* bigphys_malloc(int);
 
 
diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h
index 20656deff4ca246a049bedb8ef2512592cd770c6..9465b9b4b066f05be0c1431bb1a81d85c4dde931 100644
--- a/openair2/RRC/NR/nr_rrc_proto.h
+++ b/openair2/RRC/NR/nr_rrc_proto.h
@@ -73,26 +73,24 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
 
 void rrc_remove_nsa_user(gNB_RRC_INST *rrc, int rnti);
 
-void fill_default_initialDownlinkBWP(NR_BWP_Downlink_t *bwp, NR_ServingCellConfigCommon_t *servingcellconfigcommon);
-
-void fill_default_coresetZero(NR_ControlResourceSet_t *coreset0, NR_ServingCellConfigCommon_t *servingcellconfigcommon);
-
-void fill_default_searchSpaceZero(NR_SearchSpace_t *ss0);
-
 void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
                                      NR_ServingCellConfig_t *servingcellconfigdedicated,
                                      NR_CellGroupConfig_t *secondaryCellGroup,
                                      int scg_id,
                                      int servCellIndex,
-                                     int n_physical_antenna_ports,
+                                     int dl_antenna_ports,
+                                     int do_csirs,
                                      int initial_csi_index,
                                      int uid);
 
+void config_csirs(NR_ServingCellConfigCommon_t *servingcellconfigcommon, NR_CSI_MeasConfig_t *csi_MeasConfig, int dl_antenna_ports, int do_csirs);
+
 void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
                            NR_ServingCellConfig_t *servingcellconfigdedicated,
                            NR_RRCReconfiguration_IEs_t *reconfig,
                            NR_CellGroupConfig_t *secondaryCellGroup,
-                           int n_physical_antenna_ports,
+                           int dl_antenna_ports,
+                           int do_csirs,
                            int initial_csi_index,
                            int uid);
 
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index 6ef8149bb103a2ac88d19ee166b4738b52238cd5..810e83fc43b183d403829852a493deabc2cd5c1a 100755
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -238,6 +238,7 @@ static void init_NR_SI(gNB_RRC_INST *rrc, gNB_RrcConfigurationReq *configuration
 			   rrc->carrier.ssb_SubcarrierOffset,
 			   rrc->carrier.pdsch_AntennaPorts,
 			   rrc->carrier.pusch_AntennaPorts,
+                           rrc->carrier.sib1_tda,
 			   (NR_ServingCellConfigCommon_t *)rrc->carrier.servingcellconfigcommon,
 			   0,
 			   0, // WIP hardcoded rnti
@@ -330,6 +331,8 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
   rrc->carrier.ssb_SubcarrierOffset = configuration->ssb_SubcarrierOffset;
   rrc->carrier.pdsch_AntennaPorts = configuration->pdsch_AntennaPorts;
   rrc->carrier.pusch_AntennaPorts = configuration->pusch_AntennaPorts;
+  rrc->carrier.sib1_tda = configuration->sib1_tda;
+  rrc->carrier.do_CSIRS = configuration->do_CSIRS;
    /// System Information INIT
   pthread_mutex_init(&rrc->cell_info_mutex,NULL);
   rrc->cell_info_configured = 0;
@@ -383,13 +386,14 @@ void apply_macrlc_config(gNB_RRC_INST *rrc,
                          const protocol_ctxt_t        *const ctxt_pP ) {
 
       rrc_mac_config_req_gNB(rrc->module_id,
-                             rrc->carrier.ssb_SubcarrierOffset,
-                             rrc->carrier.pdsch_AntennaPorts,
-                             rrc->carrier.pusch_AntennaPorts,
-                             NULL,
-                             0,
-                             ue_context_pP->ue_context.rnti,
-                             get_softmodem_params()->sa ? ue_context_pP->ue_context.masterCellGroup : (NR_CellGroupConfig_t *)NULL);
+			     rrc->carrier.ssb_SubcarrierOffset,
+			     rrc->carrier.pdsch_AntennaPorts,
+			     rrc->carrier.pusch_AntennaPorts,
+			     rrc->carrier.sib1_tda,
+			     NULL,
+			     0,
+			     ue_context_pP->ue_context.rnti,
+			     get_softmodem_params()->sa ? ue_context_pP->ue_context.masterCellGroup : (NR_CellGroupConfig_t *)NULL);
 
       nr_rrc_rlc_config_asn1_req(ctxt_pP,
                                  ue_context_pP->ue_context.SRB_configList,
@@ -527,6 +531,7 @@ rrc_gNB_generate_RRCSetup(
       //   ue_context_pP->ue_context.ue_rrc_inactivity_timer = 0;
 
       // configure MAC
+
       apply_macrlc_config(rrc,ue_context_pP,ctxt_pP);
 
       apply_pdcp_config(ue_context_pP,ctxt_pP);
@@ -575,6 +580,7 @@ rrc_gNB_generate_RRCSetup_for_RRCReestablishmentRequest(
                          rrc_instance_p->carrier.ssb_SubcarrierOffset,
                          rrc_instance_p->carrier.pdsch_AntennaPorts,
                          rrc_instance_p->carrier.pusch_AntennaPorts,
+                         rrc_instance_p->carrier.sib1_tda,
                          (NR_ServingCellConfigCommon_t *)rrc_instance_p->carrier.servingcellconfigcommon,
                          0,
                          ue_context_pP->ue_context.rnti,
@@ -1317,11 +1323,13 @@ rrc_gNB_process_RRCReconfigurationComplete(
                               NULL,
                               get_softmodem_params()->sa ? ue_context_pP->ue_context.masterCellGroup->rlc_BearerToAddModList : NULL);
   /* Refresh SRBs/DRBs */
+
   if (!NODE_IS_CU(RC.nrrrc[ctxt_pP->module_id]->node_type)) {
     rrc_mac_config_req_gNB(rrc->module_id,
                            rrc->carrier.ssb_SubcarrierOffset,
                            rrc->carrier.pdsch_AntennaPorts,
                            rrc->carrier.pusch_AntennaPorts,
+                           rrc->carrier.sib1_tda,
                            NULL,
                            0,
                            ue_context_pP->ue_context.rnti,
@@ -1643,6 +1651,7 @@ rrc_gNB_process_RRCConnectionReestablishmentComplete(
     for ( j = 0, i = 0; i < NB_RB_MAX; i++) {
       if (ue_context_pP->ue_context.pduSession[i].status == PDU_SESSION_STATUS_ESTABLISHED || ue_context_pP->ue_context.pduSession[i].status == PDU_SESSION_STATUS_DONE) {
         create_tunnel_req.pdusession_id[j]   = ue_context_pP->ue_context.pduSession[i].param.pdusession_id;
+        create_tunnel_req.incoming_rb_id[j]  = i+1;
         create_tunnel_req.upf_NGu_teid[j]  = ue_context_pP->ue_context.pduSession[i].param.gtp_teid;
         memcpy(create_tunnel_req.upf_addr[j].buffer,
                ue_context_pP->ue_context.pduSession[i].param.upf_addr.buffer,
diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c
index b7f9d2c671f9653de39bf1c4dd4a6ce5a12d0021..30c3f2f9962bf60b797a4e1fbec0392e56a79d0b 100644
--- a/openair2/RRC/NR/rrc_gNB_NGAP.c
+++ b/openair2/RRC/NR/rrc_gNB_NGAP.c
@@ -542,6 +542,7 @@ rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(
           ue_context_p->ue_context.pduSession[i].status        = PDU_SESSION_STATUS_NEW;
           ue_context_p->ue_context.pduSession[i].param         = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done];
           create_tunnel_req.pdusession_id[pdu_sessions_done]   = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done].pdusession_id;
+          create_tunnel_req.incoming_rb_id[pdu_sessions_done]  = i+1;
           create_tunnel_req.upf_NGu_teid[pdu_sessions_done]    = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done].gtp_teid;
           create_tunnel_req.upf_addr[pdu_sessions_done].length = NGAP_INITIAL_CONTEXT_SETUP_REQ (msg_p).pdusession_param[pdu_sessions_done].upf_addr.length;
           memcpy(create_tunnel_req.upf_addr[pdu_sessions_done].buffer,
@@ -1064,6 +1065,7 @@ rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(
       ue_context_p->ue_context.pduSession[i].status      = PDU_SESSION_STATUS_NEW;
       ue_context_p->ue_context.pduSession[i].param       = NGAP_PDUSESSION_SETUP_REQ(msg_p).pdusession_setup_params[pdu_sessions_done];
       create_tunnel_req.pdusession_id[pdu_sessions_done] = NGAP_PDUSESSION_SETUP_REQ(msg_p).pdusession_setup_params[pdu_sessions_done].pdusession_id;
+      create_tunnel_req.incoming_rb_id[pdu_sessions_done]= i+1;
       create_tunnel_req.upf_NGu_teid[pdu_sessions_done]  = NGAP_PDUSESSION_SETUP_REQ(msg_p).pdusession_setup_params[pdu_sessions_done].gtp_teid;
       memcpy(create_tunnel_req.upf_addr[pdu_sessions_done].buffer,
               NGAP_PDUSESSION_SETUP_REQ(msg_p).pdusession_setup_params[pdu_sessions_done].upf_addr.buffer,
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index f8cc951bc30b257c9911d2b3d47979ca711a292a..167f85ba48266db822fac9dd156b8c0f08ec06bd 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -245,6 +245,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
                         reconfig_ies,
                         ue_context_p->ue_context.secondaryCellGroup,
                         carrier->pdsch_AntennaPorts,
+                        carrier->do_CSIRS,
                         carrier->initial_csi_index[ue_context_p->local_uid + 1],
                         ue_context_p->local_uid);
   } else {
@@ -253,6 +254,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
                         reconfig_ies,
                         ue_context_p->ue_context.secondaryCellGroup,
                         carrier->pdsch_AntennaPorts,
+                        carrier->do_CSIRS,
                         carrier->initial_csi_index[ue_context_p->local_uid + 1],
                         ue_context_p->local_uid);
   }
@@ -350,7 +352,8 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
     rrc_mac_config_req_gNB(rrc->module_id,
                            rrc->carrier.ssb_SubcarrierOffset,
                            rrc->carrier.pdsch_AntennaPorts,
-			                     rrc->carrier.pusch_AntennaPorts,
+			   rrc->carrier.pusch_AntennaPorts,
+                           rrc->carrier.sib1_tda,
                            rrc->carrier.servingcellconfigcommon,
                            1, // add_ue flag
                            ue_context_p->ue_id_rnti,
@@ -360,6 +363,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
                            rrc->carrier.ssb_SubcarrierOffset,
                            rrc->carrier.pdsch_AntennaPorts,
                            rrc->carrier.pusch_AntennaPorts,
+                           rrc->carrier.sib1_tda,
                            NULL,
                            1, // add_ue flag
                            ue_context_p->ue_id_rnti,
diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c
index e983627b56c034cbf2ecb1ff373c0f1756f5402a..980bd39c379e7eab06f769f561b1158d68b31c7e 100644
--- a/openair2/RRC/NR/rrc_gNB_reconfig.c
+++ b/openair2/RRC/NR/rrc_gNB_reconfig.c
@@ -49,93 +49,13 @@
 #define false 0
 #define true 1
 
-void fill_default_initialDownlinkBWP(NR_BWP_Downlink_t *bwp, NR_ServingCellConfigCommon_t *servingcellconfigcommon) {
-  bwp->bwp_Id = 0;
-  bwp->bwp_Common=calloc(1,sizeof(*bwp->bwp_Common));
-  *bwp->bwp_Common = *servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP;
-}
-
-void fill_default_coresetZero(NR_ControlResourceSet_t *coreset0, NR_ServingCellConfigCommon_t *servingcellconfigcommon) {
-
-  coreset0->controlResourceSetId = 0;
-
-  // frequencyDomainResources '11111111 00000000 00000000 00000000 00000000 00000'B,
-  if(coreset0->frequencyDomainResources.buf == NULL) coreset0->frequencyDomainResources.buf = calloc(1,6);
-  int curr_bwp = NRRIV2BW(servingcellconfigcommon->downlinkConfigCommon->initialDownlinkBWP->genericParameters.locationAndBandwidth, 275);
-  if (curr_bwp < 48)
-    coreset0->frequencyDomainResources.buf[0] = 0xf0;
-  else
-    coreset0->frequencyDomainResources.buf[0] = 0xff;
-  if (curr_bwp < 96)
-    coreset0->frequencyDomainResources.buf[1] = 0;
-  else
-    coreset0->frequencyDomainResources.buf[1] = 0xff;
-  coreset0->frequencyDomainResources.buf[2] = 0;
-  coreset0->frequencyDomainResources.buf[3] = 0;
-  coreset0->frequencyDomainResources.buf[4] = 0;
-  coreset0->frequencyDomainResources.buf[5] = 0;
-  coreset0->frequencyDomainResources.size = 6;
-  coreset0->frequencyDomainResources.bits_unused = 3;
-  coreset0->duration = 1;
-  coreset0->cce_REG_MappingType.present=NR_ControlResourceSet__cce_REG_MappingType_PR_interleaved;
-  coreset0->cce_REG_MappingType.choice.interleaved=calloc(1,sizeof(*coreset0->cce_REG_MappingType.choice.interleaved));
-  coreset0->cce_REG_MappingType.choice.interleaved->reg_BundleSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__reg_BundleSize_n6;
-  coreset0->cce_REG_MappingType.choice.interleaved->interleaverSize = NR_ControlResourceSet__cce_REG_MappingType__interleaved__interleaverSize_n2;
-  coreset0->cce_REG_MappingType.choice.interleaved->shiftIndex = servingcellconfigcommon->physCellId;
-  coreset0->precoderGranularity = NR_ControlResourceSet__precoderGranularity_sameAsREG_bundle;
-
-  if(coreset0->tci_StatesPDCCH_ToAddList == NULL) coreset0->tci_StatesPDCCH_ToAddList = calloc(1,sizeof(*coreset0->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(&coreset0->tci_StatesPDCCH_ToAddList->list,tci[i]);
-  }
-  coreset0->tci_StatesPDCCH_ToReleaseList = NULL;
-  coreset0->tci_PresentInDCI = NULL;
-  coreset0->pdcch_DMRS_ScramblingID = NULL;
-
-}
-
-void fill_default_searchSpaceZero(NR_SearchSpace_t *ss0) {
-
-  if(ss0->controlResourceSetId == NULL) ss0->controlResourceSetId=calloc(1,sizeof(*ss0->controlResourceSetId));
-  if(ss0->monitoringSymbolsWithinSlot == NULL) ss0->monitoringSymbolsWithinSlot = calloc(1,sizeof(*ss0->monitoringSymbolsWithinSlot));
-  if(ss0->monitoringSymbolsWithinSlot->buf == NULL) ss0->monitoringSymbolsWithinSlot->buf = calloc(1,2);
-  if(ss0->nrofCandidates == NULL) ss0->nrofCandidates = calloc(1,sizeof(*ss0->nrofCandidates));
-  if(ss0->searchSpaceType == NULL) ss0->searchSpaceType = calloc(1,sizeof(*ss0->searchSpaceType));
-  if(ss0->searchSpaceType->choice.common == NULL) ss0->searchSpaceType->choice.common=calloc(1,sizeof(*ss0->searchSpaceType->choice.common));
-  if(ss0->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 == NULL) ss0->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0 = calloc(1,sizeof(*ss0->searchSpaceType->choice.common->dci_Format0_0_AndFormat1_0));
-
-  ss0->searchSpaceId = 0;
-  *ss0->controlResourceSetId = 0;
-  ss0->monitoringSlotPeriodicityAndOffset = calloc(1,sizeof(*ss0->monitoringSlotPeriodicityAndOffset));
-  ss0->monitoringSlotPeriodicityAndOffset->present = NR_SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
-  ss0->duration=NULL;
-
-  // should be '1100 0000 0000 00'B (LSB first!), first two symols in slot, adjust if needed
-  ss0->monitoringSymbolsWithinSlot->buf[1] = 0;
-  ss0->monitoringSymbolsWithinSlot->buf[0] = (1<<7);
-  ss0->monitoringSymbolsWithinSlot->size = 2;
-  ss0->monitoringSymbolsWithinSlot->bits_unused = 2;
-
-  // FIXME: update values from TS38.213 Section 10.1 Table 10.1-1: CCE aggregation levels and maximum number of PDCCH candidates per CCE aggregation level for CSS sets configured by searchSpaceSIB1
-  ss0->nrofCandidates->aggregationLevel1 = NR_SearchSpace__nrofCandidates__aggregationLevel1_n0;
-  ss0->nrofCandidates->aggregationLevel2 = NR_SearchSpace__nrofCandidates__aggregationLevel2_n0;
-  ss0->nrofCandidates->aggregationLevel4 = NR_SearchSpace__nrofCandidates__aggregationLevel4_n2;
-  ss0->nrofCandidates->aggregationLevel8 = NR_SearchSpace__nrofCandidates__aggregationLevel8_n0;
-  ss0->nrofCandidates->aggregationLevel16 = NR_SearchSpace__nrofCandidates__aggregationLevel16_n0;
-
-  ss0->searchSpaceType->present = NR_SearchSpace__searchSpaceType_PR_common;
-}
-
 void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
                                      NR_ServingCellConfig_t *servingcellconfigdedicated,
                                      NR_CellGroupConfig_t *secondaryCellGroup,
                                      int scg_id,
                                      int servCellIndex,
-                                     int n_physical_antenna_ports,
+                                     int dl_antenna_ports,
+                                     int do_csirs,
                                      int initial_csi_index,
                                      int uid) {
   AssertFatal(servingcellconfigcommon!=NULL,"servingcellconfigcommon is null\n");
@@ -541,9 +461,11 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
 
  ASN_SEQUENCE_ADD(&bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList->list,ss);
 
-
- bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1));
- *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=0;
+ bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=NULL;
+ if(get_softmodem_params()->sa) {
+   bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1));
+   *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceSIB1=0;
+ }
  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->searchSpaceOtherSystemInformation=NULL;
  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->pagingSearchSpace=NULL;
  bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace=calloc(1,sizeof(*bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace));
@@ -631,7 +553,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  }
  bwp->bwp_Dedicated->pdsch_Config->choice.setup->dataScramblingIdentityPDSCH = NULL;
 
- if (n_physical_antenna_ports > 1)// for MIMO, we use DMRS Config Type 2
+ if (dl_antenna_ports > 1)// for MIMO, we use DMRS Config Type 2
    bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=calloc(1,sizeof(*bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type));
  else
    bwp->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_Type=NULL;
@@ -1030,8 +952,14 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  NR_PUCCH_SpatialRelationInfo_t *pucchspatial = calloc(1,sizeof(*pucchspatial));
  pucchspatial->pucch_SpatialRelationInfoId = 1;
  pucchspatial->servingCellId = NULL;
- pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
- pucchspatial->referenceSignal.choice.csi_RS_Index = 0;
+ if(do_csirs) {
+   pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_csi_RS_Index;
+   pucchspatial->referenceSignal.choice.csi_RS_Index = 0;
+ }
+ else {
+   pucchspatial->referenceSignal.present = NR_PUCCH_SpatialRelationInfo__referenceSignal_PR_ssb_Index;
+   pucchspatial->referenceSignal.choice.ssb_Index = 0;
+ }
  pucchspatial->pucch_PathlossReferenceRS_Id = 0;
  pucchspatial->p0_PUCCH_Id = 1;
  pucchspatial->closedLoopIndex = NR_PUCCH_SpatialRelationInfo__closedLoopIndex_i0;
@@ -1114,53 +1042,57 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  NR_CSI_MeasConfig_t *csi_MeasConfig = calloc(1,sizeof(*csi_MeasConfig));
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup = csi_MeasConfig;
 
- csi_MeasConfig->csi_IM_ResourceToAddModList = NULL;
+ if (do_csirs && dl_antenna_ports > 1) {
+   csi_MeasConfig->csi_IM_ResourceToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceToAddModList));
+   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 = 6;
+   imres0->freqBand = calloc(1,sizeof(*imres0->freqBand));
+   imres0->freqBand->startingRB = 0;
+   imres0->freqBand->nrofRBs = 108;
+   imres0->periodicityAndOffset = calloc(1,sizeof(*imres0->periodicityAndOffset));
+   imres0->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots320;
+   imres0->periodicityAndOffset->choice.slots320 = 0;
+   ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceToAddModList->list,imres0);
+   csi_MeasConfig->csi_IM_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_IM_ResourceSetToAddModList));
+   NR_CSI_IM_ResourceSet_t *imset0 = calloc(1,sizeof(*imset0));
+   imset0->csi_IM_ResourceSetId = 0;
+   NR_CSI_IM_ResourceId_t *res0 = calloc(1,sizeof(*res0));
+   *res0 = 0;
+   ASN_SEQUENCE_ADD(&imset0->csi_IM_Resources,res0);
+   ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_IM_ResourceSetToAddModList->list,imset0);
+ }
+ else {
+   csi_MeasConfig->csi_IM_ResourceToAddModList = NULL;
+   csi_MeasConfig->csi_IM_ResourceSetToAddModList = NULL;
+ }
+
  csi_MeasConfig->csi_IM_ResourceToReleaseList = NULL;
  csi_MeasConfig->csi_IM_ResourceSetToAddModList = NULL;
  csi_MeasConfig->csi_IM_ResourceSetToReleaseList = NULL;
 
- csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList  = calloc(1,sizeof(*csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList));
- NR_NZP_CSI_RS_ResourceSet_t *nzpcsirs0 = calloc(1,sizeof(*nzpcsirs0));
- nzpcsirs0->nzp_CSI_ResourceSetId = 0;
- NR_NZP_CSI_RS_ResourceId_t *nzpid0 = calloc(1,sizeof(*nzpid0));
- *nzpid0 = 0;
- ASN_SEQUENCE_ADD(&nzpcsirs0->nzp_CSI_RS_Resources,nzpid0);
- nzpcsirs0->repetition = NULL;
- nzpcsirs0->aperiodicTriggeringOffset = NULL;
- nzpcsirs0->trs_Info = NULL;
- ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list,nzpcsirs0);
+ if (do_csirs) {
+   csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList  = calloc(1,sizeof(*csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList));
+   NR_NZP_CSI_RS_ResourceSet_t *nzpcsirs0 = calloc(1,sizeof(*nzpcsirs0));
+   nzpcsirs0->nzp_CSI_ResourceSetId = 0;
+   NR_NZP_CSI_RS_ResourceId_t *nzpid0 = calloc(1,sizeof(*nzpid0));
+   *nzpid0 = 0;
+   ASN_SEQUENCE_ADD(&nzpcsirs0->nzp_CSI_RS_Resources,nzpid0);
+   nzpcsirs0->repetition = NULL;
+   nzpcsirs0->aperiodicTriggeringOffset = NULL;
+   nzpcsirs0->trs_Info = NULL;
+   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList->list,nzpcsirs0);
+ }
+ else
+   csi_MeasConfig->nzp_CSI_RS_ResourceSetToAddModList  = NULL;
 
  csi_MeasConfig->nzp_CSI_RS_ResourceSetToReleaseList = NULL;
 
- csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList = calloc(1,sizeof(*csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList));
-
- NR_NZP_CSI_RS_Resource_t *nzpcsi0 = calloc(1,sizeof(*nzpcsi0));
- nzpcsi0->nzp_CSI_RS_ResourceId = 0;
- NR_CSI_RS_ResourceMapping_t resourceMapping;
- resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row2;
- resourceMapping.frequencyDomainAllocation.choice.row2.buf = calloc(2, sizeof(uint8_t));
- resourceMapping.frequencyDomainAllocation.choice.row2.size = 2;
- resourceMapping.frequencyDomainAllocation.choice.row2.bits_unused = 4;
- resourceMapping.frequencyDomainAllocation.choice.row2.buf[0]=0;
- resourceMapping.frequencyDomainAllocation.choice.row2.buf[1]=16;
- resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
- resourceMapping.firstOFDMSymbolInTimeDomain = 6;
- resourceMapping.firstOFDMSymbolInTimeDomain2 = NULL;
- resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
- resourceMapping.density.present = NR_CSI_RS_ResourceMapping__density_PR_one;
- resourceMapping.density.choice.one = (NULL_t)0;
- resourceMapping.freqBand.startingRB = 0;
- resourceMapping.freqBand.nrofRBs = 104;
- nzpcsi0->resourceMapping = resourceMapping;
- nzpcsi0->powerControlOffset = 0;
- nzpcsi0->powerControlOffsetSS=calloc(1,sizeof(*nzpcsi0->powerControlOffsetSS));
- *nzpcsi0->powerControlOffsetSS = NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
- nzpcsi0->scramblingID = *servingcellconfigcommon->physCellId;
- nzpcsi0->periodicityAndOffset = calloc(1,sizeof(*nzpcsi0->periodicityAndOffset));
- nzpcsi0->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots320;
- nzpcsi0->periodicityAndOffset->choice.slots320 = 0;
- nzpcsi0->qcl_InfoPeriodicCSI_RS = NULL;
- ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpcsi0);
+ config_csirs(servingcellconfigcommon, csi_MeasConfig,dl_antenna_ports,do_csirs);
 
  csi_MeasConfig->csi_SSB_ResourceSetToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_SSB_ResourceSetToAddModList));
  csi_MeasConfig->csi_SSB_ResourceSetToReleaseList = NULL;
@@ -1179,18 +1111,21 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_SSB_ResourceSetToAddModList->list,ssbresset0);
 
  csi_MeasConfig->csi_ResourceConfigToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_ResourceConfigToAddModList));
- csi_MeasConfig->csi_ResourceConfigToReleaseList = NULL;
- NR_CSI_ResourceConfig_t *csires0 = calloc(1,sizeof(*csires0));
- 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));
- NR_NZP_CSI_RS_ResourceSetId_t *nzp0 = calloc(1,sizeof(*nzp0));
- *nzp0 = 0;
- ASN_SEQUENCE_ADD(&csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list,nzp0);
- csires0->bwp_Id = 1;
- csires0->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
- ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires0);
+
+ if (do_csirs) {
+   csi_MeasConfig->csi_ResourceConfigToReleaseList = NULL;
+   NR_CSI_ResourceConfig_t *csires0 = calloc(1,sizeof(*csires0));
+   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));
+   NR_NZP_CSI_RS_ResourceSetId_t *nzp0 = calloc(1,sizeof(*nzp0));
+   *nzp0 = 0;
+   ASN_SEQUENCE_ADD(&csires0->csi_RS_ResourceSetList.choice.nzp_CSI_RS_SSB->nzp_CSI_RS_ResourceSetList->list,nzp0);
+   csires0->bwp_Id = 1;
+   csires0->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
+   ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires0);
+ }
 
  NR_CSI_ResourceConfig_t *csires1 = calloc(1,sizeof(*csires1));
  csires1->csi_ResourceConfigId=1;
@@ -1204,92 +1139,216 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
  csires1->resourceType = NR_CSI_ResourceConfig__resourceType_periodic;
  ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires1);
 
- csi_MeasConfig->csi_ReportConfigToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_ReportConfigToAddModList));
- csi_MeasConfig->csi_ReportConfigToReleaseList = NULL;
- NR_CSI_ReportConfig_t *csirep1 = calloc(1,sizeof(*csirep1));
- csirep1->reportConfigId=0;
- csirep1->carrier=NULL;
- csirep1->resourcesForChannelMeasurement=0;
- csirep1->csi_IM_ResourcesForInterference=NULL;
- csirep1->nzp_CSI_RS_ResourcesForInterference=NULL;
- csirep1->reportConfigType.present = NR_CSI_ReportConfig__reportConfigType_PR_periodic;
- csirep1->reportConfigType.choice.periodic = calloc(1,sizeof(*csirep1->reportConfigType.choice.periodic));
- csirep1->reportConfigType.choice.periodic->reportSlotConfig.present=NR_CSI_ReportPeriodicityAndOffset_PR_slots320;
- csirep1->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320 = 9 + (20 * uid) % 320;
+ if (do_csirs && dl_antenna_ports > 1) {
+   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_csi_IM_ResourceSetList;
+   csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList = calloc(1,sizeof(*csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList));
+   NR_CSI_IM_ResourceSetId_t *csiim00 = calloc(1,sizeof(*csiim00));
+   *csiim00 = 0;
+   ASN_SEQUENCE_ADD(&csires2->csi_RS_ResourceSetList.choice.csi_IM_ResourceSetList->list,csiim00);
+   ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ResourceConfigToAddModList->list,csires2);
+ }
+
  NR_PUCCH_CSI_Resource_t *pucchcsires1 = calloc(1,sizeof(*pucchcsires1));
  pucchcsires1->uplinkBandwidthPartId=1;
  pucchcsires1->pucch_Resource=2;
- ASN_SEQUENCE_ADD(&csirep1->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list,pucchcsires1);
- csirep1->reportQuantity.present = NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP;
- csirep1->reportQuantity.choice.cri_RSRP=(NULL_t)0;
- csirep1->reportFreqConfiguration = calloc(1,sizeof(*csirep1->reportFreqConfiguration));
- csirep1->reportFreqConfiguration->cqi_FormatIndicator = NULL;
- csirep1->reportFreqConfiguration->pmi_FormatIndicator=NULL;
- csirep1->reportFreqConfiguration->csi_ReportingBand=NULL;
- csirep1->timeRestrictionForChannelMeasurements= NR_CSI_ReportConfig__timeRestrictionForChannelMeasurements_configured;
- csirep1->timeRestrictionForInterferenceMeasurements=NR_CSI_ReportConfig__timeRestrictionForInterferenceMeasurements_configured;
- csirep1->codebookConfig=NULL;
- csirep1->dummy = NULL;
- 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_n1;
- csirep1->cqi_Table = NULL;
- csirep1->subbandSize = NR_CSI_ReportConfig__subbandSize_value1;
- csirep1->non_PMI_PortIndication = NULL;
- csirep1->ext1 = NULL;
-
- ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ReportConfigToAddModList->list,csirep1);
-
- NR_CSI_ReportConfig_t *csirep2 = calloc(1,sizeof(*csirep2));
- csirep2->reportConfigId=1;
- csirep2->carrier=NULL;
- csirep2->resourcesForChannelMeasurement=1;
- csirep2->csi_IM_ResourcesForInterference=NULL;
- csirep2->nzp_CSI_RS_ResourcesForInterference=NULL;
- csirep2->reportConfigType.present = NR_CSI_ReportConfig__reportConfigType_PR_periodic;
- csirep2->reportConfigType.choice.periodic = calloc(1,sizeof(*csirep2->reportConfigType.choice.periodic));
- csirep2->reportConfigType.choice.periodic->reportSlotConfig.present=NR_CSI_ReportPeriodicityAndOffset_PR_slots320;
- csirep2->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320 = 29 + (20 * uid) % 320;
- ASN_SEQUENCE_ADD(&csirep2->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list,pucchcsires1);
- csirep2->reportQuantity.present = NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP;
- csirep2->reportQuantity.choice.ssb_Index_RSRP=(NULL_t)0;
- csirep2->reportFreqConfiguration = calloc(1,sizeof(*csirep2->reportFreqConfiguration));
- csirep2->reportFreqConfiguration->cqi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI;
- csirep2->reportFreqConfiguration->pmi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__pmi_FormatIndicator_widebandPMI;
- csirep2->reportFreqConfiguration->csi_ReportingBand=NULL;
- csirep2->timeRestrictionForChannelMeasurements= NR_CSI_ReportConfig__timeRestrictionForChannelMeasurements_configured;
- csirep2->timeRestrictionForInterferenceMeasurements=NR_CSI_ReportConfig__timeRestrictionForInterferenceMeasurements_configured;
- csirep2->codebookConfig= NULL;
-
- csirep2->dummy = NULL;
- csirep2->groupBasedBeamReporting.present = NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled;
- csirep2->groupBasedBeamReporting.choice.disabled=calloc(1,sizeof(*csirep2->groupBasedBeamReporting.choice.disabled));
- csirep2->groupBasedBeamReporting.choice.disabled->nrofReportedRS = calloc(1,sizeof(*csirep2->groupBasedBeamReporting.choice.disabled->nrofReportedRS));
- *csirep2->groupBasedBeamReporting.choice.disabled->nrofReportedRS=NR_CSI_ReportConfig__groupBasedBeamReporting__disabled__nrofReportedRS_n1;
-
- csirep2->cqi_Table = calloc(1,sizeof(*csirep2->cqi_Table));
- *csirep2->cqi_Table = NR_CSI_ReportConfig__cqi_Table_table1;
- csirep2->subbandSize = NR_CSI_ReportConfig__subbandSize_value1;
- csirep2->non_PMI_PortIndication = NULL;
- csirep2->ext1 = NULL;
-
- ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ReportConfigToAddModList->list,csirep2);
+
+ csi_MeasConfig->csi_ReportConfigToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_ReportConfigToAddModList));
+ csi_MeasConfig->csi_ReportConfigToReleaseList = NULL;
+ if (do_csirs && dl_antenna_ports > 1) {
+   NR_CSI_ReportConfig_t *csirep1 = calloc(1,sizeof(*csirep1));
+   csirep1->reportConfigId=0;
+   csirep1->carrier=NULL;
+   csirep1->resourcesForChannelMeasurement=0;
+   csirep1->csi_IM_ResourcesForInterference=calloc(1,sizeof(*csirep1->csi_IM_ResourcesForInterference));
+   *csirep1->csi_IM_ResourcesForInterference=2;
+   csirep1->nzp_CSI_RS_ResourcesForInterference=NULL;
+   csirep1->reportConfigType.present = NR_CSI_ReportConfig__reportConfigType_PR_periodic;
+   csirep1->reportConfigType.choice.periodic = calloc(1,sizeof(*csirep1->reportConfigType.choice.periodic));
+   csirep1->reportConfigType.choice.periodic->reportSlotConfig.present=NR_CSI_ReportPeriodicityAndOffset_PR_slots320;
+   csirep1->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320 = 9 + (20 * uid) % 320;
+   ASN_SEQUENCE_ADD(&csirep1->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list,pucchcsires1);
+   csirep1->reportQuantity.present = NR_CSI_ReportConfig__reportQuantity_PR_cri_RI_PMI_CQI;
+   csirep1->reportQuantity.choice.cri_RI_PMI_CQI=(NULL_t)0;
+   csirep1->reportFreqConfiguration = calloc(1,sizeof(*csirep1->reportFreqConfiguration));
+   csirep1->reportFreqConfiguration->cqi_FormatIndicator = calloc(1,sizeof(*csirep1->reportFreqConfiguration->cqi_FormatIndicator));
+   *csirep1->reportFreqConfiguration->cqi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI;
+   csirep1->reportFreqConfiguration->pmi_FormatIndicator = calloc(1,sizeof(*csirep1->reportFreqConfiguration->pmi_FormatIndicator));
+   *csirep1->reportFreqConfiguration->pmi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__pmi_FormatIndicator_widebandPMI;
+   csirep1->reportFreqConfiguration->csi_ReportingBand = calloc(1,sizeof(*csirep1->reportFreqConfiguration->csi_ReportingBand));
+   csirep1->reportFreqConfiguration->csi_ReportingBand->present = NR_CSI_ReportConfig__reportFreqConfiguration__csi_ReportingBand_PR_subbands7;
+   csirep1->reportFreqConfiguration->csi_ReportingBand->choice.subbands7.size=1;
+   csirep1->reportFreqConfiguration->csi_ReportingBand->choice.subbands7.bits_unused=1;
+   csirep1->reportFreqConfiguration->csi_ReportingBand->choice.subbands7.buf=malloc(1);
+   csirep1->reportFreqConfiguration->csi_ReportingBand->choice.subbands7.buf[0]=254;
+   csirep1->timeRestrictionForChannelMeasurements= NR_CSI_ReportConfig__timeRestrictionForChannelMeasurements_configured;
+   csirep1->timeRestrictionForInterferenceMeasurements=NR_CSI_ReportConfig__timeRestrictionForInterferenceMeasurements_configured;
+   csirep1->codebookConfig=calloc(1,sizeof(*csirep1->codebookConfig));
+   csirep1->codebookConfig->codebookType.present = NR_CodebookConfig__codebookType_PR_type1;
+   csirep1->codebookConfig->codebookType.choice.type1 = calloc(1,sizeof(*csirep1->codebookConfig->codebookType.choice.type1));
+   csirep1->codebookConfig->codebookType.choice.type1->subType.present=NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel;
+   csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel=calloc(1,sizeof(*csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel));
+   csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present=
+     NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two;
+   csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two=
+     calloc(1,sizeof(*csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two));
+   csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.size=1;
+   csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.bits_unused=2;
+   csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.buf=malloc(1);
+   csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.buf[0]=0xfc;
+   csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.size=1;
+   csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.bits_unused=0;
+   csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf=malloc(1);
+   csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0]=0x03;
+   csirep1->codebookConfig->codebookType.choice.type1->codebookMode=1;
+   csirep1->dummy = NULL;
+   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_n1;
+   csirep1->cqi_Table = calloc(1,sizeof(*csirep1->cqi_Table));
+   *csirep1->cqi_Table = NR_CSI_ReportConfig__cqi_Table_table1;
+   csirep1->subbandSize = NR_CSI_ReportConfig__subbandSize_value2;
+   csirep1->non_PMI_PortIndication = NULL;
+   csirep1->ext1 = NULL;
+   ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ReportConfigToAddModList->list,csirep1);
+ }
+
+ if (do_csirs) {
+   NR_CSI_ReportConfig_t *csirep2 = calloc(1,sizeof(*csirep2));
+   csirep2->reportConfigId=1;
+   csirep2->carrier=NULL;
+   csirep2->resourcesForChannelMeasurement=0;
+   csirep2->csi_IM_ResourcesForInterference=NULL;
+   csirep2->nzp_CSI_RS_ResourcesForInterference=NULL;
+   csirep2->reportConfigType.present = NR_CSI_ReportConfig__reportConfigType_PR_periodic;
+   csirep2->reportConfigType.choice.periodic = calloc(1,sizeof(*csirep2->reportConfigType.choice.periodic));
+   csirep2->reportConfigType.choice.periodic->reportSlotConfig.present=NR_CSI_ReportPeriodicityAndOffset_PR_slots320;
+   csirep2->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320 = 29 + (20 * uid) % 320;
+   ASN_SEQUENCE_ADD(&csirep2->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list,pucchcsires1);
+   csirep2->reportQuantity.present = NR_CSI_ReportConfig__reportQuantity_PR_cri_RSRP;
+   csirep2->reportQuantity.choice.cri_RSRP=(NULL_t)0;
+   csirep2->reportFreqConfiguration = calloc(1,sizeof(*csirep2->reportFreqConfiguration));
+   csirep2->reportFreqConfiguration->cqi_FormatIndicator = NULL;
+   csirep2->reportFreqConfiguration->pmi_FormatIndicator=NULL;
+   csirep2->reportFreqConfiguration->csi_ReportingBand=NULL;
+   csirep2->timeRestrictionForChannelMeasurements= NR_CSI_ReportConfig__timeRestrictionForChannelMeasurements_configured;
+   csirep2->timeRestrictionForInterferenceMeasurements=NR_CSI_ReportConfig__timeRestrictionForInterferenceMeasurements_configured;
+   csirep2->codebookConfig=NULL;
+   csirep2->dummy = NULL;
+   csirep2->groupBasedBeamReporting.present = NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled;
+   csirep2->groupBasedBeamReporting.choice.disabled=calloc(1,sizeof(*csirep2->groupBasedBeamReporting.choice.disabled));
+   csirep2->groupBasedBeamReporting.choice.disabled->nrofReportedRS = calloc(1,sizeof(*csirep2->groupBasedBeamReporting.choice.disabled->nrofReportedRS));
+   *csirep2->groupBasedBeamReporting.choice.disabled->nrofReportedRS=NR_CSI_ReportConfig__groupBasedBeamReporting__disabled__nrofReportedRS_n1;
+   csirep2->cqi_Table = NULL;
+   csirep2->subbandSize = NR_CSI_ReportConfig__subbandSize_value1;
+   csirep2->non_PMI_PortIndication = NULL;
+   csirep2->ext1 = NULL;
+   ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ReportConfigToAddModList->list,csirep2);
+ }
+ else{
+   NR_CSI_ReportConfig_t *csirep2 = calloc(1,sizeof(*csirep2));
+   csirep2->reportConfigId=1;
+   csirep2->carrier=NULL;
+   csirep2->resourcesForChannelMeasurement=1;
+   csirep2->csi_IM_ResourcesForInterference=NULL;
+   csirep2->nzp_CSI_RS_ResourcesForInterference=NULL;
+   csirep2->reportConfigType.present = NR_CSI_ReportConfig__reportConfigType_PR_periodic;
+   csirep2->reportConfigType.choice.periodic = calloc(1,sizeof(*csirep2->reportConfigType.choice.periodic));
+   csirep2->reportConfigType.choice.periodic->reportSlotConfig.present=NR_CSI_ReportPeriodicityAndOffset_PR_slots320;
+   csirep2->reportConfigType.choice.periodic->reportSlotConfig.choice.slots320 = 29 + (20 * uid) % 320;
+   ASN_SEQUENCE_ADD(&csirep2->reportConfigType.choice.periodic->pucch_CSI_ResourceList.list,pucchcsires1);
+   csirep2->reportQuantity.present = NR_CSI_ReportConfig__reportQuantity_PR_ssb_Index_RSRP;
+   csirep2->reportQuantity.choice.ssb_Index_RSRP=(NULL_t)0;
+   csirep2->reportFreqConfiguration = calloc(1,sizeof(*csirep2->reportFreqConfiguration));
+   csirep2->reportFreqConfiguration->cqi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__cqi_FormatIndicator_widebandCQI;
+   csirep2->reportFreqConfiguration->pmi_FormatIndicator=NR_CSI_ReportConfig__reportFreqConfiguration__pmi_FormatIndicator_widebandPMI;
+   csirep2->reportFreqConfiguration->csi_ReportingBand=NULL;
+   csirep2->timeRestrictionForChannelMeasurements= NR_CSI_ReportConfig__timeRestrictionForChannelMeasurements_configured;
+   csirep2->timeRestrictionForInterferenceMeasurements=NR_CSI_ReportConfig__timeRestrictionForInterferenceMeasurements_configured;
+   csirep2->codebookConfig= NULL;
+   csirep2->dummy = NULL;
+   csirep2->groupBasedBeamReporting.present = NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled;
+   csirep2->groupBasedBeamReporting.choice.disabled=calloc(1,sizeof(*csirep2->groupBasedBeamReporting.choice.disabled));
+   csirep2->groupBasedBeamReporting.choice.disabled->nrofReportedRS = calloc(1,sizeof(*csirep2->groupBasedBeamReporting.choice.disabled->nrofReportedRS));
+   *csirep2->groupBasedBeamReporting.choice.disabled->nrofReportedRS=NR_CSI_ReportConfig__groupBasedBeamReporting__disabled__nrofReportedRS_n1;
+   csirep2->cqi_Table = calloc(1,sizeof(*csirep2->cqi_Table));
+   *csirep2->cqi_Table = NR_CSI_ReportConfig__cqi_Table_table1;
+   csirep2->subbandSize = NR_CSI_ReportConfig__subbandSize_value1;
+   csirep2->non_PMI_PortIndication = NULL;
+   csirep2->ext1 = NULL;
+   ASN_SEQUENCE_ADD(&csi_MeasConfig->csi_ReportConfigToAddModList->list,csirep2);
+ }
 
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->sCellDeactivationTimer=NULL;
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->crossCarrierSchedulingConfig=NULL;
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->tag_Id=0;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->dummy=NULL;
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->dummy1=NULL;
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->pathlossReferenceLinking=NULL;
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->servingCellMO=NULL;
 
 }
 
+
+void config_csirs(NR_ServingCellConfigCommon_t *servingcellconfigcommon, NR_CSI_MeasConfig_t *csi_MeasConfig, int dl_antenna_ports, int do_csirs) {
+
+ if (do_csirs) {
+   csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList = calloc(1,sizeof(*csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList));
+   NR_NZP_CSI_RS_Resource_t *nzpcsi0 = calloc(1,sizeof(*nzpcsi0));
+   nzpcsi0->nzp_CSI_RS_ResourceId = 0;
+   NR_CSI_RS_ResourceMapping_t resourceMapping;
+   switch (dl_antenna_ports) {
+     case 1:
+       resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_row2;
+       resourceMapping.frequencyDomainAllocation.choice.row2.buf = calloc(2, sizeof(uint8_t));
+       resourceMapping.frequencyDomainAllocation.choice.row2.size = 2;
+       resourceMapping.frequencyDomainAllocation.choice.row2.bits_unused = 4;
+       resourceMapping.frequencyDomainAllocation.choice.row2.buf[0]=0;
+       resourceMapping.frequencyDomainAllocation.choice.row2.buf[1]=16;
+       resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p1;
+       resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_noCDM;
+       break;
+     case 2:
+       resourceMapping.frequencyDomainAllocation.present = NR_CSI_RS_ResourceMapping__frequencyDomainAllocation_PR_other;
+       resourceMapping.frequencyDomainAllocation.choice.row2.buf = calloc(2, sizeof(uint8_t));
+       resourceMapping.frequencyDomainAllocation.choice.row2.size = 1;
+       resourceMapping.frequencyDomainAllocation.choice.row2.bits_unused = 2;
+       resourceMapping.frequencyDomainAllocation.choice.row2.buf[0]=4;
+       resourceMapping.nrofPorts = NR_CSI_RS_ResourceMapping__nrofPorts_p2;
+       resourceMapping.cdm_Type = NR_CSI_RS_ResourceMapping__cdm_Type_fd_CDM2;
+       break;
+     default:
+       AssertFatal(1==0,"Number of ports not yet supported\n");
+   }
+   resourceMapping.firstOFDMSymbolInTimeDomain = 6;
+   resourceMapping.firstOFDMSymbolInTimeDomain2 = NULL;
+   resourceMapping.density.present = NR_CSI_RS_ResourceMapping__density_PR_one;
+   resourceMapping.density.choice.one = (NULL_t)0;
+   resourceMapping.freqBand.startingRB = 0;
+   resourceMapping.freqBand.nrofRBs = 108;
+   nzpcsi0->resourceMapping = resourceMapping;
+   nzpcsi0->powerControlOffset = 0;
+   nzpcsi0->powerControlOffsetSS=calloc(1,sizeof(*nzpcsi0->powerControlOffsetSS));
+   *nzpcsi0->powerControlOffsetSS = NR_NZP_CSI_RS_Resource__powerControlOffsetSS_db0;
+   nzpcsi0->scramblingID = *servingcellconfigcommon->physCellId;
+   nzpcsi0->periodicityAndOffset = calloc(1,sizeof(*nzpcsi0->periodicityAndOffset));
+   nzpcsi0->periodicityAndOffset->present = NR_CSI_ResourcePeriodicityAndOffset_PR_slots320;
+   nzpcsi0->periodicityAndOffset->choice.slots320 = 0;
+   nzpcsi0->qcl_InfoPeriodicCSI_RS = NULL;
+   ASN_SEQUENCE_ADD(&csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList->list,nzpcsi0);
+ }
+ else
+   csi_MeasConfig->nzp_CSI_RS_ResourceToAddModList = NULL;
+}
+
+
 void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon,
                            NR_ServingCellConfig_t *servingcellconfigdedicated,
                            NR_RRCReconfiguration_IEs_t *reconfig,
                            NR_CellGroupConfig_t *secondaryCellGroup,
-                           int n_physical_antenna_ports,
+                           int dl_antenna_ports,
+                           int do_csirs,
                            int initial_csi_index,
                            int uid) {
   AssertFatal(servingcellconfigcommon!=NULL,"servingcellconfigcommon is null\n");
@@ -1303,9 +1362,11 @@ void fill_default_reconfig(NR_ServingCellConfigCommon_t *servingcellconfigcommon
                                   secondaryCellGroup,
                                   1,
                                   1,
-                                  n_physical_antenna_ports,
+                                  dl_antenna_ports,
+                                  do_csirs,
                                   initial_csi_index,
                                   uid);
+
   xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
 
   char scg_buffer[1024];
diff --git a/openair2/RRC/NR_UE/rrc_UE.c b/openair2/RRC/NR_UE/rrc_UE.c
index c988ec9b80202555d485462b95e2b9c84e58a340..f272c1601792f5390f93063b5c552107a1a58140 100644
--- a/openair2/RRC/NR_UE/rrc_UE.c
+++ b/openair2/RRC/NR_UE/rrc_UE.c
@@ -201,42 +201,38 @@ extern rlc_op_status_t nr_rrc_rlc_config_asn1_req (const protocol_ctxt_t   * con
     struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
 
 // from LTE-RRC DL-DCCH RRCConnectionReconfiguration nr-secondary-cell-group-config (encoded)
-int8_t nr_rrc_ue_decode_secondary_cellgroup_config(
-    const module_id_t module_id,
-    const uint8_t *buffer,
-    const uint32_t size ){
+int8_t nr_rrc_ue_decode_secondary_cellgroup_config(const module_id_t module_id,
+                                                   const uint8_t *buffer,
+                                                   const uint32_t size){
     
-    NR_CellGroupConfig_t *cell_group_config = NULL;
-    uint32_t i;
-
-    asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
-                                                    &asn_DEF_NR_CellGroupConfig,
-                                                    (void **)&cell_group_config,
-                                                    (uint8_t *)buffer,
-                                                    size ); 
-
-    if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
-            printf("NR_CellGroupConfig decode error\n");
-            for (i=0; i<size; i++){
-                printf("%02x ",buffer[i]);
-            }
-            printf("\n");
-            // free the memory
-            SEQUENCE_free( &asn_DEF_NR_CellGroupConfig, (void *)cell_group_config, 1 );
-            return -1;
-    }
+  NR_CellGroupConfig_t *cell_group_config = NULL;
+  uint32_t i;
 
-    if(NR_UE_rrc_inst[module_id].scell_group_config == NULL){
-        NR_UE_rrc_inst[module_id].scell_group_config = cell_group_config;
-        nr_rrc_ue_process_scg_config(module_id,cell_group_config);
-    }else{
-        nr_rrc_ue_process_scg_config(module_id,cell_group_config);
-        SEQUENCE_free(&asn_DEF_NR_CellGroupConfig, (void *)cell_group_config, 0);
-    }
+  asn_dec_rval_t dec_rval = uper_decode(NULL,
+                                        &asn_DEF_NR_CellGroupConfig,
+                                        (void **)&cell_group_config,
+                                        (uint8_t *)buffer,
+                                        size, 0, 0);
 
-    //nr_rrc_mac_config_req_ue( 0,0,0,NULL, cell_group_config->mac_CellGroupConfig, cell_group_config->physicalCellGroupConfig, cell_group_config->spCellConfig );
+  if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+    printf("NR_CellGroupConfig decode error\n");
+    for (i=0; i<size; i++)
+      printf("%02x ",buffer[i]);
+    printf("\n");
+    // free the memory
+    SEQUENCE_free( &asn_DEF_NR_CellGroupConfig, (void *)cell_group_config, 1 );
+    return -1;
+  }
 
-    return 0;
+  if(NR_UE_rrc_inst[module_id].scell_group_config == NULL){
+    NR_UE_rrc_inst[module_id].scell_group_config = cell_group_config;
+    nr_rrc_ue_process_scg_config(module_id,cell_group_config);
+  }else{
+    nr_rrc_ue_process_scg_config(module_id,cell_group_config);
+    SEQUENCE_free(&asn_DEF_NR_CellGroupConfig, (void *)cell_group_config, 0);
+  }
+
+  return 0;
 }
 
 int8_t nr_rrc_ue_process_RadioBearerConfig(NR_RadioBearerConfig_t *RadioBearerConfig){
@@ -262,25 +258,33 @@ int8_t nr_rrc_ue_process_rrcReconfiguration(const module_id_t module_id, NR_RRCR
         }
       }
       if(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->secondaryCellGroup != NULL){
-        NR_CellGroupConfig_t *cellGroupConfig = NULL;
-        uper_decode(NULL,
-                    &asn_DEF_NR_CellGroupConfig,   //might be added prefix later
-                    (void **)&cellGroupConfig,
-                    (uint8_t *)rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->secondaryCellGroup->buf,
-                    rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->secondaryCellGroup->size, 0, 0); 
-
-        xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
-
-        if(NR_UE_rrc_inst[module_id].cell_group_config == NULL){
-          //  first time receive the configuration, just use the memory allocated from uper_decoder. TODO this is not good implementation, need to maintain RRC_INST own structure every time.
-          NR_UE_rrc_inst[module_id].cell_group_config = cellGroupConfig;
-          nr_rrc_ue_process_scg_config(module_id,cellGroupConfig);
-        }else{
-          //  after first time, update it and free the memory after.
-          SEQUENCE_free(&asn_DEF_NR_CellGroupConfig, (void *)NR_UE_rrc_inst[module_id].cell_group_config, 0);
-          NR_UE_rrc_inst[module_id].cell_group_config = cellGroupConfig;
-          nr_rrc_ue_process_scg_config(module_id,cellGroupConfig);
+
+        if(get_softmodem_params()->sa) {
+
+          NR_CellGroupConfig_t *cellGroupConfig = NULL;
+          uper_decode(NULL,
+                      &asn_DEF_NR_CellGroupConfig,   //might be added prefix later
+                      (void **)&cellGroupConfig,
+                      (uint8_t *)rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->secondaryCellGroup->buf,
+                      rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->secondaryCellGroup->size, 0, 0);
+
+          xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)cellGroupConfig);
+
+          if(NR_UE_rrc_inst[module_id].cell_group_config == NULL){
+            //  first time receive the configuration, just use the memory allocated from uper_decoder. TODO this is not good implementation, need to maintain RRC_INST own structure every time.
+            NR_UE_rrc_inst[module_id].cell_group_config = cellGroupConfig;
+            nr_rrc_ue_process_scg_config(module_id,cellGroupConfig);
+          }else{
+            //  after first time, update it and free the memory after.
+            SEQUENCE_free(&asn_DEF_NR_CellGroupConfig, (void *)NR_UE_rrc_inst[module_id].cell_group_config, 0);
+            NR_UE_rrc_inst[module_id].cell_group_config = cellGroupConfig;
+            nr_rrc_ue_process_scg_config(module_id,cellGroupConfig);
+          }
         }
+        else
+          nr_rrc_ue_decode_secondary_cellgroup_config(module_id,
+                                                      rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->secondaryCellGroup->buf,
+                                                      rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->secondaryCellGroup->size);
       }
       if(rrcReconfiguration->criticalExtensions.choice.rrcReconfiguration->measConfig != NULL){
         if(NR_UE_rrc_inst[module_id].meas_config == NULL){
@@ -317,7 +321,7 @@ int8_t nr_rrc_ue_process_meas_config(NR_MeasConfig_t *meas_config){
 
 int8_t nr_rrc_ue_process_scg_config(const module_id_t module_id, NR_CellGroupConfig_t *cell_group_config){
   int i;
-  if(NR_UE_rrc_inst[module_id].cell_group_config==NULL){
+  if(cell_group_config==NULL){
     //  initial list
     if(cell_group_config->spCellConfig != NULL){
       if(cell_group_config->spCellConfig->spCellConfigDedicated != NULL){
@@ -512,7 +516,8 @@ NR_UE_RRC_INST_t* openair_rrc_top_init_ue_nr(char* rrc_config_path){
       fclose(fd);
       process_nsa_message(NR_UE_rrc_inst, nr_RadioBearerConfigX_r15, buffer,msg_len); 
     }
-  }else{
+  }
+  else{
     NR_UE_rrc_inst = NULL;
   }
 
@@ -551,8 +556,8 @@ int8_t nr_rrc_ue_decode_NR_BCCH_BCH_Message(
     const uint8_t     gNB_index,
     uint8_t           *const bufferP,
     const uint8_t     buffer_len ){
-    NR_BCCH_BCH_Message_t *bcch_message = NULL;
 
+    NR_BCCH_BCH_Message_t *bcch_message = NULL;
 
     if (NR_UE_rrc_inst[module_id].mib != NULL)
       SEQUENCE_free( &asn_DEF_NR_BCCH_BCH_Message, (void *)bcch_message, 1 );
@@ -565,21 +570,21 @@ int8_t nr_rrc_ue_decode_NR_BCCH_BCH_Message(
                                                    buffer_len );
 
     if ((dec_rval.code != RC_OK) || (dec_rval.consumed == 0)) {
-       LOG_E(NR_RRC,"NR_BCCH_BCH decode error\n");
-       // free the memory
-       SEQUENCE_free( &asn_DEF_NR_BCCH_BCH_Message, (void *)bcch_message, 1 );
-       return -1;
+      LOG_E(NR_RRC,"NR_BCCH_BCH decode error\n");
+      // free the memory
+      SEQUENCE_free( &asn_DEF_NR_BCCH_BCH_Message, (void *)bcch_message, 1 );
+      return -1;
     }
     else {
       //  link to rrc instance
-       SEQUENCE_free( &asn_DEF_NR_MIB, (void *)NR_UE_rrc_inst[module_id].mib, 1 );
-       NR_UE_rrc_inst[module_id].mib = bcch_message->message.choice.mib;
+      SEQUENCE_free( &asn_DEF_NR_MIB, (void *)NR_UE_rrc_inst[module_id].mib, 1 );
+      NR_UE_rrc_inst[module_id].mib = bcch_message->message.choice.mib;
       //memcpy( (void *)mib,
       //    (void *)&bcch_message->message.choice.mib,
       //    sizeof(NR_MIB_t) );
 
-       nr_rrc_mac_config_req_ue( 0, 0, 0, NR_UE_rrc_inst[module_id].mib, NULL, NULL, NULL);
-      }
+      nr_rrc_mac_config_req_ue( 0, 0, 0, NR_UE_rrc_inst[module_id].mib, NULL, NULL, NULL);
+    }
 
     return 0;
 }
@@ -1004,7 +1009,6 @@ int nr_decode_SI( const protocol_ctxt_t *const ctxt_pP, const uint8_t gNB_index
     }
     if (new_sib == 1) {
       NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIcnt++;
-  
       if (NR_UE_rrc_inst[ctxt_pP->module_id].Info[gNB_index].SIcnt == sib1->si_SchedulingInfo->schedulingInfoList.list.count)
         nr_rrc_set_sub_state( ctxt_pP->module_id, RRC_SUB_STATE_IDLE_SIB_COMPLETE );
   
@@ -1125,13 +1129,12 @@ int8_t nr_rrc_ue_generate_ra_msg(module_id_t module_id, uint8_t gNB_index) {
   return 0;
 }
 
-int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(
-    module_id_t module_id,
-    const uint8_t gNB_index,
-    uint8_t *const Sdu,
-    const uint8_t Sdu_len,
-    const uint8_t rsrq,
-    const uint8_t rsrp) {
+int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(module_id_t module_id,
+                                               const uint8_t gNB_index,
+                                               uint8_t *const Sdu,
+                                               const uint8_t Sdu_len,
+                                               const uint8_t rsrq,
+                                               const uint8_t rsrp) {
 
   NR_BCCH_DL_SCH_Message_t *bcch_message = NULL;
   NR_SIB1_t *sib1 = NR_UE_rrc_inst[module_id].sib1[gNB_index];
@@ -1190,8 +1193,6 @@ int8_t nr_rrc_ue_decode_NR_BCCH_DL_SCH_Message(
             check_requested_SI_List(module_id, NR_UE_rrc_inst[module_id].requested_SI_List, *sib1);
             if( nr_rrc_get_state(module_id) <= RRC_STATE_IDLE_NR ) {
               NR_UE_rrc_inst[module_id].ra_trigger = INITIAL_ACCESS_FROM_RRC_IDLE;
-              // TODO: remove flag after full RA procedures implemented
-              //              get_softmodem_params()->do_ra = 1;
               LOG_D(PHY,"Setting state to NR_RRC_SI_RECEIVED\n");
               nr_rrc_set_state (module_id, NR_RRC_SI_RECEIVED);
             }
diff --git a/openair2/RRC/NR_UE/rrc_defs.h b/openair2/RRC/NR_UE/rrc_defs.h
index e417b9f0b478130a8cfc78a57dcd680b7572b75f..b79cbb4bae5107bbeaff3f04306c3531cc629e20 100644
--- a/openair2/RRC/NR_UE/rrc_defs.h
+++ b/openair2/RRC/NR_UE/rrc_defs.h
@@ -105,9 +105,8 @@ typedef struct NR_UE_RRC_INST_s {
 
     NR_MeasConfig_t        *meas_config;
     NR_CellGroupConfig_t   *cell_group_config;
-    NR_CellGroupConfig_t   *scell_group_config;
     NR_ServingCellConfigCommonSIB_t *servingCellConfigCommonSIB;
-
+    NR_CellGroupConfig_t   *scell_group_config;
     NR_RadioBearerConfig_t *radio_bearer_config;
 
     NR_MeasObjectToAddMod_t        *MeasObj[NB_CNX_UE][MAX_MEAS_OBJ];
diff --git a/openair2/UTIL/TRACE/fifo_printf.c b/openair2/UTIL/TRACE/fifo_printf.c
deleted file mode 100644
index 2dc4da06371f923efca0d445e36a79558af4f9ee..0000000000000000000000000000000000000000
--- a/openair2/UTIL/TRACE/fifo_printf.c
+++ /dev/null
@@ -1,117 +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
- */
-
-/*
- *                               fifo_printf.c
- *                             -------------------
- *  AUTHOR  : Lionel GAUTHIER
- *  COMPANY : EURECOM
- *  EMAIL   : Lionel.Gauthier@eurecom.fr
- *
- */
-#include "rtos_header.h"
-#include "platform.h"
-#include "protocol_vars_extern.h"
-
-#include <asm/page.h>
-#include <asm/system.h>
-#include <stdarg.h>
-
-
-#include "fifo_printf.h"
-
-#ifndef FIFO_PRINTF
-//-----------------------------------------------------------------------------
-int fifo_printf_null (const char *fmt, ...)
-{
-  return 0;
-}
-#else
-static uint8_t       fifo_printed_l1[FIFO_PRINTF_MAX_STRING_SIZE];
-static uint8_t       fifo_printed_l2[FIFO_PRINTF_MAX_STRING_SIZE];
-//-----------------------------------------------------------------------------
-void
-fifo_printf_init (void)
-{
-  //-----------------------------------------------------------------------------
-  printk ("[TRACE] INIT\n");
-  rtf_create (FIFO_PRINTF_L1_NO, FIFO_PRINTF_SIZE);
-  rtf_create (FIFO_PRINTF_L2_NO, FIFO_PRINTF_SIZE);
-}
-
-//-----------------------------------------------------------------------------
-void
-fifo_printf_clean_up (void)
-{
-  //-----------------------------------------------------------------------------
-  rtf_destroy (FIFO_PRINTF_L1_NO);
-  rtf_destroy (FIFO_PRINTF_L2_NO);
-}
-
-//-----------------------------------------------------------------------------
-int
-fifo_printf (const char *fmt, ...)
-{
-  //-----------------------------------------------------------------------------
-  int             i;
-  va_list         args;
-
-  va_start (args, fmt);
-
-  if (pthread_self () == &task_l1l) {
-    i = vsprintf (fifo_printed_l1, fmt, args);
-    va_end (args);
-
-    /* perhaps we should discard old data instead */
-    if (i > FIFO_PRINTF_MAX_STRING_SIZE) {
-      rt_printk ("[WCDMA] FIFO_PRINTF WROTE OUTSIDE ITS MEMORY BOUNDARY : ERRORS WILL OCCUR\n");
-    }
-
-    if (i <= 0) {
-      return 0;
-    }
-
-    rtf_put (FIFO_PRINTF_L1_NO, fifo_printed_l1, i);
-
-    return i;
-  }
-
-  if (pthread_self () == &task_l2) {
-    i = vsprintf (fifo_printed_l2, fmt, args);
-    va_end (args);
-
-    /* perhaps we should discard old data instead */
-    if (i > FIFO_PRINTF_MAX_STRING_SIZE) {
-      rt_printk ("[WCDMA] FIFO_PRINTF WROTE OUTSIDE ITS MEMORY BOUNDARY : ERRORS WILL OCCUR\n");
-    }
-
-    if (i <= 0) {
-      return 0;
-    }
-
-    rtf_put (FIFO_PRINTF_L2_NO, fifo_printed_l2, i);
-
-    return i;
-  }
-
-  return 0;
-}
-#endif
diff --git a/openair2/UTIL/TRACE/fifo_printf.h b/openair2/UTIL/TRACE/fifo_printf.h
deleted file mode 100644
index ce2702b19a9c74fc59d5c031a64b891137781c19..0000000000000000000000000000000000000000
--- a/openair2/UTIL/TRACE/fifo_printf.h
+++ /dev/null
@@ -1,37 +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
- */
-
-/***************************************************************************
-                          fifo_printf.h  -  description
-                             -------------------
-  AUTHOR  : Lionel GAUTHIER
-  COMPANY : EURECOM
-  EMAIL   : Lionel.Gauthier@eurecom.fr
-
-
- ***************************************************************************/
-#ifndef __FIFO_PRINTF_H__
-#    define __FIFO_PRINTF_H__
-#    define FIFO_PRINTF_MAX_STRING_SIZE   500
-#    define FIFO_PRINTF_L1_NO              63
-#    define FIFO_PRINTF_L2_NO              62
-#    define FIFO_PRINTF_SIZE            65536
-#endif
diff --git a/openair2/UTIL/TRACE/fifo_printf_proto_extern.h b/openair2/UTIL/TRACE/fifo_printf_proto_extern.h
deleted file mode 100644
index 0855a8da93fae86ab950db4df8722a9f3f72ea29..0000000000000000000000000000000000000000
--- a/openair2/UTIL/TRACE/fifo_printf_proto_extern.h
+++ /dev/null
@@ -1,41 +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
- */
-
-/***************************************************************************
-                          fifo_printf_proto_extern.h  -  description
-                             -------------------
-  AUTHOR  : Lionel GAUTHIER
-  COMPANY : EURECOM
-  EMAIL   : Lionel.Gauthier@eurecom.fr
-
-
-
- ***************************************************************************/
-#ifndef __FIFO_PRINTF_PROTO_EXTERN_H__
-#    define __FIFO_PRINTF_PROTO_EXTERN_H__
-#ifdef FIFO_PRINTF
-extern void     fifo_printf_init (void);
-extern void     fifo_printf_clean_up (void);
-extern int      fifo_printf (const char *fmt, ...);
-#else
-extern int      fifo_printf_null (const char *fmt, ...);
-#endif
-#endif
diff --git a/openair2/UTIL/TRACE/print.h b/openair2/UTIL/TRACE/print.h
deleted file mode 100644
index 72c43f20d473d51b20a842aa38ec3b3a80d2ae2b..0000000000000000000000000000000000000000
--- a/openair2/UTIL/TRACE/print.h
+++ /dev/null
@@ -1,32 +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
- */
-
-/***************************************************************************
-                          print.h  -  description
-                             -------------------
-  AUTHOR  : Lionel GAUTHIER
-  COMPANY : EURECOM
-  EMAIL   : Lionel.Gauthier@eurecom.fr
- ***************************************************************************/
-#ifndef __PRINT_H__
-#    define __PRINT_H__
-#    define msg printf
-#endif
diff --git a/openair3/MME_APP/mme_app.c b/openair3/MME_APP/mme_app.c
index 5a32ddc98cc26ce390d5905dd20c5c698faffd85..57f1b4c9d239a8049effddd0dea6c671c8ed0735 100644
--- a/openair3/MME_APP/mme_app.c
+++ b/openair3/MME_APP/mme_app.c
@@ -54,7 +54,6 @@
 #   define X2AP_ENB_REGISTER_RETRY_DELAY   10
 
 #include "openair1/PHY/INIT/phy_init.h"
-extern unsigned char NB_MCE_INST;
 
 extern RAN_CONTEXT_t RC;
 
diff --git a/openair3/NAS/NR_UE/nr_nas_msg_sim.c b/openair3/NAS/NR_UE/nr_nas_msg_sim.c
index 7308f677a18a271b41e98f98eb48b25067377bda..c6992642e9ee67e5fe4ea5d2bd09b2a3aec427d4 100644
--- a/openair3/NAS/NR_UE/nr_nas_msg_sim.c
+++ b/openair3/NAS/NR_UE/nr_nas_msg_sim.c
@@ -465,7 +465,7 @@ static void generateAuthenticationResp(as_nas_info_t *initialNasMsg, uint8_t *bu
   initialNasMsg->length = mm_msg_encode(mm_msg, (uint8_t*)(initialNasMsg->data), size);
 }
 
-void generateSecurityModeComplete(as_nas_info_t *initialNasMsg)
+static void generateSecurityModeComplete(as_nas_info_t *initialNasMsg)
 {
   int size = sizeof(mm_msg_header_t);
   fgs_nas_message_t nas_msg;
@@ -532,7 +532,7 @@ void generateSecurityModeComplete(as_nas_info_t *initialNasMsg)
   }
 }
 
-void generateRegistrationComplete(as_nas_info_t *initialNasMsg, SORTransparentContainer               *sortransparentcontainer) {
+static void generateRegistrationComplete(as_nas_info_t *initialNasMsg, SORTransparentContainer               *sortransparentcontainer) {
   //wait send RRCReconfigurationComplete and InitialContextSetupResponse
   sleep(1);
   int length = 0;
@@ -625,12 +625,11 @@ void decodeDownlinkNASTransport(as_nas_info_t *initialNasMsg, uint8_t * pdu_buff
   }
 }
 
-void generatePduSessionEstablishRequest(as_nas_info_t *initialNasMsg){
+static void generatePduSessionEstablishRequest(uicc_t * uicc, as_nas_info_t *initialNasMsg){
   //wait send RegistrationComplete
   usleep(100*150);
   int size = 0;
-  fgs_nas_message_t nas_msg;
-  memset(&nas_msg, 0, sizeof(fgs_nas_message_t));
+  fgs_nas_message_t nas_msg={0};
 
   // setup pdu session establishment request
   uint16_t req_length = 7;
@@ -649,8 +648,6 @@ void generatePduSessionEstablishRequest(as_nas_info_t *initialNasMsg){
   MM_msg *mm_msg;
   nas_stream_cipher_t stream_cipher;
   uint8_t             mac[4];
-  uint8_t             nssai[]={1,0,0,1}; //Corresponding to SST:1, SD:1
-  uint8_t            dnn[4]={0x4,0x6f,0x61,0x69}; //Corresponding to dnn:"oai"
   nas_msg.header.protocol_discriminator = FGS_MOBILITY_MANAGEMENT_MESSAGE;
   nas_msg.header.security_header_type = INTEGRITY_PROTECTED_AND_CIPHERED_WITH_NEW_SECU_CTX;
   size += 7;
@@ -680,11 +677,21 @@ void generatePduSessionEstablishRequest(as_nas_info_t *initialNasMsg){
   mm_msg->uplink_nas_transport.requesttype = 1;
   size += 3;
   mm_msg->uplink_nas_transport.snssai.length = 4;
-  mm_msg->uplink_nas_transport.snssai.value = nssai;
-  size += (1+1+4);
-  mm_msg->uplink_nas_transport.dnn.length = 4;
-  mm_msg->uplink_nas_transport.dnn.value = dnn;
+  //Fixme: it seems there are a lot of memory errors in this: this value was on the stack, 
+  // but pushed  in a itti message to another thread
+  // this kind of error seems in many places in 5G NAS
+  mm_msg->uplink_nas_transport.snssai.value=calloc(1,4);
+  mm_msg->uplink_nas_transport.snssai.value[0] = uicc->nssai_sst;
+  mm_msg->uplink_nas_transport.snssai.value[1] = (uicc->nssai_sd>>16)&0xFF;
+  mm_msg->uplink_nas_transport.snssai.value[2] = (uicc->nssai_sd>>8)&0xFF; 
+  mm_msg->uplink_nas_transport.snssai.value[3] = (uicc->nssai_sd)&0xFF;
   size += (1+1+4);
+  int dnnSize=strlen(uicc->dnnStr);
+  mm_msg->uplink_nas_transport.dnn.value=calloc(1,dnnSize+1);
+  mm_msg->uplink_nas_transport.dnn.length = dnnSize + 1;
+  mm_msg->uplink_nas_transport.dnn.value[0] = dnnSize + 1;
+  memcpy(mm_msg->uplink_nas_transport.dnn.value+1,uicc->dnnStr, dnnSize);
+  size += (1+1+dnnSize+1);
 
   // encode the message
   initialNasMsg->data = (Byte_t *)malloc(size * sizeof(Byte_t));
@@ -819,7 +826,7 @@ void *nas_nrue_task(void *args_p)
 
           as_nas_info_t pduEstablishMsg;
           memset(&pduEstablishMsg, 0, sizeof(as_nas_info_t));
-          generatePduSessionEstablishRequest(&pduEstablishMsg);
+          generatePduSessionEstablishRequest(uicc, &pduEstablishMsg);
           if(pduEstablishMsg.length > 0){
             MessageDef *message_p;
             message_p = itti_alloc_new_message(TASK_NAS_NRUE, 0, NAS_UPLINK_DATA_REQ);
diff --git a/openair3/NAS/NR_UE/nr_nas_msg_sim.h b/openair3/NAS/NR_UE/nr_nas_msg_sim.h
index 348c27ecc89d44d1a4d6fd2bd250819f4203d401..753ebf1762d4351064627ed882c70c3ce5d98962 100644
--- a/openair3/NAS/NR_UE/nr_nas_msg_sim.h
+++ b/openair3/NAS/NR_UE/nr_nas_msg_sim.h
@@ -117,9 +117,6 @@ typedef union {
 } fgs_nas_message_t;
 
 void generateRegistrationRequest(as_nas_info_t *initialNasMsg, int Mod_id);
-void generateSecurityModeComplete(as_nas_info_t *initialNasMsg);
-void generateRegistrationComplete(as_nas_info_t *initialNasMsg, SORTransparentContainer *sortransparentcontainer);
-void generatePduSessionEstablishRequest(as_nas_info_t *initialNasMsg);
 void *nas_nrue_task(void *args_p);
 
 #endif /* __NR_NAS_MSG_SIM_H__*/
diff --git a/openair3/NGAP/ngap_gNB_nas_procedures.c b/openair3/NGAP/ngap_gNB_nas_procedures.c
index 8efab98dfa60d7f77ba5e7ed18806eb2d1a68cc8..6686f8c19e0ae5d0584b8dc7698318e3be8015b3 100644
--- a/openair3/NGAP/ngap_gNB_nas_procedures.c
+++ b/openair3/NGAP/ngap_gNB_nas_procedures.c
@@ -766,7 +766,6 @@ int ngap_gNB_initial_ctxt_resp(
         ASN_SEQUENCE_ADD(&pdusessionTransfer_p->dLQosFlowPerTNLInformation.associatedQosFlowList.list, ass_qos_item_p);
       }
                
-      memset(&res, 0, sizeof(res));
       //res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);
       //item->pDUSessionResourceSetupResponseTransfer.buf = res.buffer;
       //item->pDUSessionResourceSetupResponseTransfer.size = res.result.encoded;
@@ -799,16 +798,14 @@ int ngap_gNB_initial_ctxt_resp(
     ie->value.present = NGAP_InitialContextSetupResponseIEs__value_PR_PDUSessionResourceFailedToSetupListCxtRes;
 
     for (i = 0; i < initial_ctxt_resp_p->nb_of_pdusessions_failed; i++) {
-        NGAP_PDUSessionResourceFailedToSetupItemCxtRes_t *item;
-        NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t *pdusessionUnTransfer_p = NULL;
+        NGAP_PDUSessionResourceFailedToSetupItemCxtRes_t *item= calloc(1, sizeof *item);
+        NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t *pdusessionUnTransfer_p = calloc(1, sizeof *pdusessionUnTransfer_p);
     
-        /* mandatory */
-        item = (NGAP_PDUSessionResourceFailedToSetupItemCxtRes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceFailedToSetupItemCxtRes_t));
         /* pDUSessionID */
         item->pDUSessionID = initial_ctxt_resp_p->pdusessions_failed[i].pdusession_id;
 
         /* cause */
-        pdusessionUnTransfer_p = (NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t));
+
         pdusessionUnTransfer_p->cause.present = initial_ctxt_resp_p->pdusessions_failed[i].cause;
         switch(pdusessionUnTransfer_p->cause.present) {
           case NGAP_Cause_PR_radioNetwork:
@@ -992,8 +989,6 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance,
   NGAP_PDUSessionResourceSetupResponseIEs_t *ie;
   uint8_t  *buffer  = NULL;
   uint32_t length;
-  int      i;
-  asn_encode_to_new_buffer_result_t res = { NULL, {0, NULL, NULL} };
 
   /* Retrieve the NGAP gNB instance associated with Mod_id */
   ngap_gNB_instance_p = ngap_gNB_get_instance(instance);
@@ -1022,20 +1017,20 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance,
   /* Prepare the NGAP message to encode */
   memset(&pdu, 0, sizeof(pdu));
   pdu.present = NGAP_NGAP_PDU_PR_successfulOutcome;
-  pdu.choice.successfulOutcome = (NGAP_SuccessfulOutcome_t *)calloc(1,sizeof(struct NGAP_SuccessfulOutcome));
+  pdu.choice.successfulOutcome = calloc(1,sizeof *pdu.choice.successfulOutcome);
   pdu.choice.successfulOutcome->procedureCode = NGAP_ProcedureCode_id_PDUSessionResourceSetup;
   pdu.choice.successfulOutcome->criticality = NGAP_Criticality_reject;
   pdu.choice.successfulOutcome->value.present = NGAP_SuccessfulOutcome__value_PR_PDUSessionResourceSetupResponse;
   out = &pdu.choice.successfulOutcome->value.choice.PDUSessionResourceSetupResponse;
   /* mandatory */
-  ie = (NGAP_PDUSessionResourceSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseIEs_t));
+  ie = calloc(1, sizeof *ie);
   ie->id = NGAP_ProtocolIE_ID_id_AMF_UE_NGAP_ID;
   ie->criticality = NGAP_Criticality_ignore;
   ie->value.present = NGAP_PDUSessionResourceSetupResponseIEs__value_PR_AMF_UE_NGAP_ID;
   asn_uint642INTEGER(&ie->value.choice.AMF_UE_NGAP_ID, ue_context_p->amf_ue_ngap_id);
   ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
   /* mandatory */
-  ie = (NGAP_PDUSessionResourceSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseIEs_t));
+  ie = calloc(1, sizeof *ie );
   ie->id = NGAP_ProtocolIE_ID_id_RAN_UE_NGAP_ID;
   ie->criticality = NGAP_Criticality_ignore;
   ie->value.present = NGAP_PDUSessionResourceSetupResponseIEs__value_PR_RAN_UE_NGAP_ID;
@@ -1044,23 +1039,19 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance,
 
   /* optional */
   if (pdusession_setup_resp_p->nb_of_pdusessions > 0) {
-    ie = (NGAP_PDUSessionResourceSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseIEs_t));
+    ie = calloc(1, sizeof *ie );
     ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceSetupListSURes;
     ie->criticality = NGAP_Criticality_ignore;
     ie->value.present = NGAP_PDUSessionResourceSetupResponseIEs__value_PR_PDUSessionResourceSetupListSURes;
 
-    for (i = 0; i < pdusession_setup_resp_p->nb_of_pdusessions; i++) {
-      NGAP_PDUSessionResourceSetupItemSURes_t *item;
-      NGAP_PDUSessionResourceSetupResponseTransfer_t     *pdusessionTransfer_p = NULL;
-
-      /* mandatory */
-      item = (NGAP_PDUSessionResourceSetupItemSURes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupItemSURes_t));
+    for (int i = 0; i < pdusession_setup_resp_p->nb_of_pdusessions; i++) {
+      NGAP_PDUSessionResourceSetupItemSURes_t *item=calloc(1, sizeof *item );
+      NGAP_PDUSessionResourceSetupResponseTransfer_t *pdusessionTransfer_p = calloc(1, sizeof *pdusessionTransfer_p );
 
       /* pDUSessionID */
       item->pDUSessionID = pdusession_setup_resp_p->pdusessions[i].pdusession_id;
 
       /* dLQosFlowPerTNLInformation */
-      pdusessionTransfer_p = (NGAP_PDUSessionResourceSetupResponseTransfer_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseTransfer_t));
 
       pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.present = NGAP_UPTransportLayerInformation_PR_gTPTunnel;
       pdusessionTransfer_p->dLQosFlowPerTNLInformation.uPTransportLayerInformation.choice.gTPTunnel =
@@ -1086,8 +1077,7 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance,
 
       /* associatedQosFlowList. number of 1? */
       for(int j=0; j < pdusession_setup_resp_p->pdusessions[i].nb_of_qos_flow; j++) {
-        NGAP_AssociatedQosFlowItem_t *ass_qos_item_p;
-        ass_qos_item_p = (NGAP_AssociatedQosFlowItem_t *)calloc(1, sizeof(NGAP_AssociatedQosFlowItem_t));
+        NGAP_AssociatedQosFlowItem_t *ass_qos_item_p = calloc(1, sizeof *ass_qos_item_p);
 
         /* qosFlowIdentifier */
         ass_qos_item_p->qosFlowIdentifier = pdusession_setup_resp_p->pdusessions[i].associated_qos_flows[j].qfi;
@@ -1100,18 +1090,11 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance,
         ASN_SEQUENCE_ADD(&pdusessionTransfer_p->dLQosFlowPerTNLInformation.associatedQosFlowList.list, ass_qos_item_p);
       }
 
-      memset(&res, 0, sizeof(res));
-//      res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);
-//      item->pDUSessionResourceSetupResponseTransfer.buf = res.buffer;
-//      item->pDUSessionResourceSetupResponseTransfer.size = res.result.encoded;
-      uint8_t buffer[100];
-      asn_enc_rval_t  enc_rval = aper_encode_to_buffer(&asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, 
-                                  NULL, 
-                                  pdusessionTransfer_p, 
-                                  buffer,100);
-      AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n", enc_rval.failed_type->name, enc_rval.encoded);
-      item->pDUSessionResourceSetupResponseTransfer.buf = buffer;
-      item->pDUSessionResourceSetupResponseTransfer.size = enc_rval.encoded;
+      asn_encode_to_new_buffer_result_t res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER,
+								       &asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);
+      AssertFatal (res.buffer, "ASN1 message encoding failed (%s, %lu)!\n", res.result.failed_type->name, res.result.encoded);
+      item->pDUSessionResourceSetupResponseTransfer.buf = res.buffer;
+      item->pDUSessionResourceSetupResponseTransfer.size = res.result.encoded;
 
       ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_NGAP_PDUSessionResourceSetupResponseTransfer, pdusessionTransfer_p);
 
@@ -1122,22 +1105,20 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance,
 
   /* optional */
   if (pdusession_setup_resp_p->nb_of_pdusessions_failed > 0) {
-    ie = (NGAP_PDUSessionResourceSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseIEs_t));
+    ie = calloc(1, sizeof *ie);
     ie->id = NGAP_ProtocolIE_ID_id_PDUSessionResourceFailedToSetupListSURes;
     ie->criticality = NGAP_Criticality_ignore;
     ie->value.present = NGAP_PDUSessionResourceSetupResponseIEs__value_PR_PDUSessionResourceFailedToSetupListSURes;
 
-    for (i = 0; i < pdusession_setup_resp_p->nb_of_pdusessions_failed; i++) {
-      NGAP_PDUSessionResourceFailedToSetupItemSURes_t *item;
-      NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t *pdusessionUnTransfer_p = NULL;
+    for (int i = 0; i < pdusession_setup_resp_p->nb_of_pdusessions_failed; i++) {
+      LOG_W(NGAP,"add a failed session\n");
+      NGAP_PDUSessionResourceFailedToSetupItemSURes_t *item=calloc(1, sizeof *item);
+      NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t *pdusessionUnTransfer_p = calloc(1, sizeof *pdusessionUnTransfer_p);
 
-      /* mandatory */
-      item = (NGAP_PDUSessionResourceFailedToSetupItemSURes_t *)calloc(1, sizeof(NGAP_PDUSessionResourceFailedToSetupItemSURes_t));
       /* pDUSessionID */
       item->pDUSessionID = pdusession_setup_resp_p->pdusessions_failed[i].pdusession_id;
 
       /* cause */
-      pdusessionUnTransfer_p = (NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupUnsuccessfulTransfer_t));
       pdusessionUnTransfer_p->cause.present = pdusession_setup_resp_p->pdusessions_failed[i].cause;
       switch(pdusessionUnTransfer_p->cause.present) {
         case NGAP_Cause_PR_radioNetwork:
@@ -1167,8 +1148,9 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance,
 
       NGAP_DEBUG("pdusession setup response: failed pdusession ID %ld\n", item->pDUSessionID);
 
-      memset(&res, 0, sizeof(res));
-      res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer, pdusessionUnTransfer_p);
+     asn_encode_to_new_buffer_result_t res =
+	       asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER,
+				  &asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer, pdusessionUnTransfer_p);     
       item->pDUSessionResourceSetupUnsuccessfulTransfer.buf = res.buffer;
       item->pDUSessionResourceSetupUnsuccessfulTransfer.size = res.result.encoded;
 
@@ -1182,7 +1164,7 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance,
 
   /* optional */
   if (0) {
-      ie = (NGAP_PDUSessionResourceSetupResponseIEs_t *)calloc(1, sizeof(NGAP_PDUSessionResourceSetupResponseIEs_t));
+    ie = calloc(1, sizeof *ie);
       ie->id = NGAP_ProtocolIE_ID_id_CriticalityDiagnostics;
       ie->criticality = NGAP_Criticality_ignore;
       ie->value.present = NGAP_PDUSessionResourceSetupResponseIEs__value_PR_CriticalityDiagnostics;
diff --git a/openair3/UICC/usim_interface.c b/openair3/UICC/usim_interface.c
index 0973d7508204a3ab0f8536bf9225256ef1e3bbca..5d04f882859fe263dabc3c391957c5c4533813c3 100644
--- a/openair3/UICC/usim_interface.c
+++ b/openair3/UICC/usim_interface.c
@@ -37,11 +37,14 @@ extern uint16_t NB_UE_INST;
 /*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
 #define UICC_PARAMS_DESC {\
     {"imsi",             "USIM IMSI\n",          0,         strptr:&(uicc->imsiStr),              defstrval:"2089900007487",           TYPE_STRING,    0 },\
-    {"nmc_size"          "number of digits in NMC", 0,      iptr:&(uicc->nmc_size),               defintval:2,            TYPE_INT,       0 },\
+    {"nmc_size"          "number of digits in NMC", 0,      iptr:&(uicc->nmc_size),               defintval:2,         TYPE_INT,       0 },\
     {"key",              "USIM Ki\n",            0,         strptr:&(uicc->keyStr),               defstrval:"fec86ba6eb707ed08905757b1bb44b8f", TYPE_STRING,    0 },\
     {"opc",              "USIM OPc\n",           0,         strptr:&(uicc->opcStr),               defstrval:"c42449363bbad02b66d16bc975d77cc1", TYPE_STRING,    0 },\
-    {"amf",              "USIM amf\n",           0,         strptr:&(uicc->amfStr),               defstrval:"8000",       TYPE_STRING,    0 },\
-    {"sqn",              "USIM sqn\n",           0,         strptr:&(uicc->sqnStr),               defstrval:"000000",     TYPE_STRING,    0 },\
+    {"amf",              "USIM amf\n",           0,         strptr:&(uicc->amfStr),               defstrval:"8000",    TYPE_STRING,    0 },\
+    {"sqn",              "USIM sqn\n",           0,         strptr:&(uicc->sqnStr),               defstrval:"000000",  TYPE_STRING,    0 },\
+    {"dnn",              "UE dnn (apn)\n",       0,         strptr:&(uicc->dnnStr),               defstrval:"oai",     TYPE_STRING,    0 },\
+      {"nssai_sst",            "UE nssai\n",           0,         iptr:&(uicc->nssai_sst),             defintval:1,    TYPE_INT,    0 }, \
+      {"nssai_sd",            "UE nssai\n",           0,         iptr:&(uicc->nssai_sd),             defintval:1,    TYPE_INT,    0 }, \
   };
 
 static uicc_t** uiccArray=NULL;
diff --git a/openair3/UICC/usim_interface.h b/openair3/UICC/usim_interface.h
index 44c27c772ed32ada79fda8dc37bb9535f07226cd..eb32a6bfc1eb5d9e4a0ae0b4206d35ee0a6e2911 100644
--- a/openair3/UICC/usim_interface.h
+++ b/openair3/UICC/usim_interface.h
@@ -49,6 +49,9 @@ typedef struct {
   char *opcStr;
   char *amfStr;
   char *sqnStr;
+  char *dnnStr;
+  int  nssai_sst;
+  int  nssai_sd;
   uint8_t key[16];
   uint8_t opc[16];
   uint8_t amf[2];
diff --git a/openair3/ocp-gtpu/gtp_itf.cpp b/openair3/ocp-gtpu/gtp_itf.cpp
index e12a4d66a85d3d9b0724159f2f6dbafcc5a89d83..c367374436fd9b3c78c518f7c198046b3510eb49 100644
--- a/openair3/ocp-gtpu/gtp_itf.cpp
+++ b/openair3/ocp-gtpu/gtp_itf.cpp
@@ -528,7 +528,7 @@ int gtpv1u_create_ngu_tunnel(  const instance_t instance,
 
   for (int i = 0; i < create_tunnel_req->num_tunnels; i++) {
     teid_t teid=newGtpuCreateTunnel(compatInst(instance), create_tunnel_req->rnti,
-                                    create_tunnel_req->pdusession_id[i],
+                                    create_tunnel_req->incoming_rb_id[i],
                                     create_tunnel_req->pdusession_id[i],
                                     create_tunnel_req->upf_NGu_teid[i],
                                     create_tunnel_req->upf_addr[i], 2152,
diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
index dce410de47e0fb1dcd49dc8258c7d5606e8b26d3..c15bdc37cb459866c096e1180385a3a2c8fc5414 100644
--- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
+++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
@@ -42,7 +42,6 @@
 #include <unistd.h>
 #include <errno.h>
 #include <linux/sysctl.h>
-#include <sys/sysctl.h>
 
 #include "common_lib.h"
 #include "ethernet_lib.h"
@@ -219,11 +218,6 @@ int ethernet_tune(openair0_device *device,
     struct timeval timeout;
     struct ifreq ifr;
     char system_cmd[256];
-    int rname[] = { CTL_NET, NET_CORE, NET_CORE_RMEM_MAX };
-    int wname[] = { CTL_NET, NET_CORE, NET_CORE_WMEM_MAX };
-    int namelen=3;
-    int newval[1];
-    int newlen=sizeof(newval);
     int ret=0;
     //  int i=0;
 
@@ -363,28 +357,36 @@ int ethernet_tune(openair0_device *device,
         }
         break;
     case KERNEL_RCV_BUF_MAX_SIZE:
-        newval[0] = value;
-        ret=sysctl(rname, namelen, NULL, 0, newval, newlen);
-        if (ret) {
-            fprintf(stderr,"[ETHERNET] Error using sysctl():%s\n",strerror(errno));
-        } else {
-            printf("[ETHERNET] Kernel network receive buffer max size is set to %u\n",(unsigned int)newval[0]);
-        }
-        break;
+      ret=snprintf(system_cmd,sizeof(system_cmd),"sysctl -w net.core.rmem_max=%d",value);
+      if (ret > 0) {
+	ret=system(system_cmd);
+	if (ret == -1) {
+	  fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno));
+	} else {
+	  printf ("[ETHERNET] status of %s is %d\n", system_cmd, WEXITSTATUS(ret));
+	}
+	printf("[ETHERNET] net core rmem %s\n",system_cmd);
+      } else {
+	perror("[ETHERNET] Can't set net core rmem\n");
+      }
+      break;
     case KERNEL_SND_BUF_MAX_SIZE:
-        newval[0] = value;
-        ret=sysctl(wname, namelen, NULL, 0, newval, newlen);
-        if (ret) {
-            fprintf(stderr,"[ETHERNET] Error using sysctl():%s\n",strerror(errno));
-        } else {
-            printf("[ETHERNET] Kernel network send buffer max size is set to %u\n",(unsigned int)newval[0]);
-        }
-        break;
-
+      ret=snprintf(system_cmd,sizeof(system_cmd),"sysctl -w net.core.wmem_max=%d",value);
+      if (ret > 0) {
+	ret=system(system_cmd);
+	if (ret == -1) {
+	  fprintf (stderr,"[ETHERNET] Can't start shell to execute %s %s",system_cmd, strerror(errno));
+	} else {
+	  printf ("[ETHERNET] status of %s is %d\n", system_cmd, WEXITSTATUS(ret));
+	}
+	printf("[ETHERNET] net core wmem %s\n",system_cmd);
+      } else {
+	perror("[ETHERNET] Can't set net core wmem\n");
+      }
+      break;
     default:
         break;
     }
-
     return 0;
 }
 
diff --git a/targets/ARCH/rfsimulator/apply_channelmod.c b/targets/ARCH/rfsimulator/apply_channelmod.c
index ab8ae77edde7320d887b670663ce45eaa5c66a0c..d7d3a68965717280276ec9d839ab6e576e98d390 100644
--- a/targets/ARCH/rfsimulator/apply_channelmod.c
+++ b/targets/ARCH/rfsimulator/apply_channelmod.c
@@ -74,10 +74,10 @@ void rxAddInput( struct complex16 *input_sig, struct complex16 *after_channel_si
 
   for (int i=0; i<((int)nbSamples-dd); i++) {
     struct complex16 *out_ptr=after_channel_sig+dd+i;
-    struct complex rx_tmp= {0};
+    struct complexd rx_tmp= {0};
 
     for (int txAnt=0; txAnt < nbTx; txAnt++) {
-      const struct complex *channelModel= channelDesc->ch[rxAnt+(txAnt*channelDesc->nb_rx)];
+      const struct complexd *channelModel= channelDesc->ch[rxAnt+(txAnt*channelDesc->nb_rx)];
 
       //const struct complex *channelModelEnd=channelModel+channelDesc->channel_length;
       for (int l = 0; l<(int)channelDesc->channel_length; l++) {
@@ -88,14 +88,14 @@ void rxAddInput( struct complex16 *input_sig, struct complex16 *after_channel_si
         // it would be better to split out each antenna in a separate flow
         // that will allow to mix ru antennas freely
         struct complex16 tx16=input_sig[((TS+i-l)*nbTx+txAnt)%CirSize];
-        rx_tmp.x += tx16.r * channelModel[l].x - tx16.i * channelModel[l].y;
-        rx_tmp.y += tx16.i * channelModel[l].x + tx16.r * channelModel[l].y;
+        rx_tmp.r += tx16.r * channelModel[l].r - tx16.i * channelModel[l].i;
+        rx_tmp.i += tx16.i * channelModel[l].r + tx16.r * channelModel[l].i;
       } //l
     }
 
     // Fixme: lround(), rount(), ... is detected by valgrind as error, not found why
-    out_ptr->r += lround(rx_tmp.x*pathLossLinear + noise_per_sample*gaussZiggurat(0.0,1.0));
-    out_ptr->i += lround(rx_tmp.y*pathLossLinear + noise_per_sample*gaussZiggurat(0.0,1.0));
+    out_ptr->r += lround(rx_tmp.r*pathLossLinear + noise_per_sample*gaussZiggurat(0.0,1.0));
+    out_ptr->i += lround(rx_tmp.i*pathLossLinear + noise_per_sample*gaussZiggurat(0.0,1.0));
     out_ptr++;
   }
 
diff --git a/targets/ARCH/rfsimulator/simulator.c b/targets/ARCH/rfsimulator/simulator.c
index 354709faa1c3fe87c3f9834bc3ae56ce05722c2a..13945998d754faa5f0f490099a992baaa8ee5667 100644
--- a/targets/ARCH/rfsimulator/simulator.c
+++ b/targets/ARCH/rfsimulator/simulator.c
@@ -810,6 +810,7 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
   device->trx_read_func      = rfsimulator_read;
   /* let's pretend to be a b2x0 */
   device->type = RFSIMULATOR;
+  openair0_cfg[0].rx_gain[0] = 0;
   device->openair0_cfg=&openair0_cfg[0];
   device->priv = rfsimulator;
   device->trx_write_init = rfsimulator_write_init;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf
index ef171bf0a9748041308c13fc3c32007a81d4d32f..0fd0dd455156bd98aaeebc6fa742a3b347bf423b 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf
@@ -234,8 +234,10 @@ MACRLCs = (
 
 L1s = (
     	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
index 360b75c67df50642b9f8487fca656523f533e12e..2c97e2cad35c3a116a97769ee07393f3ec1f7e66 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
@@ -218,8 +218,10 @@ MACRLCs = (
 
 L1s = (
     	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
index e018aef006ec0f5c9165dc56f19885f517f7c6d3..3ec84d34cec730e85ff9d843f9f62942b40f0714 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
@@ -216,8 +216,10 @@ MACRLCs = (
 
 L1s = (
     	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
index 834060b071731f9df400830291adffe6f81dab5b..90ae80fb8d0481f51c127223e2d33081bbb01bb1 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
@@ -235,6 +235,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
index 2028f405527468ba66ad4cbc5949b0099d422e6d..cd57096e006929ee6369727fb6383ab6eb24de1e 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
@@ -219,6 +219,7 @@ L1s = (
   num_cc = 1;
   tr_n_preference = "local_mac";
   pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
   }
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
index 35c4924ba1c1f491a8254bc83fb29c3f494f524b..5230fa91ef2f2e30ea84b0ddb7c8ca8b0c3970ee 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
@@ -219,6 +219,7 @@ L1s = (
   num_cc = 1;
   tr_n_preference = "local_mac";
   pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
   }
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
index aa61153c93c3e5a87a4735ba4e3aa21c782440f0..51b252e1a49f0d5e1ce0204959cfb7ba5acb2def 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
@@ -231,8 +231,10 @@ MACRLCs = (
 
 L1s = (
     	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
index d08234ab1678ba1e0a8e6c7d71f7aaff1f88e953..5530f33d6559d42fa3d78dd996aa21869c9f2335 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
@@ -269,6 +269,7 @@ L1s = (
    num_cc = 1;
    tr_n_preference = "local_mac";
    pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
  }
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
index f22d5f781f22d398e8fb80789f92f07c65740196..1cd08ec115d48e1c1d48e2a345a75db48592c5d3 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
@@ -215,8 +215,10 @@ MACRLCs = (
 
 L1s = (
     	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
index b57cb00779d41a7e2224fbb88b2d25dba8fc9c42..8a5fbb740f97f7420441adae959791ade2ec9e84 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
@@ -218,6 +218,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
 	}
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
index 862185835e3dc7abd7cd306d95d345bed3144b35..705fa277e03a93c95de22fafdef6029dc6edecd4 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
@@ -219,6 +219,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
 	}
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
index 335c3d9f0b5aae258d9d9494d133070c5caef658..7d8b80f83c30334f9b61bb5c8fcf41da64fc150b 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
@@ -230,11 +230,12 @@ MACRLCs = (
 );
 
 L1s = (
-    	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
-        pusch_proc_threads = 8;
-        }  
+  {
+    num_cc = 1;
+    tr_n_preference = "local_mac";
+    pusch_proc_threads = 8;
+    ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+  }
 );
 
 RUs = (
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
index bf75edc360e56a0130fc99177694617ef4def640..a1a49724703206dd2bfa66e44f7b06724f699011 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
@@ -214,11 +214,12 @@ MACRLCs = (
 );
 
 L1s = (
-    	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
-        pusch_proc_threads = 8;
-        }  
+  {
+    num_cc = 1;
+    tr_n_preference = "local_mac";
+    pusch_proc_threads = 8;
+    ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+  }
 );
 
 RUs = (
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
index b4f40d2205d0c7b29b75572647962b5d30d1c59c..44d238bce242dae4829a465fe7d9d67d923f18a0 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
@@ -219,6 +219,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
index 639b11828ba98cb07b9257507310aa228e8e6925..a4df8399eadd61f4eb359b98b2a41700317ab99f 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
@@ -219,6 +219,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
index b93b530bed6f9deaf1d6be4e9b433de33613d93b..2899f6982d19101c2437ef602f6ff6f0cd028c55 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
@@ -219,6 +219,7 @@ L1s = (
         num_cc = 1;
         tr_n_preference = "local_mac";
         pusch_proc_threads = 8;
+        ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
     }
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
index 50276c32897ab2fd805981f17922303ce43b5868..2b646fcacd578177ac402289ed019770dd941ab2 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
@@ -214,11 +214,12 @@ MACRLCs = (
 );
 
 L1s = (
-    	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
-        pusch_proc_threads = 8;
-        }  
+  {
+    num_cc = 1;
+    tr_n_preference = "local_mac";
+    pusch_proc_threads = 8;
+    ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+  }
 );
 
 RUs = (
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf
index 5cfd4dc768b71510cc9837ea038912fb78a320c7..06ae5af06678efcde9262c118b8c5b06075efab4 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf
@@ -28,6 +28,7 @@ L1s = (
     remote_n_portc   = 50001; // vnf p5 port
     local_n_portd    = 50010; // pnf p7 port
     remote_n_portd   = 50011; // vnf p7 port
+    pusch_proc_threads = 8;
   }  
 );
 
@@ -42,5 +43,7 @@ RUs = (
        max_pdschReferenceSignalPower = -27;
        max_rxgain                    = 114;
        sdr_addrs = "type=x300"; // USRP type
+       clock_src = "external";
+       time_src = "external";
     }		      
 );
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
index 7d21dce681162e31336431a27f33b8d1aaea3f71..95b05f320b89171808bbe1d621852ad615a0bf55 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
@@ -235,6 +235,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
index 463b7d6d069ab77be97605b08acc4ea7eedd446e..f7546cde792b591721ed5e9c96712bd4b0e265e3 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
@@ -251,6 +251,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf
index 483fd34f2a1e910ce7ff449e4ad0e3f3b4966a77..bfb268fef848c35573ce959334c3a96f26abaaea 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/cu_gnb.conf
@@ -34,6 +34,8 @@ gNBs =
 
     ssb_SubcarrierOffset                                      = 0;
     pdsch_AntennaPorts                                        = 1;
+    pusch_AntennaPorts                                        = 1;
+    sib1_tda                                                  = 0;
 
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf
index dcb3010f20386b2fc13f7bdbc8c00a72270a87d0..7b3535ce1fbc0f1e8213ed967eee082a00487d4b 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/du_gnb.conf
@@ -26,6 +26,8 @@ gNBs =
 
     ssb_SubcarrierOffset                                      = 0;
     pdsch_AntennaPorts                                        = 1;
+    pusch_AntennaPorts                                        = 1;
+    sib1_tda                                                  = 0;
 
     servingCellConfigCommon = (
     {
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf
index 753bd0bed3ef58dac322a104f5bc70c7ecfae2a3..1b0c15ea7aaa5e7776e6efa03e964c3925f1dae8 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.band78.tm1.106PRB.usrpn300.gtp-itti.conf
@@ -38,7 +38,8 @@ gNBs =
 
     ssb_SubcarrierOffset                                      = 0;
     pdsch_AntennaPorts                                        = 1;
-	
+    pusch_AntennaPorts                                        = 1;
+    sib1_tda                                                  = 0;
     servingCellConfigCommon = (
     {
  #spCellConfigCommon
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
index 1a28ebb9508b7eebbd3ebba0da22e437a2decdd6..3fd543f70fcdb8d61dd1d18bc6b4e7592e6f27ef 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
@@ -35,6 +35,7 @@ gNBs =
     ssb_SubcarrierOffset                                      = 0;
     pdsch_AntennaPorts                                        = 1;
     pusch_AntennaPorts                                        = 1;
+    sib1_tda                                                  = 0;
 
      pdcch_ConfigSIB1 = (
       {
@@ -240,6 +241,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
     }
 );
 
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
index 718038657b30ae4052f750988beb71f9759e0d4c..e69607ee574213875a3b76bb7a6a16f65ab50d55 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
@@ -35,6 +35,7 @@ gNBs =
     ssb_SubcarrierOffset                                      = 0;
     pdsch_AntennaPorts                                        = 1;
     pusch_AntennaPorts                                        = 1;
+    sib1_tda                                                  = 0;
 
      pdcch_ConfigSIB1 = (
       {
@@ -240,6 +241,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
     }
 );
 
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 424a1390014a812d4725af72ff1122086ac14765..a67b58d61a90c63fa2b3ef836c76d4f4d022ef89 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -169,8 +169,6 @@ extern void reset_opp_meas(void);
 extern void print_opp_meas(void);
 
 
-extern void init_eNB_afterRU(void);
-
 RU_t **RCconfig_RU(int nb_RU,int nb_L1_inst,PHY_VARS_eNB ***eNB,uint64_t *ru_mask,pthread_mutex_t *ru_mutex,pthread_cond_t *ru_cond);
 
 int transmission_mode=1;
@@ -527,6 +525,8 @@ int main ( int argc, char **argv )
   int ru_id;
   int node_type = ngran_eNB;
 
+  start_background_system();
+
   if ( load_configmodule(argc,argv,0) == NULL) {
     exit_fun("[SOFTMODEM] Error, configuration module init failed\n");
   }
diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c
index 026e6d4a6061afc262b2a9f31d9c45c0ce371902..25bbef0bc6a1b37294c19ada7ad263ee0639db6f 100644
--- a/targets/RT/USER/lte-uesoftmodem.c
+++ b/targets/RT/USER/lte-uesoftmodem.c
@@ -757,6 +757,7 @@ int main( int argc, char **argv ) {
   printf("sync sent\n");
   /*
     printf("About to call end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
+    We have to set properly PARAMFLAG_NOFREE
     end_configmodule();
     printf("Called end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
   */