diff --git a/include/QueryGenerator/EnhancedQueryGenerator.php b/include/QueryGenerator/EnhancedQueryGenerator.php
index d3d067ee547f2dfc98c786b156878123d43b427f..a9f8c3f9ba065812ef54467403cc216fca2c8499 100644
--- a/include/QueryGenerator/EnhancedQueryGenerator.php
+++ b/include/QueryGenerator/EnhancedQueryGenerator.php
@@ -829,6 +829,20 @@ class EnhancedQueryGenerator extends QueryGenerator {
 			$fieldSqlList[$index] = $fieldSql;
 		}
 
+		$currentUserModel = Users_Record_Model::getCurrentUserModel();
+		if(($baseModule == 'Calendar' || $baseModule == 'Events') && !$currentUserModel->isAdminUser()) {
+			$moduleFocus = CRMEntity::getInstance('Calendar');
+			$condition = $moduleFocus->buildWhereClauseConditionForCalendar();
+
+			if($condition) {
+				if($this->conditionInstanceCount > 0) {
+					$sql .= $condition.' AND ';
+				}else {
+					$sql .= ' AND '.$condition;
+				}
+			}
+		}
+
 		// This is needed as there can be condition in different order and there is an assumption in makeGroupSqlReplacements API
 		// that it expects the array in an order and then replaces the sql with its the corresponding place
 		ksort($fieldSqlList);
diff --git a/include/QueryGenerator/QueryGenerator.php b/include/QueryGenerator/QueryGenerator.php
index 737cafabe6a2dd304215bebdf544a368ca4feffa..c548e93969e119863fd0b3a9c2d1a6de8d43d219 100644
--- a/include/QueryGenerator/QueryGenerator.php
+++ b/include/QueryGenerator/QueryGenerator.php
@@ -919,6 +919,20 @@ class QueryGenerator {
 				$fieldSqlList[$index] = $fieldSql;
 			}
 		}
+
+		$currentUserModel = Users_Record_Model::getCurrentUserModel();
+		if(($baseModule == 'Calendar' || $baseModule == 'Events') && !$currentUserModel->isAdminUser()) {
+			$moduleFocus = CRMEntity::getInstance('Calendar');
+			$condition = $moduleFocus->buildWhereClauseConditionForCalendar();
+			if ($condition) {
+				if ($this->conditionInstanceCount > 0) {
+					$sql .= $condition . ' AND ';
+				} else {
+					$sql .= ' AND ' . $condition;
+				}
+			}
+		}
+		
 		// This is needed as there can be condition in different order and there is an assumption in makeGroupSqlReplacements API
 		// that it expects the array in an order and then replaces the sql with its the corresponding place
 		ksort($fieldSqlList);
