diff --git a/ci-scripts/Jenkinsfile-gitlab b/ci-scripts/Jenkinsfile-gitlab
index f83ee6faf0a1c5de4e0e0efe09cf8fe2bf36d574..d4fe0d85552532732eaf167c290c9599a29eb0f6 100644
--- a/ci-scripts/Jenkinsfile-gitlab
+++ b/ci-scripts/Jenkinsfile-gitlab
@@ -286,7 +286,8 @@ pipeline {
                         }
                     }
                     post {
-                        always {
+                        // In case of success we really pick the report from the exact slave build number
+                        success {
                             script {
                                 copyArtifacts(projectName: 'eNB-CI-FDD-Band7-B210',
                                               filter: 'test_results*.html',
@@ -296,6 +297,21 @@ pipeline {
                                 }
                             }
                         }
+                        // In case of any non-success, we are retrieving the HTML report of the last completed
+                        // slave job. Note that we could use that syntax also in case of success.
+                        // The only drop-back is that we may retrieve the HTML report of a previous build
+                        cleanup {
+                            script {
+                                if (!fileExists('test_results-eNB-CI-FDD-Band7-B210.html')) {
+                                    copyArtifacts(projectName: 'eNB-CI-FDD-Band7-B210',
+                                                  filter: 'test_results*.html',
+                                                  selector: lastCompleted())
+                                    if (fileExists('test_results-eNB-CI-FDD-Band7-B210.html')) {
+                                        archiveArtifacts artifacts: 'test_results-eNB-CI-FDD-Band7-B210.html'
+                                    }
+                                }
+                            }
+                        }
                     }
                 }
             }
diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index 4ba2fbcf5b8c1f650e7032f8348a919024abf326..83516d3358990c2d38befa48235ddd0d82e41bf0 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -45,7 +45,7 @@ import xml.etree.ElementTree as ET
 import logging
 import datetime
 import signal
-from multiprocessing import Process,Lock
+from multiprocessing import Process, Lock, SimpleQueue
 logging.basicConfig(
 	level=logging.DEBUG,
 	format="[%(asctime)s] %(name)s:%(levelname)s: %(message)s"
@@ -154,6 +154,34 @@ class SSHConnection():
 		else:
 			logging.debug('\u001B[1;37;41m Unexpected Others \u001B[0m')
 
+	def copy(self, ipaddress, username, password, source, destination):
+		logging.debug('scp '+ username + '@' + ipaddress + ':' + source + ' ' + destination)
+		scp_spawn = pexpect.spawn('scp '+ username + '@' + ipaddress + ':' + source + ' ' + destination, timeout = 5)
+		scp_response = scp_spawn.expect(['Are you sure you want to continue connecting (yes/no)?', 'password:', pexpect.EOF, pexpect.TIMEOUT])
+		if scp_response == 0:
+			scp_spawn.sendline('yes')
+			scp_spawn.expect('password:')
+			scp_spawn.sendline(password)
+			scp_response = scp_spawn.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT])
+			if scp_response == 0:
+				pass
+			else:
+				logging.debug('1 - scp_response = ' + str(scp_response))
+				sys.exit('SCP failed')
+		elif scp_response == 1:
+			scp_spawn.sendline(password)
+			scp_response = scp_spawn.expect(['\$', 'Permission denied', 'password:', pexpect.EOF, pexpect.TIMEOUT])
+			if scp_response == 0 or scp_response == 3:
+				pass
+			else:
+				logging.debug('2 - scp_response = ' + str(scp_response))
+				sys.exit('SCP failed')
+		elif scp_response == 2:
+			pass
+		else:
+			logging.debug('3 - scp_response = ' + str(scp_response))
+			sys.exit('SCP failed')
+
 	def BuildeNB(self):
 		if self.eNBIPAddress == '' or self.eNBRepository == '' or self.eNBBranch == '' or self.eNBUserName == '' or self.eNBPassword == '' or self.eNBSourceCodePath == '':
 			Usage()
@@ -274,7 +302,7 @@ class SSHConnection():
 			loopCounter = loopCounter - 1
 			if (loopCounter == 0):
 				doLoop = False
-				logging.debug('\u001B[1;37;43m eNB logging system did not show got sync! See with attach later \u001B[0m')
+				logging.debug('\u001B[1;30;43m eNB logging system did not show got sync! See with attach later \u001B[0m')
 				self.CreateHtmlTestRow(config_file, 'eNB not showing got sync!', 0)
 				# Not getting got sync is bypassed for the moment
 				#sys.exit(1)
@@ -319,21 +347,32 @@ class SSHConnection():
 			job.join()
 		self.CreateHtmlTestRow('N/A', 'OK', 0)
 
-	def AttachUE_common(self, device_id):
+	def AttachUE_common(self, device_id, statusQueue, lock):
 		try:
 			self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
 			self.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/on', '\$', 60)
 			time.sleep(2)
-			count = 45
+			max_count = 45
+			count = max_count
 			while count > 0:
 				self.command('stdbuf -o0 adb -s ' + device_id + ' shell dumpsys telephony.registry | grep mDataConnectionState', '\$', 15)
 				result = re.search('mDataConnectionState.*=(?P<state>[0-9\-]+)', str(self.ssh.before))
 				if result is None:
 					logging.debug('\u001B[1;37;41m mDataConnectionState Not Found! \u001B[0m')
-					sys.exit(1)
+					lock.acquire()
+					statusQueue.put(-1)
+					statusQueue.put(device_id)
+					statusQueue.put('mDataConnectionState Not Found!')
+					lock.release()
+					break
 				mDataConnectionState = int(result.group('state'))
 				if mDataConnectionState == 2:
 					logging.debug('\u001B[1mUE (' + device_id + ') Attach Completed\u001B[0m')
+					lock.acquire()
+					statusQueue.put(max_count - count)
+					statusQueue.put(device_id)
+					statusQueue.put('Attach Completed')
+					lock.release()
 					break
 				count = count - 1
 				if count == 15 or count == 30:
@@ -342,11 +381,15 @@ class SSHConnection():
 					time.sleep(0.5)
 					self.command('stdbuf -o0 adb -s ' + device_id + ' shell /data/local/tmp/on', '\$', 60)
 					time.sleep(0.5)
-				logging.debug('\u001B[1mWait UE (' + device_id + ') a second until mDataConnectionState=2 (' + str(45-count) + ' times)\u001B[0m')
+				logging.debug('\u001B[1mWait UE (' + device_id + ') a second until mDataConnectionState=2 (' + str(max_count-count) + ' times)\u001B[0m')
 				time.sleep(1)
 			if count == 0:
 				logging.debug('\u001B[1;37;41m UE (' + device_id + ') Attach Failed \u001B[0m')
-				sys.exit(1)
+				lock.acquire()
+				statusQueue.put(-1)
+				statusQueue.put(device_id)
+				statusQueue.put('Attach Failed')
+				lock.release()
 			self.close()
 		except:
 			os.kill(os.getppid(),signal.SIGUSR1)
@@ -358,14 +401,39 @@ class SSHConnection():
 		initialize_eNB_flag = False
 		self.CheckProcessExist(initialize_eNB_flag)
 		multi_jobs = []
+		status_queue = SimpleQueue()
+		lock = Lock()
 		for device_id in self.UEDevices:
-			p = Process(target = SSH.AttachUE_common, args = (device_id,))
+			p = Process(target = SSH.AttachUE_common, args = (device_id, status_queue, lock,))
 			p.daemon = True
 			p.start()
 			multi_jobs.append(p)
 		for job in multi_jobs:
 			job.join()
-		self.CreateHtmlTestRow('N/A', 'OK', len(self.UEDevices))
+
+		if (status_queue.empty()):
+			self.CreateHtmlTestRow('N/A', 'KO', len(self.UEDevices))
+			sys.exit(1)
+		else:
+			attach_status = True
+			html_queue = SimpleQueue()
+			while (not status_queue.empty()):
+				count = status_queue.get()
+				if (count < 0):
+					attach_status = False
+				device_id = status_queue.get()
+				message = status_queue.get()
+				if (count < 0):
+					html_cell = "<pre>UE (" + device_id + ")\n" + message + "</pre>"
+				else:
+					html_cell = "<pre>UE (" + device_id + ")\n" + message + ' in ' + str(count + 2) + ' seconds</pre>'
+				html_queue.put(html_cell)
+			if (attach_status):
+				self.CreateHtmlTestRowQueue('N/A', 'OK', len(self.UEDevices), html_queue)
+			else:
+				self.CreateHtmlTestRowQueue('N/A', 'KO', len(self.UEDevices), html_queue)
+				self.CreateHtmlFooter()
+				sys.exit(1)
 
 	def DetachUE_common(self, device_id):
 		try:
@@ -481,7 +549,7 @@ class SSHConnection():
 			self.UEIPAddresses.append(UE_IPAddress)
 		self.close()
 
-	def Ping_common(self, lock, UE_IPAddress, device_id):
+	def Ping_common(self, lock, UE_IPAddress, device_id,statusQueue):
 		try:
 			self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword)
 			self.command('cd ' + self.EPCSourceCodePath, '\$', 5)
