diff --git a/src/applications/calendar/controller/PhabricatorCalendarEventEditController.php b/src/applications/calendar/controller/PhabricatorCalendarEventEditController.php
index 10ed2b84e0..421084ceaf 100644
--- a/src/applications/calendar/controller/PhabricatorCalendarEventEditController.php
+++ b/src/applications/calendar/controller/PhabricatorCalendarEventEditController.php
@@ -1,635 +1,635 @@
 <?php
 
 final class PhabricatorCalendarEventEditController
   extends PhabricatorCalendarController {
 
   private $id;
 
   public function isCreate() {
     return !$this->id;
   }
 
   public function handleRequest(AphrontRequest $request) {
     $viewer = $request->getViewer();
     $user_phid = $viewer->getPHID();
     $this->id = $request->getURIData('id');
 
     $error_name = true;
     $error_recurrence_end_date = null;
     $error_start_date = true;
     $error_end_date = true;
     $validation_exception = null;
 
     $is_recurring_id = celerity_generate_unique_node_id();
     $recurrence_end_date_id = celerity_generate_unique_node_id();
     $frequency_id = celerity_generate_unique_node_id();
     $all_day_id = celerity_generate_unique_node_id();
     $start_date_id = celerity_generate_unique_node_id();
     $end_date_id = celerity_generate_unique_node_id();
 
     $next_workflow = $request->getStr('next');
     $uri_query = $request->getStr('query');
 
     if ($this->isCreate()) {
       $mode = $request->getStr('mode');
       $event = PhabricatorCalendarEvent::initializeNewCalendarEvent(
         $viewer,
         $mode);
 
       $create_start_year = $request->getInt('year');
       $create_start_month = $request->getInt('month');
       $create_start_day = $request->getInt('day');
       $create_start_time = $request->getStr('time');
 
       if ($create_start_year) {
         $start = AphrontFormDateControlValue::newFromParts(
           $viewer,
           $create_start_year,
           $create_start_month,
           $create_start_day,
           $create_start_time);
         if (!$start->isValid()) {
           return new Aphront400Response();
         }
         $start_value = AphrontFormDateControlValue::newFromEpoch(
           $viewer,
           $start->getEpoch());
 
         $end = clone $start_value->getDateTime();
         $end->modify('+1 hour');
         $end_value = AphrontFormDateControlValue::newFromEpoch(
           $viewer,
           $end->format('U'));
 
       } else {
         list($start_value, $end_value) = $this->getDefaultTimeValues($viewer);
       }
 
       $recurrence_end_date_value = clone $end_value;
       $recurrence_end_date_value->setOptional(true);
 
       $submit_label = pht('Create');
       $title = pht('Create Event');
       $header_icon = 'fa-plus-square';
       $redirect = 'created';
       $subscribers = array();
       $invitees = array($user_phid);
       $cancel_uri = $this->getApplicationURI();
     } else {
       $event = id(new PhabricatorCalendarEventQuery())
       ->setViewer($viewer)
       ->withIDs(array($this->id))
       ->requireCapabilities(
         array(
           PhabricatorPolicyCapability::CAN_VIEW,
           PhabricatorPolicyCapability::CAN_EDIT,
         ))
       ->executeOne();
 
       if (!$event) {
         return new Aphront404Response();
       }
 
       if ($request->getURIData('sequence')) {
         $index = $request->getURIData('sequence');
 
         $result = $this->getEventAtIndexForGhostPHID(
           $viewer,
           $event->getPHID(),
           $index);
 
         if ($result) {
           return id(new AphrontRedirectResponse())
             ->setURI('/calendar/event/edit/'.$result->getID().'/');
         }
 
         $event = $this->createEventFromGhost(
           $viewer,
           $event,
           $index);
 
         return id(new AphrontRedirectResponse())
           ->setURI('/calendar/event/edit/'.$event->getID().'/');
       }
 
       $end_value = AphrontFormDateControlValue::newFromEpoch(
         $viewer,
         $event->getDateTo());
       $start_value = AphrontFormDateControlValue::newFromEpoch(
         $viewer,
         $event->getDateFrom());
       $recurrence_end_date_value = id(clone $end_value)
         ->setOptional(true);
 
       $submit_label = pht('Update');
       $title = pht('Edit Event: %s', $event->getName());
       $header_icon = 'fa-pencil';
 
       $subscribers = PhabricatorSubscribersQuery::loadSubscribersForPHID(
         $event->getPHID());
 
       $invitees = array();
       foreach ($event->getInvitees() as $invitee) {
         if ($invitee->isUninvited()) {
           continue;
         } else {
           $invitees[] = $invitee->getInviteePHID();
         }
       }
 
       $cancel_uri = '/'.$event->getMonogram();
     }
 
     if ($this->isCreate()) {
       $projects = array();
     } else {
       $projects = PhabricatorEdgeQuery::loadDestinationPHIDs(
         $event->getPHID(),
         PhabricatorProjectObjectHasProjectEdgeType::EDGECONST);
       $projects = array_reverse($projects);
     }
 
     $name = $event->getName();
     $description = $event->getDescription();
     $is_all_day = $event->getIsAllDay();
     $is_recurring = $event->getIsRecurring();
     $is_parent = $event->getIsRecurrenceParent();
     $frequency = idx($event->getRecurrenceFrequency(), 'rule');
     $icon = $event->getIcon();
     $edit_policy = $event->getEditPolicy();
     $view_policy = $event->getViewPolicy();
     $space = $event->getSpacePHID();
 
     if ($request->isFormPost()) {
       $xactions = array();
       $name = $request->getStr('name');
 
       $start_value = AphrontFormDateControlValue::newFromRequest(
         $request,
         'start');
       $end_value = AphrontFormDateControlValue::newFromRequest(
         $request,
         'end');
       $recurrence_end_date_value = AphrontFormDateControlValue::newFromRequest(
         $request,
         'recurrenceEndDate');
       $recurrence_end_date_value->setOptional(true);
       $projects = $request->getArr('projects');
       $description = $request->getStr('description');
       $subscribers = $request->getArr('subscribers');
       $edit_policy = $request->getStr('editPolicy');
       $view_policy = $request->getStr('viewPolicy');
       $space = $request->getStr('spacePHID');
       $is_recurring = $request->getStr('isRecurring') ? 1 : 0;
       $frequency = $request->getStr('frequency');
       $is_all_day = $request->getStr('isAllDay');
       $icon = $request->getStr('icon');
 
       $invitees = $request->getArr('invitees');
       $new_invitees = $this->getNewInviteeList($invitees, $event);
       $status_attending = PhabricatorCalendarEventInvitee::STATUS_ATTENDING;
       if ($this->isCreate()) {
         $status = idx($new_invitees, $viewer->getPHID());
         if ($status) {
           $new_invitees[$viewer->getPHID()] = $status_attending;
         }
       }
 
       $xactions[] = id(new PhabricatorCalendarEventTransaction())
         ->setTransactionType(
           PhabricatorCalendarEventTransaction::TYPE_NAME)
         ->setNewValue($name);
 
       if ($is_recurring && $this->isCreate()) {
         $xactions[] = id(new PhabricatorCalendarEventTransaction())
           ->setTransactionType(
             PhabricatorCalendarEventTransaction::TYPE_RECURRING)
           ->setNewValue($is_recurring);
 
         $xactions[] = id(new PhabricatorCalendarEventTransaction())
           ->setTransactionType(
             PhabricatorCalendarEventTransaction::TYPE_FREQUENCY)
           ->setNewValue(array('rule' => $frequency));
 
         if (!$recurrence_end_date_value->isDisabled()) {
           $xactions[] = id(new PhabricatorCalendarEventTransaction())
             ->setTransactionType(
               PhabricatorCalendarEventTransaction::TYPE_RECURRENCE_END_DATE)
             ->setNewValue($recurrence_end_date_value);
         }
       }
 
       if (($is_recurring && $this->isCreate()) || !$is_parent) {
         $xactions[] = id(new PhabricatorCalendarEventTransaction())
           ->setTransactionType(
             PhabricatorCalendarEventTransaction::TYPE_ALL_DAY)
           ->setNewValue($is_all_day);
 
         $xactions[] = id(new PhabricatorCalendarEventTransaction())
           ->setTransactionType(
             PhabricatorCalendarEventTransaction::TYPE_ICON)
           ->setNewValue($icon);
 
         $xactions[] = id(new PhabricatorCalendarEventTransaction())
           ->setTransactionType(
             PhabricatorCalendarEventTransaction::TYPE_START_DATE)
           ->setNewValue($start_value);
 
         $xactions[] = id(new PhabricatorCalendarEventTransaction())
           ->setTransactionType(
             PhabricatorCalendarEventTransaction::TYPE_END_DATE)
           ->setNewValue($end_value);
       }
 
 
       $xactions[] = id(new PhabricatorCalendarEventTransaction())
         ->setTransactionType(
           PhabricatorTransactions::TYPE_SUBSCRIBERS)
         ->setNewValue(array('=' => array_fuse($subscribers)));
 
       $xactions[] = id(new PhabricatorCalendarEventTransaction())
         ->setTransactionType(
           PhabricatorCalendarEventTransaction::TYPE_INVITE)
         ->setNewValue($new_invitees);
 
       $xactions[] = id(new PhabricatorCalendarEventTransaction())
         ->setTransactionType(
           PhabricatorCalendarEventTransaction::TYPE_DESCRIPTION)
         ->setNewValue($description);
 
       $xactions[] = id(new PhabricatorCalendarEventTransaction())
         ->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY)
         ->setNewValue($request->getStr('viewPolicy'));
 
       $xactions[] = id(new PhabricatorCalendarEventTransaction())
         ->setTransactionType(PhabricatorTransactions::TYPE_EDIT_POLICY)
         ->setNewValue($request->getStr('editPolicy'));
 
       $xactions[] = id(new PhabricatorCalendarEventTransaction())
         ->setTransactionType(PhabricatorTransactions::TYPE_SPACE)
         ->setNewValue($space);
 
       $editor = id(new PhabricatorCalendarEventEditor())
         ->setActor($viewer)
         ->setContentSourceFromRequest($request)
         ->setContinueOnNoEffect(true);
 
       try {
         $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
         $xactions[] = id(new PhabricatorCalendarEventTransaction())
           ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
           ->setMetadataValue('edge:type', $proj_edge_type)
           ->setNewValue(array('=' => array_fuse($projects)));
 
         $xactions = $editor->applyTransactions($event, $xactions);
         $response = id(new AphrontRedirectResponse());
         switch ($next_workflow) {
           case 'day':
             if (!$uri_query) {
               $uri_query = 'month';
             }
             $year = $start_value->getDateTime()->format('Y');
             $month = $start_value->getDateTime()->format('m');
             $day = $start_value->getDateTime()->format('d');
             $response->setURI(
               '/calendar/query/'.$uri_query.'/'.$year.'/'.$month.'/'.$day.'/');
             break;
           default:
             $response->setURI('/E'.$event->getID());
             break;
         }
         return $response;
       } catch (PhabricatorApplicationTransactionValidationException $ex) {
         $validation_exception = $ex;
         $error_name = $ex->getShortMessage(
           PhabricatorCalendarEventTransaction::TYPE_NAME);
         $error_start_date = $ex->getShortMessage(
           PhabricatorCalendarEventTransaction::TYPE_START_DATE);
         $error_end_date = $ex->getShortMessage(
           PhabricatorCalendarEventTransaction::TYPE_END_DATE);
         $error_recurrence_end_date = $ex->getShortMessage(
           PhabricatorCalendarEventTransaction::TYPE_RECURRENCE_END_DATE);
       }
     }
 
     $is_recurring_checkbox = null;
     $recurrence_end_date_control = null;
     $recurrence_frequency_select = null;
 
     $all_day_checkbox = null;
     $start_control = null;
     $end_control = null;
 
     $recurring_date_edit_label = null;
 
     $current_policies = id(new PhabricatorPolicyQuery())
       ->setViewer($viewer)
       ->setObject($event)
       ->execute();
 
     $name = id(new AphrontFormTextControl())
       ->setLabel(pht('Name'))
       ->setName('name')
       ->setValue($name)
       ->setError($error_name);
 
     if ($this->isCreate()) {
       Javelin::initBehavior('recurring-edit', array(
         'isRecurring' => $is_recurring_id,
         'frequency' => $frequency_id,
         'recurrenceEndDate' => $recurrence_end_date_id,
       ));
 
       $is_recurring_checkbox = id(new AphrontFormCheckboxControl())
         ->addCheckbox(
           'isRecurring',
           1,
           pht('Recurring Event'),
           $is_recurring,
           $is_recurring_id);
 
       $recurrence_end_date_control = id(new AphrontFormDateControl())
         ->setUser($viewer)
         ->setName('recurrenceEndDate')
         ->setLabel(pht('Recurrence End Date'))
         ->setError($error_recurrence_end_date)
         ->setValue($recurrence_end_date_value)
         ->setID($recurrence_end_date_id)
         ->setIsTimeDisabled(true)
         ->setIsDisabled($recurrence_end_date_value->isDisabled())
         ->setAllowNull(true);
 
       $recurrence_frequency_select = id(new AphrontFormSelectControl())
         ->setName('frequency')
         ->setOptions(array(
             PhabricatorCalendarEvent::FREQUENCY_DAILY => pht('Daily'),
             PhabricatorCalendarEvent::FREQUENCY_WEEKLY => pht('Weekly'),
             PhabricatorCalendarEvent::FREQUENCY_MONTHLY => pht('Monthly'),
             PhabricatorCalendarEvent::FREQUENCY_YEARLY => pht('Yearly'),
           ))
         ->setValue($frequency)
         ->setLabel(pht('Recurring Event Frequency'))
         ->setID($frequency_id)
         ->setDisabled(!$is_recurring);
     }
 
     if ($this->isCreate() || (!$is_parent && !$this->isCreate())) {
       Javelin::initBehavior('event-all-day', array(
         'allDayID' => $all_day_id,
         'startDateID' => $start_date_id,
         'endDateID' => $end_date_id,
       ));
 
       $all_day_checkbox = id(new AphrontFormCheckboxControl())
         ->addCheckbox(
           'isAllDay',
           1,
           pht('All Day Event'),
           $is_all_day,
           $all_day_id);
 
       $start_control = id(new AphrontFormDateControl())
         ->setUser($viewer)
         ->setName('start')
         ->setLabel(pht('Start'))
         ->setError($error_start_date)
         ->setValue($start_value)
         ->setID($start_date_id)
         ->setIsTimeDisabled($is_all_day)
         ->setEndDateID($end_date_id);
 
       $end_control = id(new AphrontFormDateControl())
         ->setUser($viewer)
         ->setName('end')
         ->setLabel(pht('End'))
         ->setError($error_end_date)
         ->setValue($end_value)
         ->setID($end_date_id)
         ->setIsTimeDisabled($is_all_day);
     } else if ($is_parent) {
       $recurring_date_edit_label = id(new AphrontFormStaticControl())
         ->setUser($viewer)
         ->setValue(pht('Date and time of recurring event cannot be edited.'));
 
       if (!$recurrence_end_date_value->isDisabled()) {
         $disabled_recurrence_end_date_value =
           $recurrence_end_date_value->getValueAsFormat('M d, Y');
         $recurrence_end_date_control = id(new AphrontFormStaticControl())
           ->setUser($viewer)
           ->setLabel(pht('Recurrence End Date'))
           ->setValue($disabled_recurrence_end_date_value)
           ->setDisabled(true);
       }
 
       $recurrence_frequency_select = id(new AphrontFormSelectControl())
         ->setName('frequency')
         ->setOptions(array(
           'daily' => pht('Daily'),
           'weekly' => pht('Weekly'),
           'monthly' => pht('Monthly'),
           'yearly' => pht('Yearly'),
         ))
         ->setValue($frequency)
         ->setLabel(pht('Recurring Event Frequency'))
         ->setID($frequency_id)
         ->setDisabled(true);
 
       $all_day_checkbox = id(new AphrontFormCheckboxControl())
         ->addCheckbox(
           'isAllDay',
           1,
           pht('All Day Event'),
           $is_all_day,
           $all_day_id)
         ->setDisabled(true);
 
       $start_disabled = $start_value->getValueAsFormat('M d, Y, g:i A');
       $end_disabled = $end_value->getValueAsFormat('M d, Y, g:i A');
 
       $start_control = id(new AphrontFormStaticControl())
         ->setUser($viewer)
         ->setLabel(pht('Start'))
         ->setValue($start_disabled)
         ->setDisabled(true);
 
       $end_control = id(new AphrontFormStaticControl())
         ->setUser($viewer)
         ->setLabel(pht('End'))
         ->setValue($end_disabled);
     }
 
     $projects = id(new AphrontFormTokenizerControl())
-      ->setLabel(pht('Projects'))
+      ->setLabel(pht('Tags'))
       ->setName('projects')
       ->setValue($projects)
       ->setUser($viewer)
       ->setDatasource(new PhabricatorProjectDatasource());
 
     $description = id(new PhabricatorRemarkupControl())
       ->setLabel(pht('Description'))
       ->setName('description')
       ->setValue($description)
       ->setUser($viewer);
 
     $view_policies = id(new AphrontFormPolicyControl())
       ->setUser($viewer)
       ->setValue($view_policy)
       ->setCapability(PhabricatorPolicyCapability::CAN_VIEW)
       ->setPolicyObject($event)
       ->setPolicies($current_policies)
       ->setSpacePHID($space)
       ->setName('viewPolicy');
     $edit_policies = id(new AphrontFormPolicyControl())
       ->setUser($viewer)
       ->setValue($edit_policy)
       ->setCapability(PhabricatorPolicyCapability::CAN_EDIT)
       ->setPolicyObject($event)
       ->setPolicies($current_policies)
       ->setName('editPolicy');
 
     $subscribers = id(new AphrontFormTokenizerControl())
       ->setLabel(pht('Subscribers'))
       ->setName('subscribers')
       ->setValue($subscribers)
       ->setUser($viewer)
       ->setDatasource(new PhabricatorMetaMTAMailableDatasource());
 
     $invitees = id(new AphrontFormTokenizerControl())
       ->setLabel(pht('Invitees'))
       ->setName('invitees')
       ->setValue($invitees)
       ->setUser($viewer)
       ->setDatasource(new PhabricatorMetaMTAMailableDatasource());
 
 
     $icon = id(new PHUIFormIconSetControl())
       ->setLabel(pht('Icon'))
       ->setName('icon')
       ->setIconSet(new PhabricatorCalendarIconSet())
       ->setValue($icon);
 
     $form = id(new AphrontFormView())
       ->addHiddenInput('next', $next_workflow)
       ->addHiddenInput('query', $uri_query)
       ->setUser($viewer)
       ->appendChild($name);
 
     if ($recurring_date_edit_label) {
       $form->appendControl($recurring_date_edit_label);
     }
     if ($is_recurring_checkbox) {
       $form->appendChild($is_recurring_checkbox);
     }
     if ($recurrence_end_date_control) {
       $form->appendChild($recurrence_end_date_control);
     }
     if ($recurrence_frequency_select) {
       $form->appendControl($recurrence_frequency_select);
     }
 
     $form
       ->appendChild($all_day_checkbox)
       ->appendChild($start_control)
       ->appendChild($end_control)
       ->appendControl($view_policies)
       ->appendControl($edit_policies)
       ->appendControl($subscribers)
       ->appendControl($invitees)
       ->appendChild($projects)
       ->appendChild($description)
       ->appendChild($icon);
 
 
     if ($request->isAjax()) {
       return $this->newDialog()
         ->setTitle($title)
         ->setWidth(AphrontDialogView::WIDTH_FULL)
         ->appendForm($form)
         ->addCancelButton($cancel_uri)
         ->addSubmitButton($submit_label);
     }
 
     $submit = id(new AphrontFormSubmitControl())
       ->addCancelButton($cancel_uri)
       ->setValue($submit_label);
 
     $form->appendChild($submit);
 
     $form_box = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Event'))
       ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
       ->setValidationException($validation_exception)
       ->setForm($form);
 
     $crumbs = $this->buildApplicationCrumbs();
 
     if (!$this->isCreate()) {
       $crumbs->addTextCrumb('E'.$event->getId(), '/E'.$event->getId());
       $crumb_title = pht('Edit Event');
     } else {
       $crumb_title = pht('Create Event');
     }
 
     $crumbs->addTextCrumb($crumb_title);
     $crumbs->setBorder(true);
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title)
       ->setHeaderIcon($header_icon);
 
     $view = id(new PHUITwoColumnView())
       ->setHeader($header)
       ->setFooter($form_box);
 
     return $this->newPage()
       ->setTitle($title)
       ->setCrumbs($crumbs)
       ->appendChild($view);
   }
 
 
   public function getNewInviteeList(array $phids, $event) {
     $invitees = $event->getInvitees();
     $invitees = mpull($invitees, null, 'getInviteePHID');
     $invited_status = PhabricatorCalendarEventInvitee::STATUS_INVITED;
     $uninvited_status = PhabricatorCalendarEventInvitee::STATUS_UNINVITED;
     $phids = array_fuse($phids);
 
     $new = array();
     foreach ($phids as $phid) {
       $old_status = $event->getUserInviteStatus($phid);
       if ($old_status != $uninvited_status) {
         continue;
       }
       $new[$phid] = $invited_status;
     }
 
     foreach ($invitees as $invitee) {
       $deleted_invitee = !idx($phids, $invitee->getInviteePHID());
       if ($deleted_invitee) {
         $new[$invitee->getInviteePHID()] = $uninvited_status;
       }
     }
 
     return $new;
   }
 
   private function getDefaultTimeValues($viewer) {
     $start = new DateTime('@'.time());
     $start->setTimeZone($viewer->getTimeZone());
 
     $start->setTime($start->format('H'), 0, 0);
     $start->modify('+1 hour');
     $end = id(clone $start)->modify('+1 hour');
 
     $start_value = AphrontFormDateControlValue::newFromEpoch(
       $viewer,
       $start->format('U'));
     $end_value = AphrontFormDateControlValue::newFromEpoch(
       $viewer,
       $end->format('U'));
 
     return array($start_value, $end_value);
   }
 
 }
