diff --git a/src/applications/almanac/query/AlmanacDeviceSearchEngine.php b/src/applications/almanac/query/AlmanacDeviceSearchEngine.php
index b23d0ecb8c..8b487c5df8 100644
--- a/src/applications/almanac/query/AlmanacDeviceSearchEngine.php
+++ b/src/applications/almanac/query/AlmanacDeviceSearchEngine.php
@@ -1,84 +1,84 @@
 <?php
 
 final class AlmanacDeviceSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Almanac Devices');
   }
 
   protected function getApplicationClassName() {
     return 'PhabricatorAlmanacApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new AlmanacDeviceQuery());
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {}
 
   protected function getURI($path) {
     return '/almanac/device/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'all' => pht('All Devices'),
     );
 
     return $names;
   }
 
   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 $devices,
     PhabricatorSavedQuery $query) {
     return array();
   }
 
   protected function renderResultList(
     array $devices,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($devices, 'AlmanacDevice');
 
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     $list->setUser($viewer);
     foreach ($devices as $device) {
       $item = id(new PHUIObjectItemView())
         ->setObjectName(pht('Device %d', $device->getID()))
         ->setHeader($device->getName())
         ->setHref($device->getURI())
         ->setObject($device);
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/almanac/query/AlmanacNetworkSearchEngine.php b/src/applications/almanac/query/AlmanacNetworkSearchEngine.php
index 955d162096..e2b23d75b7 100644
--- a/src/applications/almanac/query/AlmanacNetworkSearchEngine.php
+++ b/src/applications/almanac/query/AlmanacNetworkSearchEngine.php
@@ -1,85 +1,85 @@
 <?php
 
 final class AlmanacNetworkSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Almanac Networks');
   }
 
   protected function getApplicationClassName() {
     return 'PhabricatorAlmanacApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new AlmanacNetworkQuery());
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {}
 
   protected function getURI($path) {
     return '/almanac/network/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'all' => pht('All Networks'),
     );
 
     return $names;
   }
 
   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 $networks,
     PhabricatorSavedQuery $query) {
     return array();
   }
 
   protected function renderResultList(
     array $networks,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($networks, 'AlmanacNetwork');
 
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     $list->setUser($viewer);
     foreach ($networks as $network) {
       $id = $network->getID();
 
       $item = id(new PHUIObjectItemView())
         ->setObjectName(pht('Network %d', $id))
         ->setHeader($network->getName())
         ->setHref($this->getApplicationURI("network/{$id}/"))
         ->setObject($network);
 
       $list->addItem($item);
     }
 
     return $list;
   }
 }
diff --git a/src/applications/almanac/query/AlmanacServiceSearchEngine.php b/src/applications/almanac/query/AlmanacServiceSearchEngine.php
index 08e6011ebb..e5a3c80560 100644
--- a/src/applications/almanac/query/AlmanacServiceSearchEngine.php
+++ b/src/applications/almanac/query/AlmanacServiceSearchEngine.php
@@ -1,95 +1,95 @@
 <?php
 
 final class AlmanacServiceSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Almanac Services');
   }
 
   protected function getApplicationClassName() {
     return 'PhabricatorAlmanacApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new AlmanacServiceQuery());
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {}
 
   protected function getURI($path) {
     return '/almanac/service/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'all' => pht('All Services'),
     );
 
     return $names;
   }
 
   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 $services,
     PhabricatorSavedQuery $query) {
     return array();
   }
 
   protected function renderResultList(
     array $services,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($services, 'AlmanacService');
 
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     $list->setUser($viewer);
     foreach ($services as $service) {
       $item = id(new PHUIObjectItemView())
         ->setObjectName(pht('Service %d', $service->getID()))
         ->setHeader($service->getName())
         ->setHref($service->getURI())
         ->setObject($service)
         ->addIcon(
           $service->getServiceType()->getServiceTypeIcon(),
           $service->getServiceType()->getServiceTypeShortName());
 
       if ($service->getIsLocked() ||
           $service->getServiceType()->isClusterServiceType()) {
         if ($service->getIsLocked()) {
           $item->addIcon('fa-lock', pht('Locked'));
         } else {
           $item->addIcon('fa-unlock-alt red', pht('Unlocked'));
         }
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 }
diff --git a/src/applications/audit/query/PhabricatorCommitSearchEngine.php b/src/applications/audit/query/PhabricatorCommitSearchEngine.php
index 959c364696..50ff7a0c1f 100644
--- a/src/applications/audit/query/PhabricatorCommitSearchEngine.php
+++ b/src/applications/audit/query/PhabricatorCommitSearchEngine.php
@@ -1,221 +1,221 @@
 <?php
 
 final class PhabricatorCommitSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Commits');
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'auditorPHIDs',
       $this->readPHIDsFromRequest($request, 'auditorPHIDs'));
 
     $saved->setParameter(
       'commitAuthorPHIDs',
       $this->readUsersFromRequest($request, 'authors'));
 
     $saved->setParameter(
       'auditStatus',
       $request->getStr('auditStatus'));
 
     $saved->setParameter(
       'repositoryPHIDs',
       $this->readPHIDsFromRequest($request, 'repositoryPHIDs'));
 
     // -- TODO - T4173 - file location
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new DiffusionCommitQuery())
       ->needAuditRequests(true)
       ->needCommitData(true);
 
     $auditor_phids = $saved->getParameter('auditorPHIDs', array());
     if ($auditor_phids) {
       $query->withAuditorPHIDs($auditor_phids);
     }
 
     $commit_author_phids = $saved->getParameter('commitAuthorPHIDs', array());
     if ($commit_author_phids) {
       $query->withAuthorPHIDs($commit_author_phids);
     }
 
     $audit_status = $saved->getParameter('auditStatus', null);
     if ($audit_status) {
       $query->withAuditStatus($audit_status);
     }
 
     $awaiting_user_phid = $saved->getParameter('awaitingUserPHID', null);
     if ($awaiting_user_phid) {
       // This is used only for the built-in "needs attention" filter,
       // so cheat and just use the already-loaded viewer rather than reloading
       // it.
       $query->withAuditAwaitingUser($this->requireViewer());
     }
 
     $repository_phids = $saved->getParameter('repositoryPHIDs', array());
     if ($repository_phids) {
       $query->withRepositoryPHIDs($repository_phids);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $auditor_phids = $saved->getParameter('auditorPHIDs', array());
     $commit_author_phids = $saved->getParameter(
       'commitAuthorPHIDs',
       array());
     $audit_status = $saved->getParameter('auditStatus', null);
     $repository_phids = $saved->getParameter('repositoryPHIDs', array());
 
     $phids = array_mergev(
       array(
         $auditor_phids,
         $commit_author_phids,
         $repository_phids,
       ));
 
     $handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new DiffusionAuditorDatasource())
           ->setName('auditorPHIDs')
           ->setLabel(pht('Auditors'))
           ->setValue(array_select_keys($handles, $auditor_phids)))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('authors')
           ->setLabel(pht('Commit Authors'))
           ->setValue(array_select_keys($handles, $commit_author_phids)))
        ->appendChild(
          id(new AphrontFormSelectControl())
          ->setName('auditStatus')
          ->setLabel(pht('Audit Status'))
          ->setOptions($this->getAuditStatusOptions())
          ->setValue($audit_status))
        ->appendChild(
          id(new AphrontFormTokenizerControl())
          ->setLabel(pht('Repositories'))
          ->setName('repositoryPHIDs')
          ->setDatasource(new DiffusionRepositoryDatasource())
          ->setValue(array_select_keys($handles, $repository_phids)));
 
   }
 
   protected function getURI($path) {
     return '/audit/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array();
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['need'] = pht('Need Attention');
       $names['problem'] = pht('Problem Commits');
     }
 
     $names['open'] = pht('Open Audits');
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['authored'] = pht('Authored Commits');
     }
 
     $names['all'] = pht('All Commits');
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
     $viewer = $this->requireViewer();
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'open':
         $query->setParameter(
           'auditStatus',
           DiffusionCommitQuery::AUDIT_STATUS_OPEN);
         return $query;
       case 'need':
         $query->setParameter('awaitingUserPHID', $viewer->getPHID());
         $query->setParameter(
           'auditStatus',
           DiffusionCommitQuery::AUDIT_STATUS_OPEN);
         $query->setParameter(
           'auditorPHIDs',
           PhabricatorAuditCommentEditor::loadAuditPHIDsForUser($viewer));
         return $query;
       case 'authored':
         $query->setParameter('commitAuthorPHIDs', array($viewer->getPHID()));
         return $query;
       case 'problem':
         $query->setParameter('commitAuthorPHIDs', array($viewer->getPHID()));
         $query->setParameter(
           'auditStatus',
           DiffusionCommitQuery::AUDIT_STATUS_CONCERN);
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   private function getAuditStatusOptions() {
     return array(
       DiffusionCommitQuery::AUDIT_STATUS_ANY => pht('Any'),
       DiffusionCommitQuery::AUDIT_STATUS_OPEN => pht('Open'),
       DiffusionCommitQuery::AUDIT_STATUS_CONCERN => pht('Concern Raised'),
       DiffusionCommitQuery::AUDIT_STATUS_ACCEPTED => pht('Accepted'),
       DiffusionCommitQuery::AUDIT_STATUS_PARTIAL => pht('Partially Audited'),
     );
   }
 
   protected function renderResultList(
     array $commits,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     assert_instances_of($commits, 'PhabricatorRepositoryCommit');
 
     $viewer = $this->requireViewer();
     $nodata = pht('No matching audits.');
     $view = id(new PhabricatorAuditListView())
       ->setUser($viewer)
       ->setCommits($commits)
       ->setAuthorityPHIDs(
         PhabricatorAuditCommentEditor::loadAuditPHIDsForUser($viewer))
       ->setNoDataString($nodata);
 
     $phids = $view->getRequiredHandlePHIDs();
     if ($phids) {
       $handles = id(new PhabricatorHandleQuery())
         ->setViewer($viewer)
         ->withPHIDs($phids)
         ->execute();
     } else {
       $handles = array();
     }
 
     $view->setHandles($handles);
 
     return $view->buildList();
   }
 
 }
diff --git a/src/applications/calendar/query/PhabricatorCalendarEventSearchEngine.php b/src/applications/calendar/query/PhabricatorCalendarEventSearchEngine.php
index e4c6356de5..ef6ee97d48 100644
--- a/src/applications/calendar/query/PhabricatorCalendarEventSearchEngine.php
+++ b/src/applications/calendar/query/PhabricatorCalendarEventSearchEngine.php
@@ -1,227 +1,227 @@
 <?php
 
 final class PhabricatorCalendarEventSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Calendar Events');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorCalendarApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'rangeStart',
       $this->readDateFromRequest($request, 'rangeStart'));
 
     $saved->setParameter(
       'rangeEnd',
       $this->readDateFromRequest($request, 'rangeEnd'));
 
     $saved->setParameter(
       'upcoming',
       $this->readBoolFromRequest($request, 'upcoming'));
 
     $saved->setParameter(
       'invitedPHIDs',
       $this->readUsersFromRequest($request, 'invited'));
 
     $saved->setParameter(
       'creatorPHIDs',
       $this->readUsersFromRequest($request, 'creators'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorCalendarEventQuery());
 
     $min_range = null;
     $max_range = null;
 
     if ($saved->getParameter('rangeStart')) {
       $min_range = $saved->getParameter('rangeStart');
     }
 
     if ($saved->getParameter('rangeEnd')) {
       $max_range = $saved->getParameter('rangeEnd');
     }
 
     if ($saved->getParameter('upcoming')) {
       if ($min_range) {
         $min_range = max(time(), $min_range);
       } else {
         $min_range = time();
       }
     }
 
     if ($min_range || $max_range) {
       $query->withDateRange($min_range, $max_range);
     }
 
     $invited_phids = $saved->getParameter('invitedPHIDs');
     if ($invited_phids) {
       $query->withInvitedPHIDs($invited_phids);
     }
 
     $creator_phids = $saved->getParameter('creatorPHIDs');
     if ($creator_phids) {
       $query->withCreatorPHIDs($creator_phids);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $range_start = $saved->getParameter('rangeStart');
     $range_end = $saved->getParameter('rangeEnd');
     $upcoming = $saved->getParameter('upcoming');
 
     $invited_phids = $saved->getParameter('invitedPHIDs', array());
     $creator_phids = $saved->getParameter('creatorPHIDs', array());
 
     $all_phids = array_merge(
       $invited_phids,
       $creator_phids);
 
     if ($all_phids) {
       $handles = id(new PhabricatorHandleQuery())
         ->setViewer($this->requireViewer())
         ->withPHIDs($all_phids)
         ->execute();
     } else {
       $handles = array();
     }
 
     $invited_handles = array_select_keys($handles, $invited_phids);
     $creator_handles = array_select_keys($handles, $creator_phids);
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('creators')
           ->setLabel(pht('Created By'))
           ->setValue($creator_handles))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('invited')
           ->setLabel(pht('Invited'))
           ->setValue($invited_handles))
       ->appendChild(
         id(new AphrontFormDateControl())
           ->setLabel(pht('Occurs After'))
           ->setUser($this->requireViewer())
           ->setName('rangeStart')
           ->setAllowNull(true)
           ->setValue($range_start))
       ->appendChild(
         id(new AphrontFormDateControl())
           ->setLabel(pht('Occurs Before'))
           ->setUser($this->requireViewer())
           ->setName('rangeEnd')
           ->setAllowNull(true)
           ->setValue($range_end))
       ->appendChild(
         id(new AphrontFormCheckboxControl())
           ->addCheckbox(
             'upcoming',
             1,
             pht('Show only upcoming events.'),
             $upcoming));
   }
 
   protected function getURI($path) {
     return '/calendar/event/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'upcoming' => pht('Upcoming Events'),
       'all'      => pht('All Events'),
     );
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'upcoming':
         return $query->setParameter('upcoming', true);
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function getRequiredHandlePHIDsForResultList(
     array $objects,
     PhabricatorSavedQuery $query) {
     $phids = array();
     foreach ($objects as $event) {
       $phids[$event->getUserPHID()] = 1;
     }
     return array_keys($phids);
   }
 
   protected function renderResultList(
     array $events,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($events, 'PhabricatorCalendarEvent');
 
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     foreach ($events as $event) {
       if ($event->getUserPHID() == $viewer->getPHID()) {
         $href = $this->getApplicationURI('/event/edit/'.$event->getID().'/');
       } else {
         $from  = $event->getDateFrom();
         $month = phabricator_format_local_time($from, $viewer, 'm');
         $year  = phabricator_format_local_time($from, $viewer, 'Y');
         $uri   = new PhutilURI($this->getApplicationURI());
         $uri->setQueryParams(
           array(
             'month' => $month,
             'year'  => $year,
           ));
         $href = (string) $uri;
       }
       $from = phabricator_datetime($event->getDateFrom(), $viewer);
       $to   = phabricator_datetime($event->getDateTo(), $viewer);
       $creator_handle = $handles[$event->getUserPHID()];
 
       $color = ($event->getStatus() == PhabricatorCalendarEvent::STATUS_AWAY)
         ? 'red'
         : 'yellow';
 
       $item = id(new PHUIObjectItemView())
         ->setHeader($event->getTerseSummary($viewer))
         ->setHref($href)
         ->setBarColor($color)
         ->addByline(pht('Creator: %s', $creator_handle->renderLink()))
         ->addAttribute(pht('From %s to %s', $from, $to))
         ->addAttribute(id(new PhutilUTF8StringTruncator())
           ->setMaximumGlyphs(64)
           ->truncateString($event->getDescription()));
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/conduit/query/PhabricatorConduitSearchEngine.php b/src/applications/conduit/query/PhabricatorConduitSearchEngine.php
index 7699294b84..199ab70216 100644
--- a/src/applications/conduit/query/PhabricatorConduitSearchEngine.php
+++ b/src/applications/conduit/query/PhabricatorConduitSearchEngine.php
@@ -1,200 +1,200 @@
 <?php
 
 final class PhabricatorConduitSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Conduit Methods');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorConduitApplication';
   }
 
   public function getPageSize(PhabricatorSavedQuery $saved) {
     return PHP_INT_MAX - 1;
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter('isStable', $request->getStr('isStable'));
     $saved->setParameter('isUnstable', $request->getStr('isUnstable'));
     $saved->setParameter('isDeprecated', $request->getStr('isDeprecated'));
 
     $saved->setParameter(
       'applicationNames',
       $request->getStrList('applicationNames'));
 
     $saved->setParameter('nameContains', $request->getStr('nameContains'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorConduitMethodQuery());
 
     $query->withIsStable($saved->getParameter('isStable'));
     $query->withIsUnstable($saved->getParameter('isUnstable'));
     $query->withIsDeprecated($saved->getParameter('isDeprecated'));
 
     $names = $saved->getParameter('applicationNames', array());
     if ($names) {
       $query->withApplicationNames($names);
     }
 
     $contains = $saved->getParameter('nameContains');
     if (strlen($contains)) {
       $query->withNameContains($contains);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $form
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel('Name Contains')
           ->setName('nameContains')
           ->setValue($saved->getParameter('nameContains')));
 
     $names = $saved->getParameter('applicationNames', array());
     $form
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel('Applications')
           ->setName('applicationNames')
           ->setValue(implode(', ', $names))
           ->setCaption(pht(
             'Example: %s',
             phutil_tag('tt', array(), 'differential, paste'))));
 
     $is_stable = $saved->getParameter('isStable');
     $is_unstable = $saved->getParameter('isUnstable');
     $is_deprecated = $saved->getParameter('isDeprecated');
     $form
       ->appendChild(
         id(new AphrontFormCheckboxControl())
           ->setLabel('Stability')
           ->addCheckbox(
             'isStable',
             1,
             hsprintf(
               '<strong>%s</strong>: %s',
               pht('Stable Methods'),
               pht('Show established API methods with stable interfaces.')),
             $is_stable)
           ->addCheckbox(
             'isUnstable',
             1,
             hsprintf(
               '<strong>%s</strong>: %s',
               pht('Unstable Methods'),
               pht('Show new methods which are subject to change.')),
             $is_unstable)
           ->addCheckbox(
             'isDeprecated',
             1,
             hsprintf(
               '<strong>%s</strong>: %s',
               pht('Deprecated Methods'),
               pht(
                 'Show old methods which will be deleted in a future '.
                 'version of Phabricator.')),
             $is_deprecated));
   }
 
   protected function getURI($path) {
     return '/conduit/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'modern' => pht('Modern Methods'),
       'all'    => pht('All Methods'),
     );
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'modern':
         return $query
           ->setParameter('isStable', true)
           ->setParameter('isUnstable', true);
       case 'all':
         return $query
           ->setParameter('isStable', true)
           ->setParameter('isUnstable', true)
           ->setParameter('isDeprecated', true);
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function renderResultList(
     array $methods,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($methods, 'ConduitAPIMethod');
 
     $viewer = $this->requireViewer();
 
     $out = array();
 
     $last = null;
     $list = null;
     foreach ($methods as $method) {
       $app = $method->getApplicationName();
       if ($app !== $last) {
         $last = $app;
         if ($list) {
           $out[] = $list;
         }
         $list = id(new PHUIObjectItemListView());
 
         $app_object = $method->getApplication();
         if ($app_object) {
           $app_name = $app_object->getName();
         } else {
           $app_name = $app;
         }
       }
 
       $method_name = $method->getAPIMethodName();
 
       $item = id(new PHUIObjectItemView())
         ->setHeader($method_name)
         ->setHref($this->getApplicationURI('method/'.$method_name.'/'))
         ->addAttribute($method->getMethodDescription());
 
       switch ($method->getMethodStatus()) {
         case ConduitAPIMethod::METHOD_STATUS_STABLE:
           break;
         case ConduitAPIMethod::METHOD_STATUS_UNSTABLE:
           $item->addIcon('warning-grey', pht('Unstable'));
           $item->setBarColor('yellow');
           break;
         case ConduitAPIMethod::METHOD_STATUS_DEPRECATED:
           $item->addIcon('warning', pht('Deprecated'));
           $item->setBarColor('red');
           break;
       }
 
       $list->addItem($item);
     }
 
     if ($list) {
       $out[] = $list;
     }
 
     return $out;
   }
 
 }
