diff --git a/src/applications/config/controller/PhabricatorConfigAllController.php b/src/applications/config/controller/PhabricatorConfigAllController.php
index 3161ee19aa..89b5a455ce 100644
--- a/src/applications/config/controller/PhabricatorConfigAllController.php
+++ b/src/applications/config/controller/PhabricatorConfigAllController.php
@@ -1,141 +1,141 @@
 <?php
 
 final class PhabricatorConfigAllController
   extends PhabricatorConfigController {
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $db_values = id(new PhabricatorConfigEntry())
       ->loadAllWhere('namespace = %s', 'default');
     $db_values = mpull($db_values, null, 'getConfigKey');
 
     $rows = array();
     $options = PhabricatorApplicationConfigOptions::loadAllOptions();
     ksort($options);
     foreach ($options as $option) {
       $key = $option->getKey();
 
       if ($option->getMasked()) {
         $value = phutil_tag('em', array(), pht('Masked'));
       } else if ($option->getHidden()) {
         $value = phutil_tag('em', array(), pht('Hidden'));
       } else {
         $value = PhabricatorEnv::getEnvConfig($key);
         $value = PhabricatorConfigJSON::prettyPrintJSON($value);
       }
 
       $db_value = idx($db_values, $key);
       $rows[] = array(
         phutil_tag(
           'a',
           array(
             'href' => $this->getApplicationURI('edit/'.$key.'/'),
           ),
           $key),
         $value,
         $db_value && !$db_value->getIsDeleted() ? pht('Customized') : '',
       );
     }
     $table = id(new AphrontTableView($rows))
       ->setDeviceReadyTable(true)
       ->setColumnClasses(
         array(
           '',
           'wide',
         ))
       ->setHeaders(
         array(
           pht('Key'),
           pht('Value'),
           pht('Customized'),
         ));
 
     $title = pht('Current Settings');
 
     $crumbs = $this
       ->buildApplicationCrumbs()
       ->addCrumb(
         id(new PhabricatorCrumbView())
           ->setName($title));
 
     $panel = new AphrontPanelView();
     $panel->appendChild($table);
     $panel->setNoBackground();
 
     $versions = $this->loadVersions();
 
     $version_property_list = id(new PhabricatorPropertyListView());
     foreach ($versions as $version) {
       list($name, $hash) = $version;
       $version_property_list->addProperty($name, $hash);
     }
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Current Settings'))
-      ->addContent($version_property_list);
+      ->setPropertyList($version_property_list);
 
     $phabricator_root = dirname(phutil_get_library_root('phabricator'));
     $version_path = $phabricator_root.'/conf/local/VERSION';
     if (Filesystem::pathExists($version_path)) {
       $version_from_file = Filesystem::readFile($version_path);
       $version_property_list->addProperty(
         pht('Local Version'),
         $version_from_file);
     }
 
     $nav = $this->buildSideNavView();
     $nav->selectFilter('all/');
     $nav->setCrumbs($crumbs);
     $nav->appendChild($object_box);
     $nav->appendChild($panel);
 
 
     return $this->buildApplicationPage(
       $nav,
       array(
         'title' => $title,
         'device' => true,
       ));
   }
 
   private function loadVersions() {
     $specs = array(
       array(
         'name' => pht('Phabricator Version'),
         'root' => 'phabricator',
       ),
       array(
         'name' => pht('Arcanist Version'),
         'root' => 'arcanist',
       ),
       array(
         'name' => pht('libphutil Version'),
         'root' => 'phutil',
       ),
     );
 
     $futures = array();
     foreach ($specs as $key => $spec) {
       $root = dirname(phutil_get_library_root($spec['root']));
       $futures[$key] = id(new ExecFuture('git log --format=%%H -n 1 --'))
         ->setCWD($root);
     }
 
     $results = array();
     foreach ($futures as $key => $future) {
       list($err, $stdout) = $future->resolve();
       if (!$err) {
         $name = trim($stdout);
       } else {
         $name = pht('Unknown');
       }
       $results[$key] = array($specs[$key]['name'], $name);
     }
 
     return array_select_keys($results, array_keys($specs));
   }
 
 
 }
diff --git a/src/applications/countdown/controller/PhabricatorCountdownViewController.php b/src/applications/countdown/controller/PhabricatorCountdownViewController.php
index a0abfdce5e..1bcffbb4f6 100644
--- a/src/applications/countdown/controller/PhabricatorCountdownViewController.php
+++ b/src/applications/countdown/controller/PhabricatorCountdownViewController.php
@@ -1,118 +1,118 @@
 <?php
 
 /**
  * @group countdown
  */
 final class PhabricatorCountdownViewController
   extends PhabricatorCountdownController {
 
   private $id;
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
   }
 
 
   public function processRequest() {
 
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $countdown = id(new PhabricatorCountdownQuery())
       ->setViewer($user)
       ->withIDs(array($this->id))
       ->executeOne();
 
     if (!$countdown) {
       return new Aphront404Response();
     }
 
     $countdown_view = id(new PhabricatorCountdownView())
       ->setUser($user)
       ->setCountdown($countdown)
       ->setHeadless(true);
 
     $id = $countdown->getID();
     $title = $countdown->getTitle();
 
     $crumbs = $this
       ->buildApplicationCrumbs()
       ->addCrumb(
         id(new PhabricatorCrumbView())
           ->setName("C{$id}"));
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title);
 
     $actions = $this->buildActionListView($countdown);
     $properties = $this->buildPropertyListView($countdown);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     $content = array(
       $crumbs,
       $object_box,
       $countdown_view,
     );
 
     return $this->buildApplicationPage(
       $content,
       array(
         'title' => $title,
         'device' => true,
       ));
   }
 
   private function buildActionListView(PhabricatorCountdown $countdown) {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $id = $countdown->getID();
 
     $view = id(new PhabricatorActionListView())
       ->setUser($viewer);
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $countdown,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setIcon('edit')
         ->setName(pht('Edit Countdown'))
         ->setHref($this->getApplicationURI("edit/{$id}/"))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setIcon('delete')
         ->setName(pht('Delete Countdown'))
         ->setHref($this->getApplicationURI("delete/{$id}/"))
         ->setDisabled(!$can_edit)
         ->setWorkflow(true));
 
     return $view;
   }
 
   private function buildPropertyListView(PhabricatorCountdown $countdown) {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $this->loadHandles(array($countdown->getAuthorPHID()));
 
     $view = id(new PhabricatorPropertyListView())
       ->setUser($viewer);
 
     $view->addProperty(
       pht('Author'),
       $this->getHandle($countdown->getAuthorPHID())->renderLink());
 
     return $view;
   }
 
 }
diff --git a/src/applications/differential/controller/DifferentialRevisionViewController.php b/src/applications/differential/controller/DifferentialRevisionViewController.php
index 3aaa5cce25..3b1eac014a 100644
--- a/src/applications/differential/controller/DifferentialRevisionViewController.php
+++ b/src/applications/differential/controller/DifferentialRevisionViewController.php
@@ -1,997 +1,997 @@
 <?php
 
 final class DifferentialRevisionViewController extends DifferentialController {
 
   private $revisionID;
 
   public function shouldRequireLogin() {
     if ($this->allowsAnonymousAccess()) {
       return false;
     }
     return parent::shouldRequireLogin();
   }
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function willProcessRequest(array $data) {
     $this->revisionID = $data['id'];
   }
 
   public function processRequest() {
 
     $request = $this->getRequest();
     $user = $request->getUser();
     $viewer_is_anonymous = !$user->isLoggedIn();
 
     $revision = id(new DifferentialRevisionQuery())
       ->withIDs(array($this->revisionID))
       ->setViewer($request->getUser())
       ->needRelationships(true)
       ->needReviewerStatus(true)
       ->executeOne();
 
     if (!$revision) {
       return new Aphront404Response();
     }
 
     $diffs = id(new DifferentialDiffQuery())
       ->setViewer($request->getUser())
       ->withRevisionIDs(array($this->revisionID))
       ->execute();
     $diffs = array_reverse($diffs, $preserve_keys = true);
 
     if (!$diffs) {
       throw new Exception(
         "This revision has no diffs. Something has gone quite wrong.");
     }
 
     $diff_vs = $request->getInt('vs');
 
     $target_id = $request->getInt('id');
     $target = idx($diffs, $target_id, end($diffs));
 
     $target_manual = $target;
     if (!$target_id) {
       foreach ($diffs as $diff) {
         if ($diff->getCreationMethod() != 'commit') {
           $target_manual = $diff;
         }
       }
     }
 
     if (empty($diffs[$diff_vs])) {
       $diff_vs = null;
     }
 
     $arc_project = $target->loadArcanistProject();
     $repository = ($arc_project ? $arc_project->loadRepository() : null);
 
     list($changesets, $vs_map, $vs_changesets, $rendering_references) =
       $this->loadChangesetsAndVsMap(
         $target,
         idx($diffs, $diff_vs),
         $repository);
 
     if ($request->getExists('download')) {
       return $this->buildRawDiffResponse(
         $changesets,
         $vs_changesets,
         $vs_map,
         $repository);
     }
 
     $props = id(new DifferentialDiffProperty())->loadAllWhere(
       'diffID = %d',
       $target_manual->getID());
     $props = mpull($props, 'getData', 'getName');
 
     $aux_fields = $this->loadAuxiliaryFields($revision);
 
     $comments = $revision->loadComments();
     $comments = array_merge(
       $this->getImplicitComments($revision, reset($diffs)),
       $comments);
 
     $all_changesets = $changesets;
     $inlines = $this->loadInlineComments(
       $revision,
       $all_changesets);
 
     $object_phids = array_merge(
       $revision->getReviewers(),
       $revision->getCCPHIDs(),
       $revision->loadCommitPHIDs(),
       array(
         $revision->getAuthorPHID(),
         $user->getPHID(),
       ),
       mpull($comments, 'getAuthorPHID'));
 
     foreach ($comments as $comment) {
       $metadata = $comment->getMetadata();
       $added_reviewers = idx(
         $metadata,
         DifferentialComment::METADATA_ADDED_REVIEWERS);
       if ($added_reviewers) {
         foreach ($added_reviewers as $phid) {
           $object_phids[] = $phid;
         }
       }
       $added_ccs = idx(
         $metadata,
         DifferentialComment::METADATA_ADDED_CCS);
       if ($added_ccs) {
         foreach ($added_ccs as $phid) {
           $object_phids[] = $phid;
         }
       }
     }
 
     foreach ($revision->getAttached() as $type => $phids) {
       foreach ($phids as $phid => $info) {
         $object_phids[] = $phid;
       }
     }
 
     $aux_phids = array();
     foreach ($aux_fields as $key => $aux_field) {
       $aux_field->setDiff($target);
       $aux_field->setManualDiff($target_manual);
       $aux_field->setDiffProperties($props);
       $aux_phids[$key] = $aux_field->getRequiredHandlePHIDsForRevisionView();
     }
     $object_phids = array_merge($object_phids, array_mergev($aux_phids));
     $object_phids = array_unique($object_phids);
 
     $handles = $this->loadViewerHandles($object_phids);
 
     foreach ($aux_fields as $key => $aux_field) {
       // Make sure each field only has access to handles it specifically
       // requested, not all handles. Otherwise you can get a field which works
       // only in the presence of other fields.
       $aux_field->setHandles(array_select_keys($handles, $aux_phids[$key]));
     }
 
     $reviewer_warning = null;
     if ($revision->getStatus() ==
         ArcanistDifferentialRevisionStatus::NEEDS_REVIEW) {
       $has_live_reviewer = false;
       foreach ($revision->getReviewers() as $reviewer) {
         if (!$handles[$reviewer]->isDisabled()) {
           $has_live_reviewer = true;
           break;
         }
       }
       if (!$has_live_reviewer) {
         $reviewer_warning = new AphrontErrorView();
         $reviewer_warning->setSeverity(AphrontErrorView::SEVERITY_WARNING);
         $reviewer_warning->setTitle(pht('No Active Reviewers'));
         if ($revision->getReviewers()) {
           $reviewer_warning->appendChild(
             phutil_tag(
               'p',
               array(),
               pht('All specified reviewers are disabled and this revision '.
                   'needs review. You may want to add some new reviewers.')));
         } else {
           $reviewer_warning->appendChild(
             phutil_tag(
               'p',
               array(),
               pht('This revision has no specified reviewers and needs '.
                   'review. You may want to add some reviewers.')));
         }
       }
     }
 
     $request_uri = $request->getRequestURI();
 
     $limit = 100;
     $large = $request->getStr('large');
     if (count($changesets) > $limit && !$large) {
       $count = count($changesets);
       $warning = new AphrontErrorView();
       $warning->setTitle('Very Large Diff');
       $warning->setSeverity(AphrontErrorView::SEVERITY_WARNING);
       $warning->appendChild(hsprintf(
         '%s <strong>%s</strong>',
         pht(
           'This diff is very large and affects %s files. Load each file '.
             'individually.',
           new PhutilNumber($count)),
         phutil_tag(
           'a',
           array(
             'href' => $request_uri
               ->alter('large', 'true')
               ->setFragment('toc'),
           ),
           pht('Show All Files Inline'))));
       $warning = $warning->render();
 
       $my_inlines = id(new DifferentialInlineCommentQuery())
         ->withDraftComments($user->getPHID(), $this->revisionID)
         ->execute();
 
       $visible_changesets = array();
       foreach ($inlines + $my_inlines as $inline) {
         $changeset_id = $inline->getChangesetID();
         if (isset($changesets[$changeset_id])) {
           $visible_changesets[$changeset_id] = $changesets[$changeset_id];
         }
       }
 
       if (!empty($props['arc:lint'])) {
         $changeset_paths = mpull($changesets, null, 'getFilename');
         foreach ($props['arc:lint'] as $lint) {
           $changeset = idx($changeset_paths, $lint['path']);
           if ($changeset) {
             $visible_changesets[$changeset->getID()] = $changeset;
           }
         }
       }
 
     } else {
       $warning = null;
       $visible_changesets = $changesets;
     }
 
     $revision_detail = id(new DifferentialRevisionDetailView())
       ->setUser($user)
       ->setRevision($revision)
       ->setDiff(end($diffs))
       ->setAuxiliaryFields($aux_fields)
       ->setURI($request->getRequestURI());
 
     $actions = $this->getRevisionActions($revision);
 
     $custom_renderer_class = PhabricatorEnv::getEnvConfig(
       'differential.revision-custom-detail-renderer');
     if ($custom_renderer_class) {
 
       // TODO: build a better version of the action links and deprecate the
       // whole DifferentialRevisionDetailRenderer class.
       $custom_renderer = newv($custom_renderer_class, array());
       $custom_renderer->setUser($user);
       $custom_renderer->setDiff($target);
       if ($diff_vs) {
         $custom_renderer->setVSDiff($diffs[$diff_vs]);
       }
       $actions = array_merge(
         $actions,
         $custom_renderer->generateActionLinks($revision, $target_manual));
     }
 
     $whitespace = $request->getStr(
       'whitespace',
       DifferentialChangesetParser::WHITESPACE_IGNORE_ALL);
 
     if ($arc_project) {
       list($symbol_indexes, $project_phids) = $this->buildSymbolIndexes(
         $arc_project,
         $visible_changesets);
     } else {
       $symbol_indexes = array();
       $project_phids = null;
     }
 
     $revision_detail->setActions($actions);
     $revision_detail->setUser($user);
 
     $comment_view = new DifferentialRevisionCommentListView();
     $comment_view->setComments($comments);
     $comment_view->setHandles($handles);
     $comment_view->setInlineComments($inlines);
     $comment_view->setChangesets($all_changesets);
     $comment_view->setUser($user);
     $comment_view->setTargetDiff($target);
     $comment_view->setVersusDiffID($diff_vs);
 
     if ($arc_project) {
       Javelin::initBehavior(
         'repository-crossreference',
         array(
           'section' => $comment_view->getID(),
           'projects' => $project_phids,
         ));
     }
 
     $changeset_view = new DifferentialChangesetListView();
     $changeset_view->setChangesets($changesets);
     $changeset_view->setVisibleChangesets($visible_changesets);
 
     if (!$viewer_is_anonymous) {
       $changeset_view->setInlineCommentControllerURI(
         '/differential/comment/inline/edit/'.$revision->getID().'/');
     }
 
     $changeset_view->setStandaloneURI('/differential/changeset/');
     $changeset_view->setRawFileURIs(
       '/differential/changeset/?view=old',
       '/differential/changeset/?view=new');
 
     $changeset_view->setUser($user);
     $changeset_view->setDiff($target);
     $changeset_view->setRenderingReferences($rendering_references);
     $changeset_view->setVsMap($vs_map);
     $changeset_view->setWhitespace($whitespace);
     if ($repository) {
       $changeset_view->setRepository($repository);
     }
     $changeset_view->setSymbolIndexes($symbol_indexes);
     $changeset_view->setTitle('Diff '.$target->getID());
 
     $diff_history = new DifferentialRevisionUpdateHistoryView();
     $diff_history->setDiffs($diffs);
     $diff_history->setSelectedVersusDiffID($diff_vs);
     $diff_history->setSelectedDiffID($target->getID());
     $diff_history->setSelectedWhitespace($whitespace);
     $diff_history->setUser($user);
 
     $local_view = new DifferentialLocalCommitsView();
     $local_view->setUser($user);
     $local_view->setLocalCommits(idx($props, 'local:commits'));
 
     if ($repository) {
       $other_revisions = $this->loadOtherRevisions(
         $changesets,
         $target,
         $repository);
     } else {
       $other_revisions = array();
     }
 
     $other_view = null;
     if ($other_revisions) {
       $other_view = $this->renderOtherRevisions($other_revisions);
     }
 
     $toc_view = new DifferentialDiffTableOfContentsView();
     $toc_view->setChangesets($changesets);
     $toc_view->setVisibleChangesets($visible_changesets);
     $toc_view->setRenderingReferences($rendering_references);
     $toc_view->setUnitTestData(idx($props, 'arc:unit', array()));
     if ($repository) {
       $toc_view->setRepository($repository);
     }
     $toc_view->setDiff($target);
     $toc_view->setUser($user);
     $toc_view->setRevisionID($revision->getID());
     $toc_view->setWhitespace($whitespace);
 
     $comment_form = null;
     if (!$viewer_is_anonymous) {
       $draft = id(new PhabricatorDraft())->loadOneWhere(
         'authorPHID = %s AND draftKey = %s',
         $user->getPHID(),
         'differential-comment-'.$revision->getID());
 
       $reviewers = array();
       $ccs = array();
       if ($draft) {
         $reviewers = idx($draft->getMetadata(), 'reviewers', array());
         $ccs = idx($draft->getMetadata(), 'ccs', array());
         if ($reviewers || $ccs) {
           $handles = $this->loadViewerHandles(array_merge($reviewers, $ccs));
           $reviewers = array_select_keys($handles, $reviewers);
           $ccs = array_select_keys($handles, $ccs);
         }
       }
 
       $comment_form = new DifferentialAddCommentView();
       $comment_form->setRevision($revision);
       $comment_form->setAuxFields($aux_fields);
       $comment_form->setActions($this->getRevisionCommentActions($revision));
       $comment_form->setActionURI('/differential/comment/save/');
       $comment_form->setUser($user);
       $comment_form->setDraft($draft);
       $comment_form->setReviewers(mpull($reviewers, 'getFullName', 'getPHID'));
       $comment_form->setCCs(mpull($ccs, 'getFullName', 'getPHID'));
     }
 
     $pane_id = celerity_generate_unique_node_id();
     Javelin::initBehavior(
       'differential-keyboard-navigation',
       array(
         'haunt' => $pane_id,
       ));
     Javelin::initBehavior('differential-user-select');
 
     $page_pane = id(new DifferentialPrimaryPaneView())
       ->setID($pane_id)
       ->appendChild(array(
         $comment_view->render(),
         $diff_history->render(),
         $warning,
         $local_view->render(),
         $toc_view->render(),
         $other_view,
         $changeset_view->render(),
       ));
     if ($comment_form) {
       $page_pane->appendChild($comment_form->render());
     } else {
       // TODO: For now, just use this to get "Login to Comment".
       $page_pane->appendChild(
         id(new PhabricatorApplicationTransactionCommentView())
           ->setUser($user)
           ->setRequestURI($request->getRequestURI()));
     }
 
 
     $object_id = 'D'.$revision->getID();
 
     $top_anchor = id(new PhabricatorAnchorView())
       ->setAnchorName('top')
       ->setNavigationMarker(true);
 
     $content = array(
       $reviewer_warning,
       $top_anchor,
       $revision_detail,
       $page_pane,
     );
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName($object_id)
         ->setHref('/'.$object_id));
 
     $prefs = $user->loadPreferences();
 
     $pref_filetree = PhabricatorUserPreferences::PREFERENCE_DIFF_FILETREE;
     if ($prefs->getPreference($pref_filetree)) {
       $collapsed = $prefs->getPreference(
         PhabricatorUserPreferences::PREFERENCE_NAV_COLLAPSED,
         false);
 
       $nav = id(new DifferentialChangesetFileTreeSideNavBuilder())
         ->setAnchorName('top')
         ->setTitle('D'.$revision->getID())
         ->setBaseURI(new PhutilURI('/D'.$revision->getID()))
         ->setCollapsed((bool)$collapsed)
         ->build($changesets);
       $nav->appendChild($content);
       $nav->setCrumbs($crumbs);
       $content = $nav;
     } else {
       array_unshift($content, $crumbs);
     }
 
     return $this->buildApplicationPage(
       $content,
       array(
         'title' => $object_id.' '.$revision->getTitle(),
         'pageObjects' => array($revision->getPHID()),
       ));
   }
 
   private function getImplicitComments(
     DifferentialRevision $revision,
     DifferentialDiff $diff) {
 
     $author_phid = nonempty(
       $diff->getAuthorPHID(),
       $revision->getAuthorPHID());
 
     $template = new DifferentialComment();
     $template->setAuthorPHID($author_phid);
     $template->setRevisionID($revision->getID());
     $template->setDateCreated($revision->getDateCreated());
 
     $comments = array();
 
     if (strlen($revision->getSummary())) {
       $summary_comment = clone $template;
       $summary_comment->setContent($revision->getSummary());
       $summary_comment->setAction(DifferentialAction::ACTION_SUMMARIZE);
       $comments[] = $summary_comment;
     }
 
     if (strlen($revision->getTestPlan())) {
       $testplan_comment = clone $template;
       $testplan_comment->setContent($revision->getTestPlan());
       $testplan_comment->setAction(DifferentialAction::ACTION_TESTPLAN);
       $comments[] = $testplan_comment;
     }
 
     return $comments;
   }
 
   private function getRevisionActions(DifferentialRevision $revision) {
     $user = $this->getRequest()->getUser();
     $viewer_phid = $user->getPHID();
     $viewer_is_owner = ($revision->getAuthorPHID() == $viewer_phid);
     $viewer_is_reviewer = in_array($viewer_phid, $revision->getReviewers());
     $viewer_is_cc = in_array($viewer_phid, $revision->getCCPHIDs());
     $logged_in = $this->getRequest()->getUser()->isLoggedIn();
     $status = $revision->getStatus();
     $revision_id = $revision->getID();
     $revision_phid = $revision->getPHID();
 
     $links = array();
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $user,
       $revision,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $links[] = array(
       'icon'  =>  'edit',
       'href'  => "/differential/revision/edit/{$revision_id}/",
       'name'  => pht('Edit Revision'),
       'disabled' => !$can_edit,
       'sigil' => $can_edit ? null : 'workflow',
     );
 
     if (!$viewer_is_owner && !$viewer_is_reviewer) {
       $action = $viewer_is_cc ? 'rem' : 'add';
       $links[] = array(
         'icon'    => $viewer_is_cc ? 'disable' : 'check',
         'href'    => "/differential/subscribe/{$action}/{$revision_id}/",
         'name'    => $viewer_is_cc ? pht('Unsubscribe') : pht('Subscribe'),
         'instant' => $logged_in,
         'disabled' => !$logged_in,
         'sigil' => $can_edit ? null : 'workflow',
       );
     } else {
       $links[] = array(
         'icon'     => 'enable',
         'name'     => pht('Automatically Subscribed'),
         'disabled' => true,
       );
     }
 
     require_celerity_resource('phabricator-object-selector-css');
     require_celerity_resource('javelin-behavior-phabricator-object-selector');
 
     $links[] = array(
       'icon'  => 'link',
       'name'  => pht('Edit Dependencies'),
       'href'  => "/search/attach/{$revision_phid}/DREV/dependencies/",
       'sigil' => 'workflow',
       'disabled' => !$can_edit,
     );
 
     $maniphest = 'PhabricatorApplicationManiphest';
     if (PhabricatorApplication::isClassInstalled($maniphest)) {
       $links[] = array(
         'icon'  => 'attach',
         'name'  => pht('Edit Maniphest Tasks'),
         'href'  => "/search/attach/{$revision_phid}/TASK/",
         'sigil' => 'workflow',
         'disabled' => !$can_edit,
       );
     }
 
     $request_uri = $this->getRequest()->getRequestURI();
     $links[] = array(
       'icon'  => 'download',
       'name'  => pht('Download Raw Diff'),
       'href'  => $request_uri->alter('download', 'true')
     );
 
     return $links;
   }
 
   private function getRevisionCommentActions(DifferentialRevision $revision) {
 
     $actions = array(
       DifferentialAction::ACTION_COMMENT => true,
     );
 
     $viewer = $this->getRequest()->getUser();
     $viewer_phid = $viewer->getPHID();
     $viewer_is_owner = ($viewer_phid == $revision->getAuthorPHID());
     $viewer_is_reviewer = in_array($viewer_phid, $revision->getReviewers());
     $viewer_did_accept = ($viewer_phid === $revision->loadReviewedBy());
     $status = $revision->getStatus();
 
     $allow_self_accept = PhabricatorEnv::getEnvConfig(
       'differential.allow-self-accept');
     $always_allow_close = PhabricatorEnv::getEnvConfig(
       'differential.always-allow-close');
     $allow_reopen = PhabricatorEnv::getEnvConfig(
       'differential.allow-reopen');
 
     if ($viewer_is_owner) {
       switch ($status) {
         case ArcanistDifferentialRevisionStatus::NEEDS_REVIEW:
           $actions[DifferentialAction::ACTION_ACCEPT] = $allow_self_accept;
           $actions[DifferentialAction::ACTION_ABANDON] = true;
           $actions[DifferentialAction::ACTION_RETHINK] = true;
           break;
         case ArcanistDifferentialRevisionStatus::NEEDS_REVISION:
           $actions[DifferentialAction::ACTION_ACCEPT] = $allow_self_accept;
           $actions[DifferentialAction::ACTION_ABANDON] = true;
           $actions[DifferentialAction::ACTION_REQUEST] = true;
           break;
         case ArcanistDifferentialRevisionStatus::ACCEPTED:
           $actions[DifferentialAction::ACTION_ABANDON] = true;
           $actions[DifferentialAction::ACTION_REQUEST] = true;
           $actions[DifferentialAction::ACTION_RETHINK] = true;
           $actions[DifferentialAction::ACTION_CLOSE] = true;
           break;
         case ArcanistDifferentialRevisionStatus::CLOSED:
           break;
         case ArcanistDifferentialRevisionStatus::ABANDONED:
           $actions[DifferentialAction::ACTION_RECLAIM] = true;
           break;
       }
     } else {
       switch ($status) {
         case ArcanistDifferentialRevisionStatus::NEEDS_REVIEW:
           $actions[DifferentialAction::ACTION_ACCEPT] = true;
           $actions[DifferentialAction::ACTION_REJECT] = true;
           $actions[DifferentialAction::ACTION_RESIGN] = $viewer_is_reviewer;
           break;
         case ArcanistDifferentialRevisionStatus::NEEDS_REVISION:
           $actions[DifferentialAction::ACTION_ACCEPT] = true;
           $actions[DifferentialAction::ACTION_RESIGN] = $viewer_is_reviewer;
           break;
         case ArcanistDifferentialRevisionStatus::ACCEPTED:
           $actions[DifferentialAction::ACTION_REJECT] = true;
           $actions[DifferentialAction::ACTION_RESIGN] =
             $viewer_is_reviewer && !$viewer_did_accept;
           break;
         case ArcanistDifferentialRevisionStatus::CLOSED:
         case ArcanistDifferentialRevisionStatus::ABANDONED:
           break;
       }
       if ($status != ArcanistDifferentialRevisionStatus::CLOSED) {
         $actions[DifferentialAction::ACTION_CLAIM] = true;
         $actions[DifferentialAction::ACTION_CLOSE] = $always_allow_close;
       }
     }
 
     $actions[DifferentialAction::ACTION_ADDREVIEWERS] = true;
     $actions[DifferentialAction::ACTION_ADDCCS] = true;
     $actions[DifferentialAction::ACTION_REOPEN] = $allow_reopen &&
       ($status == ArcanistDifferentialRevisionStatus::CLOSED);
 
     $actions = array_keys(array_filter($actions));
     $actions_dict = array();
     foreach ($actions as $action) {
       $actions_dict[$action] = DifferentialAction::getActionVerb($action);
     }
 
     return $actions_dict;
   }
 
   private function loadInlineComments(
     DifferentialRevision $revision,
     array &$changesets) {
     assert_instances_of($changesets, 'DifferentialChangeset');
 
     $inline_comments = array();
 
     $inline_comments = id(new DifferentialInlineCommentQuery())
       ->withRevisionIDs(array($revision->getID()))
       ->withNotDraft(true)
       ->execute();
 
     $load_changesets = array();
     foreach ($inline_comments as $inline) {
       $changeset_id = $inline->getChangesetID();
       if (isset($changesets[$changeset_id])) {
         continue;
       }
       $load_changesets[$changeset_id] = true;
     }
 
     $more_changesets = array();
     if ($load_changesets) {
       $changeset_ids = array_keys($load_changesets);
       $more_changesets += id(new DifferentialChangeset())
         ->loadAllWhere(
           'id IN (%Ld)',
           $changeset_ids);
     }
 
     if ($more_changesets) {
       $changesets += $more_changesets;
       $changesets = msort($changesets, 'getSortKey');
     }
 
     return $inline_comments;
   }
 
   private function loadChangesetsAndVsMap(
     DifferentialDiff $target,
     DifferentialDiff $diff_vs = null,
     PhabricatorRepository $repository = null) {
 
     $load_ids = array();
     if ($diff_vs) {
       $load_ids[] = $diff_vs->getID();
     }
     $load_ids[] = $target->getID();
 
     $raw_changesets = id(new DifferentialChangeset())
       ->loadAllWhere(
         'diffID IN (%Ld)',
         $load_ids);
     $changeset_groups = mgroup($raw_changesets, 'getDiffID');
 
     $changesets = idx($changeset_groups, $target->getID(), array());
     $changesets = mpull($changesets, null, 'getID');
 
     $refs          = array();
     $vs_map        = array();
     $vs_changesets = array();
     if ($diff_vs) {
       $vs_id                  = $diff_vs->getID();
       $vs_changesets_path_map = array();
       foreach (idx($changeset_groups, $vs_id, array()) as $changeset) {
         $path = $changeset->getAbsoluteRepositoryPath($repository, $diff_vs);
         $vs_changesets_path_map[$path] = $changeset;
         $vs_changesets[$changeset->getID()] = $changeset;
       }
       foreach ($changesets as $key => $changeset) {
         $path = $changeset->getAbsoluteRepositoryPath($repository, $target);
         if (isset($vs_changesets_path_map[$path])) {
           $vs_map[$changeset->getID()] =
             $vs_changesets_path_map[$path]->getID();
           $refs[$changeset->getID()] =
             $changeset->getID().'/'.$vs_changesets_path_map[$path]->getID();
           unset($vs_changesets_path_map[$path]);
         } else {
           $refs[$changeset->getID()] = $changeset->getID();
         }
       }
       foreach ($vs_changesets_path_map as $path => $changeset) {
         $changesets[$changeset->getID()] = $changeset;
         $vs_map[$changeset->getID()]     = -1;
         $refs[$changeset->getID()]       = $changeset->getID().'/-1';
       }
     } else {
       foreach ($changesets as $changeset) {
         $refs[$changeset->getID()] = $changeset->getID();
       }
     }
 
     $changesets = msort($changesets, 'getSortKey');
 
     return array($changesets, $vs_map, $vs_changesets, $refs);
   }
 
   private function loadAuxiliaryFields(DifferentialRevision $revision) {
 
     $aux_fields = DifferentialFieldSelector::newSelector()
       ->getFieldSpecifications();
     foreach ($aux_fields as $key => $aux_field) {
       if (!$aux_field->shouldAppearOnRevisionView()) {
         unset($aux_fields[$key]);
       } else {
         $aux_field->setUser($this->getRequest()->getUser());
       }
     }
 
     $aux_fields = DifferentialAuxiliaryField::loadFromStorage(
       $revision,
       $aux_fields);
 
     return $aux_fields;
   }
 
   private function buildSymbolIndexes(
     PhabricatorRepositoryArcanistProject $arc_project,
     array $visible_changesets) {
     assert_instances_of($visible_changesets, 'DifferentialChangeset');
 
     $engine = PhabricatorSyntaxHighlighter::newEngine();
 
     $langs = $arc_project->getSymbolIndexLanguages();
     if (!$langs) {
       return array(array(), array());
     }
 
     $symbol_indexes = array();
 
     $project_phids = array_merge(
       array($arc_project->getPHID()),
       nonempty($arc_project->getSymbolIndexProjects(), array()));
 
     $indexed_langs = array_fill_keys($langs, true);
     foreach ($visible_changesets as $key => $changeset) {
       $lang = $engine->getLanguageFromFilename($changeset->getFilename());
       if (isset($indexed_langs[$lang])) {
         $symbol_indexes[$key] = array(
           'lang'      => $lang,
           'projects'  => $project_phids,
         );
       }
     }
 
     return array($symbol_indexes, $project_phids);
   }
 
   private function loadOtherRevisions(
     array $changesets,
     DifferentialDiff $target,
     PhabricatorRepository $repository) {
     assert_instances_of($changesets, 'DifferentialChangeset');
 
     $paths = array();
     foreach ($changesets as $changeset) {
       $paths[] = $changeset->getAbsoluteRepositoryPath(
         $repository,
         $target);
     }
 
     if (!$paths) {
       return array();
     }
 
     $path_map = id(new DiffusionPathIDQuery($paths))->loadPathIDs();
 
     if (!$path_map) {
       return array();
     }
 
     $query = id(new DifferentialRevisionQuery())
       ->setViewer($this->getRequest()->getUser())
       ->withStatus(DifferentialRevisionQuery::STATUS_OPEN)
       ->setOrder(DifferentialRevisionQuery::ORDER_PATH_MODIFIED)
       ->setLimit(10)
       ->needRelationships(true);
 
     foreach ($path_map as $path => $path_id) {
       $query->withPath($repository->getID(), $path_id);
     }
 
     $results = $query->execute();
 
     // Strip out *this* revision.
     foreach ($results as $key => $result) {
       if ($result->getID() == $this->revisionID) {
         unset($results[$key]);
       }
     }
 
     return $results;
   }
 
   private function renderOtherRevisions(array $revisions) {
     assert_instances_of($revisions, 'DifferentialRevision');
 
     $user = $this->getRequest()->getUser();
 
     $view = id(new DifferentialRevisionListView())
       ->setRevisions($revisions)
       ->setFields(DifferentialRevisionListView::getDefaultFields($user))
       ->setUser($user)
       ->loadAssets();
 
     $phids = $view->getRequiredHandlePHIDs();
     $handles = $this->loadViewerHandles($phids);
     $view->setHandles($handles);
 
     return id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Open Revisions Affecting These Files'))
-      ->addContent($view);
+      ->appendChild($view);
   }
 
   /**
    * Straight copy of the loadFileByPhid method in
    * @{class:DifferentialReviewRequestMail}.
    *
    * This is because of the code similarity between the buildPatch method in
    * @{class:DifferentialReviewRequestMail} and @{method:buildRawDiffResponse}
    * in this class. Both of these methods end up using call_user_func and this
    * piece of code is the lucky function.
    *
    * @return mixed (@{class:PhabricatorFile} if found, null if not)
    */
   public function loadFileByPHID($phid) {
     $file = id(new PhabricatorFile())->loadOneWhere(
       'phid = %s',
       $phid);
     if (!$file) {
       return null;
     }
     return $file->loadFileData();
   }
 
   /**
    * Note this code is somewhat similar to the buildPatch method in
    * @{class:DifferentialReviewRequestMail}.
    *
    * @return @{class:AphrontRedirectResponse}
    */
   private function buildRawDiffResponse(
     array $changesets,
     array $vs_changesets,
     array $vs_map,
     PhabricatorRepository $repository = null) {
 
     assert_instances_of($changesets,    'DifferentialChangeset');
     assert_instances_of($vs_changesets, 'DifferentialChangeset');
 
     $engine = new PhabricatorDifferenceEngine();
     $generated_changesets = array();
     foreach ($changesets as $changeset) {
       $changeset->attachHunks($changeset->loadHunks());
       $right = $changeset->makeNewFile();
       $choice = $changeset;
       $vs = idx($vs_map, $changeset->getID());
       if ($vs == -1) {
         $left = $right;
         $right = $changeset->makeOldFile();
       } else if ($vs) {
         $choice = $vs_changeset = $vs_changesets[$vs];
         $vs_changeset->attachHunks($vs_changeset->loadHunks());
         $left = $vs_changeset->makeNewFile();
       } else {
         $left = $changeset->makeOldFile();
       }
 
       $synthetic = $engine->generateChangesetFromFileContent(
         $left,
         $right);
 
       if (!$synthetic->getAffectedLineCount()) {
         $filetype = $choice->getFileType();
         if ($filetype == DifferentialChangeType::FILE_TEXT ||
             $filetype == DifferentialChangeType::FILE_SYMLINK) {
           continue;
         }
       }
 
       $choice->attachHunks($synthetic->getHunks());
 
       $generated_changesets[] = $choice;
     }
 
     $diff = new DifferentialDiff();
     $diff->attachChangesets($generated_changesets);
     $raw_changes = $diff->buildChangesList();
     $changes = array();
     foreach ($raw_changes as $changedict) {
       $changes[] = ArcanistDiffChange::newFromDictionary($changedict);
     }
     $bundle = ArcanistBundle::newFromChanges($changes);
 
     $bundle->setLoadFileDataCallback(array($this, 'loadFileByPHID'));
 
     $vcs = $repository ? $repository->getVersionControlSystem() : null;
     switch ($vcs) {
       case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
       case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
         $raw_diff = $bundle->toGitPatch();
         break;
       case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
       default:
         $raw_diff = $bundle->toUnifiedDiff();
         break;
     }
 
     $request_uri = $this->getRequest()->getRequestURI();
 
     // this ends up being something like
     //   D123.diff
     // or the verbose
     //   D123.vs123.id123.whitespaceignore-all.diff
     // lame but nice to include these options
     $file_name = ltrim($request_uri->getPath(), '/').'.';
     foreach ($request_uri->getQueryParams() as $key => $value) {
       if ($key == 'download') {
         continue;
       }
       $file_name .= $key.$value.'.';
     }
     $file_name .= 'diff';
 
     $file = PhabricatorFile::buildFromFileDataOrHash(
       $raw_diff,
       array(
         'name' => $file_name,
       ));
 
     return id(new AphrontRedirectResponse())->setURI($file->getBestURI());
 
   }
 }