diff --git a/src/applications/dashboard/controller/PhabricatorDashboardEditController.php b/src/applications/dashboard/controller/PhabricatorDashboardEditController.php
index 6dc4a6b8b2..665f9735d8 100644
--- a/src/applications/dashboard/controller/PhabricatorDashboardEditController.php
+++ b/src/applications/dashboard/controller/PhabricatorDashboardEditController.php
@@ -1,362 +1,362 @@
 <?php
 
 final class PhabricatorDashboardEditController
   extends PhabricatorDashboardController {
 
   public function handleRequest(AphrontRequest $request) {
     $viewer = $request->getViewer();
     $id = $request->getURIData('id');
 
     if ($id) {
       $dashboard = id(new PhabricatorDashboardQuery())
         ->setViewer($viewer)
         ->withIDs(array($id))
         ->needPanels(true)
         ->requireCapabilities(
           array(
             PhabricatorPolicyCapability::CAN_VIEW,
             PhabricatorPolicyCapability::CAN_EDIT,
           ))
         ->executeOne();
       if (!$dashboard) {
         return new Aphront404Response();
       }
       $v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs(
         $dashboard->getPHID(),
         PhabricatorProjectObjectHasProjectEdgeType::EDGECONST);
       $v_projects = array_reverse($v_projects);
       $is_new = false;
     } else {
       if (!$request->getStr('edit')) {
         if ($request->isFormPost()) {
           switch ($request->getStr('template')) {
             case 'empty':
               break;
             default:
               return $this->processBuildTemplateRequest($request);
           }
         } else {
           return $this->processTemplateRequest($request);
         }
       }
 
       $dashboard = PhabricatorDashboard::initializeNewDashboard($viewer);
       $v_projects = array();
       $is_new = true;
     }
 
     $crumbs = $this->buildApplicationCrumbs();
 
     if ($is_new) {
       $title = pht('Create Dashboard');
       $header_icon = 'fa-plus-square';
       $button = pht('Create Dashboard');
       $cancel_uri = $this->getApplicationURI();
 
       $crumbs->addTextCrumb(pht('Create Dashboard'));
     } else {
       $id = $dashboard->getID();
       $cancel_uri = $this->getApplicationURI('manage/'.$id.'/');
 
       $title = pht('Edit Dashboard: %s', $dashboard->getName());
       $header_icon = 'fa-pencil';
       $button = pht('Save Changes');
 
       $crumbs->addTextCrumb($dashboard->getName(), $cancel_uri);
       $crumbs->addTextCrumb(pht('Edit'));
     }
 
     $v_name = $dashboard->getName();
     $v_layout_mode = $dashboard->getLayoutConfigObject()->getLayoutMode();
     $e_name = true;
 
     $validation_exception = null;
     if ($request->isFormPost() && $request->getStr('edit')) {
       $v_name = $request->getStr('name');
       $v_layout_mode = $request->getStr('layout_mode');
       $v_view_policy = $request->getStr('viewPolicy');
       $v_edit_policy = $request->getStr('editPolicy');
       $v_projects = $request->getArr('projects');
 
       $xactions = array();
 
       $type_name = PhabricatorDashboardTransaction::TYPE_NAME;
       $type_layout_mode = PhabricatorDashboardTransaction::TYPE_LAYOUT_MODE;
       $type_view_policy = PhabricatorTransactions::TYPE_VIEW_POLICY;
       $type_edit_policy = PhabricatorTransactions::TYPE_EDIT_POLICY;
 
       $xactions[] = id(new PhabricatorDashboardTransaction())
         ->setTransactionType($type_name)
         ->setNewValue($v_name);
       $xactions[] = id(new PhabricatorDashboardTransaction())
         ->setTransactionType($type_layout_mode)
         ->setNewValue($v_layout_mode);
       $xactions[] = id(new PhabricatorDashboardTransaction())
         ->setTransactionType($type_view_policy)
         ->setNewValue($v_view_policy);
       $xactions[] = id(new PhabricatorDashboardTransaction())
         ->setTransactionType($type_edit_policy)
         ->setNewValue($v_edit_policy);
 
       $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
       $xactions[] = id(new PhabricatorDashboardTransaction())
         ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
         ->setMetadataValue('edge:type', $proj_edge_type)
         ->setNewValue(array('=' => array_fuse($v_projects)));
 
       try {
         $editor = id(new PhabricatorDashboardTransactionEditor())
           ->setActor($viewer)
           ->setContinueOnNoEffect(true)
           ->setContentSourceFromRequest($request)
           ->applyTransactions($dashboard, $xactions);
 
         $uri = $this->getApplicationURI('manage/'.$dashboard->getID().'/');
 
         return id(new AphrontRedirectResponse())->setURI($uri);
       } catch (PhabricatorApplicationTransactionValidationException $ex) {
         $validation_exception = $ex;
 
         $e_name = $validation_exception->getShortMessage($type_name);
 
         $dashboard->setViewPolicy($v_view_policy);
         $dashboard->setEditPolicy($v_edit_policy);
       }
     }
 
     $policies = id(new PhabricatorPolicyQuery())
       ->setViewer($viewer)
       ->setObject($dashboard)
       ->execute();
 
     $layout_mode_options =
       PhabricatorDashboardLayoutConfig::getLayoutModeSelectOptions();
     $form = id(new AphrontFormView())
       ->setUser($viewer)
       ->addHiddenInput('edit', true)
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Name'))
           ->setName('name')
           ->setValue($v_name)
           ->setError($e_name))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Layout Mode'))
           ->setName('layout_mode')
           ->setValue($v_layout_mode)
           ->setOptions($layout_mode_options))
       ->appendChild(
         id(new AphrontFormPolicyControl())
           ->setName('viewPolicy')
           ->setPolicyObject($dashboard)
           ->setCapability(PhabricatorPolicyCapability::CAN_VIEW)
           ->setPolicies($policies))
       ->appendChild(
         id(new AphrontFormPolicyControl())
           ->setName('editPolicy')
           ->setPolicyObject($dashboard)
           ->setCapability(PhabricatorPolicyCapability::CAN_EDIT)
           ->setPolicies($policies));
 
     $form->appendControl(
       id(new AphrontFormTokenizerControl())
-        ->setLabel(pht('Projects'))
+        ->setLabel(pht('Tags'))
         ->setName('projects')
         ->setValue($v_projects)
         ->setDatasource(new PhabricatorProjectDatasource()));
 
     $form->appendChild(
         id(new AphrontFormSubmitControl())
           ->setValue($button)
           ->addCancelButton($cancel_uri));
 
     $box = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Dashboard'))
       ->setForm($form)
       ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
       ->setValidationException($validation_exception);
 
     $crumbs->setBorder(true);
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title)
       ->setHeaderIcon($header_icon);
 
     $view = id(new PHUITwoColumnView())
       ->setHeader($header)
       ->setFooter($box);
 
     return $this->newPage()
       ->setTitle($title)
       ->setCrumbs($crumbs)
       ->appendChild($view);
   }
 
   private function processTemplateRequest(AphrontRequest $request) {
     $viewer = $request->getUser();
 
     $template_control = id(new AphrontFormRadioButtonControl())
       ->setName(pht('template'))
       ->setValue($request->getStr('template', 'empty'))
       ->addButton(
         'empty',
         pht('Empty'),
         pht('Start with a blank canvas.'))
       ->addButton(
         'simple',
         pht('Simple Template'),
         pht(
           'Start with a simple dashboard with a welcome message, a feed of '.
           'recent events, and a few starter panels.'));
 
     $form = id(new AphrontFormView())
       ->setUser($viewer)
       ->appendRemarkupInstructions(
         pht('Choose a dashboard template to start with.'))
       ->appendChild($template_control);
 
     return $this->newDialog()
       ->setTitle(pht('Create Dashboard'))
       ->setWidth(AphrontDialogView::WIDTH_FORM)
       ->appendChild($form->buildLayoutView())
       ->addCancelButton('/dashboard/')
       ->addSubmitButton(pht('Continue'));
   }
 
   private function processBuildTemplateRequest(AphrontRequest $request) {
     $viewer = $request->getUser();
     $template = $request->getStr('template');
 
     $bare_panel = PhabricatorDashboardPanel::initializeNewPanel($viewer);
     $panel_phids = array();
 
     switch ($template) {
       case 'simple':
         $v_name = pht('New Simple Dashboard');
 
         $welcome_panel = $this->newPanel(
           $request,
           $viewer,
           'text',
           pht('Welcome'),
           array(
             'text' => pht(
               "This is a simple template dashboard. You can edit this panel ".
               "to change this text and replace it with a welcome message, or ".
               "leave this placeholder text as-is to give your dashboard a ".
               "rustic, authentic feel.\n\n".
               "You can drag, remove, add, and edit panels to customize the ".
               "rest of this dashboard to show the information you want.\n\n".
               "To install this dashboard on the home page, use the ".
               "**Install Dashboard** action link above."),
           ));
         $panel_phids[] = $welcome_panel->getPHID();
 
         $feed_panel = $this->newPanel(
           $request,
           $viewer,
           'query',
           pht('Recent Activity'),
           array(
             'class' => 'PhabricatorFeedSearchEngine',
             'key' => 'all',
           ));
         $panel_phids[] = $feed_panel->getPHID();
 
         $task_panel = $this->newPanel(
           $request,
           $viewer,
           'query',
           pht('Recent Tasks'),
           array(
             'class' => 'ManiphestTaskSearchEngine',
             'key' => 'all',
           ));
         $panel_phids[] = $task_panel->getPHID();
 
         $commit_panel = $this->newPanel(
           $request,
           $viewer,
           'query',
           pht('Recent Commits'),
           array(
             'class' => 'PhabricatorCommitSearchEngine',
             'key' => 'all',
           ));
         $panel_phids[] = $commit_panel->getPHID();
 
         $mode_2_and_1 = PhabricatorDashboardLayoutConfig::MODE_THIRDS_AND_THIRD;
         $layout = id(new PhabricatorDashboardLayoutConfig())
           ->setLayoutMode($mode_2_and_1)
           ->setPanelLocation(0, $welcome_panel->getPHID())
           ->setPanelLocation(0, $task_panel->getPHID())
           ->setPanelLocation(0, $commit_panel->getPHID())
           ->setPanelLocation(1, $feed_panel->getPHID());
 
         break;
       default:
         throw new Exception(pht('Unknown dashboard template %s!', $template));
     }
 
     // Create the dashboard.
 
     $dashboard = PhabricatorDashboard::initializeNewDashboard($viewer)
       ->setLayoutConfigFromObject($layout);
 
     $xactions = array();
 
     $xactions[] = id(new PhabricatorDashboardTransaction())
       ->setTransactionType(PhabricatorDashboardTransaction::TYPE_NAME)
       ->setNewValue($v_name);
 
     $xactions[] = id(new PhabricatorDashboardTransaction())
       ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
       ->setMetadataValue(
         'edge:type',
         PhabricatorDashboardDashboardHasPanelEdgeType::EDGECONST)
       ->setNewValue(
         array(
           '+' => array_fuse($panel_phids),
         ));
 
     $editor = id(new PhabricatorDashboardTransactionEditor())
       ->setActor($viewer)
       ->setContinueOnNoEffect(true)
       ->setContentSourceFromRequest($request)
       ->applyTransactions($dashboard, $xactions);
 
     $manage_uri = $this->getApplicationURI('manage/'.$dashboard->getID().'/');
 
     return id(new AphrontRedirectResponse())
       ->setURI($manage_uri);
   }
 
   private function newPanel(
     AphrontRequest $request,
     PhabricatorUser $viewer,
     $type,
     $name,
     array $properties) {
 
     $panel = PhabricatorDashboardPanel::initializeNewPanel($viewer)
       ->setPanelType($type)
       ->setProperties($properties);
 
     $xactions = array();
 
     $xactions[] = id(new PhabricatorDashboardPanelTransaction())
       ->setTransactionType(PhabricatorDashboardPanelTransaction::TYPE_NAME)
       ->setNewValue($name);
 
     $editor = id(new PhabricatorDashboardPanelTransactionEditor())
       ->setActor($viewer)
       ->setContinueOnNoEffect(true)
       ->setContentSourceFromRequest($request)
       ->applyTransactions($panel, $xactions);
 
     return $panel;
   }
 
 
 }
