diff --git a/ci-scripts/Jenkinsfile-inria-r2lab b/ci-scripts/Jenkinsfile-inria-r2lab
index ca6893dc4ff36d7711c37b2b02739ed848ee029f..ada52277f4ea702b21edecdc1f18ec9b541560e3 100644
--- a/ci-scripts/Jenkinsfile-inria-r2lab
+++ b/ci-scripts/Jenkinsfile-inria-r2lab
@@ -62,6 +62,7 @@ def r2labUE0IpAddr = r2labBaseIpAddr + r2labUE0Idx
 def r2labENB1Idx = '16'
 def r2labENB1 = 'fit' + r2labENB1Idx
 def r2labENB1IpAddr = r2labBaseIpAddr + r2labENB1Idx
+def r2labDoAllOff = true
 
 pipeline {
     agent {
@@ -136,22 +137,28 @@ pipeline {
                         sh "python3 /home/eurecom/inria-scripts/booking-lease.py --book-lease --from ${BOOK_TIMESTAMP}T${r2labStartTime} --duration ${r2labDuration} --slice inria_oaici ${r2labuser} ${r2labpassword}"
                         sh "python3 /home/eurecom/inria-scripts/booking-lease.py --get-leases ${r2labuser} ${r2labpassword} | grep -v nightly"
                     }
+
+                    // Adding a tempo after booking leases
+                    sh "sleep 10"
+                    LEASE_STATUS = sh returnStdout: true, script: "ssh -t inria_oaici@faraday.inria.fr 'rleases --check'"
+                    LEASE_STATUS = LEASE_STATUS.trim()
+                    if (LEASE_STATUS ==~ /.*Access currently denied to inria_oaici.*/) {
+                        r2labDoAllOff = false
+                        currentBuild.result = 'ABORTED'
+                        error('Stopping early because R2LAB not available')
+                    }
                 }
             }
         }
         stage ("Load Images") {
             steps {
                 script {
-                    // Adding a tempo after booking leases
-                    sh "sleep 10"
-                    sh "ssh -t inria_oaici@faraday.inria.fr 'rleases --check'"
                     sh "ssh -t inria_oaici@faraday.inria.fr 'all-off'"
                     sh "sleep 10"
 
                     echo '\u2705 \u001B[32mLoad Image for Python Executor\u001B[0m'
                     try {
-                       //sh "ssh -t inria_oaici@faraday.inria.fr 'rload -i oai-ci-cd-u18-lowlatency-enb-ue ${r2labPythonExeIdx} > /dev/null 2>&1'"
-                       sh "ssh -t inria_oaici@faraday.inria.fr 'rload -i oai-ci-cd-u18-lowlatency-enb-ue ${r2labPythonExeIdx}'"
+                       sh "ssh -t inria_oaici@faraday.inria.fr 'rload -i oai-ci-cd-u18-lowlatency-enb-ue ${r2labPythonExeIdx} > /dev/null 2>&1'"
                     } catch (Exception e) {
                        echo "Why is it wrong?"
                     }
@@ -164,14 +171,12 @@ pipeline {
 
                     echo '\u2705 \u001B[32mLoad Image for two (2) eNBs\u001B[0m'
                     try {
-                      //sh "ssh -t inria_oaici@faraday.inria.fr 'rload -i oai-ci-cd-u18-lowlatency-enb-ue ${r2labENB0Idx},${r2labENB1Idx} > /dev/null 2>&1'"
-                      sh "ssh -t inria_oaici@faraday.inria.fr 'rload -i oai-ci-cd-u18-lowlatency-enb-ue ${r2labENB0Idx},${r2labENB1Idx}"
+                      sh "ssh -t inria_oaici@faraday.inria.fr 'rload -i oai-ci-cd-u18-lowlatency-enb-ue ${r2labENB0Idx},${r2labENB1Idx} > /dev/null 2>&1'"
                     } catch (Exception e) {
                        echo "Why is it wrong?"
                     }
                     try {
-                       //sh "ssh -t inria_oaici@faraday.inria.fr 'rwait --silent ${r2labENB0Idx},${r2labENB1Idx}'"
-                       sh "ssh -t inria_oaici@faraday.inria.fr 'rwait ${r2labENB0Idx},${r2labENB1Idx}'"
+                       sh "ssh -t inria_oaici@faraday.inria.fr 'rwait --silent ${r2labENB0Idx},${r2labENB1Idx}'"
                     } catch (Exception e) {
                        echo "Why is it wrong?"
                     }
@@ -441,9 +446,11 @@ pipeline {
     post {
         always {
             script {
-                echo '\u2705 \u001B[32mShutdown every node\u001B[0m'
-                sh 'ssh -t inria_oaici@faraday.inria.fr "all-off"'
-                sh 'ssh -t inria_oaici@faraday.inria.fr "all-off"'
+                if (r2labDoAllOff) {
+                    echo '\u2705 \u001B[32mShutdown every node\u001B[0m'
+                    sh 'ssh -t inria_oaici@faraday.inria.fr "all-off"'
+                    sh 'ssh -t inria_oaici@faraday.inria.fr "all-off"'
+                }
             }
         }
     }
diff --git a/ci-scripts/checkAddedWarnings.sh b/ci-scripts/checkAddedWarnings.sh
index d366059a853cf39ea2deaa771dee93de2c5b2e8e..bda8287a784862ddc7a050e2216385231f6d3e76 100755
--- a/ci-scripts/checkAddedWarnings.sh
+++ b/ci-scripts/checkAddedWarnings.sh
@@ -110,7 +110,7 @@ MODIFIED_FILES=`git log $TARGET_INIT_COMMIT..$MERGE_COMMMIT --oneline --name-sta
 NB_WARNINGS_FILES=0
 
 # Retrieve list of warnings 
-LIST_WARNING_FILES=`egrep "error:|warning:" archives/*/*.Rel15.txt archives/*/basic_simulator_*txt | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto" | sed -e "s#^.*/home/ubuntu/tmp/##" -e "s#^.*/tmp/CI-eNB/##" -e "s#common/utils/.*/itti#common/utils/itti#" | awk -F ":" '{print $1}' | sort | uniq`
+LIST_WARNING_FILES=`egrep "error:|warning:" archives/*/*.Rel15.txt | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto" | sed -e "s#^.*/home/ubuntu/tmp/##" -e "s#^.*/tmp/CI-eNB/##" -e "s#common/utils/.*/itti#common/utils/itti#" | awk -F ":" '{print $1}' | sort | uniq`
 
 echo ""
 echo "List of files that have been modified by the Merge Request AND"
diff --git a/ci-scripts/checkCodingFormattingRules.sh b/ci-scripts/checkCodingFormattingRules.sh
index 6ac43ca19fefd240bcaf64e13c2aeac48889a4eb..fb159d4da07db4662a48f297c5646c807ee05084 100755
--- a/ci-scripts/checkCodingFormattingRules.sh
+++ b/ci-scripts/checkCodingFormattingRules.sh
@@ -62,6 +62,30 @@ then
     NB_FILES_TO_FORMAT=`astyle --dry-run --options=ci-scripts/astyle-options.txt --recursive *.c *.h | grep -c Formatted `
     echo "Nb Files that do NOT follow OAI rules: $NB_FILES_TO_FORMAT"
     echo $NB_FILES_TO_FORMAT > ./oai_rules_result.txt
+
+    # Testing Circular Dependencies protection
+    awk '/#[ \t]*ifndef/ { gsub("^.*ifndef *",""); if (names[$1]!="") print "files with same {define ", FILENAME, names[$1]; names[$1]=FILENAME } /#[ \t]*define/ { gsub("^.*define *",""); if(names[$1]!=FILENAME) print "error in declaration", FILENAME, $1, names[$1]; nextfile }' `find openair* common targets executables -name *.h |grep -v LFDS` > header-files-w-incorrect-define.txt
+
+    # Testing if explicit GNU GPL license banner
+    egrep -irl --exclude-dir=.git --include=*.cpp --include=*.c --include=*.h "General Public License" . > files-w-gnu-gpl-license-banner.txt
+
+    # Looking at exotic/suspect banner
+    LIST_OF_FILES_W_BANNER=`egrep -irl --exclude-dir=.git --include=*.cpp --include=*.c --include=*.h "Copyright|copyleft" .`
+    if [ -f ./files-w-suspect-banner.txt ]; then rm -f ./files-w-suspect-banner.txt; fi
+    for FILE in $LIST_OF_FILES_W_BANNER
+    do
+       IS_NFAPI=`echo $FILE | egrep -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext"`
+       IS_OAI_LICENCE_PRESENT=`egrep -c "OAI Public License" $FILE`
+       IS_BSD_LICENCE_PRESENT=`egrep -c "the terms of the BSD Licence" $FILE`
+       IS_EXCEPTION=`echo $FILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|common/utils/itti_analyzer/common/queue.h|openair3/UTILS/tree.h|openair3/UTILS/queue.h"`
+       if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ]
+       then
+           if [ $IS_NFAPI -eq 0 ] && [ $IS_EXCEPTION -eq 0 ]
+           then
+               echo $FILE >> ./files-w-suspect-banner.txt
+           fi
+       fi
+    done
     exit 0
 fi
 
@@ -131,8 +155,25 @@ if [ -f oai_rules_result_list.txt ]
 then
     rm -f oai_rules_result_list.txt
 fi
+if [ -f header-files-w-incorrect-define.txt ]
+then
+    rm -f header-files-w-incorrect-define.txt
+fi
+if [ -f files-w-gnu-gpl-license-banner.txt ]
+then
+    rm -f files-w-gnu-gpl-license-banner.txt
+fi
+if [ -f files-w-suspect-banner.txt ]
+then
+    rm -f files-w-suspect-banner.txt
+fi
+awk '/#[ \t]*ifndef/ { gsub("^.*ifndef *",""); if (names[$1]!="") print "files with same {define ", FILENAME, names[$1]; names[$1]=FILENAME } /#[ \t]*define/ { gsub("^.*define *",""); if(names[$1]!=FILENAME) print "error in declaration", FILENAME, $1, names[$1]; nextfile }' `find openair* common targets executables -name *.h |grep -v LFDS` > header-files-w-incorrect-define-tmp.txt
+
 for FULLFILE in $MODIFIED_FILES
 do
+    # sometimes, we remove files
+    if [ ! -f $FULLFILE ]; then continue; fi
+
     filename=$(basename -- "$FULLFILE")
     EXT="${filename##*.}"
     if [ $EXT = "c" ] || [ $EXT = "h" ] || [ $EXT = "cpp" ] || [ $EXT = "hpp" ]
@@ -144,8 +185,32 @@ do
             echo $FULLFILE
             echo $FULLFILE >> ./oai_rules_result_list.txt
         fi
+        # Testing if explicit GNU GPL license banner
+        egrep -i "General Public License" $FULLFILE >> files-w-gnu-gpl-license-banner.txt
+        # Looking at exotic/suspect banner
+        IS_BANNER=`egrep -i -c "Copyright|copyleft" $FULLFILE`
+        if [ $IS_BANNER -ne 0 ]
+        then
+            IS_NFAPI=`echo $FULLFILE | egrep -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext"`
+            IS_OAI_LICENCE_PRESENT=`egrep -c "OAI Public License" $FULLFILE`
+            IS_BSD_LICENCE_PRESENT=`egrep -c "the terms of the BSD Licence" $FULLFILE`
+            IS_EXCEPTION=`echo $FILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|common/utils/itti_analyzer/common/queue.h|openair3/UTILS/tree.h|openair3/UTILS/queue.h"`
+            if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ]
+            then
+                if [ $IS_NFAPI -eq 0 ] && [ $IS_EXCEPTION -eq 0 ]
+                then
+                    echo $FILE >> ./files-w-suspect-banner.txt
+                fi
+            fi
+        fi
+    fi
+    # Testing Circular Dependencies protection
+    if [ $EXT = "h" ] || [ $EXT = "hpp" ]
+    then
+        grep $FULLFILE header-files-w-incorrect-define-tmp.txt >> header-files-w-incorrect-define.txt
     fi
 done
+rm -f header-files-w-incorrect-define-tmp.txt
 echo ""
 echo " ----------------------------------------------------------"
 echo "Nb Files that do NOT follow OAI rules: $NB_TO_FORMAT"
diff --git a/ci-scripts/epc.py b/ci-scripts/epc.py
index 4926f2d6e880a4dd82cee104afcdc0e107ad2527..09d500f203d185fc00fd0778721a1b5e542d4a38 100644
--- a/ci-scripts/epc.py
+++ b/ci-scripts/epc.py
@@ -62,6 +62,9 @@ class EPCManagement():
 		self.Type = ''
 		self.PcapFileName = ''
 		self.htmlObj = None
+		self.testCase_id = ''
+		self.MmeIPAddress = ''
+		self.containerPrefix = 'prod'
 
 #-----------------------------------------------------------
 # Setter and Getters on Public Members
@@ -89,6 +92,12 @@ class EPCManagement():
 		return self.Type
 	def SetHtmlObj(self, obj):
 		self.htmlObj = obj
+	def SetTestCase_id(self, idx):
+		self.testCase_id = idx
+	def GetMmeIPAddress(self):
+		return self.MmeIPAddress
+	def SetContainerPrefix(self, prefix):
+		self.containerPrefix = prefix
 
 #-----------------------------------------------------------
 # EPC management functions
@@ -101,7 +110,14 @@ class EPCManagement():
 			sys.exit('Insufficient EPC Parameters')
 		mySSH = SSH.SSHConnection() 
 		mySSH.open(self.IPAddress, self.UserName, self.Password)
-		if re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
+		if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
+			logging.debug('Using the OAI EPC Release 14 Cassandra-based HSS in Docker')
+			mySSH.command('if [ -d ' + self.SourceCodePath + '/scripts ]; then echo ' + self.Password + ' | sudo -S rm -Rf ' + self.SourceCodePath + '/scripts ; fi', '\$', 5)
+			mySSH.command('mkdir -p ' + self.SourceCodePath + '/scripts', '\$', 5)
+			mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-hss /bin/bash -c "nohup tshark -i eth0 -i eth1 -w /tmp/hss_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
+			time.sleep(5)
+			mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-hss /bin/bash -c "nohup ./bin/oai_hss -j ./etc/hss_rel14.json --reloadkey true > hss_check_run.log 2>&1"', '\$', 5)
+		elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
 			logging.debug('Using the OAI EPC Release 14 Cassandra-based HSS')
 			mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
 			logging.debug('\u001B[1m Launching tshark on all interfaces \u001B[0m')
@@ -139,7 +155,12 @@ class EPCManagement():
 			sys.exit('Insufficient EPC Parameters')
 		mySSH = SSH.SSHConnection() 
 		mySSH.open(self.IPAddress, self.UserName, self.Password)
-		if re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
+		if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
+			logging.debug('Using the OAI EPC Release 14 MME in Docker')
+			mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup tshark -i eth0 -i lo:s10 -w /tmp/mme_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
+			time.sleep(5)
+			mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-mme /bin/bash -c "nohup ./bin/oai_mme -c ./etc/mme.conf > mme_check_run.log 2>&1"', '\$', 5)
+		elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
 			logging.debug('Using the OAI EPC Release 14 MME')
 			mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
 			mySSH.command('echo ' + self.Password + ' | sudo -S rm -f mme_' + self.testCase_id + '.log', '\$', 5)
@@ -166,6 +187,25 @@ class EPCManagement():
 		if self.htmlObj is not None:
 			self.htmlObj.CreateHtmlTestRow(self.Type, 'OK', CONST.ALL_PROCESSES_OK)
 
+	def SetMmeIPAddress(self):
+		# Not an error if we don't need an EPC
+		if self.IPAddress == '' or self.UserName == '' or self.Password == '' or self.SourceCodePath == '' or self.Type == '':
+			return
+		if self.IPAddress == 'none':
+			return
+		# Only in case of Docker containers, MME IP address is not the EPC HOST IP address
+		if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
+			mySSH = SSH.SSHConnection() 
+			mySSH.open(self.IPAddress, self.UserName, self.Password)
+			mySSH.command('docker inspect --format="MME_IP_ADDR = {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" ' + self.containerPrefix + '-oai-mme', '\$', 5)
+			result = re.search('MME_IP_ADDR = (?P<mme_ip_addr>[0-9\.]+)', mySSH.getBefore())
+			if result is not None:
+				self.MmeIPAddress = result.group('mme_ip_addr')
+				logging.debug('MME IP Address is ' + self.MmeIPAddress)
+			mySSH.close()
+		else:
+			self.MmeIPAddress = self.IPAddress
+
 	def InitializeSPGW(self):
 		if self.IPAddress == '' or self.UserName == '' or self.Password == '' or self.SourceCodePath == '' or self.Type == '':
 			HELP.GenericHelp(CONST.Version)
@@ -173,7 +213,15 @@ class EPCManagement():
 			sys.exit('Insufficient EPC Parameters')
 		mySSH = SSH.SSHConnection() 
 		mySSH.open(self.IPAddress, self.UserName, self.Password)
-		if re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
+		if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
+			logging.debug('Using the OAI EPC Release 14 SPGW-CUPS in Docker')
+			mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-spgwc /bin/bash -c "nohup tshark -i eth0 -i lo:p5c -i lo:s5c -w /tmp/spgwc_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
+			mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-spgwu-tiny /bin/bash -c "nohup tshark -i eth0 -w /tmp/spgwu_check_run.pcap 2>&1 > /dev/null"', '\$', 5)
+			time.sleep(5)
+			mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-spgwc /bin/bash -c "nohup ./bin/oai_spgwc -o -c ./etc/spgw_c.conf > spgwc_check_run.log 2>&1"', '\$', 5)
+			time.sleep(5)
+			mySSH.command('docker exec -d ' + self.containerPrefix + '-oai-spgwu-tiny /bin/bash -c "nohup ./bin/oai_spgwu -o -c ./etc/spgw_u.conf > spgwu_check_run.log 2>&1"', '\$', 5)
+		elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
 			logging.debug('Using the OAI EPC Release 14 SPGW-CUPS')
 			mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
 			mySSH.command('echo ' + self.Password + ' | sudo -S rm -f spgwc_' + self.testCase_id + '.log spgwu_' + self.testCase_id + '.log', '\$', 5)
@@ -202,8 +250,11 @@ class EPCManagement():
 		try:
 			mySSH = SSH.SSHConnection() 
 			mySSH.open(self.IPAddress, self.UserName, self.Password)
-			mySSH.command('stdbuf -o0 ps -aux | grep --color=never hss | grep -v grep', '\$', 5)
-			if re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
+			if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
+				mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-hss /bin/bash -c "ps aux | grep oai_hss"', '\$', 5)
+			else:
+				mySSH.command('stdbuf -o0 ps -aux | grep --color=never hss | grep -v grep', '\$', 5)
+			if re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
 				result = re.search('oai_hss -j', mySSH.getBefore())
 			elif re.match('OAI', self.Type, re.IGNORECASE):
 				result = re.search('\/bin\/bash .\/run_', mySSH.getBefore())
@@ -224,8 +275,13 @@ class EPCManagement():
 		try:
 			mySSH = SSH.SSHConnection() 
 			mySSH.open(self.IPAddress, self.UserName, self.Password)
-			mySSH.command('stdbuf -o0 ps -aux | grep --color=never mme | grep -v grep', '\$', 5)
-			if re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
+			if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
+				mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-mme /bin/bash -c "ps aux | grep oai_mme"', '\$', 5)
+			else:
+				mySSH.command('stdbuf -o0 ps -aux | grep --color=never mme | grep -v grep', '\$', 5)
+			if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
+				result = re.search('oai_mme -c ', mySSH.getBefore())
+			elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
 				result = re.search('mme -c', mySSH.getBefore())
 			elif re.match('OAI', self.Type, re.IGNORECASE):
 				result = re.search('\/bin\/bash .\/run_', mySSH.getBefore())
@@ -246,7 +302,13 @@ class EPCManagement():
 		try:
 			mySSH = SSH.SSHConnection() 
 			mySSH.open(self.IPAddress, self.UserName, self.Password)
-			if re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
+			if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
+				mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-spgwc /bin/bash -c "ps aux | grep oai_spgwc"', '\$', 5)
+				result = re.search('oai_spgwc -o -c ', mySSH.getBefore())
+				if result is not None:
+					mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-spgwu-tiny /bin/bash -c "ps aux | grep oai_spgwu"', '\$', 5)
+					result = re.search('oai_spgwu -o -c ', mySSH.getBefore())
+			elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
 				mySSH.command('stdbuf -o0 ps -aux | grep --color=never spgw | grep -v grep', '\$', 5)
 				result = re.search('spgwu -c ', mySSH.getBefore())
 			elif re.match('OAI', self.Type, re.IGNORECASE):
@@ -269,7 +331,14 @@ class EPCManagement():
 	def TerminateHSS(self):
 		mySSH = SSH.SSHConnection() 
 		mySSH.open(self.IPAddress, self.UserName, self.Password)
-		if re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
+		if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
+			mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-hss /bin/bash -c "killall --signal SIGINT oai_hss tshark"', '\$', 5)
+			time.sleep(2)
+			mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-hss /bin/bash -c "ps aux | grep oai_hss"', '\$', 5)
+			result = re.search('oai_hss -j ', mySSH.getBefore())
+			if result is not None:
+				mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-hss /bin/bash -c "killall --signal SIGKILL oai_hss"', '\$', 5)
+		elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
 			mySSH.command('echo ' + self.Password + ' | sudo -S killall --signal SIGINT oai_hss || true', '\$', 5)
 			time.sleep(2)
 			mySSH.command('stdbuf -o0  ps -aux | grep hss | grep -v grep', '\$', 5)
@@ -298,7 +367,14 @@ class EPCManagement():
 	def TerminateMME(self):
 		mySSH = SSH.SSHConnection() 
 		mySSH.open(self.IPAddress, self.UserName, self.Password)
-		if re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
+		if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
+			mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-mme /bin/bash -c "killall --signal SIGINT oai_mme tshark"', '\$', 5)
+			time.sleep(2)
+			mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-mme /bin/bash -c "ps aux | grep oai_mme"', '\$', 5)
+			result = re.search('oai_mme -c ', mySSH.getBefore())
+			if result is not None:
+				mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-mme /bin/bash -c "killall --signal SIGKILL oai_mme"', '\$', 5)
+		elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
 			mySSH.command('echo ' + self.Password + ' | sudo -S killall --signal SIGINT run_mme mme || true', '\$', 5)
 			time.sleep(2)
 			mySSH.command('stdbuf -o0 ps -aux | grep mme | grep -v grep', '\$', 5)
@@ -318,7 +394,19 @@ class EPCManagement():
 	def TerminateSPGW(self):
 		mySSH = SSH.SSHConnection() 
 		mySSH.open(self.IPAddress, self.UserName, self.Password)
-		if re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
+		if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
+			mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-spgwc /bin/bash -c "killall --signal SIGINT oai_spgwc tshark"', '\$', 5)
+			mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-spgwu-tiny /bin/bash -c "killall --signal SIGINT oai_spgwu tshark"', '\$', 5)
+			time.sleep(2)
+			mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-spgwc /bin/bash -c "ps aux | grep oai_spgwc"', '\$', 5)
+			result = re.search('oai_spgwc -o -c ', mySSH.getBefore())
+			if result is not None:
+				mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-spgwc /bin/bash -c "killall --signal SIGKILL oai_spgwc"', '\$', 5)
+			mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-spgwu-tiny /bin/bash -c "ps aux | grep oai_spgwu"', '\$', 5)
+			result = re.search('oai_spgwu -o -c ', mySSH.getBefore())
+			if result is not None:
+				mySSH.command('docker exec -it ' + self.containerPrefix + '-oai-spgwu-tiny /bin/bash -c "killall --signal SIGKILL oai_spgwu"', '\$', 5)
+		elif re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
 			mySSH.command('echo ' + self.Password + ' | sudo -S killall --signal SIGINT spgwc spgwu || true', '\$', 5)
 			time.sleep(2)
 			mySSH.command('stdbuf -o0 ps -aux | grep spgw | grep -v grep', '\$', 5)
@@ -352,7 +440,11 @@ class EPCManagement():
 		mySSH.open(self.IPAddress, self.UserName, self.Password)
 		mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
 		mySSH.command('rm -f hss.log.zip', '\$', 5)
-		if re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
+		if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
+			mySSH.command('docker cp ' + self.containerPrefix + '-oai-hss:/openair-hss/hss_check_run.log .', '\$', 60)
+			mySSH.command('docker cp ' + self.containerPrefix + '-oai-hss:/tmp/hss_check_run.pcap .', '\$', 60)
+			mySSH.command('zip hss.log.zip hss_check_run.*', '\$', 60)
+		elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
 			mySSH.command('zip hss.log.zip hss*.log', '\$', 60)
 			mySSH.command('echo ' + self.Password + ' | sudo -S rm hss*.log', '\$', 5)
 			if re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
@@ -370,7 +462,11 @@ class EPCManagement():
 		mySSH.open(self.IPAddress, self.UserName, self.Password)
 		mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
 		mySSH.command('rm -f mme.log.zip', '\$', 5)
-		if re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
+		if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
+			mySSH.command('docker cp ' + self.containerPrefix + '-oai-mme:/openair-mme/mme_check_run.log .', '\$', 60)
+			mySSH.command('docker cp ' + self.containerPrefix + '-oai-mme:/tmp/mme_check_run.pcap .', '\$', 60)
+			mySSH.command('zip mme.log.zip mme_check_run.*', '\$', 60)
+		elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
 			mySSH.command('zip mme.log.zip mme*.log', '\$', 60)
 			mySSH.command('echo ' + self.Password + ' | sudo -S rm mme*.log', '\$', 5)
 		elif re.match('ltebox', self.Type, re.IGNORECASE):
@@ -385,7 +481,13 @@ class EPCManagement():
 		mySSH.open(self.IPAddress, self.UserName, self.Password)
 		mySSH.command('cd ' + self.SourceCodePath + '/scripts', '\$', 5)
 		mySSH.command('rm -f spgw.log.zip', '\$', 5)
-		if re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
+		if re.match('OAI-Rel14-Docker', self.Type, re.IGNORECASE):
+			mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwc:/openair-spgwc/spgwc_check_run.log .', '\$', 60)
+			mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwu-tiny:/openair-spgwu-tiny/spgwu_check_run.log .', '\$', 60)
+			mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwc:/tmp/spgwc_check_run.pcap .', '\$', 60)
+			mySSH.command('docker cp ' + self.containerPrefix + '-oai-spgwu-tiny:/tmp/spgwu_check_run.pcap .', '\$', 60)
+			mySSH.command('zip spgw.log.zip spgw*_check_run.*', '\$', 60)
+		elif re.match('OAI', self.Type, re.IGNORECASE) or re.match('OAI-Rel14-CUPS', self.Type, re.IGNORECASE):
 			mySSH.command('zip spgw.log.zip spgw*.log', '\$', 60)
 			mySSH.command('echo ' + self.Password + ' | sudo -S rm spgw*.log', '\$', 5)
 		elif re.match('ltebox', self.Type, re.IGNORECASE):
diff --git a/ci-scripts/html.py b/ci-scripts/html.py
index 3d0c8f3897d56693e6e31037c6a37d9701ecd2c0..1a6e3f8fdb45b9c5aacb5e9a98ec361a32c4ef47 100644
--- a/ci-scripts/html.py
+++ b/ci-scripts/html.py
@@ -83,7 +83,7 @@ class HTMLManagement():
 # Setters and Getters
 #-----------------------------------------------------------
 	def SethtmlUEFailureMsg(self,huefa):
-                self.htmlUEFailureMsg = huefa
+		self.htmlUEFailureMsg = huefa
 	def GethtmlUEFailureMsg(self):
 		return self.htmlUEFailureMsg
 	def SetHmleNBFailureMsg(self, msg):
@@ -112,7 +112,10 @@ class HTMLManagement():
 		self.ranTargetBranch = tbranch
 
 	def SethtmlUEConnected(self, nbUEs):
-		self.htmlUEConnected = nbUEs
+		if nbUEs > 0:
+			self.htmlUEConnected = nbUEs
+		else:
+			self.htmlUEConnected = 1
 	def SethtmlNb_Smartphones(self, nbUEs):
 		self.htmlNb_Smartphones = nbUEs
 	def SethtmlNb_CATM_Modules(self, nbUEs):
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index 1e149c40504f055ae6080fef01467f5be3d44aa5..e9313051fc1bec888dfdcbec50c8998e01d02f93 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -86,7 +86,6 @@ class OaiCiTest():
 		self.UEDevicesRebootCmd = []
 		self.CatMDevices = []
 		self.UEIPAddresses = []
-		self.htmlUEConnected = -1
 		self.idle_sleep_time = 0
 		self.x2_ho_options = 'network'
 		self.x2NbENBs = 0
@@ -177,7 +176,7 @@ class OaiCiTest():
 		SSH.command('mkdir -p log', '\$', 5)
 		SSH.command('chmod 777 log', '\$', 5)
 		# no need to remove in log (git clean did the trick)
-		SSH.command('stdbuf -o0 ./build_oai ' + self.Build_OAI_UE_args + ' 2>&1 | stdbuf -o0 tee compile_oai_ue.log', 'Bypassing the Tests|build have failed', 600)
+		SSH.command('stdbuf -o0 ./build_oai ' + self.Build_OAI_UE_args + ' 2>&1 | stdbuf -o0 tee compile_oai_ue.log', 'Bypassing the Tests|build have failed', 900)
 		SSH.command('ls ran_build/build', '\$', 3)
 		SSH.command('ls ran_build/build', '\$', 3)
 		buildStatus = True
@@ -404,23 +403,50 @@ class OaiCiTest():
 				if (outterLoopCounter == 0):
 					doOutterLoop = False
 				continue
+			# We are now checking if sync w/ eNB DOES NOT OCCUR
+			# Usually during the cell synchronization stage, the UE returns with No cell synchronization message
+			# That is the case for LTE
+			# In NR case, it's a positive message that will show if synchronization occurs
+			doLoop = True
 			if RAN.Getair_interface() == 'nr':
-				fullSyncStatus = True
-				doOutterLoop = False
+				loopCounter = 10
 			else:
 				# We are now checking if sync w/ eNB DOES NOT OCCUR
 				# Usually during the cell synchronization stage, the UE returns with No cell synchronization message
-				doLoop = True
 				loopCounter = 10
-				while (doLoop):
-					loopCounter = loopCounter - 1
-					if (loopCounter == 0):
+			while (doLoop):
+				loopCounter = loopCounter - 1
+				if (loopCounter == 0):
+					if RAN.Getair_interface() == 'nr':
+						# Here we do have great chances that UE did NOT cell-sync w/ gNB
+						doLoop = False
+						fullSyncStatus = False
+						logging.debug('Never seen the NR-Sync message (Measured Carrier Frequency) --> try again')
+						time.sleep(6)
+						# Stopping the NR-UE  
+						SSH.command('ps -aux | grep --text --color=never softmodem | grep -v grep', '\$', 4)
+						result = re.search('nr-uesoftmodem', SSH.getBefore())
+						if result is not None:
+							SSH.command('echo ' + self.UEPassword + ' | sudo -S killall --signal=SIGINT nr-uesoftmodem', '\$', 4)
+						time.sleep(6)
+					else:
 						# Here we do have a great chance that the UE did cell-sync w/ eNB
 						doLoop = False
 						doOutterLoop = False
 						fullSyncStatus = True
 						continue
-					SSH.command('stdbuf -o0 cat ue_' + self.testCase_id + '.log | egrep --text --color=never -i "wait|sync"', '\$', 4)
+				SSH.command('stdbuf -o0 cat ue_' + self.testCase_id + '.log | egrep --text --color=never -i "wait|sync|Frequency"', '\$', 4)
+				if RAN.Getair_interface() == 'nr':
+					# Positive messaging -->
+					result = re.search('Measured Carrier Frequency', SSH.getBefore())
+					if result is not None:
+						doLoop = False
+						doOutterLoop = False
+						fullSyncStatus = True
+					else:
+						time.sleep(6)
+				else:
+					# Negative messaging -->
 					result = re.search('No cell synchronization found', SSH.getBefore())
 					if result is None:
 						time.sleep(6)
@@ -433,13 +459,22 @@ class OaiCiTest():
 						result = re.search('lte-uesoftmodem', SSH.getBefore())
 						if result is not None:
 							SSH.command('echo ' + self.UEPassword + ' | sudo -S killall --signal=SIGINT lte-uesoftmodem', '\$', 4)
-				outterLoopCounter = outterLoopCounter - 1
-				if (outterLoopCounter == 0):
-					doOutterLoop = False
+			outterLoopCounter = outterLoopCounter - 1
+			if (outterLoopCounter == 0):
+				doOutterLoop = False
 
-		if fullSyncStatus and gotSyncStatus and RAN.Getair_interface() == 'lte':
-			result = re.search('--no-L2-connect', str(self.Initialize_OAI_UE_args))
-			if result is None:
+		if fullSyncStatus and gotSyncStatus:
+			doInterfaceCheck = False
+			if RAN.Getair_interface() == 'lte':
+				result = re.search('--no-L2-connect', str(self.Initialize_OAI_UE_args))
+				if result is None:
+					doInterfaceCheck = True
+			# For the moment, only in explicit noS1 without kernel module (ie w/ tunnel interface)
+			if RAN.Getair_interface() == 'nr':
+				result = re.search('--noS1 --nokrnmod 1', str(self.Initialize_OAI_UE_args))
+				if result is not None:
+					doInterfaceCheck = True
+			if doInterfaceCheck:
 				SSH.command('ifconfig oaitun_ue1', '\$', 4)
 				SSH.command('ifconfig oaitun_ue1', '\$', 4)
 				# ifconfig output is different between ubuntu 16 and ubuntu 18
@@ -3317,10 +3352,13 @@ while len(argvs) > 1:
 		EPC.SetSourceCodePath(matchReg.group(1))
 	elif re.match('^\-\-EPCType=(.+)$', myArgv, re.IGNORECASE):
 		matchReg = re.match('^\-\-EPCType=(.+)$', myArgv, re.IGNORECASE)
-		if re.match('OAI', matchReg.group(1), re.IGNORECASE) or re.match('ltebox', matchReg.group(1), re.IGNORECASE) or re.match('OAI-Rel14-CUPS', matchReg.group(1), re.IGNORECASE):
+		if re.match('OAI', matchReg.group(1), re.IGNORECASE) or re.match('ltebox', matchReg.group(1), re.IGNORECASE) or re.match('OAI-Rel14-CUPS', matchReg.group(1), re.IGNORECASE) or re.match('OAI-Rel14-Docker', matchReg.group(1), re.IGNORECASE):
 			EPC.SetType(matchReg.group(1))
 		else:
-			sys.exit('Invalid EPC Type: ' + matchReg.group(1) + ' -- (should be OAI or ltebox or OAI-Rel14-CUPS)')
+			sys.exit('Invalid EPC Type: ' + matchReg.group(1) + ' -- (should be OAI or ltebox or OAI-Rel14-CUPS or OAI-Rel14-Docker)')
+	elif re.match('^\-\-EPCContainerPrefix=(.+)$', myArgv, re.IGNORECASE):
+		matchReg = re.match('^\-\-EPCContainerPrefix=(.+)$', myArgv, re.IGNORECASE)
+		EPC.SetContainerPrefix(matchReg.group(1))
 	elif re.match('^\-\-ADBIPAddress=(.+)$', myArgv, re.IGNORECASE):
 		matchReg = re.match('^\-\-ADBIPAddress=(.+)$', myArgv, re.IGNORECASE)
 		CiTestObj.ADBIPAddress = matchReg.group(1)
@@ -3543,6 +3581,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
 			sys.exit(1)
 	if (EPC.GetIPAddress() != '') and (EPC.GetIPAddress() != 'none'):
 		CiTestObj.CheckFlexranCtrlInstallation()
+		EPC.SetMmeIPAddress()
 
 	#get the list of tests to be done
 	todo_tests=[]
@@ -3583,6 +3622,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re
 					continue
 				CiTestObj.testCase_id = id
 				HTML.SettestCase_id(CiTestObj.testCase_id)
+				EPC.SetTestCase_id(CiTestObj.testCase_id)
 				CiTestObj.desc = test.findtext('desc')
 				HTML.Setdesc(CiTestObj.desc)
 				action = test.findtext('class')
diff --git a/ci-scripts/ran.py b/ci-scripts/ran.py
index 350098e66ee20e74a20915f3f72d084742f5acf5..5b5add0adb5b968f8197e8bc91a283d7c32f9a7a 100644
--- a/ci-scripts/ran.py
+++ b/ci-scripts/ran.py
@@ -522,8 +522,8 @@ class RANManagement():
 		# Make a copy and adapt to EPC / eNB IP addresses
 		mySSH.command('cp ' + full_config_file + ' ' + ci_full_config_file, '\$', 5)
 		if self.epcObj is not None:
-			localEpcIpAddr = self.epcObj.GetIPAddress()
-			mySSH.command('sed -i -e \'s/CI_MME_IP_ADDR/' + localEpcIpAddr + '/\' ' + ci_full_config_file, '\$', 2);
+			localMmeIpAddr = self.epcObj.GetMmeIPAddress()
+			mySSH.command('sed -i -e \'s/CI_MME_IP_ADDR/' + localMmeIpAddr + '/\' ' + ci_full_config_file, '\$', 2);
 		mySSH.command('sed -i -e \'s/CI_ENB_IP_ADDR/' + lIpAddr + '/\' ' + ci_full_config_file, '\$', 2);
 		mySSH.command('sed -i -e \'s/CI_RCC_IP_ADDR/' + self.eNBIPAddress + '/\' ' + ci_full_config_file, '\$', 2);
 		mySSH.command('sed -i -e \'s/CI_RRU1_IP_ADDR/' + self.eNB1IPAddress + '/\' ' + ci_full_config_file, '\$', 2);
@@ -801,6 +801,7 @@ class RANManagement():
 		pdcpFailure = 0
 		ulschFailure = 0
 		ulschReceiveOK = 0
+		gnbRxTxWakeUpFailure = 0
 		cdrxActivationMessageCount = 0
 		dropNotEnoughRBs = 0
 		mbmsRequestMsg = 0
@@ -910,7 +911,10 @@ class RANManagement():
 			result = re.search('PDCP.*Out of Resources.*reason', str(line))
 			if result is not None:
 				pdcpFailure += 1
-			result = re.search('ULSCH in error in round', str(line))
+			result = re.search('could not wakeup gNB rxtx process', str(line))
+			if result is not None:
+				gnbRxTxWakeUpFailure += 1
+			result = re.search('ULSCH in error in round|ULSCH 0 in error', str(line))
 			if result is not None:
 				ulschFailure += 1
 			result = re.search('ULSCH received ok', str(line))
@@ -940,6 +944,10 @@ class RANManagement():
 				statMsg = nodeB_prefix + 'NB showed ' + str(ulschReceiveOK) + ' "ULSCH received ok" message(s)'
 				logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
 				htmleNBFailureMsg += statMsg + '\n'
+			if gnbRxTxWakeUpFailure > 0:
+				statMsg = nodeB_prefix + 'NB showed ' + str(gnbRxTxWakeUpFailure) + ' "could not wakeup gNB rxtx process" message(s)'
+				logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
+				htmleNBFailureMsg += statMsg + '\n'
 		if uciStatMsgCount > 0:
 			statMsg = nodeB_prefix + 'NB showed ' + str(uciStatMsgCount) + ' "uci->stat" message(s)'
 			logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
diff --git a/ci-scripts/reportBuildLocally.sh b/ci-scripts/reportBuildLocally.sh
index 54372ac6ba7842ec376136ef541f464d8707facf..44d200c3b6419b1c0fe354fdb33db882c9bcb1f2 100755
--- a/ci-scripts/reportBuildLocally.sh
+++ b/ci-scripts/reportBuildLocally.sh
@@ -53,7 +53,7 @@ function details_table {
     echo "        <th>Message</th>" >> $3
     echo "      </tr>" >> $3
 
-    LIST_MESSAGES=`egrep "error:|warning:" $2 | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto"`
+    LIST_MESSAGES=`egrep "error:|warning:" $2 | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto|disabling jobserver mode"`
     COMPLETE_MESSAGE="start"
     for MESSAGE in $LIST_MESSAGES
     do
@@ -146,7 +146,7 @@ function summary_table_row {
         else
             echo "        <td bgcolor = \"red\" >$NB_ERRORS</th>" >> ./build_results.html
         fi
-        NB_WARNINGS=`egrep "warning:" $2 | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto" | egrep -c "warning:"`
+        NB_WARNINGS=`egrep "warning:" $2 | egrep -v "jobserver unavailable|Clock skew detected.|flexran.proto|disabling jobserver mode" | egrep -c "warning:"`
         if [ $NB_WARNINGS -eq 0 ]
         then
             echo "        <td bgcolor = \"green\" >$NB_WARNINGS</th>" >> ./build_results.html
@@ -492,6 +492,77 @@ function report_build {
             awk '{print "      <tr><td>"$1"</td></tr>"}' ./oai_rules_result_list.txt >> ./build_results.html
             echo "   </table>" >> ./build_results.html
             echo "   </div>" >> ./build_results.html
+            echo "   <br>" >> ./build_results.html
+        fi
+        if [ -f ./header-files-w-incorrect-define.txt ]
+        then
+            NB_FILES_IN_ERROR=`wc -l ./header-files-w-incorrect-define.txt | sed -e "s@ .*@@"`
+            if [ $NB_FILES_IN_ERROR -eq 0 ]
+            then
+                echo "   <div class=\"alert alert-success\">" >> ./build_results.html
+                if [ $MR_TRIG -eq 1 ]; then echo "   <strong>No Issue for CIRCULAR DEPENDENCY PROTECTION in modified files</strong>" >> ./build_results.html; fi
+                if [ $PU_TRIG -eq 1 ]; then echo "   <strong>No Issue for CIRCULAR DEPENDENCY PROTECTION in the whole repository</strong>" >> ./build_results.html; fi
+                echo "   </div>" >> ./build_results.html
+            else
+                echo "   <div class=\"alert alert-warning\">" >> ./build_results.html
+                if [ $MR_TRIG -eq 1 ]; then echo "   <strong>${NB_FILES_IN_ERROR} modified files MAY NOT HAVE CIRCULAR DEPENDENCY PROTECTION</strong>" >> ./build_results.html; fi
+                if [ $PU_TRIG -eq 1 ]; then echo "   <strong>${NB_FILES_IN_ERROR} files in repository MAY NOT HAVE CIRCULAR DEPENDENCY PROTECTION in the whole repository</strong>" >> ./build_results.html; fi
+                echo "   </div>" >> ./build_results.html
+                echo "   <button data-toggle=\"collapse\" data-target=\"#oai-circular-details\">More details on circular dependency protection check</button>" >> ./build_results.html
+                echo "   <div id=\"oai-circular-details\" class=\"collapse\">" >> ./build_results.html
+                echo "   <table border = 1>" >> ./build_results.html
+                echo "      <tr>" >> ./build_results.html
+                echo "        <th bgcolor = \"lightcyan\" >Potential Issue</th>" >> ./build_results.html
+                echo "        <th bgcolor = \"lightcyan\" >Impacted File</th>" >> ./build_results.html
+                echo "        <th bgcolor = \"lightcyan\" >Incorrect Macro</th>" >> ./build_results.html
+                echo "      </tr>" >> ./build_results.html
+                awk '{if($0 ~/error in/){print "      <tr><td>error in declaration</td><td>"$4"</td><td>"$5"</td></tr>"};if($0 ~/files with same/){print "      <tr><td>files with same #define</td><td>"$5"</td><td>"$6"</td></tr>"}}' ./header-files-w-incorrect-define.txt >> ./build_results.html
+                echo "   </table>" >> ./build_results.html
+                echo "   </div>" >> ./build_results.html
+                echo "   <br>" >> ./build_results.html
+            fi
+        fi
+        if [ -f ./files-w-gnu-gpl-license-banner.txt ]
+        then
+            NB_FILES_IN_ERROR=`wc -l ./files-w-gnu-gpl-license-banner.txt | sed -e "s@ .*@@"`
+            if [ $NB_FILES_IN_ERROR -ne 0 ]
+            then
+                echo "   <div class=\"alert alert-danger\">" >> ./build_results.html
+                if [ $MR_TRIG -eq 1 ]; then echo "   <strong>${NB_FILES_IN_ERROR} modified files HAVE a GNU GPL license banner</strong>" >> ./build_results.html; fi
+                if [ $PU_TRIG -eq 1 ]; then echo "   <strong>${NB_FILES_IN_ERROR} files in repository HAVE a GNU GPL license banner</strong>" >> ./build_results.html; fi
+                echo "   </div>" >> ./build_results.html
+                echo "   <button data-toggle=\"collapse\" data-target=\"#oai-license-gpl\">More details on GNU GPL license banner issue</button>" >> ./build_results.html
+                echo "   <div id=\"oai-license-gpl\" class=\"collapse\">" >> ./build_results.html
+                echo "   <table border = 1>" >> ./build_results.html
+                echo "      <tr>" >> ./build_results.html
+                echo "        <th bgcolor = \"lightcyan\" >Filename</th>" >> ./build_results.html
+                echo "      </tr>" >> ./build_results.html
+                awk '{print "      <tr><td>"$1"</td></tr>"}' ./files-w-gnu-gpl-license-banner.txt >> ./build_results.html
+                echo "   </table>" >> ./build_results.html
+                echo "   </div>" >> ./build_results.html
+                echo "   <br>" >> ./build_results.html
+            fi
+        fi
+        if [ -f ./files-w-suspect-banner.txt ]
+        then
+            NB_FILES_IN_ERROR=`wc -l ./files-w-suspect-banner.txt | sed -e "s@ .*@@"`
+            if [ $NB_FILES_IN_ERROR -ne 0 ]
+            then
+                echo "   <div class=\"alert alert-warning\">" >> ./build_results.html
+                if [ $MR_TRIG -eq 1 ]; then echo "   <strong>${NB_FILES_IN_ERROR} modified files HAVE a suspect license banner</strong>" >> ./build_results.html; fi
+                if [ $PU_TRIG -eq 1 ]; then echo "   <strong>${NB_FILES_IN_ERROR} files in repository HAVE a suspect license banner</strong>" >> ./build_results.html; fi
+                echo "   </div>" >> ./build_results.html
+                echo "   <button data-toggle=\"collapse\" data-target=\"#oai-license-suspect\">More details on suspect banner files</button>" >> ./build_results.html
+                echo "   <div id=\"oai-license-suspect\" class=\"collapse\">" >> ./build_results.html
+                echo "   <table border = 1>" >> ./build_results.html
+                echo "      <tr>" >> ./build_results.html
+                echo "        <th bgcolor = \"lightcyan\" >Filename</th>" >> ./build_results.html
+                echo "      </tr>" >> ./build_results.html
+                awk '{print "      <tr><td>"$1"</td></tr>"}' ././files-w-suspect-banner.txt >> ./build_results.html
+                echo "   </table>" >> ./build_results.html
+                echo "   </div>" >> ./build_results.html
+                echo "   <br>" >> ./build_results.html
+            fi
         fi
     fi
 
diff --git a/ci-scripts/sshconnection.py b/ci-scripts/sshconnection.py
index 68a1d7836c78cf8a6b306736ee0d9685ae48a450..ba0f900f2940482589e3e9711c942031af88cd9a 100644
--- a/ci-scripts/sshconnection.py
+++ b/ci-scripts/sshconnection.py
@@ -52,15 +52,19 @@ class SSHConnection():
 		self.picocom_closure = True
 
 	def open(self, ipaddress, username, password):
+		extraSshOptions = ''
 		count = 0
 		connect_status = False
+		if ipaddress == '192.168.18.197':
+			extraSshOptions = ' -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
 		while count < 4:
-			self.ssh = pexpect.spawn('ssh', [username + '@' + ipaddress], timeout = 5)
+			self.ssh = pexpect.spawn('ssh', [username + '@' + ipaddress + extraSshOptions], timeout = 5)
 			self.sshresponse = self.ssh.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', 'Last login', pexpect.EOF, pexpect.TIMEOUT])
 			if self.sshresponse == 0:
 				self.ssh.sendline('yes')
-				self.ssh.expect('password:')
-				self.ssh.sendline(password)
+				self.sshresponse = self.ssh.expect(['password:', username + '@'])
+				if self.sshresponse == 0:
+					self.ssh.sendline(password)
 				self.sshresponse = self.ssh.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT])
 				if self.sshresponse == 0:
 					count = 10
diff --git a/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xml b/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xml
index a28a81d970ccc90bf1ccca42508e2ea5533c0a5e..41e746bc85d1745742a38acb09c560e754dcf030 100644
--- a/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xml
+++ b/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_no_flexran.xml
@@ -33,8 +33,8 @@
 
 	<testCase id="000001">
 		<class>IdleSleep</class>
-		<desc>Waiting for 35 seconds</desc>
-		<idle_sleep_time_in_sec>35</idle_sleep_time_in_sec>
+		<desc>Waiting for 55 seconds</desc>
+		<idle_sleep_time_in_sec>55</idle_sleep_time_in_sec>
 	</testCase>
 
 	<testCase id="000002">
diff --git a/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_w_flexran.xml b/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_w_flexran.xml
index 07cd8fbb304a92e50564d56109089c534ffb35dc..6ee9247ef34c5ae8366693105c6bbd51c6801412 100644
--- a/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_w_flexran.xml
+++ b/ci-scripts/xml_files/enb_usrp210_band7_test_05mhz_tm1_rrc_inactivity_w_flexran.xml
@@ -36,8 +36,8 @@
 
 	<testCase id="000001">
 		<class>IdleSleep</class>
-		<desc>Waiting for 45 seconds</desc>
-		<idle_sleep_time_in_sec>45</idle_sleep_time_in_sec>
+		<desc>Waiting for 55 seconds</desc>
+		<idle_sleep_time_in_sec>55</idle_sleep_time_in_sec>
 	</testCase>
 
 	<testCase id="000002">
diff --git a/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1.xml b/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1.xml
index 0196bf1ab6532d2a2e757abf93b25eb69a5306cc..ae348b6b259d94f44ac379d682079ccf8e355878 100644
--- a/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1.xml
+++ b/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1.xml
@@ -46,7 +46,7 @@
 	<testCase id="030102">
 		<class>Initialize_eNB</class>
 		<desc>Initialize eNB (FDD/Band7/5MHz)</desc>
-		<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf --eNBs.[0].rrc_inactivity_threshold 0 --RUs.[0].max_rxgain 120 --eNBs.[0].component_carriers.[0].pusch_p0_Nominal -90 --eNBs.[0].component_carriers.[0].pucch_p0_Nominal -96 --eNBs.[0].tracking_area_code 600 --eNBs.[0].plmn_list.[0].mnc 95 --THREAD_STRUCT.[0].parallel_config PARALLEL_RU_L1_TRX_SPLIT</Initialize_eNB_args>
+		<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf --eNBs.[0].rrc_inactivity_threshold 0 --RUs.[0].max_rxgain 120 --eNBs.[0].component_carriers.[0].pusch_p0_Nominal -90 --eNBs.[0].component_carriers.[0].pucch_p0_Nominal -96 --eNBs.[0].tracking_area_code 600 --eNBs.[0].plmn_list.[0].mnc 95</Initialize_eNB_args>
 	</testCase>
 
 	<testCase id="030201">
diff --git a/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1_nos1.xml b/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1_nos1.xml
index c2835d04615d93450eeaba6ef66d802665fa762a..b77c6273e6873a9f37cf3427b4a76bd998cdc49d 100644
--- a/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1_nos1.xml
+++ b/ci-scripts/xml_files/inria/enb_ue_usrp210_band7_test_05mhz_tm1_nos1.xml
@@ -52,7 +52,7 @@
 	<testCase id="030101">
 		<class>Initialize_eNB</class>
 		<desc>Initialize eNB (FDD/Band7/5MHz)</desc>
-		<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf --noS1 --eNBs.[0].rrc_inactivity_threshold 0 --RUs.[0].max_rxgain 120 --eNBs.[0].component_carriers.[0].pusch_p0_Nominal -90 --eNBs.[0].component_carriers.[0].pucch_p0_Nominal -96 --eNBs.[0].tracking_area_code 600 --eNBs.[0].plmn_list.[0].mnc 95 --THREAD_STRUCT.[0].parallel_config PARALLEL_RU_L1_TRX_SPLIT</Initialize_eNB_args>
+		<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf --noS1 --eNBs.[0].rrc_inactivity_threshold 0 --RUs.[0].max_rxgain 120 --eNBs.[0].component_carriers.[0].pusch_p0_Nominal -90 --eNBs.[0].component_carriers.[0].pucch_p0_Nominal -96 --eNBs.[0].tracking_area_code 600 --eNBs.[0].plmn_list.[0].mnc 95</Initialize_eNB_args>
 	</testCase>
 
 	<testCase id="030201">
diff --git a/ci-scripts/xml_files/inria/enb_usrp210_band7_test_05mhz_tm1.xml b/ci-scripts/xml_files/inria/enb_usrp210_band7_test_05mhz_tm1.xml
index 964550d872b46b7b2426902906495c8f310077d8..df41385f83899c751ba1e492a45fff139680c2e8 100644
--- a/ci-scripts/xml_files/inria/enb_usrp210_band7_test_05mhz_tm1.xml
+++ b/ci-scripts/xml_files/inria/enb_usrp210_band7_test_05mhz_tm1.xml
@@ -93,7 +93,7 @@
 	<testCase id="030103">
 		<class>Initialize_eNB</class>
 		<desc>Initialize eNB (FDD/Band7/5MHz)</desc>
-		<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf --eNBs.[0].rrc_inactivity_threshold 0 --RUs.[0].max_rxgain 120 --eNBs.[0].component_carriers.[0].pusch_p0_Nominal -90 --eNBs.[0].component_carriers.[0].pucch_p0_Nominal -96 --eNBs.[0].tracking_area_code 600 --eNBs.[0].plmn_list.[0].mnc 95 --THREAD_STRUCT.[0].parallel_config PARALLEL_RU_L1_TRX_SPLIT</Initialize_eNB_args>
+		<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf --eNBs.[0].rrc_inactivity_threshold 0 --RUs.[0].max_rxgain 120 --eNBs.[0].component_carriers.[0].pusch_p0_Nominal -90 --eNBs.[0].component_carriers.[0].pucch_p0_Nominal -96 --eNBs.[0].tracking_area_code 600 --eNBs.[0].plmn_list.[0].mnc 95</Initialize_eNB_args>
 	</testCase>
 
 	<testCase id="030201">
diff --git a/ci-scripts/xml_files/inria/enb_usrp210_band7_x2_ho_test_05Mhz_tm1.xml b/ci-scripts/xml_files/inria/enb_usrp210_band7_x2_ho_test_05Mhz_tm1.xml
index 8116b9dcdf316a0f36cd5bfc48122b165416c4ab..852f48c370e2b2a7455857d6c07250cada0030af 100644
--- a/ci-scripts/xml_files/inria/enb_usrp210_band7_x2_ho_test_05Mhz_tm1.xml
+++ b/ci-scripts/xml_files/inria/enb_usrp210_band7_x2_ho_test_05Mhz_tm1.xml
@@ -64,7 +64,7 @@
 	<testCase id="030104">
 		<class>Initialize_eNB</class>
 		<desc>Initialize eNB #0 (FDD/Band7/5MHz)</desc>
-		<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf --eNBs.[0].rrc_inactivity_threshold 0 --RUs.[0].max_rxgain 120 --eNBs.[0].component_carriers.[0].pusch_p0_Nominal -90 --eNBs.[0].component_carriers.[0].pucch_p0_Nominal -96 --eNBs.[0].tracking_area_code 600 --eNBs.[0].plmn_list.[0].mnc 95 --THREAD_STRUCT.[0].parallel_config PARALLEL_RU_L1_TRX_SPLIT --eNBs.[0].enable_measurement_reports yes --eNBs.[0].enable_x2 yes --eNBs.[0].nr_cellid 123456</Initialize_eNB_args>
+		<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf --eNBs.[0].rrc_inactivity_threshold 0 --RUs.[0].max_rxgain 120 --eNBs.[0].component_carriers.[0].pusch_p0_Nominal -90 --eNBs.[0].component_carriers.[0].pucch_p0_Nominal -96 --eNBs.[0].tracking_area_code 600 --eNBs.[0].plmn_list.[0].mnc 95 --eNBs.[0].enable_measurement_reports yes --eNBs.[0].enable_x2 yes --eNBs.[0].nr_cellid 123456</Initialize_eNB_args>
 		<eNB_instance>0</eNB_instance>
 		<eNB_serverId>0</eNB_serverId>
 	</testCase>
@@ -72,11 +72,7 @@
 	<testCase id="030105">
 		<class>Initialize_eNB</class>
 		<desc>Initialize eNB #1 (FDD/Band7/5MHz)</desc>
-<<<<<<< HEAD
-		<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.usrpb210.conf --eNBs.[0].rrc_inactivity_threshold 0 --RUs.[0].max_rxgain 120 --eNBs.[0].component_carriers.[0].pusch_p0_Nominal -90 --eNBs.[0].component_carriers.[0].pucch_p0_Nominal -96 --eNBs.[0].tracking_area_code 600 --eNBs.[0].plmn_list.[0].mnc 95 --THREAD_STRUCT.[0].parallel_config PARALLEL_RU_L1_TRX_SPLIT --eNBs.[0].enable_measurement_reports yes --eNBs.[0].enable_x2 yes --eNBs.[0].target_enb_x2_ip_address.[0].ipv4 CI_RCC_IP_ADDR --eNBs.[0].target_enb_x2_ip_address.[0].preference ipv4 --eNBs.[0].eNB_ID 0xe01 --eNBs.[0].component_carriers.[0].Nid_cell 1 --eNBs.[0].nr_cellid 98765</Initialize_eNB_args>
-=======
-		<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.slave.usrpb210.conf --eNBs.[0].rrc_inactivity_threshold 0 --RUs.[0].max_rxgain 120 --eNBs.[0].component_carriers.[0].pusch_p0_Nominal -90 --eNBs.[0].component_carriers.[0].pucch_p0_Nominal -96 --eNBs.[0].tracking_area_code 600 --eNBs.[0].plmn_list.[0].mnc 95 --THREAD_STRUCT.[0].parallel_config PARALLEL_RU_L1_TRX_SPLIT --eNBs.[0].enable_measurement_reports yes --eNBs.[0].enable_x2 yes --eNBs.[0].nr_cellid 98765</Initialize_eNB_args>
->>>>>>> origin/develop_inria_ci_deployment
+		<Initialize_eNB_args>-O ci-scripts/conf_files/enb.band7.tm1.25PRB.slave.usrpb210.conf --eNBs.[0].rrc_inactivity_threshold 0 --RUs.[0].max_rxgain 120 --eNBs.[0].component_carriers.[0].pusch_p0_Nominal -90 --eNBs.[0].component_carriers.[0].pucch_p0_Nominal -96 --eNBs.[0].tracking_area_code 600 --eNBs.[0].plmn_list.[0].mnc 95 --eNBs.[0].enable_measurement_reports yes --eNBs.[0].enable_x2 yes --eNBs.[0].nr_cellid 98765</Initialize_eNB_args>
 		<eNB_instance>1</eNB_instance>
 		<eNB_serverId>1</eNB_serverId>
 	</testCase>
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 06d93772e261eadae3f89c9e8517598a844acef2..4f91c8295bb5a7d518abf8179f64164721e68f37 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -167,7 +167,7 @@ endif()
 
 #
 set(CMAKE_C_FLAGS
-  "${CMAKE_C_FLAGS} ${C_FLAGS_PROCESSOR} -std=gnu99 -Wall -Wstrict-prototypes -fno-strict-aliasing -rdynamic -funroll-loops -Wno-packed-bitfield-compat -fPIC")
+  "${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!
 set(MKVER "'MAKE_VERSION(a,b,c)=((a)*256+(b)*16+c)'")
 set(CMAKE_C_FLAGS
@@ -2239,26 +2239,28 @@ add_library(LFDS7
   ${lfds7_queue} ${lfds7_ring} ${lfds7_qbss} ${lfds7_stack} ${lfds7_freelist} ${lfds7_btree} ${lfds7_hash} ${lfds7_ordered_list} ${lfds7_unordered_list} ${lfds7_misc}
 )
 
+add_library(SIMU_COMMON
+  ${OPENAIR1_DIR}/SIMULATION/TOOLS/random_channel.c
+  ${OPENAIR1_DIR}/SIMULATION/TOOLS/rangen_double.c
+  )
+
 # Simulation library
 ##########################
 set (SIMUSRC 
-${OPENAIR1_DIR}/SIMULATION/TOOLS/random_channel.c
-${OPENAIR1_DIR}/SIMULATION/TOOLS/rangen_double.c
-${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
-${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_channel.c
-${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_tv_channel.c
-${OPENAIR1_DIR}/SIMULATION/TOOLS/abstraction.c
-${OPENAIR1_DIR}/SIMULATION/TOOLS/channel_sim.c
-${OPENAIR1_DIR}/SIMULATION/RF/rf.c
-${OPENAIR1_DIR}/SIMULATION/RF/dac.c
-${OPENAIR1_DIR}/SIMULATION/RF/adc.c
-${OPENAIR_DIR}/targets/ARCH/rfsimulator/apply_channelmod.c
-#${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
-)
+  ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
+  ${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_channel.c
+  ${OPENAIR1_DIR}/SIMULATION/TOOLS/multipath_tv_channel.c
+  ${OPENAIR1_DIR}/SIMULATION/TOOLS/abstraction.c
+  ${OPENAIR1_DIR}/SIMULATION/TOOLS/channel_sim.c
+  ${OPENAIR1_DIR}/SIMULATION/RF/rf.c
+  ${OPENAIR1_DIR}/SIMULATION/RF/dac.c
+  ${OPENAIR1_DIR}/SIMULATION/RF/adc.c
+  #${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
+  )
 
 # Simulation library
 ##########################
-add_library( SIMU SHARED ${SIMUSRC} )
+add_library(SIMU SHARED ${SIMUSRC} )
 
 add_library(SIMU_ETH
 ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
@@ -2416,9 +2418,11 @@ target_link_libraries(gnbscope ${XFORMS_LIBRARIES})
 
 
 add_library(rfsimulator MODULE 
-	${OPENAIR_TARGETS}/ARCH/rfsimulator/simulator.c
+  ${OPENAIR_TARGETS}/ARCH/rfsimulator/simulator.c
+  ${OPENAIR_TARGETS}/ARCH/rfsimulator/apply_channelmod.c
+  ${OPENAIR_TARGETS}/ARCH/rfsimulator/new_channel_sim.c
 	)
-target_link_libraries(rfsimulator SIMU ${ATLAS_LIBRARIES})
+target_link_libraries(rfsimulator SIMU_COMMON ${ATLAS_LIBRARIES})
 
 add_library(oai_iqplayer MODULE 
 	${OPENAIR_TARGETS}/ARCH/iqplayer/iqplayer_lib.c
@@ -2440,9 +2444,9 @@ endif (${T_TRACER})
 #This rule and the following deal with it.
 add_custom_command (
   OUTPUT ${OPENAIR_DIR}/common/utils/T/T_IDs.h
-  COMMAND $(MAKE) clean
-  COMMAND $(MAKE)
-  COMMAND $(MAKE) check_vcd
+  COMMAND make clean
+  COMMAND make -j2
+  COMMAND make check_vcd
   WORKING_DIRECTORY ${OPENAIR_DIR}/common/utils/T
   DEPENDS ${OPENAIR_DIR}/common/utils/T/T_messages.txt
           ${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.c
@@ -2564,7 +2568,7 @@ add_dependencies(ocp-enb rrc_flag s1ap_flag x2_flag oai_iqplayer)
 target_link_libraries (ocp-enb
   -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 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 LFDS7
+  PHY_COMMON PHY PHY_RU LFDS L2 L2_LTE NFAPI_COMMON_LIB NFAPI_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}
   -Wl,--end-group z dl)
 target_link_libraries (ocp-enb ${LIBXML2_LIBRARIES} pthread m ${CONFIG_LIBRARIES} rt crypt ${CRYPTO_LIBRARIES} ${OPENSSL_LIBRARIES} ${NETTLE_LIBRARIES} sctp ${PROTOBUF_LIB}  ${CMAKE_DL_LIBS} ${LIBYAML_LIBRARIES} ${LIB_LMS_LIBRARIES} ${T_LIB})
@@ -2634,7 +2638,7 @@ target_link_libraries (lte-uesoftmodem
   -Wl,--start-group
   RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP F1AP_LIB
   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 NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
+  PHY_UE PHY_RU LFDS L2_UE L2_LTE LFDS7 SIMU_COMMON SIMU NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
   ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${ATLAS_LIBRARIES}
   -Wl,--end-group z dl)
 
@@ -2729,29 +2733,6 @@ target_link_libraries (nr-uesoftmodem ${T_LIB})
 
 add_dependencies( nr-uesoftmodem ldpc_orig ldpc_optim ldpc_optim8seg ldpc )
 
-# USIM process
-#################
-#add_executable(usim
-#  ${OPENAIR3_DIR}/NAS/TOOLS/usim_data.c
-#  ${OPENAIR3_DIR}/NAS/USER/API/USIM/usim_api.c
-#  ${OPENAIR3_DIR}/NAS/USER/API/USIM/aka_functions.c
-#  ${OPENAIR3_DIR}/NAS/COMMON/UTIL/memory.c
-#  ${OPENAIR3_DIR}/NAS/COMMON/UTIL/nas_log.c
-#  ${OPENAIR3_DIR}/NAS/COMMON/UTIL/OctetString.c
-#  ${OPENAIR3_DIR}/NAS/COMMON/UTIL/TLVEncoder.c
-#  )
-#target_link_libraries (usim ${NAS_LIB} UTIL ${ITTI_LIB} LFDS pthread rt nettle crypto m)
-
-# ???
-#####################
-#add_executable(nvram
-#  ${OPENAIR3_DIR}/NAS/TOOLS/ue_data.c
-#  ${OPENAIR3_DIR}/NAS/COMMON/UTIL/memory.c
-#  ${OPENAIR3_DIR}/NAS/COMMON/UTIL/nas_log.c
-#  )
-#target_link_libraries (nvram LIB_NAS_UE UTIL ${ITTI_LIB} LFDS pthread rt nettle crypto m)
-
-
 ###################################"
 # Addexecutables for tests
 ####################################
@@ -2768,7 +2749,7 @@ add_executable(dlsim_tm4
   ${T_SOURCE}
   )
 target_link_libraries (dlsim_tm4
-  -Wl,--start-group 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_LIB} -Wl,--end-group
   pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES} ${T_LIB}
   )
 
@@ -2781,7 +2762,7 @@ add_executable(polartest
   ${SHLIB_LOADER_SOURCES}
   )
 target_link_libraries(polartest
-  -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_COMMON PHY_NR_UE CONFIG_LIB -Wl,--end-group
+  -Wl,--start-group UTIL SIMU_COMMON  SIMU PHY_COMMON PHY_NR PHY_NR_COMMON PHY_NR_UE CONFIG_LIB -Wl,--end-group
   m pthread ${ATLAS_LIBRARIES} dl
   )
 
@@ -2796,7 +2777,7 @@ add_executable(smallblocktest
 
 
 target_link_libraries(smallblocktest
-  -Wl,--start-group UTIL SIMU PHY_NR PHY_COMMON PHY_NR_COMMON CONFIG_LIB -Wl,--end-group
+  -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_NR PHY_COMMON PHY_NR_COMMON CONFIG_LIB -Wl,--end-group
   m pthread ${ATLAS_LIBRARIES} dl
   )
 
@@ -2809,7 +2790,7 @@ add_executable(ldpctest
 add_dependencies( ldpctest ldpc_orig ldpc_optim ldpc_optim8seg ldpc ) 
 
 target_link_libraries(ldpctest
-  -Wl,--start-group UTIL SIMU PHY_NR PHY_COMMON PHY_NR_COMMON CONFIG_LIB -Wl,--end-group
+  -Wl,--start-group UTIL SIMU_COMMON  SIMU PHY_NR PHY_COMMON PHY_NR_COMMON CONFIG_LIB -Wl,--end-group
   m pthread ${ATLAS_LIBRARIES} dl
   )
 
@@ -2821,7 +2802,7 @@ add_executable(nr_dlschsim
   ${SHLIB_LOADER_SOURCES}
   )
 target_link_libraries(nr_dlschsim 
-  -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
+  -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
   )
 
@@ -2833,7 +2814,7 @@ add_executable(nr_pbchsim
   ${SHLIB_LOADER_SOURCES}
   )
 target_link_libraries(nr_pbchsim
-  -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
+  -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
   )
 
@@ -2848,7 +2829,7 @@ add_executable(nr_pucchsim
   ${SHLIB_LOADER_SOURCES}
   )
 target_link_libraries(nr_pucchsim
-  -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
+  -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
   )
 
@@ -2862,7 +2843,7 @@ add_executable(nr_dlsim
   ${SHLIB_LOADER_SOURCES}
   )   
 target_link_libraries(nr_dlsim
-  -Wl,--start-group UTIL 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_NR -Wl,--end-group
+  -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_NR -Wl,--end-group
   m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl
   )
 target_compile_definitions(nr_dlsim PUBLIC -DPHYSICAL_SIMULATOR)
@@ -2876,7 +2857,7 @@ add_executable(nr_prachsim
   ${T_SOURCE}
   ${SHLIB_LOADER_SOURCES})
 target_link_libraries(nr_prachsim  
-   -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_RU PHY_NR_UE MAC_NR_COMMON SCHED_NR_LIB SCHED_NR_UE_LIB RRC_LIB NR_RRC_LIB L2_NR CONFIG_LIB -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl)
+   -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 RRC_LIB NR_RRC_LIB L2_NR CONFIG_LIB -Wl,--end-group m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl)
 
 add_executable(nr_ulschsim
   ${OPENAIR1_DIR}/SIMULATION/NR_PHY/ulschsim.c
@@ -2886,7 +2867,7 @@ add_executable(nr_ulschsim
   ${SHLIB_LOADER_SOURCES}
   )
 target_link_libraries(nr_ulschsim
-  -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB CONFIG_LIB MAC_NR_COMMON -Wl,--end-group
+  -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
   )
 
@@ -2900,7 +2881,7 @@ add_executable(nr_ulsim
   ${SHLIB_LOADER_SOURCES}
   )
 target_link_libraries(nr_ulsim
-  -Wl,--start-group UTIL SIMU PHY_COMMON PHY_NR PHY_NR_COMMON 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_NR -Wl,--end-group
+  -Wl,--start-group UTIL SIMU_COMMON SIMU PHY_COMMON PHY_NR PHY_NR_COMMON 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_NR -Wl,--end-group
   m pthread ${ATLAS_LIBRARIES} ${T_LIB} ${ITTI_LIB} dl
   )
 target_compile_definitions(nr_ulsim PUBLIC -DPHYSICAL_SIMULATOR)
@@ -2919,7 +2900,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 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_LIB} LFDS7 -Wl,--end-group
     pthread m rt ${CONFIG_LIB} ${ATLAS_LIBRARIES}  ${XFORMS_LIBRARIES} ${T_LIB} dl
     )
    
@@ -2999,8 +2980,8 @@ if (${T_TRACER})
         NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
         PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU PHY_MEX
         L2 L2_LTE L2_NR L2_UE NR_L2_UE MAC_NR_COMMON MAC_NR MAC_UE_NR
-        CN_UTILS GTPV1U SCTP_CLIENT MME_APP UDP LIB_NAS_UE NB_IoT LFDS LFDS7 SIMU SIMU_ETH OPENAIR0_LIB
-        ldpc_orig ldpc_optim ldpc_optim8seg ldpc)
+        CN_UTILS GTPV1U SCTP_CLIENT MME_APP UDP LIB_NAS_UE NB_IoT LFDS LFDS7 SIMU_COMMON SIMU SIMU_ETH OPENAIR0_LIB
+        ldpc_orig ldpc_optim ldpc_optim8seg ldpc PROTO_AGENT dfts)
     if (TARGET ${i})
       add_dependencies(${i} generate_T)
     endif()
@@ -3043,7 +3024,7 @@ function(make_driver name dir)
   endforeach()
   CONFIGURE_FILE(${OPENAIR_CMAKE}/tools/Kbuild.cmake ${OPENAIR_BIN_DIR}/${name}/Kbuild)
   add_custom_command(OUTPUT ${name}.ko
-    COMMAND $(MAKE) -C ${module_build_path} M=${OPENAIR_BIN_DIR}/${name}
+    COMMAND make -j2 -C ${module_build_path} M=${OPENAIR_BIN_DIR}/${name}
     WORKING_DIRECTORY ${OPENAIR_BIN_DIR}/${name}
     COMMENT "building ${module}.ko"
     VERBATIM
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 965dfaea3a0d143abb56ad35f26ca01689a62e56..20d965c71cbb371727af75253589595f5564f511 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -406,8 +406,12 @@ function main() {
             shift 1;;
         -k | --skip-shared-libraries)
             SKIP_SHARED_LIB_FLAG="True"
-            echo_info "Skipping build of shared libraries, rfsimulator, basicsimulator and transport protocol libraries"
+            echo_info "Skipping build of shared libraries, rfsimulator and transport protocol libraries"
             shift;;
+    --ninja)
+        CMAKE_CMD="$CMAKE_CMD -GNinja"
+	MAKE_CMD=ninja
+	shift;;
         -h | --help)
             print_help
             exit 1;;
@@ -892,7 +896,7 @@ function main() {
               $build_dir rfsimulator \
               librfsimulator.so $dbin/librfsimulator.so.$REL
 
-          echo_info "Compiling basicsimulator"
+          echo_info "Compiling tcp_bridge_oai"
           compilations \
               $build_dir tcp_bridge_oai \
               libtcp_bridge_oai.so $dbin/libtcp_bridge_oai.so.$REL
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index 8e4ae59a7faf90c5c10e70037ff2d52913b27491..5a59b9a8cc48c19289cf26b487c22d43d796157b 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -150,7 +150,9 @@ clean_all_files() {
  set_openair_env
  dir=$OPENAIR_DIR/cmake_targets
  rm -rf $dir/log $OPENAIR_DIR/targets/bin/*
- rm -rf $dir/ran_build $dir/lte-simulators/build
+ rm -rf $dir/ran_build $dir/ran_build_noLOG
+ rm -rf $dir/lte-simulators/build 
+ rm -rf $dir/phy_simulators/build $dir/nas_sim_tools/build 
  rm -rf $dir/oaisim_build_oai/build $dir/oaisim_build_oai/CMakeLists.txt
  rm -rf $dir/autotests/bin $dir/autotests/log $dir/autotests/*/build
 }
@@ -167,7 +169,7 @@ check_warnings() {
   #we look for 'warning:' in the compilation log file
   #this is how gcc starts a warning
   #this is not perfect, we may get false positive
-  warning_count=`grep "warning:" "$1"|wc -l`
+  warning_count=`grep "warning:" "$1" | egrep -v "jobserver unavailable|disabling jobserver mode" | wc -l`
   if [ $warning_count -gt 0 ]; then
     echo_error "WARNING: $warning_count warnings. See $1"
   fi
@@ -177,17 +179,20 @@ compilations() {
   cd $OPENAIR_DIR/cmake_targets/$1/build
   set +e
   {
-    rm -f $3
     if [ "$BUILD_COVERITY_SCAN" == "1" ]; then
         COV_SCAN_PREFIX="cov-build --dir cov-int"
     else
         COV_SCAN_PREFIX=""
     fi
+    if [ "$MAKE_CMD" != "" ]; then
+       $MAKE_CMD $2
+    else 
     if [ "$VERBOSE_COMPILE" == "1" ]; then
        $COV_SCAN_PREFIX make -j`nproc` $2 VERBOSE=$VERBOSE_COMPILE
     else
        $COV_SCAN_PREFIX make -j`nproc` $2
     fi
+    fi
 
   } > $dlog/$2.$REL.txt 2>&1
   set -e
@@ -619,6 +624,7 @@ check_install_oai_software() {
 	build-essential \
 	cmake \
 	cmake-curses-gui  \
+        ninja-build \
 	doxygen \
 	doxygen-gui \
 	texlive-latex-base \
diff --git a/common/utils/LOG/vcd_signal_dumper.c b/common/utils/LOG/vcd_signal_dumper.c
index 0043eb32380892cda7846c59f1b4f19a7eeff79f..79db7f1c0ebe4c137daf3dc3571eec12297583a3 100644
--- a/common/utils/LOG/vcd_signal_dumper.c
+++ b/common/utils/LOG/vcd_signal_dumper.c
@@ -248,7 +248,8 @@ const char* eurecomVariablesNames[] = {
   "slot_number_TX1_gNB",
   "slot_number_RX0_gNB",
   "slot_number_RX1_gNB",
-  "ru_tx_ofdm_mask"
+  "ru_tx_ofdm_mask",
+  "usrp_send_return"
 };
 
 const char* eurecomFunctionsNames[] = {
@@ -282,6 +283,8 @@ const char* eurecomFunctionsNames[] = {
   "lock_mutex_ru",
   "lock_mutex_ru1",
   "lock_mutex_ru2",
+  /* uhd signals */
+  "trx_write_thread",
   /* simulation signals */
   "do_DL_sig",
   "do_UL_sig",
diff --git a/common/utils/LOG/vcd_signal_dumper.h b/common/utils/LOG/vcd_signal_dumper.h
index 20588bb8286f42ca8367c5ab5be486b79c3e87ee..88655977bba23612b692aed8634c825bf0c6127a 100644
--- a/common/utils/LOG/vcd_signal_dumper.h
+++ b/common/utils/LOG/vcd_signal_dumper.h
@@ -226,6 +226,7 @@ typedef enum {
   VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_RX0_GNB,
   VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_RX1_GNB,
   VCD_SIGNAL_DUMPER_VARIABLES_RU_TX_OFDM_MASK,
+  VCD_SIGNAL_DUMPER_VARIABLES_USRP_SEND_RETURN,
 
 
   VCD_SIGNAL_DUMPER_VARIABLES_END
@@ -262,6 +263,8 @@ typedef enum {
   VCD_SIGNAL_DUMPER_FUNCTIONS_LOCK_MUTEX_RU,
   VCD_SIGNAL_DUMPER_FUNCTIONS_LOCK_MUTEX_RU1,
   VCD_SIGNAL_DUMPER_FUNCTIONS_LOCK_MUTEX_RU2,
+  /* uhd signals */
+  VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_THREAD,
   /* SIMULATION signals */ 
   VCD_SIGNAL_DUMPER_FUNCTIONS_SIM_DO_DL_SIGNAL,
   VCD_SIGNAL_DUMPER_FUNCTIONS_SIM_DO_UL_SIGNAL,
diff --git a/common/utils/T/T_defs.h b/common/utils/T/T_defs.h
index 4cb4bf2bbaf8814ffaa17468037258b343da2e33..2221dbbcac9d2aa827d6790051493ff206cae80e 100644
--- a/common/utils/T/T_defs.h
+++ b/common/utils/T/T_defs.h
@@ -73,10 +73,10 @@ typedef struct {
 } T_cache_t;
 
 /* number of VCD functions (to be kept up to date! see in T_messages.txt) */
-#define VCD_NUM_FUNCTIONS (248)
+#define VCD_NUM_FUNCTIONS (249)
 
 /* number of VCD variables (to be kept up to date! see in T_messages.txt) */
-#define VCD_NUM_VARIABLES (186)
+#define VCD_NUM_VARIABLES (187)
 
 /* first VCD function (to be kept up to date! see in T_messages.txt) */
 #define VCD_FIRST_FUNCTION    ((uintptr_t)T_VCD_FUNCTION_RT_SLEEP)
diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt
index f8b746669c835f26982eb3ca2caef96a13b6bd1d..383851883468afcae2a75da17abc5880111e0c5f 100644
--- a/common/utils/T/T_messages.txt
+++ b/common/utils/T/T_messages.txt
@@ -2138,6 +2138,11 @@ ID = VCD_VARIABLE_RU_TX_OFDM_MASK
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
     VCD_NAME = ru_tx_ofdm_mask
+ID = VCD_VARIABLE_USRP_SEND_RETURN
+    DESC = VCD variable USRP_SEND_RETURN
+    GROUP = ALL:VCD:ENB:VCD_VARIABLE
+    FORMAT = ulong,value
+    VCD_NAME = usrp_send_return
 
 #functions
 
@@ -2286,6 +2291,11 @@ ID = VCD_FUNCTION_LOCK_MUTEX_RU2
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
     VCD_NAME = lock_mutex_ru2
+ID = VCD_FUNCTION_TRX_WRITE_THREAD
+    DESC = VCD function TRX_WRITE_THREAD
+    GROUP = ALL:VCD:ENB:VCD_FUNCTION
+    FORMAT = int,value
+    VCD_NAME = trx_write_thread
 ID = VCD_FUNCTION_SIM_DO_DL_SIGNAL
     DESC = VCD function SIM_DO_DL_SIGNAL
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
diff --git a/common/utils/T/tracer/config.h b/common/utils/T/tracer/config.h
index 07290c71a35c5605596ff3770a34db40ce5dbc0a..765b1261334ecb75dcec10d72d76f89ee93eb799 100644
--- a/common/utils/T/tracer/config.h
+++ b/common/utils/T/tracer/config.h
@@ -1,5 +1,5 @@
-#ifndef _CONFIG_H_
-#define _CONFIG_H_
+#ifndef __COMMON_UTILS_T_TRACER_CONFIG__H__
+#define __COMMON_UTILS_T_TRACER_CONFIG__H__
 
 void clear_remote_config(void);
 void append_received_config_chunk(char *buf, int length);
@@ -7,4 +7,4 @@ void load_config_file(char *filename);
 void verify_config(void);
 void get_local_config(char **txt, int *len);
 
-#endif /* _CONFIG_H_ */
+#endif /* __COMMON_UTILS_T_TRACER_CONFIG__H__ */
diff --git a/common/utils/T/tracer/packet-mac-lte.h b/common/utils/T/tracer/packet-mac-lte.h
index 1bc6df632b7e07810ca1f2c3c87e98e2d97c7d91..54e6d1a09bbf13a90800fa4778cd3e54661a99f4 100644
--- a/common/utils/T/tracer/packet-mac-lte.h
+++ b/common/utils/T/tracer/packet-mac-lte.h
@@ -33,6 +33,9 @@
  * SUCH DAMAGE
  */
 
+#ifndef __COMMON_UTILS_T_TRACER_PACKET_MAC_LTE__H__
+#define __COMMON_UTILS_T_TRACER_PACKET_MAC_LTE__H__
+
 //#include "ws_symbol_export.h"
 
 /* radioType */
@@ -139,3 +142,4 @@
    continues until the end of the frame) */
 #define MAC_LTE_PAYLOAD_TAG 0x01
 
+#endif
diff --git a/common/utils/assertions.h b/common/utils/assertions.h
index 97f186627488de5f14c5660a4c40884f157876ec..48d8df401cec155027bec18dacc056ef3f70d7fe 100644
--- a/common/utils/assertions.h
+++ b/common/utils/assertions.h
@@ -19,6 +19,9 @@
  *      contact@openairinterface.org
  */
 
+#ifndef __COMMON_UTILS_ASSERTIONS__H__
+#define __COMMON_UTILS_ASSERTIONS__H__
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <inttypes.h>
@@ -30,9 +33,6 @@
 # include "backtrace.h"
 #endif
 
-#ifndef ASSERTIONS_H_
-#define ASSERTIONS_H_
-
 void output_log_mem(void);
 #define _Assert_Exit_                           \
     fprintf(stderr, "\nExiting execution\n");   \
@@ -83,4 +83,4 @@ do {                                                            \
     }                                                           \
 } while(0)
 
-#endif /* ASSERTIONS_H_ */
+#endif /* __COMMON_UTILS_ASSERTIONS__H__ */
diff --git a/common/utils/itti_analyzer/common/queue.h b/common/utils/itti_analyzer/common/queue.h
deleted file mode 100644
index 294d48511086b20eb321e07641eb0599db4b75da..0000000000000000000000000000000000000000
--- a/common/utils/itti_analyzer/common/queue.h
+++ /dev/null
@@ -1,592 +0,0 @@
-/*
- * Copyright (c) 1991, 1993
- *	The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. 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.
- * 3. Neither the name of the University 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 REGENTS 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 REGENTS 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.
- *
- *	@(#)queue.h	8.5 (Berkeley) 8/20/94
- */
-
-#ifndef	_SYS_QUEUE_H_
-#define	_SYS_QUEUE_H_
-
-/*
- * This file defines five types of data structures: singly-linked lists,
- * lists, simple queues, tail queues, and circular queues.
- *
- * A singly-linked list is headed by a single forward pointer. The
- * elements are singly linked for minimum space and pointer manipulation
- * overhead at the expense of O(n) removal for arbitrary elements. New
- * elements can be added to the list after an existing element or at the
- * head of the list.  Elements being removed from the head of the list
- * should use the explicit macro for this purpose for optimum
- * efficiency. A singly-linked list may only be traversed in the forward
- * direction.  Singly-linked lists are ideal for applications with large
- * datasets and few or no removals or for implementing a LIFO queue.
- *
- * A list is headed by a single forward pointer (or an array of forward
- * pointers for a hash table header). The elements are doubly linked
- * so that an arbitrary element can be removed without a need to
- * traverse the list. New elements can be added to the list before
- * or after an existing element or at the head of the list. A list
- * may only be traversed in the forward direction.
- *
- * A simple queue is headed by a pair of pointers, one the head of the
- * list and the other to the tail of the list. The elements are singly
- * linked to save space, so elements can only be removed from the
- * head of the list. New elements can be added to the list after
- * an existing element, at the head of the list, or at the end of the
- * list. A simple queue may only be traversed in the forward direction.
- *
- * A tail queue is headed by a pair of pointers, one to the head of the
- * list and the other to the tail of the list. The elements are doubly
- * linked so that an arbitrary element can be removed without a need to
- * traverse the list. New elements can be added to the list before or
- * after an existing element, at the head of the list, or at the end of
- * the list. A tail queue may be traversed in either direction.
- *
- * A circle queue is headed by a pair of pointers, one to the head of the
- * list and the other to the tail of the list. The elements are doubly
- * linked so that an arbitrary element can be removed without a need to
- * traverse the list. New elements can be added to the list before or after
- * an existing element, at the head of the list, or at the end of the list.
- * A circle queue may be traversed in either direction, but has a more
- * complex end of list detection.
- *
- * For details on the use of these macros, see the queue(3) manual page.
- *                      SLIST   LIST    STAILQ  TAILQ   CIRCLEQ
- * _HEAD                +       +       +       +       +
- * _HEAD_INITIALIZER    +       +       +       +       +
- * _ENTRY               +       +       +       +       +
- * _INIT                +       +       +       +       +
- * _EMPTY               +       +       +       +       +
- * _FIRST               +       +       +       +       +
- * _NEXT                +       +       +       +       +
- * _PREV                -       -       -       +       +
- * _LAST                -       -       +       +       +
- * _FOREACH             +       +       +       +       +
- * _FOREACH_REVERSE     -       -       -       +       +
- * _INSERT_HEAD         +       +       +       +       +
- * _INSERT_BEFORE       -       +       -       +       +
- * _INSERT_AFTER        +       +       +       +       +
- * _INSERT_TAIL         -       -       +       +       +
- * _REMOVE_HEAD         +       -       +       -       -
- * _REMOVE              +       +       +       +       +
- */
-
-/*
- * List definitions.
- */
-#define	LIST_HEAD(name, type)						\
-struct name {								\
-	struct type *lh_first;	/* first element */			\
-}
-
-#define	LIST_HEAD_INITIALIZER(head)					\
-	{ NULL }
-
-#define	LIST_ENTRY(type)						\
-struct {								\
-	struct type *le_next;	/* next element */			\
-	struct type **le_prev;	/* address of previous next element */	\
-}
-
-/*
- * List functions.
- */
-#define	LIST_INIT(head) do {						\
-	(head)->lh_first = NULL;					\
-} while (/*CONSTCOND*/0)
-
-#define	LIST_INSERT_AFTER(listelm, elm, field) do {			\
-	if (((elm)->field.le_next = (listelm)->field.le_next) != NULL)	\
-		(listelm)->field.le_next->field.le_prev =		\
-		    &(elm)->field.le_next;				\
-	(listelm)->field.le_next = (elm);				\
-	(elm)->field.le_prev = &(listelm)->field.le_next;		\
-} while (/*CONSTCOND*/0)
-
-#define	LIST_INSERT_BEFORE(listelm, elm, field) do {			\
-	(elm)->field.le_prev = (listelm)->field.le_prev;		\
-	(elm)->field.le_next = (listelm);				\
-	*(listelm)->field.le_prev = (elm);				\
-	(listelm)->field.le_prev = &(elm)->field.le_next;		\
-} while (/*CONSTCOND*/0)
-
-#define	LIST_INSERT_HEAD(head, elm, field) do {				\
-	if (((elm)->field.le_next = (head)->lh_first) != NULL)		\
-		(head)->lh_first->field.le_prev = &(elm)->field.le_next;\
-	(head)->lh_first = (elm);					\
-	(elm)->field.le_prev = &(head)->lh_first;			\
-} while (/*CONSTCOND*/0)
-
-#define	LIST_REMOVE(elm, field) do {					\
-	if ((elm)->field.le_next != NULL)				\
-		(elm)->field.le_next->field.le_prev = 			\
-		    (elm)->field.le_prev;				\
-	*(elm)->field.le_prev = (elm)->field.le_next;			\
-} while (/*CONSTCOND*/0)
-
-#define	LIST_FOREACH(var, head, field)					\
-	for ((var) = ((head)->lh_first);				\
-		(var);							\
-		(var) = ((var)->field.le_next))
-
-/*
- * List access methods.
- */
-#define	LIST_EMPTY(head)		((head)->lh_first == NULL)
-#define	LIST_FIRST(head)		((head)->lh_first)
-#define	LIST_NEXT(elm, field)		((elm)->field.le_next)
-
-
-/*
- * Singly-linked List definitions.
- */
-#define	SLIST_HEAD(name, type)						\
-struct name {								\
-	struct type *slh_first;	/* first element */			\
-}
-
-#define	SLIST_HEAD_INITIALIZER(head)					\
-	{ NULL }
-
-#define	SLIST_ENTRY(type)						\
-struct {								\
-	struct type *sle_next;	/* next element */			\
-}
-
-/*
- * Singly-linked List functions.
- */
-#define	SLIST_INIT(head) do {						\
-	(head)->slh_first = NULL;					\
-} while (/*CONSTCOND*/0)
-
-#define	SLIST_INSERT_AFTER(slistelm, elm, field) do {			\
-	(elm)->field.sle_next = (slistelm)->field.sle_next;		\
-	(slistelm)->field.sle_next = (elm);				\
-} while (/*CONSTCOND*/0)
-
-#define	SLIST_INSERT_HEAD(head, elm, field) do {			\
-	(elm)->field.sle_next = (head)->slh_first;			\
-	(head)->slh_first = (elm);					\
-} while (/*CONSTCOND*/0)
-
-#define	SLIST_REMOVE_HEAD(head, field) do {				\
-	(head)->slh_first = (head)->slh_first->field.sle_next;		\
-} while (/*CONSTCOND*/0)
-
-#define	SLIST_REMOVE(head, elm, type, field) do {			\
-	if ((head)->slh_first == (elm)) {				\
-		SLIST_REMOVE_HEAD((head), field);			\
-	}								\
-	else {								\
-		struct type *curelm = (head)->slh_first;		\
-		while(curelm->field.sle_next != (elm))			\
-			curelm = curelm->field.sle_next;		\
-		curelm->field.sle_next =				\
-		    curelm->field.sle_next->field.sle_next;		\
-	}								\
-} while (/*CONSTCOND*/0)
-
-#define	SLIST_FOREACH(var, head, field)					\
-	for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next)
-
-/*
- * Singly-linked List access methods.
- */
-#define	SLIST_EMPTY(head)	((head)->slh_first == NULL)
-#define	SLIST_FIRST(head)	((head)->slh_first)
-#define	SLIST_NEXT(elm, field)	((elm)->field.sle_next)
-
-
-/*
- * Singly-linked Tail queue declarations.
- */
-#define	STAILQ_HEAD(name, type)					\
-struct name {								\
-	struct type *stqh_first;	/* first element */			\
-	struct type **stqh_last;	/* addr of last next element */		\
-}
-
-#define	STAILQ_HEAD_INITIALIZER(head)					\
-	{ NULL, &(head).stqh_first }
-
-#define	STAILQ_ENTRY(type)						\
-struct {								\
-	struct type *stqe_next;	/* next element */			\
-}
-
-/*
- * Singly-linked Tail queue functions.
- */
-#define	STAILQ_INIT(head) do {						\
-	(head)->stqh_first = NULL;					\
-	(head)->stqh_last = &(head)->stqh_first;				\
-} while (/*CONSTCOND*/0)
-
-#define	STAILQ_INSERT_HEAD(head, elm, field) do {			\
-	if (((elm)->field.stqe_next = (head)->stqh_first) == NULL)	\
-		(head)->stqh_last = &(elm)->field.stqe_next;		\
-	(head)->stqh_first = (elm);					\
-} while (/*CONSTCOND*/0)
-
-#define	STAILQ_INSERT_TAIL(head, elm, field) do {			\
-	(elm)->field.stqe_next = NULL;					\
-	*(head)->stqh_last = (elm);					\
-	(head)->stqh_last = &(elm)->field.stqe_next;			\
-} while (/*CONSTCOND*/0)
-
-#define	STAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\
-	if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\
-		(head)->stqh_last = &(elm)->field.stqe_next;		\
-	(listelm)->field.stqe_next = (elm);				\
-} while (/*CONSTCOND*/0)
-
-#define	STAILQ_REMOVE_HEAD(head, field) do {				\
-	if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \
-		(head)->stqh_last = &(head)->stqh_first;			\
-} while (/*CONSTCOND*/0)
-
-#define	STAILQ_REMOVE(head, elm, type, field) do {			\
-	if ((head)->stqh_first == (elm)) {				\
-		STAILQ_REMOVE_HEAD((head), field);			\
-	} else {							\
-		struct type *curelm = (head)->stqh_first;		\
-		while (curelm->field.stqe_next != (elm))			\
-			curelm = curelm->field.stqe_next;		\
-		if ((curelm->field.stqe_next =				\
-			curelm->field.stqe_next->field.stqe_next) == NULL) \
-			    (head)->stqh_last = &(curelm)->field.stqe_next; \
-	}								\
-} while (/*CONSTCOND*/0)
-
-#define	STAILQ_FOREACH(var, head, field)				\
-	for ((var) = ((head)->stqh_first);				\
-		(var);							\
-		(var) = ((var)->field.stqe_next))
-
-#define	STAILQ_CONCAT(head1, head2) do {				\
-	if (!STAILQ_EMPTY((head2))) {					\
-		*(head1)->stqh_last = (head2)->stqh_first;		\
-		(head1)->stqh_last = (head2)->stqh_last;		\
-		STAILQ_INIT((head2));					\
-	}								\
-} while (/*CONSTCOND*/0)
-
-/*
- * Singly-linked Tail queue access methods.
- */
-#define	STAILQ_EMPTY(head)	((head)->stqh_first == NULL)
-#define	STAILQ_FIRST(head)	((head)->stqh_first)
-#define	STAILQ_NEXT(elm, field)	((elm)->field.stqe_next)
-
-
-/*
- * Simple queue definitions.
- */
-#define	SIMPLEQ_HEAD(name, type)					\
-struct name {								\
-	struct type *sqh_first;	/* first element */			\
-	struct type **sqh_last;	/* addr of last next element */		\
-}
-
-#define	SIMPLEQ_HEAD_INITIALIZER(head)					\
-	{ NULL, &(head).sqh_first }
-
-#define	SIMPLEQ_ENTRY(type)						\
-struct {								\
-	struct type *sqe_next;	/* next element */			\
-}
-
-/*
- * Simple queue functions.
- */
-#define	SIMPLEQ_INIT(head) do {						\
-	(head)->sqh_first = NULL;					\
-	(head)->sqh_last = &(head)->sqh_first;				\
-} while (/*CONSTCOND*/0)
-
-#define	SIMPLEQ_INSERT_HEAD(head, elm, field) do {			\
-	if (((elm)->field.sqe_next = (head)->sqh_first) == NULL)	\
-		(head)->sqh_last = &(elm)->field.sqe_next;		\
-	(head)->sqh_first = (elm);					\
-} while (/*CONSTCOND*/0)
-
-#define	SIMPLEQ_INSERT_TAIL(head, elm, field) do {			\
-	(elm)->field.sqe_next = NULL;					\
-	*(head)->sqh_last = (elm);					\
-	(head)->sqh_last = &(elm)->field.sqe_next;			\
-} while (/*CONSTCOND*/0)
-
-#define	SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\
-	if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
-		(head)->sqh_last = &(elm)->field.sqe_next;		\
-	(listelm)->field.sqe_next = (elm);				\
-} while (/*CONSTCOND*/0)
-
-#define	SIMPLEQ_REMOVE_HEAD(head, field) do {				\
-	if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
-		(head)->sqh_last = &(head)->sqh_first;			\
-} while (/*CONSTCOND*/0)
-
-#define	SIMPLEQ_REMOVE(head, elm, type, field) do {			\
-	if ((head)->sqh_first == (elm)) {				\
-		SIMPLEQ_REMOVE_HEAD((head), field);			\
-	} else {							\
-		struct type *curelm = (head)->sqh_first;		\
-		while (curelm->field.sqe_next != (elm))			\
-			curelm = curelm->field.sqe_next;		\
-		if ((curelm->field.sqe_next =				\
-			curelm->field.sqe_next->field.sqe_next) == NULL) \
-			    (head)->sqh_last = &(curelm)->field.sqe_next; \
-	}								\
-} while (/*CONSTCOND*/0)
-
-#define	SIMPLEQ_FOREACH(var, head, field)				\
-	for ((var) = ((head)->sqh_first);				\
-		(var);							\
-		(var) = ((var)->field.sqe_next))
-
-/*
- * Simple queue access methods.
- */
-#define	SIMPLEQ_EMPTY(head)		((head)->sqh_first == NULL)
-#define	SIMPLEQ_FIRST(head)		((head)->sqh_first)
-#define	SIMPLEQ_NEXT(elm, field)	((elm)->field.sqe_next)
-
-
-/*
- * Tail queue definitions.
- */
-#define	_TAILQ_HEAD(name, type, qual)					\
-struct name {								\
-	qual type *tqh_first;		/* first element */		\
-	qual type *qual *tqh_last;	/* addr of last next element */	\
-}
-#define TAILQ_HEAD(name, type)	_TAILQ_HEAD(name, struct type,)
-
-#define	TAILQ_HEAD_INITIALIZER(head)					\
-	{ NULL, &(head).tqh_first }
-
-#define	_TAILQ_ENTRY(type, qual)					\
-struct {								\
-	qual type *tqe_next;		/* next element */		\
-	qual type *qual *tqe_prev;	/* address of previous next element */\
-}
-#define TAILQ_ENTRY(type)	_TAILQ_ENTRY(struct type,)
-
-/*
- * Tail queue functions.
- */
-#define	TAILQ_INIT(head) do {						\
-	(head)->tqh_first = NULL;					\
-	(head)->tqh_last = &(head)->tqh_first;				\
-} while (/*CONSTCOND*/0)
-
-#define	TAILQ_INSERT_HEAD(head, elm, field) do {			\
-	if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)	\
-		(head)->tqh_first->field.tqe_prev =			\
-		    &(elm)->field.tqe_next;				\
-	else								\
-		(head)->tqh_last = &(elm)->field.tqe_next;		\
-	(head)->tqh_first = (elm);					\
-	(elm)->field.tqe_prev = &(head)->tqh_first;			\
-} while (/*CONSTCOND*/0)
-
-#define	TAILQ_INSERT_TAIL(head, elm, field) do {			\
-	(elm)->field.tqe_next = NULL;					\
-	(elm)->field.tqe_prev = (head)->tqh_last;			\
-	*(head)->tqh_last = (elm);					\
-	(head)->tqh_last = &(elm)->field.tqe_next;			\
-} while (/*CONSTCOND*/0)
-
-#define	TAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\
-	if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
-		(elm)->field.tqe_next->field.tqe_prev = 		\
-		    &(elm)->field.tqe_next;				\
-	else								\
-		(head)->tqh_last = &(elm)->field.tqe_next;		\
-	(listelm)->field.tqe_next = (elm);				\
-	(elm)->field.tqe_prev = &(listelm)->field.tqe_next;		\
-} while (/*CONSTCOND*/0)
-
-#define	TAILQ_INSERT_BEFORE(listelm, elm, field) do {			\
-	(elm)->field.tqe_prev = (listelm)->field.tqe_prev;		\
-	(elm)->field.tqe_next = (listelm);				\
-	*(listelm)->field.tqe_prev = (elm);				\
-	(listelm)->field.tqe_prev = &(elm)->field.tqe_next;		\
-} while (/*CONSTCOND*/0)
-
-#define	TAILQ_REMOVE(head, elm, field) do {				\
-	if (((elm)->field.tqe_next) != NULL)				\
-		(elm)->field.tqe_next->field.tqe_prev = 		\
-		    (elm)->field.tqe_prev;				\
-	else								\
-		(head)->tqh_last = (elm)->field.tqe_prev;		\
-	*(elm)->field.tqe_prev = (elm)->field.tqe_next;			\
-} while (/*CONSTCOND*/0)
-
-#define	TAILQ_FOREACH(var, head, field)					\
-	for ((var) = ((head)->tqh_first);				\
-		(var);							\
-		(var) = ((var)->field.tqe_next))
-
-#define	TAILQ_FOREACH_REVERSE(var, head, headname, field)		\
-	for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last));	\
-		(var);							\
-		(var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))
-
-#define	TAILQ_CONCAT(head1, head2, field) do {				\
-	if (!TAILQ_EMPTY(head2)) {					\
-		*(head1)->tqh_last = (head2)->tqh_first;		\
-		(head2)->tqh_first->field.tqe_prev = (head1)->tqh_last;	\
-		(head1)->tqh_last = (head2)->tqh_last;			\
-		TAILQ_INIT((head2));					\
-	}								\
-} while (/*CONSTCOND*/0)
-
-/*
- * Tail queue access methods.
- */
-#define	TAILQ_EMPTY(head)		((head)->tqh_first == NULL)
-#define	TAILQ_FIRST(head)		((head)->tqh_first)
-#define	TAILQ_NEXT(elm, field)		((elm)->field.tqe_next)
-
-#define	TAILQ_LAST(head, headname) \
-	(*(((struct headname *)((head)->tqh_last))->tqh_last))
-#define	TAILQ_PREV(elm, headname, field) \
-	(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
-
-
-/*
- * Circular queue definitions.
- */
-#define	CIRCLEQ_HEAD(name, type)					\
-struct name {								\
-	struct type *cqh_first;		/* first element */		\
-	struct type *cqh_last;		/* last element */		\
-}
-
-#define	CIRCLEQ_HEAD_INITIALIZER(head)					\
-	{ (void *)&head, (void *)&head }
-
-#define	CIRCLEQ_ENTRY(type)						\
-struct {								\
-	struct type *cqe_next;		/* next element */		\
-	struct type *cqe_prev;		/* previous element */		\
-}
-
-/*
- * Circular queue functions.
- */
-#define	CIRCLEQ_INIT(head) do {						\
-	(head)->cqh_first = (void *)(head);				\
-	(head)->cqh_last = (void *)(head);				\
-} while (/*CONSTCOND*/0)
-
-#define	CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {		\
-	(elm)->field.cqe_next = (listelm)->field.cqe_next;		\
-	(elm)->field.cqe_prev = (listelm);				\
-	if ((listelm)->field.cqe_next == (void *)(head))		\
-		(head)->cqh_last = (elm);				\
-	else								\
-		(listelm)->field.cqe_next->field.cqe_prev = (elm);	\
-	(listelm)->field.cqe_next = (elm);				\
-} while (/*CONSTCOND*/0)
-
-#define	CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {		\
-	(elm)->field.cqe_next = (listelm);				\
-	(elm)->field.cqe_prev = (listelm)->field.cqe_prev;		\
-	if ((listelm)->field.cqe_prev == (void *)(head))		\
-		(head)->cqh_first = (elm);				\
-	else								\
-		(listelm)->field.cqe_prev->field.cqe_next = (elm);	\
-	(listelm)->field.cqe_prev = (elm);				\
-} while (/*CONSTCOND*/0)
-
-#define	CIRCLEQ_INSERT_HEAD(head, elm, field) do {			\
-	(elm)->field.cqe_next = (head)->cqh_first;			\
-	(elm)->field.cqe_prev = (void *)(head);				\
-	if ((head)->cqh_last == (void *)(head))				\
-		(head)->cqh_last = (elm);				\
-	else								\
-		(head)->cqh_first->field.cqe_prev = (elm);		\
-	(head)->cqh_first = (elm);					\
-} while (/*CONSTCOND*/0)
-
-#define	CIRCLEQ_INSERT_TAIL(head, elm, field) do {			\
-	(elm)->field.cqe_next = (void *)(head);				\
-	(elm)->field.cqe_prev = (head)->cqh_last;			\
-	if ((head)->cqh_first == (void *)(head))			\
-		(head)->cqh_first = (elm);				\
-	else								\
-		(head)->cqh_last->field.cqe_next = (elm);		\
-	(head)->cqh_last = (elm);					\
-} while (/*CONSTCOND*/0)
-
-#define	CIRCLEQ_REMOVE(head, elm, field) do {				\
-	if ((elm)->field.cqe_next == (void *)(head))			\
-		(head)->cqh_last = (elm)->field.cqe_prev;		\
-	else								\
-		(elm)->field.cqe_next->field.cqe_prev =			\
-		    (elm)->field.cqe_prev;				\
-	if ((elm)->field.cqe_prev == (void *)(head))			\
-		(head)->cqh_first = (elm)->field.cqe_next;		\
-	else								\
-		(elm)->field.cqe_prev->field.cqe_next =			\
-		    (elm)->field.cqe_next;				\
-} while (/*CONSTCOND*/0)
-
-#define	CIRCLEQ_FOREACH(var, head, field)				\
-	for ((var) = ((head)->cqh_first);				\
-		(var) != (const void *)(head);				\
-		(var) = ((var)->field.cqe_next))
-
-#define	CIRCLEQ_FOREACH_REVERSE(var, head, field)			\
-	for ((var) = ((head)->cqh_last);				\
-		(var) != (const void *)(head);				\
-		(var) = ((var)->field.cqe_prev))
-
-/*
- * Circular queue access methods.
- */
-#define	CIRCLEQ_EMPTY(head)		((head)->cqh_first == (void *)(head))
-#define	CIRCLEQ_FIRST(head)		((head)->cqh_first)
-#define	CIRCLEQ_LAST(head)		((head)->cqh_last)
-#define	CIRCLEQ_NEXT(elm, field)	((elm)->field.cqe_next)
-#define	CIRCLEQ_PREV(elm, field)	((elm)->field.cqe_prev)
-
-#define CIRCLEQ_LOOP_NEXT(head, elm, field)				\
-	(((elm)->field.cqe_next == (void *)(head))			\
-	    ? ((head)->cqh_first)					\
-	    : (elm->field.cqe_next))
-#define CIRCLEQ_LOOP_PREV(head, elm, field)				\
-	(((elm)->field.cqe_prev == (void *)(head))			\
-	    ? ((head)->cqh_last)					\
-	    : (elm->field.cqe_prev))
-
-#endif	/* sys/queue.h */
diff --git a/common/utils/nr/nr_common.h b/common/utils/nr/nr_common.h
index 979cf863436a91430b0e1e562c71aa9c84f24965..5601c0fcbf8f5755b42fc484db8bbbd8ccdf6aa9 100644
--- a/common/utils/nr/nr_common.h
+++ b/common/utils/nr/nr_common.h
@@ -30,6 +30,9 @@
  * \warning
  */
 
+#ifndef __COMMON_UTILS_NR_NR_COMMON__H__
+#define __COMMON_UTILS_NR_NR_COMMON__H__
+
 #include <stdint.h>
 #include "assertions.h"
 
@@ -63,3 +66,5 @@ void SLIV2SL(int SLIV,int *S,int *L);
 #define max(a,b) cmax(a,b)
 #define min(a,b) cmin(a,b)
 #endif
+
+#endif
diff --git a/common/utils/telnetsrv/telnetsrv_cpumeasur_def.h b/common/utils/telnetsrv/telnetsrv_cpumeasur_def.h
index 89ced509a4504a8c9b742bdbb3e1e9344936ab61..7a45b351f3231b24591cf15ac9e6a70df6441e54 100644
--- a/common/utils/telnetsrv/telnetsrv_cpumeasur_def.h
+++ b/common/utils/telnetsrv/telnetsrv_cpumeasur_def.h
@@ -32,6 +32,8 @@
  * \warning
  */
 
+#ifndef __TELNETSRV_CPUMEASUR_DEF__H__
+#define __TELNETSRV_CPUMEASUR_DEF__H__
 
 #define CPU_PHYENB_MEASURE \
 { \
@@ -97,3 +99,5 @@
   {"pdcp_ip",                &(pdcpvars->pdcp_ip),0},\
   {"ip_pdcp",                &(pdcpvars->ip_pdcp),0},\
 }
+
+#endif
diff --git a/common/utils/telnetsrv/telnetsrv_ltemeasur_def.h b/common/utils/telnetsrv/telnetsrv_ltemeasur_def.h
index 160111f15e8bca2abd60af3f63ef4d487ed6a2a6..c1aab51e23deff07ee933c4496a65279d9931359 100644
--- a/common/utils/telnetsrv/telnetsrv_ltemeasur_def.h
+++ b/common/utils/telnetsrv/telnetsrv_ltemeasur_def.h
@@ -32,6 +32,8 @@
  * \warning
  */
 
+#ifndef __TELNETSRV_LTEMEASUR_DEF__H__
+#define __TELNETSRV_LTEMEASUR_DEF__H__
 
 #define LTEMAC_MEASURE \
 { \
@@ -125,3 +127,5 @@
   {"timer_poll_retrans_tout",         NULL, TELNET_VARTYPE_UINT, 0},\
   {"timer_status_prohibit_tout",      NULL, TELNET_VARTYPE_UINT, 0},\
 }
+
+#endif
diff --git a/common/utils/telnetsrv/telnetsrv_measurements.h b/common/utils/telnetsrv/telnetsrv_measurements.h
index 80276bc2d03782c63c2339cdb542fd3a265e04e5..08136df0fda6d3325b8afd59f7f628c6086670cf 100644
--- a/common/utils/telnetsrv/telnetsrv_measurements.h
+++ b/common/utils/telnetsrv/telnetsrv_measurements.h
@@ -31,6 +31,10 @@
  * \note
  * \warning
  */
+
+#ifndef __TELNETSRV_MEASUREMENTS__H__
+#define __TELNETSRV_MEASUREMENTS__H__
+
 #include <dlfcn.h>
 #include "telnetsrv.h"
 #include "openair1/PHY/defs_eNB.h"
@@ -97,3 +101,4 @@ extern uint64_t measurcmd_getstatvalue(telnet_ltemeasurdef_t *measur,telnet_prin
 extern void     measurcmd_display_measures(telnet_printfunc_t prnt, telnet_ltemeasurdef_t  *statsptr, int stats_size);
 
 #endif  /* TELNETSRV_MEASURCMD_MAIN */
+#endif
diff --git a/common/utils/telnetsrv/telnetsrv_phycmd.h b/common/utils/telnetsrv/telnetsrv_phycmd.h
index e35b2a53ab4a6949403cf7a743f1781216b8d1e6..0d574027fbf825f26a2498f2734b91e605e62843 100644
--- a/common/utils/telnetsrv/telnetsrv_phycmd.h
+++ b/common/utils/telnetsrv/telnetsrv_phycmd.h
@@ -30,6 +30,9 @@
  * \warning
  */
 
+#ifndef __TELNETSRV_PHYCMD__H__
+#define __TELNETSRV_PHYCMD__H__
+
 #ifdef TELNETSRV_PHYCMD_MAIN
 
 #include "common/utils/LOG/log.h"
@@ -61,3 +64,4 @@ extern void add_phy_cmds(void);
 
 /*-------------------------------------------------------------------------------------*/
 
+#endif
diff --git a/common/utils/telnetsrv/telnetsrv_proccmd.h b/common/utils/telnetsrv/telnetsrv_proccmd.h
index 1a0a8d25dc4006c74f5b9afe3c2b82db94db7e45..f130606b6c373031f927bc7140f2892f4f3e1819 100644
--- a/common/utils/telnetsrv/telnetsrv_proccmd.h
+++ b/common/utils/telnetsrv/telnetsrv_proccmd.h
@@ -30,6 +30,10 @@
  * \note
  * \warning
  */
+
+#ifndef __TELNETSRV_PROCCMD__H__
+#define __TELNETSRV_PROCCMD__H__
+
 #include <dlfcn.h>
 #include "telnetsrv.h"
 
@@ -79,3 +83,4 @@ telnetshell_cmddef_t proc_cmdarray[] = {
 extern void add_proccmd_cmds(void);
 #endif  /* TELNETSRV_PROCCMD_MAIN */
 
+#endif
diff --git a/executables/main-fs6.c b/executables/main-fs6.c
index 45a627188771b87e8691a0b4d92d3e3322c8bbc6..ffa44bd978758cc13923499970ff8743e938543f 100644
--- a/executables/main-fs6.c
+++ b/executables/main-fs6.c
@@ -1194,6 +1194,8 @@ void phy_procedures_eNB_TX_tosplit(uint8_t *bufferZone, PHY_VARS_eNB *eNB, L1_rx
   for (int i=0; i<NUMBER_OF_UE_MAX; i++) {
     int harq_pid;
     LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[i];
+    if (ulsch == NULL)
+      continue;
 
     if (ulsch->ue_type > NOCE)
       harq_pid = 0;
@@ -1209,9 +1211,10 @@ void phy_procedures_eNB_TX_tosplit(uint8_t *bufferZone, PHY_VARS_eNB *eNB, L1_rx
 
     for (int k=0; k<8; k++) {
       ulsch_harq = ulsch->harq_processes[k];
+      if (ulsch_harq == NULL)
+        continue;
 
-      if (ulsch &&
-          (ulsch->rnti>0) &&
+      if ((ulsch->rnti>0) &&
           (ulsch_harq->status == ACTIVE) &&
           (ulsch_harq->frame == frame) &&
           (ulsch_harq->subframe == subframe) &&
@@ -1510,6 +1513,7 @@ void *cu_fs6(void *arg) {
   char remoteIP[1024];
   strncpy(remoteIP,get_softmodem_params()->split73+3, 1023); //three first char should be cu: or du:
   char port_def[256]=DU_PORT;
+
   for (int i=0; i <1000; i++)
     if (remoteIP[i]==':') {
       strncpy(port_def,remoteIP+i+1,255);
@@ -1558,12 +1562,14 @@ void *du_fs6(void *arg) {
   char remoteIP[1024];
   strncpy(remoteIP,get_softmodem_params()->split73+3,1023); //three first char should be cu: or du:
   char port_def[256]=CU_PORT;
+
   for (int i=0; i <1000; i++)
     if (remoteIP[i]==':') {
       strncpy(port_def,remoteIP+i+1,255);
       remoteIP[i]=0;
       break;
     }
+
   AssertFatal(createUDPsock(NULL, DU_PORT, remoteIP, port_def, &sockFS6), "");
 
   if (ru->rfdevice.trx_start_func(&ru->rfdevice) != 0)
diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index 9003f6835778ce51024d387ac2cfef93f86d7362..aa16c771ae2940789467ac3f868bc9922fa85977 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -734,9 +734,7 @@ void init_gNB_proc(int inst) {
   gNB_L1_rxtx_proc_t *L1_proc,*L1_proc_tx;
 //  LOG_I(PHY,"%s(inst:%d) RC.nb_nr_CC[inst]:%d \n",__FUNCTION__,inst,RC.nb_nr_CC[inst]);
   gNB = RC.gNB[inst];
-#ifndef OCP_FRAMEWORK
   LOG_I(PHY,"Initializing gNB processes instance:%d CC_id %d \n",inst,CC_id);
-#endif
   
   proc = &gNB->proc;
   L1_proc                        = &proc->L1_proc;
@@ -950,9 +948,7 @@ void init_gNB(int single_thread_flag,int wait_for_sync) {
       NR_POLAR_PBCH_PAYLOAD_BITS,
       NR_POLAR_PBCH_AGGREGATION_LEVEL);*/
     LOG_I(PHY,"Initializing gNB %d single_thread_flag:%d\n",inst,gNB->single_thread_flag);
-#ifndef OCP_FRAMEWORK
     LOG_I(PHY,"Initializing gNB %d\n",inst);
-#endif
 
     LOG_I(PHY,"Registering with MAC interface module (before %p)\n",gNB->if_inst);
     AssertFatal((gNB->if_inst         = NR_IF_Module_init(inst))!=NULL,"Cannot register interface");
diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index f947395f4a077708c5bf61c029401235f8409762..3ea026f6e623e056cc867bb26e81cc5d2890a3a0 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -773,7 +773,7 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
       LOG_D(PHY,"[TXPATH] RU %d tx_rf, writing to TS %llu, frame %d, unwrapped_frame %d, slot %d\n",ru->idx,
 	    (long long unsigned int)timestamp,frame,proc->frame_tx_unwrap,slot);
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
-      AssertFatal(txs ==  siglen+sf_extension,"TX : Timeout (sent %u/%d)\n", txs, siglen);
+      //AssertFatal(txs == 0,"trx write function error %d\n", txs);
   }
 }
 
@@ -1463,6 +1463,16 @@ void *ru_thread( void *param ) {
 
     // if this is a slave RRU, try to synchronize on the DL frequency
     if ((ru->is_slave) && (ru->if_south == LOCAL_RF)) do_ru_synch(ru);
+
+    // start trx write thread
+    if (ru->start_write_thread){
+      if(ru->start_write_thread(ru) != 0){
+        LOG_E(HW,"Could not start tx write thread\n");
+      }
+      else{
+        LOG_I(PHY,"tx write thread ready\n");
+      }
+    }
   }
 
   pthread_mutex_lock(&proc->mutex_FH1);
@@ -1672,14 +1682,15 @@ int stop_rf(RU_t *ru) {
   return 0;
 }
 
+int start_write_thread(RU_t *ru) {
+  return(ru->rfdevice.trx_write_init(&ru->rfdevice));
+}
 
 void init_RU_proc(RU_t *ru) {
   int i=0;
   RU_proc_t *proc;
   char name[100];
-#ifndef OCP_FRAMEWORK
   LOG_I(PHY,"Initializing RU proc %d (%s,%s),\n",ru->idx,NB_functions[ru->function],NB_timing[ru->if_timing]);
-#endif
   proc = &ru->proc;
   memset((void *)proc,0,sizeof(RU_proc_t));
   proc->ru = ru;
@@ -2067,6 +2078,7 @@ void set_function_spec_param(RU_t *ru) {
       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);
       /*
           if (ru->function == gNodeB_3GPP) { // configure RF parameters only for 3GPP eNodeB, we need to get them from RAU otherwise
@@ -2092,6 +2104,7 @@ void set_function_spec_param(RU_t *ru) {
       ru->fh_south_asynch_in     = NULL;                // no asynchronous UL
       ru->start_rf               = NULL;                // no local RF
       ru->stop_rf                = NULL;
+      ru->start_write_thread     = NULL;
       ru->nr_start_if            = nr_start_if;         // need to start if interface for IF5
       ru->ifdevice.host_type     = RAU_HOST;
       ru->ifdevice.eth_params    = &ru->eth_params;
@@ -2118,6 +2131,7 @@ void set_function_spec_param(RU_t *ru) {
       ru->fh_north_asynch_in     = NULL;
       ru->start_rf               = NULL;                // no local RF
       ru->stop_rf                = NULL;
+      ru->start_write_thread     = NULL;
       ru->nr_start_if            = nr_start_if;         // need to start if interface for IF4p5
       ru->ifdevice.host_type     = RAU_HOST;
       ru->ifdevice.eth_params    = &ru->eth_params;
@@ -2147,7 +2161,6 @@ void init_NR_RU(char *rf_config_file)
   PHY_VARS_gNB *gNB0= (PHY_VARS_gNB *)NULL;
   NR_DL_FRAME_PARMS *fp = (NR_DL_FRAME_PARMS *)NULL;
   int i;
-  int CC_id;
   // create status mask
   RC.ru_mask = 0;
   pthread_mutex_init(&RC.ru_mutex,NULL);
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index 6dd3807f3cc1f5a92ff0aee0b30b9e3d80fe4806..f473d0161b655808b4a77e0cfcbc0f6774086897 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -708,7 +708,6 @@ int stop_L1L2(module_id_t gnb_id) {
  */
 int restart_L1L2(module_id_t gnb_id) {
   RU_t *ru = RC.ru[gnb_id];
-  int cc_id;
   MessageDef *msg_p = NULL;
   LOG_W(GNB_APP, "restarting nr-softmodem\n");
   /* block threads */
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index a0251b26dffae81cb2dd09ac059d087c7e0f81eb..761420a7039c057886b57ddc210bb044cd868d6b 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -146,7 +146,7 @@ void init_nr_ue_vars(PHY_VARS_NR_UE *ue,
 
   ue->Mod_id      = UE_id;
   ue->mac_enabled = 1;
-  // initialize all signal buffers
+
   // initialize all signal buffers
   init_nr_ue_signal(ue,1,abstraction_flag);
   // intialize transport
@@ -357,10 +357,11 @@ static void UE_synch(void *arg) {
 }
 
 void processSlotTX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
-  uint32_t nb_rb, start_rb;
-  uint8_t nb_symb_sch, start_symbol, mcs, precod_nbr_layers, harq_pid, rvidx;
-  uint16_t n_rnti;
 
+  uint32_t rb_size, rb_start;
+  uint16_t rnti, l_prime_mask, n_rb0, n_rb1, pdu_bit_map;
+  uint8_t nr_of_symbols, start_symbol_index, mcs_index, mcs_table, nrOfLayers, harq_process_id, rv_index, dmrs_config_type;
+  uint8_t ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, ptrs_time_density, ptrs_freq_density;
   nr_dcireq_t dcireq;
   nr_scheduled_response_t scheduled_response;
 
@@ -381,30 +382,53 @@ void processSlotTX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
     scheduled_response.frame = proc->frame_rx;
     scheduled_response.slot  = proc->nr_tti_rx;
     //--------------------------Temporary configuration-----------------------------//
-    n_rnti = 0x1234;
-    nb_rb = 50;
-    start_rb = 0;
-    nb_symb_sch = 12;
-    start_symbol = 2;
-    precod_nbr_layers = 1;
-    mcs = 9;
-    harq_pid = 0;
-    rvidx = 0;
+    rnti = 0x1234;
+    rb_size = 50;
+    rb_start = 0;
+    nr_of_symbols = 12;
+    start_symbol_index = 2;
+    nrOfLayers = 1;
+    mcs_index = 9;
+    mcs_table = 0;
+    harq_process_id = 0;
+    rv_index = 0;
+    l_prime_mask = get_l_prime(nr_of_symbols, typeB, pusch_dmrs_pos0, pusch_len1);
+    dmrs_config_type = 0;
+    ptrs_mcs1 = 2;
+    ptrs_mcs2 = 4;
+    ptrs_mcs3 = 10;
+    n_rb0 = 25;
+    n_rb1 = 75;
+    pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA;
+    ptrs_time_density = get_L_ptrs(ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, mcs_index, mcs_table);
+    ptrs_freq_density = get_K_ptrs(n_rb0, n_rb1, rb_size);
     //------------------------------------------------------------------------------//
 
     scheduled_response.ul_config->slot = 8;
     scheduled_response.ul_config->number_pdus = 1;
     scheduled_response.ul_config->ul_config_list[0].pdu_type = FAPI_NR_UL_CONFIG_TYPE_PUSCH;
-    scheduled_response.ul_config->ul_config_list[0].ulsch_config_pdu.rnti = n_rnti;
-    scheduled_response.ul_config->ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.number_rbs = nb_rb;
-    scheduled_response.ul_config->ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.start_rb = start_rb;
-    scheduled_response.ul_config->ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.number_symbols = nb_symb_sch;
-    scheduled_response.ul_config->ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.start_symbol = start_symbol;
-    scheduled_response.ul_config->ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.mcs = mcs;
-    scheduled_response.ul_config->ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.ndi = 0;
-    scheduled_response.ul_config->ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.rv = rvidx;
-    scheduled_response.ul_config->ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.n_layers = precod_nbr_layers;
-    scheduled_response.ul_config->ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.harq_process_nbr = harq_pid;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.rnti = rnti;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.rb_size = rb_size;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.rb_start = rb_start;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.nr_of_symbols = nr_of_symbols;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.start_symbol_index = start_symbol_index;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.ul_dmrs_symb_pos = l_prime_mask << start_symbol_index;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.dmrs_config_type = dmrs_config_type;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.mcs_index = mcs_index;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.mcs_table = mcs_table;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.pusch_data.new_data_indicator = 0;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.pusch_data.rv_index = rv_index;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.nrOfLayers = nrOfLayers;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.pusch_data.harq_process_id = harq_process_id;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.pdu_bit_map = pdu_bit_map;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_time_density = ptrs_time_density;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_freq_density = ptrs_freq_density;
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_ports_list   = (nfapi_nr_ue_ptrs_ports_t *) malloc(2*sizeof(nfapi_nr_ue_ptrs_ports_t));
+    scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset = 0;
+
+    if (1 << ptrs_time_density >= nr_of_symbols) {
+      scheduled_response.ul_config->ul_config_list[0].pusch_config_pdu.pdu_bit_map &= ~PUSCH_PDU_BITMAP_PUSCH_PTRS; // disable PUSCH PTRS
+    }
 
     nr_ue_scheduled_response(&scheduled_response);
     
@@ -471,7 +495,6 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
     }
   }
 
-  // no UL for now
   // no UL for now
   /*
   if (UE->mac_enabled==1) {
@@ -508,7 +531,7 @@ void UE_processing(void *arg) {
   PHY_VARS_NR_UE    *UE   = rxtxD->UE;
 
   uint8_t gNB_id = 0;
-  // params for UL time alignment procedure
+
   // params for UL time alignment procedure
   NR_UL_TIME_ALIGNMENT_t *ul_time_alignment = &UE->ul_time_alignment[gNB_id];
   uint8_t numerology = UE->frame_parms.numerology_index;
@@ -523,7 +546,7 @@ void UE_processing(void *arg) {
 
     if (frame_tx == ul_time_alignment->ta_frame && slot_tx == ul_time_alignment->ta_slot) {
       LOG_D(PHY,"Applying timing advance -- frame %d -- slot %d\n", frame_tx, slot_tx);
-      //if (nfapi_mode!=3){
+
       //if (nfapi_mode!=3){
       nr_process_timing_advance(UE->Mod_id, UE->CC_id, ul_time_alignment->ta_command, numerology, bwp_ul_NB_RB);
       ul_time_alignment->ta_frame = -1;
@@ -590,8 +613,7 @@ void readFrame(PHY_VARS_NR_UE *UE,  openair0_timestamp *timestamp, bool toTrash)
 
 void syncInFrame(PHY_VARS_NR_UE *UE, openair0_timestamp *timestamp) {
 
-  LOG_I(PHY,"Resynchronizing RX by %d samples (mode = %d)\n",UE->rx_offset,UE->mode);
-  void *dummy_tx[UE->frame_parms.nb_antennas_tx];
+    LOG_I(PHY,"Resynchronizing RX by %d samples (mode = %d)\n",UE->rx_offset,UE->mode);
 
     *timestamp += UE->frame_parms.get_samples_per_slot(1,&UE->frame_parms);
     for ( int size=UE->rx_offset ; size > 0 ; size -= UE->frame_parms.samples_per_subframe ) {
@@ -612,7 +634,7 @@ void syncInFrame(PHY_VARS_NR_UE *UE, openair0_timestamp *timestamp) {
 
 int computeSamplesShift(PHY_VARS_NR_UE *UE) {
   if (IS_SOFTMODEM_RFSIM) {
-    LOG_E(PHY,"SET rx_offset %d \n",UE->rx_offset);
+    LOG_D(PHY,"SET rx_offset %d \n",UE->rx_offset);
     //UE->rx_offset_diff=0;
     return 0;
   }
@@ -753,7 +775,7 @@ void *UE_thread(void *arg) {
 #ifdef OAI_ADRV9371_ZC706
     /*uint32_t total_gain_dB_prev = 0;
     if (total_gain_dB_prev != UE->rx_total_gain_dB) {
-    total_gain_dB_prev = UE->rx_total_gain_dB;
+        total_gain_dB_prev = UE->rx_total_gain_dB;
         openair0_cfg[0].rx_gain[0] = UE->rx_total_gain_dB;
         UE->rfdevice.trx_set_gains_func(&UE->rfdevice,&openair0_cfg[0]);
     }*/
@@ -835,9 +857,10 @@ void *UE_thread(void *arg) {
       usleep(200);
     }
 
-    if (  decoded_frame_rx != curMsg->proc.frame_rx &&
-          ((decoded_frame_rx+1) % MAX_FRAME_NUMBER) != curMsg->proc.frame_rx )
-      LOG_D(PHY,"Decoded frame index (%d) is not compatible with current context (%d), UE should go back to synch mode\n",
+    if (  (decoded_frame_rx != curMsg->proc.frame_rx) &&
+          (((decoded_frame_rx+1) % MAX_FRAME_NUMBER) != curMsg->proc.frame_rx) &&
+          (((decoded_frame_rx+2) % MAX_FRAME_NUMBER) != curMsg->proc.frame_rx))
+      LOG_E(PHY,"Decoded frame index (%d) is not compatible with current context (%d), UE should go back to synch mode\n",
             decoded_frame_rx, curMsg->proc.frame_rx  );
 
     nbSlotProcessing++;
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 576144e1df9508bdf4c5e78aeb2028a98b5642fe..2c3809f5d416ec69fb3775ff484521711aa6c0b4 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
@@ -22,6 +22,8 @@
 #include "fapi_nr_ue_constants.h"
 #include "PHY/impl_defs_nr.h"
 
+#define NFAPI_UE_MAX_NUM_CB 8
+
 /*
   typedef unsigned int	   uint32_t;
   typedef unsigned short	   uint16_t;
@@ -256,40 +258,124 @@ typedef struct {
 
     } fapi_nr_ul_config_pucch_pdu;
 
-    typedef enum {pusch_freq_hopping_disabled = 0 , pusch_freq_hopping_enabled = 1}pusch_freq_hopping_t;
-    typedef struct{
-    uint8_t aperiodicSRS_ResourceTrigger;
-    } fapi_nr_ul_srs_config_t;
-    typedef struct {
-        uint8_t bandwidth_part_ind;
-        uint16_t number_rbs;
-        uint16_t start_rb;
-        uint8_t frame_offset;
-        uint16_t number_symbols;
-        uint16_t start_symbol;
-        pusch_freq_hopping_t pusch_freq_hopping;
-        uint8_t mcs;
-        uint8_t ndi;
-        uint8_t rv;
-        uint8_t harq_process_nbr;
-        int8_t accumulated_delta_PUSCH;
-        int8_t absolute_delta_PUSCH;
-        uint8_t n_layers;
-        uint8_t tpmi;
-        uint8_t n_dmrs_cdm_groups;
-        uint8_t dmrs_ports[4];
-        uint8_t n_front_load_symb;
-        fapi_nr_ul_srs_config_t srs_config;
-        uint8_t csi_reportTriggerSize;
-        uint8_t maxCodeBlockGroupsPerTransportBlock;
-        uint8_t ptrs_dmrs_association_port;
-        uint8_t beta_offset_ind;
-    } fapi_nr_ul_config_pusch_pdu_rel15_t;
+typedef struct
+{
+  uint8_t  rv_index;
+  uint8_t  harq_process_id;
+  uint8_t  new_data_indicator;
+  uint32_t tb_size;
+  uint16_t num_cb;
+  uint8_t cb_present_and_position[(NFAPI_UE_MAX_NUM_CB+7) / 8];
 
-typedef struct {
+} nfapi_nr_ue_pusch_data_t;
+
+typedef struct
+{
+  uint16_t harq_ack_bit_length;
+  uint16_t csi_part1_bit_length;
+  uint16_t csi_part2_bit_length;
+  uint8_t  alpha_scaling;
+  uint8_t  beta_offset_harq_ack;
+  uint8_t  beta_offset_csi1;
+  uint8_t  beta_offset_csi2;
+
+} nfapi_nr_ue_pusch_uci_t;
+
+typedef struct
+{
+  uint16_t ptrs_port_index;//PT-RS antenna ports [TS38.214, sec6.2.3.1 and 38.212, section 7.3.1.1.2] Bitmap occupying the 12 LSBs with: bit 0: antenna port 0 bit 11: antenna port 11 and for each bit 0: PTRS port not used 1: PTRS port used
+  uint8_t  ptrs_dmrs_port;//DMRS port corresponding to PTRS.
+  uint8_t  ptrs_re_offset;//PT-RS resource element offset value taken from 0~11
+} nfapi_nr_ue_ptrs_ports_t;
+
+typedef struct
+{
+  uint8_t  num_ptrs_ports;
+  nfapi_nr_ue_ptrs_ports_t* ptrs_ports_list;
+  uint8_t  ptrs_time_density;
+  uint8_t  ptrs_freq_density;
+  uint8_t  ul_ptrs_power;
+
+}nfapi_nr_ue_pusch_ptrs_t;
+
+typedef struct
+{
+  uint8_t  low_papr_group_number;//Group number for Low PAPR sequence generation.
+  uint16_t low_papr_sequence_number;//[TS38.211, sec 5.2.2] For DFT-S-OFDM.
+  uint8_t  ul_ptrs_sample_density;//Number of PTRS groups [But I suppose this sentence is misplaced, so as the next one. --Chenyu]
+  uint8_t  ul_ptrs_time_density_transform_precoding;//Number of samples per PTRS group
+
+} nfapi_nr_ue_dfts_ofdm_t;
+
+typedef struct
+{
+  uint16_t beam_idx;//Index of the digital beam weight vector pre-stored at cell configuration. The vector maps this input port to output TXRUs. Value: 0->65535
+
+}nfapi_nr_ue_dig_bf_interface_t;
+
+typedef struct
+{
+  nfapi_nr_ue_dig_bf_interface_t* dig_bf_interface_list;
+
+} nfapi_nr_ue_ul_beamforming_number_of_prgs_t;
+
+typedef struct
+{
+  uint16_t num_prgs;
+  uint16_t prg_size;
+  //watchout: dig_bf_interface here, in table 3-43 it's dig_bf_interfaces
+  uint8_t  dig_bf_interface;
+  nfapi_nr_ue_ul_beamforming_number_of_prgs_t* prgs_list;//
+
+} nfapi_nr_ue_ul_beamforming_t;
+
+typedef struct
+{
+  uint16_t pdu_bit_map;//Bitmap indicating presence of optional PDUs (see above)
   uint16_t rnti;
-  fapi_nr_ul_config_pusch_pdu_rel15_t ulsch_pdu_rel15;
-} fapi_nr_ul_config_pusch_pdu;
+  uint32_t handle;//An opaque handling returned in the RxData.indication and/or UCI.indication message
+  //BWP
+  uint16_t bwp_size;
+  uint16_t bwp_start;
+  uint8_t  subcarrier_spacing;
+  uint8_t  cyclic_prefix;
+  //pusch information always include
+  uint16_t target_code_rate;
+  uint8_t  qam_mod_order;
+  uint8_t  mcs_index;
+  uint8_t  mcs_table;
+  uint8_t  transform_precoding;
+  uint16_t data_scrambling_id;
+  uint8_t  nrOfLayers;
+  //DMRS
+  uint16_t  ul_dmrs_symb_pos;
+  uint8_t  dmrs_config_type;
+  uint16_t ul_dmrs_scrambling_id;
+  uint8_t  scid;
+  uint8_t  num_dmrs_cdm_grps_no_data;
+  uint16_t dmrs_ports;//DMRS ports. [TS38.212 7.3.1.1.2] provides description between DCI 0-1 content and DMRS ports. Bitmap occupying the 11 LSBs with: bit 0: antenna port 1000 bit 11: antenna port 1011 and for each bit 0: DMRS port not used 1: DMRS port used
+  //Pusch Allocation in frequency domain [TS38.214, sec 6.1.2.2]
+  uint8_t  resource_alloc;
+  uint8_t  rb_bitmap[36];//
+  uint16_t rb_start;
+  uint16_t rb_size;
+  uint8_t  vrb_to_prb_mapping;
+  uint8_t  frequency_hopping;
+  uint16_t 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]
+  uint8_t  uplink_frequency_shift_7p5khz;
+  //Resource Allocation in time domain
+  uint8_t  start_symbol_index;
+  uint8_t  nr_of_symbols;
+  //Optional Data only included if indicated in pduBitmap
+  nfapi_nr_ue_pusch_data_t pusch_data;
+  nfapi_nr_ue_pusch_uci_t  pusch_uci;
+  nfapi_nr_ue_pusch_ptrs_t pusch_ptrs;
+  nfapi_nr_ue_dfts_ofdm_t dfts_ofdm;
+  //beamforming
+  nfapi_nr_ue_ul_beamforming_t beamforming;
+  //OAI specific
+  int8_t absolute_delta_PUSCH;
+} nfapi_nr_ue_pusch_pdu_t;
 
 typedef struct {
 
@@ -300,7 +386,7 @@ typedef struct {
   union {
     fapi_nr_ul_config_prach_pdu prach_config_pdu;
     fapi_nr_ul_config_pucch_pdu pucch_config_pdu;
-    fapi_nr_ul_config_pusch_pdu ulsch_config_pdu;
+    nfapi_nr_ue_pusch_pdu_t     pusch_config_pdu;
     fapi_nr_ul_config_srs_pdu srs_config_pdu;
   };
 } fapi_nr_ul_config_request_pdu_t;
@@ -341,7 +427,6 @@ typedef struct {
   uint8_t SubcarrierSpacing;  
   uint16_t number_rbs;
   uint16_t start_rb;
-  uint8_t frame_offset;
   uint16_t number_symbols;
   uint16_t start_symbol;
   uint16_t dlDmrsSymbPos;  
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c
index 25cc8c80cd08d03a62c7864dfa38cd854955904b..70791302cc9299c7afb02d28a201d55da21e971d 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_encoder.c
@@ -551,7 +551,7 @@ void polar_encoder_fast(uint64_t *A,
              crc24c((uint8_t *)A,bitlen)>>8);
   }
 
-#endif
+ #endif
   /*  printf("Bbytes : %x.%x.%x.%x.%x.%x.%x.%x\n",Bbyte[0],Bbyte[1],Bbyte[2],Bbyte[3],Bbyte[4],Bbyte[5],Bbyte[6],Bbyte[7]);
   printf("%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx\n",polarParams->cprime_tab[0][Bbyte[0]] ,
       polarParams->cprime_tab[1][Bbyte[1]] ,
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index 5c812e340fa3ca6f24eaa7c739ca0f16722c3025..5a60d15e2b4c3a3ee85c36617df5698fb08f7d56 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -657,8 +657,8 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
   abstraction_flag = 0;
   fp->nb_antennas_tx = 1;
   fp->nb_antennas_rx=1;
-  dmrs_UplinkConfig_t *dmrs_Uplink_Config = &ue->pusch_config.dmrs_UplinkConfig;
-  ptrs_UplinkConfig_t *ptrs_Uplink_Config = &ue->pusch_config.dmrs_UplinkConfig.ptrs_UplinkConfig;
+  // dmrs_UplinkConfig_t *dmrs_Uplink_Config = &ue->pusch_config.dmrs_UplinkConfig;
+  // ptrs_UplinkConfig_t *ptrs_Uplink_Config = &ue->pusch_config.dmrs_UplinkConfig.ptrs_UplinkConfig;
   printf("Initializing UE vars (abstraction %"PRIu8") for eNB TXant %"PRIu8", UE RXant %"PRIu8"\n",abstraction_flag,fp->nb_antennas_tx,fp->nb_antennas_rx);
   //LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", ue->Mod_id+NB_eNB_INST);
   phy_init_nr_top(ue);
@@ -710,9 +710,9 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
   }
 
   //------------- config DMRS parameters--------------//
-  dmrs_Uplink_Config->pusch_dmrs_type = pusch_dmrs_type1;
-  dmrs_Uplink_Config->pusch_dmrs_AdditionalPosition = pusch_dmrs_pos0;
-  dmrs_Uplink_Config->pusch_maxLength = pusch_len1;
+  // dmrs_Uplink_Config->pusch_dmrs_type = pusch_dmrs_type1;
+  // dmrs_Uplink_Config->pusch_dmrs_AdditionalPosition = pusch_dmrs_pos0;
+  // dmrs_Uplink_Config->pusch_maxLength = pusch_len1;
   //-------------------------------------------------//
   ue->dmrs_DownlinkConfig.pdsch_dmrs_type = pdsch_dmrs_type1;
   ue->dmrs_DownlinkConfig.pdsch_dmrs_AdditionalPosition = pdsch_dmrs_pos0;
@@ -745,15 +745,13 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
   /////////////////////////PUSCH PTRS init/////////////////////////
   ///////////
 
-  ue->ptrs_configured = 0; // flag to be toggled by RCC
-
   //------------- config PTRS parameters--------------//
-  ptrs_Uplink_Config->timeDensity.ptrs_mcs1 = 0; // setting MCS values to 0 indicate abscence of time_density field in the configuration
-  ptrs_Uplink_Config->timeDensity.ptrs_mcs2 = 0;
-  ptrs_Uplink_Config->timeDensity.ptrs_mcs3 = 0;
-  ptrs_Uplink_Config->frequencyDensity.n_rb0 = 0;     // setting N_RB values to 0 indicate abscence of frequency_density field in the configuration
-  ptrs_Uplink_Config->frequencyDensity.n_rb1 = 0;
-  ptrs_Uplink_Config->resourceElementOffset = 0;
+  // ptrs_Uplink_Config->timeDensity.ptrs_mcs1 = 2; // setting MCS values to 0 indicate abscence of time_density field in the configuration
+  // ptrs_Uplink_Config->timeDensity.ptrs_mcs2 = 4;
+  // ptrs_Uplink_Config->timeDensity.ptrs_mcs3 = 10;
+  // ptrs_Uplink_Config->frequencyDensity.n_rb0 = 25;     // setting N_RB values to 0 indicate abscence of frequency_density field in the configuration
+  // ptrs_Uplink_Config->frequencyDensity.n_rb1 = 75;
+  // ptrs_Uplink_Config->resourceElementOffset = 0;
   //-------------------------------------------------//
 
   ///////////
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c
index aaa138fcd9d8ca066a678496c30b015e70c5edde..f85162e095d4c711439ae0a9eceb2baf38bf1e83 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync_eNB.c
@@ -112,18 +112,12 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
 }
 
 
-int lte_est_timing_advance_pusch(PHY_VARS_eNB *eNB,
-                                 module_id_t UE_id)
+int lte_est_timing_advance_pusch(LTE_DL_FRAME_PARMS *frame_parms,
+                                 int32_t **ul_ch_estimates_time)
 {
   int temp, i, aa, max_pos=0, max_val=0;
   short Re,Im;
 
-  RU_t *ru;
-  ru = RC.ru[UE_id];
-  LTE_DL_FRAME_PARMS *frame_parms = (eNB==NULL) ? ru->frame_parms : &eNB->frame_parms;
-  LTE_eNB_PUSCH *eNB_pusch_vars = (eNB!=NULL) ? eNB->pusch_vars[UE_id] : (LTE_eNB_PUSCH*)NULL;
-  RU_CALIBRATION *calibration = &ru->calibration;
-  int32_t **ul_ch_estimates_time = (eNB==NULL) ? calibration->drs_ch_estimates_time : eNB_pusch_vars->drs_ch_estimates_time;
   uint8_t cyclic_shift = 0;
   int sync_pos = (frame_parms->ofdm_symbol_size-cyclic_shift*frame_parms->ofdm_symbol_size/12)%(frame_parms->ofdm_symbol_size);
   
@@ -149,7 +143,7 @@ int lte_est_timing_advance_pusch(PHY_VARS_eNB *eNB,
     max_pos = max_pos-frame_parms->ofdm_symbol_size;
 
   //#ifdef DEBUG_PHY
-  LOG_D(PHY,"frame %d: max_pos = %d, sync_pos=%d\n",eNB->proc.frame_rx,max_pos,sync_pos);
+  LOG_D(PHY,"max_pos = %d, sync_pos=%d\n",max_pos,sync_pos);
   //#endif //DEBUG_PHY
 
   return max_pos - sync_pos;
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_estimation.h b/openair1/PHY/LTE_ESTIMATION/lte_estimation.h
index 01883224db2c647a44f0c857b9f48456f19e3bcd..fc40280853ec3adb48cc6866041508b8e3e0838b 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_estimation.h
+++ b/openair1/PHY/LTE_ESTIMATION/lte_estimation.h
@@ -220,8 +220,12 @@ void phy_adjust_gain (PHY_VARS_UE *phy_vars_ue,
                       uint32_t rx_power_fil_dB,
                       unsigned char eNB_id);
 
-int lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB,
+int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
                               L1_rxtx_proc_t *proc,
+				  LTE_eNB_ULSCH_t * ulsch,
+				  int32_t **ul_ch_estimates,
+				  int32_t **ul_ch_estimates_time,
+				  int32_t **rxdataF_ext,
                               module_id_t UE_id,
                               uint8_t l,
                               uint8_t Ns);
@@ -258,7 +262,8 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
                            unsigned char number_of_cards,
                            short coef);
 
-int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,module_id_t UE_id);
+int lte_est_timing_advance_pusch(LTE_DL_FRAME_PARMS *frame_parms,
+                                 int32_t **ul_ch_estimates_time);
 
 void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB,
                              int subframe,
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
index 7caaf07406b0355d970165fd8a1eb793f9710197..755111feb812e7f0ad1dec9084dc17520ba0fd6f 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
@@ -34,23 +34,17 @@ static int16_t ru_90c[2*128] = {32767, 0,32766, -402,32758, -804,32746, -1206,32
 
 #define SCALE 0x3FFF
 
-int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB,
+int32_t lte_ul_channel_estimation(LTE_DL_FRAME_PARMS *frame_parms,
                                   L1_rxtx_proc_t *proc,
+				  LTE_eNB_ULSCH_t * ulsch,
+				  int32_t **ul_ch_estimates,
+				  int32_t **ul_ch_estimates_time,
+				  int32_t **rxdataF_ext,
                                   module_id_t UE_id,
                                   unsigned char l,
                                   unsigned char Ns) {
-  RU_t *ru;
-  ru = RC.ru[UE_id];
-  LTE_DL_FRAME_PARMS *frame_parms = (eNB!=NULL) ? &eNB->frame_parms : ru->frame_parms;
-  LTE_eNB_PUSCH *pusch_vars = (eNB!=NULL) ? eNB->pusch_vars[UE_id] : NULL;
-  RU_CALIBRATION *calibration = &ru->calibration;
-  int32_t **ul_ch_estimates = (eNB!=NULL) ? pusch_vars->drs_ch_estimates : calibration->drs_ch_estimates;
-  AssertFatal(ul_ch_estimates != NULL, "ul_ch_estimates is null (eNB %p, pusch %p, pusch->drs_ch_estimates %p, pusch->drs_ch_estimates[0] %p ul_ch_estimates %p UE_id %d)\n",eNB,pusch_vars,
-              pusch_vars->drs_ch_estimates,pusch_vars->drs_ch_estimates[0],ul_ch_estimates,UE_id);
-  int32_t **ul_ch_estimates_time = (eNB!=NULL) ? pusch_vars->drs_ch_estimates_time : calibration->drs_ch_estimates_time;
+  AssertFatal(ul_ch_estimates != NULL, "ul_ch_estimates is null ");
   AssertFatal(ul_ch_estimates_time != NULL, "ul_ch_estimates_time is null\n");
-  int32_t **rxdataF_ext = (eNB!=NULL) ? pusch_vars->rxdataF_ext : calibration->rxdataF_ext;
-
   int subframe = proc->subframe_rx;
 
   uint8_t harq_pid; 
@@ -83,16 +77,16 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB,
 #endif
   int32_t temp_in_ifft_0[2048*2] __attribute__((aligned(32)));
 
-  if (eNB->ulsch[UE_id]->ue_type > 0) harq_pid = 0;
+  if (ulsch->ue_type > 0) harq_pid = 0;
   else {
     harq_pid = subframe2harq_pid(frame_parms,proc->frame_rx,subframe);
   }
 
-  uint16_t N_rb_alloc = eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb;
+  uint16_t N_rb_alloc = ulsch->harq_processes[harq_pid]->nb_rb;
   int32_t tmp_estimates[N_rb_alloc*12] __attribute__((aligned(16)));
   Msc_RS = N_rb_alloc*12;
   cyclic_shift = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift +
-                  eNB->ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS2 +
+                  ulsch->harq_processes[harq_pid]->n_DMRS2 +
                   frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[(subframe<<1)+Ns]) % 12;
   Msc_idx_ptr = (uint16_t *) bsearch(&Msc_RS, dftsizes, 34, sizeof(uint16_t), compareints);
 
@@ -276,7 +270,7 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB,
 #if T_TRACER
 
       if (aa == 0)
-        T(T_ENB_PHY_UL_CHANNEL_ESTIMATE, T_INT(0), T_INT(eNB->ulsch[UE_id]->rnti),
+        T(T_ENB_PHY_UL_CHANNEL_ESTIMATE, T_INT(0), T_INT(ulsch->rnti),
           T_INT(proc->frame_rx), T_INT(subframe),
           T_INT(0), T_BUFFER(ul_ch_estimates_time[0], 512  * 4));
 
diff --git a/openair1/PHY/LTE_REFSIG/mod_table.h b/openair1/PHY/LTE_REFSIG/mod_table.h
index 7bdc1f518f1c072c2381e13ec726154af1e66493..29ae9f4495dfcfea473fbbeb1f0b9fba5d521857 100644
--- a/openair1/PHY/LTE_REFSIG/mod_table.h
+++ b/openair1/PHY/LTE_REFSIG/mod_table.h
@@ -19,9 +19,14 @@
  *      contact@openairinterface.org
  */
 
+#ifndef __PHY_LTE_REFSIG_MOD_TABLE__H__
+#define __PHY_LTE_REFSIG_MOD_TABLE__H__
+
 #define MOD_TABLE_SIZE_SHORT 304
 #define MOD_TABLE_QPSK_OFFSET 1
 #define MOD_TABLE_16QAM_OFFSET 5
 #define MOD_TABLE_64QAM_OFFSET 21
 #define MOD_TABLE_PSS_OFFSET 85
 short mod_table[MOD_TABLE_SIZE_SHORT] = {0,0,768,768,768,-768,-768,768,-768,-768,343,343,343,1030,1030,343,1030,1030,343,-343,343,-1030,1030,-343,1030,-1030,-343,343,-343,1030,-1030,343,-1030,1030,-343,-343,-343,-1030,-1030,-343,-1030,-1030,503,503,503,168,168,503,168,168,503,838,503,1173,168,838,168,1173,838,503,838,168,1173,503,1173,168,838,838,838,1173,1173,838,1173,1173,503,-503,503,-168,168,-503,168,-168,503,-838,503,-1173,168,-838,168,-1173,838,-503,838,-168,1173,-503,1173,-168,838,-838,838,-1173,1173,-838,1173,-1173,-503,503,-503,168,-168,503,-168,168,-503,838,-503,1173,-168,838,-168,1173,-838,503,-838,168,-1173,503,-1173,168,-838,838,-838,1173,-1173,838,-1173,1173,-503,-503,-503,-168,-168,-503,-168,-168,-503,-838,-503,-1173,-168,-838,-168,-1173,-838,-503,-838,-168,-1173,-503,-1173,-168,-838,-838,-838,-1173,-1173,-838,-1173,-1173,1086,0,1081,-108,1065,-215,1038,-320,1001,-422,954,-519,897,-612,832,-698,758,-777,677,-849,589,-912,495,-966,397,-1011,294,-1046,189,-1070,81,-1083,-27,-1086,-135,-1078,-242,-1059,-346,-1030,-447,-990,-543,-941,-634,-882,-719,-814,-796,-739,-866,-656,-927,-566,-979,-471,-1021,-371,-1053,-268,-1074,-162,-1085,-54,-1085,54,-1074,162,-1053,268,-1021,371,-979,471,-927,566,-866,656,-796,739,-719,814,-634,882,-543,941,-447,990,-346,1030,-242,1059,-135,1078,-27,1086,81,1083,189,1070,294,1045,397,1011,495,966,589,912,677,849,758,777,832,698,897,612,954,519,1001,422,1038,320,1065,215,1081,108,16384,0,8192,0,4096,0,2048,0};
+
+#endif
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h
index 9673ba15b503df82ee7ca7befb7f09d1bd2e6fd0..5a08b7a40238256aef630e97749ad8f7d283b05c 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h
@@ -19,6 +19,9 @@
  *      contact@openairinterface.org
  */
 
+#ifndef __DLSCH_TBS_FULL__H__
+#define __DLSCH_TBS_FULL__H__
+
 #define TBStable_rowCnt 27
 
 /** \brief "Transport block size table"
@@ -54,3 +57,4 @@ unsigned int TBStable[TBStable_rowCnt][110] = {{16,32,56,88,120,152,176,208,224,
 };
 
 unsigned int TBStable1C[32] = {40, 56, 72, 120, 136, 144, 176, 208, 224, 256, 280, 296, 328, 336, 392, 488, 552, 600, 632, 696, 776, 840, 904, 1000, 1064, 1128, 1224, 1288, 1384, 1480, 1608, 1736};
+#endif
diff --git a/openair1/PHY/LTE_TRANSPORT/prach_extern.h b/openair1/PHY/LTE_TRANSPORT/prach_extern.h
index 2f8a83e24f2a052e3359cd499e8dddf395a5671d..47fbd93ad7c964d2a15dd5215ca315e80a69f90b 100644
--- a/openair1/PHY/LTE_TRANSPORT/prach_extern.h
+++ b/openair1/PHY/LTE_TRANSPORT/prach_extern.h
@@ -29,6 +29,10 @@
  * \note
  * \warning
  */
+
+#ifndef __PHY_LTE_TRANSPORT_PRACH_EXTERN__H__
+#define __PHY_LTE_TRANSPORT_PRACH_EXTERN__H__
+
 #include "PHY/sse_intrin.h"
 #include "PHY/defs_eNB.h"
 #include "PHY/phy_extern.h"
@@ -91,3 +95,4 @@ void compute_prach_seq(uint16_t rootSequenceIndex,
 		       lte_frame_type_t frame_type,
 		       uint32_t X_u[64][839]);
 
+#endif
diff --git a/openair1/PHY/LTE_TRANSPORT/pucch_extern.h b/openair1/PHY/LTE_TRANSPORT/pucch_extern.h
index 899b90430670af54af65a918d859689646e1129c..b15137488803b1d42c8ab9f3faf34efb9fc49c5a 100644
--- a/openair1/PHY/LTE_TRANSPORT/pucch_extern.h
+++ b/openair1/PHY/LTE_TRANSPORT/pucch_extern.h
@@ -30,6 +30,9 @@
 * \warning
 */
 
+#ifndef __PHY_LTE_TRANSPORT_PUCCH_EXTERN__H__
+#define __PHY_LTE_TRANSPORT_PUCCH_EXTERN__H__
+
 #include <stdint.h>
 
 /* PUCCH format3 >> */
@@ -76,3 +79,5 @@ extern uint8_t Np4_TBL[4];
 // alpha_TBL
 extern int16_t alphaTBL_re[12];
 extern int16_t alphaTBL_im[12];
+
+#endif
diff --git a/openair1/PHY/LTE_TRANSPORT/transport_extern.h b/openair1/PHY/LTE_TRANSPORT/transport_extern.h
index 357d31ca1076099d14ac7cc7795192ba63420ce8..8b33449ccaf06762fc5b786e4969c12c7dfc67c9 100644
--- a/openair1/PHY/LTE_TRANSPORT/transport_extern.h
+++ b/openair1/PHY/LTE_TRANSPORT/transport_extern.h
@@ -22,7 +22,7 @@
 extern unsigned int dlsch_tbs25[27][25],TBStable[27][110],TBStable1C[32];
 extern unsigned short lte_cqi_eff1024[16];
 extern char lte_cqi_snr_dB[15];
-extern short conjugate[8],conjugate2[8];
+extern const short conjugate[8],conjugate2[8];
 extern short minus_one[8];
 extern short minus_one[8];
 extern short *ul_ref_sigs[30][2][34];
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
index 90492b999991905e8829d35447dda2716bb61913..92fe77720115b933095a05521fe8677021e6ef19 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
@@ -495,7 +495,7 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *eNB,
   }
 
   AssertFatal(sumKr>0,
-              "[eNB] ulsch_decoding.c: FATAL sumKr is 0! (Nid_cell %d, rnti %x, x2 %x): harq_pid %d round %d, RV %d, O_RI %d, O_ACK %d, G %d, subframe %d\n",
+              "[eNB] ulsch_decoding.c: FATAL sumKr is 0! (Nid_cell %d, rnti %x, x2 %x): harq_pid %d round %d, RV %d, O_RI %d, O_ACK %d, G %u, subframe %d\n",
               frame_parms->Nid_cell,ulsch->rnti,x2,
               harq_pid,
               ulsch_harq->round,
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
index f357e385f0d8e01af770485425788f81b074ae81..1b23fc99bf3de76c424a4142ba1514a5243c2d0e 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
@@ -1047,7 +1047,11 @@ void rx_ulsch(PHY_VARS_eNB *eNB,
                              l%(frame_parms->symbols_per_tti/2),
                              l/(frame_parms->symbols_per_tti/2),
                              frame_parms);
-    lte_ul_channel_estimation(eNB,proc,
+    lte_ul_channel_estimation(&eNB->frame_parms,proc,
+		              eNB->ulsch[UE_id],
+		              eNB->pusch_vars[UE_id]->drs_ch_estimates,
+			      eNB->pusch_vars[UE_id]->drs_ch_estimates_time,
+			      eNB->pusch_vars[UE_id]->rxdataF_ext,
                               UE_id,
                               l%(frame_parms->symbols_per_tti/2),
                               l/(frame_parms->symbols_per_tti/2));
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/sldch.c b/openair1/PHY/LTE_UE_TRANSPORT/sldch.c
index 9c9d36c9746f5a8143544a21de67b5512210dd50..8769d5f81bff04e5b87d40b19e4a2ca0282b32d5 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/sldch.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/sldch.c
@@ -29,8 +29,6 @@
  * \note
  * \warning
  */
-#ifndef __LTE_TRANSPORT_SLSS__C__
-#define __LTE_TRANSPORT_SLSS__C__
 #include "PHY/defs_UE.h"
 
 extern int multicast_link_write_sock(int groupP, char *dataP, uint32_t sizeP);
@@ -63,4 +61,3 @@ void generate_sldch(PHY_VARS_UE *ue,SLDCH_t *sldch,int frame_tx,int subframe_tx)
 }
 
 
-#endif
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/slsch.c b/openair1/PHY/LTE_UE_TRANSPORT/slsch.c
index e51e33626df38a277c41922b6150bfd392bff901..e4e94a232d7be7c27ebe098a8bc8a87c06a753f1 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/slsch.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/slsch.c
@@ -29,8 +29,6 @@
  * \note
  * \warning
  */
-#ifndef __LTE_TRANSPORT_SLSS__C__
-#define __LTE_TRANSPORT_SLSS__C__
 #include "PHY/defs_UE.h"
 
 extern int
@@ -66,5 +64,3 @@ void generate_slsch(PHY_VARS_UE *ue,SLSCH_t *slsch,int frame_tx,int subframe_tx)
     
   }
 }
-
-#endif
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/slss.c b/openair1/PHY/LTE_UE_TRANSPORT/slss.c
index 18bc5a28dec8826a63ebef68eec43654561bf6da..3cd1c1acb09f00f59fee1b185f7e400d1a3a5978 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/slss.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/slss.c
@@ -29,8 +29,6 @@
  * \note
  * \warning
  */
-#ifndef __LTE_TRANSPORT_SLSS__C__
-#define __LTE_TRANSPORT_SLSS__C__
 #include "PHY/defs_UE.h"
 
 
@@ -39,5 +37,3 @@ void generate_slss(PHY_VARS_UE *ue,SLSS_t *slss,int frame_tx,int subframe_tx) {
   AssertFatal(1==0,"Should get here yet for UE %d\n",ue->Mod_id);
 
 }
-
-#endif
diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c
index c5c4d0b63821ac78cbb6d43a382f0c65be4cfcb2..108a36a679a7fb411dde303dea3634c86c04dc09 100644
--- a/openair1/PHY/MODULATION/slot_fep_nr.c
+++ b/openair1/PHY/MODULATION/slot_fep_nr.c
@@ -25,6 +25,7 @@
 #include "nr_modulation.h"
 #include "PHY/LTE_ESTIMATION/lte_estimation.h"
 #include "PHY/NR_UE_ESTIMATION/nr_estimation.h"
+#include <common/utils/LOG/log.h>
 
 //#define DEBUG_FEP
 
@@ -338,7 +339,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
 #endif
 
 
-        dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
+        dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
             (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
 #if UE_TIMING_TRACE
         stop_meas(&ue->rx_dft_stats);
@@ -362,7 +363,7 @@ int nr_slot_fep_init_sync(PHY_VARS_NR_UE *ue,
         dft(dftsize,(int16_t *)tmp_dft_in,
             (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
       } else { // use dft input from RX buffer directly
-        dft(dftsize,(int16_t *) &common_vars->rxdata[aa][(rx_offset) % frame_length_samples],
+        dft(dftsize,(int16_t *) &common_vars->rxdata[aa][rx_offset],
             (int16_t *)&common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[Ns]].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],1);
       }
 #if UE_TIMING_TRACE
diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.c b/openair1/PHY/NR_REFSIG/dmrs_nr.c
index ed37a79d0f243f43aa9c61a39fab2dfdbba02dcc..8718fc86102108fa982b899c6915d944fe6dc378 100644
--- a/openair1/PHY/NR_REFSIG/dmrs_nr.c
+++ b/openair1/PHY/NR_REFSIG/dmrs_nr.c
@@ -35,143 +35,6 @@
 
 /***********************************************************************/
 
-// TS 38.211 Table 6.4.1.1.3-3: PUSCH DMRS positions l' within a slot for single-symbol DMRS and intra-slot frequency hopping disabled.
-// The first 4 colomns are PUSCH mapping type A and the last 4 colomns are PUSCH mapping type B.
-// When l' = l0, it is represented by 1
-// E.g. when symbol duration is 12 in colomn 7, value 1057 ('10000100001') which means l' =  l0, 5, 10.
-
-int32_t table_6_4_1_1_3_3_pusch_dmrs_positions_l [12][8] = {                             // Duration in symbols
-{-1,          -1,          -1,         -1,          1,          1,         1,         1},       //<4              // (DMRS l' position)
-{1,            1,           1,          1,          1,          1,         1,         1},       //4               // (DMRS l' position)
-{1,            1,           1,          1,          1,          5,         5,         5},       //5               // (DMRS l' position)
-{1,            1,           1,          1,          1,          5,         5,         5},       //6               // (DMRS l' position)
-{1,            1,           1,          1,          1,          5,         5,         5},       //7               // (DMRS l' position)
-{1,          129,         129,        129,          1,         65,        73,        73},       //8               // (DMRS l' position)
-{1,          129,         129,        129,          1,         65,        73,        73},       //9               // (DMRS l' position)
-{1,          513,         577,        577,          1,        257,       273,       585},       //10              // (DMRS l' position)
-{1,          513,         577,        577,          1,        257,       273,       585},       //11              // (DMRS l' position)
-{1,          513,         577,       2337,          1,       1025,      1057,       585},       //12              // (DMRS l' position)
-{1,         2049,        2177,       2337,          1,       1025,      1057,       585},       //13              // (DMRS l' position)
-{1,         2049,        2177,       2337,          1,       1025,      1057,       585},       //14              // (DMRS l' position)
-};
-
-
-// TS 38.211 Table 6.4.1.1.3-4: PUSCH DMRS positions l' within a slot for double-symbol DMRS and intra-slot frequency hopping disabled.
-// The first 4 colomns are PUSCH mapping type A and the last 4 colomns are PUSCH mapping type B.
-// When l' = l0, it is represented by 1
-
-int32_t table_6_4_1_1_3_4_pusch_dmrs_positions_l [12][8] = {                             // Duration in symbols
-{-1,          -1,          -1,         -1,         -1,         -1,        -1,         -1},       //<4              // (DMRS l' position)
-{1,            1,          -1,         -1,         -1,         -1,        -1,         -1},       //4               // (DMRS l' position)
-{1,            1,          -1,         -1,          1,          1,        -1,         -1},       //5               // (DMRS l' position)
-{1,            1,          -1,         -1,          1,          1,        -1,         -1},       //6               // (DMRS l' position)
-{1,            1,          -1,         -1,          1,          1,        -1,         -1},       //7               // (DMRS l' position)
-{1,            1,          -1,         -1,          1,         33,        -1,         -1},       //8               // (DMRS l' position)
-{1,            1,          -1,         -1,          1,         33,        -1,         -1},       //9               // (DMRS l' position)
-{1,          257,          -1,         -1,          1,        129,        -1,         -1},       //10              // (DMRS l' position)
-{1,          257,          -1,         -1,          1,        129,        -1,         -1},       //11              // (DMRS l' position)
-{1,          257,          -1,         -1,          1,        513,        -1,         -1},       //12              // (DMRS l' position)
-{1,         1025,          -1,         -1,          1,        513,        -1,         -1},       //13              // (DMRS l' position)
-{1,         1025,          -1,         -1,          1,        513,        -1,         -1},       //14              // (DMRS l' position)
-};
-
-int32_t get_l_prime(uint8_t duration_in_symbols, uint8_t mapping_type, pusch_dmrs_AdditionalPosition_t additional_pos, pusch_maxLength_t pusch_maxLength) {
-
-  uint8_t row, colomn;
-  int32_t l_prime;
-
-  colomn = additional_pos;
-
-  if (mapping_type == typeB)
-    colomn += 4;
-
-  if (duration_in_symbols < 4)
-    row = 0;
-  else
-    row = duration_in_symbols - 3;
-
-  if (pusch_maxLength == pusch_len1)
-    l_prime = table_6_4_1_1_3_3_pusch_dmrs_positions_l[row][colomn];
-  else
-    l_prime = table_6_4_1_1_3_4_pusch_dmrs_positions_l[row][colomn];
-
-  AssertFatal(l_prime>0,"invalid l_prime < 0\n");
-
-  return l_prime;
-}
-
-/*******************************************************************
-*
-* NAME :         is_dmrs_symbol
-*
-* PARAMETERS : l                      ofdm symbol index within slot
-*              k                      subcarrier index
-*              start_sc               first subcarrier index
-*              k_prime                index alternating 0 and 1
-*              n                      index starting 0,1,...
-*              delta                  see Table 6.4.1.1.3
-*              duration_in_symbols    number of scheduled PUSCH ofdm symbols
-*              dmrs_UplinkConfig      DMRS uplink configuration
-*              mapping_type           PUSCH mapping type (A or B)
-*              ofdm_symbol_size       IFFT size
-*
-* RETURN :       0 if symbol(k,l) is data, or 1 if symbol(k,l) is dmrs
-*
-* DESCRIPTION :  3GPP TS 38.211 6.4.1.1 Demodulation reference signal for PUSCH
-*
-*********************************************************************/
-
-uint8_t is_dmrs_symbol(uint8_t l,
-                       uint16_t k,
-                       uint16_t start_sc,
-                       uint8_t k_prime,
-                       uint16_t n,
-                       uint8_t delta,
-                       uint8_t duration_in_symbols,
-                       uint8_t dmrs_type,
-                       uint16_t ofdm_symbol_size) {
-
-  uint8_t is_dmrs_freq, is_dmrs_time, l0;
-  int32_t l_prime_mask;
-  pusch_dmrs_AdditionalPosition_t additional_pos = pusch_dmrs_pos0;
-  pusch_maxLength_t pusch_maxLength = pusch_len1;
-  uint8_t mapping_type = typeB;
-
-  is_dmrs_freq = 0;
-  is_dmrs_time = 0;
-
-
-  l0 = get_l0_ul(mapping_type, 2);
-  l_prime_mask = get_l_prime(duration_in_symbols, mapping_type, additional_pos, pusch_maxLength);
-
-  if (k == ((start_sc+get_dmrs_freq_idx_ul(n, k_prime, delta, dmrs_type))%ofdm_symbol_size))
-    is_dmrs_freq = 1;
-
-
-  if (l_prime_mask == 1){
-
-    if (l == l0)
-      is_dmrs_time = 1;
-
-  } else if ( (l==l0) || (((l_prime_mask>>l)&1) == 1 && l!=0) )
-    is_dmrs_time = 1;
-
-  if (pusch_maxLength == pusch_len2){
-
-    if (((l_prime_mask>>(l-1))&1) == 1 && l!=0 && l!=1)
-      is_dmrs_time = 1;
-
-    if (l-1 == l0)
-      is_dmrs_time = 1;
-
-  }
-
-  if (is_dmrs_time && is_dmrs_freq)
-    return 1;
-  else
-    return 0;
-
-}
 
 /*******************************************************************
 *
@@ -364,25 +227,6 @@ void lte_gold_new(LTE_DL_FRAME_PARMS *frame_parms, uint32_t lte_gold_table[20][2
 #endif
 }
 
-/*******************************************************************
-*
-* NAME :         get_l0_ul
-*
-* PARAMETERS :   mapping_type : PUSCH mapping type
-*                dmrs_typeA_position  : higher layer parameter
-*
-* RETURN :       demodulation reference signal for PUSCH
-*
-* DESCRIPTION :  see TS 38.211 V15.4.0 Demodulation reference signals for PUSCH
-*
-*********************************************************************/
-
-uint8_t get_l0_ul(uint8_t mapping_type, uint8_t dmrs_typeA_position) {
-
-  return ((mapping_type==typeA)?dmrs_typeA_position:0);
-
-}
-
 /*******************************************************************
 *
 * NAME :         get_dmrs_freq_idx_ul
diff --git a/openair1/PHY/NR_REFSIG/dmrs_nr.h b/openair1/PHY/NR_REFSIG/dmrs_nr.h
index f1dfffff8b516b96d5b821cd6e28c0600b23d6ab..6badf71745febf276cbe39cd057198ff9f1a3da7 100644
--- a/openair1/PHY/NR_REFSIG/dmrs_nr.h
+++ b/openair1/PHY/NR_REFSIG/dmrs_nr.h
@@ -54,21 +54,8 @@
 int pseudo_random_sequence(int M_PN, uint32_t *c, uint32_t cinit);
 void lte_gold_new(LTE_DL_FRAME_PARMS *frame_parms, uint32_t lte_gold_table[20][2][14], uint16_t Nid_cell);
 void generate_dmrs_pbch(uint32_t dmrs_pbch_bitmap[DMRS_PBCH_I_SSB][DMRS_PBCH_N_HF][DMRS_BITMAP_SIZE], uint16_t Nid_cell);
-uint8_t get_l0_ul(uint8_t mapping_type, uint8_t dmrs_typeA_position);
 uint16_t get_dmrs_freq_idx_ul(uint16_t n, uint8_t k_prime, uint8_t delta, uint8_t dmrs_type);
 
-int32_t get_l_prime(uint8_t duration_in_symbols, uint8_t mapping_type, pusch_dmrs_AdditionalPosition_t additional_pos, pusch_maxLength_t pusch_maxLength);
-
-uint8_t is_dmrs_symbol(uint8_t l,
-                       uint16_t k,
-                       uint16_t start_sc,
-                       uint8_t k_prime,
-                       uint16_t n,
-                       uint8_t delta,
-                       uint8_t duration_in_symbols,
-                       uint8_t dmrs_type,
-                       uint16_t ofdm_symbol_size);
-
 #undef EXTERN
 
 #endif /* DMRS_NR_H */
diff --git a/openair1/PHY/NR_REFSIG/nr_mod_table.h b/openair1/PHY/NR_REFSIG/nr_mod_table.h
index a99842969906e03b4214acb8089de687395a631c..c34dadb663e8faf88efcb1851f38028c6b113b1d 100644
--- a/openair1/PHY/NR_REFSIG/nr_mod_table.h
+++ b/openair1/PHY/NR_REFSIG/nr_mod_table.h
@@ -1,3 +1,27 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#ifndef __PHY_NR_REFSIG_NR_MOD_TABLE__H__
+#define __PHY_NR_REFSIG_NR_MOD_TABLE__H__
+
 #define NR_MOD_TABLE_SIZE_SHORT 686
 #define NR_MOD_TABLE_BPSK_OFFSET 1
 #define NR_MOD_TABLE_QPSK_OFFSET 3
@@ -5,3 +29,5 @@
 #define NR_MOD_TABLE_QAM64_OFFSET 23
 #define NR_MOD_TABLE_QAM256_OFFSET 87
 short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT] = {0,0,16384,16384,-16384,-16384,16384,16384,16384,-16384,-16384,16384,-16384,-16384,7327,7327,7327,21981,21981,7327,21981,21981,7327,-7327,7327,-21981,21981,-7327,21981,-21981,-7327,7327,-7327,21981,-21981,7327,-21981,21981,-7327,-7327,-7327,-21981,-21981,-7327,-21981,-21981,10726,10726,10726,3576,3576,10726,3576,3576,10726,17876,10726,25027,3576,17876,3576,25027,17876,10726,17876,3576,25027,10726,25027,3576,17876,17876,17876,25027,25027,17876,25027,25027,10726,-10726,10726,-3576,3576,-10726,3576,-3576,10726,-17876,10726,-25027,3576,-17876,3576,-25027,17876,-10726,17876,-3576,25027,-10726,25027,-3576,17876,-17876,17876,-25027,25027,-17876,25027,-25027,-10726,10726,-10726,3576,-3576,10726,-3576,3576,-10726,17876,-10726,25027,-3576,17876,-3576,25027,-17876,10726,-17876,3576,-25027,10726,-25027,3576,-17876,17876,-17876,25027,-25027,17876,-25027,25027,-10726,-10726,-10726,-3576,-3576,-10726,-3576,-3576,-10726,-17876,-10726,-25027,-3576,-17876,-3576,-25027,-17876,-10726,-17876,-3576,-25027,-10726,-25027,-3576,-17876,-17876,-17876,-25027,-25027,-17876,-25027,-25027,8886,8886,8886,12439,12439,8886,12439,12439,8886,5332,8886,1778,12439,5332,12439,1778,5332,8886,5332,12439,1778,8886,1778,12439,5332,5332,5332,1778,1778,5332,1778,1778,8886,19547,8886,15993,12439,19547,12439,15993,8886,23101,8886,26655,12439,23101,12439,26655,5332,19547,5332,15993,1778,19547,1778,15993,5332,23101,5332,26655,1778,23101,1778,26655,19547,8886,19547,12439,15993,8886,15993,12439,19547,5332,19547,1778,15993,5332,15993,1778,23101,8886,23101,12439,26655,8886,26655,12439,23101,5332,23101,1778,26655,5332,26655,1778,19547,19547,19547,15993,15993,19547,15993,15993,19547,23101,19547,26655,15993,23101,15993,26655,23101,19547,23101,15993,26655,19547,26655,15993,23101,23101,23101,26655,26655,23101,26655,26655,8886,-8886,8886,-12439,12439,-8886,12439,-12439,8886,-5332,8886,-1778,12439,-5332,12439,-1778,5332,-8886,5332,-12439,1778,-8886,1778,-12439,5332,-5332,5332,-1778,1778,-5332,1778,-1778,8886,-19547,8886,-15993,12439,-19547,12439,-15993,8886,-23101,8886,-26655,12439,-23101,12439,-26655,5332,-19547,5332,-15993,1778,-19547,1778,-15993,5332,-23101,5332,-26655,1778,-23101,1778,-26655,19547,-8886,19547,-12439,15993,-8886,15993,-12439,19547,-5332,19547,-1778,15993,-5332,15993,-1778,23101,-8886,23101,-12439,26655,-8886,26655,-12439,23101,-5332,23101,-1778,26655,-5332,26655,-1778,19547,-19547,19547,-15993,15993,-19547,15993,-15993,19547,-23101,19547,-26655,15993,-23101,15993,-26655,23101,-19547,23101,-15993,26655,-19547,26655,-15993,23101,-23101,23101,-26655,26655,-23101,26655,-26655,-8886,8886,-8886,12439,-12439,8886,-12439,12439,-8886,5332,-8886,1778,-12439,5332,-12439,1778,-5332,8886,-5332,12439,-1778,8886,-1778,12439,-5332,5332,-5332,1778,-1778,5332,-1778,1778,-8886,19547,-8886,15993,-12439,19547,-12439,15993,-8886,23101,-8886,26655,-12439,23101,-12439,26655,-5332,19547,-5332,15993,-1778,19547,-1778,15993,-5332,23101,-5332,26655,-1778,23101,-1778,26655,-19547,8886,-19547,12439,-15993,8886,-15993,12439,-19547,5332,-19547,1778,-15993,5332,-15993,1778,-23101,8886,-23101,12439,-26655,8886,-26655,12439,-23101,5332,-23101,1778,-26655,5332,-26655,1778,-19547,19547,-19547,15993,-15993,19547,-15993,15993,-19547,23101,-19547,26655,-15993,23101,-15993,26655,-23101,19547,-23101,15993,-26655,19547,-26655,15993,-23101,23101,-23101,26655,-26655,23101,-26655,26655,-8886,-8886,-8886,-12439,-12439,-8886,-12439,-12439,-8886,-5332,-8886,-1778,-12439,-5332,-12439,-1778,-5332,-8886,-5332,-12439,-1778,-8886,-1778,-12439,-5332,-5332,-5332,-1778,-1778,-5332,-1778,-1778,-8886,-19547,-8886,-15993,-12439,-19547,-12439,-15993,-8886,-23101,-8886,-26655,-12439,-23101,-12439,-26655,-5332,-19547,-5332,-15993,-1778,-19547,-1778,-15993,-5332,-23101,-5332,-26655,-1778,-23101,-1778,-26655,-19547,-8886,-19547,-12439,-15993,-8886,-15993,-12439,-19547,-5332,-19547,-1778,-15993,-5332,-15993,-1778,-23101,-8886,-23101,-12439,-26655,-8886,-26655,-12439,-23101,-5332,-23101,-1778,-26655,-5332,-26655,-1778,-19547,-19547,-19547,-15993,-15993,-19547,-15993,-15993,-19547,-23101,-19547,-26655,-15993,-23101,-15993,-26655,-23101,-19547,-23101,-15993,-26655,-19547,-26655,-15993,-23101,-23101,-23101,-26655,-26655,-23101,-26655,-26655};
+
+#endif
diff --git a/openair1/PHY/NR_REFSIG/ptrs_nr.c b/openair1/PHY/NR_REFSIG/ptrs_nr.c
index 12f76b950f139e2e100bc758f8a8ef673ef411bb..785252126af64cb1e5df2948c2a27038e906f1dd 100644
--- a/openair1/PHY/NR_REFSIG/ptrs_nr.c
+++ b/openair1/PHY/NR_REFSIG/ptrs_nr.c
@@ -38,18 +38,18 @@
 /***********************************************************************/
 
 
- //#define max(a,b) (((a) > (b)) ? (a) : (b))
+//#define max(a,b) (((a) > (b)) ? (a) : (b))
 
 // TS 38.211 Table 6.4.1.2.2.1-1: The parameter kRE_ref.
 // The first 4 colomns are DM-RS Configuration type 1 and the last 4 colomns are DM-RS Configuration type 2.
 
 int16_t table_6_4_1_2_2_1_1_pusch_ptrs_kRE_ref [6][8] = {
-{ 0,            2,           6,          8,          0,          1,         6,         7},
-{ 2,            4,           8,         10,          1,          6,         7,         0},
-{ 1,            3,           7,          9,          2,          3,         8,         9},
-{ 3,            5,           9,         11,          3,          8,         9,         2},
-{-1,           -1,          -1,         -1,          4,          5,        10,        11},
-{-1,           -1,          -1,         -1,          5,         10,        11,         4},
+  { 0,            2,           6,          8,          0,          1,         6,         7},
+  { 2,            4,           8,         10,          1,          6,         7,         0},
+  { 1,            3,           7,          9,          2,          3,         8,         9},
+  { 3,            5,           9,         11,          3,          8,         9,         2},
+  {-1,           -1,          -1,         -1,          4,          5,        10,        11},
+  {-1,           -1,          -1,         -1,          5,         10,        11,         4},
 };
 
 
@@ -68,55 +68,20 @@ int16_t table_6_4_1_2_2_1_1_pusch_ptrs_kRE_ref [6][8] = {
 *********************************************************************/
 
 int16_t get_kRE_ref(uint8_t dmrs_antenna_port, uint8_t pusch_dmrs_type, uint8_t resourceElementOffset) {
-
   uint8_t colomn;
   int16_t k_RE_ref;
-
   colomn = resourceElementOffset;
 
   if (pusch_dmrs_type == 2)
     colomn += 4;
 
   k_RE_ref = table_6_4_1_2_2_1_1_pusch_ptrs_kRE_ref[dmrs_antenna_port][colomn];
-
   AssertFatal(k_RE_ref>=0,"invalid k_RE_ref < 0. Check PTRS Configuration\n");
-
   return k_RE_ref;
 }
 
 
-/*******************************************************************
-*
-* NAME :         get_K_ptrs
-*
-* PARAMETERS :   ptrs_UplinkConfig      PTRS uplink configuration
-*                N_RB                   number of RBs scheduled for PUSCH
-*
-* RETURN :       the parameter K_ptrs
-*
-* DESCRIPTION :  3GPP TS 38.214 6.2.3 Table 6.2.3.1-2
-*
-*********************************************************************/
-
-uint8_t get_K_ptrs(ptrs_UplinkConfig_t *ptrs_UplinkConfig, uint16_t N_RB){
-
-	uint16_t nrb0, nrb1;
-
-	nrb0 = ptrs_UplinkConfig->frequencyDensity.n_rb0;
-	nrb1 = ptrs_UplinkConfig->frequencyDensity.n_rb1;
 
-	if (nrb0 == 0 || nrb0 == 0)
-		return 2;
-
-	if (N_RB < nrb0){
-		LOG_I(PHY,"PUSH PT-RS is not present.\n");
-		return 0;
-	}
-	else if (N_RB >= nrb0 && N_RB < nrb1)
-		return 2;
-	else
-		return 4;
-}
 
 /*******************************************************************
 *
@@ -126,7 +91,7 @@ uint8_t get_K_ptrs(ptrs_UplinkConfig_t *ptrs_UplinkConfig, uint16_t N_RB){
 *                duration_in_symbols    number of scheduled PUSCH ofdm symbols
 *                start_symbol           first ofdm symbol of PUSCH within slot
 *                L_ptrs                 the parameter L_ptrs
-*                ofdm_symbol_size       FFT size
+*                ul_dmrs_symb_pos       bitmap of the time domain positions of the DMRS symbols in the scheduled PUSCH
 *
 * RETURN :       sets the bit map of PTRS ofdm symbol indicies
 *
@@ -137,54 +102,31 @@ uint8_t get_K_ptrs(ptrs_UplinkConfig_t *ptrs_UplinkConfig, uint16_t N_RB){
 void set_ptrs_symb_idx(uint16_t *ptrs_symbols,
                        uint8_t duration_in_symbols,
                        uint8_t start_symbol,
-                       uint8_t dmrs_type,
                        uint8_t L_ptrs,
-                       uint8_t pusch_maxLength,
-                       uint16_t ofdm_symbol_size) {
+                       uint16_t ul_dmrs_symb_pos) {
 
-  uint8_t i, last_symbol, is_dmrs_symbol1, is_dmrs_symbol2;
-  int16_t l_ref;
-
-  *ptrs_symbols = 0;
-  i = 0;
-  is_dmrs_symbol1 = 0;
-  is_dmrs_symbol2 = 0;
-  l_ref = start_symbol;
-  last_symbol = start_symbol + duration_in_symbols - 1;
+  uint8_t i = 0, last_symbol, is_dmrs_symbol, l_ref;
+  int8_t l_counter;
+  l_ref         = start_symbol;
+  last_symbol   = start_symbol + duration_in_symbols - 1;
 
   while ( (l_ref + i*L_ptrs) <= last_symbol) {
 
-    is_dmrs_symbol1 = is_dmrs_symbol(max((l_ref + (i-1)*L_ptrs + 1), l_ref),
-                                     0,
-                                     0,
-                                     0,
-                                     0,
-                                     0,
-                                     duration_in_symbols,
-                                     dmrs_type,
-                                     ofdm_symbol_size);
-
-    is_dmrs_symbol2 = is_dmrs_symbol(l_ref + i*L_ptrs,
-                                     0,
-                                     0,
-                                     0,
-                                     0,
-                                     0,
-                                     duration_in_symbols,
-                                     dmrs_type,
-                                     ofdm_symbol_size);
-
-    if ( is_dmrs_symbol1 + is_dmrs_symbol2 > 0 ) {
-
-      if (pusch_maxLength == 2)
-        l_ref = l_ref + i*L_ptrs + 1;
-      else
-        l_ref = l_ref + i*L_ptrs;
-
-       i = 1;
-
-       continue;
+    is_dmrs_symbol = 0;
+
+    for(l_counter = l_ref + i*L_ptrs; l_counter >= max(l_ref + (i-1)*L_ptrs + 1, l_ref); l_counter--) {
 
+      if((ul_dmrs_symb_pos >> l_counter) & 0x01) {
+        is_dmrs_symbol = 1;
+        break;
+      }
+
+    }
+
+    if (is_dmrs_symbol) {
+      l_ref = l_counter;
+      i     = 1;
+      continue;
     }
 
     *ptrs_symbols = *ptrs_symbols | (1<<(l_ref + i*L_ptrs));
@@ -192,53 +134,19 @@ void set_ptrs_symb_idx(uint16_t *ptrs_symbols,
   }
 }
 
-/*******************************************************************
-*
-* NAME :         get_L_ptrs
-*
-* PARAMETERS :   ptrs_UplinkConfig      PTRS uplink configuration
-*                I_mcs                  MCS index used for PUSCH
-*
-* RETURN :       the parameter L_ptrs
-*
-* DESCRIPTION :  3GPP TS 38.214 6.2.3 Table 6.2.3.1-1
-*
-*********************************************************************/
-
-uint8_t get_L_ptrs(ptrs_UplinkConfig_t *ptrs_UplinkConfig, uint8_t I_mcs) {
-
-	uint8_t mcs1, mcs2, mcs3;
-
-	mcs1 = ptrs_UplinkConfig->timeDensity.ptrs_mcs1;
-	mcs2 = ptrs_UplinkConfig->timeDensity.ptrs_mcs2;
-	mcs3 = ptrs_UplinkConfig->timeDensity.ptrs_mcs3;
-
-	if (mcs1 == 0 || mcs2 == 0 || mcs3 == 0)
-		return 1;
-
-	if (I_mcs < mcs1){
-		LOG_I(PHY,"PUSH PT-RS is not present.\n");
-		return 0;
-	}
-	else if (I_mcs >= mcs1 && I_mcs < mcs2)
-		return 4;
-	else if (I_mcs >= mcs2 && I_mcs < mcs3)
-		return 2;
-	else
-		return 1;
-}
-
 /*******************************************************************
 *
 * NAME :         is_ptrs_subcarrier
 *
 * PARAMETERS : k                      subcarrier index
-*              K_ptrs                 the parameter K_ptrs
 *              n_rnti                 UE CRNTI
+*              dmrs_antenna_port      DMRS antenna port
+*              K_ptrs                 the parameter K_ptrs
+*              pusch_dmrs_type        the DMRS configuration type used for PUSCH
 *              N_RB                   number of RBs scheduled for PUSCH
 *              k_RE_ref               the parameter k_RE_ref
 *              start_sc               first subcarrier index
-*              ofdm_symbol_size       FFT size
+*              ofdm_symbol_size       number of samples in an OFDM symbol
 *
 * RETURN :       1 if subcarrier k is PTRS, or 0 otherwise
 *
@@ -246,107 +154,48 @@ uint8_t get_L_ptrs(ptrs_UplinkConfig_t *ptrs_UplinkConfig, uint8_t I_mcs) {
 *
 *********************************************************************/
 
-uint8_t is_ptrs_subcarrier(uint16_t k, uint8_t K_ptrs, uint16_t n_rnti, uint16_t N_RB, int16_t k_RE_ref, uint16_t start_sc, uint16_t ofdm_symbol_size) {
-
-	uint16_t k_RB_ref, i, sc;
-
-	i = 0;
-	sc = 0;
-	k_RB_ref = 0;
-
-	if (N_RB % K_ptrs == 0)
-		k_RB_ref = n_rnti % K_ptrs;
-	else
-		k_RB_ref = n_rnti % (N_RB % K_ptrs);
-
-	while (k > sc){
-
-		sc = (start_sc + k_RE_ref + (i*K_ptrs + k_RB_ref)*NR_NB_SC_PER_RB)%ofdm_symbol_size;
-		i++;
-
-	}
-
-	if (k == sc)
-        return 1;
-	else
-        return 0;
-
-}
-
-/*******************************************************************
-*
-* NAME :         is_ptrs_symbol
-*
-* PARAMETERS : l                      ofdm symbol index within slot
-*              k                      subcarrier index
-*              n_rnti                 UE CRNTI
-*              N_RB                   number of RBs scheduled for PUSCH
-*              duration_in_symbols    number of scheduled PUSCH ofdm symbols
-*              dmrs_antenna_port      DMRS antenna port
-*              K_ptrs                 the parameter K_ptrs
-*              ptrs_symbols           bit mask of ptrs
-*              start_sc               first subcarrier index
-*              ofdm_symbol_size       FFT size
-*              pusch_dmrs_type        PUSCH DMRS type (1 or 2)
-*              ptrs_UplinkConfig      PTRS uplink configuration
-*
-* RETURN :       0 if symbol(k,l) is data, or 1 if symbol(k,l) is ptrs
-*
-* DESCRIPTION :  3GPP TS 38.211 6.4.1.2 Phase-tracking reference signal for PUSCH
-*
-*********************************************************************/
-
-uint8_t is_ptrs_symbol(uint8_t l,
-                       uint16_t k,
-                       uint16_t n_rnti,
-                       uint16_t N_RB,
-                       uint8_t duration_in_symbols,
-                       uint8_t dmrs_antenna_port,
-                       uint8_t K_ptrs,
-                       uint16_t ptrs_symbols,
-                       uint16_t start_sc,
-                       uint16_t ofdm_symbol_size,
-                       pusch_dmrs_type_t pusch_dmrs_type,
-                       uint8_t resourceElementOffset) {
-
-  uint8_t is_ptrs_freq, is_ptrs_time;
-  int16_t k_RE_ref;
-
-  is_ptrs_freq = 0;
-  is_ptrs_time = 0;
-
-  k_RE_ref = get_kRE_ref(dmrs_antenna_port, pusch_dmrs_type, resourceElementOffset);
-
-  is_ptrs_freq = is_ptrs_subcarrier(k, K_ptrs, n_rnti, N_RB, k_RE_ref, start_sc, ofdm_symbol_size);
+uint8_t is_ptrs_subcarrier(uint16_t k,
+                           uint16_t n_rnti,
+                           uint8_t dmrs_antenna_port,
+                           uint8_t pusch_dmrs_type,
+                           uint8_t K_ptrs,
+                           uint16_t N_RB,
+                           uint8_t k_RE_ref,
+                           uint16_t start_sc,
+                           uint16_t ofdm_symbol_size)
+{
+  // int16_t k_RE_ref = get_kRE_ref(dmrs_antenna_port, pusch_dmrs_type, resourceElementOffset);
+  uint16_t k_RB_ref;
 
-  if (is_ptrs_freq == 0)
-    return 0;
+  if (N_RB % K_ptrs == 0)
+    k_RB_ref = n_rnti % K_ptrs;
+  else
+    k_RB_ref = n_rnti % (N_RB % K_ptrs);
 
-  if (((ptrs_symbols>>l)&1) == 1)
-    is_ptrs_time = 1;
+  if (k < start_sc)
+    k += ofdm_symbol_size;
 
-  if (is_ptrs_time && is_ptrs_freq)
+  if ((k - k_RE_ref - k_RB_ref*NR_NB_SC_PER_RB - start_sc) % (K_ptrs*NR_NB_SC_PER_RB) == 0)
     return 1;
-  else
-    return 0;
 
+  return 0;
 }
 
 /*
 int main(int argc, char const *argv[])
 {
 
-	dmrs_UplinkConfig_t dmrs_Uplink_Config;
-	ptrs_UplinkConfig_t ptrs_Uplink_Config;
-	uint8_t resourceElementOffset;
-	uint8_t dmrs_antenna_port;
-	uint8_t L_ptrs, K_ptrs;
-	int16_t k_RE_ref;
-	uint16_t N_RB, ptrs_symbols, ofdm_symbol_size, k;
-	uint8_t duration_in_symbols, I_mcs;
-	uint8_t start_symbol, l;
-	uint8_t ptrs_symbol_flag;
-	uint16_t n_rnti;
+  dmrs_UplinkConfig_t dmrs_Uplink_Config;
+  ptrs_UplinkConfig_t ptrs_Uplink_Config;
+  uint8_t resourceElementOffset;
+  uint8_t dmrs_antenna_port;
+  uint8_t L_ptrs, K_ptrs;
+  int16_t k_RE_ref;
+  uint16_t N_RB, ptrs_symbols, ofdm_symbol_size, k;
+  uint8_t duration_in_symbols, I_mcs;
+  uint8_t start_symbol, l;
+  uint8_t ptrs_symbol_flag;
+  uint16_t n_rnti;
 
     dmrs_Uplink_Config.pusch_dmrs_type = pusch_dmrs_type1;
     dmrs_Uplink_Config.pusch_dmrs_AdditionalPosition = pusch_dmrs_pos1;
@@ -362,13 +211,13 @@ int main(int argc, char const *argv[])
     n_rnti = 0x1234;
     resourceElementOffset = 0;
     ptrs_symbols = 0;
-	dmrs_antenna_port = 0;
-	N_RB = 50;
-	duration_in_symbols = 14;
-	ofdm_symbol_size = 2048;
-	I_mcs = 9;
-	start_symbol = 0;
-	ptrs_symbol_flag = 0;
+  dmrs_antenna_port = 0;
+  N_RB = 50;
+  duration_in_symbols = 14;
+  ofdm_symbol_size = 2048;
+  I_mcs = 9;
+  start_symbol = 0;
+  ptrs_symbol_flag = 0;
 
     k_RE_ref = get_kRE_ref(dmrs_antenna_port, dmrs_Uplink_Config.pusch_dmrs_type, resourceElementOffset);
 
@@ -418,6 +267,6 @@ int main(int argc, char const *argv[])
 
     printf("\n");
 
-	return 0;
+  return 0;
 }
 */
diff --git a/openair1/PHY/NR_REFSIG/ptrs_nr.h b/openair1/PHY/NR_REFSIG/ptrs_nr.h
index 291ff4a55585137647ac947c16fd2c7434fb376e..e8a4e61232278c63ef559e36dadb82c94c020316 100644
--- a/openair1/PHY/NR_REFSIG/ptrs_nr.h
+++ b/openair1/PHY/NR_REFSIG/ptrs_nr.h
@@ -49,32 +49,36 @@
 
 int16_t get_kRE_ref(uint8_t dmrs_antenna_port, uint8_t pusch_dmrs_type, uint8_t resourceElementOffset);
 
-uint8_t get_K_ptrs(ptrs_UplinkConfig_t *ptrs_UplinkConfig, uint16_t N_RB);
-
 void set_ptrs_symb_idx(uint16_t *ptrs_symbols,
                        uint8_t duration_in_symbols,
                        uint8_t start_symbol,
-                       uint8_t dmrs_type,
                        uint8_t L_ptrs,
-                       uint8_t pusch_maxLength,
-                       uint16_t ofdm_symbol_size);
-
-uint8_t get_L_ptrs(ptrs_UplinkConfig_t *ptrs_UplinkConfig, uint8_t I_mcs);
-
-uint8_t is_ptrs_subcarrier(uint16_t k, uint8_t K_ptrs, uint16_t n_rnti, uint16_t N_RB, int16_t k_RE_ref, uint16_t start_sc, uint16_t ofdm_symbol_size);
+                       uint16_t ul_dmrs_symb_pos);
+
+uint8_t is_ptrs_subcarrier(uint16_t k,
+                           uint16_t n_rnti,
+                           uint8_t dmrs_antenna_port,
+                           uint8_t pusch_dmrs_type,
+                           uint8_t K_ptrs,
+                           uint16_t N_RB,
+                           uint8_t k_RE_ref,
+                           uint16_t start_sc,
+                           uint16_t ofdm_symbol_size);
+
+/*******************************************************************
+*
+* NAME :         is_ptrs_symbol
+*
+* PARAMETERS : l                      ofdm symbol index within slot
+*              ptrs_symbols           bit mask of ptrs
+*
+* RETURN :       1 if symbol is ptrs, or 0 otherwise
+*
+* DESCRIPTION :  3GPP TS 38.211 6.4.1.2 Phase-tracking reference signal for PUSCH
+*
+*********************************************************************/
 
-uint8_t is_ptrs_symbol(uint8_t l,
-                       uint16_t k,
-                       uint16_t n_rnti,
-                       uint16_t N_RB,
-                       uint8_t duration_in_symbols,
-                       uint8_t dmrs_antenna_port,
-                       uint8_t K_ptrs,
-                       uint16_t ptrs_symbols,
-                       uint16_t start_sc,
-                       uint16_t ofdm_symbol_size,
-                       pusch_dmrs_type_t pusch_dmrs_type,
-                       uint8_t resourceElementOffset);
+static inline uint8_t is_ptrs_symbol(uint8_t l, uint16_t ptrs_symbols) { return ((ptrs_symbols >> l) & 1); }
 
 
 
diff --git a/openair1/PHY/NR_REFSIG/scrambling_luts.c b/openair1/PHY/NR_REFSIG/scrambling_luts.c
index eae54f94fb431c211380118e20a71607145d234b..9d957de0f716f2f6929110c63015b3d6e4a9c970 100644
--- a/openair1/PHY/NR_REFSIG/scrambling_luts.c
+++ b/openair1/PHY/NR_REFSIG/scrambling_luts.c
@@ -31,7 +31,7 @@
 __m64 byte2m64_re[256];
 __m64 byte2m64_im[256];
 
-void init_byte2m64() {
+void init_byte2m64(void) {
 
   for (int s=0;s<256;s++) {
     byte2m64_re[s] = _mm_insert_pi16(byte2m64_re[s],(1-2*(s&1)),0);
@@ -53,7 +53,7 @@ void init_byte2m64() {
   }
 }
 
-void init_scrambling_luts() {
+void init_scrambling_luts(void) {
 
   init_byte2m64();
 
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index 856a7863f435de682b7c237bb7c04ac720415e8d..f12086418426b1f92f6c102af9fcee247bb53fcf 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -64,7 +64,6 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr,uint16_t N_RB)
       a_segments = a_segments/273;
     }  
 
-    uint16_t dlsch_bytes = a_segments*1056;  // allocated bytes per segment
 
 
 #ifdef DEBUG_DLSCH_FREE
@@ -82,7 +81,7 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr,uint16_t N_RB)
 #endif
 
         if (dlsch->harq_processes[i]->b) {
-          free16(dlsch->harq_processes[i]->b,dlsch_bytes);
+          free16(dlsch->harq_processes[i]->b,a_segments*1056);
           dlsch->harq_processes[i]->b = NULL;
 #ifdef DEBUG_DLSCH_FREE
           LOG_D(PHY,"Freeing dlsch process %d b (%p)\n",i,dlsch->harq_processes[i]->b);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c
index 7ab553fe6bcdff35a0cc326e2ee64de2f4951e7e..5c4d048a77a1b7ac836b2b9610fa627742b2aa60 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c
@@ -366,6 +366,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
 		 uint16_t *max_preamble_delay
 		 )
 {
+  AssertFatal(gNB!=NULL,"Can only be called from gNB\n");
 
   int i;
 
@@ -405,7 +406,6 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
   
   nr_frequency_range_e freq_range;
 
-  AssertFatal(gNB!=NULL,"Can only be called from gNB\n");
   fp    = &gNB->frame_parms;
   nb_rx = fp->nb_antennas_rx;
   
@@ -420,8 +420,6 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
   uint8_t prach_fmt = get_nr_prach_fmt(prach_ConfigIndex,frame_type,freq_range);
   uint16_t N_ZC = (prach_fmt <4)?839:139;
 
-  AssertFatal(gNB!=NULL,"gNB is null\n");
-
   prach_ifft        = gNB->prach_vars.prach_ifft;
   prachF            = gNB->prach_vars.prachF;
   if (LOG_DEBUGFLAG(PRACH)){
@@ -456,8 +454,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
 
   AssertFatal(NCS!=99,"NCS has not been set\n");
 
-  if (gNB) start_meas(&gNB->rx_prach);
-
+  start_meas(&gNB->rx_prach);
 
   prach_root_sequence_map = (prach_fmt<4) ? prach_root_sequence_map_0_3 : prach_root_sequence_map_abc;
 
diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport.h b/openair1/PHY/NR_TRANSPORT/nr_transport.h
index 1717cb950161168f4025b13ef5f1b54322e74e7c..98e5930c4c3b6992a4c456c617ab30c6adf33ec5 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_transport.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_transport.h
@@ -123,6 +123,14 @@ void rx_nr_prach_ru(RU_t *ru,
 		    int frame,
 		    int subframe);
 
+void compute_nr_prach_seq(uint16_t rootSequenceIndex,
+			  uint8_t prach_ConfigIndex,
+			  uint8_t zeroCorrelationZoneConfig,
+			  uint8_t highSpeedFlag,
+			  lte_frame_type_t frame_type,
+			  nr_frequency_range_e fr,
+			  uint32_t X_u[64][839]);
+
 void nr_decode_pucch1(int32_t **rxdataF,
                       pucch_GroupHopping_t pucch_GroupHopping,
                       uint32_t n_id,       // hoppingID higher layer parameter
@@ -143,5 +151,4 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
                       nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu,
                       nfapi_nr_pucch_pdu_t* pucch_pdu);
 
-
 #endif /*__NR_TRANSPORT__H__*/
diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h
index 85f3c00b906888507449d9dcff5d9ee9c2a0786d..ab5b0c38acf43776110c82e72a086f3ce6707513 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_transport_common_proto.h
@@ -61,4 +61,5 @@ uint32_t nr_get_G(uint16_t nb_rb, uint16_t nb_symb_sch, uint8_t nb_re_dmrs, uint
 
 uint32_t nr_get_E(uint32_t G, uint8_t C, uint8_t Qm, uint8_t Nl, uint8_t r);
 
+void init_pucch2_luts(void);
 #endif
diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto_common.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto_common.h
index dd37455e2629898363ed1184151f7959200da1cd..fe61733f49aff131a32e33f0b6bf2a3c63f01f9e 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto_common.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto_common.h
@@ -29,8 +29,8 @@
  * \note
  * \warning
  */
-#ifndef __NR_TRANSPORT_PROTO_UE__H__
-#define __NR_TRANSPORT_PROTO_UE__H__
+#ifndef __NR_TRANSPORT_PROTO_COMMON_H__
+#define __NR_TRANSPORT_PROTO_COMMON_H__
 #include "PHY/defs_nr_UE.h"
 #include "SCHED_NR_UE/defs.h"
 //#include "PHY/LTE_TRANSPORT/transport_common_proto.h"
@@ -43,29 +43,6 @@
  * @{
  */
 
-/** \fn free_ue_dlsch(NR_UE_DLSCH_t *dlsch)
-    \brief This function frees memory allocated for a particular DLSCH at UE
-    @param dlsch Pointer to DLSCH to be removed
-*/
-void free_nr_ue_dlsch(NR_UE_DLSCH_t *dlsch);
-
-/** \fn new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t abstraction_flag)
-    \brief This function allocates structures for a particular DLSCH at UE
-    @returns Pointer to DLSCH to be removed
-    @param Kmimo Kmimo factor from 36-212/36-213
-    @param Mdlharq Maximum number of HARQ rounds (36-212/36-213)
-    @param Nsoft Soft-LLR buffer size from UE-Category
-    @params N_RB_DL total number of resource blocks (determine the operating BW)
-    @param abstraction_flag Flag to indicate abstracted interface
-*/
-NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_turbo_iterations,uint8_t N_RB_DL, uint8_t abstraction_flag);
-
-
-void free_nr_ue_ulsch(NR_UE_ULSCH_t *ulsch);
-
-
-NR_UE_ULSCH_t *new_nr_ue_ulsch(unsigned char N_RB_UL, int number_of_harq_pids, uint8_t abstraction_flag);
-
 void fill_UE_dlsch_MCH(PHY_VARS_NR_UE *ue,int mcs,int ndi,int rvidx,int eNB_id);
 
 int rx_pmch(PHY_VARS_NR_UE *phy_vars_ue,
@@ -1051,25 +1028,6 @@ 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,
-                     NR_DL_FRAME_PARMS* frame_parms,
-                     uint8_t harq_pid);
-
-/*! \brief Perform PUSCH scrambling. TS 38.211 V15.4.0 subclause 6.3.1.1
-  @param[in] in Pointer to input bits
-  @param[in] size of input bits
-  @param[in] Nid cell id
-  @param[in] n_RNTI CRNTI
-  @param[out] out the scrambled bits
-*/
-
-void nr_pusch_codeword_scrambling(uint8_t *in,
-                         uint16_t size,
-                         uint32_t Nid,
-                         uint32_t n_RNTI,
-                         uint32_t* out);
-
-
 uint32_t  nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
 						 UE_nr_rxtx_proc_t *proc,
                          int eNB_id,
@@ -1128,17 +1086,6 @@ int32_t nr_rx_pdsch(PHY_VARS_NR_UE *phy_vars_ue,
                  uint8_t i_mod,
                  uint8_t harq_pid);
 
-int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
-                    uint32_t frame,
-                    uint8_t nr_tti_rx,
-                    uint8_t eNB_id,
-                    MIMO_mode_t mimo_mode,
-                    uint32_t high_speed_flag,
-                    uint8_t is_secondary_ue,
-                    int nb_coreset_active,
-                    uint16_t symbol_mon,
-                    NR_SEARCHSPACE_TYPE_t searchSpaceType);
-
 /*! \brief Extract PSS and SSS resource elements
   @param phy_vars_ue Pointer to UE variables
   @param[out] pss_ext contain the PSS signals after the extraction
@@ -1471,18 +1418,6 @@ void init_transport_channels(uint8_t);
 
 void generate_RIV_tables(void);
 
-/*!
-  \brief This function performs the initial cell search procedure - PSS detection, SSS detection and PBCH detection.  At the
-  end, the basic frame parameters are known (Frame configuration - TDD/FDD and cyclic prefix length,
-  N_RB_DL, PHICH_CONFIG and Nid_cell) and the UE can begin decoding PDCCH and DLSCH SI to retrieve the rest.  Once these
-  parameters are know, the routine calls some basic initialization routines (cell-specific reference signals, etc.)
-  @param phy_vars_ue Pointer to UE variables
-  @param mode current running mode
-*/
-int nr_initial_sync(UE_nr_rxtx_proc_t *proc,
-                    PHY_VARS_NR_UE *phy_vars_ue, runmode_t mode);
-
-
 /*!
   \brief Encoding of PUSCH/ACK/RI/ACK from 36-212.
   @param a Pointer to ulsch SDU
@@ -1724,10 +1659,6 @@ uint8_t get_prach_prb_offset(NR_DL_FRAME_PARMS *frame_parms,
 			     uint8_t n_ra_prboffset,
 			     uint8_t tdd_mapindex, uint16_t Nf);
 
-void nr_pdcch_unscrambling(uint16_t crnti, NR_DL_FRAME_PARMS *frame_parms, uint8_t nr_tti_rx,
-			   int16_t *z, uint32_t length, uint16_t pdcch_DMRS_scrambling_id, int do_common);
-
-
 uint32_t lte_gold_generic(uint32_t *x1, uint32_t *x2, uint8_t reset);
 
 int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
index 050c2302128fd5965fd78df090e1daf4342fd356..6c6ff4fd05b15efd2d1deed0f322877b39c0040c 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
@@ -70,13 +70,12 @@ void free_gNB_ulsch(NR_gNB_ULSCH_t **ulschptr,uint8_t N_RB_UL)
       a_segments = a_segments/273;
     }  
 
-    uint16_t ulsch_bytes = a_segments*1056;  // allocated bytes per segment
 
     for (i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) {
 
       if (ulsch->harq_processes[i]) {
         if (ulsch->harq_processes[i]->b) {
-          free16(ulsch->harq_processes[i]->b,ulsch_bytes);
+          free16(ulsch->harq_processes[i]->b,a_segments*1056);
           ulsch->harq_processes[i]->b = NULL;
         }
         for (r=0; r<a_segments; r++) {
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
index d22a013c049cf346a7cb9f09c49aec6ccc102a38..363b67960dadc56972bbba3f312ae41520c82331 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
@@ -284,19 +284,17 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
       else
         is_dmrs_re = 0;
 
-      if ( ((pusch_pdu->pdu_bit_map)>>2)& 0x01 ) {
-        is_ptrs_symbol_flag = is_ptrs_symbol(symbol,
-                                             (start_re + re)%frame_parms->ofdm_symbol_size,
-                                             n_rnti,
-                                             pusch_pdu->rb_size,
-                                             pusch_pdu->nr_of_symbols,
-                                             aarx,
-                                             K_ptrs,
-                                             pusch_vars->ptrs_symbols,
-                                             start_re,
-                                             frame_parms->ofdm_symbol_size,
-                                             pusch_pdu->dmrs_config_type,
-                                             pusch_pdu->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset);
+      if (pusch_pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
+        if(is_ptrs_symbol(symbol, pusch_vars->ptrs_symbols))
+            is_ptrs_symbol_flag = is_ptrs_subcarrier((start_re + re) % frame_parms->ofdm_symbol_size,
+                                                     n_rnti,
+                                                     aarx,
+                                                     pusch_pdu->dmrs_config_type,
+                                                     K_ptrs,
+                                                     pusch_pdu->rb_size,
+                                                     pusch_pdu->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset,
+                                                     start_re,
+                                                     frame_parms->ofdm_symbol_size);
 
         if (is_ptrs_symbol_flag == 1)
           num_ptrs_symbols++;
@@ -304,7 +302,7 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
       }
 
   #ifdef DEBUG_RB_EXT
-      printf("re = %d, is_dmrs_symbol_flag = %d, symbol = %d\n", re, is_dmrs_symbol_flag, symbol);
+      printf("re = %d, is_ptrs_symbol_flag = %d, symbol = %d\n", re, is_ptrs_symbol_flag, symbol);
   #endif
 
       if ( is_dmrs_re == 0 && is_ptrs_symbol_flag == 0) {
@@ -315,8 +313,7 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
         ul_ch0_ptrs_ext[ul_ch0_ptrs_ext_index] = ul_ch0_ptrs[ul_ch0_ptrs_index];
 
   #ifdef DEBUG_RB_EXT
-        printf("rxF_ext[%d] = %d\n", rxF_ext_index, rxF_ext[rxF_ext_index]);
-        printf("rxF_ext[%d] = %d\n", rxF_ext_index+1, rxF_ext[rxF_ext_index+1]);
+        printf("rxF_ext[%d] = %d, %d\n", rxF_ext_index, rxF_ext[rxF_ext_index], rxF_ext[rxF_ext_index+1]);
   #endif
 
         ul_ch0_ext_index++;
@@ -1026,7 +1023,7 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
                  unsigned char harq_pid)
 {
 
-  uint8_t first_symbol_flag, aarx, aatx, dmrs_symbol_flag, ptrs_symbol_flag; // dmrs_symbol_flag, a flag to indicate DMRS REs in current symbol
+  uint8_t first_symbol_flag, aarx, aatx, dmrs_symbol_flag; // dmrs_symbol_flag, a flag to indicate DMRS REs in current symbol
   uint32_t nb_re_pusch, bwp_start_subcarrier;
   uint8_t L_ptrs = 0; // PTRS parameter
   int avgs;
@@ -1035,7 +1032,6 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
   nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[UE_id][0]->harq_processes[harq_pid]->ulsch_pdu;
 
   dmrs_symbol_flag = 0;
-  ptrs_symbol_flag = 0;
   first_symbol_flag = 0;
   gNB->pusch_vars[UE_id]->ptrs_sc_per_ofdm_symbol = 0;
 
@@ -1046,16 +1042,14 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
     gNB->pusch_vars[UE_id]->ptrs_symbols = 0;
     first_symbol_flag = 1;
 
-    if ( ((rel15_ul->pdu_bit_map)>>2)& 0x01 ) {  // if there is ptrs pdu
+    if (rel15_ul->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {  // if there is ptrs pdu
       L_ptrs = 1<<(rel15_ul->pusch_ptrs.ptrs_time_density);
 
       set_ptrs_symb_idx(&gNB->pusch_vars[UE_id]->ptrs_symbols,
                         rel15_ul->nr_of_symbols,
                         rel15_ul->start_symbol_index,
-                        rel15_ul->dmrs_config_type,
                         L_ptrs,
-                        1, // only dmrs of length 1 is currently supported
-                        frame_parms->ofdm_symbol_size);
+                        rel15_ul->ul_dmrs_symb_pos);
     }
   }
 
@@ -1070,23 +1064,9 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
     nb_re_pusch = rel15_ul->rb_size * NR_NB_SC_PER_RB;
   }
 
-  if ( ((rel15_ul->pdu_bit_map)>>2)& 0x01 ) {  // if there is ptrs pdu
-    ptrs_symbol_flag = is_ptrs_symbol(symbol,
-                                      0,
-                                      rel15_ul->rnti,
-                                      rel15_ul->rb_size,
-                                      rel15_ul->nr_of_symbols,
-                                      0,
-                                      (rel15_ul->pusch_ptrs.ptrs_freq_density)?4:2,
-                                      gNB->pusch_vars[UE_id]->ptrs_symbols,
-                                      0,
-                                      frame_parms->ofdm_symbol_size,
-                                      rel15_ul->dmrs_config_type,
-                                      rel15_ul->pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset);
-  }
-
-  if (ptrs_symbol_flag == 1){
-    gNB->pusch_vars[UE_id]->ptrs_symbol_index = symbol;
+  if (rel15_ul->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {  // if there is ptrs pdu
+    if(is_ptrs_symbol(symbol, gNB->pusch_vars[UE_id]->ptrs_symbols))
+      gNB->pusch_vars[UE_id]->ptrs_symbol_index = symbol;
   }
 
 
diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
index d34f7bf540f8bada5883aa7065f00687ee8d2ea7..808ab2f5686a0ac15294f26e7d7082c480328a69 100644
--- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
@@ -42,6 +42,7 @@
 #include "PHY/defs_gNB.h"
 #include "PHY/sse_intrin.h"
 #include "PHY/NR_UE_TRANSPORT/pucch_nr.h"
+#include <openair1/PHY/CODING/nrSmallBlock/nr_small_block_defs.h>
 #include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
 #include "PHY/NR_TRANSPORT/nr_transport.h"
 #include "PHY/NR_REFSIG/nr_refsig.h"
@@ -153,7 +154,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
    * Defining cyclic shift hopping TS 38.211 Subclause 6.3.2.2.2
    */
   // alpha is cyclic shift
-  double alpha;
+  //double alpha;
   // lnormal is the OFDM symbol number in the PUCCH transmission where l=0 corresponds to the first OFDM symbol of the PUCCH transmission
   //uint8_t lnormal;
   // lprime is the index of the OFDM symbol in the slot that corresponds to the first OFDM symbol of the PUCCH transmission in the slot given by [5, TS 38.213]
@@ -192,7 +193,7 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
   for(i=0;i<nr_sequences;i++){ 
     // we proceed to calculate alpha according to TS 38.211 Subclause 6.3.2.2.2
     for (l=0; l<pucch_pdu->nr_of_symbols; l++){
-      alpha = nr_cyclic_shift_hopping(pucch_pdu->hopping_id,pucch_pdu->initial_cyclic_shift,mcs[i],l,pucch_pdu->start_symbol_index,slot);
+      double alpha = nr_cyclic_shift_hopping(pucch_pdu->hopping_id,pucch_pdu->initial_cyclic_shift,mcs[i],l,pucch_pdu->start_symbol_index,slot);
 #ifdef DEBUG_NR_PUCCH_RX
       printf("\t [nr_generate_pucch0] sequence generation \tu=%d \tv=%d \talpha=%lf \t(for symbol l=%d/%d,mcs %d)\n",u,v,alpha,l,l+pucch_pdu->start_symbol_index,mcs[i]);
       printf("lut output %d\n",gNB->pucch0_lut.lut[cs_ind][slot][l+pucch_pdu->start_symbol_index]);
@@ -263,9 +264,9 @@ void nr_decode_pucch0(PHY_VARS_gNB *gNB,
   }
 #else
 
-  int16_t *x_re = table_5_2_2_2_2_Re[u],*x_im = table_5_2_2_2_2_Im[u];
+  const int16_t *x_re = table_5_2_2_2_2_Re[u],*x_im = table_5_2_2_2_2_Im[u];
   int16_t xr[24]  __attribute__((aligned(32)));
-  int16_t xrt[24] __attribute__((aligned(32)));
+  //int16_t xrt[24] __attribute__((aligned(32)));
   int32_t xrtmag=0;
   int maxpos=0;
   int n2=0;
@@ -391,7 +392,7 @@ void nr_decode_pucch1(  int32_t **rxdataF,
                         uint8_t timeDomainOCC,
                         uint8_t nr_bit) {
 #ifdef DEBUG_NR_PUCCH_RX
-  printf("\t [nr_generate_pucch1] start function at slot(nr_tti_tx)=%d payload=%d m0=%d nrofSymbols=%d startingSymbolIndex=%d startingPRB=%d startingPRB_intraSlotHopping=%d timeDomainOCC=%d nr_bit=%d\n",
+  printf("\t [nr_generate_pucch1] start function at slot(nr_tti_tx)=%d payload=%lp m0=%d nrofSymbols=%d startingSymbolIndex=%d startingPRB=%d startingPRB_intraSlotHopping=%d timeDomainOCC=%d nr_bit=%d\n",
          nr_tti_tx,payload,m0,nrofSymbols,startingSymbolIndex,startingPRB,startingPRB_intraSlotHopping,timeDomainOCC,nr_bit);
 #endif
   /*
@@ -401,7 +402,7 @@ void nr_decode_pucch1(  int32_t **rxdataF,
   // complex-valued symbol d_re, d_im containing complex-valued symbol d(0):
   int16_t d_re=0, d_im=0,d1_re=0,d1_im=0;
 #ifdef DEBUG_NR_PUCCH_RX
-  printf("\t [nr_generate_pucch1] sequence modulation: payload=%x \tde_re=%d \tde_im=%d\n",payload,d_re,d_im);
+  printf("\t [nr_generate_pucch1] sequence modulation: payload=%lp \tde_re=%d \tde_im=%d\n",payload,d_re,d_im);
 #endif
   /*
    * Defining cyclic shift hopping TS 38.211 Subclause 6.3.2.2.2
@@ -495,7 +496,7 @@ void nr_decode_pucch1(  int32_t **rxdataF,
         z_re_rx[i+n] = ((int16_t *)&rxdataF[0][re_offset])[0];
         z_im_rx[i+n] = ((int16_t *)&rxdataF[0][re_offset])[1];
 #ifdef DEBUG_NR_PUCCH_RX
-        printf("\t [nr_generate_pucch1] mapping PUCCH to RE \t amp=%d \tofdm_symbol_size=%d \tN_RB_DL=%d \tfirst_carrier_offset=%d \tz_pucch[%d]=txptr(%d)=(x_n(l=%d,n=%d)=(%d,%d))\n",
+        printf("\t [nr_generate_pucch1] mapping PUCCH to RE \t amp=%d \tofdm_symbol_size=%d \tN_RB_DL=%d \tfirst_carrier_offset=%d \tz_pucch[%d]=txptr(%u)=(x_n(l=%d,n=%d)=(%d,%d))\n",
                amp,frame_parms->ofdm_symbol_size,frame_parms->N_RB_DL,frame_parms->first_carrier_offset,i+n,re_offset,
                l,n,((int16_t *)&rxdataF[0][re_offset])[0],((int16_t *)&rxdataF[0][re_offset])[1]);
 #endif
@@ -506,7 +507,7 @@ void nr_decode_pucch1(  int32_t **rxdataF,
         z_dmrs_im_rx[i+n] = ((int16_t *)&rxdataF[0][re_offset])[1];
 	//	printf("%d\t%d\t%d\n",l,z_dmrs_re_rx[i+n],z_dmrs_im_rx[i+n]);
 #ifdef DEBUG_NR_PUCCH_RX
-        printf("\t [nr_generate_pucch1] mapping DM-RS to RE \t amp=%d \tofdm_symbol_size=%d \tN_RB_DL=%d \tfirst_carrier_offset=%d \tz_dm-rs[%d]=txptr(%d)=(x_n(l=%d,n=%d)=(%d,%d))\n",
+        printf("\t [nr_generate_pucch1] mapping DM-RS to RE \t amp=%d \tofdm_symbol_size=%d \tN_RB_DL=%d \tfirst_carrier_offset=%d \tz_dm-rs[%d]=txptr(%u)=(x_n(l=%d,n=%d)=(%d,%d))\n",
                amp,frame_parms->ofdm_symbol_size,frame_parms->N_RB_DL,frame_parms->first_carrier_offset,i+n,re_offset,
                l,n,((int16_t *)&rxdataF[0][re_offset])[0],((int16_t *)&rxdataF[0][re_offset])[1]);
 #endif
@@ -1019,7 +1020,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
 
   int32_t **rxdataF = gNB->common_vars.rxdataF;
   NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
-  pucch_GroupHopping_t pucch_GroupHopping = pucch_pdu->group_hop_flag + (pucch_pdu->sequence_hop_flag<<1);
+  //pucch_GroupHopping_t pucch_GroupHopping = pucch_pdu->group_hop_flag + (pucch_pdu->sequence_hop_flag<<1);
 
 
 
@@ -1029,7 +1030,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
 
   //extract pucch and dmrs first
 
-  int l2;
+  int l2=pucch_pdu->start_symbol_index;
   int re_offset = (12*pucch_pdu->prb_start) + (12*pucch_pdu->bwp_start) + frame_parms->first_carrier_offset;
   if (re_offset>= frame_parms->ofdm_symbol_size) 
     re_offset-=frame_parms->ofdm_symbol_size;
@@ -1129,8 +1130,8 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
 	r_im_ext_p[15]=rp[aa][47];
 		  
 #ifdef DEBUG_NR_PUCCH_RX
-	for (int i=0;i<8;i++) printf("Ant %d PRB %d dmrs[%d] -> (%d,%d)\n",aa,prb+(i>>2),i,rd_re_ext_p[i],rd_im_ext_p[i],i);
-	for (int i=0;i<16;i++) printf("Ant %d PRB %d data[%d] -> (%d,%d)\n",aa,prb+(i>>3),i,r_re_ext_p[i],r_im_ext_p[i],i);
+	for (int i=0;i<8;i++) printf("Ant %d PRB %d dmrs[%d] -> (%d,%d)\n",aa,prb+(i>>2),i,rd_re_ext_p[i],rd_im_ext_p[i]);
+	for (int i=0;i<16;i++) printf("Ant %d PRB %d data[%d] -> (%d,%d)\n",aa,prb+(i>>3),i,r_re_ext_p[i],r_im_ext_p[i]);
 #endif
 	rp[aa]+=48;
       } // aa
@@ -1459,7 +1460,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
     uint64_t corr;
 
     for (int half_prb=0;half_prb<(2*pucch_pdu->prb_size);half_prb++) {
-    llr_num=_mm_set1_epi16(0);llr_den=_mm_set1_epi16(0);
+      llr_num=_mm_set1_epi16(0);llr_den=_mm_set1_epi16(0);
       for (int cw=0;cw<256;cw++) {
 	corr_tmp=0;
 	for (int aa=0;aa<Prx;aa++) { 
@@ -1480,7 +1481,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
 	  corr_re = ( corr32_re[half_prb>>2][aa]/(2*nc_group_size*4/2)+((int16_t*)(&prod_re[aa]))[0]);
 	  corr_im = ( corr32_im[half_prb>>2][aa]/(2*nc_group_size*4/2)+((int16_t*)(&prod_im[aa]))[0]);
 	  corr_tmp += corr_re*corr_re + corr_im*corr_im;
-	  /*
+	  /*	  
 	  LOG_D(PHY,"pucch2 half_prb %d cw %d (%d,%d) aa %d: (%d,%d,%d,%d,%d,%d,%d,%d)x(%d,%d,%d,%d,%d,%d,%d,%d)  (%d,%d)+(%d,%d) = (%d,%d) => %d\n",
 		half_prb,cw,cw&15,cw>>4,aa,
 		((int16_t*)&pucch2_polar_4bit[cw&15])[0],((int16_t*)&pucch2_polar_4bit[cw>>4])[0],
@@ -1497,7 +1498,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
 		corr_re,
 		corr_im,
 		corr_tmp);
-	  */
+	  */	  
 	}
 	corr16 = _mm_set1_epi16((int16_t)(corr_tmp>>8));
 	/*	
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 19564bd8d08394d52cb417cb31ae3dee2fff2fde..71a5771f5be55947ee1eec2b38d6d1ac00a39135 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -618,7 +618,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
         ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
 #ifdef DEBUG_PDCCH
-	printf("pilot %d : 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,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.h b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.h
index 95b6cfd2e2f4945eddfcf8705622fd73aa1740da..5f1321dd321bfda863e20b1e0a38ddc1c82d59f3 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.h
@@ -29,6 +29,10 @@
 * \note
 * \warning
 */
+
+#ifndef __PHY_NR_UE_TRANSPORT_DCI_NR__H__
+#define __PHY_NR_UE_TRANSPORT_DCI_NR__H__
+
 #ifndef USER_MODE
 #include "PHY/types.h"
 #else
@@ -118,4 +122,5 @@ typedef struct NR_DCI_INFO_EXTRACTED NR_DCI_INFO_EXTRACTED_t;
 
 
 #endif
+#endif
 
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
index 00167507ce5bc53b553fb63369974456787e857a..e5cbc4e07ae0e59635b112c13541187954b19c37 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
@@ -69,12 +69,11 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL)
       a_segments = a_segments/273;
     }  
  
-    uint16_t dlsch_bytes = a_segments*1056;  // allocated bytes per segment
 
     for (i=0; i<dlsch->Mdlharq; i++) {
       if (dlsch->harq_processes[i]) {
         if (dlsch->harq_processes[i]->b) {
-          free16(dlsch->harq_processes[i]->b,dlsch_bytes);
+          free16(dlsch->harq_processes[i]->b,a_segments*1056);
           dlsch->harq_processes[i]->b = NULL;
         }
 
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
index adef4a759277c8371e089239310394e79ad8640d..013b5ca4a6d93040237f6b3f2fc060bf3519c2c3 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
@@ -38,8 +38,10 @@
 
 #include "common/utils/LOG/log.h"
 #include "common/utils/LOG/vcd_signal_dumper.h"
+#include <openair1/PHY/NR_TRANSPORT/nr_transport_proto_common.h>
 
 #include "T.h"
+#include <openair1/PHY/NR_TRANSPORT/nr_transport_proto_common.h>
 
 
 
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
index 35fe8bc8992e6ab507c6e43cf83dfac1b691ccd8..4aae9ef7b42935838d7004e795288fcc0f0de4da 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
@@ -1053,7 +1053,8 @@ uint32_t  nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
 
 int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
                      NR_DL_FRAME_PARMS* frame_parms,
-                     uint8_t harq_pid);
+                     uint8_t harq_pid,
+                     unsigned int G);
 
 /*! \brief Perform PUSCH scrambling. TS 38.211 V15.4.0 subclause 6.3.1.1
   @param[in] in, Pointer to input bits
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
index fb560f229d26db49060f9065892d574a5915d453..bb92508934ddfa0f15adbe8a1f04173f7ba8e2a5 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_ue.h
@@ -43,7 +43,7 @@
 #endif
 
 #include "LAYER2/NR_MAC_gNB/mac_proto.h"
-
+#include "openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h"
 //#include "../LTE_TRANSPORT/transport_common.h"
 
 // structures below implement 36-211 and 36-212
@@ -86,40 +86,26 @@ typedef struct {
 #endif
 
 typedef struct {
+  /// NDAPI struct for UE
+  nfapi_nr_ue_pusch_pdu_t pusch_pdu;
   /// Indicator of first transmission
   uint8_t first_tx;
-  /// Last Ndi received for this process on DCI (used for C-RNTI only)
-  uint8_t DCINdi;
   /// HARQ tx status
   harq_result_t tx_status;
-  /// Flag indicating that this ULSCH has a new packet (start of new round)
-  //  uint8_t Ndi;
   /// Status Flag indicating for this ULSCH (idle,active,disabled)
   SCH_status_t status;
   /// Subframe scheduling indicator (i.e. Transmission opportunity indicator)
   uint8_t subframe_scheduling_flag;
   /// Subframe cba scheduling indicator (i.e. Transmission opportunity indicator)
   uint8_t subframe_cba_scheduling_flag;
-  /// First Allocated RB
-  uint16_t first_rb;
-  /// Current Number of RBs
-  uint16_t nb_rb;
-  /// number of layers
-  uint8_t Nl;
   /// Last TPC command
   uint8_t TPC;
-  /// Transport block size
-  uint32_t TBS;
   /// The payload + CRC size in bits, "B" from 36-212
   uint32_t B;
   /// Length of ACK information (bits)
   uint8_t O_ACK;
   /// Index of current HARQ round for this ULSCH
   uint8_t round;
-  /// MCS format of this ULSCH
-  uint8_t mcs;
-  /// Redundancy-version of the current sub-frame
-  uint8_t rvidx;
   /// pointer to pdu from MAC interface (TS 36.212 V15.4.0, Sec 5.1 p. 8)
   unsigned char *a;
   /// Pointer to the payload + CRC 
@@ -152,19 +138,11 @@ typedef struct {
   uint32_t G;
   // Number of modulated symbols carrying data
   uint32_t num_of_mod_symbols;
-  // This is "L" in  TS 38.214 V15.4.0 subclause 6.1.2.1
-  uint8_t number_of_symbols;
-  // This is "S" in  TS 38.214 V15.4.0 subclause 6.1.2.1
-  uint8_t start_symbol;
   // decode phich
   uint8_t decode_phich;
 } NR_UL_UE_HARQ_t;
 
 typedef struct {
-  /// number of DMRS resource elements
-  uint8_t nb_re_dmrs;
-  /// DMRS length
-  uint8_t length_dmrs;
   /// SRS active flag
   uint8_t srs_active; 
 //#if defined(UPGRADE_RAT_NR)
@@ -226,8 +204,6 @@ typedef struct {
   uint8_t power_offset;
   // for cooperative communication
   uint8_t cooperation_flag;
-  /// RNTI attributed to this ULSCH
-  uint16_t rnti;
   /// RNTI type
   uint8_t rnti_type;
   /// Cell ID
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
index 00627ac3ae33559b40acf8736de42104a4b9f2f5..556a5626c520008f81e8f78b5f6cd51a6c455c11 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
@@ -60,17 +60,16 @@ void free_nr_ue_ulsch(NR_UE_ULSCH_t **ulschptr,unsigned char N_RB_UL)
     a_segments = a_segments/273;
   }  
 
-  uint16_t ulsch_bytes = a_segments*1056;  // allocated bytes per segment
 
     for (i=0; i<NR_MAX_ULSCH_HARQ_PROCESSES; i++) {
       if (ulsch->harq_processes[i]) {
 
         if (ulsch->harq_processes[i]->a) {
-          free16(ulsch->harq_processes[i]->a,ulsch_bytes);
+          free16(ulsch->harq_processes[i]->a,a_segments*1056);
           ulsch->harq_processes[i]->a = NULL;
         }
         if (ulsch->harq_processes[i]->b) {
-          free16(ulsch->harq_processes[i]->b,ulsch_bytes);
+          free16(ulsch->harq_processes[i]->b,a_segments*1056);
           ulsch->harq_processes[i]->b = NULL;
         }
         if (ulsch->harq_processes[i]->e) {
@@ -217,15 +216,15 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL,
 
 int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
                       NR_DL_FRAME_PARMS* frame_parms,
-                      uint8_t harq_pid)
+                      uint8_t harq_pid,
+                      unsigned int G)
 {
 /////////////////////////parameters and variables declaration/////////////////////////
 ///////////
 
-  unsigned int G,crc;
+  unsigned int crc;
   NR_UL_UE_HARQ_t *harq_process; 
   uint16_t nb_rb ;
-  uint8_t nb_symb_sch ;
   uint32_t A, Z, F;
   uint32_t *pz; 
   uint8_t mod_order; 
@@ -235,8 +234,6 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
   uint32_t E,Kb;
   uint8_t Ilbrm; 
   uint32_t Tbslbrm; 
-  uint8_t nb_re_dmrs; 
-  uint16_t length_dmrs;
   uint16_t R;
   float Coderate;
 
@@ -249,20 +246,17 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
 
   crc = 1;
   harq_process = ulsch->harq_processes[harq_pid];
-  nb_rb = harq_process->nb_rb;
-  nb_symb_sch = harq_process->number_of_symbols;
-  A = harq_process->TBS;
+  nb_rb = harq_process->pusch_pdu.rb_size;
+  A = harq_process->pusch_pdu.pusch_data.tb_size;
   pz = &Z;
-  mod_order = nr_get_Qm_ul(harq_process->mcs,0);
-  R = nr_get_code_rate_ul(harq_process->mcs, 0);
+  mod_order = nr_get_Qm_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table);
+  R = nr_get_code_rate_ul(harq_process->pusch_pdu.mcs_index, harq_process->pusch_pdu.mcs_table);
   Kr=0;
   r_offset=0;
   BG = 1;
   F=0;
   Ilbrm = 0;
   Tbslbrm = 950984; //max tbs
-  nb_re_dmrs = ulsch->nb_re_dmrs;
-  length_dmrs = ulsch->length_dmrs;
   Coderate = 0.0;
 
 ///////////
@@ -271,10 +265,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN);
 
-  LOG_D(PHY,"ulsch coding nb_rb %d nb_symb_sch %d nb_re_dmrs %d, length_dmrs %d, harq_process->Nl = %d\n", nb_rb,nb_symb_sch, nb_re_dmrs,length_dmrs, harq_process->Nl);
-
-
-  G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,harq_process->Nl);
+  LOG_D(PHY,"ulsch coding nb_rb %d, Nl = %d\n", nb_rb, harq_process->pusch_pdu.nrOfLayers);
   LOG_D(PHY,"ulsch coding A %d G %d mod_order %d\n", A,G, mod_order);
 
   //  if (harq_process->Ndi == 1) {  // this is a new packet
@@ -434,15 +425,15 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
 
     //start_meas(rm_stats);
 #ifdef DEBUG_DLSCH_CODING
-  printf("rvidx in encoding = %d\n", harq_process->rvidx);
+  printf("rvidx in encoding = %d\n", harq_process->pusch_pdu.pusch_data.rv_index);
 #endif
 
 ///////////////////////// d---->| Rate matching bit selection |---->e /////////////////////////
 ///////////
 
-    E = nr_get_E(G, harq_process->C, mod_order, harq_process->Nl, r);
+    E = nr_get_E(G, harq_process->C, mod_order, harq_process->pusch_pdu.nrOfLayers, r);
 
-    Tbslbrm = nr_compute_tbslbrm(0,nb_rb,harq_process->Nl,harq_process->C);
+    Tbslbrm = nr_compute_tbslbrm(0,nb_rb,harq_process->pusch_pdu.nrOfLayers,harq_process->C);
 
     nr_rate_matching_ldpc(Ilbrm,
                           Tbslbrm,
@@ -453,7 +444,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
                           harq_process->C,
 			  F,
                           Kr-F-2*(*pz),
-                          harq_process->rvidx,
+                          harq_process->pusch_pdu.pusch_data.rv_index,
                           E);
 
 
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
index a15851bf4910a0476f657cbb75de0b2b516179cf..da0528655ff624aaad90144ca90b0d793d51061f 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
@@ -98,7 +98,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
                                uint8_t thread_id,
                                int gNB_id) {
 
-  uint32_t available_bits;
+  uint32_t available_bits, TBS;
   uint8_t mod_order, cwd_index, num_of_codewords, l;
   uint32_t scrambled_output[NR_MAX_NB_CODEWORDS][NR_MAX_PDSCH_ENCODED_LENGTH>>5];
   uint32_t ***pusch_dmrs;
@@ -106,11 +106,11 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
   int32_t **txdataF;
   uint16_t start_sc, start_rb;
   int8_t Wf[2], Wt[2], l_prime[2], delta;
-  uint16_t n_dmrs, code_rate, number_dmrs_symbols, k;
-  uint8_t dmrs_type;
+  uint16_t rnti, n_dmrs, code_rate, number_dmrs_symbols, nb_rb, k;
+  uint8_t dmrs_type, nb_dmrs_re_per_rb, number_of_symbols, mcs, Nl;
   int ap, start_symbol, Nid_cell, i;
   int sample_offsetF, N_RE_prime, N_PRB_oh;
-  uint16_t n_rnti;
+  uint16_t ul_dmrs_symb_pos;
   uint8_t data_existing =0;
   uint8_t L_ptrs, K_ptrs; // PTRS parameters
   uint16_t beta_ptrs; // PTRS parameter related to power control
@@ -120,53 +120,52 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
   NR_DL_FRAME_PARMS *frame_parms = &UE->frame_parms;
   NR_UE_PUSCH *pusch_ue = UE->pusch_vars[thread_id][gNB_id];
   uint8_t ulsch_input_buffer[MAX_ULSCH_PAYLOAD_BYTES];
-  ptrs_UplinkConfig_t *ptrs_Uplink_Config = &UE->pusch_config.dmrs_UplinkConfig.ptrs_UplinkConfig;
+  // ptrs_UplinkConfig_t *ptrs_Uplink_Config = &UE->pusch_config.dmrs_UplinkConfig.ptrs_UplinkConfig;
 
   num_of_codewords = 1; // tmp assumption
-  n_rnti = 0x1234;
   Nid_cell = 0;
   N_PRB_oh = 0; // higher layer (RRC) parameter xOverhead in PUSCH-ServingCellConfig
   number_dmrs_symbols = 0;
-  uint8_t mapping_type = UE->pusch_config.pusch_TimeDomainResourceAllocation[0]->mappingType;
 
   for (cwd_index = 0;cwd_index < num_of_codewords; cwd_index++) {
 
     ulsch_ue = UE->ulsch[thread_id][gNB_id][cwd_index];
     harq_process_ul_ue = ulsch_ue->harq_processes[harq_pid];
 
-    start_symbol = harq_process_ul_ue->start_symbol;
-
-    for (i = start_symbol; i < start_symbol + harq_process_ul_ue->number_of_symbols; i++)
-      number_dmrs_symbols += is_dmrs_symbol((mapping_type)?i-start_symbol:i,
-                                            0,
-                                            0,
-                                            0,
-                                            0,
-                                            0,
-                                            harq_process_ul_ue->number_of_symbols,
-                                            UE->pusch_config.dmrs_UplinkConfig.pusch_dmrs_type,
-                                            frame_parms->ofdm_symbol_size);
-
-    ulsch_ue->length_dmrs = number_dmrs_symbols; // pusch.MaxLenght is redundant here as number_dmrs_symbols
-                                                 // contains all dmrs symbols even for double symbol dmrs
-    ulsch_ue->rnti        = n_rnti;
+    start_symbol      = harq_process_ul_ue->pusch_pdu.start_symbol_index;
+    ul_dmrs_symb_pos  = harq_process_ul_ue->pusch_pdu.ul_dmrs_symb_pos;
+    number_of_symbols = harq_process_ul_ue->pusch_pdu.nr_of_symbols;
+    dmrs_type         = harq_process_ul_ue->pusch_pdu.dmrs_config_type;
+
+    for (i = start_symbol; i < start_symbol + number_of_symbols; i++) {
+
+      if((ul_dmrs_symb_pos >> i) & 0x01)
+        number_dmrs_symbols += 1;
+
+    }
+
+    rnti                  = harq_process_ul_ue->pusch_pdu.rnti;
     ulsch_ue->Nid_cell    = Nid_cell;
-    ulsch_ue->nb_re_dmrs  = ((UE->pusch_config.dmrs_UplinkConfig.pusch_dmrs_type == pusch_dmrs_type1)?6:4);
+    nb_dmrs_re_per_rb     = ((dmrs_type == pusch_dmrs_type1) ? 6:4);
+
+    N_RE_prime = NR_NB_SC_PER_RB*number_of_symbols - nb_dmrs_re_per_rb*number_dmrs_symbols - N_PRB_oh;
 
-    N_RE_prime = NR_NB_SC_PER_RB*harq_process_ul_ue->number_of_symbols - ulsch_ue->nb_re_dmrs*number_dmrs_symbols - N_PRB_oh;
+    nb_rb = harq_process_ul_ue->pusch_pdu.rb_size;
 
-    harq_process_ul_ue->num_of_mod_symbols = N_RE_prime*harq_process_ul_ue->nb_rb*num_of_codewords;
+    harq_process_ul_ue->num_of_mod_symbols = N_RE_prime*nb_rb*num_of_codewords;
 
-    mod_order      = nr_get_Qm_ul(harq_process_ul_ue->mcs, 0);
-    code_rate      = nr_get_code_rate_ul(harq_process_ul_ue->mcs, 0);
+    mcs            = harq_process_ul_ue->pusch_pdu.mcs_index;
+    Nl             = harq_process_ul_ue->pusch_pdu.nrOfLayers;
+    mod_order      = nr_get_Qm_ul(mcs, 0);
+    code_rate      = nr_get_code_rate_ul(mcs, 0);
 
-    harq_process_ul_ue->TBS = nr_compute_tbs(mod_order, 
+    harq_process_ul_ue->pusch_pdu.pusch_data.tb_size = nr_compute_tbs(mod_order,
                                              code_rate,
-                                             harq_process_ul_ue->nb_rb,
-                                             harq_process_ul_ue->number_of_symbols,
-                                             ulsch_ue->nb_re_dmrs*ulsch_ue->length_dmrs,
+                                             nb_rb,
+                                             number_of_symbols,
+                                             nb_dmrs_re_per_rb*number_dmrs_symbols,
                                              0,
-                                             harq_process_ul_ue->Nl);
+                                             harq_process_ul_ue->pusch_pdu.nrOfLayers);
 
     uint8_t access_mode = SCHEDULED_ACCESS;
 
@@ -174,19 +173,20 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
     // to be removed later when MAC is ready
 
     if (harq_process_ul_ue != NULL){
+      TBS = harq_process_ul_ue->pusch_pdu.pusch_data.tb_size;
       data_existing = 0;
 
     	if (IS_SOFTMODEM_NOS1){
-    		data_existing = nr_ue_get_sdu(UE->Mod_id, UE->CC_id, frame,
-    				slot, 0, ulsch_input_buffer, harq_process_ul_ue->TBS/8, &access_mode);
+        data_existing = nr_ue_get_sdu(UE->Mod_id, UE->CC_id, frame,
+                                      slot, 0, ulsch_input_buffer, TBS/8, &access_mode);
     		//IP traffic to be transmitted
-    		if(data_existing){
-    			//harq_process_ul_ue->a = (unsigned char*)calloc(harq_process_ul_ue->TBS/8, sizeof(unsigned char));
-    			memcpy(harq_process_ul_ue->a, ulsch_input_buffer, harq_process_ul_ue->TBS/8);
+        if(data_existing){
+          //harq_process_ul_ue->a = (unsigned char*)calloc(TBS/8, sizeof(unsigned char));
+          memcpy(harq_process_ul_ue->a, ulsch_input_buffer, TBS/8);
 
     			#ifdef DEBUG_MAC_PDU
-    				LOG_I(PHY, "Printing MAC PDU to be encoded, TBS is: %d \n", harq_process_ul_ue->TBS/8);
-    				for (i = 0; i < harq_process_ul_ue->TBS / 8; i++) {
+            LOG_I(PHY, "Printing MAC PDU to be encoded, TBS is: %d \n", TBS/8);
+            for (i = 0; i < TBS / 8; i++) {
     					printf("0x%02x",harq_process_ul_ue->a[i]);
     				}
     				printf("\n");
@@ -203,7 +203,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
         for (i = 0; i<payload_offset; i++)
           harq_process_ul_ue->a[i] = 0;
 
-        for (i = payload_offset; i < harq_process_ul_ue->TBS / 8; i++) {
+        for (i = payload_offset; i < TBS / 8; i++) {
           harq_process_ul_ue->a[i] = (unsigned char) rand();
           //printf(" input encoder a[%d]=0x%02x\n",i,harq_process_ul_ue->a[i]);
         }
@@ -218,8 +218,10 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
     /////////////////////////ULSCH coding/////////////////////////
     ///////////
 
+    unsigned int G = nr_get_G(nb_rb, number_of_symbols,
+                              nb_dmrs_re_per_rb, number_dmrs_symbols, mod_order, Nl);
 
-    nr_ulsch_encoding(ulsch_ue, frame_parms, harq_pid);
+    nr_ulsch_encoding(ulsch_ue, frame_parms, harq_pid, G);
 
     ///////////
     ////////////////////////////////////////////////////////////////////
@@ -227,21 +229,14 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
     /////////////////////////ULSCH scrambling/////////////////////////
     ///////////
 
-    mod_order      = nr_get_Qm_ul(harq_process_ul_ue->mcs, 0);
-
-    available_bits = nr_get_G(harq_process_ul_ue->nb_rb,
-                              harq_process_ul_ue->number_of_symbols,
-                              ulsch_ue->nb_re_dmrs,
-                              ulsch_ue->length_dmrs,
-                              mod_order,
-                              1);
+    available_bits = G;
 
     memset(scrambled_output[cwd_index], 0, ((available_bits>>5)+1)*sizeof(uint32_t));
 
     nr_pusch_codeword_scrambling(ulsch_ue->g,
                                  available_bits,
                                  ulsch_ue->Nid_cell,
-                                 ulsch_ue->rnti,
+                                 rnti,
                                  scrambled_output[cwd_index]); // assume one codeword for the moment
 
 
@@ -269,9 +264,8 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
   /////////////////////////DMRS Modulation/////////////////////////
   ///////////
   pusch_dmrs = UE->nr_gold_pusch_dmrs[slot];
-  n_dmrs = (harq_process_ul_ue->nb_rb*ulsch_ue->nb_re_dmrs*ulsch_ue->length_dmrs);
+  n_dmrs = (nb_rb*nb_dmrs_re_per_rb*number_dmrs_symbols);
   int16_t mod_dmrs[n_dmrs<<1];
-  dmrs_type = UE->pusch_config.dmrs_UplinkConfig.pusch_dmrs_type;
   ///////////
   ////////////////////////////////////////////////////////////////////////
 
@@ -279,26 +273,23 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
   /////////////////////////PTRS parameters' initialization/////////////////////////
   ///////////
 
-  int16_t mod_ptrs[(harq_process_ul_ue->nb_rb/2)*(NR_SYMBOLS_PER_SLOT-1)*2]; // assume maximum number of PTRS per pusch allocation
+  int16_t mod_ptrs[(nb_rb/2)*(NR_SYMBOLS_PER_SLOT-1)*2]; // assume maximum number of PTRS per pusch allocation
   K_ptrs = 0; // just to avoid a warning
 
-  if (UE->ptrs_configured == 1) {
-
-    K_ptrs = get_K_ptrs(ptrs_Uplink_Config, harq_process_ul_ue->nb_rb);
+  if (harq_process_ul_ue->pusch_pdu.pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
 
-    L_ptrs = get_L_ptrs(ptrs_Uplink_Config, harq_process_ul_ue->mcs);
+    K_ptrs = (harq_process_ul_ue->pusch_pdu.pusch_ptrs.ptrs_freq_density)?4:2;
+    L_ptrs = 1<<harq_process_ul_ue->pusch_pdu.pusch_ptrs.ptrs_time_density;
 
     beta_ptrs = 1; // temp value until power control is implemented
 
     ulsch_ue->ptrs_symbols = 0;
 
     set_ptrs_symb_idx(&ulsch_ue->ptrs_symbols,
-                      harq_process_ul_ue->number_of_symbols,
+                      number_of_symbols,
                       start_symbol,
-                      dmrs_type,
                       L_ptrs,
-                      ulsch_ue->length_dmrs,
-                      frame_parms->ofdm_symbol_size);
+                      ul_dmrs_symb_pos);
   }
 
   ///////////
@@ -310,7 +301,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
   tx_layers = (int16_t **)pusch_ue->txdataF_layers;
 
   nr_ue_layer_mapping(UE->ulsch[thread_id][gNB_id],
-                   harq_process_ul_ue->Nl,
+                   Nl,
                    available_bits/mod_order,
                    tx_layers);
 
@@ -327,24 +318,19 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
   uint32_t nb_re_pusch, nb_re_dmrs_per_rb;
   uint32_t y_offset = 0;
 
-  for (l = start_symbol; l < start_symbol + harq_process_ul_ue->number_of_symbols; l++) {
+  for (l = start_symbol; l < start_symbol + number_of_symbols; l++) {
 
-    is_dmrs = is_dmrs_symbol((mapping_type)?l-start_symbol:l,
-                             0,
-                             0,
-                             0,
-                             0,
-                             0,
-                             harq_process_ul_ue->number_of_symbols,
-                             dmrs_type,
-                             frame_parms->ofdm_symbol_size);
+    if((ul_dmrs_symb_pos >> l) & 0x01)
+      is_dmrs = 1;
+    else
+      is_dmrs = 0;
 
     if (is_dmrs == 1)
-      nb_re_dmrs_per_rb = ulsch_ue->nb_re_dmrs;
+      nb_re_dmrs_per_rb = nb_dmrs_re_per_rb;
     else
       nb_re_dmrs_per_rb = 0;
     
-    nb_re_pusch = harq_process_ul_ue->nb_rb * (NR_NB_SC_PER_RB - nb_re_dmrs_per_rb);
+    nb_re_pusch = nb_rb * (NR_NB_SC_PER_RB - nb_re_dmrs_per_rb);
 
     nr_dft(&ulsch_ue->y[y_offset], &((int32_t*)tx_layers[0])[y_offset], nb_re_pusch);
 
@@ -364,13 +350,13 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
 
   txdataF = UE->common_vars.txdataF;
 
-  start_rb = harq_process_ul_ue->first_rb;
+  start_rb = harq_process_ul_ue->pusch_pdu.rb_start;
   start_sc = frame_parms->first_carrier_offset + start_rb*NR_NB_SC_PER_RB;
 
   if (start_sc >= frame_parms->ofdm_symbol_size)
     start_sc -= frame_parms->ofdm_symbol_size;
 
-  for (ap=0; ap<harq_process_ul_ue->Nl; ap++) {
+  for (ap=0; ap< Nl; ap++) {
 
     // DMRS params for this ap
     get_Wt(Wt, ap, dmrs_type);
@@ -380,46 +366,38 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
 
     uint8_t k_prime=0;
     uint8_t is_dmrs, is_ptrs;
-    uint8_t l_ref;
     uint16_t m=0, n=0, dmrs_idx=0, ptrs_idx = 0;
 
-    for (l=start_symbol; l<start_symbol+harq_process_ul_ue->number_of_symbols; l++) {
+    for (l=start_symbol; l<start_symbol+number_of_symbols; l++) {
 
       k = start_sc;
       n = 0;
       dmrs_idx = 0;
-      l_ref = (mapping_type) ? l-start_symbol : l;
 
-      for (i=0; i<harq_process_ul_ue->nb_rb*NR_NB_SC_PER_RB; i++) {
+      for (i=0; i< nb_rb*NR_NB_SC_PER_RB; i++) {
 
         sample_offsetF = l*frame_parms->ofdm_symbol_size + k;
 
         is_dmrs = 0;
         is_ptrs = 0;
 
-        is_dmrs = is_dmrs_symbol(l_ref,
-                                 k,
-                                 start_sc,
-                                 k_prime,
-                                 n,
-                                 delta,
-                                 harq_process_ul_ue->number_of_symbols,
-                                 dmrs_type,
-                                 frame_parms->ofdm_symbol_size);
-
-        if (UE->ptrs_configured == 1){
-          is_ptrs = is_ptrs_symbol(l,
-                                   k,
-                                   ulsch_ue->rnti,
-                                   harq_process_ul_ue->nb_rb,
-                                   harq_process_ul_ue->number_of_symbols,
-                                   ap,
-                                   K_ptrs,
-                                   ulsch_ue->ptrs_symbols,
-                                   start_sc,
-                                   frame_parms->ofdm_symbol_size,
-                                   UE->pusch_config.dmrs_UplinkConfig.pusch_dmrs_type,
-                                   ptrs_Uplink_Config->resourceElementOffset);
+        if((ul_dmrs_symb_pos >> l) & 0x01) {
+          if (k == ((start_sc+get_dmrs_freq_idx_ul(n, k_prime, delta, dmrs_type))%frame_parms->ofdm_symbol_size))
+            is_dmrs = 1;
+        }
+
+        if (harq_process_ul_ue->pusch_pdu.pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS){
+
+          if(is_ptrs_symbol(l, ulsch_ue->ptrs_symbols))
+            is_ptrs = is_ptrs_subcarrier(k,
+                                         rnti,
+                                         ap,
+                                         dmrs_type,
+                                         K_ptrs,
+                                         nb_rb,
+                                         harq_process_ul_ue->pusch_pdu.pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset,
+                                         start_sc,
+                                         frame_parms->ofdm_symbol_size);
         }
 
         if (is_dmrs == 1) {
@@ -446,7 +424,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
         }  else if (is_ptrs == 1) {
 
           if (k == start_sc){
-            nr_modulation(pusch_dmrs[l][0], harq_process_ul_ue->nb_rb/2, DMRS_MOD_ORDER, mod_ptrs);
+            nr_modulation(pusch_dmrs[l][0], nb_rb, DMRS_MOD_ORDER, mod_ptrs);
           }
 
           ((int16_t*)txdataF[ap])[(sample_offsetF)<<1] = (beta_ptrs*AMP*mod_ptrs[ptrs_idx<<1]) >> 15;
@@ -494,7 +472,7 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
   int32_t **txdata;
   int32_t **txdataF;
   int timing_advance;
-  uint8_t Nl = UE->ulsch[thread_id][gNB_id][0]->harq_processes[harq_pid]->Nl; // cw 0
+  uint8_t Nl = UE->ulsch[thread_id][gNB_id][0]->harq_processes[harq_pid]->pusch_pdu.nrOfLayers; // cw 0
 
   /////////////////////////IFFT///////////////////////
   ///////////
diff --git a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
index c7293c3a9830f68b385f4883233c848580a3d8f6..e1358602ce835b39613a82e7a1c46df24a4ebc29 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
@@ -38,6 +38,7 @@
 #include "PHY/NR_UE_TRANSPORT/pucch_nr.h"
 #include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
 #include "PHY/NR_TRANSPORT/nr_transport_common_proto.h"
+#include <openair1/PHY/CODING/nrSmallBlock/nr_small_block_defs.h>
 #include "common/utils/LOG/log.h"
 #include "common/utils/LOG/vcd_signal_dumper.h"
 
diff --git a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h
index 510abb8373838d75bbcb0eb389c4eb2ef6f629f9..a2446dccf99ccd38e31a4c7378e5aa26aaffac43 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.h
@@ -29,6 +29,9 @@
 * \note
 * \warning
 */
+#ifndef __PUCCH_NR__H__
+#define __PUCCH_NR__H__
+
 //#include "PHY/defs.h"
 #include "PHY/impl_defs_nr.h"
 #include "PHY/defs_nr_common.h"
@@ -417,3 +420,4 @@ void nr_generate_pucch3_4(PHY_VARS_NR_UE *ue,
                                          73, 79, 83, 89, 97, 101,103,107,109,113,
                                          127,131,137,139,149,151,157,163,167,173,
                                          179,181,191,193,197,199};
+#endif
diff --git a/openair1/PHY/TOOLS/nr_phy_scope.c b/openair1/PHY/TOOLS/nr_phy_scope.c
index 4682a890299786dd491c30e3e9500a9749468b45..8c92214e68b14be8391540257b403bbff79f41e6 100644
--- a/openair1/PHY/TOOLS/nr_phy_scope.c
+++ b/openair1/PHY/TOOLS/nr_phy_scope.c
@@ -157,9 +157,9 @@ void phy_scope_gNB(FD_phy_scope_gnb *form,
 {
   int i, arx; //int i,i2,arx,atx,ind,k;
   NR_DL_FRAME_PARMS *frame_parms = &phy_vars_gnb->frame_parms;
-  int nsymb_ce = 12*frame_parms->N_RB_UL*frame_parms->symbols_per_tti;
+  //int nsymb_ce = 12*frame_parms->N_RB_UL*frame_parms->symbols_per_tti;
   uint8_t nb_antennas_rx = frame_parms->nb_antennas_rx;
-  uint8_t nb_antennas_tx = 1; // frame_parms->nb_antennas_tx; // in LTE Rel. 8 and 9 only a single transmit antenna is assumed at the UE
+  //uint8_t nb_antennas_tx = 1; // frame_parms->nb_antennas_tx; // in LTE Rel. 8 and 9 only a single transmit antenna is assumed at the UE
   int16_t **rxsig_t, **rxsig_f;
   // int16_t **chest_t=NULL;
   // int16_t **chest_f=NULL;
@@ -911,19 +911,18 @@ void reset_stats_gNB(FL_OBJECT *button,
 
 
 static void *scope_thread_gNB(void *arg) {
-  int UE_id;
-  int ue_cnt=0;
+  scopeParms_t * p=(scopeParms_t *) arg;	
 //# ifdef ENABLE_XFORMS_WRITE_STATS
 //  FILE *gNB_stats = fopen("gNB_stats.txt", "w");
 //#endif
 
   while (!oai_exit) {
-    ue_cnt=0;
+    int ue_cnt=0;
     
-    for(UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
+    for(int UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
         if ((ue_cnt<scope_enb_num_ue)) {
           //this function needs to be written
-          phy_scope_gNB(form_gnb[ue_cnt], RC.gNB[0], RC.ru[0], UE_id);
+          phy_scope_gNB(form_gnb[ue_cnt], p->gNB, p->ru, UE_id);
           ue_cnt++;
         }
     }
@@ -966,7 +965,7 @@ FD_stats_form * create_form_stats_form( void ) {
 }
 
 void startScope(scopeParms_t * p) {
-  FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
+  //FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
   char title[255];
   fl_initialize (p->argc, p->argv, NULL, 0, 0);
   /*
@@ -983,5 +982,5 @@ void startScope(scopeParms_t * p) {
   } // UE_id
 
   pthread_t forms_thread;
-  threadCreate(&forms_thread, scope_thread_gNB, NULL, "scope", -1, OAI_PRIORITY_RT_LOW);
+  threadCreate(&forms_thread, scope_thread_gNB, p, "scope", -1, OAI_PRIORITY_RT_LOW);
 }
diff --git a/openair1/PHY/TOOLS/nr_phy_scope.h b/openair1/PHY/TOOLS/nr_phy_scope.h
index aaee08a554bf9fe27c8ce5742531f3d4c29e1bd6..29229d6b12e2f710676ee0cda162d9333f16ffff 100644
--- a/openair1/PHY/TOOLS/nr_phy_scope.h
+++ b/openair1/PHY/TOOLS/nr_phy_scope.h
@@ -69,19 +69,13 @@ typedef struct {
 typedef struct {
   int *argc;
   char **argv;
+  RU_t* ru;
+  PHY_VARS_gNB *gNB;
 } scopeParms_t;
 
 extern unsigned char scope_enb_num_ue;
-FD_phy_scope_gnb * create_phy_scope_gnb( void );
 FD_phy_scope_nrue * create_phy_scope_nrue( void );
 
-
-void phy_scope_gNB(FD_phy_scope_gnb *form,
-                   PHY_VARS_gNB *phy_vars_gnb,
-		   RU_t *phy_vars_ru,
-                   int UE_id);
-
-
 void phy_scope_nrUE(FD_phy_scope_nrue *form,
                   PHY_VARS_NR_UE *phy_vars_ue,
                   int eNB_id,
@@ -91,6 +85,5 @@ void phy_scope_nrUE(FD_phy_scope_nrue *form,
 
 void startScope(scopeParms_t * p);
 
-
 extern RAN_CONTEXT_t RC;
 #endif
diff --git a/openair1/PHY/TOOLS/smbv.h b/openair1/PHY/TOOLS/smbv.h
index ef40a9ed7d08e27817430e622ecc056e36b0c48a..f8fab67d0146cd55b5efbb45599ef08375b575ee 100644
--- a/openair1/PHY/TOOLS/smbv.h
+++ b/openair1/PHY/TOOLS/smbv.h
@@ -23,6 +23,8 @@
   This library offers some functions to remotely program the R&S SMBV100A.
 */
 
+#ifndef __PHY_TOOLS_SMBV__H__
+#define __PHY_TOOLS_SMBV__H__
 
 #include <string.h>
 #include <stdio.h>
@@ -93,3 +95,4 @@ int smbv_configure_common_dci(const char* fname, uint8_t subframe, const char* t
 // item is the row in the DCI table
 int smbv_configure_ue_spec_dci(const char* fname, uint8_t subframe, uint8_t user, DCI_ALLOC_t *dci_alloc, uint8_t item);
 #endif
+#endif
diff --git a/openair1/PHY/defs_L1_NB_IoT.h b/openair1/PHY/defs_L1_NB_IoT.h
index f0fd7661c718f15df967e4ddddd482b3a016cacf..1f8c0b8eeec1cd73e7c51966c97eda05e8b807d4 100644
--- a/openair1/PHY/defs_L1_NB_IoT.h
+++ b/openair1/PHY/defs_L1_NB_IoT.h
@@ -148,11 +148,7 @@ static inline void* malloc16_clear( size_t size )
 #define NB_BANDS_MAX_NB_IoT 8
 
 
-#ifdef OCP_FRAMEWORK
-#include <enums.h>
-#else
 typedef enum {normal_txrx_NB_IoT=0,rx_calib_ue_NB_IoT=1,rx_calib_ue_med_NB_IoT=2,rx_calib_ue_byp_NB_IoT=3,debug_prach_NB_IoT=4,no_L2_connect_NB_IoT=5,calib_prach_tx_NB_IoT=6,rx_dump_frame_NB_IoT=7,loop_through_memory_NB_IoT=8} runmode_NB_IoT_t;
-#endif
 /*
 enum transmission_access_mode {
   NO_ACCESS=0,
diff --git a/openair1/PHY/defs_RU.h b/openair1/PHY/defs_RU.h
index 2fd4d0ea663d0c9fc6045ab40598ea1e6b56383a..ce808eddf9f6346dbffa197d02a6579eb0cf4497 100644
--- a/openair1/PHY/defs_RU.h
+++ b/openair1/PHY/defs_RU.h
@@ -45,9 +45,6 @@
 #define MAX_RRU_CONFIG_SIZE 1024
 
 
-#ifdef OCP_FRAMEWORK
-#include <enums.h>
-#else
 
 typedef enum {
   normal_txrx=0,
@@ -93,7 +90,6 @@ typedef enum {
   synch_to_other,          // synch to another source_(timer, other RU)
   synch_to_mobipass_standalone  // special case for mobipass in standalone mode
 } node_timing_t;
-#endif
 
 
 typedef struct {
@@ -541,6 +537,8 @@ typedef struct RU_t_s {
   void (*wakeup_prach_gNB)(struct PHY_VARS_gNB_s *gNB, struct RU_t_s *ru, int frame, int subframe);
   /// function pointer to wakeup routine in lte-enb.
   void (*wakeup_prach_eNB_br)(struct PHY_VARS_eNB_s *eNB, struct RU_t_s *ru, int frame, int subframe);
+  /// function pointer to start a thread of tx write for USRP.
+  int (*start_write_thread)(struct RU_t_s *ru);
 
   /// function pointer to NB entry routine
   void (*eNB_top)(struct PHY_VARS_eNB_s *eNB, int frame_rx, int subframe_rx, char *string, struct RU_t_s *ru);
diff --git a/openair1/PHY/defs_common.h b/openair1/PHY/defs_common.h
index f52558b63203e2bbb337a71d07ef7ff199448000..75b2d54dc6933ffa507d3df7544f68f4ceb14b3b 100644
--- a/openair1/PHY/defs_common.h
+++ b/openair1/PHY/defs_common.h
@@ -99,9 +99,6 @@
 
 #define NB_RX_ANTENNAS_MAX 64
 
-#ifdef OCP_FRAMEWORK
-#include "enums.h"
-#else
 
 typedef enum {TDD=1,FDD=0} lte_frame_type_t;
 
@@ -122,7 +119,6 @@ typedef enum {
   one=6,
   two=12
 } PHICH_RESOURCE_t;
-#endif
 /// PHICH-Config from 36.331 RRC spec
 typedef struct {
   /// Parameter: PHICH-Duration, see TS 36.211 (Table 6.9.3-1).
@@ -250,12 +246,10 @@ typedef struct {
 } UL_REFERENCE_SIGNALS_PUSCH_t;
 
 /// Enumeration for parameter Hopping-mode \ref PUSCH_CONFIG_COMMON::hoppingMode.
-#ifndef OCP_FRAMEWORK
 typedef enum {
   interSubFrame=0,
   intraAndInterSubFrame=1
 } PUSCH_HOPPING_t;
-#endif
 
 /// PUSCH-ConfigCommon from 36.331 RRC spec.
 typedef struct {
@@ -434,7 +428,6 @@ typedef struct {
   uint8_t filterCoefficient;
 } UL_POWER_CONTROL_DEDICATED;
 
-#ifndef OCP_FRAMEWORK
 /// Enumeration for parameter \f$\alpha\f$ \ref UL_POWER_CONTROL_CONFIG_COMMON::alpha.
 typedef enum {
   al0=0,
@@ -446,7 +439,6 @@ typedef enum {
   al09=6,
   al1=7
 } PUSCH_alpha_t;
-#endif
 
 /// \note UNUSED
 typedef enum {
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index 6f6c5ac8e9a4696e5dd2103f269b4f59b8beb49a..b2d6a75265e906dc2c48becc27ae4cac30565c9c 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -954,9 +954,6 @@ typedef struct {
   /// PUSCH DMRS sequence
   uint32_t ****nr_gold_pusch_dmrs;
 
-  /// flag to indicate if PTRS is configured
-  uint8_t ptrs_configured;
-
   uint32_t X_u[64][839];
 
   uint32_t high_speed_flag;
diff --git a/openair1/PHY/phy_extern.h b/openair1/PHY/phy_extern.h
index deb7087c8cf4cc4c969629ce50a2c3949839c8f7..165ed961b30f0a40a3723c2ca275a88152fef815 100644
--- a/openair1/PHY/phy_extern.h
+++ b/openair1/PHY/phy_extern.h
@@ -38,7 +38,7 @@ extern unsigned int TX_DMA_BUFFER[4][NB_ANTENNAS_TX];
 extern unsigned int DAQ_MBOX;
 extern int number_of_cards;
 
-extern short conjugate[8],conjugate2[8];
+extern const short conjugate[8],conjugate2[8];
 
 extern RAN_CONTEXT_t RC;
 
@@ -73,8 +73,8 @@ extern int flag_LA;
 extern double sinr_bler_map[MCS_COUNT][2][MCS_TABLE_LENGTH_MAX];
 extern double sinr_bler_map_up[MCS_COUNT][2][16];
 extern int table_length[MCS_COUNT];
-extern double sinr_to_cqi[4][16];
-extern int cqi_to_mcs[16];
+extern const double sinr_to_cqi[4][16];
+extern const int cqi_to_mcs[16];
 
 //for MU-MIMO abstraction using MIESM
 //this 2D arrarays contains SINR, MI and RBIR in rows 1, 2, and 3 respectively
@@ -82,23 +82,22 @@ extern double MI_map_4qam[3][162];
 extern double MI_map_16qam[3][197];
 extern double MI_map_64qam[3][227];
 
-extern double beta1_dlsch_MI[6][MCS_COUNT];
-extern double beta2_dlsch_MI[6][MCS_COUNT];
+extern const double beta1_dlsch_MI[6][MCS_COUNT];
+extern const double beta2_dlsch_MI[6][MCS_COUNT];
 
-extern double q_qpsk[8];
-extern double q_qam16[8];
-extern double q_qam64[8];
+extern const double q_qpsk[8];
+extern const double q_qam16[8];
+extern const double q_qam64[8];
+extern const double p_qpsk[8];
+extern const double p_qam16[8];
+extern const double p_qam64[8];
 
-extern double p_qpsk[8];
-extern double p_qam16[8];
-extern double p_qam64[8];
+extern const double beta1_dlsch[6][MCS_COUNT];
+extern const double beta2_dlsch[6][MCS_COUNT];
 
-extern double beta1_dlsch[6][MCS_COUNT];
-extern double beta2_dlsch[6][MCS_COUNT];
-
-extern char NB_functions[7][20];
-extern char NB_timing[2][20];
-extern char ru_if_types[MAX_RU_IF_TYPES][20];
+extern const char NB_functions[7][20];
+extern const char NB_timing[2][20];
+extern const char ru_if_types[MAX_RU_IF_TYPES][20];
 
 extern int16_t unscrambling_lut[65536*16];
 extern uint8_t scrambling_lut[65536*16];
diff --git a/openair1/PHY/phy_extern_nr_ue.h b/openair1/PHY/phy_extern_nr_ue.h
index 569bec68515e3fe71525493ef33617e3ad5e6d07..2f2a0427f41484531b043887c89a14e4d3e10e95 100644
--- a/openair1/PHY/phy_extern_nr_ue.h
+++ b/openair1/PHY/phy_extern_nr_ue.h
@@ -34,7 +34,7 @@ extern unsigned int TX_DMA_BUFFER[4][NB_ANTENNAS_TX];
 
 //#include "PHY/LTE_TRANSPORT/transport_extern.h"
 
-extern short conjugate[8],conjugate2[8];
+extern const short conjugate[8],conjugate2[8];
 extern int number_of_cards;
 
 
@@ -70,8 +70,8 @@ extern int flag_LA;
 extern double sinr_bler_map[MCS_COUNT][2][MCS_TABLE_LENGTH_MAX];
 extern double sinr_bler_map_up[MCS_COUNT][2][16];
 extern int table_length[MCS_COUNT];
-extern double sinr_to_cqi[4][16];
-extern int cqi_to_mcs[16];
+extern const double sinr_to_cqi[4][16];
+extern const int cqi_to_mcs[16];
 
 //for MU-MIMO abstraction using MIESM
 //this 2D arrarays contains SINR, MI and RBIR in rows 1, 2, and 3 respectively
@@ -79,23 +79,19 @@ extern double MI_map_4qam[3][162];
 extern double MI_map_16qam[3][197];
 extern double MI_map_64qam[3][227];
 
-extern double beta1_dlsch_MI[6][MCS_COUNT];
-extern double beta2_dlsch_MI[6][MCS_COUNT];
+extern const double beta1_dlsch_MI[6][MCS_COUNT];
+extern const double beta2_dlsch_MI[6][MCS_COUNT];
 
-extern double q_qpsk[8];
-extern double q_qam16[8];
-extern double q_qam64[8];
+extern const double q_qpsk[8];
+extern const double q_qam16[8];
+extern const double q_qam64[8];
 
-extern double p_qpsk[8];
-extern double p_qam16[8];
-extern double p_qam64[8];
+extern const double beta1_dlsch[6][MCS_COUNT];
+extern const double beta2_dlsch[6][MCS_COUNT];
 
-extern double beta1_dlsch[6][MCS_COUNT];
-extern double beta2_dlsch[6][MCS_COUNT];
-
-extern char NB_functions[7][20];
-extern char NB_timing[2][20];
-extern char ru_if_types[MAX_RU_IF_TYPES][20];
+extern const char NB_functions[7][20];
+extern const char NB_timing[2][20];
+extern const char ru_if_types[MAX_RU_IF_TYPES][20];
 
 extern int16_t unscrambling_lut[65536*16];
 extern uint8_t scrambling_lut[65536*16];
diff --git a/openair1/PHY/phy_extern_ue.h b/openair1/PHY/phy_extern_ue.h
index 4f9ed0f26bec1ebd0983797d495b741d1b38ced9..622551c2fe9891ad7a77df04ef2de7ed9e0d5953 100644
--- a/openair1/PHY/phy_extern_ue.h
+++ b/openair1/PHY/phy_extern_ue.h
@@ -36,7 +36,7 @@ extern unsigned int TX_DMA_BUFFER[4][NB_ANTENNAS_TX];
 
 extern int number_of_cards;
 
-extern short conjugate[8],conjugate2[8];
+extern const short conjugate[8],conjugate2[8];
 
 
 extern PHY_VARS_UE ***PHY_vars_UE_g;
@@ -70,8 +70,8 @@ extern int flag_LA;
 extern double sinr_bler_map[MCS_COUNT][2][MCS_TABLE_LENGTH_MAX];
 extern double sinr_bler_map_up[MCS_COUNT][2][16];
 extern int table_length[MCS_COUNT];
-extern double sinr_to_cqi[4][16];
-extern int cqi_to_mcs[16];
+extern const double sinr_to_cqi[4][16];
+extern const int cqi_to_mcs[16];
 
 //for MU-MIMO abstraction using MIESM
 //this 2D arrarays contains SINR, MI and RBIR in rows 1, 2, and 3 respectively
@@ -79,23 +79,23 @@ extern double MI_map_4qam[3][162];
 extern double MI_map_16qam[3][197];
 extern double MI_map_64qam[3][227];
 
-extern double beta1_dlsch_MI[6][MCS_COUNT];
-extern double beta2_dlsch_MI[6][MCS_COUNT];
+extern const double beta1_dlsch_MI[6][MCS_COUNT];
+extern const double beta2_dlsch_MI[6][MCS_COUNT];
 
-extern double q_qpsk[8];
-extern double q_qam16[8];
-extern double q_qam64[8];
+extern const double q_qpsk[8];
+extern const double q_qam16[8];
+extern const double q_qam64[8];
 
-extern double p_qpsk[8];
-extern double p_qam16[8];
-extern double p_qam64[8];
+extern const double p_qpsk[8];
+extern const double p_qam16[8];
+extern const double p_qam64[8];
 
-extern double beta1_dlsch[6][MCS_COUNT];
-extern double beta2_dlsch[6][MCS_COUNT];
+extern const double beta1_dlsch[6][MCS_COUNT];
+extern const double beta2_dlsch[6][MCS_COUNT];
 
-extern char NB_functions[7][20];
-extern char NB_timing[2][20];
-extern char ru_if_types[MAX_RU_IF_TYPES][20];
+extern const char NB_functions[7][20];
+extern const char NB_timing[2][20];
+extern const char ru_if_types[MAX_RU_IF_TYPES][20];
 
 extern int16_t unscrambling_lut[65536*16];
 extern uint8_t scrambling_lut[65536*16];
diff --git a/openair1/PHY/phy_vars.h b/openair1/PHY/phy_vars.h
index 26540f6fc885ee3b6424cf1cc3bc1f4f52068bc0..a74d148479d2158aa668416f36f97309272b8bb6 100644
--- a/openair1/PHY/phy_vars.h
+++ b/openair1/PHY/phy_vars.h
@@ -50,8 +50,8 @@ unsigned short rev[2048],rev_times4[8192],rev_half[1024];
 unsigned short rev256[256],rev512[512],rev1024[1024],rev4096[4096],rev2048[2048],rev8192[8192];
 
 
-short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
-short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
+const short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
+const short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
 
 
 #include "SIMULATION/ETH_TRANSPORT/vars.h"
@@ -84,29 +84,29 @@ double MI_map_16qam[3][197];
 double MI_map_64qam[3][227];
 
 // here the first index is for transmission mode 1, 2, 5 and 6 whereas the second index is for the 16 sinr vaues corresponding to 16 CQIs
-double sinr_to_cqi[4][16]= { {-2.5051, -2.5051, -1.7451, -0.3655, 1.0812, 2.4012, 3.6849, 6.6754, 8.3885, 8.7970, 12.0437, 14.4709, 15.7281,  17.2424,  17.2424, 17.2424},
+const double sinr_to_cqi[4][16]= { {-2.5051, -2.5051, -1.7451, -0.3655, 1.0812, 2.4012, 3.6849, 6.6754, 8.3885, 8.7970, 12.0437, 14.4709, 15.7281,  17.2424,  17.2424, 17.2424},
   {-2.2360, -2.2360, -1.3919, -0.0218, 1.5319,  2.9574,  4.3234, 6.3387, 8.9879, 9.5096, 12.6609, 14.0116, 16.4984, 18.1572, 18.1572, 18.1572},
   {-1, -1.0000, -0.4198, -0.0140, 1.0362,  2.3520, 3.5793, 6.1136, 8.4836, 9.0858, 12.4723, 13.9128, 16.2054, 17.7392, 17.7392, 17.7392},
   { -4.1057, -4.1057, -3.3768, -2.2916, -1.1392, 0.1236, 1.2849, 3.1933, 5.9298, 6.4052, 9.6245, 10.9414, 13.5166, 14.9545, 14.9545, 14.9545}
 };
 
 //int cqi_to_mcs[16]={0, 0, 1, 3, 5, 7, 9, 13, 15, 16, 20, 23, 25, 27, 27, 27};
-int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 28};
+const int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 28};
 
 //for SNR to MI conversion 7 th order Polynomial coeff
-double q_qam16[8]= {3.21151853033897e-10,5.55435952230651e-09,-2.30760065362117e-07,-6.25587743817859e-06,4.62251036452795e-06,0.00224150813158937,0.0393723140344367,0.245486379182639};
-double q_qpsk[8]= {1.94491167814437e-09,8.40494123817774e-08,4.75527131198034e-07,-2.48946285301621e-05,-0.000347614016158364,0.00209252225437100,0.0742986115462510,0.488297879889425};
-double q_qam64[8]= {2.25934026232206e-11,-1.45992206328306e-10,-3.70861183071900e-08,-1.22206071019319e-06,6.49115500399637e-06,0.00129828997837433,0.0259669554914859,0.166602901214898};
+const double q_qam16[8]= {3.21151853033897e-10,5.55435952230651e-09,-2.30760065362117e-07,-6.25587743817859e-06,4.62251036452795e-06,0.00224150813158937,0.0393723140344367,0.245486379182639};
+const double q_qpsk[8]= {1.94491167814437e-09,8.40494123817774e-08,4.75527131198034e-07,-2.48946285301621e-05,-0.000347614016158364,0.00209252225437100,0.0742986115462510,0.488297879889425};
+const double q_qam64[8]= {2.25934026232206e-11,-1.45992206328306e-10,-3.70861183071900e-08,-1.22206071019319e-06,6.49115500399637e-06,0.00129828997837433,0.0259669554914859,0.166602901214898};
 
 //for MI to SNR conversion 7 th order Polynomial coeff
-double p_qpsk[8]= {5982.42405670359,-21568.1135917693,31293.9987036905,-23394.6795043871,9608.34750585489,-2158.15802349899,267.731968719036,-20.6145324295965};
-double p_qam16[8]= {7862.12690694170,-28510.3207048338,41542.2150287122,-31088.3036957379,12690.1982361016,-2785.66604739984,326.595462489375,-18.9911849872089};
-double p_qam64[8]= {8832.57933013696,-32119.1802555952,46914.2578990397,-35163.8150557183,14343.7419388853,-3126.61025510092,360.954930562237,-18.0358548533343};
+const double p_qpsk[8]= {5982.42405670359,-21568.1135917693,31293.9987036905,-23394.6795043871,9608.34750585489,-2158.15802349899,267.731968719036,-20.6145324295965};
+const double p_qam16[8]= {7862.12690694170,-28510.3207048338,41542.2150287122,-31088.3036957379,12690.1982361016,-2785.66604739984,326.595462489375,-18.9911849872089};
+const double p_qam64[8]= {8832.57933013696,-32119.1802555952,46914.2578990397,-35163.8150557183,14343.7419388853,-3126.61025510092,360.954930562237,-18.0358548533343};
 
 // ideal CE MIESM
 
-double beta1_dlsch_MI[6][MCS_COUNT] = { {1.1188, 0.3720, 0.3755, 0.9453, 0.5799, 0.5256, 0.5485, 0.5340, 0.5165, 0.5300, 0.6594, 0.5962, 0.4884, 0.4927, 0.3687, 0.4614, 0.4081, 0.2639,0.2935,0.2520,0.3709,0.2906,0.2612,0.2390}, {0.7138, 0.5533, 0.5533, 0.4828, 0.4998, 0.4843, 0.4942, 0.5323, 0.5142, 0.4756, 0.5792, 0.4167, 0.4445, 0.3942, 0.3789, 0.2756, 0.4456, 0.1650, 0.2254, 0.2353, 0.2097,0.2517,0.3242,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1},  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1},{1.808065416202085, 1.754544945430673,1.902272019362616, 1.790054645392961, 1.563204092967629, 1.585258289348813, 1.579349443720310, 1.570650121437345, 1.545055626608596, 1.362229442426877, 1.85, 1.79, 1.65, 1.54, 1.46, 1.39, 1.33, 1,1,1,1,1,1,1},{0.7146, 0.4789, 0.5392, 0.5556, 0.4975, 0.4847, 0.4691, 0.5261, 0.5278, 0.4962, 0.4468, 0.4113, 0.4622, 0.4609, 0.3946, 0.3991, 0.3532, 0.2439, 0.1898, 0.2929, 0.2712, 0.3367, 0.3591, 0.2571}};
-double beta2_dlsch_MI[6][MCS_COUNT] = { {1.1293, 0.3707, 0.3722, 0.9310, 0.5808, 0.5265, 0.5404, 0.5279, 0.5210, 0.5226, 0.6438, 0.5827, 0.4804, 0.4830, 0.3638, 0.4506, 0.4107, 0.2547, 0.2797, 0.2413, 0.3351, 0.2750, 0.2568, 0.2273}, {0.7028, 0.5503, 0.5503, 0.4815, 0.5006, 0.4764, 0.4810, 0.5124, 0.4964, 0.4485, 0.5497, 0.3971, 0.4239, 0.3701, 0.3494, 0.2630, 0.4053, 0.1505, 0.2001,0.2024,0.1788,0.2124,0.2668,1}, {1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1},  {1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1},{1.079518113138858, 1.105622953570353, 1.031337449900606, 1.073342032668810, 1.242636589110353, 1.255054927783647, 1.291463834317768, 1.317048698347491, 1.354485054187984, 0.338534029291017, 1.85, 1.79, 1.65, 1.54, 1.46, 1.39, 1.33,1, 1,1,1,1,1,1},{0.6980, 0.4694, 0.5379, 0.5483, 0.4982, 0.4737, 0.4611, 0.5051, 0.5020, 0.4672, 0.4357, 0.3957, 0.4389, 0.4344, 0.3645, 0.3661, 0.3301, 0.2179, 0.1730, 0.2536, 0.2389,0.2884,0.2936,0.2226}};
+const double beta1_dlsch_MI[6][MCS_COUNT] = { {1.1188, 0.3720, 0.3755, 0.9453, 0.5799, 0.5256, 0.5485, 0.5340, 0.5165, 0.5300, 0.6594, 0.5962, 0.4884, 0.4927, 0.3687, 0.4614, 0.4081, 0.2639,0.2935,0.2520,0.3709,0.2906,0.2612,0.2390}, {0.7138, 0.5533, 0.5533, 0.4828, 0.4998, 0.4843, 0.4942, 0.5323, 0.5142, 0.4756, 0.5792, 0.4167, 0.4445, 0.3942, 0.3789, 0.2756, 0.4456, 0.1650, 0.2254, 0.2353, 0.2097,0.2517,0.3242,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1},  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1},{1.808065416202085, 1.754544945430673,1.902272019362616, 1.790054645392961, 1.563204092967629, 1.585258289348813, 1.579349443720310, 1.570650121437345, 1.545055626608596, 1.362229442426877, 1.85, 1.79, 1.65, 1.54, 1.46, 1.39, 1.33, 1,1,1,1,1,1,1},{0.7146, 0.4789, 0.5392, 0.5556, 0.4975, 0.4847, 0.4691, 0.5261, 0.5278, 0.4962, 0.4468, 0.4113, 0.4622, 0.4609, 0.3946, 0.3991, 0.3532, 0.2439, 0.1898, 0.2929, 0.2712, 0.3367, 0.3591, 0.2571}};
+const double beta2_dlsch_MI[6][MCS_COUNT] = { {1.1293, 0.3707, 0.3722, 0.9310, 0.5808, 0.5265, 0.5404, 0.5279, 0.5210, 0.5226, 0.6438, 0.5827, 0.4804, 0.4830, 0.3638, 0.4506, 0.4107, 0.2547, 0.2797, 0.2413, 0.3351, 0.2750, 0.2568, 0.2273}, {0.7028, 0.5503, 0.5503, 0.4815, 0.5006, 0.4764, 0.4810, 0.5124, 0.4964, 0.4485, 0.5497, 0.3971, 0.4239, 0.3701, 0.3494, 0.2630, 0.4053, 0.1505, 0.2001,0.2024,0.1788,0.2124,0.2668,1}, {1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1},  {1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1},{1.079518113138858, 1.105622953570353, 1.031337449900606, 1.073342032668810, 1.242636589110353, 1.255054927783647, 1.291463834317768, 1.317048698347491, 1.354485054187984, 0.338534029291017, 1.85, 1.79, 1.65, 1.54, 1.46, 1.39, 1.33,1, 1,1,1,1,1,1},{0.6980, 0.4694, 0.5379, 0.5483, 0.4982, 0.4737, 0.4611, 0.5051, 0.5020, 0.4672, 0.4357, 0.3957, 0.4389, 0.4344, 0.3645, 0.3661, 0.3301, 0.2179, 0.1730, 0.2536, 0.2389,0.2884,0.2936,0.2226}};
 
 //real CE MIESM
 /*
@@ -116,8 +116,8 @@ double beta2_dlsch_MI[6][MCS_COUNT] = { {1.36875, 0.59304, 0.53870, 0.98239, 0.8
 //ideal channel estimation values
 //double beta1_dlsch[6][MCS_COUNT] = { {2.3814, 0.4956, 0.5273, 1.1708, 0.8014, 0.7889, 0.8111, 0.8139, 0.8124, 0.8479, 1.9280, 1.9664, 2.3857, 2.5147, 2.4511, 3.0158, 2.8643, 5.3013, 5.8594, 6.5372, 7.8073, 7.8030, 7.5295, 7.1320}, {0.5146, 0.5549, 0.7405, 0.6913, 0.7349, 0.7000, 0.7539, 0.7955, 0.8074, 0.7760, 1.8150, 1.6561, 1.9280, 2.3563, 2.6699, 2.3086, 3.1601, 4.5316, 5.2870, 6.0983, 6.5635, 7.7024, 9.9592, 6.6173}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {1.79358, 1.17908, 2.02600, 1.72040, 1.58618, 1.59039, 1.68111, 1.67062, 1.64911, 1.33274, 4.87800, 3.58797, 3.72338, 5.35700, 2.81752, 1.93472, 2.23259, 1,1,1,1,1,1,1}, {0.4445, 0.5918, 0.7118, 0.7115, 0.7284, 0.7202, 0.7117, 0.8111, 0.8239, 0.7907, 1.8456, 1.8144, 2.3830, 2.6634, 2.6129, 2.8127, 2.7372, 4.9424, 4.8763, 6.8413, 7.1493, 9.4180, 10.1230, 8.9613}};
 //double beta2_dlsch[6][MCS_COUNT] = { {2.3639, 0.4952, 0.5207, 1.1572, 0.8026, 0.7864, 0.7996, 0.8034, 0.8200, 0.8367, 1.8701, 1.9212, 2.2947, 2.4472, 2.4091, 2.9479, 2.8973, 5.0591, 5.5134, 6.1483, 7.2166, 7.5177, 7.5704, 7.2248}, {0.5113, 0.5600, 0.7359, 0.6860, 0.7344, 0.6902, 0.7315, 0.7660, 0.7817, 0.7315, 1.7268, 1.5912, 1.8519, 2.2115, 2.4580, 2.1879, 2.9015, 4.1543, 4.6986, 5.3193, 5.6319, 6.5640, 8.2421, 5.6393}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {0.79479, 0.52872, 0.90005, 0.77170, 0.73220, 0.72060, 0.75433, 0.75451, 0.75989, 0.67655, 1.68525, 1.31100, 1.46573, 1.99843, 1.57293, 1.62852, 2.10636, 1,1,1,1,1,1,1}, {0.4398, 0.5823, 0.7094, 0.7043, 0.7282, 0.7041, 0.6979, 0.7762, 0.7871, 0.7469, 1.7752, 1.7443, 2.2266, 2.4767, 2.4146, 2.6040, 2.5708, 4.4488, 4.4944, 5.9630, 6.3740, 8.1097, 8.4210, 7.8027}};
-double beta1_dlsch[6][MCS_COUNT] = { {1.199175, 1.085656, 0.983872, 0.843789, 0.816093, 0.853078, 0.899236, 0.919665, 0.888673, 0.924181, 0.814176, 0.794108, 0.770653, 0.826266, 0.982043, 0.979621, 0.985176, 0.901741, 0.870311, 0.911303, 0.898923, 1.003359, 0.988535, 1.030639, 1.151038, 1.116939, 1.214118, 1.219148}, {0.5146, 0.5549, 0.7405, 0.6913, 0.7349, 0.7000, 0.7539, 0.7955, 0.8074, 0.7760, 1.8150, 1.6561, 1.9280, 2.3563, 2.6699, 2.3086, 3.1601, 4.5316, 5.2870, 6.0983, 6.5635, 7.7024, 9.9592, 6.6173}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {1.79358, 1.17908, 2.02600, 1.72040, 1.58618, 1.59039, 1.68111, 1.67062, 1.64911, 1.33274, 4.87800, 3.58797, 3.72338, 5.35700, 2.81752, 1.93472, 2.23259, 1,1,1,1,1,1,1}, {0.4445, 0.5918, 0.7118, 0.7115, 0.7284, 0.7202, 0.7117, 0.8111, 0.8239, 0.7907, 1.8456, 1.8144, 2.3830, 2.6634, 2.6129, 2.8127, 2.7372, 4.9424, 4.8763, 6.8413, 7.1493, 9.4180, 10.1230, 8.9613}};
-double beta2_dlsch[6][MCS_COUNT] = { {0.534622, 0.596561, 0.500838, 0.471721, 0.548218, 0.547974, 0.924245, 0.836484, 0.776917, 0.879691, 0.875722, 0.666933, 0.666393, 0.755377, 1.074985, 1.080290, 1.010914, 0.790892, 0.793435, 0.860249, 0.901508, 0.967060, 0.951372, 1.011493, 1.106151, 1.117076, 1.209397, 1.227790}, {0.5113, 0.5600, 0.7359, 0.6860, 0.7344, 0.6902, 0.7315, 0.7660, 0.7817, 0.7315, 1.7268, 1.5912, 1.8519, 2.2115, 2.4580, 2.1879, 2.9015, 4.1543, 4.6986, 5.3193, 5.6319, 6.5640, 8.2421, 5.6393}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {0.79479, 0.52872, 0.90005, 0.77170, 0.73220, 0.72060, 0.75433, 0.75451, 0.75989, 0.67655, 1.68525, 1.31100, 1.46573, 1.99843, 1.57293, 1.62852, 2.10636, 1,1,1,1,1,1,1}, {0.4398, 0.5823, 0.7094, 0.7043, 0.7282, 0.7041, 0.6979, 0.7762, 0.7871, 0.7469, 1.7752, 1.7443, 2.2266, 2.4767, 2.4146, 2.6040, 2.5708, 4.4488, 4.4944, 5.9630, 6.3740, 8.1097, 8.4210, 7.8027}};
+const double beta1_dlsch[6][MCS_COUNT] = { {1.199175, 1.085656, 0.983872, 0.843789, 0.816093, 0.853078, 0.899236, 0.919665, 0.888673, 0.924181, 0.814176, 0.794108, 0.770653, 0.826266, 0.982043, 0.979621, 0.985176, 0.901741, 0.870311, 0.911303, 0.898923, 1.003359, 0.988535, 1.030639, 1.151038, 1.116939, 1.214118, 1.219148}, {0.5146, 0.5549, 0.7405, 0.6913, 0.7349, 0.7000, 0.7539, 0.7955, 0.8074, 0.7760, 1.8150, 1.6561, 1.9280, 2.3563, 2.6699, 2.3086, 3.1601, 4.5316, 5.2870, 6.0983, 6.5635, 7.7024, 9.9592, 6.6173}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {1.79358, 1.17908, 2.02600, 1.72040, 1.58618, 1.59039, 1.68111, 1.67062, 1.64911, 1.33274, 4.87800, 3.58797, 3.72338, 5.35700, 2.81752, 1.93472, 2.23259, 1,1,1,1,1,1,1}, {0.4445, 0.5918, 0.7118, 0.7115, 0.7284, 0.7202, 0.7117, 0.8111, 0.8239, 0.7907, 1.8456, 1.8144, 2.3830, 2.6634, 2.6129, 2.8127, 2.7372, 4.9424, 4.8763, 6.8413, 7.1493, 9.4180, 10.1230, 8.9613}};
+const double beta2_dlsch[6][MCS_COUNT] = { {0.534622, 0.596561, 0.500838, 0.471721, 0.548218, 0.547974, 0.924245, 0.836484, 0.776917, 0.879691, 0.875722, 0.666933, 0.666393, 0.755377, 1.074985, 1.080290, 1.010914, 0.790892, 0.793435, 0.860249, 0.901508, 0.967060, 0.951372, 1.011493, 1.106151, 1.117076, 1.209397, 1.227790}, {0.5113, 0.5600, 0.7359, 0.6860, 0.7344, 0.6902, 0.7315, 0.7660, 0.7817, 0.7315, 1.7268, 1.5912, 1.8519, 2.2115, 2.4580, 2.1879, 2.9015, 4.1543, 4.6986, 5.3193, 5.6319, 6.5640, 8.2421, 5.6393}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {0.79479, 0.52872, 0.90005, 0.77170, 0.73220, 0.72060, 0.75433, 0.75451, 0.75989, 0.67655, 1.68525, 1.31100, 1.46573, 1.99843, 1.57293, 1.62852, 2.10636, 1,1,1,1,1,1,1}, {0.4398, 0.5823, 0.7094, 0.7043, 0.7282, 0.7041, 0.6979, 0.7762, 0.7871, 0.7469, 1.7752, 1.7443, 2.2266, 2.4767, 2.4146, 2.6040, 2.5708, 4.4488, 4.4944, 5.9630, 6.3740, 8.1097, 8.4210, 7.8027}};
 
 //real channel estimation valus
 /*
@@ -126,13 +126,9 @@ double beta2_dlsch[6][MCS_COUNT] = { {2.52163, 0.83231, 0.77472, 1.36536, 1.1682
 
 */
 
-#ifdef OCP_FRAMEWORK
-#include <enums.h>
-#else
-char NB_functions[7][20]={"eNodeB_3GPP","eNodeB_3GPP_BBU","NGFI_RAU_IF4p5","NGFI_RRU_IF5","NGFI_RRU_IF4p5","gNodeB_3GPP",};
-char NB_timing[2][20]={"synch_to_ext_device","synch_to_other"};
-char ru_if_types[MAX_RU_IF_TYPES][20]={"local RF","IF5 RRU","IF5 Mobipass","IF4p5 RRU","IF1pp RRU"};
-#endif
+const char NB_functions[7][20]={"eNodeB_3GPP","eNodeB_3GPP_BBU","NGFI_RAU_IF4p5","NGFI_RRU_IF5","NGFI_RRU_IF4p5","gNodeB_3GPP",};
+const char NB_timing[2][20]={"synch_to_ext_device","synch_to_other"};
+const char ru_if_types[MAX_RU_IF_TYPES][20]={"local RF","IF5 RRU","IF5 Mobipass","IF4p5 RRU","IF1pp RRU"};
 
 /// lookup table for unscrambling in RX
 int16_t unscrambling_lut[65536*16] __attribute__((aligned(32)));
diff --git a/openair1/PHY/phy_vars_nr_ue.h b/openair1/PHY/phy_vars_nr_ue.h
index bd077b5b0c77997a1fb547648d84b0702a626f6c..1843d8d5bcd75a8b2ccdf4a4abc9facf50100490 100644
--- a/openair1/PHY/phy_vars_nr_ue.h
+++ b/openair1/PHY/phy_vars_nr_ue.h
@@ -49,8 +49,8 @@ unsigned short rev[2048],rev_times4[8192],rev_half[1024];
 unsigned short rev256[256],rev512[512],rev1024[1024],rev4096[4096],rev2048[2048],rev8192[8192];
 
 
-short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
-short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
+const short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
+const short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
 
 
 #include "SIMULATION/ETH_TRANSPORT/vars.h"
@@ -84,29 +84,29 @@ double MI_map_16qam[3][197];
 double MI_map_64qam[3][227];
 
 // here the first index is for transmission mode 1, 2, 5 and 6 whereas the second index is for the 16 sinr vaues corresponding to 16 CQIs
-double sinr_to_cqi[4][16]= { {-2.5051, -2.5051, -1.7451, -0.3655, 1.0812, 2.4012, 3.6849, 6.6754, 8.3885, 8.7970, 12.0437, 14.4709, 15.7281,  17.2424,  17.2424, 17.2424},
+const double sinr_to_cqi[4][16]= { {-2.5051, -2.5051, -1.7451, -0.3655, 1.0812, 2.4012, 3.6849, 6.6754, 8.3885, 8.7970, 12.0437, 14.4709, 15.7281,  17.2424,  17.2424, 17.2424},
   {-2.2360, -2.2360, -1.3919, -0.0218, 1.5319,  2.9574,  4.3234, 6.3387, 8.9879, 9.5096, 12.6609, 14.0116, 16.4984, 18.1572, 18.1572, 18.1572},
   {-1, -1.0000, -0.4198, -0.0140, 1.0362,  2.3520, 3.5793, 6.1136, 8.4836, 9.0858, 12.4723, 13.9128, 16.2054, 17.7392, 17.7392, 17.7392},
   { -4.1057, -4.1057, -3.3768, -2.2916, -1.1392, 0.1236, 1.2849, 3.1933, 5.9298, 6.4052, 9.6245, 10.9414, 13.5166, 14.9545, 14.9545, 14.9545}
 };
 
 //int cqi_to_mcs[16]={0, 0, 1, 3, 5, 7, 9, 13, 15, 16, 20, 23, 25, 27, 27, 27};
-int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 28};
+const int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 28};
 
 //for SNR to MI conversion 7 th order Polynomial coeff
-double q_qam16[8]= {3.21151853033897e-10,5.55435952230651e-09,-2.30760065362117e-07,-6.25587743817859e-06,4.62251036452795e-06,0.00224150813158937,0.0393723140344367,0.245486379182639};
-double q_qpsk[8]= {1.94491167814437e-09,8.40494123817774e-08,4.75527131198034e-07,-2.48946285301621e-05,-0.000347614016158364,0.00209252225437100,0.0742986115462510,0.488297879889425};
-double q_qam64[8]= {2.25934026232206e-11,-1.45992206328306e-10,-3.70861183071900e-08,-1.22206071019319e-06,6.49115500399637e-06,0.00129828997837433,0.0259669554914859,0.166602901214898};
+const double q_qam16[8]= {3.21151853033897e-10,5.55435952230651e-09,-2.30760065362117e-07,-6.25587743817859e-06,4.62251036452795e-06,0.00224150813158937,0.0393723140344367,0.245486379182639};
+const double q_qpsk[8]= {1.94491167814437e-09,8.40494123817774e-08,4.75527131198034e-07,-2.48946285301621e-05,-0.000347614016158364,0.00209252225437100,0.0742986115462510,0.488297879889425};
+const double q_qam64[8]= {2.25934026232206e-11,-1.45992206328306e-10,-3.70861183071900e-08,-1.22206071019319e-06,6.49115500399637e-06,0.00129828997837433,0.0259669554914859,0.166602901214898};
 
 //for MI to SNR conversion 7 th order Polynomial coeff
-double p_qpsk[8]= {5982.42405670359,-21568.1135917693,31293.9987036905,-23394.6795043871,9608.34750585489,-2158.15802349899,267.731968719036,-20.6145324295965};
-double p_qam16[8]= {7862.12690694170,-28510.3207048338,41542.2150287122,-31088.3036957379,12690.1982361016,-2785.66604739984,326.595462489375,-18.9911849872089};
-double p_qam64[8]= {8832.57933013696,-32119.1802555952,46914.2578990397,-35163.8150557183,14343.7419388853,-3126.61025510092,360.954930562237,-18.0358548533343};
+const double p_qpsk[8]= {5982.42405670359,-21568.1135917693,31293.9987036905,-23394.6795043871,9608.34750585489,-2158.15802349899,267.731968719036,-20.6145324295965};
+const double p_qam16[8]= {7862.12690694170,-28510.3207048338,41542.2150287122,-31088.3036957379,12690.1982361016,-2785.66604739984,326.595462489375,-18.9911849872089};
+const double p_qam64[8]= {8832.57933013696,-32119.1802555952,46914.2578990397,-35163.8150557183,14343.7419388853,-3126.61025510092,360.954930562237,-18.0358548533343};
 
 // ideal CE MIESM
 
-double beta1_dlsch_MI[6][MCS_COUNT] = { {1.1188, 0.3720, 0.3755, 0.9453, 0.5799, 0.5256, 0.5485, 0.5340, 0.5165, 0.5300, 0.6594, 0.5962, 0.4884, 0.4927, 0.3687, 0.4614, 0.4081, 0.2639,0.2935,0.2520,0.3709,0.2906,0.2612,0.2390}, {0.7138, 0.5533, 0.5533, 0.4828, 0.4998, 0.4843, 0.4942, 0.5323, 0.5142, 0.4756, 0.5792, 0.4167, 0.4445, 0.3942, 0.3789, 0.2756, 0.4456, 0.1650, 0.2254, 0.2353, 0.2097,0.2517,0.3242,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1},  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1},{1.808065416202085, 1.754544945430673,1.902272019362616, 1.790054645392961, 1.563204092967629, 1.585258289348813, 1.579349443720310, 1.570650121437345, 1.545055626608596, 1.362229442426877, 1.85, 1.79, 1.65, 1.54, 1.46, 1.39, 1.33, 1,1,1,1,1,1,1},{0.7146, 0.4789, 0.5392, 0.5556, 0.4975, 0.4847, 0.4691, 0.5261, 0.5278, 0.4962, 0.4468, 0.4113, 0.4622, 0.4609, 0.3946, 0.3991, 0.3532, 0.2439, 0.1898, 0.2929, 0.2712, 0.3367, 0.3591, 0.2571}};
-double beta2_dlsch_MI[6][MCS_COUNT] = { {1.1293, 0.3707, 0.3722, 0.9310, 0.5808, 0.5265, 0.5404, 0.5279, 0.5210, 0.5226, 0.6438, 0.5827, 0.4804, 0.4830, 0.3638, 0.4506, 0.4107, 0.2547, 0.2797, 0.2413, 0.3351, 0.2750, 0.2568, 0.2273}, {0.7028, 0.5503, 0.5503, 0.4815, 0.5006, 0.4764, 0.4810, 0.5124, 0.4964, 0.4485, 0.5497, 0.3971, 0.4239, 0.3701, 0.3494, 0.2630, 0.4053, 0.1505, 0.2001,0.2024,0.1788,0.2124,0.2668,1}, {1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1},  {1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1},{1.079518113138858, 1.105622953570353, 1.031337449900606, 1.073342032668810, 1.242636589110353, 1.255054927783647, 1.291463834317768, 1.317048698347491, 1.354485054187984, 0.338534029291017, 1.85, 1.79, 1.65, 1.54, 1.46, 1.39, 1.33,1, 1,1,1,1,1,1},{0.6980, 0.4694, 0.5379, 0.5483, 0.4982, 0.4737, 0.4611, 0.5051, 0.5020, 0.4672, 0.4357, 0.3957, 0.4389, 0.4344, 0.3645, 0.3661, 0.3301, 0.2179, 0.1730, 0.2536, 0.2389,0.2884,0.2936,0.2226}};
+const double beta1_dlsch_MI[6][MCS_COUNT] = { {1.1188, 0.3720, 0.3755, 0.9453, 0.5799, 0.5256, 0.5485, 0.5340, 0.5165, 0.5300, 0.6594, 0.5962, 0.4884, 0.4927, 0.3687, 0.4614, 0.4081, 0.2639,0.2935,0.2520,0.3709,0.2906,0.2612,0.2390}, {0.7138, 0.5533, 0.5533, 0.4828, 0.4998, 0.4843, 0.4942, 0.5323, 0.5142, 0.4756, 0.5792, 0.4167, 0.4445, 0.3942, 0.3789, 0.2756, 0.4456, 0.1650, 0.2254, 0.2353, 0.2097,0.2517,0.3242,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1},  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1},{1.808065416202085, 1.754544945430673,1.902272019362616, 1.790054645392961, 1.563204092967629, 1.585258289348813, 1.579349443720310, 1.570650121437345, 1.545055626608596, 1.362229442426877, 1.85, 1.79, 1.65, 1.54, 1.46, 1.39, 1.33, 1,1,1,1,1,1,1},{0.7146, 0.4789, 0.5392, 0.5556, 0.4975, 0.4847, 0.4691, 0.5261, 0.5278, 0.4962, 0.4468, 0.4113, 0.4622, 0.4609, 0.3946, 0.3991, 0.3532, 0.2439, 0.1898, 0.2929, 0.2712, 0.3367, 0.3591, 0.2571}};
+const double beta2_dlsch_MI[6][MCS_COUNT] = { {1.1293, 0.3707, 0.3722, 0.9310, 0.5808, 0.5265, 0.5404, 0.5279, 0.5210, 0.5226, 0.6438, 0.5827, 0.4804, 0.4830, 0.3638, 0.4506, 0.4107, 0.2547, 0.2797, 0.2413, 0.3351, 0.2750, 0.2568, 0.2273}, {0.7028, 0.5503, 0.5503, 0.4815, 0.5006, 0.4764, 0.4810, 0.5124, 0.4964, 0.4485, 0.5497, 0.3971, 0.4239, 0.3701, 0.3494, 0.2630, 0.4053, 0.1505, 0.2001,0.2024,0.1788,0.2124,0.2668,1}, {1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1},  {1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1},{1.079518113138858, 1.105622953570353, 1.031337449900606, 1.073342032668810, 1.242636589110353, 1.255054927783647, 1.291463834317768, 1.317048698347491, 1.354485054187984, 0.338534029291017, 1.85, 1.79, 1.65, 1.54, 1.46, 1.39, 1.33,1, 1,1,1,1,1,1},{0.6980, 0.4694, 0.5379, 0.5483, 0.4982, 0.4737, 0.4611, 0.5051, 0.5020, 0.4672, 0.4357, 0.3957, 0.4389, 0.4344, 0.3645, 0.3661, 0.3301, 0.2179, 0.1730, 0.2536, 0.2389,0.2884,0.2936,0.2226}};
 
 //real CE MIESM
 /*
@@ -116,8 +116,8 @@ double beta2_dlsch_MI[6][MCS_COUNT] = { {1.36875, 0.59304, 0.53870, 0.98239, 0.8
 //ideal channel estimation values
 //double beta1_dlsch[6][MCS_COUNT] = { {2.3814, 0.4956, 0.5273, 1.1708, 0.8014, 0.7889, 0.8111, 0.8139, 0.8124, 0.8479, 1.9280, 1.9664, 2.3857, 2.5147, 2.4511, 3.0158, 2.8643, 5.3013, 5.8594, 6.5372, 7.8073, 7.8030, 7.5295, 7.1320}, {0.5146, 0.5549, 0.7405, 0.6913, 0.7349, 0.7000, 0.7539, 0.7955, 0.8074, 0.7760, 1.8150, 1.6561, 1.9280, 2.3563, 2.6699, 2.3086, 3.1601, 4.5316, 5.2870, 6.0983, 6.5635, 7.7024, 9.9592, 6.6173}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {1.79358, 1.17908, 2.02600, 1.72040, 1.58618, 1.59039, 1.68111, 1.67062, 1.64911, 1.33274, 4.87800, 3.58797, 3.72338, 5.35700, 2.81752, 1.93472, 2.23259, 1,1,1,1,1,1,1}, {0.4445, 0.5918, 0.7118, 0.7115, 0.7284, 0.7202, 0.7117, 0.8111, 0.8239, 0.7907, 1.8456, 1.8144, 2.3830, 2.6634, 2.6129, 2.8127, 2.7372, 4.9424, 4.8763, 6.8413, 7.1493, 9.4180, 10.1230, 8.9613}};
 //double beta2_dlsch[6][MCS_COUNT] = { {2.3639, 0.4952, 0.5207, 1.1572, 0.8026, 0.7864, 0.7996, 0.8034, 0.8200, 0.8367, 1.8701, 1.9212, 2.2947, 2.4472, 2.4091, 2.9479, 2.8973, 5.0591, 5.5134, 6.1483, 7.2166, 7.5177, 7.5704, 7.2248}, {0.5113, 0.5600, 0.7359, 0.6860, 0.7344, 0.6902, 0.7315, 0.7660, 0.7817, 0.7315, 1.7268, 1.5912, 1.8519, 2.2115, 2.4580, 2.1879, 2.9015, 4.1543, 4.6986, 5.3193, 5.6319, 6.5640, 8.2421, 5.6393}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {0.79479, 0.52872, 0.90005, 0.77170, 0.73220, 0.72060, 0.75433, 0.75451, 0.75989, 0.67655, 1.68525, 1.31100, 1.46573, 1.99843, 1.57293, 1.62852, 2.10636, 1,1,1,1,1,1,1}, {0.4398, 0.5823, 0.7094, 0.7043, 0.7282, 0.7041, 0.6979, 0.7762, 0.7871, 0.7469, 1.7752, 1.7443, 2.2266, 2.4767, 2.4146, 2.6040, 2.5708, 4.4488, 4.4944, 5.9630, 6.3740, 8.1097, 8.4210, 7.8027}};
-double beta1_dlsch[6][MCS_COUNT] = { {1.199175, 1.085656, 0.983872, 0.843789, 0.816093, 0.853078, 0.899236, 0.919665, 0.888673, 0.924181, 0.814176, 0.794108, 0.770653, 0.826266, 0.982043, 0.979621, 0.985176, 0.901741, 0.870311, 0.911303, 0.898923, 1.003359, 0.988535, 1.030639, 1.151038, 1.116939, 1.214118, 1.219148}, {0.5146, 0.5549, 0.7405, 0.6913, 0.7349, 0.7000, 0.7539, 0.7955, 0.8074, 0.7760, 1.8150, 1.6561, 1.9280, 2.3563, 2.6699, 2.3086, 3.1601, 4.5316, 5.2870, 6.0983, 6.5635, 7.7024, 9.9592, 6.6173}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {1.79358, 1.17908, 2.02600, 1.72040, 1.58618, 1.59039, 1.68111, 1.67062, 1.64911, 1.33274, 4.87800, 3.58797, 3.72338, 5.35700, 2.81752, 1.93472, 2.23259, 1,1,1,1,1,1,1}, {0.4445, 0.5918, 0.7118, 0.7115, 0.7284, 0.7202, 0.7117, 0.8111, 0.8239, 0.7907, 1.8456, 1.8144, 2.3830, 2.6634, 2.6129, 2.8127, 2.7372, 4.9424, 4.8763, 6.8413, 7.1493, 9.4180, 10.1230, 8.9613}};
-double beta2_dlsch[6][MCS_COUNT] = { {0.534622, 0.596561, 0.500838, 0.471721, 0.548218, 0.547974, 0.924245, 0.836484, 0.776917, 0.879691, 0.875722, 0.666933, 0.666393, 0.755377, 1.074985, 1.080290, 1.010914, 0.790892, 0.793435, 0.860249, 0.901508, 0.967060, 0.951372, 1.011493, 1.106151, 1.117076, 1.209397, 1.227790}, {0.5113, 0.5600, 0.7359, 0.6860, 0.7344, 0.6902, 0.7315, 0.7660, 0.7817, 0.7315, 1.7268, 1.5912, 1.8519, 2.2115, 2.4580, 2.1879, 2.9015, 4.1543, 4.6986, 5.3193, 5.6319, 6.5640, 8.2421, 5.6393}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {0.79479, 0.52872, 0.90005, 0.77170, 0.73220, 0.72060, 0.75433, 0.75451, 0.75989, 0.67655, 1.68525, 1.31100, 1.46573, 1.99843, 1.57293, 1.62852, 2.10636, 1,1,1,1,1,1,1}, {0.4398, 0.5823, 0.7094, 0.7043, 0.7282, 0.7041, 0.6979, 0.7762, 0.7871, 0.7469, 1.7752, 1.7443, 2.2266, 2.4767, 2.4146, 2.6040, 2.5708, 4.4488, 4.4944, 5.9630, 6.3740, 8.1097, 8.4210, 7.8027}};
+const double beta1_dlsch[6][MCS_COUNT] = { {1.199175, 1.085656, 0.983872, 0.843789, 0.816093, 0.853078, 0.899236, 0.919665, 0.888673, 0.924181, 0.814176, 0.794108, 0.770653, 0.826266, 0.982043, 0.979621, 0.985176, 0.901741, 0.870311, 0.911303, 0.898923, 1.003359, 0.988535, 1.030639, 1.151038, 1.116939, 1.214118, 1.219148}, {0.5146, 0.5549, 0.7405, 0.6913, 0.7349, 0.7000, 0.7539, 0.7955, 0.8074, 0.7760, 1.8150, 1.6561, 1.9280, 2.3563, 2.6699, 2.3086, 3.1601, 4.5316, 5.2870, 6.0983, 6.5635, 7.7024, 9.9592, 6.6173}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {1.79358, 1.17908, 2.02600, 1.72040, 1.58618, 1.59039, 1.68111, 1.67062, 1.64911, 1.33274, 4.87800, 3.58797, 3.72338, 5.35700, 2.81752, 1.93472, 2.23259, 1,1,1,1,1,1,1}, {0.4445, 0.5918, 0.7118, 0.7115, 0.7284, 0.7202, 0.7117, 0.8111, 0.8239, 0.7907, 1.8456, 1.8144, 2.3830, 2.6634, 2.6129, 2.8127, 2.7372, 4.9424, 4.8763, 6.8413, 7.1493, 9.4180, 10.1230, 8.9613}};
+const double beta2_dlsch[6][MCS_COUNT] = { {0.534622, 0.596561, 0.500838, 0.471721, 0.548218, 0.547974, 0.924245, 0.836484, 0.776917, 0.879691, 0.875722, 0.666933, 0.666393, 0.755377, 1.074985, 1.080290, 1.010914, 0.790892, 0.793435, 0.860249, 0.901508, 0.967060, 0.951372, 1.011493, 1.106151, 1.117076, 1.209397, 1.227790}, {0.5113, 0.5600, 0.7359, 0.6860, 0.7344, 0.6902, 0.7315, 0.7660, 0.7817, 0.7315, 1.7268, 1.5912, 1.8519, 2.2115, 2.4580, 2.1879, 2.9015, 4.1543, 4.6986, 5.3193, 5.6319, 6.5640, 8.2421, 5.6393}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {0.79479, 0.52872, 0.90005, 0.77170, 0.73220, 0.72060, 0.75433, 0.75451, 0.75989, 0.67655, 1.68525, 1.31100, 1.46573, 1.99843, 1.57293, 1.62852, 2.10636, 1,1,1,1,1,1,1}, {0.4398, 0.5823, 0.7094, 0.7043, 0.7282, 0.7041, 0.6979, 0.7762, 0.7871, 0.7469, 1.7752, 1.7443, 2.2266, 2.4767, 2.4146, 2.6040, 2.5708, 4.4488, 4.4944, 5.9630, 6.3740, 8.1097, 8.4210, 7.8027}};
 
 //real channel estimation valus
 /*
@@ -126,13 +126,9 @@ double beta2_dlsch[6][MCS_COUNT] = { {2.52163, 0.83231, 0.77472, 1.36536, 1.1682
 
 */
 
-#ifdef OCP_FRAMEWORK
-#include <enums.h>
-#else
-char NB_functions[7][20]={"eNodeB_3GPP","eNodeB_3GPP_BBU","NGFI_RAU_IF4p5","NGFI_RRU_IF5","NGFI_RRU_IF4p5","gNodeB_3GPP",};
-char NB_timing[2][20]={"synch_to_ext_device","synch_to_other"};
-char ru_if_types[MAX_RU_IF_TYPES][20]={"local RF","IF5 RRU","IF5 Mobipass","IF4p5 RRU","IF1pp RRU"};
-#endif
+const char NB_functions[7][20]={"eNodeB_3GPP","eNodeB_3GPP_BBU","NGFI_RAU_IF4p5","NGFI_RRU_IF5","NGFI_RRU_IF4p5","gNodeB_3GPP",};
+const char NB_timing[2][20]={"synch_to_ext_device","synch_to_other"};
+const char ru_if_types[MAX_RU_IF_TYPES][20]={"local RF","IF5 RRU","IF5 Mobipass","IF4p5 RRU","IF1pp RRU"};
 
 /// lookup table for unscrambling in RX
 int16_t unscrambling_lut[65536*16] __attribute__((aligned(32)));
diff --git a/openair1/PHY/phy_vars_ue.h b/openair1/PHY/phy_vars_ue.h
index 05f2e1b8f1960718fe9687e39699db305ca1ca48..e90c2641aa7f852ff4e5cf5a855db0d6ecf0a2d5 100644
--- a/openair1/PHY/phy_vars_ue.h
+++ b/openair1/PHY/phy_vars_ue.h
@@ -19,8 +19,8 @@
  *      contact@openairinterface.org
  */
 
-#ifndef __PHY_VARS_H__
-#define __PHY_VARS_H__
+#ifndef __PHY_VARS_UE__H__
+#define __PHY_VARS_UE__H__
 
 #include "PHY/types.h"
 #include "PHY/defs_UE.h"
@@ -43,8 +43,8 @@ unsigned short rev[2048],rev_times4[8192],rev_half[1024];
 unsigned short rev256[256],rev512[512],rev1024[1024],rev4096[4096],rev2048[2048],rev8192[8192];
 
 
-short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
-short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
+const short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
+const short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
 
 
 #include "SIMULATION/ETH_TRANSPORT/vars.h"
@@ -77,29 +77,29 @@ double MI_map_16qam[3][197];
 double MI_map_64qam[3][227];
 
 // here the first index is for transmission mode 1, 2, 5 and 6 whereas the second index is for the 16 sinr vaues corresponding to 16 CQIs
-double sinr_to_cqi[4][16]= { {-2.5051, -2.5051, -1.7451, -0.3655, 1.0812, 2.4012, 3.6849, 6.6754, 8.3885, 8.7970, 12.0437, 14.4709, 15.7281,  17.2424,  17.2424, 17.2424},
+const double sinr_to_cqi[4][16]= { {-2.5051, -2.5051, -1.7451, -0.3655, 1.0812, 2.4012, 3.6849, 6.6754, 8.3885, 8.7970, 12.0437, 14.4709, 15.7281,  17.2424,  17.2424, 17.2424},
   {-2.2360, -2.2360, -1.3919, -0.0218, 1.5319,  2.9574,  4.3234, 6.3387, 8.9879, 9.5096, 12.6609, 14.0116, 16.4984, 18.1572, 18.1572, 18.1572},
   {-1, -1.0000, -0.4198, -0.0140, 1.0362,  2.3520, 3.5793, 6.1136, 8.4836, 9.0858, 12.4723, 13.9128, 16.2054, 17.7392, 17.7392, 17.7392},
   { -4.1057, -4.1057, -3.3768, -2.2916, -1.1392, 0.1236, 1.2849, 3.1933, 5.9298, 6.4052, 9.6245, 10.9414, 13.5166, 14.9545, 14.9545, 14.9545}
 };
 
 //int cqi_to_mcs[16]={0, 0, 1, 3, 5, 7, 9, 13, 15, 16, 20, 23, 25, 27, 27, 27};
-int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 28};
+const int cqi_to_mcs[16]= {0, 0, 1, 2, 4, 6, 8, 11, 13, 16, 18, 20, 23, 25, 27, 28};
 
 //for SNR to MI conversion 7 th order Polynomial coeff
-double q_qam16[8]= {3.21151853033897e-10,5.55435952230651e-09,-2.30760065362117e-07,-6.25587743817859e-06,4.62251036452795e-06,0.00224150813158937,0.0393723140344367,0.245486379182639};
-double q_qpsk[8]= {1.94491167814437e-09,8.40494123817774e-08,4.75527131198034e-07,-2.48946285301621e-05,-0.000347614016158364,0.00209252225437100,0.0742986115462510,0.488297879889425};
-double q_qam64[8]= {2.25934026232206e-11,-1.45992206328306e-10,-3.70861183071900e-08,-1.22206071019319e-06,6.49115500399637e-06,0.00129828997837433,0.0259669554914859,0.166602901214898};
+const double q_qam16[8]= {3.21151853033897e-10,5.55435952230651e-09,-2.30760065362117e-07,-6.25587743817859e-06,4.62251036452795e-06,0.00224150813158937,0.0393723140344367,0.245486379182639};
+const double q_qpsk[8]= {1.94491167814437e-09,8.40494123817774e-08,4.75527131198034e-07,-2.48946285301621e-05,-0.000347614016158364,0.00209252225437100,0.0742986115462510,0.488297879889425};
+const double q_qam64[8]= {2.25934026232206e-11,-1.45992206328306e-10,-3.70861183071900e-08,-1.22206071019319e-06,6.49115500399637e-06,0.00129828997837433,0.0259669554914859,0.166602901214898};
 
 //for MI to SNR conversion 7 th order Polynomial coeff
-double p_qpsk[8]= {5982.42405670359,-21568.1135917693,31293.9987036905,-23394.6795043871,9608.34750585489,-2158.15802349899,267.731968719036,-20.6145324295965};
-double p_qam16[8]= {7862.12690694170,-28510.3207048338,41542.2150287122,-31088.3036957379,12690.1982361016,-2785.66604739984,326.595462489375,-18.9911849872089};
-double p_qam64[8]= {8832.57933013696,-32119.1802555952,46914.2578990397,-35163.8150557183,14343.7419388853,-3126.61025510092,360.954930562237,-18.0358548533343};
+const double p_qpsk[8]= {5982.42405670359,-21568.1135917693,31293.9987036905,-23394.6795043871,9608.34750585489,-2158.15802349899,267.731968719036,-20.6145324295965};
+const double p_qam16[8]= {7862.12690694170,-28510.3207048338,41542.2150287122,-31088.3036957379,12690.1982361016,-2785.66604739984,326.595462489375,-18.9911849872089};
+const double p_qam64[8]= {8832.57933013696,-32119.1802555952,46914.2578990397,-35163.8150557183,14343.7419388853,-3126.61025510092,360.954930562237,-18.0358548533343};
 
 // ideal CE MIESM
 
-double beta1_dlsch_MI[6][MCS_COUNT] = { {1.1188, 0.3720, 0.3755, 0.9453, 0.5799, 0.5256, 0.5485, 0.5340, 0.5165, 0.5300, 0.6594, 0.5962, 0.4884, 0.4927, 0.3687, 0.4614, 0.4081, 0.2639,0.2935,0.2520,0.3709,0.2906,0.2612,0.2390}, {0.7138, 0.5533, 0.5533, 0.4828, 0.4998, 0.4843, 0.4942, 0.5323, 0.5142, 0.4756, 0.5792, 0.4167, 0.4445, 0.3942, 0.3789, 0.2756, 0.4456, 0.1650, 0.2254, 0.2353, 0.2097,0.2517,0.3242,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1},  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1},{1.808065416202085, 1.754544945430673,1.902272019362616, 1.790054645392961, 1.563204092967629, 1.585258289348813, 1.579349443720310, 1.570650121437345, 1.545055626608596, 1.362229442426877, 1.85, 1.79, 1.65, 1.54, 1.46, 1.39, 1.33, 1,1,1,1,1,1,1},{0.7146, 0.4789, 0.5392, 0.5556, 0.4975, 0.4847, 0.4691, 0.5261, 0.5278, 0.4962, 0.4468, 0.4113, 0.4622, 0.4609, 0.3946, 0.3991, 0.3532, 0.2439, 0.1898, 0.2929, 0.2712, 0.3367, 0.3591, 0.2571}};
-double beta2_dlsch_MI[6][MCS_COUNT] = { {1.1293, 0.3707, 0.3722, 0.9310, 0.5808, 0.5265, 0.5404, 0.5279, 0.5210, 0.5226, 0.6438, 0.5827, 0.4804, 0.4830, 0.3638, 0.4506, 0.4107, 0.2547, 0.2797, 0.2413, 0.3351, 0.2750, 0.2568, 0.2273}, {0.7028, 0.5503, 0.5503, 0.4815, 0.5006, 0.4764, 0.4810, 0.5124, 0.4964, 0.4485, 0.5497, 0.3971, 0.4239, 0.3701, 0.3494, 0.2630, 0.4053, 0.1505, 0.2001,0.2024,0.1788,0.2124,0.2668,1}, {1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1},  {1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1},{1.079518113138858, 1.105622953570353, 1.031337449900606, 1.073342032668810, 1.242636589110353, 1.255054927783647, 1.291463834317768, 1.317048698347491, 1.354485054187984, 0.338534029291017, 1.85, 1.79, 1.65, 1.54, 1.46, 1.39, 1.33,1, 1,1,1,1,1,1},{0.6980, 0.4694, 0.5379, 0.5483, 0.4982, 0.4737, 0.4611, 0.5051, 0.5020, 0.4672, 0.4357, 0.3957, 0.4389, 0.4344, 0.3645, 0.3661, 0.3301, 0.2179, 0.1730, 0.2536, 0.2389,0.2884,0.2936,0.2226}};
+const double beta1_dlsch_MI[6][MCS_COUNT] = { {1.1188, 0.3720, 0.3755, 0.9453, 0.5799, 0.5256, 0.5485, 0.5340, 0.5165, 0.5300, 0.6594, 0.5962, 0.4884, 0.4927, 0.3687, 0.4614, 0.4081, 0.2639,0.2935,0.2520,0.3709,0.2906,0.2612,0.2390}, {0.7138, 0.5533, 0.5533, 0.4828, 0.4998, 0.4843, 0.4942, 0.5323, 0.5142, 0.4756, 0.5792, 0.4167, 0.4445, 0.3942, 0.3789, 0.2756, 0.4456, 0.1650, 0.2254, 0.2353, 0.2097,0.2517,0.3242,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1},  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1},{1.808065416202085, 1.754544945430673,1.902272019362616, 1.790054645392961, 1.563204092967629, 1.585258289348813, 1.579349443720310, 1.570650121437345, 1.545055626608596, 1.362229442426877, 1.85, 1.79, 1.65, 1.54, 1.46, 1.39, 1.33, 1,1,1,1,1,1,1},{0.7146, 0.4789, 0.5392, 0.5556, 0.4975, 0.4847, 0.4691, 0.5261, 0.5278, 0.4962, 0.4468, 0.4113, 0.4622, 0.4609, 0.3946, 0.3991, 0.3532, 0.2439, 0.1898, 0.2929, 0.2712, 0.3367, 0.3591, 0.2571}};
+const double beta2_dlsch_MI[6][MCS_COUNT] = { {1.1293, 0.3707, 0.3722, 0.9310, 0.5808, 0.5265, 0.5404, 0.5279, 0.5210, 0.5226, 0.6438, 0.5827, 0.4804, 0.4830, 0.3638, 0.4506, 0.4107, 0.2547, 0.2797, 0.2413, 0.3351, 0.2750, 0.2568, 0.2273}, {0.7028, 0.5503, 0.5503, 0.4815, 0.5006, 0.4764, 0.4810, 0.5124, 0.4964, 0.4485, 0.5497, 0.3971, 0.4239, 0.3701, 0.3494, 0.2630, 0.4053, 0.1505, 0.2001,0.2024,0.1788,0.2124,0.2668,1}, {1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1},  {1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1},{1.079518113138858, 1.105622953570353, 1.031337449900606, 1.073342032668810, 1.242636589110353, 1.255054927783647, 1.291463834317768, 1.317048698347491, 1.354485054187984, 0.338534029291017, 1.85, 1.79, 1.65, 1.54, 1.46, 1.39, 1.33,1, 1,1,1,1,1,1},{0.6980, 0.4694, 0.5379, 0.5483, 0.4982, 0.4737, 0.4611, 0.5051, 0.5020, 0.4672, 0.4357, 0.3957, 0.4389, 0.4344, 0.3645, 0.3661, 0.3301, 0.2179, 0.1730, 0.2536, 0.2389,0.2884,0.2936,0.2226}};
 
 //real CE MIESM
 /*
@@ -109,8 +109,8 @@ double beta2_dlsch_MI[6][MCS_COUNT] = { {1.36875, 0.59304, 0.53870, 0.98239, 0.8
 //ideal channel estimation values
 //double beta1_dlsch[6][MCS_COUNT] = { {2.3814, 0.4956, 0.5273, 1.1708, 0.8014, 0.7889, 0.8111, 0.8139, 0.8124, 0.8479, 1.9280, 1.9664, 2.3857, 2.5147, 2.4511, 3.0158, 2.8643, 5.3013, 5.8594, 6.5372, 7.8073, 7.8030, 7.5295, 7.1320}, {0.5146, 0.5549, 0.7405, 0.6913, 0.7349, 0.7000, 0.7539, 0.7955, 0.8074, 0.7760, 1.8150, 1.6561, 1.9280, 2.3563, 2.6699, 2.3086, 3.1601, 4.5316, 5.2870, 6.0983, 6.5635, 7.7024, 9.9592, 6.6173}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {1.79358, 1.17908, 2.02600, 1.72040, 1.58618, 1.59039, 1.68111, 1.67062, 1.64911, 1.33274, 4.87800, 3.58797, 3.72338, 5.35700, 2.81752, 1.93472, 2.23259, 1,1,1,1,1,1,1}, {0.4445, 0.5918, 0.7118, 0.7115, 0.7284, 0.7202, 0.7117, 0.8111, 0.8239, 0.7907, 1.8456, 1.8144, 2.3830, 2.6634, 2.6129, 2.8127, 2.7372, 4.9424, 4.8763, 6.8413, 7.1493, 9.4180, 10.1230, 8.9613}};
 //double beta2_dlsch[6][MCS_COUNT] = { {2.3639, 0.4952, 0.5207, 1.1572, 0.8026, 0.7864, 0.7996, 0.8034, 0.8200, 0.8367, 1.8701, 1.9212, 2.2947, 2.4472, 2.4091, 2.9479, 2.8973, 5.0591, 5.5134, 6.1483, 7.2166, 7.5177, 7.5704, 7.2248}, {0.5113, 0.5600, 0.7359, 0.6860, 0.7344, 0.6902, 0.7315, 0.7660, 0.7817, 0.7315, 1.7268, 1.5912, 1.8519, 2.2115, 2.4580, 2.1879, 2.9015, 4.1543, 4.6986, 5.3193, 5.6319, 6.5640, 8.2421, 5.6393}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {0.79479, 0.52872, 0.90005, 0.77170, 0.73220, 0.72060, 0.75433, 0.75451, 0.75989, 0.67655, 1.68525, 1.31100, 1.46573, 1.99843, 1.57293, 1.62852, 2.10636, 1,1,1,1,1,1,1}, {0.4398, 0.5823, 0.7094, 0.7043, 0.7282, 0.7041, 0.6979, 0.7762, 0.7871, 0.7469, 1.7752, 1.7443, 2.2266, 2.4767, 2.4146, 2.6040, 2.5708, 4.4488, 4.4944, 5.9630, 6.3740, 8.1097, 8.4210, 7.8027}};
-double beta1_dlsch[6][MCS_COUNT] = { {1.199175, 1.085656, 0.983872, 0.843789, 0.816093, 0.853078, 0.899236, 0.919665, 0.888673, 0.924181, 0.814176, 0.794108, 0.770653, 0.826266, 0.982043, 0.979621, 0.985176, 0.901741, 0.870311, 0.911303, 0.898923, 1.003359, 0.988535, 1.030639, 1.151038, 1.116939, 1.214118, 1.219148}, {0.5146, 0.5549, 0.7405, 0.6913, 0.7349, 0.7000, 0.7539, 0.7955, 0.8074, 0.7760, 1.8150, 1.6561, 1.9280, 2.3563, 2.6699, 2.3086, 3.1601, 4.5316, 5.2870, 6.0983, 6.5635, 7.7024, 9.9592, 6.6173}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {1.79358, 1.17908, 2.02600, 1.72040, 1.58618, 1.59039, 1.68111, 1.67062, 1.64911, 1.33274, 4.87800, 3.58797, 3.72338, 5.35700, 2.81752, 1.93472, 2.23259, 1,1,1,1,1,1,1}, {0.4445, 0.5918, 0.7118, 0.7115, 0.7284, 0.7202, 0.7117, 0.8111, 0.8239, 0.7907, 1.8456, 1.8144, 2.3830, 2.6634, 2.6129, 2.8127, 2.7372, 4.9424, 4.8763, 6.8413, 7.1493, 9.4180, 10.1230, 8.9613}};
-double beta2_dlsch[6][MCS_COUNT] = { {0.534622, 0.596561, 0.500838, 0.471721, 0.548218, 0.547974, 0.924245, 0.836484, 0.776917, 0.879691, 0.875722, 0.666933, 0.666393, 0.755377, 1.074985, 1.080290, 1.010914, 0.790892, 0.793435, 0.860249, 0.901508, 0.967060, 0.951372, 1.011493, 1.106151, 1.117076, 1.209397, 1.227790}, {0.5113, 0.5600, 0.7359, 0.6860, 0.7344, 0.6902, 0.7315, 0.7660, 0.7817, 0.7315, 1.7268, 1.5912, 1.8519, 2.2115, 2.4580, 2.1879, 2.9015, 4.1543, 4.6986, 5.3193, 5.6319, 6.5640, 8.2421, 5.6393}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {0.79479, 0.52872, 0.90005, 0.77170, 0.73220, 0.72060, 0.75433, 0.75451, 0.75989, 0.67655, 1.68525, 1.31100, 1.46573, 1.99843, 1.57293, 1.62852, 2.10636, 1,1,1,1,1,1,1}, {0.4398, 0.5823, 0.7094, 0.7043, 0.7282, 0.7041, 0.6979, 0.7762, 0.7871, 0.7469, 1.7752, 1.7443, 2.2266, 2.4767, 2.4146, 2.6040, 2.5708, 4.4488, 4.4944, 5.9630, 6.3740, 8.1097, 8.4210, 7.8027}};
+const double beta1_dlsch[6][MCS_COUNT] = { {1.199175, 1.085656, 0.983872, 0.843789, 0.816093, 0.853078, 0.899236, 0.919665, 0.888673, 0.924181, 0.814176, 0.794108, 0.770653, 0.826266, 0.982043, 0.979621, 0.985176, 0.901741, 0.870311, 0.911303, 0.898923, 1.003359, 0.988535, 1.030639, 1.151038, 1.116939, 1.214118, 1.219148}, {0.5146, 0.5549, 0.7405, 0.6913, 0.7349, 0.7000, 0.7539, 0.7955, 0.8074, 0.7760, 1.8150, 1.6561, 1.9280, 2.3563, 2.6699, 2.3086, 3.1601, 4.5316, 5.2870, 6.0983, 6.5635, 7.7024, 9.9592, 6.6173}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {1.79358, 1.17908, 2.02600, 1.72040, 1.58618, 1.59039, 1.68111, 1.67062, 1.64911, 1.33274, 4.87800, 3.58797, 3.72338, 5.35700, 2.81752, 1.93472, 2.23259, 1,1,1,1,1,1,1}, {0.4445, 0.5918, 0.7118, 0.7115, 0.7284, 0.7202, 0.7117, 0.8111, 0.8239, 0.7907, 1.8456, 1.8144, 2.3830, 2.6634, 2.6129, 2.8127, 2.7372, 4.9424, 4.8763, 6.8413, 7.1493, 9.4180, 10.1230, 8.9613}};
+const double beta2_dlsch[6][MCS_COUNT] = { {0.534622, 0.596561, 0.500838, 0.471721, 0.548218, 0.547974, 0.924245, 0.836484, 0.776917, 0.879691, 0.875722, 0.666933, 0.666393, 0.755377, 1.074985, 1.080290, 1.010914, 0.790892, 0.793435, 0.860249, 0.901508, 0.967060, 0.951372, 1.011493, 1.106151, 1.117076, 1.209397, 1.227790}, {0.5113, 0.5600, 0.7359, 0.6860, 0.7344, 0.6902, 0.7315, 0.7660, 0.7817, 0.7315, 1.7268, 1.5912, 1.8519, 2.2115, 2.4580, 2.1879, 2.9015, 4.1543, 4.6986, 5.3193, 5.6319, 6.5640, 8.2421, 5.6393}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {0.79479, 0.52872, 0.90005, 0.77170, 0.73220, 0.72060, 0.75433, 0.75451, 0.75989, 0.67655, 1.68525, 1.31100, 1.46573, 1.99843, 1.57293, 1.62852, 2.10636, 1,1,1,1,1,1,1}, {0.4398, 0.5823, 0.7094, 0.7043, 0.7282, 0.7041, 0.6979, 0.7762, 0.7871, 0.7469, 1.7752, 1.7443, 2.2266, 2.4767, 2.4146, 2.6040, 2.5708, 4.4488, 4.4944, 5.9630, 6.3740, 8.1097, 8.4210, 7.8027}};
 
 //real channel estimation valus
 /*
@@ -119,13 +119,9 @@ double beta2_dlsch[6][MCS_COUNT] = { {2.52163, 0.83231, 0.77472, 1.36536, 1.1682
 
 */
 
-#ifdef OCP_FRAMEWORK
-#include <enums.h>
-#else
-char NB_functions[7][20]={"eNodeB_3GPP","eNodeB_3GPP_BBU","NGFI_RAU_IF4p5","NGFI_RRU_IF5","NGFI_RRU_IF4p5","gNodeB_3GPP",};
-char NB_timing[2][20]={"synch_to_ext_device","synch_to_other"};
-char ru_if_types[MAX_RU_IF_TYPES][20]={"local RF","IF5 RRU","IF5 Mobipass","IF4p5 RRU","IF1pp RRU"};
-#endif
+const char NB_functions[7][20]={"eNodeB_3GPP","eNodeB_3GPP_BBU","NGFI_RAU_IF4p5","NGFI_RRU_IF5","NGFI_RRU_IF4p5","gNodeB_3GPP",};
+const char NB_timing[2][20]={"synch_to_ext_device","synch_to_other"};
+const char ru_if_types[MAX_RU_IF_TYPES][20]={"local RF","IF5 RRU","IF5 Mobipass","IF4p5 RRU","IF1pp RRU"};
 
 /// lookup table for unscrambling in RX
 int16_t unscrambling_lut[65536*16] __attribute__((aligned(32)));
@@ -133,4 +129,4 @@ int16_t unscrambling_lut[65536*16] __attribute__((aligned(32)));
 uint8_t scrambling_lut[65536*16] __attribute__((aligned(32)));
 
 uint8_t max_turbo_iterations=4;
-#endif /*__PHY_VARS_H__ */
+#endif /* __PHY_VARS_UE__H__ */
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index ba03e79e624178cb781e930d6126fab06a317e99..fc9407f8d0e71af175292dadb91c6e2e78b97651 100644
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -1419,7 +1419,7 @@ void fill_rx_indication(PHY_VARS_eNB *eNB,
   pdu->rx_indication_rel8.offset         = 1;   // DJP - I dont understand - but broken unless 1 ????  0;  // filled in at the end of the UL_INFO formation
   pdu->data                              = eNB->ulsch[UE_id]->harq_processes[harq_pid]->decodedBytes;
   // estimate timing advance for MAC
-  sync_pos                               = lte_est_timing_advance_pusch(eNB,UE_id);
+  sync_pos                               = lte_est_timing_advance_pusch(&eNB->frame_parms, eNB->pusch_vars[UE_id]->drs_ch_estimates_time);
   timing_advance_update                  = sync_pos; // - eNB->frame_parms.nb_prefix_samples/4; //to check
 
   //  if (timing_advance_update > 10) { dump_ulsch(eNB,frame,subframe,UE_id); exit(-1);}
diff --git a/openair1/SCHED/ru_procedures.c b/openair1/SCHED/ru_procedures.c
index 8846b77af9f9b756bbc308012bf8494792012ac6..cb0382138812f010d54efd9ff5e7d41c686344e9 100644
--- a/openair1/SCHED/ru_procedures.c
+++ b/openair1/SCHED/ru_procedures.c
@@ -693,12 +693,6 @@ void ru_fep_full_2thread(RU_t *ru,
                              3/(fp->symbols_per_tti/2),// Ns = slot number
                              fp);
         
-	/*lte_ul_channel_estimation((PHY_VARS_eNB *)NULL,
-                                proc,
-                                ru->idx,
-                                3%(fp->symbols_per_tti/2),
-                                3/(fp->symbols_per_tti/2));
-        */
 	lte_ul_channel_estimation_RRU(fp,
                                   calibration->drs_ch_estimates,
                                   calibration->drs_ch_estimates_time,
@@ -713,7 +707,7 @@ void ru_fep_full_2thread(RU_t *ru,
                                   0,//interpolate,
                                   0 /*eNB->ulsch[ru->idx]->rnti rnti or ru->ulsch[eNB_id]->rnti*/);
 
-	check_sync_pos = lte_est_timing_advance_pusch((PHY_VARS_eNB *)NULL, ru->idx);
+	check_sync_pos = lte_est_timing_advance_pusch(ru->frame_parms, ru->calibration.drs_ch_estimates_time); 
         if (ru->state == RU_CHECK_SYNC) {
           if ((check_sync_pos >= 0 && check_sync_pos<8) || (check_sync_pos < 0 && check_sync_pos>-8)) {
     		  LOG_I(PHY,"~~~~~~~~~~~    check_sync_pos %d, frame %d, cnt %d\n",check_sync_pos,proc->frame_rx,ru->wait_check); 
diff --git a/openair1/SCHED_NR/nr_prach_procedures.c b/openair1/SCHED_NR/nr_prach_procedures.c
index 1ed8f28b49e21661d5d08c3d132b3b209329b3e7..9054ddbae5bb62f54150a2105c3a0f63be792500 100644
--- a/openair1/SCHED_NR/nr_prach_procedures.c
+++ b/openair1/SCHED_NR/nr_prach_procedures.c
@@ -55,7 +55,7 @@ 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,
 			    nfapi_nr_prach_pdu_t *prach_pdu) {
 
-  uint16_t max_preamble[4],max_preamble_energy[4],max_preamble_delay[4];
+  uint16_t max_preamble[4]={0},max_preamble_energy[4]={0},max_preamble_delay[4]={0};
   uint16_t i;
 
 
diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
index 69876159d6317e48ca27882f77d4b7ccc9bcf767..7439c26eb74c8a3144e511a746a007d60d1cb2a1 100644
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
@@ -116,16 +116,12 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response)
       for(i=0; i<ul_config->number_pdus; ++i){
 	if(ul_config->ul_config_list[i].pdu_type == FAPI_NR_UL_CONFIG_TYPE_PUSCH){
 	  // pusch config pdu
-	  fapi_nr_ul_config_pusch_pdu_rel15_t *pusch_config_pdu = &ul_config->ul_config_list[i].ulsch_config_pdu.ulsch_pdu_rel15;
-	  uint8_t current_harq_pid = pusch_config_pdu->harq_process_nbr;
-	  ulsch0->harq_processes[current_harq_pid]->nb_rb = pusch_config_pdu->number_rbs;
-	  ulsch0->harq_processes[current_harq_pid]->first_rb = pusch_config_pdu->start_rb;
-	  ulsch0->harq_processes[current_harq_pid]->number_of_symbols = pusch_config_pdu->number_symbols;
-	  ulsch0->harq_processes[current_harq_pid]->start_symbol = pusch_config_pdu->start_symbol;
-	  ulsch0->harq_processes[current_harq_pid]->mcs = pusch_config_pdu->mcs;
-	  ulsch0->harq_processes[current_harq_pid]->DCINdi = pusch_config_pdu->ndi;
-	  ulsch0->harq_processes[current_harq_pid]->rvidx = pusch_config_pdu->rv;
-	  ulsch0->harq_processes[current_harq_pid]->Nl = pusch_config_pdu->n_layers;
+	  nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu = &ul_config->ul_config_list[i].pusch_config_pdu;
+	  uint8_t current_harq_pid = pusch_config_pdu->pusch_data.harq_process_id;
+	  nfapi_nr_ue_pusch_pdu_t *pusch_pdu = &ulsch0->harq_processes[current_harq_pid]->pusch_pdu;
+
+	  memcpy(pusch_pdu, pusch_config_pdu, sizeof(nfapi_nr_ue_pusch_pdu_t));
+
 	  ulsch0->f_pusch = pusch_config_pdu->absolute_delta_PUSCH;
 	}
 	if(ul_config->ul_config_list[i].pdu_type == FAPI_NR_UL_CONFIG_TYPE_PUCCH){
diff --git a/openair1/SCHED_NR_UE/harq_nr.c b/openair1/SCHED_NR_UE/harq_nr.c
index 31dcfcacbe913f90a9326a9f533b5dd4b214d3fa..3c3017d658735efce65477680d2cb5f930173975 100644
--- a/openair1/SCHED_NR_UE/harq_nr.c
+++ b/openair1/SCHED_NR_UE/harq_nr.c
@@ -296,7 +296,7 @@ harq_result_t uplink_harq_process(NR_UE_ULSCH_t *ulsch, int harq_pid, int ndi, u
   /* 38.321 5.4.2.1  2>  if the uplink grant was received on PDCCH for the C-RNTI and the HARQ buffer of the identified process is empty */
   if ((ulsch->harq_processes[harq_pid]->first_tx == 1) && (rnti_type == _C_RNTI_)) {  /* no transmission yet on this process so consider its harq buffer as empty */
     ulsch->harq_processes[harq_pid]->first_tx = 0;
-    ulsch->harq_processes[harq_pid]->DCINdi = ndi;             /* store first value of ndi */
+    ulsch->harq_processes[harq_pid]->pusch_pdu.pusch_data.new_data_indicator = ndi;             /* store first value of ndi */
     ulsch->harq_processes[harq_pid]->round = 0;
     ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
 
@@ -306,8 +306,8 @@ harq_result_t uplink_harq_process(NR_UE_ULSCH_t *ulsch, int harq_pid, int ndi, u
   }
   /* 38.321 5.4.2.1  2> if the received grant was not addressed to a Temporary C-RNTI on PDCCH, and the NDI provided in the associated HARQ */
   /* information has been toggled compared to the value in the previous transmission of this TB of this HARQ process */
-  else if ((ulsch->harq_processes[harq_pid]->DCINdi != ndi) && (rnti_type != _TC_RNTI_)) {   /* is ndi toogled so this is a new grant ? */
-    ulsch->harq_processes[harq_pid]->DCINdi = ndi;             /* store first value of ndi */
+  else if ((ulsch->harq_processes[harq_pid]->pusch_pdu.pusch_data.new_data_indicator != ndi) && (rnti_type != _TC_RNTI_)) {   /* is ndi toogled so this is a new grant ? */
+    ulsch->harq_processes[harq_pid]->pusch_pdu.pusch_data.new_data_indicator = ndi;             /* store first value of ndi */
     ulsch->harq_processes[harq_pid]->round = 0;
     ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
 
@@ -317,7 +317,7 @@ harq_result_t uplink_harq_process(NR_UE_ULSCH_t *ulsch, int harq_pid, int ndi, u
    }
    /* 38.321 5.4.2.1 2> else (i.e. retransmission): */
    else {
-     ulsch->harq_processes[harq_pid]->DCINdi = ndi;             /* ndi has not toggled si this is a retransmission */
+     ulsch->harq_processes[harq_pid]->pusch_pdu.pusch_data.new_data_indicator = ndi;             /* ndi has not toggled si this is a retransmission */
      ulsch->harq_processes[harq_pid]->round++;                  /* increment number of retransmission */
 
      result_harq = RETRANSMISSION_HARQ;
diff --git a/openair1/SCHED_NR_UE/phy_frame_config_nr.h b/openair1/SCHED_NR_UE/phy_frame_config_nr.h
index a939584584b7c16a0041429f0894dfb04841eb2e..81b6d373dfbb5d4d12c460330a1ea1429c9e49ce 100644
--- a/openair1/SCHED_NR_UE/phy_frame_config_nr.h
+++ b/openair1/SCHED_NR_UE/phy_frame_config_nr.h
@@ -29,8 +29,8 @@
 *
 ************************************************************************/
 
-#ifndef PHY_FRAME_CONFIG_NR_H
-#define PHY_FRAME_CONFIG_NR_H
+#ifndef PHY_FRAME_CONFIG_NR_UE_H
+#define PHY_FRAME_CONFIG_NR_UE_H
 
 /************** DEFINE ********************************************/
 
@@ -78,5 +78,6 @@ void free_tdd_configuration_nr(NR_DL_FRAME_PARMS *frame_parms);
 
 void free_tdd_configuration_dedicated_nr(NR_DL_FRAME_PARMS *frame_parms);
 
+void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mod);
 #endif  /* PHY_FRAME_CONFIG_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 1f46408e48cdf83fa97aedc748e71a433a8151a4..e5e48ee0edc198cdf087c8dd7246c5e0939064b5 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -86,17 +86,6 @@ char nr_mode_string[4][20] = {"NOT SYNCHED","PRACH","RAR","PUSCH"};
 
 extern double cpuf;
 
-
-
-int32_t nr_rx_pdcch(PHY_VARS_NR_UE *ue,
-                    uint32_t frame,
-                    uint32_t slot);
-
-uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
-				  int frame,
-				  int nr_tti_rx,
-				  fapi_nr_dci_indication_t *dci_ind);
-
 /*
 int nr_generate_ue_ul_dlsch_params_from_dci(PHY_VARS_NR_UE *ue,
 					    uint8_t eNB_id,
diff --git a/openair1/SIMULATION/ETH_TRANSPORT/socket.h b/openair1/SIMULATION/ETH_TRANSPORT/socket.h
index c7a2224375e8f9d797c0ad9c6bf515dc1f90f9e1..e9ca36bee2a13d7d4b1b1d9bcacad9f62c920d24 100644
--- a/openair1/SIMULATION/ETH_TRANSPORT/socket.h
+++ b/openair1/SIMULATION/ETH_TRANSPORT/socket.h
@@ -28,8 +28,9 @@
 * \email: lionel.gauthier@eurecom.fr
 */
 
-#ifndef __SOCKET_H__
-#    define __SOCKET_H__
+#ifndef __SIMULATION_ETH_TRANSPORT_SOCKET__H__
+#define __SIMULATION_ETH_TRANSPORT_SOCKET__H__
+
 #    ifdef SOCKET_C
 #        define private_socket(x) x
 #        define public_socket(x) x
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 5c0573acbdc83f9bff6ed61e168602d421229a87..0b51901b059b63372253f99bbfea25f7a091170d 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -869,7 +869,7 @@ int main(int argc, char **argv)
       
       if (errors_scrambling > 0) {
 	if (n_trials == 1)
-	  printf("errors_scrambling = %d/%d (trial %d)\n", errors_scrambling, available_bits,trial);
+	  printf("errors_scrambling = %u/%u (trial %d)\n", errors_scrambling, available_bits,trial);
       }
       
       if (errors_bit > 0) {
@@ -977,6 +977,8 @@ int main(int argc, char **argv)
   if (input_fd)
     fclose(input_fd);
 
+  if (scg_fd)
+    fclose(scg_fd);
   return(n_errors);
   
 }
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
index 99ca466fee46e8be6b0396d8d2123ccd8db458e3..9d14391f7134eb9a18e0c301b4ec2152ada69867 100644
--- a/openair1/SIMULATION/NR_PHY/pbchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -410,7 +410,7 @@ int main(int argc, char **argv)
   uint8_t n_hf = 0;
   int cyclic_prefix_type = NFAPI_CP_NORMAL;
 
-  double fs, eps;
+  double fs=0, eps;
   double scs = 30000;
   double bw = 100e6;
   
diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c
index 5c0035251582d571d541de339af5117373b376c5..2ad89ce897cac2cf529027cb140eff685ace56a7 100644
--- a/openair1/SIMULATION/NR_PHY/prachsim.c
+++ b/openair1/SIMULATION/NR_PHY/prachsim.c
@@ -108,7 +108,7 @@ int main(int argc, char **argv)
   uint8_t hs_flag=0;
   int n_frames=1;
   channel_desc_t *UE2gNB;
-  uint32_t nsymb,tx_lev; //,tx_lev_dB;
+  uint32_t tx_lev=0; //,tx_lev_dB;
   //  int8_t interf1=-19,interf2=-19;
   NR_DL_FRAME_PARMS *frame_parms;
 
@@ -120,7 +120,6 @@ int main(int argc, char **argv)
   uint32_t prach_errors=0;
   uint8_t subframe=9;
   uint16_t preamble_energy_list[64],preamble_tx=50,preamble_delay_list[64];
-  uint16_t preamble_max,preamble_energy_max;
   PRACH_RESOURCES_t prach_resources;
   //uint8_t prach_fmt;
   //int N_ZC;
@@ -189,21 +188,27 @@ int main(int argc, char **argv)
 
       case 'H':
         channel_model=Rayleigh8;
+        break;
 
       case 'I':
         channel_model=Rayleigh1;
+        break;
 
       case 'J':
         channel_model=Rayleigh1_corr;
+        break;
 
       case 'K':
         channel_model=Rayleigh1_anticorr;
+        break;
 
       case 'L':
         channel_model=Rice8;
+        break;
 
       case 'M':
         channel_model=Rice1;
+        break;
 
       case 'N':
         channel_model=Rayleigh1_800;
@@ -397,7 +402,7 @@ int main(int argc, char **argv)
   frame_parms->frame_type = TDD;
   frame_parms->freq_range = nr_FR1;
 
-  nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
+  //nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
 
   printf("FFT Size %d, Extended Prefix %d, Samples per subframe %d,Frame type %s, Frequency Range %s\n",NUMBER_OF_OFDM_CARRIERS,
          frame_parms->Ncp,frame_parms->samples_per_subframe,frame_parms->frame_type == FDD ? "FDD" : "TDD", frame_parms->freq_range == nr_FR1 ? "FR1" : "FR2");
@@ -434,7 +439,7 @@ int main(int argc, char **argv)
 
 
   bw = N_RB_UL*(180e3)*(1<<gNB->frame_parms.numerology_index);
-  AssertFatal(bw<=122.88e6,"Illegal channel bandwidth %f (mu %d,N_RB_UL %d)\n",gNB->frame_parms.numerology_index,N_RB_UL);
+  AssertFatal(bw<=122.88e6,"Illegal channel bandwidth %f (mu %d,N_RB_UL %d)\n",bw, gNB->frame_parms.numerology_index,N_RB_UL);
   if (bw <= 30.72e6)       fs = 30.72e6;
   else if (bw <= 61.44e6)  fs = 61.44e6;
   else if (bw <= 122.88e6) fs = 122.88e6;
@@ -629,7 +634,7 @@ int main(int argc, char **argv)
         }
       }
 
-      printf("SNR %f dB, UE Speed %f km/h: errors %d/%d (delay %f)\n",SNR,ue_speed,prach_errors,n_frames,delay_avg/(double)(n_frames-prach_errors));
+      printf("SNR %f dB, UE Speed %f km/h: errors %u/%d (delay %f)\n",SNR,ue_speed,prach_errors,n_frames,delay_avg/(double)(n_frames-prach_errors));
       //printf("(%f,%f)\n",ue_speed,(double)prach_errors/(double)n_frames);
     } // UE Speed loop
 
diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c
index 42f6438ef43f56750a671d6b108b31e55af1009f..88195401be9872027c7894cdba303bdd8f4650d4 100644
--- a/openair1/SIMULATION/NR_PHY/pucchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pucchsim.c
@@ -467,7 +467,7 @@ int main(int argc, char **argv)
       mcs=table1_mcs[actual_payload];
     else if(nr_bit==2)
       mcs=table2_mcs[actual_payload];
-    else AssertFatal(1==0,"Either nr_bit %d or sr_flag %d must be non-zero\n");
+    else AssertFatal(1==0,"Either nr_bit %d or sr_flag %d must be non-zero\n", nr_bit, sr_flag);
   }
   else if (format == 2 && nr_bit > 11) gNB->uci_polarParams = nr_polar_params(2, nr_bit, nrofPRB, 1, NULL);
   
@@ -501,7 +501,7 @@ int main(int argc, char **argv)
       }
       int rxlev = signal_energy(&rxdataF[aa][startingSymbolIndex*frame_parms->ofdm_symbol_size],
 				frame_parms->ofdm_symbol_size);
-      //      printf("rxlev %d (%d dB), sigma2 %f dB, SNR %f, TX %f\n",rxlev,dB_fixed(rxlev),sigma2_dB,SNR,10*log10((double)txlev*UE->frame_parms.ofdm_symbol_size/12));
+      if (n_trials==1) printf("rxlev %d (%d dB), sigma2 %f dB, SNR %f, TX %f\n",rxlev,dB_fixed(rxlev),sigma2_dB,SNR,10*log10((double)txlev*UE->frame_parms.ofdm_symbol_size/12));
       if(format==0){
 	nfapi_nr_uci_pucch_pdu_format_0_1_t uci_pdu;
 	nfapi_nr_pucch_pdu_t pucch_pdu;
diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c
index 48ea26da8f081224e5e28ccd4c18c220ca99e9d2..5881b21b5fe3042da932e8666ad900f625aa45e8 100644
--- a/openair1/SIMULATION/NR_PHY/ulschsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulschsim.c
@@ -402,7 +402,6 @@ int main(int argc, char **argv)
   rel15_ul->mcs_index           = Imcs;
   rel15_ul->pusch_data.rv_index = rvidx;
   rel15_ul->nrOfLayers          = Nl;
-  //rel15_ul->length_dmrs       = length_dmrs;
   rel15_ul->target_code_rate    = code_rate;
   rel15_ul->pusch_data.tb_size  = TBS>>3;
   ///////////////////////////////////////////////////
@@ -424,15 +423,6 @@ int main(int argc, char **argv)
   for (i = 0; i < TBS / 8; i++)
     test_input[i] = (unsigned char) rand();
 
-
-  /////////////////////////[adk] preparing NR_UE_ULSCH_t parameters///////////////////////// A HOT FIX until creating nfapi_nr_ul_config_ulsch_pdu_rel15_t
-  ///////////
-  ulsch_ue->nb_re_dmrs = nb_re_dmrs;
-  ulsch_ue->length_dmrs =  length_dmrs;
-  ulsch_ue->rnti = n_rnti;
-  ///////////
-  ////////////////////////////////////////////////////////////////////////////////////////////
-
   /////////////////////////[adk] preparing UL harq_process parameters/////////////////////////
   ///////////
   NR_UL_UE_HARQ_t *harq_process_ul_ue = ulsch_ue->harq_processes[harq_pid];
@@ -442,13 +432,14 @@ int main(int argc, char **argv)
 
   if (harq_process_ul_ue) {
 
-    harq_process_ul_ue->mcs = Imcs;
-    harq_process_ul_ue->Nl = Nl;
-    harq_process_ul_ue->nb_rb = nb_rb;
-    harq_process_ul_ue->number_of_symbols = nb_symb_sch;
+    harq_process_ul_ue->pusch_pdu.rnti = n_rnti;
+    harq_process_ul_ue->pusch_pdu.mcs_index = Imcs;
+    harq_process_ul_ue->pusch_pdu.nrOfLayers = Nl;
+    harq_process_ul_ue->pusch_pdu.rb_size = nb_rb;
+    harq_process_ul_ue->pusch_pdu.nr_of_symbols = nb_symb_sch;
     harq_process_ul_ue->num_of_mod_symbols = N_RE_prime*nb_rb*nb_codewords;
-    harq_process_ul_ue->rvidx = rvidx;
-    harq_process_ul_ue->TBS = TBS;
+    harq_process_ul_ue->pusch_pdu.pusch_data.rv_index = rvidx;
+    harq_process_ul_ue->pusch_pdu.pusch_data.tb_size  = TBS;
     harq_process_ul_ue->a = &test_input[0];
 
   }
@@ -461,9 +452,10 @@ int main(int argc, char **argv)
 
   /////////////////////////ULSCH coding/////////////////////////
   ///////////
+  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);
+    nr_ulsch_encoding(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 7c1b441b6a30bd1934a4470dd998927f535943d8..169b82bf8d7ae1540bedf877db977720b799482f 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -105,7 +105,7 @@ openair0_config_t openair0_cfg[MAX_CARDS];
 int main(int argc, char **argv)
 {
   char c;
-  int i,sf;
+  int i;
   double SNR, snr0 = -2.0, snr1 = 2.0;
   double sigma, sigma_dB;
   double snr_step = 1;
@@ -129,7 +129,7 @@ int main(int argc, char **argv)
   int loglvl = OAILOG_WARNING;
   uint64_t SSB_positions=0x01;
   uint16_t nb_symb_sch = 12;
-  int start_symbol = 0;
+  int start_symbol = 2;
   uint16_t nb_rb = 50;
   uint8_t Imcs = 9;
   uint8_t precod_nbr_layers = 1;
@@ -393,7 +393,7 @@ int main(int argc, char **argv)
   for (i = 0; i < RC.nb_nr_macrlc_inst; i++)
     RC.nb_nr_mac_CC[i] = 1;
   mac_top_init_gNB();
-  gNB_MAC_INST* gNB_mac = RC.nrmac[0];
+  //gNB_MAC_INST* gNB_mac = RC.nrmac[0];
   gNB_RRC_INST rrc;
   memset((void*)&rrc,0,sizeof(rrc));
 
@@ -449,7 +449,7 @@ int main(int argc, char **argv)
   init_nr_ue_transport(UE, 0);
 
   /*
-  for (sf = 0; sf < 2; sf++) {
+  for (int sf = 0; sf < 2; sf++) {
     for (i = 0; i < 2; i++) {
 
         UE->ulsch[sf][0][i] = new_nr_ue_ulsch(N_RB_UL, 8, 0);
@@ -506,26 +506,30 @@ int main(int argc, char **argv)
   uint16_t number_dmrs_symbols = 0;
   unsigned int available_bits;
   uint8_t nb_re_dmrs;
-  uint8_t length_dmrs = UE->pusch_config.dmrs_UplinkConfig.pusch_maxLength;
   unsigned char mod_order;
   uint16_t code_rate;
-
-  for (i = start_symbol; i < nb_symb_sch; i++)
-      number_dmrs_symbols += is_dmrs_symbol(i,
-                                            0,
-                                            0,
-                                            0,
-                                            0,
-                                            0,
-                                            nb_symb_sch,
-                                            UE->pusch_config.dmrs_UplinkConfig.pusch_dmrs_type,
-                                            frame_parms->ofdm_symbol_size);
+  uint8_t ptrs_mcs1 = 2;
+  uint8_t ptrs_mcs2 = 4;
+  uint8_t ptrs_mcs3 = 10;
+  uint16_t n_rb0 = 25;
+  uint16_t n_rb1 = 75;
+  uint8_t mcs_table = 0;
+  uint16_t pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA; // | PUSCH_PDU_BITMAP_PUSCH_PTRS;
+
+  uint8_t length_dmrs = pusch_len1; // [hna] remove dmrs struct
+  uint16_t l_prime_mask = get_l_prime(nb_symb_sch, typeB, pusch_dmrs_pos0, length_dmrs);  // [hna] remove dmrs struct
+  uint8_t ptrs_time_density = get_L_ptrs(ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, Imcs, mcs_table);
+  uint8_t ptrs_freq_density = get_K_ptrs(n_rb0, n_rb1, nb_rb);
+
+  if(1<<ptrs_time_density >= nb_symb_sch)
+    pdu_bit_map &= ~PUSCH_PDU_BITMAP_PUSCH_PTRS; // disable PUSCH PTRS
+
+  for (i = 0; i < nb_symb_sch; i++) {
+    number_dmrs_symbols += (l_prime_mask >> i) & 0x01;
+  }
 
   mod_order      = nr_get_Qm_ul(Imcs, 0);
-  nb_re_dmrs     = ((UE->pusch_config.dmrs_UplinkConfig.pusch_dmrs_type == pusch_dmrs_type1) ? 6 : 4) * number_dmrs_symbols;
   code_rate      = nr_get_code_rate_ul(Imcs, 0);
-  available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, 1);
-  TBS            = nr_compute_tbs(mod_order, code_rate, nb_rb, nb_symb_sch, nb_re_dmrs*length_dmrs, 0, precod_nbr_layers);
 
   printf("\n");
 
@@ -570,16 +574,16 @@ int main(int argc, char **argv)
       UL_tti_req->pdus_list[0].pdu_size = sizeof(nfapi_nr_pusch_pdu_t);
       memset(pusch_pdu,0,sizeof(nfapi_nr_pusch_pdu_t));
       
-      pusch_pdu->pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA;  
+      pusch_pdu->pdu_bit_map = pdu_bit_map;
       pusch_pdu->rnti = n_rnti;
       pusch_pdu->mcs_index = Imcs;
-      pusch_pdu->mcs_table = 0; 
+      pusch_pdu->mcs_table = mcs_table;
       pusch_pdu->target_code_rate = code_rate;
       pusch_pdu->qam_mod_order = mod_order;
       pusch_pdu->transform_precoding = 0;
       pusch_pdu->data_scrambling_id = 0;
       pusch_pdu->nrOfLayers = 1;
-      pusch_pdu->ul_dmrs_symb_pos = 1;
+      pusch_pdu->ul_dmrs_symb_pos = l_prime_mask << start_symbol;
       pusch_pdu->dmrs_config_type = 0;
       pusch_pdu->ul_dmrs_scrambling_id =  0;
       pusch_pdu->scid = 0;
@@ -594,9 +598,11 @@ int main(int argc, char **argv)
       pusch_pdu->pusch_data.rv_index = 0;
       pusch_pdu->pusch_data.harq_process_id = 0;
       pusch_pdu->pusch_data.new_data_indicator = 0;
-      pusch_pdu->pusch_data.tb_size = TBS>>3;
       pusch_pdu->pusch_data.num_cb = 0;
-
+      pusch_pdu->pusch_ptrs.ptrs_time_density = ptrs_time_density;
+      pusch_pdu->pusch_ptrs.ptrs_freq_density = ptrs_freq_density;
+      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;
 
       // --------- setting parameters for UE --------
 
@@ -611,19 +617,33 @@ int main(int argc, char **argv)
       ul_config.slot = slot;
       ul_config.number_pdus = 1;
       ul_config.ul_config_list[0].pdu_type = FAPI_NR_UL_CONFIG_TYPE_PUSCH;
-      ul_config.ul_config_list[0].ulsch_config_pdu.rnti = n_rnti;
-      ul_config.ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.number_rbs = nb_rb;
-      ul_config.ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.start_rb = start_rb;
-      ul_config.ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.number_symbols = nb_symb_sch;
-      ul_config.ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.start_symbol = start_symbol;
-      ul_config.ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.mcs = Imcs;
-      ul_config.ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.ndi = 0;
-      ul_config.ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.rv = 0;
-      ul_config.ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.n_layers = precod_nbr_layers;
-      ul_config.ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.harq_process_nbr = harq_pid;
+      ul_config.ul_config_list[0].pusch_config_pdu.rnti = n_rnti;
+      ul_config.ul_config_list[0].pusch_config_pdu.pdu_bit_map = pdu_bit_map;
+      ul_config.ul_config_list[0].pusch_config_pdu.rb_size = nb_rb;
+      ul_config.ul_config_list[0].pusch_config_pdu.rb_start = start_rb;
+      ul_config.ul_config_list[0].pusch_config_pdu.nr_of_symbols = nb_symb_sch;
+      ul_config.ul_config_list[0].pusch_config_pdu.start_symbol_index = start_symbol;
+      ul_config.ul_config_list[0].pusch_config_pdu.ul_dmrs_symb_pos = l_prime_mask << start_symbol;
+      ul_config.ul_config_list[0].pusch_config_pdu.dmrs_config_type = 0;
+      ul_config.ul_config_list[0].pusch_config_pdu.mcs_index = Imcs;
+      ul_config.ul_config_list[0].pusch_config_pdu.mcs_table = mcs_table;
+      ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.new_data_indicator = 0;
+      ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.rv_index = 0;
+      ul_config.ul_config_list[0].pusch_config_pdu.nrOfLayers = precod_nbr_layers;
+      ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.harq_process_id = harq_pid;
+      ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_time_density = ptrs_time_density;
+      ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_freq_density = ptrs_freq_density;
+      ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_ports_list   = (nfapi_nr_ue_ptrs_ports_t *) malloc(2*sizeof(nfapi_nr_ue_ptrs_ports_t));
+      ul_config.ul_config_list[0].pusch_config_pdu.pusch_ptrs.ptrs_ports_list[0].ptrs_re_offset = 0;
       //there are plenty of other parameters that we don't seem to be using for now. e.g.
-      //ul_config.ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.absolute_delta_PUSCH = 0;
+      ul_config.ul_config_list[0].pusch_config_pdu.absolute_delta_PUSCH = 0;
 
+      nb_re_dmrs     = ((ul_config.ul_config_list[0].pusch_config_pdu.dmrs_config_type == pusch_dmrs_type1) ? 6 : 4);
+      available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, number_dmrs_symbols, mod_order, 1);
+      TBS            = nr_compute_tbs(mod_order, code_rate, nb_rb, nb_symb_sch, nb_re_dmrs * number_dmrs_symbols, 0, precod_nbr_layers);
+
+      pusch_pdu->pusch_data.tb_size = TBS>>3;
+      ul_config.ul_config_list[0].pusch_config_pdu.pusch_data.tb_size = TBS;
       // set FAPI parameters for UE, put them in the scheduled response and call
       nr_ue_scheduled_response(&scheduled_response);
 
@@ -704,7 +724,7 @@ int main(int argc, char **argv)
 
         if (errors_scrambling > 0) {
 	  if (n_trials==1)
-	    printf("\x1B[31m""[frame %d][trial %d]\tnumber of errors in unscrambling = %d\n" "\x1B[0m", frame, trial, errors_scrambling);
+	    printf("\x1B[31m""[frame %d][trial %d]\tnumber of errors in unscrambling = %u\n" "\x1B[0m", frame, trial, errors_scrambling);
         }
 
         for (i = 0; i < TBS; i++) {
@@ -722,13 +742,13 @@ int main(int argc, char **argv)
         if (errors_decoding > 0) {
           n_false_positive++;
 	  if (n_trials==1)
-	    printf("\x1B[31m""[frame %d][trial %d]\tnumber of errors in decoding     = %d\n" "\x1B[0m", frame, trial, errors_decoding);
+	    printf("\x1B[31m""[frame %d][trial %d]\tnumber of errors in decoding     = %u\n" "\x1B[0m", frame, trial, errors_decoding);
         } 
 
       } // trial loop
 
       printf("*****************************************\n");
-      printf("SNR %f: n_errors (negative CRC) = %d/%d, false_positive %d/%d, errors_scrambling %d/%d\n", SNR, n_errors, n_trials, n_false_positive, n_trials, errors_scrambling, n_trials);
+      printf("SNR %f: n_errors (negative CRC) = %d/%d, false_positive %d/%d, errors_scrambling %u/%d\n", SNR, n_errors, n_trials, n_false_positive, n_trials, errors_scrambling, n_trials);
       printf("\n");
       printf("SNR %f: Channel BLER %e, Channel BER %e\n", SNR,(double)n_errors/n_trials,(double)errors_scrambling/available_bits/n_trials);
       printf("*****************************************\n");
@@ -771,5 +791,8 @@ int main(int argc, char **argv)
   if (input_fd)
     fclose(input_fd);
 
+  if (scg_fd)
+    fclose(scg_fd);
+
   return (n_errors);
 }
diff --git a/openair1/SIMULATION/TOOLS/sim.h b/openair1/SIMULATION/TOOLS/sim.h
index 0bc5975d99bb6d17f8a326e7da5f6f9685e3aecd..ac46d5117429e6ca3aa0846352178302355e7ba0 100644
--- a/openair1/SIMULATION/TOOLS/sim.h
+++ b/openair1/SIMULATION/TOOLS/sim.h
@@ -432,15 +432,6 @@ void multipath_tv_channel(channel_desc_t *desc,
 /**@} */
 /**@} */
 
-void rxAddInput( struct complex16 *input_sig,
-                 struct complex16 *after_channel_sig,
-                 int rxAnt,
-                 channel_desc_t *channelDesc,
-                 int nbSamples,
-                 uint64_t TS,
-                 uint32_t CirSize
-               );
-
 int modelid_fromname(char *modelname);
 double channelmod_get_snr_dB(void);
 double channelmod_get_sinr_dB(void);
diff --git a/openair2/COMMON/platform_constants.h b/openair2/COMMON/platform_constants.h
index 7a7e984aca0cbb7cce60c25b2890d79d61fa39d8..1eb58b16b2005d172e6ccffdad219f782358d7b9 100644
--- a/openair2/COMMON/platform_constants.h
+++ b/openair2/COMMON/platform_constants.h
@@ -73,7 +73,9 @@
   #ifdef UESIM_EXPANSION
     #define MAX_MOBILES_PER_ENB         256
     #define MAX_MOBILES_PER_ENB_NB_IoT  256
+    #define MAX_MOBILES_PER_GNB         256
     #define MAX_eNB                      2
+    #define MAX_gNB                      2
   #else
     #ifdef LARGE_SCALE
       #define MAX_MOBILES_PER_ENB         128
diff --git a/openair2/COMMON/s1ap_messages_types.h b/openair2/COMMON/s1ap_messages_types.h
index aa718dbcf888507bff2c653729bf169314b128fb..8e13e35d654c5903d5d12901ebb634bbd723e70a 100644
--- a/openair2/COMMON/s1ap_messages_types.h
+++ b/openair2/COMMON/s1ap_messages_types.h
@@ -78,7 +78,6 @@
  * the key length is 32 bytes (256 bits)
  */
 #define SECURITY_KEY_LENGTH 32
-#ifndef OCP_FRAMEWORK
 typedef enum cell_type_e {
   CELL_MACRO_ENB,
   CELL_HOME_ENB,
@@ -110,7 +109,6 @@ typedef enum cn_domain_s {
   CN_DOMAIN_PS = 1,
   CN_DOMAIN_CS = 2
 } cn_domain_t;
-#endif
 
 typedef struct net_ip_address_s {
   unsigned ipv4:1;
@@ -126,7 +124,6 @@ typedef struct ambr_s {
   bitrate_t br_dl;
 } ambr_t;
 
-#ifndef OCP_FRAMEWORK
 typedef enum priority_level_s {
   PRIORITY_LEVEL_SPARE       = 0,
   PRIORITY_LEVEL_HIGHEST     = 1,
@@ -145,7 +142,6 @@ typedef enum pre_emp_vulnerability_e {
   PRE_EMPTION_VULNERABILITY_DISABLED = 1,
   PRE_EMPTION_VULNERABILITY_MAX,
 } pre_emp_vulnerability_t;
-#endif
 
 typedef struct allocation_retention_priority_s {
   priority_level_t        priority_level;
diff --git a/openair2/DOCS/TEMPLATES/CODE/example_doxy.h b/openair2/DOCS/TEMPLATES/CODE/example_doxy.h
index c51bdbccabc2ea6bb007b728567e7c8b62f9ac05..30d8ddb600923498440a57bb32f961409e0c4653 100644
--- a/openair2/DOCS/TEMPLATES/CODE/example_doxy.h
+++ b/openair2/DOCS/TEMPLATES/CODE/example_doxy.h
@@ -31,6 +31,9 @@
 * \warning  this is a warning
 */
 
+#ifndef __DOCS_TEMPLATES_CODE_EXAMPLE_DOXY__H__
+#define __DOCS_TEMPLATES_CODE_EXAMPLE_DOXY__H__
+
 //-----------------------------------begin group-----------------------------
 
 
@@ -138,3 +141,4 @@ struct frame {
 int init(int src, int dst);
 
 //-----------------------end func proto-------------------
+#endif
diff --git a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c
index 975ac4e96ff5ae3c2492c7a374bcd5359f56a517..603ff25198346adb446ba047b1525efbc4b1ec7d 100644
--- a/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c
+++ b/openair2/ENB_APP/CONTROL_MODULES/MAC/flexran_agent_mac.c
@@ -1579,10 +1579,6 @@ int flexran_agent_unregister_mac_xface(mid_t mod_id)
   return 0;
 }
 
-AGENT_MAC_xface *flexran_agent_get_mac_xface(mid_t mod_id)
-{
-  return agent_mac_xface[mod_id];
-}
 
 void flexran_create_config_structures(mid_t mod_id)
 {
diff --git a/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc.c b/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc.c
index 92c991762266f2bf0ed7affbc842d2d8b108487f..ec907a1956ca56b12b06e2c537c7fc4873eb9ab6 100644
--- a/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc.c
+++ b/openair2/ENB_APP/CONTROL_MODULES/RRC/flexran_agent_rrc.c
@@ -921,7 +921,4 @@ int flexran_agent_unregister_rrc_xface(mid_t mod_id)
   return 0;
 }
 
-AGENT_RRC_xface *flexran_agent_get_rrc_xface(mid_t mod_id)
-{
-  return agent_rrc_xface[mod_id];
-}
+
diff --git a/openair2/ENB_APP/L1_paramdef.h b/openair2/ENB_APP/L1_paramdef.h
index 210b753afbb19e84ba04693393651f1d73442373..72e77c38000c44da6d5ebb4b5e6a79fab8f8a16a 100644
--- a/openair2/ENB_APP/L1_paramdef.h
+++ b/openair2/ENB_APP/L1_paramdef.h
@@ -30,6 +30,8 @@
  * \warning
  */
 
+#ifndef __ENB_APP_L1_PARAMDEF__H__
+#define __ENB_APP_L1_PARAMDEF__H__
 
 /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
 
@@ -114,3 +116,5 @@
 #define L1_PUCCH1_DTX_EMTC3_THRESHOLD_IDX                  22
 #define L1_PUCCH1AB_DTX_EMTC3_THRESHOLD_IDX                23
 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+#endif
diff --git a/openair2/ENB_APP/MACRLC_paramdef.h b/openair2/ENB_APP/MACRLC_paramdef.h
index 724dde6557e01bffc2c1a33f905b1dd5c7311577..55ce9d5059eee1bf682b1cf8a82e6796bb2a8fdf 100644
--- a/openair2/ENB_APP/MACRLC_paramdef.h
+++ b/openair2/ENB_APP/MACRLC_paramdef.h
@@ -31,6 +31,8 @@
  */
 
 
+#ifndef __ENB_APP_MACRLC_PARAMDEF__H__
+#define __ENB_APP_MACRLC_PARAMDEF__H__
 
 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/
 
@@ -104,3 +106,5 @@
 #define MACRLC_PUSCH10xSNR_IDX                                 18
 #define MACRLC_PUCCH10xSNR_IDX                                 19 
 /*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+#endif
diff --git a/openair2/ENB_APP/NB_IoT_paramdef.h b/openair2/ENB_APP/NB_IoT_paramdef.h
index 6409fe63ee56479b9cc1fca486b9d63bd77f8bda..8778f6d2e4067cf2f7a49f1a2dd1d0a97503df58 100644
--- a/openair2/ENB_APP/NB_IoT_paramdef.h
+++ b/openair2/ENB_APP/NB_IoT_paramdef.h
@@ -30,6 +30,9 @@
  * \warning
  */
 
+#ifndef __ENB_APP_NB_IOT_PARAMDEF__H__
+#define __ENB_APP_NB_IOT_PARAMDEF__H__
+
 #include "common/config/config_paramdesc.h"
 #include "SystemInformationBlockType2.h"
 #include "DL-GapConfig-NB-r13.h"
@@ -398,3 +401,5 @@
 /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
 /* NB IoT L1 configuration list section name   */
 #define NBIOT_L1LIST_CONFIG_STRING                          "NB-IoT_L1s"
+
+#endif
diff --git a/openair2/ENB_APP/enb_paramdef_emtc.h b/openair2/ENB_APP/enb_paramdef_emtc.h
index 7ec6f4940a32d9366d9da13baafa7b4747c42438..de774c4ea694d13c5bc75173072606e95f157594 100644
--- a/openair2/ENB_APP/enb_paramdef_emtc.h
+++ b/openair2/ENB_APP/enb_paramdef_emtc.h
@@ -30,6 +30,9 @@
  * \warning
  */
 
+#ifndef __ENB_APP_ENB_PARAMDEF_EMTC__H__
+#define __ENB_APP_ENB_PARAMDEF_EMTC__H__
+
 #include "common/config/config_paramdesc.h"
 #include "RRC_paramsvalues.h"
 
@@ -405,3 +408,5 @@ typedef struct ccparams_eMTC_s {
 {"sib2_interval_ULHoppingConfigCommonModeB_r13_val",                 NULL,   0,           iptr:&eMTCconfig->sib2_interval_ULHoppingConfigCommonModeB_r13_val,   defintval:0,            TYPE_UINT,       0}, \
 {"sib2_mpdcch_pdsch_hoppingOffset_r13",                              NULL,   0,           iptr:&eMTCconfig->sib2_mpdcch_pdsch_hoppingOffset_r13,                defintval:1,             TYPE_UINT,         0} \
 }
+
+#endif
diff --git a/openair2/ENB_APP/enb_paramdef_mce.h b/openair2/ENB_APP/enb_paramdef_mce.h
index 8a4dd157667856947b0678a4f39624c6b82ba381..fdc2731e16b6b2af2b1778023d72983e20d7f9d4 100644
--- a/openair2/ENB_APP/enb_paramdef_mce.h
+++ b/openair2/ENB_APP/enb_paramdef_mce.h
@@ -30,6 +30,9 @@
  * \warning
  */
 
+#ifndef __ENB_APP_ENB_PARAMDEF_MCE__H__
+#define __ENB_APP_ENB_PARAMDEF_MCE__H__
+
 #include "common/config/config_paramdesc.h"
 #include "RRC_paramsvalues.h"
 
@@ -235,5 +238,4 @@
 #define MCE_CONFIG_STRING_NUM_FRAME_IDX	2
 #define MCE_CONFIG_STRING_SUBFRAME_ALLOCATION_IDX	3
 
-
-
+#endif
diff --git a/openair2/ENB_APP/enb_paramdef_mme.h b/openair2/ENB_APP/enb_paramdef_mme.h
index 0ff1df765c07411d5b146e9ecfe73ada65deb0e3..fde9b1c3a871b9bfe4df2dd1a014a481002178c5 100644
--- a/openair2/ENB_APP/enb_paramdef_mme.h
+++ b/openair2/ENB_APP/enb_paramdef_mme.h
@@ -30,6 +30,9 @@
  * \warning
  */
 
+#ifndef __ENB_APP_ENB_PARAMDEF_MME__H__
+#define __ENB_APP_ENB_PARAMDEF_MME__H__
+
 #include "common/config/config_paramdesc.h"
 #include "RRC_paramsvalues.h"
 
@@ -77,6 +80,4 @@
 {MME_CONFIG_STRING_MME_PORT_FOR_M3C,                     NULL,      0,         uptr:&mme_port_for_m3c,           	 defintval:36444L,    TYPE_UINT,        0},      \
 } 
 
-
-
-
+#endif
diff --git a/openair2/ENB_APP/flexran_agent_extern.h b/openair2/ENB_APP/flexran_agent_extern.h
index 119bc3d44c6b32967efb6e50f64495b5d72960af..5f17cf4841e327c9e7355b28623cdf849458a8b8 100644
--- a/openair2/ENB_APP/flexran_agent_extern.h
+++ b/openair2/ENB_APP/flexran_agent_extern.h
@@ -41,10 +41,15 @@
 AGENT_PHY_xface *flexran_agent_get_phy_xface(mid_t mod_id);
 
 /* Control module interface for the communication of the MAC Control Module with the agent */
-AGENT_MAC_xface *flexran_agent_get_mac_xface(mid_t mod_id);
 
+extern AGENT_MAC_xface *agent_mac_xface[NUM_MAX_ENB];
+#define flexran_agent_get_mac_xface(mod_id) (agent_mac_xface[mod_id])
 /* Control module interface for the communication of the RRC Control Module with the agent */
-AGENT_RRC_xface *flexran_agent_get_rrc_xface(mid_t mod_id);
+
+/* Control module interface for the communication of the RRC Control Module with the agent */
+// AGENT_RRC_xface *flexran_agent_get_rrc_xface(mid_t mod_id);
+extern AGENT_RRC_xface *agent_rrc_xface[NUM_MAX_ENB];
+#define flexran_agent_get_rrc_xface(mod_id) (agent_rrc_xface[mod_id])
 
 /* Control module interface for the communication of the RRC Control Module with the agent */
 AGENT_PDCP_xface *flexran_agent_get_pdcp_xface(mid_t mod_id);
diff --git a/openair2/GNB_APP/L1_nr_paramdef.h b/openair2/GNB_APP/L1_nr_paramdef.h
index 889a50c814bab349536cfee5d33986f2411fe4b6..a5a808c2811ad21684cabbedb572ea03fc810518 100644
--- a/openair2/GNB_APP/L1_nr_paramdef.h
+++ b/openair2/GNB_APP/L1_nr_paramdef.h
@@ -30,6 +30,8 @@
  * \warning
  */
 
+#ifndef __GNB_APP_L1_NR_PARAMDEF__H__
+#define __GNB_APP_L1_NR_PARAMDEF__H__
 
 /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
 
@@ -71,3 +73,4 @@
 #define L1_REMOTE_N_PORTD_IDX                              8
 
 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/
+#endif
diff --git a/openair2/GNB_APP/MACRLC_nr_paramdef.h b/openair2/GNB_APP/MACRLC_nr_paramdef.h
index b55aeacdce706288df8c03e6584b6be24d88b3fd..308af2eeb916b760f5643f19c0e84b4874d5dc7d 100644
--- a/openair2/GNB_APP/MACRLC_nr_paramdef.h
+++ b/openair2/GNB_APP/MACRLC_nr_paramdef.h
@@ -31,6 +31,8 @@
  */
 
 
+#ifndef __GNB_APP_MACRLC_NR_PARAMDEF__H__
+#define __GNB_APP_MACRLC_NR_PARAMDEF__H__
 
 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/
 
@@ -96,3 +98,4 @@
 #define MACRLC_LOCAL_S_PORTD_IDX                               15
 #define MACRLC_REMOTE_S_PORTD_IDX                              16
 /*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
+#endif
diff --git a/openair2/GNB_APP/gnb_app.c b/openair2/GNB_APP/gnb_app.c
index f11e302771d8542db5f1b3722e929025c308660c..f419ec079057ae1964ff80fe9807811c97360725 100644
--- a/openair2/GNB_APP/gnb_app.c
+++ b/openair2/GNB_APP/gnb_app.c
@@ -131,7 +131,6 @@ void *gNB_app_task(void *args_p)
   uint32_t                        gnb_nb = RC.nb_nr_inst; 
   uint32_t                        gnb_id_start = 0;
   uint32_t                        gnb_id_end = gnb_id_start + gnb_nb;
-  uint32_t                        x2_register_gnb_pending = 0;
   uint32_t                        gnb_id;
   MessageDef                      *msg_p           = NULL;
   const char                      *msg_name        = NULL;
@@ -170,7 +169,7 @@ void *gNB_app_task(void *args_p)
 
   if (is_x2ap_enabled() ) { //&& !NODE_IS_DU(RC.rrc[0]->node_type)
 	  LOG_I(X2AP, "X2AP enabled \n");
-	  x2_register_gnb_pending = gNB_app_register_x2 (gnb_id_start, gnb_id_end);
+	  __attribute__((unused)) uint32_t x2_register_gnb_pending = gNB_app_register_x2 (gnb_id_start, gnb_id_end);
   }
 
   if (EPC_MODE_ENABLED) {
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index 935551707261e1535d4dbc8acebb1a9b3fb046eb..e7fd2f3cf843122ed2ecc390ab10f671bfa38d2c 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -978,8 +978,6 @@ void NRRCConfig(void) {
   paramlist_def_t RUParamList     = {CONFIG_STRING_RU_LIST,NULL,0};
   paramdef_t GNBSParams[]         = GNBSPARAMS_DESC;
   
-  char aprefix[MAX_OPTNAME_SIZE*2 + 8];  
-  
 /* get global parameters, defined outside any section in the config file */
  
   LOG_I(GNB_APP, "Getting GNBSParams\n");
diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h
index 2d9ecb8c8a5290ebb000889ba0c936a0d12240c9..84045fc622f0a38fb7f8d16f520fc694fab415ec 100644
--- a/openair2/GNB_APP/gnb_paramdef.h
+++ b/openair2/GNB_APP/gnb_paramdef.h
@@ -30,6 +30,9 @@
  * \warning
  */
 
+#ifndef __GNB_APP_GNB_PARAMDEF__H__
+#define __GNB_APP_GNB_PARAMDEF__H__
+
 #include "common/config/config_paramdesc.h"
 #include "RRC_nr_paramsvalues.h"
 
@@ -430,3 +433,4 @@ typedef struct ccparams_nr_x2 {
 #define CONFIG_HLP_WORKER                          "coding and FEP worker thread WORKER_DISABLE or WORKER_ENABLE\n"
 #define CONFIG_HLP_PARALLEL                        "PARALLEL_SINGLE_THREAD, PARALLEL_RU_L1_SPLIT, or PARALLEL_RU_L1_TRX_SPLIT(RU_L1_TRX_SPLIT by defult)\n"
 /*-------------------------------------------------------------------------------------------------------------------------------------------------------------*/
+#endif
diff --git a/openair2/LAYER2/MAC/config_NB_IoT.h b/openair2/LAYER2/MAC/config_NB_IoT.h
index fb8c85ebed22570bd49907f3d3b4021f496ceb65..1821b4e12d885a3dd202aa6bab856743762ac59b 100644
--- a/openair2/LAYER2/MAC/config_NB_IoT.h
+++ b/openair2/LAYER2/MAC/config_NB_IoT.h
@@ -8,8 +8,8 @@
  *
  */
 
-#ifndef _CONFIG_H_
-#define _CONFIG_H_
+#ifndef __LAYER2_MAC_CONFIG_NB_IOT__H__
+#define __LAYER2_MAC_CONFIG_NB_IOT__H__
 
 //#include "NB_IoT_Message_definitions.h"
 
diff --git a/openair2/LAYER2/MAC/mac_extern.h b/openair2/LAYER2/MAC/mac_extern.h
index dbf5b57b6b28cdd095fb2094afbc7b55f5e732f0..cee6066a9ebb174119b3fe6b22ce4ed6c9ae738a 100644
--- a/openair2/LAYER2/MAC/mac_extern.h
+++ b/openair2/LAYER2/MAC/mac_extern.h
@@ -60,7 +60,7 @@ extern uint16_t NB_THREAD_INST;
 extern unsigned char NB_RN_INST;
 extern unsigned short NODE_ID[1];
 
-extern int cqi_to_mcs[16];
+extern const int cqi_to_mcs[16];
 
 extern uint32_t RRC_CONNECTION_FLAG;
 
diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c
index c4dd6b841966d8d902d40bc95a7d78359eb4b961..8569d8f1666b267cc87984b50643e432ff81e779 100644
--- a/openair2/LAYER2/MAC/pre_processor.c
+++ b/openair2/LAYER2/MAC/pre_processor.c
@@ -36,6 +36,7 @@
 #include "LAYER2/MAC/mac.h"
 #include "LAYER2/MAC/mac_proto.h"
 #include "LAYER2/MAC/mac_extern.h"
+#include <openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h>
 #include "common/utils/LOG/log.h"
 #include "common/utils/LOG/vcd_signal_dumper.h"
 #include "UTIL/OPT/opt.h"
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index ae231641943ace1a3392ffa10b1481cfab0b9e90..cfde40daad131dfd5695ddb6d68432568a6d7bd7 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -79,6 +79,47 @@ nr_bandentry_t nr_bandtable[] = {
   {261,27500000,28350000,27500000,28350000,  2,2070833, 120}
 };
 
+
+// TS 38.211 Table 6.4.1.1.3-3: PUSCH DMRS positions l' within a slot for single-symbol DMRS and intra-slot frequency hopping disabled.
+// The first 4 colomns are PUSCH mapping type A and the last 4 colomns are PUSCH mapping type B.
+// When l' = l0, it is represented by 1
+// E.g. when symbol duration is 12 in colomn 7, value 1057 ('10000100001') which means l' =  l0, 5, 10.
+
+int32_t table_6_4_1_1_3_3_pusch_dmrs_positions_l [12][8] = {                             // Duration in symbols
+{-1,          -1,          -1,         -1,          1,          1,         1,         1},       //<4              // (DMRS l' position)
+{1,            1,           1,          1,          1,          1,         1,         1},       //4               // (DMRS l' position)
+{1,            1,           1,          1,          1,          5,         5,         5},       //5               // (DMRS l' position)
+{1,            1,           1,          1,          1,          5,         5,         5},       //6               // (DMRS l' position)
+{1,            1,           1,          1,          1,          5,         5,         5},       //7               // (DMRS l' position)
+{1,          129,         129,        129,          1,         65,        73,        73},       //8               // (DMRS l' position)
+{1,          129,         129,        129,          1,         65,        73,        73},       //9               // (DMRS l' position)
+{1,          513,         577,        577,          1,        257,       273,       585},       //10              // (DMRS l' position)
+{1,          513,         577,        577,          1,        257,       273,       585},       //11              // (DMRS l' position)
+{1,          513,         577,       2337,          1,       1025,      1057,       585},       //12              // (DMRS l' position)
+{1,         2049,        2177,       2337,          1,       1025,      1057,       585},       //13              // (DMRS l' position)
+{1,         2049,        2177,       2337,          1,       1025,      1057,       585},       //14              // (DMRS l' position)
+};
+
+
+// TS 38.211 Table 6.4.1.1.3-4: PUSCH DMRS positions l' within a slot for double-symbol DMRS and intra-slot frequency hopping disabled.
+// The first 4 colomns are PUSCH mapping type A and the last 4 colomns are PUSCH mapping type B.
+// When l' = l0, it is represented by 1
+
+int32_t table_6_4_1_1_3_4_pusch_dmrs_positions_l [12][8] = {                             // Duration in symbols
+{-1,          -1,          -1,         -1,         -1,         -1,        -1,         -1},       //<4              // (DMRS l' position)
+{1,            1,          -1,         -1,         -1,         -1,        -1,         -1},       //4               // (DMRS l' position)
+{1,            1,          -1,         -1,          1,          1,        -1,         -1},       //5               // (DMRS l' position)
+{1,            1,          -1,         -1,          1,          1,        -1,         -1},       //6               // (DMRS l' position)
+{1,            1,          -1,         -1,          1,          1,        -1,         -1},       //7               // (DMRS l' position)
+{1,            1,          -1,         -1,          1,         33,        -1,         -1},       //8               // (DMRS l' position)
+{1,            1,          -1,         -1,          1,         33,        -1,         -1},       //9               // (DMRS l' position)
+{1,          257,          -1,         -1,          1,        129,        -1,         -1},       //10              // (DMRS l' position)
+{1,          257,          -1,         -1,          1,        129,        -1,         -1},       //11              // (DMRS l' position)
+{1,          257,          -1,         -1,          1,        513,        -1,         -1},       //12              // (DMRS l' position)
+{1,         1025,          -1,         -1,          1,        513,        -1,         -1},       //13              // (DMRS l' position)
+{1,         1025,          -1,         -1,          1,        513,        -1,         -1},       //14              // (DMRS l' position)
+};
+
 #define NR_BANDTABLE_SIZE (sizeof(nr_bandtable)/sizeof(nr_bandentry_t))
 
 void get_band(uint64_t downlink_frequency,
@@ -517,6 +558,112 @@ int get_num_dmrs(uint16_t dmrs_mask ) {
   return(num_dmrs);
 }
 
+/*******************************************************************
+*
+* NAME :         get_l0_ul
+*
+* PARAMETERS :   mapping_type : PUSCH mapping type
+*                dmrs_typeA_position  : higher layer parameter
+*
+* RETURN :       demodulation reference signal for PUSCH
+*
+* DESCRIPTION :  see TS 38.211 V15.4.0 Demodulation reference signals for PUSCH
+*
+*********************************************************************/
+
+uint8_t get_l0_ul(uint8_t mapping_type, uint8_t dmrs_typeA_position) {
+
+  return ((mapping_type==typeA)?dmrs_typeA_position:0);
+
+}
+
+int32_t get_l_prime(uint8_t duration_in_symbols, uint8_t mapping_type, pusch_dmrs_AdditionalPosition_t additional_pos, pusch_maxLength_t pusch_maxLength) {
+
+  uint8_t row, colomn;
+  int32_t l_prime;
+
+  colomn = additional_pos;
+
+  if (mapping_type == typeB)
+    colomn += 4;
+
+  if (duration_in_symbols < 4)
+    row = 0;
+  else
+    row = duration_in_symbols - 3;
+
+  if (pusch_maxLength == pusch_len1)
+    l_prime = table_6_4_1_1_3_3_pusch_dmrs_positions_l[row][colomn];
+  else
+    l_prime = table_6_4_1_1_3_4_pusch_dmrs_positions_l[row][colomn];
+
+  AssertFatal(l_prime>0,"invalid l_prime < 0\n");
+
+  return l_prime;
+}
+
+/*******************************************************************
+*
+* NAME :         get_L_ptrs
+*
+* PARAMETERS :   mcs(i)                 higher layer parameter in PTRS-UplinkConfig
+*                I_mcs                  MCS index used for PUSCH
+*                mcs_table              0 for table 5.1.3.1-1, 1 for table 5.1.3.1-1
+*
+* RETURN :       the parameter L_ptrs
+*
+* DESCRIPTION :  3GPP TS 38.214 section 6.2.3.1
+*
+*********************************************************************/
+
+uint8_t get_L_ptrs(uint8_t mcs1, uint8_t mcs2, uint8_t mcs3, uint8_t I_mcs, uint8_t mcs_table) {
+
+  uint8_t mcs4;
+
+  if(mcs_table == 0)
+    mcs4 = 29;
+  else
+    mcs4 = 28;
+
+  if (I_mcs < mcs1) {
+    LOG_I(PHY, "PUSH PT-RS is not present.\n");
+    return -1;
+  } else if (I_mcs >= mcs1 && I_mcs < mcs2)
+    return 2;
+  else if (I_mcs >= mcs2 && I_mcs < mcs3)
+    return 1;
+  else if (I_mcs >= mcs3 && I_mcs < mcs4)
+    return 0;
+  else {
+    LOG_I(PHY, "PT-RS time-density determination is obtained from the DCI for the same transport block in the initial transmission\n");
+    return -1;
+  }
+}
+
+/*******************************************************************
+*
+* NAME :         get_K_ptrs
+*
+* PARAMETERS :   ptrs_UplinkConfig      PTRS uplink configuration
+*                N_RB                   number of RBs scheduled for PUSCH
+*
+* RETURN :       the parameter K_ptrs
+*
+* DESCRIPTION :  3GPP TS 38.214 6.2.3 Table 6.2.3.1-2
+*
+*********************************************************************/
+
+uint8_t get_K_ptrs(uint16_t nrb0, uint16_t nrb1, uint16_t N_RB) {
+
+  if (N_RB < nrb0) {
+    LOG_I(PHY,"PUSH PT-RS is not present.\n");
+    return -1;
+  } else if (N_RB >= nrb0 && N_RB < nrb1)
+    return 0;
+  else
+    return 1;
+}
+
 uint16_t nr_dci_size(nr_dci_format_t format,
 		     nr_rnti_type_t rnti_type,
 		     uint16_t N_RB) {
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h
index 2cfce4766f7234e50249f2560e725cfd8f89a7d8..63c81def82bbbabe9e2282aeb2cac3c7950b6102 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_extern.h
@@ -45,7 +45,7 @@ extern const uint8_t cqi2fmt2x_agg[MAX_SUPPORTED_BW][CQI_VALUE_RANGE];
 extern UE_RRC_INST *UE_rrc_inst;
 extern eNB_ULSCH_INFO eNB_ulsch_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs][MAX_MOBILES_PER_ENB];	// eNBxUE = 8x8
 extern eNB_DLSCH_INFO eNB_dlsch_info[NUMBER_OF_eNB_MAX][MAX_NUM_CCs][MAX_MOBILES_PER_ENB];	// eNBxUE = 8x8
-extern int cqi_to_mcs[16];
+extern const int cqi_to_mcs[16];
 extern uint32_t RRC_CONNECTION_FLAG;
 extern uint8_t rb_table[34];
 extern mac_rlc_am_muilist_t rlc_am_mui;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index 860b73276c307aa41041fd34008f2800109c1301..a962e799ed7ecd0f96e24845a025089f1930dd4d 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -118,7 +118,7 @@ int8_t nr_ue_process_dlsch(module_id_t module_id,
   //fapi_nr_dl_config_request_t *dl_config = &mac->dl_config_request;
   nr_phy_config_t *phy_config = &mac->phy_config;
 
-  //ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.rnti = rnti;
+  //ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.rnti = rnti;
   // First we need to verify if DCI ind contains a ul-sch to be perfomred. If it does, we will handle a PUSCH in the UL_CONFIG_REQ.
   ul_config->ul_config_list[ul_config->number_pdus].pdu_type = FAPI_NR_UL_CONFIG_TYPE_PUCCH;
   for (int i=0; i<10; i++) {
@@ -128,29 +128,28 @@ int8_t nr_ue_process_dlsch(module_id_t module_id,
   }
   if (ul_config->ul_config_list[ul_config->number_pdus].pdu_type == FAPI_NR_UL_CONFIG_TYPE_PUSCH) {
     // fill in the elements in config request inside P5 message
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.bandwidth_part_ind = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.number_rbs = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.start_rb = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.frame_offset = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.number_symbols = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.start_symbol = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.pusch_freq_hopping = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.mcs = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.ndi = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.rv = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.harq_process_nbr = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.accumulated_delta_PUSCH = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.absolute_delta_PUSCH = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.n_layers = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.tpmi = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.n_dmrs_cdm_groups = 0;
-    for (int i=0;i<4;i++) ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.dmrs_ports[i]=0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.n_front_load_symb = 0;
-    //ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.srs_config = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.csi_reportTriggerSize = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.maxCodeBlockGroupsPerTransportBlock = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.ptrs_dmrs_association_port = 0;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15.beta_offset_ind = 0;
+    //ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.bandwidth_part_ind = 0; //FIXME
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.rb_size = 0;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.rb_start = 0;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.nr_of_symbols = 0;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.start_symbol_index = 0;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.frequency_hopping = 0;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.mcs_index = 0;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.pusch_data.new_data_indicator = 0;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.pusch_data.rv_index = 0;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.pusch_data.harq_process_id = 0;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.absolute_delta_PUSCH = 0;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.nrOfLayers = 0;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.transform_precoding = 0;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.num_dmrs_cdm_grps_no_data = 0;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.dmrs_ports = 0;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.dmrs_config_type = 0;
+    //ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.n_front_load_symb = 0; //FIXME
+    //ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.srs_config = 0; //FIXME
+    //ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.csi_reportTriggerSize = 0; //FIXME
+    //ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.maxCodeBlockGroupsPerTransportBlock = 0; //FIXME
+    //ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.ptrs_dmrs_association_port = 0; FIXME
+    //ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.beta_offset_ind = 0; //FIXME
   } else { // If DCI ind is not format 0_0 or 0_1, we will handle a PUCCH in the UL_CONFIG_REQ
     ul_config->ul_config_list[ul_config->number_pdus].pdu_type = FAPI_NR_UL_CONFIG_TYPE_PUCCH;
     // If we handle PUCCH common
@@ -468,7 +467,6 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
   uint32_t number_of_search_space_per_slot=UINT_MAX;
   uint32_t first_symbol_index=UINT_MAX;
   uint32_t search_space_duration;  //  element of search space
-  uint32_t coreset_duration;  //  element of coreset
   //  38.213 table 10.1-1
 
   /// MUX PATTERN 1
@@ -604,8 +602,8 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
   }
 
   AssertFatal(number_of_search_space_per_slot!=UINT_MAX,"");
-  coreset_duration = num_symbols * number_of_search_space_per_slot;
   /*
+  uint32_t coreset_duration = num_symbols * number_of_search_space_per_slot;
     mac->type0_pdcch_dci_config.number_of_candidates[0] = table_38213_10_1_1_c2[0];
     mac->type0_pdcch_dci_config.number_of_candidates[1] = table_38213_10_1_1_c2[1];
     mac->type0_pdcch_dci_config.number_of_candidates[2] = table_38213_10_1_1_c2[2];   //  CCE aggregation level = 4
@@ -1669,7 +1667,7 @@ uint8_t table_7_3_2_3_3_4_twoCodeword[6][10] = {
   {2,0,1,2,3,6,7,8,0,2},
   {2,0,1,2,3,6,7,8,9,2}
 };
-int8_t nr_ue_process_dci_freq_dom_resource_assignment(fapi_nr_ul_config_pusch_pdu_rel15_t *ulsch_config_pdu,
+int8_t nr_ue_process_dci_freq_dom_resource_assignment(nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu,
 						      fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu,
 						      uint16_t n_RB_ULBWP,
 						      uint16_t n_RB_DLBWP,
@@ -1692,7 +1690,7 @@ int8_t nr_ue_process_dci_freq_dom_resource_assignment(fapi_nr_ul_config_pusch_pd
     dlsch_config_pdu->start_rb   = NRRIV2PRBOFFSET(riv,n_RB_DLBWP);
 
   }
-  if(ulsch_config_pdu != NULL){
+  if(pusch_config_pdu != NULL){
     /*
      * TS 38.214 subclause 6.1.2.2 Resource allocation in frequency domain (uplink)
      */
@@ -1703,14 +1701,14 @@ int8_t nr_ue_process_dci_freq_dom_resource_assignment(fapi_nr_ul_config_pusch_pd
      * TS 38.214 subclause 6.1.2.2.2 Uplink resource allocation type 1
      */
 
-    ulsch_config_pdu->number_rbs = NRRIV2BW(riv,n_RB_ULBWP);
-    ulsch_config_pdu->start_rb   = NRRIV2PRBOFFSET(riv,n_RB_ULBWP);
+    pusch_config_pdu->rb_size  = NRRIV2BW(riv,n_RB_ULBWP);
+    pusch_config_pdu->rb_start = NRRIV2PRBOFFSET(riv,n_RB_ULBWP);
   }
   return 0;
 }
 
 int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
-						      fapi_nr_ul_config_pusch_pdu_rel15_t *ulsch_config_pdu,
+						      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
 						      ){
@@ -1849,9 +1847,6 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
       SLIV2SL(startSymbolAndLength,&S,&L);
       dlsch_config_pdu->start_symbol=S;
       dlsch_config_pdu->number_symbols=L;
-      dlsch_config_pdu->frame_offset = pdsch_TimeDomainAllocationList->list.array[time_domain_ind]->k0!=NULL ?
-	*pdsch_TimeDomainAllocationList->list.array[time_domain_ind]->k0 : 
-	0;
     }
     else {// Default configuration from tables
       k_offset = table_5_1_2_1_1_2_time_dom_res_alloc_A[time_domain_ind-1][0];
@@ -1866,14 +1861,13 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
       // 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->frame_offset = k_offset;
       dlsch_config_pdu->number_symbols = sliv_L;
       dlsch_config_pdu->start_symbol = sliv_S;
     }
   }	/*
 	 * TS 38.214 subclause 6.1.2.1 Resource allocation in time domain (uplink)
 	 */
-  if(ulsch_config_pdu != NULL){
+  if(pusch_config_pdu != NULL){
     NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
     if (mac->ULbwp[0]->bwp_Dedicated->pusch_Config)
       pusch_TimeDomainAllocationList = mac->ULbwp[0]->bwp_Dedicated->pusch_Config->choice.setup->pusch_TimeDomainAllocationList->choice.setup;
@@ -1885,12 +1879,8 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
       int startSymbolAndLength = pusch_TimeDomainAllocationList->list.array[time_domain_ind]->startSymbolAndLength;
       int S,L;
       SLIV2SL(startSymbolAndLength,&S,&L);
-      ulsch_config_pdu->start_symbol=S;
-      ulsch_config_pdu->number_symbols=L;
-      ulsch_config_pdu->frame_offset = pusch_TimeDomainAllocationList->list.array[time_domain_ind]->k2!=NULL ?
-	*pusch_TimeDomainAllocationList->list.array[time_domain_ind]->k2 : 
-	 mac->ULbwp[0]->bwp_Common->genericParameters.subcarrierSpacing < NR_SubcarrierSpacing_kHz60 ? 1 :
-	mac->ULbwp[0]->bwp_Common->genericParameters.subcarrierSpacing < NR_SubcarrierSpacing_kHz120 ? 2 : 3;
+      pusch_config_pdu->start_symbol_index=S;
+      pusch_config_pdu->nr_of_symbols=L;
     }
     else {
       k_offset = table_6_1_2_1_1_2_time_dom_res_alloc_A[time_domain_ind-1][0];
@@ -1899,9 +1889,8 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
       // k_offset = table_6_1_2_1_1_3_time_dom_res_alloc_A_extCP[nr_pdci_info_extracted->time_dom_resource_assignment][0];
       // sliv_S   = table_6_1_2_1_1_3_time_dom_res_alloc_A_extCP[nr_pdci_info_extracted->time_dom_resource_assignment][1];
       // sliv_L   = table_6_1_2_1_1_3_time_dom_res_alloc_A_extCP[nr_pdci_info_extracted->time_dom_resource_assignment][2];
-      ulsch_config_pdu->frame_offset = k_offset;
-      ulsch_config_pdu->number_symbols = sliv_L;
-      ulsch_config_pdu->start_symbol = sliv_S;
+      pusch_config_pdu->nr_of_symbols = sliv_L;
+      pusch_config_pdu->start_symbol_index = sliv_S;
     }
   }
   return 0;
@@ -1954,45 +1943,41 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, nr
      *    50 SUL_IND_0_0:
      */
     ul_config->ul_config_list[ul_config->number_pdus].pdu_type = FAPI_NR_UL_CONFIG_TYPE_PUSCH;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.rnti = rnti;
-    fapi_nr_ul_config_pusch_pdu_rel15_t *ulsch_config_pdu_0_0 = &ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.rnti = rnti;
+    nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu_0_0 = &ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu;
     /* IDENTIFIER_DCI_FORMATS */
     /* FREQ_DOM_RESOURCE_ASSIGNMENT_UL */
-    nr_ue_process_dci_freq_dom_resource_assignment(ulsch_config_pdu_0_0,NULL,n_RB_ULBWP,0,dci->freq_dom_resource_assignment_UL);
+    nr_ue_process_dci_freq_dom_resource_assignment(pusch_config_pdu_0_0,NULL,n_RB_ULBWP,0,dci->freq_dom_resource_assignment_UL);
     /* TIME_DOM_RESOURCE_ASSIGNMENT */
     nr_ue_process_dci_time_dom_resource_assignment(mac,
-						   ulsch_config_pdu_0_0,NULL,
+						   pusch_config_pdu_0_0,NULL,
 						   dci->time_dom_resource_assignment);
 
     /* FREQ_HOPPING_FLAG */
     if ((mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.resource_allocation != 0) &&
 	(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.frequency_hopping !=0))
-      ulsch_config_pdu_0_0->pusch_freq_hopping = (dci->freq_hopping_flag == 0)? pusch_freq_hopping_disabled:pusch_freq_hopping_enabled;
+      pusch_config_pdu_0_0->frequency_hopping = dci->freq_hopping_flag;
     /* MCS */
-    ulsch_config_pdu_0_0->mcs = dci->mcs;
+    pusch_config_pdu_0_0->mcs_index = dci->mcs;
     /* NDI */
-    ulsch_config_pdu_0_0->ndi = dci->ndi;
+    pusch_config_pdu_0_0->pusch_data.new_data_indicator = dci->ndi;
     /* RV */
-    ulsch_config_pdu_0_0->rv = dci->rv;
+    pusch_config_pdu_0_0->pusch_data.rv_index = dci->rv;
     /* HARQ_PROCESS_NUMBER */
-    ulsch_config_pdu_0_0->harq_process_nbr = dci->harq_process_number;
+    pusch_config_pdu_0_0->pusch_data.harq_process_id = dci->harq_process_number;
     /* TPC_PUSCH */
     // according to TS 38.213 Table Table 7.1.1-1
     if (dci->tpc_pusch == 0) {
-      ulsch_config_pdu_0_0->accumulated_delta_PUSCH = -1;
-      ulsch_config_pdu_0_0->absolute_delta_PUSCH = -4;
+      pusch_config_pdu_0_0->absolute_delta_PUSCH = -4;
     }
     if (dci->tpc_pusch == 1) {
-      ulsch_config_pdu_0_0->accumulated_delta_PUSCH = 0;
-      ulsch_config_pdu_0_0->absolute_delta_PUSCH = -1;
+      pusch_config_pdu_0_0->absolute_delta_PUSCH = -1;
     }
     if (dci->tpc_pusch == 2) {
-      ulsch_config_pdu_0_0->accumulated_delta_PUSCH = 1;
-      ulsch_config_pdu_0_0->absolute_delta_PUSCH = 1;
+      pusch_config_pdu_0_0->absolute_delta_PUSCH = 1;
     }
     if (dci->tpc_pusch == 3) {
-      ulsch_config_pdu_0_0->accumulated_delta_PUSCH = 3;
-      ulsch_config_pdu_0_0->absolute_delta_PUSCH = 4;
+      pusch_config_pdu_0_0->absolute_delta_PUSCH = 4;
     }
     /* SUL_IND_0_0 */ // To be implemented, FIXME!!!
 
@@ -2029,49 +2014,45 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, nr
      *    49 PADDING_NR_DCI: (Note 2) If DCI format 0_0 is monitored in common search space
      */
     ul_config->ul_config_list[ul_config->number_pdus].pdu_type = FAPI_NR_UL_CONFIG_TYPE_PUSCH;
-    ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.rnti = rnti;
-    fapi_nr_ul_config_pusch_pdu_rel15_t *ulsch_config_pdu_0_1 = &ul_config->ul_config_list[ul_config->number_pdus].ulsch_config_pdu.ulsch_pdu_rel15;
+    ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu.rnti = rnti;
+    nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu_0_1 = &ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu;
     /* IDENTIFIER_DCI_FORMATS */
     /* CARRIER_IND */
     /* SUL_IND_0_1 */
     /* BANDWIDTH_PART_IND */
-    ulsch_config_pdu_0_1->bandwidth_part_ind = dci->bandwidth_part_ind;
+    //pusch_config_pdu_0_1->bandwidth_part_ind = dci->bandwidth_part_ind; //FIXME
     /* FREQ_DOM_RESOURCE_ASSIGNMENT_UL */
-    nr_ue_process_dci_freq_dom_resource_assignment(ulsch_config_pdu_0_1,NULL,n_RB_ULBWP,0,dci->freq_dom_resource_assignment_UL);
+    nr_ue_process_dci_freq_dom_resource_assignment(pusch_config_pdu_0_1,NULL,n_RB_ULBWP,0,dci->freq_dom_resource_assignment_UL);
     /* TIME_DOM_RESOURCE_ASSIGNMENT */
-    nr_ue_process_dci_time_dom_resource_assignment(mac,ulsch_config_pdu_0_1,NULL,
+    nr_ue_process_dci_time_dom_resource_assignment(mac,pusch_config_pdu_0_1,NULL,
 						   dci->time_dom_resource_assignment);
     /* FREQ_HOPPING_FLAG */
     if ((mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.resource_allocation != 0) &&
 	(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.frequency_hopping !=0))
-      ulsch_config_pdu_0_1->pusch_freq_hopping = (dci->freq_hopping_flag == 0)? pusch_freq_hopping_disabled:pusch_freq_hopping_enabled;
+      pusch_config_pdu_0_1->frequency_hopping = dci->freq_hopping_flag;
     /* MCS */
-    ulsch_config_pdu_0_1->mcs = dci->mcs;
+    pusch_config_pdu_0_1->mcs_index = dci->mcs;
     /* NDI */
-    ulsch_config_pdu_0_1->ndi = dci->ndi;
+    pusch_config_pdu_0_1->pusch_data.new_data_indicator = dci->ndi;
     /* RV */
-    ulsch_config_pdu_0_1->rv = dci->rv;
+    pusch_config_pdu_0_1->pusch_data.rv_index = dci->rv;
     /* HARQ_PROCESS_NUMBER */
-    ulsch_config_pdu_0_1->harq_process_nbr = dci->harq_process_number;
+    pusch_config_pdu_0_1->pusch_data.harq_process_id = dci->harq_process_number;
     /* FIRST_DAI */ //To be implemented, FIXME!!!
     /* SECOND_DAI */ //To be implemented, FIXME!!!
     /* TPC_PUSCH */
     // according to TS 38.213 Table Table 7.1.1-1
     if (dci->tpc_pusch == 0) {
-      ulsch_config_pdu_0_1->accumulated_delta_PUSCH = -1;
-      ulsch_config_pdu_0_1->absolute_delta_PUSCH = -4;
+      pusch_config_pdu_0_1->absolute_delta_PUSCH = -4;
     }
     if (dci->tpc_pusch == 1) {
-      ulsch_config_pdu_0_1->accumulated_delta_PUSCH = 0;
-      ulsch_config_pdu_0_1->absolute_delta_PUSCH = -1;
+      pusch_config_pdu_0_1->absolute_delta_PUSCH = -1;
     }
     if (dci->tpc_pusch == 2) {
-      ulsch_config_pdu_0_1->accumulated_delta_PUSCH = 1;
-      ulsch_config_pdu_0_1->absolute_delta_PUSCH = 1;
+      pusch_config_pdu_0_1->absolute_delta_PUSCH = 1;
     }
     if (dci->tpc_pusch == 3) {
-      ulsch_config_pdu_0_1->accumulated_delta_PUSCH = 3;
-      ulsch_config_pdu_0_1->absolute_delta_PUSCH = 4;
+      pusch_config_pdu_0_1->absolute_delta_PUSCH = 4;
     }
     /* SRS_RESOURCE_IND */
     //FIXME!!
@@ -2088,16 +2069,16 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, nr
 		(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.max_rank == 3) ||
 		(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.max_rank == 4))){
 	  if (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.codebook_subset == codebook_subset_fullyAndPartialAndNonCoherent) {
-	    ulsch_config_pdu_0_1->n_layers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][0];
-	    ulsch_config_pdu_0_1->tpmi     = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][1];
+	    pusch_config_pdu_0_1->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][0];
+	    pusch_config_pdu_0_1->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][1];
 	  }
 	  if (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.codebook_subset == codebook_subset_partialAndNonCoherent){
-	    ulsch_config_pdu_0_1->n_layers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][2];
-	    ulsch_config_pdu_0_1->tpmi     = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][3];
+	    pusch_config_pdu_0_1->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][2];
+	    pusch_config_pdu_0_1->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][3];
 	  }
 	  if (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.codebook_subset == codebook_subset_nonCoherent){
-	    ulsch_config_pdu_0_1->n_layers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][4];
-	    ulsch_config_pdu_0_1->tpmi     = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][5];
+	    pusch_config_pdu_0_1->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][4];
+	    pusch_config_pdu_0_1->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][5];
 	  }
 	}
 	// Table 7.3.1.1.2-3: transformPrecoder= enabled, or transformPrecoder=disabled and maxRank = 1
@@ -2105,16 +2086,16 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, nr
 	     || (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.transform_precoder == transform_precoder_disabled))
 	    && (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.max_rank == 1)){
 	  if (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.codebook_subset == codebook_subset_fullyAndPartialAndNonCoherent) {
-	    ulsch_config_pdu_0_1->n_layers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][6];
-	    ulsch_config_pdu_0_1->tpmi     = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][7];
+	    pusch_config_pdu_0_1->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][6];
+	    pusch_config_pdu_0_1->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][7];
 	  }
 	  if (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.codebook_subset == codebook_subset_partialAndNonCoherent){
-	    ulsch_config_pdu_0_1->n_layers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][8];
-	    ulsch_config_pdu_0_1->tpmi     = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][9];
+	    pusch_config_pdu_0_1->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][8];
+	    pusch_config_pdu_0_1->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][9];
 	  }
 	  if (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.codebook_subset == codebook_subset_nonCoherent){
-	    ulsch_config_pdu_0_1->n_layers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][10];
-	    ulsch_config_pdu_0_1->tpmi     = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][11];
+	    pusch_config_pdu_0_1->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][10];
+	    pusch_config_pdu_0_1->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][11];
 	  }
 	}
       }
@@ -2123,12 +2104,12 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, nr
 	if ((mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.transform_precoder == transform_precoder_disabled)
 	    && (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.max_rank == 2)){
 	  if (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.codebook_subset == codebook_subset_fullyAndPartialAndNonCoherent) {
-	    ulsch_config_pdu_0_1->n_layers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][12];
-	    ulsch_config_pdu_0_1->tpmi     = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][13];
+	    pusch_config_pdu_0_1->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][12];
+	    pusch_config_pdu_0_1->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][13];
 	  }
 	  if (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.codebook_subset == codebook_subset_nonCoherent){
-	    ulsch_config_pdu_0_1->n_layers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][14];
-	    ulsch_config_pdu_0_1->tpmi     = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][15];
+	    pusch_config_pdu_0_1->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][14];
+	    pusch_config_pdu_0_1->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][15];
 	  }
 	}
 	// Table 7.3.1.1.2-5: transformPrecoder= enabled, or transformPrecoder= disabled and maxRank = 1
@@ -2136,12 +2117,12 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, nr
 	     || (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.transform_precoder == transform_precoder_disabled))
 	    && (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.max_rank == 1)){
 	  if (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.codebook_subset == codebook_subset_fullyAndPartialAndNonCoherent) {
-	    ulsch_config_pdu_0_1->n_layers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][16];
-	    ulsch_config_pdu_0_1->tpmi     = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][17];
+	    pusch_config_pdu_0_1->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][16];
+	    pusch_config_pdu_0_1->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][17];
 	  }
 	  if (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.codebook_subset == codebook_subset_nonCoherent){
-	    ulsch_config_pdu_0_1->n_layers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][18];
-	    ulsch_config_pdu_0_1->tpmi     = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][19];
+	    pusch_config_pdu_0_1->nrOfLayers = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][18];
+	    pusch_config_pdu_0_1->transform_precoding = table_7_3_1_1_2_2_3_4_5[dci->precod_nbr_layers][19];
 	  }
 	}
       }
@@ -2151,146 +2132,158 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, nr
     if ((mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.transform_precoder == transform_precoder_enabled) &&
 	(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.dmrs_ul_for_pusch_mapping_type_a.dmrs_type == 1) &&
 	(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.dmrs_ul_for_pusch_mapping_type_a.max_length == 1)) { // tables 7.3.1.1.2-6
-      ulsch_config_pdu_0_1->n_dmrs_cdm_groups = 2;
-      ulsch_config_pdu_0_1->dmrs_ports[0] = dci->antenna_ports;
+      pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = 2; //TBC
+      pusch_config_pdu_0_1->dmrs_ports = dci->antenna_ports; //TBC
     }
     if ((mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.transform_precoder == transform_precoder_enabled) &&
 	(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.dmrs_ul_for_pusch_mapping_type_a.dmrs_type == 1) &&
 	(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.dmrs_ul_for_pusch_mapping_type_a.max_length == 2)) { // tables 7.3.1.1.2-7
-      ulsch_config_pdu_0_1->n_dmrs_cdm_groups = 2;
-      ulsch_config_pdu_0_1->dmrs_ports[0] = (dci->antenna_ports > 3)?(dci->antenna_ports-4):(dci->antenna_ports);
-      ulsch_config_pdu_0_1->n_front_load_symb = (dci->antenna_ports > 3)?2:1;
+      pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = 2; //TBC
+      pusch_config_pdu_0_1->dmrs_ports = (dci->antenna_ports > 3)?(dci->antenna_ports-4):(dci->antenna_ports); //TBC
+      //pusch_config_pdu_0_1->n_front_load_symb = (dci->antenna_ports > 3)?2:1; //FIXME
     }
     if ((mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.transform_precoder == transform_precoder_disabled) &&
 	(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.dmrs_ul_for_pusch_mapping_type_a.dmrs_type == 1) &&
 	(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.dmrs_ul_for_pusch_mapping_type_a.max_length == 1)) { // tables 7.3.1.1.2-8/9/10/11
       if (rank == 1){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = (dci->antenna_ports > 1)?2:1;
-	ulsch_config_pdu_0_1->dmrs_ports[0] = (dci->antenna_ports > 1)?(dci->antenna_ports-2):(dci->antenna_ports);
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = (dci->antenna_ports > 1)?2:1; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = (dci->antenna_ports > 1)?(dci->antenna_ports-2):(dci->antenna_ports); //TBC
       }
       if (rank == 2){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = (dci->antenna_ports > 0)?2:1;
-	ulsch_config_pdu_0_1->dmrs_ports[0] = (dci->antenna_ports > 1)?(dci->antenna_ports > 2 ?0:2):0;
-	ulsch_config_pdu_0_1->dmrs_ports[1] = (dci->antenna_ports > 1)?(dci->antenna_ports > 2 ?2:3):1;
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = (dci->antenna_ports > 0)?2:1; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = 0; //FIXME
+	//pusch_config_pdu_0_1->dmrs_ports[0] = (dci->antenna_ports > 1)?(dci->antenna_ports > 2 ?0:2):0;
+	//pusch_config_pdu_0_1->dmrs_ports[1] = (dci->antenna_ports > 1)?(dci->antenna_ports > 2 ?2:3):1;
       }
       if (rank == 3){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = 2;
-	ulsch_config_pdu_0_1->dmrs_ports[0] = 0;
-	ulsch_config_pdu_0_1->dmrs_ports[1] = 1;
-	ulsch_config_pdu_0_1->dmrs_ports[2] = 2;
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = 2; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = 0; //FIXME
+	//pusch_config_pdu_0_1->dmrs_ports[0] = 0;
+	//pusch_config_pdu_0_1->dmrs_ports[1] = 1;
+	//pusch_config_pdu_0_1->dmrs_ports[2] = 2;
       }
       if (rank == 4){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = 2;
-	ulsch_config_pdu_0_1->dmrs_ports[0] = 0;
-	ulsch_config_pdu_0_1->dmrs_ports[1] = 1;
-	ulsch_config_pdu_0_1->dmrs_ports[2] = 2;
-	ulsch_config_pdu_0_1->dmrs_ports[3] = 3;
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = 2; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = 0; //FIXME
+	//pusch_config_pdu_0_1->dmrs_ports[0] = 0;
+	//pusch_config_pdu_0_1->dmrs_ports[1] = 1;
+	//pusch_config_pdu_0_1->dmrs_ports[2] = 2;
+	//pusch_config_pdu_0_1->dmrs_ports[3] = 3;
       }
     }
     if ((mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.transform_precoder == transform_precoder_disabled) &&
 	(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.dmrs_ul_for_pusch_mapping_type_a.dmrs_type == 1) &&
 	(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.dmrs_ul_for_pusch_mapping_type_a.max_length == 2)) { // tables 7.3.1.1.2-12/13/14/15
       if (rank == 1){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = (dci->antenna_ports > 1)?2:1;
-	ulsch_config_pdu_0_1->dmrs_ports[0] = (dci->antenna_ports > 1)?(dci->antenna_ports > 5 ?(dci->antenna_ports-6):(dci->antenna_ports-2)):dci->antenna_ports;
-	ulsch_config_pdu_0_1->n_front_load_symb = (dci->antenna_ports > 6)?2:1;
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = (dci->antenna_ports > 1)?2:1; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = (dci->antenna_ports > 1)?(dci->antenna_ports > 5 ?(dci->antenna_ports-6):(dci->antenna_ports-2)):dci->antenna_ports; //TBC
+	//pusch_config_pdu_0_1->n_front_load_symb = (dci->antenna_ports > 6)?2:1; //FIXME
       }
       if (rank == 2){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = (dci->antenna_ports > 0)?2:1;
-	ulsch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_13[dci->antenna_ports][1];
-	ulsch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_13[dci->antenna_ports][2];
-	ulsch_config_pdu_0_1->n_front_load_symb = (dci->antenna_ports > 3)?2:1;
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = (dci->antenna_ports > 0)?2:1; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = 0; //FIXME
+	//pusch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_13[dci->antenna_ports][1];
+	//pusch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_13[dci->antenna_ports][2];
+	//pusch_config_pdu_0_1->n_front_load_symb = (dci->antenna_ports > 3)?2:1; // FIXME
       }
       if (rank == 3){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = 2;
-	ulsch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_14[dci->antenna_ports][1];
-	ulsch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_14[dci->antenna_ports][2];
-	ulsch_config_pdu_0_1->dmrs_ports[2] = table_7_3_1_1_2_14[dci->antenna_ports][3];
-	ulsch_config_pdu_0_1->n_front_load_symb = (dci->antenna_ports > 1)?2:1;
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = 2; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = 0; //FIXME
+	//pusch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_14[dci->antenna_ports][1];
+	//pusch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_14[dci->antenna_ports][2];
+	//pusch_config_pdu_0_1->dmrs_ports[2] = table_7_3_1_1_2_14[dci->antenna_ports][3];
+	//pusch_config_pdu_0_1->n_front_load_symb = (dci->antenna_ports > 1)?2:1; //FIXME
       }
       if (rank == 4){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = 2;
-	ulsch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_15[dci->antenna_ports][1];
-	ulsch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_15[dci->antenna_ports][2];
-	ulsch_config_pdu_0_1->dmrs_ports[2] = table_7_3_1_1_2_15[dci->antenna_ports][3];
-	ulsch_config_pdu_0_1->dmrs_ports[3] = table_7_3_1_1_2_15[dci->antenna_ports][4];
-	ulsch_config_pdu_0_1->n_front_load_symb = (dci->antenna_ports > 1)?2:1;
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = 2; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = 0; //FIXME
+	//pusch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_15[dci->antenna_ports][1];
+	//pusch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_15[dci->antenna_ports][2];
+	//pusch_config_pdu_0_1->dmrs_ports[2] = table_7_3_1_1_2_15[dci->antenna_ports][3];
+	//pusch_config_pdu_0_1->dmrs_ports[3] = table_7_3_1_1_2_15[dci->antenna_ports][4];
+	//pusch_config_pdu_0_1->n_front_load_symb = (dci->antenna_ports > 1)?2:1; //FIXME
       }
     }
     if ((mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.transform_precoder == transform_precoder_disabled) &&
 	(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.dmrs_ul_for_pusch_mapping_type_a.dmrs_type == 2) &&
 	(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.dmrs_ul_for_pusch_mapping_type_a.max_length == 1)) { // tables 7.3.1.1.2-16/17/18/19
       if (rank == 1){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = (dci->antenna_ports > 1)?((dci->antenna_ports > 5)?3:2):1;
-	ulsch_config_pdu_0_1->dmrs_ports[0] = (dci->antenna_ports > 1)?(dci->antenna_ports > 5 ?(dci->antenna_ports-6):(dci->antenna_ports-2)):dci->antenna_ports;
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = (dci->antenna_ports > 1)?((dci->antenna_ports > 5)?3:2):1; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = (dci->antenna_ports > 1)?(dci->antenna_ports > 5 ?(dci->antenna_ports-6):(dci->antenna_ports-2)):dci->antenna_ports; //TBC
       }
       if (rank == 2){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = (dci->antenna_ports > 0)?((dci->antenna_ports > 2)?3:2):1;
-	ulsch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_17[dci->antenna_ports][1];
-	ulsch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_17[dci->antenna_ports][2];
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = (dci->antenna_ports > 0)?((dci->antenna_ports > 2)?3:2):1; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = 0; //FIXME
+	//pusch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_17[dci->antenna_ports][1];
+	//pusch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_17[dci->antenna_ports][2];
       }
       if (rank == 3){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = (dci->antenna_ports > 0)?3:2;
-	ulsch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_18[dci->antenna_ports][1];
-	ulsch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_18[dci->antenna_ports][2];
-	ulsch_config_pdu_0_1->dmrs_ports[2] = table_7_3_1_1_2_18[dci->antenna_ports][3];
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = (dci->antenna_ports > 0)?3:2; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = 0; //FIXME
+	//pusch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_18[dci->antenna_ports][1];
+	//pusch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_18[dci->antenna_ports][2];
+	//pusch_config_pdu_0_1->dmrs_ports[2] = table_7_3_1_1_2_18[dci->antenna_ports][3];
       }
       if (rank == 4){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = dci->antenna_ports + 2;
-	ulsch_config_pdu_0_1->dmrs_ports[0] = 0;
-	ulsch_config_pdu_0_1->dmrs_ports[1] = 1;
-	ulsch_config_pdu_0_1->dmrs_ports[2] = 2;
-	ulsch_config_pdu_0_1->dmrs_ports[3] = 3;
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = dci->antenna_ports + 2; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = 0; //FIXME
+	//pusch_config_pdu_0_1->dmrs_ports[0] = 0;
+	//pusch_config_pdu_0_1->dmrs_ports[1] = 1;
+	//pusch_config_pdu_0_1->dmrs_ports[2] = 2;
+	//pusch_config_pdu_0_1->dmrs_ports[3] = 3;
       }
     }
     if ((mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.transform_precoder == transform_precoder_disabled) &&
 	(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.dmrs_ul_for_pusch_mapping_type_a.dmrs_type == 2) &&
 	(mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.dmrs_ul_for_pusch_mapping_type_a.max_length == 2)) { // tables 7.3.1.1.2-20/21/22/23
       if (rank == 1){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = table_7_3_1_1_2_20[dci->antenna_ports][0];
-	ulsch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_20[dci->antenna_ports][1];
-	ulsch_config_pdu_0_1->n_front_load_symb = table_7_3_1_1_2_20[dci->antenna_ports][2];
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = table_7_3_1_1_2_20[dci->antenna_ports][0]; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = table_7_3_1_1_2_20[dci->antenna_ports][1]; //TBC
+	//pusch_config_pdu_0_1->n_front_load_symb = table_7_3_1_1_2_20[dci->antenna_ports][2]; //FIXME
       }
       if (rank == 2){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = table_7_3_1_1_2_21[dci->antenna_ports][0];
-	ulsch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_21[dci->antenna_ports][1];
-	ulsch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_21[dci->antenna_ports][2];
-	ulsch_config_pdu_0_1->n_front_load_symb = table_7_3_1_1_2_21[dci->antenna_ports][3];
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = table_7_3_1_1_2_21[dci->antenna_ports][0]; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = 0; //FIXME
+	//pusch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_21[dci->antenna_ports][1];
+	//pusch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_21[dci->antenna_ports][2];
+	//pusch_config_pdu_0_1->n_front_load_symb = table_7_3_1_1_2_21[dci->antenna_ports][3]; //FIXME
       }
       if (rank == 3){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = table_7_3_1_1_2_22[dci->antenna_ports][0];
-	ulsch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_22[dci->antenna_ports][1];
-	ulsch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_22[dci->antenna_ports][2];
-	ulsch_config_pdu_0_1->dmrs_ports[2] = table_7_3_1_1_2_22[dci->antenna_ports][3];
-	ulsch_config_pdu_0_1->n_front_load_symb = table_7_3_1_1_2_22[dci->antenna_ports][4];
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = table_7_3_1_1_2_22[dci->antenna_ports][0]; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = 0; //FIXME
+	//pusch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_22[dci->antenna_ports][1];
+	//pusch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_22[dci->antenna_ports][2];
+	//pusch_config_pdu_0_1->dmrs_ports[2] = table_7_3_1_1_2_22[dci->antenna_ports][3];
+	//pusch_config_pdu_0_1->n_front_load_symb = table_7_3_1_1_2_22[dci->antenna_ports][4]; //FIXME
       }
       if (rank == 4){
-	ulsch_config_pdu_0_1->n_dmrs_cdm_groups = table_7_3_1_1_2_23[dci->antenna_ports][0];
-	ulsch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_23[dci->antenna_ports][1];
-	ulsch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_23[dci->antenna_ports][2];
-	ulsch_config_pdu_0_1->dmrs_ports[2] = table_7_3_1_1_2_23[dci->antenna_ports][3];
-	ulsch_config_pdu_0_1->dmrs_ports[3] = table_7_3_1_1_2_23[dci->antenna_ports][4];
-	ulsch_config_pdu_0_1->n_front_load_symb = table_7_3_1_1_2_23[dci->antenna_ports][5];
+	pusch_config_pdu_0_1->num_dmrs_cdm_grps_no_data = table_7_3_1_1_2_23[dci->antenna_ports][0]; //TBC
+	pusch_config_pdu_0_1->dmrs_ports = 0; //FIXME
+	//pusch_config_pdu_0_1->dmrs_ports[0] = table_7_3_1_1_2_23[dci->antenna_ports][1];
+	//pusch_config_pdu_0_1->dmrs_ports[1] = table_7_3_1_1_2_23[dci->antenna_ports][2];
+	//pusch_config_pdu_0_1->dmrs_ports[2] = table_7_3_1_1_2_23[dci->antenna_ports][3];
+	//pusch_config_pdu_0_1->dmrs_ports[3] = table_7_3_1_1_2_23[dci->antenna_ports][4];
+	//pusch_config_pdu_0_1->n_front_load_symb = table_7_3_1_1_2_23[dci->antenna_ports][5]; //FIXME
       }
     }
     /* SRS_REQUEST */
     // if SUL is supported in the cell, there is an additional bit in thsi field and the value of this bit represents table 7.1.1.1-1 TS 38.212 FIXME!!!
-    ulsch_config_pdu_0_1->srs_config.aperiodicSRS_ResourceTrigger = (dci->srs_request & 0x11); // as per Table 7.3.1.1.2-24 TS 38.212
+    //pusch_config_pdu_0_1->srs_config.aperiodicSRS_ResourceTrigger = (dci->srs_request & 0x11); // as per Table 7.3.1.1.2-24 TS 38.212 //FIXME
     /* CSI_REQUEST */
-    ulsch_config_pdu_0_1->csi_reportTriggerSize = dci->csi_request;
+    //pusch_config_pdu_0_1->csi_reportTriggerSize = dci->csi_request; //FIXME
     /* CBGTI */
-    ulsch_config_pdu_0_1->maxCodeBlockGroupsPerTransportBlock = dci->cbgti;
+    //pusch_config_pdu_0_1->maxCodeBlockGroupsPerTransportBlock = dci->cbgti; //FIXME
     /* PTRS_DMRS */
     if (((mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.transform_precoder == transform_precoder_disabled) &&
 	 (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.dmrs_ul_for_pusch_mapping_type_a.ptrs_uplink_config == 0)) ||
 	((mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.transform_precoder == transform_precoder_enabled) &&
 	 (mac->phy_config.config_req.ul_bwp_dedicated.pusch_config_dedicated.max_rank == 1))){
     } else {
-      ulsch_config_pdu_0_1->ptrs_dmrs_association_port = dci->ptrs_dmrs;
+      //pusch_config_pdu_0_1->ptrs_dmrs_association_port = dci->ptrs_dmrs; //FIXME
     }
     /* BETA_OFFSET_IND */
     // Table 9.3-3 in [5, TS 38.213]
-    ulsch_config_pdu_0_1->beta_offset_ind = dci->beta_offset_ind;
+    //pusch_config_pdu_0_1->beta_offset_ind = dci->beta_offset_ind; //FIXME
     /* DMRS_SEQ_INI */
     // FIXME!!
     /* UL_SCH_IND */
@@ -2677,7 +2670,6 @@ void nr_ue_send_sdu(module_id_t module_idP,
   LOG_D(MAC, "Handling PDU frame %d slot %d\n", frameP, slotP);
 
   uint8_t * pduP = pdu;
-  NR_UE_MAC_INST_t *UE_mac_inst = get_mac_inst(module_idP);
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_IN);
 
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index 7c3a9e758467f1c4a8eafdf9b81c6fb9a1799159..8c8b0b9b43888f53d9a3cf2930e194a2d24f0c71 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -375,7 +375,6 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
   int CC_id, UE_id = 0;
   gNB_MAC_INST *gNB = RC.nrmac[module_idP];
   NR_UE_list_t *UE_list = &gNB->UE_list;
-  UE_sched_ctrl_t *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
   NR_COMMON_channels_t *cc = gNB->common_channels;
   NR_sched_pucch *pucch_sched = (NR_sched_pucch*) malloc(sizeof(NR_sched_pucch));
 
@@ -423,7 +422,9 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
   }
 
   // TbD once RACH is available, start ta_timer when UE is connected
-  if (ue_sched_ctl->ta_timer) ue_sched_ctl->ta_timer--;
+#if 0
+   NR_UE_sched_ctrl_t *ue_sched_ctl = &UE_list->UE_sched_ctrl[UE_id];
+   if (ue_sched_ctl->ta_timer) ue_sched_ctl->ta_timer--;
 
   if (ue_sched_ctl->ta_timer == 0) {
     gNB->ta_command = ue_sched_ctl->ta_update;
@@ -435,6 +436,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
     /* MAC CE flag indicating TA length */
     gNB->ta_len = 2;
   }
+#endif
 
   // Phytest scheduling
   if (get_softmodem_params()->phy_test && slot_txP==1){
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index 198ba63e445bbf7805fb685dc16d272928a5e42e..050f07ba6708947302f16f7462c0947c0bd5d38b 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -760,14 +760,6 @@ void nr_schedule_uss_ulsch_phytest(int Mod_idP,
   pusch_pdu->transform_precoding = 0;
   pusch_pdu->data_scrambling_id = 0; //It equals the higher-layer parameter Data-scrambling-Identity if configured and the RNTI equals the C-RNTI, otherwise L2 needs to set it to physical cell id.;
   pusch_pdu->nrOfLayers = 1;
-  //DMRS
-  pusch_pdu->ul_dmrs_symb_pos = 1<<2; //for now the gnb assumes dmrs in the first symbol of the scheduled pusch resource
-  pusch_pdu->dmrs_config_type = 0;  //dmrs-type 1 (the one with a single DMRS symbol in the beginning)
-  pusch_pdu->ul_dmrs_scrambling_id =  0; //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->num_dmrs_cdm_grps_no_data;
-  //pusch_pdu->dmrs_ports; //DMRS ports. [TS38.212 7.3.1.1.2] provides description between DCI 0-1 content and DMRS ports. Bitmap occupying the 11 LSBs with: bit 0: antenna port 1000 bit 11: antenna port 1011 and for each bit 0: DMRS port not used 1: DMRS port used
-  //Pusch Allocation in frequency domain [TS38.214, sec 6.1.2.2]
   pusch_pdu->resource_alloc = 1; //type 1
   //pusch_pdu->rb_bitmap;// for ressource alloc type 0
   pusch_pdu->rb_start = 0;
@@ -779,6 +771,40 @@ void nr_schedule_uss_ulsch_phytest(int Mod_idP,
   //Resource Allocation in time domain
   pusch_pdu->start_symbol_index = 2;
   pusch_pdu->nr_of_symbols = 12;
+
+  // --------------------
+  // ------- DMRS -------
+  // --------------------
+  uint16_t l_prime_mask            = get_l_prime(pusch_pdu->nr_of_symbols, typeB, pusch_dmrs_pos0, pusch_len1);
+  pusch_pdu->ul_dmrs_symb_pos      = l_prime_mask << pusch_pdu->start_symbol_index;
+  pusch_pdu->dmrs_config_type      = 0;      // dmrs-type 1 (the one with a single DMRS symbol in the beginning)
+  pusch_pdu->ul_dmrs_scrambling_id = 0;      // 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->num_dmrs_cdm_grps_no_data;
+  //pusch_pdu->dmrs_ports; // DMRS ports. [TS38.212 7.3.1.1.2] provides description between DCI 0-1 content and DMRS ports
+                           // Bitmap occupying the 11 LSBs with: bit 0: antenna port 1000 bit 11: antenna port 1011,
+                           // and for each bit 0: DMRS port not used 1: DMRS port used
+  // --------------------------------------------------------------------------------------------------------------------------------------------
+
+  // --------------------
+  // ------- PTRS -------
+  // --------------------
+  uint8_t ptrs_mcs1 = 2;  // higher layer parameter in PTRS-UplinkConfig
+  uint8_t ptrs_mcs2 = 4;  // higher layer parameter in PTRS-UplinkConfig
+  uint8_t ptrs_mcs3 = 10; // higher layer parameter in PTRS-UplinkConfig
+  uint16_t n_rb0 = 25;    // higher layer parameter in PTRS-UplinkConfig
+  uint16_t n_rb1 = 75;    // higher layer parameter in PTRS-UplinkConfig
+  pusch_pdu->pusch_ptrs.ptrs_time_density = get_L_ptrs(ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, pusch_pdu->mcs_index, pusch_pdu->mcs_table);
+  pusch_pdu->pusch_ptrs.ptrs_freq_density = get_K_ptrs(n_rb0, n_rb1, pusch_pdu->rb_size);
+  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(1<<pusch_pdu->pusch_ptrs.ptrs_time_density >= pusch_pdu->nr_of_symbols)
+    pusch_pdu->pdu_bit_map &= ~PUSCH_PDU_BITMAP_PUSCH_PTRS; // disable PUSCH PTRS
+  // --------------------------------------------------------------------------------------------------------------------------------------------
+
+  //Pusch Allocation in frequency domain [TS38.214, sec 6.1.2.2]
   //Optional Data only included if indicated in pduBitmap
   pusch_pdu->pusch_data.rv_index = 0;
   pusch_pdu->pusch_data.harq_process_id = 0;
@@ -787,7 +813,7 @@ void nr_schedule_uss_ulsch_phytest(int Mod_idP,
 						 pusch_pdu->target_code_rate,
 						 pusch_pdu->rb_size,
 						 pusch_pdu->nr_of_symbols,
-						 6, //nb_re_dmrs - not sure where this is coming from - its not in the FAPI
+						 pusch_pdu->dmrs_config_type?4:6, //nb_re_dmrs - not sure where this is coming from - its not in the FAPI
 						 0, //nb_rb_oh
 						 pusch_pdu->nrOfLayers)>>3;
   pusch_pdu->pusch_data.num_cb = 0; //CBG not supported
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index 2fcccd682b3dbd1c6724d79be0fdb3f5ef218098..eb8d33894931281040a2577dd1331eb544a382b7 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -245,7 +245,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
   int current_rnti = 0, UE_id = -1, harq_pid = 0;
   gNB_MAC_INST *gNB_mac = NULL;
   NR_UE_list_t *UE_list = NULL;
-  UE_sched_ctrl_t *UE_scheduling_control = NULL;
+  NR_UE_sched_ctrl_t *UE_scheduling_control = NULL;
 
   current_rnti = rntiP;
   UE_id = find_nr_UE_id(gnb_mod_idP, current_rnti);
@@ -255,13 +255,12 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
   if (UE_id != -1) {
     UE_scheduling_control = &(UE_list->UE_sched_ctrl[UE_id]);
 
-    LOG_D(MAC, "[gNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH sdu round %d from PHY (rnti %x, UE_id %d) ul_cqi %d\n",
+    LOG_D(MAC, "[gNB %d][PUSCH %d] CC_id %d %d.%d Received ULSCH sdu from PHY (rnti %x, UE_id %d) ul_cqi %d\n",
           gnb_mod_idP,
           harq_pid,
           CC_idP,
           frameP,
           slotP,
-          UE_scheduling_control->round_UL[CC_idP][harq_pid],
           current_rnti,
           UE_id,
           ul_cqi);
@@ -277,7 +276,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
 #endif
 
     if (sduP != NULL){
-      UE_scheduling_control->ta_update = timing_advance;
+      //UE_scheduling_control->ta_update = timing_advance;
       LOG_D(MAC, "Received PDU at MAC gNB \n");
       nr_process_mac_pdu(gnb_mod_idP, CC_idP, frameP, sduP, sdu_lenP);
     }
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index e294d118d92b8c84cb1da8b4a4b79174823a93b9..c0f4053c03dc38564aaf132b1527377676175491 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -183,6 +183,11 @@ int find_nr_UE_id(module_id_t mod_idP, rnti_t rntiP);
 int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP);
 
 int get_num_dmrs(uint16_t dmrs_mask );
+uint8_t get_l0_ul(uint8_t mapping_type, uint8_t dmrs_typeA_position);
+int32_t get_l_prime(uint8_t duration_in_symbols, uint8_t mapping_type, pusch_dmrs_AdditionalPosition_t additional_pos, pusch_maxLength_t pusch_maxLength);
+
+uint8_t get_L_ptrs(uint8_t mcs1, uint8_t mcs2, uint8_t mcs3, uint8_t I_mcs, uint8_t mcs_table);
+uint8_t get_K_ptrs(uint16_t nrb0, uint16_t nrb1, uint16_t N_RB);
 
 uint16_t nr_dci_size(nr_dci_format_t format,
                          nr_rnti_type_t rnti_type,
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index 86dac1e11fcd6d5efb824bc05ac2327cb7a70e70..bf9358dd436a18cdd364c03a26d3f2d87437a289 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -116,6 +116,8 @@ typedef struct {
   uint64_t dlsch_in_slot_bitmap;  // static bitmap signaling which slot in a tdd period contains dlsch
   uint64_t ulsch_in_slot_bitmap;  // static bitmap signaling which slot in a tdd period contains ulsch
   NR_sched_pucch *sched_pucch;
+  uint16_t ta_timer;
+  int16_t ta_update;
 } NR_UE_sched_ctrl_t;
 
 /*! \brief UE list used by eNB to order UEs/CC for scheduling*/
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h
deleted file mode 100644
index b9f62acc3c96b91eb14b462196eeb7d18e2a1607..0000000000000000000000000000000000000000
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_proto_extern.h
+++ /dev/null
@@ -1,70 +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
- */
-
-/*
-                             pdcp_proto_extern.h
-                             -------------------
-  AUTHOR  : Lionel GAUTHIER
-  COMPANY : EURECOM
-  EMAIL   : Lionel.Gauthier@eurecom.fr
-
- ***************************************************************************/
-#ifndef __PDCP_PROTO_EXTERN_H__
-#    define __PDCP_PROTO_EXTERN_H__
-
-//#    include "pdcp_entity.h"
-//#    include "rb_mux.h"
-#    include "mem_block.h"
-
-#ifdef ROHC
-extern void     pdcp_data_ind (module_id_t module_idP, rb_id_t rab_idP, sdu_size_t data_sizeP, mem_block_t *sduP);
-extern void     pdcp_data_req (struct pdcp_entity *pdcpP, mem_block *sduP);
-extern void     send_pdcp_control_primitive (struct pdcp_entity *pdcpP, mem_block *cprimitiveP);
-extern void     control_pdcp (struct pdcp_entity *pdcpP);
-extern void pdcp_process_input_sdus_high(struct pdcp_entity *pdcpP);
-extern void     pdcp_process_input_sdus_am (struct pdcp_entity *pdcpP, uint16_t data_sizeP, mem_block *sduP);
-extern void     pdcp_process_output_sdus (struct pdcp_entity *pdcpP, mem_block *sduP, uint8_t rb_idP);
-extern void   pdcp_process_output_sdus_high (struct pdcp_entity *pdcpP, mem_block *sduP, uint16_t data_sizeP,  uint16_t rb_idP);
-extern void     pdcp_process_input_sdus_um (struct pdcp_entity *pdcpP, uint16_t data_sizeP, mem_block *sduP);
-extern void     pdcp_process_input_sdus_tr (struct pdcp_entity *pdcpP, uint16_t data_sizeP, mem_block *sduP);
-extern void     init_pdcp (struct pdcp_entity *pdcpP, struct rb_dispatcher *rbP, uint8_t rb_idP);
-extern void    *pdcp_tx (struct pdcp_entity *pdcpP, uint16_t data_sizeP, mem_block *sduP);
-extern int  reception_from_rohc_mt(void);
-extern int  reception_from_rohc_bs(void);
-#else
-extern BOOL     pdcp_data_ind (module_id_t module_idP, rb_id_t rab_idP, sdu_size_t data_sizeP, mem_block_t *sduP, uint8_t is_data_plane);
-extern BOOL     pdcp_data_req (module_id_t module_id, uint32_t frame, uint8_t eNB_flag, rb_id_t rab_id, uint32_t muiP, uint32_t confirmP, sdu_size_t sdu_buffer_size, unsigned char *sdu_buffer,
-                               uint8_t is_data_pdu,const uint32_t *const sourceL2Id,const uint32_t *const destinationL2Id
-                              );
-//extern BOOL     pdcp_data_req (struct pdcp_entity *pdcpP, mem_block * sduP);
-extern void     send_pdcp_control_primitive (struct pdcp_entity *pdcpP, mem_block *cprimitiveP);
-extern void     control_pdcp (struct pdcp_entity *pdcpP);
-extern void     pdcp_process_input_sdus_am (struct pdcp_entity *pdcpP);
-extern void     pdcp_process_output_sdus (struct pdcp_entity *pdcpP, mem_block *sduP, uint8_t rb_idP);
-extern void     pdcp_process_input_sdus_um (struct pdcp_entity *pdcpP);
-extern void     pdcp_process_input_sdus_tr (struct pdcp_entity *pdcpP);
-extern void     init_pdcp (struct pdcp_entity *pdcpP, struct rb_dispatcher *rbP, uint8_t rb_idP);
-extern void    *pdcp_tx (void *argP);
-#endif
-
-extern void pdcp_pc5_socket_init(void);
-
-#endif
diff --git a/openair2/LAYER2/rlc_v2/rlc_entity_um.c b/openair2/LAYER2/rlc_v2/rlc_entity_um.c
index f0fe33789b4fecc1f5673edf30355422568c4460..54707875a0b25f7c91086131f4515d75dea9f5c9 100644
--- a/openair2/LAYER2/rlc_v2/rlc_entity_um.c
+++ b/openair2/LAYER2/rlc_v2/rlc_entity_um.c
@@ -360,6 +360,7 @@ static tx_pdu_size_t tx_pdu_size(rlc_entity_um_t *entity, int maxsize)
   ret.data_size = 0;
   ret.header_size = 0;
   ret.last_sdu_is_full = 1;
+  ret.first_sdu_length = 0;
 
   /* TX PDU - let's make the biggest PDU we can with the SDUs we have */
   sdu_count = 0;
diff --git a/openair2/LAYER2/rlc_v2/rlc_oai_api.c b/openair2/LAYER2/rlc_v2/rlc_oai_api.c
index c81cc6ff5ebc47b2d40e3116a2d405858f214f61..bd3eebe6355f487690178f08f31246627b444438 100644
--- a/openair2/LAYER2/rlc_v2/rlc_oai_api.c
+++ b/openair2/LAYER2/rlc_v2/rlc_oai_api.c
@@ -134,7 +134,10 @@ tbs_size_t mac_rlc_data_req(
   }
 
   if (MBMS_flagP == MBMS_FLAG_YES) {
-    rb = ue->drb[channel_idP - 1];
+    if (channel_idP >= 1 && channel_idP <= 5)
+      rb = ue->drb[channel_idP - 1];
+    else
+      rb = NULL;
   }
 
 
@@ -192,7 +195,10 @@ mac_rlc_status_resp_t mac_rlc_status_ind(
   }
 
   if (MBMS_flagP == MBMS_FLAG_YES) {
-    rb = ue->drb[channel_idP - 1];
+    if (channel_idP >= 1 && channel_idP <= 5)
+      rb = ue->drb[channel_idP - 1];
+    else
+      rb = NULL;
   }
 
   if (rb != NULL) {
@@ -316,7 +322,9 @@ rlc_op_status_t rlc_data_req     (const protocol_ctxt_t *const ctxt_pP,
     if (rb_idP >= 1 && rb_idP <= 5)
       rb = ue->drb[rb_idP - 1];
   }
+
   if( MBMS_flagP == MBMS_FLAG_YES) {
+    if (rb_idP >= 1 && rb_idP <= 5)
       rb = ue->drb[rb_idP - 1];
   }
 
@@ -875,12 +883,19 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t   * const ctxt_pP
         mbms_service_id    = MBMS_SessionInfo_p->tmgi_r9.serviceId_r9.buf[2]; //serviceId is 3-octet string
 //        mbms_service_id    = j;
 
+#if 0
+        /* TODO: check if this code should stay there
+         * as it is both enb and ue cases do the same thing
+         */
         // can set the mch_id = i
         if (ctxt_pP->enb_flag) {
           drb_id =  (mbms_service_id * LTE_maxSessionPerPMCH ) + mbms_session_id;//+ (LTE_maxDRB + 3) * MAX_MOBILES_PER_ENB; // 1
         } else {
           drb_id =  (mbms_service_id * LTE_maxSessionPerPMCH ) + mbms_session_id; // + (LTE_maxDRB + 3); // 15
         }
+#endif
+
+        drb_id =  (mbms_service_id * LTE_maxSessionPerPMCH ) + mbms_session_id;
 
         LOG_I(RLC, PROTOCOL_CTXT_FMT" CONFIG REQ MBMS ASN1 LC ID %u RB ID %u SESSION ID %u SERVICE ID %u, mbms_rnti %x\n",
               PROTOCOL_CTXT_ARGS(ctxt_pP),
diff --git a/openair2/M2AP/m2ap_MCE_handler.h b/openair2/M2AP/m2ap_MCE_handler.h
index e9faae8f5d972c06655650583492914b92897e25..68cab5c8ac9abfcf40a3f43ad39affff3593ae27 100644
--- a/openair2/M2AP/m2ap_MCE_handler.h
+++ b/openair2/M2AP/m2ap_MCE_handler.h
@@ -26,8 +26,8 @@
  * \version 0.1
  */
 
-#ifndef M2AP_MCE_HANDLERS_H_
-#define M2AP_MCE_HANDLERS_H_
+#ifndef __M2AP_MCE_HANDLERS__H__
+#define __M2AP_MCE_HANDLERS__H__
 
 #include "m2ap_MCE_defs.h"
 
@@ -40,4 +40,4 @@ int m2ap_MCE_handle_message(instance_t instance, uint32_t assoc_id, int32_t stre
                             //const uint8_t * const data, const uint32_t data_length);
 
 
-#endif /* M2AP_MCE_HANDLERS_H_ */
+#endif /* __M2AP_MCE_HANDLERS__H__ */
diff --git a/openair2/M2AP/m2ap_MCE_management_procedures.h b/openair2/M2AP/m2ap_MCE_management_procedures.h
index 9e13e723c966de7ce2da6c76858562fa93d48854..4e8997dbc5108b233a606d296692f3a4e3869921 100644
--- a/openair2/M2AP/m2ap_MCE_management_procedures.h
+++ b/openair2/M2AP/m2ap_MCE_management_procedures.h
@@ -26,8 +26,8 @@
  * \version 0.1
  */
 
-#ifndef M2AP_MCE_MANAGEMENT_PROCEDURES_H_
-#define M2AP_MCE_MANAGEMENT_PROCEDURES_H
+#ifndef __M2AP_MCE_MANAGEMENT_PROCEDURES__H__
+#define __M2AP_MCE_MANAGEMENT_PROCEDURES__H__
 
 void m2ap_MCE_prepare_internal_data(void);
 
@@ -51,4 +51,4 @@ struct m2ap_MCE_data_s *m2ap_get_MCE(m2ap_MCE_instance_t *instance_p,
                                      int32_t assoc_id,
                                      uint16_t cnx_id);
 
-#endif /* M2AP_MCE_MANAGEMENT_PROCEDURES_H_ */
+#endif /* __M2AP_MCE_MANAGEMENT_PROCEDURES__H__ */
diff --git a/openair2/M2AP/m2ap_eNB_generate_messages.h b/openair2/M2AP/m2ap_eNB_generate_messages.h
index 49247405f788d8e681ac928ff8117df846fe627f..793f7f18cf18cc0e14dda3979ad1b7fdcde9930e 100644
--- a/openair2/M2AP/m2ap_eNB_generate_messages.h
+++ b/openair2/M2AP/m2ap_eNB_generate_messages.h
@@ -26,8 +26,8 @@
  * \version 0.1
  */
 
-#ifndef M2AP_ENB_GENERATE_MESSAGES_H_
-#define M2AP_ENB_GENERATE_MESSAGES_H_
+#ifndef __M2AP_ENB_GENERATE_MESSAGES__H__
+#define __M2AP_ENB_GENERATE_MESSAGES__H__
 
 #include "m2ap_eNB_defs.h"
 #include "m2ap_common.h"
@@ -60,4 +60,4 @@ int m2ap_eNB_set_cause (M2AP_Cause_t * cause_p,
 //                                          int m2_ue_id,
 //                                          m2ap_handover_cancel_cause_t cause);
 
-#endif /*  M2AP_ENB_GENERATE_MESSAGES_H_ */
+#endif /*  __M2AP_ENB_GENERATE_MESSAGES__H__ */
diff --git a/openair2/M2AP/m2ap_eNB_management_procedures.h b/openair2/M2AP/m2ap_eNB_management_procedures.h
index fbc49d01698f3883f27761eea86dd2b2c039b8fa..2b1dc4a44bcdfe3daebc6f5f3e51cfe28b673dfa 100644
--- a/openair2/M2AP/m2ap_eNB_management_procedures.h
+++ b/openair2/M2AP/m2ap_eNB_management_procedures.h
@@ -26,8 +26,8 @@
  * \version 0.1
  */
 
-#ifndef M2AP_ENB_MANAGEMENT_PROCEDURES_H_
-#define M2AP_ENB_MANAGEMENT_PROCEDURES_H
+#ifndef __M2AP_ENB_MANAGEMENT_PROCEDURES__H__
+#define __M2AP_ENB_MANAGEMENT_PROCEDURES__H__
 
 void m2ap_eNB_prepare_internal_data(void);
 
@@ -51,4 +51,4 @@ struct m2ap_eNB_data_s *m2ap_get_eNB(m2ap_eNB_instance_t *instance_p,
                                      int32_t assoc_id,
                                      uint16_t cnx_id);
 
-#endif /* M2AP_ENB_MANAGEMENT_PROCEDURES_H_ */
+#endif /* __M2AP_ENB_MANAGEMENT_PROCEDURES__H__ */
diff --git a/openair2/NETWORK_DRIVER/LITE/proto_extern.h b/openair2/NETWORK_DRIVER/LITE/proto_extern.h
index f07083921f3f81adc07a34c25aea4358609eb04c..d4289ca1f2d8d8519d1eb69b405a5c8cef0ac198 100644
--- a/openair2/NETWORK_DRIVER/LITE/proto_extern.h
+++ b/openair2/NETWORK_DRIVER/LITE/proto_extern.h
@@ -30,8 +30,8 @@
 
 ***************************************************************************/
 
-#ifndef _NAS_PROTO_H
-#define _NAS_PROTO_H
+#ifndef __NETWORK_DRIVER_LITE_PROTO_EXTERN__H__
+#define __NETWORK_DRIVER_LITE_PROTO_EXTERN__H__
 
 #include <linux/if_arp.h>
 #include <linux/types.h>
diff --git a/openair2/NETWORK_DRIVER/MESH/proto_extern.h b/openair2/NETWORK_DRIVER/MESH/proto_extern.h
index 2eae034257f291610ad0f765af37c5bda116b5cd..ac92b2f8bdceec295bb94d0cffd0ca83038f5c2b 100644
--- a/openair2/NETWORK_DRIVER/MESH/proto_extern.h
+++ b/openair2/NETWORK_DRIVER/MESH/proto_extern.h
@@ -29,8 +29,8 @@
 
 ***************************************************************************/
 
-#ifndef _NAS_PROTO_H
-#define _NAS_PROTO_H
+#ifndef __NETWORK_DRIVER_MESH_PROTO_EXTERN__H__
+#define __NETWORK_DRIVER_MESH_PROTO_EXTERN__H__
 
 #include <linux/if_arp.h>
 #include <linux/types.h>
diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c
index 456496af637099d8740eb44882809fa2fb95cc21..5965e517201b602de7527787936353dc64396492 100644
--- a/openair2/RRC/LTE/rrc_eNB.c
+++ b/openair2/RRC/LTE/rrc_eNB.c
@@ -6682,14 +6682,6 @@ char openair_rrc_eNB_configuration(
   LOG_I(RRC,
         PROTOCOL_RRC_CTXT_FMT" Init...\n",
         PROTOCOL_RRC_CTXT_ARGS(&ctxt));
-#if OCP_FRAMEWORK
-
-  while ( RC.rrc[enb_mod_idP] == NULL ) {
-    LOG_E(RRC, "RC.rrc not yet initialized, waiting 1 second\n");
-    sleep(1);
-  }
-
-#endif
   AssertFatal(RC.rrc[enb_mod_idP] != NULL, "RC.rrc not initialized!");
   AssertFatal(MAX_MOBILES_PER_ENB < (module_id_t)0xFFFFFFFFFFFFFFFF, " variable overflow");
   AssertFatal(configuration!=NULL,"configuration input is null\n");
diff --git a/openair2/RRC/LTE/rrc_eNB_UE_context.h b/openair2/RRC/LTE/rrc_eNB_UE_context.h
index 289b4d69d69275e75659a819a17b57d85fb2861c..e22f517d50193fff9f6ed55c9c8cb063578de222 100644
--- a/openair2/RRC/LTE/rrc_eNB_UE_context.h
+++ b/openair2/RRC/LTE/rrc_eNB_UE_context.h
@@ -28,6 +28,8 @@
  * \email: lionel.gauthier@eurecom.fr
  */
 #ifndef __RRC_ENB_UE_CONTEXT_H__
+#define __RRC_ENB_UE_CONTEXT_H__
+
 #include "collection/tree.h"
 #include "COMMON/platform_types.h"
 #include "rrc_defs.h"
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index fba661055419503d999df33ab65ebc6fddd9d19f..5ece5f91694efd6289bbb78c03ece566a433977e 100644
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -81,6 +81,7 @@
 #include "SIMULATION/TOOLS/sim.h" // for taus
 
 #include "executables/softmodem-common.h"
+#include <openair2/RRC/NR/rrc_gNB_UE_context.h>
 
 //#define XER_PRINT
 
@@ -267,13 +268,6 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
   LOG_I(NR_RRC,
         PROTOCOL_NR_RRC_CTXT_FMT" Init...\n",
         PROTOCOL_NR_RRC_CTXT_ARGS(&ctxt));
-#if OCP_FRAMEWORK
-
-  while (rrc == NULL ) {
-    LOG_E(NR_RRC, "RC.nrrrc not yet initialized, waiting 1 second\n");
-    sleep(1);
-  }
-#endif 
   AssertFatal(rrc != NULL, "RC.nrrrc not initialized!");
   AssertFatal(NUMBER_OF_UE_MAX < (module_id_t)0xFFFFFFFFFFFFFFFF, " variable overflow");
   AssertFatal(configuration!=NULL,"configuration input is null\n");
diff --git a/openair2/RRC/NR/rrc_gNB_UE_context.h b/openair2/RRC/NR/rrc_gNB_UE_context.h
index 762d9642897c8ceb3bd28ad25f436e2c7ae50edb..d703c4c34caa9e72e79b9e8500e42f0f2457bb09 100644
--- a/openair2/RRC/NR/rrc_gNB_UE_context.h
+++ b/openair2/RRC/NR/rrc_gNB_UE_context.h
@@ -27,8 +27,9 @@
  * \company Eurecom
  * \email: lionel.gauthier@eurecom.fr
  */
-#ifndef __RRC_ENB_UE_CONTEXT_H__
-#define __RRC_ENB_UE_CONTEXT_H__
+#ifndef __RRC_GNB_UE_CONTEXT_H__
+#define __RRC_GNB_UE_CONTEXT_H__
+
 #include "collection/tree.h"
 #include "COMMON/platform_types.h"
 #include "nr_rrc_defs.h"
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index 763c208dfe64b72d31e684e8b14b9e9d1bab96e5..d4647511a901dec364ed9ed9d59b9e61313b451e 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -130,7 +130,7 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc,struct rrc_gNB_ue_context_s *ue_context_
   ue_context_p->ue_id_rnti = ue_context_p->ue_context.secondaryCellGroup->spCellConfig->reconfigurationWithSync->newUE_Identity;
   NR_CG_Config_t *CG_Config = calloc(1,sizeof(*CG_Config));
   memset((void*)CG_Config,0,sizeof(*CG_Config));
-  int CG_Config_size = generate_CG_Config(rrc,CG_Config,ue_context_p->ue_context.reconfig,ue_context_p->ue_context.rb_config);
+  __attribute__((unused))int CG_Config_size = generate_CG_Config(rrc,CG_Config,ue_context_p->ue_context.reconfig,ue_context_p->ue_context.rb_config);
 
   //X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg).rrc_buffer_size = CG_Config_size; //Need to verify correct value for the buffer_size
   // Send to X2 entity to transport to MeNB
diff --git a/openair2/UTIL/OCG/OCG_if.h b/openair2/UTIL/OCG/OCG_if.h
index c515d9746dfbbf11d0769a597869f0d07dc091e1..cc55b56f36cd59618c17bb7cb1db1f5053fe660e 100644
--- a/openair2/UTIL/OCG/OCG_if.h
+++ b/openair2/UTIL/OCG/OCG_if.h
@@ -30,8 +30,8 @@
 * \warning
 */
 
-#ifndef __CONFIGEN_IF_H__
-#define __CONFIG_IF_H__
+#ifndef __UTIL_OCG_OCG_IF__H__
+#define __UTIL_OCG_OCG_IF__H__
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/openair2/UTIL/OPT/mac_pcap.h b/openair2/UTIL/OPT/mac_pcap.h
index 48b31bb3c07395b2b0d6382166356f717706d9d0..3141d17d5923a69f8a4735ce380cf55bbb985168 100644
--- a/openair2/UTIL/OPT/mac_pcap.h
+++ b/openair2/UTIL/OPT/mac_pcap.h
@@ -1,3 +1,6 @@
+#ifndef __UTIL_OPT_MAC_PCAP__H__
+#define __UTIL_OPT_MAC_PCAP__H__
+
 #include <stdio.h>
 #include <string.h>
 #include <arpa/inet.h>
@@ -42,4 +45,4 @@ typedef struct MAC_Context_Info_t {
   unsigned int   subframesSinceCaptureStart;
 } MAC_Context_Info_t;
 
-
+#endif
diff --git a/openair2/UTIL/OPT/opt.h b/openair2/UTIL/OPT/opt.h
index 86f1a045d853f107afbc9bba6237f5596c3bf424..6861e09cb17259d217c5fc08744b847130d317ec 100644
--- a/openair2/UTIL/OPT/opt.h
+++ b/openair2/UTIL/OPT/opt.h
@@ -88,16 +88,12 @@ typedef guint8   gboolean;
     { .s5= {NULL }} ,                   \
   }
 
-#ifdef OCP_FRAMEWORK
-#include <enums.h>
-#else
 typedef enum trace_mode_e {
   OPT_WIRESHARK,
   OPT_PCAP,
   OPT_TSHARK,
   OPT_NONE
 } trace_mode_t;
-#endif
 
 typedef enum radio_type_e {
   RADIO_TYPE_FDD = 1,
diff --git a/openair2/UTIL/OPT/packet-mac-lte.h b/openair2/UTIL/OPT/packet-mac-lte.h
index 4dfbe7912ec484a174567cac076d70627550ebe4..2d36e02df4d580af33f9fa5423dc984480f2d47f 100644
--- a/openair2/UTIL/OPT/packet-mac-lte.h
+++ b/openair2/UTIL/OPT/packet-mac-lte.h
@@ -22,6 +22,8 @@
  modified to be used in OpenAir to create the LTE MAC/RLC encapsulated in UDP as per Wireshark feature 
  */
 
+#ifndef __UTIL_OPT_PACKET_MAC_LTE__H__
+#define __UTIL_OPT_PACKET_MAC_LTE__H__
 
 #include "ws_symbol_export.h"
 
@@ -376,3 +378,5 @@ typedef enum {
  * vi: set shiftwidth=4 tabstop=8 expandtab:
  * :indentSize=4:tabSize=8:noTabs=true:
  */
+
+#endif
diff --git a/openair2/UTIL/OSA/osa_defs.h b/openair2/UTIL/OSA/osa_defs.h
index 4812d82d9166a12b2bc14e242b05071e7e910754..3df350541f0e7d38e4cd81fb4ad08b39ae6558ef 100644
--- a/openair2/UTIL/OSA/osa_defs.h
+++ b/openair2/UTIL/OSA/osa_defs.h
@@ -29,8 +29,8 @@
  * @ingroup security
 */
 
-#ifndef SECU_DEFS_H_
-#define SECU_DEFS_H_
+#ifndef __UTIL_OSA_OSA_DEFS__H__
+#define __UTIL_OSA_OSA_DEFS__H__
 
 #define EIA0_ALG_ID     0x00
 #define EIA1_128_ALG_ID 0x01
@@ -115,4 +115,4 @@ int stream_decrypt(uint8_t algorithm, stream_cipher_t *stream_cipher, uint8_t **
 int stream_check_integrity(uint8_t algorithm, stream_cipher_t *stream_cipher, uint8_t *expected);
 #undef SECU_DEBUG
 
-#endif /* SECU_DEFS_H_ */
+#endif /* __UTIL_OSA_OSA_DEFS__H__ */
diff --git a/openair2/UTIL/OTG/traffic_config.h b/openair2/UTIL/OTG/traffic_config.h
index 2f47682706bed8aa258e1c637dcbb12e03218d1b..c0a64a34650bfc3dd309a309200d5f7f08689eff 100644
--- a/openair2/UTIL/OTG/traffic_config.h
+++ b/openair2/UTIL/OTG/traffic_config.h
@@ -19,6 +19,9 @@
  *      contact@openairinterface.org
  */
 
+#ifndef __UTIL_OTG_TRAFFIC_CONFIG__H__
+#define __UTIL_OTG_TRAFFIC_CONFIG__H__
+
 //IDT DISTRIBUTION PARAMETERS
 #define IDT_DIST GAUSSIAN
 #define IDT_MIN 2
@@ -40,3 +43,5 @@
 //SOCKET MODE
 #define DST_PORT 1234;
 #define DST_IP "127.0.0.1"
+
+#endif
diff --git a/openair2/X2AP/x2ap_eNB_management_procedures.h b/openair2/X2AP/x2ap_eNB_management_procedures.h
index c5217341c514818f8abe81231cfd9b9600e03821..7082f5ac95bc4cbdb37522d3f898fee29c7189b5 100644
--- a/openair2/X2AP/x2ap_eNB_management_procedures.h
+++ b/openair2/X2AP/x2ap_eNB_management_procedures.h
@@ -26,8 +26,8 @@
  * \version 1.0
  */
 
-#ifndef X2AP_ENB_MANAGEMENT_PROCEDURES_H_
-#define X2AP_ENB_MANAGEMENT_PROCEDURES_H
+#ifndef __X2AP_ENB_MANAGEMENT_PROCEDURES__H__
+#define __X2AP_ENB_MANAGEMENT_PROCEDURES__H__
 
 void x2ap_eNB_prepare_internal_data(void);
 
@@ -51,4 +51,4 @@ struct x2ap_eNB_data_s *x2ap_get_eNB(x2ap_eNB_instance_t *instance_p,
                                      int32_t assoc_id,
                                      uint16_t cnx_id);
 
-#endif /* X2AP_ENB_MANAGEMENT_PROCEDURES_H_ */
+#endif /* __X2AP_ENB_MANAGEMENT_PROCEDURES__H__ */
diff --git a/openair3/M3AP/m3ap_MCE_generate_messages.h b/openair3/M3AP/m3ap_MCE_generate_messages.h
index 0884e8216e0c2d1df0126674080321a19005ff98..1a5733acc31bc049563c9f73584c9ccf8e0c6a81 100644
--- a/openair3/M3AP/m3ap_MCE_generate_messages.h
+++ b/openair3/M3AP/m3ap_MCE_generate_messages.h
@@ -26,8 +26,8 @@
  * \version 0.1
  */
 
-#ifndef M2AP_ENB_GENERATE_MESSAGES_H_
-#define M2AP_ENB_GENERATE_MESSAGES_H_
+#ifndef __M3AP_MCE_GENERATE_MESSAGES__H__
+#define __M3AP_MCE_GENERATE_MESSAGES__H__
 
 #include "m2ap_eNB_defs.h"
 #include "m2ap_common.h"
@@ -37,27 +37,8 @@ int m2ap_eNB_generate_m2_setup_request(m2ap_eNB_instance_t *instance_p,
 
 int m2ap_MCE_generate_m2_setup_response(m2ap_eNB_instance_t *instance_p, m2ap_eNB_data_t *m2ap_eNB_data_p);
 
-/*int m2ap_MCE_generate_m2_setup_failure(instance_t instance,
-                                       uint32_t assoc_id,
-                                       M2AP_Cause_PR cause_type,
-                                       long cause_value,
-                                       long time_to_wait);*/
-
 int m2ap_eNB_set_cause (M2AP_Cause_t * cause_p,
                         M2AP_Cause_PR cause_type,
                         long cause_value);
 
-//int m2ap_eNB_generate_m2_handover_request (m2ap_eNB_instance_t *instance_p, m2ap_eNB_data_t *m2ap_eNB_data_p,
-//                                           m2ap_handover_req_t *m2ap_handover_req, int ue_id);
-//
-//int m2ap_eNB_generate_m2_handover_request_ack (m2ap_eNB_instance_t *instance_p, m2ap_eNB_data_t *m2ap_eNB_data_p,
-//                                               m2ap_handover_req_ack_t *m2ap_handover_req_ack);
-//
-//int m2ap_eNB_generate_m2_ue_context_release (m2ap_eNB_instance_t *instance_p, m2ap_eNB_data_t *m2ap_eNB_data_p,
-//                                             m2ap_ue_context_release_t *m2ap_ue_context_release);
-//
-//int m2ap_eNB_generate_m2_handover_cancel (m2ap_eNB_instance_t *instance_p, m2ap_eNB_data_t *m2ap_eNB_data_p,
-//                                          int m2_ue_id,
-//                                          m2ap_handover_cancel_cause_t cause);
-
-#endif /*  M2AP_ENB_GENERATE_MESSAGES_H_ */
+#endif /*  __M3AP_MCE_GENERATE_MESSAGES__H__ */
diff --git a/openair3/M3AP/m3ap_MCE_handler.h b/openair3/M3AP/m3ap_MCE_handler.h
index ce4997e80d7d95b1acf08ad8c64a149aa3405f65..09eca351b68477a0f5055c785d502403d2a1bf36 100644
--- a/openair3/M3AP/m3ap_MCE_handler.h
+++ b/openair3/M3AP/m3ap_MCE_handler.h
@@ -19,15 +19,15 @@
  *      contact@openairinterface.org
  */
 
-/*! \file m2ap_handler.h
- * \brief m2ap handler procedures for eNB
+/*! \file m3ap_handler.h
+ * \brief m3ap handler procedures for eNB
  * \author Javier Morgade <javier.morgade@ieee.org>
  * \date 2019
  * \version 0.1
  */
 
-#ifndef M2AP_MCE_HANDLERS_H_
-#define M2AP_MCE_HANDLERS_H_
+#ifndef __M3AP_MCE_HANDLER__H__
+#define __M3AP_MCE_HANDLER__H__
 
 #include "m2ap_MCE_defs.h"
 
@@ -40,4 +40,4 @@ int m3ap_MCE_handle_message(instance_t instance, uint32_t assoc_id, int32_t stre
                             const uint8_t * const data, const uint32_t data_length);
 
 
-#endif /* M2AP_MCE_HANDLERS_H_ */
+#endif /* __M3AP_MCE_HANDLER__H__ */
diff --git a/openair3/M3AP/m3ap_MCE_management_procedures.h b/openair3/M3AP/m3ap_MCE_management_procedures.h
index 2d18df8c26d23877bd9fd1b9d2e3312fbff64d3c..27e8c928a0f01af144dada89e8246c823575a6b1 100644
--- a/openair3/M3AP/m3ap_MCE_management_procedures.h
+++ b/openair3/M3AP/m3ap_MCE_management_procedures.h
@@ -26,8 +26,8 @@
  * \version 0.1
  */
 
-#ifndef M3AP_MCE_MANAGEMENT_PROCEDURES_H_
-#define M3AP_MCE_MANAGEMENT_PROCEDURES_H
+#ifndef __M3AP_MCE_MANAGEMENT_PROCEDURES__H__
+#define __M3AP_MCE_MANAGEMENT_PROCEDURES__H__
 
 void m3ap_MCE_prepare_internal_data(void);
 
@@ -50,4 +50,4 @@ struct m3ap_MCE_data_s *m3ap_get_MCE(m3ap_MCE_instance_t *instance_p,
                                      int32_t assoc_id,
                                      uint16_t cnx_id);
 
-#endif /* M3AP_MCE_MANAGEMENT_PROCEDURES_H_ */
+#endif /* __M3AP_MCE_MANAGEMENT_PROCEDURES__H__ */
diff --git a/openair3/M3AP/m3ap_MME_generate_messages.h b/openair3/M3AP/m3ap_MME_generate_messages.h
index 1632dc807acc307de1af06650f2f824272239c7a..146f58825a8d9bb18f7b0ed26c57dcea66e23209 100644
--- a/openair3/M3AP/m3ap_MME_generate_messages.h
+++ b/openair3/M3AP/m3ap_MME_generate_messages.h
@@ -19,15 +19,15 @@
  *      contact@openairinterface.org
  */
 
-/*! \file m2ap_MCE_generate_messages.h
- * \brief m2ap procedures for MCE
+/*! \file m3ap_MCE_generate_messages.h
+ * \brief m3ap procedures for MCE
  * \author Javier Morgade <javier.morgade@ieee.org>
  * \date 2019
  * \version 0.1
  */
 
-#ifndef M2AP_MCE_GENERATE_MESSAGES_H_
-#define M2AP_MCE_GENERATE_MESSAGES_H_
+#ifndef M3AP_MCE_GENERATE_MESSAGES_H_
+#define M3AP_MCE_GENERATE_MESSAGES_H_
 
 #include "m2ap_MCE_defs.h"
 #include "m2ap_common.h"
diff --git a/openair3/M3AP/m3ap_MME_management_procedures.h b/openair3/M3AP/m3ap_MME_management_procedures.h
index e966ee1f17eb3ed982ee6e556b149b9607dc4339..b21189b9157013862894b267833aa95d35d8adfe 100644
--- a/openair3/M3AP/m3ap_MME_management_procedures.h
+++ b/openair3/M3AP/m3ap_MME_management_procedures.h
@@ -26,8 +26,8 @@
  * \version 0.1
  */
 
-#ifndef M3AP_MME_MANAGEMENT_PROCEDURES_H_
-#define M3AP_MME_MANAGEMENT_PROCEDURES_H
+#ifndef __M3AP_MME_MANAGEMENT_PROCEDURES__H__
+#define __M3AP_MME_MANAGEMENT_PROCEDURES__H__
 
 void m3ap_MME_prepare_internal_data(void);
 
@@ -51,4 +51,4 @@ struct m3ap_MME_data_s *m3ap_get_MME(m3ap_MME_instance_t *instance_p,
                                      int32_t assoc_id,
                                      uint16_t cnx_id);
 
-#endif /* M3AP_MME_MANAGEMENT_PROCEDURES_H_ */
+#endif /* __M3AP_MME_MANAGEMENT_PROCEDURES__H__ */
diff --git a/openair3/MME_APP/enb_paramdef_mme.h b/openair3/MME_APP/enb_paramdef_mme.h
index 3d65036553bc6579b96ac2fdb512441fc6b70daa..127c1855e779d34735c332b79095410d26c70197 100644
--- a/openair3/MME_APP/enb_paramdef_mme.h
+++ b/openair3/MME_APP/enb_paramdef_mme.h
@@ -30,6 +30,9 @@
  * \warning
  */
 
+#ifndef __MME_APP_ENB_PARAMDEF_MME__H__
+#define __MME_APP_ENB_PARAMDEF_MME__H__
+
 #include "common/config/config_paramdesc.h"
 #include "RRC_paramsvalues.h"
 
@@ -172,3 +175,4 @@ typedef struct ccparams_MME_s {
              { .s5= {NULL }}						     \
 }
 
+#endif
diff --git a/openair3/MME_APP/mme_config.h b/openair3/MME_APP/mme_config.h
index 4371ad55f6f2ecf1a9865654060ebd267a6bb775..2eb0a66e85c07bc2ab4461750bb26b223dfcf2e1 100644
--- a/openair3/MME_APP/mme_config.h
+++ b/openair3/MME_APP/mme_config.h
@@ -26,8 +26,9 @@
   EMAIL   : javier.morgade@ieee.org
 */
 
-#ifndef MME_CONFIG_H_
-#define MME_CONFIG_H_
+#ifndef __MME_APP_MME_CONFIG__H__
+#define __MME_APP_MME_CONFIG__H__
+
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
@@ -48,5 +49,5 @@
 
 int RCconfig_MME(void);
 
-#endif /* MME_CONFIG_H_ */
+#endif /* __MME_APP_MME_CONFIG__H__ */
 /** @} */
diff --git a/openair3/NAS/COMMON/API/NETWORK/as_message.h b/openair3/NAS/COMMON/API/NETWORK/as_message.h
deleted file mode 100644
index 30810a325eace63c944b947bfb8c0a6487094e80..0000000000000000000000000000000000000000
--- a/openair3/NAS/COMMON/API/NETWORK/as_message.h
+++ /dev/null
@@ -1,578 +0,0 @@
-/*
- * Copyright (c) 2015, EURECOM (www.eurecom.fr)
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- *    list of conditions and the following disclaimer.
- * 2. 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.
- *
- * 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 OWNER 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.
- *
- * The views and conclusions contained in the software and documentation are those
- * of the authors and should not be interpreted as representing official policies,
- * either expressed or implied, of the FreeBSD Project.
- */
-
-
-/*****************************************************************************
-
-Source      as_message.h
-
-Version     0.1
-
-Date        2012/10/18
-
-Product     NAS stack
-
-Subsystem   Application Programming Interface
-
-Author      Frederic Maurel
-
-Description Defines the messages supported by the Access Stratum sublayer
-        protocol (usually RRC and S1AP for E-UTRAN) and functions used
-        to encode and decode
-
-*****************************************************************************/
-#ifndef __AS_MESSAGE_H__
-#define __AS_MESSAGE_H__
-
-#include "commonDef.h"
-#include "networkDef.h"
-
-/****************************************************************************/
-/*********************  G L O B A L    C O N S T A N T S  *******************/
-/****************************************************************************/
-
-/*
- * --------------------------------------------------------------------------
- *              Access Stratum message types
- * --------------------------------------------------------------------------
- */
-#define AS_REQUEST  0x0100
-#define AS_RESPONSE 0x0200
-#define AS_INDICATION   0x0400
-#define AS_CONFIRM  0x0800
-
-/*
- * --------------------------------------------------------------------------
- *          Access Stratum message identifiers
- * --------------------------------------------------------------------------
- */
-
-/* Broadcast information */
-#define AS_BROADCAST_INFO       0x01
-#define AS_BROADCAST_INFO_IND       (AS_BROADCAST_INFO | AS_INDICATION)
-
-/* Cell information relevant for cell selection processing */
-#define AS_CELL_INFO            0x02
-#define AS_CELL_INFO_REQ        (AS_CELL_INFO | AS_REQUEST)
-#define AS_CELL_INFO_CNF        (AS_CELL_INFO | AS_CONFIRM)
-#define AS_CELL_INFO_IND        (AS_CELL_INFO | AS_INDICATION)
-
-/* Paging information */
-#define AS_PAGING           0x03
-#define AS_PAGING_REQ           (AS_PAGING | AS_REQUEST)
-#define AS_PAGING_IND           (AS_PAGING | AS_INDICATION)
-
-/* NAS signalling connection establishment */
-#define AS_NAS_ESTABLISH        0x04
-#define AS_NAS_ESTABLISH_REQ        (AS_NAS_ESTABLISH | AS_REQUEST)
-#define AS_NAS_ESTABLISH_IND        (AS_NAS_ESTABLISH | AS_INDICATION)
-#define AS_NAS_ESTABLISH_RSP        (AS_NAS_ESTABLISH | AS_RESPONSE)
-#define AS_NAS_ESTABLISH_CNF        (AS_NAS_ESTABLISH | AS_CONFIRM)
-
-/* NAS signalling connection release */
-#define AS_NAS_RELEASE          0x05
-#define AS_NAS_RELEASE_REQ      (AS_NAS_RELEASE | AS_REQUEST)
-#define AS_NAS_RELEASE_IND      (AS_NAS_RELEASE | AS_INDICATION)
-
-/* Uplink information transfer */
-#define AS_UL_INFO_TRANSFER     0x06
-#define AS_UL_INFO_TRANSFER_REQ     (AS_UL_INFO_TRANSFER | AS_REQUEST)
-#define AS_UL_INFO_TRANSFER_CNF     (AS_UL_INFO_TRANSFER | AS_CONFIRM)
-#define AS_UL_INFO_TRANSFER_IND     (AS_UL_INFO_TRANSFER | AS_INDICATION)
-
-/* Downlink information transfer */
-#define AS_DL_INFO_TRANSFER     0x07
-#define AS_DL_INFO_TRANSFER_REQ     (AS_DL_INFO_TRANSFER | AS_REQUEST)
-#define AS_DL_INFO_TRANSFER_CNF     (AS_DL_INFO_TRANSFER | AS_CONFIRM)
-#define AS_DL_INFO_TRANSFER_IND     (AS_DL_INFO_TRANSFER | AS_INDICATION)
-
-/* Radio Access Bearer establishment */
-#define AS_RAB_ESTABLISH        0x08
-#define AS_RAB_ESTABLISH_REQ        (AS_RAB_ESTABLISH | AS_REQUEST)
-#define AS_RAB_ESTABLISH_IND        (AS_RAB_ESTABLISH | AS_INDICATION)
-#define AS_RAB_ESTABLISH_RSP        (AS_RAB_ESTABLISH | AS_RESPONSE)
-#define AS_RAB_ESTABLISH_CNF        (AS_RAB_ESTABLISH | AS_CONFIRM)
-
-/* Radio Access Bearer release */
-#define AS_RAB_RELEASE          0x09
-#define AS_RAB_RELEASE_REQ      (AS_RAB_RELEASE | AS_REQUEST)
-#define AS_RAB_RELEASE_IND      (AS_RAB_RELEASE | AS_INDICATION)
-
-/* NAS Cause */
-#define EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED (8)
-#define EPS_SERVICES_NOT_ALLOWED                      (7)
-#define PLMN_NOT_ALLOWED                              (11)
-#define TRACKING_AREA_NOT_ALLOWED                     (12)
-#define ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA     (13)
-#define EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN         (14)
-#define NO_SUITABLE_CELLS_IN_TRACKING_AREA            (15)
-#define NETWORK_FAILURE                               (17)
-#define ESM_FAILURE                                   (19)
-
-typedef enum nas_cause_s {
-  NAS_CAUSE_EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED = EPS_SERVICES_AND_NON_EPS_SERVICES_NOT_ALLOWED,
-  NAS_CAUSE_EPS_SERVICES_NOT_ALLOWED                  = EPS_SERVICES_NOT_ALLOWED,
-  NAS_CAUSE_PLMN_NOT_ALLOWED                          = PLMN_NOT_ALLOWED,
-  NAS_CAUSE_TRACKING_AREA_NOT_ALLOWED                 = TRACKING_AREA_NOT_ALLOWED,
-  NAS_CAUSE_ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA = ROAMING_NOT_ALLOWED_IN_THIS_TRACKING_AREA,
-  NAS_CAUSE_EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN     = EPS_SERVICES_NOT_ALLOWED_IN_THIS_PLMN,
-  NAS_CAUSE_NO_SUITABLE_CELLS_IN_TRACKING_AREA        = NO_SUITABLE_CELLS_IN_TRACKING_AREA,
-  NAS_CAUSE_NETWORK_FAILURE                           = NETWORK_FAILURE,
-  NAS_CAUSE_ESM_FAILURE                               = ESM_FAILURE
-} nas_cause_t;
-
-/*
- * --------------------------------------------------------------------------
- *          Access Stratum message global parameters
- * --------------------------------------------------------------------------
- */
-
-/* Error code */
-typedef enum nas_error_code_s {
-  AS_SUCCESS = 1, /* Success code, transaction is going on    */
-  AS_TERMINATED_NAS,  /* Transaction terminated by NAS        */
-  AS_TERMINATED_AS,   /* Transaction terminated by AS         */
-  AS_FAILURE      /* Failure code                 */
-} nas_error_code_t;
-
-/* Core network domain */
-typedef enum core_network_s {
-  AS_PS = 1,      /* Packet-Switched  */
-  AS_CS       /* Circuit-Switched */
-} core_network_t;
-
-/* SAE Temporary Mobile Subscriber Identity */
-typedef struct as_stmsi_s {
-  uint8_t MMEcode;    /* MME code that allocated the GUTI     */
-  uint32_t m_tmsi;    /* M-Temporary Mobile Subscriber Identity   */
-} as_stmsi_t;
-
-/* Dedicated NAS information */
-typedef struct as_nas_info_s {
-  uint32_t length;    /* Length of the NAS information data       */
-  Byte_t* data;   /* Dedicated NAS information data container */
-} as_nas_info_t;
-
-/* Radio Access Bearer identity */
-typedef uint8_t as_rab_id_t;
-
-/****************************************************************************/
-/************************  G L O B A L    T Y P E S  ************************/
-/****************************************************************************/
-
-/*
- * --------------------------------------------------------------------------
- *              Broadcast information
- * --------------------------------------------------------------------------
- */
-
-/*
- * AS->NAS - Broadcast information indication
- * AS may asynchronously report to NAS available PLMNs within specific
- * location area
- */
-typedef struct broadcast_info_ind_s {
-#define PLMN_LIST_MAX_SIZE  6
-  PLMN_LIST_T(PLMN_LIST_MAX_SIZE) plmnIDs; /* List of PLMN identifiers */
-  ci_t cellID;    /* Identity of the cell serving the listed PLMNs */
-  tac_t tac;      /* Code of the tracking area the cell belongs to */
-} broadcast_info_ind_t;
-
-/*
- * --------------------------------------------------------------------------
- *     Cell information relevant for cell selection processing
- * --------------------------------------------------------------------------
- */
-
-/* Radio access technologies supported by the network */
-#define AS_GSM              (1 << NET_ACCESS_GSM)
-#define AS_COMPACT          (1 << NET_ACCESS_COMPACT)
-#define AS_UTRAN            (1 << NET_ACCESS_UTRAN)
-#define AS_EGPRS            (1 << NET_ACCESS_EGPRS)
-#define AS_HSDPA            (1 << NET_ACCESS_HSDPA)
-#define AS_HSUPA            (1 << NET_ACCESS_HSUPA)
-#define AS_HSDUPA           (1 << NET_ACCESS_HSDUPA)
-#define AS_EUTRAN           (1 << NET_ACCESS_EUTRAN)
-
-/*
- * NAS->AS - Cell Information request
- * NAS request AS to search for a suitable cell belonging to the selected
- * PLMN to camp on.
- */
-typedef struct cell_info_req_s {
-  plmn_t plmnID;  /* Selected PLMN identity           */
-  Byte_t rat;     /* Bitmap - set of radio access technologies    */
-} cell_info_req_t;
-
-/*
- * AS->NAS - Cell Information confirm
- * AS search for a suitable cell and respond to NAS. If found, the cell
- * is selected to camp on.
- */
-typedef struct cell_info_cnf_s {
-  uint8_t errCode;    /* Error code                     */
-  ci_t cellID;    /* Identity of the cell serving the selected PLMN */
-  tac_t tac;      /* Code of the tracking area the cell belongs to  */
-  AcT_t rat;      /* Radio access technology supported by the cell  */
-  uint8_t rsrq;   /* Reference signal received quality         */
-  uint8_t rsrp;   /* Reference signal received power       */
-} cell_info_cnf_t;
-
-/*
- * AS->NAS - Cell Information indication
- * AS may change cell selection if a more suitable cell is found.
- */
-typedef struct cell_info_ind_s {
-  ci_t cellID;    /* Identity of the new serving cell      */
-  tac_t tac;      /* Code of the tracking area the cell belongs to */
-} cell_info_ind_t;
-
-/*
- * --------------------------------------------------------------------------
- *              Paging information
- * --------------------------------------------------------------------------
- */
-
-/* Paging cause */
-typedef enum paging_cause_s {
-  AS_CONNECTION_ESTABLISH,    /* Establish NAS signalling connection  */
-  AS_EPS_ATTACH,      /* Perform local detach and initiate EPS
-                 * attach procedure         */
-  AS_CS_FALLBACK      /* Inititate CS fallback procedure  */
-} paging_cause_t;
-
-/*
- * NAS->AS - Paging Information request
- * NAS requests the AS that NAS signalling messages or user data is pending
- * to be sent.
- */
-typedef struct paging_req_s {
-  as_stmsi_t s_tmsi;  /* UE identity                  */
-  uint8_t CN_domain;  /* Core network domain              */
-} paging_req_t;
-
-/*
- * AS->NAS - Paging Information indication
- * AS reports to the NAS that appropriate procedure has to be initiated.
- */
-typedef struct paging_ind_s {
-  paging_cause_t cause;  /* Paging cause                 */
-} paging_ind_t;
-
-/*
- * --------------------------------------------------------------------------
- *          NAS signalling connection establishment
- * --------------------------------------------------------------------------
- */
-
-/* Cause of RRC connection establishment */
-typedef enum as_cause_s {
-  AS_CAUSE_UNKNOWN    = 0,
-  AS_CAUSE_EMERGENCY  = NET_ESTABLISH_CAUSE_EMERGENCY,
-  AS_CAUSE_HIGH_PRIO  = NET_ESTABLISH_CAUSE_HIGH_PRIO,
-  AS_CAUSE_MT_ACCESS  = NET_ESTABLISH_CAUSE_MT_ACCESS,
-  AS_CAUSE_MO_SIGNAL  = NET_ESTABLISH_CAUSE_MO_SIGNAL,
-  AS_CAUSE_MO_DATA    = NET_ESTABLISH_CAUSE_MO_DATA,
-  AS_CAUSE_V1020      = NET_ESTABLISH_CAUSE_V1020
-} as_cause_t;
-
-/* Type of the call associated to the RRC connection establishment */
-typedef enum as_call_type_s {
-  AS_TYPE_ORIGINATING_SIGNAL  = NET_ESTABLISH_TYPE_ORIGINATING_SIGNAL,
-  AS_TYPE_EMERGENCY_CALLS     = NET_ESTABLISH_TYPE_EMERGENCY_CALLS,
-  AS_TYPE_ORIGINATING_CALLS   = NET_ESTABLISH_TYPE_ORIGINATING_CALLS,
-  AS_TYPE_TERMINATING_CALLS   = NET_ESTABLISH_TYPE_TERMINATING_CALLS,
-  AS_TYPE_MO_CS_FALLBACK      = NET_ESTABLISH_TYPE_MO_CS_FALLBACK
-} as_call_type_t;
-
-/*
- * NAS->AS - NAS signalling connection establishment request
- * NAS requests the AS to perform the RRC connection establishment procedure
- * to transfer initial NAS message to the network while UE is in IDLE mode.
- */
-typedef struct nas_establish_req_s {
-  as_cause_t      cause;          /* RRC connection establishment cause   */
-  as_call_type_t  type;           /* RRC associated call type             */
-  as_stmsi_t      s_tmsi;         /* UE identity                          */
-  plmn_t          plmnID;         /* Selected PLMN identity               */
-  as_nas_info_t   initialNasMsg;  /* Initial NAS message to transfer      */
-} nas_establish_req_t;
-
-/*
- * AS->NAS - NAS signalling connection establishment indication
- * AS transfers the initial NAS message to the NAS.
- */
-typedef struct nas_establish_ind_s {
-  uint32_t      UEid;          /* UE lower layer identifier               */
-  tac_t         tac;           /* Code of the tracking area the initiating
-                                  * UE belongs to                           */
-  as_cause_t    asCause;       /* Establishment cause                     */
-  as_nas_info_t initialNasMsg; /* Initial NAS message to transfer         */
-} nas_establish_ind_t;
-
-/*
- * NAS->AS - NAS signalling connection establishment response
- * NAS responds to the AS that initial answer message has to be provided to
- * the UE.
- */
-typedef struct nas_establish_rsp_s {
-  uint32_t         UEid;         /* UE lower layer identifier   */
-  as_stmsi_t       s_tmsi;       /* UE identity                 */
-  nas_error_code_t errCode;      /* Transaction status          */
-  as_nas_info_t    nasMsg;       /* NAS message to transfer     */
-  uint32_t         nas_ul_count; /* UL NAS COUNT                */
-  uint16_t         selected_encryption_algorithm;
-  uint16_t         selected_integrity_algorithm;
-} nas_establish_rsp_t;
-
-/*
- * AS->NAS - NAS signalling connection establishment confirm
- * AS transfers the initial answer message to the NAS.
- */
-typedef struct nas_establish_cnf_s {
-  uint32_t         UEid;            /* UE lower layer identifier   */
-  nas_error_code_t errCode;         /* Transaction status          */
-  as_nas_info_t    nasMsg;          /* NAS message to transfer     */
-  uint32_t         ul_nas_count;
-  uint16_t         selected_encryption_algorithm;
-  uint16_t         selected_integrity_algorithm;
-} nas_establish_cnf_t;
-
-/*
- * --------------------------------------------------------------------------
- *          NAS signalling connection release
- * --------------------------------------------------------------------------
- */
-
-/* Release cause */
-typedef enum release_cause_s {
-  AS_AUTHENTICATION_FAILURE = 1,  /* Authentication procedure failed   */
-  AS_DETACH                       /* Detach requested                  */
-} release_cause_t;
-
-/*
- * NAS->AS - NAS signalling connection release request
- * NAS requests the termination of the connection with the UE.
- */
-typedef struct nas_release_req_s {
-  uint32_t UEid;          /* UE lower layer identifier    */
-  as_stmsi_t s_tmsi;      /* UE identity                  */
-  release_cause_t cause;  /* Release cause                */
-} nas_release_req_t;
-
-/*
- * AS->NAS - NAS signalling connection release indication
- * AS reports that connection has been terminated by the network.
- */
-typedef struct nas_release_ind_s {
-  release_cause_t cause;      /* Release cause            */
-} nas_release_ind_t;
-
-/*
- * --------------------------------------------------------------------------
- *              NAS information transfer
- * --------------------------------------------------------------------------
- */
-
-/*
- * NAS->AS - Uplink data transfer request
- * NAS requests the AS to transfer uplink information to the NAS that
- * operates at the network side.
- */
-typedef struct ul_info_transfer_req_s {
-  uint32_t UEid;      /* UE lower layer identifier        */
-  as_stmsi_t s_tmsi;      /* UE identity              */
-  as_nas_info_t nasMsg;   /* Uplink NAS message           */
-} ul_info_transfer_req_t;
-
-/*
- * AS->NAS - Uplink data transfer confirm
- * AS immediately notifies the NAS whether uplink information has been
- * successfully sent to the network or not.
- */
-typedef struct ul_info_transfer_cnf_s {
-  uint32_t         UEid;      /* UE lower layer identifier        */
-  nas_error_code_t errCode;   /* Transaction status               */
-} ul_info_transfer_cnf_t;
-
-/*
- * AS->NAS - Uplink data transfer indication
- * AS delivers the uplink information message to the NAS that operates
- * at the network side.
- */
-typedef struct ul_info_transfer_ind_s {
-  uint32_t UEid;          /* UE lower layer identifier        */
-  as_nas_info_t nasMsg;   /* Uplink NAS message           */
-} ul_info_transfer_ind_t;
-
-/*
- * NAS->AS - Downlink data transfer request
- * NAS requests the AS to transfer downlink information to the NAS that
- * operates at the UE side.
- */
-typedef ul_info_transfer_req_t dl_info_transfer_req_t;
-
-/*
- * AS->NAS - Downlink data transfer confirm
- * AS immediately notifies the NAS whether downlink information has been
- * successfully sent to the network or not.
- */
-typedef ul_info_transfer_cnf_t dl_info_transfer_cnf_t;
-
-/*
- * AS->NAS - Downlink data transfer indication
- * AS delivers the downlink information message to the NAS that operates
- * at the UE side.
- */
-typedef ul_info_transfer_ind_t dl_info_transfer_ind_t;
-
-/*
- * --------------------------------------------------------------------------
- *          Radio Access Bearer establishment
- * --------------------------------------------------------------------------
- */
-
-/* TODO: Quality of Service parameters */
-typedef struct {} as_qos_t;
-
-/*
- * NAS->AS - Radio access bearer establishment request
- * NAS requests the AS to allocate transmission resources to radio access
- * bearer initialized at the network side.
- */
-typedef struct rab_establish_req_s {
-  as_stmsi_t s_tmsi;      /* UE identity                      */
-  as_rab_id_t rabID;      /* Radio access bearer identity     */
-  as_qos_t QoS;           /* Requested Quality of Service     */
-} rab_establish_req_t;
-
-/*
- * AS->NAS - Radio access bearer establishment indication
- * AS notifies the NAS that specific radio access bearer has to be setup.
- */
-typedef struct rab_establish_ind_s {
-  as_rab_id_t rabID;      /* Radio access bearer identity     */
-} rab_establish_ind_t;
-
-/*
- * NAS->AS - Radio access bearer establishment response
- * NAS responds to AS whether the specified radio access bearer has been
- * successfully setup or not.
- */
-typedef struct rab_establish_rsp_s {
-  as_stmsi_t       s_tmsi;        /* UE identity                      */
-  as_rab_id_t      rabID;         /* Radio access bearer identity     */
-  nas_error_code_t errCode;       /* Transaction status               */
-} rab_establish_rsp_t;
-
-/*
- * AS->NAS - Radio access bearer establishment confirm
- * AS notifies NAS whether the specified radio access bearer has been
- * successfully setup at the UE side or not.
- */
-typedef struct rab_establish_cnf_s {
-  as_rab_id_t rabID;          /* Radio access bearer identity     */
-  nas_error_code_t errCode;   /* Transaction status               */
-} rab_establish_cnf_t;
-
-/*
- * --------------------------------------------------------------------------
- *              Radio Access Bearer release
- * --------------------------------------------------------------------------
- */
-
-/*
- * NAS->AS - Radio access bearer release request
- * NAS requests the AS to release transmission resources previously allocated
- * to specific radio access bearer at the network side.
- */
-typedef struct rab_release_req_s {
-  as_stmsi_t s_tmsi;      /* UE identity                      */
-  as_rab_id_t rabID;      /* Radio access bearer identity     */
-} rab_release_req_t;
-
-/*
- * AS->NAS - Radio access bearer release indication
- * AS notifies NAS that specific radio access bearer has been released.
- */
-typedef struct rab_release_ind_s {
-  as_rab_id_t rabID;      /* Radio access bearer identity     */
-} rab_release_ind_t;
-
-/*
- * --------------------------------------------------------------------------
- *  Structure of the AS messages handled by the network sublayer
- * --------------------------------------------------------------------------
- */
-typedef struct as_message_s {
-  uint16_t msgID;
-  union {
-    broadcast_info_ind_t broadcast_info_ind;
-    cell_info_req_t cell_info_req;
-    cell_info_cnf_t cell_info_cnf;
-    cell_info_ind_t cell_info_ind;
-    paging_req_t paging_req;
-    paging_ind_t paging_ind;
-    nas_establish_req_t nas_establish_req;
-    nas_establish_ind_t nas_establish_ind;
-    nas_establish_rsp_t nas_establish_rsp;
-    nas_establish_cnf_t nas_establish_cnf;
-    nas_release_req_t nas_release_req;
-    nas_release_ind_t nas_release_ind;
-    ul_info_transfer_req_t ul_info_transfer_req;
-    ul_info_transfer_cnf_t ul_info_transfer_cnf;
-    ul_info_transfer_ind_t ul_info_transfer_ind;
-    dl_info_transfer_req_t dl_info_transfer_req;
-    dl_info_transfer_cnf_t dl_info_transfer_cnf;
-    dl_info_transfer_ind_t dl_info_transfer_ind;
-    rab_establish_req_t rab_establish_req;
-    rab_establish_ind_t rab_establish_ind;
-    rab_establish_rsp_t rab_establish_rsp;
-    rab_establish_cnf_t rab_establish_cnf;
-    rab_release_req_t rab_release_req;
-    rab_release_ind_t rab_release_ind;
-  } __attribute__((__packed__)) msg;
-} as_message_t;
-
-/****************************************************************************/
-/********************  G L O B A L    V A R I A B L E S  ********************/
-/****************************************************************************/
-
-/****************************************************************************/
-/******************  E X P O R T E D    F U N C T I O N S  ******************/
-/****************************************************************************/
-
-int as_message_decode(const char* buffer, as_message_t* msg, int length);
-
-int as_message_encode(char* buffer, as_message_t* msg, int length);
-
-/* Implemented in the network_api.c body file */
-int as_message_send(as_message_t* as_msg);
-
-#endif /* __AS_MESSAGE_H__*/
diff --git a/openair3/NAS/COMMON/UTIL/socket.h b/openair3/NAS/COMMON/UTIL/socket.h
index 033046d98c08d04e39607740794f4b8cd2446737..58bc6b8527614361f36245e2b91cfbbd482bfa21 100644
--- a/openair3/NAS/COMMON/UTIL/socket.h
+++ b/openair3/NAS/COMMON/UTIL/socket.h
@@ -35,8 +35,8 @@ Author    Frederic Maurel
 Description Implements TCP socket handlers
 
 *****************************************************************************/
-#ifndef __SOCKET_H__
-#define __SOCKET_H__
+#ifndef __NAS_COMMON_UTIL_SOCKET__H__
+#define __NAS_COMMON_UTIL_SOCKET__H__
 
 #include <sys/types.h>
 
@@ -71,4 +71,4 @@ ssize_t socket_send(const void* id, const char* buffer, size_t length);
 
 void socket_close(void* id);
 
-#endif /* __SOCKET_H__*/
+#endif /* __NAS_COMMON_UTIL_SOCKET__H__ */
diff --git a/openair3/NAS/COMMON/commonDef.h b/openair3/NAS/COMMON/commonDef.h
deleted file mode 100644
index e9f769db5555246ecf24aa1ffa6c2ded2e8e799c..0000000000000000000000000000000000000000
--- a/openair3/NAS/COMMON/commonDef.h
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * Copyright (c) 2015, EURECOM (www.eurecom.fr)
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- *    list of conditions and the following disclaimer.
- * 2. 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.
- *
- * 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 OWNER 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.
- *
- * The views and conclusions contained in the software and documentation are those
- * of the authors and should not be interpreted as representing official policies,
- * either expressed or implied, of the FreeBSD Project.
- */
-/*
-
-Source      commonDef.h
-
-Version     0.1
-
-Date        2012/02/27
-
-Product     NAS stack
-
-Subsystem   include
-
-Author      Frederic Maurel
-
-Description Contains global common definitions
-
-*****************************************************************************/
-#ifndef __COMMONDEF_H__
-#define __COMMONDEF_H__
-
-#include <stdint.h>
-#include <stddef.h>
-#include <stdbool.h>
-
-typedef signed char        boolean_t;
-
-#if !defined(TRUE)
-#define TRUE               (boolean_t)0x01
-#endif
-
-#if !defined(FALSE)
-#define FALSE              (boolean_t)0x00
-#endif
-
-#define BOOL_NOT(b) (b^TRUE)
-
-#define NAS_UE_ID_FMT "0x%06x"
-
-/****************************************************************************/
-/*********************  G L O B A L    C O N S T A N T S  *******************/
-/****************************************************************************/
-
-#define RETURNok        (0)
-#define RETURNerror     (-1)
-
-/*
- * Name of the environment variable which defines the default directory
- * where the NAS application is executed and where are located files
- * where non-volatile data are stored
- */
-#define DEFAULT_NAS_PATH    "PWD"
-
-/****************************************************************************/
-/************************  G L O B A L    T Y P E S  ************************/
-/****************************************************************************/
-
-/*
------------------------------------------------------------------------------
-            Standard data type definitions
------------------------------------------------------------------------------
-*/
-typedef int8_t      SByte_t;    /* 8 bit  signed integer     */
-typedef uint8_t     Byte_t;     /* 8 bit unsigned integer   */
-
-
-/*
------------------------------------------------------------------------------
-            Common NAS data type definitions
------------------------------------------------------------------------------
-*/
-
-typedef uint8_t     Stat_t;     /* Registration status  */
-typedef uint16_t    lac_t;      /* Location Area Code   */
-typedef uint8_t     rac_t;      /* Routing Area Code    */
-typedef uint16_t    tac_t;      /* Tracking Area Code   */
-typedef uint32_t    ci_t;       /* Cell Identifier  */
-typedef uint8_t     AcT_t;      /* Access Technology    */
-
-/*
- * International Mobile Subscriber Identity
- */
-typedef struct {
-  Byte_t length;
-  union {
-    struct {
-      Byte_t digit2:4;
-      Byte_t digit1:4;
-      Byte_t digit4:4;
-      Byte_t digit3:4;
-      Byte_t digit6:4;
-      Byte_t digit5:4;
-      Byte_t digit8:4;
-      Byte_t digit7:4;
-      Byte_t digit10:4;
-      Byte_t digit9:4;
-      Byte_t digit12:4;
-      Byte_t digit11:4;
-      Byte_t digit14:4;
-      Byte_t digit13:4;
-#define EVEN_PARITY 0
-#define ODD_PARITY  1
-      Byte_t parity:4;
-      Byte_t digit15:4;
-    } num;
-#define IMSI_SIZE   8
-    Byte_t value[IMSI_SIZE];
-  } u;
-} imsi_t;
-
-#define NAS_IMSI2STR(iMsI_t_PtR,iMsI_sTr, MaXlEn) \
-        {\
-          int l_offset = 0;\
-          int l_ret    = 0;\
-          l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u%u%u%u%u",\
-	    		  iMsI_t_PtR->u.num.digit1, iMsI_t_PtR->u.num.digit2,\
-	    		  iMsI_t_PtR->u.num.digit3, iMsI_t_PtR->u.num.digit4,\
-	    		  iMsI_t_PtR->u.num.digit5);\
-	      if ((iMsI_t_PtR->u.num.digit6 != 0xf)  && (l_ret > 0)) {\
-	    	l_offset += l_ret;\
-	    	l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset,  "%u", iMsI_t_PtR->u.num.digit6);\
-	      }\
-	      if (l_ret > 0) {\
-	    	l_offset += l_ret;\
-	    	l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u%u%u%u%u%u%u%u",\
-	    		  iMsI_t_PtR->u.num.digit7, iMsI_t_PtR->u.num.digit8,\
-	    		  iMsI_t_PtR->u.num.digit9, iMsI_t_PtR->u.num.digit10,\
-	    		  iMsI_t_PtR->u.num.digit11, iMsI_t_PtR->u.num.digit12,\
-	    		  iMsI_t_PtR->u.num.digit13, iMsI_t_PtR->u.num.digit14);\
-	      }\
-	      if ((iMsI_t_PtR->u.num.digit15 != 0xf)   && (l_ret > 0)) {\
-	    	l_offset += l_ret;\
-	    	l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u", iMsI_t_PtR->u.num.digit15);\
-	      }\
-	    }
-
-/*
- * Mobile subscriber dialing number
- */
-typedef struct {
-  Byte_t ext:1;
-  /* Type Of Number           */
-#define MSISDN_TON_UNKNOWKN     0b000
-#define MSISDN_TON_INTERNATIONAL    0b001
-#define MSISDN_TON_NATIONAL     0b010
-#define MSISDN_TON_NETWORK      0b011
-#define MSISDN_TON_SUBCRIBER        0b100
-#define MSISDN_TON_ABBREVIATED      0b110
-#define MSISDN_TON_RESERVED     0b111
-  Byte_t ton:3;
-  /* Numbering Plan Identification    */
-#define MSISDN_NPI_UNKNOWN      0b0000
-#define MSISDN_NPI_ISDN_TELEPHONY   0b0001
-#define MSISDN_NPI_GENERIC      0b0010
-#define MSISDN_NPI_DATA         0b0011
-#define MSISDN_NPI_TELEX        0b0100
-#define MSISDN_NPI_MARITIME_MOBILE  0b0101
-#define MSISDN_NPI_LAND_MOBILE      0b0110
-#define MSISDN_NPI_ISDN_MOBILE      0b0111
-#define MSISDN_NPI_PRIVATE      0b1110
-#define MSISDN_NPI_RESERVED     0b1111
-  Byte_t npi:4;
-  /* Dialing Number           */
-  struct {
-    Byte_t lsb:4;
-    Byte_t msb:4;
-#define MSISDN_DIGIT_SIZE   10
-  } digit[MSISDN_DIGIT_SIZE];
-} msisdn_t;
-
-/*
- * International Mobile Equipment Identity
- */
-typedef imsi_t imei_t;
-
-/*
- * Public Land Mobile Network identifier
- * PLMN = BCD encoding (Mobile Country Code + Mobile Network Code)
- */
-typedef struct {
-  Byte_t MCCdigit2:4;
-  Byte_t MCCdigit1:4;
-  Byte_t MNCdigit3:4;
-  Byte_t MCCdigit3:4;
-  Byte_t MNCdigit2:4;
-  Byte_t MNCdigit1:4;
-} plmn_t;
-
-/*
- * Location Area Identification
- */
-typedef struct {
-  plmn_t plmn;    /* <MCC> + <MNC>    */
-  lac_t lac;      /* Location Area Code   */
-} lai_t;
-
-/*
- * GPRS Routing Area Identification
- */
-typedef struct {
-  plmn_t plmn;    /* <MCC> + <MNC>    */
-  lac_t lac;      /* Location Area Code   */
-  rac_t rac;      /* Routing Area Code    */
-} RAI_t;
-
-/*
- * EPS Tracking Area Identification
- */
-typedef struct {
-  plmn_t plmn;    /* <MCC> + <MNC>    */
-  tac_t tac;      /* Tracking Area Code   */
-} tai_t;
-
-/*
- * EPS Globally Unique MME Identity
- */
-typedef struct {
-  plmn_t plmn;    /* <MCC> + <MNC>    */
-  uint16_t MMEgid;    /* MME group identifier */
-  uint8_t MMEcode;    /* MME code     */
-} gummei_t;
-
-/*
- * EPS Globally Unique Temporary UE Identity
- */
-typedef struct {
-  gummei_t gummei;    /* Globally Unique MME Identity         */
-  uint32_t m_tmsi;    /* M-Temporary Mobile Subscriber Identity   */
-} GUTI_t;
-#define GUTI2STR(GuTi_PtR, GuTi_StR, MaXlEn) \
-        {\
-          int l_offset = 0;\
-          int l_ret    = 0;\
-          l_ret += snprintf(GuTi_StR + l_offset,MaXlEn-l_offset, "%03u.",\
-	    		  GuTi_PtR->gummei.plmn.MCCdigit3 * 100 +\
-                  GuTi_PtR->gummei.plmn.MCCdigit2 * 10 +\
-                  GuTi_PtR->gummei.plmn.MCCdigit1);\
-          if (l_ret > 0) {\
-        	l_offset += l_ret;\
-          }  else {\
-        	l_offset = MaXlEn;\
-          }\
-          if (GuTi_PtR->gummei.plmn.MNCdigit1 != 0xf) {\
-              l_ret += snprintf(GuTi_StR + l_offset,MaXlEn-l_offset, "%03u|%04x|%02x|%08x",\
-    	    		  GuTi_PtR->gummei.plmn.MNCdigit3 * 100 +\
-                      GuTi_PtR->gummei.plmn.MNCdigit2 * 10 +\
-                      GuTi_PtR->gummei.plmn.MNCdigit1,\
-                      GuTi_PtR->gummei.MMEgid,\
-                      GuTi_PtR->gummei.MMEcode,\
-                      GuTi_PtR->m_tmsi);\
-          } else {\
-              l_ret += snprintf(GuTi_StR + l_offset,MaXlEn-l_offset, "%02u|%04x|%02x|%08x",\
-                      GuTi_PtR->gummei.plmn.MNCdigit2 * 10 +\
-                      GuTi_PtR->gummei.plmn.MNCdigit1,\
-                      GuTi_PtR->gummei.MMEgid,\
-                      GuTi_PtR->gummei.MMEcode,\
-                      GuTi_PtR->m_tmsi);\
-          }\
-	    }
-
-
-
-
-/* Checks PLMN validity */
-#define PLMN_IS_VALID(plmn) (((plmn).MCCdigit1 &    \
-                              (plmn).MCCdigit2 &    \
-                              (plmn).MCCdigit3) != 0x0F)
-
-/* Checks TAC validity */
-#define TAC_IS_VALID(tac)   (((tac) != 0x0000) && ((tac) != 0xFFF0))
-
-/* Checks TAI validity */
-#define TAI_IS_VALID(tai)   (PLMN_IS_VALID((tai).plmn) &&   \
-                             TAC_IS_VALID((tai).tac))
-/*
- * A list of PLMNs
- */
-#define PLMN_LIST_T(SIZE) struct {Byte_t n_plmns; plmn_t plmn[SIZE];}
-
-/*
- * A list of TACs
- */
-#define TAC_LIST_T(SIZE) struct {Byte_t n_tacs; TAC_t tac[SIZE];}
-
-/*
- * A list of TAIs
- */
-#define TAI_LIST_T(SIZE) struct {Byte_t n_tais; tai_t tai[SIZE];}
-
-typedef enum eps_protocol_discriminator_e {
-  /* Protocol discriminator identifier for EPS Mobility Management */
-  EPS_MOBILITY_MANAGEMENT_MESSAGE =   0x7,
-
-  /* Protocol discriminator identifier for EPS Session Management */
-  EPS_SESSION_MANAGEMENT_MESSAGE =    0x2,
-} eps_protocol_discriminator_t;
-
-/****************************************************************************/
-/********************  G L O B A L    V A R I A B L E S  ********************/
-/****************************************************************************/
-
-/****************************************************************************/
-/******************  E X P O R T E D    F U N C T I O N S  ******************/
-/****************************************************************************/
-
-#endif /* __COMMONDEF_H__*/
diff --git a/openair3/NAS/COMMON/networkDef.h b/openair3/NAS/COMMON/networkDef.h
deleted file mode 100644
index 5390eac2f0ba1d7be6cd59d311d4ab2358967a4b..0000000000000000000000000000000000000000
--- a/openair3/NAS/COMMON/networkDef.h
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Copyright (c) 2015, EURECOM (www.eurecom.fr)
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- *    list of conditions and the following disclaimer.
- * 2. 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.
- *
- * 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 OWNER 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.
- *
- * The views and conclusions contained in the software and documentation are those
- * of the authors and should not be interpreted as representing official policies,
- * either expressed or implied, of the FreeBSD Project.
- */
-
-/*****************************************************************************
-
-Source      networkDef.h
-
-Version     0.1
-
-Date        2012/09/21
-
-Product     NAS stack
-
-Subsystem   include
-
-Author      Frederic Maurel
-
-Description Contains network's global definitions
-
-*****************************************************************************/
-#ifndef __NETWORKDEF_H__
-#define __NETWORKDEF_H__
-
-/****************************************************************************/
-/*********************  G L O B A L    C O N S T A N T S  *******************/
-/****************************************************************************/
-
-/*
- * ----------------------
- * Network selection mode
- * ----------------------
- */
-#define NET_PLMN_AUTO           0
-#define NET_PLMN_MANUAL         1
-
-/*
- * ---------------------------
- * Network registration status
- * ---------------------------
- */
-/* not registered, not currently searching an operator to register to */
-#define NET_REG_STATE_OFF       0
-/* registered, home network                       */
-#define NET_REG_STATE_HN        1
-/* not registered, currently trying to attach or searching an operator
- * to register to                         */
-#define NET_REG_STATE_ON        2
-/* registration denied                        */
-#define NET_REG_STATE_DENIED        3
-/* unknown (e.g. out of GERAN/UTRAN/E-UTRAN coverage)         */
-#define NET_REG_STATE_UNKNOWN       4
-/* registered, roaming                        */
-#define NET_REG_STATE_ROAMING       5
-/* registered for "SMS only", home network                */
-#define NET_REG_STATE_SMS_HN        6
-/* registered, for "SMS only", roaming                */
-#define NET_REG_STATE_SMS_ROAMING   7
-/* attached for emergency bearer services only (applicable to UTRAN)  */
-#define NET_REG_STATE_EMERGENCY     8
-
-/*
- * ------------------------------------
- * Network access technology indicators
- * ------------------------------------
- */
-#define NET_ACCESS_UNAVAILABLE  (-1)    /* Not available        */
-#define NET_ACCESS_GSM      0   /* GSM              */
-#define NET_ACCESS_COMPACT  1   /* GSM Compact          */
-#define NET_ACCESS_UTRAN    2   /* UTRAN            */
-#define NET_ACCESS_EGPRS    3   /* GSM w/EGPRS          */
-#define NET_ACCESS_HSDPA    4   /* UTRAN w/HSDPA        */
-#define NET_ACCESS_HSUPA    5   /* UTRAN w/HSUPA        */
-#define NET_ACCESS_HSDUPA   6   /* UTRAN w/HSDPA and HSUPA  */
-#define NET_ACCESS_EUTRAN   7   /* E-UTRAN          */
-
-/*
- * ---------------------------------------
- * Network operator representation formats
- * ---------------------------------------
- */
-#define NET_FORMAT_LONG     0   /* long format alphanumeric */
-#define NET_FORMAT_SHORT    1   /* short format alphanumeric    */
-#define NET_FORMAT_NUM      2   /* numeric format       */
-
-#define NET_FORMAT_MAX_SIZE NET_FORMAT_LONG_SIZE
-
-/*
- * -----------------------------
- * Network operator availability
- * -----------------------------
- */
-#define NET_OPER_UNKNOWN    0   /* unknown operator     */
-#define NET_OPER_AVAILABLE  1   /* available operator       */
-#define NET_OPER_CURRENT    2   /* currently selected operator  */
-#define NET_OPER_FORBIDDEN  3   /* forbidden operator       */
-
-/*
- * --------------------------------------
- * Network connection establishment cause
- * --------------------------------------
- */
-#define NET_ESTABLISH_CAUSE_EMERGENCY       0x01
-#define NET_ESTABLISH_CAUSE_HIGH_PRIO       0x02
-#define NET_ESTABLISH_CAUSE_MT_ACCESS       0x03
-#define NET_ESTABLISH_CAUSE_MO_SIGNAL       0x04
-#define NET_ESTABLISH_CAUSE_MO_DATA     0x05
-#define NET_ESTABLISH_CAUSE_V1020       0x06
-
-/*
- * --------------------------------------
- * Network connection establishment type
- * --------------------------------------
- */
-#define NET_ESTABLISH_TYPE_ORIGINATING_SIGNAL   0x10
-#define NET_ESTABLISH_TYPE_EMERGENCY_CALLS  0x20
-#define NET_ESTABLISH_TYPE_ORIGINATING_CALLS    0x30
-#define NET_ESTABLISH_TYPE_TERMINATING_CALLS    0x40
-#define NET_ESTABLISH_TYPE_MO_CS_FALLBACK   0x50
-
-/*
- * -------------------
- * PDN connection type
- * -------------------
- */
-#define NET_PDN_TYPE_IPV4   (0 + 1)
-#define NET_PDN_TYPE_IPV6   (1 + 1)
-#define NET_PDN_TYPE_IPV4V6 (2 + 1)
-
-/****************************************************************************/
-/************************  G L O B A L    T Y P E S  ************************/
-/****************************************************************************/
-
-/*
- * ---------------------
- * PDN connection status
- * ---------------------
- */
-typedef enum {
-  /* MT = The Mobile Terminal, NW = The Network               */
-  NET_PDN_MT_DEFAULT_ACT = 1, /* MT has activated a PDN connection        */
-  NET_PDN_NW_DEFAULT_DEACT,   /* NW has deactivated a PDN connection      */
-  NET_PDN_MT_DEFAULT_DEACT,   /* MT has deactivated a PDN connection      */
-  NET_PDN_NW_DEDICATED_ACT,   /* NW has activated an EPS bearer context   */
-  NET_PDN_MT_DEDICATED_ACT,   /* MT has activated an EPS bearer context   */
-  NET_PDN_NW_DEDICATED_DEACT, /* NW has deactivated an EPS bearer context */
-  NET_PDN_MT_DEDICATED_DEACT, /* MT has deactivated an EPS bearer context */
-} network_pdn_state_t;
-
-/*
- * ---------------------------
- * Network operator identifier
- * ---------------------------
- */
-typedef struct {
-#define NET_FORMAT_LONG_SIZE    16  /* Long alphanumeric format     */
-#define NET_FORMAT_SHORT_SIZE   8   /* Short alphanumeric format        */
-#define NET_FORMAT_NUM_SIZE 6   /* Numeric format (PLMN identifier  */
-  union {
-    unsigned char alpha_long[NET_FORMAT_LONG_SIZE+1];
-    unsigned char alpha_short[NET_FORMAT_SHORT_SIZE+1];
-    unsigned char num[NET_FORMAT_NUM_SIZE+1];
-  } id;
-} network_plmn_t;
-
-/*
- * -------------------------------
- * EPS bearer level QoS parameters
- * -------------------------------
- */
-typedef struct {
-  int gbrUL;      /* Guaranteed Bit Rate for uplink   */
-  int gbrDL;      /* Guaranteed Bit Rate for downlink */
-  int mbrUL;      /* Maximum Bit Rate for uplink      */
-  int mbrDL;      /* Maximum Bit Rate for downlink    */
-  int qci;        /* QoS Class Identifier         */
-} network_qos_t;
-
-/*
- * -----------------------------
- * IPv4 packet filter parameters
- * -----------------------------
- */
-typedef struct {
-  unsigned char protocol; /* Protocol identifier      */
-  unsigned char tos;      /* Type of service      */
-#define NET_PACKET_FILTER_IPV4_ADDR_SIZE    4
-  unsigned char addr[NET_PACKET_FILTER_IPV4_ADDR_SIZE];
-  unsigned char mask[NET_PACKET_FILTER_IPV4_ADDR_SIZE];
-} network_ipv4_data_t;
-
-/*
- * -----------------------------
- * IPv6 packet filter parameters
- * -----------------------------
- */
-typedef struct {
-  unsigned char nh;       /* Next header type     */
-  unsigned char tf;       /* Traffic class        */
-#define NET_PACKET_FILTER_IPV6_ADDR_SIZE    16
-  unsigned char addr[NET_PACKET_FILTER_IPV6_ADDR_SIZE];
-  unsigned char mask[NET_PACKET_FILTER_IPV6_ADDR_SIZE];
-  unsigned int ipsec;     /* IPSec security parameter index */
-  unsigned int fl;        /* Flow label             */
-} network_ipv6_data_t;
-
-/*
- * -------------
- * Packet Filter
- * -------------
- */
-typedef struct {
-  unsigned char id;       /* Packet filter identifier */
-#define NET_PACKET_FILTER_DOWNLINK  0x01
-#define NET_PACKET_FILTER_UPLINK    0x02
-#define NET_PACKET_FILTER_BIDIR     0x03
-  unsigned char dir;      /* Packet filter direction  */
-  unsigned char precedence;   /* Evaluation precedence    */
-  union {
-    network_ipv4_data_t ipv4;
-    network_ipv6_data_t ipv6;
-  } data;
-  unsigned short lport;   /* Local (UE) port number   */
-  unsigned short rport;   /* Remote (network) port number */
-} network_pkf_t;
-
-/*
- * ---------------------
- * Traffic Flow Template
- * ---------------------
- */
-typedef struct {
-  int n_pkfs;
-#define NET_PACKET_FILTER_MAX   16
-  network_pkf_t* pkf[NET_PACKET_FILTER_MAX];
-} network_tft_t;
-
-/****************************************************************************/
-/********************  G L O B A L    V A R I A B L E S  ********************/
-/****************************************************************************/
-
-/****************************************************************************/
-/******************  E X P O R T E D    F U N C T I O N S  ******************/
-/****************************************************************************/
-
-#endif /* __NETWORKDEF_H__*/
diff --git a/openair3/NAS/TEST/USER/user_parser.h b/openair3/NAS/TEST/USER/user_parser.h
index d1972de02894dbf80ec04f9c5d5d60d80501ca5c..e7fc07ee329a6e61fcdeda20e74fdc334a1c9975 100644
--- a/openair3/NAS/TEST/USER/user_parser.h
+++ b/openair3/NAS/TEST/USER/user_parser.h
@@ -39,8 +39,8 @@ Description Command line parser of the user simulator process
 
 *****************************************************************************/
 
-#ifndef __USER_PARSER_H__
-#define __USER_PARSER__H__
+#ifndef __NAS_TEST_USER_USER_PARSER__H__
+#define __NAS_TEST_USER_USER_PARSER__H__
 
 /****************************************************************************/
 /*********************  G L O B A L    C O N S T A N T S  *******************/
@@ -74,4 +74,4 @@ const char* user_parser_get_port(void);
 const char* user_parser_get_devpath(void);
 const char* user_parser_get_devattr(void);
 
-#endif /* __USER_PARSER_H__*/
+#endif /* __NAS_TEST_USER_USER_PARSER__H__ */
diff --git a/openair3/NAS/TOOLS/conf_network.c b/openair3/NAS/TOOLS/conf_network.c
index 7e71c9b4ee79cafbd68404350195e3c4dec18975..054189a130c949e4d132c04e9c72bf0b7cf22d49 100644
--- a/openair3/NAS/TOOLS/conf_network.c
+++ b/openair3/NAS/TOOLS/conf_network.c
@@ -43,7 +43,7 @@ void gen_network_record_from_conf(const plmn_conf_param_t *conf, network_record_
 		strcpy(record->fullname, conf->fullname);
 		strcpy(record->shortname, conf->shortname);
 
-		char num[6];
+		char num[60];
 		sprintf(num, "%s%s", conf->mcc, conf->mnc);
 		record->num = atoi(num);
 
diff --git a/openair3/TEST/oaisim_mme_test_s1c_s1ap.h b/openair3/TEST/oaisim_mme_test_s1c_s1ap.h
index 3633f11e867424c2d4dc904076f99d43aff9f10e..4faec0e66e53085a80175a4383b233c29fec3694 100644
--- a/openair3/TEST/oaisim_mme_test_s1c_s1ap.h
+++ b/openair3/TEST/oaisim_mme_test_s1c_s1ap.h
@@ -19,6 +19,9 @@
  *      contact@openairinterface.org
  */
 
+#ifndef __TEST_OAISIM_MME_TEST_S1C_S1AP__H__
+#define __TEST_OAISIM_MME_TEST_S1C_S1AP__H__
+
 #define _GNU_SOURCE
 #include <stdio.h>
 #include <stdlib.h>
@@ -53,3 +56,5 @@ void s1ap_eNB_register_mme(s1ap_eNB_instance_t *instance_p,
                                   uint16_t             out_streams);
 void s1ap_eNB_handle_register_eNB(instance_t instance, s1ap_register_enb_req_t *s1ap_register_eNB);
 void *s1ap_eNB_task(void *arg);
+
+#endif
diff --git a/openair3/TEST/oaisim_mme_test_s1c_scenario.h b/openair3/TEST/oaisim_mme_test_s1c_scenario.h
index 8c33f457418e8fa67ba0a84cc940a66634206d7d..8b9a8dd54a14fc74b81f4fa8ba8aecbbaba51ac2 100644
--- a/openair3/TEST/oaisim_mme_test_s1c_scenario.h
+++ b/openair3/TEST/oaisim_mme_test_s1c_scenario.h
@@ -19,6 +19,9 @@
  *      contact@openairinterface.org
  */
 
+#ifndef __TEST_OAISIM_MME_TEST_S1C_SCENARIO__H__
+#define __TEST_OAISIM_MME_TEST_S1C_SCENARIO__H__
+
 #include <stdlib.h>
 #include <stdint.h>
 
@@ -49,3 +52,5 @@ int      compare_buffer(const uint8_t *buffer, const uint32_t length_buffer, con
 unsigned decode_hex_length(const char *h);
 int      decode_hex(uint8_t *dst, const char *h);
 uint8_t *decode_hex_dup(const char *hex);
+
+#endif
diff --git a/openair3/UTILS/mme_config.h b/openair3/UTILS/mme_config.h
index 37b7dff8651359e6415351f3deee6bf30f1c70ab..417c8bbd5f44606a3599018ca7700779025c2ce0 100644
--- a/openair3/UTILS/mme_config.h
+++ b/openair3/UTILS/mme_config.h
@@ -19,14 +19,14 @@
  *      contact@openairinterface.org
  */
 
+#ifndef __UTILS_MME_CONFIG__H__
+#define __UTILS_MME_CONFIG__H__
+
 #include <pthread.h>
 #include <stdint.h>
 
 #include "mme_default_values.h"
 
-#ifndef MME_CONFIG_H_
-#define MME_CONFIG_H_
-
 #define MME_CONFIG_STRING_MME_CONFIG                     "MME"
 #define MME_CONFIG_STRING_REALM                          "REALM"
 #define MME_CONFIG_STRING_MAXENB                         "MAXENB"
@@ -183,4 +183,4 @@ int config_parse_opt_line(int argc, char *argv[], mme_config_t *mme_config);
 
 //int yyparse(struct mme_config_s *mme_config_p);
 
-#endif /* MME_CONFIG_H_ */
+#endif /* __UTILS_MME_CONFIG__H__ */
diff --git a/openair3/UTILS/queue.h b/openair3/UTILS/queue.h
deleted file mode 100644
index f8665c0f1a37b15fbe2b0c7be54354455b644314..0000000000000000000000000000000000000000
--- a/openair3/UTILS/queue.h
+++ /dev/null
@@ -1,592 +0,0 @@
-/*
- * Copyright (c) 1991, 1993
- *  The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. 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.
- * 3. Neither the name of the University 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 REGENTS 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 REGENTS 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.
- *
- *  @(#)queue.h 8.5 (Berkeley) 8/20/94
- */
-
-#ifndef _SYS_QUEUE_H_
-#define _SYS_QUEUE_H_
-
-/*
- * This file defines five types of data structures: singly-linked lists,
- * lists, simple queues, tail queues, and circular queues.
- *
- * A singly-linked list is headed by a single forward pointer. The
- * elements are singly linked for minimum space and pointer manipulation
- * overhead at the expense of O(n) removal for arbitrary elements. New
- * elements can be added to the list after an existing element or at the
- * head of the list.  Elements being removed from the head of the list
- * should use the explicit macro for this purpose for optimum
- * efficiency. A singly-linked list may only be traversed in the forward
- * direction.  Singly-linked lists are ideal for applications with large
- * datasets and few or no removals or for implementing a LIFO queue.
- *
- * A list is headed by a single forward pointer (or an array of forward
- * pointers for a hash table header). The elements are doubly linked
- * so that an arbitrary element can be removed without a need to
- * traverse the list. New elements can be added to the list before
- * or after an existing element or at the head of the list. A list
- * may only be traversed in the forward direction.
- *
- * A simple queue is headed by a pair of pointers, one the head of the
- * list and the other to the tail of the list. The elements are singly
- * linked to save space, so elements can only be removed from the
- * head of the list. New elements can be added to the list after
- * an existing element, at the head of the list, or at the end of the
- * list. A simple queue may only be traversed in the forward direction.
- *
- * A tail queue is headed by a pair of pointers, one to the head of the
- * list and the other to the tail of the list. The elements are doubly
- * linked so that an arbitrary element can be removed without a need to
- * traverse the list. New elements can be added to the list before or
- * after an existing element, at the head of the list, or at the end of
- * the list. A tail queue may be traversed in either direction.
- *
- * A circle queue is headed by a pair of pointers, one to the head of the
- * list and the other to the tail of the list. The elements are doubly
- * linked so that an arbitrary element can be removed without a need to
- * traverse the list. New elements can be added to the list before or after
- * an existing element, at the head of the list, or at the end of the list.
- * A circle queue may be traversed in either direction, but has a more
- * complex end of list detection.
- *
- * For details on the use of these macros, see the queue(3) manual page.
- *                      SLIST   LIST    STAILQ  TAILQ   CIRCLEQ
- * _HEAD                +       +       +       +       +
- * _HEAD_INITIALIZER    +       +       +       +       +
- * _ENTRY               +       +       +       +       +
- * _INIT                +       +       +       +       +
- * _EMPTY               +       +       +       +       +
- * _FIRST               +       +       +       +       +
- * _NEXT                +       +       +       +       +
- * _PREV                -       -       -       +       +
- * _LAST                -       -       +       +       +
- * _FOREACH             +       +       +       +       +
- * _FOREACH_REVERSE     -       -       -       +       +
- * _INSERT_HEAD         +       +       +       +       +
- * _INSERT_BEFORE       -       +       -       +       +
- * _INSERT_AFTER        +       +       +       +       +
- * _INSERT_TAIL         -       -       +       +       +
- * _REMOVE_HEAD         +       -       +       -       -
- * _REMOVE              +       +       +       +       +
- */
-
-/*
- * List definitions.
- */
-#define LIST_HEAD(name, type)           \
-struct name {               \
-  struct type *lh_first;  /* first element */     \
-}
-
-#define LIST_HEAD_INITIALIZER(head)         \
-  { NULL }
-
-#define LIST_ENTRY(type)            \
-struct {                \
-  struct type *le_next; /* next element */      \
-  struct type **le_prev;  /* address of previous next element */  \
-}
-
-/*
- * List functions.
- */
-#define LIST_INIT(head) do {            \
-  (head)->lh_first = NULL;          \
-} while (/*CONSTCOND*/0)
-
-#define LIST_INSERT_AFTER(listelm, elm, field) do {     \
-  if (((elm)->field.le_next = (listelm)->field.le_next) != NULL)  \
-    (listelm)->field.le_next->field.le_prev =   \
-        &(elm)->field.le_next;        \
-  (listelm)->field.le_next = (elm);       \
-  (elm)->field.le_prev = &(listelm)->field.le_next;   \
-} while (/*CONSTCOND*/0)
-
-#define LIST_INSERT_BEFORE(listelm, elm, field) do {      \
-  (elm)->field.le_prev = (listelm)->field.le_prev;    \
-  (elm)->field.le_next = (listelm);       \
-  *(listelm)->field.le_prev = (elm);        \
-  (listelm)->field.le_prev = &(elm)->field.le_next;   \
-} while (/*CONSTCOND*/0)
-
-#define LIST_INSERT_HEAD(head, elm, field) do {       \
-  if (((elm)->field.le_next = (head)->lh_first) != NULL)    \
-    (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
-  (head)->lh_first = (elm);         \
-  (elm)->field.le_prev = &(head)->lh_first;     \
-} while (/*CONSTCOND*/0)
-
-#define LIST_REMOVE(elm, field) do {          \
-  if ((elm)->field.le_next != NULL)       \
-    (elm)->field.le_next->field.le_prev =       \
-        (elm)->field.le_prev;       \
-  *(elm)->field.le_prev = (elm)->field.le_next;     \
-} while (/*CONSTCOND*/0)
-
-#define LIST_FOREACH(var, head, field)          \
-  for ((var) = ((head)->lh_first);        \
-    (var);              \
-    (var) = ((var)->field.le_next))
-
-/*
- * List access methods.
- */
-#define LIST_EMPTY(head)    ((head)->lh_first == NULL)
-#define LIST_FIRST(head)    ((head)->lh_first)
-#define LIST_NEXT(elm, field)   ((elm)->field.le_next)
-
-
-/*
- * Singly-linked List definitions.
- */
-#define SLIST_HEAD(name, type)            \
-struct name {               \
-  struct type *slh_first; /* first element */     \
-}
-
-#define SLIST_HEAD_INITIALIZER(head)          \
-  { NULL }
-
-#define SLIST_ENTRY(type)           \
-struct {                \
-  struct type *sle_next;  /* next element */      \
-}
-
-/*
- * Singly-linked List functions.
- */
-#define SLIST_INIT(head) do {           \
-  (head)->slh_first = NULL;         \
-} while (/*CONSTCOND*/0)
-
-#define SLIST_INSERT_AFTER(slistelm, elm, field) do {     \
-  (elm)->field.sle_next = (slistelm)->field.sle_next;   \
-  (slistelm)->field.sle_next = (elm);       \
-} while (/*CONSTCOND*/0)
-
-#define SLIST_INSERT_HEAD(head, elm, field) do {      \
-  (elm)->field.sle_next = (head)->slh_first;      \
-  (head)->slh_first = (elm);          \
-} while (/*CONSTCOND*/0)
-
-#define SLIST_REMOVE_HEAD(head, field) do {       \
-  (head)->slh_first = (head)->slh_first->field.sle_next;    \
-} while (/*CONSTCOND*/0)
-
-#define SLIST_REMOVE(head, elm, type, field) do {     \
-  if ((head)->slh_first == (elm)) {       \
-    SLIST_REMOVE_HEAD((head), field);     \
-  }               \
-  else {                \
-    struct type *curelm = (head)->slh_first;    \
-    while(curelm->field.sle_next != (elm))      \
-      curelm = curelm->field.sle_next;    \
-    curelm->field.sle_next =        \
-        curelm->field.sle_next->field.sle_next;   \
-  }               \
-} while (/*CONSTCOND*/0)
-
-#define SLIST_FOREACH(var, head, field)         \
-  for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next)
-
-/*
- * Singly-linked List access methods.
- */
-#define SLIST_EMPTY(head) ((head)->slh_first == NULL)
-#define SLIST_FIRST(head) ((head)->slh_first)
-#define SLIST_NEXT(elm, field)  ((elm)->field.sle_next)
-
-
-/*
- * Singly-linked Tail queue declarations.
- */
-#define STAILQ_HEAD(name, type)         \
-struct name {               \
-  struct type *stqh_first;  /* first element */     \
-  struct type **stqh_last;  /* addr of last next element */   \
-}
-
-#define STAILQ_HEAD_INITIALIZER(head)         \
-  { NULL, &(head).stqh_first }
-
-#define STAILQ_ENTRY(type)            \
-struct {                \
-  struct type *stqe_next; /* next element */      \
-}
-
-/*
- * Singly-linked Tail queue functions.
- */
-#define STAILQ_INIT(head) do {            \
-  (head)->stqh_first = NULL;          \
-  (head)->stqh_last = &(head)->stqh_first;        \
-} while (/*CONSTCOND*/0)
-
-#define STAILQ_INSERT_HEAD(head, elm, field) do {     \
-  if (((elm)->field.stqe_next = (head)->stqh_first) == NULL)  \
-    (head)->stqh_last = &(elm)->field.stqe_next;    \
-  (head)->stqh_first = (elm);         \
-} while (/*CONSTCOND*/0)
-
-#define STAILQ_INSERT_TAIL(head, elm, field) do {     \
-  (elm)->field.stqe_next = NULL;          \
-  *(head)->stqh_last = (elm);         \
-  (head)->stqh_last = &(elm)->field.stqe_next;      \
-} while (/*CONSTCOND*/0)
-
-#define STAILQ_INSERT_AFTER(head, listelm, elm, field) do {   \
-  if (((elm)->field.stqe_next = (listelm)->field.stqe_next) == NULL)\
-    (head)->stqh_last = &(elm)->field.stqe_next;    \
-  (listelm)->field.stqe_next = (elm);       \
-} while (/*CONSTCOND*/0)
-
-#define STAILQ_REMOVE_HEAD(head, field) do {        \
-  if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) == NULL) \
-    (head)->stqh_last = &(head)->stqh_first;      \
-} while (/*CONSTCOND*/0)
-
-#define STAILQ_REMOVE(head, elm, type, field) do {      \
-  if ((head)->stqh_first == (elm)) {        \
-    STAILQ_REMOVE_HEAD((head), field);      \
-  } else {              \
-    struct type *curelm = (head)->stqh_first;   \
-    while (curelm->field.stqe_next != (elm))      \
-      curelm = curelm->field.stqe_next;   \
-    if ((curelm->field.stqe_next =        \
-      curelm->field.stqe_next->field.stqe_next) == NULL) \
-          (head)->stqh_last = &(curelm)->field.stqe_next; \
-  }               \
-} while (/*CONSTCOND*/0)
-
-#define STAILQ_FOREACH(var, head, field)        \
-  for ((var) = ((head)->stqh_first);        \
-    (var);              \
-    (var) = ((var)->field.stqe_next))
-
-#define STAILQ_CONCAT(head1, head2) do {        \
-  if (!STAILQ_EMPTY((head2))) {         \
-    *(head1)->stqh_last = (head2)->stqh_first;    \
-    (head1)->stqh_last = (head2)->stqh_last;    \
-    STAILQ_INIT((head2));         \
-  }               \
-} while (/*CONSTCOND*/0)
-
-/*
- * Singly-linked Tail queue access methods.
- */
-#define STAILQ_EMPTY(head)  ((head)->stqh_first == NULL)
-#define STAILQ_FIRST(head)  ((head)->stqh_first)
-#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
-
-
-/*
- * Simple queue definitions.
- */
-#define SIMPLEQ_HEAD(name, type)          \
-struct name {               \
-  struct type *sqh_first; /* first element */     \
-  struct type **sqh_last; /* addr of last next element */   \
-}
-
-#define SIMPLEQ_HEAD_INITIALIZER(head)          \
-  { NULL, &(head).sqh_first }
-
-#define SIMPLEQ_ENTRY(type)           \
-struct {                \
-  struct type *sqe_next;  /* next element */      \
-}
-
-/*
- * Simple queue functions.
- */
-#define SIMPLEQ_INIT(head) do {           \
-  (head)->sqh_first = NULL;         \
-  (head)->sqh_last = &(head)->sqh_first;        \
-} while (/*CONSTCOND*/0)
-
-#define SIMPLEQ_INSERT_HEAD(head, elm, field) do {      \
-  if (((elm)->field.sqe_next = (head)->sqh_first) == NULL)  \
-    (head)->sqh_last = &(elm)->field.sqe_next;    \
-  (head)->sqh_first = (elm);          \
-} while (/*CONSTCOND*/0)
-
-#define SIMPLEQ_INSERT_TAIL(head, elm, field) do {      \
-  (elm)->field.sqe_next = NULL;         \
-  *(head)->sqh_last = (elm);          \
-  (head)->sqh_last = &(elm)->field.sqe_next;      \
-} while (/*CONSTCOND*/0)
-
-#define SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do {    \
-  if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\
-    (head)->sqh_last = &(elm)->field.sqe_next;    \
-  (listelm)->field.sqe_next = (elm);        \
-} while (/*CONSTCOND*/0)
-
-#define SIMPLEQ_REMOVE_HEAD(head, field) do {       \
-  if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \
-    (head)->sqh_last = &(head)->sqh_first;      \
-} while (/*CONSTCOND*/0)
-
-#define SIMPLEQ_REMOVE(head, elm, type, field) do {     \
-  if ((head)->sqh_first == (elm)) {       \
-    SIMPLEQ_REMOVE_HEAD((head), field);     \
-  } else {              \
-    struct type *curelm = (head)->sqh_first;    \
-    while (curelm->field.sqe_next != (elm))     \
-      curelm = curelm->field.sqe_next;    \
-    if ((curelm->field.sqe_next =       \
-      curelm->field.sqe_next->field.sqe_next) == NULL) \
-          (head)->sqh_last = &(curelm)->field.sqe_next; \
-  }               \
-} while (/*CONSTCOND*/0)
-
-#define SIMPLEQ_FOREACH(var, head, field)       \
-  for ((var) = ((head)->sqh_first);       \
-    (var);              \
-    (var) = ((var)->field.sqe_next))
-
-/*
- * Simple queue access methods.
- */
-#define SIMPLEQ_EMPTY(head)   ((head)->sqh_first == NULL)
-#define SIMPLEQ_FIRST(head)   ((head)->sqh_first)
-#define SIMPLEQ_NEXT(elm, field)  ((elm)->field.sqe_next)
-
-
-/*
- * Tail queue definitions.
- */
-#define _TAILQ_HEAD(name, type, qual)         \
-struct name {               \
-  qual type *tqh_first;   /* first element */   \
-  qual type *qual *tqh_last;  /* addr of last next element */ \
-}
-#define TAILQ_HEAD(name, type)  _TAILQ_HEAD(name, struct type,)
-
-#define TAILQ_HEAD_INITIALIZER(head)          \
-  { NULL, &(head).tqh_first }
-
-#define _TAILQ_ENTRY(type, qual)          \
-struct {                \
-  qual type *tqe_next;    /* next element */    \
-  qual type *qual *tqe_prev;  /* address of previous next element */\
-}
-#define TAILQ_ENTRY(type) _TAILQ_ENTRY(struct type,)
-
-/*
- * Tail queue functions.
- */
-#define TAILQ_INIT(head) do {           \
-  (head)->tqh_first = NULL;         \
-  (head)->tqh_last = &(head)->tqh_first;        \
-} while (/*CONSTCOND*/0)
-
-#define TAILQ_INSERT_HEAD(head, elm, field) do {      \
-  if (((elm)->field.tqe_next = (head)->tqh_first) != NULL)  \
-    (head)->tqh_first->field.tqe_prev =     \
-        &(elm)->field.tqe_next;       \
-  else                \
-    (head)->tqh_last = &(elm)->field.tqe_next;    \
-  (head)->tqh_first = (elm);          \
-  (elm)->field.tqe_prev = &(head)->tqh_first;     \
-} while (/*CONSTCOND*/0)
-
-#define TAILQ_INSERT_TAIL(head, elm, field) do {      \
-  (elm)->field.tqe_next = NULL;         \
-  (elm)->field.tqe_prev = (head)->tqh_last;     \
-  *(head)->tqh_last = (elm);          \
-  (head)->tqh_last = &(elm)->field.tqe_next;      \
-} while (/*CONSTCOND*/0)
-
-#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do {    \
-  if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\
-    (elm)->field.tqe_next->field.tqe_prev =     \
-        &(elm)->field.tqe_next;       \
-  else                \
-    (head)->tqh_last = &(elm)->field.tqe_next;    \
-  (listelm)->field.tqe_next = (elm);        \
-  (elm)->field.tqe_prev = &(listelm)->field.tqe_next;   \
-} while (/*CONSTCOND*/0)
-
-#define TAILQ_INSERT_BEFORE(listelm, elm, field) do {     \
-  (elm)->field.tqe_prev = (listelm)->field.tqe_prev;    \
-  (elm)->field.tqe_next = (listelm);        \
-  *(listelm)->field.tqe_prev = (elm);       \
-  (listelm)->field.tqe_prev = &(elm)->field.tqe_next;   \
-} while (/*CONSTCOND*/0)
-
-#define TAILQ_REMOVE(head, elm, field) do {       \
-  if (((elm)->field.tqe_next) != NULL)        \
-    (elm)->field.tqe_next->field.tqe_prev =     \
-        (elm)->field.tqe_prev;        \
-  else                \
-    (head)->tqh_last = (elm)->field.tqe_prev;   \
-  *(elm)->field.tqe_prev = (elm)->field.tqe_next;     \
-} while (/*CONSTCOND*/0)
-
-#define TAILQ_FOREACH(var, head, field)         \
-  for ((var) = ((head)->tqh_first);       \
-    (var);              \
-    (var) = ((var)->field.tqe_next))
-
-#define TAILQ_FOREACH_REVERSE(var, head, headname, field)   \
-  for ((var) = (*(((struct headname *)((head)->tqh_last))->tqh_last));  \
-    (var);              \
-    (var) = (*(((struct headname *)((var)->field.tqe_prev))->tqh_last)))
-
-#define TAILQ_CONCAT(head1, head2, field) do {        \
-  if (!TAILQ_EMPTY(head2)) {          \
-    *(head1)->tqh_last = (head2)->tqh_first;    \
-    (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \
-    (head1)->tqh_last = (head2)->tqh_last;      \
-    TAILQ_INIT((head2));          \
-  }               \
-} while (/*CONSTCOND*/0)
-
-/*
- * Tail queue access methods.
- */
-#define TAILQ_EMPTY(head)   ((head)->tqh_first == NULL)
-#define TAILQ_FIRST(head)   ((head)->tqh_first)
-#define TAILQ_NEXT(elm, field)    ((elm)->field.tqe_next)
-
-#define TAILQ_LAST(head, headname) \
-  (*(((struct headname *)((head)->tqh_last))->tqh_last))
-#define TAILQ_PREV(elm, headname, field) \
-  (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
-
-
-/*
- * Circular queue definitions.
- */
-#define CIRCLEQ_HEAD(name, type)          \
-struct name {               \
-  struct type *cqh_first;   /* first element */   \
-  struct type *cqh_last;    /* last element */    \
-}
-
-#define CIRCLEQ_HEAD_INITIALIZER(head)          \
-  { (void *)&head, (void *)&head }
-
-#define CIRCLEQ_ENTRY(type)           \
-struct {                \
-  struct type *cqe_next;    /* next element */    \
-  struct type *cqe_prev;    /* previous element */    \
-}
-
-/*
- * Circular queue functions.
- */
-#define CIRCLEQ_INIT(head) do {           \
-  (head)->cqh_first = (void *)(head);       \
-  (head)->cqh_last = (void *)(head);        \
-} while (/*CONSTCOND*/0)
-
-#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do {    \
-  (elm)->field.cqe_next = (listelm)->field.cqe_next;    \
-  (elm)->field.cqe_prev = (listelm);        \
-  if ((listelm)->field.cqe_next == (void *)(head))    \
-    (head)->cqh_last = (elm);       \
-  else                \
-    (listelm)->field.cqe_next->field.cqe_prev = (elm);  \
-  (listelm)->field.cqe_next = (elm);        \
-} while (/*CONSTCOND*/0)
-
-#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do {   \
-  (elm)->field.cqe_next = (listelm);        \
-  (elm)->field.cqe_prev = (listelm)->field.cqe_prev;    \
-  if ((listelm)->field.cqe_prev == (void *)(head))    \
-    (head)->cqh_first = (elm);        \
-  else                \
-    (listelm)->field.cqe_prev->field.cqe_next = (elm);  \
-  (listelm)->field.cqe_prev = (elm);        \
-} while (/*CONSTCOND*/0)
-
-#define CIRCLEQ_INSERT_HEAD(head, elm, field) do {      \
-  (elm)->field.cqe_next = (head)->cqh_first;      \
-  (elm)->field.cqe_prev = (void *)(head);       \
-  if ((head)->cqh_last == (void *)(head))       \
-    (head)->cqh_last = (elm);       \
-  else                \
-    (head)->cqh_first->field.cqe_prev = (elm);    \
-  (head)->cqh_first = (elm);          \
-} while (/*CONSTCOND*/0)
-
-#define CIRCLEQ_INSERT_TAIL(head, elm, field) do {      \
-  (elm)->field.cqe_next = (void *)(head);       \
-  (elm)->field.cqe_prev = (head)->cqh_last;     \
-  if ((head)->cqh_first == (void *)(head))      \
-    (head)->cqh_first = (elm);        \
-  else                \
-    (head)->cqh_last->field.cqe_next = (elm);   \
-  (head)->cqh_last = (elm);         \
-} while (/*CONSTCOND*/0)
-
-#define CIRCLEQ_REMOVE(head, elm, field) do {       \
-  if ((elm)->field.cqe_next == (void *)(head))      \
-    (head)->cqh_last = (elm)->field.cqe_prev;   \
-  else                \
-    (elm)->field.cqe_next->field.cqe_prev =     \
-        (elm)->field.cqe_prev;        \
-  if ((elm)->field.cqe_prev == (void *)(head))      \
-    (head)->cqh_first = (elm)->field.cqe_next;    \
-  else                \
-    (elm)->field.cqe_prev->field.cqe_next =     \
-        (elm)->field.cqe_next;        \
-} while (/*CONSTCOND*/0)
-
-#define CIRCLEQ_FOREACH(var, head, field)       \
-  for ((var) = ((head)->cqh_first);       \
-    (var) != (const void *)(head);        \
-    (var) = ((var)->field.cqe_next))
-
-#define CIRCLEQ_FOREACH_REVERSE(var, head, field)     \
-  for ((var) = ((head)->cqh_last);        \
-    (var) != (const void *)(head);        \
-    (var) = ((var)->field.cqe_prev))
-
-/*
- * Circular queue access methods.
- */
-#define CIRCLEQ_EMPTY(head)   ((head)->cqh_first == (void *)(head))
-#define CIRCLEQ_FIRST(head)   ((head)->cqh_first)
-#define CIRCLEQ_LAST(head)    ((head)->cqh_last)
-#define CIRCLEQ_NEXT(elm, field)  ((elm)->field.cqe_next)
-#define CIRCLEQ_PREV(elm, field)  ((elm)->field.cqe_prev)
-
-#define CIRCLEQ_LOOP_NEXT(head, elm, field)       \
-  (((elm)->field.cqe_next == (void *)(head))      \
-      ? ((head)->cqh_first)         \
-      : (elm->field.cqe_next))
-#define CIRCLEQ_LOOP_PREV(head, elm, field)       \
-  (((elm)->field.cqe_prev == (void *)(head))      \
-      ? ((head)->cqh_last)          \
-      : (elm->field.cqe_prev))
-
-#endif  /* sys/queue.h */
diff --git a/openair3/UTILS/tree.h b/openair3/UTILS/tree.h
deleted file mode 100644
index 351df9dfc5a0bd7f480b1ffd907eac9890f0a62c..0000000000000000000000000000000000000000
--- a/openair3/UTILS/tree.h
+++ /dev/null
@@ -1,678 +0,0 @@
-/*
- * Copyright 2002 Niels Provos <provos@citi.umich.edu>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
- */
-
-#ifndef _SYS_TREE_H_
-#define _SYS_TREE_H_
-
-/*
- * This file defines data structures for different types of trees:
- * splay trees and red-black trees.
- *
- * A splay tree is a self-organizing data structure.  Every operation
- * on the tree causes a splay to happen.  The splay moves the requested
- * node to the root of the tree and partly rebalances it.
- *
- * This has the benefit that request locality causes faster lookups as
- * the requested nodes move to the top of the tree.  On the other hand,
- * every lookup causes memory writes.
- *
- * The Balance Theorem bounds the total access time for m operations
- * and n inserts on an initially empty tree as O((m + n)lg n).  The
- * amortized cost for a sequence of m accesses to a splay tree is O(lg n);
- *
- * A red-black tree is a binary search tree with the node color as an
- * extra attribute.  It fulfills a set of conditions:
- *  - every search path from the root to a leaf consists of the
- *    same number of black nodes,
- *  - each red node (except for the root) has a black parent,
- *  - each leaf node is black.
- *
- * Every operation on a red-black tree is bounded as O(lg n).
- * The maximum height of a red-black tree is 2lg (n+1).
- */
-
-#define SPLAY_HEAD(name, type)            \
-struct name {               \
-  struct type *sph_root; /* root of the tree */     \
-}
-
-#define SPLAY_INITIALIZER(root)           \
-  { NULL }
-
-#define SPLAY_INIT(root) do {           \
-  (root)->sph_root = NULL;          \
-} while (0)
-
-#define SPLAY_ENTRY(type)           \
-struct {                \
-  struct type *spe_left; /* left element */     \
-  struct type *spe_right; /* right element */     \
-}
-
-#define SPLAY_LEFT(elm, field)    (elm)->field.spe_left
-#define SPLAY_RIGHT(elm, field)   (elm)->field.spe_right
-#define SPLAY_ROOT(head)    (head)->sph_root
-#define SPLAY_EMPTY(head)   (SPLAY_ROOT(head) == NULL)
-
-/* SPLAY_ROTATE_{LEFT,RIGHT} expect that tmp hold SPLAY_{RIGHT,LEFT} */
-#define SPLAY_ROTATE_RIGHT(head, tmp, field) do {     \
-  SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field);  \
-  SPLAY_RIGHT(tmp, field) = (head)->sph_root;     \
-  (head)->sph_root = tmp;           \
-} while (0)
-
-#define SPLAY_ROTATE_LEFT(head, tmp, field) do {      \
-  SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field);  \
-  SPLAY_LEFT(tmp, field) = (head)->sph_root;      \
-  (head)->sph_root = tmp;           \
-} while (0)
-
-#define SPLAY_LINKLEFT(head, tmp, field) do {       \
-  SPLAY_LEFT(tmp, field) = (head)->sph_root;      \
-  tmp = (head)->sph_root;           \
-  (head)->sph_root = SPLAY_LEFT((head)->sph_root, field);   \
-} while (0)
-
-#define SPLAY_LINKRIGHT(head, tmp, field) do {        \
-  SPLAY_RIGHT(tmp, field) = (head)->sph_root;     \
-  tmp = (head)->sph_root;           \
-  (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field);  \
-} while (0)
-
-#define SPLAY_ASSEMBLE(head, node, left, right, field) do {   \
-  SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \
-  SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field);\
-  SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \
-  SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \
-} while (0)
-
-/* Generates prototypes and inline functions */
-
-#define SPLAY_PROTOTYPE(name, type, field, cmp)       \
-void name##_SPLAY(struct name *, struct type *);      \
-void name##_SPLAY_MINMAX(struct name *, int);       \
-struct type *name##_SPLAY_INSERT(struct name *, struct type *);   \
-struct type *name##_SPLAY_REMOVE(struct name *, struct type *);   \
-                  \
-/* Finds the node with the same key as elm */       \
-static __inline struct type *           \
-name##_SPLAY_FIND(struct name *head, struct type *elm)      \
-{                 \
-  if (SPLAY_EMPTY(head))            \
-    return(NULL);           \
-  name##_SPLAY(head, elm);          \
-  if ((cmp)(elm, (head)->sph_root) == 0)        \
-    return (head->sph_root);        \
-  return (NULL);              \
-}                 \
-                  \
-static __inline struct type *           \
-name##_SPLAY_NEXT(struct name *head, struct type *elm)      \
-{                 \
-  name##_SPLAY(head, elm);          \
-  if (SPLAY_RIGHT(elm, field) != NULL) {        \
-    elm = SPLAY_RIGHT(elm, field);        \
-    while (SPLAY_LEFT(elm, field) != NULL) {    \
-      elm = SPLAY_LEFT(elm, field);     \
-    }             \
-  } else                \
-    elm = NULL;           \
-  return (elm);             \
-}                 \
-                  \
-static __inline struct type *           \
-name##_SPLAY_MIN_MAX(struct name *head, int val)      \
-{                 \
-  name##_SPLAY_MINMAX(head, val);         \
-        return (SPLAY_ROOT(head));          \
-}
-
-/* Main splay operation.
- * Moves node close to the key of elm to top
- */
-#define SPLAY_GENERATE(name, type, field, cmp)        \
-struct type *               \
-name##_SPLAY_INSERT(struct name *head, struct type *elm)    \
-{                 \
-    if (SPLAY_EMPTY(head)) {            \
-      SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = NULL;  \
-    } else {                \
-      int __comp;             \
-      name##_SPLAY(head, elm);          \
-      __comp = (cmp)(elm, (head)->sph_root);      \
-      if(__comp < 0) {            \
-        SPLAY_LEFT(elm, field) = SPLAY_LEFT((head)->sph_root, field);\
-        SPLAY_RIGHT(elm, field) = (head)->sph_root;   \
-        SPLAY_LEFT((head)->sph_root, field) = NULL;   \
-      } else if (__comp > 0) {          \
-        SPLAY_RIGHT(elm, field) = SPLAY_RIGHT((head)->sph_root, field);\
-        SPLAY_LEFT(elm, field) = (head)->sph_root;    \
-        SPLAY_RIGHT((head)->sph_root, field) = NULL;  \
-      } else              \
-        return ((head)->sph_root);        \
-    }                 \
-    (head)->sph_root = (elm);           \
-    return (NULL);              \
-}                 \
-                  \
-struct type *               \
-name##_SPLAY_REMOVE(struct name *head, struct type *elm)    \
-{                 \
-  struct type *__tmp;           \
-  if (SPLAY_EMPTY(head))            \
-    return (NULL);            \
-  name##_SPLAY(head, elm);          \
-  if ((cmp)(elm, (head)->sph_root) == 0) {      \
-    if (SPLAY_LEFT((head)->sph_root, field) == NULL) {  \
-      (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field);\
-    } else {            \
-      __tmp = SPLAY_RIGHT((head)->sph_root, field); \
-      (head)->sph_root = SPLAY_LEFT((head)->sph_root, field);\
-      name##_SPLAY(head, elm);      \
-      SPLAY_RIGHT((head)->sph_root, field) = __tmp; \
-    }             \
-    return (elm);           \
-  }               \
-  return (NULL);              \
-}                 \
-                  \
-void                  \
-name##_SPLAY(struct name *head, struct type *elm)     \
-{                 \
-  struct type __node, *__left, *__right, *__tmp;      \
-  int __comp;             \
-\
-  SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\
-  __left = __right = &__node;         \
-\
-  while ((__comp = (cmp)(elm, (head)->sph_root))) {   \
-    if (__comp < 0) {         \
-      __tmp = SPLAY_LEFT((head)->sph_root, field);  \
-      if (__tmp == NULL)        \
-        break;          \
-      if ((cmp)(elm, __tmp) < 0){     \
-        SPLAY_ROTATE_RIGHT(head, __tmp, field); \
-        if (SPLAY_LEFT((head)->sph_root, field) == NULL)\
-          break;        \
-      }           \
-      SPLAY_LINKLEFT(head, __right, field);   \
-    } else if (__comp > 0) {        \
-      __tmp = SPLAY_RIGHT((head)->sph_root, field); \
-      if (__tmp == NULL)        \
-        break;          \
-      if ((cmp)(elm, __tmp) > 0){     \
-        SPLAY_ROTATE_LEFT(head, __tmp, field);  \
-        if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\
-          break;        \
-      }           \
-      SPLAY_LINKRIGHT(head, __left, field);   \
-    }             \
-  }               \
-  SPLAY_ASSEMBLE(head, &__node, __left, __right, field);    \
-}                 \
-                  \
-/* Splay with either the minimum or the maximum element     \
- * Used to find minimum or maximum element in tree.     \
- */                 \
-void name##_SPLAY_MINMAX(struct name *head, int __comp) \
-{                 \
-  struct type __node, *__left, *__right, *__tmp;      \
-\
-  SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\
-  __left = __right = &__node;         \
-\
-  while (1) {             \
-    if (__comp < 0) {         \
-      __tmp = SPLAY_LEFT((head)->sph_root, field);  \
-      if (__tmp == NULL)        \
-        break;          \
-      if (__comp < 0){        \
-        SPLAY_ROTATE_RIGHT(head, __tmp, field); \
-        if (SPLAY_LEFT((head)->sph_root, field) == NULL)\
-          break;        \
-      }           \
-      SPLAY_LINKLEFT(head, __right, field);   \
-    } else if (__comp > 0) {        \
-      __tmp = SPLAY_RIGHT((head)->sph_root, field); \
-      if (__tmp == NULL)        \
-        break;          \
-      if (__comp > 0) {       \
-        SPLAY_ROTATE_LEFT(head, __tmp, field);  \
-        if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\
-          break;        \
-      }           \
-      SPLAY_LINKRIGHT(head, __left, field);   \
-    }             \
-  }               \
-  SPLAY_ASSEMBLE(head, &__node, __left, __right, field);    \
-}
-
-#define SPLAY_NEGINF  -1
-#define SPLAY_INF 1
-
-#define SPLAY_INSERT(name, x, y)  name##_SPLAY_INSERT(x, y)
-#define SPLAY_REMOVE(name, x, y)  name##_SPLAY_REMOVE(x, y)
-#define SPLAY_FIND(name, x, y)    name##_SPLAY_FIND(x, y)
-#define SPLAY_NEXT(name, x, y)    name##_SPLAY_NEXT(x, y)
-#define SPLAY_MIN(name, x)    (SPLAY_EMPTY(x) ? NULL  \
-          : name##_SPLAY_MIN_MAX(x, SPLAY_NEGINF))
-#define SPLAY_MAX(name, x)    (SPLAY_EMPTY(x) ? NULL  \
-          : name##_SPLAY_MIN_MAX(x, SPLAY_INF))
-
-#define SPLAY_FOREACH(x, name, head)          \
-  for ((x) = SPLAY_MIN(name, head);       \
-       (x) != NULL;           \
-       (x) = SPLAY_NEXT(name, head, x))
-
-/* Macros that define a red-back tree */
-#define RB_HEAD(name, type)           \
-struct name {               \
-  struct type *rbh_root; /* root of the tree */     \
-}
-
-#define RB_INITIALIZER(root)            \
-  { NULL }
-
-#define RB_INIT(root) do {            \
-  (root)->rbh_root = NULL;          \
-} while (0)
-
-#define RB_BLACK  0
-#define RB_RED    1
-#define RB_ENTRY(type)              \
-struct {                \
-  struct type *rbe_left;    /* left element */    \
-  struct type *rbe_right;   /* right element */   \
-  struct type *rbe_parent;  /* parent element */    \
-  int rbe_color;      /* node color */    \
-}
-
-#define RB_LEFT(elm, field)   (elm)->field.rbe_left
-#define RB_RIGHT(elm, field)    (elm)->field.rbe_right
-#define RB_PARENT(elm, field)   (elm)->field.rbe_parent
-#define RB_COLOR(elm, field)    (elm)->field.rbe_color
-#define RB_ROOT(head)     (head)->rbh_root
-#define RB_EMPTY(head)      (RB_ROOT(head) == NULL)
-
-#define RB_SET(elm, parent, field) do {         \
-  RB_PARENT(elm, field) = parent;         \
-  RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL;    \
-  RB_COLOR(elm, field) = RB_RED;          \
-} while (0)
-
-#define RB_SET_BLACKRED(black, red, field) do {       \
-  RB_COLOR(black, field) = RB_BLACK;        \
-  RB_COLOR(red, field) = RB_RED;          \
-} while (0)
-
-#ifndef RB_AUGMENT
-#define RB_AUGMENT(x)
-#endif
-
-#define RB_ROTATE_LEFT(head, elm, tmp, field) do {      \
-  (tmp) = RB_RIGHT(elm, field);         \
-  if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field))) {   \
-    RB_PARENT(RB_LEFT(tmp, field), field) = (elm);    \
-  }               \
-  RB_AUGMENT(elm);            \
-  if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field))) {    \
-    if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \
-      RB_LEFT(RB_PARENT(elm, field), field) = (tmp);  \
-    else              \
-      RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \
-  } else                \
-    (head)->rbh_root = (tmp);       \
-  RB_LEFT(tmp, field) = (elm);          \
-  RB_PARENT(elm, field) = (tmp);          \
-  RB_AUGMENT(tmp);            \
-  if ((RB_PARENT(tmp, field)))          \
-    RB_AUGMENT(RB_PARENT(tmp, field));      \
-} while (0)
-
-#define RB_ROTATE_RIGHT(head, elm, tmp, field) do {     \
-  (tmp) = RB_LEFT(elm, field);          \
-  if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field))) {   \
-    RB_PARENT(RB_RIGHT(tmp, field), field) = (elm);   \
-  }               \
-  RB_AUGMENT(elm);            \
-  if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field))) {    \
-    if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \
-      RB_LEFT(RB_PARENT(elm, field), field) = (tmp);  \
-    else              \
-      RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \
-  } else                \
-    (head)->rbh_root = (tmp);       \
-  RB_RIGHT(tmp, field) = (elm);         \
-  RB_PARENT(elm, field) = (tmp);          \
-  RB_AUGMENT(tmp);            \
-  if ((RB_PARENT(tmp, field)))          \
-    RB_AUGMENT(RB_PARENT(tmp, field));      \
-} while (0)
-
-/* Generates prototypes and inline functions */
-#define RB_PROTOTYPE(name, type, field, cmp)        \
-void name##_RB_INSERT_COLOR(struct name *, struct type *);  \
-void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\
-struct type *name##_RB_REMOVE(struct name *, struct type *);    \
-struct type *name##_RB_INSERT(struct name *, struct type *);    \
-struct type *name##_RB_FIND(struct name *, struct type *);    \
-struct type *name##_RB_NEXT(struct type *);       \
-struct type *name##_RB_MINMAX(struct name *, int);      \
-                  \
- 
-/* Main rb operation.
- * Moves node close to the key of elm to top
- */
-#define RB_GENERATE(name, type, field, cmp)       \
-void                  \
-name##_RB_INSERT_COLOR(struct name *head, struct type *elm)   \
-{                 \
-  struct type *parent, *gparent, *tmp;        \
-  while ((parent = RB_PARENT(elm, field)) &&      \
-      RB_COLOR(parent, field) == RB_RED) {      \
-    gparent = RB_PARENT(parent, field);     \
-    if (parent == RB_LEFT(gparent, field)) {    \
-      tmp = RB_RIGHT(gparent, field);     \
-      if (tmp && RB_COLOR(tmp, field) == RB_RED) {  \
-        RB_COLOR(tmp, field) = RB_BLACK;  \
-        RB_SET_BLACKRED(parent, gparent, field);\
-        elm = gparent;        \
-        continue;       \
-      }           \
-      if (RB_RIGHT(parent, field) == elm) {   \
-        RB_ROTATE_LEFT(head, parent, tmp, field);\
-        tmp = parent;       \
-        parent = elm;       \
-        elm = tmp;        \
-      }           \
-      RB_SET_BLACKRED(parent, gparent, field);  \
-      RB_ROTATE_RIGHT(head, gparent, tmp, field); \
-    } else {            \
-      tmp = RB_LEFT(gparent, field);      \
-      if (tmp && RB_COLOR(tmp, field) == RB_RED) {  \
-        RB_COLOR(tmp, field) = RB_BLACK;  \
-        RB_SET_BLACKRED(parent, gparent, field);\
-        elm = gparent;        \
-        continue;       \
-      }           \
-      if (RB_LEFT(parent, field) == elm) {    \
-        RB_ROTATE_RIGHT(head, parent, tmp, field);\
-        tmp = parent;       \
-        parent = elm;       \
-        elm = tmp;        \
-      }           \
-      RB_SET_BLACKRED(parent, gparent, field);  \
-      RB_ROTATE_LEFT(head, gparent, tmp, field);  \
-    }             \
-  }               \
-  RB_COLOR(head->rbh_root, field) = RB_BLACK;     \
-}                 \
-                  \
-void                  \
-name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) \
-{                 \
-  struct type *tmp;           \
-  while ((elm == NULL || RB_COLOR(elm, field) == RB_BLACK) && \
-      elm != RB_ROOT(head)) {         \
-    if (RB_LEFT(parent, field) == elm) {      \
-      tmp = RB_RIGHT(parent, field);      \
-      if (RB_COLOR(tmp, field) == RB_RED) {   \
-        RB_SET_BLACKRED(tmp, parent, field);  \
-        RB_ROTATE_LEFT(head, parent, tmp, field);\
-        tmp = RB_RIGHT(parent, field);    \
-      }           \
-      if ((RB_LEFT(tmp, field) == NULL ||   \
-          RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\
-          (RB_RIGHT(tmp, field) == NULL ||    \
-          RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\
-        RB_COLOR(tmp, field) = RB_RED;    \
-        elm = parent;       \
-        parent = RB_PARENT(elm, field);   \
-      } else {          \
-        if (RB_RIGHT(tmp, field) == NULL || \
-            RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) {\
-          struct type *oleft;   \
-          if ((oleft = RB_LEFT(tmp, field)))\
-            RB_COLOR(oleft, field) = RB_BLACK;\
-          RB_COLOR(tmp, field) = RB_RED;  \
-          RB_ROTATE_RIGHT(head, tmp, oleft, field);\
-          tmp = RB_RIGHT(parent, field);  \
-        }         \
-        RB_COLOR(tmp, field) = RB_COLOR(parent, field);\
-        RB_COLOR(parent, field) = RB_BLACK; \
-        if (RB_RIGHT(tmp, field))   \
-          RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK;\
-        RB_ROTATE_LEFT(head, parent, tmp, field);\
-        elm = RB_ROOT(head);      \
-        break;          \
-      }           \
-    } else {            \
-      tmp = RB_LEFT(parent, field);     \
-      if (RB_COLOR(tmp, field) == RB_RED) {   \
-        RB_SET_BLACKRED(tmp, parent, field);  \
-        RB_ROTATE_RIGHT(head, parent, tmp, field);\
-        tmp = RB_LEFT(parent, field);   \
-      }           \
-      if ((RB_LEFT(tmp, field) == NULL ||   \
-          RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\
-          (RB_RIGHT(tmp, field) == NULL ||    \
-          RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\
-        RB_COLOR(tmp, field) = RB_RED;    \
-        elm = parent;       \
-        parent = RB_PARENT(elm, field);   \
-      } else {          \
-        if (RB_LEFT(tmp, field) == NULL ||  \
-            RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) {\
-          struct type *oright;    \
-          if ((oright = RB_RIGHT(tmp, field)))\
-            RB_COLOR(oright, field) = RB_BLACK;\
-          RB_COLOR(tmp, field) = RB_RED;  \
-          RB_ROTATE_LEFT(head, tmp, oright, field);\
-          tmp = RB_LEFT(parent, field); \
-        }         \
-        RB_COLOR(tmp, field) = RB_COLOR(parent, field);\
-        RB_COLOR(parent, field) = RB_BLACK; \
-        if (RB_LEFT(tmp, field))    \
-          RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK;\
-        RB_ROTATE_RIGHT(head, parent, tmp, field);\
-        elm = RB_ROOT(head);      \
-        break;          \
-      }           \
-    }             \
-  }               \
-  if (elm)              \
-    RB_COLOR(elm, field) = RB_BLACK;      \
-}                 \
-                  \
-struct type *               \
-name##_RB_REMOVE(struct name *head, struct type *elm)     \
-{                 \
-  struct type *child, *parent, *old = elm;      \
-  int color;              \
-  if (RB_LEFT(elm, field) == NULL)        \
-    child = RB_RIGHT(elm, field);       \
-  else if (RB_RIGHT(elm, field) == NULL)        \
-    child = RB_LEFT(elm, field);        \
-  else {                \
-    struct type *left;          \
-    elm = RB_RIGHT(elm, field);       \
-    while ((left = RB_LEFT(elm, field)))      \
-      elm = left;         \
-    child = RB_RIGHT(elm, field);       \
-    parent = RB_PARENT(elm, field);       \
-    color = RB_COLOR(elm, field);       \
-    if (child)            \
-      RB_PARENT(child, field) = parent;   \
-    if (parent) {           \
-      if (RB_LEFT(parent, field) == elm)    \
-        RB_LEFT(parent, field) = child;   \
-      else            \
-        RB_RIGHT(parent, field) = child;  \
-      RB_AUGMENT(parent);       \
-    } else              \
-      RB_ROOT(head) = child;        \
-    if (RB_PARENT(elm, field) == old)     \
-      parent = elm;         \
-    (elm)->field = (old)->field;        \
-    if (RB_PARENT(old, field)) {        \
-      if (RB_LEFT(RB_PARENT(old, field), field) == old)\
-        RB_LEFT(RB_PARENT(old, field), field) = elm;\
-      else            \
-        RB_RIGHT(RB_PARENT(old, field), field) = elm;\
-      RB_AUGMENT(RB_PARENT(old, field));    \
-    } else              \
-      RB_ROOT(head) = elm;        \
-    RB_PARENT(RB_LEFT(old, field), field) = elm;    \
-    if (RB_RIGHT(old, field))       \
-      RB_PARENT(RB_RIGHT(old, field), field) = elm; \
-    if (parent) {           \
-      left = parent;          \
-      do {            \
-        RB_AUGMENT(left);     \
-      } while ((left = RB_PARENT(left, field)));  \
-    }             \
-    goto color;           \
-  }               \
-  parent = RB_PARENT(elm, field);         \
-  color = RB_COLOR(elm, field);         \
-  if (child)              \
-    RB_PARENT(child, field) = parent;     \
-  if (parent) {             \
-    if (RB_LEFT(parent, field) == elm)      \
-      RB_LEFT(parent, field) = child;     \
-    else              \
-      RB_RIGHT(parent, field) = child;    \
-    RB_AUGMENT(parent);         \
-  } else                \
-    RB_ROOT(head) = child;          \
-color:                  \
-  if (color == RB_BLACK)            \
-    name##_RB_REMOVE_COLOR(head, parent, child);    \
-  return (old);             \
-}                 \
-                  \
-/* Inserts a node into the RB tree */         \
-struct type *               \
-name##_RB_INSERT(struct name *head, struct type *elm)     \
-{                 \
-  struct type *tmp;           \
-  struct type *parent = NULL;         \
-  int comp = 0;             \
-  tmp = RB_ROOT(head);            \
-  while (tmp) {             \
-    parent = tmp;           \
-    comp = (cmp)(elm, parent);        \
-    if (comp < 0)           \
-      tmp = RB_LEFT(tmp, field);      \
-    else if (comp > 0)          \
-      tmp = RB_RIGHT(tmp, field);     \
-    else              \
-      return (tmp);         \
-  }               \
-  RB_SET(elm, parent, field);         \
-  if (parent != NULL) {           \
-    if (comp < 0)           \
-      RB_LEFT(parent, field) = elm;     \
-    else              \
-      RB_RIGHT(parent, field) = elm;      \
-    RB_AUGMENT(parent);         \
-  } else                \
-  {                                                                     \
-    RB_ROOT(head) = elm;          \
-  }                                                                     \
-  name##_RB_INSERT_COLOR(head, elm);        \
-  return (NULL);              \
-}                 \
-                  \
-/* Finds the node with the same key as elm */       \
-struct type *               \
-name##_RB_FIND(struct name *head, struct type *elm)     \
-{                 \
-  struct type *tmp = RB_ROOT(head);       \
-  int comp;             \
-  while (tmp) {             \
-    comp = cmp(elm, tmp);         \
-    if (comp < 0)           \
-      tmp = RB_LEFT(tmp, field);      \
-    else if (comp > 0)          \
-      tmp = RB_RIGHT(tmp, field);     \
-    else              \
-      return (tmp);         \
-  }               \
-  return (NULL);              \
-}                 \
-                  \
-struct type *               \
-name##_RB_NEXT(struct type *elm)          \
-{                 \
-  if (RB_RIGHT(elm, field)) {         \
-    elm = RB_RIGHT(elm, field);       \
-    while (RB_LEFT(elm, field))       \
-      elm = RB_LEFT(elm, field);      \
-  } else {              \
-    if (RB_PARENT(elm, field) &&        \
-        (elm == RB_LEFT(RB_PARENT(elm, field), field))) \
-      elm = RB_PARENT(elm, field);      \
-    else {              \
-      while (RB_PARENT(elm, field) &&     \
-          (elm == RB_RIGHT(RB_PARENT(elm, field), field)))\
-        elm = RB_PARENT(elm, field);    \
-      elm = RB_PARENT(elm, field);      \
-    }             \
-  }               \
-  return (elm);             \
-}                 \
-                  \
-struct type *               \
-name##_RB_MINMAX(struct name *head, int val)        \
-{                 \
-  struct type *tmp = RB_ROOT(head);       \
-  struct type *parent = NULL;         \
-  while (tmp) {             \
-    parent = tmp;           \
-    if (val < 0)            \
-      tmp = RB_LEFT(tmp, field);      \
-    else              \
-      tmp = RB_RIGHT(tmp, field);     \
-  }               \
-  return (parent);            \
-}
-
-#define RB_NEGINF -1
-#define RB_INF  1
-
-#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y)
-#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y)
-#define RB_FIND(name, x, y) name##_RB_FIND(x, y)
-#define RB_NEXT(name, x, y) name##_RB_NEXT(y)
-#define RB_MIN(name, x)   name##_RB_MINMAX(x, RB_NEGINF)
-#define RB_MAX(name, x)   name##_RB_MINMAX(x, RB_INF)
-
-#define RB_FOREACH(x, name, head)         \
-  for ((x) = RB_MIN(name, head);          \
-       (x) != NULL;           \
-       (x) = name##_RB_NEXT(x))
-
-#endif  /* _SYS_TREE_H_ */
diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h
index ecadb68c0ca7917fc870faf63d6cd88d5835993d..d086c0e13a08b95955da404c840b6729b59f4141 100644
--- a/targets/ARCH/COMMON/common_lib.h
+++ b/targets/ARCH/COMMON/common_lib.h
@@ -52,6 +52,9 @@
 #define RAU_LOCAL_RADIO_HEAD  0
 #define RAU_REMOTE_RADIO_HEAD 1
 
+#define MAX_WRITE_THREAD_PACKAGE     10
+#define MAX_WRITE_THREAD_BUFFER_SIZE 8
+
 #ifndef MAX_CARDS
   #define MAX_CARDS 8
 #endif
@@ -69,13 +72,9 @@ typedef enum {
   max_gain=0,med_gain,byp_gain
 } rx_gain_t;
 
-#if OCP_FRAMEWORK
-#include <enums.h>
-#else
 typedef enum {
   duplex_mode_TDD=1,duplex_mode_FDD=0
 } duplex_mode_t;
-#endif
 
 
 /** @addtogroup _GENERIC_PHY_RF_INTERFACE_
@@ -275,8 +274,37 @@ typedef struct {
   void *rx;
 } if_buffer_t;
 
+typedef struct {
+  openair0_timestamp timestamp;
+  void *buff[MAX_WRITE_THREAD_BUFFER_SIZE];// buffer to be write;
+  int nsamps;
+  int cc;
+  signed char first_packet;
+  signed char last_packet;
+  int flags_msb;
+} openair0_write_package_t;
+
+typedef struct {
+  openair0_write_package_t write_package[MAX_WRITE_THREAD_PACKAGE];
+  int start;
+  int end;
+  /// \internal This variable is protected by \ref mutex_write
+  int count_write;
+  /// pthread struct for trx write thread
+  pthread_t pthread_write;
+  /// pthread attributes for trx write thread
+  pthread_attr_t attr_write;
+  /// condition varible for trx write thread
+  pthread_cond_t cond_write;
+  /// mutex for trx write thread
+  pthread_mutex_t mutex_write;
+} openair0_thread_t;
+
 /*!\brief structure holds the parameters to configure USRP devices */
 struct openair0_device_t {
+  /*!tx write thread*/
+  openair0_thread_t write_thread;
+
   /*!brief Module ID of this device */
   int Mod_id;
 
@@ -400,6 +428,12 @@ struct openair0_device_t {
    * \param arg pointer to capabilities or configuration
    */
   void (*configure_rru)(int idx, void *arg);
+
+  /*! \brief RRU Configuration callback
+   * \param idx RU index
+   * \param arg pointer to capabilities or configuration
+   */
+  int (*trx_write_init)(openair0_device *device);
 };
 
 /* type of device init function, implemented in shared lib */
diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h
index 95d00290271218aa2ed72d41f03baedcd1e1b679..0f2147847a6145230078b8e4f30f16d9c23eef12 100644
--- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h
+++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h
@@ -30,6 +30,9 @@
 * \warning
 */
 
+#ifndef __ETHERNET_USERSPACE_LIB_IF_DEFS__H__
+#define __ETHERNET_USERSPACE_LIB_IF_DEFS__H__
+
 #include <netinet/ether.h>
 #include <stdint.h>
 
@@ -37,15 +40,11 @@
 #include "PHY/LTE_TRANSPORT/if5_tools.h"
 
 // ETH transport preference modes
-#ifdef OCP_FRAMEWORK
-#include "enums.h"
-#else
 #define ETH_UDP_MODE        0
 #define ETH_RAW_MODE        1
 #define ETH_UDP_IF4p5_MODE    2
 #define ETH_RAW_IF4p5_MODE    3
 #define ETH_RAW_IF5_MOBIPASS    4    
-#endif
 
 // COMMOM HEADER LENGTHS
 
@@ -84,3 +83,5 @@
 #define RAW_IF5_MOBIPASS_BLOCK_SIZE_BYTES 1280
 #define RAW_IF5_MOBIPASS_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF5_mobipass_header_t + RAW_IF5_MOBIPASS_BLOCK_SIZE_BYTES)
 #define PAYLOAD_MOBIPASS_NUM_SAMPLES  640
+
+#endif
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index 90b0a2e554d9c9199f04f5556b8e9d901867d464..08f0cd720b0aeb42e2a83b9be16c57c31f947772 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -50,6 +50,8 @@
 #include "common_lib.h"
 #include "assertions.h"
 
+#include "common/utils/LOG/vcd_signal_dumper.h"
+
 #include <sys/resource.h>
 
 #ifdef __SSE4_1__
@@ -341,37 +343,13 @@ static int trx_usrp_write(openair0_device *device,
 
   int flags_lsb = flags&0xff;
   int flags_msb = (flags>>8)&0xff;
-    
-#if defined(__x86_64) || defined(__i386__)
-  #ifdef __AVX2__
-      nsamps2 = (nsamps+7)>>3;
-      __m256i buff_tx[8][nsamps2];
-  #else
-    nsamps2 = (nsamps+3)>>2;
-    __m128i buff_tx[8][nsamps2];
-  #endif
-#elif defined(__arm__)
-    nsamps2 = (nsamps+3)>>2;
-    int16x8_t buff_tx[8][nsamps2];
-#else
-#error Unsupported CPU architecture, USRP device cannot be built
-#endif
 
-  // bring RX data into 12 LSBs for softmodem RX
-  for (int i=0; i<cc; i++) {
-    for (int j=0; j<nsamps2; j++) {
-#if defined(__x86_64__) || defined(__i386__)
-#ifdef __AVX2__
-      buff_tx[i][j] = _mm256_slli_epi16(((__m256i *)buff[i])[j],4);
-#else
-      buff_tx[i][j] = _mm_slli_epi16(((__m128i *)buff[i])[j],4);
-#endif
-#elif defined(__arm__)
-      buff_tx[i][j] = vshlq_n_s16(((int16x8_t *)buff[i])[j],4);
-#endif
-    }
-  }
+  int end;
+  int write_tread = 0;
+  openair0_thread_t *write_thread = &device->write_thread;
+  openair0_write_package_t *write_package = write_thread->write_package;
 
+  AssertFatal( MAX_WRITE_THREAD_BUFFER_SIZE >= cc,"Do not support more than %d cc number\n", MAX_WRITE_THREAD_BUFFER_SIZE);
 
     boolean_t first_packet_state=false,last_packet_state=false;
 
@@ -404,7 +382,37 @@ static int trx_usrp_write(openair0_device *device,
      last_packet_state  = true;
     }
 
-    
+  if(write_tread == 0){
+#if defined(__x86_64) || defined(__i386__)
+  #ifdef __AVX2__
+      nsamps2 = (nsamps+7)>>3;
+      __m256i buff_tx[8][nsamps2];
+  #else
+    nsamps2 = (nsamps+3)>>2;
+    __m128i buff_tx[8][nsamps2];
+  #endif
+#elif defined(__arm__)
+    nsamps2 = (nsamps+3)>>2;
+    int16x8_t buff_tx[8][nsamps2];
+#else
+#error Unsupported CPU architecture, USRP device cannot be built
+#endif
+
+    // bring RX data into 12 LSBs for softmodem RX
+    for (int i=0; i<cc; i++) {
+      for (int j=0; j<nsamps2; j++) {
+#if defined(__x86_64__) || defined(__i386__)
+#ifdef __AVX2__
+        buff_tx[i][j] = _mm256_slli_epi16(((__m256i *)buff[i])[j],4);
+#else
+        buff_tx[i][j] = _mm_slli_epi16(((__m128i *)buff[i])[j],4);
+#endif
+#elif defined(__arm__)
+        buff_tx[i][j] = vshlq_n_s16(((int16x8_t *)buff[i])[j],4);
+#endif
+      }
+    }
+
     s->tx_md.has_time_spec  = true;
     s->tx_md.start_of_burst = (s->tx_count==0) ? true : first_packet_state;
     s->tx_md.end_of_burst   = last_packet_state;
@@ -432,11 +440,170 @@ static int trx_usrp_write(openair0_device *device,
       ret = (int)s->tx_stream->send(&(((int16_t *)buff_tx[0])[0]), nsamps, s->tx_md);
     }
 
-  if (ret != nsamps) LOG_E(HW,"[xmit] tx samples %d != %d\n",ret,nsamps);
+    if (ret != nsamps) LOG_E(HW,"[xmit] tx samples %d != %d\n",ret,nsamps);
+    return ret;
+  }
+  else{
+    pthread_mutex_lock(&write_thread->mutex_write);
+
+    if(write_thread->count_write >= MAX_WRITE_THREAD_PACKAGE){
+      LOG_W(HW,"Buffer overflow, count_write = %d, start = %d end = %d, resetting write package\n", write_thread->count_write, write_thread->start, write_thread->end);
+      write_thread->end = write_thread->start;
+      write_thread->count_write = 0;
+    }
+
+    end = write_thread->end;
+    write_package[end].timestamp    = timestamp;
+    write_package[end].nsamps       = nsamps;
+    write_package[end].cc           = cc;
+    write_package[end].first_packet = first_packet_state;
+    write_package[end].last_packet  = last_packet_state;
+    write_package[end].flags_msb    = flags_msb;
+    for (int i = 0; i < cc; i++)
+      write_package[end].buff[i]    = buff[i];
+    write_thread->count_write++;
+    write_thread->end = (write_thread->end + 1)% MAX_WRITE_THREAD_PACKAGE;
+    pthread_cond_signal(&write_thread->cond_write);
+    pthread_mutex_unlock(&write_thread->mutex_write);
+    return 0;
+  }
 
-  return ret;
 }
 
+//-----------------------start--------------------------
+/*! \brief Called to send samples to the USRP RF target
+      @param device pointer to the device structure specific to the RF hardware target
+      @param timestamp The timestamp at which the first sample MUST be sent
+      @param buff Buffer which holds the samples
+      @param nsamps number of samples to be sent
+      @param antenna_id index of the antenna if the device has multiple antennas
+      @param flags flags must be set to TRUE if timestamp parameter needs to be applied
+*/
+void *trx_usrp_write_thread(void * arg){ 
+  int ret=0;
+  openair0_device *device=(openair0_device *)arg;
+  openair0_thread_t *write_thread = &device->write_thread;
+  openair0_write_package_t *write_package = write_thread->write_package;
+
+  usrp_state_t *s;
+  int nsamps2;  // aligned to upper 32 or 16 byte boundary
+  int start;
+  openair0_timestamp timestamp;
+  void               **buff;
+  int                nsamps;
+  int                cc;
+  signed char        first_packet;
+  signed char        last_packet;
+  int                flags_msb;
+
+  while(1){
+    pthread_mutex_lock(&write_thread->mutex_write);
+    while (write_thread->count_write == 0) {
+      pthread_cond_wait(&write_thread->cond_write,&write_thread->mutex_write); // this unlocks mutex_rxtx while waiting and then locks it again
+    }
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_THREAD, 1 );
+    s = (usrp_state_t *)device->priv;
+    start = write_thread->start;
+    timestamp    = write_package[start].timestamp;
+    buff         = write_package[start].buff;
+    nsamps       = write_package[start].nsamps;
+    cc           = write_package[start].cc;
+    first_packet = write_package[start].first_packet;
+    last_packet  = write_package[start].last_packet;
+    flags_msb    = write_package[start].flags_msb;
+    write_thread->start = (write_thread->start + 1)% MAX_WRITE_THREAD_PACKAGE;
+    write_thread->count_write--;
+    pthread_mutex_unlock(&write_thread->mutex_write);
+    /*if(write_thread->count_write != 0){
+      LOG_W(HW,"count write = %d, start = %d, end = %d\n", write_thread->count_write, write_thread->start, write_thread->end);
+    }*/
+
+    #if defined(__x86_64) || defined(__i386__)
+      #ifdef __AVX2__
+        nsamps2 = (nsamps+7)>>3;
+        __m256i buff_tx[8][nsamps2];
+      #else
+        nsamps2 = (nsamps+3)>>2;
+        __m128i buff_tx[8][nsamps2];
+      #endif
+    #elif defined(__arm__)
+      nsamps2 = (nsamps+3)>>2;
+      int16x8_t buff_tx[8][nsamps2];
+    #else
+    #error Unsupported CPU architecture, USRP device cannot be built
+    #endif
+
+    // bring RX data into 12 LSBs for softmodem RX
+    for (int i=0; i<cc; i++) {
+      for (int j=0; j<nsamps2; j++) {
+        #if defined(__x86_64__) || defined(__i386__)
+          #ifdef __AVX2__
+            buff_tx[i][j] = _mm256_slli_epi16(((__m256i *)buff[i])[j],4);
+          #else
+            buff_tx[i][j] = _mm_slli_epi16(((__m128i *)buff[i])[j],4);
+          #endif
+        #elif defined(__arm__)
+          buff_tx[i][j] = vshlq_n_s16(((int16x8_t *)buff[i])[j],4);
+        #endif
+      }
+    }
+
+    
+    s->tx_md.has_time_spec  = true;
+    s->tx_md.start_of_burst = (s->tx_count==0) ? true : first_packet;
+    s->tx_md.end_of_burst   = last_packet;
+    s->tx_md.time_spec      = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate);
+    s->tx_count++;
+
+    // bit 3 enables gpio (for backward compatibility)
+    if (flags_msb&8) {
+      // push GPIO bits 7-9 from flags_msb
+      int gpio789=(flags_msb&7)<<7;
+      s->usrp->set_command_time(s->tx_md.time_spec);
+      s->usrp->set_gpio_attr("FP0", "OUT", gpio789, 0x380);
+      s->usrp->clear_command_time();
+    }
+
+    if (cc>1) {
+      std::vector<void *> buff_ptrs;
+
+      for (int i=0; i<cc; i++)
+        buff_ptrs.push_back(&(((int16_t *)buff_tx[i])[0]));
+
+      ret = (int)s->tx_stream->send(buff_ptrs, nsamps, s->tx_md);
+    } 
+    else {
+      ret = (int)s->tx_stream->send(&(((int16_t *)buff_tx[0])[0]), nsamps, s->tx_md);
+    }
+
+    if (ret != nsamps) LOG_E(HW,"[xmit] tx samples %d != %d\n",ret,nsamps);
+    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_USRP_SEND_RETURN, ret );
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_THREAD, 0 );
+
+    if(0) break;
+  }
+
+  return NULL;
+}
+
+int trx_write_init(openair0_device *device){
+
+  uhd::set_thread_priority_safe(1.0);
+  openair0_thread_t *write_thread = &device->write_thread;
+  printf("initializing tx write thread\n");
+
+  write_thread->start              = 0;
+  write_thread->end                = 0;
+  write_thread->count_write        = 0;
+  printf("end of tx write thread\n");
+
+  pthread_create(&write_thread->pthread_write,NULL,trx_usrp_write_thread,(void *)device);
+
+  return(0);
+}
+
+//---------------------end-------------------------
+
 /*! \brief Receive samples from hardware.
  * Read \ref nsamps samples from each channel to buffers. buff[0] is the array for
  * the first channel. *ptimestamp is the time at which the first sample
@@ -765,6 +932,7 @@ extern "C" {
     device->trx_stop_func  = trx_usrp_stop;
     device->trx_set_freq_func = trx_usrp_set_freq;
     device->trx_set_gains_func   = trx_usrp_set_gains;
+    device->trx_write_init = trx_write_init;
 
 
     // hotfix! to be checked later
diff --git a/targets/ARCH/rfsimulator/apply_channelmod.c b/targets/ARCH/rfsimulator/apply_channelmod.c
index faf84bb0aaa47dba7d287a5af4195155451eb33b..7aa5d78bf85657b07c661d8b539cee6a42b7bb7a 100644
--- a/targets/ARCH/rfsimulator/apply_channelmod.c
+++ b/targets/ARCH/rfsimulator/apply_channelmod.c
@@ -34,6 +34,9 @@
 #include <common/utils/LOG/log.h>
 #include <common/config/config_userapi.h>
 #include <openair1/SIMULATION/TOOLS/sim.h>
+#include <common/utils/telnetsrv/telnetsrv.h>
+#include <common/utils/load_module_shlib.h>
+#include <targets/ARCH/rfsimulator/rfsimulator.h>
 
 /*
   Legacy study:
@@ -99,8 +102,8 @@ void rxAddInput( struct complex16 *input_sig, struct complex16 *after_channel_si
       } //l
     }
 
-    out_ptr->r += round(rx_tmp.x*pathLossLinear + noise_per_sample*gaussdouble(0.0,1.0));
-    out_ptr->i += round(rx_tmp.y*pathLossLinear + noise_per_sample*gaussdouble(0.0,1.0));
+    out_ptr->r += round(rx_tmp.x*pathLossLinear + noise_per_sample*gaussZiggurat(0.0,1.0));
+    out_ptr->i += round(rx_tmp.y*pathLossLinear + noise_per_sample*gaussZiggurat(0.0,1.0));
     out_ptr++;
   }
 
@@ -112,3 +115,4 @@ void rxAddInput( struct complex16 *input_sig, struct complex16 *after_channel_si
           channelDesc->path_loss_dB,
           10*log10(noise_per_sample));
 }
+
diff --git a/targets/ARCH/rfsimulator/new_channel_sim.c b/targets/ARCH/rfsimulator/new_channel_sim.c
new file mode 100644
index 0000000000000000000000000000000000000000..0501babd2004df7b92b13b7c1e0adb919b57ec4f
--- /dev/null
+++ b/targets/ARCH/rfsimulator/new_channel_sim.c
@@ -0,0 +1,108 @@
+/*
+* 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
+*
+* Author and copyright: Laurent Thomas, open-cells.com
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*-------------------------------------------------------------------------------
+* For more information about the OpenAirInterface (OAI) Software Alliance:
+*      contact@openairinterface.org
+*/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <errno.h>
+
+
+#include <common/utils/assertions.h>
+#include <common/utils/LOG/log.h>
+#include <common/config/config_userapi.h>
+#include <openair1/SIMULATION/TOOLS/sim.h>
+#include <targets/ARCH/rfsimulator/rfsimulator.h>
+
+// Ziggurat 
+static double wn[128],fn[128];
+static uint32_t iz,jz,jsr=123456789,kn[128];
+static int32_t hz;
+#define SHR3 (jz=jsr, jsr^=(jsr<<13),jsr^=(jsr>>17),jsr^=(jsr<<5),jz+jsr)
+#define UNI (0.5+(signed) SHR3 * 0.2328306e-9)
+
+double nfix(void) {
+  const double r = 3.442620;
+  static double x, y;
+
+  for (;;) {
+    x=hz *  wn[iz];
+
+    if (iz==0) {
+      do {
+        x = - 0.2904764 * log (UNI);
+        y = - log (UNI);
+      } while (y+y < x*x);
+
+      return (hz>0)? r+x : -r-x;
+    }
+
+    if (fn[iz]+UNI*(fn[iz-1]-fn[iz])<exp(-0.5*x*x)) {
+      return x;
+    }
+
+    hz = SHR3;
+    iz = hz&127;
+
+    if (abs(hz) < kn[iz]) {
+      return ((hz)*wn[iz]);
+    }
+  }
+}
+
+/*!\Procedure to create tables for normal distribution kn,wn and fn. */
+
+void tableNor(unsigned long seed) {
+  jsr=seed;
+  double dn = 3.442619855899;
+  int i;
+  const double m1 = 2147483648.0;
+  double q;
+  double tn = 3.442619855899;
+  const double vn = 9.91256303526217E-03;
+  q = vn/exp(-0.5*dn*dn);
+  kn[0] = ((dn/q)*m1);
+  kn[1] = 0;
+  wn[0] =  ( q / m1 );
+  wn[127] = ( dn / m1 );
+  fn[0] = 1.0;
+  fn[127] = ( exp ( - 0.5 * dn * dn ) );
+
+  for ( i = 126; 1 <= i; i-- ) {
+    dn = sqrt (-2.0 * log ( vn/dn + exp(-0.5*dn*dn)));
+    kn[i+1] = ((dn / tn)*m1);
+    tn = dn;
+    fn[i] = (exp (-0.5*dn*dn));
+    wn[i] = (dn / m1);
+  }
+
+  return;
+}
+
+double gaussZiggurat(double mean, double variance) {
+  hz=SHR3;
+  iz=hz&127;
+  return abs(hz)<kn[iz]? hz*wn[iz] : nfix();
+}
diff --git a/targets/ARCH/rfsimulator/rfsimulator.h b/targets/ARCH/rfsimulator/rfsimulator.h
new file mode 100644
index 0000000000000000000000000000000000000000..292873032e010d7d1443f5e5424fe4c087962f39
--- /dev/null
+++ b/targets/ARCH/rfsimulator/rfsimulator.h
@@ -0,0 +1,37 @@
+/*
+* 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
+*
+* Author and copyright: Laurent Thomas, open-cells.com
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*-------------------------------------------------------------------------------
+* For more information about the OpenAirInterface (OAI) Software Alliance:
+*      contact@openairinterface.org
+*/
+
+#ifndef __RFSIMULATOR_H
+#define  __RFSIMULATOR_H
+double gaussZiggurat(double mean, double variance);
+void tableNor(unsigned long seed);
+void rxAddInput( struct complex16 *input_sig,
+                 struct complex16 *after_channel_sig,
+                 int rxAnt,
+                 channel_desc_t *channelDesc,
+                 int nbSamples,
+                 uint64_t TS,
+                 uint32_t CirSize
+               );
+
+#endif
diff --git a/targets/ARCH/rfsimulator/simulator.c b/targets/ARCH/rfsimulator/simulator.c
index dc448b33e91a20e77d0723b983ea7d03b46cd353..45412f9eea9c65b6575632ae84c451b0c1cc7724 100644
--- a/targets/ARCH/rfsimulator/simulator.c
+++ b/targets/ARCH/rfsimulator/simulator.c
@@ -50,6 +50,7 @@
 #include "openair1/PHY/defs_UE.h"
 #define CHANNELMOD_DYNAMICLOAD
 #include <openair1/SIMULATION/TOOLS/sim.h>
+#include <targets/ARCH/rfsimulator/rfsimulator.h>
 
 #define PORT 4043 //default TCP port for this simulator
 #define CirSize 307200 // 100ms is enough
@@ -146,6 +147,12 @@ void allocCirBuf(rfsimulator_state_t *bridge, int sock) {
     // the value channel_model->path_loss_dB seems only a storage place (new_channel_desc_scm() only copy the passed value)
     // Legacy changes directlty the variable channel_model->path_loss_dB place to place
     // while calling new_channel_desc_scm() with path losses = 0
+    static bool init_done=false;
+    if (!init_done) {
+      randominit(0);
+      tableNor(0);
+      init_done=true;
+    }
     ptr->channel_model=new_channel_desc_scm(bridge->tx_num_channels,bridge->rx_num_channels,
                                             bridge->channelmod,
                                             bridge->sample_rate,
@@ -561,6 +568,7 @@ int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimestamp, vo
       pthread_mutex_unlock(&Sockmutex);
       usleep(10000);
       pthread_mutex_lock(&Sockmutex);
+
       if ( t->lastWroteTS < t->nextTimestamp ) {
         // Assuming Tx is not done fully in another thread
         // We can never write is the past from the received time
@@ -574,6 +582,7 @@ int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimestamp, vo
 
         for ( int i=0; i < t->tx_num_channels; i++)
           samplesVoid[i]=(void *)&v;
+
 	LOG_I(HW, "No samples Tx occured, so we send 1 sample to notify it: Tx:%lu, Rx:%lu\n",
 	      t->lastWroteTS, t->nextTimestamp);
         rfsimulator_write_internal(t, t->nextTimestamp,
@@ -679,6 +688,9 @@ int rfsimulator_set_freq(openair0_device *device, openair0_config_t *openair0_cf
 int rfsimulator_set_gains(openair0_device *device, openair0_config_t *openair0_cfg) {
   return 0;
 }
+int rfsimulator_write_init(openair0_device *device){
+  return 0;
+}
 __attribute__((__visibility__("default")))
 int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
   // to change the log level, use this on command line
@@ -702,6 +714,7 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
   device->type = USRP_B200_DEV;
   device->openair0_cfg=&openair0_cfg[0];
   device->priv = rfsimulator;
+  device->trx_write_init = rfsimulator_write_init;
 
   for (int i=0; i<FD_SETSIZE; i++)
     rfsimulator->buf[i].conn_sock=-1;
@@ -712,7 +725,7 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
   rfsimulator->rx_num_channels=openair0_cfg->rx_num_channels;
   rfsimulator->sample_rate=openair0_cfg->sample_rate;
   rfsimulator->tx_bw=openair0_cfg->tx_bw;
-  randominit(0);
+  //randominit(0);
   set_taus_seed(0);
   return 0;
 }
diff --git a/targets/COMMON/create_tasks_mbms.h b/targets/COMMON/create_tasks_mbms.h
deleted file mode 100644
index 843897cefb4a73b0f52fc74e7b2fc80ddeb0790d..0000000000000000000000000000000000000000
--- a/targets/COMMON/create_tasks_mbms.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
- */
-
-#ifndef CREATE_TASKS_H_
-#define CREATE_TASKS_H_
-
-/* External declaration of L2L1 task that depend on the target */
-extern void *l2l1_task(void *arg);
-
-int create_tasks(uint32_t enb_nb);
-int create_tasks_ue(uint32_t ue_nb);
-int create_tasks_mbms(uint32_t enb_nb);
-
-#endif /* CREATE_TASKS_H_ */
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 904a4556007e3b20f2a7ae18282fc31c4c8a439b..fed15739cf55e3b00aa9e56a5cc4a4e6536ab9fc 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
@@ -237,8 +237,8 @@ RUs = (
          max_pdschReferenceSignalPower = -27;
          max_rxgain                    = 114;
          eNB_instances  = [0];
-	 sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2";
-         #clock_src = "external";
+	 sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
+         clock_src = "external";
     }
 );  
 
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 f5e2298a9971243481be25ea9a7260d419ac1172..08bfeea7eecb18b5451209c5337dbf63752e639f 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
@@ -237,7 +237,7 @@ RUs = (
          max_pdschReferenceSignalPower = -27;
          max_rxgain                    = 114;
          eNB_instances  = [0];
-	 sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2";
+	 sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
          clock_src = "external";
     }
 );  
diff --git a/targets/RT/USER/gNB_usrp.gtkw b/targets/RT/USER/gNB_usrp.gtkw
index e6726e7d9feb67e3c2f57a5b9cf38f202d8b112f..6ece894bb61a5dd206576e85a48e2b82f8542cb7 100644
--- a/targets/RT/USER/gNB_usrp.gtkw
+++ b/targets/RT/USER/gNB_usrp.gtkw
@@ -1,21 +1,25 @@
 [*]
 [*] GTKWave Analyzer v3.3.61 (w)1999-2014 BSI
-[*] Tue Dec 17 15:31:51 2019
+[*] Wed Mar  4 14:05:43 2020
 [*]
-[dumpfile] "/tmp/gNB.vcd"
-[dumpfile_mtime] "Tue Dec 17 15:25:49 2019"
-[dumpfile_size] 6343431
+[dumpfile] "/tmp/gNB_trx_thread.vcd"
+[dumpfile_mtime] "Wed Mar  4 14:05:10 2020"
+[dumpfile_size] 10750468
 [savefile] "/home/wangts/openairinterface5g/targets/RT/USER/gNB_usrp.gtkw"
-[timestart] 1517712000
-[size] 1920 1018
-[pos] -9 -33
-*-19.276148 1518358451 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+[timestart] 31148700000
+[size] 1916 1002
+[pos] -1 -25
+*-23.852516 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 [sst_width] 386
 [signals_width] 344
 [sst_expanded] 1
-[sst_vpaned_height] 267
+[sst_vpaned_height] 262
 @28
 functions.trx_read
+functions.trx_write_thread
+@25
+variables.trx_write_flags[63:0]
+@28
 functions.trx_write
 @420
 variables.frame_number_TX0_UE[63:0]
diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c
index cb04480d3321c1080299ecd7aaaaa4069ced9151..147bc955aeb2d0c80f5f30fe23e2fb1a701d9512 100644
--- a/targets/RT/USER/lte-enb.c
+++ b/targets/RT/USER/lte-enb.c
@@ -851,9 +851,7 @@ void init_eNB_proc(int inst) {
 
   for (CC_id=0; CC_id<RC.nb_CC[inst]; CC_id++) {
     eNB = RC.eNB[inst][CC_id];
-#ifndef OCP_FRAMEWORK
     LOG_I(PHY,"Initializing eNB processes instance:%d CC_id %d \n",inst,CC_id);
-#endif
     proc = &eNB->proc;
     L1_proc                        = &proc->L1_proc;
     L1_proc_tx                     = &proc->L1_proc_tx;
@@ -1247,9 +1245,7 @@ void init_eNB(int single_thread_flag,
       eNB->abstraction_flag   = 0;
       eNB->single_thread_flag = single_thread_flag;
       LOG_I(PHY,"Initializing eNB %d CC_id %d single_thread_flag:%d\n",inst,CC_id,single_thread_flag);
-#ifndef OCP_FRAMEWORK
       LOG_I(PHY,"Initializing eNB %d CC_id %d\n",inst,CC_id);
-#endif
       LOG_I(PHY,"Registering with MAC interface module\n");
       AssertFatal((eNB->if_inst         = IF_Module_init(inst))!=NULL,"Cannot register interface");
       eNB->if_inst->schedule_response   = schedule_response;
diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c
index 8c9b143100ef19c0e9a58c9104659a2ff9ca5d43..d2e734f2055b0d36df69424844bc3fe76cf5d6e5 100644
--- a/targets/RT/USER/lte-ru.c
+++ b/targets/RT/USER/lte-ru.c
@@ -2233,9 +2233,7 @@ void init_RU_proc(RU_t *ru) {
   RU_proc_t *proc;
   pthread_attr_t *attr_FH=NULL, *attr_FH1=NULL, *attr_prach=NULL, *attr_asynch=NULL, *attr_synch=NULL, *attr_emulateRF=NULL, *attr_ctrl=NULL, *attr_prach_br=NULL;
   //pthread_attr_t *attr_fep=NULL;
-#ifndef OCP_FRAMEWORK
   LOG_I(PHY,"Initializing RU proc %d (%s,%s),\n",ru->idx,NB_functions[ru->function],NB_timing[ru->if_timing]);
-#endif
   proc = &ru->proc;
   memset((void *)proc,0,sizeof(RU_proc_t));
   proc->ru = ru;