diff --git a/src/storage/SprintColumnTransaction.php b/src/storage/SprintColumnTransaction.php
index 32e8cfe17ab190312ce770f5582125566f086003..6307639e4fa93aa41e8b89467f648cd52d1ad906 100644
--- a/src/storage/SprintColumnTransaction.php
+++ b/src/storage/SprintColumnTransaction.php
@@ -61,6 +61,10 @@ final class SprintColumnTransaction {
             $this->closeTasksToday($date, $dates);
             $this->closePointsToday($date, $points, $dates);
             break;
+          case 'open':
+            $this->openTasksToday($date, $dates);
+            $this->openPointsToday($date, $points, $dates);
+            break;
           case 'reopen':
             $this->reopenedTasksToday($date, $dates);
             $this->reopenedPointsToday($date, $points, $dates);
@@ -80,6 +84,16 @@ final class SprintColumnTransaction {
     return $dates;
   }
 
+  private function openTasksToday($date, $dates) {
+    $dates[$date]->setTasksAddedToday();
+    return $dates;
+  }
+
+  private function openPointsToday($date, $points, $dates) {
+    $dates[$date]->setPointsAddedToday($points);
+    return $dates;
+  }
+
   private function reopenedPointsToday($date, $points, $dates) {
     $dates[$date]->setPointsReopenedToday($points);
     return $dates;
@@ -106,11 +120,16 @@ final class SprintColumnTransaction {
     $events = array();
     foreach ($xactions as $xaction) {
       if ($xaction->getOldValue() == null) {
-        continue;
+        if (ManiphestTaskStatus::isOpenStatus($xaction->getNewValue())) {
+            $event_type = 'open';
+        } else {
+            $event_type = 'close';
+        }
+      } else {
+        $was_open = ManiphestTaskStatus::isOpenStatus($xaction->getOldValue());
+        $is_open = ManiphestTaskStatus::isOpenStatus($xaction->getNewValue());
+        $event_type = $this->setXActionTaskStatusEventType($was_open, $is_open);
       }
-      $was_open = ManiphestTaskStatus::isOpenStatus($xaction->getOldValue());
-      $is_open = ManiphestTaskStatus::isOpenStatus($xaction->getNewValue());
-      $event_type = $this->setXActionTaskStatusEventType($was_open, $is_open);
       if ($event_type !== null) {
         $events[] = array(
             'transactionPHID' => $xaction->getPHID(),
diff --git a/src/storage/SprintStats.php b/src/storage/SprintStats.php
index d2dece99a777ee19b05ddebf61ffaa8da8354754..912d3c0eb6971298f125923b5ba29a86442d72cc 100644
--- a/src/storage/SprintStats.php
+++ b/src/storage/SprintStats.php
@@ -62,21 +62,48 @@ final class SprintStats {
   }
 
   public function sumTotalPoints($dates) {
-    $sprintpoints = id(new SprintPoints())
-        ->setTasks($this->tasks);
-    $points_total = $sprintpoints->sumTotalTaskPoints();
+    $first =  true;
+    $previous = new BurndownDataDate($date = null);
     foreach ($dates as $date) {
+      if ($first) {
+        $points_total = $date->getPointsAddedToday();
+        $first = false;
+      } else {
+        $points_today = $date->getPointsAddedToday();
+        $yesterday_points_total = $previous->getPointsTotal();
+        $points_total = $points_today + $yesterday_points_total;
+      }
       $date->setPointsTotal($points_total);
+      $previous = $date;
+    }
+
+    $sprintpoints = id(new SprintPoints())
+        ->setTasks($this->tasks);
+    $points_overall = $sprintpoints->sumTotalTaskPoints();
+    if ($previous->getPointsTotal() < $points_overall) {
+      $points_diff = $points_overall - $previous->getPointsTotal();
+      foreach ($dates as $date) {
+        $points_total = $date->getPointsTotal() + $points_diff;
+        $date->setPointsTotal($points_total);
+      }
     }
     return $dates;
   }
 
   public function sumTotalTasks($dates) {
-    $sprintpoints = id(new SprintPoints())
-        ->setTaskPoints($this->tasks);
-    $points_total = $sprintpoints->sumTotalTasks();
+    $first =  true;
+    $previous = new BurndownDataDate($date = null);
     foreach ($dates as $date) {
-      $date->setTasksTotal($points_total);
+      if ($first) {
+        $tasks_total = $date->getTasksAddedToday();
+        $first = false;
+      } else {
+        $tasks_today = $date->getTasksAddedToday();
+        $yesterday_tasks_total = $previous->getTasksTotal();
+        $tasks_total = $tasks_today + $yesterday_tasks_total;
+      }
+      $date->setTasksTotal($tasks_total);
+      $previous = $date;
     }
     return $dates;
   }
@@ -84,27 +111,34 @@ final class SprintStats {
   public function calcPointsRemaining($dates) {
     $first = true;
     $previous = new BurndownDataDate($date = null);
-    $sprintpoints = id(new SprintPoints())
-        ->setTasks($this->tasks);
-    $points_total = $sprintpoints->sumTotalTaskPoints();
-
     foreach ($dates as $date) {
+      $points_added_today = $date->getPointsAddedToday();
       $points_closed_today = $date->getPointsClosedToday();
       $points_reopened_today = $date->getPointsReopenedToday();
       $points_today = $points_reopened_today - $points_closed_today;
       if ($first) {
-         $points_remaining = $points_today + $points_total;
+        $points_remaining = $points_today + $date->getPointsTotal();
+        $first = false;
       } else {
         $yesterday_points_remaining = $previous->getPointsRemaining();
         $date->setYesterdayPointsRemaining($yesterday_points_remaining);
-        $points_remaining = $points_today + $yesterday_points_remaining;
+        $points_remaining = $points_today + $yesterday_points_remaining + $points_added_today;
       }
       if ($points_remaining < 0) {
         $points_remaining = 0;
       }
       $date->setPointsRemaining($points_remaining);
       $previous = $date;
-      $first = false;
+    }
+    $sprintpoints = id(new SprintPoints())
+        ->setTasks($this->tasks);
+    list($task_open_status_sum, $task_closed_status_sum) = $sprintpoints->getStatusSums();
+    if ($previous->getPointsRemaining() > $task_open_status_sum) {
+      $points_diff =  $previous->getPointsRemaining() - $task_open_status_sum;
+      foreach ($dates as $date) {
+        $points_remaining = $date->getPointsRemaining() - $points_diff;
+        $date->setPointsRemaining($points_remaining);
+      }
     }
     return $dates;
   }
@@ -112,10 +146,8 @@ final class SprintStats {
   public function calcTasksRemaining($dates) {
     $first = true;
     $previous = new BurndownDataDate($date = null);
-    $sprintpoints = id(new SprintPoints())
-        ->setTasks($this->tasks);
-    $tasks_total = $sprintpoints->sumTotalTasks();
     foreach ($dates as $date) {
+      $tasks_total = $date->getTasksTotal();
       $tasks_closed_today = $date->getTasksClosedToday();
       $tasks_reopened_today = $date->getTasksReopenedToday();
       $tasks_today = $tasks_reopened_today - $tasks_closed_today;
@@ -124,7 +156,8 @@ final class SprintStats {
       } else {
         $yesterday_tasks_remaining = $previous->getTasksRemaining();
         $date->setYesterdayTasksRemaining($yesterday_tasks_remaining);
-        $tasks_remaining = $tasks_today + $yesterday_tasks_remaining;
+        $tasks_added_today = $date->getTasksAddedToday();
+        $tasks_remaining = $tasks_today + $yesterday_tasks_remaining + $tasks_added_today;
       }
       $date->setTasksRemaining($tasks_remaining);
       $previous = $date;