diff --git a/src/applications/dashboard/controller/PhabricatorDashboardPanelEditController.php b/src/applications/dashboard/controller/PhabricatorDashboardPanelEditController.php
index 790b8d11da..76ce3389ad 100644
--- a/src/applications/dashboard/controller/PhabricatorDashboardPanelEditController.php
+++ b/src/applications/dashboard/controller/PhabricatorDashboardPanelEditController.php
@@ -1,462 +1,462 @@
 <?php
 
 final class PhabricatorDashboardPanelEditController
   extends PhabricatorDashboardController {
 
   public function handleRequest(AphrontRequest $request) {
     $viewer = $request->getViewer();
     $id = $request->getURIData('id');
 
     // If the user is trying to create a panel directly on a dashboard, make
     // sure they have permission to see and edit the dashboard.
 
     $dashboard_id = $request->getInt('dashboardID');
     $dashboard = null;
     if ($dashboard_id) {
       $dashboard = id(new PhabricatorDashboardQuery())
         ->setViewer($viewer)
         ->withIDs(array($dashboard_id))
         ->requireCapabilities(
           array(
             PhabricatorPolicyCapability::CAN_VIEW,
             PhabricatorPolicyCapability::CAN_EDIT,
           ))
         ->executeOne();
       if (!$dashboard) {
         return new Aphront404Response();
       }
 
       $manage_uri = $this->getApplicationURI('manage/'.$dashboard_id.'/');
     }
 
     if ($id) {
       $is_create = false;
 
       if ($dashboard) {
         $capabilities = array(
           PhabricatorPolicyCapability::CAN_VIEW,
         );
       } else {
         $capabilities = array(
           PhabricatorPolicyCapability::CAN_VIEW,
           PhabricatorPolicyCapability::CAN_EDIT,
         );
       }
 
       $panel = id(new PhabricatorDashboardPanelQuery())
         ->setViewer($viewer)
         ->withIDs(array($id))
         ->requireCapabilities($capabilities)
         ->executeOne();
       if (!$panel) {
         return new Aphront404Response();
       }
       $v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs(
         $panel->getPHID(),
         PhabricatorProjectObjectHasProjectEdgeType::EDGECONST);
       $v_projects = array_reverse($v_projects);
 
       if ($dashboard) {
         $can_edit = PhabricatorPolicyFilter::hasCapability(
           $viewer,
           $panel,
           PhabricatorPolicyCapability::CAN_EDIT);
         if (!$can_edit) {
           if ($request->isFormPost() && $request->getBool('copy')) {
             $panel = $this->copyPanel(
               $request,
               $dashboard,
               $panel);
           } else {
             return $this->processPanelCloneRequest(
               $request,
               $dashboard,
               $panel);
           }
         }
       }
     } else {
       $is_create = true;
 
       $panel = PhabricatorDashboardPanel::initializeNewPanel($viewer);
       $types = PhabricatorDashboardPanelType::getAllPanelTypes();
       $type = $request->getStr('type');
       if (empty($types[$type])) {
         return $this->processPanelTypeRequest($request);
       }
       $v_projects = array();
 
       $panel->setPanelType($type);
     }
 
     if ($is_create) {
       $title = pht('Create New Panel');
       $button = pht('Create Panel');
       $header_icon = 'fa-plus-square';
       if ($dashboard) {
         $cancel_uri = $manage_uri;
       } else {
         $cancel_uri = $this->getApplicationURI('panel/');
       }
     } else {
       $title = pht('Edit Panel: %s', $panel->getName());
       $button = pht('Save Panel');
       $header_icon = 'fa-pencil';
       if ($dashboard) {
         $cancel_uri = $manage_uri;
       } else {
         $cancel_uri = '/'.$panel->getMonogram();
       }
     }
 
     $v_name = $panel->getName();
     $e_name = true;
 
     $field_list = PhabricatorCustomField::getObjectFields(
       $panel,
       PhabricatorCustomField::ROLE_EDIT);
     $field_list
       ->setViewer($viewer)
       ->readFieldsFromStorage($panel);
 
     if ($is_create && !$request->isFormPost()) {
       $panel->requireImplementation()->initializeFieldsFromRequest(
         $panel,
         $field_list,
         $request);
     }
 
     $validation_exception = null;
 
     // NOTE: We require 'edit' to distinguish between the "Choose a Type"
     // and "Create a Panel" dialogs.
 
     if ($request->isFormPost() && $request->getBool('edit')) {
       $v_name = $request->getStr('name');
       $v_view_policy = $request->getStr('viewPolicy');
       $v_edit_policy = $request->getStr('editPolicy');
       $v_projects = $request->getArr('projects');
 
       $type_name = PhabricatorDashboardPanelTransaction::TYPE_NAME;
       $type_view_policy = PhabricatorTransactions::TYPE_VIEW_POLICY;
       $type_edit_policy = PhabricatorTransactions::TYPE_EDIT_POLICY;
 
       $xactions = array();
 
       $xactions[] = id(new PhabricatorDashboardPanelTransaction())
         ->setTransactionType($type_name)
         ->setNewValue($v_name);
 
       $xactions[] = id(new PhabricatorDashboardPanelTransaction())
         ->setTransactionType($type_view_policy)
         ->setNewValue($v_view_policy);
 
       $xactions[] = id(new PhabricatorDashboardPanelTransaction())
         ->setTransactionType($type_edit_policy)
         ->setNewValue($v_edit_policy);
 
       $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
       $xactions[] = id(new PhabricatorDashboardPanelTransaction())
         ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
         ->setMetadataValue('edge:type', $proj_edge_type)
         ->setNewValue(array('=' => array_fuse($v_projects)));
 
       $field_xactions = $field_list->buildFieldTransactionsFromRequest(
         new PhabricatorDashboardPanelTransaction(),
         $request);
       $xactions = array_merge($xactions, $field_xactions);
 
       try {
         $editor = id(new PhabricatorDashboardPanelTransactionEditor())
           ->setActor($viewer)
           ->setContinueOnNoEffect(true)
           ->setContentSourceFromRequest($request)
           ->applyTransactions($panel, $xactions);
 
         // If we're creating a panel directly on a dashboard, add it now.
         if ($dashboard) {
           PhabricatorDashboardTransactionEditor::addPanelToDashboard(
             $viewer,
             PhabricatorContentSource::newFromRequest($request),
             $panel,
             $dashboard,
             $request->getInt('column', 0));
         }
 
         if ($dashboard) {
           $done_uri = $manage_uri;
         } else {
           $done_uri = '/'.$panel->getMonogram();
         }
 
         return id(new AphrontRedirectResponse())->setURI($done_uri);
       } catch (PhabricatorApplicationTransactionValidationException $ex) {
         $validation_exception = $ex;
 
         $e_name = $validation_exception->getShortMessage($type_name);
 
         $panel->setViewPolicy($v_view_policy);
         $panel->setEditPolicy($v_edit_policy);
       }
     }
 
     // NOTE: We're setting the submit URI explicitly because we need to edit
     // a different panel if we just cloned the original panel.
     if ($is_create) {
       $submit_uri = $this->getApplicationURI('panel/edit/');
     } else {
       $submit_uri = $this->getApplicationURI('panel/edit/'.$panel->getID().'/');
     }
 
     $policies = id(new PhabricatorPolicyQuery())
       ->setViewer($viewer)
       ->setObject($panel)
       ->execute();
 
     $form = id(new AphrontFormView())
       ->setUser($viewer)
       ->setAction($submit_uri)
       ->addHiddenInput('edit', true)
       ->addHiddenInput('dashboardID', $request->getInt('dashboardID'))
       ->addHiddenInput('column', $request->getInt('column'))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Name'))
           ->setName('name')
           ->setValue($v_name)
           ->setError($e_name))
       ->appendChild(
         id(new AphrontFormPolicyControl())
           ->setName('viewPolicy')
           ->setPolicyObject($panel)
           ->setCapability(PhabricatorPolicyCapability::CAN_VIEW)
           ->setPolicies($policies))
       ->appendChild(
         id(new AphrontFormPolicyControl())
           ->setName('editPolicy')
           ->setPolicyObject($panel)
           ->setCapability(PhabricatorPolicyCapability::CAN_EDIT)
           ->setPolicies($policies));
 
     $form->appendControl(
       id(new AphrontFormTokenizerControl())
-        ->setLabel(pht('Projects'))
+        ->setLabel(pht('Tags'))
         ->setName('projects')
         ->setValue($v_projects)
         ->setDatasource(new PhabricatorProjectDatasource()));
 
     $field_list->appendFieldsToForm($form);
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb(
       pht('Panels'),
       $this->getApplicationURI('panel/'));
     if ($is_create) {
       $crumbs->addTextCrumb(pht('New Panel'));
       $form->addHiddenInput('type', $panel->getPanelType());
     } else {
       $crumbs->addTextCrumb(
         $panel->getMonogram(),
         '/'.$panel->getMonogram());
       $crumbs->addTextCrumb(pht('Edit'));
     }
     $crumbs->setBorder(true);
 
     if ($request->isAjax()) {
       return $this->newDialog()
         ->setTitle($title)
         ->setSubmitURI($submit_uri)
         ->setWidth(AphrontDialogView::WIDTH_FORM)
         ->setValidationException($validation_exception)
         ->appendChild($form->buildLayoutView())
         ->addCancelButton($cancel_uri)
         ->addSubmitButton($button);
     } else {
       $form
         ->appendChild(
           id(new AphrontFormSubmitControl())
             ->setValue($button)
             ->addCancelButton($cancel_uri));
     }
 
     $box = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Panel'))
       ->setValidationException($validation_exception)
       ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
       ->setForm($form);
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title)
       ->setHeaderIcon($header_icon);
 
     $view = id(new PHUITwoColumnView())
       ->setHeader($header)
       ->setFooter($box);
 
     return $this->newPage()
       ->setTitle($title)
       ->setCrumbs($crumbs)
       ->appendChild($view);
   }
 
   private function processPanelTypeRequest(AphrontRequest $request) {
     $viewer = $request->getUser();
 
     $types = PhabricatorDashboardPanelType::getAllPanelTypes();
 
     $v_type = null;
     $errors = array();
     if ($request->isFormPost()) {
       $v_type = $request->getStr('type');
       if (!isset($types[$v_type])) {
         $errors[] = pht('You must select a type of panel to create.');
       }
     }
 
     $cancel_uri = $this->getApplicationURI('panel/');
 
     if (!$v_type) {
       $v_type = key($types);
     }
 
     $panel_types = id(new AphrontFormRadioButtonControl())
       ->setName('type')
       ->setValue($v_type);
 
     foreach ($types as $key => $type) {
       $panel_types->addButton(
         $key,
         $type->getPanelTypeName(),
         $type->getPanelTypeDescription());
     }
 
     $form = id(new AphrontFormView())
       ->setUser($viewer)
       ->addHiddenInput('dashboardID', $request->getInt('dashboardID'))
       ->addHiddenInput('column', $request->getInt('column'))
       ->appendRemarkupInstructions(
         pht(
           'Choose the type of dashboard panel to create:'))
       ->appendChild($panel_types);
 
     if ($request->isAjax()) {
       return $this->newDialog()
         ->setTitle(pht('Add New Panel'))
         ->setWidth(AphrontDialogView::WIDTH_FORM)
         ->setErrors($errors)
         ->appendChild($form->buildLayoutView())
         ->addCancelbutton($cancel_uri)
         ->addSubmitButton(pht('Continue'));
     } else {
       $form->appendChild(
         id(new AphrontFormSubmitControl())
           ->setValue(pht('Continue'))
           ->addCancelButton($cancel_uri));
     }
 
     $title = pht('Create Dashboard Panel');
     $header_icon = 'fa-plus-square';
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb(
       pht('Panels'),
       $this->getApplicationURI('panel/'));
     $crumbs->addTextCrumb(pht('New Panel'));
     $crumbs->setBorder(true);
 
     $box = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Panel'))
       ->setFormErrors($errors)
       ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
       ->setForm($form);
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title)
       ->setHeaderIcon($header_icon);
 
     $view = id(new PHUITwoColumnView())
       ->setHeader($header)
       ->setFooter($box);
 
     return $this->newPage()
       ->setTitle($title)
       ->setCrumbs($crumbs)
       ->appendChild($view);
   }
 
   private function processPanelCloneRequest(
     AphrontRequest $request,
     PhabricatorDashboard $dashboard,
     PhabricatorDashboardPanel $panel) {
 
     $viewer = $request->getUser();
 
     $manage_uri = $this->getApplicationURI('manage/'.$dashboard->getID().'/');
 
     return $this->newDialog()
       ->setTitle(pht('Copy Panel?'))
       ->addHiddenInput('copy', true)
       ->addHiddenInput('dashboardID', $request->getInt('dashboardID'))
       ->addHiddenInput('column', $request->getInt('column'))
       ->appendParagraph(
         pht(
           'You do not have permission to edit this dashboard panel, but you '.
           'can make a copy and edit that instead. If you choose to copy the '.
           'panel, the original will be replaced with the new copy on this '.
           'dashboard.'))
       ->appendParagraph(
         pht(
           'Do you want to make a copy of this panel?'))
       ->addCancelButton($manage_uri)
       ->addSubmitButton(pht('Copy Panel'));
   }
 
   private function copyPanel(
     AphrontRequest $request,
     PhabricatorDashboard $dashboard,
     PhabricatorDashboardPanel $panel) {
 
     $viewer = $request->getUser();
 
     $copy = PhabricatorDashboardPanel::initializeNewPanel($viewer);
     $copy = PhabricatorDashboardPanel::copyPanel($copy, $panel);
 
     $copy->openTransaction();
       $copy->save();
 
       // TODO: This should record a transaction on the panel copy, too.
 
       $xactions = array();
       $xactions[] = id(new PhabricatorDashboardTransaction())
         ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
         ->setMetadataValue(
           'edge:type',
           PhabricatorDashboardDashboardHasPanelEdgeType::EDGECONST)
         ->setNewValue(
           array(
             '+' => array(
               $copy->getPHID() => $copy->getPHID(),
             ),
             '-' => array(
               $panel->getPHID() => $panel->getPHID(),
             ),
           ));
 
       $layout_config = $dashboard->getLayoutConfigObject();
       $layout_config->replacePanel($panel->getPHID(), $copy->getPHID());
       $dashboard->setLayoutConfigFromObject($layout_config);
       $dashboard->save();
 
       $editor = id(new PhabricatorDashboardTransactionEditor())
         ->setActor($viewer)
         ->setContentSourceFromRequest($request)
         ->setContinueOnMissingFields(true)
         ->setContinueOnNoEffect(true)
         ->applyTransactions($dashboard, $xactions);
     $copy->saveTransaction();
 
     return $copy;
   }
 
 
 }