diff --git a/src/applications/differential/view/DifferentialAddCommentView.php b/src/applications/differential/view/DifferentialAddCommentView.php
index 6e3bc8f14c..76f2bffcb7 100644
--- a/src/applications/differential/view/DifferentialAddCommentView.php
+++ b/src/applications/differential/view/DifferentialAddCommentView.php
@@ -1,204 +1,204 @@
 <?php
 
 final class DifferentialAddCommentView extends AphrontView {
 
   private $revision;
   private $actions;
   private $actionURI;
   private $draft;
   private $auxFields;
   private $reviewers = array();
   private $ccs = array();
 
   public function setRevision($revision) {
     $this->revision = $revision;
     return $this;
   }
 
   public function setAuxFields(array $aux_fields) {
     assert_instances_of($aux_fields, 'DifferentialFieldSpecification');
     $this->auxFields = $aux_fields;
     return $this;
   }
 
   public function setActions(array $actions) {
     $this->actions = $actions;
     return $this;
   }
 
   public function setActionURI($uri) {
     $this->actionURI = $uri;
     return $this;
   }
 
   public function setDraft(PhabricatorDraft $draft = null) {
     $this->draft = $draft;
     return $this;
   }
 
   public function setReviewers(array $names) {
     $this->reviewers = $names;
     return $this;
   }
 
   public function setCCs(array $names) {
     $this->ccs = $names;
     return $this;
   }
 
   public function render() {
 
     require_celerity_resource('differential-revision-add-comment-css');
 
     $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
 
     $revision = $this->revision;
 
     $action = null;
     if ($this->draft) {
       $action = idx($this->draft->getMetadata(), 'action');
     }
 
     $enable_reviewers = DifferentialAction::allowReviewers($action);
     $enable_ccs = ($action == DifferentialAction::ACTION_ADDCCS);
     $add_reviewers_labels = array(
       'add_reviewers' => pht('Add Reviewers'),
       'request_review' => pht('Add Reviewers'),
       'resign' => pht('Suggest Reviewers'),
     );
 
     $form = new AphrontFormView();
     $form
       ->setWorkflow(true)
       ->setUser($this->user)
       ->setAction($this->actionURI)
       ->addHiddenInput('revision_id', $revision->getID())
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Action'))
           ->setName('action')
           ->setValue($action)
           ->setID('comment-action')
           ->setOptions($this->actions))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setLabel($enable_reviewers ? $add_reviewers_labels[$action] :
             $add_reviewers_labels['add_reviewers'])
           ->setName('reviewers')
           ->setControlID('add-reviewers')
           ->setControlStyle($enable_reviewers ? null : 'display: none')
           ->setID('add-reviewers-tokenizer')
           ->setDisableBehavior(true))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Add CCs'))
           ->setName('ccs')
           ->setControlID('add-ccs')
           ->setControlStyle($enable_ccs ? null : 'display: none')
           ->setID('add-ccs-tokenizer')
           ->setDisableBehavior(true))
       ->appendChild(
         id(new PhabricatorRemarkupControl())
           ->setName('comment')
           ->setID('comment-content')
           ->setLabel(pht('Comment'))
           ->setValue($this->draft ? $this->draft->getDraft() : null)
           ->setUser($this->user))
       ->appendChild(
         id(new AphrontFormSubmitControl())
           ->setValue($is_serious ? pht('Submit') : pht('Clowncopterize')));
 
     Javelin::initBehavior(
       'differential-add-reviewers-and-ccs',
       array(
         'dynamic' => array(
           'add-reviewers-tokenizer' => array(
             'actions' => array(
               'request_review' => 1,
               'add_reviewers' => 1,
               'resign' => 1,
             ),
             'src' => '/typeahead/common/users/',
             'value' => $this->reviewers,
             'row' => 'add-reviewers',
             'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
             'labels' => $add_reviewers_labels,
             'placeholder' => pht('Type a user name...'),
           ),
           'add-ccs-tokenizer' => array(
             'actions' => array('add_ccs' => 1),
             'src' => '/typeahead/common/mailable/',
             'value' => $this->ccs,
             'row' => 'add-ccs',
             'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
             'placeholder' => pht('Type a user or mailing list...'),
           ),
         ),
         'select' => 'comment-action',
       ));
 
     $diff = $revision->loadActiveDiff();
     $warnings = mpull($this->auxFields, 'renderWarningBoxForRevisionAccept');
 
     Javelin::initBehavior(
       'differential-accept-with-errors',
       array(
         'select' => 'comment-action',
         'warnings' => 'warnings',
       ));
 
     $rev_id = $revision->getID();
 
     Javelin::initBehavior(
       'differential-feedback-preview',
       array(
         'uri'       => '/differential/comment/preview/'.$rev_id.'/',
         'preview'   => 'comment-preview',
         'action'    => 'comment-action',
         'content'   => 'comment-content',
         'previewTokenizers' => array(
           'reviewers' => 'add-reviewers-tokenizer',
           'ccs'       => 'add-ccs-tokenizer',
         ),
 
         'inlineuri' => '/differential/comment/inline/preview/'.$rev_id.'/',
         'inline'    => 'inline-comment-preview',
       ));
 
     $warning_container = array();
     foreach ($warnings as $warning) {
       if ($warning) {
         $warning_container[] = $warning->render();
       }
     }
 
     $header = id(new PHUIHeaderView())
       ->setHeader($is_serious ? pht('Add Comment') : pht('Leap Into Action'));
 
     $anchor = id(new PhabricatorAnchorView())
         ->setAnchorName('comment')
         ->setNavigationMarker(true);
 
     $warn = phutil_tag('div', array('id' => 'warnings'), $warning_container);
 
     $preview = hsprintf(
         '<div class="aphront-panel-preview aphront-panel-flush">'.
           '<div id="comment-preview">'.
             '<span class="aphront-panel-preview-loading-text">%s</span>'.
           '</div>'.
           '<div id="inline-comment-preview">'.
           '</div>'.
         '</div>',
       pht('Loading comment preview...'));
 
 
 
     $comment_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($anchor)
-      ->addContent($warn)
-      ->addContent($form);
+      ->appendChild($anchor)
+      ->appendChild($warn)
+      ->appendChild($form);
 
     return array($comment_box, $preview);
   }
 }
diff --git a/src/applications/differential/view/DifferentialChangesetListView.php b/src/applications/differential/view/DifferentialChangesetListView.php
index e64cc31445..fc8784e2e2 100644
--- a/src/applications/differential/view/DifferentialChangesetListView.php
+++ b/src/applications/differential/view/DifferentialChangesetListView.php
@@ -1,335 +1,335 @@
 <?php
 
 final class DifferentialChangesetListView extends AphrontView {
 
   private $changesets = array();
   private $visibleChangesets = array();
   private $references = array();
   private $inlineURI;
   private $renderURI = '/differential/changeset/';
   private $whitespace;
 
   private $standaloneURI;
   private $leftRawFileURI;
   private $rightRawFileURI;
 
   private $symbolIndexes = array();
   private $repository;
   private $branch;
   private $diff;
   private $vsMap = array();
 
   private $title;
 
   public function setTitle($title) {
     $this->title = $title;
     return $this;
   }
   private function getTitle() {
     return $this->title;
   }
 
   public function setBranch($branch) {
     $this->branch = $branch;
     return $this;
   }
   private function getBranch() {
     return $this->branch;
   }
 
   public function setChangesets($changesets) {
     $this->changesets = $changesets;
     return $this;
   }
 
   public function setVisibleChangesets($visible_changesets) {
     $this->visibleChangesets = $visible_changesets;
     return $this;
   }
 
   public function setInlineCommentControllerURI($uri) {
     $this->inlineURI = $uri;
     return $this;
   }
 
   public function setRepository(PhabricatorRepository $repository) {
     $this->repository = $repository;
     return $this;
   }
 
   public function setDiff(DifferentialDiff $diff) {
     $this->diff = $diff;
     return $this;
   }
 
   public function setRenderingReferences(array $references) {
     $this->references = $references;
     return $this;
   }
 
   public function setSymbolIndexes(array $indexes) {
     $this->symbolIndexes = $indexes;
     return $this;
   }
 
   public function setRenderURI($render_uri) {
     $this->renderURI = $render_uri;
     return $this;
   }
 
   public function setWhitespace($whitespace) {
     $this->whitespace = $whitespace;
     return $this;
   }
 
   public function setVsMap(array $vs_map) {
     $this->vsMap = $vs_map;
     return $this;
   }
 
   public function getVsMap() {
     return $this->vsMap;
   }
 
   public function setStandaloneURI($uri) {
     $this->standaloneURI = $uri;
     return $this;
   }
 
   public function setRawFileURIs($l, $r) {
     $this->leftRawFileURI = $l;
     $this->rightRawFileURI = $r;
     return $this;
   }
 
   public function render() {
     require_celerity_resource('differential-changeset-view-css');
 
     $changesets = $this->changesets;
 
     Javelin::initBehavior('differential-toggle-files', array(
       'pht' => array(
         'undo' => pht('Undo'),
         'collapsed' => pht('This file content has been collapsed.'))
       ));
     Javelin::initBehavior(
       'differential-dropdown-menus',
       array());
 
     $output = array();
     $mapping = array();
     foreach ($changesets as $key => $changeset) {
       $file = $changeset->getFilename();
       $class = 'differential-changeset';
       if (!$this->inlineURI) {
         $class .= ' differential-changeset-noneditable';
       }
 
       $ref = $this->references[$key];
 
       $detail = new DifferentialChangesetDetailView();
 
       $view_options = $this->renderViewOptionsDropdown(
         $detail,
         $ref,
         $changeset);
 
       $detail->setChangeset($changeset);
       $detail->addButton($view_options);
       $detail->setSymbolIndex(idx($this->symbolIndexes, $key));
       $detail->setVsChangesetID(idx($this->vsMap, $changeset->getID()));
       $detail->setEditable(true);
 
       $uniq_id = 'diff-'.$changeset->getAnchorName();
       if (isset($this->visibleChangesets[$key])) {
         $load = 'Loading...';
         $mapping[$uniq_id] = $ref;
       } else {
         $load = javelin_tag(
           'a',
           array(
             'href' => '#'.$uniq_id,
             'meta' => array(
               'id' => $uniq_id,
               'ref' => $ref,
               'kill' => true,
             ),
             'sigil' => 'differential-load',
             'mustcapture' => true,
           ),
           pht('Load'));
       }
       $detail->appendChild(
         phutil_tag(
           'div',
           array(
             'id' => $uniq_id,
           ),
           phutil_tag('div', array('class' => 'differential-loading'), $load)));
       $output[] = $detail->render();
     }
 
     require_celerity_resource('aphront-tooltip-css');
 
     Javelin::initBehavior('differential-populate', array(
       'registry'    => $mapping,
       'whitespace'  => $this->whitespace,
       'uri'         => $this->renderURI,
     ));
 
     Javelin::initBehavior('differential-show-more', array(
       'uri' => $this->renderURI,
       'whitespace' => $this->whitespace,
     ));
 
     Javelin::initBehavior('differential-comment-jump', array());
 
     if ($this->inlineURI) {
       $undo_templates = $this->renderUndoTemplates();
 
       Javelin::initBehavior('differential-edit-inline-comments', array(
         'uri'             => $this->inlineURI,
         'undo_templates'  => $undo_templates,
         'stage'           => 'differential-review-stage',
       ));
     }
 
     $header = null;
     if ($this->getTitle() !== null) {
       $header = id(new PHUIHeaderView())
         ->setHeader($this->getTitle());
     }
 
     $content = phutil_tag(
       'div',
       array(
         'class' => 'differential-review-stage',
         'id'    => 'differential-review-stage',
       ),
       $output);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($content);
+      ->appendChild($content);
 
     return $object_box;
   }
 
   /**
    * Render the "Undo" markup for the inline comment undo feature.
    */
   private function renderUndoTemplates() {
     $link = javelin_tag(
       'a',
       array(
         'href'  => '#',
         'sigil' => 'differential-inline-comment-undo',
       ),
       pht('Undo'));
 
     $div = phutil_tag(
       'div',
       array(
         'class' => 'differential-inline-undo',
       ),
       array('Changes discarded. ', $link));
 
     return array(
       'l' => hsprintf(
         '<table><tr>'.
           '<th></th><td>%s</td>'.
           '<th></th><td colspan="3"></td>'.
         '</tr></table>',
         $div),
 
       'r' => hsprintf(
         '<table><tr>'.
           '<th></th><td></td>'.
           '<th></th><td colspan="3">%s</td>'.
         '</tr></table>',
         $div),
     );
   }
 
   private function renderViewOptionsDropdown(
     DifferentialChangesetDetailView $detail,
     $ref,
     DifferentialChangeset $changeset) {
 
     $meta = array();
 
     $qparams = array(
       'ref'         => $ref,
       'whitespace'  => $this->whitespace,
     );
 
     if ($this->standaloneURI) {
       $uri = new PhutilURI($this->standaloneURI);
       $uri->setQueryParams($uri->getQueryParams() + $qparams);
       $meta['standaloneURI'] = (string)$uri;
     }
 
     $repository = $this->repository;
     if ($repository) {
       try {
         $meta['diffusionURI'] =
           (string)$repository->getDiffusionBrowseURIForPath(
             $this->user,
             $changeset->getAbsoluteRepositoryPath($repository, $this->diff),
             idx($changeset->getMetadata(), 'line:first'),
             $this->getBranch());
       } catch (DiffusionSetupException $e) {
         // Ignore
       }
     }
 
     $change = $changeset->getChangeType();
 
     if ($this->leftRawFileURI) {
       if ($change != DifferentialChangeType::TYPE_ADD) {
         $uri = new PhutilURI($this->leftRawFileURI);
         $uri->setQueryParams($uri->getQueryParams() + $qparams);
         $meta['leftURI'] = (string)$uri;
       }
     }
 
     if ($this->rightRawFileURI) {
       if ($change != DifferentialChangeType::TYPE_DELETE &&
           $change != DifferentialChangeType::TYPE_MULTICOPY) {
         $uri = new PhutilURI($this->rightRawFileURI);
         $uri->setQueryParams($uri->getQueryParams() + $qparams);
         $meta['rightURI'] = (string)$uri;
       }
     }
 
     $user = $this->user;
     if ($user && $repository) {
       $path = ltrim(
         $changeset->getAbsoluteRepositoryPath($repository, $this->diff),
         '/');
       $line = idx($changeset->getMetadata(), 'line:first', 1);
       $callsign = $repository->getCallsign();
       $editor_link = $user->loadEditorLink($path, $line, $callsign);
       if ($editor_link) {
         $meta['editor'] = $editor_link;
       } else {
         $meta['editorConfigure'] = '/settings/panel/display/';
       }
     }
 
     $meta['containerID'] = $detail->getID();
     $caret = phutil_tag('span', array('class' => 'caret'), '');
 
     return javelin_tag(
       'a',
       array(
         'class'   => 'button grey small dropdown',
         'meta'    => $meta,
         'href'    => idx($meta, 'detailURI', '#'),
         'target'  => '_blank',
         'sigil'   => 'differential-view-options',
       ),
       array(pht('View Options'), $caret));
   }
 
 }
diff --git a/src/applications/differential/view/DifferentialDiffTableOfContentsView.php b/src/applications/differential/view/DifferentialDiffTableOfContentsView.php
index e9e1ea21cb..1ba389839a 100644
--- a/src/applications/differential/view/DifferentialDiffTableOfContentsView.php
+++ b/src/applications/differential/view/DifferentialDiffTableOfContentsView.php
@@ -1,312 +1,312 @@
 <?php
 
 final class DifferentialDiffTableOfContentsView extends AphrontView {
 
   private $changesets = array();
   private $visibleChangesets = array();
   private $references = array();
   private $repository;
   private $diff;
   private $renderURI = '/differential/changeset/';
   private $revisionID;
   private $whitespace;
   private $unitTestData;
 
   public function setChangesets($changesets) {
     $this->changesets = $changesets;
     return $this;
   }
 
   public function setVisibleChangesets($visible_changesets) {
     $this->visibleChangesets = $visible_changesets;
     return $this;
   }
 
   public function setRenderingReferences(array $references) {
     $this->references = $references;
     return $this;
   }
 
   public function setRepository(PhabricatorRepository $repository) {
     $this->repository = $repository;
     return $this;
   }
 
   public function setDiff(DifferentialDiff $diff) {
     $this->diff = $diff;
     return $this;
   }
 
   public function setUnitTestData($unit_test_data) {
     $this->unitTestData = $unit_test_data;
     return $this;
   }
 
   public function setRevisionID($revision_id) {
     $this->revisionID = $revision_id;
     return $this;
   }
 
   public function setWhitespace($whitespace) {
     $this->whitespace = $whitespace;
     return $this;
   }
 
   public function render() {
 
     require_celerity_resource('differential-core-view-css');
     require_celerity_resource('differential-table-of-contents-css');
 
     $rows = array();
 
     $coverage = array();
     if ($this->unitTestData) {
       $coverage_by_file = array();
       foreach ($this->unitTestData as $result) {
         $test_coverage = idx($result, 'coverage');
         if (!$test_coverage) {
           continue;
         }
         foreach ($test_coverage as $file => $results) {
           $coverage_by_file[$file][] = $results;
         }
       }
       foreach ($coverage_by_file as $file => $coverages) {
         $coverage[$file] = ArcanistUnitTestResult::mergeCoverage($coverages);
       }
     }
 
     $changesets = $this->changesets;
     $paths = array();
     foreach ($changesets as $id => $changeset) {
       $type = $changeset->getChangeType();
       $ftype = $changeset->getFileType();
       $ref = idx($this->references, $id);
       $display_file = $changeset->getDisplayFilename();
 
       $meta = null;
       if (DifferentialChangeType::isOldLocationChangeType($type)) {
         $away = $changeset->getAwayPaths();
         if (count($away) > 1) {
           $meta = array();
           if ($type == DifferentialChangeType::TYPE_MULTICOPY) {
             $meta[] = pht('Deleted after being copied to multiple locations:');
           } else {
             $meta[] = pht('Copied to multiple locations:');
           }
           foreach ($away as $path) {
             $meta[] = $path;
           }
           $meta = phutil_implode_html(phutil_tag('br'), $meta);
         } else {
           if ($type == DifferentialChangeType::TYPE_MOVE_AWAY) {
             $display_file = $this->renderRename(
               $display_file,
               reset($away),
               "\xE2\x86\x92");
           } else {
             $meta = pht('Copied to %s', reset($away));
           }
         }
       } else if ($type == DifferentialChangeType::TYPE_MOVE_HERE) {
         $old_file = $changeset->getOldFile();
         $display_file = $this->renderRename(
           $display_file,
           $old_file,
           "\xE2\x86\x90");
       } else if ($type == DifferentialChangeType::TYPE_COPY_HERE) {
         $meta = pht('Copied from %s', $changeset->getOldFile());
       }
 
       $link = $this->renderChangesetLink($changeset, $ref, $display_file);
 
       $line_count = $changeset->getAffectedLineCount();
       if ($line_count == 0) {
         $lines = null;
       } else {
         $lines = ' '.pht('(%d line(s))', $line_count);
       }
 
       $char = DifferentialChangeType::getSummaryCharacterForChangeType($type);
       $chartitle = DifferentialChangeType::getFullNameForChangeType($type);
       $desc = DifferentialChangeType::getShortNameForFileType($ftype);
       if ($desc) {
         $desc = '('.$desc.')';
       }
       $pchar =
         ($changeset->getOldProperties() === $changeset->getNewProperties())
           ? null
           : hsprintf('<span title="%s">M</span>', pht('Properties Changed'));
 
       $fname = $changeset->getFilename();
       $cov  = $this->renderCoverage($coverage, $fname);
       if ($cov === null) {
         $mcov = $cov = phutil_tag('em', array(), '-');
       } else {
         $mcov = phutil_tag(
           'div',
           array(
             'id' => 'differential-mcoverage-'.md5($fname),
             'class' => 'differential-mcoverage-loading',
           ),
           (isset($this->visibleChangesets[$id]) ? 'Loading...' : '?'));
       }
 
       $rows[] = hsprintf(
           '<tr>'.
             '<td class="differential-toc-char" title="%s">%s</td>'.
             '<td class="differential-toc-prop">%s</td>'.
             '<td class="differential-toc-ftype">%s</td>'.
             '<td class="differential-toc-file">%s%s</td>'.
             '<td class="differential-toc-cov">%s</td>'.
             '<td class="differential-toc-mcov">%s</td>'.
           '</tr>',
           $chartitle, $char,
           $pchar,
           $desc,
           $link, $lines,
           $cov,
           $mcov);
       if ($meta) {
         $rows[] = hsprintf(
           '<tr>'.
             '<td colspan="3"></td>'.
             '<td class="differential-toc-meta">%s</td>'.
           '</tr>',
           $meta);
       }
       if ($this->diff && $this->repository) {
         $paths[] =
           $changeset->getAbsoluteRepositoryPath($this->repository, $this->diff);
       }
     }
 
     $editor_link = null;
     if ($paths && $this->user) {
       $editor_link = $this->user->loadEditorLink(
         $paths,
         1, // line number
         $this->repository->getCallsign());
       if ($editor_link) {
         $editor_link =
           phutil_tag(
             'a',
             array(
               'href' => $editor_link,
               'class' => 'button differential-toc-edit-all',
             ),
             pht('Open All in Editor'));
       }
     }
 
     $reveal_link = javelin_tag(
         'a',
         array(
           'sigil' => 'differential-reveal-all',
           'mustcapture' => true,
           'class' => 'button differential-toc-reveal-all',
         ),
         pht('Show All Context'));
 
     $buttons = hsprintf(
       '<tr><td colspan="7">%s%s</td></tr>',
       $editor_link,
       $reveal_link);
 
     $content = hsprintf(
       '%s'.
       '<div class="differential-toc differential-panel">'.
         '<table>'.
           '<tr>'.
             '<th></th>'.
             '<th></th>'.
             '<th></th>'.
             '<th>Path</th>'.
             '<th class="differential-toc-cov">%s</th>'.
             '<th class="differential-toc-mcov">%s</th>'.
           '</tr>'.
           '%s%s'.
         '</table>'.
       '</div>',
       id(new PhabricatorAnchorView())
         ->setAnchorName('toc')
         ->setNavigationMarker(true)
         ->render(),
       pht('Coverage (All)'),
       pht('Coverage (Touched)'),
       phutil_implode_html("\n", $rows),
       $buttons);
 
     return id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Table of Contents'))
-      ->addContent($content);
+      ->appendChild($content);
   }
 
   private function renderRename($display_file, $other_file, $arrow) {
     $old = explode('/', $display_file);
     $new = explode('/', $other_file);
 
     $start = count($old);
     foreach ($old as $index => $part) {
       if (!isset($new[$index]) || $part != $new[$index]) {
         $start = $index;
         break;
       }
     }
 
     $end = count($old);
     foreach (array_reverse($old) as $from_end => $part) {
       $index = count($new) - $from_end - 1;
       if (!isset($new[$index]) || $part != $new[$index]) {
         $end = $from_end;
         break;
       }
     }
 
     $rename =
       '{'.
       implode('/', array_slice($old, $start, count($old) - $end - $start)).
       ' '.$arrow.' '.
       implode('/', array_slice($new, $start, count($new) - $end - $start)).
       '}';
 
     array_splice($new, $start, count($new) - $end - $start, $rename);
     return implode('/', $new);
   }
 
   private function renderCoverage(array $coverage, $file) {
     $info = idx($coverage, $file);
     if (!$info) {
       return null;
     }
 
     $not_covered = substr_count($info, 'U');
     $covered     = substr_count($info, 'C');
 
     if (!$not_covered && !$covered) {
       return null;
     }
 
     return sprintf('%d%%', 100 * ($covered / ($covered + $not_covered)));
   }
 
 
   private function renderChangesetLink(
     DifferentialChangeset $changeset,
     $ref,
     $display_file) {
 
     return javelin_tag(
       'a',
       array(
         'href' => '#'.$changeset->getAnchorName(),
         'meta' => array(
           'id' => 'diff-'.$changeset->getAnchorName(),
           'ref' => $ref,
         ),
         'sigil' => 'differential-load',
       ),
       $display_file);
   }
 
 }
diff --git a/src/applications/differential/view/DifferentialLocalCommitsView.php b/src/applications/differential/view/DifferentialLocalCommitsView.php
index 2c1d8b7f73..aec57bfe81 100644
--- a/src/applications/differential/view/DifferentialLocalCommitsView.php
+++ b/src/applications/differential/view/DifferentialLocalCommitsView.php
@@ -1,148 +1,147 @@
 <?php
 
 final class DifferentialLocalCommitsView extends AphrontView {
 
   private $localCommits;
 
   public function setLocalCommits($local_commits) {
     $this->localCommits = $local_commits;
     return $this;
   }
 
   public function render() {
     $user = $this->user;
     if (!$user) {
       throw new Exception("Call setUser() before render()-ing this view.");
     }
 
     $local = $this->localCommits;
     if (!$local) {
       return null;
     }
 
     require_celerity_resource('differential-local-commits-view-css');
 
     $has_tree = false;
     $has_local = false;
 
     foreach ($local as $commit) {
       if (idx($commit, 'tree')) {
         $has_tree = true;
       }
       if (idx($commit, 'local')) {
         $has_local = true;
       }
     }
 
     $rows = array();
     $highlight = true;
     foreach ($local as $commit) {
       if ($highlight) {
         $class = 'alt';
         $highlight = false;
       } else {
         $class = '';
         $highlight = true;
       }
 
 
       $row = array();
       if (idx($commit, 'commit')) {
         $commit_hash = self::formatCommit($commit['commit']);
       } else if (isset($commit['rev'])) {
         $commit_hash = self::formatCommit($commit['rev']);
       } else {
         $commit_hash = null;
       }
       $row[] = phutil_tag('td', array(), $commit_hash);
 
       if ($has_tree) {
         $tree = idx($commit, 'tree');
         $tree = self::formatCommit($tree);
         $row[] = phutil_tag('td', array(), $tree);
       }
 
       if ($has_local) {
         $local_rev = idx($commit, 'local', null);
         $row[] = phutil_tag('td', array(), $local_rev);
       }
 
       $parents = idx($commit, 'parents', array());
       foreach ($parents as $k => $parent) {
         if (is_array($parent)) {
           $parent = idx($parent, 'rev');
         }
         $parents[$k] = self::formatCommit($parent);
       }
       $parents = phutil_implode_html(phutil_tag('br'), $parents);
       $row[] = phutil_tag('td', array(), $parents);
 
       $author = nonempty(
         idx($commit, 'user'),
         idx($commit, 'author'));
       $row[] = phutil_tag('td', array(), $author);
 
       $message = idx($commit, 'message');
 
       $summary = idx($commit, 'summary');
       $summary = phutil_utf8_shorten($summary, 80);
 
       $view = new AphrontMoreView();
       $view->setSome($summary);
 
       if ($message && (trim($summary) != trim($message))) {
         $view->setMore(phutil_escape_html_newlines($message));
       }
 
       $row[] = phutil_tag(
         'td',
         array(
           'class' => 'summary',
         ),
         $view->render());
 
       $date = nonempty(
         idx($commit, 'date'),
         idx($commit, 'time'));
       if ($date) {
         $date = phabricator_datetime($date, $user);
       }
       $row[] = phutil_tag('td', array(), $date);
 
       $rows[] = phutil_tag('tr', array('class' => $class), $row);
     }
 
 
     $headers = array();
     $headers[] = phutil_tag('th', array(), pht('Commit'));
     if ($has_tree) {
       $headers[] = phutil_tag('th', array(), pht('Tree'));
     }
     if ($has_local) {
       $headers[] = phutil_tag('th', array(), pht('Local'));
     }
     $headers[] = phutil_tag('th', array(), pht('Parents'));
     $headers[] = phutil_tag('th', array(), pht('Author'));
     $headers[] = phutil_tag('th', array(), pht('Summary'));
     $headers[] = phutil_tag('th', array(), pht('Date'));
 
     $headers = phutil_tag('tr', array(), $headers);
 
     $content = hsprintf(
       '<div class="differential-panel">'.
         '<table class="differential-local-commits-table">%s%s</table>'.
       '</div>',
       $headers,
       phutil_implode_html("\n", $rows));
 
     return id(new PHUIObjectBoxView())
-        ->setHeaderText(pht('Local Commits'))
-        ->addContent($content);
-
+      ->setHeaderText(pht('Local Commits'))
+      ->appendChild($content);
   }
 
   private static function formatCommit($commit) {
     return substr($commit, 0, 12);
   }
 
 }
diff --git a/src/applications/differential/view/DifferentialRevisionDetailView.php b/src/applications/differential/view/DifferentialRevisionDetailView.php
index b13d25ae9b..a529608dce 100644
--- a/src/applications/differential/view/DifferentialRevisionDetailView.php
+++ b/src/applications/differential/view/DifferentialRevisionDetailView.php
@@ -1,149 +1,149 @@
 <?php
 
 final class DifferentialRevisionDetailView extends AphrontView {
 
   private $revision;
   private $actions;
   private $auxiliaryFields = array();
   private $diff;
   private $uri;
 
   public function setURI($uri) {
     $this->uri = $uri;
     return $this;
   }
   public function getURI() {
     return $this->uri;
   }
 
   public function setDiff(DifferentialDiff $diff) {
     $this->diff = $diff;
     return $this;
   }
   private function getDiff() {
     return $this->diff;
   }
 
   public function setRevision(DifferentialRevision $revision) {
     $this->revision = $revision;
     return $this;
   }
 
   public function setActions(array $actions) {
     $this->actions = $actions;
     return $this;
   }
   private function getActions() {
     return $this->actions;
   }
 
   public function setAuxiliaryFields(array $fields) {
     assert_instances_of($fields, 'DifferentialFieldSpecification');
     $this->auxiliaryFields = $fields;
     return $this;
   }
 
   public function render() {
 
     require_celerity_resource('differential-core-view-css');
 
     $revision = $this->revision;
     $user = $this->getUser();
 
     $header = $this->renderHeader($revision);
 
     $actions = id(new PhabricatorActionListView())
       ->setUser($user)
       ->setObject($revision)
       ->setObjectURI($this->getURI());
     foreach ($this->getActions() as $action) {
       $obj = id(new PhabricatorActionView())
         ->setIcon(idx($action, 'icon', 'edit'))
         ->setName($action['name'])
         ->setHref(idx($action, 'href'))
         ->setWorkflow(idx($action, 'sigil') == 'workflow')
         ->setRenderAsForm(!empty($action['instant']))
         ->setUser($user)
         ->setDisabled(idx($action, 'disabled', false));
       $actions->addAction($obj);
     }
 
     $properties = id(new PhabricatorPropertyListView())
       ->setUser($user)
       ->setObject($revision);
 
     $status = $revision->getStatus();
     $local_vcs = $this->getDiff()->getSourceControlSystem();
 
     $next_step = null;
     if ($status == ArcanistDifferentialRevisionStatus::ACCEPTED) {
       switch ($local_vcs) {
         case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
           $bookmark = $this->getDiff()->getBookmark();
           $next_step = ($bookmark != ''
             ? csprintf('arc land %s', $bookmark)
             : 'arc land');
           break;
 
         case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
           $branch = $this->getDiff()->getBranch();
           $next_step = ($branch != ''
             ? csprintf('arc land %s', $branch)
             : 'arc land');
           break;
 
         case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
           $next_step = 'arc commit';
           break;
       }
     }
     if ($next_step) {
       $next_step = phutil_tag('tt', array(), $next_step);
       $properties->addProperty(pht('Next Step'), $next_step);
     }
 
     foreach ($this->auxiliaryFields as $field) {
       $value = $field->renderValueForRevisionView();
       if ($value !== null) {
         $label = rtrim($field->renderLabelForRevisionView(), ':');
         $properties->addProperty($label, $value);
       }
     }
     $properties->setHasKeyboardShortcuts(true);
 
     $object_box = id(new PHUIObjectBoxView())
-        ->setHeader($header)
-        ->addContent($actions)
-        ->addContent($properties);
+      ->setHeader($header)
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     return $object_box;
   }
 
   private function renderHeader(DifferentialRevision $revision) {
     $view = id(new PHUIHeaderView())
       ->setHeader($revision->getTitle($revision))
       ->setUser($this->getUser())
       ->setPolicyObject($revision);
 
     $status = $revision->getStatus();
     $status_name =
       DifferentialRevisionStatus::renderFullDescription($status);
 
     $view->addProperty(PHUIHeaderView::PROPERTY_STATUS, $status_name);
 
     return $view;
   }
 
   public static function renderTagForRevision(
     DifferentialRevision $revision) {
 
     $status = $revision->getStatus();
     $status_name =
       ArcanistDifferentialRevisionStatus::getNameForRevisionStatus($status);
 
     return id(new PhabricatorTagView())
       ->setType(PhabricatorTagView::TYPE_STATE)
       ->setName($status_name);
   }
 
 }