diff --git a/src/applications/countdown/query/PhabricatorCountdownSearchEngine.php b/src/applications/countdown/query/PhabricatorCountdownSearchEngine.php
index 2a99a429c1..2e8cab39d9 100644
--- a/src/applications/countdown/query/PhabricatorCountdownSearchEngine.php
+++ b/src/applications/countdown/query/PhabricatorCountdownSearchEngine.php
@@ -1,150 +1,150 @@
 <?php
 
 final class PhabricatorCountdownSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Countdowns');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorCountdownApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
     $saved->setParameter(
       'authorPHIDs',
       $this->readUsersFromRequest($request, 'authors'));
 
     $saved->setParameter('upcoming', $request->getBool('upcoming'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorCountdownQuery());
 
     $author_phids = $saved->getParameter('authorPHIDs', array());
     if ($author_phids) {
       $query->withAuthorPHIDs($author_phids);
     }
 
     if ($saved->getParameter('upcoming')) {
       $query->withUpcoming(true);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
     $phids = $saved_query->getParameter('authorPHIDs', array());
     $author_handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
 
     $upcoming = $saved_query->getParameter('upcoming');
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('authors')
           ->setLabel(pht('Authors'))
           ->setValue($author_handles))
       ->appendChild(
         id(new AphrontFormCheckboxControl())
           ->addCheckbox(
             'upcoming',
             1,
             pht('Show only countdowns that are still counting down.'),
             $upcoming));
   }
 
   protected function getURI($path) {
     return '/countdown/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'upcoming' => pht('Upcoming'),
       'all' => pht('All'),
     );
 
     if ($this->requireViewer()->getPHID()) {
       $names['authored'] = pht('Authored');
     }
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'authored':
         return $query->setParameter(
           'authorPHIDs',
           array($this->requireViewer()->getPHID()));
       case 'upcoming':
         return $query->setParameter('upcoming', true);
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function getRequiredHandlePHIDsForResultList(
     array $countdowns,
     PhabricatorSavedQuery $query) {
 
     return mpull($countdowns, 'getAuthorPHID');
   }
 
   protected function renderResultList(
     array $countdowns,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     assert_instances_of($countdowns, 'PhabricatorCountdown');
 
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     $list->setUser($viewer);
     foreach ($countdowns as $countdown) {
       $id = $countdown->getID();
 
       $item = id(new PHUIObjectItemView())
         ->setObjectName("C{$id}")
         ->setHeader($countdown->getTitle())
         ->setHref($this->getApplicationURI("{$id}/"))
         ->addByline(
           pht(
             'Created by %s',
             $handles[$countdown->getAuthorPHID()]->renderLink()));
 
       $epoch = $countdown->getEpoch();
       if ($epoch >= time()) {
         $item->addIcon(
           'none',
           pht('Ends %s', phabricator_datetime($epoch, $viewer)));
       } else {
         $item->addIcon(
           'delete',
           pht('Ended %s', phabricator_datetime($epoch, $viewer)));
         $item->setDisabled(true);
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/dashboard/query/PhabricatorDashboardPanelSearchEngine.php b/src/applications/dashboard/query/PhabricatorDashboardPanelSearchEngine.php
index 89c78d0b0a..7a50e56526 100644
--- a/src/applications/dashboard/query/PhabricatorDashboardPanelSearchEngine.php
+++ b/src/applications/dashboard/query/PhabricatorDashboardPanelSearchEngine.php
@@ -1,120 +1,120 @@
 <?php
 
 final class PhabricatorDashboardPanelSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Dashboard Panels');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorDashboardApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
     $saved->setParameter('status', $request->getStr('status'));
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorDashboardPanelQuery());
 
     $status = $saved->getParameter('status');
     switch ($status) {
       case 'active':
         $query->withArchived(false);
         break;
       case 'archived':
         $query->withArchived(true);
         break;
       default:
         break;
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $status = $saved_query->getParameter('status', '');
 
     $form
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Status'))
           ->setName('status')
           ->setValue($status)
           ->setOptions(
             array(
               '' => pht('(All Panels)'),
               'active' => pht('Active Panels'),
               'archived' => pht('Archived Panels'),
             )));
   }
 
   protected function getURI($path) {
     return '/dashboard/panel/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'active' => pht('Active Panels'),
       'all'    => pht('All Panels'),
     );
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'active':
         return $query->setParameter('status', 'active');
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function renderResultList(
     array $panels,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     $list->setUser($viewer);
     foreach ($panels as $panel) {
       $item = id(new PHUIObjectItemView())
         ->setObjectName($panel->getMonogram())
         ->setHeader($panel->getName())
         ->setHref('/'.$panel->getMonogram())
         ->setObject($panel);
 
       $impl = $panel->getImplementation();
       if ($impl) {
         $type_text = $impl->getPanelTypeName();
         $type_icon = 'none';
       } else {
         $type_text = nonempty($panel->getPanelType(), pht('Unknown Type'));
         $type_icon = 'fa-question';
       }
 
       $item->addIcon($type_icon, $type_text);
 
       if ($panel->getIsArchived()) {
         $item->setDisabled(true);
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/dashboard/query/PhabricatorDashboardSearchEngine.php b/src/applications/dashboard/query/PhabricatorDashboardSearchEngine.php
index 7263e93d00..f6f50b41ff 100644
--- a/src/applications/dashboard/query/PhabricatorDashboardSearchEngine.php
+++ b/src/applications/dashboard/query/PhabricatorDashboardSearchEngine.php
@@ -1,110 +1,110 @@
 <?php
 
 final class PhabricatorDashboardSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Dashboards');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorDashboardApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     return new PhabricatorSavedQuery();
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     return new PhabricatorDashboardQuery();
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
     return;
   }
 
   protected function getURI($path) {
     return '/dashboard/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'all' => pht('All Dashboards'),
     );
   }
 
   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 renderResultList(
     array $dashboards,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     $dashboards = mpull($dashboards, null, 'getPHID');
     $viewer = $this->requireViewer();
 
     if ($dashboards) {
       $installs = id(new PhabricatorDashboardInstall())
         ->loadAllWhere(
           'objectPHID IN (%Ls) AND dashboardPHID IN (%Ls)',
           array(
             PhabricatorHomeApplication::DASHBOARD_DEFAULT,
             $viewer->getPHID(),
           ),
           array_keys($dashboards));
       $installs = mpull($installs, null, 'getDashboardPHID');
     } else {
       $installs = array();
     }
 
     $list = new PHUIObjectItemListView();
     $list->setUser($viewer);
     $list->initBehavior('phabricator-tooltips', array());
     $list->requireResource('aphront-tooltip-css');
 
     foreach ($dashboards as $dashboard_phid => $dashboard) {
       $id = $dashboard->getID();
 
       $item = id(new PHUIObjectItemView())
         ->setObjectName(pht('Dashboard %d', $id))
         ->setHeader($dashboard->getName())
         ->setHref($this->getApplicationURI("view/{$id}/"))
         ->setObject($dashboard);
 
       if (isset($installs[$dashboard_phid])) {
         $install = $installs[$dashboard_phid];
         if ($install->getObjectPHID() == $viewer->getPHID()) {
           $attrs = array(
             'tip' => pht(
               'This dashboard is installed to your personal homepage.'),
           );
           $item->addIcon('fa-user', pht('Installed'), $attrs);
         } else {
           $attrs = array(
             'tip' => pht(
               'This dashboard is the default homepage for all users.'),
           );
           $item->addIcon('fa-globe', pht('Installed'), $attrs);
         }
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/differential/query/DifferentialRevisionSearchEngine.php b/src/applications/differential/query/DifferentialRevisionSearchEngine.php
index 61326399e5..d3cb3d9518 100644
--- a/src/applications/differential/query/DifferentialRevisionSearchEngine.php
+++ b/src/applications/differential/query/DifferentialRevisionSearchEngine.php
@@ -1,324 +1,324 @@
 <?php
 
 final class DifferentialRevisionSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Differential Revisions');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorDifferentialApplication';
   }
 
   public function getPageSize(PhabricatorSavedQuery $saved) {
     if ($saved->getQueryKey() == 'active') {
       return 0xFFFF;
     }
     return parent::getPageSize($saved);
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'responsiblePHIDs',
       $this->readUsersFromRequest($request, 'responsibles'));
 
     $saved->setParameter(
       'authorPHIDs',
       $this->readUsersFromRequest($request, 'authors'));
 
     $saved->setParameter(
       'reviewerPHIDs',
       $this->readUsersFromRequest(
         $request,
         'reviewers',
         array(
           PhabricatorProjectProjectPHIDType::TYPECONST,
         )));
 
     $saved->setParameter(
       'subscriberPHIDs',
       $this->readUsersFromRequest($request, 'subscribers'));
 
     $saved->setParameter(
       'repositoryPHIDs',
       $request->getArr('repositories'));
 
     $saved->setParameter(
       'draft',
       $request->getBool('draft'));
 
     $saved->setParameter(
       'order',
       $request->getStr('order'));
 
     $saved->setParameter(
       'status',
       $request->getStr('status'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new DifferentialRevisionQuery())
       ->needFlags(true)
       ->needDrafts(true)
       ->needRelationships(true);
 
     $responsible_phids = $saved->getParameter('responsiblePHIDs', array());
     if ($responsible_phids) {
       $query->withResponsibleUsers($responsible_phids);
     }
 
     $author_phids = $saved->getParameter('authorPHIDs', array());
     if ($author_phids) {
       $query->withAuthors($author_phids);
     }
 
     $reviewer_phids = $saved->getParameter('reviewerPHIDs', array());
     if ($reviewer_phids) {
       $query->withReviewers($reviewer_phids);
     }
 
     $subscriber_phids = $saved->getParameter('subscriberPHIDs', array());
     if ($subscriber_phids) {
       $query->withCCs($subscriber_phids);
     }
 
     $repository_phids = $saved->getParameter('repositoryPHIDs', array());
     if ($repository_phids) {
       $query->withRepositoryPHIDs($repository_phids);
     }
 
     $draft = $saved->getParameter('draft', false);
     if ($draft && $this->requireViewer()->isLoggedIn()) {
       $query->withDraftRepliesByAuthors(
         array($this->requireViewer()->getPHID()));
     }
 
     $status = $saved->getParameter('status');
     if (idx($this->getStatusOptions(), $status)) {
       $query->withStatus($status);
     }
 
     $order = $saved->getParameter('order');
     if (idx($this->getOrderOptions(), $order)) {
       $query->setOrder($order);
     } else {
       $query->setOrder(DifferentialRevisionQuery::ORDER_CREATED);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $responsible_phids = $saved->getParameter('responsiblePHIDs', array());
     $author_phids = $saved->getParameter('authorPHIDs', array());
     $reviewer_phids = $saved->getParameter('reviewerPHIDs', array());
     $subscriber_phids = $saved->getParameter('subscriberPHIDs', array());
     $repository_phids = $saved->getParameter('repositoryPHIDs', array());
     $only_draft = $saved->getParameter('draft', false);
 
     $all_phids = array_mergev(
       array(
         $responsible_phids,
         $author_phids,
         $reviewer_phids,
         $subscriber_phids,
         $repository_phids,
       ));
 
     $handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($all_phids)
       ->execute();
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Responsible Users'))
           ->setName('responsibles')
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setValue(array_select_keys($handles, $responsible_phids)))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Authors'))
           ->setName('authors')
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setValue(array_select_keys($handles, $author_phids)))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Reviewers'))
           ->setName('reviewers')
           ->setDatasource(new PhabricatorProjectOrUserDatasource())
           ->setValue(array_select_keys($handles, $reviewer_phids)))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Subscribers'))
           ->setName('subscribers')
           ->setDatasource(new PhabricatorMetaMTAMailableDatasource())
           ->setValue(array_select_keys($handles, $subscriber_phids)))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Repositories'))
           ->setName('repositories')
           ->setDatasource(new DiffusionRepositoryDatasource())
           ->setValue(array_select_keys($handles, $repository_phids)))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Status'))
           ->setName('status')
           ->setOptions($this->getStatusOptions())
           ->setValue($saved->getParameter('status')));
 
     if ($this->requireViewer()->isLoggedIn()) {
       $form
         ->appendChild(
           id(new AphrontFormCheckboxControl())
             ->addCheckbox(
               'draft',
               1,
               pht('Show only revisions with a draft comment.'),
               $only_draft));
     }
 
     $form
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Order'))
           ->setName('order')
           ->setOptions($this->getOrderOptions())
           ->setValue($saved->getParameter('order')));
   }
 
   protected function getURI($path) {
     return '/differential/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array();
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['active'] = pht('Active Revisions');
       $names['authored'] = pht('Authored');
     }
 
     $names['all'] = pht('All Revisions');
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     $viewer = $this->requireViewer();
 
     switch ($query_key) {
       case 'active':
         return $query
           ->setParameter('responsiblePHIDs', array($viewer->getPHID()))
           ->setParameter('status', DifferentialRevisionQuery::STATUS_OPEN);
       case 'authored':
         return $query
           ->setParameter('authorPHIDs', array($viewer->getPHID()));
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   private function getStatusOptions() {
     return array(
       DifferentialRevisionQuery::STATUS_ANY            => pht('All'),
       DifferentialRevisionQuery::STATUS_OPEN           => pht('Open'),
       DifferentialRevisionQuery::STATUS_ACCEPTED       => pht('Accepted'),
       DifferentialRevisionQuery::STATUS_NEEDS_REVIEW   => pht('Needs Review'),
       DifferentialRevisionQuery::STATUS_NEEDS_REVISION => pht('Needs Revision'),
       DifferentialRevisionQuery::STATUS_CLOSED         => pht('Closed'),
       DifferentialRevisionQuery::STATUS_ABANDONED      => pht('Abandoned'),
     );
   }
 
   private function getOrderOptions() {
     return array(
       DifferentialRevisionQuery::ORDER_CREATED    => pht('Created'),
       DifferentialRevisionQuery::ORDER_MODIFIED   => pht('Updated'),
     );
   }
 
   protected function renderResultList(
     array $revisions,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($revisions, 'DifferentialRevision');
 
     $viewer = $this->requireViewer();
     $template = id(new DifferentialRevisionListView())
       ->setUser($viewer);
 
     $views = array();
     if ($query->getQueryKey() == 'active') {
         $split = DifferentialRevisionQuery::splitResponsible(
           $revisions,
           $query->getParameter('responsiblePHIDs'));
         list($blocking, $active, $waiting) = $split;
 
       $views[] = id(clone $template)
         ->setHeader(pht('Blocking Others'))
         ->setNoDataString(
           pht('No revisions are blocked on your action.'))
         ->setHighlightAge(true)
         ->setRevisions($blocking)
         ->setHandles(array());
 
       $views[] = id(clone $template)
         ->setHeader(pht('Action Required'))
         ->setNoDataString(
           pht('No revisions require your action.'))
         ->setHighlightAge(true)
         ->setRevisions($active)
         ->setHandles(array());
 
       $views[] = id(clone $template)
         ->setHeader(pht('Waiting on Others'))
         ->setNoDataString(
           pht('You have no revisions waiting on others.'))
         ->setRevisions($waiting)
         ->setHandles(array());
     } else {
       $views[] = id(clone $template)
         ->setRevisions($revisions)
         ->setHandles(array());
     }
 
     $phids = array_mergev(mpull($views, 'getRequiredHandlePHIDs'));
     if ($phids) {
       $handles = id(new PhabricatorHandleQuery())
         ->setViewer($viewer)
         ->withPHIDs($phids)
         ->execute();
     } else {
       $handles = array();
     }
 
     foreach ($views as $view) {
       $view->setHandles($handles);
     }
 
     if (count($views) == 1) {
       // Reduce this to a PHUIObjectItemListView so we can get the free
       // support from ApplicationSearch.
       return head($views)->render();
     } else {
       return $views;
     }
   }
 
 }
diff --git a/src/applications/diviner/query/DivinerAtomSearchEngine.php b/src/applications/diviner/query/DivinerAtomSearchEngine.php
index 014ac3ad5e..ff9e7e480c 100644
--- a/src/applications/diviner/query/DivinerAtomSearchEngine.php
+++ b/src/applications/diviner/query/DivinerAtomSearchEngine.php
@@ -1,122 +1,122 @@
 <?php
 
 final class DivinerAtomSearchEngine extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Documentation Atoms');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorDivinerApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'types',
       $this->readListFromRequest($request, 'types'));
 
     $saved->setParameter('name', $request->getStr('name'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new DivinerAtomQuery());
 
     $types = $saved->getParameter('types');
     if ($types) {
       $query->withTypes($types);
     }
 
     $name = $saved->getParameter('name');
     if ($name) {
       $query->withNameContains($name);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $all_types = array();
     foreach (DivinerAtom::getAllTypes() as $type) {
       $all_types[$type] = DivinerAtom::getAtomTypeNameString($type);
     }
     asort($all_types);
 
     $types = $saved->getParameter('types', array());
     $types = array_fuse($types);
     $type_control = id(new AphrontFormCheckboxControl())
       ->setLabel(pht('Types'));
     foreach ($all_types as $type => $name) {
       $type_control->addCheckbox(
         'types[]',
         $type,
         $name,
         isset($types[$type]));
     }
 
     $form
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Name Contains'))
           ->setName('name')
           ->setValue($saved->getParameter('name')))
       ->appendChild($type_control);
   }
 
   protected function getURI($path) {
     return '/diviner/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'all' => pht('All'),
     );
   }
 
   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 renderResultList(
     array $symbols,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     assert_instances_of($symbols, 'DivinerLiveSymbol');
 
     $viewer = $this->requireViewer();
 
     $list = id(new PHUIObjectItemListView())
       ->setUser($viewer);
 
     foreach ($symbols as $symbol) {
       $type = $symbol->getType();
       $type_name = DivinerAtom::getAtomTypeNameString($type);
 
       $item = id(new PHUIObjectItemView())
         ->setHeader($symbol->getTitle())
         ->setHref($symbol->getURI())
         ->addAttribute($symbol->getSummary())
         ->addIcon('none', $type_name);
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/drydock/query/DrydockBlueprintSearchEngine.php b/src/applications/drydock/query/DrydockBlueprintSearchEngine.php
index adf1300bf4..8895ed09bb 100644
--- a/src/applications/drydock/query/DrydockBlueprintSearchEngine.php
+++ b/src/applications/drydock/query/DrydockBlueprintSearchEngine.php
@@ -1,75 +1,75 @@
 <?php
 
 final class DrydockBlueprintSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Drydock Blueprints');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorDrydockApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     return new PhabricatorSavedQuery();
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     return new DrydockBlueprintQuery();
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {}
 
   protected function getURI($path) {
     return '/drydock/blueprint/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'all' => pht('All Blueprints'),
     );
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
-  public function renderResultList(
+  protected function renderResultList(
     array $blueprints,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($blueprints, 'DrydockBlueprint');
 
     $viewer = $this->requireViewer();
     $view = new PHUIObjectItemListView();
 
     foreach ($blueprints as $blueprint) {
       $item = id(new PHUIObjectItemView())
         ->setHeader($blueprint->getBlueprintName())
         ->setHref($this->getApplicationURI('/blueprint/'.$blueprint->getID()))
         ->setObjectName(pht('Blueprint %d', $blueprint->getID()));
 
       if (!$blueprint->getImplementation()->isEnabled()) {
         $item->setDisabled(true);
       }
 
       $item->addAttribute($blueprint->getImplementation()->getBlueprintName());
 
       $view->addItem($item);
     }
 
     return $view;
   }
 
 }
diff --git a/src/applications/drydock/query/DrydockLeaseSearchEngine.php b/src/applications/drydock/query/DrydockLeaseSearchEngine.php
index 16b606e83a..fffca96a3b 100644
--- a/src/applications/drydock/query/DrydockLeaseSearchEngine.php
+++ b/src/applications/drydock/query/DrydockLeaseSearchEngine.php
@@ -1,98 +1,98 @@
 <?php
 
 final class DrydockLeaseSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Drydock Leases');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorDrydockApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'statuses',
       $this->readListFromRequest($request, 'statuses'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new DrydockLeaseQuery());
 
     $statuses = $saved->getParameter('statuses', array());
     if ($statuses) {
       $query->withStatuses($statuses);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $statuses = $saved->getParameter('statuses', array());
 
     $status_control = id(new AphrontFormCheckboxControl())
       ->setLabel(pht('Status'));
     foreach (DrydockLeaseStatus::getAllStatuses() as $status) {
       $status_control->addCheckbox(
         'statuses[]',
         $status,
         DrydockLeaseStatus::getNameForStatus($status),
         in_array($status, $statuses));
     }
 
     $form
       ->appendChild($status_control);
 
   }
 
   protected function getURI($path) {
     return '/drydock/lease/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'active' => pht('Active Leases'),
       'all' => pht('All Leases'),
     );
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'active':
         return $query->setParameter(
           'statuses',
           array(
             DrydockLeaseStatus::STATUS_PENDING,
             DrydockLeaseStatus::STATUS_ACQUIRING,
             DrydockLeaseStatus::STATUS_ACTIVE,
           ));
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function renderResultList(
     array $leases,
     PhabricatorSavedQuery $saved,
     array $handles) {
 
     return id(new DrydockLeaseListView())
       ->setUser($this->requireViewer())
       ->setLeases($leases)
       ->render();
   }
 
 }
diff --git a/src/applications/drydock/query/DrydockLogSearchEngine.php b/src/applications/drydock/query/DrydockLogSearchEngine.php
index 12eec9afc9..915c503868 100644
--- a/src/applications/drydock/query/DrydockLogSearchEngine.php
+++ b/src/applications/drydock/query/DrydockLogSearchEngine.php
@@ -1,58 +1,58 @@
 <?php
 
 final class DrydockLogSearchEngine extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Drydock Logs');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorDrydockApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     return new PhabricatorSavedQuery();
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     return new DrydockLogQuery();
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {}
 
   protected function getURI($path) {
     return '/drydock/log/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'all' => pht('All 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 renderResultList(
     array $logs,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     return id(new DrydockLogListView())
       ->setUser($this->requireViewer())
       ->setLogs($logs)
       ->render();
   }
 
 }
diff --git a/src/applications/drydock/query/DrydockResourceSearchEngine.php b/src/applications/drydock/query/DrydockResourceSearchEngine.php
index 9f0e2b0012..a17d2fd600 100644
--- a/src/applications/drydock/query/DrydockResourceSearchEngine.php
+++ b/src/applications/drydock/query/DrydockResourceSearchEngine.php
@@ -1,96 +1,96 @@
 <?php
 
 final class DrydockResourceSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Drydock Resources');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorDrydockApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'statuses',
       $this->readListFromRequest($request, 'statuses'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new DrydockResourceQuery());
 
     $statuses = $saved->getParameter('statuses', array());
     if ($statuses) {
       $query->withStatuses($statuses);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $statuses = $saved->getParameter('statuses', array());
 
     $status_control = id(new AphrontFormCheckboxControl())
       ->setLabel(pht('Status'));
     foreach (DrydockResourceStatus::getAllStatuses() as $status) {
       $status_control->addCheckbox(
         'statuses[]',
         $status,
         DrydockResourceStatus::getNameForStatus($status),
         in_array($status, $statuses));
     }
 
     $form
       ->appendChild($status_control);
   }
 
   protected function getURI($path) {
     return '/drydock/resource/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'active' => pht('Active Resources'),
       'all' => pht('All Resources'),
     );
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'active':
         return $query->setParameter(
           'statuses',
           array(
             DrydockResourceStatus::STATUS_PENDING,
             DrydockResourceStatus::STATUS_OPEN,
           ));
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function renderResultList(
     array $resources,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     return id(new DrydockResourceListView())
       ->setUser($this->requireViewer())
       ->setResources($resources)
       ->render();
   }
 
 }
diff --git a/src/applications/feed/query/PhabricatorFeedSearchEngine.php b/src/applications/feed/query/PhabricatorFeedSearchEngine.php
index 268406a335..d84960e950 100644
--- a/src/applications/feed/query/PhabricatorFeedSearchEngine.php
+++ b/src/applications/feed/query/PhabricatorFeedSearchEngine.php
@@ -1,150 +1,150 @@
 <?php
 
 final class PhabricatorFeedSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Feed Stories');
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'userPHIDs',
       $this->readUsersFromRequest($request, 'users'));
 
     $saved->setParameter(
       'projectPHIDs',
       array_values($request->getArr('projectPHIDs')));
 
     $saved->setParameter(
       'viewerProjects',
       $request->getBool('viewerProjects'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorFeedQuery());
 
     $phids = array();
 
     $user_phids = $saved->getParameter('userPHIDs');
     if ($user_phids) {
       $phids[] = $user_phids;
     }
 
     $proj_phids = $saved->getParameter('projectPHIDs');
     if ($proj_phids) {
       $phids[] = $proj_phids;
     }
 
     $viewer_projects = $saved->getParameter('viewerProjects');
     if ($viewer_projects) {
       $viewer = $this->requireViewer();
       $projects = id(new PhabricatorProjectQuery())
         ->setViewer($viewer)
         ->withMemberPHIDs(array($viewer->getPHID()))
         ->execute();
       $phids[] = mpull($projects, 'getPHID');
     }
 
     $phids = array_mergev($phids);
     if ($phids) {
       $query->setFilterPHIDs($phids);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $user_phids = $saved_query->getParameter('userPHIDs', array());
     $proj_phids = $saved_query->getParameter('projectPHIDs', array());
 
     $phids = array_merge($user_phids, $proj_phids);
     $handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
     $user_handles = array_select_keys($handles, $user_phids);
     $proj_handles = array_select_keys($handles, $proj_phids);
 
     $viewer_projects = $saved_query->getParameter('viewerProjects');
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('users')
           ->setLabel(pht('Include Users'))
           ->setValue($user_handles))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorProjectDatasource())
           ->setName('projectPHIDs')
           ->setLabel(pht('Include Projects'))
           ->setValue($proj_handles))
       ->appendChild(
         id(new AphrontFormCheckboxControl())
           ->addCheckbox(
             'viewerProjects',
             1,
             pht('Include stories about projects I am a member of.'),
             $viewer_projects));
   }
 
   protected function getURI($path) {
     return '/feed/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'all' => pht('All Stories'),
     );
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['projects'] = pht('Projects');
     }
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
 
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'projects':
         return $query->setParameter('viewerProjects', true);
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function renderResultList(
     array $objects,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     $builder = new PhabricatorFeedBuilder($objects);
 
     if ($this->isPanelContext()) {
       $builder->setShowHovercards(false);
     } else {
       $builder->setShowHovercards(true);
     }
 
     $builder->setUser($this->requireViewer());
     $view = $builder->buildView();
 
     return phutil_tag_div('phabricator-feed-frame', $view);
   }
 
 }
diff --git a/src/applications/files/query/PhabricatorFileSearchEngine.php b/src/applications/files/query/PhabricatorFileSearchEngine.php
index 1811630f45..c11361be69 100644
--- a/src/applications/files/query/PhabricatorFileSearchEngine.php
+++ b/src/applications/files/query/PhabricatorFileSearchEngine.php
@@ -1,188 +1,188 @@
 <?php
 
 final class PhabricatorFileSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Files');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorFilesApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
     $saved->setParameter(
       'authorPHIDs',
       $this->readUsersFromRequest($request, 'authors'));
 
     $saved->setParameter('explicit', $request->getBool('explicit'));
     $saved->setParameter('createdStart', $request->getStr('createdStart'));
     $saved->setParameter('createdEnd', $request->getStr('createdEnd'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorFileQuery())
       ->withAuthorPHIDs($saved->getParameter('authorPHIDs', array()));
 
     if ($saved->getParameter('explicit')) {
       $query->showOnlyExplicitUploads(true);
     }
 
     $start = $this->parseDateTime($saved->getParameter('createdStart'));
     $end = $this->parseDateTime($saved->getParameter('createdEnd'));
 
     if ($start) {
       $query->withDateCreatedAfter($start);
     }
 
     if ($end) {
       $query->withDateCreatedBefore($end);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $phids = $saved_query->getParameter('authorPHIDs', array());
     $author_handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
 
     $explicit = $saved_query->getParameter('explicit');
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('authors')
           ->setLabel(pht('Authors'))
           ->setValue($author_handles))
       ->appendChild(
         id(new AphrontFormCheckboxControl())
           ->addCheckbox(
             'explicit',
             1,
             pht('Show only manually uploaded files.'),
             $explicit));
 
     $this->buildDateRange(
       $form,
       $saved_query,
       'createdStart',
       pht('Created After'),
       'createdEnd',
       pht('Created Before'));
   }
 
   protected function getURI($path) {
     return '/file/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array();
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['authored'] = pht('Authored');
     }
 
     $names += array(
       'all' => pht('All'),
     );
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'authored':
         $author_phid = array($this->requireViewer()->getPHID());
         return $query
           ->setParameter('authorPHIDs', $author_phid)
           ->setParameter('explicit', true);
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function getRequiredHandlePHIDsForResultList(
     array $files,
     PhabricatorSavedQuery $query) {
     return mpull($files, 'getAuthorPHID');
   }
 
   protected function renderResultList(
     array $files,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     assert_instances_of($files, 'PhabricatorFile');
 
     $request = $this->getRequest();
     if ($request) {
       $highlighted_ids = $request->getStrList('h');
     } else {
       $highlighted_ids = array();
     }
 
     $viewer = $this->requireViewer();
 
     $highlighted_ids = array_fill_keys($highlighted_ids, true);
 
     $list_view = id(new PHUIObjectItemListView())
       ->setUser($viewer);
 
     foreach ($files as $file) {
       $id = $file->getID();
       $phid = $file->getPHID();
       $name = $file->getName();
       $file_uri = $this->getApplicationURI("/info/{$phid}/");
 
       $date_created = phabricator_date($file->getDateCreated(), $viewer);
       $author_phid = $file->getAuthorPHID();
       if ($author_phid) {
         $author_link = $handles[$author_phid]->renderLink();
         $uploaded = pht('Uploaded by %s on %s', $author_link, $date_created);
       } else {
         $uploaded = pht('Uploaded on %s', $date_created);
       }
 
       $item = id(new PHUIObjectItemView())
         ->setObject($file)
         ->setObjectName("F{$id}")
         ->setHeader($name)
         ->setHref($file_uri)
         ->addAttribute($uploaded)
         ->addIcon('none', phutil_format_bytes($file->getByteSize()));
 
       $ttl = $file->getTTL();
       if ($ttl !== null) {
         $item->addIcon('blame', pht('Temporary'));
       }
 
       if (isset($highlighted_ids[$id])) {
         $item->setEffect('highlighted');
       }
 
       $list_view->addItem($item);
     }
 
     $list_view->appendChild(id(new PhabricatorGlobalUploadTargetView())
       ->setUser($viewer));
 
     return $list_view;
   }
 
 }