diff --git a/src/applications/differential/query/DifferentialRevisionSearchEngine.php b/src/applications/differential/query/DifferentialRevisionSearchEngine.php
index 002a5df180..5e4b76a326 100644
--- a/src/applications/differential/query/DifferentialRevisionSearchEngine.php
+++ b/src/applications/differential/query/DifferentialRevisionSearchEngine.php
@@ -1,364 +1,364 @@
 <?php
 
 final class DifferentialRevisionSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Differential Revisions');
   }
 
   public function getApplicationClassName() {
     return 'PhabricatorDifferentialApplication';
   }
 
   public function newQuery() {
     return id(new DifferentialRevisionQuery())
       ->needFlags(true)
       ->needDrafts(true)
       ->needRelationships(true);
   }
 
   public function getPageSize(PhabricatorSavedQuery $saved) {
     if ($saved->getQueryKey() == 'active') {
       return 0xFFFF;
     }
     return parent::getPageSize($saved);
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'responsiblePHIDs',
       $this->readUsersFromRequest($request, 'responsibles'));
 
     $saved->setParameter(
       'authorPHIDs',
       $this->readUsersFromRequest($request, 'authors'));
 
     $saved->setParameter(
       'reviewerPHIDs',
       $this->readUsersFromRequest(
         $request,
         'reviewers',
         array(
           PhabricatorProjectProjectPHIDType::TYPECONST,
         )));
 
     $saved->setParameter(
       'subscriberPHIDs',
       $this->readSubscribersFromRequest($request, 'subscribers'));
 
     $saved->setParameter(
       'repositoryPHIDs',
       $request->getArr('repositories'));
 
     $saved->setParameter(
       'projects',
       $this->readProjectsFromRequest($request, 'projects'));
 
     $saved->setParameter(
       'draft',
       $request->getBool('draft'));
 
     $saved->setParameter(
       'order',
       $request->getStr('order'));
 
     $saved->setParameter(
       'status',
       $request->getStr('status'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new DifferentialRevisionQuery())
       ->needFlags(true)
       ->needDrafts(true)
       ->needRelationships(true);
 
     $user_datasource = id(new PhabricatorPeopleUserFunctionDatasource())
       ->setViewer($this->requireViewer());
 
     $responsible_phids = $saved->getParameter('responsiblePHIDs', array());
     $responsible_phids = $user_datasource->evaluateTokens($responsible_phids);
     if ($responsible_phids) {
       $query->withResponsibleUsers($responsible_phids);
     }
 
     $this->setQueryProjects($query, $saved);
 
     $author_phids = $saved->getParameter('authorPHIDs', array());
     $author_phids = $user_datasource->evaluateTokens($author_phids);
     if ($author_phids) {
       $query->withAuthors($author_phids);
     }
 
     $reviewer_phids = $saved->getParameter('reviewerPHIDs', array());
     if ($reviewer_phids) {
       $query->withReviewers($reviewer_phids);
     }
 
     $sub_datasource = id(new PhabricatorMetaMTAMailableFunctionDatasource())
       ->setViewer($this->requireViewer());
     $subscriber_phids = $saved->getParameter('subscriberPHIDs', array());
     $subscriber_phids = $sub_datasource->evaluateTokens($subscriber_phids);
     if ($subscriber_phids) {
       $query->withCCs($subscriber_phids);
     }
 
     $repository_phids = $saved->getParameter('repositoryPHIDs', array());
     if ($repository_phids) {
       $query->withRepositoryPHIDs($repository_phids);
     }
 
     $draft = $saved->getParameter('draft', false);
     if ($draft && $this->requireViewer()->isLoggedIn()) {
       $query->withDraftRepliesByAuthors(
         array($this->requireViewer()->getPHID()));
     }
 
     $status = $saved->getParameter('status');
     if (idx($this->getStatusOptions(), $status)) {
       $query->withStatus($status);
     }
 
     $order = $saved->getParameter('order');
     if (idx($this->getOrderOptions(), $order)) {
       $query->setOrder($order);
     } else {
       $query->setOrder(DifferentialRevisionQuery::ORDER_CREATED);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved) {
 
     $responsible_phids = $saved->getParameter('responsiblePHIDs', array());
     $author_phids = $saved->getParameter('authorPHIDs', array());
     $reviewer_phids = $saved->getParameter('reviewerPHIDs', array());
     $subscriber_phids = $saved->getParameter('subscriberPHIDs', array());
     $repository_phids = $saved->getParameter('repositoryPHIDs', array());
     $only_draft = $saved->getParameter('draft', false);
     $projects = $saved->getParameter('projects', array());
 
     $form
       ->appendControl(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Responsible Users'))
           ->setName('responsibles')
           ->setDatasource(new PhabricatorPeopleUserFunctionDatasource())
           ->setValue($responsible_phids))
       ->appendControl(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Authors'))
           ->setName('authors')
           ->setDatasource(new PhabricatorPeopleUserFunctionDatasource())
           ->setValue($author_phids))
       ->appendControl(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Reviewers'))
           ->setName('reviewers')
           ->setDatasource(new PhabricatorProjectOrUserDatasource())
           ->setValue($reviewer_phids))
       ->appendControl(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Subscribers'))
           ->setName('subscribers')
           ->setDatasource(new PhabricatorMetaMTAMailableFunctionDatasource())
           ->setValue($subscriber_phids))
       ->appendControl(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Repositories'))
           ->setName('repositories')
           ->setDatasource(new DiffusionRepositoryDatasource())
           ->setValue($repository_phids))
       ->appendControl(
         id(new AphrontFormTokenizerControl())
-          ->setLabel(pht('Projects'))
+          ->setLabel(pht('Tags'))
           ->setName('projects')
           ->setDatasource(new PhabricatorProjectLogicalDatasource())
           ->setValue($projects))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Status'))
           ->setName('status')
           ->setOptions($this->getStatusOptions())
           ->setValue($saved->getParameter('status')));
 
     if ($this->requireViewer()->isLoggedIn()) {
       $form
         ->appendChild(
           id(new AphrontFormCheckboxControl())
             ->addCheckbox(
               'draft',
               1,
               pht('Show only revisions with a draft comment.'),
               $only_draft));
     }
 
     $form
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Order'))
           ->setName('order')
           ->setOptions($this->getOrderOptions())
           ->setValue($saved->getParameter('order')));
   }
 
   protected function getURI($path) {
     return '/differential/'.$path;
   }
 
   protected function getBuiltinQueryNames() {
     $names = array();
 
     if ($this->requireViewer()->isLoggedIn()) {
       $names['active'] = pht('Active Revisions');
       $names['authored'] = pht('Authored');
     }
 
     $names['all'] = pht('All Revisions');
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     $viewer = $this->requireViewer();
 
     switch ($query_key) {
       case 'active':
         return $query
           ->setParameter('responsiblePHIDs', array($viewer->getPHID()))
           ->setParameter('status', DifferentialRevisionQuery::STATUS_OPEN);
       case 'authored':
         return $query
           ->setParameter('authorPHIDs', array($viewer->getPHID()));
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   private function getStatusOptions() {
     return array(
       DifferentialRevisionQuery::STATUS_ANY            => pht('All'),
       DifferentialRevisionQuery::STATUS_OPEN           => pht('Open'),
       DifferentialRevisionQuery::STATUS_ACCEPTED       => pht('Accepted'),
       DifferentialRevisionQuery::STATUS_NEEDS_REVIEW   => pht('Needs Review'),
       DifferentialRevisionQuery::STATUS_NEEDS_REVISION => pht('Needs Revision'),
       DifferentialRevisionQuery::STATUS_CLOSED         => pht('Closed'),
       DifferentialRevisionQuery::STATUS_ABANDONED      => pht('Abandoned'),
     );
   }
 
   private function getOrderOptions() {
     return array(
       DifferentialRevisionQuery::ORDER_CREATED    => pht('Created'),
       DifferentialRevisionQuery::ORDER_MODIFIED   => pht('Updated'),
     );
   }
 
   protected function renderResultList(
     array $revisions,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($revisions, 'DifferentialRevision');
 
     $viewer = $this->requireViewer();
     $template = id(new DifferentialRevisionListView())
       ->setUser($viewer)
       ->setNoBox($this->isPanelContext());
 
     $views = array();
     if ($query->getQueryKey() == 'active') {
         $split = DifferentialRevisionQuery::splitResponsible(
           $revisions,
           $query->getParameter('responsiblePHIDs'));
         list($blocking, $active, $waiting) = $split;
 
       $views[] = id(clone $template)
         ->setHeader(pht('Blocking Others'))
         ->setNoDataString(
           pht('No revisions are blocked on your action.'))
         ->setHighlightAge(true)
         ->setRevisions($blocking)
         ->setHandles(array());
 
       $views[] = id(clone $template)
         ->setHeader(pht('Action Required'))
         ->setNoDataString(
           pht('No revisions require your action.'))
         ->setHighlightAge(true)
         ->setRevisions($active)
         ->setHandles(array());
 
       $views[] = id(clone $template)
         ->setHeader(pht('Waiting on Others'))
         ->setNoDataString(
           pht('You have no revisions waiting on others.'))
         ->setRevisions($waiting)
         ->setHandles(array());
     } else {
       $views[] = id(clone $template)
         ->setRevisions($revisions)
         ->setHandles(array());
     }
 
     $phids = array_mergev(mpull($views, 'getRequiredHandlePHIDs'));
     if ($phids) {
       $handles = id(new PhabricatorHandleQuery())
         ->setViewer($viewer)
         ->withPHIDs($phids)
         ->execute();
     } else {
       $handles = array();
     }
 
     foreach ($views as $view) {
       $view->setHandles($handles);
     }
 
     if (count($views) == 1) {
       // Reduce this to a PHUIObjectItemListView so we can get the free
       // support from ApplicationSearch.
       $list = head($views)->render();
     } else {
       $list = $views;
     }
 
     $result = new PhabricatorApplicationSearchResultView();
     $result->setContent($list);
 
     return $result;
   }
 
   protected function getNewUserBody() {
     $create_button = id(new PHUIButtonView())
       ->setTag('a')
       ->setText(pht('Create a Diff'))
       ->setHref('/differential/diff/create/')
       ->setColor(PHUIButtonView::GREEN);
 
     $icon = $this->getApplication()->getIcon();
     $app_name =  $this->getApplication()->getName();
     $view = id(new PHUIBigInfoView())
       ->setIcon($icon)
       ->setTitle(pht('Welcome to %s', $app_name))
       ->setDescription(
         pht('Pre-commit code review. Revisions that are waiting on your input '.
             'will appear here.'))
       ->addAction($create_button);
 
       return $view;
   }
 
 }
diff --git a/src/applications/diviner/controller/DivinerBookEditController.php b/src/applications/diviner/controller/DivinerBookEditController.php
index 2b1f90579b..758cc190bb 100644
--- a/src/applications/diviner/controller/DivinerBookEditController.php
+++ b/src/applications/diviner/controller/DivinerBookEditController.php
@@ -1,136 +1,136 @@
 <?php
 
 final class DivinerBookEditController extends DivinerController {
 
   public function handleRequest(AphrontRequest $request) {
     $viewer = $request->getViewer();
 
     $book_name = $request->getURIData('book');
 
     $book = id(new DivinerBookQuery())
       ->setViewer($viewer)
       ->requireCapabilities(
         array(
           PhabricatorPolicyCapability::CAN_VIEW,
           PhabricatorPolicyCapability::CAN_EDIT,
         ))
       ->needProjectPHIDs(true)
       ->withNames(array($book_name))
       ->executeOne();
 
     if (!$book) {
       return new Aphront404Response();
     }
 
     $view_uri = '/book/'.$book->getName().'/';
 
     if ($request->isFormPost()) {
       $v_projects = $request->getArr('projectPHIDs');
       $v_view     = $request->getStr('viewPolicy');
       $v_edit     = $request->getStr('editPolicy');
 
       $xactions = array();
       $xactions[] = id(new DivinerLiveBookTransaction())
         ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
         ->setMetadataValue(
           'edge:type',
           PhabricatorProjectObjectHasProjectEdgeType::EDGECONST)
         ->setNewValue(
           array(
             '=' => array_fuse($v_projects),
           ));
       $xactions[] = id(new DivinerLiveBookTransaction())
         ->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY)
         ->setNewValue($v_view);
       $xactions[] = id(new DivinerLiveBookTransaction())
         ->setTransactionType(PhabricatorTransactions::TYPE_EDIT_POLICY)
         ->setNewValue($v_edit);
 
       id(new DivinerLiveBookEditor())
         ->setContinueOnNoEffect(true)
         ->setContentSourceFromRequest($request)
         ->setActor($viewer)
         ->applyTransactions($book, $xactions);
 
       return id(new AphrontRedirectResponse())->setURI($view_uri);
     }
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb(pht('Edit Basics'));
     $crumbs->setBorder(true);
 
     $title = pht('Edit Book: %s', $book->getTitle());
     $header_icon = 'fa-pencil';
 
     $policies = id(new PhabricatorPolicyQuery())
       ->setViewer($viewer)
       ->setObject($book)
       ->execute();
     $view_capability = PhabricatorPolicyCapability::CAN_VIEW;
     $edit_capability = PhabricatorPolicyCapability::CAN_EDIT;
 
     $form = id(new AphrontFormView())
       ->setUser($viewer)
       ->appendControl(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorProjectDatasource())
           ->setName('projectPHIDs')
-          ->setLabel(pht('Projects'))
+          ->setLabel(pht('Tags'))
           ->setValue($book->getProjectPHIDs()))
       ->appendControl(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new DiffusionRepositoryDatasource())
           ->setName('repositoryPHIDs')
           ->setLabel(pht('Repository'))
           ->setDisableBehavior(true)
           ->setLimit(1)
           ->setValue($book->getRepositoryPHID()
             ? array($book->getRepositoryPHID())
             : null))
       ->appendChild(
         id(new AphrontFormPolicyControl())
           ->setName('viewPolicy')
           ->setPolicyObject($book)
           ->setCapability($view_capability)
           ->setPolicies($policies)
           ->setCaption($book->describeAutomaticCapability($view_capability)))
       ->appendChild(
         id(new AphrontFormPolicyControl())
           ->setName('editPolicy')
           ->setPolicyObject($book)
           ->setCapability($edit_capability)
           ->setPolicies($policies)
           ->setCaption($book->describeAutomaticCapability($edit_capability)))
       ->appendChild(
         id(new AphrontFormSubmitControl())
           ->setValue(pht('Save'))
           ->addCancelButton($view_uri));
 
     $box = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Book'))
       ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
       ->setForm($form);
 
     $timeline = $this->buildTransactionTimeline(
       $book,
       new DivinerLiveBookTransactionQuery());
     $timeline->setShouldTerminate(true);
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title)
       ->setHeaderIcon($header_icon);
 
     $view = id(new PHUITwoColumnView())
       ->setHeader($header)
       ->setFooter(array(
         $box,
         $timeline,
       ));
 
     return $this->newPage()
       ->setTitle($title)
       ->setCrumbs($crumbs)
       ->appendChild($view);
   }
 
 }