@@ -490,32 +558,65 @@ class SSHConnection():
 			self.command('stdbuf -o0 ping ' + self.ping_args + ' ' + UE_IPAddress + ' 2>&1 | stdbuf -o0 tee -a ping_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(ping_time[0])*1.5)
 			result = re.search(', (?P<packetloss>[0-9\.]+)% packet loss, time [0-9\.]+ms', str(self.ssh.before))
 			if result is None:
-				logging.debug('\u001B[1;37;41m Packet Loss Not Found! \u001B[0m')
-				sys.exit(1)
+				message = 'Packet Loss Not Found!'
+				logging.debug('\u001B[1;37;41m ' + message + ' \u001B[0m')
+				lock.acquire()
+				statusQueue.put(-1)
+				statusQueue.put(device_id)
+				statusQueue.put(message)
+				lock.release()
+				return
 			packetloss = result.group('packetloss')
 			if float(packetloss) == 100:
-				logging.debug('\u001B[1;37;41m Packet Loss is 100% \u001B[0m')
-				sys.exit(1)
+				message = 'Packet Loss is 100%'
+				logging.debug('\u001B[1;37;41m ' + message + ' \u001B[0m')
+				lock.acquire()
+				statusQueue.put(-1)
+				statusQueue.put(device_id)
+				statusQueue.put(message)
+				lock.release()
+				return
 			result = re.search('rtt min\/avg\/max\/mdev = (?P<rtt_min>[0-9\.]+)\/(?P<rtt_avg>[0-9\.]+)\/(?P<rtt_max>[0-9\.]+)\/[0-9\.]+ ms', str(self.ssh.before))
 			if result is None:
-				logging.debug('\u001B[1;37;41m Ping RTT_Min RTT_Avg RTT_Max Not Found! \u001B[0m')
-				sys.exit(1)
+				message = 'Ping RTT_Min RTT_Avg RTT_Max Not Found!'
+				logging.debug('\u001B[1;37;41m ' + message + ' \u001B[0m')
+				lock.acquire()
+				statusQueue.put(-1)
+				statusQueue.put(device_id)
+				statusQueue.put(message)
+				lock.release()
+				return
 			rtt_min = result.group('rtt_min')
 			rtt_avg = result.group('rtt_avg')
 			rtt_max = result.group('rtt_max')
+			pal_msg = 'Packet Loss : ' + packetloss + '%'
+			min_msg = 'RTT(Min)    : ' + rtt_min + ' ms'
+			avg_msg = 'RTT(Avg)    : ' + rtt_avg + ' ms'
+			max_msg = 'RTT(Max)    : ' + rtt_max + ' ms'
 			lock.acquire()
 			logging.debug('\u001B[1;37;44m ping result (' + UE_IPAddress + ') \u001B[0m')
-			logging.debug('\u001B[1;34m    Packet Loss : ' + packetloss + '%\u001B[0m')
-			logging.debug('\u001B[1;34m    RTT(Min)    : ' + rtt_min + ' ms' + '\u001B[0m')
-			logging.debug('\u001B[1;34m    RTT(Avg)    : ' + rtt_avg + ' ms' + '\u001B[0m')
-			logging.debug('\u001B[1;34m    RTT(Max)    : ' + rtt_max + ' ms' + '\u001B[0m')
-			lock.release()
+			logging.debug('\u001B[1;34m    ' + pal_msg + '\u001B[0m')
+			logging.debug('\u001B[1;34m    ' + min_msg + '\u001B[0m')
+			logging.debug('\u001B[1;34m    ' + avg_msg + '\u001B[0m')
+			logging.debug('\u001B[1;34m    ' + max_msg + '\u001B[0m')
+			qMsg = pal_msg + '\n' + min_msg + '\n' + avg_msg + '\n' + max_msg
+			packetLossOK = True
 			if packetloss is not None:
 				if float(packetloss) > float(self.ping_packetloss_threshold):
+					qMsg += '\nPacket Loss too high'
 					logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m')
-					sys.exit(1)
+					packetLossOK = False
 				elif float(packetloss) > 0:
+					qMsg += '\nPacket Loss is not 0%'
 					logging.debug('\u001B[1;37;43m Packet Loss is not 0% \u001B[0m')
+			if (packetLossOK):
+				statusQueue.put(0)
+			else:
+				statusQueue.put(-1)
+			statusQueue.put(device_id)
+			statusQueue.put(UE_IPAddress)
+			statusQueue.put(qMsg)
+			lock.release()
 			self.close()
 		except:
 			os.kill(os.getppid(),signal.SIGUSR1)
@@ -530,16 +631,38 @@ class SSHConnection():
 		multi_jobs = []
 		i = 0
 		lock = Lock()
+		status_queue = SimpleQueue()
 		for UE_IPAddress in self.UEIPAddresses:
 			device_id = self.UEDevices[i]
-			p = Process(target = SSH.Ping_common, args = (lock,UE_IPAddress,device_id,))
+			p = Process(target = SSH.Ping_common, args = (lock,UE_IPAddress,device_id,status_queue,))
 			p.daemon = True
 			p.start()
 			multi_jobs.append(p)
 			i = i + 1
 		for job in multi_jobs:
 			job.join()
-		self.CreateHtmlTestRow(self.ping_args, 'OK', 0)
+
+		if (status_queue.empty()):
+			self.CreateHtmlTestRow(self.ping_args, 'KO', len(self.UEDevices))
+			sys.exit(1)
+		else:
+			ping_status = True
+			html_queue = SimpleQueue()
+			while (not status_queue.empty()):
+				count = status_queue.get()
+				if (count < 0):
+					ping_status = False
+				device_id = status_queue.get()
+				ip_addr = status_queue.get()
+				message = status_queue.get()
+				html_cell = "<pre>UE (" + device_id + ")\nIP Address  : " + ip_addr + "\n" + message + "</pre>"
+				html_queue.put(html_cell)
+			if (ping_status):
+				self.CreateHtmlTestRowQueue(self.ping_args, 'OK', len(self.UEDevices), html_queue)
+			else:
+				self.CreateHtmlTestRowQueue(self.ping_args, 'KO', len(self.UEDevices), html_queue)
+				self.CreateHtmlFooter()
+				sys.exit(1)
 
 	def Iperf_ComputeTime(self):
 		result = re.search('-t (?P<iperf_time>\d+)', str(self.iperf_args))
@@ -573,7 +696,7 @@ class SSHConnection():
 			sys.exit(1)
 		return result
 
-	def Iperf_analyzeV2Output(self, lock, UE_IPAddress):
+	def Iperf_analyzeV2Output(self, lock, UE_IPAddress, device_id, statusQueue):
 		result = re.search('Server Report:', str(self.ssh.before))
 		if result is None:
 			result = re.search('read failed: Connection refused', str(self.ssh.before))
@@ -581,7 +704,7 @@ class SSHConnection():
 				logging.debug('\u001B[1;37;41m Could not connect to iperf server! \u001B[0m')
 			else:
 				logging.debug('\u001B[1;37;41m Server Report and Connection refused Not Found! \u001B[0m')
-			sys.exit(1)
+			return -1
 		result = re.search('Server Report:\\\\r\\\\n(?:|\[ *\d+\].*) (?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?P<jitter>[0-9\.]+ ms) +(\d+\/..\d+) (\((?P<packetloss>[0-9\.]+)%\))', str(self.ssh.before))
 		if result is not None:
 			bitrate = result.group('bitrate')
@@ -589,41 +712,184 @@ class SSHConnection():
 			jitter = result.group('jitter')
 			lock.acquire()
 			logging.debug('\u001B[1;37;44m iperf result (' + UE_IPAddress + ') \u001B[0m')
+			iperfStatus = True
+			msg = ''
 			if bitrate is not None:
+				msg += 'Bitrate     : ' + bitrate + '\n'
 				logging.debug('\u001B[1;34m    Bitrate     : ' + bitrate + '\u001B[0m')
 			if packetloss is not None:
+				msg += 'Packet Loss : ' + packetloss + '%\n'
 				logging.debug('\u001B[1;34m    Packet Loss : ' + packetloss + '%\u001B[0m')
 				if float(packetloss) > float(self.iperf_packetloss_threshold):
+					msg += 'Packet Loss too high!\n'
 					logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m')
-					lock.release()
-					sys.exit(1)
+					iperfStatus = False
 			if jitter is not None:
+				msg += 'Jitter      : ' + jitter + '\n'
 				logging.debug('\u001B[1;34m    Jitter      : ' + jitter + '\u001B[0m')
+			if (iperfStatus):
+				statusQueue.put(0)
+			else:
+				statusQueue.put(-1)
+			statusQueue.put(device_id)
+			statusQueue.put(UE_IPAddress)
+			statusQueue.put(msg)
+			lock.release()
+			return 0
+
+	def Iperf_analyzeV2Server(self, lock, UE_IPAddress, device_id, statusQueue, iperf_real_options):
+		if (not os.path.isfile('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')):
+			lock.acquire()
+			statusQueue.put(-1)
+			statusQueue.put(device_id)
+			statusQueue.put(UE_IPAddress)
+			statusQueue.put('Could not analyze from server log')
+			lock.release()
+			return
+		# Computing the requested bandwidth in float
+		result = re.search('-b (?P<iperf_bandwidth>[0-9\.]+)[KMG]', str(iperf_real_options))
+		if result is None:
+			logging.debug('Iperf bandwidth Not Found!')
+			lock.acquire()
+			statusQueue.put(-1)
+			statusQueue.put(device_id)
+			statusQueue.put(UE_IPAddress)
+			statusQueue.put('Could not compute Iperf bandwidth!')
+			lock.release()
+			return
+		else:
+			req_bandwidth = result.group('iperf_bandwidth')
+			req_bw = float(req_bandwidth)
+			result = re.search('-b [0-9\.]+K', str(iperf_real_options))
+			if result is not None:
+				req_bandwidth = '%.1f Kbits/sec' % req_bw
+				req_bw = req_bw * 1000
+			result = re.search('-b [0-9\.]+M', str(iperf_real_options))
+			if result is not None:
+				req_bandwidth = '%.1f Mbits/sec' % req_bw
+				req_bw = req_bw * 1000000
+			result = re.search('-b [0-9\.]+G', str(iperf_real_options))
+			if result is not None:
+				req_bandwidth = '%.1f Gbits/sec' % req_bw
+				req_bw = req_bw * 1000000000
+
+		server_file = open('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', 'r')
+		br_sum = 0.0
+		ji_sum = 0.0
+		pl_sum = 0
+		ps_sum = 0
+		row_idx = 0
+		for line in server_file.readlines():
+			result = re.search('(?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?P<jitter>[0-9\.]+ ms) +(?P<lostPack>[0-9]+)/ +(?P<sentPack>[0-9]+)', str(line))
+			if result is not None:
+				bitrate = result.group('bitrate')
+				jitter = result.group('jitter')
+				packetlost = result.group('lostPack')
+				packetsent = result.group('sentPack')
+				br = bitrate.split(' ')
+				ji = jitter.split(' ')
+				row_idx = row_idx + 1
+				curr_br = float(br[0])
+				pl_sum = pl_sum + int(packetlost)
+				ps_sum = ps_sum + int(packetsent)
+				if (br[1] == 'Kbits/sec'):
+					curr_br = curr_br * 1000
+				if (br[1] == 'Mbits/sec'):
+					curr_br = curr_br * 1000 * 1000
+				br_sum = curr_br + br_sum
+				ji_sum = float(ji[0]) + ji_sum
+		if (row_idx > 0):
+			br_sum = br_sum / row_idx
+			ji_sum = ji_sum / row_idx
+			br_loss = 100 * br_sum / req_bw
+			if (br_sum > 1000):
+				br_sum = br_sum / 1000
+				if (br_sum > 1000):
+					br_sum = br_sum / 1000
+					bitrate = '%.2f Mbits/sec' % br_sum
+				else:
+					bitrate = '%.2f Kbits/sec' % br_sum
+			else:
+				bitrate = '%.2f bits/sec' % br_sum
+			bitperf = '%.2f ' % br_loss
+			bitperf += '%'
+			jitter = '%.2f ms' % (ji_sum)
+			if (ps_sum > 0):
+				pl = float(100 * pl_sum / ps_sum)
+				packetloss = '%2.1f ' % (pl)
+				packetloss += '%'
+			else:
+				packetloss = 'unknown'
+			lock.acquire()
+			if (br_loss < 90):
+				statusQueue.put(1)
+			else:
+				statusQueue.put(0)
+			statusQueue.put(device_id)
+			statusQueue.put(UE_IPAddress)
+			req_msg = 'Req Bitrate : ' + req_bandwidth
+			bir_msg = 'Bitrate     : ' + bitrate
+			brl_msg = 'Bitrate Perf: ' + bitperf
+			jit_msg = 'Jitter      : ' + jitter
+			pal_msg = 'Packet Loss : ' + packetloss
+			statusQueue.put(req_msg + '\n' + bir_msg + '\n' + brl_msg + '\n' + jit_msg + '\n' + pal_msg + '\n')
+			logging.debug('\u001B[1;37;45m iperf result (' + UE_IPAddress + ') \u001B[0m')
+			logging.debug('\u001B[1;35m    ' + req_msg + '\u001B[0m')
+			logging.debug('\u001B[1;35m    ' + bir_msg + '\u001B[0m')
+			logging.debug('\u001B[1;35m    ' + brl_msg + '\u001B[0m')
+			logging.debug('\u001B[1;35m    ' + jit_msg + '\u001B[0m')
+			logging.debug('\u001B[1;35m    ' + pal_msg + '\u001B[0m')
+			lock.release()
+		else:
+			lock.acquire()
+			statusQueue.put(-1)
+			statusQueue.put(device_id)
+			statusQueue.put(UE_IPAddress)
+			statusQueue.put('Could not analyze from server log')
 			lock.release()
 
-	def Iperf_analyzeV3Output(self, lock, UE_IPAddress):
+		server_file.close()
+
+
+	def Iperf_analyzeV3Output(self, lock, UE_IPAddress, device_id, statusQueue):
 		result = re.search('(?P<bitrate>[0-9\.]+ [KMG]bits\/sec) +(?:|[0-9\.]+ ms +\d+\/\d+ \((?P<packetloss>[0-9\.]+)%\)) +(?:|receiver)\\\\r\\\\n(?:|\[ *\d+\] Sent \d+ datagrams)\\\\r\\\\niperf Done\.', str(self.ssh.before))
 		if result is None:
 			result = re.search('(?P<error>iperf: error - [a-zA-Z0-9 :]+)', str(self.ssh.before))
+			lock.acquire()
+			statusQueue.put(-1)
+			statusQueue.put(device_id)
+			statusQueue.put(UE_IPAddress)
 			if result is not None:
 				logging.debug('\u001B[1;37;41m ' + result.group('error') + ' \u001B[0m')
+				statusQueue.put(result.group('error'))
 			else:
 				logging.debug('\u001B[1;37;41m Bitrate and/or Packet Loss Not Found! \u001B[0m')
-			sys.exit(1)
+				statusQueue.put('Bitrate and/or Packet Loss Not Found!')
+			lock.release()
+
 		bitrate = result.group('bitrate')
 		packetloss = result.group('packetloss')
 		lock.acquire()
 		logging.debug('\u001B[1;37;44m iperf result (' + UE_IPAddress + ') \u001B[0m')
 		logging.debug('\u001B[1;34m    Bitrate     : ' + bitrate + '\u001B[0m')
+		msg = 'Bitrate     : ' + bitrate + '\n'
+		iperfStatus = True
 		if packetloss is not None:
 			logging.debug('\u001B[1;34m    Packet Loss : ' + packetloss + '%\u001B[0m')
+			msg += 'Packet Loss : ' + packetloss + '%\n'
 			if float(packetloss) > float(self.iperf_packetloss_threshold):
 				logging.debug('\u001B[1;37;41m Packet Loss too high \u001B[0m')
-				lock.release()
-				sys.exit(1)
+				msg += 'Packet Loss too high!\n'
+				iperfStatus = False
+		if (iperfStatus):
+			statusQueue.put(0)
+		else:
+			statusQueue.put(-1)
+		statusQueue.put(device_id)
+		statusQueue.put(UE_IPAddress)
 		lock.release()
 
-	def Iperf_UL_common(self, lock, UE_IPAddress, device_id, idx, ue_num):
+	def Iperf_UL_common(self, lock, UE_IPAddress, device_id, idx, ue_num, statusQueue):
 		ipnumbers = UE_IPAddress.split('.')
 		if (len(ipnumbers) == 4):
 			ipnumbers[3] = '1'
@@ -645,25 +911,32 @@ class SSHConnection():
 		time.sleep(0.5)
 
 		modified_options = self.Iperf_ComputeModifiedBW(idx, ue_num)
+		modified_options = modified_options.replace('-R','')
 		time.sleep(0.5)
 
 		self.command('rm -f iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', 5)
 		self.command('stdbuf -o0 adb -s ' + device_id + ' shell "/data/local/tmp/iperf -c ' + EPC_Iperf_UE_IPAddress + ' ' + modified_options + ' -p ' + str(port) + '" 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
-		self.Iperf_analyzeV2Output(lock, UE_IPAddress)
+		clientStatus = self.Iperf_analyzeV2Output(lock, UE_IPAddress, device_id, statusQueue)
 
 		# Launch iperf server on EPC side
 		self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword)
 		self.command('killall --signal SIGKILL iperf', self.EPCUserName, 5)
 		self.close()
-
-	def Iperf_common(self, lock, UE_IPAddress, device_id, idx, ue_num):
+		if (clientStatus == -1):
+			time.sleep(1)
+			if (os.path.isfile('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')):
+				os.remove('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')
+			self.copy(self.EPCIPAddress, self.EPCUserName, self.EPCPassword, self.EPCSourceCodePath + '/scripts/iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '.')
+			self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options)
+
+	def Iperf_common(self, lock, UE_IPAddress, device_id, idx, ue_num, statusQueue):
 		try:
 			# Single-UE profile -- iperf only on one UE
 			if SSH.iperf_profile == 'single-ue' and idx != 0:
 				return
 			useIperf3 = False
 			self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
-			# if by chance ADB server and EPC are on the same remote host, at least log collection will take of it
+			# if by chance ADB server and EPC are on the same remote host, at least log collection will take care of it
 			self.command('if [ ! -d ' + self.EPCSourceCodePath + '/scripts ]; then mkdir -p ' + self.EPCSourceCodePath + '/scripts ; fi', '\$', 5)
 			self.command('cd ' + self.EPCSourceCodePath + '/scripts', '\$', 5)
 			# Checking if iperf / iperf3 are installed
@@ -672,8 +945,16 @@ class SSHConnection():
 			if result is None:
 				result = re.search('iperf', str(self.ssh.before))
 				if result is None:
-					logging.debug('\u001B[1;37;41m Neither iperf nor iperf3 installed on UE! \u001B[0m')
-					sys.exit(1)
+					message = 'Neither iperf nor iperf3 installed on UE!'
+					lock.acquire()
+					logging.debug('\u001B[1;37;41m ' + message + ' \u001B[0m')
+					statusQueue.put(-1)
+					statusQueue.put(device_id)
+					statusQueue.put(UE_IPAddress)
+					statusQueue.put(message)
+					lock.release()
+					return
+					#sys.exit(1)
 			else:
 				useIperf3 = True
 			# in case of iperf, UL has its own function
@@ -681,7 +962,7 @@ class SSHConnection():
 				result = re.search('-R', str(self.iperf_args))
 				if result is not None:
 					self.close()
-					self.Iperf_UL_common(lock, UE_IPAddress, device_id, idx, ue_num)
+					self.Iperf_UL_common(lock, UE_IPAddress, device_id, idx, ue_num, statusQueue)
 					return
 
 			if (useIperf3):
@@ -704,11 +985,12 @@ class SSHConnection():
 			if (useIperf3):
 				self.command('stdbuf -o0 iperf3 -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
 
-				self.Iperf_analyzeV3Output(lock, UE_IPAddress)
+				clientStatus = 0
+				self.Iperf_analyzeV3Output(lock, UE_IPAddress, device_id, statusQueue)
 			else:
 				self.command('stdbuf -o0 iperf -c ' + UE_IPAddress + ' ' + modified_options + ' 2>&1 | stdbuf -o0 tee -a iperf_' + SSH.testCase_id + '_' + device_id + '.log', '\$', int(iperf_time)*5.0)
 
-				self.Iperf_analyzeV2Output(lock, UE_IPAddress)
+				clientStatus = self.Iperf_analyzeV2Output(lock, UE_IPAddress, device_id, statusQueue)
 			self.close()
 
 			self.open(self.ADBIPAddress, self.ADBUserName, self.ADBPassword)
@@ -718,6 +1000,12 @@ class SSHConnection():
 				pid_iperf = result.group('pid')
 				self.command('stdbuf -o0 adb -s ' + device_id + ' shell kill -KILL ' + pid_iperf, '\$', 5)
 			self.close()
+			if (clientStatus == -1):
+				time.sleep(1)
+				if (os.path.isfile('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')):
+					os.remove('iperf_server_' + SSH.testCase_id + '_' + device_id + '.log')
+				self.copy(self.ADBIPAddress, self.ADBUserName, self.ADBPassword, self.EPCSourceCodePath + '/scripts/iperf_server_' + SSH.testCase_id + '_' + device_id + '.log', '.')
+				self.Iperf_analyzeV2Server(lock, UE_IPAddress, device_id, statusQueue, modified_options)
 		except:
 			os.kill(os.getppid(),signal.SIGUSR1)
 
@@ -732,16 +1020,43 @@ class SSHConnection():
 		i = 0
 		ue_num = len(self.UEIPAddresses)
 		lock = Lock()
+		status_queue = SimpleQueue()
 		for UE_IPAddress in self.UEIPAddresses:
 			device_id = self.UEDevices[i]
-			p = Process(target = SSH.Iperf_common, args = (lock,UE_IPAddress,device_id,i,ue_num,))
+			p = Process(target = SSH.Iperf_common, args = (lock,UE_IPAddress,device_id,i,ue_num,status_queue,))
 			p.daemon = True
 			p.start()
 			multi_jobs.append(p)
 			i = i + 1
 		for job in multi_jobs:
 			job.join()
-		self.CreateHtmlTestRow(self.iperf_args, 'OK', 0)
+
+		if (status_queue.empty()):
+			self.CreateHtmlTestRow(self.iperf_args, 'KO', len(self.UEDevices))
+			sys.exit(1)
+		else:
+			iperf_status = True
+			iperf_noperf = False
+			html_queue = SimpleQueue()
+			while (not status_queue.empty()):
+				count = status_queue.get()
+				if (count < 0):
+					iperf_status = False
+				if (count > 0):
+					iperf_noperf = True
+				device_id = status_queue.get()
+				ip_addr = status_queue.get()
+				message = status_queue.get()
+				html_cell = "<pre>UE (" + device_id + ")\nIP Address  : " + ip_addr + "\n" + message + "</pre>"
+				html_queue.put(html_cell)
+			if (iperf_noperf and iperf_status):
+				self.CreateHtmlTestRowQueue(self.iperf_args, 'PERF NOT MET', len(self.UEDevices), html_queue)
+			elif (iperf_status):
+				self.CreateHtmlTestRowQueue(self.iperf_args, 'OK', len(self.UEDevices), html_queue)
+			else:
+				self.CreateHtmlTestRowQueue(self.iperf_args, 'KO', len(self.UEDevices), html_queue)
+				self.CreateHtmlFooter()
+				sys.exit(1)
 
 	def CheckProcessExist(self, initialize_eNB_flag):
 		multi_jobs = []
@@ -872,6 +1187,7 @@ class SSHConnection():
 			self.command('cd /opt/ltebox/tools', '\$', 5)
 			self.command('echo ' + self.EPCPassword + ' | sudo -S ./stop_mme', '\$', 5)
 		self.close()
+		self.CreateHtmlTestRow('N/A', 'OK', 0)
 
 	def TerminateSPGW(self):
 		self.open(self.EPCIPAddress, self.EPCUserName, self.EPCPassword)
@@ -1099,6 +1415,35 @@ class SSHConnection():
 				i += 1
 			self.htmlFile.write('      </tr>\n')
 
+	def CreateHtmlTestRowQueue(self, options, status, ue_status, ue_queue):
+		if ((not self.htmlFooterCreated) and (self.htmlHeaderCreated)):
+			addOrangeBK = False
+			self.htmlFile.write('      <tr>\n')
+			self.htmlFile.write('        <td bgcolor = "lightcyan" >' + SSH.testCase_id  + '</td>\n')
+			self.htmlFile.write('        <td>' + SSH.desc  + '</td>\n')
+			self.htmlFile.write('        <td>' + str(options)  + '</td>\n')
+			if (str(status) == 'OK'):
+				self.htmlFile.write('        <td bgcolor = "lightgreen" >' + str(status)  + '</td>\n')
+			elif (str(status) == 'KO'):
+				self.htmlFile.write('        <td bgcolor = "lightcoral" >' + str(status)  + '</td>\n')
+			else:
+				addOrangeBK = True
+				self.htmlFile.write('        <td bgcolor = "orange" >' + str(status)  + '</td>\n')
+			i = 0
+			while (i < self.htmlUEConnected):
+				if (i < ue_status):
+					if (not ue_queue.empty()):
+						if (addOrangeBK):
+							self.htmlFile.write('        <td bgcolor = "orange" >' + str(ue_queue.get()) + '</td>\n')
+						else:
+							self.htmlFile.write('        <td>' + str(ue_queue.get()) + '</td>\n')
+					else:
+						self.htmlFile.write('        <td>-</td>\n')
+				else:
+					self.htmlFile.write('        <td>-</td>\n')
+				i += 1
+			self.htmlFile.write('      </tr>\n')
+
 #-----------------------------------------------------------
 # Usage()
 #-----------------------------------------------------------
@@ -1110,8 +1455,8 @@ def Usage():
 	print('  --help  Show this help.')
 	print('  --mode=[Mode]')
 	print('      TesteNB')
-	print('      TerminateeNB, TerminateEPC')
-	print('      LogCollectBuild, LogCollecteNB, LogCollectEPC, LogCollectADB')
+	print('      TerminateeNB, TerminateUE, TerminateHSS, TerminateMME, TerminateSPGW')
+	print('      LogCollectBuild, LogCollecteNB, LogCollectHSS, LogCollectMME, LogCollectSPGW, LogCollectPing, LogCollectIperf')
 	print('  --eNBIPAddress=[eNB\'s IP Address]')
 	print('  --eNBRepository=[eNB\'s Repository URL]')
 	print('  --eNBBranch=[eNB\'s Branch Name]')
diff --git a/ci-scripts/xml_files/enb_usrp210_band7.xml b/ci-scripts/xml_files/enb_usrp210_band7.xml
index 7a56cf384c7bc50bc4e9d9cd3f56126c51be8cb5..444f91f09461fa86c90476d015199a8311365a42 100644
--- a/ci-scripts/xml_files/enb_usrp210_band7.xml
+++ b/ci-scripts/xml_files/enb_usrp210_band7.xml
@@ -21,13 +21,13 @@
 
 -->
 <testCaseList>
-	<TestCaseRequestedList>010101 050101 060101 070101 040101 030101 040301 040501 040601 040602 040603 040604 040605 040641 040401 040201 030201 030111 040301 040511 040611 040612 040613 040614 040615 040651 040401 040201 030201 030121 040301 040521 040621 040622 040623 040661 040401 040201 030201 </TestCaseRequestedList>
+	<TestCaseRequestedList>010101 050101 060101 070101 040101 030101 040301 040501 040601 040602 040603 040604 040605 040641 040642 040401 040201 030201 030111 040301 040511 040611 040612 040613 040614 040615 040651 040652 040401 040201 030201 030121 040301 040521 040621 040622 040623 040624 040625 040662 040661 040401 040201 030201 </TestCaseRequestedList>
 	<TestCaseExclusionList></TestCaseExclusionList>
 
 	<testCase id="010101">
 		<class>Build_eNB</class>
 		<desc>Build eNB (USRP)</desc>
-		<Build_eNB_args>-w USRP -x -c --eNB</Build_eNB_args>
+		<Build_eNB_args>-w USRP -c --eNB</Build_eNB_args>
 	</testCase>
 
 	<testCase id="030101">
@@ -138,6 +138,14 @@
 		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
 	</testCase>
 
+	<testCase id="040642">
+		<class>Iperf</class>
+		<desc>iperf (5MHz - UL/9Mbps/UDP)(60 sec)(single-ue profile)</desc>
+		<iperf_args>-u -b 9M -t 60 -i 1 -R</iperf_args>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>single-ue</iperf_profile>
+	</testCase>
+
 	<testCase id="040611">
 		<class>Iperf</class>
 		<desc>iperf (10MHz - DL/10Mbps/UDP)(60 sec)</desc>
@@ -182,6 +190,14 @@
 		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
 	</testCase>
 
+	<testCase id="040652">
+		<class>Iperf</class>
+		<desc>iperf (10MHz - UL/20Mbps/UDP)(60 sec)(single-ue profile)</desc>
+		<iperf_args>-u -b 20M -t 60 -i 1 -R</iperf_args>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>single-ue</iperf_profile>
+	</testCase>
+
 	<testCase id="040621">
 		<class>Iperf</class>
 		<desc>iperf (20MHz - DL/20Mbps/UDP)(60 sec)</desc>
@@ -211,7 +227,7 @@
 		<iperf_profile>single-ue</iperf_profile>
         </testCase>
 
-        <testCase id="040624">
+        <testCase id="040625">
 		<class>Iperf</class>
 		<desc>iperf (20MHz - DL/70Mbps/UDP)(60 sec)(unbalanced profile)</desc>
 		<iperf_args>-u -b 70M -t 60 -i 1</iperf_args>
@@ -226,6 +242,14 @@
 		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
 	</testCase>
 
+	<testCase id="040662">
+		<class>Iperf</class>
+		<desc>iperf (20MHz - UL/20Mbps/UDP)(60 sec)(single-ue profile)</desc>
+		<iperf_args>-u -b 20M -t 60 -i 1 -R</iperf_args>
+		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_profile>single-ue</iperf_profile>
+	</testCase>
+
         <testCase id="050101">
 		<class>Initialize_HSS</class>
 		<desc>Initialize HSS</desc>
diff --git a/ci-scripts/xml_files/test_case_list_template.xml b/ci-scripts/xml_files/test_case_list_template.xml
index bc06dc75ce9a4a92b5496b5b50d20777360b46b3..25519dcd039f9a9ab1d479e83769a1d834e4acb9 100644
--- a/ci-scripts/xml_files/test_case_list_template.xml
+++ b/ci-scripts/xml_files/test_case_list_template.xml
@@ -29,13 +29,13 @@
 	<testCase id="010101">
 		<class>Build_eNB</class>
 		<desc>Build eNB (USRP)</desc>
-		<Build_eNB_args>-w USRP -x -c --eNB</Build_eNB_args>
+		<Build_eNB_args>-w USRP -c --eNB</Build_eNB_args>
 	</testCase>
 
 	<testCase id="010102">
 		<class>Build_eNB</class>
 		<desc>Build eNB (USRP)</desc>
-		<Build_eNB_args>-w BLADERF -x -c --eNB</Build_eNB_args>
+		<Build_eNB_args>-w BLADERF -c --eNB</Build_eNB_args>
 	</testCase>
 
 	<testCase id="030101">
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 4c33eee8e4fb545700cb73467d4e9442a3691e47..fdb36a8e1da2d71a7298288d661d1016e0010d70 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -1890,9 +1890,13 @@ 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
+  COMMAND $(MAKE) clean
+  COMMAND $(MAKE)
+  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
+          ${OPENAIR_DIR}/common/utils/LOG/vcd_signal_dumper.h
   )
 
 #This rule is specifically needed to generate T files
@@ -2197,7 +2201,8 @@ if (${T_TRACER})
         oai_eth_transpro
         FLPT_MSG ASYNC_IF FLEXRAN_AGENT HASHTABLE MSC UTIL OMG_SUMO SECU_OSA
         SECU_CN SCHED_LIB PHY L2 default_sched remote_sched RAL CN_UTILS
-        GTPV1U SCTP_CLIENT UDP LIB_NAS_UE LFDS LFDS7 SIMU OPENAIR0_LIB PHY_MEX)
+        GTPV1U SCTP_CLIENT UDP LIB_NAS_UE LFDS LFDS7 SIMU OPENAIR0_LIB PHY_MEX
+        coding)
     if (TARGET ${i})
       add_dependencies(${i} generate_T)
     endif()