diff --git a/modules/Accounts/models/Module.php b/modules/Accounts/models/Module.php
index bced04aa49c9d53b095d8c479517d9c0ce4a8f06..853d5e5fca447bfd61dbd7970210ba346ba98ed1 100644
--- a/modules/Accounts/models/Module.php
+++ b/modules/Accounts/models/Module.php
@@ -110,6 +110,14 @@ class Accounts_Module_Model extends Vtiger_Module_Model {
 			$nonAdminQuery = $this->getNonAdminAccessControlQueryForRelation($relatedModuleName);
 			if ($nonAdminQuery) {
 				$query = appendFromClauseToQuery($query, $nonAdminQuery);
+
+				if(trim($nonAdminQuery)) {
+					$relModuleFocus = CRMEntity::getInstance($relatedModuleName);
+					$condition = $relModuleFocus->buildWhereClauseConditionForCalendar();
+					if($condition) {
+						$query .= ' AND '.$condition;
+					}
+				}
 			}
 
 			// There could be more than one contact for an activity.
@@ -162,6 +170,14 @@ class Accounts_Module_Model extends Vtiger_Module_Model {
 					AND (vtiger_activity.status is NULL OR vtiger_activity.status NOT IN ('Completed', 'Deferred', 'Cancelled'))
 					AND (vtiger_activity.eventstatus is NULL OR vtiger_activity.eventstatus NOT IN ('Held', 'Cancelled'))";
 
+		if(!$currentUser->isAdminUser()) {
+			$moduleFocus = CRMEntity::getInstance('Calendar');
+			$condition = $moduleFocus->buildWhereClauseConditionForCalendar();
+			if($condition) {
+				$query .= ' AND '.$condition;
+			}
+		}
+
 		if ($mode === 'upcoming') {
 			$query .= " AND CASE WHEN vtiger_activity.activitytype='Task' THEN due_date >= '$currentDate' ELSE CONCAT(due_date,' ',time_end) >= '$nowInDBFormat' END";
 		} elseif ($mode === 'overdue') {
diff --git a/modules/Calendar/Activity.php b/modules/Calendar/Activity.php
index b384cfcd944984afdb3340b61ede59e4a60539d1..545cda9389e9853eaa715e8fb60857e3c6bc1d76 100644
--- a/modules/Calendar/Activity.php
+++ b/modules/Calendar/Activity.php
@@ -1052,21 +1052,22 @@ function insertIntoRecurringTable(& $recurObj)
 		$query = ' ';
 		$tabId = getTabid($module);
 		if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2]
-				== 1 && $defaultOrgSharingPermission[$tabId] == 3) {
-			$tableName = 'vt_tmp_u'.$user->id.'_t'.$tabId;
-			$sharingRuleInfoVariable = $module.'_share_read_permission';
-			$sharingRuleInfo = $$sharingRuleInfoVariable;
+				== 1) {
 			$sharedTabId = null;
-			$this->setupTemporaryTable($tableName, $sharedTabId, $user,
-					$current_user_parent_role_seq, $current_user_groups);
-
-			$sharedUsers = $this->getListViewAccessibleUsers($user->id);
-			// we need to include group id's in $sharedUsers list to get the current user's group records
-			if($current_user_groups){
-				$sharedUsers = $sharedUsers.','. implode(',',$current_user_groups);
-			}
-			$query = " INNER JOIN $tableName $tableName$scope ON ($tableName$scope.id = ".
-					"vtiger_crmentity$scope.smownerid and $tableName$scope.shared=0 and $tableName$scope.id IN ($sharedUsers)) ";
+			//For Events
+			$tableName = 'vt_tmp_u'.$user->id.'_t'.$tabId.'_events';
+			$this->setupTemporaryTableForEvents($tableName, $sharedTabId, $user,
+				$current_user_parent_role_seq, $current_user_groups);
+			$query = " LEFT JOIN $tableName $tableName$scope ON ($tableName$scope.id = ".
+				"vtiger_crmentity$scope.smownerid AND vtiger_activity.activitytype NOT IN ('Emails', 'Task')) ";
+
+			//For Task
+			$task_tableName = 'vt_tmp_u'.$user->id.'_t'.$tabId.'_task';
+			$this->setupTemporaryTableForTask($task_tableName, $tabId, $user,
+				$current_user_parent_role_seq, $current_user_groups, $defaultOrgSharingPermission[$tabId]);
+
+			$query .= " LEFT JOIN $task_tableName $task_tableName$scope ON ($task_tableName$scope.id = ".
+				"vtiger_crmentity$scope.smownerid AND vtiger_activity.activitytype = 'Task') ";
 		}
 		return $query;
 	}
@@ -1087,7 +1088,7 @@ function insertIntoRecurringTable(& $recurObj)
 		return $query;
 	}
 