diff --git a/src/applications/flag/query/PhabricatorFlagSearchEngine.php b/src/applications/flag/query/PhabricatorFlagSearchEngine.php
index e973fa428b..4c9308f04f 100644
--- a/src/applications/flag/query/PhabricatorFlagSearchEngine.php
+++ b/src/applications/flag/query/PhabricatorFlagSearchEngine.php
@@ -1,182 +1,182 @@
 <?php
 
 final class PhabricatorFlagSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Flags');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorFlagsApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
     $saved->setParameter('colors', $request->getArr('colors'));
     $saved->setParameter('group', $request->getStr('group'));
     $saved->setParameter('objectFilter', $request->getStr('objectFilter'));
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorFlagQuery())
       ->needHandles(true)
       ->withOwnerPHIDs(array($this->requireViewer()->getPHID()));
 
     $colors = $saved->getParameter('colors');
     if ($colors) {
       $query->withColors($colors);
     }
     $group = $saved->getParameter('group');
     $options = $this->getGroupOptions();
     if ($group && isset($options[$group])) {
       $query->setGroupBy($group);
     }
 
     $object_filter = $saved->getParameter('objectFilter');
     $objects = $this->getObjectFilterOptions();
     if ($object_filter && isset($objects[$object_filter])) {
       $query->withTypes(array($object_filter));
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $form
       ->appendChild(
         id(new PhabricatorFlagSelectControl())
         ->setName('colors')
         ->setLabel(pht('Colors'))
         ->setValue($saved_query->getParameter('colors', array())))
       ->appendChild(
         id(new AphrontFormSelectControl())
         ->setName('group')
         ->setLabel(pht('Group By'))
         ->setValue($saved_query->getParameter('group'))
         ->setOptions($this->getGroupOptions()))
       ->appendChild(
         id(new AphrontFormSelectControl())
         ->setName('objectFilter')
         ->setLabel(pht('Object Type'))
         ->setValue($saved_query->getParameter('objectFilter'))
         ->setOptions($this->getObjectFilterOptions()));
   }
 
   protected function getURI($path) {
     return '/flag/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'all' => pht('Flagged'),
     );
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
 
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   private function getGroupOptions() {
     return array(
       PhabricatorFlagQuery::GROUP_NONE => pht('None'),
       PhabricatorFlagQuery::GROUP_COLOR => pht('Color'),
     );
   }
 
   private function getObjectFilterOptions() {
     $objects = id(new PhutilSymbolLoader())
       ->setAncestorClass('PhabricatorFlaggableInterface')
       ->loadObjects();
     $all_types = PhabricatorPHIDType::getAllTypes();
     $options = array();
     foreach ($objects as $object) {
       $phid = $object->generatePHID();
       $phid_type = phid_get_type($phid);
       $type_object = idx($all_types, $phid_type);
       if ($type_object) {
         $options[$phid_type] = $type_object->getTypeName();
       }
     }
     // sort it alphabetically...
     asort($options);
     $default_option = array(
       0 => pht('All Object Types'),
     );
     // ...and stick the default option on front
     $options = array_merge($default_option, $options);
 
     return $options;
   }
 
   protected function renderResultList(
     array $flags,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($flags, 'PhabricatorFlag');
 
     $viewer = $this->requireViewer();
 
     $list = id(new PHUIObjectItemListView())
       ->setUser($viewer);
     foreach ($flags as $flag) {
       $id = $flag->getID();
       $phid = $flag->getObjectPHID();
 
       $class = PhabricatorFlagColor::getCSSClass($flag->getColor());
 
       $flag_icon = phutil_tag(
         'div',
         array(
           'class' => 'phabricator-flag-icon '.$class,
         ),
         '');
 
       $item = id(new PHUIObjectItemView())
         ->addHeadIcon($flag_icon)
         ->setHeader($flag->getHandle()->getFullName())
         ->setHref($flag->getHandle()->getURI());
 
       $item->addAction(
         id(new PHUIListItemView())
           ->setIcon('fa-pencil')
           ->setHref($this->getApplicationURI("edit/{$phid}/"))
           ->setWorkflow(true));
 
       $item->addAction(
         id(new PHUIListItemView())
           ->setIcon('fa-times')
           ->setHref($this->getApplicationURI("delete/{$id}/"))
           ->setWorkflow(true));
 
       if ($flag->getNote()) {
         $item->addAttribute($flag->getNote());
       }
 
       $item->addIcon(
         'none',
         phabricator_datetime($flag->getDateCreated(), $viewer));
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 
 }
diff --git a/src/applications/fund/query/FundBackerSearchEngine.php b/src/applications/fund/query/FundBackerSearchEngine.php
index 4ad4b7c538..a634fbfe42 100644
--- a/src/applications/fund/query/FundBackerSearchEngine.php
+++ b/src/applications/fund/query/FundBackerSearchEngine.php
@@ -1,160 +1,160 @@
 <?php
 
 final class FundBackerSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   private $initiative;
 
   public function setInitiative(FundInitiative $initiative) {
     $this->initiative = $initiative;
     return $this;
   }
 
   public function getInitiative() {
     return $this->initiative;
   }
 
   public function getResultTypeDescription() {
     return pht('Fund Backers');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorFundApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'backerPHIDs',
       $this->readUsersFromRequest($request, 'backers'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new FundBackerQuery());
 
     $query->withStatuses(array(FundBacker::STATUS_PURCHASED));
 
     if ($this->getInitiative()) {
       $query->withInitiativePHIDs(
         array(
           $this->getInitiative()->getPHID(),
         ));
     }
 
     $backer_phids = $saved->getParameter('backerPHIDs');
     if ($backer_phids) {
       $query->withBackerPHIDs($backer_phids);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
 
     $backer_phids = $saved->getParameter('backerPHIDs', array());
 
     $all_phids = array_mergev(
       array(
         $backer_phids,
       ));
 
     $handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($all_phids)
       ->execute();
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Backers'))
           ->setName('backers')
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setValue(array_select_keys($handles, $backer_phids)));
   }
 
   protected function getURI($path) {
     if ($this->getInitiative()) {
       return '/fund/backers/'.$this->getInitiative()->getID().'/'.$path;
     } else {
       return '/fund/backers/'.$path;
     }
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array();
     $names['all'] = pht('All Backers');
 
     return $names;
   }
 
   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 $backers,
     PhabricatorSavedQuery $query) {
 
     $phids = array();
     foreach ($backers as $backer) {
       $phids[] = $backer->getBackerPHID();
       $phids[] = $backer->getInitiativePHID();
     }
 
     return $phids;
   }
 
   protected function renderResultList(
     array $backers,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($backers, 'FundBacker');
 
     $viewer = $this->requireViewer();
 
     $rows = array();
     foreach ($backers as $backer) {
       $rows[] = array(
         $handles[$backer->getInitiativePHID()]->renderLink(),
         $handles[$backer->getBackerPHID()]->renderLink(),
         $backer->getAmountAsCurrency()->formatForDisplay(),
         phabricator_datetime($backer->getDateCreated(), $viewer),
       );
     }
 
     $table = id(new AphrontTableView($rows))
       ->setHeaders(
         array(
           pht('Initiative'),
           pht('Backer'),
           pht('Amount'),
           pht('Date'),
         ))
       ->setColumnClasses(
         array(
           null,
           null,
           'wide right',
           'right',
         ));
 
     return id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Backers'))
       ->appendChild($table);
   }
 
 }
diff --git a/src/applications/fund/query/FundInitiativeSearchEngine.php b/src/applications/fund/query/FundInitiativeSearchEngine.php
index 17e5f585f8..63c25952ee 100644
--- a/src/applications/fund/query/FundInitiativeSearchEngine.php
+++ b/src/applications/fund/query/FundInitiativeSearchEngine.php
@@ -1,180 +1,180 @@
 <?php
 
 final class FundInitiativeSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Fund Initiatives');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorFundApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'ownerPHIDs',
       $this->readUsersFromRequest($request, 'owners'));
 
     $saved->setParameter(
       'statuses',
       $this->readListFromRequest($request, 'statuses'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new FundInitiativeQuery())
       ->needProjectPHIDs(true);
 
     $owner_phids = $saved->getParameter('ownerPHIDs');
     if ($owner_phids) {
       $query->withOwnerPHIDs($owner_phids);
     }
 
     $statuses = $saved->getParameter('statuses');
     if ($statuses) {
       $query->withStatuses($statuses);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $statuses = $saved->getParameter('statuses', array());
     $statuses = array_fuse($statuses);
 
     $owner_phids = $saved->getParameter('ownerPHIDs', array());
 
     $all_phids = array_mergev(
       array(
         $owner_phids,
       ));
 
     $handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($all_phids)
       ->execute();
 
     $status_map = FundInitiative::getStatusNameMap();
     $status_control = id(new AphrontFormCheckboxControl())
       ->setLabel(pht('Statuses'));
     foreach ($status_map as $status => $name) {
       $status_control->addCheckbox(
         'statuses[]',
         $status,
         $name,
         isset($statuses[$status]));
     }
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Owners'))
           ->setName('owners')
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setValue(array_select_keys($handles, $owner_phids)))
       ->appendChild($status_control);
   }
 
   protected function getURI($path) {
     return '/fund/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array();
 
     $names['open'] = pht('Open Initiatives');
     if ($this->requireViewer()->isLoggedIn()) {
       $names['owned'] = pht('Owned Initiatives');
     }
     $names['all'] = pht('All Initiatives');
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'owned':
         return $query->setParameter(
           'ownerPHIDs',
           array(
             $this->requireViewer()->getPHID(),
           ));
       case 'open':
         return $query->setParameter(
           'statuses',
           array(
             FundInitiative::STATUS_OPEN,
           ));
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function getRequiredHandlePHIDsForResultList(
     array $initiatives,
     PhabricatorSavedQuery $query) {
 
     $phids = array();
     foreach ($initiatives as $initiative) {
       $phids[] = $initiative->getOwnerPHID();
       foreach ($initiative->getProjectPHIDs() as $project_phid) {
         $phids[] = $project_phid;
       }
     }
 
     return $phids;
   }
 
   protected function renderResultList(
     array $initiatives,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($initiatives, 'FundInitiative');
 
     $viewer = $this->requireViewer();
 
     $list = id(new PHUIObjectItemListView());
     foreach ($initiatives as $initiative) {
       $owner_handle = $handles[$initiative->getOwnerPHID()];
 
       $item = id(new PHUIObjectItemView())
         ->setObjectName($initiative->getMonogram())
         ->setHeader($initiative->getName())
         ->setHref('/'.$initiative->getMonogram())
         ->addByline(pht('Owner: %s', $owner_handle->renderLink()));
 
       if ($initiative->isClosed()) {
         $item->setDisabled(true);
       }
 
       $project_handles = array_select_keys(
         $handles,
         $initiative->getProjectPHIDs());
       if ($project_handles) {
         $item->addAttribute(
           id(new PHUIHandleTagListView())
             ->setLimit(4)
             ->setSlim(true)
             ->setHandles($project_handles));
       }
 
       $list->addItem($item);
     }
 
 
     return $list;
   }
 
 }