diff --git a/src/applications/differential/view/DifferentialRevisionUpdateHistoryView.php b/src/applications/differential/view/DifferentialRevisionUpdateHistoryView.php
index afa52652a2..c10f985b1d 100644
--- a/src/applications/differential/view/DifferentialRevisionUpdateHistoryView.php
+++ b/src/applications/differential/view/DifferentialRevisionUpdateHistoryView.php
@@ -1,327 +1,327 @@
 <?php
 
 final class DifferentialRevisionUpdateHistoryView extends AphrontView {
 
   private $diffs = array();
   private $selectedVersusDiffID;
   private $selectedDiffID;
   private $selectedWhitespace;
 
   public function setDiffs(array $diffs) {
     assert_instances_of($diffs, 'DifferentialDiff');
     $this->diffs = $diffs;
     return $this;
   }
 
   public function setSelectedVersusDiffID($id) {
     $this->selectedVersusDiffID = $id;
     return $this;
   }
 
   public function setSelectedDiffID($id) {
     $this->selectedDiffID = $id;
     return $this;
   }
 
   public function setSelectedWhitespace($whitespace) {
     $this->selectedWhitespace = $whitespace;
     return $this;
   }
 
   public function render() {
 
     require_celerity_resource('differential-core-view-css');
     require_celerity_resource('differential-revision-history-css');
 
     $data = array(
       array(
         'name' => 'Base',
         'id'   => null,
         'desc' => 'Base',
         'age'  => null,
         'obj'  => null,
       ),
     );
 
     $seq = 0;
     foreach ($this->diffs as $diff) {
       $data[] = array(
         'name' => 'Diff '.(++$seq),
         'id'   => $diff->getID(),
         'desc' => $diff->getDescription(),
         'age'  => $diff->getDateCreated(),
         'obj'  => $diff,
       );
     }
 
     $max_id = $diff->getID();
 
     $idx = 0;
     $rows = array();
     $disable = false;
     $radios = array();
     $last_base = null;
     foreach ($data as $row) {
 
       $diff = $row['obj'];
       $name = $row['name'];
       $id   = $row['id'];
 
       $old_class = null;
       $new_class = null;
 
       if ($id) {
         $new_checked = ($this->selectedDiffID == $id);
         $new = javelin_tag(
           'input',
           array(
             'type' => 'radio',
             'name' => 'id',
             'value' => $id,
             'checked' => $new_checked ? 'checked' : null,
             'sigil' => 'differential-new-radio',
           ));
         if ($new_checked) {
           $new_class = " revhistory-new-now";
           $disable = true;
         }
       } else {
         $new = null;
       }
 
       if ($max_id != $id) {
         $uniq = celerity_generate_unique_node_id();
         $old_checked = ($this->selectedVersusDiffID == $id);
         $old = phutil_tag(
           'input',
           array(
             'type' => 'radio',
             'name' => 'vs',
             'value' => $id,
             'id' => $uniq,
             'checked' => $old_checked ? 'checked' : null,
             'disabled' => $disable ? 'disabled' : null,
           ));
         $radios[] = $uniq;
         if ($old_checked) {
           $old_class = " revhistory-old-now";
         }
       } else {
         $old = null;
       }
 
       $desc = $row['desc'];
 
       if ($row['age']) {
         $age = phabricator_datetime($row['age'], $this->getUser());
       } else {
         $age = null;
       }
 
       if (++$idx % 2) {
         $class = 'alt';
       } else {
         $class = null;
       }
 
       $lint_attrs = array('class' => 'revhistory-star');
       $unit_attrs = array('class' => 'revhistory-star');
       if ($diff) {
         $lint = self::renderDiffLintStar($row['obj']);
         $unit = self::renderDiffUnitStar($row['obj']);
         $lint_attrs['title'] = self::getDiffLintMessage($diff);
         $unit_attrs['title'] = self::getDiffUnitMessage($diff);
         $base = $this->renderBaseRevision($diff);
       } else {
         $lint = null;
         $unit = null;
         $base = null;
       }
 
       if ($last_base !== null && $base !== $last_base) {
         // TODO: Render some kind of notice about rebases.
       }
       $last_base = $base;
 
       $id_link = phutil_tag(
         'a',
         array('href' => '/differential/diff/'.$id.'/'),
         $id);
       $rows[] = phutil_tag(
         'tr',
         array('class' => $class),
         array(
           phutil_tag('td', array('class' => 'revhistory-name'), $name),
           phutil_tag('td', array('class' => 'revhistory-id'), $id_link),
           phutil_tag('td', array('class' => 'revhistory-base'), $base),
           phutil_tag('td', array('class' => 'revhistory-desc'), $desc),
           phutil_tag('td', array('class' => 'revhistory-age'), $age),
           phutil_tag('td', $lint_attrs, $lint),
           phutil_tag('td', $unit_attrs, $unit),
           phutil_tag('td', array('class' => 'revhistory-old'.$old_class), $old),
           phutil_tag('td', array('class' => 'revhistory-new'.$new_class), $new),
         ));
     }
 
     Javelin::initBehavior(
       'differential-diff-radios',
       array(
         'radios' => $radios,
       ));
 
     $options = array(
       DifferentialChangesetParser::WHITESPACE_IGNORE_FORCE => 'Ignore All',
       DifferentialChangesetParser::WHITESPACE_IGNORE_ALL => 'Ignore Most',
       DifferentialChangesetParser::WHITESPACE_IGNORE_TRAILING =>
         'Ignore Trailing',
       DifferentialChangesetParser::WHITESPACE_SHOW_ALL => 'Show All',
     );
 
     foreach ($options as $value => $label) {
       $options[$value] = phutil_tag(
         'option',
         array(
           'value' => $value,
           'selected' => ($value == $this->selectedWhitespace)
           ? 'selected'
           : null,
         ),
         $label);
     }
     $select = phutil_tag('select', array('name' => 'whitespace'), $options);
 
     array_unshift($rows, phutil_tag('tr', array(), array(
       phutil_tag('th', array(), pht('Diff')),
       phutil_tag('th', array(), pht('ID')),
       phutil_tag('th', array(), pht('Base')),
       phutil_tag('th', array(), pht('Description')),
       phutil_tag('th', array(), pht('Created')),
       phutil_tag('th', array(), pht('Lint')),
       phutil_tag('th', array(), pht('Unit')),
     )));
 
     $content = hsprintf(
       '<div class="differential-revision-history differential-panel">'.
         '<form action="#toc">'.
           '<table class="differential-revision-history-table">'.
             '%s'.
             '<tr>'.
               '<td colspan="9" class="diff-differ-submit">'.
                 '<label>%s</label>'.
                 '<button>%s</button>'.
               '</td>'.
             '</tr>'.
           '</table>'.
         '</form>'.
       '</div>',
       phutil_implode_html("\n", $rows),
       pht('Whitespace Changes: %s', $select),
       pht('Show Diff'));
 
     return id(new PHUIObjectBoxView())
-        ->setHeaderText(pht('Revision Update History'))
-        ->addContent($content);
+      ->setHeaderText(pht('Revision Update History'))
+      ->appendChild($content);
   }
 
   const STAR_NONE = 'none';
   const STAR_OKAY = 'okay';
   const STAR_WARN = 'warn';
   const STAR_FAIL = 'fail';
   const STAR_SKIP = 'skip';
 
   public static function renderDiffLintStar(DifferentialDiff $diff) {
     static $map = array(
       DifferentialLintStatus::LINT_NONE => self::STAR_NONE,
       DifferentialLintStatus::LINT_OKAY => self::STAR_OKAY,
       DifferentialLintStatus::LINT_WARN => self::STAR_WARN,
       DifferentialLintStatus::LINT_FAIL => self::STAR_FAIL,
       DifferentialLintStatus::LINT_SKIP => self::STAR_SKIP,
       DifferentialLintStatus::LINT_POSTPONED => self::STAR_SKIP
     );
 
     $star = idx($map, $diff->getLintStatus(), self::STAR_FAIL);
 
     return self::renderDiffStar($star);
   }
 
   public static function renderDiffUnitStar(DifferentialDiff $diff) {
     static $map = array(
       DifferentialUnitStatus::UNIT_NONE => self::STAR_NONE,
       DifferentialUnitStatus::UNIT_OKAY => self::STAR_OKAY,
       DifferentialUnitStatus::UNIT_WARN => self::STAR_WARN,
       DifferentialUnitStatus::UNIT_FAIL => self::STAR_FAIL,
       DifferentialUnitStatus::UNIT_SKIP => self::STAR_SKIP,
       DifferentialUnitStatus::UNIT_POSTPONED => self::STAR_SKIP,
     );
 
     $star = idx($map, $diff->getUnitStatus(), self::STAR_FAIL);
 
     return self::renderDiffStar($star);
   }
 
   public static function getDiffLintMessage(DifferentialDiff $diff) {
     switch ($diff->getLintStatus()) {
       case DifferentialLintStatus::LINT_NONE:
         return 'No Linters Available';
       case DifferentialLintStatus::LINT_OKAY:
         return 'Lint OK';
       case DifferentialLintStatus::LINT_WARN:
         return 'Lint Warnings';
       case DifferentialLintStatus::LINT_FAIL:
         return 'Lint Errors';
       case DifferentialLintStatus::LINT_SKIP:
         return 'Lint Skipped';
       case DifferentialLintStatus::LINT_POSTPONED:
         return 'Lint Postponed';
     }
     return '???';
   }
 
   public static function getDiffUnitMessage(DifferentialDiff $diff) {
     switch ($diff->getUnitStatus()) {
       case DifferentialUnitStatus::UNIT_NONE:
         return 'No Unit Test Coverage';
       case DifferentialUnitStatus::UNIT_OKAY:
         return 'Unit Tests OK';
       case DifferentialUnitStatus::UNIT_WARN:
         return 'Unit Test Warnings';
       case DifferentialUnitStatus::UNIT_FAIL:
         return 'Unit Test Errors';
       case DifferentialUnitStatus::UNIT_SKIP:
         return 'Unit Tests Skipped';
       case DifferentialUnitStatus::UNIT_POSTPONED:
         return 'Unit Tests Postponed';
     }
     return '???';
   }
 
   private static function renderDiffStar($star) {
     $class = 'diff-star-'.$star;
     return phutil_tag(
       'span',
       array('class' => $class),
       "\xE2\x98\x85");
   }
 
   private function renderBaseRevision(DifferentialDiff $diff) {
     switch ($diff->getSourceControlSystem()) {
       case 'git':
         $base = $diff->getSourceControlBaseRevision();
         if (strpos($base, '@') === false) {
           return substr($base, 0, 7);
         } else {
           // The diff is from git-svn
           $base = explode('@', $base);
           $base = last($base);
           return $base;
         }
       case 'svn':
         $base = $diff->getSourceControlBaseRevision();
         $base = explode('@', $base);
         $base = last($base);
         return $base;
       default:
         return null;
     }
   }
 }
diff --git a/src/applications/diffusion/controller/DiffusionBrowseDirectoryController.php b/src/applications/diffusion/controller/DiffusionBrowseDirectoryController.php
index 00302be73c..35d702c1de 100644
--- a/src/applications/diffusion/controller/DiffusionBrowseDirectoryController.php
+++ b/src/applications/diffusion/controller/DiffusionBrowseDirectoryController.php
@@ -1,106 +1,106 @@
 <?php
 
 final class DiffusionBrowseDirectoryController
   extends DiffusionBrowseController {
 
   private $browseQueryResults;
 
   public function setBrowseQueryResults(DiffusionBrowseResultSet $results) {
     $this->browseQueryResults = $results;
     return $this;
   }
 
   public function getBrowseQueryResults() {
     return $this->browseQueryResults;
   }
 
   public function processRequest() {
     $drequest = $this->diffusionRequest;
 
     $results = $this->getBrowseQueryResults();
     $reason = $results->getReasonForEmptyResultSet();
 
     $content = array();
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($this->buildHeaderView($drequest))
-      ->addContent($this->buildActionView($drequest))
-      ->addContent($this->buildPropertyView($drequest));
+      ->setActionList($this->buildActionView($drequest))
+      ->setPropertyList($this->buildPropertyView($drequest));
 
     $content[] = $object_box;
     $content[] = $this->renderSearchForm($collapsed = true);
 
     if (!$results->isValidResults()) {
       $empty_result = new DiffusionEmptyResultView();
       $empty_result->setDiffusionRequest($drequest);
       $empty_result->setDiffusionBrowseResultSet($results);
       $empty_result->setView($this->getRequest()->getStr('view'));
       $content[] = $empty_result;
     } else {
       $phids = array();
       foreach ($results->getPaths() as $result) {
         $data = $result->getLastCommitData();
         if ($data) {
           if ($data->getCommitDetail('authorPHID')) {
             $phids[$data->getCommitDetail('authorPHID')] = true;
           }
         }
       }
 
       $phids = array_keys($phids);
       $handles = $this->loadViewerHandles($phids);
 
       $browse_table = new DiffusionBrowseTableView();
       $browse_table->setDiffusionRequest($drequest);
       $browse_table->setHandles($handles);
       $browse_table->setPaths($results->getPaths());
       $browse_table->setUser($this->getRequest()->getUser());
 
       $browse_panel = new AphrontPanelView();
       $browse_panel->appendChild($browse_table);
       $browse_panel->setNoBackground();
 
       $content[] = $browse_panel;
     }
 
     $content[] = $this->buildOpenRevisions();
 
     $readme = $this->callConduitWithDiffusionRequest(
       'diffusion.readmequery',
       array(
         'paths' => $results->getPathDicts(),
       ));
     if ($readme) {
       $box = new PHUIBoxView();
       $box->appendChild($readme);
       $box->addPadding(PHUI::PADDING_LARGE);
 
       $object_box = id(new PHUIObjectBoxView())
         ->setHeaderText(pht('README'))
-        ->addContent($box);
+        ->appendChild($box);
 
       $content[] = $object_box;
     }
 
     $crumbs = $this->buildCrumbs(
       array(
         'branch' => true,
         'path'   => true,
         'view'   => 'browse',
       ));
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $content,
       ),
       array(
         'device' => true,
         'title' => array(
           nonempty(basename($drequest->getPath()), '/'),
           $drequest->getRepository()->getCallsign().' Repository',
         ),
       ));
   }
 
 }
diff --git a/src/applications/diffusion/controller/DiffusionBrowseFileController.php b/src/applications/diffusion/controller/DiffusionBrowseFileController.php
index 06c10b3844..52dc63ab0b 100644
--- a/src/applications/diffusion/controller/DiffusionBrowseFileController.php
+++ b/src/applications/diffusion/controller/DiffusionBrowseFileController.php
@@ -1,977 +1,977 @@
 <?php
 
 final class DiffusionBrowseFileController extends DiffusionBrowseController {
 
   private $lintCommit;
   private $lintMessages;
 
   public function processRequest() {
     $request = $this->getRequest();
     $drequest = $this->getDiffusionRequest();
 
     $before = $request->getStr('before');
     if ($before) {
       return $this->buildBeforeResponse($before);
     }
 
     $path = $drequest->getPath();
 
     $preferences = $request->getUser()->loadPreferences();
 
     $show_blame = $request->getBool(
       'blame',
       $preferences->getPreference(
         PhabricatorUserPreferences::PREFERENCE_DIFFUSION_BLAME,
         false));
     $show_color = $request->getBool(
       'color',
       $preferences->getPreference(
         PhabricatorUserPreferences::PREFERENCE_DIFFUSION_COLOR,
         true));
 
     $view = $request->getStr('view');
     if ($request->isFormPost() && $view != 'raw') {
       $preferences->setPreference(
         PhabricatorUserPreferences::PREFERENCE_DIFFUSION_BLAME,
         $show_blame);
       $preferences->setPreference(
         PhabricatorUserPreferences::PREFERENCE_DIFFUSION_COLOR,
         $show_color);
       $preferences->save();
 
       $uri = $request->getRequestURI()
         ->alter('blame', null)
         ->alter('color', null);
 
       return id(new AphrontRedirectResponse())->setURI($uri);
     }
 
     // We need the blame information if blame is on and we're building plain
     // text, or blame is on and this is an Ajax request. If blame is on and
     // this is a colorized request, we don't show blame at first (we ajax it
     // in afterward) so we don't need to query for it.
     $needs_blame = ($show_blame && !$show_color) ||
                    ($show_blame && $request->isAjax());
 
     $file_content = DiffusionFileContent::newFromConduit(
       $this->callConduitWithDiffusionRequest(
         'diffusion.filecontentquery',
         array(
           'commit' => $drequest->getCommit(),
           'path' => $drequest->getPath(),
           'needsBlame' => $needs_blame,
         )));
     $data = $file_content->getCorpus();
 
     if ($view === 'raw') {
       return $this->buildRawResponse($path, $data);
     }
 
     $this->loadLintMessages();
 
     $binary_uri = null;
     if (ArcanistDiffUtils::isHeuristicBinaryFile($data)) {
       $file = $this->loadFileForData($path, $data);
       $file_uri = $file->getBestURI();
 
       if ($file->isViewableImage()) {
         $corpus = $this->buildImageCorpus($file_uri);
       } else {
         $corpus = $this->buildBinaryCorpus($file_uri, $data);
         $binary_uri = $file_uri;
       }
     } else {
       // Build the content of the file.
       $corpus = $this->buildCorpus(
         $show_blame,
         $show_color,
         $file_content,
         $needs_blame,
         $drequest,
         $path,
         $data);
     }
 
     if ($request->isAjax()) {
       return id(new AphrontAjaxResponse())->setContent($corpus);
     }
 
     require_celerity_resource('diffusion-source-css');
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($this->buildHeaderView($drequest))
-      ->addContent($this->buildActionView($drequest))
-      ->addContent($this->buildPropertyView($drequest));
+      ->setActionList($this->buildActionView($drequest))
+      ->setPropertyList($this->buildPropertyView($drequest));
 
     // Render the page.
     $content = array();
 
     $content[] = $this->buildHeaderView($drequest);
     $view = $this->buildActionView($drequest);
     $content[] = $this->enrichActionView(
       $view,
       $drequest,
       $show_blame,
       $show_color,
       $binary_uri);
     $content[] = $this->buildPropertyView($drequest);
 
     $follow  = $request->getStr('follow');
     if ($follow) {
       $notice = new AphrontErrorView();
       $notice->setSeverity(AphrontErrorView::SEVERITY_WARNING);
       $notice->setTitle(pht('Unable to Continue'));
       switch ($follow) {
         case 'first':
           $notice->appendChild(
             pht("Unable to continue tracing the history of this file because ".
             "this commit is the first commit in the repository."));
           break;
         case 'created':
           $notice->appendChild(
             pht("Unable to continue tracing the history of this file because ".
             "this commit created the file."));
           break;
       }
       $content[] = $notice;
     }
 
     $renamed = $request->getStr('renamed');
     if ($renamed) {
       $notice = new AphrontErrorView();
       $notice->setSeverity(AphrontErrorView::SEVERITY_NOTICE);
       $notice->setTitle(pht('File Renamed'));
       $notice->appendChild(
         pht("File history passes through a rename from '%s' to '%s'.",
           $drequest->getPath(), $renamed));
       $content[] = $notice;
     }
 
     $content[] = $corpus;
     $content[] = $this->buildOpenRevisions();
 
     $crumbs = $this->buildCrumbs(
       array(
         'branch' => true,
         'path'   => true,
         'view'   => 'browse',
       ));
 
     $basename = basename($this->getDiffusionRequest()->getPath());
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $content,
       ),
       array(
         'title' => $basename,
       ));
   }
 
   private function loadLintMessages() {
     $drequest = $this->getDiffusionRequest();
     $branch = $drequest->loadBranch();
 
     if (!$branch || !$branch->getLintCommit()) {
       return;
     }
 
     $this->lintCommit = $branch->getLintCommit();
 
     $conn = id(new PhabricatorRepository())->establishConnection('r');
 
     $where = '';
     if ($drequest->getLint()) {
       $where = qsprintf(
         $conn,
         'AND code = %s',
         $drequest->getLint());
     }
 
     $this->lintMessages = queryfx_all(
       $conn,
       'SELECT * FROM %T WHERE branchID = %d %Q AND path = %s',
       PhabricatorRepository::TABLE_LINTMESSAGE,
       $branch->getID(),
       $where,
       '/'.$drequest->getPath());
   }
 
   private function buildCorpus(
     $show_blame,
     $show_color,
     DiffusionFileContent $file_content,
     $needs_blame,
     DiffusionRequest $drequest,
     $path,
     $data) {
 
     if (!$show_color) {
       $style =
         "margin: 1em 2em; width: 90%; height: 80em; font-family: monospace";
       if (!$show_blame) {
         $corpus = phutil_tag(
           'textarea',
           array(
             'style' => $style,
           ),
           $file_content->getCorpus());
       } else {
         $text_list = $file_content->getTextList();
         $rev_list = $file_content->getRevList();
         $blame_dict = $file_content->getBlameDict();
 
         $rows = array();
         foreach ($text_list as $k => $line) {
           $rev = $rev_list[$k];
           $author = $blame_dict[$rev]['author'];
           $rows[] =
             sprintf("%-10s %-20s %s", substr($rev, 0, 7), $author, $line);
         }
 
         $corpus = phutil_tag(
           'textarea',
           array(
             'style' => $style,
           ),
           implode("\n", $rows));
       }
     } else {
       require_celerity_resource('syntax-highlighting-css');
       $text_list = $file_content->getTextList();
       $rev_list = $file_content->getRevList();
       $blame_dict = $file_content->getBlameDict();
 
       $text_list = implode("\n", $text_list);
       $text_list = PhabricatorSyntaxHighlighter::highlightWithFilename(
         $path,
         $text_list);
       $text_list = explode("\n", $text_list);
 
       $rows = $this->buildDisplayRows($text_list, $rev_list, $blame_dict,
         $needs_blame, $drequest, $show_blame, $show_color);
 
       $corpus_table = javelin_tag(
         'table',
         array(
           'class' => "diffusion-source remarkup-code PhabricatorMonospaced",
           'sigil' => 'phabricator-source',
         ),
         $rows);
 
       if ($this->getRequest()->isAjax()) {
         return $corpus_table;
       }
 
       $id = celerity_generate_unique_node_id();
 
       $projects = $drequest->loadArcanistProjects();
       $langs = array();
       foreach ($projects as $project) {
         $ls = $project->getSymbolIndexLanguages();
         if (!$ls) {
           continue;
         }
         $dep_projects = $project->getSymbolIndexProjects();
         $dep_projects[] = $project->getPHID();
         foreach ($ls as $lang) {
           if (!isset($langs[$lang])) {
             $langs[$lang] = array();
           }
           $langs[$lang] += $dep_projects + array($project);
         }
       }
 
       $lang = last(explode('.', $drequest->getPath()));
 
       if (isset($langs[$lang])) {
         Javelin::initBehavior(
           'repository-crossreference',
           array(
             'container' => $id,
             'lang' => $lang,
             'projects' => $langs[$lang],
           ));
       }
 
       $corpus = phutil_tag(
         'div',
         array(
           'style' => 'padding: 0 2em;',
           'id' => $id,
         ),
         $corpus_table);
 
       Javelin::initBehavior('load-blame', array('id' => $id));
     }
 
     return $corpus;
   }
 
   private function enrichActionView(
     PhabricatorActionListView $view,
     DiffusionRequest $drequest,
     $show_blame,
     $show_color,
     $binary_uri) {
 
     $viewer = $this->getRequest()->getUser();
     $base_uri = $this->getRequest()->getRequestURI();
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Show Last Change'))
         ->setHref(
           $drequest->generateURI(
             array(
               'action' => 'change',
             )))
         ->setIcon('new'));
 
     if ($show_blame) {
       $blame_text = pht('Disable Blame');
       $blame_icon = 'blame-grey';
       $blame_value = 0;
     } else {
       $blame_text = pht('Enable Blame');
       $blame_icon = 'blame';
       $blame_value = 1;
     }
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName($blame_text)
         ->setHref($base_uri->alter('blame', $blame_value))
         ->setIcon($blame_icon)
         ->setUser($viewer)
         ->setRenderAsForm(true));
 
 
     if ($show_color) {
       $highlight_text = pht('Disable Highlighting');
       $highlight_icon = 'highlight-grey';
       $highlight_value = 0;
     } else {
       $highlight_text = pht('Enable Highlighting');
       $highlight_icon = 'highlight';
       $highlight_value = 1;
     }
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName($highlight_text)
         ->setHref($base_uri->alter('color', $highlight_value))
         ->setIcon($highlight_icon)
         ->setUser($viewer)
         ->setRenderAsForm(true));
 
     $href = null;
     if ($this->getRequest()->getStr('lint') !== null) {
       $lint_text = pht('Hide %d Lint Message(s)', count($this->lintMessages));
       $href = $base_uri->alter('lint', null);
 
     } else if ($this->lintCommit === null) {
       $lint_text = pht('Lint not Available');
     } else {
       $lint_text = pht(
         'Show %d Lint Message(s)',
         count($this->lintMessages));
       $href = $this->getDiffusionRequest()->generateURI(array(
         'action' => 'browse',
         'commit' => $this->lintCommit,
       ))->alter('lint', '');
     }
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName($lint_text)
         ->setHref($href)
         ->setIcon('warning')
         ->setDisabled(!$href));
 
     if ($binary_uri) {
       $view->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Download Raw File'))
           ->setHref($binary_uri)
           ->setIcon('download'));
     } else {
       $view->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('View Raw File'))
           ->setHref($base_uri->alter('view', 'raw'))
           ->setIcon('file'));
     }
 
     $view->addAction($this->createEditAction());
 
     return $view;
   }
 
   private function createEditAction() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $drequest = $this->getDiffusionRequest();
 
     $repository = $drequest->getRepository();
     $path = $drequest->getPath();
     $line = nonempty((int)$drequest->getLine(), 1);
 
     $callsign = $repository->getCallsign();
     $editor_link = $user->loadEditorLink($path, $line, $callsign);
 
     $action = id(new PhabricatorActionView())
       ->setName(pht('Open in Editor'))
       ->setIcon('edit');
 
     $action->setHref($editor_link);
     $action->setDisabled(!$editor_link);
 
     return $action;
   }
 
   private function buildDisplayRows(
     array $text_list,
     array $rev_list,
     array $blame_dict,
     $needs_blame,
     DiffusionRequest $drequest,
     $show_blame,
     $show_color) {
 
     $handles = array();
     if ($blame_dict) {
       $epoch_list  = ipull(ifilter($blame_dict, 'epoch'), 'epoch');
       $epoch_min   = min($epoch_list);
       $epoch_max   = max($epoch_list);
       $epoch_range = ($epoch_max - $epoch_min) + 1;
 
       $author_phids = ipull(ifilter($blame_dict, 'authorPHID'), 'authorPHID');
       $handles = $this->loadViewerHandles($author_phids);
     }
 
     $line_arr = array();
     $line_str = $drequest->getLine();
     $ranges = explode(',', $line_str);
     foreach ($ranges as $range) {
       if (strpos($range, '-') !== false) {
         list($min, $max) = explode('-', $range, 2);
         $line_arr[] = array(
           'min' => min($min, $max),
           'max' => max($min, $max),
         );
       } else if (strlen($range)) {
         $line_arr[] = array(
           'min' => $range,
           'max' => $range,
         );
       }
     }
 
     $display = array();
 
     $line_number = 1;
     $last_rev = null;
     $color = null;
     foreach ($text_list as $k => $line) {
       $display_line = array(
         'epoch'       => null,
         'commit'      => null,
         'author'      => null,
         'target'      => null,
         'highlighted' => null,
         'line'        => $line_number,
         'data'        => $line,
       );
 
       if ($show_blame) {
         // If the line's rev is same as the line above, show empty content
         // with same color; otherwise generate blame info. The newer a change
         // is, the more saturated the color.
 
         $rev = idx($rev_list, $k, $last_rev);
 
         if ($last_rev == $rev) {
           $display_line['color'] = $color;
         } else {
           $blame = $blame_dict[$rev];
 
           if (!isset($blame['epoch'])) {
             $color = '#ffd'; // Render as warning.
           } else {
             $color_ratio = ($blame['epoch'] - $epoch_min) / $epoch_range;
             $color_value = 0xE6 * (1.0 - $color_ratio);
             $color = sprintf(
               '#%02x%02x%02x',
               $color_value,
               0xF6,
               $color_value);
           }
 
           $display_line['epoch'] = idx($blame, 'epoch');
           $display_line['color'] = $color;
           $display_line['commit'] = $rev;
 
           $author_phid = idx($blame, 'authorPHID');
           if ($author_phid && $handles[$author_phid]) {
             $author_link = $handles[$author_phid]->renderLink();
           } else {
             $author_link = phutil_tag(
               'span',
               array(
               ),
               $blame['author']);
           }
           $display_line['author'] = $author_link;
 
           $last_rev = $rev;
         }
       }
 
       if ($line_arr) {
         if ($line_number == $line_arr[0]['min']) {
           $display_line['target'] = true;
         }
         foreach ($line_arr as $range) {
           if ($line_number >= $range['min'] &&
               $line_number <= $range['max']) {
             $display_line['highlighted'] = true;
           }
         }
       }
 
       $display[] = $display_line;
       ++$line_number;
     }
 
     $commits = array_filter(ipull($display, 'commit'));
     if ($commits) {
       $commits = id(new PhabricatorAuditCommitQuery())
         ->withIdentifiers($drequest->getRepository()->getID(), $commits)
         ->needCommitData(true)
         ->execute();
       $commits = mpull($commits, null, 'getCommitIdentifier');
     }
 
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $revision_ids = id(new DifferentialRevision())
       ->loadIDsByCommitPHIDs(mpull($commits, 'getPHID'));
     $revisions = array();
     if ($revision_ids) {
       $revisions = id(new DifferentialRevisionQuery())
         ->setViewer($user)
         ->withIDs($revision_ids)
         ->execute();
     }
 
     Javelin::initBehavior('phabricator-oncopy', array());
 
     $engine = null;
     $inlines = array();
     if ($this->getRequest()->getStr('lint') !== null && $this->lintMessages) {
       $engine = new PhabricatorMarkupEngine();
       $engine->setViewer($user);
 
       foreach ($this->lintMessages as $message) {
         $inline = id(new PhabricatorAuditInlineComment())
           ->setID($message['id'])
           ->setSyntheticAuthor(
             ArcanistLintSeverity::getStringForSeverity($message['severity']).
             ' '.$message['code'].' ('.$message['name'].')')
           ->setLineNumber($message['line'])
           ->setContent($message['description']);
         $inlines[$message['line']][] = $inline;
 
         $engine->addObject(
           $inline,
           PhabricatorInlineCommentInterface::MARKUP_FIELD_BODY);
       }
 
       $engine->process();
       require_celerity_resource('differential-changeset-view-css');
     }
 
     $rows = $this->renderInlines(
       idx($inlines, 0, array()),
       ($show_blame),
       $engine);
 
     foreach ($display as $line) {
 
       $line_href = $drequest->generateURI(
         array(
           'action'  => 'browse',
           'line'    => $line['line'],
           'stable'  => true,
         ));
 
       $blame = array();
       $style = null;
       if (array_key_exists('color', $line)) {
         if ($line['color']) {
           $style = 'background: '.$line['color'].';';
         }
 
         $before_link = null;
         $commit_link = null;
         $revision_link = null;
         if (idx($line, 'commit')) {
           $commit = $line['commit'];
 
           $summary = 'Unknown';
           if (idx($commits, $commit)) {
             $summary = $commits[$commit]->getCommitData()->getSummary();
           }
 
           $tooltip = phabricator_date(
             $line['epoch'],
             $user)." \xC2\xB7 ".$summary;
 
           Javelin::initBehavior('phabricator-tooltips', array());
           require_celerity_resource('aphront-tooltip-css');
 
           $commit_link = javelin_tag(
             'a',
             array(
               'href' => $drequest->generateURI(
                 array(
                   'action' => 'commit',
                   'commit' => $line['commit'],
                 )),
               'sigil' => 'has-tooltip',
               'meta'  => array(
                 'tip'   => $tooltip,
                 'align' => 'E',
                 'size'  => 600,
               ),
             ),
             phutil_utf8_shorten($line['commit'], 9, ''));
 
           $revision_id = null;
           if (idx($commits, $commit)) {
             $revision_id = idx($revision_ids, $commits[$commit]->getPHID());
           }
 
           if ($revision_id) {
             $revision = idx($revisions, $revision_id);
             if (!$revision) {
               $tooltip = pht('(Invalid revision)');
             } else {
               $tooltip =
                 phabricator_date($revision->getDateModified(), $user).
                 " \xC2\xB7 ".
                 $revision->getTitle();
             }
             $revision_link = javelin_tag(
               'a',
               array(
                 'href' => '/D'.$revision_id,
                 'sigil' => 'has-tooltip',
                 'meta'  => array(
                   'tip'   => $tooltip,
                   'align' => 'E',
                   'size'  => 600,
                 ),
               ),
               'D'.$revision_id);
           }
 
           $uri = $line_href->alter('before', $commit);
           $before_link = javelin_tag(
             'a',
             array(
               'href'  => $uri->setQueryParam('view', 'blame'),
               'sigil' => 'has-tooltip',
               'meta'  => array(
                 'tip'     => pht('Skip Past This Commit'),
                 'align'   => 'E',
                 'size'    => 300,
               ),
             ),
             "\xC2\xAB");
         }
 
         $blame[] = phutil_tag(
           'th',
           array(
             'class' => 'diffusion-blame-link',
             'style' => $style,
           ),
           $before_link);
 
         $blame[] = phutil_tag(
           'th',
           array(
             'class' => 'diffusion-rev-link',
             'style' => $style,
           ),
           $commit_link);
 
         $blame[] = phutil_tag(
           'th',
           array(
             'class' => 'diffusion-rev-link',
             'style' => $style,
           ),
           $revision_link);
 
         $blame[] = phutil_tag(
           'th',
           array(
             'class' => 'diffusion-author-link',
             'style' => $style,
           ),
           idx($line, 'author'));
       }
 
       $line_link = phutil_tag(
         'a',
         array(
           'href' => $line_href,
         ),
         $line['line']);
 
       $blame[] = javelin_tag(
         'th',
         array(
           'class' => 'diffusion-line-link',
           'sigil' => 'phabricator-source-line',
           'style' => $style,
         ),
         $line_link);
 
       Javelin::initBehavior('phabricator-line-linker');
 
       if ($line['target']) {
         Javelin::initBehavior(
           'diffusion-jump-to',
           array(
             'target' => 'scroll_target',
           ));
         $anchor_text = phutil_tag(
           'a',
           array(
             'id' => 'scroll_target',
           ),
           '');
       } else {
         $anchor_text = null;
       }
 
       $blame[] = phutil_tag(
         'td',
         array(
         ),
         array(
           $anchor_text,
 
           // NOTE: See phabricator-oncopy behavior.
           "\xE2\x80\x8B",
 
           // TODO: [HTML] Not ideal.
           phutil_safe_html($line['data']),
         ));
 
       $rows[] = phutil_tag(
         'tr',
         array(
           'class' => ($line['highlighted'] ?
                       'phabricator-source-highlight' :
                       null),
         ),
         $blame);
 
       $rows = array_merge($rows, $this->renderInlines(
         idx($inlines, $line['line'], array()),
         ($show_blame),
         $engine));
     }
 
     return $rows;
   }
 
   private function renderInlines(array $inlines, $needs_blame, $engine) {
     $rows = array();
     foreach ($inlines as $inline) {
       $inline_view = id(new DifferentialInlineCommentView())
         ->setMarkupEngine($engine)
         ->setInlineComment($inline)
         ->render();
       $row = array_fill(0, ($needs_blame ? 5 : 1), phutil_tag('th'));
       $row[] = phutil_tag('td', array(), $inline_view);
       $rows[] = phutil_tag('tr', array('class' => 'inline'), $row);
     }
     return $rows;
   }
 
   private function loadFileForData($path, $data) {
     return PhabricatorFile::buildFromFileDataOrHash(
       $data,
       array(
         'name' => basename($path),
         'ttl' => time() + 60 * 60 * 24,
       ));
   }
 
   private function buildRawResponse($path, $data) {
     $file = $this->loadFileForData($path, $data);
     return id(new AphrontRedirectResponse())->setURI($file->getBestURI());
   }
 
   private function buildImageCorpus($file_uri) {
     $properties = new PhabricatorPropertyListView();
 
     $properties->addProperty(
       pht('Image'),
       phutil_tag(
         'img',
         array(
           'src' => $file_uri,
         )));
 
     return $properties;
   }
 
   private function buildBinaryCorpus($file_uri, $data) {
     $properties = new PhabricatorPropertyListView();
 
     $size = strlen($data);
     $properties->addTextContent(
       pht(
         'This is a binary file. It is %s byte(s) in length.',
         new PhutilNumber($size)));
 
     return $properties;
   }
 
   private function buildBeforeResponse($before) {
     $request = $this->getRequest();
     $drequest = $this->getDiffusionRequest();
 
     // NOTE: We need to get the grandparent so we can capture filename changes
     // in the parent.
 
     $parent = $this->loadParentRevisionOf($before);
     $old_filename = null;
     $was_created = false;
     if ($parent) {
       $grandparent = $this->loadParentRevisionOf(
         $parent->getCommitIdentifier());
 
       if ($grandparent) {
         $rename_query = new DiffusionRenameHistoryQuery();
         $rename_query->setRequest($drequest);
         $rename_query->setOldCommit($grandparent->getCommitIdentifier());
         $rename_query->setViewer($request->getUser());
         $old_filename = $rename_query->loadOldFilename();
         $was_created = $rename_query->getWasCreated();
       }
     }
 
     $follow = null;
     if ($was_created) {
       // If the file was created in history, that means older commits won't
       // have it. Since we know it existed at 'before', it must have been
       // created then; jump there.
       $target_commit = $before;
       $follow = 'created';
     } else if ($parent) {
       // If we found a parent, jump to it. This is the normal case.
       $target_commit = $parent->getCommitIdentifier();
     } else {
       // If there's no parent, this was probably created in the initial commit?
       // And the "was_created" check will fail because we can't identify the
       // grandparent. Keep the user at 'before'.
       $target_commit = $before;
       $follow = 'first';
     }
 
     $path = $drequest->getPath();
     $renamed = null;
     if ($old_filename !== null &&
         $old_filename !== '/'.$path) {
       $renamed = $path;
       $path = $old_filename;
     }
 
     $line = null;
     // If there's a follow error, drop the line so the user sees the message.
     if (!$follow) {
       $line = $this->getBeforeLineNumber($target_commit);
     }
 
     $before_uri = $drequest->generateURI(
       array(
         'action'    => 'browse',
         'commit'    => $target_commit,
         'line'      => $line,
         'path'      => $path,
       ));
 
     $before_uri->setQueryParams($request->getRequestURI()->getQueryParams());
     $before_uri = $before_uri->alter('before', null);
     $before_uri = $before_uri->alter('renamed', $renamed);
     $before_uri = $before_uri->alter('follow', $follow);
 
     return id(new AphrontRedirectResponse())->setURI($before_uri);
   }
 
   private function getBeforeLineNumber($target_commit) {
     $drequest = $this->getDiffusionRequest();
 
     $line = $drequest->getLine();
     if (!$line) {
       return null;
     }
 
     $raw_diff = $this->callConduitWithDiffusionRequest(
       'diffusion.rawdiffquery',
       array(
         'commit' => $drequest->getCommit(),
         'path' => $drequest->getPath(),
         'againstCommit' => $target_commit));
     $old_line = 0;
     $new_line = 0;
 
     foreach (explode("\n", $raw_diff) as $text) {
       if ($text[0] == '-' || $text[0] == ' ') {
         $old_line++;
       }
       if ($text[0] == '+' || $text[0] == ' ') {
         $new_line++;
       }
       if ($new_line == $line) {
         return $old_line;
       }
     }
 
     // We didn't find the target line.
     return $line;
   }
 
   private function loadParentRevisionOf($commit) {
     $drequest = $this->getDiffusionRequest();
     $user = $this->getRequest()->getUser();
 
     $before_req = DiffusionRequest::newFromDictionary(
       array(
         'user' => $user,
         'repository' => $drequest->getRepository(),
         'commit'     => $commit,
       ));
 
     $parents = DiffusionQuery::callConduitWithDiffusionRequest(
       $user,
       $before_req,
       'diffusion.commitparentsquery',
       array(
         'commit' => $commit));
 
     return head($parents);
   }
 
 }
diff --git a/src/applications/diffusion/controller/DiffusionBrowseSearchController.php b/src/applications/diffusion/controller/DiffusionBrowseSearchController.php
index 36b9e16d64..0ca2636b85 100644
--- a/src/applications/diffusion/controller/DiffusionBrowseSearchController.php
+++ b/src/applications/diffusion/controller/DiffusionBrowseSearchController.php
@@ -1,135 +1,135 @@
 <?php
 
 final class DiffusionBrowseSearchController extends DiffusionBrowseController {
 
   public function processRequest() {
     $drequest = $this->diffusionRequest;
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($this->buildHeaderView($drequest))
-      ->addContent($this->buildActionView($drequest))
-      ->addContent($this->buildPropertyView($drequest));
+      ->setActionList($this->buildActionView($drequest))
+      ->setPropertyList($this->buildPropertyView($drequest));
 
     $content = array();
 
     $content[] = $object_box;
     $content[] = $this->renderSearchForm($collapsed = false);
     $content[] = $this->renderSearchResults();
 
     $crumbs = $this->buildCrumbs(
       array(
         'branch' => true,
         'path'   => true,
         'view'   => 'browse',
       ));
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $content,
       ),
       array(
         'device' => true,
         'title' => array(
           nonempty(basename($drequest->getPath()), '/'),
           $drequest->getRepository()->getCallsign().' Repository',
         ),
       ));
   }
 
   private function renderSearchResults() {
     $drequest = $this->getDiffusionRequest();
     $repository = $drequest->getRepository();
     $results = array();
     $no_data = pht('No results found.');
 
     $limit = 100;
     $page = $this->getRequest()->getInt('page', 0);
     $pager = new AphrontPagerView();
     $pager->setPageSize($limit);
     $pager->setOffset($page);
     $pager->setURI($this->getRequest()->getRequestURI(), 'page');
 
     try {
 
       $results = $this->callConduitWithDiffusionRequest(
         'diffusion.searchquery',
         array(
           'grep' => $this->getRequest()->getStr('grep'),
           'stableCommitName' => $drequest->getStableCommitName(),
           'path' => $drequest->getPath(),
           'limit' => $limit + 1,
           'offset' => $page));
 
     } catch (ConduitException $ex) {
       $err = $ex->getErrorDescription();
       if ($err != '') {
         return id(new AphrontErrorView())
           ->setTitle(pht('Search Error'))
           ->appendChild($err);
       }
     }
 
     $results = $pager->sliceResults($results);
 
     require_celerity_resource('syntax-highlighting-css');
 
     // NOTE: This can be wrong because we may find the string inside the
     // comment. But it's correct in most cases and highlighting the whole file
     // would be too expensive.
     $futures = array();
     $engine = PhabricatorSyntaxHighlighter::newEngine();
     foreach ($results as $result) {
       list($path, $line, $string) = $result;
       $futures["{$path}:{$line}"] = $engine->getHighlightFuture(
         $engine->getLanguageFromFilename($path),
         ltrim($string));
     }
 
     try {
       Futures($futures)->limit(8)->resolveAll();
     } catch (PhutilSyntaxHighlighterException $ex) {
     }
 
     $rows = array();
     foreach ($results as $result) {
       list($path, $line, $string) = $result;
 
       $href = $drequest->generateURI(array(
         'action' => 'browse',
         'path' => $path,
         'line' => $line,
       ));
 
       try {
         $string = $futures["{$path}:{$line}"]->resolve();
       } catch (PhutilSyntaxHighlighterException $ex) {
       }
 
       $string = phutil_tag(
         'pre',
         array('class' => 'PhabricatorMonospaced'),
         $string);
 
       $path = Filesystem::readablePath($path, $drequest->getPath());
 
       $rows[] = array(
         phutil_tag('a', array('href' => $href), $path),
         $line,
         $string,
       );
     }
 
     $table = id(new AphrontTableView($rows))
       ->setClassName('remarkup-code')
       ->setHeaders(array(pht('Path'), pht('Line'), pht('String')))
       ->setColumnClasses(array('', 'n', 'wide'))
       ->setNoDataString($no_data);
 
     return id(new AphrontPanelView())
       ->setNoBackground(true)
       ->appendChild($table)
       ->appendChild($pager);
   }
 
 }
