diff --git a/src/applications/diffusion/controller/DiffusionPushEventViewController.php b/src/applications/diffusion/controller/DiffusionPushEventViewController.php
index 027cf16bb..c5eb6368b 100644
--- a/src/applications/diffusion/controller/DiffusionPushEventViewController.php
+++ b/src/applications/diffusion/controller/DiffusionPushEventViewController.php
@@ -1,178 +1,177 @@
 <?php
 
 final class DiffusionPushEventViewController
   extends DiffusionPushLogController {
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function handleRequest(AphrontRequest $request) {
     $viewer = $this->getViewer();
 
     $event = id(new PhabricatorRepositoryPushEventQuery())
       ->setViewer($viewer)
       ->withIDs(array($request->getURIData('id')))
       ->needLogs(true)
       ->executeOne();
     if (!$event) {
       return new Aphront404Response();
     }
 
     $repository = $event->getRepository();
     $title = pht('Push %d', $event->getID());
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb(
       $repository->getName(),
       $repository->getURI());
 
     $crumbs->addTextCrumb(
       pht('Push Logs'),
       $this->getApplicationURI(
         'pushlog/?repositories='.$repository->getMonogram()));
     $crumbs->addTextCrumb($title);
 
     $event_properties = $this->buildPropertyList($event);
 
     $detail_box = id(new PHUIObjectBoxView())
       ->setHeaderText($title)
       ->addPropertyList($event_properties);
 
     $commits = $this->loadCommits($event);
     $commits_table = $this->renderCommitsTable($event, $commits);
 
     $commits_box = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Pushed Commits'))
       ->setTable($commits_table);
 
     $logs = $event->getLogs();
 
     $updates_table = id(new DiffusionPushLogListView())
       ->setUser($viewer)
-      ->setLogs($logs)
-      ->setHandles($this->loadViewerHandles(mpull($logs, 'getPusherPHID')));
+      ->setLogs($logs);
 
     $update_box = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('All Pushed Updates'))
       ->setTable($updates_table);
 
     return $this->newPage()
       ->setTitle($title)
       ->setCrumbs($crumbs)
       ->appendChild(
         array(
           $detail_box,
           $commits_box,
           $update_box,
         ));
   }
 
   private function buildPropertyList(PhabricatorRepositoryPushEvent $event) {
     $viewer = $this->getRequest()->getUser();
     $view = new PHUIPropertyListView();
 
     $view->addProperty(
       pht('Pushed At'),
       phabricator_datetime($event->getEpoch(), $viewer));
 
     $view->addProperty(
       pht('Pushed By'),
       $viewer->renderHandle($event->getPusherPHID()));
 
     $view->addProperty(
       pht('Pushed Via'),
       $event->getRemoteProtocol());
 
     return $view;
   }
 
   private function loadCommits(PhabricatorRepositoryPushEvent $event) {
     $viewer = $this->getRequest()->getUser();
 
     $identifiers = array();
     foreach ($event->getLogs() as $log) {
       if ($log->getRefType() == PhabricatorRepositoryPushLog::REFTYPE_COMMIT) {
         $identifiers[] = $log->getRefNew();
       }
     }
 
     if (!$identifiers) {
       return array();
     }
 
     // NOTE: Commits may not have been parsed/discovered yet. We need to return
     // the identifiers no matter what. If possible, we'll also return the
     // corresponding commits.
 
     $commits = id(new DiffusionCommitQuery())
       ->setViewer($viewer)
       ->withRepository($event->getRepository())
       ->withIdentifiers($identifiers)
       ->execute();
 
     $commits = mpull($commits, null, 'getCommitIdentifier');
 
     $results = array();
     foreach ($identifiers as $identifier) {
       $results[$identifier] = idx($commits, $identifier);
     }
 
     return $results;
   }
 
   private function renderCommitsTable(
     PhabricatorRepositoryPushEvent $event,
     array $commits) {
 
     $viewer = $this->getRequest()->getUser();
     $repository = $event->getRepository();
 
     $rows = array();
     foreach ($commits as $identifier => $commit) {
       if ($commit) {
         $partial_import = PhabricatorRepositoryCommit::IMPORTED_MESSAGE |
                           PhabricatorRepositoryCommit::IMPORTED_CHANGE;
         if ($commit->isPartiallyImported($partial_import)) {
           $summary = AphrontTableView::renderSingleDisplayLine(
             $commit->getSummary());
         } else {
           $summary = phutil_tag('em', array(), pht('Importing...'));
         }
       } else {
         $summary = phutil_tag('em', array(), pht('Discovering...'));
       }
 
       $commit_name = $repository->formatCommitName($identifier);
       if ($commit) {
         $commit_name = phutil_tag(
           'a',
           array(
             'href' => '/'.$commit_name,
           ),
           $commit_name);
       }
 
       $rows[] = array(
         $commit_name,
         $summary,
       );
     }
 
     $table = id(new AphrontTableView($rows))
       ->setNoDataString(pht("This push didn't push any new commits."))
       ->setHeaders(
         array(
           pht('Commit'),
           pht('Summary'),
         ))
       ->setColumnClasses(
         array(
           'n',
           'wide',
         ));
 
     return $table;
   }
 
 }
