diff --git a/CoLo-AT/data_analysis/__pycache__/data_analyzer.cpython-36.pyc b/CoLo-AT/data_analysis/__pycache__/data_analyzer.cpython-36.pyc
index 9b93370356b5023e51bb249b484f896ee3e248c1..9099e8d5a14e68fe056753339e4b41849ba094a8 100644
Binary files a/CoLo-AT/data_analysis/__pycache__/data_analyzer.cpython-36.pyc and b/CoLo-AT/data_analysis/__pycache__/data_analyzer.cpython-36.pyc differ
diff --git a/CoLo-AT/dataset_manager/__pycache__/realworld_dataset_manager.cpython-36.pyc b/CoLo-AT/dataset_manager/__pycache__/realworld_dataset_manager.cpython-36.pyc
index 018cc86e57a4288f0eae01ff5857953b2fb5c0b1..5ed681eb5c3773249ce5512ba5e08b9c1e174c34 100644
Binary files a/CoLo-AT/dataset_manager/__pycache__/realworld_dataset_manager.cpython-36.pyc and b/CoLo-AT/dataset_manager/__pycache__/realworld_dataset_manager.cpython-36.pyc differ
diff --git a/CoLo-AT/dataset_manager/realworld_dataset_manager.py b/CoLo-AT/dataset_manager/realworld_dataset_manager.py
index ea3221235f053b7913a3a1d73859f0191cc4976e..b52738571bcbcfca8ba1f015367f78f2eda62de3 100755
--- a/CoLo-AT/dataset_manager/realworld_dataset_manager.py
+++ b/CoLo-AT/dataset_manager/realworld_dataset_manager.py
@@ -23,7 +23,6 @@ def find_nearest_time_idx(l, value):
         return None
 
 
-
 def find_next_time_idx(array, start_idx, value):
     i = start_idx
     try:
@@ -455,3 +454,9 @@ class RW_Dataset_Manager:
 
         return valid_respond, current_time, req
 
+    def get_robot_groundtruth(self, gt_time, robot_index):
+        gt_time_idx = find_nearest_time_idx(self.time_arr['groundtruth'][robot_index], gt_time) 
+        gt = self.groundtruth_data[robot_index][gt_time_idx]
+
+        return gt
+
diff --git a/CoLo-AT/simulation_process/__pycache__/sim_manager.cpython-36.pyc b/CoLo-AT/simulation_process/__pycache__/sim_manager.cpython-36.pyc
index d643fa9309460c81f3c936277613a0a4947439ee..2abcfecd1515e8497a8c7f92566c428ba0bfdf5e 100644
Binary files a/CoLo-AT/simulation_process/__pycache__/sim_manager.cpython-36.pyc and b/CoLo-AT/simulation_process/__pycache__/sim_manager.cpython-36.pyc differ
diff --git a/CoLo-AT/simulation_process/sim_manager.py b/CoLo-AT/simulation_process/sim_manager.py
index c4bf8c4b80802d0830f9728bf1f683f2f71e483b..6bf24cae28d550a2a28a19e0c37dfaf3e75659b9 100644
--- a/CoLo-AT/simulation_process/sim_manager.py
+++ b/CoLo-AT/simulation_process/sim_manager.py
@@ -14,11 +14,38 @@ class SimulationManager():
 	def __init__(self, name):
 		self.name = name
 
-	def sim_process_native(self, robot_labels, dm, robot_system, state_recorder, comm = True, simple_plot = False):
+	def comm_controller(self, rbt_idx, num_robots):
+		receiver_idx = rbt_idx
+		sender_idx = (rbt_idx+1)%(num_robots)
+
+		return receiver_idx, sender_idx
+
+	def simulated_communication(self, receiver_status, sender_status):
+		max_range = 5 # in meters
+		threshold = 0.2
+
+		[receiver_idx, receiver_gt] = receiver_status
+		[sender_idx, sender_gt] = sender_status
+		
+		r_x, r_y = receiver_gt['x_pos'], receiver_gt['y_pos']
+		s_x, s_y = sender_gt['x_pos'], sender_gt['y_pos']
+		dis = math.sqrt((r_x-s_x)**2+(r_y-s_y)**2)
+
+		mean = math.exp(-1.5*dis)
+		std = math.exp(-0.5*dis)
+
+		if numpy.random.normal(mean, std) > threshold:
+			return True
+		else:
+			return False
+
+
+	def sim_process_native(self, robot_labels, dm, robot_system, state_recorder, simulated_comm = True, comm = True, simple_plot = False):
 		#dm: dataset manager 
 		print('******** Simulation Process Started! ********')
 		print('communication: ', comm)
 		self.robot_labels = robot_labels