diff --git a/src/applications/harbormaster/query/HarbormasterBuildPlanSearchEngine.php b/src/applications/harbormaster/query/HarbormasterBuildPlanSearchEngine.php
index 70d5b867d1..d72d9e18f3 100644
--- a/src/applications/harbormaster/query/HarbormasterBuildPlanSearchEngine.php
+++ b/src/applications/harbormaster/query/HarbormasterBuildPlanSearchEngine.php
@@ -1,114 +1,114 @@
 <?php
 
 final class HarbormasterBuildPlanSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Harbormaster Build Plans');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorHarbormasterApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'status',
       $this->readListFromRequest($request, 'status'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new HarbormasterBuildPlanQuery());
 
     $status = $saved->getParameter('status', array());
     if ($status) {
       $query->withStatuses($status);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $status = $saved_query->getParameter('status', array());
 
     $form
       ->appendChild(
         id(new AphrontFormCheckboxControl())
           ->setLabel('Status')
           ->addCheckbox(
             'status[]',
             HarbormasterBuildPlan::STATUS_ACTIVE,
             pht('Active'),
             in_array(HarbormasterBuildPlan::STATUS_ACTIVE, $status))
           ->addCheckbox(
             'status[]',
             HarbormasterBuildPlan::STATUS_DISABLED,
             pht('Disabled'),
             in_array(HarbormasterBuildPlan::STATUS_DISABLED, $status)));
   }
 
   protected function getURI($path) {
     return '/harbormaster/plan/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'active' => pht('Active Plans'),
       'all' => pht('All Plans'),
     );
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'active':
         return $query->setParameter(
           'status',
           array(
             HarbormasterBuildPlan::STATUS_ACTIVE,
           ));
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function renderResultList(
     array $plans,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($plans, 'HarbormasterBuildPlan');
 
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     foreach ($plans as $plan) {
       $id = $plan->getID();
 
       $item = id(new PHUIObjectItemView())
         ->setObjectName(pht('Plan %d', $plan->getID()))
         ->setHeader($plan->getName());
 
       if ($plan->isDisabled()) {
         $item->setDisabled(true);
       }
 
       $item->setHref($this->getApplicationURI("plan/{$id}/"));
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php b/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php
index ef4e0dc6e8..48dc7053cb 100644
--- a/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php
+++ b/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php
@@ -1,221 +1,221 @@
 <?php
 
 final class HarbormasterBuildableSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Harbormaster Buildables');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorHarbormasterApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $revisions = $this->readPHIDsFromRequest(
       $request,
       'revisions',
       array(
         DifferentialRevisionPHIDType::TYPECONST,
       ));
 
     $repositories = $this->readPHIDsFromRequest(
       $request,
       'repositories',
       array(
         PhabricatorRepositoryRepositoryPHIDType::TYPECONST,
       ));
 
     $container_phids = array_merge($revisions, $repositories);
     $saved->setParameter('containerPHIDs', $container_phids);
 
     $commits = $this->readPHIDsFromRequest(
       $request,
       'commits',
       array(
         PhabricatorRepositoryCommitPHIDType::TYPECONST,
       ));
 
     $diffs = $this->readListFromRequest($request, 'diffs');
     if ($diffs) {
       $diffs = id(new DifferentialDiffQuery())
         ->setViewer($this->requireViewer())
         ->withIDs($diffs)
         ->execute();
       $diffs = mpull($diffs, 'getPHID', 'getPHID');
     }
 
     $buildable_phids = array_merge($commits, $diffs);
     $saved->setParameter('buildablePHIDs', $buildable_phids);
 
     $saved->setParameter(
       'manual',
       $this->readBoolFromRequest($request, 'manual'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new HarbormasterBuildableQuery())
       ->needContainerHandles(true)
       ->needBuildableHandles(true);
 
     $container_phids = $saved->getParameter('containerPHIDs', array());
     if ($container_phids) {
       $query->withContainerPHIDs($container_phids);
     }
 
     $buildable_phids = $saved->getParameter('buildablePHIDs', array());
 
     if ($buildable_phids) {
       $query->withBuildablePHIDs($buildable_phids);
     }
 
     $manual = $saved->getParameter('manual');
     if ($manual !== null) {
       $query->withManualBuildables($manual);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $container_phids = $saved_query->getParameter('containerPHIDs', array());
     $buildable_phids = $saved_query->getParameter('buildablePHIDs', array());
 
     $all_phids = array_merge($container_phids, $buildable_phids);
 
     $revision_names = array();
     $diff_names = array();
     $repository_names = array();
     $commit_names = array();
 
     if ($all_phids) {
       $objects = id(new PhabricatorObjectQuery())
         ->setViewer($this->requireViewer())
         ->withPHIDs($all_phids)
         ->execute();
 
       foreach ($all_phids as $phid) {
         $object = idx($objects, $phid);
         if (!$object) {
           continue;
         }
 
         if ($object instanceof DifferentialRevision) {
           $revision_names[] = 'D'.$object->getID();
         } else if ($object instanceof DifferentialDiff) {
           $diff_names[] = $object->getID();
         } else if ($object instanceof PhabricatorRepository) {
           $repository_names[] = 'r'.$object->getCallsign();
         } else if ($object instanceof PhabricatorRepositoryCommit) {
           $repository = $object->getRepository();
           $commit_names[] = $repository->formatCommitName(
             $object->getCommitIdentifier());
         }
       }
     }
 
     $form
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Differential Revisions'))
           ->setName('revisions')
           ->setValue(implode(', ', $revision_names)))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Differential Diffs'))
           ->setName('diffs')
           ->setValue(implode(', ', $diff_names)))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Repositories'))
           ->setName('repositories')
           ->setValue(implode(', ', $repository_names)))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Commits'))
           ->setName('commits')
           ->setValue(implode(', ', $commit_names)))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Origin'))
           ->setName('manual')
           ->setValue($this->getBoolFromQuery($saved_query, 'manual'))
           ->setOptions(
             array(
               '' => pht('(All Origins)'),
               'true' => pht('Manual Buildables'),
               'false' => pht('Automatic Buildables'),
             )));
   }
 
   protected function getURI($path) {
     return '/harbormaster/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'all' => pht('All Buildables'),
     );
   }
 
   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 renderResultList(
     array $buildables,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($buildables, 'HarbormasterBuildable');
 
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     foreach ($buildables as $buildable) {
       $id = $buildable->getID();
 
       $item = id(new PHUIObjectItemView())
         ->setHeader(pht('Buildable %d', $buildable->getID()));
       if ($buildable->getContainerHandle() !== null) {
         $item->addAttribute($buildable->getContainerHandle()->getName());
       }
       if ($buildable->getBuildableHandle() !== null) {
         $item->addAttribute($buildable->getBuildableHandle()->getFullName());
       }
 
       if ($id) {
         $item->setHref("/B{$id}");
       }
 
       if ($buildable->getIsManualBuildable()) {
         $item->addIcon('fa-wrench grey', pht('Manual'));
       }
 
       $item->setBarColor(HarbormasterBuildable::getBuildableStatusColor(
         $buildable->getBuildableStatus()));
       $item->addByline(HarbormasterBuildable::getBuildableStatusName(
         $buildable->getBuildableStatus()));
 
       $list->addItem($item);
 
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/herald/query/HeraldRuleSearchEngine.php b/src/applications/herald/query/HeraldRuleSearchEngine.php
index fe12ba7187..1d8bfdda6b 100644
--- a/src/applications/herald/query/HeraldRuleSearchEngine.php
+++ b/src/applications/herald/query/HeraldRuleSearchEngine.php
@@ -1,218 +1,218 @@
 <?php
 
 final class HeraldRuleSearchEngine extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Herald Rules');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorHeraldApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'authorPHIDs',
       $this->readUsersFromRequest($request, 'authors'));
 
     $saved->setParameter('contentType', $request->getStr('contentType'));
     $saved->setParameter('ruleType', $request->getStr('ruleType'));
     $saved->setParameter(
       'disabled',
       $this->readBoolFromRequest($request, 'disabled'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new HeraldRuleQuery());
 
     $author_phids = $saved->getParameter('authorPHIDs');
     if ($author_phids) {
       $query->withAuthorPHIDs($author_phids);
     }
 
     $content_type = $saved->getParameter('contentType');
     $content_type = idx($this->getContentTypeValues(), $content_type);
     if ($content_type) {
       $query->withContentTypes(array($content_type));
     }
 
     $rule_type = $saved->getParameter('ruleType');
     $rule_type = idx($this->getRuleTypeValues(), $rule_type);
     if ($rule_type) {
       $query->withRuleTypes(array($rule_type));
     }
 
     $disabled = $saved->getParameter('disabled');
     if ($disabled !== null) {
       $query->withDisabled($disabled);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $phids = $saved_query->getParameter('authorPHIDs', array());
     $author_handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
 
     $content_type = $saved_query->getParameter('contentType');
     $rule_type = $saved_query->getParameter('ruleType');
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('authors')
           ->setLabel(pht('Authors'))
           ->setValue($author_handles))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setName('contentType')
           ->setLabel(pht('Content Type'))
           ->setValue($content_type)
           ->setOptions($this->getContentTypeOptions()))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setName('ruleType')
           ->setLabel(pht('Rule Type'))
           ->setValue($rule_type)
           ->setOptions($this->getRuleTypeOptions()))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setName('disabled')
           ->setLabel(pht('Rule Status'))
           ->setValue($this->getBoolFromQuery($saved_query, 'disabled'))
           ->setOptions(
             array(
               '' => pht('Show Enabled and Disabled Rules'),
               'false' => pht('Show Only Enabled Rules'),
               'true' => pht('Show Only Disabled Rules'),
             )));
   }
 
   protected function getURI($path) {
     return '/herald/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array();
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['authored'] = pht('Authored');
     }
 
     $names['active'] = pht('Active');
     $names['all'] = pht('All');
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     $viewer_phid = $this->requireViewer()->getPHID();
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'active':
         return $query->setParameter('disabled', false);
       case 'authored':
         return $query
           ->setParameter('authorPHIDs', array($viewer_phid))
           ->setParameter('disabled', false);
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   private function getContentTypeOptions() {
     return array(
       '' => pht('(All Content Types)'),
     ) + HeraldAdapter::getEnabledAdapterMap($this->requireViewer());
   }
 
   private function getContentTypeValues() {
     return array_fuse(
       array_keys(
         HeraldAdapter::getEnabledAdapterMap($this->requireViewer())));
   }
 
   private function getRuleTypeOptions() {
     return array(
       '' => pht('(All Rule Types)'),
     ) + HeraldRuleTypeConfig::getRuleTypeMap();
   }
 
   private function getRuleTypeValues() {
     return array_fuse(array_keys(HeraldRuleTypeConfig::getRuleTypeMap()));
   }
 
   protected function getRequiredHandlePHIDsForResultList(
     array $rules,
     PhabricatorSavedQuery $query) {
 
     return mpull($rules, 'getAuthorPHID');
   }
 
   protected function renderResultList(
     array $rules,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($rules, 'HeraldRule');
 
     $viewer = $this->requireViewer();
 
     $content_type_map = HeraldAdapter::getEnabledAdapterMap($viewer);
 
     $list = id(new PHUIObjectItemListView())
       ->setUser($viewer);
     foreach ($rules as $rule) {
       $id = $rule->getID();
 
       $item = id(new PHUIObjectItemView())
         ->setObjectName("H{$id}")
         ->setHeader($rule->getName())
         ->setHref($this->getApplicationURI("rule/{$id}/"));
 
       if ($rule->isPersonalRule()) {
         $item->addIcon('fa-user', pht('Personal Rule'));
         $item->addByline(
           pht(
             'Authored by %s',
             $handles[$rule->getAuthorPHID()]->renderLink()));
       } else {
         $item->addIcon('fa-globe', pht('Global Rule'));
       }
 
       if ($rule->getIsDisabled()) {
         $item->setDisabled(true);
         $item->addIcon('fa-lock grey', pht('Disabled'));
       }
 
       $item->addAction(
         id(new PHUIListItemView())
           ->setHref($this->getApplicationURI("history/{$id}/"))
           ->setIcon('fa-file-text-o')
           ->setName(pht('Edit Log')));
 
       $content_type_name = idx($content_type_map, $rule->getContentType());
       $item->addAttribute(pht('Affects: %s', $content_type_name));
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/herald/query/HeraldTranscriptSearchEngine.php b/src/applications/herald/query/HeraldTranscriptSearchEngine.php
index 8074b3d613..9696a84391 100644
--- a/src/applications/herald/query/HeraldTranscriptSearchEngine.php
+++ b/src/applications/herald/query/HeraldTranscriptSearchEngine.php
@@ -1,139 +1,139 @@
 <?php
 
 final class HeraldTranscriptSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Herald Transcripts');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorHeraldApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $object_monograms = $request->getStrList('objectMonograms');
     $saved->setParameter('objectMonograms', $object_monograms);
 
     $ids = $request->getStrList('ids');
     foreach ($ids as $key => $id) {
       if (!$id || !is_numeric($id)) {
         unset($ids[$key]);
       } else {
         $ids[$key] = $id;
       }
     }
     $saved->setParameter('ids', $ids);
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new HeraldTranscriptQuery());
 
     $object_monograms = $saved->getParameter('objectMonograms');
     if ($object_monograms) {
       $objects = id(new PhabricatorObjectQuery())
         ->setViewer($this->requireViewer())
         ->withNames($object_monograms)
         ->execute();
       $query->withObjectPHIDs(mpull($objects, 'getPHID'));
     }
 
     $ids = $saved->getParameter('ids');
     if ($ids) {
       $query->withIDs($ids);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $object_monograms = $saved->getParameter('objectMonograms', array());
     $ids = $saved->getParameter('ids', array());
 
     $form
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('objectMonograms')
           ->setLabel(pht('Object Monograms'))
           ->setValue(implode(', ', $object_monograms)))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('ids')
           ->setLabel(pht('Transcript IDs'))
           ->setValue(implode(', ', $ids)));
   }
 
   protected function getURI($path) {
     return '/herald/transcript/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'all' => pht('All'),
     );
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     $viewer_phid = $this->requireViewer()->getPHID();
 
     switch ($query_key) {
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function getRequiredHandlePHIDsForResultList(
     array $transcripts,
     PhabricatorSavedQuery $query) {
     return mpull($transcripts, 'getObjectPHID');
   }
 
   protected function renderResultList(
     array $transcripts,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($transcripts, 'HeraldTranscript');
 
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     foreach ($transcripts as $xscript) {
       $view_href = phutil_tag(
         'a',
         array(
           'href' => '/herald/transcript/'.$xscript->getID().'/',
         ),
         pht('View Full Transcript'));
 
       $item = new PHUIObjectItemView();
       $item->setObjectName($xscript->getID());
       $item->setHeader($view_href);
       if ($xscript->getDryRun()) {
         $item->addAttribute(pht('Dry Run'));
       }
       $item->addAttribute($handles[$xscript->getObjectPHID()]->renderLink());
       $item->addAttribute(
         number_format((int)(1000 * $xscript->getDuration())).' ms');
       $item->addIcon(
         'none',
         phabricator_datetime($xscript->getTime(), $viewer));
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php b/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php
index d65327a903..65400d765c 100644
--- a/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php
+++ b/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php
@@ -1,214 +1,214 @@
 <?php
 
 final class LegalpadDocumentSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Legalpad Documents');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorLegalpadApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
     $saved->setParameter(
       'creatorPHIDs',
       $this->readUsersFromRequest($request, 'creators'));
 
     $saved->setParameter(
       'contributorPHIDs',
       $this->readUsersFromRequest($request, 'contributors'));
 
     $saved->setParameter(
       'withViewerSignature',
       $request->getBool('withViewerSignature'));
 
     $saved->setParameter('createdStart', $request->getStr('createdStart'));
     $saved->setParameter('createdEnd', $request->getStr('createdEnd'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new LegalpadDocumentQuery())
       ->needViewerSignatures(true);
 
     $creator_phids = $saved->getParameter('creatorPHIDs', array());
     if ($creator_phids) {
       $query->withCreatorPHIDs($creator_phids);
     }
 
     $contributor_phids = $saved->getParameter('contributorPHIDs', array());
     if ($contributor_phids) {
       $query->withContributorPHIDs($contributor_phids);
     }
 
     if ($saved->getParameter('withViewerSignature')) {
       $viewer_phid = $this->requireViewer()->getPHID();
       if ($viewer_phid) {
         $query->withSignerPHIDs(array($viewer_phid));
       }
     }
 
     $start = $this->parseDateTime($saved->getParameter('createdStart'));
     $end = $this->parseDateTime($saved->getParameter('createdEnd'));
 
     if ($start) {
       $query->withDateCreatedAfter($start);
     }
 
     if ($end) {
       $query->withDateCreatedBefore($end);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $creator_phids = $saved_query->getParameter('creatorPHIDs', array());
     $contributor_phids = $saved_query->getParameter(
       'contributorPHIDs', array());
     $phids = array_merge($creator_phids, $contributor_phids);
     $handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
 
     $viewer_signature = $saved_query->getParameter('withViewerSignature');
     if (!$this->requireViewer()->getPHID()) {
       $viewer_signature = false;
     }
 
     $form
       ->appendChild(
         id(new AphrontFormCheckboxControl())
           ->addCheckbox(
             'withViewerSignature',
             1,
             pht('Show only documents I have signed.'),
             $viewer_signature)
           ->setDisabled(!$this->requireViewer()->getPHID()))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('creators')
           ->setLabel(pht('Creators'))
           ->setValue(array_select_keys($handles, $creator_phids)))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('contributors')
           ->setLabel(pht('Contributors'))
           ->setValue(array_select_keys($handles, $contributor_phids)));
 
     $this->buildDateRange(
       $form,
       $saved_query,
       'createdStart',
       pht('Created After'),
       'createdEnd',
       pht('Created Before'));
 
   }
 
   protected function getURI($path) {
     return '/legalpad/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array();
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['signed'] = pht('Signed Documents');
     }
 
     $names['all'] = pht('All Documents');
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'signed':
         return $query
           ->setParameter('withViewerSignature', true);
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function getRequiredHandlePHIDsForResultList(
     array $documents,
     PhabricatorSavedQuery $query) {
     return array();
   }
 
   protected function renderResultList(
     array $documents,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($documents, 'LegalpadDocument');
 
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     $list->setUser($viewer);
     foreach ($documents as $document) {
       $last_updated = phabricator_date($document->getDateModified(), $viewer);
 
       $title = $document->getTitle();
 
       $type_name = $document->getSignatureTypeName();
       $type_icon = $document->getSignatureTypeIcon();
 
       $item = id(new PHUIObjectItemView())
         ->setObjectName($document->getMonogram())
         ->setHeader($title)
         ->setHref('/'.$document->getMonogram())
         ->setObject($document)
         ->addIcon($type_icon, $type_name)
         ->addIcon(
           'fa-pencil grey',
           pht('Version %d (%s)', $document->getVersions(), $last_updated));
 
       if ($viewer->getPHID()) {
         $signature = $document->getUserSignature($viewer->getPHID());
       } else {
         $signature = null;
       }
 
       if ($signature) {
         $item->addAttribute(
           array(
             id(new PHUIIconView())->setIconFont('fa-check-square-o', 'green'),
             ' ',
             pht(
               'Signed on %s',
               phabricator_date($signature->getDateCreated(), $viewer)),
           ));
       } else {
         $item->addAttribute(
           array(
             id(new PHUIIconView())->setIconFont('fa-square-o', 'grey'),
             ' ',
             pht('Not Signed'),
           ));
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php b/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php
index eb978e402a..bed390bdb3 100644
--- a/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php
+++ b/src/applications/legalpad/query/LegalpadDocumentSignatureSearchEngine.php
@@ -1,327 +1,327 @@
 <?php
 
 final class LegalpadDocumentSignatureSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   private $document;
 
   public function getResultTypeDescription() {
     return pht('Legalpad Signatures');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorLegalpadApplication';
   }
 
   public function setDocument(LegalpadDocument $document) {
     $this->document = $document;
     return $this;
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'signerPHIDs',
       $this->readUsersFromRequest($request, 'signers'));
 
     $saved->setParameter(
       'documentPHIDs',
       $this->readPHIDsFromRequest(
         $request,
         'documents',
         array(
           PhabricatorLegalpadDocumentPHIDType::TYPECONST,
         )));
 
     $saved->setParameter('nameContains', $request->getStr('nameContains'));
     $saved->setParameter('emailContains', $request->getStr('emailContains'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new LegalpadDocumentSignatureQuery());
 
     $signer_phids = $saved->getParameter('signerPHIDs', array());
     if ($signer_phids) {
       $query->withSignerPHIDs($signer_phids);
     }
 
     if ($this->document) {
       $query->withDocumentPHIDs(array($this->document->getPHID()));
     } else {
       $document_phids = $saved->getParameter('documentPHIDs', array());
       if ($document_phids) {
         $query->withDocumentPHIDs($document_phids);
       }
     }
 
     $name_contains = $saved->getParameter('nameContains');
     if (strlen($name_contains)) {
       $query->withNameContains($name_contains);
     }
 
     $email_contains = $saved->getParameter('emailContains');
     if (strlen($email_contains)) {
       $query->withEmailContains($email_contains);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $document_phids = $saved_query->getParameter('documentPHIDs', array());
     $signer_phids = $saved_query->getParameter('signerPHIDs', array());
 
     $phids = array_merge($document_phids, $signer_phids);
     $handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
 
     if (!$this->document) {
       $form
         ->appendChild(
           id(new AphrontFormTokenizerControl())
             ->setDatasource(new LegalpadDocumentDatasource())
             ->setName('documents')
             ->setLabel(pht('Documents'))
             ->setValue(array_select_keys($handles, $document_phids)));
     }
 
     $name_contains = $saved_query->getParameter('nameContains', '');
     $email_contains = $saved_query->getParameter('emailContains', '');
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('signers')
           ->setLabel(pht('Signers'))
           ->setValue(array_select_keys($handles, $signer_phids)))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Name Contains'))
           ->setName('nameContains')
           ->setValue($name_contains))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Email Contains'))
           ->setName('emailContains')
           ->setValue($email_contains));
   }
 
   protected function getURI($path) {
     if ($this->document) {
       return '/legalpad/signatures/'.$this->document->getID().'/'.$path;
     } else {
       return '/legalpad/signatures/'.$path;
     }
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'all' => pht('All Signatures'),
     );
 
     return $names;
   }
 
   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 $signatures,
     PhabricatorSavedQuery $query) {
 
     return array_merge(
       mpull($signatures, 'getSignerPHID'),
       mpull($signatures, 'getDocumentPHID'));
   }
 
   protected function renderResultList(
     array $signatures,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($signatures, 'LegalpadDocumentSignature');
 
     $viewer = $this->requireViewer();
 
     Javelin::initBehavior('phabricator-tooltips');
 
     $sig_good = $this->renderIcon(
       'fa-check',
       null,
       pht('Verified, Current'));
 
     $sig_corp = $this->renderIcon(
       'fa-building-o',
       null,
       pht('Verified, Corporate'));
 
     $sig_old = $this->renderIcon(
       'fa-clock-o',
       'orange',
       pht('Signed Older Version'));
 
     $sig_unverified = $this->renderIcon(
       'fa-envelope',
       'red',
       pht('Unverified Email'));
 
     $sig_exemption = $this->renderIcon(
       'fa-asterisk',
       'indigo',
       pht('Exemption'));
 
     id(new PHUIIconView())
       ->setIconFont('fa-envelope', 'red')
       ->addSigil('has-tooltip')
       ->setMetadata(array('tip' => pht('Unverified Email')));
 
     $type_corporate = LegalpadDocument::SIGNATURE_TYPE_CORPORATION;
 
     $rows = array();
     foreach ($signatures as $signature) {
       $name = $signature->getSignerName();
       $email = $signature->getSignerEmail();
 
       $document = $signature->getDocument();
 
       if ($signature->getIsExemption()) {
         $sig_icon = $sig_exemption;
       } else if (!$signature->isVerified()) {
         $sig_icon = $sig_unverified;
       } else if ($signature->getDocumentVersion() != $document->getVersions()) {
         $sig_icon = $sig_old;
       } else if ($signature->getSignatureType() == $type_corporate) {
         $sig_icon = $sig_corp;
       } else {
         $sig_icon = $sig_good;
       }
 
       $signature_href = $this->getApplicationURI(
         'signature/'.$signature->getID().'/');
 
       $sig_icon = javelin_tag(
         'a',
         array(
           'href' => $signature_href,
           'sigil' => 'workflow',
         ),
         $sig_icon);
 
       $signer_phid = $signature->getSignerPHID();
 
       $rows[] = array(
         $sig_icon,
         $handles[$document->getPHID()]->renderLink(),
         $signer_phid
           ? $handles[$signer_phid]->renderLink()
           : null,
         $name,
         phutil_tag(
           'a',
           array(
             'href' => 'mailto:'.$email,
           ),
           $email),
         phabricator_datetime($signature->getDateCreated(), $viewer),
       );
     }
 
     $table = id(new AphrontTableView($rows))
       ->setNoDataString(pht('No signatures match the query.'))
       ->setHeaders(
         array(
           '',
           pht('Document'),
           pht('Account'),
           pht('Name'),
           pht('Email'),
           pht('Signed'),
         ))
       ->setColumnVisibility(
         array(
           true,
 
           // Only show the "Document" column if we aren't scoped to a
           // particular document.
           !$this->document,
         ))
       ->setColumnClasses(
         array(
           '',
           '',
           '',
           '',
           'wide',
           'right',
         ));
 
     $header = id(new PHUIHeaderView())
       ->setHeader(pht('Signatures'));
 
     if ($this->document) {
       $document_id = $this->document->getID();
 
       $header->addActionLink(
         id(new PHUIButtonView())
           ->setText(pht('Add Signature Exemption'))
           ->setTag('a')
           ->setHref($this->getApplicationURI('addsignature/'.$document_id.'/'))
           ->setWorkflow(true)
           ->setIcon(id(new PHUIIconView())->setIconFont('fa-pencil')));
     }
 
     $box = id(new PHUIObjectBoxView())
       ->setHeader($header)
       ->appendChild($table);
 
     if (!$this->document) {
       $policy_notice = id(new AphrontErrorView())
         ->setSeverity(AphrontErrorView::SEVERITY_NOTICE)
         ->setErrors(
           array(
             pht(
               'NOTE: You can only see your own signatures and signatures on '.
               'documents you have permission to edit.'),
           ));
       $box->setErrorView($policy_notice);
     }
 
     return $box;
   }
 
   private function renderIcon($icon, $color, $title) {
     Javelin::initBehavior('phabricator-tooltips');
 
     return array(
       id(new PHUIIconView())
         ->setIconFont($icon, $color)
         ->addSigil('has-tooltip')
         ->setMetadata(array('tip' => $title)),
       javelin_tag(
         'span',
         array(
           'aural' => true,
         ),
         $title),
     );
   }
 
 }
diff --git a/src/applications/macro/query/PhabricatorMacroSearchEngine.php b/src/applications/macro/query/PhabricatorMacroSearchEngine.php
index 45390b13b1..934d98bb01 100644
--- a/src/applications/macro/query/PhabricatorMacroSearchEngine.php
+++ b/src/applications/macro/query/PhabricatorMacroSearchEngine.php
@@ -1,221 +1,221 @@
 <?php
 
 final class PhabricatorMacroSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Macros');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorMacroApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
     $saved->setParameter(
       'authorPHIDs',
       $this->readUsersFromRequest($request, 'authors'));
 
     $saved->setParameter('status', $request->getStr('status'));
     $saved->setParameter('names', $request->getStrList('names'));
     $saved->setParameter('nameLike', $request->getStr('nameLike'));
     $saved->setParameter('createdStart', $request->getStr('createdStart'));
     $saved->setParameter('createdEnd', $request->getStr('createdEnd'));
     $saved->setParameter('flagColor', $request->getStr('flagColor', '-1'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorMacroQuery())
       ->needFiles(true)
       ->withIDs($saved->getParameter('ids', array()))
       ->withPHIDs($saved->getParameter('phids', array()))
       ->withAuthorPHIDs($saved->getParameter('authorPHIDs', array()));
 
     $status = $saved->getParameter('status');
     $options = PhabricatorMacroQuery::getStatusOptions();
     if (empty($options[$status])) {
       $status = head_key($options);
     }
     $query->withStatus($status);
 
     $names = $saved->getParameter('names', array());
     if ($names) {
       $query->withNames($names);
     }
 
     $like = $saved->getParameter('nameLike');
     if (strlen($like)) {
       $query->withNameLike($like);
     }
 
     $start = $this->parseDateTime($saved->getParameter('createdStart'));
     $end = $this->parseDateTime($saved->getParameter('createdEnd'));
 
     if ($start) {
       $query->withDateCreatedAfter($start);
     }
 
     if ($end) {
       $query->withDateCreatedBefore($end);
     }
 
     $color = $saved->getParameter('flagColor');
     if (strlen($color)) {
       $query->withFlagColor($color);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $phids = $saved_query->getParameter('authorPHIDs', array());
     $author_handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
 
     $status = $saved_query->getParameter('status');
     $names = implode(', ', $saved_query->getParameter('names', array()));
     $like = $saved_query->getParameter('nameLike');
     $color = $saved_query->getParameter('flagColor', '-1');
 
     $form
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setName('status')
           ->setLabel(pht('Status'))
           ->setOptions(PhabricatorMacroQuery::getStatusOptions())
           ->setValue($status))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('authors')
           ->setLabel(pht('Authors'))
           ->setValue($author_handles))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('nameLike')
           ->setLabel(pht('Name Contains'))
           ->setValue($like))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('names')
           ->setLabel(pht('Exact Names'))
           ->setValue($names))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setName('flagColor')
           ->setLabel(pht('Marked with Flag'))
           ->setOptions(PhabricatorMacroQuery::getFlagColorsOptions())
           ->setValue($color));
 
     $this->buildDateRange(
       $form,
       $saved_query,
       'createdStart',
       pht('Created After'),
       'createdEnd',
       pht('Created Before'));
   }
 
   protected function getURI($path) {
     return '/macro/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'active'  => pht('Active'),
       'all'     => pht('All'),
     );
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['authored'] = pht('Authored');
     }
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'active':
         return $query;
       case 'all':
         return $query->setParameter(
           'status',
           PhabricatorMacroQuery::STATUS_ANY);
       case 'authored':
         return $query->setParameter(
           'authorPHIDs',
           array($this->requireViewer()->getPHID()));
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function getRequiredHandlePHIDsForResultList(
     array $macros,
     PhabricatorSavedQuery $query) {
     return mpull($macros, 'getAuthorPHID');
   }
 
   protected function renderResultList(
     array $macros,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     assert_instances_of($macros, 'PhabricatorFileImageMacro');
     $viewer = $this->requireViewer();
 
     $pinboard = new PHUIPinboardView();
     foreach ($macros as $macro) {
       $file = $macro->getFile();
 
       $item = new PHUIPinboardItemView();
       if ($file) {
         $item->setImageURI($file->getThumb280x210URI());
         $item->setImageSize(280, 210);
       }
 
       if ($macro->getDateCreated()) {
         $datetime = phabricator_date($macro->getDateCreated(), $viewer);
         $item->appendChild(
           phutil_tag(
             'div',
             array(),
             pht('Created on %s', $datetime)));
       } else {
         // Very old macros don't have a creation date. Rendering something
         // keeps all the pins at the same height and avoids flow issues.
         $item->appendChild(
           phutil_tag(
             'div',
             array(),
             pht('Created in ages long past')));
       }
 
       if ($macro->getAuthorPHID()) {
         $author_handle = $handles[$macro->getAuthorPHID()];
         $item->appendChild(
           pht('Created by %s', $author_handle->renderLink()));
       }
 
       $item->setURI($this->getApplicationURI('/view/'.$macro->getID().'/'));
       $item->setDisabled($macro->getisDisabled());
       $item->setHeader($macro->getName());
 
       $pinboard->addItem($item);
     }
 
     return $pinboard;
   }
 
 }
diff --git a/src/applications/mailinglists/query/PhabricatorMailingListSearchEngine.php b/src/applications/mailinglists/query/PhabricatorMailingListSearchEngine.php
index 63f71a854d..54fe898546 100644
--- a/src/applications/mailinglists/query/PhabricatorMailingListSearchEngine.php
+++ b/src/applications/mailinglists/query/PhabricatorMailingListSearchEngine.php
@@ -1,84 +1,84 @@
 <?php
 
 final class PhabricatorMailingListSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Mailing Lists');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorMailingListsApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorMailingListQuery());
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     // This just makes it clear to the user that the lack of filters is
     // intentional, not a bug.
     $form->appendChild(
       id(new AphrontFormMarkupControl())
         ->setValue(pht('No query filters are available for mailing lists.')));
   }
 
   protected function getURI($path) {
     return '/mailinglists/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'all' => pht('All Lists'),
     );
   }
 
   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 renderResultList(
     array $lists,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($lists, 'PhabricatorMetaMTAMailingList');
 
     $view = id(new PHUIObjectItemListView());
 
     foreach ($lists as $list) {
       $item = new PHUIObjectItemView();
 
       $item->setHeader($list->getName());
       $item->setHref($list->getURI());
       $item->addAttribute($list->getEmail());
       $item->addAction(
         id(new PHUIListItemView())
           ->setIcon('fa-pencil')
           ->setHref($this->getApplicationURI('/edit/'.$list->getID().'/')));
 
       $view->addItem($item);
     }
 
     return $view;
   }
 
 }