@@ -2240,7 +2245,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) -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/tools/build_helper b/cmake_targets/tools/build_helper
index 5ddce2340bebafaeb8894aae33ca7714fd36f7a0..3363bd2e7658feef8f91ec18b80f738b43cc440b 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -683,7 +683,7 @@ install_asn1c_from_source(){
     # better to use a given commit than a branch in case the branch
     # is updated and requires modifications in the source of OAI
     #git checkout velichkov_s1ap_plus_option_group
-    git checkout ec830d70bbb014b769810355a2f321a91ccd8a58
+    git checkout 73d6b23dcec9ab36605b4af884143824392134c1
     autoreconf -iv
     ./configure
     make -j`nproc`
diff --git a/common/utils/LOG/vcd_signal_dumper.h b/common/utils/LOG/vcd_signal_dumper.h
index 3c722ac49aa1335b18497e360e142b46040f4f9c..749978bb48da6a0cae665968d04db65b97800925 100644
--- a/common/utils/LOG/vcd_signal_dumper.h
+++ b/common/utils/LOG/vcd_signal_dumper.h
@@ -39,7 +39,7 @@
 
 /* WARNING: if you edit the enums below, update also string definitions in vcd_signal_dumper.c */
 typedef enum {
-  VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB = 0,
+  VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB=0,
   VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX1_ENB,
   VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_ENB,
   VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX1_ENB,
@@ -91,12 +91,12 @@ typedef enum {
   VCD_SIGNAL_DUMPER_VARIABLES_TX_SEQ_NUM,
   VCD_SIGNAL_DUMPER_VARIABLES_CNT,
   VCD_SIGNAL_DUMPER_VARIABLES_DUMMY_DUMP,
-  VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG,
-  VCD_SIGNAL_DUMPER_VARIABLE_ITTI_POLL_MSG,
-  VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG,
-  VCD_SIGNAL_DUMPER_VARIABLE_ITTI_ALLOC_MSG,
-  VCD_SIGNAL_DUMPER_VARIABLE_MP_ALLOC,
-  VCD_SIGNAL_DUMPER_VARIABLE_MP_FREE,
+  VCD_SIGNAL_DUMPER_VARIABLES_ITTI_SEND_MSG,
+  VCD_SIGNAL_DUMPER_VARIABLES_ITTI_POLL_MSG,
+  VCD_SIGNAL_DUMPER_VARIABLES_ITTI_RECV_MSG,
+  VCD_SIGNAL_DUMPER_VARIABLES_ITTI_ALLOC_MSG,
+  VCD_SIGNAL_DUMPER_VARIABLES_MP_ALLOC,
+  VCD_SIGNAL_DUMPER_VARIABLES_MP_FREE,
   VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX,
   VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX,
   VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,
diff --git a/common/utils/T/.gitignore b/common/utils/T/.gitignore
index 817780592428b38fd48b57f26be6b3a73868ae63..d754ff7c38730801afa6f6629ef45b9c9d4dcc03 100644
--- a/common/utils/T/.gitignore
+++ b/common/utils/T/.gitignore
@@ -15,4 +15,5 @@ tracer/to_vcd
 tracer/extract_input_subframe
 tracer/extract_output_subframe
 tracer/extract
+tracer/multi
 tracee/tracee
diff --git a/common/utils/T/Makefile b/common/utils/T/Makefile
index 5e1785ea91695ae36e08acab486c14c6b6b79e83..87a6e34c5d1e0ecd4636439d9eccf8aeacd26d38 100644
--- a/common/utils/T/Makefile
+++ b/common/utils/T/Makefile
@@ -18,6 +18,15 @@ T_messages.txt.h: T_messages.txt
 T_IDs.h: $(GENIDS) T_messages.txt
 	./$(GENIDS) T_messages.txt T_IDs.h
 
+check_vcd:
+	gcc -Wall -I. -I.. -I../itti -Itracer -o _check_vcd check_vcd.c tracer/database.c tracer/utils.c -lm -pthread
+	./_check_vcd || (rm -f ./_check_vcd ./T_IDs.h ./T_messages.txt.h && false)
+	rm -f ./_check_vcd
+
+.PHONY: check_vcd
+
 clean:
-	rm -f *.o $(GENIDS) core T_IDs.h T_messages.txt.h
-	cd tracer && make clean
+	rm -f *.o $(GENIDS) core T_IDs.h T_messages.txt.h _check_vcd
+
+cleanall: clean
+	cd tracer && $(MAKE) clean
diff --git a/common/utils/T/T.c b/common/utils/T/T.c
index 8679a4185fdf2905b2850ce7115641827aef05a9..fbd3f75a0c195fbb9d41e927fe6b3bf13150ee41 100644
--- a/common/utils/T/T.c
+++ b/common/utils/T/T.c
@@ -31,6 +31,12 @@ volatile int _T_freelist_head;
 volatile int *T_freelist_head = &_T_freelist_head;
 T_cache_t *T_cache;
 
+#if BASIC_SIMULATOR
+/* global variables used by T_GET_SLOT, see in T.h */
+volatile uint64_t T_next_id;
+volatile uint64_t T_active_id;
+#endif
+
 static void get_message(int s)
 {
   char t;
@@ -91,7 +97,7 @@ static void new_thread(void *(*f)(void *), void *data)
 
 /* defined in local_tracer.c */
 void T_local_tracer_main(int remote_port, int wait_for_tracer,
-    int local_socket, char *shm_file);
+    int local_socket, void *shm_array);
 
 /* We monitor the tracee and the local tracer processes.
  * When one dies we forcefully kill the other.
@@ -114,22 +120,31 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork)
 {
   int socket_pair[2];
   int s;
-  int T_shm_fd;
   int child1, child2;
-  char shm_file[128];
-
-  sprintf(shm_file, "/%s%d", T_SHM_FILENAME, getpid());
+  int i;
 
   if (socketpair(AF_UNIX, SOCK_STREAM, 0, socket_pair))
     { perror("socketpair"); abort(); }
 
+  /* setup shared memory */
+  T_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t),
+                 PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
+  if (T_cache == MAP_FAILED)
+    { perror("mmap"); abort(); }
+
+  /* let's garbage the memory to catch some potential problems
+   * (think multiprocessor sync issues, barriers, etc.)
+   */
+  memset(T_cache, 0x55, T_CACHE_SIZE * sizeof(T_cache_t));
+  for (i = 0; i < T_CACHE_SIZE; i++) T_cache[i].busy = 0;
+
   /* child1 runs the local tracer and child2 (or main) runs the tracee */
 
   child1 = fork(); if (child1 == -1) abort();
   if (child1 == 0) {
     close(socket_pair[1]);
     T_local_tracer_main(remote_port, wait_for_tracer, socket_pair[0],
-                        shm_file);
+                        T_cache);
     exit(0);
   }
   close(socket_pair[0]);
@@ -138,6 +153,7 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork)
     child2 = fork(); if (child2 == -1) abort();
     if (child2 != 0) {
       close(socket_pair[1]);
+      munmap(T_cache, T_CACHE_SIZE * sizeof(T_cache_t));
       monitor_and_kill(child1, child2);
     }
   }
@@ -148,34 +164,29 @@ void T_init(int remote_port, int wait_for_tracer, int dont_fork)
 
   T_socket = s;
 
-  /* setup shared memory */
-  T_shm_fd = shm_open(shm_file, O_RDWR /*| O_SYNC*/, 0666);
-  shm_unlink(shm_file);
-  if (T_shm_fd == -1) { perror(shm_file); abort(); }
-  T_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t),
-                 PROT_READ | PROT_WRITE, MAP_SHARED, T_shm_fd, 0);
-  if (T_cache == MAP_FAILED)
-    { perror(shm_file); abort(); }
-  close(T_shm_fd);
-
   new_thread(T_receive_thread, NULL);
 }
 
 void T_Config_Init(void)
 {
-int T_port;            /* by default we wait for the tracer */
-int T_nowait;	      /* default port to listen to to wait for the tracer */
-int T_dont_fork;       /* default is to fork, see 'T_init' to understand */
+  int T_port;         /* by default we wait for the tracer */
+  int T_nowait;       /* default port to listen to to wait for the tracer */
+  int T_dont_fork;    /* default is to fork, see 'T_init' to understand */
 
-paramdef_t ttraceparams[] = CMDLINE_TTRACEPARAMS_DESC ;
+  paramdef_t ttraceparams[] = CMDLINE_TTRACEPARAMS_DESC;
 
-/* for a cleaner config file, TTracer params should be defined in a specific section... */
-  config_get( ttraceparams,sizeof(ttraceparams)/sizeof(paramdef_t),TTRACER_CONFIG_PREFIX);
+  /* for a cleaner config file, TTracer params should be defined in a
+   * specific section...
+   */
+  config_get(ttraceparams,
+             sizeof(ttraceparams) / sizeof(paramdef_t),
+             TTRACER_CONFIG_PREFIX);
 
-/* compatibility: look for TTracer command line options in root section */
-  config_process_cmdline( ttraceparams,sizeof(ttraceparams)/sizeof(paramdef_t),NULL);
+  /* compatibility: look for TTracer command line options in root section */
+  config_process_cmdline(ttraceparams,
+                         sizeof(ttraceparams) / sizeof(paramdef_t),
+                         NULL);
 
-  if (T_stdout == 0) {
+  if (T_stdout == 0)
     T_init(T_port, 1-T_nowait, T_dont_fork);
-  }
 }
diff --git a/common/utils/T/T.h b/common/utils/T/T.h
index 755f5d4e3981fa0424a3a89436e343c6b7c83adc..18e4a590d9444d12257d5207b4e00446d2811f6b 100644
--- a/common/utils/T/T.h
+++ b/common/utils/T/T.h
@@ -112,13 +112,37 @@ extern volatile int *T_freelist_head;
 extern T_cache_t *T_cache;
 extern int *T_active;
 /* When running the basic simulator, we may fill the T cache too fast.
- * Let's not crash if it's full, just wait.
+ * Let's serialize write accesses to the T cache. For that, we use a
+ * 'ticket' mechanism. To acquire a T slot the caller needs to own the
+ * current active ticket. We also wait for the slot to be free if
+ * it is already in use.
  */
 #if BASIC_SIMULATOR
-#  define T_BASIC_SIMULATOR_WAIT \
-     while (T_cache[T_LOCAL_slot].busy) usleep(100)
+#  define T_GET_SLOT \
+     do { \
+       extern volatile uint64_t T_next_id; \
+       extern volatile uint64_t T_active_id; \
+       uint64_t id; \
+       /* get a ticket */ \
+       id = __sync_fetch_and_add(&T_next_id, 1); \
+       /* wait for our turn */ \
+       while (id != __sync_fetch_and_add(&T_active_id, 0)) /* busy wait */; \
+       /* this is our turn, try to acquire the slot until it's free */ \
+       do { \
+         T_LOCAL_busy = __sync_fetch_and_or(&T_cache[T_LOCAL_slot].busy, 0x01); \
+         if (T_LOCAL_busy & 0x01) usleep(100); \
+       } while (T_LOCAL_busy & 0x01); \
+       /* check that there are still some tickets */ \
+       if (__sync_fetch_and_add(&T_active_id, 0) == 0xffffffffffffffff) { \
+         printf("T: reached the end of times, bye...\n"); \
+         abort(); \
+       } \
+       /* free our ticket, which signals the next waiter that it's its turn */ \
+       (void)__sync_fetch_and_add(&T_active_id, 1); \
+     } while (0)
 #else
-#  define T_BASIC_SIMULATOR_WAIT /* */
+#  define T_GET_SLOT \
+     T_LOCAL_busy = __sync_fetch_and_or(&T_cache[T_LOCAL_slot].busy, 0x01);
 #endif
 
 /* used at header of Tn, allocates buffer */
@@ -126,11 +150,12 @@ extern int *T_active;
   char *T_LOCAL_buf; \
   int T_LOCAL_size = 0; \
   int T_LOCAL_slot; \
+  int T_LOCAL_busy; \
   T_LOCAL_slot = __sync_fetch_and_add(T_freelist_head, 1) \
                  & (T_CACHE_SIZE - 1); \
   (void)__sync_fetch_and_and(T_freelist_head, T_CACHE_SIZE - 1); \