diff --git a/src/applications/feed/query/PhabricatorFeedSearchEngine.php b/src/applications/feed/query/PhabricatorFeedSearchEngine.php
index 94e82f8bfe..b8caf60ae7 100644
--- a/src/applications/feed/query/PhabricatorFeedSearchEngine.php
+++ b/src/applications/feed/query/PhabricatorFeedSearchEngine.php
@@ -1,150 +1,150 @@
 <?php
 
 final class PhabricatorFeedSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getResultTypeDescription() {
     return pht('Feed Stories');
   }
 
   public function getApplicationClassName() {
     return 'PhabricatorFeedApplication';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'userPHIDs',
       $this->readUsersFromRequest($request, 'users'));
 
     $saved->setParameter(
       'projectPHIDs',
       array_values($request->getArr('projectPHIDs')));
 
     $saved->setParameter(
       'viewerProjects',
       $request->getBool('viewerProjects'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PhabricatorFeedQuery());
 
     $phids = array();
 
     $user_phids = $saved->getParameter('userPHIDs');
     if ($user_phids) {
       $phids[] = $user_phids;
     }
 
     $proj_phids = $saved->getParameter('projectPHIDs');
     if ($proj_phids) {
       $phids[] = $proj_phids;
     }
 
     $viewer_projects = $saved->getParameter('viewerProjects');
     if ($viewer_projects) {
       $viewer = $this->requireViewer();
       $projects = id(new PhabricatorProjectQuery())
         ->setViewer($viewer)
         ->withMemberPHIDs(array($viewer->getPHID()))
         ->execute();
       $phids[] = mpull($projects, 'getPHID');
     }
 
     $phids = array_mergev($phids);
     if ($phids) {
       $query->setFilterPHIDs($phids);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $user_phids = $saved_query->getParameter('userPHIDs', array());
     $proj_phids = $saved_query->getParameter('projectPHIDs', array());
     $viewer_projects = $saved_query->getParameter('viewerProjects');
 
     $form
       ->appendControl(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorPeopleDatasource())
           ->setName('users')
           ->setLabel(pht('Include Users'))
           ->setValue($user_phids))
       ->appendControl(
         id(new AphrontFormTokenizerControl())
           ->setDatasource(new PhabricatorProjectDatasource())
           ->setName('projectPHIDs')
           ->setLabel(pht('Include Projects'))
           ->setValue($proj_phids))
       ->appendChild(
         id(new AphrontFormCheckboxControl())
           ->addCheckbox(
             'viewerProjects',
             1,
             pht('Include stories about projects I am a member of.'),
             $viewer_projects));
   }
 
   protected function getURI($path) {
     return '/feed/'.$path;
   }
 
   protected function getBuiltinQueryNames() {
     $names = array(
       'all' => pht('All Stories'),
     );
 
     if ($this->requireViewer()->isLoggedIn()) {
-      $names['projects'] = pht('Projects');
+      $names['projects'] = pht('Tags');
     }
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
 
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'projects':
         return $query->setParameter('viewerProjects', true);
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function renderResultList(
     array $objects,
     PhabricatorSavedQuery $query,
     array $handles) {
 
     $builder = new PhabricatorFeedBuilder($objects);
 
     if ($this->isPanelContext()) {
       $builder->setShowHovercards(false);
     } else {
       $builder->setShowHovercards(true);
     }
 
     $builder->setUser($this->requireViewer());
     $view = $builder->buildView();
 
     $list = phutil_tag_div('phabricator-feed-frame', $view);
 
     $result = new PhabricatorApplicationSearchResultView();
     $result->setContent($list);
 
     return $result;
   }
 
 }
diff --git a/src/applications/fund/controller/FundInitiativeEditController.php b/src/applications/fund/controller/FundInitiativeEditController.php
index 354d686bd5..6e092d1e05 100644
--- a/src/applications/fund/controller/FundInitiativeEditController.php
+++ b/src/applications/fund/controller/FundInitiativeEditController.php
@@ -1,256 +1,256 @@
 <?php
 
 final class FundInitiativeEditController
   extends FundController {
 
   public function handleRequest(AphrontRequest $request) {
     $viewer = $request->getViewer();
     $id = $request->getURIData('id');
 
     if ($id) {
       $initiative = id(new FundInitiativeQuery())
         ->setViewer($viewer)
         ->withIDs(array($id))
         ->requireCapabilities(
           array(
             PhabricatorPolicyCapability::CAN_VIEW,
             PhabricatorPolicyCapability::CAN_EDIT,
           ))
         ->executeOne();
       if (!$initiative) {
         return new Aphront404Response();
       }
       $is_new = false;
     } else {
       $initiative = FundInitiative::initializeNewInitiative($viewer);
       $is_new = true;
     }
 
     if ($is_new) {
       $title = pht('Create Initiative');
       $button_text = pht('Create Initiative');
       $cancel_uri = $this->getApplicationURI();
       $header_icon = 'fa-plus-square';
     } else {
       $title = pht(
         'Edit Initiative: %s',
         $initiative->getName());
       $button_text = pht('Save Changes');
       $cancel_uri = '/'.$initiative->getMonogram();
       $header_icon = 'fa-pencil';
     }
 
     $e_name = true;
     $v_name = $initiative->getName();
 
     $e_merchant = null;
     $v_merchant = $initiative->getMerchantPHID();
 
     $v_desc = $initiative->getDescription();
     $v_risk = $initiative->getRisks();
 
     if ($is_new) {
       $v_projects = array();
     } else {
       $v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs(
         $initiative->getPHID(),
         PhabricatorProjectObjectHasProjectEdgeType::EDGECONST);
       $v_projects = array_reverse($v_projects);
     }
 
     $validation_exception = null;
     if ($request->isFormPost()) {
       $v_name = $request->getStr('name');
       $v_desc = $request->getStr('description');
       $v_risk = $request->getStr('risks');
       $v_view = $request->getStr('viewPolicy');
       $v_edit = $request->getStr('editPolicy');
       $v_merchant = $request->getStr('merchantPHID');
       $v_projects = $request->getArr('projects');
 
       $type_name = FundInitiativeTransaction::TYPE_NAME;
       $type_desc = FundInitiativeTransaction::TYPE_DESCRIPTION;
       $type_risk = FundInitiativeTransaction::TYPE_RISKS;
       $type_merchant = FundInitiativeTransaction::TYPE_MERCHANT;
       $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY;
       $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY;
 
       $xactions = array();
 
       $xactions[] = id(new FundInitiativeTransaction())
         ->setTransactionType($type_name)
         ->setNewValue($v_name);
 
       $xactions[] = id(new FundInitiativeTransaction())
         ->setTransactionType($type_desc)
         ->setNewValue($v_desc);
 
       $xactions[] = id(new FundInitiativeTransaction())
         ->setTransactionType($type_risk)
         ->setNewValue($v_risk);
 
       $xactions[] = id(new FundInitiativeTransaction())
         ->setTransactionType($type_merchant)
         ->setNewValue($v_merchant);
 
       $xactions[] = id(new FundInitiativeTransaction())
         ->setTransactionType($type_view)
         ->setNewValue($v_view);
 
       $xactions[] = id(new FundInitiativeTransaction())
         ->setTransactionType($type_edit)
         ->setNewValue($v_edit);
 
       $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
       $xactions[] = id(new FundInitiativeTransaction())
         ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
         ->setMetadataValue('edge:type', $proj_edge_type)
         ->setNewValue(array('=' => array_fuse($v_projects)));
 
       $editor = id(new FundInitiativeEditor())
         ->setActor($viewer)
         ->setContentSourceFromRequest($request)
         ->setContinueOnNoEffect(true);
 
       try {
         $editor->applyTransactions($initiative, $xactions);
 
         return id(new AphrontRedirectResponse())
           ->setURI('/'.$initiative->getMonogram());
       } catch (PhabricatorApplicationTransactionValidationException $ex) {
         $validation_exception = $ex;
 
         $e_name = $ex->getShortMessage($type_name);
         $e_merchant = $ex->getShortMessage($type_merchant);
 
         $initiative->setViewPolicy($v_view);
         $initiative->setEditPolicy($v_edit);
       }
     }
 
     $policies = id(new PhabricatorPolicyQuery())
       ->setViewer($viewer)
       ->setObject($initiative)
       ->execute();
 
     $merchants = id(new PhortuneMerchantQuery())
       ->setViewer($viewer)
       ->requireCapabilities(
         array(
           PhabricatorPolicyCapability::CAN_VIEW,
           PhabricatorPolicyCapability::CAN_EDIT,
         ))
       ->execute();
 
     $merchant_options = array();
     foreach ($merchants as $merchant) {
       $merchant_options[$merchant->getPHID()] = pht(
         'Merchant %d %s',
         $merchant->getID(),
         $merchant->getName());
     }
 
     if ($v_merchant && empty($merchant_options[$v_merchant])) {
       $merchant_options = array(
         $v_merchant => pht('(Restricted Merchant)'),
       ) + $merchant_options;
     }
 
     if (!$merchant_options) {
       return $this->newDialog()
         ->setTitle(pht('No Valid Phortune Merchant Accounts'))
         ->appendParagraph(
           pht(
             'You do not control any merchant accounts which can receive '.
             'payments from this initiative. When you create an initiative, '.
             'you need to specify a merchant account where funds will be paid '.
             'to.'))
         ->appendParagraph(
           pht(
             'Create a merchant account in the Phortune application before '.
             'creating an initiative in Fund.'))
         ->addCancelButton($this->getApplicationURI());
     }
 
     $form = id(new AphrontFormView())
       ->setUser($viewer)
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('name')
           ->setLabel(pht('Name'))
           ->setValue($v_name)
           ->setError($e_name))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setName('merchantPHID')
           ->setLabel(pht('Pay To Merchant'))
           ->setValue($v_merchant)
           ->setError($e_merchant)
           ->setOptions($merchant_options))
       ->appendChild(
         id(new PhabricatorRemarkupControl())
           ->setUser($viewer)
           ->setName('description')
           ->setLabel(pht('Description'))
           ->setValue($v_desc))
       ->appendChild(
         id(new PhabricatorRemarkupControl())
           ->setUser($viewer)
           ->setName('risks')
           ->setLabel(pht('Risks/Challenges'))
           ->setValue($v_risk))
       ->appendControl(
         id(new AphrontFormTokenizerControl())
-          ->setLabel(pht('Projects'))
+          ->setLabel(pht('Tags'))
           ->setName('projects')
           ->setValue($v_projects)
           ->setDatasource(new PhabricatorProjectDatasource()))
       ->appendChild(
         id(new AphrontFormPolicyControl())
           ->setName('viewPolicy')
           ->setPolicyObject($initiative)
           ->setCapability(PhabricatorPolicyCapability::CAN_VIEW)
           ->setPolicies($policies))
       ->appendChild(
         id(new AphrontFormPolicyControl())
           ->setName('editPolicy')
           ->setPolicyObject($initiative)
           ->setCapability(PhabricatorPolicyCapability::CAN_EDIT)
           ->setPolicies($policies))
       ->appendChild(
         id(new AphrontFormSubmitControl())
           ->setValue($button_text)
           ->addCancelButton($cancel_uri));
 
     $crumbs = $this->buildApplicationCrumbs();
     if ($is_new) {
       $crumbs->addTextCrumb(pht('Create Initiative'));
     } else {
       $crumbs->addTextCrumb(
         $initiative->getMonogram(),
         '/'.$initiative->getMonogram());
       $crumbs->addTextCrumb(pht('Edit'));
     }
     $crumbs->setBorder(true);
 
     $box = id(new PHUIObjectBoxView())
       ->setValidationException($validation_exception)
       ->setHeaderText(pht('Initiative'))
       ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
       ->appendChild($form);
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title)
       ->setHeaderIcon($header_icon);
 
     $view = id(new PHUITwoColumnView())
       ->setHeader($header)
       ->setFooter($box);
 
     return $this->newPage()
       ->setTitle($title)
       ->setCrumbs($crumbs)
       ->appendChild($view);
   }
 
 }