diff --git a/src/applications/maniphest/query/ManiphestTaskSearchEngine.php b/src/applications/maniphest/query/ManiphestTaskSearchEngine.php
index 7af51b74f5..b500b995e4 100644
--- a/src/applications/maniphest/query/ManiphestTaskSearchEngine.php
+++ b/src/applications/maniphest/query/ManiphestTaskSearchEngine.php
@@ -1,561 +1,561 @@
 <?php
 
 final class ManiphestTaskSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   private $showBatchControls;
   private $baseURI;
   private $isBoardView;
 
   public function setIsBoardView($is_board_view) {
     $this->isBoardView = $is_board_view;
     return $this;
   }
 
   public function getIsBoardView() {
     return $this->isBoardView;
   }
 
   public function setBaseURI($base_uri) {
     $this->baseURI = $base_uri;
     return $this;
   }
 
   public function getBaseURI() {
     return $this->baseURI;
   }
 
   public function setShowBatchControls($show_batch_controls) {
     $this->showBatchControls = $show_batch_controls;
     return $this;
   }
 
   public function getResultTypeDescription() {
     return pht('Tasks');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorManiphestApplication';
   }
 
   public function getCustomFieldObject() {
     return new ManiphestTask();
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'assignedPHIDs',
       $this->readUsersFromRequest($request, 'assigned'));
 
     $saved->setParameter('withUnassigned', $request->getBool('withUnassigned'));
 
     $saved->setParameter(
       'authorPHIDs',
       $this->readUsersFromRequest($request, 'authors'));
 
     $saved->setParameter(
       'subscriberPHIDs',
       $this->readPHIDsFromRequest($request, 'subscribers'));
 
     $saved->setParameter(
       'statuses',
       $this->readListFromRequest($request, 'statuses'));
 
     $saved->setParameter(
       'priorities',
       $this->readListFromRequest($request, 'priorities'));
 
     $saved->setParameter('group', $request->getStr('group'));
     $saved->setParameter('order', $request->getStr('order'));
 
     $ids = $request->getStrList('ids');
     foreach ($ids as $key => $id) {
       $id = trim($id, ' Tt');
       if (!$id || !is_numeric($id)) {
         unset($ids[$key]);
       } else {
         $ids[$key] = $id;
       }
     }
     $saved->setParameter('ids', $ids);
 
     $saved->setParameter('fulltext', $request->getStr('fulltext'));
 
     $saved->setParameter(
       'allProjectPHIDs',
       $this->readPHIDsFromRequest($request, 'allProjects'));
 
     $saved->setParameter(
       'withNoProject',
       $request->getBool('withNoProject'));
 
     $saved->setParameter(
       'anyProjectPHIDs',
       $this->readPHIDsFromRequest($request, 'anyProjects'));
 
     $saved->setParameter(
       'excludeProjectPHIDs',
       $this->readPHIDsFromRequest($request, 'excludeProjects'));
 
     $saved->setParameter(
       'userProjectPHIDs',
       $this->readUsersFromRequest($request, 'userProjects'));
 
     $saved->setParameter('createdStart', $request->getStr('createdStart'));
     $saved->setParameter('createdEnd', $request->getStr('createdEnd'));
     $saved->setParameter('modifiedStart', $request->getStr('modifiedStart'));
     $saved->setParameter('modifiedEnd', $request->getStr('modifiedEnd'));
 
     $limit = $request->getInt('limit');
     if ($limit > 0) {
       $saved->setParameter('limit', $limit);
     }
 
     $this->readCustomFieldsFromRequest($request, $saved);
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new ManiphestTaskQuery())
       ->needProjectPHIDs(true);
 
     $author_phids = $saved->getParameter('authorPHIDs');
     if ($author_phids) {
       $query->withAuthors($author_phids);
     }
 
     $subscriber_phids = $saved->getParameter('subscriberPHIDs');
     if ($subscriber_phids) {
       $query->withSubscribers($subscriber_phids);
     }
 
     $with_unassigned = $saved->getParameter('withUnassigned');
     if ($with_unassigned) {
       $query->withOwners(array(null));
     } else {
       $assigned_phids = $saved->getParameter('assignedPHIDs', array());
       if ($assigned_phids) {
         $query->withOwners($assigned_phids);
       }
     }
 
     $statuses = $saved->getParameter('statuses');
     if ($statuses) {
       $query->withStatuses($statuses);
     }
 
     $priorities = $saved->getParameter('priorities');
     if ($priorities) {
       $query->withPriorities($priorities);
     }
 
     $this->applyOrderByToQuery(
       $query,
       $this->getOrderValues(),
       $saved->getParameter('order'));
 
     $group = $saved->getParameter('group');
     $group = idx($this->getGroupValues(), $group);
     if ($group) {
       $query->setGroupBy($group);
     } else {
       $query->setGroupBy(head($this->getGroupValues()));
     }
 
     $ids = $saved->getParameter('ids');
     if ($ids) {
       $query->withIDs($ids);
     }
 
     $fulltext = $saved->getParameter('fulltext');
     if (strlen($fulltext)) {
       $query->withFullTextSearch($fulltext);
     }
 
     $with_no_project = $saved->getParameter('withNoProject');
     if ($with_no_project) {
       $query->withAllProjects(array(ManiphestTaskOwner::PROJECT_NO_PROJECT));
     } else {
       $project_phids = $saved->getParameter('allProjectPHIDs');
       if ($project_phids) {
         $query->withAllProjects($project_phids);
       }
     }
 
     $any_project_phids = $saved->getParameter('anyProjectPHIDs');
     if ($any_project_phids) {
       $query->withAnyProjects($any_project_phids);
     }
 
     $exclude_project_phids = $saved->getParameter('excludeProjectPHIDs');
     if ($exclude_project_phids) {
       $query->withoutProjects($exclude_project_phids);
     }
 
     $user_project_phids = $saved->getParameter('userProjectPHIDs');
     if ($user_project_phids) {
       $query->withAnyUserProjects($user_project_phids);
     }
 
     $start = $this->parseDateTime($saved->getParameter('createdStart'));
     $end = $this->parseDateTime($saved->getParameter('createdEnd'));
 
     if ($start) {
       $query->withDateCreatedAfter($start);
     }
 
     if ($end) {
       $query->withDateCreatedBefore($end);
     }
 
     $mod_start = $this->parseDateTime($saved->getParameter('modifiedStart'));
     $mod_end = $this->parseDateTime($saved->getParameter('modifiedEnd'));
 
     if ($mod_start) {
       $query->withDateModifiedAfter($mod_start);
     }
 
     if ($mod_end) {
       $query->withDateModifiedBefore($mod_end);
     }
 
     $this->applyCustomFieldsToQuery($query, $saved);
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $assigned_phids = $saved->getParameter('assignedPHIDs', array());
     $author_phids = $saved->getParameter('authorPHIDs', array());
     $all_project_phids = $saved->getParameter(
       'allProjectPHIDs',
       array());
     $any_project_phids = $saved->getParameter(
       'anyProjectPHIDs',
       array());
     $exclude_project_phids = $saved->getParameter(
       'excludeProjectPHIDs',
       array());
     $user_project_phids = $saved->getParameter(
       'userProjectPHIDs',
       array());
     $subscriber_phids = $saved->getParameter('subscriberPHIDs', array());
 
     $all_phids = array_merge(
       $assigned_phids,
       $author_phids,
       $all_project_phids,
       $any_project_phids,
       $exclude_project_phids,
       $user_project_phids,
       $subscriber_phids);
 
     if ($all_phids) {
       $handles = id(new PhabricatorHandleQuery())
         ->setViewer($this->requireViewer())
         ->withPHIDs($all_phids)
         ->execute();
     } else {
       $handles = array();
     }
 
     $assigned_handles = array_select_keys($handles, $assigned_phids);
     $author_handles = array_select_keys($handles, $author_phids);
     $all_project_handles = array_select_keys($handles, $all_project_phids);
     $any_project_handles = array_select_keys($handles, $any_project_phids);
     $exclude_project_handles = array_select_keys(
       $handles,
       $exclude_project_phids);
     $user_project_handles = array_select_keys($handles, $user_project_phids);
     $subscriber_handles = array_select_keys($handles, $subscriber_phids);
 
     $with_unassigned = $saved->getParameter('withUnassigned');
     $with_no_projects = $saved->getParameter('withNoProject');
 
     $statuses = $saved->getParameter('statuses', array());
     $statuses = array_fuse($statuses);
     $status_control = id(new AphrontFormCheckboxControl())
       ->setLabel(pht('Status'));
     foreach (ManiphestTaskStatus::getTaskStatusMap() as $status => $name) {
       $status_control->addCheckbox(
         'statuses[]',
         $status,
         $name,
         isset($statuses[$status]));
     }
 
     $priorities = $saved->getParameter('priorities', array());
     $priorities = array_fuse($priorities);
     $priority_control = id(new AphrontFormCheckboxControl())
       ->setLabel(pht('Priority'));
     foreach (ManiphestTaskPriority::getTaskPriorityMap() as $pri => $name) {
       $priority_control->addCheckbox(
         'priorities[]',
         $pri,
         $name,
         isset($priorities[$pri]));
     }
 
     $ids = $saved->getParameter('ids', array());
 
     $builtin_orders = $this->getOrderOptions();
     $custom_orders = $this->getCustomFieldOrderOptions();
     $all_orders = $builtin_orders + $custom_orders;
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('assigned')
           ->setLabel(pht('Assigned To'))
           ->setValue($assigned_handles))
       ->appendChild(
         id(new AphrontFormCheckboxControl())
           ->addCheckbox(
             'withUnassigned',
             1,
             pht('Show only unassigned tasks.'),
             $with_unassigned))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorProjectDatasource())
           ->setName('allProjects')
           ->setLabel(pht('In All Projects'))
           ->setValue($all_project_handles));
 
     if (!$this->getIsBoardView()) {
       $form
         ->appendChild(
           id(new AphrontFormCheckboxControl())
             ->addCheckbox(
               'withNoProject',
               1,
               pht('Show only tasks with no projects.'),
               $with_no_projects));
     }
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorProjectDatasource())
           ->setName('anyProjects')
           ->setLabel(pht('In Any Project'))
           ->setValue($any_project_handles))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorProjectDatasource())
           ->setName('excludeProjects')
           ->setLabel(pht('Not In Projects'))
           ->setValue($exclude_project_handles))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('userProjects')
           ->setLabel(pht('In Users\' Projects'))
           ->setValue($user_project_handles))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('authors')
           ->setLabel(pht('Authors'))
           ->setValue($author_handles))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorMetaMTAMailableDatasource())
           ->setName('subscribers')
           ->setLabel(pht('Subscribers'))
           ->setValue($subscriber_handles))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('fulltext')
           ->setLabel(pht('Contains Words'))
           ->setValue($saved->getParameter('fulltext')))
       ->appendChild($status_control)
       ->appendChild($priority_control);
 
     if (!$this->getIsBoardView()) {
       $form
         ->appendChild(
           id(new AphrontFormSelectControl())
             ->setName('group')
             ->setLabel(pht('Group By'))
             ->setValue($saved->getParameter('group'))
             ->setOptions($this->getGroupOptions()))
         ->appendChild(
           id(new AphrontFormSelectControl())
             ->setName('order')
             ->setLabel(pht('Order By'))
             ->setValue($saved->getParameter('order'))
             ->setOptions($all_orders));
     }
 
     $form
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('ids')
           ->setLabel(pht('Task IDs'))
           ->setValue(implode(', ', $ids)));
 
     $this->appendCustomFieldsToForm($form, $saved);
 
     $this->buildDateRange(
       $form,
       $saved,
       'createdStart',
       pht('Created After'),
       'createdEnd',
       pht('Created Before'));
 
     $this->buildDateRange(
       $form,
       $saved,
       'modifiedStart',
       pht('Updated After'),
       'modifiedEnd',
       pht('Updated Before'));
 
     if (!$this->getIsBoardView()) {
       $form
         ->appendChild(
           id(new AphrontFormTextControl())
             ->setName('limit')
             ->setLabel(pht('Page Size'))
             ->setValue($saved->getParameter('limit', 100)));
     }
   }
 
   protected function getURI($path) {
     if ($this->baseURI) {
       return $this->baseURI.$path;
     }
     return '/maniphest/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array();
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['assigned'] = pht('Assigned');
       $names['authored'] = pht('Authored');
       $names['subscribed'] = pht('Subscribed');
     }
 
     $names['open'] = pht('Open Tasks');
     $names['all'] = pht('All Tasks');
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
 
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     $viewer_phid = $this->requireViewer()->getPHID();
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'assigned':
         return $query
           ->setParameter('assignedPHIDs', array($viewer_phid))
           ->setParameter(
             'statuses',
             ManiphestTaskStatus::getOpenStatusConstants());
       case 'subscribed':
         return $query
           ->setParameter('subscriberPHIDs', array($viewer_phid))
           ->setParameter(
             'statuses',
             ManiphestTaskStatus::getOpenStatusConstants());
       case 'open':
         return $query
           ->setParameter(
             'statuses',
             ManiphestTaskStatus::getOpenStatusConstants());
       case 'authored':
         return $query
           ->setParameter('authorPHIDs', array($viewer_phid))
           ->setParameter('order', 'created')
           ->setParameter('group', 'none');
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   private function getOrderOptions() {
     return array(
       'priority' => pht('Priority'),
       'updated' => pht('Date Updated'),
       'created' => pht('Date Created'),
       'title' => pht('Title'),
     );
   }
 
   private function getOrderValues() {
     return array(
       'priority' => ManiphestTaskQuery::ORDER_PRIORITY,
       'updated'  => ManiphestTaskQuery::ORDER_MODIFIED,
       'created'  => ManiphestTaskQuery::ORDER_CREATED,
       'title'    => ManiphestTaskQuery::ORDER_TITLE,
     );
   }
 
   private function getGroupOptions() {
     return array(
       'priority' => pht('Priority'),
       'assigned' => pht('Assigned'),
       'status'   => pht('Status'),
       'project'  => pht('Project'),
       'none'     => pht('None'),
     );
   }
 
   private function getGroupValues() {
     return array(
       'priority' => ManiphestTaskQuery::GROUP_PRIORITY,
       'assigned' => ManiphestTaskQuery::GROUP_OWNER,
       'status'   => ManiphestTaskQuery::GROUP_STATUS,
       'project'  => ManiphestTaskQuery::GROUP_PROJECT,
       'none'     => ManiphestTaskQuery::GROUP_NONE,
     );
   }
 
   protected function renderResultList(
     array $tasks,
     PhabricatorSavedQuery $saved,
     array $handles) {
 
     $viewer = $this->requireViewer();
 
     if ($this->isPanelContext()) {
       $can_edit_priority = false;
       $can_bulk_edit = false;
     } else {
       $can_edit_priority = PhabricatorPolicyFilter::hasCapability(
         $viewer,
         $this->getApplication(),
         ManiphestEditPriorityCapability::CAPABILITY);
 
       $can_bulk_edit = PhabricatorPolicyFilter::hasCapability(
         $viewer,
         $this->getApplication(),
         ManiphestBulkEditCapability::CAPABILITY);
     }
 
     return id(new ManiphestTaskResultListView())
       ->setUser($viewer)
       ->setTasks($tasks)
       ->setSavedQuery($saved)
       ->setCanEditPriority($can_edit_priority)
       ->setCanBatchEdit($can_bulk_edit)
       ->setShowBatchControls($this->showBatchControls);
   }
 
 }
diff --git a/src/applications/meta/query/PhabricatorAppSearchEngine.php b/src/applications/meta/query/PhabricatorAppSearchEngine.php
index 2d1d7d8525..5a12da2ca1 100644
--- a/src/applications/meta/query/PhabricatorAppSearchEngine.php
+++ b/src/applications/meta/query/PhabricatorAppSearchEngine.php
@@ -1,256 +1,256 @@
 <?php
 
 final class PhabricatorAppSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Applications');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorApplicationsApplication';
   }
 
   public function getPageSize(PhabricatorSavedQuery $saved) {
     return INF;
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter('name', $request->getStr('name'));
 
     $saved->setParameter(
       'installed',
       $this->readBoolFromRequest($request, 'installed'));
     $saved->setParameter(
       'prototypes',
       $this->readBoolFromRequest($request, 'prototypes'));
     $saved->setParameter(
       'firstParty',
       $this->readBoolFromRequest($request, 'firstParty'));
     $saved->setParameter(
       'launchable',
       $this->readBoolFromRequest($request, 'launchable'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorApplicationQuery())
       ->setOrder(PhabricatorApplicationQuery::ORDER_NAME)
       ->withUnlisted(false);
 
     $name = $saved->getParameter('name');
     if (strlen($name)) {
       $query->withNameContains($name);
     }
 
     $installed = $saved->getParameter('installed');
     if ($installed !== null) {
       $query->withInstalled($installed);
     }
 
     $prototypes = $saved->getParameter('prototypes');
 
     if ($prototypes === null) {
       // NOTE: This is the old name of the 'prototypes' option, see T6084.
       $prototypes = $saved->getParameter('beta');
       $saved->setParameter('prototypes', $prototypes);
     }
 
     if ($prototypes !== null) {
       $query->withPrototypes($prototypes);
     }
 
     $first_party = $saved->getParameter('firstParty');
     if ($first_party !== null) {
       $query->withFirstParty($first_party);
     }
 
     $launchable = $saved->getParameter('launchable');
     if ($launchable !== null) {
       $query->withLaunchable($launchable);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $form
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Name Contains'))
           ->setName('name')
           ->setValue($saved->getParameter('name')))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Installed'))
           ->setName('installed')
           ->setValue($this->getBoolFromQuery($saved, 'installed'))
           ->setOptions(
             array(
               '' => pht('Show All Applications'),
               'true' => pht('Show Installed Applications'),
               'false' => pht('Show Uninstalled Applications'),
             )))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Prototypes'))
           ->setName('prototypes')
           ->setValue($this->getBoolFromQuery($saved, 'prototypes'))
           ->setOptions(
             array(
               '' => pht('Show All Applications'),
               'true' => pht('Show Prototype Applications'),
               'false' => pht('Show Released Applications'),
             )))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Provenance'))
           ->setName('firstParty')
           ->setValue($this->getBoolFromQuery($saved, 'firstParty'))
           ->setOptions(
             array(
               '' => pht('Show All Applications'),
               'true' => pht('Show First-Party Applications'),
               'false' => pht('Show Third-Party Applications'),
             )))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Launchable'))
           ->setName('launchable')
           ->setValue($this->getBoolFromQuery($saved, 'launchable'))
           ->setOptions(
             array(
               '' => pht('Show All Applications'),
               'true' => pht('Show Launchable Applications'),
               'false' => pht('Show Non-Launchable Applications'),
             )));
   }
 
   protected function getURI($path) {
     return '/applications/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'launcher' => pht('Launcher'),
       'all' => pht('All Applications'),
     );
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'launcher':
         return $query
           ->setParameter('installed', true)
           ->setParameter('launchable', true);
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function renderResultList(
     array $all_applications,
     PhabricatorSavedQuery $query,
     array $handle) {
     assert_instances_of($all_applications, 'PhabricatorApplication');
 
     $all_applications = msort($all_applications, 'getName');
 
     if ($query->getQueryKey() == 'launcher') {
       $groups = mgroup($all_applications, 'getApplicationGroup');
     } else {
       $groups = array($all_applications);
     }
 
     $group_names = PhabricatorApplication::getApplicationGroups();
     $groups = array_select_keys($groups, array_keys($group_names)) + $groups;
 
     $results = array();
     foreach ($groups as $group => $applications) {
       if (count($groups) > 1) {
         $results[] = phutil_tag(
           'h1',
           array(
             'class' => 'launcher-header',
           ),
           idx($group_names, $group, $group));
       }
 
       $list = new PHUIObjectItemListView();
       $list->addClass('phui-object-item-launcher-list');
 
       foreach ($applications as $application) {
         $icon = $application->getIconName();
         if (!$icon) {
           $icon = 'application';
         }
 
         // TODO: This sheet doesn't work the same way other sheets do so it
         // ends up with the wrong classes if we try to use PHUIIconView. This
         // is probably all changing in the redesign anyway.
 
         $icon_view = javelin_tag(
           'span',
           array(
             'class' => 'phui-icon-view '.
                        'sprite-apps-large apps-'.$icon.'-dark-large',
             'aural' => false,
           ),
           '');
 
         $description = phutil_tag(
           'div',
           array(
             'style' => 'white-space: nowrap; '.
                        'overflow: hidden; '.
                        'text-overflow: ellipsis;',
           ),
           $application->getShortDescription());
 
         $item = id(new PHUIObjectItemView())
           ->setHeader($application->getName())
           ->setImageIcon($icon_view)
           ->addAttribute($description)
           ->addAction(
             id(new PHUIListItemView())
               ->setName(pht('Help/Options'))
               ->setIcon('fa-cog')
               ->setHref('/applications/view/'.get_class($application).'/'));
 
         if ($application->getBaseURI() && $application->isInstalled()) {
           $item->setHref($application->getBaseURI());
         }
 
         if (!$application->isInstalled()) {
           $item->addIcon('fa-times', pht('Uninstalled'));
         }
 
         if ($application->isPrototype()) {
           $item->addIcon('fa-bomb grey', pht('Prototype'));
         }
 
         if (!$application->isFirstParty()) {
           $item->addIcon('fa-puzzle-piece', pht('Extension'));
         }
 
         $list->addItem($item);
       }
 
       $results[] = $list;
     }
 
     return $results;
   }
 
 }
diff --git a/src/applications/notification/query/PhabricatorNotificationSearchEngine.php b/src/applications/notification/query/PhabricatorNotificationSearchEngine.php
index bb9dc4e166..aa6d14212e 100644
--- a/src/applications/notification/query/PhabricatorNotificationSearchEngine.php
+++ b/src/applications/notification/query/PhabricatorNotificationSearchEngine.php
@@ -1,143 +1,143 @@
 <?php
 
 final class PhabricatorNotificationSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Notifications');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorNotificationsApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'unread',
       $this->readBoolFromRequest($request, 'unread'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorNotificationQuery())
       ->withUserPHIDs(array($this->requireViewer()->getPHID()));
 
     if ($saved->getParameter('unread')) {
       $query->withUnread(true);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $unread = $saved->getParameter('unread');
 
     $form->appendChild(
       id(new AphrontFormCheckboxControl())
         ->setLabel(pht('Unread'))
         ->addCheckbox(
           'unread',
           1,
           pht('Show only unread notifications.'),
           $unread));
   }
 
   protected function getURI($path) {
     return '/notification/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
 
     $names = array(
       'all' => pht('All Notifications'),
       'unread' => pht('Unread Notifications'),
     );
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'unread':
         return $query->setParameter('unread', true);
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function renderResultList(
     array $notifications,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($notifications, 'PhabricatorFeedStory');
 
     $viewer = $this->requireViewer();
 
     $image = id(new PHUIIconView())
       ->setIconFont('fa-eye-slash');
 
     $button = id(new PHUIButtonView())
       ->setTag('a')
       ->addSigil('workflow')
       ->setColor(PHUIButtonView::SIMPLE)
       ->setIcon($image)
       ->setText(pht('Mark All Read'));
 
     switch ($query->getQueryKey()) {
       case 'unread':
         $header = pht('Unread Notifications');
         $no_data = pht('You have no unread notifications.');
         break;
       default:
         $header = pht('Notifications');
         $no_data = pht('You have no notifications.');
         break;
     }
 
     $clear_uri = id(new PhutilURI('/notification/clear/'));
     if ($notifications) {
       $builder = id(new PhabricatorNotificationBuilder($notifications))
         ->setUser($viewer);
 
       $view = $builder->buildView();
       $clear_uri->setQueryParam(
         'chronoKey',
         head($notifications)->getChronologicalKey());
     } else {
       $view = phutil_tag_div(
         'phabricator-notification no-notifications',
         $no_data);
       $button->setDisabled(true);
     }
     $button->setHref((string)$clear_uri);
 
     $view = id(new PHUIBoxView())
       ->addPadding(PHUI::PADDING_MEDIUM)
       ->addClass('phabricator-notification-list')
       ->appendChild($view);
 
     $notif_header = id(new PHUIHeaderView())
       ->setHeader($header)
       ->addActionLink($button);
 
     return id(new PHUIObjectBoxView())
       ->setHeader($notif_header)
       ->appendChild($view);
   }
 
   public function shouldUseOffsetPaging() {
     return true;
   }
 
 }