-  T_BASIC_SIMULATOR_WAIT; \
-  if (T_cache[T_LOCAL_slot].busy) { \
+  T_GET_SLOT; \
+  if (T_LOCAL_busy & 0x01) { \
     printf("%s:%d:%s: T cache is full - consider increasing its size\n", \
            __FILE__, __LINE__, __FUNCTION__); \
     abort(); \
@@ -142,7 +167,7 @@ extern int *T_active;
 #define T_COMMIT() \
   T_cache[T_LOCAL_slot].length = T_LOCAL_size; \
   __sync_synchronize(); \
-  T_cache[T_LOCAL_slot].busy = 1; \
+  (void)__sync_fetch_and_or(&T_cache[T_LOCAL_slot].busy, 0x02);
 
 #define T_CHECK_SIZE(len, argnum) \
   if (T_LOCAL_size + (len) > T_BUFFER_MAX) { \
@@ -578,10 +603,10 @@ extern int *T_active;
 /*   optname                     helpstr                paramflags           XXXptr           defXXXval         type       numelt           */
 /*------------------------------------------------------------------------------------------------------------------------------------------*/
 #define CMDLINE_TTRACEPARAMS_DESC {  \
-{"T_port",                     CONFIG_HLP_TPORT,      0,		iptr:&T_port,	     defintval:2021,	TYPE_INT,   0},	   \
-{"T_nowait",                   CONFIG_HLP_NOTWAIT,    PARAMFLAG_BOOL,	iptr:&T_nowait,      defintval:0,	TYPE_INT,   0},	   \
-{"T_dont_fork",                CONFIG_HLP_TNOFORK,    PARAMFLAG_BOOL,	iptr:&T_dont_fork,   defintval:0,	TYPE_INT,   0},	   \
-{"T_stdout",                   CONFIG_HLP_STDOUT,     PARAMFLAG_BOOL,	iptr:&T_stdout,      defintval:1,	TYPE_INT,   0},	   \
+{"T_port",                     CONFIG_HLP_TPORT,      0,                iptr:&T_port,        defintval:2021,     TYPE_INT,   0},           \
+{"T_nowait",                   CONFIG_HLP_NOTWAIT,    PARAMFLAG_BOOL,   iptr:&T_nowait,      defintval:0,        TYPE_INT,   0},           \
+{"T_dont_fork",                CONFIG_HLP_TNOFORK,    PARAMFLAG_BOOL,   iptr:&T_dont_fork,   defintval:0,        TYPE_INT,   0},           \
+{"T_stdout",                   CONFIG_HLP_STDOUT,     PARAMFLAG_BOOL,   iptr:&T_stdout,      defintval:1,        TYPE_INT,   0},           \
 } 
 
 
diff --git a/common/utils/T/T_defs.h b/common/utils/T/T_defs.h
index b0b9940c30b669832edfe1a817d1f56ebec3a096..83a380662d025fcc8056375667d0d1f0f752998d 100644
--- a/common/utils/T/T_defs.h
+++ b/common/utils/T/T_defs.h
@@ -31,13 +31,15 @@
 #endif
 
 typedef struct {
+  /* 'busy' is a bit field
+   * bit 0: 1 means that slot is acquired by writer
+   * bit 1: 1 means that slot is ready for consumption
+   */
   volatile int busy;
   char buffer[T_BUFFER_MAX];
   int length;
 } T_cache_t;
 
-#define T_SHM_FILENAME "/T_shm_segment"
-
 /* number of VCD functions (to be kept up to date! see in T_messages.txt) */
 #define VCD_NUM_FUNCTIONS 190
 
diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt
index fd4425063b66a9d60f411e4a10560b5825caedce..676f329a0eb08fc4c2fb8e4efb2c69345e671f0e 100644
--- a/common/utils/T/T_messages.txt
+++ b/common/utils/T/T_messages.txt
@@ -749,6 +749,7 @@ ID = LEGACY_OSA_TRACE
     DESC = OSA legacy logs - trace level
     GROUP = ALL:LEGACY_OSA:LEGACY_GROUP_TRACE:LEGACY
     FORMAT = string,log
+
 ID = LEGACY_SIM_INFO
     DESC = SIM legacy logs - info level
     GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_INFO:LEGACY
@@ -769,6 +770,7 @@ ID = LEGACY_SIM_TRACE
     DESC = SIM legacy logs - trace level
     GROUP = ALL:LEGACY_SIM:LEGACY_GROUP_TRACE:LEGACY
     FORMAT = string,log
+
 # this is a bad hack but I won't fix (function util_print_hex_octets
 # in openairinterface5g/openair2/LAYER2/PDCP_v10.1.0/pdcp_util.c
 # does funky things with the LOG_x macros but we work on the C pre-processor
@@ -922,30 +924,9 @@ ID = buf_test
 #VCD variables and functions
 
 #be careful! this must be synchronized with the code!
-#also keep up to date VCD_NUM_VARIABLES and VCD_NUM_FUNCTIONS in T_defs.h
-
-#to synchronize: copy/paste from openair2/UTIL/LOG/vcd_signal_dumper.h
-#the variables and functions name, replace "SIGNAL_DUMPER_VARIABLES" by
-#"VARIABLE" and "SIGNAL_DUMPER_FUNCTIONS" by "FUNCTION" (check that
-#everything is fine! for example we have
-#VCD_SIGNAL_DUMPER_VARIABLE_ITTI_SEND_MSG that has VARIABLE without S)
-#and then process with sed
-
-#to generate variables:
-#sed -e "s/  VCD_VARIABLE_\(.*\)/ID = VCD_VARIABLE_\1\n    DESC = VCD variable \1\n    GROUP = ALL:VCD:ENB\n    FORMAT = ulong,value/" < VCD >> T_messages.txt
-
-#to generate functions:
-#sed -e "s/  VCD_FUNCTION_\(.*\)/ID = VCD_FUNCTION_\1\n    DESC = VCD function \1\n    GROUP = ALL:VCD:ENB\n    FORMAT = int,value/" < VCD.functions >> T_messages.txt
-
-#you may want to manually edit groups for UE instead of eNB
-
-#then count functions and variables and update VCD_NUM_FUNCTIONS and
-#VCD_NUM_VARIABLES in T_defs.h
-
-#also verify that VCD_FIRST_FUNCTION and VCD_FIRST_VARIABLE are correct
-#in T_defs.h. They have to point to the first function and variable
-#as defined below. Note also that the order of the VCD functions
-#and variables must be the same as in the code.
+#also keep up to date VCD_NUM_VARIABLES, VCD_NUM_FUNCTIONS,
+#VCD_FIRST_FUNCTION and VCD_FIRST_VARIABLE in T_defs.h
+#to check that everything is correct you can run: make _check_vcd
 
 #variables
 
@@ -953,514 +934,642 @@ ID = VCD_VARIABLE_FRAME_NUMBER_TX0_ENB
     DESC = VCD variable FRAME_NUMBER_TX0_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_TX0_eNB
 ID = VCD_VARIABLE_FRAME_NUMBER_TX1_ENB
     DESC = VCD variable FRAME_NUMBER_TX1_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_TX1_eNB
 ID = VCD_VARIABLE_FRAME_NUMBER_RX0_ENB
     DESC = VCD variable FRAME_NUMBER_RX0_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_RX0_eNB
 ID = VCD_VARIABLE_FRAME_NUMBER_RX1_ENB
     DESC = VCD variable FRAME_NUMBER_RX1_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_RX1_eNB
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_ENB
     DESC = VCD variable SUBFRAME_NUMBER_TX0_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_TX0_eNB
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_ENB
     DESC = VCD variable SUBFRAME_NUMBER_TX1_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_TX1_eNB
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_ENB
     DESC = VCD variable SUBFRAME_NUMBER_RX0_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_RX0_eNB
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_ENB
     DESC = VCD variable SUBFRAME_NUMBER_RX1_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_RX1_eNB
 ID = VCD_VARIABLE_FRAME_NUMBER_TX0_RU
     DESC = VCD variable FRAME_NUMBER_TX0_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_TX0_RU
 ID = VCD_VARIABLE_FRAME_NUMBER_TX1_RU
     DESC = VCD variable FRAME_NUMBER_TX1_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_TX1_RU
 ID = VCD_VARIABLE_FRAME_NUMBER_RX0_RU
     DESC = VCD variable FRAME_NUMBER_RX0_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_RX0_RU
 ID = VCD_VARIABLE_FRAME_NUMBER_RX1_RU
     DESC = VCD variable FRAME_NUMBER_RX1_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_RX1_RU
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_RU
     DESC = VCD variable SUBFRAME_NUMBER_TX0_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_TX0_RU
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_RU
     DESC = VCD variable SUBFRAME_NUMBER_TX1_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_TX1_RU
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_RU
     DESC = VCD variable SUBFRAME_NUMBER_RX0_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_RX0_RU
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_RU
     DESC = VCD variable SUBFRAME_NUMBER_RX1_RU
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_number_RX1_RU
 ID = VCD_VARIABLE_RUNTIME_TX_ENB
     DESC = VCD variable RUNTIME_TX_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = runtime_TX_eNB
 ID = VCD_VARIABLE_RUNTIME_RX_ENB
     DESC = VCD variable RUNTIME_RX_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = runtime_RX_eNB
 ID = VCD_VARIABLE_FRAME_NUMBER_TX0_UE
     DESC = VCD variable FRAME_NUMBER_TX0_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_TX0_UE
 ID = VCD_VARIABLE_FRAME_NUMBER_TX1_UE
     DESC = VCD variable FRAME_NUMBER_TX1_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_TX1_UE
 ID = VCD_VARIABLE_FRAME_NUMBER_RX0_UE
     DESC = VCD variable FRAME_NUMBER_RX0_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_RX0_UE
 ID = VCD_VARIABLE_FRAME_NUMBER_RX1_UE
     DESC = VCD variable FRAME_NUMBER_RX1_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = frame_number_RX1_UE
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_UE
     DESC = VCD variable SUBFRAME_NUMBER_TX0_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_TX0_UE
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_UE
     DESC = VCD variable SUBFRAME_NUMBER_TX1_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_TX1_UE
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_UE
     DESC = VCD variable SUBFRAME_NUMBER_RX0_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_RX0_UE
 ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_UE
     DESC = VCD variable SUBFRAME_NUMBER_RX1_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = subframe_RX1_UE
 ID = VCD_VARIABLE_UE_RX_OFFSET
     DESC = VCD variable UE_RX_OFFSET
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue_rx_offset
 ID = VCD_VARIABLE_DIFF
     DESC = VCD variable DIFF
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = diff2
 ID = VCD_VARIABLE_HW_SUBFRAME
     DESC = VCD variable HW_SUBFRAME
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = hw_subframe
 ID = VCD_VARIABLE_HW_FRAME
     DESC = VCD variable HW_FRAME
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = hw_frame
 ID = VCD_VARIABLE_HW_SUBFRAME_RX
     DESC = VCD variable HW_SUBFRAME_RX
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = hw_subframe_rx
 ID = VCD_VARIABLE_HW_FRAME_RX
     DESC = VCD variable HW_FRAME_RX
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = hw_frame_rx
 ID = VCD_VARIABLE_TXCNT
     DESC = VCD variable TXCNT
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = txcnt
 ID = VCD_VARIABLE_RXCNT
     DESC = VCD variable RXCNT
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = rxcnt
 ID = VCD_VARIABLE_TRX_TS
     DESC = VCD variable TRX_TS
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = trx_ts
 ID = VCD_VARIABLE_TRX_TST
     DESC = VCD variable TRX_TST
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = trx_tst
 ID = VCD_VARIABLE_TRX_TS_UE
     DESC = VCD variable TRX_TS_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = trx_ts_ue
 ID = VCD_VARIABLE_TRX_TST_UE
     DESC = VCD variable TRX_TST_UE
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = trx_tst_ue
 ID = VCD_VARIABLE_TRX_WRITE_FLAGS
     DESC = VCD variable TRX_WRITE_FLAGS
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = trx_write_flags
 ID = VCD_VARIABLE_TX_TS
     DESC = VCD variable TX_TS
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = tx_ts
 ID = VCD_VARIABLE_RX_TS
     DESC = VCD variable RX_TS
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = rx_ts
 ID = VCD_VARIABLE_RX_HWCNT
     DESC = VCD variable RX_HWCNT
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = hw_cnt_rx
 ID = VCD_VARIABLE_RX_LHWCNT
     DESC = VCD variable RX_LHWCNT
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = lhw_cnt_rx
 ID = VCD_VARIABLE_TX_HWCNT
     DESC = VCD variable TX_HWCNT
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = hw_cnt_tx
 ID = VCD_VARIABLE_TX_LHWCNT
     DESC = VCD variable TX_LHWCNT
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = lhw_cnt_tx
 ID = VCD_VARIABLE_RX_PCK
     DESC = VCD variable RX_PCK
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = pck_rx
 ID = VCD_VARIABLE_TX_PCK
     DESC = VCD variable TX_PCK
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = pck_tx
 ID = VCD_VARIABLE_RX_SEQ_NUM
     DESC = VCD variable RX_SEQ_NUM
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = rx_seq_num
 ID = VCD_VARIABLE_RX_SEQ_NUM_PRV
     DESC = VCD variable RX_SEQ_NUM_PRV
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = rx_seq_num_prv
 ID = VCD_VARIABLE_TX_SEQ_NUM
     DESC = VCD variable TX_SEQ_NUM
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = tx_seq_num
 ID = VCD_VARIABLE_CNT
     DESC = VCD variable CNT
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = cnt
 ID = VCD_VARIABLE_DUMMY_DUMP
     DESC = VCD variable DUMMY_DUMP
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = dummy_dump
 ID = VCD_VARIABLE_ITTI_SEND_MSG
     DESC = VCD variable ITTI_SEND_MSG
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = itti_send_msg
 ID = VCD_VARIABLE_ITTI_POLL_MSG
     DESC = VCD variable ITTI_POLL_MSG
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = itti_poll_msg
 ID = VCD_VARIABLE_ITTI_RECV_MSG
     DESC = VCD variable ITTI_RECV_MSG
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = itti_recv_msg
 ID = VCD_VARIABLE_ITTI_ALLOC_MSG
     DESC = VCD variable ITTI_ALLOC_MSG
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = itti_alloc_msg
 ID = VCD_VARIABLE_MP_ALLOC
     DESC = VCD variable MP_ALLOC
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = mp_alloc
 ID = VCD_VARIABLE_MP_FREE
     DESC = VCD variable MP_FREE
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = mp_free
 ID = VCD_VARIABLE_UE_INST_CNT_RX
     DESC = VCD variable UE_INST_CNT_RX
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue_inst_cnt_rx
 ID = VCD_VARIABLE_UE_INST_CNT_TX
     DESC = VCD variable UE_INST_CNT_TX
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue_inst_cnt_tx
 ID = VCD_VARIABLE_DCI_INFO
     DESC = VCD variable DCI_INFO
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = dci_info
 ID = VCD_VARIABLE_UE0_BSR
     DESC = VCD variable UE0_BSR
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_BSR
 ID = VCD_VARIABLE_UE0_BO
     DESC = VCD variable UE0_BO
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_BO
 ID = VCD_VARIABLE_UE0_SCHEDULED
     DESC = VCD variable UE0_SCHEDULED
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_scheduled
 ID = VCD_VARIABLE_UE0_TIMING_ADVANCE
     DESC = VCD variable UE0_TIMING_ADVANCE
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_timing_advance
 ID = VCD_VARIABLE_UE0_SR_ENERGY
     DESC = VCD variable UE0_SR_ENERGY
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SR_ENERGY
 ID = VCD_VARIABLE_UE0_SR_THRES
     DESC = VCD variable UE0_SR_THRES
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SR_THRES
 ID = VCD_VARIABLE_UE0_RSSI0
     DESC = VCD variable UE0_RSSI0
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi0
 ID = VCD_VARIABLE_UE0_RSSI1
     DESC = VCD variable UE0_RSSI1
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi1
 ID = VCD_VARIABLE_UE0_RSSI2
     DESC = VCD variable UE0_RSSI2
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi2
 ID = VCD_VARIABLE_UE0_RSSI3
     DESC = VCD variable UE0_RSSI3
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi3
 ID = VCD_VARIABLE_UE0_RSSI4
     DESC = VCD variable UE0_RSSI4
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi4
 ID = VCD_VARIABLE_UE0_RSSI5
     DESC = VCD variable UE0_RSSI5
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi5
 ID = VCD_VARIABLE_UE0_RSSI6
     DESC = VCD variable UE0_RSSI6
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi6
 ID = VCD_VARIABLE_UE0_RSSI7
     DESC = VCD variable UE0_RSSI7
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_rssi7
 ID = VCD_VARIABLE_UE0_RES0
     DESC = VCD variable UE0_RES0
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res0
 ID = VCD_VARIABLE_UE0_RES1
     DESC = VCD variable UE0_RES1
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res1
 ID = VCD_VARIABLE_UE0_RES2
     DESC = VCD variable UE0_RES2
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res2
 ID = VCD_VARIABLE_UE0_RES3
     DESC = VCD variable UE0_RES3
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res3
 ID = VCD_VARIABLE_UE0_RES4
     DESC = VCD variable UE0_RES4
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res4
 ID = VCD_VARIABLE_UE0_RES5
     DESC = VCD variable UE0_RES5
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res5
 ID = VCD_VARIABLE_UE0_RES6
     DESC = VCD variable UE0_RES6
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res6
 ID = VCD_VARIABLE_UE0_RES7
     DESC = VCD variable UE0_RES7
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_res7
 ID = VCD_VARIABLE_UE0_MCS0
     DESC = VCD variable UE0_MCS0
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS0
 ID = VCD_VARIABLE_UE0_MCS1
     DESC = VCD variable UE0_MCS1
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS1
 ID = VCD_VARIABLE_UE0_MCS2
     DESC = VCD variable UE0_MCS2
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS2
 ID = VCD_VARIABLE_UE0_MCS3
     DESC = VCD variable UE0_MCS3
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS3
 ID = VCD_VARIABLE_UE0_MCS4
     DESC = VCD variable UE0_MCS4
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS4
 ID = VCD_VARIABLE_UE0_MCS5
     DESC = VCD variable UE0_MCS5
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS5
 ID = VCD_VARIABLE_UE0_MCS6
     DESC = VCD variable UE0_MCS6
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS6
 ID = VCD_VARIABLE_UE0_MCS7
     DESC = VCD variable UE0_MCS7
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_MCS7
 ID = VCD_VARIABLE_UE0_RB0
     DESC = VCD variable UE0_RB0
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB0
 ID = VCD_VARIABLE_UE0_RB1
     DESC = VCD variable UE0_RB1
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB1
 ID = VCD_VARIABLE_UE0_RB2
     DESC = VCD variable UE0_RB2
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB2
 ID = VCD_VARIABLE_UE0_RB3
     DESC = VCD variable UE0_RB3
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB3
 ID = VCD_VARIABLE_UE0_RB4
     DESC = VCD variable UE0_RB4
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB4
 ID = VCD_VARIABLE_UE0_RB5
     DESC = VCD variable UE0_RB5
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB5
 ID = VCD_VARIABLE_UE0_RB6
     DESC = VCD variable UE0_RB6
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB6
 ID = VCD_VARIABLE_UE0_RB7
     DESC = VCD variable UE0_RB7
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_RB7
 ID = VCD_VARIABLE_UE0_ROUND0
     DESC = VCD variable UE0_ROUND0
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND0
 ID = VCD_VARIABLE_UE0_ROUND1
     DESC = VCD variable UE0_ROUND1
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND1
 ID = VCD_VARIABLE_UE0_ROUND2
     DESC = VCD variable UE0_ROUND2
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND2
 ID = VCD_VARIABLE_UE0_ROUND3
     DESC = VCD variable UE0_ROUND3
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND3
 ID = VCD_VARIABLE_UE0_ROUND4
     DESC = VCD variable UE0_ROUND4
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND4
 ID = VCD_VARIABLE_UE0_ROUND5
     DESC = VCD variable UE0_ROUND5
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND5
 ID = VCD_VARIABLE_UE0_ROUND6
     DESC = VCD variable UE0_ROUND6
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND6
 ID = VCD_VARIABLE_UE0_ROUND7
     DESC = VCD variable UE0_ROUND7
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_ROUND7
 ID = VCD_VARIABLE_UE0_SFN0
     DESC = VCD variable UE0_SFN0
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN0
 ID = VCD_VARIABLE_UE0_SFN1
     DESC = VCD variable UE0_SFN1
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN1
 ID = VCD_VARIABLE_UE0_SFN2
     DESC = VCD variable UE0_SFN2
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN2
 ID = VCD_VARIABLE_UE0_SFN3
     DESC = VCD variable UE0_SFN3
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN3
 ID = VCD_VARIABLE_UE0_SFN4
     DESC = VCD variable UE0_SFN4
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN4
 ID = VCD_VARIABLE_UE0_SFN5
     DESC = VCD variable UE0_SFN5
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN5
 ID = VCD_VARIABLE_UE0_SFN6
     DESC = VCD variable UE0_SFN6
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN6
 ID = VCD_VARIABLE_UE0_SFN7
     DESC = VCD variable UE0_SFN7
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_SFN7
 ID = VCD_VARIABLE_SEND_IF4_SYMBOL
     DESC = VCD variable SEND_IF4_SYMBOL
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = send_if4_symbol
 ID = VCD_VARIABLE_RECV_IF4_SYMBOL
     DESC = VCD variable RECV_IF4_SYMBOL
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = recv_if4_symbol
 ID = VCD_VARIABLE_SEND_IF5_PKT_ID
     DESC = VCD variable SEND_IF5_PKT_ID
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = send_if5_pkt_id
 ID = VCD_VARIABLE_RECV_IF5_PKT_ID
     DESC = VCD variable RECV_IF5_PKT_ID
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = recv_if5_pkt_id
 ID = VCD_VARIABLE_UE_PDCP_FLUSH_SIZE
     DESC = VCD variable UE_PDCP_FLUSH_SIZE
     GROUP = ALL:VCD:ENB:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue_pdcp_flush_size
 ID = VCD_VARIABLE_UE_PDCP_FLUSH_ERR
     DESC = VCD variable UE_PDCP_FLUSH_ERR
     GROUP = ALL:VCD:ENB:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue_pdcp_flush_err
 ID = VCD_VARIABLE_UE0_TRX_READ_NS
     DESC = VCD variable UE0_TRX_READ_NS
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_trx_read_ns
 ID = VCD_VARIABLE_UE0_TRX_WRITE_NS
     DESC = VCD variable UE0_TRX_WRITE_NS
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_trx_write_ns
 ID = VCD_VARIABLE_UE0_TRX_READ_NS_MISSING
     DESC = VCD variable UE0_TRX_READ_NS_MISSING
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_trx_read_ns_missing
 ID = VCD_VARIABLE_UE0_TRX_WRITE_NS_MISSING
     DESC = VCD variable UE0_TRX_WRITE_NS_MISSING
     GROUP = ALL:VCD:UE:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ue0_trx_write_ns_missing
 ID = VCD_VARIABLE_CPUID_ENB_THREAD_RXTX
     DESC = VCD variable CPUID_ENB_THREAD_RXTX
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = enb_thread_rxtx_CPUID
 ID = VCD_VARIABLE_CPUID_RU_THREAD
     DESC = VCD variable CPUID_RU_THREAD
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ru_thread_CPUID
 ID = VCD_VARIABLE_CPUID_RU_THREAD_TX
     DESC = VCD variable CPUID_RU_THREAD_TX
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+    VCD_NAME = ru_thread_tx_CPUID
 
 #functions
 
@@ -1468,763 +1577,954 @@ ID = VCD_FUNCTION_RT_SLEEP
     DESC = VCD function RT_SLEEP
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rt_sleep
 ID = VCD_FUNCTION_TRX_READ
     DESC = VCD function TRX_READ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_read
 ID = VCD_FUNCTION_TRX_WRITE
     DESC = VCD function TRX_WRITE
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_write
 ID = VCD_FUNCTION_TRX_READ_UE
     DESC = VCD function TRX_READ_UE
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_read_ue
 ID = VCD_FUNCTION_TRX_WRITE_UE
     DESC = VCD function TRX_WRITE_UE
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_write_ue
 ID = VCD_FUNCTION_TRX_READ_IF
     DESC = VCD function TRX_READ_IF
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_read_if
 ID = VCD_FUNCTION_TRX_WRITE_IF
     DESC = VCD function TRX_WRITE_IF
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_write_if
 ID = VCD_FUNCTION_eNB_PROC_RXTX0
     DESC = VCD function eNB_PROC_RXTX0
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_thread_rxtx0
 ID = VCD_FUNCTION_eNB_PROC_RXTX1
     DESC = VCD function eNB_PROC_RXTX1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_thread_rxtx1
 ID = VCD_FUNCTION_UE_THREAD_SYNCH
     DESC = VCD function UE_THREAD_SYNCH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_thread_synch
 ID = VCD_FUNCTION_UE_THREAD_RXTX0
     DESC = VCD function UE_THREAD_RXTX0
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_thread_rxtx0
 ID = VCD_FUNCTION_UE_THREAD_RXTX1
     DESC = VCD function UE_THREAD_RXTX1
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_thread_rxtx1
 ID = VCD_FUNCTION_TRX_READ_SF9
     DESC = VCD function TRX_READ_SF9
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_read_sf9
 ID = VCD_FUNCTION_TRX_WRITE_SF9
     DESC = VCD function TRX_WRITE_SF9
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_write_sf9
 ID = VCD_FUNCTION_UE_SIGNAL_COND_RXTX0
     DESC = VCD function UE_SIGNAL_COND_RXTX0
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_signal_cond_rxtx0
 ID = VCD_FUNCTION_UE_SIGNAL_COND_RXTX1
     DESC = VCD function UE_SIGNAL_COND_RXTX1
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_signal_cond_rxtx1
 ID = VCD_FUNCTION_UE_WAIT_COND_RXTX0
     DESC = VCD function UE_WAIT_COND_RXTX0
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_wait_cond_rxtx0
 ID = VCD_FUNCTION_UE_WAIT_COND_RXTX1
     DESC = VCD function UE_WAIT_COND_RXTX1
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_wait_cond_rxtx1
 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0
     DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_lock_mutex_rxtx_for_cond_wait0
 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1
     DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT1
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_lock_mutex_rxtx_for_cond_wait1
 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0
     DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_lock_mutex_rxtx_for_cnt_decrement0
 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1
     DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT1
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_lock_mutex_rxtx_for_cnt_decrement1
 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0
     DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_lock_mutex_rxtx_for_cnt_increment0
 ID = VCD_FUNCTION_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1
     DESC = VCD function UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT1
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_lock_mutex_rxtx_for_cnt_increment1
 ID = VCD_FUNCTION_SIM_DO_DL_SIGNAL
     DESC = VCD function SIM_DO_DL_SIGNAL
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = do_DL_sig
 ID = VCD_FUNCTION_SIM_DO_UL_SIGNAL
     DESC = VCD function SIM_DO_UL_SIGNAL
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = do_UL_sig
 ID = VCD_FUNCTION_SIM_UE_TRX_READ
     DESC = VCD function SIM_UE_TRX_READ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = UE_trx_read
 ID = VCD_FUNCTION_eNB_TX
     DESC = VCD function eNB_TX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_tx
 ID = VCD_FUNCTION_eNB_RX
     DESC = VCD function eNB_RX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_rx
 ID = VCD_FUNCTION_eNB_TRX
     DESC = VCD function eNB_TRX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_trx
 ID = VCD_FUNCTION_eNB_TM
     DESC = VCD function eNB_TM
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_tm
 ID = VCD_FUNCTION_eNB_RX_SLEEP
     DESC = VCD function eNB_RX_SLEEP
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_rx_sleep
 ID = VCD_FUNCTION_eNB_TX_SLEEP
     DESC = VCD function eNB_TX_SLEEP
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_tx_sleep
 ID = VCD_FUNCTION_eNB_PROC_SLEEP
     DESC = VCD function eNB_PROC_SLEEP
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = eNB_proc_sleep
 ID = VCD_FUNCTION_TRX_READ_RF
     DESC = VCD function TRX_READ_RF
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_read_rf
 ID = VCD_FUNCTION_TRX_WRITE_RF
     DESC = VCD function TRX_WRITE_RF
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = trx_write_rf
 ID = VCD_FUNCTION_UE_SYNCH
     DESC = VCD function UE_SYNCH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_synch
 ID = VCD_FUNCTION_UE_SLOT_FEP
     DESC = VCD function UE_SLOT_FEP
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_slot_fep
 ID = VCD_FUNCTION_UE_RRC_MEASUREMENTS
     DESC = VCD function UE_RRC_MEASUREMENTS
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_rrc_measurements
 ID = VCD_FUNCTION_UE_GAIN_CONTROL
     DESC = VCD function UE_GAIN_CONTROL
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_gain_control
 ID = VCD_FUNCTION_UE_ADJUST_SYNCH
     DESC = VCD function UE_ADJUST_SYNCH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_adjust_synch
 ID = VCD_FUNCTION_UE_MEASUREMENT_PROCEDURES
     DESC = VCD function UE_MEASUREMENT_PROCEDURES
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = lte_ue_measurement_procedures
 ID = VCD_FUNCTION_UE_PDCCH_PROCEDURES
     DESC = VCD function UE_PDCCH_PROCEDURES
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = lte_ue_pdcch_procedures
 ID = VCD_FUNCTION_UE_PBCH_PROCEDURES
     DESC = VCD function UE_PBCH_PROCEDURES
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = lte_ue_pbch_procedures
 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX
     DESC = VCD function PHY_PROCEDURES_ENB_TX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_eNb_tx0
 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX1
     DESC = VCD function PHY_PROCEDURES_ENB_TX1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_eNb_tx1
 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX
     DESC = VCD function PHY_PROCEDURES_RU_FEPRX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ru_feprx0
 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX1
     DESC = VCD function PHY_PROCEDURES_RU_FEPRX1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ru_feprx1
 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM
     DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ru_feptx_ofdm0
 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM1
     DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ru_feptx_ofdm1
 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC
     DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ru_feptx_prec0
 ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC1
     DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ru_feptx_prec1
 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC
     DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_eNb_rx_uespec0
 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC1
     DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_eNb_rx_uespec1
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX
     DESC = VCD function PHY_PROCEDURES_UE_TX
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ue_tx
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_RX
     DESC = VCD function PHY_PROCEDURES_UE_RX
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ue_rx
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC
     DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_UESPEC
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ue_tx_ulsch_uespec
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PUCCH
     DESC = VCD function PHY_PROCEDURES_UE_TX_PUCCH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ue_tx_pucch
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_COMMON
     DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_COMMON
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ue_tx_ulsch_common
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_PRACH
     DESC = VCD function PHY_PROCEDURES_UE_TX_PRACH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ue_tx_prach
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX_ULSCH_RAR
     DESC = VCD function PHY_PROCEDURES_UE_TX_ULSCH_RAR
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_ue_tx_ulsch_rar
 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_LTE
     DESC = VCD function PHY_PROCEDURES_ENB_LTE
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_eNB_lte
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_LTE
     DESC = VCD function PHY_PROCEDURES_UE_LTE
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_procedures_UE_lte
 ID = VCD_FUNCTION_PDSCH_THREAD
     DESC = VCD function PDSCH_THREAD
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdsch_thread
 ID = VCD_FUNCTION_DLSCH_THREAD0
     DESC = VCD function DLSCH_THREAD0
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread0
 ID = VCD_FUNCTION_DLSCH_THREAD1
     DESC = VCD function DLSCH_THREAD1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread1
 ID = VCD_FUNCTION_DLSCH_THREAD2
     DESC = VCD function DLSCH_THREAD2
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread2
 ID = VCD_FUNCTION_DLSCH_THREAD3
     DESC = VCD function DLSCH_THREAD3
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread3
 ID = VCD_FUNCTION_DLSCH_THREAD4
     DESC = VCD function DLSCH_THREAD4
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread4
 ID = VCD_FUNCTION_DLSCH_THREAD5
     DESC = VCD function DLSCH_THREAD5
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread5
 ID = VCD_FUNCTION_DLSCH_THREAD6
     DESC = VCD function DLSCH_THREAD6
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread6
 ID = VCD_FUNCTION_DLSCH_THREAD7
     DESC = VCD function DLSCH_THREAD7
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_thread7
 ID = VCD_FUNCTION_DLSCH_DECODING0
     DESC = VCD function DLSCH_DECODING0
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding0
 ID = VCD_FUNCTION_DLSCH_DECODING1
     DESC = VCD function DLSCH_DECODING1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding1
 ID = VCD_FUNCTION_DLSCH_DECODING2
     DESC = VCD function DLSCH_DECODING2
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding2
 ID = VCD_FUNCTION_DLSCH_DECODING3
     DESC = VCD function DLSCH_DECODING3
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding3
 ID = VCD_FUNCTION_DLSCH_DECODING4
     DESC = VCD function DLSCH_DECODING4
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding4
 ID = VCD_FUNCTION_DLSCH_DECODING5
     DESC = VCD function DLSCH_DECODING5
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding5
 ID = VCD_FUNCTION_DLSCH_DECODING6
     DESC = VCD function DLSCH_DECODING6
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding6
 ID = VCD_FUNCTION_DLSCH_DECODING7
     DESC = VCD function DLSCH_DECODING7
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dlsch_decoding7
 ID = VCD_FUNCTION_RX_PDCCH
     DESC = VCD function RX_PDCCH
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rx_pdcch
 ID = VCD_FUNCTION_DCI_DECODING
     DESC = VCD function DCI_DECODING
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = dci_decoding
 ID = VCD_FUNCTION_RX_PHICH
     DESC = VCD function RX_PHICH
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rx_phich
 ID = VCD_FUNCTION_PDSCH_PROC
     DESC = VCD function PDSCH_PROC
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdsch_procedures
 ID = VCD_FUNCTION_PDSCH_PROC_SI
     DESC = VCD function PDSCH_PROC_SI
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdsch_procedures_si
 ID = VCD_FUNCTION_PDSCH_PROC_P
     DESC = VCD function PDSCH_PROC_P
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdsch_procedures_p
 ID = VCD_FUNCTION_PDSCH_PROC_RA
     DESC = VCD function PDSCH_PROC_RA
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdsch_procedures_ra
 ID = VCD_FUNCTION_PHY_UE_CONFIG_SIB2
     DESC = VCD function PHY_UE_CONFIG_SIB2
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ue_config_sib2
 ID = VCD_FUNCTION_PHY_CONFIG_SIB1_ENB
     DESC = VCD function PHY_CONFIG_SIB1_ENB
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_phy_config_sib1_eNB
 ID = VCD_FUNCTION_PHY_CONFIG_SIB2_ENB
     DESC = VCD function PHY_CONFIG_SIB2_ENB
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_phy_config_sib2_eNB
 ID = VCD_FUNCTION_PHY_CONFIG_DEDICATED_ENB
     DESC = VCD function PHY_CONFIG_DEDICATED_ENB
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_phy_config_dedicated_eNB
 ID = VCD_FUNCTION_PHY_UE_COMPUTE_PRACH
     DESC = VCD function PHY_UE_COMPUTE_PRACH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ue_compute_prach
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_MSG3
     DESC = VCD function PHY_ENB_ULSCH_MSG3
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_msg3
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING0
     DESC = VCD function PHY_ENB_ULSCH_DECODING0
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding0
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING1
     DESC = VCD function PHY_ENB_ULSCH_DECODING1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding1
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING2
     DESC = VCD function PHY_ENB_ULSCH_DECODING2
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding2
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING3
     DESC = VCD function PHY_ENB_ULSCH_DECODING3
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding3
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING4
     DESC = VCD function PHY_ENB_ULSCH_DECODING4
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding4
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING5
     DESC = VCD function PHY_ENB_ULSCH_DECODING5
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding5
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING6
     DESC = VCD function PHY_ENB_ULSCH_DECODING6
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding6
 ID = VCD_FUNCTION_PHY_ENB_ULSCH_DECODING7
     DESC = VCD function PHY_ENB_ULSCH_DECODING7
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_ulsch_decoding7
 ID = VCD_FUNCTION_PHY_ENB_SFGEN
     DESC = VCD function PHY_ENB_SFGEN
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_sfgen
 ID = VCD_FUNCTION_PHY_ENB_PRACH_RX
     DESC = VCD function PHY_ENB_PRACH_RX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_prach_rx
 ID = VCD_FUNCTION_PHY_RU_PRACH_RX
     DESC = VCD function PHY_RU_PRACH_RX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ru_prach_rx
 ID = VCD_FUNCTION_PHY_ENB_PDCCH_TX
     DESC = VCD function PHY_ENB_PDCCH_TX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_pdcch_tx
 ID = VCD_FUNCTION_PHY_ENB_RS_TX
     DESC = VCD function PHY_ENB_RS_TX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_enb_rs_tx
 ID = VCD_FUNCTION_UE_GENERATE_PRACH
     DESC = VCD function UE_GENERATE_PRACH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ue_generate_prach
 ID = VCD_FUNCTION_UE_ULSCH_MODULATION
     DESC = VCD function UE_ULSCH_MODULATION
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ue_ulsch_modulation
 ID = VCD_FUNCTION_UE_ULSCH_ENCODING
     DESC = VCD function UE_ULSCH_ENCODING
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ue_ulsch_encoding
 ID = VCD_FUNCTION_UE_ULSCH_ENCODING_FILL_CQI
     DESC = VCD function UE_ULSCH_ENCODING_FILL_CQI
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ue_ulsch_encoding_fill_cqi
 ID = VCD_FUNCTION_UE_ULSCH_SCRAMBLING
     DESC = VCD function UE_ULSCH_SCRAMBLING
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_ue_ulsch_scrambling
 ID = VCD_FUNCTION_ENB_DLSCH_MODULATION
     DESC = VCD function ENB_DLSCH_MODULATION
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_eNB_dlsch_modulation
 ID = VCD_FUNCTION_ENB_DLSCH_ENCODING
     DESC = VCD function ENB_DLSCH_ENCODING
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_eNB_dlsch_encoding
 ID = VCD_FUNCTION_ENB_DLSCH_ENCODING_W
     DESC = VCD function ENB_DLSCH_ENCODING_W
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_eNB_dlsch_encoding_w
 ID = VCD_FUNCTION_ENB_DLSCH_SCRAMBLING
     DESC = VCD function ENB_DLSCH_SCRAMBLING
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_eNB_dlsch_scrambling
 ID = VCD_FUNCTION_ENB_BEAM_PRECODING
     DESC = VCD function ENB_BEAM_PRECODING
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_eNB_beam_precoding
 ID = VCD_FUNCTION_ENB_OFDM_MODULATION
     DESC = VCD function ENB_OFDM_MODULATION
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = phy_eNB_ofdm_mod_l
 ID = VCD_FUNCTION_MACPHY_INIT
     DESC = VCD function MACPHY_INIT
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_macphy_init
 ID = VCD_FUNCTION_MACPHY_EXIT
     DESC = VCD function MACPHY_EXIT
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_macphy_exit
 ID = VCD_FUNCTION_ENB_DLSCH_ULSCH_SCHEDULER
     DESC = VCD function ENB_DLSCH_ULSCH_SCHEDULER
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_eNB_dlsch_ulsch_scheduler
 ID = VCD_FUNCTION_FILL_RAR
     DESC = VCD function FILL_RAR
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_fill_rar
 ID = VCD_FUNCTION_TERMINATE_RA_PROC
     DESC = VCD function TERMINATE_RA_PROC
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_terminate_ra_proc
 ID = VCD_FUNCTION_INITIATE_RA_PROC
     DESC = VCD function INITIATE_RA_PROC
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_initiate_ra_proc
 ID = VCD_FUNCTION_CANCEL_RA_PROC
     DESC = VCD function CANCEL_RA_PROC
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_cancel_ra_proc
 ID = VCD_FUNCTION_GET_DCI_SDU
     DESC = VCD function GET_DCI_SDU
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_get_dci_sdu
 ID = VCD_FUNCTION_GET_DLSCH_SDU
     DESC = VCD function GET_DLSCH_SDU
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_get_dlsch_sdu
 ID = VCD_FUNCTION_RX_SDU
     DESC = VCD function RX_SDU
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_rx_sdu
 ID = VCD_FUNCTION_MRBCH_PHY_SYNC_FAILURE
     DESC = VCD function MRBCH_PHY_SYNC_FAILURE
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_mrbch_phy_sync_failure
 ID = VCD_FUNCTION_SR_INDICATION
     DESC = VCD function SR_INDICATION
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_SR_indication
 ID = VCD_FUNCTION_DLSCH_PREPROCESSOR
     DESC = VCD function DLSCH_PREPROCESSOR
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = mac_dlsch_preprocessor
 ID = VCD_FUNCTION_SCHEDULE_DLSCH
     DESC = VCD function SCHEDULE_DLSCH
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = mac_schedule_dlsch
 ID = VCD_FUNCTION_FILL_DLSCH_DCI
     DESC = VCD function FILL_DLSCH_DCI
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = mac_fill_dlsch_dci
 ID = VCD_FUNCTION_OUT_OF_SYNC_IND
     DESC = VCD function OUT_OF_SYNC_IND
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_out_of_sync_ind
 ID = VCD_FUNCTION_UE_DECODE_SI
     DESC = VCD function UE_DECODE_SI
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_decode_si
 ID = VCD_FUNCTION_UE_DECODE_PCCH
     DESC = VCD function UE_DECODE_PCCH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_decode_pcch
 ID = VCD_FUNCTION_UE_DECODE_CCCH
     DESC = VCD function UE_DECODE_CCCH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_decode_ccch
 ID = VCD_FUNCTION_UE_DECODE_BCCH
     DESC = VCD function UE_DECODE_BCCH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_decode_bcch
 ID = VCD_FUNCTION_UE_SEND_SDU
     DESC = VCD function UE_SEND_SDU
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_send_sdu
 ID = VCD_FUNCTION_UE_GET_SDU
     DESC = VCD function UE_GET_SDU
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_get_sdu
 ID = VCD_FUNCTION_UE_GET_RACH
     DESC = VCD function UE_GET_RACH
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_get_rach
 ID = VCD_FUNCTION_UE_PROCESS_RAR
     DESC = VCD function UE_PROCESS_RAR
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_process_rar
 ID = VCD_FUNCTION_UE_SCHEDULER
     DESC = VCD function UE_SCHEDULER
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_scheduler
 ID = VCD_FUNCTION_UE_GET_SR
     DESC = VCD function UE_GET_SR
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = macxface_ue_get_sr
 ID = VCD_FUNCTION_UE_SEND_MCH_SDU
     DESC = VCD function UE_SEND_MCH_SDU
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = ue_send_mch_sdu
 ID = VCD_FUNCTION_RLC_DATA_REQ
     DESC = VCD function RLC_DATA_REQ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rlc_data_req
 #ID = VCD_FUNCTION_RLC_DATA_IND
 #    DESC = VCD function RLC_DATA_IND
 #    GROUP = ALL:VCD:ENB:VCD_FUNCTION
 #    FORMAT = int,value
+#    VCD_NAME = rlc_data_ind
 ID = VCD_FUNCTION_MAC_RLC_STATUS_IND
     DESC = VCD function MAC_RLC_STATUS_IND
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = mac_rlc_status_ind
 ID = VCD_FUNCTION_MAC_RLC_DATA_REQ
     DESC = VCD function MAC_RLC_DATA_REQ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = mac_rlc_data_req
 ID = VCD_FUNCTION_MAC_RLC_DATA_IND
     DESC = VCD function MAC_RLC_DATA_IND
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = mac_rlc_data_ind
 ID = VCD_FUNCTION_RLC_UM_TRY_REASSEMBLY
     DESC = VCD function RLC_UM_TRY_REASSEMBLY
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rlc_um_try_reassembly
 ID = VCD_FUNCTION_RLC_UM_CHECK_TIMER_DAR_TIME_OUT
     DESC = VCD function RLC_UM_CHECK_TIMER_DAR_TIME_OUT
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rlc_um_check_timer_dar_time_out
 ID = VCD_FUNCTION_RLC_UM_RECEIVE_PROCESS_DAR
     DESC = VCD function RLC_UM_RECEIVE_PROCESS_DAR
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rlc_um_receive_process_dar
 ID = VCD_FUNCTION_PDCP_RUN
     DESC = VCD function PDCP_RUN
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_run
 ID = VCD_FUNCTION_PDCP_DATA_REQ
     DESC = VCD function PDCP_DATA_REQ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_data_req
 ID = VCD_FUNCTION_PDCP_DATA_IND
     DESC = VCD function PDCP_DATA_IND
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_data_ind
 ID = VCD_FUNCTION_PDCP_APPLY_SECURITY
     DESC = VCD function PDCP_APPLY_SECURITY
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_apply_security
 ID = VCD_FUNCTION_PDCP_VALIDATE_SECURITY
     DESC = VCD function PDCP_VALIDATE_SECURITY
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_validate_security
 ID = VCD_FUNCTION_PDCP_FIFO_READ
     DESC = VCD function PDCP_FIFO_READ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_fifo_read
 ID = VCD_FUNCTION_PDCP_FIFO_READ_BUFFER
     DESC = VCD function PDCP_FIFO_READ_BUFFER
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_fifo_read_buffer
 ID = VCD_FUNCTION_PDCP_FIFO_FLUSH
     DESC = VCD function PDCP_FIFO_FLUSH
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_fifo_flush
 ID = VCD_FUNCTION_PDCP_FIFO_FLUSH_BUFFER
     DESC = VCD function PDCP_FIFO_FLUSH_BUFFER
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcp_fifo_flush_buffer
 ID = VCD_FUNCTION_RRC_RX_TX
     DESC = VCD function RRC_RX_TX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rrc_rx_tx
 ID = VCD_FUNCTION_RRC_MAC_CONFIG
     DESC = VCD function RRC_MAC_CONFIG
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rrc_mac_config_req
 ID = VCD_FUNCTION_RRC_UE_DECODE_SIB1
     DESC = VCD function RRC_UE_DECODE_SIB1
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rrc_ue_decode_sib1
 ID = VCD_FUNCTION_RRC_UE_DECODE_SI
     DESC = VCD function RRC_UE_DECODE_SI
     GROUP = ALL:VCD:UE:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = rrc_ue_decode_si
 ID = VCD_FUNCTION_GTPV1U_ENB_TASK
     DESC = VCD function GTPV1U_ENB_TASK
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = gtpv1u_enb_task
 ID = VCD_FUNCTION_GTPV1U_PROCESS_UDP_REQ
     DESC = VCD function GTPV1U_PROCESS_UDP_REQ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = gtpv1u_process_udp_req
 ID = VCD_FUNCTION_GTPV1U_PROCESS_TUNNEL_DATA_REQ
     DESC = VCD function GTPV1U_PROCESS_TUNNEL_DATA_REQ
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = gtpv1u_process_tunnel_data_req
 ID = VCD_FUNCTION_UDP_ENB_TASK
     DESC = VCD function UDP_ENB_TASK
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = udp_enb_task
 ID = VCD_FUNCTION_EMU_TRANSPORT
     DESC = VCD function EMU_TRANSPORT
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = emu_transport
 ID = VCD_FUNCTION_LOG_RECORD
     DESC = VCD function LOG_RECORD
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = log_record
 ID = VCD_FUNCTION_ITTI_ENQUEUE_MESSAGE
     DESC = VCD function ITTI_ENQUEUE_MESSAGE
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = itti_enqueue_message
 ID = VCD_FUNCTION_ITTI_DUMP_ENQUEUE_MESSAGE
     DESC = VCD function ITTI_DUMP_ENQUEUE_MESSAGE
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = itti_dump_enqueue_message
 ID = VCD_FUNCTION_ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC
     DESC = VCD function ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = itti_dump_enqueue_message_malloc
 ID = VCD_FUNCTION_ITTI_RELAY_THREAD
     DESC = VCD function ITTI_RELAY_THREAD
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = itti_relay_thread
 ID = VCD_FUNCTION_TEST
     DESC = VCD function TEST
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = test
 ID = VCD_FUNCTION_SEND_IF4
     DESC = VCD function SEND_IF4
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = send_if4
 ID = VCD_FUNCTION_RECV_IF4
     DESC = VCD function RECV_IF4
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = recv_if4
 ID = VCD_FUNCTION_SEND_IF5
     DESC = VCD function SEND_IF5
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = send_if5
 ID = VCD_FUNCTION_RECV_IF5
     DESC = VCD function RECV_IF5
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = recv_if5
 ID = VCD_FUNCTION_TRX_COMPR_IF
     DESC = VCD function TRX_COMPR_IF
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = compress_if
 ID = VCD_FUNCTION_TRX_DECOMPR_IF
     DESC = VCD function TRX_DECOMPR_IF
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = decompress_if
 ID = VCD_FUNCTION_NFAPI
     DESC = VCD function NFAPI
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = nfapi_subframe
 ID = VCD_FUNCTION_GENERATE_PCFICH
     DESC = VCD function GENERATE_PCFICH
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = generate_pcfich
 ID = VCD_FUNCTION_GENERATE_DCI0
     DESC = VCD function GENERATE_DCI0
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = generate_dci0
 ID = VCD_FUNCTION_GENERATE_DLSCH
     DESC = VCD function GENERATE_DLSCH
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = generate_dlsch
 ID = VCD_FUNCTION_GENERATE_PHICH
     DESC = VCD function GENERATE_PHICH
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = generate_phich
 ID = VCD_FUNCTION_PDCCH_SCRAMBLING
     DESC = VCD function PDCCH_SCRAMBLING
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcch_scrambling
 ID = VCD_FUNCTION_PDCCH_MODULATION
     DESC = VCD function PDCCH_MODULATION
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcch_modulation
 ID = VCD_FUNCTION_PDCCH_INTERLEAVING
     DESC = VCD function PDCCH_INTERLEAVING
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcch_interleaving
 ID = VCD_FUNCTION_PDCCH_TX
     DESC = VCD function PDCCH_TX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+    VCD_NAME = pdcch_tx
diff --git a/common/utils/T/check_vcd.c b/common/utils/T/check_vcd.c
new file mode 100644
index 0000000000000000000000000000000000000000..1460d7e20a7dd861f39e4a45150e91377e0ed0da
--- /dev/null
+++ b/common/utils/T/check_vcd.c
@@ -0,0 +1,249 @@
+/*
+ * To disable the checks done by this program, see below at the beginning
+ * of the function 'main'.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "database.h"
+
+#define T_TRACER 1
+#include "T.h"
+
+/* VCD specific defines and includes
+ * If the codebase changes, it may need to be updated
+ */
+#define ENB_MODE
+#define ENABLE_USE_CPU_EXECUTION_TIME
+#include "../LOG/vcd_signal_dumper.c"
+
+void err(char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
+void err(char *fmt, ...)
+{
+  va_list ap;
+
+  va_start(ap, fmt);
+
+  printf("\x1b[31m");
+  printf("error: ");
+  vprintf(fmt, ap);
+  printf("\n"
+"\x1b[33m\n"
+"You probably added a VCD trace (variable or function) but you did not\n"
+"update T_messages.txt and/or T_defs.h in common/utils/T/\n"
+"\n"
+"Be sure to add the new trace to T_messages.txt, at the right place in the\n"
+"file. Do not forget to define VCD_NAME with an identical value as found\n"
+"in the array eurecomVariablesNames or eurecomFunctionsNames.\n"
+"\n"
+"Be sure to update VCD_NUM_FUNCTIONS, VCD_NUM_VARIABLES, VCD_FIRST_FUNCTION\n"
+"and VCD_FIRST_VARIABLE in T_defs.h\n"
+"\n"
+"The same procedure has to be followed when you delete a VCD trace.\n"
+"Delete it in T_messages.txt as well and update T_defs.h\n"
+"\n"
+"You can disable those VCD checks at development time.\n"
+"To disable the VCD checks see the file common/utils/T/check_vcd.c\n"
+"Do not push any modification that disables the VCD checks to the\n"
+"main repository.\n");
+
+  printf("\x1b[m\n");
+
+  va_end(ap);
+
+  exit(1);
+}
+
+int main(void)
+{
+  /* to disable the checks done by this program, uncomment the following
+   * line, ie. remove the leading '//'
+   */
+  //return 0;
+
+  void *database = parse_database("T_messages.txt");
+  int number_of_events;
+  int first_var = -1;
+  int last_var;
+  int first_fun = -1;
+  int last_fun;
+  char *prefix;
+  int prefix_len;
+  char *name;
+  char *vcd_name;
+  int i;
+  FILE *in;
+  char *l = NULL;
+  size_t lsize;
+
+  if (database == NULL) err("something wrong with T_messages.txt");
+
+  /* check the value of VCD_NUM_FUNCTIONS */
+  if (VCD_NUM_FUNCTIONS != sizeof(eurecomFunctionsNames) / sizeof(char *))
+    err("VCD_NUM_FUNCTIONS (%d) must be equal to %zd",
+        VCD_NUM_FUNCTIONS,
+        sizeof(eurecomFunctionsNames) / sizeof(char *));
+
+  /* check the value of VCD_NUM_VARIABLES */
+  if (VCD_NUM_VARIABLES != sizeof(eurecomVariablesNames) / sizeof(char *))
+    err("VCD_NUM_VARIABLES (%d) must be equal to %zd",
+        VCD_NUM_VARIABLES,
+        sizeof(eurecomVariablesNames) / sizeof(char *));
+
+  number_of_events = number_of_ids(database);
+  if (number_of_events == 0) err("no event defined in T_messages.txt");
+
+  /* T_messages.txt ends with VCD VARIABLES followed by VCD FUNCTIONS
+   * followed by nothing.
+   * Let's check.
+   */
+
+  /* check VCD VARIABLES traces in T_messages.txt */
+  prefix = "VCD_VARIABLE_";
+  prefix_len = strlen(prefix);
+
+  for (i = 0; i < number_of_events; i++) {
+    name = event_name_from_id(database, i);
+    if (strncmp(name, prefix, prefix_len)) continue;
+    first_var = i;
+    break;
+  }
+  if (first_var == -1)
+    err("no VCD_VARIABLE_ found in T_messages.txt");
+  for (; i < number_of_events; i++) {
+    name = event_name_from_id(database, i);
+    if (strncmp(name, prefix, prefix_len)) break;
+  }
+  last_var = i-1;
+
+  /* check VCD FUNCTIONS traces in T_messages.txt */
+  if (i == number_of_events)
+    err("no VCD_FUNCTION_ found in T_messages.txt");
+
+  prefix = "VCD_FUNCTION_";
+  prefix_len = strlen(prefix);
+
+  first_fun = i;
+
+  name = event_name_from_id(database, i);
+  if (strncmp(name, prefix, prefix_len))
+    err("last VCD_VARIABLE_ not followed by a VCD_FUNCTION_ in T_messages.txt");
+
+  for (; i < number_of_events; i++) {
+    name = event_name_from_id(database, i);
+    if (strncmp(name, prefix, prefix_len)) break;
+  }
+
+  if (i != number_of_events)
+    err("T_messages.txt does not end with a VCD_FUNCTION_ trace");
+
+  last_fun = i-1;
+
+  if (first_var != (unsigned)VCD_FIRST_VARIABLE)
+    err("VCD_FIRST_VARIABLE is not correct in T_defs.h");
+  if (first_fun != (unsigned)VCD_FIRST_FUNCTION)
+    err("VCD_FIRST_FUNCTION is not correct in T_defs.h");
+  if (last_var-first_var+1 != VCD_NUM_VARIABLES)
+    err("VCD_NUM_VARIABLES is not correct in T_defs.h");
+  if (last_fun-first_fun+1 != VCD_NUM_FUNCTIONS)
+    err("VCD_NUM_FUNCTIONS is not correct in T_defs.h");
+
+  /* check that VCD_NAME is identical to
+   * eurecomVariablesNames[x]/eurecomFunctionsNames[x]
+   */
+  prefix = "VCD_VARIABLE_";
+  prefix_len = strlen(prefix);
+
+  for (i = 0; i < number_of_events; i++) {
+    name = event_name_from_id(database, i);
+    if (strncmp(name, prefix, prefix_len)) continue;
+    vcd_name = event_vcd_name_from_id(database, i);
+    if (vcd_name == NULL)
+      err("%s has no VCD_NAME in T_messages.txt", name);
+    if (strcmp(vcd_name, eurecomVariablesNames[i - first_var]))
+      err("%s has a wrong VCD_NAME in T_messages.txt", name);
+  }
+
+  prefix = "VCD_FUNCTION_";
+  prefix_len = strlen(prefix);
+
+  for (i = 0; i < number_of_events; i++) {
+    name = event_name_from_id(database, i);
+    if (strncmp(name, prefix, prefix_len)) continue;
+    vcd_name = event_vcd_name_from_id(database, i);
+    if (vcd_name == NULL)
+      err("%s has no VCD_NAME in T_messages.txt", name);
+    if (strcmp(vcd_name, eurecomFunctionsNames[i - first_fun]))
+      err("%s has a wrong VCD_NAME in T_messages.txt", name);
+  }
+
+  /* check IDs - these checks are difficult because we parse
+   * common/utils/LOG/vcd_signal_dumper.h which is expected to
+   * be formatted as is:
+   * - define vcd_signal_dump_variables then vcd_signal_dump_functions
+   * - one VCD_XXXX per line starting with two spaces
+   *   followed by ',' or '=' with no space in between
+   * - no #ifdef / #if is taken into account
+   * - we require VCD_SIGNAL_DUMPER_VARIABLES_END and
+   *   VCD_SIGNAL_DUMPER_FUNCTIONS_END at the end of each array,
+   *   each on a line of its own with two spaces before and nothing after.
+   *
+   * If these checks fail, consider formatting
+   * common/utils/LOG/vcd_signal_dumper.h as expected here, if
+   * it makes sense of course. Otherwise, change the code below.
+   *
+   * In common/utils/LOG/vcd_signal_dumper.h a valid name is
+   * either VCD_SIGNAL_DUMPER_VARIABLES_ABC or
+   * VCD_SIGNAL_DUMPER_FUNCTIONS_XYZ
+   * and in T_messages.txt the corresponding name has to be
+   * VCD_VARIABLE_ABC or VCD_FUNCTION_XYZ
+   */
+  i = first_var;
+  in = fopen("../LOG/vcd_signal_dumper.h", "r");
+  if (in == NULL) err("could not open ../LOG/vcd_signal_dumper.h");
+  while (1) {
+    char *x = "  VCD_SIGNAL_DUMPER_VARIABLES_";
+    ssize_t r;
+    free(l);
+    l = NULL;
+    lsize = 0;
+    r = getline(&l, &lsize, in);
+    if (r == -1) break;
+    if (!strcmp(l, "  VCD_SIGNAL_DUMPER_VARIABLES_END\n")) break;
+    /* remove ',' or '=' if found */
+    { char *s=l; while (*s) { if (*s==','||*s=='=') { *s=0; break; } s++; } }
+    if (strncmp(l, x, strlen(x))) continue;
+    if (!(i >= first_var && i <= last_var))
+      err("T_messages.txt is not correct with respect to VCD VARIABLES");
+    name = event_name_from_id(database, i);
+    if (strcmp(l+strlen(x), name+strlen("VCD_VARIABLE_")))
+      err("%s is not correct in T_messages.txt", name);
+    i++;
+  }
+  if (i != last_var + 1) err("VCD VARIABLES wrong in T_messages.txt");
+  while (1) {
+    char *x = "  VCD_SIGNAL_DUMPER_FUNCTIONS_";
+    ssize_t r;
+    free(l);
+    l = NULL;
+    lsize = 0;
+    r = getline(&l, &lsize, in);
+    if (r == -1) break;
+    if (!strcmp(l, "  VCD_SIGNAL_DUMPER_FUNCTIONS_END\n")) break;
+    /* remove ',' or '=' if found */
+    { char *s=l; while (*s) { if (*s==','||*s=='=') { *s=0; break; } s++; } }
+    if (strncmp(l, x, strlen(x))) continue;
+    if (!(i >= first_fun && i <= last_fun))
+      err("T_messages.txt is not correct with respect to VCD FUNCTIONS");
+    name = event_name_from_id(database, i);
+    if (strcmp(l+strlen(x), name+strlen("VCD_FUNCTION_")))
+      err("%s is not correct in T_messages.txt", name);
+    i++;
+  }
+  fclose(in);
+  if (i != last_fun + 1) err("VCD FUNCTIONS wrong in T_messages.txt");
+
+  return 0;
+}
diff --git a/common/utils/T/genids.c b/common/utils/T/genids.c
index 734c506368ac348ba9db9ae2eae8048fcec929d6..8e5adbf587081322fc2d6047c7b4d246841bdc94 100644
--- a/common/utils/T/genids.c
+++ b/common/utils/T/genids.c
@@ -14,21 +14,21 @@ int cmp(const void *p1, const void *p2)
 }
 
 /* return 1 if s was not already known, 0 if it was */
-int new_unique_id(char *s)
+int new_unique_id(char *s, char *input_file)
 {
   if (unique_ids_size)
   if (bsearch(&s, unique_ids, unique_ids_size, sizeof(char *), cmp) != NULL) {
-    printf("FATAL: ID %s is not unique\n", s);
+    printf("error: ID %s is not unique in %s\n", s, input_file);
     return 0;
   }
   if (unique_ids_size == unique_ids_maxsize) {
     unique_ids_maxsize += 256;
     unique_ids = realloc(unique_ids, unique_ids_maxsize * sizeof(char *));
-    if (unique_ids == NULL) { printf("out of memory\n"); abort(); }
+    if (unique_ids == NULL) { printf("erorr: out of memory\n"); abort(); }
   }
   unique_ids[unique_ids_size] = strdup(s);
   if (unique_ids[unique_ids_size] == NULL)
-    { printf("out of memory\n"); abort(); }
+    { printf("erorr: out of memory\n"); abort(); }
   unique_ids_size++;
   qsort(unique_ids, unique_ids_size, sizeof(char *), cmp);
   return 1;
@@ -43,7 +43,8 @@ void putname(int c)
   if (bufname_size == bufname_maxsize) {
     bufname_maxsize += 256;
     bufname = realloc(bufname, bufname_maxsize);
-    if (bufname == NULL) { printf("memory allocation error\n"); exit(1); }
+    if (bufname == NULL)
+      { printf("erorr: memory allocation error\n"); exit(1); }
   }
   bufname[bufname_size] = c;
   bufname_size++;
@@ -58,7 +59,8 @@ void putvalue(int c)
   if (bufvalue_size == bufvalue_maxsize) {
     bufvalue_maxsize += 256;
     bufvalue = realloc(bufvalue, bufvalue_maxsize);
-    if (bufvalue == NULL) { printf("memory allocation error\n"); exit(1); }
+    if (bufvalue == NULL)
+      { printf("error: memory allocation error\n"); exit(1); }
   }
   bufvalue[bufvalue_size] = c;
   bufvalue_size++;
@@ -119,7 +121,7 @@ int main(int n, char **v)
   char *in_name;
   char *out_name;
 
-  if (n != 3) { printf("gimme <source> <dest>\n"); exit(1); }
+  if (n != 3) { printf("error: gimme <source> <dest>\n"); exit(1); }
 
   n = 0;
 
@@ -134,14 +136,13 @@ int main(int n, char **v)
   while (1) {
     get_line(in, &name, &value);
     if (name == NULL) break;
-    printf("name '%s' value '%s'\n", name, value);
     if (isspace(value[strlen(value)-1])) {
-      printf("bad value '%s' (no space at the end please!)\n", value);
+      printf("error: bad value '%s' (no space at the end please!)\n", value);
       unlink(out_name);
       exit(1);
     }
     if (!strcmp(name, "ID")) {
-      if (!new_unique_id(value)) { unlink(out_name); exit(1); }
+      if (!new_unique_id(value, in_name)) { unlink(out_name); exit(1); }
       fprintf(out, "#define T_%s T_ID(%d)\n", value, n);
       n++;
     }
diff --git a/common/utils/T/local_tracer.c b/common/utils/T/local_tracer.c
index c331daa4a9f0410d918ea317466b738479328d0a..f8e92881a96e79a000e57fcad814e8440719a895 100644
--- a/common/utils/T/local_tracer.c
+++ b/common/utils/T/local_tracer.c
@@ -337,54 +337,34 @@ static void forward(void *_forwarder, char *buf, int size)
 
 static void wait_message(void)
 {
-  while (T_local_cache[T_busylist_head].busy == 0) usleep(1000);
-}
-
-static void init_shm(char *shm_file)
-{
-  int i;
-  int s = shm_open(shm_file, O_RDWR | O_CREAT /*| O_SYNC*/, 0666);
-  if (s == -1) { perror(shm_file); abort(); }
-  if (ftruncate(s, T_CACHE_SIZE * sizeof(T_cache_t)))
-    { perror(shm_file); abort(); }
-  T_local_cache = mmap(NULL, T_CACHE_SIZE * sizeof(T_cache_t),
-                       PROT_READ | PROT_WRITE, MAP_SHARED, s, 0);
-  if (T_local_cache == MAP_FAILED)
-    { perror(shm_file); abort(); }
-  close(s);
-
-  /* let's garbage the memory to catch some potential problems
-   * (think multiprocessor sync issues, barriers, etc.)
-   */
-  memset(T_local_cache, 0x55, T_CACHE_SIZE * sizeof(T_cache_t));
-  for (i = 0; i < T_CACHE_SIZE; i++) T_local_cache[i].busy = 0;
+  while ((T_local_cache[T_busylist_head].busy & 0x02) == 0) usleep(1000);
 }
 
 void T_local_tracer_main(int remote_port, int wait_for_tracer,
-    int local_socket, char *shm_file)
+    int local_socket, void *shm_array)
 {
   int s;
   int port = remote_port;
   int dont_wait = wait_for_tracer ? 0 : 1;
   void *f;
-  printf("local tracer starting\n");
+
   /* write on a socket fails if the other end is closed and we get SIGPIPE */
-  if (signal(SIGPIPE, SIG_IGN) == SIG_ERR){
+  if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
        printf("local tracer received SIGPIPE\n");
        abort();
-   }
+  }
+
+  T_local_cache = shm_array;
 
-  init_shm(shm_file);
   s = local_socket;
-  printf("local tracer starting step 2\n");
+
   if (dont_wait) {
     char t = 2;
-  printf("local tracer in no wait mode \n");
     if (write(s, &t, 1) != 1) abort();
   }
-  printf("local tracer starting step 3\n");
+
   f = forwarder(port, s);
-  printf("local tracer main loop.... \n");
+
   /* read messages */
   while (1) {
     wait_message();
diff --git a/common/utils/T/tracer/Makefile b/common/utils/T/tracer/Makefile
index 1c4a77587c3916c9140a9ef71465b08e8a9313aa..3da4aa13a17528cc1396f5eedc2e40eee91c2cb1 100644
--- a/common/utils/T/tracer/Makefile
+++ b/common/utils/T/tracer/Makefile
@@ -7,7 +7,7 @@ LIBS=-lm
 XLIBS=-lX11 -lpng -lXft
 
 all: record replay extract_config textlog enb ue vcd macpdu2wireshark \
-     extract_input_subframe extract_output_subframe to_vcd extract
+     extract_input_subframe extract_output_subframe to_vcd extract multi
 
 record: utils.o record.o database.o config.o
 	$(CC) $(CFLAGS) -o record $^ $(LIBS)
@@ -57,19 +57,22 @@ macpdu2wireshark: macpdu2wireshark.o database.o utils.o handler.o event.o \
                   config.o
 	$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
 
+multi: multi.o utils.o database.o config.o
+	$(CC) $(CFLAGS) -o multi $^ $(LIBS)
+
 .PHONY: all gui/gui.a view/view.a logger/logger.a filter/filter.a
 
 gui/gui.a:
-	cd gui && make
+	cd gui && $(MAKE)
 
 view/view.a:
-	cd view && make
+	cd view && $(MAKE)
 
 logger/logger.a:
-	cd logger && make
+	cd logger && $(MAKE)
 
 filter/filter.a:
-	cd filter && make
+	cd filter && $(MAKE)
 
 %.o: %.c
 	$(CC) $(CFLAGS) -c -o $@ $<
@@ -77,9 +80,9 @@ filter/filter.a:
 clean:
 	rm -f *.o core tracer_remote textlog enb ue vcd record replay
 	rm -f extract_config macpdu2wireshark extract_input_subframe
-	rm -f extract_output_subframe to_vcd extract
-	cd gui && make clean
-	cd view && make clean
-	cd logger && make clean
-	cd filter && make clean
-	cd hacks && make clean
+	rm -f extract_output_subframe to_vcd extract multi
+	cd gui && $(MAKE) clean
+	cd view && $(MAKE) clean
+	cd logger && $(MAKE) clean
+	cd filter && $(MAKE) clean
+	cd hacks && $(MAKE) clean
diff --git a/common/utils/T/tracer/config.c b/common/utils/T/tracer/config.c
index f88966ed79a111b2ab2d09d7110ae9da0c3781ea..723902ec9c8bbe518ca2eaad902c1903771e87f4 100644
--- a/common/utils/T/tracer/config.c
+++ b/common/utils/T/tracer/config.c
@@ -60,3 +60,9 @@ void verify_config(void)
     abort();
   }
 }
+
+void get_local_config(char **txt, int *len)
+{
+  *txt = local;
+  *len = local_size;
+}
diff --git a/common/utils/T/tracer/config.h b/common/utils/T/tracer/config.h
index f90869eb6621f89c5be80fc012e4edc7102a4652..07290c71a35c5605596ff3770a34db40ce5dbc0a 100644
--- a/common/utils/T/tracer/config.h
+++ b/common/utils/T/tracer/config.h
@@ -5,5 +5,6 @@ void clear_remote_config(void);
 void append_received_config_chunk(char *buf, int length);
 void load_config_file(char *filename);
 void verify_config(void);
+void get_local_config(char **txt, int *len);
 
 #endif /* _CONFIG_H_ */
diff --git a/common/utils/T/tracer/database.c b/common/utils/T/tracer/database.c
index f0908948e23cb81ac2809faa14b8856f53492075..543ab666640309719c2599ad00e7b4ff6b66caea 100644
--- a/common/utils/T/tracer/database.c
+++ b/common/utils/T/tracer/database.c
@@ -13,6 +13,7 @@ typedef struct {
   char **arg_type;
   char **arg_name;
   int  asize;
+  char *vcd_name;
   int  id;
 } id;
 
@@ -138,6 +139,7 @@ id *add_id(database *r, char *idname, int i)
   r->i[r->isize].arg_type = NULL;
   r->i[r->isize].arg_name = NULL;
   r->i[r->isize].asize = 0;
+  r->i[r->isize].vcd_name = NULL;
   r->i[r->isize].id = i;
   r->isize++;
   qsort(r->i, r->isize, sizeof(id), id_cmp);
@@ -224,6 +226,12 @@ void add_desc(id *i, char *desc)
   i->desc = strdup(desc); if (i->desc == NULL) abort();
 }
 
+void add_vcd_name(id *i, char *vcd_name)
+{
+  if (i == NULL) {printf("ERROR: VCD_NAME line before ID line\n");exit(1);}
+  i->vcd_name = strdup(vcd_name); if (i->vcd_name == NULL) abort();
+}
+
 char *format_get_next_token(char **cur)
 {
   char *start;
@@ -320,6 +328,7 @@ void *parse_database(char *filename)
     if (!strcmp(name, "GROUP")) add_groups(r, last_id, value);
     if (!strcmp(name, "DESC")) add_desc(last_id, value);
     if (!strcmp(name, "FORMAT")) add_format(last_id, value);
+    if (!strcmp(name, "VCD_NAME")) add_vcd_name(last_id, value);
   }
 
   fclose(in);
@@ -424,6 +433,12 @@ char *event_name_from_id(void *_database, int id)
   return d->i[d->id_to_pos[id]].name;
 }
 
