diff --git a/src/applications/calendar/query/PhabricatorCalendarEventQuery.php b/src/applications/calendar/query/PhabricatorCalendarEventQuery.php
--- a/src/applications/calendar/query/PhabricatorCalendarEventQuery.php
+++ b/src/applications/calendar/query/PhabricatorCalendarEventQuery.php
@@ -12,7 +12,6 @@
   private $isCancelled;
   private $instanceSequencePairs;
 
-
   private $generateGhosts = false;
 
   public function setGenerateGhosts($generate_ghosts) {
@@ -108,13 +107,22 @@
     $map = array();
     $instance_sequence_pairs = array();
 
-    foreach ($events as $event) {
+    foreach ($events as $key => $event) {
       $sequence_start = 0;
       $sequence_end = null;
       $duration = $event->getDateTo() - $event->getDateFrom();
       $end = null;
 
-      if ($event->getIsRecurring() && !$event->getInstanceOfEventPHID()) {
+      $instance_of = $event->getInstanceOfEventPHID();
+
+      if ($instance_of == null && $this->isCancelled !== null) {
+        if ($event->getIsCancelled() != $this->isCancelled) {
+          unset($events[$key]);
+          continue;
+        }
+      }
+
+      if ($event->getIsRecurring() && $instance_of == null) {
         $frequency = $event->getFrequencyUnit();
         $modify_key = '+1 '.$frequency;
 
@@ -164,8 +172,8 @@
           $instance_sequence_pairs[] = array($event->getPHID(), $index);
           $events[] = $event->generateNthGhost($index, $viewer);
 
-          $key = last_key($events);
-          $map[$event->getPHID()][$index] = $key;
+          $last_key = last_key($events);
+          $map[$event->getPHID()][$index] = $last_key;
         }
       }
     }
@@ -308,6 +316,9 @@
   protected function willFilterPage(array $events) {
     $range_start = $this->rangeBegin;
     $range_end = $this->rangeEnd;
+    $instance_of_event_phids = array();
+    $recurring_events = array();
+    $viewer = $this->getViewer();
 
     foreach ($events as $key => $event) {
       $event_start = $event->getDateFrom();
@@ -325,11 +336,25 @@
 
     foreach ($events as $event) {
       $phids[] = $event->getPHID();
+      $instance_of = $event->getInstanceOfEventPHID();
+
+      if (($instance_of && $instance_of != $event->getPHID()) || $event->getIsGhostEvent()) {
+        $instance_of_event_phids[] = $event->getInstanceOfEventPHID();
+      }
+    }
+
+    if (count($instance_of_event_phids) > 0) {
+      $recurring_events = id(new PhabricatorCalendarEventQuery())
+        ->setViewer($viewer)
+        ->withPHIDs($instance_of_event_phids)
+        ->execute();
+
+      $recurring_events = mpull($recurring_events, null, 'getPHID');
     }
 
     if ($events) {
       $invitees = id(new PhabricatorCalendarEventInviteeQuery())
-        ->setViewer($this->getViewer())
+        ->setViewer($viewer)
         ->withEventPHIDs($phids)
         ->execute();
       $invitees = mgroup($invitees, 'getEventPHID');
@@ -337,9 +362,25 @@
       $invitees = array();
     }
 
-    foreach ($events as $event) {
+    foreach ($events as $key => $event) {
       $event_invitees = idx($invitees, $event->getPHID(), array());
       $event->attachInvitees($event_invitees);
+
+      $instance_of = $event->getInstanceOfEventPHID();
+      if (!$instance_of) {
+        continue;
+      }
+      $parent = idx($recurring_events, $instance_of);
+      if (!$parent) {
+        unset($events[$key]);
+        continue;
+      }
+      $event->attachParentEvent($parent);
+
+      if ($event->getIsCancelled() && !$this->isCancelled) {
+        unset($events[$key]);
+        continue;
+      }
     }
 
     $events = msort($events, 'getDateFrom');
diff --git a/src/applications/calendar/storage/PhabricatorCalendarEvent.php b/src/applications/calendar/storage/PhabricatorCalendarEvent.php
--- a/src/applications/calendar/storage/PhabricatorCalendarEvent.php
+++ b/src/applications/calendar/storage/PhabricatorCalendarEvent.php
@@ -33,6 +33,7 @@
 
   const DEFAULT_ICON = 'fa-calendar';
 
+  private $parentEvent = self::ATTACHABLE;
   private $invitees = self::ATTACHABLE;
   private $appliedViewer;
 
@@ -329,6 +330,35 @@
     return $uri;
   }
 
+  public function getParentEvent() {
+    return $this->assertAttached($this->parentEvent);
+  }
+
+  public function attachParentEvent($event) {
+    $this->parentEvent = $event;
+    return $this;
+  }
+
+  public function getIsCancelled() {
+    $instance_of = $this->instanceOfEventPHID;
+    if ($instance_of != null && $this->getIsParentCancelled()) {
+      return true;
+    }
+    return $this->isCancelled;
+  }
+
+  public function getIsParentCancelled() {
+    if (!$this->getParentEvent()) {
+      return false;
+    }
+
+    $recurring_event = $this->getParentEvent();
+    if ($recurring_event->getIsCancelled()) {
+      return true;
+    }
+    return false;
+  }
+
 /* -(  Markup Interface  )--------------------------------------------------- */