diff --git a/modules/crm_core_activity/crm_core_activity.module b/modules/crm_core_activity/crm_core_activity.module
index c6a96da..0f60abd 100644
--- a/modules/crm_core_activity/crm_core_activity.module
+++ b/modules/crm_core_activity/crm_core_activity.module
@@ -97,7 +97,7 @@ function crm_core_activity_entity_info_alter(&$entity_info) {
  */
 function crm_core_activity_search_info() {
   return array(
-    'title' => 'Activities', 
+    'title' => 'Activities',
     'path' => 'activity',
   );
 }
@@ -212,25 +212,60 @@ function crm_core_activity_update_index() {
 }
 
 /**
- * Implements hook_crm_core_contact_delete.
+ * Implements hook_crm_core_contact_delete().
+ *
+ * Adjusts Activities where contact is used in primary participants.
+ *
+ * @param object $crm_core_contact
+ *   A fully loaded object representing Contact being deleted.
  */
 function crm_core_activity_crm_core_contact_delete($crm_core_contact) {
+  // We will inerate over all activities to check if contact presented
+  // in main participants.
+  $crm_core_activities = crm_core_activity_load_multiple(FALSE);
+
+  $activities_to_remove = array();
+
+  foreach($crm_core_activities as $crm_core_activity) {
+    $wrapped_activity = entity_metadata_wrapper('crm_core_activity', $crm_core_activity);
+    $participants = $wrapped_activity->field_activity_participants->value();
+
+    // Search for the Contact...
+    $found_index = NULL;
+    foreach ($participants as $key => $participant) {
+      if ($participant->contact_id == $crm_core_contact->contact_id) {
+        $found_index = $key;
+      }
+    }
 
-  // query the activities that belongs to the contact
-  // @todo for activities involving other contacts, it might be wise to just
-  // delete the contact from the participant list?
-  $query = new EntityFieldQuery;
-  $results = $query
-    ->entityCondition('entity_type', 'crm_core_activity')
-    ->fieldCondition('field_activity_participants', 'target_id', $crm_core_contact->contact_id, '=')
-    ->fieldCondition('field_activity_participants', 'target_type', 'crm_core_contact', '=')
-    ->execute();
-
-  if(empty($results)) {
-    return;
+    // Three cases possible for Contact in current Activity:
+    //   - not participated;
+    //   - participated among other users;
+    //   - the only participant
+    if ($found_index === NULL) {
+      // This activity main participants does not refer to the deleted one,
+      // so no actions needed.
+      continue;
+    }
+    if (count($participants) == 1) {
+      // This is a last main participants deleted, so we should kill entire activity.
+      $activities_to_remove[] = $crm_core_activity->activity_id;
+    }
+    else {
+      // Exclude deleted Contact & reindex array...
+      array_splice($participants, $found_index, 1);
+      // ...and save Activity
+      $wrapped_activity->field_activity_participants->set($participants);
+      crm_core_activity_save($crm_core_activity);
+    }
   }
-  foreach($results['crm_core_activity'] as $crm_core_activity) {
-    crm_core_activity_delete($crm_core_activity);
+
+  if (!empty($activities_to_remove)) {
+    watchdog('crm_core_activities', 'Deleted !count activities due to delection contact with id=%contact_id.',
+      array('!count' => count($activities_to_remove),
+        '%contact_id' => $crm_core_contact->contact_id),
+      WATCHDOG_INFO);
+    crm_core_activity_delete_multiple($activities_to_remove);
   }
 }
 