+char *event_vcd_name_from_id(void *_database, int id)
+{
+  database *d = _database;
+  return d->i[d->id_to_pos[id]].vcd_name;
+}
+
 int event_id_from_name(void *_database, char *name)
 {
   database *d = _database;
diff --git a/common/utils/T/tracer/database.h b/common/utils/T/tracer/database.h
index c5cab05d9f7be0da0cc8d50fcf3fda243aec556a..9fdbaed7c685fb77979167f243fdd5732597566b 100644
--- a/common/utils/T/tracer/database.h
+++ b/common/utils/T/tracer/database.h
@@ -8,6 +8,7 @@ void list_ids(void *database);
 void list_groups(void *database);
 void on_off(void *d, char *item, int *a, int onoff);
 char *event_name_from_id(void *database, int id);
+char *event_vcd_name_from_id(void *_database, int id);
 int event_id_from_name(void *database, char *name);
 int number_of_ids(void *database);
 int database_get_ids(void *database, char ***ids);
diff --git a/common/utils/T/tracer/enb.c b/common/utils/T/tracer/enb.c
index a30366faf1eb8e645d5efba1cf664985cc60c255..ea499a68f831b5e7d7bbecb144815e2d9ddc81d6 100644
--- a/common/utils/T/tracer/enb.c
+++ b/common/utils/T/tracer/enb.c
@@ -878,6 +878,7 @@ int main(int n, char **v)
 
 restart:
   clear_remote_config();
+  if (enb_data.socket != -1) close(enb_data.socket);
   enb_data.socket = connect_to(ip, port);
 
   /* send the first message - activate selected traces */
diff --git a/common/utils/T/tracer/multi.c b/common/utils/T/tracer/multi.c
new file mode 100644
index 0000000000000000000000000000000000000000..6a9de838c674b1473e54d99a147d91c9d431311e
--- /dev/null
+++ b/common/utils/T/tracer/multi.c
@@ -0,0 +1,385 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <string.h>
+#include <poll.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include "database.h"
+#include "utils.h"
+#include "../T.h"
+#include "config.h"
+
+#define DEFAULT_LOCAL_PORT 2022
+
+typedef struct {
+  int id;         /* increases at each new tracer's connection */
+  int s;          /* socket */
+  int *is_on;     /* local vision of is_on for this tracer */
+  int poll_id;    /* -1: invalid, otherwise index in fds array */
+} ti_t;
+
+typedef struct {
+  ti_t *ti;         /* data for tracers */
+  int  ti_size;
+  int  ti_maxsize;
+} multi_t;
+
+void set_is_on(int *is_on, int pos, int val)
+{
+  if (val) is_on[pos]++; else is_on[pos]--;
+  /* TODO: remove check? */
+  if (is_on[pos] < 0) { printf("%s:%d:nonono\n",__FILE__,__LINE__); abort(); }
+}
+
+int send_messages_txt(int s, char *T_messages_txt, int T_messages_txt_len)
+{
+  char buf[T_BUFFER_MAX];
+  char *T_LOCAL_buf = buf;
+  int32_t T_LOCAL_size;
+  unsigned char *src;
+  int src_len;
+
+  /* trace T_message.txt
+   * Send several messages -1 with content followed by message -2.
+   */
+  src = (unsigned char *)T_messages_txt;
+  src_len = T_messages_txt_len;
+  while (src_len) {
+    int send_size = src_len;
+    if (send_size > T_PAYLOAD_MAXSIZE - sizeof(int))
+      send_size = T_PAYLOAD_MAXSIZE - sizeof(int);
+    /* TODO: be careful, we use internal T stuff, to rewrite? */
+    T_LOCAL_size = 0;
+    T_HEADER(T_ID(-1));
+    T_PUT_buffer(1, ((T_buffer){addr:(src), length:(send_size)}));
+    if (socket_send(s, &T_LOCAL_size, 4) == -1) return -1;
+    if (socket_send(s, buf, T_LOCAL_size) == -1) return -1;
+    src += send_size;
+    src_len -= send_size;
+  }
+  T_LOCAL_size = 0;
+  T_HEADER(T_ID(-2));
+  if (socket_send(s, &T_LOCAL_size, 4) == -1) return -1;
+  return socket_send(s, buf, T_LOCAL_size);
+}
+
+void new_tracer(multi_t *m, int s, int is_on_size, char *t, int t_size, int id)
+{
+  if (send_messages_txt(s, t, t_size) == -1) {
+    printf("error sending T_messages.txt to new tracer %d => remove tracer\n",
+           id);
+    return;
+  }
+  if (m->ti_size == m->ti_maxsize) {
+    m->ti_maxsize += 64;
+    m->ti = realloc(m->ti, m->ti_maxsize * sizeof(ti_t));
+    if (m->ti == NULL) abort();
+  }
+  m->ti[m->ti_size].id = id;
+  m->ti[m->ti_size].s = s;
+  m->ti[m->ti_size].is_on = calloc(is_on_size, sizeof(int));
+  if (m->ti[m->ti_size].is_on == NULL) abort();
+  m->ti[m->ti_size].poll_id = -1;
+  m->ti_size++;
+}
+
+void remove_tracer(multi_t *m, int t)
+{
+  free(m->ti[t].is_on);
+  shutdown(m->ti[t].s, SHUT_RDWR);
+  close(m->ti[t].s);
+  m->ti_size--;
+  memmove(&m->ti[t], &m->ti[t+1], (m->ti_size - t) * sizeof(ti_t));
+}
+
+int send_is_on(int socket, int number_of_events, int *is_on)
+{
+  int i;
+  char mt = 1;
+  if (socket_send(socket, &mt, 1) == -1 ||
+      socket_send(socket, &number_of_events, sizeof(int)) == -1) return -1;
+  for (i = 0; i < number_of_events; i++) {
+    int v = is_on[i] ? 1 : 0;
+    if (socket_send(socket, &v, sizeof(int)) == -1) return -1;
+  }
+  return 0;
+}
+
+int read_tracee(int s, OBUF *ebuf, int *_type, int32_t *_length)
+{
+  int type;
+  int32_t length;
+  char *v;
+  int vpos = 0;
+
+  if (fullread(s, &length, 4) == -1) return -1;
+  if (ebuf->omaxsize < length) {
+    ebuf->omaxsize = (length + 65535) & ~65535;
+    ebuf->obuf = realloc(ebuf->obuf, ebuf->omaxsize);
+    if (ebuf->obuf == NULL) { printf("out of memory\n"); exit(1); }
+  }
+  v = ebuf->obuf;
+  memcpy(v+vpos, &length, 4);
+  vpos += 4;
+#ifdef T_SEND_TIME
+  if (fullread(s,v+vpos,sizeof(struct timespec))==-1) return -1;
+  vpos += sizeof(struct timespec);
+  length -= sizeof(struct timespec);
+#endif
+  if (fullread(s, &type, sizeof(int)) == -1) return -1;
+  memcpy(v+vpos, &type, sizeof(int));
+  vpos += sizeof(int);
+  length -= sizeof(int);
+  if (fullread(s, v+vpos, length) == -1) return -1;
+  vpos += length;
+
+  ebuf->osize = vpos;
+
+  *_type = type;
+  *_length = length;
+  return 0;
+}
+
+void forward_event(multi_t *m, int number_of_events, OBUF *ebuf, int type)
+{
+  int i;
+
+  if (type < 0 || type >= number_of_events)
+    { printf("error: bad type of event to forward %d\n", type); abort(); }
+
+  for (i = 0; i < m->ti_size; i++) {
+    if (!m->ti[i].is_on[type]) continue;
+    if (socket_send(m->ti[i].s, ebuf->obuf, ebuf->osize) == -1)
+      printf("warning: error forwarding event to tracer %d\n", m->ti[i].id);
+  }
+}
+
+int connect_to_tracee(char *ip, int port, int number_of_events, int *is_on)
+{
+  int s;
+
+  printf("connecting to %s:%d\n", ip, port);
+
+  s = try_connect_to(ip, port);
+  if (s == -1) return -1;
+
+  if (send_is_on(s, number_of_events, is_on) == -1) {
+    shutdown(s, SHUT_RDWR);
+    close(s);
+    return -1;
+  }
+
+  return s;
+}
+
+void usage(void)
+{
+  printf(
+"options:\n"
+"    -d <database file>        this option is mandatory\n"
+"    -ip <host>                connect to given IP address (default %s)\n"
+"    -p <port>                 connect to given port (default %d)\n"
+"    -lp <port>                listen on local port (default %d)\n",
+  DEFAULT_REMOTE_IP,
+  DEFAULT_REMOTE_PORT,
+  DEFAULT_LOCAL_PORT
+  );
+  exit(1);
+}
+
+int main(int n, char **v)
+{
+  char *database_filename = NULL;
+  void *database;
+  char *ip = DEFAULT_REMOTE_IP;
+  int  port = DEFAULT_REMOTE_PORT;
+  int  local_port = DEFAULT_LOCAL_PORT;
+  int  *is_on;
+  int  number_of_events;
+  int  i, j;
+  char *T_messages_txt;
+  int  T_messages_txt_len;
+  int  l;           /* listen socket for tracers' connections */
+  int  s = -1;      /* socket connected to tracee. -1 if not connected */
+  multi_t m;
+  int is_on_changed;
+  int current_nfd;
+  struct pollfd *fds = NULL;
+  int next_id = 0;
+
+  memset(&m, 0, sizeof(m));
+
+  /* write on a socket fails if the other end is closed and we get SIGPIPE */
+  if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort();
+
+  for (i = 1; i < n; i++) {
+    if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
+    if (!strcmp(v[i], "-d"))
+      { if (i > n-2) usage(); database_filename = v[++i]; continue; }
+    if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; }
+    if (!strcmp(v[i], "-p"))
+      { if (i > n-2) usage(); port = atoi(v[++i]); continue; }
+    if (!strcmp(v[i], "-lp"))
+      { if (i > n-2) usage(); local_port = atoi(v[++i]); continue; }
+    usage();
+  }
+
+  if (database_filename == NULL) {
+    printf("ERROR: provide a database file (-d)\n");
+    exit(1);
+  }
+
+  database = parse_database(database_filename);
+
+  load_config_file(database_filename);
+  get_local_config(&T_messages_txt, &T_messages_txt_len);
+
+  number_of_events = number_of_ids(database);
+  is_on = calloc(number_of_events, sizeof(int));
+  if (is_on == NULL) abort();
+
+  /* create listener socket */
+  l = create_listen_socket("0.0.0.0", local_port);
+
+  OBUF ebuf = { osize: 0, omaxsize: 0, obuf: NULL };
+
+  current_nfd = 0;
+
+  while (1) {
+    int nfd;
+    int timeout;
+
+    if (s == -1) s = connect_to_tracee(ip, port, number_of_events, is_on);
+
+    /* poll on s (if there), l, and all tracers' sockets */
+    nfd = 1 + (s != -1) + m.ti_size;
+    if (nfd != current_nfd) {
+      current_nfd = nfd;
+      free(fds);
+      fds = calloc(nfd, sizeof(struct pollfd));
+      if (fds == NULL) { perror("calloc"); exit(1); }
+    }
+    i = 0;
+    fds[i].fd = l;
+    fds[i].events = POLLIN;
+    i++;
+    if (s != -1) {
+      fds[i].fd = s;
+      fds[i].events = POLLIN;
+      i++;
+    }
+    for (j = 0; j < m.ti_size; j++) {
+      m.ti[j].poll_id = i;
+      fds[i].fd = m.ti[j].s;
+      fds[i].events = POLLIN;
+      i++;
+    }
+    if (s == -1) timeout = 1000; else timeout = -1;
+    if (poll(fds, nfd, timeout) == -1) { perror("poll"); exit(1); }
+
+    if (fds[0].revents & ~POLLIN) {
+      printf("TODO: error on listen socket?\n");
+      exit(1);
+    }
+
+    /* new tracer connecting? */
+    if (fds[0].revents & POLLIN) {
+      int t;
+      printf("tracer %d connecting\n", next_id);
+      t = socket_accept(l);
+      if (t == -1) perror("accept");
+      else new_tracer(&m, t, number_of_events,
+                      T_messages_txt, T_messages_txt_len, next_id);
+      next_id++;
+    }
+
+    if (s != -1 && fds[1].revents & ~POLLIN) {
+      printf("TODO: error on tracee socket?\n");
+      exit(1);
+    }
+
+    /* data from tracee */
+    if (s != -1 && fds[1].revents & POLLIN) {
+      int type;
+      int32_t length;
+      if (read_tracee(s, &ebuf, &type, &length) == -1) {
+        clear_remote_config();
+        shutdown(s, SHUT_RDWR);
+        close(s);
+        s = -1;
+      } else {
+        if (type == -1)
+          append_received_config_chunk(ebuf.obuf+ebuf.osize-length, length);
+        else if (type == -2) verify_config();
+        else forward_event(&m, number_of_events, &ebuf, type);
+      }
+    }
+
+    /* status of each tracer */
+    is_on_changed = 0;
+    for (j = 0; j < m.ti_size; j++) {
+      int l;
+      int s;
+      int *t_is_on;
+      if (m.ti[j].poll_id == -1) continue;
+      i = m.ti[j].poll_id;
+      s = m.ti[j].s;
+      t_is_on = m.ti[j].is_on;
+      if (fds[i].revents & (POLLHUP | POLLERR)) goto tracer_error;
+      /* error? */
+      if (fds[i].revents & ~POLLIN) {
+        printf("TODO: error with tracer?\n");
+        exit(1);
+      }
+      /* data in */
+      if (fds[i].revents & POLLIN) {
+        char t;
+        int len;
+        int v;
+        if (fullread(s, &t, 1) != 1) goto tracer_error;
+        switch (t) {
+        case 0:
+          is_on_changed = 1;
+          if (fullread(s, &len, sizeof(int)) == -1) goto tracer_error;
+          for (l = 0; l < len; l++) {
+            if (fullread(s, &v, sizeof(int)) == -1) goto tracer_error;
+            if (v < 0 || v >= number_of_events) goto tracer_error;
+            t_is_on[v] = 1 - t_is_on[v];
+            set_is_on(is_on, v, t_is_on[v]);
+          }
+          break;
+        case 1:
+          is_on_changed = 1;
+          if (fullread(s, &len, sizeof(int)) == -1) goto tracer_error;
+          if (len < 0 || len > number_of_events) goto tracer_error;
+          for (l = 0; l < len; l++) {
+            if (fullread(s, &v, sizeof(int)) == -1) goto tracer_error;
+            if (v < 0 || v > 1) goto tracer_error;
+            if (t_is_on[l] != v) set_is_on(is_on, l, v);
+            t_is_on[l] = v;
+          }
+          break;
+        case 2: break;
+        default: printf("error: unhandled message type %d\n", t); //abort();
+        }
+      }
+      continue;
+tracer_error:
+      printf("remove tracer %d\n", m.ti[j].id);
+      for (l = 0; l < number_of_events; l++)
+        if (m.ti[j].is_on[l]) { is_on_changed = 1; set_is_on(is_on, l, 0); }
+      remove_tracer(&m, j);
+      j--;
+    }
+    if (is_on_changed && s != -1)
+      if (send_is_on(s, number_of_events, is_on) == -1) {
+        clear_remote_config();
+        shutdown(s, SHUT_RDWR);
+        close(s);
+        s = -1;
+      }
+  }
+
+  return 0;
+}
diff --git a/common/utils/T/tracer/to_vcd.c b/common/utils/T/tracer/to_vcd.c
index 1a67a9d4ffa6b631c59f9246516d61fe8e0efb12..998649af01543a531193640112832731657082d9 100644
--- a/common/utils/T/tracer/to_vcd.c
+++ b/common/utils/T/tracer/to_vcd.c
@@ -12,7 +12,14 @@
 #include "logger/logger.h"
 #include "view/view.h"
 