diff --git a/src/applications/diffusion/controller/DiffusionChangeController.php b/src/applications/diffusion/controller/DiffusionChangeController.php
index 4724056362..b6fa8599f2 100644
--- a/src/applications/diffusion/controller/DiffusionChangeController.php
+++ b/src/applications/diffusion/controller/DiffusionChangeController.php
@@ -1,157 +1,157 @@
 <?php
 
 final class DiffusionChangeController extends DiffusionController {
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function processRequest() {
     $drequest = $this->diffusionRequest;
     $viewer = $this->getRequest()->getUser();
 
     $content = array();
 
     $data = $this->callConduitWithDiffusionRequest(
       'diffusion.diffquery',
       array(
         'commit' => $drequest->getCommit(),
         'path' => $drequest->getPath(),
       ));
     $drequest->setCommit($data['effectiveCommit']);
     $raw_changes = ArcanistDiffChange::newFromConduit($data['changes']);
     $diff = DifferentialDiff::newFromRawChanges($raw_changes);
     $changesets = $diff->getChangesets();
     $changeset = reset($changesets);
 
     if (!$changeset) {
       // TODO: Refine this.
       return new Aphront404Response();
     }
 
     $repository = $drequest->getRepository();
     $callsign = $repository->getCallsign();
     $commit = $drequest->getRawCommit();
     $changesets = array(
       0 => $changeset,
     );
 
     $changeset_view = new DifferentialChangesetListView();
     $changeset_view->setChangesets($changesets);
     $changeset_view->setVisibleChangesets($changesets);
     $changeset_view->setRenderingReferences(
       array(
         0 => $drequest->generateURI(array('action' => 'rendering-ref'))
       ));
 
     $raw_params = array(
       'action' => 'browse',
       'params' => array(
         'view' => 'raw',
       ),
     );
 
     $right_uri = $drequest->generateURI($raw_params);
     $raw_params['params']['before'] = $drequest->getRawCommit();
     $left_uri = $drequest->generateURI($raw_params);
     $changeset_view->setRawFileURIs($left_uri, $right_uri);
 
     $changeset_view->setRenderURI('/diffusion/'.$callsign.'/diff/');
     $changeset_view->setWhitespace(
       DifferentialChangesetParser::WHITESPACE_SHOW_ALL);
     $changeset_view->setUser($this->getRequest()->getUser());
 
     // TODO: This is pretty awkward, unify the CSS between Diffusion and
     // Differential better.
     require_celerity_resource('differential-core-view-css');
     $content[] = $changeset_view->render();
 
     $crumbs = $this->buildCrumbs(
       array(
         'branch' => true,
         'path'   => true,
         'view'   => 'change',
       ));
 
     $links = $this->renderPathLinks($drequest, $mode = 'browse');
 
     $header = id(new PHUIHeaderView())
       ->setHeader($links)
       ->setUser($viewer)
       ->setPolicyObject($drequest->getRepository());
     $actions = $this->buildActionView($drequest);
     $properties = $this->buildPropertyView($drequest);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $content,
       ),
       array(
         'title' => pht('Change'),
       ));
   }
 
   private function buildActionView(DiffusionRequest $drequest) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorActionListView())
       ->setUser($viewer);
 
     $history_uri = $drequest->generateURI(
       array(
         'action' => 'history',
       ));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('View History'))
         ->setHref($history_uri)
         ->setIcon('history'));
 
     $browse_uri = $drequest->generateURI(
       array(
         'action' => 'browse',
       ));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Browse Content'))
         ->setHref($browse_uri)
         ->setIcon('file'));
 
     return $view;
   }
 
   protected function buildPropertyView(DiffusionRequest $drequest) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorPropertyListView())
       ->setUser($viewer);
 
     $stable_commit = $drequest->getStableCommitName();
     $callsign = $drequest->getRepository()->getCallsign();
 
     $view->addProperty(
       pht('Commit'),
       phutil_tag(
         'a',
         array(
           'href' => $drequest->generateURI(
             array(
               'action' => 'commit',
               'commit' => $stable_commit,
             )),
         ),
         $drequest->getRepository()->formatCommitName($stable_commit)));
 
     return $view;
   }
 
 }
diff --git a/src/applications/diffusion/controller/DiffusionCommitController.php b/src/applications/diffusion/controller/DiffusionCommitController.php
index a56b6680c2..e88e321566 100644
--- a/src/applications/diffusion/controller/DiffusionCommitController.php
+++ b/src/applications/diffusion/controller/DiffusionCommitController.php
@@ -1,1060 +1,1060 @@
 <?php
 
 final class DiffusionCommitController extends DiffusionController {
 
   const CHANGES_LIMIT = 100;
 
   private $auditAuthorityPHIDs;
   private $highlightedAudits;
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function willProcessRequest(array $data) {
     // This controller doesn't use blob/path stuff, just pass the dictionary
     // in directly instead of using the AphrontRequest parsing mechanism.
     $data['user'] = $this->getRequest()->getUser();
     $drequest = DiffusionRequest::newFromDictionary($data);
     $this->diffusionRequest = $drequest;
   }
 
   public function processRequest() {
     $drequest = $this->getDiffusionRequest();
     $request = $this->getRequest();
     $user = $request->getUser();
 
     if ($request->getStr('diff')) {
       return $this->buildRawDiffResponse($drequest);
     }
 
     $callsign = $drequest->getRepository()->getCallsign();
 
     $content = array();
     $repository = $drequest->getRepository();
     $commit = $drequest->loadCommit();
 
     $crumbs = $this->buildCrumbs(array(
       'commit' => true,
     ));
 
     if (!$commit) {
       $exists = $this->callConduitWithDiffusionRequest(
         'diffusion.existsquery',
         array('commit' => $drequest->getCommit()));
       if (!$exists) {
         return new Aphront404Response();
       }
 
       $error = id(new AphrontErrorView())
         ->setTitle(pht('Commit Still Parsing'))
         ->appendChild(
           pht(
             'Failed to load the commit because the commit has not been '.
             'parsed yet.'));
 
       return $this->buildApplicationPage(
         array(
           $crumbs,
           $error,
         ),
         array(
           'title' => pht('Commit Still Parsing'),
         ));
     }
 
     $commit_data = $drequest->loadCommitData();
     $commit->attachCommitData($commit_data);
 
     $top_anchor = id(new PhabricatorAnchorView())
       ->setAnchorName('top')
       ->setNavigationMarker(true);
 
     $audit_requests = id(new PhabricatorAuditQuery())
       ->withCommitPHIDs(array($commit->getPHID()))
       ->execute();
     $this->auditAuthorityPHIDs =
       PhabricatorAuditCommentEditor::loadAuditPHIDsForUser($user);
 
 
     $is_foreign = $commit_data->getCommitDetail('foreign-svn-stub');
     $changesets = null;
     if ($is_foreign) {
       $subpath = $commit_data->getCommitDetail('svn-subpath');
 
       $error_panel = new AphrontErrorView();
       $error_panel->setTitle(pht('Commit Not Tracked'));
       $error_panel->setSeverity(AphrontErrorView::SEVERITY_WARNING);
       $error_panel->appendChild(
         pht("This Diffusion repository is configured to track only one ".
         "subdirectory of the entire Subversion repository, and this commit ".
         "didn't affect the tracked subdirectory ('%s'), so no ".
         "information is available.", $subpath));
       $content[] = $error_panel;
       $content[] = $top_anchor;
     } else {
       $engine = PhabricatorMarkupEngine::newDifferentialMarkupEngine();
       $engine->setConfig('viewer', $user);
 
       require_celerity_resource('diffusion-commit-view-css');
       require_celerity_resource('phabricator-remarkup-css');
 
       $parents = $this->callConduitWithDiffusionRequest(
         'diffusion.commitparentsquery',
         array('commit' => $drequest->getCommit()));
 
       $headsup_view = id(new PHUIHeaderView())
         ->setHeader(nonempty($commit->getSummary(), pht('Commit Detail')));
 
       $headsup_actions = $this->renderHeadsupActionList($commit, $repository);
 
       $commit_properties = $this->loadCommitProperties(
         $commit,
         $commit_data,
         $parents,
         $audit_requests);
       $property_list = id(new PhabricatorPropertyListView())
         ->setHasKeyboardShortcuts(true)
         ->setUser($user)
         ->setObject($commit);
       foreach ($commit_properties as $key => $value) {
         $property_list->addProperty($key, $value);
       }
 
       $message = $commit_data->getCommitMessage();
 
       $revision = $commit->getCommitIdentifier();
       $message = $this->linkBugtraq($message);
 
       $message = $engine->markupText($message);
 
       $property_list->invokeWillRenderEvent();
       $property_list->addTextContent(
         phutil_tag(
           'div',
           array(
             'class' => 'diffusion-commit-message phabricator-remarkup',
           ),
           $message));
       $content[] = $top_anchor;
 
       $object_box = id(new PHUIObjectBoxView())
         ->setHeader($headsup_view)
-        ->addContent($headsup_actions)
-        ->addContent($property_list);
+        ->setActionList($headsup_actions)
+        ->setPropertyList($property_list);
 
       $content[] = $object_box;
     }
 
     $content[] = $this->buildComments($commit);
 
     $hard_limit = 1000;
 
     $change_query = DiffusionPathChangeQuery::newFromDiffusionRequest(
       $drequest);
     $change_query->setLimit($hard_limit + 1);
     $changes = $change_query->loadChanges();
 
     $was_limited = (count($changes) > $hard_limit);
     if ($was_limited) {
       $changes = array_slice($changes, 0, $hard_limit);
     }
 
     $content[] = $this->buildMergesTable($commit);
 
     // TODO: This is silly, but the logic to figure out which audits are
     // highlighted currently lives in PhabricatorAuditListView. Refactor this
     // to be less goofy.
     $highlighted_audits = id(new PhabricatorAuditListView())
       ->setAudits($audit_requests)
       ->setAuthorityPHIDs($this->auditAuthorityPHIDs)
       ->setUser($user)
       ->setCommits(array($commit->getPHID() => $commit))
       ->getHighlightedAudits();
 
     $owners_paths = array();
     if ($highlighted_audits) {
       $packages = id(new PhabricatorOwnersPackage())->loadAllWhere(
         'phid IN (%Ls)',
         mpull($highlighted_audits, 'getAuditorPHID'));
       if ($packages) {
         $owners_paths = id(new PhabricatorOwnersPath())->loadAllWhere(
           'repositoryPHID = %s AND packageID IN (%Ld)',
           $repository->getPHID(),
           mpull($packages, 'getID'));
       }
     }
 
     $change_table = new DiffusionCommitChangeTableView();
     $change_table->setDiffusionRequest($drequest);
     $change_table->setPathChanges($changes);
     $change_table->setOwnersPaths($owners_paths);
 
     $count = count($changes);
 
     $bad_commit = null;
     if ($count == 0) {
       $bad_commit = queryfx_one(
         id(new PhabricatorRepository())->establishConnection('r'),
         'SELECT * FROM %T WHERE fullCommitName = %s',
         PhabricatorRepository::TABLE_BADCOMMIT,
         'r'.$callsign.$commit->getCommitIdentifier());
     }
 
     if ($bad_commit) {
       $error_panel = new AphrontErrorView();
       $error_panel->setTitle(pht('Bad Commit'));
       $error_panel->appendChild($bad_commit['description']);
 
       $content[] = $error_panel;
     } else if ($is_foreign) {
       // Don't render anything else.
     } else if (!count($changes)) {
       $no_changes = new AphrontErrorView();
       $no_changes->setSeverity(AphrontErrorView::SEVERITY_WARNING);
       $no_changes->setTitle(pht('Not Yet Parsed'));
       // TODO: This can also happen with weird SVN changes that don't do
       // anything (or only alter properties?), although the real no-changes case
       // is extremely rare and might be impossible to produce organically. We
       // should probably write some kind of "Nothing Happened!" change into the
       // DB once we parse these changes so we can distinguish between
       // "not parsed yet" and "no changes".
       $no_changes->appendChild(
         pht("This commit hasn't been fully parsed yet (or doesn't affect any ".
         "paths)."));
       $content[] = $no_changes;
     } else if ($was_limited) {
       $huge_commit = new AphrontErrorView();
       $huge_commit->setSeverity(AphrontErrorView::SEVERITY_WARNING);
       $huge_commit->setTitle(pht('Enormous Commit'));
       $huge_commit->appendChild(
         pht(
           'This commit is enormous, and affects more than %d files. '.
           'Changes are not shown.',
           $hard_limit));
       $content[] = $huge_commit;
     } else {
       // The user has clicked "Show All Changes", and we should show all the
       // changes inline even if there are more than the soft limit.
       $show_all_details = $request->getBool('show_all');
 
       $change_panel = new AphrontPanelView();
       $change_panel->setHeader("Changes (".number_format($count).")");
       $change_panel->setID('toc');
       if ($count > self::CHANGES_LIMIT && !$show_all_details) {
         $show_all_button = phutil_tag(
           'a',
           array(
             'class'   => 'button green',
             'href'    => '?show_all=true',
           ),
           pht('Show All Changes'));
         $warning_view = id(new AphrontErrorView())
           ->setSeverity(AphrontErrorView::SEVERITY_WARNING)
           ->setTitle('Very Large Commit')
           ->appendChild(phutil_tag(
             'p',
             array(),
             pht("This commit is very large. Load each file individually.")));
 
         $change_panel->appendChild($warning_view);
         $change_panel->addButton($show_all_button);
       }
 
       $change_panel->appendChild($change_table);
       $change_panel->setNoBackground();
 
       $content[] = $change_panel;
 
       $changesets = DiffusionPathChange::convertToDifferentialChangesets(
         $changes);
 
       $vcs = $repository->getVersionControlSystem();
       switch ($vcs) {
         case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
           $vcs_supports_directory_changes = true;
           break;
         case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
         case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
           $vcs_supports_directory_changes = false;
           break;
         default:
           throw new Exception("Unknown VCS.");
       }
 
       $references = array();
       foreach ($changesets as $key => $changeset) {
         $file_type = $changeset->getFileType();
         if ($file_type == DifferentialChangeType::FILE_DIRECTORY) {
           if (!$vcs_supports_directory_changes) {
             unset($changesets[$key]);
             continue;
           }
         }
 
         $references[$key] = $drequest->generateURI(
           array(
             'action' => 'rendering-ref',
             'path'   => $changeset->getFilename(),
           ));
       }
 
       // TODO: Some parts of the views still rely on properties of the
       // DifferentialChangeset. Make the objects ephemeral to make sure we don't
       // accidentally save them, and then set their ID to the appropriate ID for
       // this application (the path IDs).
       $path_ids = array_flip(mpull($changes, 'getPath'));
       foreach ($changesets as $changeset) {
         $changeset->makeEphemeral();
         $changeset->setID($path_ids[$changeset->getFilename()]);
       }
 
       if ($count <= self::CHANGES_LIMIT || $show_all_details) {
         $visible_changesets = $changesets;
       } else {
         $visible_changesets = array();
         $inlines = id(new PhabricatorAuditInlineComment())->loadAllWhere(
           'commitPHID = %s AND (auditCommentID IS NOT NULL OR authorPHID = %s)',
           $commit->getPHID(),
           $user->getPHID());
         $path_ids = mpull($inlines, null, 'getPathID');
         foreach ($changesets as $key => $changeset) {
           if (array_key_exists($changeset->getID(), $path_ids)) {
             $visible_changesets[$key] = $changeset;
           }
         }
       }
 
       $change_list_title = DiffusionView::nameCommit(
         $repository,
         $commit->getCommitIdentifier());
       $change_list = new DifferentialChangesetListView();
       $change_list->setTitle($change_list_title);
       $change_list->setChangesets($changesets);
       $change_list->setVisibleChangesets($visible_changesets);
       $change_list->setRenderingReferences($references);
       $change_list->setRenderURI('/diffusion/'.$callsign.'/diff/');
       $change_list->setRepository($repository);
       $change_list->setUser($user);
       // pick the first branch for "Browse in Diffusion" View Option
       $branches     = $commit_data->getCommitDetail('seenOnBranches', array());
       $first_branch = reset($branches);
       $change_list->setBranch($first_branch);
 
       $change_list->setStandaloneURI(
         '/diffusion/'.$callsign.'/diff/');
       $change_list->setRawFileURIs(
         // TODO: Implement this, somewhat tricky if there's an octopus merge
         // or whatever?
         null,
         '/diffusion/'.$callsign.'/diff/?view=r');
 
       $change_list->setInlineCommentControllerURI(
         '/diffusion/inline/edit/'.phutil_escape_uri($commit->getPHID()).'/');
 
       $change_references = array();
       foreach ($changesets as $key => $changeset) {
         $change_references[$changeset->getID()] = $references[$key];
       }
       $change_table->setRenderingReferences($change_references);
 
       $content[] = $change_list->render();
     }
 
     $content[] = $this->renderAddCommentPanel($commit, $audit_requests);
 
     $commit_id = 'r'.$callsign.$commit->getCommitIdentifier();
     $short_name = DiffusionView::nameCommit(
       $repository,
       $commit->getCommitIdentifier());
 
     $prefs = $user->loadPreferences();
     $pref_filetree = PhabricatorUserPreferences::PREFERENCE_DIFF_FILETREE;
     $pref_collapse = PhabricatorUserPreferences::PREFERENCE_NAV_COLLAPSED;
     $show_filetree = $prefs->getPreference($pref_filetree);
     $collapsed = $prefs->getPreference($pref_collapse);
 
     if ($changesets && $show_filetree) {
       $nav = id(new DifferentialChangesetFileTreeSideNavBuilder())
         ->setAnchorName('top')
         ->setTitle($short_name)
         ->setBaseURI(new PhutilURI('/'.$commit_id))
         ->build($changesets)
         ->setCrumbs($crumbs)
         ->setCollapsed((bool)$collapsed)
         ->appendChild($content);
       $content = $nav;
     } else {
       $content = array($crumbs, $content);
     }
 
     return $this->buildApplicationPage(
       $content,
       array(
         'title' => $commit_id,
         'pageObjects' => array($commit->getPHID()),
       ));
   }
 
   private function loadCommitProperties(
     PhabricatorRepositoryCommit $commit,
     PhabricatorRepositoryCommitData $data,
     array $parents,
     array $audit_requests) {
 
     assert_instances_of($parents, 'PhabricatorRepositoryCommit');
     $user = $this->getRequest()->getUser();
     $commit_phid = $commit->getPHID();
 
     $edge_query = id(new PhabricatorEdgeQuery())
       ->withSourcePHIDs(array($commit_phid))
       ->withEdgeTypes(array(
         PhabricatorEdgeConfig::TYPE_COMMIT_HAS_TASK,
         PhabricatorEdgeConfig::TYPE_COMMIT_HAS_PROJECT,
         PhabricatorEdgeConfig::TYPE_COMMIT_HAS_DREV,
       ));
 
     $edges = $edge_query->execute();
 
     $task_phids = array_keys(
       $edges[$commit_phid][PhabricatorEdgeConfig::TYPE_COMMIT_HAS_TASK]);
     $proj_phids = array_keys(
       $edges[$commit_phid][PhabricatorEdgeConfig::TYPE_COMMIT_HAS_PROJECT]);
     $revision_phid = key(
       $edges[$commit_phid][PhabricatorEdgeConfig::TYPE_COMMIT_HAS_DREV]);
 
     $phids = $edge_query->getDestinationPHIDs(array($commit_phid));
 
     if ($data->getCommitDetail('authorPHID')) {
       $phids[] = $data->getCommitDetail('authorPHID');
     }
     if ($data->getCommitDetail('reviewerPHID')) {
       $phids[] = $data->getCommitDetail('reviewerPHID');
     }
     if ($data->getCommitDetail('committerPHID')) {
       $phids[] = $data->getCommitDetail('committerPHID');
     }
     if ($parents) {
       foreach ($parents as $parent) {
         $phids[] = $parent->getPHID();
       }
     }
 
     $handles = array();
     if ($phids) {
       $handles = $this->loadViewerHandles($phids);
     }
 
     $props = array();
 
     if ($commit->getAuditStatus()) {
       $status = PhabricatorAuditCommitStatusConstants::getStatusName(
         $commit->getAuditStatus());
       $tag = id(new PhabricatorTagView())
         ->setType(PhabricatorTagView::TYPE_STATE)
         ->setName($status);
 
       switch ($commit->getAuditStatus()) {
         case PhabricatorAuditCommitStatusConstants::NEEDS_AUDIT:
           $tag->setBackgroundColor(PhabricatorTagView::COLOR_ORANGE);
           break;
         case PhabricatorAuditCommitStatusConstants::CONCERN_RAISED:
           $tag->setBackgroundColor(PhabricatorTagView::COLOR_RED);
           break;
         case PhabricatorAuditCommitStatusConstants::PARTIALLY_AUDITED:
           $tag->setBackgroundColor(PhabricatorTagView::COLOR_BLUE);
           break;
         case PhabricatorAuditCommitStatusConstants::FULLY_AUDITED:
           $tag->setBackgroundColor(PhabricatorTagView::COLOR_GREEN);
           break;
       }
 
       $props['Status'] = $tag;
     }
 
     if ($audit_requests) {
       $props['Auditors'] = $this->renderAuditStatusView($audit_requests);
     }
 
     $props['Committed'] = phabricator_datetime($commit->getEpoch(), $user);
 
     $author_phid = $data->getCommitDetail('authorPHID');
     if ($data->getCommitDetail('authorPHID')) {
       $props['Author'] = $handles[$author_phid]->renderLink();
     } else {
       $props['Author'] = $data->getAuthorName();
     }
 
     $reviewer_phid = $data->getCommitDetail('reviewerPHID');
     if ($reviewer_phid) {
       $props['Reviewer'] = $handles[$reviewer_phid]->renderLink();
     }
 
     $committer = $data->getCommitDetail('committer');
     if ($committer) {
       $committer_phid = $data->getCommitDetail('committerPHID');
       if ($data->getCommitDetail('committerPHID')) {
         $props['Committer'] = $handles[$committer_phid]->renderLink();
       } else {
         $props['Committer'] = $committer;
       }
     }
 
     if ($revision_phid) {
       $props['Differential Revision'] = $handles[$revision_phid]->renderLink();
     }
 
     if ($parents) {
       $parent_links = array();
       foreach ($parents as $parent) {
         $parent_links[] = $handles[$parent->getPHID()]->renderLink();
       }
       $props['Parents'] = phutil_implode_html(" \xC2\xB7 ", $parent_links);
     }
 
     $request = $this->getDiffusionRequest();
 
     $props['Branches'] = phutil_tag(
       'span',
       array(
         'id' => 'commit-branches',
       ),
       pht('Unknown'));
     $props['Tags'] = phutil_tag(
       'span',
       array(
         'id' => 'commit-tags',
       ),
       pht('Unknown'));
 
     $callsign = $request->getRepository()->getCallsign();
     $root = '/diffusion/'.$callsign.'/commit/'.$commit->getCommitIdentifier();
     Javelin::initBehavior(
       'diffusion-commit-branches',
       array(
         $root.'/branches/' => 'commit-branches',
         $root.'/tags/' => 'commit-tags',
       ));
 
     $refs = $this->buildRefs($request);
     if ($refs) {
       $props['References'] = $refs;
     }
 
     if ($task_phids) {
       $task_list = array();
       foreach ($task_phids as $phid) {
         $task_list[] = $handles[$phid]->renderLink();
       }
       $task_list = phutil_implode_html(phutil_tag('br'), $task_list);
       $props['Tasks'] = $task_list;
     }
 
     if ($proj_phids) {
       $proj_list = array();
       foreach ($proj_phids as $phid) {
         $proj_list[] = $handles[$phid]->renderLink();
       }
       $proj_list = phutil_implode_html(phutil_tag('br'), $proj_list);
       $props['Projects'] = $proj_list;
     }
 
     return $props;
   }
 
   private function buildComments(PhabricatorRepositoryCommit $commit) {
     $user = $this->getRequest()->getUser();
     $comments = id(new PhabricatorAuditComment())->loadAllWhere(
       'targetPHID = %s ORDER BY dateCreated ASC',
       $commit->getPHID());
 
     $inlines = id(new PhabricatorAuditInlineComment())->loadAllWhere(
       'commitPHID = %s AND auditCommentID IS NOT NULL',
       $commit->getPHID());
 
     $path_ids = mpull($inlines, 'getPathID');
 
     $path_map = array();
     if ($path_ids) {
       $path_map = id(new DiffusionPathQuery())
         ->withPathIDs($path_ids)
         ->execute();
       $path_map = ipull($path_map, 'path', 'id');
     }
 
     $engine = new PhabricatorMarkupEngine();
     $engine->setViewer($user);
 
     foreach ($comments as $comment) {
       $engine->addObject(
         $comment,
         PhabricatorAuditComment::MARKUP_FIELD_BODY);
     }
 
     foreach ($inlines as $inline) {
       $engine->addObject(
         $inline,
         PhabricatorInlineCommentInterface::MARKUP_FIELD_BODY);
     }
 
     $engine->process();
 
     $view = new DiffusionCommentListView();
     $view->setMarkupEngine($engine);
     $view->setUser($user);
     $view->setComments($comments);
     $view->setInlineComments($inlines);
     $view->setPathMap($path_map);
 
     $phids = $view->getRequiredHandlePHIDs();
     $handles = $this->loadViewerHandles($phids);
     $view->setHandles($handles);
 
     return $view;
   }
 
   private function renderAddCommentPanel(
     PhabricatorRepositoryCommit $commit,
     array $audit_requests) {
     assert_instances_of($audit_requests, 'PhabricatorRepositoryAuditRequest');
 
     $request = $this->getRequest();
     $user = $request->getUser();
 
     if (!$user->isLoggedIn()) {
       return id(new PhabricatorApplicationTransactionCommentView())
         ->setUser($user)
         ->setRequestURI($request->getRequestURI());
     }
 
     $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
 
     $pane_id = celerity_generate_unique_node_id();
     Javelin::initBehavior(
       'differential-keyboard-navigation',
       array(
         'haunt' => $pane_id,
       ));
 
     $draft = id(new PhabricatorDraft())->loadOneWhere(
       'authorPHID = %s AND draftKey = %s',
       $user->getPHID(),
       'diffusion-audit-'.$commit->getID());
     if ($draft) {
       $draft = $draft->getDraft();
     } else {
       $draft = null;
     }
 
     $actions = $this->getAuditActions($commit, $audit_requests);
 
     $form = id(new AphrontFormView())
       ->setUser($user)
       ->setAction('/audit/addcomment/')
       ->addHiddenInput('commit', $commit->getPHID())
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Action'))
           ->setName('action')
           ->setID('audit-action')
           ->setOptions($actions))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Add Auditors'))
           ->setName('auditors')
           ->setControlID('add-auditors')
           ->setControlStyle('display: none')
           ->setID('add-auditors-tokenizer')
           ->setDisableBehavior(true))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Add CCs'))
           ->setName('ccs')
           ->setControlID('add-ccs')
           ->setControlStyle('display: none')
           ->setID('add-ccs-tokenizer')
           ->setDisableBehavior(true))
       ->appendChild(
         id(new PhabricatorRemarkupControl())
           ->setLabel(pht('Comments'))
           ->setName('content')
           ->setValue($draft)
           ->setID('audit-content')
           ->setUser($user))
       ->appendChild(
         id(new AphrontFormSubmitControl())
           ->setValue($is_serious ? pht('Submit') : pht('Cook the Books')));
 
     $header = new PHUIHeaderView();
     $header->setHeader(
       $is_serious ? pht('Audit Commit') : pht('Creative Accounting'));
 
     require_celerity_resource('phabricator-transaction-view-css');
 
     Javelin::initBehavior(
       'differential-add-reviewers-and-ccs',
       array(
         'dynamic' => array(
           'add-auditors-tokenizer' => array(
             'actions' => array('add_auditors' => 1),
             'src' => '/typeahead/common/users/',
             'row' => 'add-auditors',
             'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
             'placeholder' => pht('Type a user name...'),
           ),
           'add-ccs-tokenizer' => array(
             'actions' => array('add_ccs' => 1),
             'src' => '/typeahead/common/mailable/',
             'row' => 'add-ccs',
             'ondemand' => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
             'placeholder' => pht('Type a user or mailing list...'),
           ),
         ),
         'select' => 'audit-action',
       ));
 
     Javelin::initBehavior('differential-feedback-preview', array(
       'uri'       => '/audit/preview/'.$commit->getID().'/',
       'preview'   => 'audit-preview',
       'content'   => 'audit-content',
       'action'    => 'audit-action',
       'previewTokenizers' => array(
         'auditors' => 'add-auditors-tokenizer',
         'ccs'      => 'add-ccs-tokenizer',
       ),
       'inline'     => 'inline-comment-preview',
       'inlineuri'  => '/diffusion/inline/preview/'.$commit->getPHID().'/',
     ));
 
     $preview_panel = hsprintf(
       '<div class="aphront-panel-preview aphront-panel-flush">
         <div id="audit-preview">
           <div class="aphront-panel-preview-loading-text">
             Loading preview...
           </div>
         </div>
         <div id="inline-comment-preview">
         </div>
       </div>');
 
     // TODO: This is pretty awkward, unify the CSS between Diffusion and
     // Differential better.
     require_celerity_resource('differential-core-view-css');
 
     $comment_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($form);
+      ->appendChild($form);
 
     return phutil_tag(
       'div',
       array(
         'id' => $pane_id,
       ),
       hsprintf(
         '<div class="differential-add-comment-panel">%s%s%s</div>',
         id(new PhabricatorAnchorView())
           ->setAnchorName('comment')
           ->setNavigationMarker(true)
           ->render(),
         $comment_box,
         $preview_panel));
   }
 
   /**
    * Return a map of available audit actions for rendering into a <select />.
    * This shows the user valid actions, and does not show nonsense/invalid
    * actions (like closing an already-closed commit, or resigning from a commit
    * you have no association with).
    */
   private function getAuditActions(
     PhabricatorRepositoryCommit $commit,
     array $audit_requests) {
     assert_instances_of($audit_requests, 'PhabricatorRepositoryAuditRequest');
     $user = $this->getRequest()->getUser();
 
     $user_is_author = ($commit->getAuthorPHID() == $user->getPHID());
 
     $user_request = null;
     foreach ($audit_requests as $audit_request) {
       if ($audit_request->getAuditorPHID() == $user->getPHID()) {
         $user_request = $audit_request;
         break;
       }
     }
 
     $actions = array();
     $actions[PhabricatorAuditActionConstants::COMMENT] = true;
     $actions[PhabricatorAuditActionConstants::ADD_CCS] = true;
     $actions[PhabricatorAuditActionConstants::ADD_AUDITORS] = true;
 
     // We allow you to accept your own commits. A use case here is that you
     // notice an issue with your own commit and "Raise Concern" as an indicator
     // to other auditors that you're on top of the issue, then later resolve it
     // and "Accept". You can not accept on behalf of projects or packages,
     // however.
     $actions[PhabricatorAuditActionConstants::ACCEPT]  = true;
     $actions[PhabricatorAuditActionConstants::CONCERN] = true;
 
 
     // To resign, a user must have authority on some request and not be the
     // commit's author.
     if (!$user_is_author) {
       $may_resign = false;
 
       $authority_map = array_fill_keys($this->auditAuthorityPHIDs, true);
       foreach ($audit_requests as $request) {
         if (empty($authority_map[$request->getAuditorPHID()])) {
           continue;
         }
         $may_resign = true;
         break;
       }
 
       // If the user has already resigned, don't show "Resign...".
       $status_resigned = PhabricatorAuditStatusConstants::RESIGNED;
       if ($user_request) {
         if ($user_request->getAuditStatus() == $status_resigned) {
           $may_resign = false;
         }
       }
 
       if ($may_resign) {
         $actions[PhabricatorAuditActionConstants::RESIGN] = true;
       }
     }
 
     $status_concern = PhabricatorAuditCommitStatusConstants::CONCERN_RAISED;
     $concern_raised = ($commit->getAuditStatus() == $status_concern);
     $can_close_option = PhabricatorEnv::getEnvConfig(
       'audit.can-author-close-audit');
     if ($can_close_option && $user_is_author && $concern_raised) {
       $actions[PhabricatorAuditActionConstants::CLOSE] = true;
     }
 
     foreach ($actions as $constant => $ignored) {
       $actions[$constant] =
         PhabricatorAuditActionConstants::getActionName($constant);
     }
 
     return $actions;
   }
 
   private function buildMergesTable(PhabricatorRepositoryCommit $commit) {
     $drequest = $this->getDiffusionRequest();
     $limit = 50;
 
     $merges = array();
     try {
       $merges = $this->callConduitWithDiffusionRequest(
         'diffusion.mergedcommitsquery',
         array(
           'commit' => $drequest->getCommit(),
           'limit' => $limit + 1));
     } catch (ConduitException $ex) {
       if ($ex->getMessage() != 'ERR-UNSUPPORTED-VCS') {
         throw $ex;
       }
     }
 
     if (!$merges) {
       return null;
     }
 
     $caption = null;
     if (count($merges) > $limit) {
       $merges = array_slice($merges, 0, $limit);
       $caption =
         "This commit merges more than {$limit} changes. Only the first ".
         "{$limit} are shown.";
     }
 
     $history_table = new DiffusionHistoryTableView();
     $history_table->setUser($this->getRequest()->getUser());
     $history_table->setDiffusionRequest($drequest);
     $history_table->setHistory($merges);
     $history_table->loadRevisions();
 
     $phids = $history_table->getRequiredHandlePHIDs();
     $handles = $this->loadViewerHandles($phids);
     $history_table->setHandles($handles);
 
     $panel = new AphrontPanelView();
     $panel->setHeader(pht('Merged Changes'));
     $panel->setCaption($caption);
     $panel->appendChild($history_table);
     $panel->setNoBackground();
 
     return $panel;
   }
 
   private function renderHeadsupActionList(
     PhabricatorRepositoryCommit $commit,
     PhabricatorRepository $repository) {
 
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $actions = id(new PhabricatorActionListView())
       ->setUser($user)
       ->setObject($commit)
       ->setObjectURI($request->getRequestURI());
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $user,
       $commit,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $uri = '/diffusion/'.$repository->getCallsign().'/commit/'.
            $commit->getCommitIdentifier().'/edit/';
 
     $action = id(new PhabricatorActionView())
       ->setName(pht('Edit Commit'))
       ->setHref($uri)
       ->setIcon('edit')
       ->setDisabled(!$can_edit)
       ->setWorkflow(!$can_edit);
     $actions->addAction($action);
 
     require_celerity_resource('phabricator-object-selector-css');
     require_celerity_resource('javelin-behavior-phabricator-object-selector');
 
     $maniphest = 'PhabricatorApplicationManiphest';
     if (PhabricatorApplication::isClassInstalled($maniphest)) {
       $action = id(new PhabricatorActionView())
         ->setName(pht('Edit Maniphest Tasks'))
         ->setIcon('attach')
         ->setHref('/search/attach/'.$commit->getPHID().'/TASK/edge/')
         ->setWorkflow(true)
         ->setDisabled(!$can_edit);
       $actions->addAction($action);
     }
 
     $action = id(new PhabricatorActionView())
       ->setName(pht('Download Raw Diff'))
       ->setHref($request->getRequestURI()->alter('diff', true))
       ->setIcon('download');
     $actions->addAction($action);
 
     return $actions;
   }
 
   private function buildRefs(DiffusionRequest $request) {
     // this is git-only, so save a conduit round trip and just get out of
     // here if the repository isn't git
     $type_git = PhabricatorRepositoryType::REPOSITORY_TYPE_GIT;
     $repository = $request->getRepository();
     if ($repository->getVersionControlSystem() != $type_git) {
       return null;
     }
 
     $results = $this->callConduitWithDiffusionRequest(
       'diffusion.refsquery',
       array('commit' => $request->getCommit()));
     $ref_links = array();
     foreach ($results as $ref_data) {
       $ref_links[] = phutil_tag('a',
         array('href' => $ref_data['href']),
         $ref_data['ref']);
     }
     return phutil_implode_html(', ', $ref_links);
   }
 
   private function buildRawDiffResponse(DiffusionRequest $drequest) {
     $raw_diff = $this->callConduitWithDiffusionRequest(
       'diffusion.rawdiffquery',
       array(
         'commit' => $drequest->getCommit(),
         'path' => $drequest->getPath()));
 
     $file = PhabricatorFile::buildFromFileDataOrHash(
       $raw_diff,
       array(
         'name' => $drequest->getCommit().'.diff',
       ));
 
     return id(new AphrontRedirectResponse())->setURI($file->getBestURI());
   }
 
   private function renderAuditStatusView(array $audit_requests) {
     assert_instances_of($audit_requests, 'PhabricatorRepositoryAuditRequest');
 
     $phids = mpull($audit_requests, 'getAuditorPHID');
     $this->loadHandles($phids);
 
     $authority_map = array_fill_keys($this->auditAuthorityPHIDs, true);
 
     $view = new PHUIStatusListView();
     foreach ($audit_requests as $request) {
       $item = new PHUIStatusItemView();
 
       switch ($request->getAuditStatus()) {
         case PhabricatorAuditStatusConstants::AUDIT_NOT_REQUIRED:
           $item->setIcon('open-blue', pht('Commented'));
           break;
         case PhabricatorAuditStatusConstants::AUDIT_REQUIRED:
           $item->setIcon('warning-blue', pht('Audit Required'));
           break;
         case PhabricatorAuditStatusConstants::CONCERNED:
           $item->setIcon('reject-red', pht('Concern Raised'));
           break;
         case PhabricatorAuditStatusConstants::ACCEPTED:
           $item->setIcon('accept-green', pht('Accepted'));
           break;
         case PhabricatorAuditStatusConstants::AUDIT_REQUESTED:
           $item->setIcon('warning-dark', pht('Audit Requested'));
           break;
         case PhabricatorAuditStatusConstants::RESIGNED:
           $item->setIcon('open-dark', pht('Accepted'));
           break;
         case PhabricatorAuditStatusConstants::CLOSED:
           $item->setIcon('accept-blue', pht('Accepted'));
           break;
         case PhabricatorAuditStatusConstants::CC:
           $item->setIcon('info-dark', pht('Subscribed'));
           break;
       }
 
       $note = array();
       foreach ($request->getAuditReasons() as $reason) {
         $note[] = phutil_tag('div', array(), $reason);
       }
       $item->setNote($note);
 
       $auditor_phid = $request->getAuditorPHID();
       $target = $this->getHandle($auditor_phid)->renderLink();
       $item->setTarget($target);
 
       if (isset($authority_map[$auditor_phid])) {
         $item->setHighlighted(true);
       }
 
       $view->addItem($item);
     }
 
     return $view;
   }
 
   private function linkBugtraq($corpus) {
     $url = PhabricatorEnv::getEnvConfig('bugtraq.url');
     if (!strlen($url)) {
       return $corpus;
     }
 
     $regexes = PhabricatorEnv::getEnvConfig('bugtraq.logregex');
     if (!$regexes) {
       return $corpus;
     }
 
     $parser = id(new PhutilBugtraqParser())
       ->setBugtraqPattern("[[ {$url} | %BUGID% ]]")
       ->setBugtraqCaptureExpression(array_shift($regexes));
 
     $select = array_shift($regexes);
     if ($select) {
       $parser->setBugtraqSelectExpression($select);
     }
 
     return $parser->processCorpus($corpus);
   }
 
 }