diff --git a/src/applications/diffusion/view/DiffusionPushLogListView.php b/src/applications/diffusion/view/DiffusionPushLogListView.php
index b3d78f236..303f0519f 100644
--- a/src/applications/diffusion/view/DiffusionPushLogListView.php
+++ b/src/applications/diffusion/view/DiffusionPushLogListView.php
@@ -1,149 +1,153 @@
 <?php
 
 final class DiffusionPushLogListView extends AphrontView {
 
   private $logs;
-  private $handles;
 
   public function setLogs(array $logs) {
     assert_instances_of($logs, 'PhabricatorRepositoryPushLog');
     $this->logs = $logs;
     return $this;
   }
 
-  public function setHandles(array $handles) {
-    $this->handles = $handles;
-    return $this;
-  }
-
   public function render() {
     $logs = $this->logs;
-    $viewer = $this->getUser();
-    $handles = $this->handles;
+    $viewer = $this->getViewer();
+
+    $handle_phids = array();
+    foreach ($logs as $log) {
+      $handle_phids[] = $log->getPusherPHID();
+      $device_phid = $log->getDevicePHID();
+      if ($device_phid) {
+        $handle_phids[] = $device_phid;
+      }
+    }
+
+    $handles = $viewer->loadHandles($handle_phids);
 
     // Figure out which repositories are editable. We only let you see remote
     // IPs if you have edit capability on a repository.
     $editable_repos = array();
     if ($logs) {
       $editable_repos = id(new PhabricatorRepositoryQuery())
         ->setViewer($viewer)
         ->requireCapabilities(
           array(
             PhabricatorPolicyCapability::CAN_VIEW,
             PhabricatorPolicyCapability::CAN_EDIT,
           ))
         ->withPHIDs(mpull($logs, 'getRepositoryPHID'))
         ->execute();
       $editable_repos = mpull($editable_repos, null, 'getPHID');
     }
 
     $rows = array();
     $any_host = false;
     foreach ($logs as $log) {
       $repository = $log->getRepository();
 
       // Reveal this if it's valid and the user can edit the repository.
       $remote_address = '-';
       if (isset($editable_repos[$log->getRepositoryPHID()])) {
         $remote_address = $log->getPushEvent()->getRemoteAddress();
       }
 
       $event_id = $log->getPushEvent()->getID();
 
       $old_ref_link = null;
       if ($log->getRefOld() != DiffusionCommitHookEngine::EMPTY_HASH) {
         $old_ref_link = phutil_tag(
           'a',
           array(
             'href' => $repository->getCommitURI($log->getRefOld()),
           ),
           $log->getRefOldShort());
       }
 
       $device_phid = $log->getDevicePHID();
       if ($device_phid) {
-        $device = $handles[$device_phid]->renderLink();
+        $device = $viewer->renderHandle($device_phid);
         $any_host = true;
       } else {
         $device = null;
       }
 
       $rows[] = array(
         phutil_tag(
           'a',
           array(
             'href' => '/diffusion/pushlog/view/'.$event_id.'/',
           ),
           $event_id),
         phutil_tag(
           'a',
           array(
             'href' => $repository->getURI(),
           ),
           $repository->getDisplayName()),
-        $handles[$log->getPusherPHID()]->renderLink(),
+        $viewer->renderHandle($log->getPusherPHID()),
         $remote_address,
         $log->getPushEvent()->getRemoteProtocol(),
         $device,
         $log->getRefType(),
         $log->getRefName(),
         $old_ref_link,
         phutil_tag(
           'a',
           array(
             'href' => $repository->getCommitURI($log->getRefNew()),
           ),
           $log->getRefNewShort()),
 
         // TODO: Make these human-readable.
         $log->getChangeFlags(),
         $log->getPushEvent()->getRejectCode(),
         $viewer->formatShortDateTime($log->getEpoch()),
       );
     }
 
     $table = id(new AphrontTableView($rows))
       ->setHeaders(
         array(
           pht('Push'),
           pht('Repository'),
           pht('Pusher'),
           pht('From'),
           pht('Via'),
           pht('Host'),
           pht('Type'),
           pht('Name'),
           pht('Old'),
           pht('New'),
           pht('Flags'),
           pht('Code'),
           pht('Date'),
         ))
       ->setColumnClasses(
         array(
           '',
           '',
           '',
           '',
           '',
           '',
           '',
           'wide',
           'n',
           'n',
           'right',
         ))
       ->setColumnVisibility(
         array(
           true,
           true,
           true,
           true,
           true,
           $any_host,
         ));
 
     return $table;
   }
 
 }
