diff --git a/src/applications/base/controller/PhabricatorController.php b/src/applications/base/controller/PhabricatorController.php
--- a/src/applications/base/controller/PhabricatorController.php
+++ b/src/applications/base/controller/PhabricatorController.php
@@ -529,7 +529,8 @@
   protected function buildTransactionTimeline(
     PhabricatorApplicationTransactionInterface $object,
     PhabricatorApplicationTransactionQuery $query,
-    PhabricatorMarkupEngine $engine = null) {
+    PhabricatorMarkupEngine $engine = null,
+    $render_data = array()) {
 
     $viewer = $this->getRequest()->getUser();
     $xaction = $object->getApplicationTransactionTemplate();
@@ -564,7 +565,9 @@
       ->setUser($viewer)
       ->setObjectPHID($object->getPHID())
       ->setTransactions($xactions)
-      ->setPager($pager);
+      ->setPager($pager)
+      ->setRenderData($render_data);
+    $object->willRenderTimeline($timeline, $this->getRequest());
 
     return $timeline;
   }
diff --git a/src/applications/differential/controller/DifferentialRevisionViewController.php b/src/applications/differential/controller/DifferentialRevisionViewController.php
--- a/src/applications/differential/controller/DifferentialRevisionViewController.php
+++ b/src/applications/differential/controller/DifferentialRevisionViewController.php
@@ -928,12 +928,12 @@
 
     $timeline = $this->buildTransactionTimeline(
       $revision,
-      new DifferentialTransactionQuery());
-    $timeline
-      ->setChangesets($changesets)
-      ->setRevision($revision)
-      ->setLeftDiff($left_diff)
-      ->setRightDiff($right_diff);
+      new DifferentialTransactionQuery(),
+      $engine = null,
+      array(
+        'left' => $left_diff->getID(),
+        'right' => $right_diff->getID(),
+      ));
 
     return $timeline;
   }
diff --git a/src/applications/differential/storage/DifferentialRevision.php b/src/applications/differential/storage/DifferentialRevision.php
--- a/src/applications/differential/storage/DifferentialRevision.php
+++ b/src/applications/differential/storage/DifferentialRevision.php
@@ -475,6 +475,35 @@
     return new DifferentialTransaction();
   }
 
+  public function willRenderTimeline(
+    PhabricatorApplicationTransactionView $timeline,
+    AphrontRequest $request) {
+
+    $render_data = $timeline->getRenderData();
+    $left = $request->getInt('left', idx($render_data, 'left'));
+    $right = $request->getInt('right', idx($render_data, 'right'));
+
+    $diffs = id(new DifferentialDiffQuery())
+      ->setViewer($request->getUser())
+      ->withIDs(array($left, $right))
+      ->execute();
+    $diffs = mpull($diffs, null, 'getID');
+    $left_diff = $diffs[$left];
+    $right_diff = $diffs[$right];
+
+    $changesets = id(new DifferentialChangesetQuery())
+      ->setViewer($request->getUser())
+      ->withDiffs(array($right_diff))
+      ->execute();
+    $changesets = mpull($changesets, null, 'getID');
+
+    return $timeline
+      ->setChangesets($changesets)
+      ->setRevision($this)
+      ->setLeftDiff($left_diff)
+      ->setRightDiff($right_diff);
+  }
+
 
 /* -(  PhabricatorDestructibleInterface  )----------------------------------- */
 
diff --git a/src/applications/pholio/storage/PholioMock.php b/src/applications/pholio/storage/PholioMock.php
--- a/src/applications/pholio/storage/PholioMock.php
+++ b/src/applications/pholio/storage/PholioMock.php
@@ -264,6 +264,13 @@
     return new PholioTransaction();
   }
 
+  public function willRenderTimeline(
+    PhabricatorApplicationTransactionView $timeline,
+    AphrontRequest $request) {
+
+    $timeline->setMock($this);
+    return $timeline;
+  }
 
 /* -(  PhabricatorTokenReceiverInterface  )---------------------------------- */
 