diff --git a/src/applications/diffusion/controller/DiffusionHistoryController.php b/src/applications/diffusion/controller/DiffusionHistoryController.php
index 4200b00694..d727c1fafc 100644
--- a/src/applications/diffusion/controller/DiffusionHistoryController.php
+++ b/src/applications/diffusion/controller/DiffusionHistoryController.php
@@ -1,173 +1,173 @@
 <?php
 
 final class DiffusionHistoryController extends DiffusionController {
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function processRequest() {
     $drequest = $this->diffusionRequest;
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $repository = $drequest->getRepository();
 
     $page_size = $request->getInt('pagesize', 100);
     $offset = $request->getInt('offset', 0);
 
     $params = array(
       'commit' => $drequest->getCommit(),
       'path' => $drequest->getPath(),
       'offset' => $offset,
       'limit' => $page_size + 1);
 
     if (!$request->getBool('copies')) {
       $params['needDirectChanges'] = true;
       $params['needChildChanges'] = true;
     }
 
     $history_results = $this->callConduitWithDiffusionRequest(
       'diffusion.historyquery',
       $params);
     $history = DiffusionPathChange::newFromConduit(
       $history_results['pathChanges']);
 
     $pager = new AphrontPagerView();
     $pager->setPageSize($page_size);
     $pager->setOffset($offset);
     $history = $pager->sliceResults($history);
 
     $pager->setURI($request->getRequestURI(), 'offset');
 
     $show_graph = !strlen($drequest->getPath());
     $content = array();
 
     $history_table = new DiffusionHistoryTableView();
     $history_table->setUser($request->getUser());
     $history_table->setDiffusionRequest($drequest);
     $history_table->setHistory($history);
     $history_table->loadRevisions();
 
     $phids = $history_table->getRequiredHandlePHIDs();
     $handles = $this->loadViewerHandles($phids);
     $history_table->setHandles($handles);
 
     if ($show_graph) {
       $history_table->setParents($history_results['parents']);
       $history_table->setIsHead($offset == 0);
     }
 
     $history_panel = new AphrontPanelView();
     $history_panel->appendChild($history_table);
     $history_panel->appendChild($pager);
     $history_panel->setNoBackground();
 
     $content[] = $history_panel;
 
     $header = id(new PHUIHeaderView())
       ->setUser($viewer)
       ->setPolicyObject($repository)
       ->setHeader($this->renderPathLinks($drequest, $mode = 'history'));
 
     $actions = $this->buildActionView($drequest);
     $properties = $this->buildPropertyView($drequest);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     $crumbs = $this->buildCrumbs(
       array(
         'branch' => true,
         'path'   => true,
         'view'   => 'history',
       ));
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $content,
       ),
       array(
         'device' => true,
         'title' => array(
           pht('History'),
           pht('%s Repository', $drequest->getRepository()->getCallsign()),
         ),
       ));
   }
 
   private function buildActionView(DiffusionRequest $drequest) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorActionListView())
       ->setUser($viewer);
 
     $browse_uri = $drequest->generateURI(
       array(
         'action' => 'browse',
       ));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Browse Content'))
         ->setHref($browse_uri)
         ->setIcon('file'));
 
     // TODO: Sometimes we do have a change view, we need to look at the most
     // recent history entry to figure it out.
 
     $request = $this->getRequest();
     if ($request->getBool('copies')) {
       $branch_name = pht('Hide Copies/Branches');
       $branch_icon = 'fork-grey';
       $branch_uri = $request->getRequestURI()
         ->alter('offset', null)
         ->alter('copies', null);
     } else {
       $branch_name = pht('Show Copies/Branches');
       $branch_icon = 'fork';
       $branch_uri = $request->getRequestURI()
         ->alter('offset', null)
         ->alter('copies', true);
     }
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName($branch_name)
         ->setIcon($branch_icon)
         ->setHref($branch_uri));
 
     return $view;
   }
 
   protected function buildPropertyView(DiffusionRequest $drequest) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorPropertyListView())
       ->setUser($viewer);
 
     $stable_commit = $drequest->getStableCommitName();
     $callsign = $drequest->getRepository()->getCallsign();
 
     $view->addProperty(
       pht('Commit'),
       phutil_tag(
         'a',
         array(
           'href' => $drequest->generateURI(
             array(
               'action' => 'commit',
               'commit' => $stable_commit,
             )),
         ),
         $drequest->getRepository()->formatCommitName($stable_commit)));
 
     return $view;
   }
 
 
 
 }
diff --git a/src/applications/diffusion/controller/DiffusionLintController.php b/src/applications/diffusion/controller/DiffusionLintController.php
index 2e6d76d4d7..d7166047a5 100644
--- a/src/applications/diffusion/controller/DiffusionLintController.php
+++ b/src/applications/diffusion/controller/DiffusionLintController.php
@@ -1,354 +1,354 @@
 <?php
 
 final class DiffusionLintController extends DiffusionController {
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $this->getRequest()->getUser();
     $drequest = $this->diffusionRequest;
 
     if ($request->getStr('lint') !== null) {
       $controller = new DiffusionLintDetailsController($request);
       $controller->setDiffusionRequest($drequest);
       $controller->setCurrentApplication($this->getCurrentApplication());
       return $this->delegateToController($controller);
     }
 
     $owners = array();
     if (!$drequest) {
       if (!$request->getArr('owner')) {
         if ($user->isLoggedIn()) {
           $owners[$user->getPHID()] = $user->getFullName();
         }
       } else {
         $phids = $request->getArr('owner');
         $phid = reset($phids);
         $handles = $this->loadViewerHandles(array($phid));
         $owners[$phid] = $handles[$phid]->getFullName();
       }
     }
 
     $codes = $this->loadLintCodes(array_keys($owners));
 
     if ($codes && !$drequest) {
       // TODO: Build some real Query classes for this stuff.
 
       $branches = id(new PhabricatorRepositoryBranch())->loadAllWhere(
         'id IN (%Ld)',
         array_unique(ipull($codes, 'branchID')));
 
       $repositories = id(new PhabricatorRepositoryQuery())
         ->setViewer($user)
         ->withIDs(mpull($branches, 'getRepositoryID'))
         ->execute();
 
       $drequests = array();
       foreach ($branches as $id => $branch) {
         if (empty($repositories[$branch->getRepositoryID()])) {
           continue;
         }
 
         $drequests[$id] = DiffusionRequest::newFromDictionary(array(
           'user' => $user,
           'repository' => $repositories[$branch->getRepositoryID()],
           'branch' => $branch->getName(),
         ));
       }
     }
 
     $rows = array();
     $total = 0;
     foreach ($codes as $code) {
       if (!$this->diffusionRequest) {
         $drequest = idx($drequests, $code['branchID']);
       }
 
       if (!$drequest) {
         continue;
       }
 
       $total += $code['n'];
 
       $rows[] = array(
         hsprintf(
           '<a href="%s">%s</a>',
           $drequest->generateURI(array(
             'action' => 'lint',
             'lint' => $code['code'],
           )),
           $code['n']),
         hsprintf(
           '<a href="%s">%s</a>',
           $drequest->generateURI(array(
             'action' => 'browse',
             'lint' => $code['code'],
           )),
           $code['files']),
         hsprintf(
           '<a href="%s">%s</a>',
           $drequest->generateURI(array('action' => 'lint')),
           $drequest->getCallsign()),
         ArcanistLintSeverity::getStringForSeverity($code['maxSeverity']),
         $code['code'],
         $code['maxName'],
         $code['maxDescription'],
       );
     }
 
     $table = id(new AphrontTableView($rows))
       ->setHeaders(array(
         pht('Problems'),
         pht('Files'),
         pht('Repository'),
         pht('Severity'),
         pht('Code'),
         pht('Name'),
         pht('Example'),
       ))
       ->setColumnVisibility(array(true, true, !$this->diffusionRequest))
       ->setColumnClasses(array('n', 'n', '', '', 'pri', '', ''));
 
     $content = array();
 
     $link = null;
     if (!$this->diffusionRequest) {
       $form = id(new AphrontFormView())
         ->setUser($user)
         ->setMethod('GET')
         ->appendChild(
           id(new AphrontFormTokenizerControl())
             ->setDatasource('/typeahead/common/users/')
             ->setLimit(1)
             ->setName('owner')
             ->setLabel(pht('Owner'))
             ->setValue($owners))
         ->appendChild(
           id(new AphrontFormSubmitControl())
             ->setValue('Filter'));
       $content[] = id(new AphrontListFilterView())->appendChild($form);
     }
 
     $content[] = id(new AphrontPanelView())
       ->setNoBackground(true)
       ->setCaption($link)
       ->appendChild($table);
 
     $title = array('Lint');
     $crumbs = $this->buildCrumbs(
       array(
         'branch' => true,
         'path'   => true,
         'view'   => 'lint',
       ));
 
     if ($this->diffusionRequest) {
       $title[] = $drequest->getCallsign();
     } else {
       $crumbs->addCrumb(
         id(new PhabricatorCrumbView())
           ->setName(pht('All Lint')));
     }
 
     if ($this->diffusionRequest) {
       $branch = $drequest->loadBranch();
 
       $header = id(new PHUIHeaderView())
         ->setHeader($this->renderPathLinks($drequest, 'lint'))
         ->setUser($user)
         ->setPolicyObject($drequest->getRepository());
       $actions = $this->buildActionView($drequest);
       $properties = $this->buildPropertyView(
         $drequest,
         $branch,
         $total);
 
       $object_box = id(new PHUIObjectBoxView())
         ->setHeader($header)
-        ->addContent($actions)
-        ->addContent($properties);
+        ->setActionList($actions)
+        ->setPropertyList($properties);
     } else {
       $object_box = null;
     }
 
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $content,
       ),
       array(
         'title' => $title,
       ));
   }
 
   private function loadLintCodes(array $owner_phids) {
     $drequest = $this->diffusionRequest;
     $conn = id(new PhabricatorRepository())->establishConnection('r');
     $where = array('1 = 1');
 
     if ($drequest) {
       $branch = $drequest->loadBranch();
       if (!$branch) {
         return array();
       }
 
       $where[] = qsprintf($conn, 'branchID = %d', $branch->getID());
 
       if ($drequest->getPath() != '') {
         $path = '/'.$drequest->getPath();
         $is_dir = (substr($path, -1) == '/');
         $where[] = ($is_dir
           ? qsprintf($conn, 'path LIKE %>', $path)
           : qsprintf($conn, 'path = %s', $path));
       }
     }
 
     if ($owner_phids) {
       $or = array();
       $or[] = qsprintf($conn, 'authorPHID IN (%Ls)', $owner_phids);
 
       $paths = array();
       $packages = id(new PhabricatorOwnersOwner())
         ->loadAllWhere('userPHID IN (%Ls)', $owner_phids);
       if ($packages) {
         $paths = id(new PhabricatorOwnersPath())->loadAllWhere(
           'packageID IN (%Ld)',
           mpull($packages, 'getPackageID'));
       }
 
       if ($paths) {
         $repositories = id(new PhabricatorRepositoryQuery())
           ->setViewer($this->getRequest()->getUser())
           ->withPHIDs(mpull($paths, 'getRepositoryPHID'))
           ->execute();
         $repositories = mpull($repositories, 'getID', 'getPHID');
 
         $branches = id(new PhabricatorRepositoryBranch())->loadAllWhere(
           'repositoryID IN (%Ld)',
           $repositories);
         $branches = mgroup($branches, 'getRepositoryID');
       }
 
       foreach ($paths as $path) {
         $branch = idx(
           $branches,
           idx(
             $repositories,
             $path->getRepositoryPHID()));
         if ($branch) {
           $condition = qsprintf(
             $conn,
             '(branchID IN (%Ld) AND path LIKE %>)',
             array_keys($branch),
             $path->getPath());
           if ($path->getExcluded()) {
             $where[] = 'NOT '.$condition;
           } else {
             $or[] = $condition;
           }
         }
       }
       $where[] = '('.implode(' OR ', $or).')';
     }
 
     return queryfx_all(
       $conn,
       'SELECT
           branchID,
           code,
           MAX(severity) AS maxSeverity,
           MAX(name) AS maxName,
           MAX(description) AS maxDescription,
           COUNT(DISTINCT path) AS files,
           COUNT(*) AS n
         FROM %T
         WHERE %Q
         GROUP BY branchID, code
         ORDER BY n DESC',
       PhabricatorRepository::TABLE_LINTMESSAGE,
       implode(' AND ', $where));
   }
 
   protected function buildActionView(DiffusionRequest $drequest) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorActionListView())
       ->setUser($viewer);
 
     $list_uri = $drequest->generateURI(
       array(
         'action' => 'lint',
         'lint' => '',
       ));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('View As List'))
         ->setHref($list_uri)
         ->setIcon('transcript'));
 
     $history_uri = $drequest->generateURI(
       array(
         'action' => 'history',
       ));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('View History'))
         ->setHref($history_uri)
         ->setIcon('history'));
 
     $browse_uri = $drequest->generateURI(
       array(
         'action' => 'browse',
       ));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Browse Content'))
         ->setHref($browse_uri)
         ->setIcon('file'));
 
     return $view;
   }
 
   protected function buildPropertyView(
     DiffusionRequest $drequest,
     PhabricatorRepositoryBranch $branch,
     $total) {
 
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorPropertyListView())
       ->setUser($viewer);
 
     $callsign = $drequest->getRepository()->getCallsign();
     $lint_commit = $branch->getLintCommit();
 
     $view->addProperty(
       pht('Lint Commit'),
       phutil_tag(
         'a',
         array(
           'href' => $drequest->generateURI(
             array(
               'action' => 'commit',
               'commit' => $lint_commit,
             )),
         ),
         $drequest->getRepository()->formatCommitName($lint_commit)));
 
     $view->addProperty(
       pht('Total Messages'),
       pht('%s', new PhutilNumber($total)));
 
     return $view;
   }
 
 
 }
diff --git a/src/applications/diffusion/controller/DiffusionRepositoryController.php b/src/applications/diffusion/controller/DiffusionRepositoryController.php
index 7dcc3ce579..4b559c80ad 100644
--- a/src/applications/diffusion/controller/DiffusionRepositoryController.php
+++ b/src/applications/diffusion/controller/DiffusionRepositoryController.php
@@ -1,335 +1,335 @@
 <?php
 
 final class DiffusionRepositoryController extends DiffusionController {
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function processRequest() {
     $drequest = $this->diffusionRequest;
 
     $content = array();
 
     $crumbs = $this->buildCrumbs();
     $content[] = $crumbs;
 
     $content[] = $this->buildPropertiesTable($drequest->getRepository());
 
     $history_results = $this->callConduitWithDiffusionRequest(
       'diffusion.historyquery',
       array(
         'commit' => $drequest->getCommit(),
         'path' => $drequest->getPath(),
         'offset' => 0,
         'limit' => 15));
     $history = DiffusionPathChange::newFromConduit(
       $history_results['pathChanges']);
 
     $browse_results = DiffusionBrowseResultSet::newFromConduit(
       $this->callConduitWithDiffusionRequest(
         'diffusion.browsequery',
         array(
           'path' => $drequest->getPath(),
           'commit' => $drequest->getCommit(),
         )));
     $browse_paths = $browse_results->getPaths();
 
     $phids = array();
     foreach ($history as $item) {
       $data = $item->getCommitData();
       if ($data) {
         if ($data->getCommitDetail('authorPHID')) {
           $phids[$data->getCommitDetail('authorPHID')] = true;
         }
         if ($data->getCommitDetail('committerPHID')) {
           $phids[$data->getCommitDetail('committerPHID')] = true;
         }
       }
     }
 
     foreach ($browse_paths as $item) {
       $data = $item->getLastCommitData();
       if ($data) {
         if ($data->getCommitDetail('authorPHID')) {
           $phids[$data->getCommitDetail('authorPHID')] = true;
         }
         if ($data->getCommitDetail('committerPHID')) {
           $phids[$data->getCommitDetail('committerPHID')] = true;
         }
       }
     }
     $phids = array_keys($phids);
     $handles = $this->loadViewerHandles($phids);
 
     $readme = $this->callConduitWithDiffusionRequest(
       'diffusion.readmequery',
       array(
        'paths' => $browse_results->getPathDicts()
         ));
 
     $history_table = new DiffusionHistoryTableView();
     $history_table->setUser($this->getRequest()->getUser());
     $history_table->setDiffusionRequest($drequest);
     $history_table->setHandles($handles);
     $history_table->setHistory($history);
     $history_table->loadRevisions();
     $history_table->setParents($history_results['parents']);
     $history_table->setIsHead(true);
 
     $callsign = $drequest->getRepository()->getCallsign();
     $all = phutil_tag(
       'a',
       array(
         'href' => $drequest->generateURI(
           array(
             'action' => 'history',
           )),
       ),
       pht('View Full Commit History'));
 
     $panel = new AphrontPanelView();
     $panel->setHeader(pht("Recent Commits &middot; %s", $all));
     $panel->appendChild($history_table);
     $panel->setNoBackground();
 
     $content[] = $panel;
 
 
     $browse_table = new DiffusionBrowseTableView();
     $browse_table->setDiffusionRequest($drequest);
     $browse_table->setHandles($handles);
     $browse_table->setPaths($browse_paths);
     $browse_table->setUser($this->getRequest()->getUser());
 
     $browse_panel = new AphrontPanelView();
     $browse_panel->setHeader(phutil_tag(
       'a',
       array('href' => $drequest->generateURI(array('action' => 'browse'))),
       pht('Browse Repository')));
     $browse_panel->appendChild($browse_table);
     $browse_panel->setNoBackground();
 
     $content[] = $browse_panel;
 
     $content[] = $this->buildTagListTable($drequest);
 
     $content[] = $this->buildBranchListTable($drequest);
 
     if ($readme) {
       $box = new PHUIBoxView();
       $box->setShadow(true);
       $box->appendChild($readme);
       $box->addPadding(PHUI::PADDING_LARGE);
 
       $panel = new AphrontPanelView();
       $panel->setHeader(pht('README'));
       $panel->setNoBackground();
       $panel->appendChild($box);
       $content[] = $panel;
     }
 
     return $this->buildApplicationPage(
       $content,
       array(
         'title' => $drequest->getRepository()->getName(),
         'device' => true,
       ));
   }
 
   private function buildPropertiesTable(PhabricatorRepository $repository) {
     $user = $this->getRequest()->getUser();
 
     $header = id(new PHUIHeaderView())
       ->setHeader($repository->getName())
       ->setUser($user)
       ->setPolicyObject($repository);
 
     $actions = $this->buildActionList($repository);
 
     $view = id(new PhabricatorPropertyListView())
       ->setUser($user);
     $view->addProperty(pht('Callsign'), $repository->getCallsign());
 
     switch ($repository->getVersionControlSystem()) {
       case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
       case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
         $view->addProperty(
           pht('Clone URI'),
           $repository->getPublicRemoteURI());
         break;
       case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
         $view->addProperty(
           pht('Repository Root'),
           $repository->getPublicRemoteURI());
         break;
     }
 
     $description = $repository->getDetail('description');
     if (strlen($description)) {
       $description = PhabricatorMarkupEngine::renderOneObject(
         $repository,
         'description',
         $user);
       $view->addTextContent($description);
     }
 
     return id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($view);
+      ->setActionList($actions)
+      ->setPropertyList($view);
 
   }
 
   private function buildBranchListTable(DiffusionRequest $drequest) {
     if ($drequest->getBranch() !== null) {
       $limit = 15;
 
       $branches = DiffusionBranchInformation::newFromConduit(
         $this->callConduitWithDiffusionRequest(
           'diffusion.branchquery',
           array(
             'limit' => $limit
           )));
       if (!$branches) {
         return null;
       }
 
       $more_branches = (count($branches) > $limit);
       $branches = array_slice($branches, 0, $limit);
 
       $commits = id(new PhabricatorAuditCommitQuery())
         ->withIdentifiers(
           $drequest->getRepository()->getID(),
           mpull($branches, 'getHeadCommitIdentifier'))
         ->needCommitData(true)
         ->execute();
 
       $table = new DiffusionBranchTableView();
       $table->setDiffusionRequest($drequest);
       $table->setBranches($branches);
       $table->setCommits($commits);
       $table->setUser($this->getRequest()->getUser());
 
       $panel = new AphrontPanelView();
       $panel->setHeader(pht('Branches'));
       $panel->setNoBackground();
 
       if ($more_branches) {
         $panel->setCaption(pht('Showing %d branches.', $limit));
       }
 
       $panel->addButton(
         phutil_tag(
           'a',
           array(
             'href' => $drequest->generateURI(
               array(
                 'action' => 'branches',
               )),
             'class' => 'grey button',
           ),
           pht("Show All Branches \xC2\xBB")));
 
       $panel->appendChild($table);
 
       return $panel;
     }
 
     return null;
   }
 
   private function buildTagListTable(DiffusionRequest $drequest) {
     $tag_limit = 15;
     $tags = array();
     try {
       $tags = DiffusionRepositoryTag::newFromConduit(
         $this->callConduitWithDiffusionRequest(
           'diffusion.tagsquery',
           array(
             // On the home page, we want to find tags on any branch.
             'commit' => null,
             'limit' => $tag_limit + 1,
           )));
     } catch (ConduitException $e) {
       if ($e->getMessage() != 'ERR-UNSUPPORTED-VCS') {
         throw $e;
       }
     }
 
     if (!$tags) {
       return null;
     }
 
     $more_tags = (count($tags) > $tag_limit);
     $tags = array_slice($tags, 0, $tag_limit);
 
     $commits = id(new PhabricatorAuditCommitQuery())
       ->withIdentifiers(
         $drequest->getRepository()->getID(),
         mpull($tags, 'getCommitIdentifier'))
       ->needCommitData(true)
       ->execute();
 
     $view = new DiffusionTagListView();
     $view->setDiffusionRequest($drequest);
     $view->setTags($tags);
     $view->setUser($this->getRequest()->getUser());
     $view->setCommits($commits);
 
     $phids = $view->getRequiredHandlePHIDs();
     $handles = $this->loadViewerHandles($phids);
     $view->setHandles($handles);
 
     $panel = new AphrontPanelView();
     $panel->setHeader(pht('Tags'));
     $panel->setNoBackground(true);
 
     if ($more_tags) {
       $panel->setCaption(pht('Showing the %d most recent tags.', $tag_limit));
     }
 
     $panel->addButton(
       phutil_tag(
         'a',
         array(
           'href' => $drequest->generateURI(
             array(
               'action' => 'tags',
             )),
           'class' => 'grey button',
         ),
         pht("Show All Tags \xC2\xBB")));
     $panel->appendChild($view);
 
     return $panel;
   }
 
   private function buildActionList(PhabricatorRepository $repository) {
     $viewer = $this->getRequest()->getUser();
 
     $view_uri = $this->getApplicationURI($repository->getCallsign().'/');
     $edit_uri = $this->getApplicationURI($repository->getCallsign().'/edit/');
 
     $view = id(new PhabricatorActionListView())
       ->setUser($viewer)
       ->setObject($repository)
       ->setObjectURI($view_uri);
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $repository,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Repository'))
         ->setIcon('edit')
         ->setHref($edit_uri)
         ->setWorkflow(!$can_edit)
         ->setDisabled(!$can_edit));
 
     return $view;
   }
 
 }
diff --git a/src/applications/drydock/controller/DrydockLeaseViewController.php b/src/applications/drydock/controller/DrydockLeaseViewController.php
index 050cb52d59..5dc6d6c361 100644
--- a/src/applications/drydock/controller/DrydockLeaseViewController.php
+++ b/src/applications/drydock/controller/DrydockLeaseViewController.php
@@ -1,134 +1,134 @@
 <?php
 
 final class DrydockLeaseViewController extends DrydockController {
 
   private $id;
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $lease = id(new DrydockLease())->load($this->id);
     if (!$lease) {
       return new Aphront404Response();
     }
 
     $lease_uri = $this->getApplicationURI('lease/'.$lease->getID().'/');
 
     $title = pht('Lease %d', $lease->getID());
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title);
 
     $actions = $this->buildActionListView($lease);
     $properties = $this->buildPropertyListView($lease);
 
     $pager = new AphrontPagerView();
     $pager->setURI(new PhutilURI($lease_uri), 'offset');
     $pager->setOffset($request->getInt('offset'));
 
     $logs = id(new DrydockLogQuery())
       ->withLeaseIDs(array($lease->getID()))
       ->executeWithOffsetPager($pager);
 
     $log_table = $this->buildLogTableView($logs);
     $log_table->appendChild($pager);
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->setActionList($actions);
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName($title)
         ->setHref($lease_uri));
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $log_table,
       ),
       array(
         'device'  => true,
         'title'   => $title,
       ));
 
   }
 
   private function buildActionListView(DrydockLease $lease) {
     $view = id(new PhabricatorActionListView())
       ->setUser($this->getRequest()->getUser())
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setObject($lease);
 
     $id = $lease->getID();
 
     $can_release = ($lease->getStatus() == DrydockLeaseStatus::STATUS_ACTIVE);
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Release Lease'))
         ->setIcon('delete')
         ->setHref($this->getApplicationURI("/lease/{$id}/release/"))
         ->setWorkflow(true)
         ->setDisabled(!$can_release));
 
     return $view;
   }
 
   private function buildPropertyListView(DrydockLease $lease) {
     $view = new PhabricatorPropertyListView();
 
     switch ($lease->getStatus()) {
       case DrydockLeaseStatus::STATUS_ACTIVE:
         $status = pht('Active');
         break;
       case DrydockLeaseStatus::STATUS_RELEASED:
         $status = pht('Released');
         break;
       case DrydockLeaseStatus::STATUS_EXPIRED:
         $status = pht('Expired');
         break;
       case DrydockLeaseStatus::STATUS_PENDING:
         $status = pht('Pending');
         break;
       case DrydockLeaseStatus::STATUS_BROKEN:
         $status = pht('Broken');
         break;
       default:
         $status = pht('Unknown');
         break;
     }
 
     $view->addProperty(
       pht('Status'),
       $status);
 
     $view->addProperty(
       pht('Resource Type'),
       $lease->getResourceType());
 
     $view->addProperty(
       pht('Resource'),
       $lease->getResourceID());
 
     $attributes = $lease->getAttributes();
     if ($attributes) {
       $view->addSectionHeader(pht('Attributes'));
       foreach ($attributes as $key => $value) {
         $view->addProperty($key, $value);
       }
     }
 
     return $view;
   }
 
 }
diff --git a/src/applications/drydock/controller/DrydockResourceViewController.php b/src/applications/drydock/controller/DrydockResourceViewController.php
index 573c4e8016..b9259786de 100644
--- a/src/applications/drydock/controller/DrydockResourceViewController.php
+++ b/src/applications/drydock/controller/DrydockResourceViewController.php
@@ -1,125 +1,125 @@
 <?php
 
 final class DrydockResourceViewController extends DrydockController {
 
   private $id;
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $resource = id(new DrydockResource())->load($this->id);
     if (!$resource) {
       return new Aphront404Response();
     }
 
     $title = 'Resource '.$resource->getID().' '.$resource->getName();
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title);
 
     $actions = $this->buildActionListView($resource);
     $properties = $this->buildPropertyListView($resource);
 
     $resource_uri = 'resource/'.$resource->getID().'/';
     $resource_uri = $this->getApplicationURI($resource_uri);
 
     $leases = id(new DrydockLeaseQuery())
       ->withResourceIDs(array($resource->getID()))
       ->needResources(true)
       ->execute();
 
     $lease_header = id(new PHUIHeaderView())
       ->setHeader(pht('Leases'));
 
     $lease_list = $this->buildLeaseListView($leases);
     $lease_list->setNoDataString(pht('This resource has no leases.'));
 
     $pager = new AphrontPagerView();
     $pager->setURI(new PhutilURI($resource_uri), 'offset');
     $pager->setOffset($request->getInt('offset'));
 
     $logs = id(new DrydockLogQuery())
       ->withResourceIDs(array($resource->getID()))
       ->executeWithOffsetPager($pager);
 
     $log_table = $this->buildLogTableView($logs);
     $log_table->appendChild($pager);
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->setActionList($actions);
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName(pht('Resource %d', $resource->getID())));
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $lease_header,
         $lease_list,
         $log_table,
       ),
       array(
         'device'  => true,
         'title'   => $title,
       ));
 
   }
 
   private function buildActionListView(DrydockResource $resource) {
     $view = id(new PhabricatorActionListView())
       ->setUser($this->getRequest()->getUser())
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setObject($resource);
 
     $can_close = ($resource->getStatus() == DrydockResourceStatus::STATUS_OPEN);
     $uri = '/resource/'.$resource->getID().'/close/';
     $uri = $this->getApplicationURI($uri);
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setHref($uri)
         ->setName(pht('Close Resource'))
         ->setIcon('delete')
         ->setWorkflow(true)
         ->setDisabled(!$can_close));
 
     return $view;
   }
 
   private function buildPropertyListView(DrydockResource $resource) {
     $view = new PhabricatorPropertyListView();
 
     $status = $resource->getStatus();
     $status = DrydockResourceStatus::getNameForStatus($status);
 
     $view->addProperty(
       pht('Status'),
       $status);
 
     $view->addProperty(
       pht('Resource Type'),
       $resource->getType());
 
     $attributes = $resource->getAttributes();
     if ($attributes) {
       $view->addSectionHeader(pht('Attributes'));
       foreach ($attributes as $key => $value) {
         $view->addProperty($key, $value);
       }
     }
 
     return $view;
   }
 
 }
diff --git a/src/applications/files/controller/PhabricatorFileInfoController.php b/src/applications/files/controller/PhabricatorFileInfoController.php
index ddbae7babe..4abf378725 100644
--- a/src/applications/files/controller/PhabricatorFileInfoController.php
+++ b/src/applications/files/controller/PhabricatorFileInfoController.php
@@ -1,246 +1,246 @@
 <?php
 
 final class PhabricatorFileInfoController extends PhabricatorFileController {
 
   private $phid;
 
   public function willProcessRequest(array $data) {
     $this->phid = $data['phid'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $file = id(new PhabricatorFileQuery())
       ->setViewer($user)
       ->withPHIDs(array($this->phid))
       ->executeOne();
 
     if (!$file) {
       return new Aphront404Response();
     }
 
     $phid = $file->getPHID();
     $xactions = id(new PhabricatorFileTransactionQuery())
       ->setViewer($user)
       ->withObjectPHIDs(array($phid))
       ->execute();
 
     $this->loadHandles(array($file->getAuthorPHID()));
     $header = id(new PHUIHeaderView())
       ->setHeader($file->getName());
 
     $ttl = $file->getTTL();
     if ($ttl !== null) {
       $ttl_tag = id(new PhabricatorTagView())
         ->setType(PhabricatorTagView::TYPE_OBJECT)
         ->setName(pht("Temporary"));
       $header->addTag($ttl_tag);
     }
 
     $actions = $this->buildActionView($file);
     $properties = $this->buildPropertyView($file);
     $timeline = $this->buildTransactionView($file, $xactions);
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->setActionList($actions);
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName('F'.$file->getID())
         ->setHref($this->getApplicationURI("/info/{$phid}/")));
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $timeline
       ),
       array(
         'title' => $file->getName(),
         'device'  => true,
         'pageObjects' => array($file->getPHID()),
       ));
   }
 
   private function buildTransactionView(
     PhabricatorFile $file,
     array $xactions) {
 
     $user = $this->getRequest()->getUser();
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($user);
     foreach ($xactions as $xaction) {
       if ($xaction->getComment()) {
         $engine->addObject(
           $xaction->getComment(),
           PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
       }
     }
     $engine->process();
 
     $timeline = id(new PhabricatorApplicationTransactionView())
       ->setUser($user)
       ->setObjectPHID($file->getPHID())
       ->setTransactions($xactions)
       ->setMarkupEngine($engine);
 
     $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
 
     $add_comment_header = id(new PHUIHeaderView())
       ->setHeader(
         $is_serious
           ? pht('Add Comment')
           : pht('Question File Integrity'));
 
     $submit_button_name = $is_serious
       ? pht('Add Comment')
       : pht('Debate the Bits');
 
     $draft = PhabricatorDraft::newFromUserAndKey($user, $file->getPHID());
 
     $add_comment_form = id(new PhabricatorApplicationTransactionCommentView())
       ->setUser($user)
       ->setObjectPHID($file->getPHID())
       ->setDraft($draft)
       ->setAction($this->getApplicationURI('/comment/'.$file->getID().'/'))
       ->setSubmitButtonName($submit_button_name);
 
     $comment_box = id(new PHUIObjectBoxView())
       ->setFlush(true)
       ->setHeader($add_comment_header)
-      ->addContent($add_comment_form);
+      ->appendChild($add_comment_form);
 
     return array(
       $timeline,
       $comment_box);
   }
 
   private function buildActionView(PhabricatorFile $file) {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $id = $file->getID();
 
     $view = id(new PhabricatorActionListView())
       ->setUser($user)
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setObject($file);
 
     if ($file->isViewableInBrowser()) {
       $view->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('View File'))
           ->setIcon('preview')
           ->setHref($file->getViewURI()));
     } else {
       $view->addAction(
         id(new PhabricatorActionView())
           ->setUser($user)
           ->setRenderAsForm(true)
           ->setDownload(true)
           ->setName(pht('Download File'))
           ->setIcon('download')
           ->setHref($file->getViewURI()));
     }
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Delete File'))
         ->setIcon('delete')
         ->setHref($this->getApplicationURI("/delete/{$id}/"))
         ->setWorkflow(true));
 
     return $view;
   }
 
   private function buildPropertyView(PhabricatorFile $file) {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $view = id(new PhabricatorPropertyListView());
 
     if ($file->getAuthorPHID()) {
       $view->addProperty(
         pht('Author'),
         $this->getHandle($file->getAuthorPHID())->renderLink());
     }
 
     $view->addProperty(
       pht('Created'),
       phabricator_datetime($file->getDateCreated(), $user));
 
     $view->addProperty(
       pht('Size'),
       phabricator_format_bytes($file->getByteSize()));
 
     $view->addSectionHeader(pht('Technical Details'));
 
     $view->addProperty(
       pht('Mime Type'),
       $file->getMimeType());
 
     $view->addProperty(
       pht('Engine'),
       $file->getStorageEngine());
 
     $view->addProperty(
       pht('Format'),
       $file->getStorageFormat());
 
     $view->addProperty(
       pht('Handle'),
       $file->getStorageHandle());
 
     $metadata = $file->getMetadata();
     if (!empty($metadata)) {
       $view->addSectionHeader(pht('Metadata'));
 
       foreach ($metadata as $key => $value) {
         $view->addProperty(
           PhabricatorFile::getMetadataName($key),
           $value);
       }
     }
 
     if ($file->isViewableImage()) {
 
       $image = phutil_tag(
         'img',
         array(
           'src' => $file->getViewURI(),
           'class' => 'phabricator-property-list-image',
         ));
 
       $linked_image = phutil_tag(
         'a',
         array(
           'href' => $file->getViewURI(),
         ),
         $image);
 
       $view->addImageContent($linked_image);
     } else if ($file->isAudio()) {
       $audio = phutil_tag(
         'audio',
         array(
           'controls' => 'controls',
           'class' => 'phabricator-property-list-audio',
         ),
         phutil_tag(
           'source',
           array(
             'src' => $file->getViewURI(),
             'type' => $file->getMimeType(),
           )));
       $view->addImageContent($audio);
     }
 
     return $view;
   }
 
 }
diff --git a/src/applications/herald/controller/HeraldRuleViewController.php b/src/applications/herald/controller/HeraldRuleViewController.php
index 26a055617c..b7b6f582bc 100644
--- a/src/applications/herald/controller/HeraldRuleViewController.php
+++ b/src/applications/herald/controller/HeraldRuleViewController.php
@@ -1,116 +1,116 @@
 <?php
 
 final class HeraldRuleViewController extends HeraldController {
 
   private $id;
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $rule = id(new HeraldRuleQuery())
       ->setViewer($viewer)
       ->withIDs(array($this->id))
       ->needConditionsAndActions(true)
       ->executeOne();
     if (!$rule) {
       return new Aphront404Response();
     }
 
     $header = id(new PHUIHeaderView())
       ->setHeader($rule->getName());
 
     $actions = $this->buildActionView($rule);
     $properties = $this->buildPropertyView($rule);
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName(pht('Rule %d', $rule->getID())));
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
       ),
       array(
         'title' => $rule->getName(),
         'device' => true,
       ));
   }
 
   private function buildActionView(HeraldRule $rule) {
     $viewer = $this->getRequest()->getUser();
     $id = $rule->getID();
 
     $view = id(new PhabricatorActionListView())
       ->setUser($viewer)
       ->setObject($rule)
       ->setObjectURI($this->getApplicationURI("rule/{$id}/"));
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $rule,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Rule'))
         ->setHref($this->getApplicationURI("edit/{$id}/"))
         ->setIcon('edit')
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     return $view;
   }
 
   private function buildPropertyView(HeraldRule $rule) {
     $viewer = $this->getRequest()->getUser();
 
     $this->loadHandles(HeraldAdapter::getHandlePHIDs($rule));
 
     $view = id(new PhabricatorPropertyListView())
       ->setUser($viewer)
       ->setObject($rule);
 
     $view->addProperty(
       pht('Rule Type'),
       idx(HeraldRuleTypeConfig::getRuleTypeMap(), $rule->getRuleType()));
 
     if ($rule->isPersonalRule()) {
       $view->addProperty(
         pht('Author'),
         $this->getHandle($rule->getAuthorPHID())->renderLink());
     }
 
     $adapter = HeraldAdapter::getAdapterForContentType($rule->getContentType());
     if ($adapter) {
       $view->addProperty(
         pht('Applies To'),
         idx(HeraldAdapter::getEnabledAdapterMap(), $rule->getContentType()));
 
       $view->invokeWillRenderEvent();
 
       $view->addSectionHeader(pht('Rule Description'));
       $view->addTextContent(
         phutil_tag(
           'div',
           array(
             'style' => 'white-space: pre-wrap;',
           ),
           $adapter->renderRuleAsText($rule, $this->getLoadedHandles())));
     }
 
     return $view;
   }
 
 }