diff --git a/src/applications/oauthserver/query/PhabricatorOAuthServerClientSearchEngine.php b/src/applications/oauthserver/query/PhabricatorOAuthServerClientSearchEngine.php
index 5fa7fbcefa..e0729015f2 100644
--- a/src/applications/oauthserver/query/PhabricatorOAuthServerClientSearchEngine.php
+++ b/src/applications/oauthserver/query/PhabricatorOAuthServerClientSearchEngine.php
@@ -1,118 +1,118 @@
 <?php
 
 final class PhabricatorOAuthServerClientSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('OAuth Clients');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorOAuthServerApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'creatorPHIDs',
       $this->readUsersFromRequest($request, 'creators'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorOAuthServerClientQuery());
 
     $creator_phids = $saved->getParameter('creatorPHIDs', array());
     if ($creator_phids) {
       $query->withCreatorPHIDs($saved->getParameter('creatorPHIDs', array()));
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $phids = $saved_query->getParameter('creatorPHIDs', array());
     $creator_handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('creators')
           ->setLabel(pht('Creators'))
           ->setValue($creator_handles));
   }
 
   protected function getURI($path) {
     return '/oauthserver/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array();
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['created'] = pht('Created');
     }
 
     $names['all'] = pht('All Applications');
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'created':
         return $query->setParameter(
           'creatorPHIDs',
           array($this->requireViewer()->getPHID()));
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function getRequiredHandlePHIDsForResultList(
     array $clients,
     PhabricatorSavedQuery $query) {
     return mpull($clients, 'getCreatorPHID');
   }
 
   protected function renderResultList(
     array $clients,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($clients, 'PhabricatorOauthServerClient');
 
     $viewer = $this->requireViewer();
 
     $list = id(new PHUIObjectItemListView())
       ->setUser($viewer);
     foreach ($clients as $client) {
       $creator = $handles[$client->getCreatorPHID()];
 
       $item = id(new PHUIObjectItemView())
         ->setObjectName(pht('Application %d', $client->getID()))
         ->setHeader($client->getName())
         ->setHref($client->getViewURI())
         ->setObject($client)
         ->addByline(pht('Creator: %s', $creator->renderLink()));
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php b/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php
index 3785857aeb..3f1bac81e5 100644
--- a/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php
+++ b/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php
@@ -1,129 +1,129 @@
 <?php
 
 final class PassphraseCredentialSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Passphrase Credentials');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorPassphraseApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'isDestroyed',
       $this->readBoolFromRequest($request, 'isDestroyed'));
     $saved->setParameter('name', $request->getStr('name'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PassphraseCredentialQuery());
 
     $destroyed = $saved->getParameter('isDestroyed');
     if ($destroyed !== null) {
       $query->withIsDestroyed($destroyed);
     }
 
     $name = $saved->getParameter('name');
     if (strlen($name)) {
       $query->withNameContains($name);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $name = $saved_query->getParameter('name');
 
     $form
       ->appendChild(
       id(new AphrontFormSelectControl())
         ->setName('isDestroyed')
         ->setLabel(pht('Status'))
         ->setValue($this->getBoolFromQuery($saved_query, 'isDestroyed'))
         ->setOptions(
           array(
             '' => pht('Show All Credentials'),
             'false' => pht('Show Only Active Credentials'),
             'true' => pht('Show Only Destroyed Credentials'),
           )))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('name')
           ->setLabel(pht('Name Contains'))
           ->setValue($name));
   }
 
   protected function getURI($path) {
     return '/passphrase/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'active' => pht('Active Credentials'),
       'all' => pht('All Credentials'),
     );
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'active':
         return $query->setParameter('isDestroyed', false);
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function renderResultList(
     array $credentials,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($credentials, 'PassphraseCredential');
 
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     $list->setUser($viewer);
     foreach ($credentials as $credential) {
 
       $item = id(new PHUIObjectItemView())
         ->setObjectName('K'.$credential->getID())
         ->setHeader($credential->getName())
         ->setHref('/K'.$credential->getID())
         ->setObject($credential);
 
       $item->addAttribute(
         pht('Login: %s', $credential->getUsername()));
 
       if ($credential->getIsDestroyed()) {
         $item->addIcon('fa-ban', pht('Destroyed'));
         $item->setDisabled(true);
       }
 
       $type = PassphraseCredentialType::getTypeByConstant(
         $credential->getCredentialType());
       if ($type) {
         $item->addIcon('fa-wrench', $type->getCredentialTypeName());
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/paste/query/PhabricatorPasteSearchEngine.php b/src/applications/paste/query/PhabricatorPasteSearchEngine.php
index f7289c7b29..d1c90e093d 100644
--- a/src/applications/paste/query/PhabricatorPasteSearchEngine.php
+++ b/src/applications/paste/query/PhabricatorPasteSearchEngine.php
@@ -1,195 +1,195 @@
 <?php
 
 final class PhabricatorPasteSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Pastes');
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
     $saved->setParameter(
       'authorPHIDs',
       $this->readUsersFromRequest($request, 'authors'));
 
     $languages = $request->getStrList('languages');
     if ($request->getBool('noLanguage')) {
       $languages[] = null;
     }
     $saved->setParameter('languages', $languages);
 
     $saved->setParameter('createdStart', $request->getStr('createdStart'));
     $saved->setParameter('createdEnd', $request->getStr('createdEnd'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorPasteQuery())
       ->needContent(true)
       ->withAuthorPHIDs($saved->getParameter('authorPHIDs', array()))
       ->withLanguages($saved->getParameter('languages', array()));
 
     $start = $this->parseDateTime($saved->getParameter('createdStart'));
     $end = $this->parseDateTime($saved->getParameter('createdEnd'));
 
     if ($start) {
       $query->withDateCreatedAfter($start);
     }
 
     if ($end) {
       $query->withDateCreatedBefore($end);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
     $phids = $saved_query->getParameter('authorPHIDs', array());
     $author_handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
 
     $languages = $saved_query->getParameter('languages', array());
     $no_language = false;
     foreach ($languages as $key => $language) {
       if ($language === null) {
         $no_language = true;
         unset($languages[$key]);
         continue;
       }
     }
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('authors')
           ->setLabel(pht('Authors'))
           ->setValue($author_handles))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('languages')
           ->setLabel(pht('Languages'))
           ->setValue(implode(', ', $languages)))
       ->appendChild(
         id(new AphrontFormCheckboxControl())
           ->addCheckbox(
             'noLanguage',
             1,
             pht('Find Pastes with no specified language.'),
             $no_language));
 
     $this->buildDateRange(
       $form,
       $saved_query,
       'createdStart',
       pht('Created After'),
       'createdEnd',
       pht('Created Before'));
 
   }
 
   protected function getURI($path) {
     return '/paste/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'all' => pht('All Pastes'),
     );
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['authored'] = pht('Authored');
     }
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
 
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'authored':
         return $query->setParameter(
           'authorPHIDs',
           array($this->requireViewer()->getPHID()));
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function getRequiredHandlePHIDsForResultList(
     array $pastes,
     PhabricatorSavedQuery $query) {
     return mpull($pastes, 'getAuthorPHID');
   }
 
   protected function renderResultList(
     array $pastes,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($pastes, 'PhabricatorPaste');
 
     $viewer = $this->requireViewer();
 
     $lang_map = PhabricatorEnv::getEnvConfig('pygments.dropdown-choices');
 
     $list = new PHUIObjectItemListView();
     $list->setUser($viewer);
     foreach ($pastes as $paste) {
       $created = phabricator_date($paste->getDateCreated(), $viewer);
       $author = $handles[$paste->getAuthorPHID()]->renderLink();
 
       $lines = phutil_split_lines($paste->getContent());
 
       $preview = id(new PhabricatorSourceCodeView())
         ->setLimit(5)
         ->setLines($lines)
         ->setURI(new PhutilURI($paste->getURI()));
 
       $source_code = phutil_tag(
         'div',
         array(
           'class' => 'phabricator-source-code-summary',
         ),
         $preview);
 
       $created = phabricator_datetime($paste->getDateCreated(), $viewer);
       $line_count = count($lines);
       $line_count = pht(
         '%s Line(s)',
         new PhutilNumber($line_count));
 
       $title = nonempty($paste->getTitle(), pht('(An Untitled Masterwork)'));
 
       $item = id(new PHUIObjectItemView())
         ->setObjectName('P'.$paste->getID())
         ->setHeader($title)
         ->setHref('/P'.$paste->getID())
         ->setObject($paste)
         ->addByline(pht('Author: %s', $author))
         ->addIcon('none', $created)
         ->addIcon('none', $line_count)
         ->appendChild($source_code);
 
       $lang_name = $paste->getLanguage();
       if ($lang_name) {
         $lang_name = idx($lang_map, $lang_name, $lang_name);
         $item->addIcon('none', $lang_name);
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 }
diff --git a/src/applications/people/query/PhabricatorPeopleLogSearchEngine.php b/src/applications/people/query/PhabricatorPeopleLogSearchEngine.php
index 301e67757d..5c1836ce8c 100644
--- a/src/applications/people/query/PhabricatorPeopleLogSearchEngine.php
+++ b/src/applications/people/query/PhabricatorPeopleLogSearchEngine.php
@@ -1,209 +1,209 @@
 <?php
 
 final class PhabricatorPeopleLogSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Account Activity');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorPeopleApplication';
   }
 
   public function getPageSize(PhabricatorSavedQuery $saved) {
     return 500;
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'userPHIDs',
       $this->readUsersFromRequest($request, 'users'));
 
     $saved->setParameter(
       'actorPHIDs',
       $this->readUsersFromRequest($request, 'actors'));
 
     $saved->setParameter(
       'actions',
       $this->readListFromRequest($request, 'actions'));
 
     $saved->setParameter(
       'ip',
       $request->getStr('ip'));
 
     $saved->setParameter(
       'sessions',
       $this->readListFromRequest($request, 'sessions'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorPeopleLogQuery());
 
     // NOTE: If the viewer isn't an administrator, always restrict the query to
     // related records. This echoes the policy logic of these logs. This is
     // mostly a performance optimization, to prevent us from having to pull
     // large numbers of logs that the user will not be able to see and filter
     // them in-process.
     $viewer = $this->requireViewer();
     if (!$viewer->getIsAdmin()) {
       $query->withRelatedPHIDs(array($viewer->getPHID()));
     }
 
     $actor_phids = $saved->getParameter('actorPHIDs', array());
     if ($actor_phids) {
       $query->withActorPHIDs($actor_phids);
     }
 
     $user_phids = $saved->getParameter('userPHIDs', array());
     if ($user_phids) {
       $query->withUserPHIDs($user_phids);
     }
 
     $actions = $saved->getParameter('actions', array());
     if ($actions) {
       $query->withActions($actions);
     }
 
     $remote_prefix = $saved->getParameter('ip');
     if (strlen($remote_prefix)) {
       $query->withRemoteAddressprefix($remote_prefix);
     }
 
     $sessions = $saved->getParameter('sessions', array());
     if ($sessions) {
       $query->withSessionKeys($sessions);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $actor_phids = $saved->getParameter('actorPHIDs', array());
     $user_phids = $saved->getParameter('userPHIDs', array());
 
     $all_phids = array_merge(
       $actor_phids,
       $user_phids);
 
     if ($all_phids) {
       $handles = id(new PhabricatorHandleQuery())
         ->setViewer($this->requireViewer())
         ->withPHIDs($all_phids)
         ->execute();
     } else {
       $handles = array();
     }
 
     $actor_handles = array_select_keys($handles, $actor_phids);
     $user_handles = array_select_keys($handles, $user_phids);
 
     $actions = $saved->getParameter('actions', array());
     $remote_prefix = $saved->getParameter('ip');
     $sessions = $saved->getParameter('sessions', array());
 
     $actions = array_fuse($actions);
     $action_control = id(new AphrontFormCheckboxControl())
       ->setLabel(pht('Actions'));
     $action_types = PhabricatorUserLog::getActionTypeMap();
     foreach ($action_types as $type => $label) {
       $action_control->addCheckbox(
         'actions[]',
         $type,
         $label,
         isset($actions[$label]));
     }
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('actors')
           ->setLabel(pht('Actors'))
           ->setValue($actor_handles))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('users')
           ->setLabel(pht('Users'))
           ->setValue($user_handles))
       ->appendChild($action_control)
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Filter IP'))
           ->setName('ip')
           ->setValue($remote_prefix))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Sessions'))
           ->setName('sessions')
           ->setValue(implode(', ', $sessions)));
 
   }
 
   protected function getURI($path) {
     return '/people/logs/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'all' => pht('All'),
     );
 
     return $names;
   }
 
   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();
     foreach ($logs as $log) {
       $phids[$log->getActorPHID()] = true;
       $phids[$log->getUserPHID()] = true;
     }
 
     return array_keys($phids);
   }
 
   protected function renderResultList(
     array $logs,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($logs, 'PhabricatorUserLog');
 
     $viewer = $this->requireViewer();
 
     $table = id(new PhabricatorUserLogView())
       ->setUser($viewer)
       ->setLogs($logs)
       ->setHandles($handles);
 
     if ($viewer->getIsAdmin()) {
       $table->setSearchBaseURI($this->getApplicationURI('logs/'));
     }
 
     return id(new PHUIObjectBoxView())
       ->setHeaderText(pht('User Activity Logs'))
       ->appendChild($table);
   }
 }
diff --git a/src/applications/people/query/PhabricatorPeopleSearchEngine.php b/src/applications/people/query/PhabricatorPeopleSearchEngine.php
index bc5ba884b6..4fbb1371fc 100644
--- a/src/applications/people/query/PhabricatorPeopleSearchEngine.php
+++ b/src/applications/people/query/PhabricatorPeopleSearchEngine.php
@@ -1,270 +1,270 @@
 <?php
 
 final class PhabricatorPeopleSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Users');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorPeopleApplication';
   }
 
   public function getCustomFieldObject() {
     return new PhabricatorUser();
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter('usernames', $request->getStrList('usernames'));
     $saved->setParameter('nameLike', $request->getStr('nameLike'));
     $saved->setParameter('isAdmin', $request->getStr('isAdmin'));
     $saved->setParameter('isDisabled', $request->getStr('isDisabled'));
     $saved->setParameter('isSystemAgent', $request->getStr('isSystemAgent'));
     $saved->setParameter('needsApproval', $request->getStr('needsApproval'));
     $saved->setParameter('createdStart', $request->getStr('createdStart'));
     $saved->setParameter('createdEnd', $request->getStr('createdEnd'));
 
     $this->readCustomFieldsFromRequest($request, $saved);
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorPeopleQuery())
       ->needPrimaryEmail(true)
       ->needProfileImage(true);
 
     $viewer = $this->requireViewer();
 
     // If the viewer can't browse the user directory, restrict the query to
     // just the user's own profile. This is a little bit silly, but serves to
     // restrict users from creating a dashboard panel which essentially just
     // contains a user directory anyway.
     $can_browse = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $this->getApplication(),
       PeopleBrowseUserDirectoryCapability::CAPABILITY);
     if (!$can_browse) {
       $query->withPHIDs(array($viewer->getPHID()));
     }
 
     $usernames = $saved->getParameter('usernames', array());
     if ($usernames) {
       $query->withUsernames($usernames);
     }
 
     $like = $saved->getParameter('nameLike');
     if ($like) {
       $query->withNameLike($like);
     }
 
     $is_admin = $saved->getParameter('isAdmin');
     $is_disabled = $saved->getParameter('isDisabled');
     $is_system_agent = $saved->getParameter('isSystemAgent');
     $needs_approval = $saved->getParameter('needsApproval');
     $no_disabled = $saved->getParameter('noDisabled');
 
     if ($is_admin) {
       $query->withIsAdmin(true);
     }
 
     if ($is_disabled) {
       $query->withIsDisabled(true);
     } else if ($no_disabled) {
       $query->withIsDisabled(false);
     }
 
     if ($is_system_agent) {
       $query->withIsSystemAgent(true);
     }
 
     if ($needs_approval) {
       $query->withIsApproved(false);
     }
 
     $start = $this->parseDateTime($saved->getParameter('createdStart'));
     $end = $this->parseDateTime($saved->getParameter('createdEnd'));
 
     if ($start) {
       $query->withDateCreatedAfter($start);
     }
 
     if ($end) {
       $query->withDateCreatedBefore($end);
     }
 
     $this->applyCustomFieldsToQuery($query, $saved);
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $usernames = $saved->getParameter('usernames', array());
     $like = $saved->getParameter('nameLike');
 
     $is_admin = $saved->getParameter('isAdmin');
     $is_disabled = $saved->getParameter('isDisabled');
     $is_system_agent = $saved->getParameter('isSystemAgent');
     $needs_approval = $saved->getParameter('needsApproval');
 
     $form
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('usernames')
           ->setLabel(pht('Usernames'))
           ->setValue(implode(', ', $usernames)))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('nameLike')
           ->setLabel(pht('Name Contains'))
           ->setValue($like))
       ->appendChild(
         id(new AphrontFormCheckboxControl())
           ->setLabel('Role')
           ->addCheckbox(
             'isAdmin',
             1,
             pht('Show only administrators.'),
             $is_admin)
           ->addCheckbox(
             'isDisabled',
             1,
             pht('Show only disabled users.'),
             $is_disabled)
           ->addCheckbox(
             'isSystemAgent',
             1,
             pht('Show only bots.'),
             $is_system_agent)
           ->addCheckbox(
             'needsApproval',
             1,
             pht('Show only users who need approval.'),
             $needs_approval));
 
     $this->appendCustomFieldsToForm($form, $saved);
 
     $this->buildDateRange(
       $form,
       $saved,
       'createdStart',
       pht('Joined After'),
       'createdEnd',
       pht('Joined Before'));
   }
 
   protected function getURI($path) {
     return '/people/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'all' => pht('All'),
     );
 
     $viewer = $this->requireViewer();
     if ($viewer->getIsAdmin()) {
       $names['approval'] = pht('Approval Queue');
     }
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'approval':
         return $query
           ->setParameter('needsApproval', true)
           ->setParameter('noDisabled', true);
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function renderResultList(
     array $users,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     assert_instances_of($users, 'PhabricatorUser');
 
     $request = $this->getRequest();
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
 
     $is_approval = ($query->getQueryKey() == 'approval');
 
     foreach ($users as $user) {
       $primary_email = $user->loadPrimaryEmail();
       if ($primary_email && $primary_email->getIsVerified()) {
         $email = pht('Verified');
       } else {
         $email = pht('Unverified');
       }
 
       $item = new PHUIObjectItemView();
       $item->setHeader($user->getFullName())
         ->setHref('/p/'.$user->getUsername().'/')
         ->addAttribute(phabricator_datetime($user->getDateCreated(), $viewer))
         ->addAttribute($email)
         ->setImageURI($user->getProfileImageURI());
 
       if ($is_approval && $primary_email) {
         $item->addAttribute($primary_email->getAddress());
       }
 
       if ($user->getIsDisabled()) {
         $item->addIcon('fa-ban', pht('Disabled'));
       }
 
       if (!$is_approval) {
         if (!$user->getIsApproved()) {
           $item->addIcon('fa-clock-o', pht('Needs Approval'));
         }
       }
 
       if ($user->getIsAdmin()) {
         $item->addIcon('fa-star', pht('Admin'));
       }
 
       if ($user->getIsSystemAgent()) {
         $item->addIcon('fa-desktop', pht('Bot/Script'));
       }
 
       if ($viewer->getIsAdmin()) {
         $user_id = $user->getID();
         if ($is_approval) {
           $item->addAction(
             id(new PHUIListItemView())
               ->setIcon('fa-ban')
               ->setName(pht('Disable'))
               ->setWorkflow(true)
               ->setHref($this->getApplicationURI('disapprove/'.$user_id.'/')));
           $item->addAction(
             id(new PHUIListItemView())
               ->setIcon('fa-thumbs-o-up')
               ->setName(pht('Approve'))
               ->setWorkflow(true)
               ->setHref($this->getApplicationURI('approve/'.$user_id.'/')));
         }
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/pholio/query/PholioMockSearchEngine.php b/src/applications/pholio/query/PholioMockSearchEngine.php
index 7656cdfc49..2940031057 100644
--- a/src/applications/pholio/query/PholioMockSearchEngine.php
+++ b/src/applications/pholio/query/PholioMockSearchEngine.php
@@ -1,147 +1,147 @@
 <?php
 
 final class PholioMockSearchEngine extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Pholio Mocks');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorPholioApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
     $saved->setParameter(
       'authorPHIDs',
       $this->readUsersFromRequest($request, 'authors'));
     $saved->setParameter(
       'statuses',
       $request->getStrList('status'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PholioMockQuery())
       ->needCoverFiles(true)
       ->needImages(true)
       ->needTokenCounts(true)
       ->withAuthorPHIDs($saved->getParameter('authorPHIDs', array()))
       ->withStatuses($saved->getParameter('statuses', array()));
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $phids = $saved_query->getParameter('authorPHIDs', array());
     $author_handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
 
     $statuses = array(
       '' => pht('Any Status'),
       'closed' => pht('Closed'),
       'open' => pht('Open'),
     );
 
     $status = $saved_query->getParameter('statuses', array());
     $status = head($status);
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('authors')
           ->setLabel(pht('Authors'))
           ->setValue($author_handles))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Status'))
           ->setName('status')
           ->setOptions($statuses)
           ->setValue($status));
   }
 
   protected function getURI($path) {
     return '/pholio/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'open' => pht('Open Mocks'),
       'all' => pht('All Mocks'),
     );
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['authored'] = pht('Authored');
     }
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'open':
         return $query->setParameter(
           'statuses',
           array('open'));
       case 'all':
         return $query;
       case 'authored':
         return $query->setParameter(
           'authorPHIDs',
           array($this->requireViewer()->getPHID()));
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function getRequiredHandlePHIDsForResultList(
     array $mocks,
     PhabricatorSavedQuery $query) {
     return mpull($mocks, 'getAuthorPHID');
   }
 
   protected function renderResultList(
     array $mocks,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($mocks, 'PholioMock');
 
     $viewer = $this->requireViewer();
 
     $board = new PHUIPinboardView();
     foreach ($mocks as $mock) {
 
       $header = 'M'.$mock->getID().' '.$mock->getName();
       $item = id(new PHUIPinboardItemView())
         ->setHeader($header)
         ->setURI('/M'.$mock->getID())
         ->setImageURI($mock->getCoverFile()->getThumb280x210URI())
         ->setImageSize(280, 210)
         ->setDisabled($mock->isClosed())
         ->addIconCount('fa-picture-o', count($mock->getImages()))
         ->addIconCount('fa-trophy', $mock->getTokenCount());
 
       if ($mock->getAuthorPHID()) {
         $author_handle = $handles[$mock->getAuthorPHID()];
         $datetime = phabricator_date($mock->getDateCreated(), $viewer);
         $item->appendChild(
           pht('By %s on %s', $author_handle->renderLink(), $datetime));
       }
 
       $board->addItem($item);
     }
 
     return $board;
   }
 
 }
diff --git a/src/applications/phortune/query/PhortuneCartSearchEngine.php b/src/applications/phortune/query/PhortuneCartSearchEngine.php
index 88e1777a5e..a04bd03072 100644
--- a/src/applications/phortune/query/PhortuneCartSearchEngine.php
+++ b/src/applications/phortune/query/PhortuneCartSearchEngine.php
@@ -1,195 +1,195 @@
 <?php
 
 final class PhortuneCartSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   private $merchant;
   private $account;
 
   public function setAccount(PhortuneAccount $account) {
     $this->account = $account;
     return $this;
   }
 
   public function getAccount() {
     return $this->account;
   }
 
   public function setMerchant(PhortuneMerchant $merchant) {
     $this->merchant = $merchant;
     return $this;
   }
 
   public function getMerchant() {
     return $this->merchant;
   }
 
   public function getResultTypeDescription() {
     return pht('Phortune Orders');
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhortuneCartQuery())
       ->needPurchases(true)
       ->withStatuses(
         array(
           PhortuneCart::STATUS_PURCHASING,
           PhortuneCart::STATUS_CHARGED,
           PhortuneCart::STATUS_HOLD,
           PhortuneCart::STATUS_REVIEW,
           PhortuneCart::STATUS_PURCHASED,
         ));
 
     $viewer = $this->requireViewer();
 
     $merchant = $this->getMerchant();
     $account = $this->getAccount();
     if ($merchant) {
       $can_edit = PhabricatorPolicyFilter::hasCapability(
         $viewer,
         $merchant,
         PhabricatorPolicyCapability::CAN_EDIT);
       if (!$can_edit) {
         throw new Exception(
           pht('You can not query orders for a merchant you do not control.'));
       }
       $query->withMerchantPHIDs(array($merchant->getPHID()));
     } else if ($account) {
       $can_edit = PhabricatorPolicyFilter::hasCapability(
         $viewer,
         $account,
         PhabricatorPolicyCapability::CAN_EDIT);
       if (!$can_edit) {
         throw new Exception(
           pht(
             'You can not query orders for an account you are not '.
             'a member of.'));
       }
       $query->withAccountPHIDs(array($account->getPHID()));
     } else {
       $accounts = id(new PhortuneAccountQuery())
         ->withMemberPHIDs(array($viewer->getPHID()))
         ->execute();
       if ($accounts) {
         $query->withAccountPHIDs(mpull($accounts, 'getPHID'));
       } else {
         throw new Exception(pht('You have no accounts!'));
       }
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {}
 
   protected function getURI($path) {
     $merchant = $this->getMerchant();
     $account = $this->getAccount();
     if ($merchant) {
       return '/phortune/merchant/'.$merchant->getID().'/order/'.$path;
     } else if ($account) {
       return '/phortune/'.$account->getID().'/order/';
     } else {
       return '/phortune/order/'.$path;
     }
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'all' => pht('All Orders'),
     );
 
     return $names;
   }
 
   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 $carts,
     PhabricatorSavedQuery $query) {
     $phids = array();
     foreach ($carts as $cart) {
       $phids[] = $cart->getPHID();
       $phids[] = $cart->getMerchantPHID();
       $phids[] = $cart->getAuthorPHID();
     }
     return $phids;
   }
 
   protected function renderResultList(
     array $carts,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($carts, 'PhortuneCart');
 
     $viewer = $this->requireViewer();
 
     $rows = array();
     foreach ($carts as $cart) {
       $merchant = $cart->getMerchant();
 
       $rows[] = array(
         $cart->getID(),
         $handles[$cart->getPHID()]->renderLink(),
         $handles[$merchant->getPHID()]->renderLink(),
         $handles[$cart->getAuthorPHID()]->renderLink(),
         $cart->getTotalPriceAsCurrency()->formatForDisplay(),
         PhortuneCart::getNameForStatus($cart->getStatus()),
         phabricator_datetime($cart->getDateModified(), $viewer),
       );
     }
 
     $table = id(new AphrontTableView($rows))
       ->setNoDataString(pht('No orders match the query.'))
       ->setHeaders(
         array(
           pht('ID'),
           pht('Order'),
           pht('Merchant'),
           pht('Authorized By'),
           pht('Amount'),
           pht('Status'),
           pht('Updated'),
         ))
       ->setColumnClasses(
         array(
           '',
           'pri',
           '',
           '',
           'wide right',
           '',
           'right',
         ));
 
     $merchant = $this->getMerchant();
     if ($merchant) {
       $header = pht('Orders for %s', $merchant->getName());
     } else {
       $header = pht('Your Orders');
     }
 
     return id(new PHUIObjectBoxView())
       ->setHeaderText($header)
       ->appendChild($table);
   }
 }
diff --git a/src/applications/phortune/query/PhortuneChargeSearchEngine.php b/src/applications/phortune/query/PhortuneChargeSearchEngine.php
index 27ac4e1d80..ba87cffc75 100644
--- a/src/applications/phortune/query/PhortuneChargeSearchEngine.php
+++ b/src/applications/phortune/query/PhortuneChargeSearchEngine.php
@@ -1,125 +1,125 @@
 <?php
 
 final class PhortuneChargeSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   private $account;
 
   public function setAccount(PhortuneAccount $account) {
     $this->account = $account;
     return $this;
   }
 
   public function getAccount() {
     return $this->account;
   }
 
   public function getResultTypeDescription() {
     return pht('Phortune Charges');
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhortuneChargeQuery());
 
     $viewer = $this->requireViewer();
 
     $account = $this->getAccount();
     if ($account) {
       $can_edit = PhabricatorPolicyFilter::hasCapability(
         $viewer,
         $account,
         PhabricatorPolicyCapability::CAN_EDIT);
       if (!$can_edit) {
         throw new Exception(
           pht(
             'You can not query charges for an account you are not '.
             'a member of.'));
       }
       $query->withAccountPHIDs(array($account->getPHID()));
     } else {
       $accounts = id(new PhortuneAccountQuery())
         ->withMemberPHIDs(array($viewer->getPHID()))
         ->execute();
       if ($accounts) {
         $query->withAccountPHIDs(mpull($accounts, 'getPHID'));
       } else {
         throw new Exception(pht('You have no accounts!'));
       }
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {}
 
   protected function getURI($path) {
     $account = $this->getAccount();
     if ($account) {
       return '/phortune/'.$account->getID().'/charge/';
     } else {
       return '/phortune/charge/'.$path;
     }
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'all' => pht('All Charges'),
     );
 
     return $names;
   }
 
   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 $charges,
     PhabricatorSavedQuery $query) {
 
     $phids = array();
     foreach ($charges as $charge) {
       $phids[] = $charge->getProviderPHID();
       $phids[] = $charge->getCartPHID();
       $phids[] = $charge->getMerchantPHID();
       $phids[] = $charge->getPaymentMethodPHID();
     }
 
     return $phids;
   }
 
   protected function renderResultList(
     array $charges,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($charges, 'PhortuneCharge');
 
     $viewer = $this->requireViewer();
 
     $table = id(new PhortuneChargeTableView())
       ->setUser($viewer)
       ->setCharges($charges)
       ->setHandles($handles);
 
     return id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Charges'))
       ->appendChild($table);
   }
 }