diff --git a/src/applications/maniphest/export/ManiphestExcelDefaultFormat.php b/src/applications/maniphest/export/ManiphestExcelDefaultFormat.php
index bd0c771361..1451ae504e 100644
--- a/src/applications/maniphest/export/ManiphestExcelDefaultFormat.php
+++ b/src/applications/maniphest/export/ManiphestExcelDefaultFormat.php
@@ -1,140 +1,140 @@
 <?php
 
 final class ManiphestExcelDefaultFormat extends ManiphestExcelFormat {
 
   public function getName() {
     return pht('Default');
   }
 
   public function getFileName() {
     return 'maniphest_tasks_'.date('Ymd');
   }
 
   /**
    * @phutil-external-symbol class PHPExcel
    * @phutil-external-symbol class PHPExcel_IOFactory
    * @phutil-external-symbol class PHPExcel_Style_NumberFormat
    * @phutil-external-symbol class PHPExcel_Cell_DataType
    */
   public function buildWorkbook(
     PHPExcel $workbook,
     array $tasks,
     array $handles,
     PhabricatorUser $user) {
 
     $sheet = $workbook->setActiveSheetIndex(0);
     $sheet->setTitle(pht('Tasks'));
 
     $widths = array(
       null,
       15,
       null,
       10,
       15,
       15,
       60,
       30,
       20,
       100,
     );
 
     foreach ($widths as $col => $width) {
       if ($width !== null) {
         $sheet->getColumnDimension($this->col($col))->setWidth($width);
       }
     }
 
     $status_map = ManiphestTaskStatus::getTaskStatusMap();
     $pri_map = ManiphestTaskPriority::getTaskPriorityMap();
 
     $date_format = null;
 
     $rows = array();
     $rows[] = array(
       pht('ID'),
       pht('Owner'),
       pht('Status'),
       pht('Priority'),
       pht('Date Created'),
       pht('Date Updated'),
       pht('Title'),
-      pht('Projects'),
+      pht('Tags'),
       pht('URI'),
       pht('Description'),
     );
 
     $is_date = array(
       false,
       false,
       false,
       false,
       true,
       true,
       false,
       false,
       false,
       false,
     );
 
     $header_format = array(
       'font'  => array(
         'bold' => true,
       ),
     );
 
     foreach ($tasks as $task) {
       $task_owner = null;
       if ($task->getOwnerPHID()) {
         $task_owner = $handles[$task->getOwnerPHID()]->getName();
       }
 
       $projects = array();
       foreach ($task->getProjectPHIDs() as $phid) {
         $projects[] = $handles[$phid]->getName();
       }
       $projects = implode(', ', $projects);
 
       $rows[] = array(
         'T'.$task->getID(),
         $task_owner,
         idx($status_map, $task->getStatus(), '?'),
         idx($pri_map, $task->getPriority(), '?'),
         $this->computeExcelDate($task->getDateCreated()),
         $this->computeExcelDate($task->getDateModified()),
         $task->getTitle(),
         $projects,
         PhabricatorEnv::getProductionURI('/T'.$task->getID()),
         id(new PhutilUTF8StringTruncator())
         ->setMaximumBytes(512)
         ->truncateString($task->getDescription()),
       );
     }
 
     foreach ($rows as $row => $cols) {
       foreach ($cols as $col => $spec) {
         $cell_name = $this->col($col).($row + 1);
         $cell = $sheet
           ->setCellValue($cell_name, $spec, $return_cell = true);
 
         if ($row == 0) {
           $sheet->getStyle($cell_name)->applyFromArray($header_format);
         }
 
         if ($is_date[$col]) {
           $code = PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2;
           $sheet
             ->getStyle($cell_name)
             ->getNumberFormat()
             ->setFormatCode($code);
         } else {
           $cell->setDataType(PHPExcel_Cell_DataType::TYPE_STRING);
         }
       }
     }
   }
 
   private function col($n) {
     return chr(ord('A') + $n);
   }
 
 }
diff --git a/src/applications/pholio/controller/PholioMockEditController.php b/src/applications/pholio/controller/PholioMockEditController.php
index f3dedc9a33..362c5c41df 100644
--- a/src/applications/pholio/controller/PholioMockEditController.php
+++ b/src/applications/pholio/controller/PholioMockEditController.php
@@ -1,383 +1,383 @@
 <?php
 
 final class PholioMockEditController extends PholioController {
 
   public function handleRequest(AphrontRequest $request) {
     $viewer = $request->getViewer();
     $id = $request->getURIData('id');
 
     if ($id) {
       $mock = id(new PholioMockQuery())
         ->setViewer($viewer)
         ->needImages(true)
         ->requireCapabilities(
           array(
             PhabricatorPolicyCapability::CAN_VIEW,
             PhabricatorPolicyCapability::CAN_EDIT,
           ))
         ->withIDs(array($id))
         ->executeOne();
 
       if (!$mock) {
         return new Aphront404Response();
       }
 
       $title = pht('Edit Mock: %s', $mock->getName());
       $header_icon = 'fa-pencil';
 
       $is_new = false;
       $mock_images = $mock->getImages();
       $files = mpull($mock_images, 'getFile');
       $mock_images = mpull($mock_images, null, 'getFilePHID');
     } else {
       $mock = PholioMock::initializeNewMock($viewer);
 
       $title = pht('Create Mock');
       $header_icon = 'fa-plus-square';
 
       $is_new = true;
       $files = array();
       $mock_images = array();
     }
 
     if ($is_new) {
       $v_projects = array();
     } else {
       $v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs(
         $mock->getPHID(),
         PhabricatorProjectObjectHasProjectEdgeType::EDGECONST);
       $v_projects = array_reverse($v_projects);
     }
 
     $e_name = true;
     $e_images = count($mock_images) ? null : true;
     $errors = array();
     $posted_mock_images = array();
 
     $v_name = $mock->getName();
     $v_desc = $mock->getDescription();
     $v_view = $mock->getViewPolicy();
     $v_edit = $mock->getEditPolicy();
     $v_cc = PhabricatorSubscribersQuery::loadSubscribersForPHID(
       $mock->getPHID());
     $v_space = $mock->getSpacePHID();
 
     if ($request->isFormPost()) {
       $xactions = array();
 
       $type_name = PholioTransaction::TYPE_NAME;
       $type_desc = PholioTransaction::TYPE_DESCRIPTION;
       $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY;
       $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY;
       $type_cc   = PhabricatorTransactions::TYPE_SUBSCRIBERS;
       $type_space = PhabricatorTransactions::TYPE_SPACE;
 
       $v_name = $request->getStr('name');
       $v_desc = $request->getStr('description');
       $v_view = $request->getStr('can_view');
       $v_edit = $request->getStr('can_edit');
       $v_cc   = $request->getArr('cc');
       $v_projects = $request->getArr('projects');
       $v_space = $request->getStr('spacePHID');
 
       $mock_xactions = array();
       $mock_xactions[$type_name] = $v_name;
       $mock_xactions[$type_desc] = $v_desc;
       $mock_xactions[$type_view] = $v_view;
       $mock_xactions[$type_edit] = $v_edit;
       $mock_xactions[$type_cc]   = array('=' => $v_cc);
       $mock_xactions[$type_space] = $v_space;
 
       if (!strlen($request->getStr('name'))) {
         $e_name = pht('Required');
         $errors[] = pht('You must give the mock a name.');
       }
 
       $file_phids = $request->getArr('file_phids');
       if ($file_phids) {
         $files = id(new PhabricatorFileQuery())
           ->setViewer($viewer)
           ->withPHIDs($file_phids)
           ->execute();
         $files = mpull($files, null, 'getPHID');
         $files = array_select_keys($files, $file_phids);
       } else {
         $files = array();
       }
 
       if (!$files) {
         $e_images = pht('Required');
         $errors[] = pht('You must add at least one image to the mock.');
       } else {
         $mock->setCoverPHID(head($files)->getPHID());
       }
 
       foreach ($mock_xactions as $type => $value) {
         $xactions[$type] = id(new PholioTransaction())
           ->setTransactionType($type)
           ->setNewValue($value);
       }
 
       $order = $request->getStrList('imageOrder');
       $sequence_map = array_flip($order);
       $replaces = $request->getArr('replaces');
       $replaces_map = array_flip($replaces);
 
       /**
        * Foreach file posted, check to see whether we are replacing an image,
        * adding an image, or simply updating image metadata. Create
        * transactions for these cases as appropos.
        */
       foreach ($files as $file_phid => $file) {
         $replaces_image_phid = null;
         if (isset($replaces_map[$file_phid])) {
           $old_file_phid = $replaces_map[$file_phid];
           if ($old_file_phid != $file_phid) {
             $old_image = idx($mock_images, $old_file_phid);
             if ($old_image) {
               $replaces_image_phid = $old_image->getPHID();
             }
           }
         }
 
         $existing_image = idx($mock_images, $file_phid);
 
         $title = (string)$request->getStr('title_'.$file_phid);
         $description = (string)$request->getStr('description_'.$file_phid);
         $sequence = $sequence_map[$file_phid];
 
         if ($replaces_image_phid) {
           $replace_image = id(new PholioImage())
             ->setReplacesImagePHID($replaces_image_phid)
             ->setFilePhid($file_phid)
             ->attachFile($file)
             ->setName(strlen($title) ? $title : $file->getName())
             ->setDescription($description)
             ->setSequence($sequence);
           $xactions[] = id(new PholioTransaction())
             ->setTransactionType(
               PholioTransaction::TYPE_IMAGE_REPLACE)
             ->setNewValue($replace_image);
           $posted_mock_images[] = $replace_image;
         } else if (!$existing_image) { // this is an add
           $add_image = id(new PholioImage())
             ->setFilePhid($file_phid)
             ->attachFile($file)
             ->setName(strlen($title) ? $title : $file->getName())
             ->setDescription($description)
             ->setSequence($sequence);
           $xactions[] = id(new PholioTransaction())
             ->setTransactionType(PholioTransaction::TYPE_IMAGE_FILE)
             ->setNewValue(
               array('+' => array($add_image)));
           $posted_mock_images[] = $add_image;
         } else {
           $xactions[] = id(new PholioTransaction())
             ->setTransactionType(PholioTransaction::TYPE_IMAGE_NAME)
             ->setNewValue(
               array($existing_image->getPHID() => $title));
           $xactions[] = id(new PholioTransaction())
             ->setTransactionType(
               PholioTransaction::TYPE_IMAGE_DESCRIPTION)
               ->setNewValue(
                 array($existing_image->getPHID() => $description));
           $xactions[] = id(new PholioTransaction())
             ->setTransactionType(
               PholioTransaction::TYPE_IMAGE_SEQUENCE)
               ->setNewValue(
                 array($existing_image->getPHID() => $sequence));
 
           $posted_mock_images[] = $existing_image;
         }
       }
       foreach ($mock_images as $file_phid => $mock_image) {
         if (!isset($files[$file_phid]) && !isset($replaces[$file_phid])) {
           // this is an outright delete
           $xactions[] = id(new PholioTransaction())
             ->setTransactionType(PholioTransaction::TYPE_IMAGE_FILE)
             ->setNewValue(
               array('-' => array($mock_image)));
         }
       }
 
       if (!$errors) {
         $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
         $xactions[] = id(new PholioTransaction())
           ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
           ->setMetadataValue('edge:type', $proj_edge_type)
           ->setNewValue(array('=' => array_fuse($v_projects)));
 
         $mock->openTransaction();
         $editor = id(new PholioMockEditor())
           ->setContentSourceFromRequest($request)
           ->setContinueOnNoEffect(true)
           ->setActor($viewer);
 
         $xactions = $editor->applyTransactions($mock, $xactions);
 
         $mock->saveTransaction();
 
         return id(new AphrontRedirectResponse())
           ->setURI('/M'.$mock->getID());
       }
     }
 
     if ($id) {
       $submit = id(new AphrontFormSubmitControl())
         ->addCancelButton('/M'.$id)
         ->setValue(pht('Save'));
     } else {
       $submit = id(new AphrontFormSubmitControl())
         ->addCancelButton($this->getApplicationURI())
         ->setValue(pht('Create'));
     }
 
     $policies = id(new PhabricatorPolicyQuery())
       ->setViewer($viewer)
       ->setObject($mock)
       ->execute();
 
     // NOTE: Make this show up correctly on the rendered form.
     $mock->setViewPolicy($v_view);
     $mock->setEditPolicy($v_edit);
 
     $image_elements = array();
     if ($posted_mock_images) {
       $display_mock_images = $posted_mock_images;
     } else {
       $display_mock_images = $mock_images;
     }
     foreach ($display_mock_images as $mock_image) {
       $image_elements[] = id(new PholioUploadedImageView())
         ->setUser($viewer)
         ->setImage($mock_image)
         ->setReplacesPHID($mock_image->getFilePHID());
     }
 
     $list_id = celerity_generate_unique_node_id();
     $drop_id = celerity_generate_unique_node_id();
     $order_id = celerity_generate_unique_node_id();
 
     $list_control = phutil_tag(
       'div',
       array(
         'id' => $list_id,
         'class' => 'pholio-edit-list',
       ),
       $image_elements);
 
     $drop_control = phutil_tag(
       'div',
       array(
         'id' => $drop_id,
         'class' => 'pholio-edit-drop',
       ),
       pht('Drag and drop images here to add them to the mock.'));
 
     $order_control = phutil_tag(
       'input',
       array(
         'type' => 'hidden',
         'name' => 'imageOrder',
         'id' => $order_id,
       ));
 
     Javelin::initBehavior(
       'pholio-mock-edit',
       array(
         'listID' => $list_id,
         'dropID' => $drop_id,
         'orderID' => $order_id,
         'uploadURI' => '/file/dropupload/',
         'renderURI' => $this->getApplicationURI('image/upload/'),
         'pht' => array(
           'uploading' => pht('Uploading Image...'),
           'uploaded' => pht('Upload Complete...'),
           'undo' => pht('Undo'),
           'removed' => pht('This image will be removed from the mock.'),
         ),
       ));
 
     require_celerity_resource('pholio-edit-css');
     $form = id(new AphrontFormView())
       ->setUser($viewer)
       ->appendChild($order_control)
       ->appendChild(
         id(new AphrontFormTextControl())
         ->setName('name')
         ->setValue($v_name)
         ->setLabel(pht('Name'))
         ->setError($e_name))
       ->appendChild(
         id(new PhabricatorRemarkupControl())
         ->setName('description')
         ->setValue($v_desc)
         ->setLabel(pht('Description'))
         ->setUser($viewer))
       ->appendControl(
         id(new AphrontFormTokenizerControl())
-          ->setLabel(pht('Projects'))
+          ->setLabel(pht('Tags'))
           ->setName('projects')
           ->setValue($v_projects)
           ->setDatasource(new PhabricatorProjectDatasource()))
       ->appendControl(
         id(new AphrontFormTokenizerControl())
           ->setLabel(pht('Subscribers'))
           ->setName('cc')
           ->setValue($v_cc)
           ->setUser($viewer)
           ->setDatasource(new PhabricatorMetaMTAMailableDatasource()))
       ->appendChild(
         id(new AphrontFormPolicyControl())
           ->setUser($viewer)
           ->setCapability(PhabricatorPolicyCapability::CAN_VIEW)
           ->setPolicyObject($mock)
           ->setPolicies($policies)
           ->setSpacePHID($v_space)
           ->setName('can_view'))
       ->appendChild(
         id(new AphrontFormPolicyControl())
           ->setUser($viewer)
           ->setCapability(PhabricatorPolicyCapability::CAN_EDIT)
           ->setPolicyObject($mock)
           ->setPolicies($policies)
           ->setName('can_edit'))
       ->appendChild(
         id(new AphrontFormMarkupControl())
           ->setValue($list_control))
       ->appendChild(
         id(new AphrontFormMarkupControl())
           ->setValue($drop_control)
           ->setError($e_images))
       ->appendChild($submit);
 
     $form_box = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Mock'))
       ->setFormErrors($errors)
       ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
       ->setForm($form);
 
     $crumbs = $this->buildApplicationCrumbs();
     if (!$is_new) {
       $crumbs->addTextCrumb($mock->getMonogram(), '/'.$mock->getMonogram());
     }
     $crumbs->addTextCrumb($title);
     $crumbs->setBorder(true);
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title)
       ->setHeaderIcon($header_icon);
 
     $view = id(new PHUITwoColumnView())
       ->setHeader($header)
       ->setFooter($form_box);
 
     return $this->newPage()
       ->setTitle($title)
       ->setCrumbs($crumbs)
       ->addQuicksandConfig(
         array('mockEditConfig' => true))
       ->appendChild($view);
   }
 
 }