diff --git a/src/applications/legalpad/controller/LegalpadDocumentViewController.php b/src/applications/legalpad/controller/LegalpadDocumentViewController.php
index 2168a4616b..ccfe5684af 100644
--- a/src/applications/legalpad/controller/LegalpadDocumentViewController.php
+++ b/src/applications/legalpad/controller/LegalpadDocumentViewController.php
@@ -1,223 +1,223 @@
 <?php
 
 /**
  * @group legalpad
  */
 final class LegalpadDocumentViewController extends LegalpadController {
 
   private $id;
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $document = id(new LegalpadDocumentQuery())
       ->setViewer($user)
       ->withIDs(array($this->id))
       ->needDocumentBodies(true)
       ->needContributors(true)
       ->executeOne();
 
     if (!$document) {
       return new Aphront404Response();
     }
 
     $xactions = id(new LegalpadTransactionQuery())
       ->setViewer($user)
       ->withObjectPHIDs(array($document->getPHID()))
       ->execute();
 
     $subscribers = PhabricatorSubscribersQuery::loadSubscribersForPHID(
       $document->getPHID());
 
     $document_body = $document->getDocumentBody();
     $phids = array();
     $phids[] = $document_body->getCreatorPHID();
     foreach ($subscribers as $subscriber) {
       $phids[] = $subscriber;
     }
     foreach ($document->getContributors() as $contributor) {
       $phids[] = $contributor;
     }
     $this->loadHandles($phids);
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($user);
     $engine->addObject(
       $document_body,
       LegalpadDocumentBody::MARKUP_FIELD_TEXT);
     foreach ($xactions as $xaction) {
       if ($xaction->getComment()) {
         $engine->addObject(
           $xaction->getComment(),
           PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
       }
     }
     $engine->process();
 
     $title = $document_body->getTitle();
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title)
       ->setUser($user)
       ->setPolicyObject($document);
 
     $actions = $this->buildActionView($document);
     $properties = $this->buildPropertyView($document, $engine);
 
     $comment_form_id = celerity_generate_unique_node_id();
 
     $xaction_view = id(new LegalpadTransactionView())
       ->setUser($this->getRequest()->getUser())
       ->setObjectPHID($document->getPHID())
       ->setTransactions($xactions)
       ->setMarkupEngine($engine);
 
     $add_comment = $this->buildAddCommentView($document, $comment_form_id);
 
     $crumbs = $this->buildApplicationCrumbs($this->buildSideNav());
     $crumbs->setActionList($actions);
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName('L'.$document->getID())
         ->setHref($this->getApplicationURI('view/'.$document->getID())));
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     $content = array(
       $crumbs,
       $object_box,
       $this->buildDocument($engine, $document_body),
       $xaction_view,
       $add_comment,
     );
 
     return $this->buildApplicationPage(
       $content,
       array(
         'title' => $title,
         'device' => true,
         'pageObjects' => array($document->getPHID()),
       ));
   }
 
   private function buildDocument(
     PhabricatorMarkupEngine
     $engine, LegalpadDocumentBody $body) {
 
     require_celerity_resource('legalpad-documentbody-css');
 
     return phutil_tag(
       'div',
       array(
         'class' => 'legalpad-documentbody'
       ),
       $engine->getOutput($body, LegalpadDocumentBody::MARKUP_FIELD_TEXT));
 
   }
 
   private function buildActionView(LegalpadDocument $document) {
     $user = $this->getRequest()->getUser();
 
     $actions = id(new PhabricatorActionListView())
       ->setUser($user)
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setObject($document);
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $user,
       $document,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setIcon('edit')
         ->setName(pht('Edit Document'))
         ->setHref($this->getApplicationURI('/edit/'.$document->getID().'/'))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     return $actions;
   }
 
   private function buildPropertyView(
     LegalpadDocument $document,
     PhabricatorMarkupEngine $engine) {
 
     $user = $this->getRequest()->getUser();
 
     $properties = id(new PhabricatorPropertyListView())
       ->setUser($user)
       ->setObject($document);
 
     $properties->addProperty(
       pht('Last Updated'),
       phabricator_datetime($document->getDateModified(), $user));
 
     $properties->addProperty(
       pht('Updated By'),
       $this->getHandle(
         $document->getDocumentBody()->getCreatorPHID())->renderLink());
 
     $properties->addProperty(
       pht('Versions'),
       $document->getVersions());
 
     $contributor_view = array();
     foreach ($document->getContributors() as $contributor) {
       $contributor_view[] = $this->getHandle($contributor)->renderLink();
     }
     $contributor_view = phutil_implode_html(', ', $contributor_view);
     $properties->addProperty(
       pht('Contributors'),
       $contributor_view);
 
     $properties->invokeWillRenderEvent();
 
     return $properties;
   }
 
   private function buildAddCommentView(
     LegalpadDocument $document,
     $comment_form_id) {
     $user = $this->getRequest()->getUser();
 
     $draft = PhabricatorDraft::newFromUserAndKey($user, $document->getPHID());
 
     $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
 
     $title = $is_serious
       ? pht('Add Comment')
       : pht('Debate Legislation');
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title);
 
     $button_name = $is_serious
       ? pht('Add Comment')
       : pht('Commence Filibuster');
 
     $form = id(new PhabricatorApplicationTransactionCommentView())
       ->setUser($user)
       ->setObjectPHID($document->getPHID())
       ->setFormID($comment_form_id)
       ->setDraft($draft)
       ->setSubmitButtonName($button_name)
       ->setAction($this->getApplicationURI('/comment/'.$document->getID().'/'))
       ->setRequestURI($this->getRequest()->getRequestURI());
 
     return id(new PHUIObjectBoxView())
       ->setFlush(true)
       ->setHeader($header)
-      ->addContent($form);
+      ->appendChild($form);
 
   }
 
 }
diff --git a/src/applications/macro/controller/PhabricatorMacroEditController.php b/src/applications/macro/controller/PhabricatorMacroEditController.php
index e2eb917096..1cdf858a8e 100644
--- a/src/applications/macro/controller/PhabricatorMacroEditController.php
+++ b/src/applications/macro/controller/PhabricatorMacroEditController.php
@@ -1,281 +1,281 @@
 <?php
 
 final class PhabricatorMacroEditController
   extends PhabricatorMacroController {
 
   private $id;
 
   public function willProcessRequest(array $data) {
     $this->id = idx($data, 'id');
   }
 
   public function processRequest() {
 
     $request = $this->getRequest();
     $user = $request->getUser();
 
     if ($this->id) {
       $macro = id(new PhabricatorMacroQuery())
         ->setViewer($user)
         ->requireCapabilities(
           array(
             PhabricatorPolicyCapability::CAN_VIEW,
             PhabricatorPolicyCapability::CAN_EDIT,
           ))
         ->withIDs(array($this->id))
         ->executeOne();
       if (!$macro) {
         return new Aphront404Response();
       }
     } else {
       $macro = new PhabricatorFileImageMacro();
       $macro->setAuthorPHID($user->getPHID());
     }
 
     $errors = array();
     $e_name = true;
     $e_file = null;
     $file = null;
     $can_fetch = PhabricatorEnv::getEnvConfig('security.allow-outbound-http');
 
     if ($request->isFormPost()) {
       $original = clone $macro;
 
       $new_name = null;
       if ($request->getBool('name_form') || !$macro->getID()) {
         $new_name = $request->getStr('name');
 
         $macro->setName($new_name);
 
         if (!strlen($macro->getName())) {
           $errors[] = pht('Macro name is required.');
           $e_name = pht('Required');
         } else if (!preg_match('/^[a-z0-9:_-]{3,}$/', $macro->getName())) {
           $errors[] = pht(
             'Macro must be at least three characters long and contain only '.
             'lowercase letters, digits, hyphens, colons and underscores.');
           $e_name = pht('Invalid');
         } else {
           $e_name = null;
         }
       }
 
       $file = null;
       if ($request->getFileExists('file')) {
         $file = PhabricatorFile::newFromPHPUpload(
           $_FILES['file'],
           array(
             'name' => $request->getStr('name'),
             'authorPHID' => $user->getPHID(),
             'isExplicitUpload' => true,
           ));
       } else if ($request->getStr('url')) {
         try {
           $file = PhabricatorFile::newFromFileDownload(
             $request->getStr('url'),
             array(
               'name' => $request->getStr('name'),
               'authorPHID' => $user->getPHID(),
               'isExplicitUpload' => true,
             ));
         } catch (Exception $ex) {
           $errors[] = pht('Could not fetch URL: %s', $ex->getMessage());
         }
       } else if ($request->getStr('phid')) {
         $file = id(new PhabricatorFile())->loadOneWhere(
           'phid = %s',
           $request->getStr('phid'));
       }
 
       if ($file) {
         if (!$file->isViewableInBrowser()) {
           $errors[] = pht('You must upload an image.');
           $e_file = pht('Invalid');
         } else {
           $macro->setFilePHID($file->getPHID());
           $macro->attachFile($file);
           $e_file = null;
         }
       }
 
       if (!$macro->getID() && !$file) {
         $errors[] = pht('You must upload an image to create a macro.');
         $e_file = pht('Required');
       }
 
       if (!$errors) {
         try {
           $xactions = array();
 
           if ($new_name !== null) {
             $xactions[] = id(new PhabricatorMacroTransaction())
               ->setTransactionType(PhabricatorMacroTransactionType::TYPE_NAME)
               ->setNewValue($new_name);
           }
 
           if ($file) {
             $xactions[] = id(new PhabricatorMacroTransaction())
               ->setTransactionType(PhabricatorMacroTransactionType::TYPE_FILE)
               ->setNewValue($file->getPHID());
           }
 
           $editor = id(new PhabricatorMacroEditor())
             ->setActor($user)
             ->setContinueOnNoEffect(true)
             ->setContentSourceFromRequest($request);
 
           $xactions = $editor->applyTransactions($original, $xactions);
 
           $view_uri = $this->getApplicationURI('/view/'.$original->getID().'/');
           return id(new AphrontRedirectResponse())->setURI($view_uri);
         } catch (AphrontQueryDuplicateKeyException $ex) {
           throw $ex;
           $errors[] = pht('Macro name is not unique!');
           $e_name = pht('Duplicate');
         }
       }
     }
 
     if ($errors) {
       $error_view = new AphrontErrorView();
       $error_view->setTitle(pht('Form Errors'));
       $error_view->setErrors($errors);
     } else {
       $error_view = null;
     }
 
     $current_file = null;
     if ($macro->getFilePHID()) {
       $current_file = $macro->getFile();
     }
 
     $form = new AphrontFormView();
     $form->addHiddenInput('name_form', 1);
     $form->setUser($request->getUser());
 
     $form
       ->setEncType('multipart/form-data')
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Name'))
           ->setName('name')
           ->setValue($macro->getName())
           ->setCaption(
             pht('This word or phrase will be replaced with the image.'))
           ->setError($e_name));
 
     if (!$macro->getID()) {
       if ($current_file) {
         $current_file_view = id(new PhabricatorFileLinkView())
           ->setFilePHID($current_file->getPHID())
           ->setFileName($current_file->getName())
           ->setFileViewable(true)
           ->setFileViewURI($current_file->getBestURI())
           ->render();
         $form->addHiddenInput('phid', $current_file->getPHID());
         $form->appendChild(
           id(new AphrontFormMarkupControl())
             ->setLabel(pht('Selected File'))
             ->setValue($current_file_view));
 
         $other_label = pht('Change File');
       } else {
         $other_label = pht('File');
       }
 
       if ($can_fetch) {
         $form->appendChild(
           id(new AphrontFormTextControl())
             ->setLabel(pht('URL'))
             ->setName('url')
             ->setValue($request->getStr('url'))
             ->setError($request->getFileExists('file') ? false : $e_file));
       }
 
       $form->appendChild(
         id(new AphrontFormFileControl())
           ->setLabel($other_label)
           ->setName('file')
           ->setError($request->getStr('url') ? false : $e_file));
     }
 
 
     $view_uri = $this->getApplicationURI('/view/'.$macro->getID().'/');
 
     if ($macro->getID()) {
       $cancel_uri = $view_uri;
     } else {
       $cancel_uri = $this->getApplicationURI();
     }
 
     $form
       ->appendChild(
         id(new AphrontFormSubmitControl())
           ->setValue(pht('Save Image Macro'))
           ->addCancelButton($cancel_uri));
 
     $crumbs = $this->buildApplicationCrumbs();
 
     if ($macro->getID()) {
       $title = pht('Edit Image Macro');
       $crumb = pht('Edit Macro');
 
       $crumbs->addCrumb(
         id(new PhabricatorCrumbView())
           ->setHref($view_uri)
           ->setName(pht('Macro "%s"', $macro->getName())));
     } else {
       $title = pht('Create Image Macro');
       $crumb = pht('Create Macro');
     }
 
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setHref($request->getRequestURI())
         ->setName($crumb));
 
     $upload = null;
     if ($macro->getID()) {
       $upload_form = id(new AphrontFormView())
         ->setEncType('multipart/form-data')
         ->setUser($request->getUser());
 
       if ($can_fetch) {
         $upload_form->appendChild(
           id(new AphrontFormTextControl())
             ->setLabel(pht('URL'))
             ->setName('url')
             ->setValue($request->getStr('url')));
       }
 
       $upload_form
         ->appendChild(
           id(new AphrontFormFileControl())
             ->setLabel(pht('File'))
             ->setName('file'))
         ->appendChild(
           id(new AphrontFormSubmitControl())
             ->setValue(pht('Upload File')));
 
       $upload = id(new PHUIObjectBoxView())
-      ->setHeaderText(pht('Upload New File'))
-      ->setForm($upload_form);
+        ->setHeaderText(pht('Upload New File'))
+        ->setForm($upload_form);
     }
 
     $form_box = id(new PHUIObjectBoxView())
       ->setHeaderText($title)
       ->setFormError($error_view)
       ->setForm($form);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $form_box,
         $upload,
       ),
       array(
         'title' => $title,
         'device' => true,
       ));
   }
 }
diff --git a/src/applications/macro/controller/PhabricatorMacroViewController.php b/src/applications/macro/controller/PhabricatorMacroViewController.php
index 11e1b2a32b..39fb032ed7 100644
--- a/src/applications/macro/controller/PhabricatorMacroViewController.php
+++ b/src/applications/macro/controller/PhabricatorMacroViewController.php
@@ -1,196 +1,196 @@
 <?php
 
 final class PhabricatorMacroViewController
   extends PhabricatorMacroController {
 
   private $id;
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $macro = id(new PhabricatorMacroQuery())
       ->setViewer($user)
       ->withIDs(array($this->id))
       ->executeOne();
     if (!$macro) {
       return new Aphront404Response();
     }
 
     $file = $macro->getFile();
 
     $title_short = pht('Macro "%s"', $macro->getName());
     $title_long  = pht('Image Macro "%s"', $macro->getName());
 
     $actions = $this->buildActionView($macro);
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->setActionList($actions);
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setHref($this->getApplicationURI('/view/'.$macro->getID().'/'))
         ->setName($title_short));
 
     $properties = $this->buildPropertyView($macro, $file);
 
     $xactions = id(new PhabricatorMacroTransactionQuery())
       ->setViewer($request->getUser())
       ->withObjectPHIDs(array($macro->getPHID()))
       ->execute();
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($user);
     foreach ($xactions as $xaction) {
       if ($xaction->getComment()) {
         $engine->addObject(
           $xaction->getComment(),
           PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
       }
     }
     $engine->process();
 
     $timeline = id(new PhabricatorApplicationTransactionView())
       ->setUser($user)
       ->setObjectPHID($macro->getPHID())
       ->setTransactions($xactions)
       ->setMarkupEngine($engine);
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title_long);
 
     if ($macro->getIsDisabled()) {
       $header->addTag(
         id(new PhabricatorTagView())
           ->setType(PhabricatorTagView::TYPE_STATE)
           ->setName(pht('Macro Disabled'))
           ->setBackgroundColor(PhabricatorTagView::COLOR_BLACK));
     }
 
     $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
 
     $add_comment_header = id(new PHUIHeaderView())
       ->setHeader(
         $is_serious
           ? pht('Add Comment')
           : pht('Grovel in Awe'));
 
     $submit_button_name = $is_serious
       ? pht('Add Comment')
       : pht('Lavish Praise');
 
     $draft = PhabricatorDraft::newFromUserAndKey($user, $macro->getPHID());
 
     $add_comment_form = id(new PhabricatorApplicationTransactionCommentView())
       ->setUser($user)
       ->setObjectPHID($macro->getPHID())
       ->setDraft($draft)
       ->setAction($this->getApplicationURI('/comment/'.$macro->getID().'/'))
       ->setSubmitButtonName($submit_button_name);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     $comment_box = id(new PHUIObjectBoxView())
       ->setFlush(true)
       ->setHeader($add_comment_header)
-      ->addContent($add_comment_form);
+      ->appendChild($add_comment_form);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $timeline,
         $comment_box,
       ),
       array(
         'title' => $title_short,
         'device' => true,
       ));
   }
 
   private function buildActionView(PhabricatorFileImageMacro $macro) {
     $request = $this->getRequest();
     $view = id(new PhabricatorActionListView())
       ->setUser($request->getUser())
       ->setObject($macro)
       ->setObjectURI($request->getRequestURI())
       ->addAction(
         id(new PhabricatorActionView())
         ->setName(pht('Edit Macro'))
         ->setHref($this->getApplicationURI('/edit/'.$macro->getID().'/'))
         ->setIcon('edit'));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Audio'))
         ->setHref($this->getApplicationURI('/audio/'.$macro->getID().'/'))
         ->setIcon('herald'));
 
     if ($macro->getIsDisabled()) {
       $view->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Restore Macro'))
           ->setHref($this->getApplicationURI('/disable/'.$macro->getID().'/'))
           ->setWorkflow(true)
           ->setIcon('undo'));
     } else {
       $view->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Disable Macro'))
           ->setHref($this->getApplicationURI('/disable/'.$macro->getID().'/'))
           ->setWorkflow(true)
           ->setIcon('delete'));
     }
 
     return $view;
   }
 
   private function buildPropertyView(
     PhabricatorFileImageMacro $macro,
     PhabricatorFile $file = null) {
 
     $view = id(new PhabricatorPropertyListView())
       ->setUser($this->getRequest()->getUser())
       ->setObject($macro);
 
     switch ($macro->getAudioBehavior()) {
       case PhabricatorFileImageMacro::AUDIO_BEHAVIOR_ONCE:
         $view->addProperty(pht('Audio Behavior'), pht('Play Once'));
         break;
       case PhabricatorFileImageMacro::AUDIO_BEHAVIOR_LOOP:
         $view->addProperty(pht('Audio Behavior'), pht('Loop'));
         break;
     }
 
     $audio_phid = $macro->getAudioPHID();
     if ($audio_phid) {
       $this->loadHandles(array($audio_phid));
 
       $view->addProperty(
         pht('Audio'),
         $this->getHandle($audio_phid)->renderLink());
     }
 
 
     $view->invokeWillRenderEvent();
 
     if ($file) {
       $view->addImageContent(
         phutil_tag(
           'img',
           array(
             'src'     => $file->getViewURI(),
             'class'   => 'phabricator-image-macro-hero',
           )));
     }
 
     return $view;
   }
 
 }
diff --git a/src/applications/maniphest/controller/ManiphestTaskDetailController.php b/src/applications/maniphest/controller/ManiphestTaskDetailController.php
index 62e533a098..ee00597a3f 100644
--- a/src/applications/maniphest/controller/ManiphestTaskDetailController.php
+++ b/src/applications/maniphest/controller/ManiphestTaskDetailController.php
@@ -1,647 +1,647 @@
 <?php
 
 final class ManiphestTaskDetailController extends ManiphestController {
 
   private $id;
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
   }
 
   public function processRequest() {
 
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $e_title = null;
 
     $priority_map = ManiphestTaskPriority::getTaskPriorityMap();
 
     $task = id(new ManiphestTaskQuery())
       ->setViewer($user)
       ->withIDs(array($this->id))
       ->executeOne();
     if (!$task) {
       return new Aphront404Response();
     }
 
     $workflow = $request->getStr('workflow');
     $parent_task = null;
     if ($workflow && is_numeric($workflow)) {
       $parent_task = id(new ManiphestTaskQuery())
         ->setViewer($user)
         ->withIDs(array($workflow))
         ->executeOne();
     }
 
     $transactions = id(new ManiphestTransactionQuery())
       ->setViewer($user)
       ->withObjectPHIDs(array($task->getPHID()))
       ->needComments(true)
       ->execute();
 
     $field_list = PhabricatorCustomField::getObjectFields(
       $task,
       PhabricatorCustomField::ROLE_VIEW);
 
     foreach ($field_list->getFields() as $field) {
       $field->setObject($task);
       $field->setViewer($user);
     }
 
     $field_list->readFieldsFromStorage($task);
 
     $aux_fields = $field_list->getFields();
 
     $e_commit = PhabricatorEdgeConfig::TYPE_TASK_HAS_COMMIT;
     $e_dep_on = PhabricatorEdgeConfig::TYPE_TASK_DEPENDS_ON_TASK;
     $e_dep_by = PhabricatorEdgeConfig::TYPE_TASK_DEPENDED_ON_BY_TASK;
     $e_rev    = PhabricatorEdgeConfig::TYPE_TASK_HAS_RELATED_DREV;
     $e_mock   = PhabricatorEdgeConfig::TYPE_TASK_HAS_MOCK;
 
     $phid = $task->getPHID();
 
     $query = id(new PhabricatorEdgeQuery())
       ->withSourcePHIDs(array($phid))
       ->withEdgeTypes(
         array(
           $e_commit,
           $e_dep_on,
           $e_dep_by,
           $e_rev,
           $e_mock,
         ));
     $edges = idx($query->execute(), $phid);
     $phids = array_fill_keys($query->getDestinationPHIDs(), true);
 
     foreach ($task->getCCPHIDs() as $phid) {
       $phids[$phid] = true;
     }
     foreach ($task->getProjectPHIDs() as $phid) {
       $phids[$phid] = true;
     }
     if ($task->getOwnerPHID()) {
       $phids[$task->getOwnerPHID()] = true;
     }
     $phids[$task->getAuthorPHID()] = true;
 
     $attached = $task->getAttached();
     foreach ($attached as $type => $list) {
       foreach ($list as $phid => $info) {
         $phids[$phid] = true;
       }
     }
 
     if ($parent_task) {
       $phids[$parent_task->getPHID()] = true;
     }
 
     $phids = array_keys($phids);
 
     $this->loadHandles($phids);
 
     $handles = $this->getLoadedHandles();
 
     $context_bar = null;
 
     if ($parent_task) {
       $context_bar = new AphrontContextBarView();
       $context_bar->addButton(phutil_tag(
       'a',
       array(
         'href' => '/maniphest/task/create/?parent='.$parent_task->getID(),
         'class' => 'green button',
       ),
       pht('Create Another Subtask')));
       $context_bar->appendChild(hsprintf(
         'Created a subtask of <strong>%s</strong>',
         $this->getHandle($parent_task->getPHID())->renderLink()));
     } else if ($workflow == 'create') {
       $context_bar = new AphrontContextBarView();
       $context_bar->addButton(phutil_tag('label', array(), 'Create Another'));
       $context_bar->addButton(phutil_tag(
         'a',
         array(
           'href' => '/maniphest/task/create/?template='.$task->getID(),
           'class' => 'green button',
         ),
         pht('Similar Task')));
       $context_bar->addButton(phutil_tag(
         'a',
         array(
           'href' => '/maniphest/task/create/',
           'class' => 'green button',
         ),
         pht('Empty Task')));
       $context_bar->appendChild(pht('New task created.'));
     }
 
     $engine = new PhabricatorMarkupEngine();
     $engine->setViewer($user);
     $engine->addObject($task, ManiphestTask::MARKUP_FIELD_DESCRIPTION);
     foreach ($transactions as $modern_xaction) {
       if ($modern_xaction->getComment()) {
         $engine->addObject(
           $modern_xaction->getComment(),
           PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
       }
     }
 
     $engine->process();
 
     $resolution_types = ManiphestTaskStatus::getTaskStatusMap();
 
     $transaction_types = array(
       PhabricatorTransactions::TYPE_COMMENT => pht('Comment'),
       ManiphestTransaction::TYPE_STATUS     => pht('Close Task'),
       ManiphestTransaction::TYPE_OWNER      => pht('Reassign / Claim'),
       ManiphestTransaction::TYPE_CCS        => pht('Add CCs'),
       ManiphestTransaction::TYPE_PRIORITY   => pht('Change Priority'),
       ManiphestTransaction::TYPE_ATTACH     => pht('Upload File'),
       ManiphestTransaction::TYPE_PROJECTS   => pht('Associate Projects'),
     );
 
     if ($task->getStatus() == ManiphestTaskStatus::STATUS_OPEN) {
       $resolution_types = array_select_keys(
         $resolution_types,
         array(
           ManiphestTaskStatus::STATUS_CLOSED_RESOLVED,
           ManiphestTaskStatus::STATUS_CLOSED_WONTFIX,
           ManiphestTaskStatus::STATUS_CLOSED_INVALID,
           ManiphestTaskStatus::STATUS_CLOSED_SPITE,
         ));
     } else {
       $resolution_types = array(
         ManiphestTaskStatus::STATUS_OPEN => 'Reopened',
       );
       $transaction_types[ManiphestTransaction::TYPE_STATUS] =
         'Reopen Task';
       unset($transaction_types[ManiphestTransaction::TYPE_PRIORITY]);
       unset($transaction_types[ManiphestTransaction::TYPE_OWNER]);
     }
 
     $default_claim = array(
       $user->getPHID() => $user->getUsername().' ('.$user->getRealName().')',
     );
 
     $draft = id(new PhabricatorDraft())->loadOneWhere(
       'authorPHID = %s AND draftKey = %s',
       $user->getPHID(),
       $task->getPHID());
     if ($draft) {
       $draft_text = $draft->getDraft();
     } else {
       $draft_text = null;
     }
 
     $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
 
     if ($is_serious) {
       // Prevent tasks from being closed "out of spite" in serious business
       // installs.
       unset($resolution_types[ManiphestTaskStatus::STATUS_CLOSED_SPITE]);
     }
 
     $comment_form = new AphrontFormView();
     $comment_form
       ->setUser($user)
       ->setAction('/maniphest/transaction/save/')
       ->setEncType('multipart/form-data')
       ->addHiddenInput('taskID', $task->getID())
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Action'))
           ->setName('action')
           ->setOptions($transaction_types)
           ->setID('transaction-action'))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Resolution'))
           ->setName('resolution')
           ->setControlID('resolution')
           ->setControlStyle('display: none')
           ->setOptions($resolution_types))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Assign To'))
           ->setName('assign_to')
           ->setControlID('assign_to')
           ->setControlStyle('display: none')
           ->setID('assign-tokenizer')
           ->setDisableBehavior(true))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('CCs'))
           ->setName('ccs')
           ->setControlID('ccs')
           ->setControlStyle('display: none')
           ->setID('cc-tokenizer')
           ->setDisableBehavior(true))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Priority'))
           ->setName('priority')
           ->setOptions($priority_map)
           ->setControlID('priority')
           ->setControlStyle('display: none')
           ->setValue($task->getPriority()))
       ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Projects'))
           ->setName('projects')
           ->setControlID('projects')
           ->setControlStyle('display: none')
           ->setID('projects-tokenizer')
           ->setDisableBehavior(true))
       ->appendChild(
         id(new AphrontFormFileControl())
           ->setLabel(pht('File'))
           ->setName('file')
           ->setControlID('file')
           ->setControlStyle('display: none'))
       ->appendChild(
         id(new PhabricatorRemarkupControl())
           ->setLabel(pht('Comments'))
           ->setName('comments')
           ->setValue($draft_text)
           ->setID('transaction-comments')
           ->setUser($user))
       ->appendChild(
         id(new AphrontFormSubmitControl())
           ->setValue($is_serious ? pht('Submit') : pht('Avast!')));
 
     $control_map = array(
       ManiphestTransaction::TYPE_STATUS   => 'resolution',
       ManiphestTransaction::TYPE_OWNER    => 'assign_to',
       ManiphestTransaction::TYPE_CCS      => 'ccs',
       ManiphestTransaction::TYPE_PRIORITY => 'priority',
       ManiphestTransaction::TYPE_PROJECTS => 'projects',
       ManiphestTransaction::TYPE_ATTACH   => 'file',
     );
 
     $tokenizer_map = array(
       ManiphestTransaction::TYPE_PROJECTS => array(
         'id'          => 'projects-tokenizer',
         'src'         => '/typeahead/common/projects/',
         'ondemand'    => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
         'placeholder' => pht('Type a project name...'),
       ),
       ManiphestTransaction::TYPE_OWNER => array(
         'id'          => 'assign-tokenizer',
         'src'         => '/typeahead/common/users/',
         'value'       => $default_claim,
         'limit'       => 1,
         'ondemand'    => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
         'placeholder' => pht('Type a user name...'),
       ),
       ManiphestTransaction::TYPE_CCS => array(
         'id'          => 'cc-tokenizer',
         'src'         => '/typeahead/common/mailable/',
         'ondemand'    => PhabricatorEnv::getEnvConfig('tokenizer.ondemand'),
         'placeholder' => pht('Type a user or mailing list...'),
       ),
     );
 
     // TODO: Initializing these behaviors for logged out users fatals things.
     if ($user->isLoggedIn()) {
       Javelin::initBehavior('maniphest-transaction-controls', array(
         'select'     => 'transaction-action',
         'controlMap' => $control_map,
         'tokenizers' => $tokenizer_map,
       ));
 
       Javelin::initBehavior('maniphest-transaction-preview', array(
         'uri'        => '/maniphest/transaction/preview/'.$task->getID().'/',
         'preview'    => 'transaction-preview',
         'comments'   => 'transaction-comments',
         'action'     => 'transaction-action',
         'map'        => $control_map,
         'tokenizers' => $tokenizer_map,
       ));
     }
 
     $comment_header = id(new PHUIHeaderView())
       ->setHeader($is_serious ? pht('Add Comment') : pht('Weigh In'));
 
     $preview_panel = hsprintf(
       '<div class="aphront-panel-preview">
         <div id="transaction-preview">
           <div class="aphront-panel-preview-loading-text">%s</div>
         </div>
       </div>',
       pht('Loading preview...'));
 
     $timeline = id(new PhabricatorApplicationTransactionView())
       ->setUser($user)
       ->setObjectPHID($task->getPHID())
       ->setTransactions($transactions)
       ->setMarkupEngine($engine);
 
     $object_name = 'T'.$task->getID();
     $actions = $this->buildActionView($task);
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName($object_name)
         ->setHref('/'.$object_name))
       ->setActionList($actions);
 
     $header = $this->buildHeaderView($task);
     $properties = $this->buildPropertyView($task, $field_list, $edges, $engine);
 
     if (!$user->isLoggedIn()) {
       // TODO: Eventually, everything should run through this. For now, we're
       // only using it to get a consistent "Login to Comment" button.
       $comment_form = id(new PhabricatorApplicationTransactionCommentView())
         ->setUser($user)
         ->setRequestURI($request->getRequestURI());
       $preview_panel = null;
     }
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     $comment_box = id(new PHUIObjectBoxView())
       ->setFlush(true)
       ->setHeader($comment_header)
-      ->addContent($comment_form);
+      ->appendChild($comment_form);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $context_bar,
         $object_box,
         $timeline,
         $comment_box,
         $preview_panel,
       ),
       array(
         'title' => 'T'.$task->getID().' '.$task->getTitle(),
         'pageObjects' => array($task->getPHID()),
         'device' => true,
       ));
   }
 
   private function buildHeaderView(ManiphestTask $task) {
     $view = id(new PHUIHeaderView())
       ->setHeader($task->getTitle())
       ->setUser($this->getRequest()->getUser())
       ->setPolicyObject($task);
 
     $status = $task->getStatus();
     $status_name = ManiphestTaskStatus::renderFullDescription($status);
 
     $view->addProperty(PHUIHeaderView::PROPERTY_STATUS, $status_name);
 
     return $view;
   }
 
 
   private function buildActionView(ManiphestTask $task) {
     $viewer = $this->getRequest()->getUser();
     $viewer_phid = $viewer->getPHID();
     $viewer_is_cc = in_array($viewer_phid, $task->getCCPHIDs());
 
     $id = $task->getID();
     $phid = $task->getPHID();
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $task,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $view = id(new PhabricatorActionListView())
       ->setUser($viewer)
       ->setObject($task)
       ->setObjectURI($this->getRequest()->getRequestURI());
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Task'))
         ->setIcon('edit')
         ->setHref($this->getApplicationURI("/task/edit/{$id}/"))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     if ($task->getOwnerPHID() === $viewer_phid) {
       $view->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Automatically Subscribed'))
           ->setDisabled(true)
           ->setIcon('enable'));
     } else {
       $action = $viewer_is_cc ? 'rem' : 'add';
       $name   = $viewer_is_cc ? pht('Unsubscribe') : pht('Subscribe');
       $icon   = $viewer_is_cc ? 'disable' : 'check';
 
       $view->addAction(
         id(new PhabricatorActionView())
           ->setName($name)
           ->setHref("/maniphest/subscribe/{$action}/{$id}/")
           ->setRenderAsForm(true)
           ->setUser($viewer)
           ->setIcon($icon));
     }
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Merge Duplicates In'))
         ->setHref("/search/attach/{$phid}/TASK/merge/")
         ->setWorkflow(true)
         ->setIcon('merge')
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Create Subtask'))
         ->setHref($this->getApplicationURI("/task/create/?parent={$id}"))
         ->setIcon('fork'));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Dependencies'))
         ->setHref("/search/attach/{$phid}/TASK/dependencies/")
         ->setWorkflow(true)
         ->setIcon('link')
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Differential Revisions'))
         ->setHref("/search/attach/{$phid}/DREV/")
         ->setWorkflow(true)
         ->setIcon('attach')
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     $pholio_app =
       PhabricatorApplication::getByClass('PhabricatorApplicationPholio');
     if ($pholio_app->isInstalled()) {
       $view->addAction(
         id(new PhabricatorActionView())
         ->setName(pht('Edit Pholio Mocks'))
         ->setHref("/search/attach/{$phid}/MOCK/edge/")
         ->setWorkflow(true)
         ->setIcon('attach')
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
     }
 
     return $view;
   }
 
   private function buildPropertyView(
     ManiphestTask $task,
     PhabricatorCustomFieldList $field_list,
     array $edges,
     PhabricatorMarkupEngine $engine) {
 
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorPropertyListView())
       ->setUser($viewer)
       ->setObject($task);
 
     $view->addProperty(
       pht('Assigned To'),
       $task->getOwnerPHID()
       ? $this->getHandle($task->getOwnerPHID())->renderLink()
       : phutil_tag('em', array(), pht('None')));
 
     $view->addProperty(
       pht('Priority'),
       ManiphestTaskPriority::getTaskPriorityName($task->getPriority()));
 
     $view->addProperty(
       pht('Subscribers'),
       $task->getCCPHIDs()
       ? $this->renderHandlesForPHIDs($task->getCCPHIDs(), ',')
       : phutil_tag('em', array(), pht('None')));
 
     $view->addProperty(
       pht('Author'),
       $this->getHandle($task->getAuthorPHID())->renderLink());
 
     $source = $task->getOriginalEmailSource();
     if ($source) {
       $subject = '[T'.$task->getID().'] '.$task->getTitle();
       $view->addProperty(
         pht('From Email'),
         phutil_tag(
           'a',
           array(
             'href' => 'mailto:'.$source.'?subject='.$subject
           ),
           $source));
     }
 
     $view->addProperty(
       pht('Projects'),
       $task->getProjectPHIDs()
       ? $this->renderHandlesForPHIDs($task->getProjectPHIDs(), ',')
       : phutil_tag('em', array(), pht('None')));
 
     $edge_types = array(
       PhabricatorEdgeConfig::TYPE_TASK_DEPENDED_ON_BY_TASK
       => pht('Dependent Tasks'),
       PhabricatorEdgeConfig::TYPE_TASK_DEPENDS_ON_TASK
       => pht('Depends On'),
       PhabricatorEdgeConfig::TYPE_TASK_HAS_RELATED_DREV
       => pht('Differential Revisions'),
       PhabricatorEdgeConfig::TYPE_TASK_HAS_MOCK
       => pht('Pholio Mocks'),
     );
 
     $revisions_commits = array();
     $handles = $this->getLoadedHandles();
 
     $commit_phids = array_keys(
       $edges[PhabricatorEdgeConfig::TYPE_TASK_HAS_COMMIT]);
     if ($commit_phids) {
       $commit_drev = PhabricatorEdgeConfig::TYPE_COMMIT_HAS_DREV;
       $drev_edges = id(new PhabricatorEdgeQuery())
         ->withSourcePHIDs($commit_phids)
         ->withEdgeTypes(array($commit_drev))
         ->execute();
 
       foreach ($commit_phids as $phid) {
         $revisions_commits[$phid] = $handles[$phid]->renderLink();
         $revision_phid = key($drev_edges[$phid][$commit_drev]);
         $revision_handle = idx($handles, $revision_phid);
         if ($revision_handle) {
           $task_drev = PhabricatorEdgeConfig::TYPE_TASK_HAS_RELATED_DREV;
           unset($edges[$task_drev][$revision_phid]);
           $revisions_commits[$phid] = hsprintf(
             '%s / %s',
             $revision_handle->renderLink($revision_handle->getName()),
             $revisions_commits[$phid]);
         }
       }
     }
 
     foreach ($edge_types as $edge_type => $edge_name) {
       if ($edges[$edge_type]) {
         $view->addProperty(
           $edge_name,
           $this->renderHandlesForPHIDs(array_keys($edges[$edge_type])));
       }
     }
 
     if ($revisions_commits) {
       $view->addProperty(
         pht('Commits'),
         phutil_implode_html(phutil_tag('br'), $revisions_commits));
     }
 
     $attached = $task->getAttached();
     if (!is_array($attached)) {
       $attached = array();
     }
 
     $file_infos = idx($attached, PhabricatorFilePHIDTypeFile::TYPECONST);
     if ($file_infos) {
       $file_phids = array_keys($file_infos);
 
       $files = id(new PhabricatorFile())->loadAllWhere(
         'phid IN (%Ls)',
         $file_phids);
 
       $file_view = new PhabricatorFileLinkListView();
       $file_view->setFiles($files);
 
       $view->addProperty(
         pht('Files'),
         $file_view->render());
     }
 
     $field_list->appendFieldsToPropertyList(
       $task,
       $viewer,
       $view);
 
     $view->invokeWillRenderEvent();
 
     if (strlen($task->getDescription())) {
       $view->addSectionHeader(pht('Description'));
       $view->addTextContent(
         phutil_tag(
           'div',
           array(
             'class' => 'phabricator-remarkup',
           ),
           $engine->getOutput($task, ManiphestTask::MARKUP_FIELD_DESCRIPTION)));
     }
 
     return $view;
   }
 
 }