+enum var_type {
+  DEFAULT,
+  VCD_FUNCTION,
+  VCD_VARIABLE
+};
+
 typedef struct {
+  enum var_type type;
   char *event;
   char *arg;
   char *vcd_name;
@@ -44,16 +51,39 @@ void vcd_write_header(vcd_vars *v, int n)
 "$version\n"
 "  to_vcd\n"
 "$end\n"
-"$timescale 1ns $end\n"
+"$timescale 1ns $end\n") <= 0) abort();
+
+  if (fprintf(out,
 "$scope module logic $end\n") <= 0) abort();
+  for (i = 0; i < n; i++)
+    if (v[i].type == DEFAULT)
+      if (fprintf(out, "$var wire %d %s %s $end\n",
+             v[i].boolean ? 1 : 64,
+             v[i].vcd_name, v[i].vcd_name) <= 0) abort();
+  if (fprintf(out,
+"$upscope $end\n") <= 0) abort();
 
+  if (fprintf(out,
+"$scope module functions $end\n") <= 0) abort();
+  for (i = 0; i < n; i++)
+    if (v[i].type == VCD_FUNCTION)
+      if (fprintf(out, "$var wire %d %s %s $end\n",
+             v[i].boolean ? 1 : 64,
+             v[i].vcd_name, v[i].vcd_name) <= 0) abort();
+  if (fprintf(out,
+"$upscope $end\n") <= 0) abort();
+
+  if (fprintf(out,
+"$scope module variables $end\n") <= 0) abort();
   for (i = 0; i < n; i++)