diff --git a/src/applications/phortune/query/PhortuneMerchantSearchEngine.php b/src/applications/phortune/query/PhortuneMerchantSearchEngine.php
index 0daf54374c..efb8cd5672 100644
--- a/src/applications/phortune/query/PhortuneMerchantSearchEngine.php
+++ b/src/applications/phortune/query/PhortuneMerchantSearchEngine.php
@@ -1,79 +1,79 @@
 <?php
 
 final class PhortuneMerchantSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Phortune Merchants');
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhortuneMerchantQuery());
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {}
 
   protected function getURI($path) {
     return '/phortune/merchant/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'all' => pht('All Merchants'),
     );
 
     return $names;
   }
 
   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 $merchants,
     PhabricatorSavedQuery $query) {
     return array();
   }
 
   protected function renderResultList(
     array $merchants,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($merchants, 'PhortuneMerchant');
 
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     $list->setUser($viewer);
     foreach ($merchants as $merchant) {
       $item = id(new PHUIObjectItemView())
         ->setObjectName(pht('Merchant %d', $merchant->getID()))
         ->setHeader($merchant->getName())
         ->setHref('/phortune/merchant/'.$merchant->getID().'/')
         ->setObject($merchant);
 
       $list->addItem($item);
     }
 
     return $list;
   }
 }
diff --git a/src/applications/phrequent/query/PhrequentSearchEngine.php b/src/applications/phrequent/query/PhrequentSearchEngine.php
index 0569c93822..65fb33bd11 100644
--- a/src/applications/phrequent/query/PhrequentSearchEngine.php
+++ b/src/applications/phrequent/query/PhrequentSearchEngine.php
@@ -1,201 +1,201 @@
 <?php
 
 final class PhrequentSearchEngine extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Phrequent Time');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorPhrequentApplication';
   }
 
   public function getPageSize(PhabricatorSavedQuery $saved) {
     return $saved->getParameter('limit', 1000);
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'userPHIDs',
       $this->readUsersFromRequest($request, 'users'));
 
     $saved->setParameter('ended', $request->getStr('ended'));
 
     $saved->setParameter('order', $request->getStr('order'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhrequentUserTimeQuery())
       ->needPreemptingEvents(true);
 
     $user_phids = $saved->getParameter('userPHIDs');
     if ($user_phids) {
       $query->withUserPHIDs($user_phids);
     }
 
     $ended = $saved->getParameter('ended');
     if ($ended != null) {
       $query->withEnded($ended);
     }
 
     $order = $saved->getParameter('order');
     if ($order != null) {
       $query->setOrder($order);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $user_phids = $saved_query->getParameter('userPHIDs', array());
     $ended = $saved_query->getParameter(
       'ended', PhrequentUserTimeQuery::ENDED_ALL);
     $order = $saved_query->getParameter(
       'order', PhrequentUserTimeQuery::ORDER_ENDED_DESC);
 
     $phids = array_merge($user_phids);
     $handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('users')
           ->setLabel(pht('Users'))
           ->setValue($handles))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Ended'))
           ->setName('ended')
           ->setValue($ended)
           ->setOptions(PhrequentUserTimeQuery::getEndedSearchOptions()))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Order'))
           ->setName('order')
           ->setValue($order)
           ->setOptions(PhrequentUserTimeQuery::getOrderSearchOptions()));
   }
 
   protected function getURI($path) {
     return '/phrequent/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'tracking' => pht('Currently Tracking'),
       'all' => pht('All Tracked'),
     );
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query
           ->setParameter('order', PhrequentUserTimeQuery::ORDER_ENDED_DESC);
       case 'tracking':
         return $query
           ->setParameter('ended', PhrequentUserTimeQuery::ENDED_NO)
           ->setParameter('order', PhrequentUserTimeQuery::ORDER_ENDED_DESC);
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function getRequiredHandlePHIDsForResultList(
     array $usertimes,
     PhabricatorSavedQuery $query) {
     return array_mergev(
       array(
         mpull($usertimes, 'getUserPHID'),
         mpull($usertimes, 'getObjectPHID'),
       ));
   }
 
   protected function renderResultList(
     array $usertimes,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($usertimes, 'PhrequentUserTime');
     $viewer = $this->requireViewer();
 
     $view = id(new PHUIObjectItemListView())
       ->setUser($viewer);
 
     foreach ($usertimes as $usertime) {
       $item = new PHUIObjectItemView();
       if ($usertime->getObjectPHID() === null) {
         $item->setHeader($usertime->getNote());
       } else {
         $obj = $handles[$usertime->getObjectPHID()];
         $item->setHeader($obj->getLinkName());
         $item->setHref($obj->getURI());
       }
       $item->setObject($usertime);
 
       $item->addByline(
         pht(
           'Tracked: %s',
           $handles[$usertime->getUserPHID()]->renderLink()));
 
       $started_date = phabricator_date($usertime->getDateStarted(), $viewer);
       $item->addIcon('none', $started_date);
 
       $block = new PhrequentTimeBlock(array($usertime));
       $time_spent = $block->getTimeSpentOnObject(
         $usertime->getObjectPHID(),
         PhabricatorTime::getNow());
 
       $time_spent = $time_spent == 0 ? 'none' :
         phutil_format_relative_time_detailed($time_spent);
 
       if ($usertime->getDateEnded() !== null) {
         $item->addAttribute(
           pht(
             'Tracked %s',
             $time_spent));
         $item->addAttribute(
           pht(
             'Ended on %s',
             phabricator_datetime($usertime->getDateEnded(), $viewer)));
       } else {
         $item->addAttribute(
           pht(
             'Tracked %s so far',
             $time_spent));
         if ($usertime->getObjectPHID() !== null &&
             $usertime->getUserPHID() === $viewer->getPHID()) {
           $item->addAction(
             id(new PHUIListItemView())
               ->setIcon('fa-stop')
               ->addSigil('phrequent-stop-tracking')
               ->setWorkflow(true)
               ->setRenderNameAsTooltip(true)
               ->setName(pht('Stop'))
               ->setHref(
                 '/phrequent/track/stop/'.
                 $usertime->getObjectPHID().'/'));
         }
         $item->setBarColor('green');
       }
 
       $view->addItem($item);
     }
 
     return $view;
   }
 
 }
diff --git a/src/applications/phriction/query/PhrictionSearchEngine.php b/src/applications/phriction/query/PhrictionSearchEngine.php
index 8b3f174f16..624fb99918 100644
--- a/src/applications/phriction/query/PhrictionSearchEngine.php
+++ b/src/applications/phriction/query/PhrictionSearchEngine.php
@@ -1,180 +1,180 @@
 <?php
 
 final class PhrictionSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Wiki Documents');
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter('status', $request->getArr('status'));
     $saved->setParameter('order', $request->getArr('order'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhrictionDocumentQuery())
       ->needContent(true)
       ->withStatus(PhrictionDocumentQuery::STATUS_NONSTUB);
 
     $status = $saved->getParameter('status');
     $status = idx($this->getStatusValues(), $status);
     if ($status) {
       $query->withStatus($status);
     }
 
     $order = $saved->getParameter('order');
     $order = idx($this->getOrderValues(), $order);
     if ($order) {
       $query->setOrder($order);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $form
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Status'))
           ->setName('status')
           ->setOptions($this->getStatusOptions())
           ->setValue($saved_query->getParameter('status')))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Order'))
           ->setName('order')
           ->setOptions($this->getOrderOptions())
           ->setValue($saved_query->getParameter('order')));
   }
 
   protected function getURI($path) {
     return '/phriction/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'active' => pht('Active'),
       'updated' => pht('Updated'),
       'all' => pht('All'),
     );
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
 
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'active':
         return $query->setParameter('status', 'active');
       case 'all':
         return $query;
       case 'updated':
         return $query->setParameter('order', 'updated');
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   private function getStatusOptions() {
     return array(
       'active' => pht('Show Active Documents'),
       'all' => pht('Show All Documents'),
     );
   }
 
   private function getStatusValues() {
     return array(
       'active' => PhrictionDocumentQuery::STATUS_OPEN,
       'all' => PhrictionDocumentQuery::STATUS_NONSTUB,
     );
   }
 
   private function getOrderOptions() {
     return array(
       'created' => pht('Date Created'),
       'updated' => pht('Date Updated'),
     );
   }
 
   private function getOrderValues() {
     return array(
       'created' => PhrictionDocumentQuery::ORDER_CREATED,
       'updated' => PhrictionDocumentQuery::ORDER_UPDATED,
     );
   }
 
   protected function getRequiredHandlePHIDsForResultList(
     array $documents,
     PhabricatorSavedQuery $query) {
 
     $phids = array();
     foreach ($documents as $document) {
       $content = $document->getContent();
       $phids[] = $content->getAuthorPHID();
     }
 
     return $phids;
   }
 
 
   protected function renderResultList(
     array $documents,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($documents, 'PhrictionDocument');
 
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     $list->setUser($viewer);
     foreach ($documents as $document) {
       $content = $document->getContent();
       $slug = $document->getSlug();
       $author_phid = $content->getAuthorPHID();
       $slug_uri = PhrictionDocument::getSlugURI($slug);
 
       $byline = pht(
         'Edited by %s',
         $handles[$author_phid]->renderLink());
 
       $updated = phabricator_datetime(
         $content->getDateCreated(),
         $viewer);
 
       $item = id(new PHUIObjectItemView())
         ->setHeader($content->getTitle())
         ->setHref($slug_uri)
         ->addByline($byline)
         ->addIcon('none', $updated);
 
       $item->addAttribute($slug_uri);
 
       switch ($document->getStatus()) {
         case PhrictionDocumentStatus::STATUS_DELETED:
           $item->setDisabled(true);
           $item->addIcon('delete', pht('Deleted'));
           break;
         case PhrictionDocumentStatus::STATUS_MOVED:
           $item->setDisabled(true);
           $item->addIcon('arrow-right', pht('Moved Away'));
           break;
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/ponder/query/PonderQuestionSearchEngine.php b/src/applications/ponder/query/PonderQuestionSearchEngine.php
index c4e22000df..ef1d277c5e 100644
--- a/src/applications/ponder/query/PonderQuestionSearchEngine.php
+++ b/src/applications/ponder/query/PonderQuestionSearchEngine.php
@@ -1,178 +1,178 @@
 <?php
 
 final class PonderQuestionSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Ponder Questions');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorPonderApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'authorPHIDs',
       $this->readUsersFromRequest($request, 'authors'));
 
     $saved->setParameter(
       'answererPHIDs',
       $this->readUsersFromRequest($request, 'answerers'));
 
     $saved->setParameter('status', $request->getStr('status'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PonderQuestionQuery());
 
     $author_phids = $saved->getParameter('authorPHIDs');
     if ($author_phids) {
       $query->withAuthorPHIDs($author_phids);
     }
 
     $answerer_phids = $saved->getParameter('answererPHIDs');
     if ($answerer_phids) {
       $query->withAnswererPHIDs($answerer_phids);
     }
 
     $status = $saved->getParameter('status');
     if ($status != null) {
       switch ($status) {
         case 0:
           $query->withStatus(PonderQuestionQuery::STATUS_OPEN);
           break;
         case 1:
           $query->withStatus(PonderQuestionQuery::STATUS_CLOSED);
           break;
       }
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $author_phids = $saved_query->getParameter('authorPHIDs', array());
     $answerer_phids = $saved_query->getParameter('answererPHIDs', array());
     $status = $saved_query->getParameter(
       'status', PonderQuestionStatus::STATUS_OPEN);
 
     $phids = array_merge($author_phids, $answerer_phids);
     $handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('authors')
           ->setLabel(pht('Authors'))
           ->setValue(array_select_keys($handles, $author_phids)))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('answerers')
           ->setLabel(pht('Answered By'))
           ->setValue(array_select_keys($handles, $answerer_phids)))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Status'))
           ->setName('status')
           ->setValue($status)
           ->setOptions(PonderQuestionStatus::getQuestionStatusMap()));
   }
 
   protected function getURI($path) {
     return '/ponder/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'open' => pht('Open Questions'),
       'all' => pht('All Questions'),
     );
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['authored'] = pht('Authored');
       $names['answered'] = pht('Answered');
     }
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
 
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'open':
         return $query->setParameter('status', PonderQuestionQuery::STATUS_OPEN);
       case 'authored':
         return $query->setParameter(
           'authorPHIDs',
           array($this->requireViewer()->getPHID()));
       case 'answered':
         return $query->setParameter(
           'answererPHIDs',
           array($this->requireViewer()->getPHID()));
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function getRequiredHandlePHIDsForResultList(
     array $questions,
     PhabricatorSavedQuery $query) {
     return mpull($questions, 'getAuthorPHID');
   }
 
   protected function renderResultList(
     array $questions,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($questions, 'PonderQuestion');
 
     $viewer = $this->requireViewer();
 
     $view = id(new PHUIObjectItemListView())
       ->setUser($viewer);
 
     foreach ($questions as $question) {
       $item = new PHUIObjectItemView();
       $item->setObjectName('Q'.$question->getID());
       $item->setHeader($question->getTitle());
       $item->setHref('/Q'.$question->getID());
       $item->setObject($question);
       $item->setBarColor(
         PonderQuestionStatus::getQuestionStatusTagColor(
           $question->getStatus()));
 
       $created_date = phabricator_date($question->getDateCreated(), $viewer);
       $item->addIcon('none', $created_date);
       $item->addByline(
         pht(
           'Asked by %s',
           $handles[$question->getAuthorPHID()]->renderLink()));
 
       $item->addAttribute(
         pht('%d Answer(s)', $question->getAnswerCount()));
 
       $view->addItem($item);
     }
 
     return $view;
   }
 
 }
diff --git a/src/applications/project/query/PhabricatorProjectSearchEngine.php b/src/applications/project/query/PhabricatorProjectSearchEngine.php
index 8a9a228d9b..a72206ca10 100644
--- a/src/applications/project/query/PhabricatorProjectSearchEngine.php
+++ b/src/applications/project/query/PhabricatorProjectSearchEngine.php
@@ -1,269 +1,269 @@
 <?php
 
 final class PhabricatorProjectSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Projects');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorProjectApplication';
   }
 
   public function getCustomFieldObject() {
     return new PhabricatorProject();
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'memberPHIDs',
       $this->readUsersFromRequest($request, 'members'));
 
     $saved->setParameter('status', $request->getStr('status'));
     $saved->setParameter('name', $request->getStr('name'));
 
     $saved->setParameter(
       'icons',
       $this->readListFromRequest($request, 'icons'));
 
     $saved->setParameter(
       'colors',
       $this->readListFromRequest($request, 'colors'));
 
     $this->readCustomFieldsFromRequest($request, $saved);
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorProjectQuery())
       ->needImages(true);
 
     $member_phids = $saved->getParameter('memberPHIDs', array());
     if ($member_phids && is_array($member_phids)) {
       $query->withMemberPHIDs($member_phids);
     }
 
     $status = $saved->getParameter('status');
     $status = idx($this->getStatusValues(), $status);
     if ($status) {
       $query->withStatus($status);
     }
 
     $name = $saved->getParameter('name');
     if (strlen($name)) {
       $query->withDatasourceQuery($name);
     }
 
     $icons = $saved->getParameter('icons');
     if ($icons) {
       $query->withIcons($icons);
     }
 
     $colors = $saved->getParameter('colors');
     if ($colors) {
       $query->withColors($colors);
     }
 
     $this->applyCustomFieldsToQuery($query, $saved);
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $phids = $saved->getParameter('memberPHIDs', array());
     $member_handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
 
     $status = $saved->getParameter('status');
     $name_match = $saved->getParameter('name');
 
     $icons = array_fuse($saved->getParameter('icons', array()));
     $colors = array_fuse($saved->getParameter('colors', array()));
 
     $icon_control = id(new AphrontFormCheckboxControl())
       ->setLabel(pht('Icons'));
     foreach (PhabricatorProjectIcon::getIconMap() as $icon => $name) {
       $image = id(new PHUIIconView())
         ->setIconFont($icon);
 
       $icon_control->addCheckbox(
         'icons[]',
         $icon,
         array($image, ' ', $name),
         isset($icons[$icon]));
     }
 
     $color_control = id(new AphrontFormCheckboxControl())
       ->setLabel(pht('Colors'));
     foreach (PhabricatorProjectIcon::getColorMap() as $color => $name) {
       $tag = id(new PHUITagView())
         ->setType(PHUITagView::TYPE_SHADE)
         ->setShade($color)
         ->setName($name);
 
       $color_control->addCheckbox(
         'colors[]',
         $color,
         $tag,
         isset($colors[$color]));
     }
 
     $form
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('name')
           ->setLabel(pht('Name'))
           ->setValue($name_match))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('members')
           ->setLabel(pht('Members'))
           ->setValue($member_handles))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Status'))
           ->setName('status')
           ->setOptions($this->getStatusOptions())
           ->setValue($status))
       ->appendChild($icon_control)
       ->appendChild($color_control);
 
     $this->appendCustomFieldsToForm($form, $saved);
   }
 
   protected function getURI($path) {
     return '/project/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array();
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['joined'] = pht('Joined');
     }
 
     $names['active'] = pht('Active');
     $names['all'] = pht('All');
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     $viewer_phid = $this->requireViewer()->getPHID();
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'active':
         return $query
           ->setParameter('status', 'active');
       case 'joined':
         return $query
           ->setParameter('memberPHIDs', array($viewer_phid))
           ->setParameter('status', 'active');
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   private function getStatusOptions() {
     return array(
       'active' => pht('Show Only Active Projects'),
       'all'    => pht('Show All Projects'),
     );
   }
 
   private function getStatusValues() {
     return array(
       'active' => PhabricatorProjectQuery::STATUS_ACTIVE,
       'all' => PhabricatorProjectQuery::STATUS_ANY,
     );
   }
 
   private function getColorValues() {}
 
   private function getIconValues() {}
 
   protected function getRequiredHandlePHIDsForResultList(
     array $projects,
     PhabricatorSavedQuery $query) {
     return mpull($projects, 'getPHID');
   }
 
   protected function renderResultList(
     array $projects,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($projects, 'PhabricatorProject');
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     $list->setUser($viewer);
     $can_edit_projects = id(new PhabricatorPolicyFilter())
       ->setViewer($viewer)
       ->requireCapabilities(array(PhabricatorPolicyCapability::CAN_EDIT))
       ->apply($projects);
 
     foreach ($projects as $key => $project) {
       $id = $project->getID();
       $workboards_uri = $this->getApplicationURI("board/{$id}/");
       $members_uri = $this->getApplicationURI("members/{$id}/");
       $workboards_url = phutil_tag(
         'a',
         array(
           'href' => $workboards_uri,
         ),
         pht('Workboard'));
 
       $members_class = null;
       $members_sigil = null;
       if (!isset($can_edit_projects[$key])) {
         $members_class = 'disabled';
         $members_sigil = 'workflow';
       }
       $members_url = javelin_tag(
         'a',
         array(
           'href' => $members_uri,
           'class' => $members_class,
           'sigil' => $members_sigil,
         ),
         pht('Members'));
 
       $tag_list = id(new PHUIHandleTagListView())
         ->setSlim(true)
         ->setHandles(array($handles[$project->getPHID()]));
 
       $item = id(new PHUIObjectItemView())
         ->setHeader($project->getName())
         ->setHref($this->getApplicationURI("view/{$id}/"))
         ->setImageURI($project->getProfileImageURI())
         ->addAttribute($tag_list)
         ->addAttribute($workboards_url)
         ->addAttribute($members_url);
 
       if ($project->getStatus() == PhabricatorProjectStatus::STATUS_ARCHIVED) {
         $item->addIcon('delete-grey', pht('Archived'));
         $item->setDisabled(true);
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/releeph/query/ReleephBranchSearchEngine.php b/src/applications/releeph/query/ReleephBranchSearchEngine.php
index 46e3219890..24f0a9818a 100644
--- a/src/applications/releeph/query/ReleephBranchSearchEngine.php
+++ b/src/applications/releeph/query/ReleephBranchSearchEngine.php
@@ -1,98 +1,98 @@
 <?php
 
 final class ReleephBranchSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   private $product;
 
   public function getResultTypeDescription() {
     return pht('Releeph Branches');
   }
 
   public function setProduct(ReleephProject $product) {
     $this->product = $product;
     return $this;
   }
 
   public function getProduct() {
     return $this->product;
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter('active', $request->getStr('active'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new ReleephBranchQuery())
       ->needCutPointCommits(true)
       ->withProductPHIDs(array($this->getProduct()->getPHID()));
 
     $active = $saved->getParameter('active');
     $value = idx($this->getActiveValues(), $active);
     if ($value !== null) {
       $query->withStatus($value);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $form->appendChild(
       id(new AphrontFormSelectControl())
         ->setName('active')
         ->setLabel(pht('Show Branches'))
         ->setValue($saved_query->getParameter('active'))
         ->setOptions($this->getActiveOptions()));
   }
 
   protected function getURI($path) {
     return '/releeph/product/'.$this->getProduct()->getID().'/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'open' => pht('Open'),
       'all' => pht('All'),
     );
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
 
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'open':
         return $query
           ->setParameter('active', 'open');
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   private function getActiveOptions() {
     return array(
       'open' => pht('Open Branches'),
       'all' => pht('Open and Closed Branches'),
     );
   }
 
   private function getActiveValues() {
     return array(
       'open' => ReleephBranchQuery::STATUS_OPEN,
       'all' => ReleephBranchQuery::STATUS_ALL,
     );
   }
 
 }
diff --git a/src/applications/releeph/query/ReleephProductSearchEngine.php b/src/applications/releeph/query/ReleephProductSearchEngine.php
index e3fe499266..e3a30c1a56 100644
--- a/src/applications/releeph/query/ReleephProductSearchEngine.php
+++ b/src/applications/releeph/query/ReleephProductSearchEngine.php
@@ -1,133 +1,133 @@
 <?php
 
 final class ReleephProductSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Releeph Products');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorReleephApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter('active', $request->getStr('active'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new ReleephProductQuery())
       ->setOrder(ReleephProductQuery::ORDER_NAME)
       ->needArcanistProjects(true);
 
     $active = $saved->getParameter('active');
     $value = idx($this->getActiveValues(), $active);
     if ($value !== null) {
       $query->withActive($value);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $form->appendChild(
       id(new AphrontFormSelectControl())
         ->setName('active')
         ->setLabel(pht('Show Products'))
         ->setValue($saved_query->getParameter('active'))
         ->setOptions($this->getActiveOptions()));
   }
 
   protected function getURI($path) {
     return '/releeph/project/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'active' => pht('Active'),
       'all' => pht('All'),
     );
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'active':
         return $query
           ->setParameter('active', 'active');
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   private function getActiveOptions() {
     return array(
       'all'       => pht('Active and Inactive Products'),
       'active'    => pht('Active Prodcuts'),
       'inactive'  => pht('Inactive Products'),
     );
   }
 
   private function getActiveValues() {
     return array(
       'all' => null,
       'active' => 1,
       'inactive' => 0,
     );
   }
 
   protected function renderResultList(
     array $products,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     assert_instances_of($products, 'ReleephProject');
     $viewer = $this->requireViewer();
 
     $list = id(new PHUIObjectItemListView())
       ->setUser($viewer);
 
     foreach ($products as $product) {
       $id = $product->getID();
 
       $item = id(new PHUIObjectItemView())
         ->setHeader($product->getName())
         ->setHref($this->getApplicationURI("product/{$id}/"));
 
       if (!$product->getIsActive()) {
         $item->setDisabled(true);
         $item->addIcon('none', pht('Inactive'));
       }
 
       $repo = $product->getRepository();
       $item->addAttribute(
         phutil_tag(
           'a',
           array(
             'href' => '/diffusion/'.$repo->getCallsign().'/',
           ),
           'r'.$repo->getCallsign()));
 
       $arc = $product->getArcanistProject();
       if ($arc) {
         $item->addAttribute($arc->getName());
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/releeph/query/ReleephRequestSearchEngine.php b/src/applications/releeph/query/ReleephRequestSearchEngine.php
index 072bb334ef..35ebb3c202 100644
--- a/src/applications/releeph/query/ReleephRequestSearchEngine.php
+++ b/src/applications/releeph/query/ReleephRequestSearchEngine.php
@@ -1,175 +1,175 @@
 <?php
 
 final class ReleephRequestSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   private $branch;
   private $baseURI;
 
   public function getResultTypeDescription() {
     return pht('Releeph Pull Requests');
   }
 
   public function setBranch(ReleephBranch $branch) {
     $this->branch = $branch;
     return $this;
   }
 
   public function getBranch() {
     return $this->branch;
   }
 
   public function setBaseURI($base_uri) {
     $this->baseURI = $base_uri;
     return $this;
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter('status', $request->getStr('status'));
     $saved->setParameter('severity', $request->getStr('severity'));
     $saved->setParameter(
       'requestorPHIDs',
       $this->readUsersFromRequest($request, 'requestors'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new ReleephRequestQuery())
       ->withBranchIDs(array($this->getBranch()->getID()));
 
     $status = $saved->getParameter('status');
     $status = idx($this->getStatusValues(), $status);
     if ($status) {
       $query->withStatus($status);
     }
 
     $severity = $saved->getParameter('severity');
     if ($severity) {
       $query->withSeverities(array($severity));
     }
 
     $requestor_phids = $saved->getParameter('requestorPHIDs');
     if ($requestor_phids) {
       $query->withRequestorPHIDs($requestor_phids);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $phids = $saved_query->getParameter('requestorPHIDs', array());
     $requestor_handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
 
     $form
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setName('status')
           ->setLabel(pht('Status'))
           ->setValue($saved_query->getParameter('status'))
           ->setOptions($this->getStatusOptions()))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setName('severity')
           ->setLabel(pht('Severity'))
           ->setValue($saved_query->getParameter('severity'))
           ->setOptions($this->getSeverityOptions()))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('requestors')
           ->setLabel(pht('Requestors'))
           ->setValue($requestor_handles));
   }
 
   protected function getURI($path) {
     return $this->baseURI.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'open' => pht('Open Requests'),
       'all' => pht('All Requests'),
     );
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['requested'] = pht('Requested');
     }
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
 
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'open':
         return $query->setParameter('status', 'open');
       case 'all':
         return $query;
       case 'requested':
         return $query->setParameter(
           'requestorPHIDs',
           array($this->requireViewer()->getPHID()));
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   private function getStatusOptions() {
     return array(
       ''              => pht('(All Requests)'),
       'open'          => pht('Open Requests'),
       'requested'     => pht('Pull Requested'),
       'needs-pull'    => pht('Needs Pull'),
       'rejected'      => pht('Rejected'),
       'abandoned'     => pht('Abandoned'),
       'pulled'        => pht('Pulled'),
       'needs-revert'  => pht('Needs Revert'),
       'reverted'      => pht('Reverted'),
     );
   }
 
   private function getStatusValues() {
     return array(
       'open'          => ReleephRequestQuery::STATUS_OPEN,
       'requested'     => ReleephRequestQuery::STATUS_REQUESTED,
       'needs-pull'    => ReleephRequestQuery::STATUS_NEEDS_PULL,
       'rejected'      => ReleephRequestQuery::STATUS_REJECTED,
       'abandoned'     => ReleephRequestQuery::STATUS_ABANDONED,
       'pulled'        => ReleephRequestQuery::STATUS_PULLED,
       'needs-revert'  => ReleephRequestQuery::STATUS_NEEDS_REVERT,
       'reverted'      => ReleephRequestQuery::STATUS_REVERTED,
     );
   }
 
   private function getSeverityOptions() {
     if (ReleephDefaultFieldSelector::isFacebook()) {
       return array(
         '' => pht('(All Severities)'),
         11 => 'HOTFIX',
         12 => 'PIGGYBACK',
         13 => 'RELEASE',
         14 => 'DAILY',
         15 => 'PARKING',
       );
     } else {
       return array(
         '' => pht('(All Severities)'),
         ReleephSeverityFieldSpecification::HOTFIX => pht('Hotfix'),
         ReleephSeverityFieldSpecification::RELEASE => pht('Release'),
       );
     }
   }
 
 }
diff --git a/src/applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php b/src/applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php
index 9e73330dab..68fc754a40 100644
--- a/src/applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php
+++ b/src/applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php
@@ -1,134 +1,134 @@
 <?php
 
 final class PhabricatorRepositoryPushLogSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Push Logs');
   }
 
-  public function getApplicationClassName() {
+  protected 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());
 
     $all_phids = array_merge(
       $repository_phids,
       $pusher_phids);
 
     if ($all_phids) {
       $handles = id(new PhabricatorHandleQuery())
         ->setViewer($this->requireViewer())
         ->withPHIDs($all_phids)
         ->execute();
     } else {
       $handles = array();
     }
 
     $repository_handles = array_select_keys($handles, $repository_phids);
     $pusher_handles = array_select_keys($handles, $pusher_phids);
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new DiffusionRepositoryDatasource())
           ->setName('repositories')
           ->setLabel(pht('Repositories'))
           ->setValue($repository_handles))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('pushers')
           ->setLabel(pht('Pushers'))
           ->setValue($pusher_handles));
   }
 
   protected function getURI($path) {
     return '/diffusion/pushlog/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  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) {
     return mpull($logs, 'getPusherPHID');
   }
 
   protected function renderResultList(
     array $logs,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     $table = id(new DiffusionPushLogListView())
       ->setUser($this->requireViewer())
       ->setHandles($handles)
       ->setLogs($logs);
 
     $box = id(new PHUIBoxView())
       ->addMargin(PHUI::MARGIN_LARGE)
       ->appendChild($table);
 
     return $box;
   }
 
 }