diff --git a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
index e540093d41..c789aaa969 100644
--- a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
+++ b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
@@ -1,126 +1,126 @@
 <?php
 
 final class PhabricatorApplicationDetailViewController
   extends PhabricatorApplicationsController{
 
   private $application;
 
   public function willProcessRequest(array $data) {
     $this->application = $data['application'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $selected = PhabricatorApplication::getByClass($this->application);
 
     if (!$selected) {
       return new Aphront404Response();
     }
 
     $title = $selected->getName();
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName(pht('Applications'))
         ->setHref($this->getApplicationURI()));
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title);
 
     $status_tag = id(new PhabricatorTagView())
             ->setType(PhabricatorTagView::TYPE_STATE);
 
     if ($selected->isInstalled()) {
       $status_tag->setName(pht('Installed'));
       $status_tag->setBackgroundColor(PhabricatorTagView::COLOR_GREEN);
     } else {
       $status_tag->setName(pht('Uninstalled'));
       $status_tag->setBackgroundColor(PhabricatorTagView::COLOR_RED);
     }
 
     if ($selected->isBeta()) {
       $beta_tag = id(new PhabricatorTagView())
               ->setType(PhabricatorTagView::TYPE_STATE)
               ->setName(pht('Beta'))
               ->setBackgroundColor(PhabricatorTagView::COLOR_GREY);
       $header->addTag($beta_tag);
     }
 
     $header->addTag($status_tag);
 
     $properties = $this->buildPropertyView($selected);
     $actions = $this->buildActionView($user, $selected);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
       ),
       array(
         'title' => $title,
         'device' => true,
       ));
   }
 
   private function buildPropertyView(PhabricatorApplication $selected) {
     $properties = id(new PhabricatorPropertyListView())
               ->addProperty(
                 pht('Description'), $selected->getShortDescription());
 
     return $properties;
   }
 
   private function buildActionView(
     PhabricatorUser $user, PhabricatorApplication $selected) {
 
     $view = id(new PhabricatorActionListView())
       ->setUser($user)
       ->setObjectURI($this->getRequest()->getRequestURI());
 
     if ($selected->canUninstall()) {
       if ($selected->isInstalled()) {
         $view->addAction(
                id(new PhabricatorActionView())
                ->setName(pht('Uninstall'))
                ->setIcon('delete')
                ->setWorkflow(true)
                ->setHref(
                 $this->getApplicationURI(get_class($selected).'/uninstall/')));
       } else {
         $action = id(new PhabricatorActionView())
           ->setName(pht('Install'))
           ->setIcon('new')
           ->setWorkflow(true)
           ->setHref(
            $this->getApplicationURI(get_class($selected).'/install/'));
 
         $beta_enabled = PhabricatorEnv::getEnvConfig(
           'phabricator.show-beta-applications');
         if ($selected->isBeta() && !$beta_enabled) {
           $action->setDisabled(true);
         }
 
         $view->addAction($action);
       }
     } else {
       $view->addAction(
              id(new PhabricatorActionView())
              ->setName(pht('Uninstall'))
              ->setIcon('delete')
              ->setWorkflow(true)
              ->setDisabled(true)
              ->setHref(
                $this->getApplicationURI(get_class($selected).'/uninstall/')));
     }
     return $view;
   }
 
 }
diff --git a/src/applications/paste/controller/PhabricatorPasteViewController.php b/src/applications/paste/controller/PhabricatorPasteViewController.php
index 42bd6432b7..d270fb4e06 100644
--- a/src/applications/paste/controller/PhabricatorPasteViewController.php
+++ b/src/applications/paste/controller/PhabricatorPasteViewController.php
@@ -1,242 +1,242 @@
 <?php
 
 /**
  * group paste
  */
 final class PhabricatorPasteViewController extends PhabricatorPasteController {
 
   private $id;
   private $highlightMap;
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
     $raw_lines = idx($data, 'lines');
     $map = array();
     if ($raw_lines) {
       $lines = explode('-', $raw_lines);
       $first = idx($lines, 0, 0);
       $last = idx($lines, 1);
       if ($last) {
         $min = min($first, $last);
         $max = max($first, $last);
         $map = array_fuse(range($min, $max));
       } else {
         $map[$first] = $first;
       }
     }
     $this->highlightMap = $map;
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $paste = id(new PhabricatorPasteQuery())
       ->setViewer($user)
       ->withIDs(array($this->id))
       ->needContent(true)
       ->executeOne();
     if (!$paste) {
       return new Aphront404Response();
     }
 
     $file = id(new PhabricatorFile())->loadOneWhere(
       'phid = %s',
       $paste->getFilePHID());
     if (!$file) {
       return new Aphront400Response();
     }
 
     $forks = id(new PhabricatorPasteQuery())
       ->setViewer($user)
       ->withParentPHIDs(array($paste->getPHID()))
       ->execute();
     $fork_phids = mpull($forks, 'getPHID');
 
     $this->loadHandles(
       array_merge(
         array(
           $paste->getAuthorPHID(),
           $paste->getParentPHID(),
         ),
         $fork_phids));
 
     $header = $this->buildHeaderView($paste);
     $actions = $this->buildActionView($user, $paste, $file);
     $properties = $this->buildPropertyView($paste, $fork_phids);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     $source_code = $this->buildSourceCodeView(
       $paste,
       null,
       $this->highlightMap);
 
     $source_code = id(new PHUIBoxView())
       ->appendChild($source_code)
       ->setBorder(true)
       ->addMargin(PHUI::MARGIN_LARGE_LEFT)
       ->addMargin(PHUI::MARGIN_LARGE_RIGHT)
       ->addMargin(PHUI::MARGIN_LARGE_TOP);
 
     $crumbs = $this->buildApplicationCrumbs($this->buildSideNavView())
       ->setActionList($actions)
       ->addCrumb(
         id(new PhabricatorCrumbView())
           ->setName('P'.$paste->getID())
           ->setHref('/P'.$paste->getID()));
 
     $xactions = id(new PhabricatorPasteTransactionQuery())
       ->setViewer($request->getUser())
       ->withObjectPHIDs(array($paste->getPHID()))
       ->execute();
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($user);
     foreach ($xactions as $xaction) {
       if ($xaction->getComment()) {
         $engine->addObject(
           $xaction->getComment(),
           PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
       }
     }
     $engine->process();
 
     $timeline = id(new PhabricatorApplicationTransactionView())
       ->setUser($user)
       ->setObjectPHID($paste->getPHID())
       ->setTransactions($xactions)
       ->setMarkupEngine($engine);
 
     $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
 
     $add_comment_header = id(new PHUIHeaderView())
       ->setHeader(
         $is_serious
           ? pht('Add Comment')
           : pht('Debate Paste Accuracy'));
 
     $submit_button_name = $is_serious
       ? pht('Add Comment')
       : pht('Pity the Fool');
 
     $draft = PhabricatorDraft::newFromUserAndKey($user, $paste->getPHID());
 
     $add_comment_form = id(new PhabricatorApplicationTransactionCommentView())
       ->setUser($user)
       ->setObjectPHID($paste->getPHID())
       ->setDraft($draft)
       ->setAction($this->getApplicationURI('/comment/'.$paste->getID().'/'))
       ->setSubmitButtonName($submit_button_name);
 
     $comment_box = id(new PHUIObjectBoxView())
       ->setFlush(true)
       ->setHeader($add_comment_header)
-      ->addContent($add_comment_form);
+      ->appendChild($add_comment_form);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $source_code,
         $timeline,
         $comment_box,
       ),
       array(
         'title' => $paste->getFullName(),
         'device' => true,
         'pageObjects' => array($paste->getPHID()),
       ));
   }
 
   private function buildHeaderView(PhabricatorPaste $paste) {
     $header = id(new PHUIHeaderView())
       ->setHeader($paste->getTitle())
       ->setUser($this->getRequest()->getUser())
       ->setPolicyObject($paste);
 
     return $header;
   }
 
   private function buildActionView(
     PhabricatorUser $user,
     PhabricatorPaste $paste,
     PhabricatorFile $file) {
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $user,
       $paste,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $can_fork = $user->isLoggedIn();
     $fork_uri = $this->getApplicationURI('/create/?parent='.$paste->getID());
 
     return id(new PhabricatorActionListView())
       ->setUser($user)
       ->setObject($paste)
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Fork This Paste'))
           ->setIcon('fork')
           ->setDisabled(!$can_fork)
           ->setWorkflow(!$can_fork)
           ->setHref($fork_uri))
       ->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('View Raw File'))
           ->setIcon('file')
           ->setHref($file->getBestURI()))
       ->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Edit Paste'))
           ->setIcon('edit')
           ->setDisabled(!$can_edit)
           ->setWorkflow(!$can_edit)
           ->setHref($this->getApplicationURI('/edit/'.$paste->getID().'/')));
   }
 
   private function buildPropertyView(
     PhabricatorPaste $paste,
     array $child_phids) {
 
     $user = $this->getRequest()->getUser();
     $properties = id(new PhabricatorPropertyListView())
       ->setUser($user)
       ->setObject($paste);
 
     $properties->addProperty(
       pht('Author'),
       $this->getHandle($paste->getAuthorPHID())->renderLink());
 
     $properties->addProperty(
       pht('Created'),
       phabricator_datetime($paste->getDateCreated(), $user));
 
     if ($paste->getParentPHID()) {
       $properties->addProperty(
         pht('Forked From'),
         $this->getHandle($paste->getParentPHID())->renderLink());
     }
 
     if ($child_phids) {
       $properties->addProperty(
         pht('Forks'),
         $this->renderHandlesForPHIDs($child_phids));
     }
 
     $descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
       $user,
       $paste);
 
     return $properties;
   }
 
 }
diff --git a/src/applications/people/controller/PhabricatorPeopleProfileController.php b/src/applications/people/controller/PhabricatorPeopleProfileController.php
index c31e9cc851..c42523ab30 100644
--- a/src/applications/people/controller/PhabricatorPeopleProfileController.php
+++ b/src/applications/people/controller/PhabricatorPeopleProfileController.php
@@ -1,134 +1,134 @@
 <?php
 
 final class PhabricatorPeopleProfileController
   extends PhabricatorPeopleController {
 
   private $username;
 
   public function shouldRequireAdmin() {
     return false;
   }
 
   public function willProcessRequest(array $data) {
     $this->username = idx($data, 'username');
   }
 
   public function processRequest() {
     $viewer = $this->getRequest()->getUser();
 
     $user = id(new PhabricatorPeopleQuery())
       ->setViewer($viewer)
       ->withUsernames(array($this->username))
       ->needProfileImage(true)
       ->executeOne();
     if (!$user) {
       return new Aphront404Response();
     }
 
     require_celerity_resource('phabricator-profile-css');
 
     $profile = $user->loadUserProfile();
     $username = phutil_escape_uri($user->getUserName());
 
     $picture = $user->loadProfileImageURI();
 
     $header = id(new PHUIHeaderView())
       ->setHeader($user->getUserName().' ('.$user->getRealName().')')
       ->setSubheader($profile->getTitle())
       ->setImage($picture);
 
     $actions = id(new PhabricatorActionListView())
       ->setObject($user)
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setUser($viewer);
 
     $can_edit = ($user->getPHID() == $viewer->getPHID());
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setIcon('edit')
         ->setName(pht('Edit Profile'))
         ->setHref($this->getApplicationURI('editprofile/'.$user->getID().'/'))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setIcon('image')
         ->setName(pht('Edit Profile Picture'))
         ->setHref($this->getApplicationURI('picture/'.$user->getID().'/'))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     if ($viewer->getIsAdmin()) {
       $actions->addAction(
         id(new PhabricatorActionView())
           ->setIcon('blame')
           ->setName(pht('Administrate User'))
           ->setHref($this->getApplicationURI('edit/'.$user->getID().'/')));
     }
 
     $properties = $this->buildPropertyView($user);
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName($user->getUsername()));
     $feed = $this->renderUserFeed($user);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $feed,
       ),
       array(
         'title' => $user->getUsername(),
         'device' => true,
       ));
   }
 
   private function buildPropertyView(PhabricatorUser $user) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorPropertyListView())
       ->setUser($viewer)
       ->setObject($user);
 
     $field_list = PhabricatorCustomField::getObjectFields(
       $user,
       PhabricatorCustomField::ROLE_VIEW);
     $field_list->appendFieldsToPropertyList($user, $viewer, $view);
 
     return $view;
   }
 
   private function renderUserFeed(PhabricatorUser $user) {
     $viewer = $this->getRequest()->getUser();
 
     $query = new PhabricatorFeedQuery();
     $query->setFilterPHIDs(
       array(
         $user->getPHID(),
       ));
     $query->setLimit(100);
     $query->setViewer($viewer);
     $stories = $query->execute();
 
     $builder = new PhabricatorFeedBuilder($stories);
     $builder->setUser($viewer);
     $builder->setShowHovercards(true);
     $view = $builder->buildView();
 
     return hsprintf(
       '<div class="profile-feed profile-wrap-responsive">
         %s
       </div>',
       $view->render());
   }
 }
diff --git a/src/applications/phame/controller/blog/PhameBlogViewController.php b/src/applications/phame/controller/blog/PhameBlogViewController.php
index 0782bd4bd2..0e0abbd26e 100644
--- a/src/applications/phame/controller/blog/PhameBlogViewController.php
+++ b/src/applications/phame/controller/blog/PhameBlogViewController.php
@@ -1,197 +1,197 @@
 <?php
 
 /**
  * @group phame
  */
 final class PhameBlogViewController extends PhameController {
 
   private $id;
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $blog = id(new PhameBlogQuery())
       ->setViewer($user)
       ->withIDs(array($this->id))
       ->executeOne();
     if (!$blog) {
       return new Aphront404Response();
     }
 
     $pager = id(new AphrontCursorPagerView())
       ->readFromRequest($request);
 
     $posts = id(new PhamePostQuery())
       ->setViewer($user)
       ->withBlogPHIDs(array($blog->getPHID()))
       ->executeWithCursorPager($pager);
 
     $nav = $this->renderSideNavFilterView(null);
 
     $header = id(new PHUIHeaderView())
       ->setHeader($blog->getName())
       ->setUser($user)
       ->setPolicyObject($blog);
 
     $handle_phids = array_merge(
       mpull($posts, 'getBloggerPHID'),
       mpull($posts, 'getBlogPHID'));
     $this->loadHandles($handle_phids);
 
     $actions = $this->renderActions($blog, $user);
     $properties = $this->renderProperties($blog, $user);
     $post_list = $this->renderPostList(
       $posts,
       $user,
       pht('This blog has no visible posts.'));
 
     require_celerity_resource('phame-css');
     $post_list = id(new PHUIBoxView())
       ->addPadding(PHUI::PADDING_LARGE)
       ->addClass('phame-post-list')
       ->appendChild($post_list);
 
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName($blog->getName())
         ->setHref($this->getApplicationURI()));
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     $nav->appendChild(
       array(
         $crumbs,
         $object_box,
         $post_list,
       ));
 
     return $this->buildApplicationPage(
       $nav,
       array(
         'device' => true,
         'title' => $blog->getName(),
       ));
   }
 
   private function renderProperties(PhameBlog $blog, PhabricatorUser $user) {
     require_celerity_resource('aphront-tooltip-css');
     Javelin::initBehavior('phabricator-tooltips');
 
     $properties = new PhabricatorPropertyListView();
 
     $properties->addProperty(
       pht('Skin'),
       $blog->getSkin());
 
     $properties->addProperty(
       pht('Domain'),
       $blog->getDomain());
 
     $feed_uri = PhabricatorEnv::getProductionURI(
       $this->getApplicationURI('blog/feed/'.$blog->getID().'/'));
     $properties->addProperty(
       pht('Atom URI'),
       javelin_tag('a',
         array(
           'href' => $feed_uri,
           'sigil' => 'has-tooltip',
           'meta' => array(
             'tip' => pht('Atom URI does not support custom domains.'),
             'size' => 320,
           )
         ),
         $feed_uri));
 
     $descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
       $user,
       $blog);
 
     $properties->addProperty(
       pht('Editable By'),
       $descriptions[PhabricatorPolicyCapability::CAN_EDIT]);
 
     $properties->addProperty(
       pht('Joinable By'),
       $descriptions[PhabricatorPolicyCapability::CAN_JOIN]);
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($user)
       ->addObject($blog, PhameBlog::MARKUP_FIELD_DESCRIPTION)
       ->process();
 
     $properties->addTextContent(
       phutil_tag(
         'div',
         array(
           'class' => 'phabricator-remarkup',
         ),
         $engine->getOutput($blog, PhameBlog::MARKUP_FIELD_DESCRIPTION)));
 
     return $properties;
   }
 
   private function renderActions(PhameBlog $blog, PhabricatorUser $user) {
 
     $actions = id(new PhabricatorActionListView())
       ->setObject($blog)
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setUser($user);
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $user,
       $blog,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $can_join = PhabricatorPolicyFilter::hasCapability(
       $user,
       $blog,
       PhabricatorPolicyCapability::CAN_JOIN);
 
     $must_use_form = $blog->getDomain();
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setIcon('new')
         ->setHref($this->getApplicationURI('post/edit/?blog='.$blog->getID()))
         ->setName(pht('Write Post'))
         ->setDisabled(!$can_join)
         ->setWorkflow(!$can_join));
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setUser($user)
         ->setIcon('world')
         ->setHref($this->getApplicationURI('live/'.$blog->getID().'/'))
         ->setRenderAsForm($must_use_form)
         ->setName(pht('View Live')));
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setIcon('edit')
         ->setHref($this->getApplicationURI('blog/edit/'.$blog->getID().'/'))
         ->setName('Edit Blog')
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setIcon('delete')
         ->setHref($this->getApplicationURI('blog/delete/'.$blog->getID().'/'))
         ->setName('Delete Blog')
         ->setDisabled(!$can_edit)
         ->setWorkflow(true));
 
     return $actions;
   }
 
 }
diff --git a/src/applications/phame/controller/post/PhamePostViewController.php b/src/applications/phame/controller/post/PhamePostViewController.php
index 5cf3d73ebf..f08bf0a36f 100644
--- a/src/applications/phame/controller/post/PhamePostViewController.php
+++ b/src/applications/phame/controller/post/PhamePostViewController.php
@@ -1,209 +1,209 @@
 <?php
 
 /**
  * @group phame
  */
 final class PhamePostViewController extends PhameController {
 
   private $id;
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $post = id(new PhamePostQuery())
       ->setViewer($user)
       ->withIDs(array($this->id))
       ->executeOne();
 
     if (!$post) {
       return new Aphront404Response();
     }
 
     $nav = $this->renderSideNavFilterView();
 
     $this->loadHandles(
       array(
         $post->getBlogPHID(),
         $post->getBloggerPHID(),
       ));
     $actions = $this->renderActions($post, $user);
     $properties = $this->renderProperties($post, $user);
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->setActionList($actions);
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName($post->getTitle())
         ->setHref($this->getApplicationURI('post/view/'.$post->getID().'/')));
 
     $nav->appendChild($crumbs);
 
     $header = id(new PHUIHeaderView())
         ->setHeader($post->getTitle())
         ->setUser($user)
         ->setPolicyObject($post);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     if ($post->isDraft()) {
       $object_box->appendChild(
         id(new AphrontErrorView())
           ->setSeverity(AphrontErrorView::SEVERITY_NOTICE)
           ->setTitle(pht('Draft Post'))
           ->appendChild(
             pht('Only you can see this draft until you publish it. '.
                 'Use "Preview / Publish" to publish this post.')));
     }
 
     if (!$post->getBlog()) {
       $object_box->appendChild(
         id(new AphrontErrorView())
           ->setSeverity(AphrontErrorView::SEVERITY_WARNING)
           ->setTitle(pht('Not On A Blog'))
           ->appendChild(
             pht('This post is not associated with a blog (the blog may have '.
                 'been deleted). Use "Move Post" to move it to a new blog.')));
     }
 
     $nav->appendChild(
       array(
         $object_box,
       ));
 
     return $this->buildApplicationPage(
       $nav,
       array(
         'title' => $post->getTitle(),
         'device' => true,
       ));
   }
 
   private function renderActions(
     PhamePost $post,
     PhabricatorUser $user) {
 
     $actions = id(new PhabricatorActionListView())
       ->setObject($post)
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setUser($user);
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $user,
       $post,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $id = $post->getID();
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setIcon('edit')
         ->setHref($this->getApplicationURI('post/edit/'.$id.'/'))
         ->setName(pht('Edit Post'))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setIcon('move')
         ->setHref($this->getApplicationURI('post/move/'.$id.'/'))
         ->setName(pht('Move Post'))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     if ($post->isDraft()) {
       $actions->addAction(
         id(new PhabricatorActionView())
           ->setIcon('preview')
           ->setHref($this->getApplicationURI('post/publish/'.$id.'/'))
           ->setName(pht('Preview / Publish')));
     } else {
       $actions->addAction(
         id(new PhabricatorActionView())
           ->setIcon('unpublish')
           ->setHref($this->getApplicationURI('post/unpublish/'.$id.'/'))
           ->setName(pht('Unpublish'))
           ->setWorkflow(true));
     }
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setIcon('delete')
         ->setHref($this->getApplicationURI('post/delete/'.$id.'/'))
         ->setName(pht('Delete Post'))
         ->setDisabled(!$can_edit)
         ->setWorkflow(true));
 
     $blog = $post->getBlog();
     $can_view_live = $blog && !$post->isDraft();
     $must_use_form = $blog && $blog->getDomain();
 
     if ($can_view_live) {
       $live_uri = 'live/'.$blog->getID().'/post/'.$post->getPhameTitle();
     } else {
       $live_uri = 'post/notlive/'.$post->getID().'/';
     }
     $live_uri = $this->getApplicationURI($live_uri);
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setUser($user)
         ->setIcon('world')
         ->setHref($live_uri)
         ->setName(pht('View Live'))
         ->setRenderAsForm($must_use_form)
         ->setDisabled(!$can_view_live)
         ->setWorkflow(!$can_view_live));
 
     return $actions;
   }
 
   private function renderProperties(
     PhamePost $post,
     PhabricatorUser $user) {
 
     $properties = id(new PhabricatorPropertyListView())
       ->setUser($user)
       ->setObject($post);
 
     $properties->addProperty(
       pht('Blog'),
       $post->getBlogPHID()
         ? $this->getHandle($post->getBlogPHID())->renderLink()
         : null);
 
     $properties->addProperty(
       pht('Blogger'),
       $this->getHandle($post->getBloggerPHID())->renderLink());
 
     $properties->addProperty(
       pht('Published'),
       $post->isDraft()
         ? pht('Draft')
         : phabricator_datetime($post->getDatePublished(), $user));
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($user)
       ->addObject($post, PhamePost::MARKUP_FIELD_BODY)
       ->process();
 
     $properties->invokeWillRenderEvent();
 
     $properties->addTextContent(
       phutil_tag(
          'div',
         array(
           'class' => 'phabricator-remarkup',
         ),
         $engine->getOutput($post, PhamePost::MARKUP_FIELD_BODY)));
 
     return $properties;
   }
 }
diff --git a/src/applications/phlux/controller/PhluxViewController.php b/src/applications/phlux/controller/PhluxViewController.php
index c8a87ca774..bc0c2882c4 100644
--- a/src/applications/phlux/controller/PhluxViewController.php
+++ b/src/applications/phlux/controller/PhluxViewController.php
@@ -1,94 +1,94 @@
 <?php
 
 final class PhluxViewController extends PhluxController {
 
   private $key;
 
   public function willProcessRequest(array $data) {
     $this->key = $data['key'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $var = id(new PhluxVariableQuery())
       ->setViewer($user)
       ->withKeys(array($this->key))
       ->executeOne();
 
     if (!$var) {
       return new Aphront404Response();
     }
 
     $crumbs = $this->buildApplicationCrumbs();
 
     $title = $var->getVariableKey();
 
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName($title)
         ->setHref($request->getRequestURI()));
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title)
       ->setUser($user)
       ->setPolicyObject($var);
 
     $actions = id(new PhabricatorActionListView())
       ->setUser($user)
       ->setObjectURI($request->getRequestURI())
       ->setObject($var);
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $user,
       $var,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setIcon('edit')
         ->setName(pht('Edit Variable'))
         ->setHref($this->getApplicationURI('/edit/'.$var->getVariableKey().'/'))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     $display_value = json_encode($var->getVariableValue());
 
     $properties = id(new PhabricatorPropertyListView())
       ->setUser($user)
       ->setObject($var)
       ->addProperty(pht('Value'), $display_value);
 
     $xactions = id(new PhluxTransactionQuery())
       ->setViewer($user)
       ->withObjectPHIDs(array($var->getPHID()))
       ->execute();
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($user);
 
     $xaction_view = id(new PhabricatorApplicationTransactionView())
       ->setUser($user)
       ->setObjectPHID($var->getPHID())
       ->setTransactions($xactions)
       ->setMarkupEngine($engine);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $xaction_view,
       ),
       array(
         'title'  => $title,
         'device' => true,
       ));
   }
 
 }
diff --git a/src/applications/pholio/controller/PholioMockViewController.php b/src/applications/pholio/controller/PholioMockViewController.php
index e671495d0e..b1794ea8a3 100644
--- a/src/applications/pholio/controller/PholioMockViewController.php
+++ b/src/applications/pholio/controller/PholioMockViewController.php
@@ -1,263 +1,263 @@
 <?php
 
 /**
  * @group pholio
  */
 final class PholioMockViewController extends PholioController {
 
   private $id;
   private $imageID;
   private $maniphestTaskPHIDs = array();
 
   private function setManiphestTaskPHIDs($maniphest_task_phids) {
     $this->maniphestTaskPHIDs = $maniphest_task_phids;
     return $this;
   }
   private function getManiphestTaskPHIDs() {
     return $this->maniphestTaskPHIDs;
   }
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
     $this->imageID = idx($data, 'imageID');
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $mock = id(new PholioMockQuery())
       ->setViewer($user)
       ->withIDs(array($this->id))
       ->needImages(true)
       ->needCoverFiles(true)
       ->executeOne();
 
     if (!$mock) {
       return new Aphront404Response();
     }
 
     $xactions = id(new PholioTransactionQuery())
       ->setViewer($user)
       ->withObjectPHIDs(array($mock->getPHID()))
       ->execute();
 
     $phids = PhabricatorEdgeQuery::loadDestinationPHIDs(
       $mock->getPHID(),
       PhabricatorEdgeConfig::TYPE_MOCK_HAS_TASK);
     $this->setManiphestTaskPHIDs($phids);
     $phids[] = $mock->getAuthorPHID();
     $this->loadHandles($phids);
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($user);
     $engine->addObject($mock, PholioMock::MARKUP_FIELD_DESCRIPTION);
     foreach ($xactions as $xaction) {
       if ($xaction->getComment()) {
         $engine->addObject(
           $xaction->getComment(),
           PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
       }
     }
     $engine->process();
 
     $title = $mock->getName();
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title)
       ->setUser($user)
       ->setPolicyObject($mock);
 
     $actions = $this->buildActionView($mock);
     $properties = $this->buildPropertyView($mock, $engine);
 
     require_celerity_resource('pholio-css');
     require_celerity_resource('pholio-inline-comments-css');
 
     $image_status = $this->getImageStatus($mock, $this->imageID);
 
     $comment_form_id = celerity_generate_unique_node_id();
     $output = id(new PholioMockImagesView())
       ->setRequestURI($request->getRequestURI())
       ->setCommentFormID($comment_form_id)
       ->setUser($user)
       ->setMock($mock)
       ->setImageID($this->imageID);
 
     $xaction_view = id(new PholioTransactionView())
       ->setUser($this->getRequest()->getUser())
       ->setObjectPHID($mock->getPHID())
       ->setTransactions($xactions)
       ->setMarkupEngine($engine);
 
     $add_comment = $this->buildAddCommentView($mock, $comment_form_id);
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->setActionList($actions);
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName('M'.$mock->getID())
         ->setHref('/M'.$mock->getID()));
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     $content = array(
       $crumbs,
       $image_status,
       $object_box,
       $output->render(),
       $xaction_view,
       $add_comment,
     );
 
     return $this->buildApplicationPage(
       $content,
       array(
         'title' => 'M'.$mock->getID().' '.$title,
         'device' => true,
         'pageObjects' => array($mock->getPHID()),
       ));
   }
 
   private function getImageStatus(PholioMock $mock, $image_id) {
     $status = null;
     $images = $mock->getImages();
     foreach ($images as $image) {
       if ($image->getID() == $image_id) {
         return $status;
       }
     }
 
     $images = $mock->getAllImages();
     $images = mpull($images, null, 'getID');
     $image = idx($images, $image_id);
 
     if ($image) {
       $history = $mock->getImageHistorySet($image_id);
       $latest_image = last($history);
       $href = $this->getApplicationURI(
         'image/history/'.$latest_image->getID().'/');
       $status = id(new AphrontErrorView())
         ->setSeverity(AphrontErrorView::SEVERITY_NOTICE)
         ->setTitle(pht('The requested image is obsolete.'))
         ->appendChild(phutil_tag(
           'p',
           array(),
           array(
             pht('You are viewing this mock with the latest image set.'),
             ' ',
             phutil_tag(
               'a',
               array('href' => $href),
               pht(
                 'Click here to see the history of the now obsolete image.')))));
     }
 
     return $status;
   }
 
   private function buildActionView(PholioMock $mock) {
     $user = $this->getRequest()->getUser();
 
     $actions = id(new PhabricatorActionListView())
       ->setUser($user)
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setObject($mock);
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $user,
       $mock,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $actions->addAction(
       id(new PhabricatorActionView())
       ->setIcon('edit')
       ->setName(pht('Edit Mock'))
       ->setHref($this->getApplicationURI('/edit/'.$mock->getID().'/'))
       ->setDisabled(!$can_edit)
       ->setWorkflow(!$can_edit));
 
     $actions->addAction(
       id(new PhabricatorActionView())
       ->setIcon('attach')
       ->setName(pht('Edit Maniphest Tasks'))
       ->setHref("/search/attach/{$mock->getPHID()}/TASK/edge/")
       ->setDisabled(!$user->isLoggedIn())
       ->setWorkflow(true));
 
     return $actions;
   }
 
   private function buildPropertyView(
     PholioMock $mock,
     PhabricatorMarkupEngine $engine) {
 
     $user = $this->getRequest()->getUser();
 
     $properties = id(new PhabricatorPropertyListView())
       ->setUser($user)
       ->setObject($mock);
 
     $properties->addProperty(
       pht('Author'),
       $this->getHandle($mock->getAuthorPHID())->renderLink());
 
     $properties->addProperty(
       pht('Created'),
       phabricator_datetime($mock->getDateCreated(), $user));
 
     if ($this->getManiphestTaskPHIDs()) {
       $properties->addProperty(
         pht('Maniphest Tasks'),
         $this->renderHandlesForPHIDs($this->getManiphestTaskPHIDs()));
     }
 
     $properties->invokeWillRenderEvent();
 
     $properties->addImageContent(
       $engine->getOutput($mock, PholioMock::MARKUP_FIELD_DESCRIPTION));
 
     return $properties;
   }
 
   private function buildAddCommentView(PholioMock $mock, $comment_form_id) {
     $user = $this->getRequest()->getUser();
 
     $draft = PhabricatorDraft::newFromUserAndKey($user, $mock->getPHID());
 
     $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
 
     $title = $is_serious
       ? pht('Add Comment')
       : pht('History Beckons');
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title);
 
     $button_name = $is_serious
       ? pht('Add Comment')
       : pht('Answer The Call');
 
     $form = id(new PhabricatorApplicationTransactionCommentView())
       ->setUser($user)
       ->setObjectPHID($mock->getPHID())
       ->setFormID($comment_form_id)
       ->setDraft($draft)
       ->setSubmitButtonName($button_name)
       ->setAction($this->getApplicationURI('/comment/'.$mock->getID().'/'))
       ->setRequestURI($this->getRequest()->getRequestURI());
 
     return id(new PHUIObjectBoxView())
       ->setFlush(true)
       ->setHeader($header)
-      ->addContent($form);
+      ->appendChild($form);
   }
 
 }
diff --git a/src/applications/phortune/controller/PhortuneAccountViewController.php b/src/applications/phortune/controller/PhortuneAccountViewController.php
index ee5c9fc706..b47c8ddbdb 100644
--- a/src/applications/phortune/controller/PhortuneAccountViewController.php
+++ b/src/applications/phortune/controller/PhortuneAccountViewController.php
@@ -1,183 +1,183 @@
 <?php
 
 final class PhortuneAccountViewController extends PhortuneController {
 
   private $accountID;
 
   public function willProcessRequest(array $data) {
     $this->accountID = $data['accountID'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $account = id(new PhortuneAccountQuery())
       ->setViewer($user)
       ->withIDs(array($this->accountID))
       ->executeOne();
 
     if (!$account) {
       return new Aphront404Response();
     }
 
     $title = $account->getName();
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName(pht('Account'))
         ->setHref($request->getRequestURI()));
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title);
 
     $actions = id(new PhabricatorActionListView())
       ->setUser($user)
       ->setObjectURI($request->getRequestURI())
       ->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Edit Account'))
           ->setIcon('edit')
           ->setHref('#')
           ->setDisabled(true))
       ->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Edit Members'))
           ->setIcon('transcript')
           ->setHref('#')
           ->setDisabled(true));
 
     $crumbs->setActionList($actions);
 
     $properties = id(new PhabricatorPropertyListView())
       ->setObject($account)
       ->setUser($user);
 
     $properties->addProperty(pht('Balance'), $account->getBalanceInCents());
 
     $payment_methods = $this->buildPaymentMethodsSection($account);
     $purchase_history = $this->buildPurchaseHistorySection($account);
     $account_history = $this->buildAccountHistorySection($account);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $payment_methods,
         $purchase_history,
         $account_history,
       ),
       array(
         'title' => $title,
         'device' => true,
       ));
   }
 
   private function buildPaymentMethodsSection(PhortuneAccount $account) {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $header = id(new PHUIHeaderView())
       ->setHeader(pht('Payment Methods'));
 
     $id = $account->getID();
     $add_uri = $this->getApplicationURI($id.'/paymentmethod/edit/');
 
     $actions = id(new PhabricatorActionListView())
       ->setUser($user)
       ->setObjectURI($request->getRequestURI())
       ->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Add Payment Method'))
           ->setIcon('new')
           ->setHref($add_uri));
 
     $list = id(new PHUIObjectItemListView())
       ->setUser($user)
       ->setNoDataString(
         pht('No payment methods associated with this account.'));
 
     $methods = id(new PhortunePaymentMethodQuery())
       ->setViewer($user)
       ->withAccountPHIDs(array($account->getPHID()))
       ->withStatus(PhortunePaymentMethodQuery::STATUS_OPEN)
       ->execute();
 
     if ($methods) {
       $this->loadHandles(mpull($methods, 'getAuthorPHID'));
     }
 
     foreach ($methods as $method) {
       $item = new PHUIObjectItemView();
       $item->setHeader($method->getBrand().' / '.$method->getLastFourDigits());
 
       switch ($method->getStatus()) {
         case PhortunePaymentMethod::STATUS_ACTIVE:
           $item->addAttribute(pht('Active'));
           $item->setBarColor('green');
           break;
       }
 
       $item->addAttribute(
         pht(
           'Added %s by %s',
           phabricator_datetime($method->getDateCreated(), $user),
           $this->getHandle($method->getAuthorPHID())->renderLink()));
 
       $list->addItem($item);
     }
 
     return array(
       $header,
       $actions,
       $list,
     );
   }
 
   private function buildPurchaseHistorySection(PhortuneAccount $account) {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $header = id(new PHUIHeaderView())
       ->setHeader(pht('Purchase History'));
 
     return array(
       $header,
 
     );
   }
 
   private function buildAccountHistorySection(PhortuneAccount $account) {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $header = id(new PHUIHeaderView())
       ->setHeader(pht('Account History'));
 
     $xactions = id(new PhortuneAccountTransactionQuery())
       ->setViewer($user)
       ->withObjectPHIDs(array($account->getPHID()))
       ->execute();
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($user);
 
     $xaction_view = id(new PhabricatorApplicationTransactionView())
       ->setUser($user)
       ->setObjectPHID($account->getPHID())
       ->setTransactions($xactions)
       ->setMarkupEngine($engine);
 
     return array(
       $header,
       $xaction_view,
     );
   }
 
 }
diff --git a/src/applications/phortune/controller/PhortuneProductViewController.php b/src/applications/phortune/controller/PhortuneProductViewController.php
index ee004bbffc..4c05b336e7 100644
--- a/src/applications/phortune/controller/PhortuneProductViewController.php
+++ b/src/applications/phortune/controller/PhortuneProductViewController.php
@@ -1,101 +1,101 @@
 <?php
 
 final class PhortuneProductViewController extends PhortuneController {
 
   private $productID;
 
   public function willProcessRequest(array $data) {
     $this->productID = $data['id'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $product = id(new PhortuneProductQuery())
       ->setViewer($user)
       ->withIDs(array($this->productID))
       ->executeOne();
 
     if (!$product) {
       return new Aphront404Response();
     }
 
     $title = pht('Product: %s', $product->getProductName());
 
     $header = id(new PHUIHeaderView())
       ->setHeader($product->getProductName());
 
     $account = $this->loadActiveAccount($user);
 
     $edit_uri = $this->getApplicationURI('product/edit/'.$product->getID().'/');
     $cart_uri = $this->getApplicationURI(
       $account->getID().'/buy/'.$product->getID().'/');
 
     $actions = id(new PhabricatorActionListView())
       ->setUser($user)
       ->setObjectURI($request->getRequestURI())
       ->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Edit Product'))
           ->setHref($edit_uri)
           ->setIcon('edit'))
       ->addAction(
         id(new PhabricatorActionView())
           ->setUser($user)
           ->setName(pht('Purchase'))
           ->setHref($cart_uri)
           ->setIcon('new')
           ->setRenderAsForm(true));
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->setActionList($actions);
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName(pht('Products'))
         ->setHref($this->getApplicationURI('product/')));
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName(pht('#%d', $product->getID()))
         ->setHref($request->getRequestURI()));
 
     $properties = id(new PhabricatorPropertyListView())
       ->setUser($user)
       ->addProperty(pht('Type'), $product->getTypeName())
       ->addProperty(
         pht('Price'),
         PhortuneCurrency::newFromUSDCents($product->getPriceInCents())
           ->formatForDisplay());
 
     $xactions = id(new PhortuneProductTransactionQuery())
       ->setViewer($user)
       ->withObjectPHIDs(array($product->getPHID()))
       ->execute();
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($user);
 
     $xaction_view = id(new PhabricatorApplicationTransactionView())
       ->setUser($user)
       ->setObjectPHID($product->getPHID())
       ->setTransactions($xactions)
       ->setMarkupEngine($engine);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $xaction_view,
       ),
       array(
         'title' => $title,
         'device' => true,
       ));
   }
 
 }