-    if (fprintf(out, "$var wire %d %s %s $end\n",
-           v[i].boolean ? 1 : 64,
-           v[i].vcd_name, v[i].vcd_name) <= 0) abort();
+    if (v[i].type == VCD_VARIABLE)
+      if (fprintf(out, "$var wire %d %s %s $end\n",
+             v[i].boolean ? 1 : 64,
+             v[i].vcd_name, v[i].vcd_name) <= 0) abort();
+  if (fprintf(out,
+"$upscope $end\n") <= 0) abort();
 
   if (fprintf(out,
-"$upscope $end\n"
 "$enddefinitions $end\n"
 "$dumpvars\n") <= 0) abort();
 
@@ -194,12 +224,13 @@ void force_stop(int x)
 }
 
 vcd_vars *add_var(vcd_vars *vars, int nvars,
-    char *event, char *arg, char *vcd_name, int is_boolean)
+    char *event, char *arg, char *vcd_name, int is_boolean, enum var_type t)
 {
   if (nvars % 64 == 0) {
     vars = realloc(vars, (nvars+64) * sizeof(vcd_vars));
     if (vars == NULL) abort();
   }
+  vars[nvars].type = t;
   vars[nvars].event = event;
   vars[nvars].arg = arg;
   vars[nvars].vcd_name = vcd_name;
@@ -240,7 +271,7 @@ int main(int n, char **v)
       char *event    = v[++i];
       char *arg      = v[++i];
       char *vcd_name = v[++i];
-      vars = add_var(vars, nvars, event, arg, vcd_name, 1);
+      vars = add_var(vars, nvars, event, arg, vcd_name, 1, DEFAULT);
       nvars++;
       continue;
     }