diff --git a/src/applications/repository/query/PhabricatorRepositorySearchEngine.php b/src/applications/repository/query/PhabricatorRepositorySearchEngine.php
index d665ae3e04..90b1afaa5d 100644
--- a/src/applications/repository/query/PhabricatorRepositorySearchEngine.php
+++ b/src/applications/repository/query/PhabricatorRepositorySearchEngine.php
@@ -1,305 +1,305 @@
 <?php
 
 final class PhabricatorRepositorySearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Repositories');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorDiffusionApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter('callsigns', $request->getStrList('callsigns'));
     $saved->setParameter('status', $request->getStr('status'));
     $saved->setParameter('order', $request->getStr('order'));
     $saved->setParameter('hosted', $request->getStr('hosted'));
     $saved->setParameter('types', $request->getArr('types'));
     $saved->setParameter('name', $request->getStr('name'));
     $saved->setParameter('anyProjectPHIDs', $request->getArr('anyProjects'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorRepositoryQuery())
       ->needProjectPHIDs(true)
       ->needCommitCounts(true)
       ->needMostRecentCommits(true);
 
     $callsigns = $saved->getParameter('callsigns');
     if ($callsigns) {
       $query->withCallsigns($callsigns);
     }
 
     $status = $saved->getParameter('status');
     $status = idx($this->getStatusValues(), $status);
     if ($status) {
       $query->withStatus($status);
     }
 
     $order = $saved->getParameter('order');
     $order = idx($this->getOrderValues(), $order);
     if ($order) {
       $query->setOrder($order);
     } else {
       $query->setOrder(head($this->getOrderValues()));
     }
 
     $hosted = $saved->getParameter('hosted');
     $hosted = idx($this->getHostedValues(), $hosted);
     if ($hosted) {
       $query->withHosted($hosted);
     }
 
     $types = $saved->getParameter('types');
     if ($types) {
       $query->withTypes($types);
     }
 
     $name = $saved->getParameter('name');
     if (strlen($name)) {
       $query->withNameContains($name);
     }
 
     $any_project_phids = $saved->getParameter('anyProjectPHIDs');
     if ($any_project_phids) {
       $query->withAnyProjects($any_project_phids);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $callsigns = $saved_query->getParameter('callsigns', array());
     $types = $saved_query->getParameter('types', array());
     $types = array_fuse($types);
     $name = $saved_query->getParameter('name');
     $any_project_phids = $saved_query->getParameter('anyProjectPHIDs', array());
 
     if ($any_project_phids) {
       $any_project_handles = id(new PhabricatorHandleQuery())
         ->setViewer($this->requireViewer())
         ->withPHIDs($any_project_phids)
         ->execute();
     } else {
       $any_project_handles = array();
     }
 
     $form
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('callsigns')
           ->setLabel(pht('Callsigns'))
           ->setValue(implode(', ', $callsigns)))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('name')
           ->setLabel(pht('Name Contains'))
           ->setValue($name))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorProjectDatasource())
           ->setName('anyProjects')
           ->setLabel(pht('In Any Project'))
           ->setValue($any_project_handles))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setName('status')
           ->setLabel(pht('Status'))
           ->setValue($saved_query->getParameter('status'))
           ->setOptions($this->getStatusOptions()))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setName('hosted')
           ->setLabel(pht('Hosted'))
           ->setValue($saved_query->getParameter('hosted'))
           ->setOptions($this->getHostedOptions()));
 
     $type_control = id(new AphrontFormCheckboxControl())
       ->setLabel(pht('Types'));
 
     $all_types = PhabricatorRepositoryType::getAllRepositoryTypes();
     foreach ($all_types as $key => $name) {
       $type_control->addCheckbox(
         'types[]',
         $key,
         $name,
         isset($types[$key]));
     }
 
     $form
       ->appendChild($type_control)
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setName('order')
           ->setLabel(pht('Order'))
           ->setValue($saved_query->getParameter('order'))
           ->setOptions($this->getOrderOptions()));
   }
 
   protected function getURI($path) {
     return '/diffusion/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'active' => pht('Active Repositories'),
       'all' => pht('All Repositories'),
     );
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
 
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'active':
         return $query->setParameter('status', 'open');
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   private function getStatusOptions() {
     return array(
       '' => pht('Active and Inactive Repositories'),
       'open' => pht('Active Repositories'),
       'closed' => pht('Inactive Repositories'),
     );
   }
 
   private function getStatusValues() {
     return array(
       '' => PhabricatorRepositoryQuery::STATUS_ALL,
       'open' => PhabricatorRepositoryQuery::STATUS_OPEN,
       'closed' => PhabricatorRepositoryQuery::STATUS_CLOSED,
     );
   }
 
   private function getOrderOptions() {
     return array(
       'committed' => pht('Most Recent Commit'),
       'name' => pht('Name'),
       'callsign' => pht('Callsign'),
       'created' => pht('Date Created'),
     );
   }
 
   private function getOrderValues() {
     return array(
       'committed' => PhabricatorRepositoryQuery::ORDER_COMMITTED,
       'name' => PhabricatorRepositoryQuery::ORDER_NAME,
       'callsign' => PhabricatorRepositoryQuery::ORDER_CALLSIGN,
       'created' => PhabricatorRepositoryQuery::ORDER_CREATED,
     );
   }
 
   private function getHostedOptions() {
     return array(
       '' => pht('Hosted and Remote Repositories'),
       'phabricator' => pht('Hosted Repositories'),
       'remote' => pht('Remote Repositories'),
     );
   }
 
   private function getHostedValues() {
     return array(
       '' => PhabricatorRepositoryQuery::HOSTED_ALL,
       'phabricator' => PhabricatorRepositoryQuery::HOSTED_PHABRICATOR,
       'remote' => PhabricatorRepositoryQuery::HOSTED_REMOTE,
     );
   }
 
   protected function getRequiredHandlePHIDsForResultList(
     array $repositories,
     PhabricatorSavedQuery $query) {
     return array_mergev(mpull($repositories, 'getProjectPHIDs'));
   }
 
   protected function renderResultList(
     array $repositories,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($repositories, 'PhabricatorRepository');
 
     $viewer = $this->requireViewer();;
 
     $list = new PHUIObjectItemListView();
     foreach ($repositories as $repository) {
       $id = $repository->getID();
 
       $item = id(new PHUIObjectItemView())
         ->setUser($viewer)
         ->setHeader($repository->getName())
         ->setObjectName('r'.$repository->getCallsign())
         ->setHref($this->getApplicationURI($repository->getCallsign().'/'));
 
       $commit = $repository->getMostRecentCommit();
       if ($commit) {
         $commit_link = DiffusionView::linkCommit(
             $repository,
             $commit->getCommitIdentifier(),
             $commit->getSummary());
         $item->setSubhead($commit_link);
         $item->setEpoch($commit->getEpoch());
       }
 
       $item->addIcon(
         'none',
         PhabricatorRepositoryType::getNameForRepositoryType(
           $repository->getVersionControlSystem()));
 
       $size = $repository->getCommitCount();
       if ($size) {
         $history_uri = DiffusionRequest::generateDiffusionURI(
           array(
             'callsign' => $repository->getCallsign(),
             'action' => 'history',
           ));
 
         $item->addAttribute(
           phutil_tag(
             'a',
             array(
               'href' => $history_uri,
             ),
             pht('%s Commit(s)', new PhutilNumber($size))));
       } else {
         $item->addAttribute(pht('No Commits'));
       }
 
       $project_handles = array_select_keys(
         $handles,
         $repository->getProjectPHIDs());
       if ($project_handles) {
         $item->addAttribute(
           id(new PHUIHandleTagListView())
             ->setSlim(true)
             ->setHandles($project_handles));
       }
 
       if (!$repository->isTracked()) {
         $item->setDisabled(true);
         $item->addIcon('disable-grey', pht('Inactive'));
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }
diff --git a/src/applications/search/query/PhabricatorSearchApplicationSearchEngine.php b/src/applications/search/query/PhabricatorSearchApplicationSearchEngine.php
index b56a3466fd..f810dcb76b 100644
--- a/src/applications/search/query/PhabricatorSearchApplicationSearchEngine.php
+++ b/src/applications/search/query/PhabricatorSearchApplicationSearchEngine.php
@@ -1,283 +1,283 @@
 <?php
 
 final class PhabricatorSearchApplicationSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Fulltext Results');
   }
 
-  public function getApplicationClassName() {
+  protected function getApplicationClassName() {
     return 'PhabricatorSearchApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter('query', $request->getStr('query'));
     $saved->setParameter(
       'statuses',
       $this->readListFromRequest($request, 'statuses'));
     $saved->setParameter(
       'types',
       $this->readListFromRequest($request, 'types'));
 
     $saved->setParameter(
       'authorPHIDs',
       $this->readUsersFromRequest($request, 'authorPHIDs'));
 
     $saved->setParameter(
       'ownerPHIDs',
       $this->readUsersFromRequest($request, 'ownerPHIDs'));
 
     $saved->setParameter(
       'withUnowned',
       $this->readBoolFromRequest($request, 'withUnowned'));
 
     $saved->setParameter(
       'subscriberPHIDs',
       $this->readPHIDsFromRequest($request, 'subscriberPHIDs'));
 
     $saved->setParameter(
       'projectPHIDs',
       $this->readPHIDsFromRequest($request, 'projectPHIDs'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorSearchDocumentQuery())
       ->withSavedQuery($saved);
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $options = array();
     $author_value = null;
     $owner_value = null;
     $subscribers_value = null;
     $project_value = null;
 
     $author_phids = $saved->getParameter('authorPHIDs', array());
     $owner_phids = $saved->getParameter('ownerPHIDs', array());
     $subscriber_phids = $saved->getParameter('subscriberPHIDs', array());
     $project_phids = $saved->getParameter('projectPHIDs', array());
 
     $all_phids = array_merge(
       $author_phids,
       $owner_phids,
       $subscriber_phids,
       $project_phids);
 
     $all_handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($all_phids)
       ->execute();
 
     $author_handles = array_select_keys($all_handles, $author_phids);
     $owner_handles = array_select_keys($all_handles, $owner_phids);
     $subscriber_handles = array_select_keys($all_handles, $subscriber_phids);
     $project_handles = array_select_keys($all_handles, $project_phids);
 
     $with_unowned = $saved->getParameter('withUnowned', array());
 
     $status_values = $saved->getParameter('statuses', array());
     $status_values = array_fuse($status_values);
 
     $statuses = array(
       PhabricatorSearchRelationship::RELATIONSHIP_OPEN => pht('Open'),
       PhabricatorSearchRelationship::RELATIONSHIP_CLOSED => pht('Closed'),
     );
     $status_control = id(new AphrontFormCheckboxControl())
       ->setLabel(pht('Document Status'));
     foreach ($statuses as $status => $name) {
       $status_control->addCheckbox(
         'statuses[]',
         $status,
         $name,
         isset($status_values[$status]));
     }
 
     $type_values = $saved->getParameter('types', array());
     $type_values = array_fuse($type_values);
 
     $types = self::getIndexableDocumentTypes($this->requireViewer());
 
     $types_control = id(new AphrontFormCheckboxControl())
       ->setLabel(pht('Document Types'));
     foreach ($types as $type => $name) {
       $types_control->addCheckbox(
         'types[]',
         $type,
         $name,
         isset($type_values[$type]));
     }
 
     $form
       ->appendChild(
         phutil_tag(
           'input',
           array(
             'type' => 'hidden',
             'name' => 'jump',
             'value' => 'no',
           )))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel('Query')
           ->setName('query')
           ->setValue($saved->getParameter('query')))
       ->appendChild($status_control)
       ->appendChild($types_control)
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setName('authorPHIDs')
           ->setLabel('Authors')
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setValue($author_handles))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setName('ownerPHIDs')
           ->setLabel('Owners')
           ->setDatasource(new PhabricatorTypeaheadOwnerDatasource())
           ->setValue($owner_handles))
       ->appendChild(
         id(new AphrontFormCheckboxControl())
           ->addCheckbox(
             'withUnowned',
             1,
             pht('Show only unowned documents.'),
             $with_unowned))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setName('subscriberPHIDs')
           ->setLabel('Subscribers')
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setValue($subscriber_handles))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setName('projectPHIDs')
           ->setLabel('In Any Project')
           ->setDatasource(new PhabricatorProjectDatasource())
           ->setValue($project_handles));
   }
 
   protected function getURI($path) {
     return '/search/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     return array(
       'all' => pht('All Documents'),
       'open' => pht('Open Documents'),
       'open-tasks' => pht('Open Tasks'),
     );
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'open':
         return $query->setParameter('statuses', array('open'));
       case 'open-tasks':
         return $query
           ->setParameter('statuses', array('open'))
           ->setParameter('types', array(ManiphestTaskPHIDType::TYPECONST));
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   public static function getIndexableDocumentTypes(
     PhabricatorUser $viewer = null) {
 
     // TODO: This is inelegant and not very efficient, but gets us reasonable
     // results. It would be nice to do this more elegantly.
 
     $indexers = id(new PhutilSymbolLoader())
       ->setAncestorClass('PhabricatorSearchDocumentIndexer')
       ->loadObjects();
 
     if ($viewer) {
       $types = PhabricatorPHIDType::getAllInstalledTypes($viewer);
     } else {
       $types = PhabricatorPHIDType::getAllTypes();
     }
 
     $results = array();
     foreach ($types as $type) {
       $typeconst = $type->getTypeConstant();
       foreach ($indexers as $indexer) {
         $fake_phid = 'PHID-'.$typeconst.'-fake';
         if ($indexer->shouldIndexDocumentByPHID($fake_phid)) {
           $results[$typeconst] = $type->getTypeName();
         }
       }
     }
 
     asort($results);
 
     // Put tasks first, see T4606.
     $results = array_select_keys(
       $results,
       array(
         ManiphestTaskPHIDType::TYPECONST,
       )) + $results;
 
     return $results;
   }
 
   public function shouldUseOffsetPaging() {
     return true;
   }
 
   protected function renderResultList(
     array $results,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     $viewer = $this->requireViewer();
 
     if ($results) {
       $objects = id(new PhabricatorObjectQuery())
         ->setViewer($viewer)
         ->withPHIDs(mpull($results, 'getPHID'))
         ->execute();
 
       $output = array();
       foreach ($results as $phid => $handle) {
         $view = id(new PhabricatorSearchResultView())
           ->setHandle($handle)
           ->setQuery($query)
           ->setObject(idx($objects, $phid));
         $output[] = $view->render();
       }
 
       $results = phutil_tag_div(
         'phabricator-search-result-list',
         $output);
     } else {
       $results = phutil_tag_div(
         'phabricator-search-result-list',
         phutil_tag(
           'p',
           array('class' => 'phabricator-search-no-results'),
           pht('No search results.')));
     }
 
     return id(new PHUIBoxView())
       ->addMargin(PHUI::MARGIN_LARGE)
       ->addPadding(PHUI::PADDING_LARGE)
       ->setBorder(true)
       ->appendChild($results)
       ->addClass('phabricator-search-result-box');
   }
 
 }
diff --git a/src/applications/slowvote/query/PhabricatorSlowvoteSearchEngine.php b/src/applications/slowvote/query/PhabricatorSlowvoteSearchEngine.php
index 79a4ea75de..25f5e59f60 100644
--- a/src/applications/slowvote/query/PhabricatorSlowvoteSearchEngine.php
+++ b/src/applications/slowvote/query/PhabricatorSlowvoteSearchEngine.php
@@ -1,173 +1,173 @@
 <?php
 
 final class PhabricatorSlowvoteSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Slowvotes');
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
     $saved->setParameter(
       'authorPHIDs',
       $this->readUsersFromRequest($request, 'authors'));
 
     $saved->setParameter('voted', $request->getBool('voted'));
     $saved->setParameter('statuses', $request->getArr('statuses'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorSlowvoteQuery())
       ->withAuthorPHIDs($saved->getParameter('authorPHIDs', array()));
 
     if ($saved->getParameter('voted')) {
       $query->withVotesByViewer(true);
     }
 
     $statuses = $saved->getParameter('statuses', array());
     if (count($statuses) == 1) {
       $status = head($statuses);
       if ($status == 'open') {
         $query->withIsClosed(false);
       } else {
         $query->withIsClosed(true);
       }
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
     $phids = $saved_query->getParameter('authorPHIDs', array());
     $author_handles = id(new PhabricatorHandleQuery())
       ->setViewer($this->requireViewer())
       ->withPHIDs($phids)
       ->execute();
 
     $voted = $saved_query->getParameter('voted', false);
     $statuses = $saved_query->getParameter('statuses', array());
 
     $form
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('authors')
           ->setLabel(pht('Authors'))
           ->setValue($author_handles))
       ->appendChild(
         id(new AphrontFormCheckboxControl())
           ->addCheckbox(
             'voted',
             1,
             pht("Show only polls I've voted in."),
             $voted))
       ->appendChild(
         id(new AphrontFormCheckboxControl())
           ->setLabel(pht('Status'))
           ->addCheckbox(
             'statuses[]',
             'open',
             pht('Open'),
             in_array('open', $statuses))
           ->addCheckbox(
             'statuses[]',
             'closed',
             pht('Closed'),
             in_array('closed', $statuses)));
   }
 
   protected function getURI($path) {
     return '/vote/'.$path;
   }
 
-  public function getBuiltinQueryNames() {
+  protected function getBuiltinQueryNames() {
     $names = array(
       'open' => pht('Open Polls'),
       'all' => pht('All Polls'),
     );
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['authored'] = pht('Authored');
       $names['voted'] = pht('Voted In');
     }
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'open':
         return $query->setParameter('statuses', array('open'));
       case 'all':
         return $query;
       case 'authored':
         return $query->setParameter(
           'authorPHIDs',
           array($this->requireViewer()->getPHID()));
       case 'voted':
         return $query->setParameter('voted', true);
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
-  public function getRequiredHandlePHIDsForResultList(
+  protected function getRequiredHandlePHIDsForResultList(
     array $polls,
     PhabricatorSavedQuery $query) {
     return mpull($polls, 'getAuthorPHID');
   }
 
   protected function renderResultList(
     array $polls,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     assert_instances_of($polls, 'PhabricatorSlowvotePoll');
     $viewer = $this->requireViewer();
 
     $list = id(new PHUIObjectItemListView())
       ->setUser($viewer);
 
     $phids = mpull($polls, 'getAuthorPHID');
 
     foreach ($polls as $poll) {
       $date_created = phabricator_datetime($poll->getDateCreated(), $viewer);
       if ($poll->getAuthorPHID()) {
         $author = $handles[$poll->getAuthorPHID()]->renderLink();
       } else {
         $author = null;
       }
 
       $item = id(new PHUIObjectItemView())
         ->setObjectName('V'.$poll->getID())
         ->setHeader($poll->getQuestion())
         ->setHref('/V'.$poll->getID())
         ->setDisabled($poll->getIsClosed())
         ->addIcon('none', $date_created);
 
       $description = $poll->getDescription();
       if (strlen($description)) {
         $item->addAttribute(id(new PhutilUTF8StringTruncator())
           ->setMaximumGlyphs(120)
           ->truncateString($poll->getDescription()));
       }
 
       if ($author) {
         $item->addByline(pht('Author: %s', $author));
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 }