diff --git a/src/applications/ponder/controller/PonderQuestionViewController.php b/src/applications/ponder/controller/PonderQuestionViewController.php
index 4e66207c9a..8adf93718b 100644
--- a/src/applications/ponder/controller/PonderQuestionViewController.php
+++ b/src/applications/ponder/controller/PonderQuestionViewController.php
@@ -1,419 +1,419 @@
 <?php
 
 final class PonderQuestionViewController extends PonderController {
 
   private $questionID;
 
   public function willProcessRequest(array $data) {
     $this->questionID = $data['id'];
   }
 
   public function processRequest() {
 
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $question = id(new PonderQuestionQuery())
       ->setViewer($user)
       ->withIDs(array($this->questionID))
       ->needAnswers(true)
       ->needViewerVotes(true)
       ->executeOne();
     if (!$question) {
       return new Aphront404Response();
     }
 
     $question->attachVotes($user->getPHID());
 
     $question_xactions = $this->buildQuestionTransactions($question);
     $answers = $this->buildAnswers($question->getAnswers());
 
     $authors = mpull($question->getAnswers(), null, 'getAuthorPHID');
     if (isset($authors[$user->getPHID()])) {
       $answer_add_panel = id(new AphrontErrorView())
         ->setSeverity(AphrontErrorView::SEVERITY_NODATA)
         ->appendChild(
           pht(
             'You have already answered this question. You can not answer '.
             'twice, but you can edit your existing answer.'));
     } else {
       $answer_add_panel = new PonderAddAnswerView();
       $answer_add_panel
         ->setQuestion($question)
         ->setUser($user)
         ->setActionURI("/ponder/answer/add/");
     }
 
     $header = id(new PHUIHeaderView())
       ->setHeader($question->getTitle());
 
     $actions = $this->buildActionListView($question);
     $properties = $this->buildPropertyListView($question);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     $crumbs = $this->buildApplicationCrumbs($this->buildSideNavView());
     $crumbs->setActionList($actions);
     $crumbs->addCrumb(
         id(new PhabricatorCrumbView())
           ->setName('Q'.$this->questionID)
           ->setHref('/Q'.$this->questionID));
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $question_xactions,
         $answers,
         $answer_add_panel
       ),
       array(
         'device' => true,
         'title' => 'Q'.$question->getID().' '.$question->getTitle(),
         'pageObjects' => array($question->getPHID()),
       ));
   }
 
   private function buildActionListView(PonderQuestion $question) {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $id = $question->getID();
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $question,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $view = id(new PhabricatorActionListView())
       ->setUser($request->getUser())
       ->setObject($question)
       ->setObjectURI($request->getRequestURI());
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setIcon('edit')
         ->setName(pht('Edit Question'))
         ->setHref($this->getApplicationURI("/question/edit/{$id}/"))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     if ($question->getStatus() == PonderQuestionStatus::STATUS_OPEN) {
       $name = pht("Close Question");
       $icon = "delete";
       $href = "close";
     } else {
       $name = pht("Reopen Question");
       $icon = "enable";
       $href = "open";
     }
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName($name)
         ->setIcon($icon)
         ->setRenderAsForm($can_edit)
         ->setWorkflow(!$can_edit)
         ->setDisabled(!$can_edit)
         ->setHref($this->getApplicationURI("/question/{$href}/{$id}/")));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setIcon('transcript')
         ->setName(pht('View History'))
         ->setHref($this->getApplicationURI("/question/history/{$id}/")));
 
     return $view;
   }
 
   private function buildPropertyListView(
     PonderQuestion $question) {
 
     $viewer = $this->getRequest()->getUser();
     $view = id(new PhabricatorPropertyListView())
       ->setUser($viewer)
       ->setObject($question);
 
     $this->loadHandles(array($question->getAuthorPHID()));
 
     $view->addProperty(
       pht('Status'),
       PonderQuestionStatus::getQuestionStatusFullName($question->getStatus()));
 
     $view->addProperty(
       pht('Author'),
       $this->getHandle($question->getAuthorPHID())->renderLink());
 
     $view->addProperty(
       pht('Created'),
       phabricator_datetime($question->getDateCreated(), $viewer));
 
     $view->invokeWillRenderEvent();
 
     $votable = id(new PonderVotableView())
       ->setPHID($question->getPHID())
       ->setURI($this->getApplicationURI('vote/'))
       ->setCount($question->getVoteCount())
       ->setVote($question->getUserVote());
 
     $view->addTextContent(
       array(
         $votable,
         phutil_tag(
           'div',
           array(
             'class' => 'phabricator-remarkup',
           ),
           PhabricatorMarkupEngine::renderOneObject(
             $question,
             $question->getMarkupField(),
             $viewer)),
       ));
 
 
     return $view;
   }
 
   private function buildQuestionTransactions(PonderQuestion $question) {
     $viewer = $this->getRequest()->getUser();
     $id = $question->getID();
 
     $xactions = id(new PonderQuestionTransactionQuery())
       ->setViewer($viewer)
       ->withTransactionTypes(array(PhabricatorTransactions::TYPE_COMMENT))
       ->withObjectPHIDs(array($question->getPHID()))
       ->execute();
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($viewer);
     foreach ($xactions as $xaction) {
       if ($xaction->getComment()) {
         $engine->addObject(
           $xaction->getComment(),
           PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
       }
     }
     $engine->process();
 
     $timeline = id(new PhabricatorApplicationTransactionView())
       ->setUser($viewer)
       ->setObjectPHID($question->getPHID())
       ->setTransactions($xactions)
       ->setMarkupEngine($engine);
 
     $add_comment = id(new PhabricatorApplicationTransactionCommentView())
       ->setUser($viewer)
       ->setObjectPHID($question->getPHID())
       ->setShowPreview(false)
       ->setAction($this->getApplicationURI("/question/comment/{$id}/"))
       ->setSubmitButtonName(pht('Comment'));
 
     $object_box = id(new PHUIObjectBoxView())
       ->setFlush(true)
       ->setHeaderText(pht('Question Comment'))
-      ->addContent($add_comment);
+      ->appendChild($add_comment);
 
     return $this->wrapComments(
       count($xactions),
       array(
         $timeline,
         $object_box,
       ));
   }
 
   private function buildAnswers(array $answers) {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $out = array();
 
     $phids = mpull($answers, 'getAuthorPHID');
     $this->loadHandles($phids);
 
     $xactions = id(new PonderAnswerTransactionQuery())
       ->setViewer($viewer)
       ->withTransactionTypes(array(PhabricatorTransactions::TYPE_COMMENT))
       ->withObjectPHIDs(mpull($answers, 'getPHID'))
       ->execute();
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($viewer);
     foreach ($xactions as $xaction) {
       if ($xaction->getComment()) {
         $engine->addObject(
           $xaction->getComment(),
           PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
       }
     }
     $engine->process();
 
     $xaction_groups = mgroup($xactions, 'getObjectPHID');
 
     foreach ($answers as $answer) {
       $author_phid = $answer->getAuthorPHID();
       $xactions = idx($xaction_groups, $answer->getPHID(), array());
       $id = $answer->getID();
 
       $out[] = phutil_tag('br');
       $out[] = phutil_tag('br');
       $out[] = id(new PhabricatorAnchorView())
         ->setAnchorName("A$id");
       $header = id(new PHUIHeaderView())
         ->setHeader($this->getHandle($author_phid)->getFullName());
 
       $actions = $this->buildAnswerActions($answer);
       $properties = $this->buildAnswerProperties($answer);
 
       $object_box = id(new PHUIObjectBoxView())
         ->setHeader($header)
-        ->addContent($actions)
-        ->addContent($properties);
+        ->setActionList($actions)
+        ->setPropertyList($properties);
 
       $out[] = $object_box;
       $details = array();
 
       $details[] = id(new PhabricatorApplicationTransactionView())
         ->setUser($viewer)
         ->setObjectPHID($answer->getPHID())
         ->setTransactions($xactions)
         ->setMarkupEngine($engine);
 
       $form = id(new PhabricatorApplicationTransactionCommentView())
         ->setUser($viewer)
         ->setObjectPHID($answer->getPHID())
         ->setShowPreview(false)
         ->setAction($this->getApplicationURI("/answer/comment/{$id}/"))
         ->setSubmitButtonName(pht('Comment'));
 
       $comment_box = id(new PHUIObjectBoxView())
         ->setFlush(true)
         ->setHeaderText(pht('Answer Comment'))
-        ->addContent($form);
+        ->appendChild($form);
 
       $details[] = $comment_box;
 
       $out[] = $this->wrapComments(
         count($xactions),
         $details);
     }
 
     $out[] = phutil_tag('br');
     $out[] = phutil_tag('br');
 
     return $out;
   }
 
   private function buildAnswerActions(PonderAnswer $answer) {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $id = $answer->getID();
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $answer,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $view = id(new PhabricatorActionListView())
       ->setUser($request->getUser())
       ->setObject($answer)
       ->setObjectURI($request->getRequestURI());
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setIcon('edit')
         ->setName(pht('Edit Answer'))
         ->setHref($this->getApplicationURI("/answer/edit/{$id}/"))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setIcon('transcript')
         ->setName(pht('View History'))
         ->setHref($this->getApplicationURI("/answer/history/{$id}/")));
 
     return $view;
   }
 
   private function buildAnswerProperties(PonderAnswer $answer) {
     $viewer = $this->getRequest()->getUser();
     $view = id(new PhabricatorPropertyListView())
       ->setUser($viewer)
       ->setObject($answer);
 
     $view->addProperty(
       pht('Created'),
       phabricator_datetime($answer->getDateCreated(), $viewer));
 
     $view->invokeWillRenderEvent();
 
     $votable = id(new PonderVotableView())
       ->setPHID($answer->getPHID())
       ->setURI($this->getApplicationURI('vote/'))
       ->setCount($answer->getVoteCount())
       ->setVote($answer->getUserVote());
 
     $view->addTextContent(
       array(
         $votable,
         phutil_tag(
           'div',
           array(
             'class' => 'phabricator-remarkup',
           ),
           PhabricatorMarkupEngine::renderOneObject(
             $answer,
             $answer->getMarkupField(),
             $viewer)),
       ));
 
     return $view;
   }
 
   private function wrapComments($n, $stuff) {
     if ($n == 0) {
       $text = pht('Add a Comment');
     } else {
       $text = pht('Show %s Comments', new PhutilNumber($n));
     }
 
     $show_id = celerity_generate_unique_node_id();
     $hide_id = celerity_generate_unique_node_id();
 
     Javelin::initBehavior('phabricator-reveal-content');
     require_celerity_resource('ponder-comment-table-css');
 
     $show = phutil_tag(
       'div',
       array(
         'id' => $show_id,
         'class' => 'ponder-show-comments',
       ),
       javelin_tag(
         'a',
         array(
           'href' => '#',
           'sigil' => 'reveal-content',
           'meta' => array(
             'showIDs' => array($hide_id),
             'hideIDs' => array($show_id),
           ),
         ),
         $text));
 
     $hide = phutil_tag(
       'div',
       array(
         'id' => $hide_id,
         'style' => 'display: none',
       ),
       $stuff);
 
     return array($show, $hide);
   }
 
 }
diff --git a/src/applications/ponder/view/PonderAddAnswerView.php b/src/applications/ponder/view/PonderAddAnswerView.php
index 2d1128f39f..d9018630e6 100644
--- a/src/applications/ponder/view/PonderAddAnswerView.php
+++ b/src/applications/ponder/view/PonderAddAnswerView.php
@@ -1,50 +1,50 @@
 <?php
 
 final class PonderAddAnswerView extends AphrontView {
 
   private $question;
   private $actionURI;
   private $draft;
 
   public function setQuestion($question) {
     $this->question = $question;
     return $this;
   }
 
   public function setActionURI($uri) {
     $this->actionURI = $uri;
     return $this;
   }
 
   public function render() {
     $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
 
     $question = $this->question;
 
     $header = id(new PHUIHeaderView())
       ->setHeader(pht('Add Answer'));
 
     $form = new AphrontFormView();
     $form
       ->setUser($this->user)
       ->setAction($this->actionURI)
       ->setWorkflow(true)
       ->addHiddenInput('question_id', $question->getID())
       ->appendChild(
         id(new PhabricatorRemarkupControl())
           ->setName('answer')
           ->setLabel(pht('Answer'))
           ->setError(true)
           ->setID('answer-content')
           ->setUser($this->user))
       ->appendChild(
         id(new AphrontFormSubmitControl())
           ->setValue($is_serious ?
             pht('Add Answer') :
             pht('Bequeath Wisdom')));
 
     return id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($form);
+      ->appendChild($form);
   }
 }
diff --git a/src/applications/project/controller/PhabricatorProjectProfileController.php b/src/applications/project/controller/PhabricatorProjectProfileController.php
index aa6e60dc9a..a1e083eff5 100644
--- a/src/applications/project/controller/PhabricatorProjectProfileController.php
+++ b/src/applications/project/controller/PhabricatorProjectProfileController.php
@@ -1,265 +1,265 @@
 <?php
 
 final class PhabricatorProjectProfileController
   extends PhabricatorProjectController {
 
   private $id;
   private $page;
   private $project;
 
   public function willProcessRequest(array $data) {
     $this->id = idx($data, 'id');
     $this->page = idx($data, 'page');
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $query = id(new PhabricatorProjectQuery())
       ->setViewer($user)
       ->withIDs(array($this->id))
       ->needMembers(true);
 
     $project = $query->executeOne();
     $this->project = $project;
     if (!$project) {
       return new Aphront404Response();
     }
 
     $profile = $project->loadProfile();
     if (!$profile) {
       $profile = new PhabricatorProjectProfile();
     }
 
     $picture = $profile->loadProfileImageURI();
 
     require_celerity_resource('phabricator-profile-css');
 
     $tasks = $this->renderTasksPage($project, $profile);
 
     $query = new PhabricatorFeedQuery();
     $query->setFilterPHIDs(
       array(
         $project->getPHID(),
       ));
     $query->setLimit(50);
     $query->setViewer($this->getRequest()->getUser());
     $stories = $query->execute();
     $feed = $this->renderStories($stories);
     $people = $this->renderPeoplePage($project, $profile);
 
     $content = id(new AphrontMultiColumnView())
       ->addColumn($people)
       ->addColumn($feed)
       ->setFluidLayout(true);
 
     $content = hsprintf(
       '<div class="phabricator-project-layout">%s%s</div>',
         $tasks,
         $content);
 
     $header = id(new PHUIHeaderView())
       ->setHeader($project->getName())
       ->setSubheader(phutil_utf8_shorten($profile->getBlurb(), 1024))
       ->setImage($picture);
 
     $actions = $this->buildActionListView($project);
     $properties = $this->buildPropertyListView($project);
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName($project->getName()));
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $content,
       ),
       array(
         'title' => $project->getName(),
         'device' => true,
       ));
   }
 
   private function renderPeoplePage(
     PhabricatorProject $project,
     PhabricatorProjectProfile $profile) {
 
     $member_phids = $project->getMemberPHIDs();
     $handles = $this->loadViewerHandles($member_phids);
 
     $affiliated = array();
     foreach ($handles as $phids => $handle) {
       $affiliated[] = phutil_tag('li', array(), $handle->renderLink());
     }
 
     if ($affiliated) {
       $affiliated = phutil_tag('ul', array(), $affiliated);
     } else {
       $affiliated = hsprintf('<p><em>%s</em></p>', pht(
         'No one is affiliated with this project.'));
     }
 
     return hsprintf(
       '<div class="phabricator-profile-info-group profile-wrap-responsive">'.
         '<h1 class="phabricator-profile-info-header">%s</h1>'.
         '<div class="phabricator-profile-info-pane">%s</div>'.
       '</div>',
       pht('People'),
       $affiliated);
   }
 
   private function renderFeedPage(
     PhabricatorProject $project,
     PhabricatorProjectProfile $profile) {
 
     $query = new PhabricatorFeedQuery();
     $query->setFilterPHIDs(array($project->getPHID()));
     $query->setViewer($this->getRequest()->getUser());
     $query->setLimit(100);
     $stories = $query->execute();
 
     if (!$stories) {
       return pht('There are no stories about this project.');
     }
 
     return $this->renderStories($stories);
   }
 
   private function renderStories(array $stories) {
     assert_instances_of($stories, 'PhabricatorFeedStory');
 
     $builder = new PhabricatorFeedBuilder($stories);
     $builder->setUser($this->getRequest()->getUser());
     $builder->setShowHovercards(true);
     $view = $builder->buildView();
 
     return hsprintf(
       '<div class="profile-feed profile-wrap-responsive">'.
         '%s'.
       '</div>',
       $view->render());
   }
 
 
   private function renderTasksPage(
     PhabricatorProject $project,
     PhabricatorProjectProfile $profile) {
 
     $user = $this->getRequest()->getUser();
 
     $query = id(new ManiphestTaskQuery())
       ->setViewer($user)
       ->withAnyProjects(array($project->getPHID()))
       ->withStatus(ManiphestTaskQuery::STATUS_OPEN)
       ->setOrderBy(ManiphestTaskQuery::ORDER_PRIORITY)
       ->setLimit(10);
     $tasks = $query->execute();
 
     $phids = mpull($tasks, 'getOwnerPHID');
     $phids = array_merge(
       $phids,
       array_mergev(mpull($tasks, 'getProjectPHIDs')));
     $phids = array_filter($phids);
     $handles = $this->loadViewerHandles($phids);
 
     $task_list = new ManiphestTaskListView();
     $task_list->setUser($user);
     $task_list->setTasks($tasks);
     $task_list->setHandles($handles);
 
     $list = id(new PHUIBoxView())
       ->addPadding(PHUI::PADDING_LARGE)
       ->appendChild($task_list);
 
     $content = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Open Tasks'))
-      ->addContent($list);
+      ->appendChild($list);
 
     return $content;
   }
 
   private function buildActionListView(PhabricatorProject $project) {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $id = $project->getID();
 
     $view = id(new PhabricatorActionListView())
       ->setUser($viewer)
       ->setObject($project)
       ->setObjectURI($request->getRequestURI());
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $project,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Project'))
         ->setIcon('edit')
         ->setHref($this->getApplicationURI("edit/{$id}/"))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Members'))
         ->setIcon('edit')
         ->setHref($this->getApplicationURI("members/{$id}/"))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
 
     $action = null;
     if (!$project->isUserMember($viewer->getPHID())) {
       $can_join = PhabricatorPolicyFilter::hasCapability(
         $viewer,
         $project,
         PhabricatorPolicyCapability::CAN_JOIN);
 
       $action = id(new PhabricatorActionView())
         ->setUser($viewer)
         ->setRenderAsForm(true)
         ->setHref('/project/update/'.$project->getID().'/join/')
         ->setIcon('new')
         ->setDisabled(!$can_join)
         ->setName(pht('Join Project'));
     } else {
       $action = id(new PhabricatorActionView())
         ->setWorkflow(true)
         ->setHref('/project/update/'.$project->getID().'/leave/')
         ->setIcon('delete')
         ->setName(pht('Leave Project...'));
     }
     $view->addAction($action);
 
     return $view;
   }
 
   private function buildPropertyListView(PhabricatorProject $project) {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $view = id(new PhabricatorPropertyListView())
       ->setUser($viewer)
       ->setObject($project);
 
     $view->addProperty(
       pht('Created'),
       phabricator_datetime($project->getDateCreated(), $viewer));
 
     return $view;
   }
 
 
 }
diff --git a/src/applications/releeph/controller/branch/ReleephBranchViewController.php b/src/applications/releeph/controller/branch/ReleephBranchViewController.php
index 6fd7b55d09..7406c263d0 100644
--- a/src/applications/releeph/controller/branch/ReleephBranchViewController.php
+++ b/src/applications/releeph/controller/branch/ReleephBranchViewController.php
@@ -1,178 +1,177 @@
 <?php
 
 final class ReleephBranchViewController extends ReleephProjectController
   implements PhabricatorApplicationSearchResultsControllerInterface {
 
   private $queryKey;
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function willProcessRequest(array $data) {
     parent::willProcessRequest($data);
     $this->queryKey = idx($data, 'queryKey');
   }
 
 
   public function processRequest() {
     $request = $this->getRequest();
 
     $controller = id(new PhabricatorApplicationSearchController($request))
       ->setPreface($this->renderPreface())
       ->setQueryKey($this->queryKey)
       ->setSearchEngine($this->getSearchEngine())
       ->setNavigation($this->buildSideNavView());
 
     return $this->delegateToController($controller);
   }
 
   public function renderResultsList(
     array $requests,
     PhabricatorSavedQuery $query) {
 
     assert_instances_of($requests, 'ReleephRequest');
     $viewer = $this->getRequest()->getUser();
 
     $releeph_branch = $this->getReleephBranch();
     $releeph_project = $this->getReleephProject();
 
     // TODO: Really gross.
     $releeph_branch->populateReleephRequestHandles(
       $viewer,
       $requests);
 
     $list = id(new ReleephRequestHeaderListView())
       ->setOriginType('branch')
       ->setUser($viewer)
       ->setAphrontRequest($this->getRequest())
       ->setReleephProject($releeph_project)
       ->setReleephBranch($releeph_branch)
       ->setReleephRequests($requests);
 
     return $list;
   }
 
   public function buildSideNavView($for_app = false) {
     $user = $this->getRequest()->getUser();
 
     $nav = new AphrontSideNavFilterView();
     $nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
 
 
     $this->getSearchEngine()->addNavigationItems($nav->getMenu());
 
     $nav->selectFilter(null);
 
     return $nav;
   }
 
   private function getSearchEngine() {
     $branch = $this->getReleephBranch();
     return id(new ReleephRequestSearchEngine())
       ->setBranch($branch)
       ->setBaseURI($branch->getURI())
       ->setViewer($this->getRequest()->getUser());
   }
 
   public function buildApplicationCrumbs() {
     $releeph_branch = $this->getReleephBranch();
 
     $crumbs = parent::buildApplicationCrumbs();
 
     if ($releeph_branch->isActive()) {
       $create_uri = $releeph_branch->getURI('request/');
       $crumbs->addAction(
         id(new PHUIListItemView())
           ->setHref($create_uri)
           ->setName(pht('Request Pick'))
           ->setIcon('create'));
     }
 
     return $crumbs;
   }
 
   private function renderPreface() {
     $branch = $this->getReleephBranch();
     $viewer = $this->getRequest()->getUser();
 
     $id = $branch->getID();
 
     $header = id(new PHUIHeaderView())
       ->setHeader($branch->getDisplayName());
 
     if (!$branch->getIsActive()) {
       $header->addTag(
         id(new PhabricatorTagView())
           ->setType(PhabricatorTagView::TYPE_STATE)
           ->setBackgroundColor(PhabricatorTagView::COLOR_BLACK)
           ->setName(pht('Closed')));
     }
 
     $actions = id(new PhabricatorActionListView())
       ->setUser($viewer)
       ->setObject($branch)
       ->setObjectURI($this->getRequest()->getRequestURI());
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $branch,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $edit_uri = $branch->getURI('edit/');
     $close_uri = $branch->getURI('close/');
     $reopen_uri = $branch->getURI('re-open/');
 
     $id = $branch->getID();
     $history_uri = $this->getApplicationURI("branch/{$id}/history/");
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Branch'))
         ->setHref($edit_uri)
         ->setIcon('edit')
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     if ($branch->getIsActive()) {
       $actions->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Close Branch'))
           ->setHref($close_uri)
           ->setIcon('delete')
           ->setDisabled(!$can_edit)
           ->setWorkflow(true));
     } else {
       $actions->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Reopen Branch'))
           ->setHref($reopen_uri)
           ->setIcon('new')
           ->setUser($viewer)
           ->setRenderAsForm(true)
           ->setDisabled(!$can_edit)
           ->setWorkflow(true));
     }
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('View History'))
         ->setHref($history_uri)
         ->setIcon('transcript'));
 
     $properties = id(new PhabricatorPropertyListView())
       ->setUser($viewer)
       ->setObject($branch);
 
     $properties->addProperty(
       pht('Branch'),
       $branch->getName());
 
     return id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
-
+      ->setActionList($actions)
+      ->setPropertyList($properties);
   }
 
 }
diff --git a/src/applications/releeph/controller/project/ReleephProjectViewController.php b/src/applications/releeph/controller/project/ReleephProjectViewController.php
index c7e5721406..77603eebd4 100644
--- a/src/applications/releeph/controller/project/ReleephProjectViewController.php
+++ b/src/applications/releeph/controller/project/ReleephProjectViewController.php
@@ -1,246 +1,245 @@
 <?php
 
 final class ReleephProjectViewController extends ReleephProjectController
   implements PhabricatorApplicationSearchResultsControllerInterface {
 
   private $queryKey;
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function willProcessRequest(array $data) {
     parent::willProcessRequest($data);
     $this->queryKey = idx($data, 'queryKey');
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $controller = id(new PhabricatorApplicationSearchController($request))
       ->setQueryKey($this->queryKey)
       ->setPreface($this->renderPreface())
       ->setSearchEngine(
         id(new ReleephBranchSearchEngine())
           ->setProjectID($this->getReleephProject()->getID()))
       ->setNavigation($this->buildSideNavView());
 
     return $this->delegateToController($controller);
   }
 
   public function renderResultsList(
     array $branches,
     PhabricatorSavedQuery $saved) {
     assert_instances_of($branches, 'ReleephBranch');
 
     $viewer = $this->getRequest()->getUser();
 
     $projects = mpull($branches, 'getProject');
     $repo_phids = mpull($projects, 'getRepositoryPHID');
 
     $repos = id(new PhabricatorRepositoryQuery())
       ->setViewer($viewer)
       ->withPHIDs($repo_phids)
       ->execute();
     $repos = mpull($repos, null, 'getPHID');
 
     $phids = mpull($branches, 'getCreatedByUserPHID');
     $this->loadHandles($phids);
 
     $requests = array();
     if ($branches) {
       $requests = id(new ReleephRequestQuery())
         ->setViewer($viewer)
         ->withBranchIDs(mpull($branches, 'getID'))
         ->withStatus(ReleephRequestQuery::STATUS_OPEN)
         ->execute();
       $requests = mgroup($requests, 'getBranchID');
     }
 
     $list = id(new PHUIObjectItemListView())
       ->setUser($viewer);
     foreach ($branches as $branch) {
       $diffusion_href = null;
       $repo = idx($repos, $branch->getProject()->getRepositoryPHID());
       if ($repo) {
         $drequest = DiffusionRequest::newFromDictionary(
           array(
             'user' => $viewer,
             'repository' => $repo,
           ));
 
         $diffusion_href = $drequest->generateURI(
           array(
             'action' => 'branch',
             'branch' => $branch->getName(),
           ));
       }
 
       $branch_link = $branch->getName();
       if ($diffusion_href) {
         $branch_link = phutil_tag(
           'a',
           array(
             'href' => $diffusion_href,
           ),
           $branch_link);
       }
 
       $item = id(new PHUIObjectItemView())
         ->setHeader($branch->getDisplayName())
         ->setHref($branch->getURI())
         ->addAttribute($branch_link);
 
       if (!$branch->getIsActive()) {
         $item->setDisabled(true);
       }
 
       $commit = $branch->getCutPointCommit();
       if ($commit) {
         $item->addIcon(
           'none',
           phabricator_datetime($commit->getEpoch(), $viewer));
       }
 
       $open_count = count(idx($requests, $branch->getID(), array()));
       if ($open_count) {
         $item->setBarColor('orange');
         $item->addIcon(
           'fork',
           pht('%d Open Pull Request(s)', new PhutilNumber($open_count)));
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
   public function buildSideNavView($for_app = false) {
     $user = $this->getRequest()->getUser();
 
     $nav = new AphrontSideNavFilterView();
     $nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
 
     if ($for_app) {
       $nav->addFilter('project/create/', pht('Create Project'));
     }
 
     id(new ReleephBranchSearchEngine())
       ->setProjectID($this->getReleephProject()->getID())
       ->setViewer($user)
       ->addNavigationItems($nav->getMenu());
 
     $nav->selectFilter(null);
 
     return $nav;
   }
 
   public function buildApplicationCrumbs() {
     $crumbs = parent::buildApplicationCrumbs();
 
     $project = $this->getReleephProject();
 
     $crumbs->addAction(
       id(new PHUIListItemView())
         ->setHref($project->getURI('cutbranch'))
         ->setName(pht('Cut New Branch'))
         ->setIcon('create'));
 
     return $crumbs;
   }
 
   private function renderPreface() {
     $project = $this->getReleephProject();
     $viewer = $this->getRequest()->getUser();
 
     $id = $project->getID();
 
     $header = id(new PHUIHeaderView())
       ->setHeader($project->getName());
 
     if (!$project->getIsActive()) {
       $header->addTag(
         id(new PhabricatorTagView())
           ->setType(PhabricatorTagView::TYPE_STATE)
           ->setBackgroundColor(PhabricatorTagView::COLOR_BLACK)
           ->setName(pht('Deactivated')));
     }
 
     $actions = id(new PhabricatorActionListView())
       ->setUser($viewer)
       ->setObject($project)
       ->setObjectURI($this->getRequest()->getRequestURI());
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $project,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $edit_uri = $this->getApplicationURI("project/{$id}/edit/");
 
     $deactivate_uri = "project/{$id}/action/deactivate/";
     $deactivate_uri = $this->getApplicationURI($deactivate_uri);
 
     $reactivate_uri = "project/{$id}/action/activate/";
     $reactivate_uri = $this->getApplicationURI($reactivate_uri);
 
     $history_uri = $this->getApplicationURI("project/{$id}/history/");
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Project'))
         ->setHref($edit_uri)
         ->setIcon('edit')
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     if ($project->getIsActive()) {
       $actions->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Deactivate Project'))
           ->setHref($deactivate_uri)
           ->setIcon('delete')
           ->setDisabled(!$can_edit)
           ->setWorkflow(true));
     } else {
       $actions->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Reactivate Project'))
           ->setHref($reactivate_uri)
           ->setIcon('new')
           ->setUser($viewer)
           ->setRenderAsForm(true)
           ->setDisabled(!$can_edit)
           ->setWorkflow(true));
     }
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('View History'))
         ->setHref($history_uri)
         ->setIcon('transcript'));
 
     $properties = id(new PhabricatorPropertyListView())
       ->setUser($viewer)
       ->setObject($project);
 
     $properties->addProperty(
       pht('Repository'),
       $project->getRepository()->getName());
 
     $pushers = $project->getPushers();
     if ($pushers) {
       $this->loadHandles($pushers);
       $properties->addProperty(
         pht('Pushers'),
         $this->renderHandlesForPHIDs($pushers));
     }
 
     return id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
-
+      ->setActionList($actions)
+      ->setPropertyList($properties);
   }
 
 }
diff --git a/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php b/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php
index b4b7be8661..5ea49c7457 100644
--- a/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php
+++ b/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php
@@ -1,188 +1,188 @@
 <?php
 
 /**
  * @group slowvote
  */
 final class PhabricatorSlowvotePollController
   extends PhabricatorSlowvoteController {
 
   private $id;
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $poll = id(new PhabricatorSlowvoteQuery())
       ->setViewer($user)
       ->withIDs(array($this->id))
       ->needOptions(true)
       ->needChoices(true)
       ->needViewerChoices(true)
       ->executeOne();
     if (!$poll) {
       return new Aphront404Response();
     }
 
     $poll_view = id(new SlowvoteEmbedView())
       ->setHeadless(true)
       ->setUser($user)
       ->setPoll($poll);
 
     if ($request->isAjax()) {
       return id(new AphrontAjaxResponse())
         ->setContent(
           array(
             'pollID' => $poll->getID(),
             'contentHTML' => $poll_view->render(),
           ));
     }
 
     $header = id(new PHUIHeaderView())
       ->setHeader($poll->getQuestion())
       ->setUser($user)
       ->setPolicyObject($poll);
 
     $actions = $this->buildActionView($poll);
     $properties = $this->buildPropertyView($poll);
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addCrumb(
       id(new PhabricatorCrumbView())
         ->setName('V'.$poll->getID()));
 
     $xactions = $this->buildTransactions($poll);
     $add_comment = $this->buildCommentForm($poll);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
-      ->addContent($actions)
-      ->addContent($properties);
+      ->setActionList($actions)
+      ->setPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         phutil_tag(
           'div',
           array(
             'class' => 'mlt mml mmr',
           ),
           $poll_view),
         $xactions,
         $add_comment,
       ),
       array(
         'title' => 'V'.$poll->getID().' '.$poll->getQuestion(),
         'device' => true,
         'pageObjects' => array($poll->getPHID()),
       ));
   }
 
   private function buildActionView(PhabricatorSlowvotePoll $poll) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorActionListView())
       ->setUser($viewer)
       ->setObject($poll);
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $poll,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Poll'))
         ->setIcon('edit')
         ->setHref($this->getApplicationURI('edit/'.$poll->getID().'/'))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     return $view;
   }
 
   private function buildPropertyView(PhabricatorSlowvotePoll $poll) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorPropertyListView())
       ->setUser($viewer)
       ->setObject($poll);
 
     $view->invokeWillRenderEvent();
 
     if (strlen($poll->getDescription())) {
       $view->addTextContent(
         $output = PhabricatorMarkupEngine::renderOneObject(
           id(new PhabricatorMarkupOneOff())->setContent(
             $poll->getDescription()),
           'default',
           $viewer));
     }
 
     return $view;
   }
 
   private function buildTransactions(PhabricatorSlowvotePoll $poll) {
     $viewer = $this->getRequest()->getUser();
 
     $xactions = id(new PhabricatorSlowvoteTransactionQuery())
       ->setViewer($viewer)
       ->withObjectPHIDs(array($poll->getPHID()))
       ->execute();
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($viewer);
     foreach ($xactions as $xaction) {
       if ($xaction->getComment()) {
         $engine->addObject(
           $xaction->getComment(),
           PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
       }
     }
     $engine->process();
 
     $timeline = id(new PhabricatorApplicationTransactionView())
       ->setUser($viewer)
       ->setObjectPHID($poll->getPHID())
       ->setTransactions($xactions)
       ->setMarkupEngine($engine);
 
     return $timeline;
   }
 
   private function buildCommentForm(PhabricatorSlowvotePoll $poll) {
     $viewer = $this->getRequest()->getUser();
 
     $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
 
     $add_comment_header = id(new PHUIHeaderView())
       ->setHeader(
         $is_serious
           ? pht('Add Comment')
           : pht('Enter Deliberations'));
 
     $submit_button_name = $is_serious
       ? pht('Add Comment')
       : pht('Perhaps');
 
     $draft = PhabricatorDraft::newFromUserAndKey($viewer, $poll->getPHID());
 
     $add_comment_form = id(new PhabricatorApplicationTransactionCommentView())
       ->setUser($viewer)
       ->setObjectPHID($poll->getPHID())
       ->setDraft($draft)
       ->setAction($this->getApplicationURI('/comment/'.$poll->getID().'/'))
       ->setSubmitButtonName($submit_button_name);
 
     return id(new PHUIObjectBoxView())
       ->setFlush(true)
       ->setHeader($add_comment_header)
-      ->addContent($add_comment_form);
+      ->appendChild($add_comment_form);
 
   }
 
 }
diff --git a/src/view/phui/PHUIObjectBoxView.php b/src/view/phui/PHUIObjectBoxView.php
index 19d7289046..fabb91df43 100644
--- a/src/view/phui/PHUIObjectBoxView.php
+++ b/src/view/phui/PHUIObjectBoxView.php
@@ -1,96 +1,104 @@
 <?php
 
 final class PHUIObjectBoxView extends AphrontView {
 
   private $headerText;
   private $formError = null;
   private $form;
   private $validationException;
-  private $content = array();
   private $header;
   private $flush;
+  private $propertyList;
+  private $actionList;
+
+  public function setActionList(PhabricatorActionListView $action_list) {
+    $this->actionList = $action_list;
+    return $this;
+  }
+
+  public function setPropertyList(PhabricatorPropertyListView $property_list) {
+    $this->propertyList = $property_list;
+    return $this;
+  }
 
   public function setHeaderText($text) {
     $this->headerText = $text;
     return $this;
   }
 
   public function setFormError($error) {
     $this->formError = $error;
     return $this;
   }
 
   public function setForm($form) {
     $this->form = $form;
     return $this;
   }
 
   public function setHeader(PHUIHeaderView $header) {
     $this->header = $header;
     return $this;
   }
 
-  public function addContent($content) {
-    $this->content[] = $content;
-    return $this;
-  }
-
   public function setFlush($flush) {
     $this->flush = $flush;
     return $this;
   }
 
   public function setValidationException(
     PhabricatorApplicationTransactionValidationException $ex = null) {
     $this->validationException = $ex;
     return $this;
   }
 
   public function render() {
 
     require_celerity_resource('phui-object-box-css');
 
     if ($this->header) {
       $header = $this->header;
       $header->setGradient(PhabricatorActionHeaderView::HEADER_LIGHTBLUE);
     } else {
       $header = id(new PHUIHeaderView())
         ->setHeader($this->headerText)
         ->setGradient(PhabricatorActionHeaderView::HEADER_LIGHTBLUE);
     }
 
     $ex = $this->validationException;
     $exception_errors = null;
     if ($ex) {
       $messages = array();
       foreach ($ex->getErrors() as $error) {
         $messages[] = $error->getMessage();
       }
       if ($messages) {
         $exception_errors = id(new AphrontErrorView())
           ->setErrors($messages);
       }
     }
 
     $content = id(new PHUIBoxView())
       ->appendChild(
         array(
           $header,
           $this->formError,
           $exception_errors,
           $this->form,
-          $this->content,
+          $this->actionList,
+          $this->propertyList,
+          $this->renderChildren(),
         ))
       ->setBorder(true)
       ->addMargin(PHUI::MARGIN_LARGE_TOP)
       ->addMargin(PHUI::MARGIN_LARGE_LEFT)
       ->addMargin(PHUI::MARGIN_LARGE_RIGHT)
       ->addClass('phui-object-box');
 
     if ($this->flush) {
       $content->addClass('phui-object-box-flush');
     }
 
     return $content;
   }
 }