diff --git a/src/applications/transactions/interface/PhabricatorApplicationTransactionInterface.php b/src/applications/transactions/interface/PhabricatorApplicationTransactionInterface.php
--- a/src/applications/transactions/interface/PhabricatorApplicationTransactionInterface.php
+++ b/src/applications/transactions/interface/PhabricatorApplicationTransactionInterface.php
@@ -35,6 +35,10 @@
    */
   public function getApplicationTransactionTemplate();
 
+  public function willRenderTimeline(
+    PhabricatorApplicationTransactionView $timeline,
+    AphrontRequest $request);
+
 }
 
 // TEMPLATE IMPLEMENTATION /////////////////////////////////////////////////////
@@ -55,4 +59,11 @@
     return new <<<???>>>Transaction();
   }
 
+  public function willRenderTimeline(
+    PhabricatorApplicationTransactionView $timeline,
+    AphrontRequest $request) {
+
+    return $timeline;
+  }
+
 */
diff --git a/src/applications/transactions/view/PhabricatorApplicationTransactionView.php b/src/applications/transactions/view/PhabricatorApplicationTransactionView.php
--- a/src/applications/transactions/view/PhabricatorApplicationTransactionView.php
+++ b/src/applications/transactions/view/PhabricatorApplicationTransactionView.php
@@ -14,6 +14,7 @@
   private $quoteTargetID;
   private $quoteRef;
   private $pager;
+  private $renderData = array();
 
   public function setQuoteRef($quote_ref) {
     $this->quoteRef = $quote_ref;
@@ -85,6 +86,21 @@
     return $this->pager;
   }
 
+  /**
+   * This is additional data that may be necessary to render the next set
+   * of transactions. Objects that implement
+   * PhabricatorApplicationTransactionInterface use this data in
+   * willRenderTimeline.
+   */
+  public function setRenderData(array $data) {
+    $this->renderData = $data;
+    return $this;
+  }
+
+  public function getRenderData() {
+    return $this->renderData;
+  }
+
   public function buildEvents($with_hiding = false) {
     $user = $this->getUser();
 
@@ -186,6 +202,9 @@
     if ($this->getPager()) {
       $view->setPager($this->getPager());
     }
+    if ($this->getRenderData()) {
+      $view->setRenderData($this->getRenderData());
+    }
 
     return $view;
   }
diff --git a/src/view/phui/PHUITimelineView.php b/src/view/phui/PHUITimelineView.php
--- a/src/view/phui/PHUITimelineView.php
+++ b/src/view/phui/PHUITimelineView.php
@@ -7,6 +7,7 @@
   private $shouldTerminate = false;
   private $shouldAddSpacers = true;
   private $pager;
+  private $renderData = array();
 
   public function setID($id) {
     $this->id = $id;
@@ -37,6 +38,11 @@
     return $this;
   }
 
+  public function setRenderData(array $data) {
+    $this->renderData = $data;
+    return $this;
+  }
+
   public function render() {
     if ($this->getPager()) {
       if ($this->id === null) {
@@ -46,6 +52,7 @@
         'phabricator-show-older-transactions',
         array(
           'timelineID' => $this->id,
+          'renderData' => $this->renderData,
         ));
     }
     $events = $this->buildEvents();
diff --git a/webroot/rsrc/js/application/transactions/behavior-show-older-transactions.js b/webroot/rsrc/js/application/transactions/behavior-show-older-transactions.js
--- a/webroot/rsrc/js/application/transactions/behavior-show-older-transactions.js
+++ b/webroot/rsrc/js/application/transactions/behavior-show-older-transactions.js
@@ -82,7 +82,7 @@
   };
 
   var fetch_older_workflow = function(href, callback, swap) {
-    return new JX.Workflow(href)
+    return new JX.Workflow(href, config.renderData)
       .setHandler(JX.bind(null, callback, swap));
   };