diff --git a/src/applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php b/src/applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php
index 320558de2..8fd3baeb5 100644
--- a/src/applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php
+++ b/src/applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php
@@ -1,120 +1,108 @@
 <?php
 
 final class PhabricatorRepositoryPushLogSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Push Logs');
   }
 
   public function getApplicationClassName() {
     return 'PhabricatorDiffusionApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'repositoryPHIDs',
       $this->readPHIDsFromRequest(
         $request,
         'repositories',
         array(
           PhabricatorRepositoryRepositoryPHIDType::TYPECONST,
         )));
 
     $saved->setParameter(
       'pusherPHIDs',
       $this->readUsersFromRequest(
         $request,
         'pushers'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorRepositoryPushLogQuery());
 
     $repository_phids = $saved->getParameter('repositoryPHIDs');
     if ($repository_phids) {
       $query->withRepositoryPHIDs($repository_phids);
     }
 
     $pusher_phids = $saved->getParameter('pusherPHIDs');
     if ($pusher_phids) {
       $query->withPusherPHIDs($pusher_phids);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $repository_phids = $saved_query->getParameter('repositoryPHIDs', array());
     $pusher_phids = $saved_query->getParameter('pusherPHIDs', array());
 
     $form
       ->appendControl(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new DiffusionRepositoryDatasource())
           ->setName('repositories')
           ->setLabel(pht('Repositories'))
           ->setValue($repository_phids))
       ->appendControl(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('pushers')
           ->setLabel(pht('Pushers'))
           ->setValue($pusher_phids));
   }
 
   protected function getURI($path) {
     return '/diffusion/pushlog/'.$path;
   }
 
   protected function getBuiltinQueryNames() {
     return array(
       'all' => pht('All Push Logs'),
     );
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
-  protected function getRequiredHandlePHIDsForResultList(
-    array $logs,
-    PhabricatorSavedQuery $query) {
-    $phids = array();
-    $phids[] = mpull($logs, 'getPusherPHID');
-    $phids[] = mpull($logs, 'getDevicePHID');
-    $phids = array_mergev($phids);
-    $phids = array_filter($phids);
-    return $phids;
-  }
-
   protected function renderResultList(
     array $logs,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     $table = id(new DiffusionPushLogListView())
-      ->setUser($this->requireViewer())
-      ->setHandles($handles)
+      ->setViewer($this->requireViewer())
       ->setLogs($logs);
 
     return id(new PhabricatorApplicationSearchResultView())
       ->setTable($table);
   }
 
 }