-	protected function setupTemporaryTable($tableName, $tabId, $user, $parentRole, $userGroups) {
+	protected function setupTemporaryTableForEvents($tableName, $tabId, $user, $parentRole, $userGroups) {
 		$module = null;
 		if (!empty($tabId)) {
 			$module = getTabname($tabId);
@@ -1113,6 +1114,26 @@ function insertIntoRecurringTable(& $recurObj)
 		return false;
 	}
 
+	protected function setupTemporaryTableForTask($tableName, $tabId, $user, $parentRole, $userGroups, $sharingPermission) {
+		$module = null;
+		if (!empty($tabId)) {
+			$module = getTabname($tabId);
+		}
+
+		if($sharingPermission == 3) {
+			$query = $this->getNonAdminAccessQuery($module, $user, $parentRole, $userGroups);
+		} else {
+			$query = " (SELECT $user->id as id) UNION (SELECT id FROM vtiger_users "
+				. "WHERE vtiger_users.deleted=0 AND vtiger_users.status='Active') "
+				. "UNION (SELECT groupid FROM vtiger_groups)";
+		}
+
+		$query = "CREATE TEMPORARY TABLE IF NOT EXISTS $tableName(id INT(11) PRIMARY KEY, shared ".
+			"int(1) DEFAULT 0) IGNORE ".$query;
+		$db = PearDatabase::getInstance();
+		$db->pquery($query, array());
+	}
+
 	protected function getListViewAccessibleUsers($sharedid) {
 		$db = PearDatabase::getInstance();;
 		$query = "SELECT vtiger_users.id as userid FROM vtiger_sharedcalendar
@@ -1131,5 +1152,19 @@ function insertIntoRecurringTable(& $recurObj)
 		$shared_ids = implode(",",$userid);
 		return $shared_ids;
 	}
+
+	public function buildWhereClauseConditionForCalendar($scope = '') {
+		$userModel = Users_Record_Model::getCurrentUserModel();
+		require('user_privileges/user_privileges_'.$userModel->id.'.php');
+
+		$query = "";
+		if($profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1) {
+			$tabId = getTabid("Calendar");
+			$eventTempTable = 'vt_tmp_u'.$userModel->id.'_t'.$tabId.'_events'.$scope;
+			$taskTempTable = 'vt_tmp_u'.$userModel->id.'_t'.$tabId.'_task'.$scope;
+			$query = " ($eventTempTable.shared IS NOT NULL OR $taskTempTable.shared IS NOT NULL) ";
+		}
+		return $query;
+	}
 }
 ?>
diff --git a/modules/Contacts/models/Module.php b/modules/Contacts/models/Module.php
index 7d492ec7a3f1b05683be0e548da7af898cf22dc2..5817ded3164010f20c21ff5a49633eff213f6fa0 100644
--- a/modules/Contacts/models/Module.php
+++ b/modules/Contacts/models/Module.php
@@ -65,6 +65,14 @@ class Contacts_Module_Model extends Vtiger_Module_Model {
 					AND (vtiger_activity.status is NULL OR vtiger_activity.status NOT IN ('Completed', 'Deferred'))
 					AND (vtiger_activity.eventstatus is NULL OR vtiger_activity.eventstatus NOT IN ('Held'))";
 
+		if(!$currentUser->isAdminUser()) {
+			$moduleFocus = CRMEntity::getInstance('Calendar');
+			$condition = $moduleFocus->buildWhereClauseConditionForCalendar();
+			if($condition) {
+				$query .= ' AND '.$condition;
+			}
+		}
+
 		if ($recordId) {
 			$query .= " AND vtiger_cntactivityrel.contactid = ?";
 		} elseif ($mode === 'upcoming') {
@@ -251,6 +259,14 @@ class Contacts_Module_Model extends Vtiger_Module_Model {
 			$nonAdminQuery = $this->getNonAdminAccessControlQueryForRelation($relatedModuleName);
 			if ($nonAdminQuery) {
 				$query = appendFromClauseToQuery($query, $nonAdminQuery);
+
+				if(trim($nonAdminQuery)) {
+					$relModuleFocus = CRMEntity::getInstance($relatedModuleName);
+					$condition = $relModuleFocus->buildWhereClauseConditionForCalendar();
+					if($condition) {
+						$query .= ' AND '.$condition;
+					}
+				}
 			}
 		} else {
 			$query = parent::getRelationQuery($recordId, $functionName, $relatedModule, $relationId);
diff --git a/modules/HelpDesk/models/Module.php b/modules/HelpDesk/models/Module.php
index 5426fb6e1a2f4cab85667e42b0efc4c30a9bb510..7f82378012e17cef4242631fc027c3b3a5d1e8d5 100644
--- a/modules/HelpDesk/models/Module.php
+++ b/modules/HelpDesk/models/Module.php
@@ -164,6 +164,14 @@ class HelpDesk_Module_Model extends Vtiger_Module_Model {
 			$nonAdminQuery = $this->getNonAdminAccessControlQueryForRelation($relatedModuleName);
 			if ($nonAdminQuery) {
 				$query = appendFromClauseToQuery($query, $nonAdminQuery);
+
+				if(trim($nonAdminQuery)) {
+					$relModuleFocus = CRMEntity::getInstance($relatedModuleName);
+					$condition = $relModuleFocus->buildWhereClauseConditionForCalendar();
+					if($condition) {
+						$query .= ' AND '.$condition;
+					}
+				}
 			}
 		} else {
 			$query = parent::getRelationQuery($recordId, $functionName, $relatedModule, $relationId);
diff --git a/modules/Home/models/Module.php b/modules/Home/models/Module.php
index 2bea4aa117b1c703f219dbf3bc019341347d4c2e..f2fa1265ac9268443ec8b952aa0e7ff24c4a3225 100644
--- a/modules/Home/models/Module.php
+++ b/modules/Home/models/Module.php
@@ -198,6 +198,14 @@ class Home_Module_Model extends Vtiger_Module_Model {
 					AND (vtiger_activity.status is NULL OR vtiger_activity.status NOT IN ('Completed', 'Deferred', 'Cancelled'))
 					AND (vtiger_activity.eventstatus is NULL OR vtiger_activity.eventstatus NOT IN ('Held', 'Cancelled'))";
 
+		if(!$currentUser->isAdminUser()) {
+			$moduleFocus = CRMEntity::getInstance('Calendar');
+			$condition = $moduleFocus->buildWhereClauseConditionForCalendar();
+			if($condition) {
+				$query .= ' AND '.$condition;
+			}
+		}
+
 		if ($mode === 'upcoming') {
 			$query .= " AND CASE WHEN vtiger_activity.activitytype='Task' THEN due_date >= '$currentDate' ELSE CONCAT(due_date,' ',time_end) >= '$nowInDBFormat' END";
 		} elseif ($mode === 'overdue') {
diff --git a/modules/Inventory/models/Module.php b/modules/Inventory/models/Module.php
index 991e5d59f7166ee4b0c47f2992bc281966464427..5e917570b28392359fca1fb0b89de7c303a22c49 100644
--- a/modules/Inventory/models/Module.php
+++ b/modules/Inventory/models/Module.php
@@ -84,6 +84,14 @@ class Inventory_Module_Model extends Vtiger_Module_Model {
 			$nonAdminQuery = $this->getNonAdminAccessControlQueryForRelation($relatedModuleName);
 			if ($nonAdminQuery) {
 				$query = appendFromClauseToQuery($query, $nonAdminQuery);
+
+				if(trim($nonAdminQuery)) {
+					$relModuleFocus = CRMEntity::getInstance($relatedModuleName);
+					$condition = $relModuleFocus->buildWhereClauseConditionForCalendar();
+					if($condition) {
+						$query .= ' AND '.$condition;
+					}
+				}
 			}
 		} else {
 			$query = parent::getRelationQuery($recordId, $functionName, $relatedModule, $relationId);
diff --git a/modules/Leads/models/Module.php b/modules/Leads/models/Module.php
index 94289dad9eea3bf471158dc622a9243502553528..2f3126412e0792089babc7304bcb6c1a28026ee7 100644
--- a/modules/Leads/models/Module.php
+++ b/modules/Leads/models/Module.php
@@ -297,6 +297,14 @@ class Leads_Module_Model extends Vtiger_Module_Model {
 			$nonAdminQuery = $this->getNonAdminAccessControlQueryForRelation($relatedModuleName);
 			if ($nonAdminQuery) {
 				$query = appendFromClauseToQuery($query, $nonAdminQuery);
+
+				if(trim($nonAdminQuery)) {
+					$relModuleFocus = CRMEntity::getInstance($relatedModuleName);
+					$condition = $relModuleFocus->buildWhereClauseConditionForCalendar();
+					if($condition) {
+						$query .= ' AND '.$condition;
+					}
+				}
 			}
 		} else {
 			$query = parent::getRelationQuery($recordId, $functionName, $relatedModule, $relationId);
diff --git a/modules/Potentials/models/Module.php b/modules/Potentials/models/Module.php
index 1e7782f48bcf9e9296754e9b8de20d877a5cf2f1..9ea4f242bc3a1335bf6d010698e5b00f5f148f77 100644
--- a/modules/Potentials/models/Module.php
+++ b/modules/Potentials/models/Module.php
@@ -278,6 +278,14 @@ class Potentials_Module_Model extends Vtiger_Module_Model {
 			$nonAdminQuery = $this->getNonAdminAccessControlQueryForRelation($relatedModuleName);
 			if ($nonAdminQuery) {
 				$query = appendFromClauseToQuery($query, $nonAdminQuery);
+
+				if(trim($nonAdminQuery)) {
+					$relModuleFocus = CRMEntity::getInstance($relatedModuleName);
+					$condition = $relModuleFocus->buildWhereClauseConditionForCalendar();
+					if($condition) {
+						$query .= ' AND '.$condition;
+					}
+				}
 			}
 		} else {
 			$query = parent::getRelationQuery($recordId, $functionName, $relatedModule, $relationId);
diff --git a/modules/PriceBooks/models/Relation.php b/modules/PriceBooks/models/Relation.php
index a265a1c5c97a4e764f41f4dfebe5b49d30cc2b2f..793b76b0f91848ddf2781e6f083d95c24420da08 100644
--- a/modules/PriceBooks/models/Relation.php
+++ b/modules/PriceBooks/models/Relation.php
@@ -48,6 +48,20 @@ class PriceBooks_Relation_Model extends Vtiger_Relation_Model{
 		if(!empty($selectColumnSql)) {
 			$query = $selectColumnSql.' FROM '.$newQuery[1];
 		}
+
+		if($relatedModuleName == 'Calendar') {
+			$nonAdminQuery = Users_Privileges_Model::getNonAdminAccessControlQuery($relatedModuleName);
+
+			if (trim($nonAdminQuery)) {
+				$query = appendFromClauseToQuery($query, $nonAdminQuery);
+
+				$moduleFocus = CRMEntity::getInstance('Calendar');
+				$condition = $moduleFocus->buildWhereClauseConditionForCalendar();
+				if($condition) {
+					$query .= ' AND '.$condition;
+				}
+			}
+		}
 		return $query;
 	}
 
diff --git a/modules/Products/models/RelationListView.php b/modules/Products/models/RelationListView.php
index 19e7d665f6b3d16d0fbfbf2e32002d87bfe7a3a8..b9c320d1e48be73e0f5dfee03a4dd645ee24627c 100644
--- a/modules/Products/models/RelationListView.php
+++ b/modules/Products/models/RelationListView.php
@@ -70,6 +70,21 @@ class Products_RelationListView_Model extends Vtiger_RelationListView_Model {
 			}
 		}
 
+		$nonAdminQuery = Users_Privileges_Model::getNonAdminAccessControlQuery($relatedModuleName);
+		if (trim($nonAdminQuery)) {
+			if($relatedModuleName == 'Calendar') {
+				$query = appendFromClauseToQuery($query, $nonAdminQuery);
+
+				$moduleFocus = CRMEntity::getInstance('Calendar');
+				$condition = $moduleFocus->buildWhereClauseConditionForCalendar();
+				if($condition) {
+					$query .= ' AND '.$condition;
+				}
+			} else {
+				$query = appendFromClauseToQuery($query, $nonAdminQuery);
+			}
+		}
+
 		return $query;
 	}
 
diff --git a/modules/Reports/ReportRun.php b/modules/Reports/ReportRun.php
index 5f9c6564c65c638ab52873f22aa3a1943a34120e..44af415b788c0419356598a835a10cb78307ec20 100644
--- a/modules/Reports/ReportRun.php
+++ b/modules/Reports/ReportRun.php
@@ -2828,6 +2828,25 @@ class ReportRun extends CRMEntity {
 		}
 		$log->info("ReportRun :: Successfully returned getReportsQuery" . $module);
 
+
+		$secondarymodule = explode(":", $this->secondarymodule);
+		if(in_array('Calendar', $secondarymodule) || $module == 'Calendar') {
+			$currentUserModel = Users_Record_Model::getCurrentUserModel();
+			$tabId = getTabid('Calendar');
+			$task_tableName = 'vt_tmp_u'.$currentUserModel->id.'_t'.$tabId.'_task';
+			$event_tableName = 'vt_tmp_u'.$currentUserModel->id.'_t'.$tabId.'_events';
+			if(!$currentUserModel->isAdminUser()
+				&& stripos($query, $event_tableName) && stripos($query, $task_tableName)) {
+				$moduleFocus = CRMEntity::getInstance('Calendar');
+				$scope = '';
+				if(in_array('Calendar', $secondarymodule)) $scope = 'Calendar';
+				$condition = $moduleFocus->buildWhereClauseConditionForCalendar($scope);
+				if($condition) {
+					$query .= ' AND '.$condition;
+				}
+			}
+		}
+
 		return $query;
 	}
 
diff --git a/modules/Vtiger/models/Module.php b/modules/Vtiger/models/Module.php
index f1ffd66ce63cc8cd9ee46e8cba7f8e23d4f62f30..ad7ddf65b630bd5282439603c82906421c81bee0 100644
--- a/modules/Vtiger/models/Module.php
+++ b/modules/Vtiger/models/Module.php
@@ -1089,6 +1089,14 @@ class Vtiger_Module_Model extends Vtiger_Module {
 					AND (vtiger_activity.status is NULL OR vtiger_activity.status NOT IN ('Completed', 'Deferred', 'Cancelled'))
 					AND (vtiger_activity.eventstatus is NULL OR vtiger_activity.eventstatus NOT IN ('Held','Cancelled'))";
 
+		if(!$currentUser->isAdminUser()) {
+			$moduleFocus = CRMEntity::getInstance('Calendar');
+			$condition = $moduleFocus->buildWhereClauseConditionForCalendar();
+			if($condition) {
+				$query .= ' AND '.$condition;
+			}
+		}
+
 		$params = array($this->getName());
 
 		if ($recordId) {
@@ -1521,6 +1529,14 @@ class Vtiger_Module_Model extends Vtiger_Module {
 
 		if ($nonAdminQuery) {
 			$query = appendFromClauseToQuery($query, $nonAdminQuery);
+
+			if($functionName == 'get_activities' && trim($nonAdminQuery)) {
+				$moduleFocus = CRMEntity::getInstance('Calendar');
+				$condition = $moduleFocus->buildWhereClauseConditionForCalendar();
+				if($condition) {
+					$query .= ' AND '.$condition;
+				}
+			}
 		}
 
 		return $query;