diff --git a/src/applications/phurl/controller/PhabricatorPhurlURLEditController.php b/src/applications/phurl/controller/PhabricatorPhurlURLEditController.php
index 3af53802e5..73ba3474fe 100644
--- a/src/applications/phurl/controller/PhabricatorPhurlURLEditController.php
+++ b/src/applications/phurl/controller/PhabricatorPhurlURLEditController.php
@@ -1,266 +1,266 @@
 <?php
 
 final class PhabricatorPhurlURLEditController
   extends PhabricatorPhurlController {
 
   public function handleRequest(AphrontRequest $request) {
     $id = $request->getURIData('id');
     $is_create = !$id;
 
     $viewer = $this->getViewer();
     $user_phid = $viewer->getPHID();
     $error_long_url = true;
     $error_alias = null;
     $validation_exception = null;
 
     $next_workflow = $request->getStr('next');
     $uri_query = $request->getStr('query');
 
     if ($is_create) {
       $this->requireApplicationCapability(
         PhabricatorPhurlURLCreateCapability::CAPABILITY);
 
       $url = PhabricatorPhurlURL::initializeNewPhurlURL(
         $viewer);
       $submit_label = pht('Create');
       $page_title = pht('Shorten URL');
       $header_icon = 'fa-plus-square';
       $subscribers = array();
       $cancel_uri = $this->getApplicationURI();
     } else {
       $url = id(new PhabricatorPhurlURLQuery())
       ->setViewer($viewer)
       ->withIDs(array($id))
       ->requireCapabilities(
         array(
           PhabricatorPolicyCapability::CAN_VIEW,
           PhabricatorPolicyCapability::CAN_EDIT,
         ))
       ->executeOne();
 
       if (!$url) {
         return new Aphront404Response();
       }
 
       $submit_label = pht('Update');
       $page_title   = pht('Edit URL: %s', $url->getName());
       $header_icon = 'fa-pencil';
 
       $subscribers = PhabricatorSubscribersQuery::loadSubscribersForPHID(
         $url->getPHID());
 
       $cancel_uri = '/U'.$url->getID();
     }
 
     if ($is_create) {
       $projects = array();
     } else {
       $projects = PhabricatorEdgeQuery::loadDestinationPHIDs(
         $url->getPHID(),
         PhabricatorProjectObjectHasProjectEdgeType::EDGECONST);
       $projects = array_reverse($projects);
     }
 
     $name = $url->getName();
     $long_url = $url->getLongURL();
     $alias = $url->getAlias();
     $description = $url->getDescription();
     $edit_policy = $url->getEditPolicy();
     $view_policy = $url->getViewPolicy();
     $space = $url->getSpacePHID();
 
     if ($request->isFormPost()) {
       $xactions = array();
       $name = $request->getStr('name');
       $long_url = $request->getStr('longURL');
       $alias = $request->getStr('alias');
       $projects = $request->getArr('projects');
       $description = $request->getStr('description');
       $subscribers = $request->getArr('subscribers');
       $edit_policy = $request->getStr('editPolicy');
       $view_policy = $request->getStr('viewPolicy');
       $space = $request->getStr('spacePHID');
 
       $xactions[] = id(new PhabricatorPhurlURLTransaction())
         ->setTransactionType(
           PhabricatorPhurlURLTransaction::TYPE_NAME)
         ->setNewValue($name);
 
       $xactions[] = id(new PhabricatorPhurlURLTransaction())
         ->setTransactionType(
           PhabricatorPhurlURLTransaction::TYPE_URL)
         ->setNewValue($long_url);
 
       $xactions[] = id(new PhabricatorPhurlURLTransaction())
         ->setTransactionType(
           PhabricatorPhurlURLTransaction::TYPE_ALIAS)
         ->setNewValue($alias);
 
       $xactions[] = id(new PhabricatorPhurlURLTransaction())
         ->setTransactionType(
           PhabricatorTransactions::TYPE_SUBSCRIBERS)
         ->setNewValue(array('=' => array_fuse($subscribers)));
 
       $xactions[] = id(new PhabricatorPhurlURLTransaction())
         ->setTransactionType(
           PhabricatorPhurlURLTransaction::TYPE_DESCRIPTION)
         ->setNewValue($description);
 
       $xactions[] = id(new PhabricatorPhurlURLTransaction())
         ->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY)
         ->setNewValue($view_policy);
 
       $xactions[] = id(new PhabricatorPhurlURLTransaction())
         ->setTransactionType(PhabricatorTransactions::TYPE_EDIT_POLICY)
         ->setNewValue($edit_policy);
 
       $xactions[] = id(new PhabricatorPhurlURLTransaction())
         ->setTransactionType(PhabricatorTransactions::TYPE_SPACE)
         ->setNewValue($space);
 
       $editor = id(new PhabricatorPhurlURLEditor())
         ->setActor($viewer)
         ->setContentSourceFromRequest($request)
         ->setContinueOnNoEffect(true);
 
       try {
         $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
         $xactions[] = id(new PhabricatorPhurlURLTransaction())
           ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
           ->setMetadataValue('edge:type', $proj_edge_type)
           ->setNewValue(array('=' => array_fuse($projects)));
 
         $xactions = $editor->applyTransactions($url, $xactions);
         return id(new AphrontRedirectResponse())
           ->setURI($url->getURI());
       } catch (PhabricatorApplicationTransactionValidationException $ex) {
         $validation_exception = $ex;
         $error_long_url = $ex->getShortMessage(
           PhabricatorPhurlURLTransaction::TYPE_URL);
         $error_alias = $ex->getShortMessage(
           PhabricatorPhurlURLTransaction::TYPE_ALIAS);
       }
     }
 
     $current_policies = id(new PhabricatorPolicyQuery())
       ->setViewer($viewer)
       ->setObject($url)
       ->execute();
 
     $name = id(new AphrontFormTextControl())
       ->setLabel(pht('Name'))
       ->setName('name')
       ->setValue($name);
 
     $long_url = id(new AphrontFormTextControl())
       ->setLabel(pht('URL'))
       ->setName('longURL')
       ->setValue($long_url)
       ->setError($error_long_url);
 
     $alias = id(new AphrontFormTextControl())
       ->setLabel(pht('Alias'))
       ->setName('alias')
       ->setValue($alias)
       ->setError($error_alias);
 
     $projects = id(new AphrontFormTokenizerControl())
-      ->setLabel(pht('Projects'))
+      ->setLabel(pht('Tags'))
       ->setName('projects')
       ->setValue($projects)
       ->setUser($viewer)
       ->setDatasource(new PhabricatorProjectDatasource());
 
     $description = id(new PhabricatorRemarkupControl())
       ->setLabel(pht('Description'))
       ->setName('description')
       ->setValue($description)
       ->setUser($viewer);
 
     $view_policies = id(new AphrontFormPolicyControl())
       ->setUser($viewer)
       ->setValue($view_policy)
       ->setCapability(PhabricatorPolicyCapability::CAN_VIEW)
       ->setPolicyObject($url)
       ->setPolicies($current_policies)
       ->setSpacePHID($space)
       ->setName('viewPolicy');
     $edit_policies = id(new AphrontFormPolicyControl())
       ->setUser($viewer)
       ->setValue($edit_policy)
       ->setCapability(PhabricatorPolicyCapability::CAN_EDIT)
       ->setPolicyObject($url)
       ->setPolicies($current_policies)
       ->setName('editPolicy');
 
     $subscribers = id(new AphrontFormTokenizerControl())
       ->setLabel(pht('Subscribers'))
       ->setName('subscribers')
       ->setValue($subscribers)
       ->setUser($viewer)
       ->setDatasource(new PhabricatorMetaMTAMailableDatasource());
 
     $form = id(new AphrontFormView())
       ->setUser($viewer)
       ->appendChild($name)
       ->appendChild($long_url)
       ->appendChild($alias)
       ->appendControl($view_policies)
       ->appendControl($edit_policies)
       ->appendControl($subscribers)
       ->appendChild($projects)
       ->appendChild($description);
 
 
     if ($request->isAjax()) {
       return $this->newDialog()
         ->setTitle($page_title)
         ->setWidth(AphrontDialogView::WIDTH_FULL)
         ->appendForm($form)
         ->addCancelButton($cancel_uri)
         ->addSubmitButton($submit_label);
     }
 
     $submit = id(new AphrontFormSubmitControl())
       ->addCancelButton($cancel_uri)
       ->setValue($submit_label);
 
     $form->appendChild($submit);
 
     $form_box = id(new PHUIObjectBoxView())
       ->setHeaderText($page_title)
       ->setForm($form);
 
     $crumbs = $this->buildApplicationCrumbs();
 
     if (!$is_create) {
       $crumbs->addTextCrumb($url->getMonogram(), $url->getURI());
     } else {
       $crumbs->addTextCrumb(pht('Create URL'));
     }
 
     $crumbs->addTextCrumb($page_title);
     $crumbs->setBorder(true);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('URL'))
       ->setValidationException($validation_exception)
       ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
       ->appendChild($form);
 
     $header = id(new PHUIHeaderView())
       ->setHeader($page_title)
       ->setHeaderIcon($header_icon);
 
     $view = id(new PHUITwoColumnView())
       ->setHeader($header)
       ->setFooter(array(
         $object_box,
       ));
 
     return $this->newPage()
       ->setTitle($page_title)
       ->setCrumbs($crumbs)
       ->appendChild($view);
   }
 }