@@ -248,7 +279,7 @@ int main(int n, char **v)
       char *event    = v[++i];
       char *arg      = v[++i];
       char *vcd_name = v[++i];
-      vars = add_var(vars, nvars, event, arg, vcd_name, 0);
+      vars = add_var(vars, nvars, event, arg, vcd_name, 0, DEFAULT);
       nvars++;
       continue;
     }
@@ -283,20 +314,30 @@ int main(int n, char **v)
     /* activate all VCD traces */
     for (i = 0; i < number_of_events; i++) {
       int is_boolean;
+      enum var_type type;
       int prefix_length;
       char *name = event_name_from_id(database, i);
+      char *vcd_name;
       char *var_prefix = "VCD_VARIABLE_";
       char *fun_prefix = "VCD_FUNCTION_";
       if (!strncmp(name, var_prefix, strlen(var_prefix))) {
         prefix_length = strlen(var_prefix);
         is_boolean = 0;
+        type = VCD_VARIABLE;
       } else if (!strncmp(name, fun_prefix, strlen(fun_prefix))) {
         prefix_length = strlen(fun_prefix);
         is_boolean = 1;
+        type = VCD_FUNCTION;
       } else
         continue;
+      vcd_name = event_vcd_name_from_id(database, i);
+      if (vcd_name == NULL) {
+        vcd_name = name+prefix_length;
+        printf("WARNING: ID %s does not define VCD_NAME in the file %s, using %s\n",
+              name, database_filename, vcd_name);
+      }
       vars = add_var(vars, nvars,
-          name, "value", name+prefix_length, is_boolean);
+          name, "value", vcd_name, is_boolean, type);
       nvars++;
     }
   }
diff --git a/common/utils/T/tracer/ue.c b/common/utils/T/tracer/ue.c
index 6a7d03c897357c5e0d2cbbe07239fcb2bf2ebcfc..7b03210cd2cb3d7884fa57c6531e08d58a3aa141 100644
--- a/common/utils/T/tracer/ue.c
+++ b/common/utils/T/tracer/ue.c
@@ -857,6 +857,7 @@ int main(int n, char **v)
 
 restart:
   clear_remote_config();
+  if (ue_data.socket != -1) close(ue_data.socket);
   ue_data.socket = connect_to(ip, port);
 
   /* send the first message - activate selected traces */
diff --git a/common/utils/T/tracer/utils.c b/common/utils/T/tracer/utils.c
index 507154673538a4570c058f1af5ecf4db8771871d..7f58b6f5aa0061189d01a5107d8e6dcea035138a 100644
--- a/common/utils/T/tracer/utils.c
+++ b/common/utils/T/tracer/utils.c
@@ -79,6 +79,36 @@ list *list_append(list *l, void *data)
 /* socket                                                                   */
 /****************************************************************************/
 
+int create_listen_socket(char *addr, int port)
+{
+  struct sockaddr_in a;
+  int s;
+  int v;
+
+  s = socket(AF_INET, SOCK_STREAM, 0);
+  if (s == -1) { perror("socket"); exit(1); }
+  v = 1;
+  if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(int)))
+    { perror("setsockopt"); exit(1); }
+
+  a.sin_family = AF_INET;
+  a.sin_port = htons(port);
+  a.sin_addr.s_addr = inet_addr(addr);
+
+  if (bind(s, (struct sockaddr *)&a, sizeof(a))) { perror("bind"); exit(1); }
+  if (listen(s, 5)) { perror("listen"); exit(1); }
+
+  return s;
+}
+
+int socket_accept(int s)
+{
+  struct sockaddr_in a;
+  socklen_t alen;
+  alen = sizeof(a);
+  return accept(s, (struct sockaddr *)&a, &alen);
+}
+
 int socket_send(int socket, void *buffer, int size)
 {
   char *x = buffer;
@@ -94,26 +124,13 @@ int socket_send(int socket, void *buffer, int size)
 
 int get_connection(char *addr, int port)
 {
-  struct sockaddr_in a;
-  socklen_t alen;
   int s, t;
 
   printf("waiting for connection on %s:%d\n", addr, port);
 
-  s = socket(AF_INET, SOCK_STREAM, 0);
-  if (s == -1) { perror("socket"); exit(1); }
-  t = 1;
-  if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &t, sizeof(int)))
-    { perror("setsockopt"); exit(1); }
-
-  a.sin_family = AF_INET;
-  a.sin_port = htons(port);
-  a.sin_addr.s_addr = inet_addr(addr);
+  s = create_listen_socket(addr, port);
 
-  if (bind(s, (struct sockaddr *)&a, sizeof(a))) { perror("bind"); exit(1); }
-  if (listen(s, 5)) { perror("bind"); exit(1); }
-  alen = sizeof(a);
-  t = accept(s, (struct sockaddr *)&a, &alen);
+  t = socket_accept(s);
   if (t == -1) { perror("accept"); exit(1); }
   close(s);
 
@@ -137,14 +154,11 @@ int fullread(int fd, void *_buf, int count)
   return ret;
 }
 
-int connect_to(char *addr, int port)
+int try_connect_to(char *addr, int port)
 {
   int s;
   struct sockaddr_in a;
 
-  printf("connecting to %s:%d\n", addr, port);
-
-again:
   s = socket(AF_INET, SOCK_STREAM, 0);
   if (s == -1) { perror("socket"); exit(1); }
 
@@ -155,6 +169,21 @@ again:
   if (connect(s, (struct sockaddr *)&a, sizeof(a)) == -1) {
     perror("connect");
     close(s);
+    return -1;
+  }
+
+  return s;
+}
+
+int connect_to(char *addr, int port)
+{
+  int s;
+
+  printf("connecting to %s:%d\n", addr, port);
+
+again:
+  s = try_connect_to(addr, port);
+  if (s == -1) {
     printf("trying again in 1s\n");
     sleep(1);
     goto again;
diff --git a/common/utils/T/tracer/utils.h b/common/utils/T/tracer/utils.h
index 3be6cfe1a7f67af65282d7494c7d1a172fc163d7..6784117fa6cf66d3ffc33e191924f385dacc888d 100644
--- a/common/utils/T/tracer/utils.h
+++ b/common/utils/T/tracer/utils.h
@@ -24,11 +24,14 @@ list *list_append(list *l, void *data);
 #define DEFAULT_REMOTE_IP "127.0.0.1"
 #define DEFAULT_REMOTE_PORT 2021
 
+int create_listen_socket(char *addr, int port);
+int socket_accept(int s);
 /* socket_send: return 0 if okay, -1 on error */
 int socket_send(int socket, void *buffer, int size);
 int get_connection(char *addr, int port);
 /* fullread: return length read if okay (that is: 'count'), -1 on error */
 int fullread(int fd, void *_buf, int count);
+int try_connect_to(char *addr, int port);
 int connect_to(char *addr, int port);
 
 /****************************************************************************/
diff --git a/common/utils/itti/intertask_interface.c b/common/utils/itti/intertask_interface.c
index 2e38b660d7e9256d4de3c88ab6acffe9186b7561..d088b59c041b8abeaf2408f0369a98588574537a 100644
--- a/common/utils/itti/intertask_interface.c
+++ b/common/utils/itti/intertask_interface.c
@@ -745,7 +745,7 @@ void itti_exit_task(void)
 
 #if defined(OAI_EMU) || defined(RTAI)
   if (task_id > TASK_UNKNOWN) {
-    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLE_ITTI_RECV_MSG,
+    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_ITTI_RECV_MSG,
                                             __sync_and_and_fetch (&itti_desc.vcd_receive_msg, ~(1L << task_id)));
   }
 #endif
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
index a693cb55e4ce0a0922520b28b7540963458061cf..50b09102d88857b2b1a2cabf439e2e81a28f2d70 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
@@ -40,8 +40,14 @@
 #include<math.h>
 #include <stdlib.h>
 #include <string.h>
+#include <linux/version.h>
+#if RHEL_RELEASE_CODE >= 1796
+#include <lapacke/lapacke_utils.h>
+#include <lapacke/lapacke.h>
+#else
 #include <lapacke_utils.h>
 #include <lapacke.h>
+#endif
 #include <cblas.h>
 #include "linear_preprocessing_rec.h"
 
diff --git a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
index d85d440193757044eedadaf820ef4d46b47eddb6..7d063e326effc919180e5ebe12c02fa19d85b6a2 100644
--- a/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
+++ b/openair1/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
@@ -13,9 +13,14 @@ data storage. */
 #include <stdlib.h>
 #include <cblas.h>
 #include <string.h>
+#include <linux/version.h>
+#if RHEL_RELEASE_CODE >= 1796
+#include <lapacke/lapacke_utils.h>
+#include <lapacke/lapacke.h>
+#else
 #include <lapacke_utils.h>
 #include <lapacke.h>
-
+#endif
 //#define DEBUG_PREPROC
 
 
@@ -366,4 +371,4 @@ float sqrt_float(float x, float sqrt_x)
 {
   sqrt_x = (float)(sqrt((double)(x)));
   return sqrt_x;
-}
\ No newline at end of file
+}
diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index 9f2b4137a421688bbbfd985a7021e103c92ea493..7591bc3d07dd9b9ac2a80f7513f2ed37e95d7ae5 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -2355,12 +2355,12 @@ int RCconfig_S1(MessageDef *msg_p, uint32_t i) {
 #endif
 	      } 
 	      if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv4") == 0) {
-		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv4 = 1;
+		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1;
 	      } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "ipv6") == 0) {
-		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv6 = 1;
+		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1;
 	      } else if (strcmp(*(S1ParamList.paramarray[l][ENB_MME_IP_ADDRESS_PREFERENCE_IDX].strptr), "no") == 0) {
-		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv4 = 1;
-		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[j].ipv6 = 1;
+		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv4 = 1;
+		S1AP_REGISTER_ENB_REQ (msg_p).mme_ip_address[l].ipv6 = 1;
 	      }
 	    }
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
index 05498e4377b0abb24a883da61da4a027cebed93c..df52b83d729b4087ba4d137da71bfcb339440252 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
@@ -386,6 +386,7 @@ set_ul_DAI(int module_idP, int UE_idP, int CC_idP, int frameP,
         UE_list->UE_template[CC_idP][UE_idP].DAI_ul[3] = DAI;
         break;
       }
+      break;
 
     case 2:
       //      if ((subframeP==3)||(subframeP==8))
diff --git a/openair2/NETWORK_DRIVER/MESH/device.c b/openair2/NETWORK_DRIVER/MESH/device.c
index f8a420697a95d043d2f5870d2c55ca8279567ed5..f5d31742bc400c4cc055d8950ae633c65b9beec0 100644
--- a/openair2/NETWORK_DRIVER/MESH/device.c
+++ b/openair2/NETWORK_DRIVER/MESH/device.c
@@ -324,7 +324,11 @@ static const struct net_device_ops nasmesh_netdev_ops = {
   .ndo_set_mac_address  = NULL,
   .ndo_set_config     = nas_set_config,
   .ndo_do_ioctl       = nas_CTL_ioctl,
+#if RHEL_RELEASE_CODE>=1797
+  .extended.ndo_change_mtu   = nas_change_mtu,
+#else
   .ndo_change_mtu   = nas_change_mtu,
+#endif
   .ndo_tx_timeout   = nas_tx_timeout,
 };
 
diff --git a/openair2/NETWORK_DRIVER/UE_IP/device.c b/openair2/NETWORK_DRIVER/UE_IP/device.c
index d9a91496859a70cb62c4d699206ce5178f259dfe..47c820fe775330dd0aa9de35052667f31e4b0266 100644
--- a/openair2/NETWORK_DRIVER/UE_IP/device.c
+++ b/openair2/NETWORK_DRIVER/UE_IP/device.c
@@ -349,7 +349,11 @@ static const struct net_device_ops ue_ip_netdev_ops = {
   .ndo_set_mac_address    = ue_ip_set_mac_address,
   .ndo_set_config         = ue_ip_set_config,
   .ndo_do_ioctl           = NULL,
-  .ndo_change_mtu         = ue_ip_change_mtu,
+#if RHEL_RELEASE_CODE>=1797
+  .extended.ndo_change_mtu         = ue_ip_change_mtu,
+#else
+  .ndo_change_mtu   = ue_ip_change_mtu,
+#endif
   .ndo_tx_timeout         = ue_ip_tx_timeout,
   .ndo_change_rx_flags    = ue_ip_change_rx_flags,
 };
diff --git a/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1 b/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1
index db1f1b59150a5d17de2764d473ddd2627dc91d23..97d0a6de871ff1b8c4dd48a45df457f7d423223a 100755
--- a/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1
+++ b/openair3/S1AP/MESSAGES/ASN1/R15/s1ap-15.2.0.asn1
@@ -6881,3 +6881,201 @@ id-EDT-Session										ProtocolIE-ID ::= 281
 id-CNTypeRestrictions								ProtocolIE-ID ::= 282
 
 END
+
+-- **************************************************************
+--
+-- Container definitions
+--
+-- **************************************************************
+
+S1AP-Containers {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) 
+eps-Access (21) modules (3) s1ap (1) version1 (1) s1ap-Containers (5) }
+
+DEFINITIONS AUTOMATIC TAGS ::= 
+
+BEGIN
+
+-- **************************************************************
+--
+-- IE parameter types from other modules.
+--
+-- **************************************************************
+
+IMPORTS
+	Criticality,
+	Presence,
+	PrivateIE-ID,
+	ProtocolExtensionID,
+	ProtocolIE-ID
+FROM S1AP-CommonDataTypes
+
+	maxPrivateIEs,
+	maxProtocolExtensions,
+	maxProtocolIEs
+FROM S1AP-Constants;
+
+-- **************************************************************
+--
+-- Class Definition for Protocol IEs
+--
+-- **************************************************************
+
+S1AP-PROTOCOL-IES ::= CLASS {
+	&id				ProtocolIE-ID 					UNIQUE,
+	&criticality	Criticality,
+	&Value,
+	&presence		Presence
+}
+WITH SYNTAX {
+	ID				&id
+	CRITICALITY		&criticality
+	TYPE			&Value
+	PRESENCE		&presence
+}
+
+-- **************************************************************
+--
+-- Class Definition for Protocol IEs
+--
+-- **************************************************************
+
+S1AP-PROTOCOL-IES-PAIR ::= CLASS {
+	&id					ProtocolIE-ID 				UNIQUE,
+	&firstCriticality	Criticality,
+	&FirstValue,
+	&secondCriticality	Criticality,
+	&SecondValue,
+	&presence			Presence
+}
+WITH SYNTAX {
+	ID				&id
+	FIRST CRITICALITY		&firstCriticality
+	FIRST TYPE				&FirstValue
+	SECOND CRITICALITY		&secondCriticality
+	SECOND TYPE				&SecondValue
+	PRESENCE				&presence
+}
+
+-- **************************************************************
+--
+-- Class Definition for Protocol Extensions
+--
+-- **************************************************************
+
+S1AP-PROTOCOL-EXTENSION ::= CLASS {
+	&id				ProtocolExtensionID			UNIQUE,
+	&criticality	Criticality,
+	&Extension,
+	&presence		Presence
+}
+WITH SYNTAX {
+	ID				&id
+	CRITICALITY		&criticality
+	EXTENSION		&Extension
+	PRESENCE		&presence
+}
+
+-- **************************************************************
+--
+-- Class Definition for Private IEs
+--
+-- **************************************************************
+
+S1AP-PRIVATE-IES ::= CLASS {
+	&id				PrivateIE-ID,
+	&criticality	Criticality,
+	&Value,
+	&presence		Presence
+}
+WITH SYNTAX {
+	ID				&id
+	CRITICALITY		&criticality
+	TYPE			&Value
+	PRESENCE		&presence
+}
+
+-- **************************************************************
+--
+-- Container for Protocol IEs
+--
+-- **************************************************************
+
+ProtocolIE-Container {S1AP-PROTOCOL-IES : IEsSetParam} ::= 
+	SEQUENCE (SIZE (0..maxProtocolIEs)) OF
+	ProtocolIE-Field {{IEsSetParam}}
+
+ProtocolIE-SingleContainer {S1AP-PROTOCOL-IES : IEsSetParam} ::= 
+	ProtocolIE-Field {{IEsSetParam}}
+
+ProtocolIE-Field {S1AP-PROTOCOL-IES : IEsSetParam} ::= SEQUENCE {
+	id				S1AP-PROTOCOL-IES.&id				({IEsSetParam}),
+	criticality		S1AP-PROTOCOL-IES.&criticality		({IEsSetParam}{@id}),
+	value			S1AP-PROTOCOL-IES.&Value			({IEsSetParam}{@id})
+}
+
+-- **************************************************************
+--
+-- Container for Protocol IE Pairs
+--
+-- **************************************************************
+
+ProtocolIE-ContainerPair {S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= 
+	SEQUENCE (SIZE (0..maxProtocolIEs)) OF
+	ProtocolIE-FieldPair {{IEsSetParam}}
+
+ProtocolIE-FieldPair {S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::= SEQUENCE {
+	id					S1AP-PROTOCOL-IES-PAIR.&id					({IEsSetParam}),
+	firstCriticality	S1AP-PROTOCOL-IES-PAIR.&firstCriticality	({IEsSetParam}{@id}),
+	firstValue			S1AP-PROTOCOL-IES-PAIR.&FirstValue			({IEsSetParam}{@id}),
+	secondCriticality	S1AP-PROTOCOL-IES-PAIR.&secondCriticality	({IEsSetParam}{@id}),
+	secondValue			S1AP-PROTOCOL-IES-PAIR.&SecondValue		({IEsSetParam}{@id})
+}
+
+-- **************************************************************
+--
+-- Container Lists for Protocol IE Containers
+--
+-- **************************************************************
+
+ProtocolIE-ContainerList {INTEGER : lowerBound, INTEGER : upperBound, S1AP-PROTOCOL-IES : IEsSetParam} ::=
+	SEQUENCE (SIZE (lowerBound..upperBound)) OF
+	ProtocolIE-SingleContainer {{IEsSetParam}}
+
+ProtocolIE-ContainerPairList {INTEGER : lowerBound, INTEGER : upperBound, S1AP-PROTOCOL-IES-PAIR : IEsSetParam} ::=
+	SEQUENCE (SIZE (lowerBound..upperBound)) OF
+	ProtocolIE-ContainerPair {{IEsSetParam}}
+
+-- **************************************************************
+--
+-- Container for Protocol Extensions
+--
+-- **************************************************************
+
+ProtocolExtensionContainer {S1AP-PROTOCOL-EXTENSION : ExtensionSetParam} ::= 
+	SEQUENCE (SIZE (1..maxProtocolExtensions)) OF
+	ProtocolExtensionField {{ExtensionSetParam}}
+
+ProtocolExtensionField {S1AP-PROTOCOL-EXTENSION : ExtensionSetParam} ::= SEQUENCE {
+	id					S1AP-PROTOCOL-EXTENSION.&id				({ExtensionSetParam}),
+	criticality			S1AP-PROTOCOL-EXTENSION.&criticality	({ExtensionSetParam}{@id}),
+	extensionValue		S1AP-PROTOCOL-EXTENSION.&Extension		({ExtensionSetParam}{@id})
+}
+
+-- **************************************************************
+--
+-- Container for Private IEs
+--
+-- **************************************************************
+
+PrivateIE-Container {S1AP-PRIVATE-IES : IEsSetParam } ::= 
+	SEQUENCE (SIZE (1.. maxPrivateIEs)) OF
+	PrivateIE-Field {{IEsSetParam}}
+
+PrivateIE-Field {S1AP-PRIVATE-IES : IEsSetParam} ::= SEQUENCE {
+	id					S1AP-PRIVATE-IES.&id				({IEsSetParam}),
+	criticality			S1AP-PRIVATE-IES.&criticality		({IEsSetParam}{@id}),
+	value				S1AP-PRIVATE-IES.&Value				({IEsSetParam}{@id})
+}
+
+END
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 699bc7f56b9f46e7e2505135fc4d2c89dea91bed..e84f99e67f4126d2a6ee8b0efe49099a12022a34 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -1131,13 +1131,6 @@ int main( int argc, char **argv )
   
   rt_sleep_ns(10*100000000ULL);
 
-  if (nfapi_mode) {
-
-    printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n");
-    pthread_cond_init(&sync_cond,NULL);
-    pthread_mutex_init(&sync_mutex, NULL);
-  }
-  
   if (nfapi_mode)
   {
     printf("NFAPI*** - mutex and cond created - will block shortly for completion of PNF connection\n");