+		self.robot_system = robot_system
 		
 		start_time = dm.get_start_time()
 		duration = dm.get_duration()
@@ -44,7 +71,7 @@ class SimulationManager():
 			if self.time  < prev_time:
 				print('Time inconsistant!')
 				break
-			if valid ==  False :
+			if valid == False :
 				break 
 			robot_state = robot_system.localization_update(rsp)
 			state_var.append(robot_state['state variance'])
@@ -53,18 +80,26 @@ class SimulationManager():
 			# communication protocall
 			if comm:
 				if rsp.get_type()=='measurement':
+
 					rbt_idx = rsp.get_robot_index()
-					comm_rsp = request_response.Comm_req_resp(self.time, rbt_idx)
-					message = comm_rsp.get_message()
-					sender_idx = (rbt_idx+1)%(robot_system.num_robots)
-					sender_id = robot_labels[sender_idx]
-					message['data'] = {'subject_ID':sender_id}
-					message['groundtruth'] = rsp.get_groundtruth
-					comm_rsp.set_message(message)
-					
-					robot_state = robot_system.localization_update(comm_rsp)
-					state_var.append(robot_state['state variance'])
-					state_recorder.record_state(rsp, robot_state)
+					receiver_idx, sender_idx = self.comm_controller(rbt_idx, self.robot_system.num_robots)
+
+					receiver_gt = dm.get_robot_groundtruth(self.time, receiver_idx)
+					sender_gt = dm.get_robot_groundtruth(self.time, sender_idx)
+
+					if simulated_comm and self.simulated_communication([sender_idx, sender_gt], [receiver_idx, receiver_gt]):
+						# simulated communication 
+						comm_rsp = request_response.Comm_req_resp(self.time, receiver_idx)
+						message = comm_rsp.get_message()
+
+						sender_id = robot_labels[sender_idx]
+						message['data'] = {'subject_ID':sender_id}
+						message['groundtruth'] = rsp.get_groundtruth
+						comm_rsp.set_message(message)
+						
+						robot_state = robot_system.localization_update(comm_rsp)
+						state_var.append(robot_state['state variance'])
+						state_recorder.record_state(rsp, robot_state)
 					
 		if simple_plot:
 			state_recorder.simple_plot(plot_title=self.name)
@@ -81,6 +116,7 @@ class SimulationManager():
 		print('******** Simulation Process Started! ********')
 		req_type_list = ['odometry', 'measurement', 'communication']
 		self.robot_labels = robot_labels
+		self.robot_system = robot_system
 		
 		start_time = dm.get_start_time()
 		duration = dm.get_duration()
diff --git a/CoLo-AT/test_simulation.py b/CoLo-AT/test_simulation.py
index 405984feb153998c5efc24efb195059a6215fad5..4466974040999ed47759ec8a92c3881b11a76be5 100644
--- a/CoLo-AT/test_simulation.py
+++ b/CoLo-AT/test_simulation.py
@@ -20,7 +20,6 @@ from pprint import pprint
 
 # load algorithms 
 sys.path.append(os.path.join(os.path.dirname(__file__), "localization_algos"))
-
 from centralized_ekf import Centralized_EKF # works
 from simple_ekf import Simple_EKF
 from ekf_ls_bda import EKF_LS_BDA
@@ -41,14 +40,13 @@ start_time, starting_states, dataset_data, time_arr = testing_dataset.load_datas
 
 analyzer = Analyzer('analyzer', robot_labels)
 
-
 loc_algo = EKF_LS_BDA('algo')
 robot = RobotSystem('robot', robot_labels, loc_algo, distr_sys = False)
 
 sim = SimulationManager('sim LS-BDA')
-state_recorde_gs_ci = StatesRecorder('LS-BDA', robot_labels)
-sim.sim_process_native(robot_labels, testing_dataset, robot, state_recorde_gs_ci, simple_plot = True)
-loc_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorde_gs_ci, plot_graphs = True)
+state_recorder_bda = StatesRecorder('LS-BDA', robot_labels)
+sim.sim_process_native(robot_labels, testing_dataset, robot, state_recorder_bda, simple_plot = True)
+loc_err_per_run, trace_per_run, t_arr = analyzer.calculate_loc_err_and_trace_state_variance_per_run(state_recorder_bda, plot_graphs = True)
 
 ##############################################################################