diff --git a/src/applications/ponder/controller/PonderQuestionEditController.php b/src/applications/ponder/controller/PonderQuestionEditController.php
index 907094c7e9..49ca5fe846 100644
--- a/src/applications/ponder/controller/PonderQuestionEditController.php
+++ b/src/applications/ponder/controller/PonderQuestionEditController.php
@@ -1,219 +1,219 @@
 <?php
 
 final class PonderQuestionEditController extends PonderController {
 
   public function handleRequest(AphrontRequest $request) {
     $viewer = $request->getViewer();
     $id = $request->getURIData('id');
 
     if ($id) {
       $question = id(new PonderQuestionQuery())
         ->setViewer($viewer)
         ->withIDs(array($id))
         ->requireCapabilities(
           array(
             PhabricatorPolicyCapability::CAN_VIEW,
             PhabricatorPolicyCapability::CAN_EDIT,
           ))
         ->executeOne();
       if (!$question) {
         return new Aphront404Response();
       }
       $v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs(
         $question->getPHID(),
         PhabricatorProjectObjectHasProjectEdgeType::EDGECONST);
       $v_projects = array_reverse($v_projects);
       $is_new = false;
     } else {
       $is_new = true;
       $question = PonderQuestion::initializeNewQuestion($viewer);
       $v_projects = array();
     }
 
     $v_title = $question->getTitle();
     $v_content = $question->getContent();
     $v_wiki = $question->getAnswerWiki();
     $v_view = $question->getViewPolicy();
     $v_space = $question->getSpacePHID();
     $v_status = $question->getStatus();
 
 
     $errors = array();
     $e_title = true;
     if ($request->isFormPost()) {
       $v_title = $request->getStr('title');
       $v_content = $request->getStr('content');
       $v_wiki = $request->getStr('answerWiki');
       $v_projects = $request->getArr('projects');
       $v_view = $request->getStr('viewPolicy');
       $v_space = $request->getStr('spacePHID');
       $v_status = $request->getStr('status');
 
       $len = phutil_utf8_strlen($v_title);
       if ($len < 1) {
         $errors[] = pht('Title must not be empty.');
         $e_title = pht('Required');
       } else if ($len > 255) {
         $errors[] = pht('Title is too long.');
         $e_title = pht('Too Long');
       }
 
       if (!$errors) {
         $template = id(new PonderQuestionTransaction());
         $xactions = array();
 
         $xactions[] = id(clone $template)
           ->setTransactionType(PonderQuestionTransaction::TYPE_TITLE)
           ->setNewValue($v_title);
 
         $xactions[] = id(clone $template)
           ->setTransactionType(PonderQuestionTransaction::TYPE_CONTENT)
           ->setNewValue($v_content);
 
         $xactions[] = id(clone $template)
           ->setTransactionType(PonderQuestionTransaction::TYPE_ANSWERWIKI)
           ->setNewValue($v_wiki);
 
         if (!$is_new) {
           $xactions[] = id(clone $template)
             ->setTransactionType(PonderQuestionTransaction::TYPE_STATUS)
             ->setNewValue($v_status);
         }
 
         $xactions[] = id(clone $template)
           ->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY)
           ->setNewValue($v_view);
 
         $xactions[] = id(clone $template)
           ->setTransactionType(PhabricatorTransactions::TYPE_SPACE)
           ->setNewValue($v_space);
 
         $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
         $xactions[] = id(new PonderQuestionTransaction())
           ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
           ->setMetadataValue('edge:type', $proj_edge_type)
           ->setNewValue(array('=' => array_fuse($v_projects)));
 
         $editor = id(new PonderQuestionEditor())
           ->setActor($viewer)
           ->setContentSourceFromRequest($request)
           ->setContinueOnNoEffect(true);
 
         $editor->applyTransactions($question, $xactions);
 
         return id(new AphrontRedirectResponse())
           ->setURI('/Q'.$question->getID());
       }
     }
 
     $policies = id(new PhabricatorPolicyQuery())
       ->setViewer($viewer)
       ->setObject($question)
       ->execute();
 
     $form = id(new AphrontFormView())
       ->setUser($viewer)
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Question'))
           ->setName('title')
           ->setValue($v_title)
           ->setError($e_title))
       ->appendChild(
         id(new PhabricatorRemarkupControl())
           ->setUser($viewer)
           ->setName('content')
           ->setID('content')
           ->setValue($v_content)
           ->setLabel(pht('Question Details'))
           ->setUser($viewer))
       ->appendChild(
         id(new PhabricatorRemarkupControl())
           ->setUser($viewer)
           ->setName('answerWiki')
           ->setID('answerWiki')
           ->setValue($v_wiki)
           ->setLabel(pht('Answer Summary'))
           ->setUser($viewer))
       ->appendControl(
         id(new AphrontFormPolicyControl())
           ->setName('viewPolicy')
           ->setPolicyObject($question)
           ->setSpacePHID($v_space)
           ->setPolicies($policies)
           ->setValue($v_view)
           ->setCapability(PhabricatorPolicyCapability::CAN_VIEW));
 
 
     if (!$is_new) {
       $form->appendChild(
           id(new AphrontFormSelectControl())
             ->setLabel(pht('Status'))
             ->setName('status')
             ->setValue($v_status)
             ->setOptions(PonderQuestionStatus::getQuestionStatusMap()));
     }
 
     $form->appendControl(
       id(new AphrontFormTokenizerControl())
-        ->setLabel(pht('Projects'))
+        ->setLabel(pht('Tags'))
         ->setName('projects')
         ->setValue($v_projects)
         ->setDatasource(new PhabricatorProjectDatasource()));
 
     $form->appendChild(
       id(new AphrontFormSubmitControl())
         ->addCancelButton($this->getApplicationURI())
         ->setValue(pht('Submit')));
 
     $preview = id(new PHUIRemarkupPreviewPanel())
       ->setHeader(pht('Question Preview'))
       ->setControlID('content')
       ->setPreviewURI($this->getApplicationURI('preview/'));
 
     $answer_preview = id(new PHUIRemarkupPreviewPanel())
       ->setHeader(pht('Answer Summary Preview'))
       ->setControlID('answerWiki')
       ->setPreviewURI($this->getApplicationURI('preview/'));
 
     $crumbs = $this->buildApplicationCrumbs();
 
     $id = $question->getID();
     if ($id) {
       $crumbs->addTextCrumb("Q{$id}", "/Q{$id}");
       $crumbs->addTextCrumb(pht('Edit'));
       $title = pht('Edit Question');
       $header = id(new PHUIHeaderView())
         ->setHeader($title)
         ->setHeaderIcon('fa-pencil');
     } else {
       $crumbs->addTextCrumb(pht('Ask Question'));
       $title = pht('Ask New Question');
       $header = id(new PHUIHeaderView())
         ->setHeader($title)
         ->setHeaderIcon('fa-plus-square');
     }
     $crumbs->setBorder(true);
 
     $box = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Question'))
       ->setFormErrors($errors)
       ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
       ->setForm($form);
 
     $view = id(new PHUITwoColumnView())
       ->setHeader($header)
       ->setFooter(array(
         $box,
         $preview,
         $answer_preview,
       ));
 
     return $this->newPage()
       ->setTitle($title)
       ->setCrumbs($crumbs)
       ->appendChild($view);
 
   }
 
 }
diff --git a/src/applications/slowvote/controller/PhabricatorSlowvoteEditController.php b/src/applications/slowvote/controller/PhabricatorSlowvoteEditController.php
index 7354466772..e9f3d48de4 100644
--- a/src/applications/slowvote/controller/PhabricatorSlowvoteEditController.php
+++ b/src/applications/slowvote/controller/PhabricatorSlowvoteEditController.php
@@ -1,278 +1,278 @@
 <?php
 
 final class PhabricatorSlowvoteEditController
   extends PhabricatorSlowvoteController {
 
   public function handleRequest(AphrontRequest $request) {
     $viewer = $request->getViewer();
     $id = $request->getURIData('id');
 
     if ($id) {
       $poll = id(new PhabricatorSlowvoteQuery())
         ->setViewer($viewer)
         ->withIDs(array($id))
         ->requireCapabilities(
           array(
             PhabricatorPolicyCapability::CAN_VIEW,
             PhabricatorPolicyCapability::CAN_EDIT,
           ))
         ->executeOne();
       if (!$poll) {
         return new Aphront404Response();
       }
       $is_new = false;
     } else {
       $poll = PhabricatorSlowvotePoll::initializeNewPoll($viewer);
       $is_new = true;
     }
 
     if ($is_new) {
       $v_projects = array();
     } else {
       $v_projects = PhabricatorEdgeQuery::loadDestinationPHIDs(
         $poll->getPHID(),
         PhabricatorProjectObjectHasProjectEdgeType::EDGECONST);
       $v_projects = array_reverse($v_projects);
     }
 
     $e_question = true;
     $e_response = true;
     $errors = array();
 
     $v_question = $poll->getQuestion();
     $v_description = $poll->getDescription();
     $v_responses = $poll->getResponseVisibility();
     $v_shuffle = $poll->getShuffle();
     $v_space = $poll->getSpacePHID();
 
     $responses = $request->getArr('response');
     if ($request->isFormPost()) {
       $v_question = $request->getStr('question');
       $v_description = $request->getStr('description');
       $v_responses = (int)$request->getInt('responses');
       $v_shuffle = (int)$request->getBool('shuffle');
       $v_view_policy = $request->getStr('viewPolicy');
       $v_projects = $request->getArr('projects');
 
       $v_space = $request->getStr('spacePHID');
 
       if ($is_new) {
         $poll->setMethod($request->getInt('method'));
       }
 
       if (!strlen($v_question)) {
         $e_question = pht('Required');
         $errors[] = pht('You must ask a poll question.');
       } else {
         $e_question = null;
       }
 
       if ($is_new) {
         $responses = array_filter($responses);
         if (empty($responses)) {
           $errors[] = pht('You must offer at least one response.');
           $e_response = pht('Required');
         } else {
           $e_response = null;
         }
       }
 
       $xactions = array();
       $template = id(new PhabricatorSlowvoteTransaction());
 
       $xactions[] = id(clone $template)
         ->setTransactionType(PhabricatorSlowvoteTransaction::TYPE_QUESTION)
         ->setNewValue($v_question);
 
       $xactions[] = id(clone $template)
         ->setTransactionType(PhabricatorSlowvoteTransaction::TYPE_DESCRIPTION)
         ->setNewValue($v_description);
 
       $xactions[] = id(clone $template)
         ->setTransactionType(PhabricatorSlowvoteTransaction::TYPE_RESPONSES)
         ->setNewValue($v_responses);
 
       $xactions[] = id(clone $template)
         ->setTransactionType(PhabricatorSlowvoteTransaction::TYPE_SHUFFLE)
         ->setNewValue($v_shuffle);
 
       $xactions[] = id(clone $template)
         ->setTransactionType(PhabricatorTransactions::TYPE_VIEW_POLICY)
         ->setNewValue($v_view_policy);
 
       $xactions[] = id(clone $template)
         ->setTransactionType(PhabricatorTransactions::TYPE_SPACE)
         ->setNewValue($v_space);
 
       if (empty($errors)) {
         $proj_edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
         $xactions[] = id(new PhabricatorSlowvoteTransaction())
           ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
           ->setMetadataValue('edge:type', $proj_edge_type)
           ->setNewValue(array('=' => array_fuse($v_projects)));
 
         $editor = id(new PhabricatorSlowvoteEditor())
           ->setActor($viewer)
           ->setContinueOnNoEffect(true)
           ->setContentSourceFromRequest($request);
 
         $xactions = $editor->applyTransactions($poll, $xactions);
 
         if ($is_new) {
           $poll->save();
 
           foreach ($responses as $response) {
             $option = new PhabricatorSlowvoteOption();
             $option->setName($response);
             $option->setPollID($poll->getID());
             $option->save();
           }
         }
 
         return id(new AphrontRedirectResponse())
           ->setURI('/V'.$poll->getID());
       } else {
         $poll->setViewPolicy($v_view_policy);
       }
     }
 
     $form = id(new AphrontFormView())
       ->setUser($viewer)
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Question'))
           ->setName('question')
           ->setValue($v_question)
           ->setError($e_question))
       ->appendChild(
         id(new PhabricatorRemarkupControl())
           ->setUser($viewer)
           ->setLabel(pht('Description'))
           ->setName('description')
           ->setValue($v_description))
       ->appendControl(
         id(new AphrontFormTokenizerControl())
-          ->setLabel(pht('Projects'))
+          ->setLabel(pht('Tags'))
           ->setName('projects')
           ->setValue($v_projects)
           ->setDatasource(new PhabricatorProjectDatasource()));
 
     if ($is_new) {
       for ($ii = 0; $ii < 10; $ii++) {
         $n = ($ii + 1);
         $response = id(new AphrontFormTextControl())
           ->setLabel(pht('Response %d', $n))
           ->setName('response[]')
           ->setValue(idx($responses, $ii, ''));
 
         if ($ii == 0) {
           $response->setError($e_response);
         }
 
         $form->appendChild($response);
       }
     }
 
     $poll_type_options = array(
       PhabricatorSlowvotePoll::METHOD_PLURALITY =>
         pht('Plurality (Single Choice)'),
       PhabricatorSlowvotePoll::METHOD_APPROVAL  =>
         pht('Approval (Multiple Choice)'),
     );
 
     $response_type_options = array(
       PhabricatorSlowvotePoll::RESPONSES_VISIBLE
         => pht('Allow anyone to see the responses'),
       PhabricatorSlowvotePoll::RESPONSES_VOTERS
         => pht('Require a vote to see the responses'),
       PhabricatorSlowvotePoll::RESPONSES_OWNER
         => pht('Only I can see the responses'),
     );
 
     if ($is_new) {
       $form->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Vote Type'))
           ->setName('method')
           ->setValue($poll->getMethod())
           ->setOptions($poll_type_options));
     } else {
       $form->appendChild(
         id(new AphrontFormStaticControl())
           ->setLabel(pht('Vote Type'))
           ->setValue(idx($poll_type_options, $poll->getMethod())));
     }
 
     if ($is_new) {
       $title = pht('Create Slowvote');
       $button = pht('Create');
       $cancel_uri = $this->getApplicationURI();
       $header_icon = 'fa-plus-square';
     } else {
       $title = pht('Edit Poll: %s', $poll->getQuestion());
       $button = pht('Save Changes');
       $cancel_uri = '/V'.$poll->getID();
       $header_icon = 'fa-pencil';
     }
 
     $policies = id(new PhabricatorPolicyQuery())
       ->setViewer($viewer)
       ->setObject($poll)
       ->execute();
 
     $form
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Responses'))
           ->setName('responses')
           ->setValue($v_responses)
           ->setOptions($response_type_options))
       ->appendChild(
         id(new AphrontFormCheckboxControl())
           ->setLabel(pht('Shuffle'))
           ->addCheckbox(
             'shuffle',
             1,
             pht('Show choices in random order.'),
             $v_shuffle))
       ->appendChild(
         id(new AphrontFormPolicyControl())
           ->setUser($viewer)
           ->setName('viewPolicy')
           ->setPolicyObject($poll)
           ->setPolicies($policies)
           ->setCapability(PhabricatorPolicyCapability::CAN_VIEW)
           ->setSpacePHID($v_space))
       ->appendChild(
         id(new AphrontFormSubmitControl())
           ->setValue($button)
           ->addCancelButton($cancel_uri));
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb($title);
     $crumbs->setBorder(true);
 
     $form_box = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Poll'))
       ->setFormErrors($errors)
       ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
       ->setForm($form);
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title)
       ->setHeaderIcon($header_icon);
 
     $view = id(new PHUITwoColumnView())
       ->setHeader($header)
       ->setFooter($form_box);
 
     return $this->newPage()
       ->setTitle($title)
       ->setCrumbs($crumbs)
       ->appendChild(
         array(
           $view,
       ));
   }
 
 }