diff --git a/resources/celerity/map.php b/resources/celerity/map.php
index c8cf00b60f..2e692ac95c 100644
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -1,2279 +1,2274 @@
 <?php
 
 /**
  * This file is automatically generated. Use 'bin/celerity map' to rebuild it.
  * @generated
  */
 return array(
   'names' =>
   array(
-    'core.pkg.css' => '59ea1706',
-    'core.pkg.js' => 'b2ed04a2',
+    'core.pkg.css' => 'e62084f9',
+    'core.pkg.js' => 'ab0d6d3d',
     'darkconsole.pkg.js' => 'ca8671ce',
     'differential.pkg.css' => '382ca868',
-    'differential.pkg.js' => '36bec171',
+    'differential.pkg.js' => '68d225fb',
     'diffusion.pkg.css' => '3783278d',
     'diffusion.pkg.js' => '077e3ad0',
     'javelin.pkg.js' => 'b4831ebf',
     'maniphest.pkg.css' => 'f1887d71',
     'maniphest.pkg.js' => '2fe8af22',
     'rsrc/css/aphront/aphront-bars.css' => '231ac33c',
     'rsrc/css/aphront/context-bar.css' => '1c3b0529',
     'rsrc/css/aphront/dark-console.css' => '6378ef3d',
     'rsrc/css/aphront/dialog-view.css' => 'c01d24b4',
     'rsrc/css/aphront/error-view.css' => '9f1d5518',
     'rsrc/css/aphront/lightbox-attachment.css' => '7acac05d',
     'rsrc/css/aphront/list-filter-view.css' => '2ae43867',
     'rsrc/css/aphront/multi-column.css' => '1b95ab2e',
     'rsrc/css/aphront/notification.css' => 'ef2c9b34',
     'rsrc/css/aphront/pager-view.css' => '2e3539af',
     'rsrc/css/aphront/panel-view.css' => '5846dfa2',
     'rsrc/css/aphront/phabricator-nav-view.css' => '80e60fc1',
     'rsrc/css/aphront/request-failure-view.css' => 'da14df31',
     'rsrc/css/aphront/table-view.css' => '88e80148',
     'rsrc/css/aphront/tokenizer.css' => '36903077',
     'rsrc/css/aphront/tooltip.css' => '9c90229d',
     'rsrc/css/aphront/transaction.css' => 'ce491938',
     'rsrc/css/aphront/two-column.css' => '16ab3ad2',
-    'rsrc/css/aphront/typeahead.css' => '466ac215',
+    'rsrc/css/aphront/typeahead.css' => '1f4c9e23',
     'rsrc/css/application/auth/auth.css' => '1e655982',
     'rsrc/css/application/base/main-menu-view.css' => '0207239c',
     'rsrc/css/application/base/notification-menu.css' => '99ffef72',
     'rsrc/css/application/base/phabricator-application-launch-view.css' => 'd290ba21',
     'rsrc/css/application/base/standard-page-view.css' => '517cdfb1',
     'rsrc/css/application/chatlog/chatlog.css' => '852140ff',
     'rsrc/css/application/config/config-options.css' => '7fedf08b',
     'rsrc/css/application/config/config-template.css' => '25d446d6',
     'rsrc/css/application/config/setup-issue.css' => '69e640e7',
     'rsrc/css/application/conpherence/menu.css' => '561348ac',
     'rsrc/css/application/conpherence/message-pane.css' => 'e46b612c',
     'rsrc/css/application/conpherence/notification.css' => '403cf598',
     'rsrc/css/application/conpherence/update.css' => '1099a660',
     'rsrc/css/application/conpherence/widget-pane.css' => 'bf275a6c',
     'rsrc/css/application/contentsource/content-source-view.css' => '4b8b05d4',
     'rsrc/css/application/countdown/timer.css' => '86b7b0a0',
     'rsrc/css/application/dashboard/dashboard.css' => '2b41640b',
     'rsrc/css/application/diff/inline-comment-summary.css' => '8cfd34e8',
     'rsrc/css/application/differential/add-comment.css' => 'c478bcaa',
     'rsrc/css/application/differential/changeset-view.css' => 'c45747f0',
     'rsrc/css/application/differential/core.css' => '7ac3cabc',
     'rsrc/css/application/differential/results-table.css' => '239924f9',
     'rsrc/css/application/differential/revision-comment.css' => '48186045',
     'rsrc/css/application/differential/revision-history.css' => '0e8eb855',
     'rsrc/css/application/differential/revision-list.css' => 'f3c47d33',
     'rsrc/css/application/differential/table-of-contents.css' => '6bf8e1d2',
     'rsrc/css/application/diffusion/commit-view.css' => '92d1e8f9',
     'rsrc/css/application/diffusion/diffusion-icons.css' => '384a0f7d',
     'rsrc/css/application/diffusion/diffusion-source.css' => '66fdf661',
     'rsrc/css/application/directory/phabricator-jump-nav.css' => 'f0c5e726',
     'rsrc/css/application/feed/feed.css' => '0d17c209',
     'rsrc/css/application/files/global-drag-and-drop.css' => '697324ad',
     'rsrc/css/application/flag/flag.css' => '5337623f',
     'rsrc/css/application/harbormaster/harbormaster.css' => 'cec833b7',
     'rsrc/css/application/herald/herald-test.css' => '778b008e',
     'rsrc/css/application/herald/herald.css' => 'c544dd1c',
     'rsrc/css/application/maniphest/batch-editor.css' => '8f380ebc',
     'rsrc/css/application/maniphest/report.css' => '6fc16517',
     'rsrc/css/application/maniphest/task-edit.css' => '8e23031b',
     'rsrc/css/application/maniphest/task-summary.css' => '6df1a768',
     'rsrc/css/application/objectselector/object-selector.css' => '029a133d',
     'rsrc/css/application/owners/owners-path-editor.css' => '2f00933b',
     'rsrc/css/application/paste/paste.css' => 'aa1767d1',
     'rsrc/css/application/people/people-profile.css' => 'ba7b2762',
     'rsrc/css/application/phame/phame.css' => '19ecc703',
     'rsrc/css/application/pholio/pholio-edit.css' => 'b9e59b6d',
     'rsrc/css/application/pholio/pholio-inline-comments.css' => '52be33f0',
     'rsrc/css/application/pholio/pholio.css' => 'e059f955',
     'rsrc/css/application/phortune/phortune-credit-card-form.css' => 'b25b4beb',
     'rsrc/css/application/phrequent/phrequent.css' => 'ffc185ad',
     'rsrc/css/application/phriction/phriction-document-css.css' => '7d7f0071',
     'rsrc/css/application/policy/policy-edit.css' => '05cca26a',
     'rsrc/css/application/policy/policy-transaction-detail.css' => '82100a43',
     'rsrc/css/application/policy/policy.css' => '957ea14c',
     'rsrc/css/application/ponder/comments.css' => '6cdccea7',
     'rsrc/css/application/ponder/feed.css' => 'e62615b6',
     'rsrc/css/application/ponder/post.css' => 'ebab8a70',
     'rsrc/css/application/ponder/vote.css' => '8ed6ed8b',
     'rsrc/css/application/profile/profile-view.css' => '33e6f703',
     'rsrc/css/application/projects/project-tag.css' => '095c9404',
     'rsrc/css/application/releeph/releeph-core.css' => '9b3c5733',
     'rsrc/css/application/releeph/releeph-preview-branch.css' => 'b7a6f4a5',
     'rsrc/css/application/releeph/releeph-request-differential-create-dialog.css' => '8d8b92cd',
     'rsrc/css/application/releeph/releeph-request-typeahead.css' => '667a48ae',
     'rsrc/css/application/search/search-results.css' => 'f240504c',
     'rsrc/css/application/settings/settings.css' => 'ea8f5915',
     'rsrc/css/application/slowvote/slowvote.css' => '266df6a1',
     'rsrc/css/application/subscriptions/subscribers-list.css' => '5bb30c78',
     'rsrc/css/application/tokens/tokens.css' => '3d0f239e',
     'rsrc/css/application/uiexample/example.css' => '528b19de',
     'rsrc/css/core/core.css' => '40151074',
     'rsrc/css/core/remarkup.css' => '80c3a48c',
     'rsrc/css/core/syntax.css' => '3c18c1cb',
     'rsrc/css/core/z-index.css' => 'efb673ac',
     'rsrc/css/diviner/diviner-shared.css' => '38813222',
     'rsrc/css/font/font-awesome.css' => '73d075c3',
     'rsrc/css/font/font-source-sans-pro.css' => '91d53463',
     'rsrc/css/font/phui-font-icon-base.css' => '74cfb6a9',
     'rsrc/css/layout/phabricator-action-header-view.css' => 'c14dfc57',
     'rsrc/css/layout/phabricator-action-list-view.css' => 'dcd9875f',
     'rsrc/css/layout/phabricator-crumbs-view.css' => '6a23399c',
     'rsrc/css/layout/phabricator-filetree-view.css' => 'a8c86ace',
     'rsrc/css/layout/phabricator-hovercard-view.css' => '46a13cf0',
     'rsrc/css/layout/phabricator-side-menu-view.css' => '503699d0',
     'rsrc/css/layout/phabricator-source-code-view.css' => '62a99814',
     'rsrc/css/phui/calendar/phui-calendar-day.css' => 'de035c8a',
     'rsrc/css/phui/calendar/phui-calendar-list.css' => 'c1d0ca59',
     'rsrc/css/phui/calendar/phui-calendar-month.css' => 'a92e47d2',
     'rsrc/css/phui/calendar/phui-calendar.css' => '5e1ad989',
     'rsrc/css/phui/phui-box.css' => '7b3a2eed',
     'rsrc/css/phui/phui-button.css' => '3dbdbf0d',
     'rsrc/css/phui/phui-document.css' => '3b078dc0',
     'rsrc/css/phui/phui-feed-story.css' => '3a59c2cf',
     'rsrc/css/phui/phui-fontkit.css' => 'de84aa4a',
     'rsrc/css/phui/phui-form-view.css' => '867463b4',
     'rsrc/css/phui/phui-form.css' => 'b78ec020',
-    'rsrc/css/phui/phui-header-view.css' => '5d245c9c',
-    'rsrc/css/phui/phui-icon.css' => '00abbd26',
+    'rsrc/css/phui/phui-header-view.css' => '689dbc38',
+    'rsrc/css/phui/phui-icon.css' => 'ef701b9b',
     'rsrc/css/phui/phui-info-panel.css' => '27ea50a1',
     'rsrc/css/phui/phui-list.css' => '65eab261',
     'rsrc/css/phui/phui-object-box.css' => 'ce92d8ec',
     'rsrc/css/phui/phui-object-item-list-view.css' => '64b6b266',
     'rsrc/css/phui/phui-pinboard-view.css' => '874c22f9',
-    'rsrc/css/phui/phui-property-list-view.css' => 'af4b381f',
+    'rsrc/css/phui/phui-property-list-view.css' => 'c7cbe471',
     'rsrc/css/phui/phui-remarkup-preview.css' => '19ad512b',
     'rsrc/css/phui/phui-spacing.css' => '042804d6',
     'rsrc/css/phui/phui-status.css' => '2f562399',
     'rsrc/css/phui/phui-tag-view.css' => '5d09d99e',
     'rsrc/css/phui/phui-text.css' => '23e9b4b7',
     'rsrc/css/phui/phui-timeline-view.css' => '15ff2a9f',
     'rsrc/css/phui/phui-workboard-view.css' => '2bf82d00',
     'rsrc/css/phui/phui-workpanel-view.css' => 'fddd97bf',
     'rsrc/css/sprite-actions.css' => '969ad0e5',
     'rsrc/css/sprite-apps-large.css' => 'd7ef733e',
     'rsrc/css/sprite-apps-xlarge.css' => 'db66c878',
     'rsrc/css/sprite-apps.css' => 'a0f5d4af',
     'rsrc/css/sprite-buttonbar.css' => 'ba1c5738',
     'rsrc/css/sprite-conpherence.css' => '3b4a0487',
     'rsrc/css/sprite-docs.css' => '5f65d0da',
     'rsrc/css/sprite-gradient.css' => 'a10def53',
     'rsrc/css/sprite-login.css' => '8d10fb28',
     'rsrc/css/sprite-main-header.css' => '92720ee2',
     'rsrc/css/sprite-menu.css' => '8da53882',
     'rsrc/css/sprite-minicons.css' => 'df4f76fe',
     'rsrc/css/sprite-payments.css' => 'cc085d44',
     'rsrc/css/sprite-projects.css' => '7578fa56',
     'rsrc/css/sprite-remarkup.css' => '5c396a57',
-    'rsrc/css/sprite-status.css' => '25d7f92f',
     'rsrc/css/sprite-tokens.css' => '1706b943',
     'rsrc/externals/font/fontawesome/fontawesome-webfont.eot' => '1cab0752',
     'rsrc/externals/font/fontawesome/fontawesome-webfont.ttf' => '2ff84fd2',
     'rsrc/externals/font/fontawesome/fontawesome-webfont.woff' => 'a119ee5e',
     'rsrc/externals/font/sourcesans/SourceSansPro.woff' => '3614608c',
     'rsrc/externals/font/sourcesans/SourceSansProBold.woff' => 'cbf46566',
     'rsrc/externals/javelin/core/Event.js' => '69815cac',
     'rsrc/externals/javelin/core/Stratcom.js' => 'c293f7b9',
     'rsrc/externals/javelin/core/__tests__/event-stop-and-kill.js' => '717554e4',
     'rsrc/externals/javelin/core/__tests__/install.js' => 'c432ee85',
     'rsrc/externals/javelin/core/__tests__/stratcom.js' => 'da194d4b',
     'rsrc/externals/javelin/core/__tests__/util.js' => 'd3b157a9',
     'rsrc/externals/javelin/core/init.js' => 'b88ab49e',
     'rsrc/externals/javelin/core/init_node.js' => 'd7dde471',
     'rsrc/externals/javelin/core/install.js' => '52a92793',
     'rsrc/externals/javelin/core/util.js' => '65b0b249',
     'rsrc/externals/javelin/docs/Base.js' => '897bb199',
     'rsrc/externals/javelin/docs/onload.js' => '81fb4862',
     'rsrc/externals/javelin/ext/fx/Color.js' => '7e41274a',
     'rsrc/externals/javelin/ext/fx/FX.js' => '54b612ba',
     'rsrc/externals/javelin/ext/reactor/core/DynVal.js' => 'f6555212',
     'rsrc/externals/javelin/ext/reactor/core/Reactor.js' => '77b1cf6f',
     'rsrc/externals/javelin/ext/reactor/core/ReactorNode.js' => 'b4c30592',
     'rsrc/externals/javelin/ext/reactor/core/ReactorNodeCalmer.js' => '76f4ebed',
     'rsrc/externals/javelin/ext/reactor/dom/RDOM.js' => 'b6d401d6',
     'rsrc/externals/javelin/ext/view/HTMLView.js' => 'e5b406f9',
     'rsrc/externals/javelin/ext/view/View.js' => '0f764c35',
     'rsrc/externals/javelin/ext/view/ViewInterpreter.js' => '0c33c1a0',
     'rsrc/externals/javelin/ext/view/ViewPlaceholder.js' => '2fa810fc',
     'rsrc/externals/javelin/ext/view/ViewRenderer.js' => '6c2b09a2',
     'rsrc/externals/javelin/ext/view/ViewVisitor.js' => 'efe49472',
     'rsrc/externals/javelin/ext/view/__tests__/HTMLView.js' => 'f92d7bcb',
     'rsrc/externals/javelin/ext/view/__tests__/View.js' => 'bda69c40',
     'rsrc/externals/javelin/ext/view/__tests__/ViewInterpreter.js' => '7a94d6a5',
     'rsrc/externals/javelin/ext/view/__tests__/ViewRenderer.js' => '5426001c',
     'rsrc/externals/javelin/lib/Cookie.js' => '6b3dcf44',
     'rsrc/externals/javelin/lib/DOM.js' => '07d99a3d',
     'rsrc/externals/javelin/lib/History.js' => 'c60f4327',
     'rsrc/externals/javelin/lib/JSON.js' => '08e56a4e',
     'rsrc/externals/javelin/lib/Mask.js' => 'b9f26029',
     'rsrc/externals/javelin/lib/Request.js' => '7bad574b',
     'rsrc/externals/javelin/lib/Resource.js' => '356de121',
     'rsrc/externals/javelin/lib/Routable.js' => 'b3e7d692',
     'rsrc/externals/javelin/lib/Router.js' => '29274e2b',
     'rsrc/externals/javelin/lib/URI.js' => 'd9a9b862',
     'rsrc/externals/javelin/lib/Vector.js' => 'bd0aedcd',
     'rsrc/externals/javelin/lib/Workflow.js' => '09b15cf1',
     'rsrc/externals/javelin/lib/__tests__/Cookie.js' => '5ed109e8',
     'rsrc/externals/javelin/lib/__tests__/DOM.js' => 'c984504b',
     'rsrc/externals/javelin/lib/__tests__/JSON.js' => '2295d074',
     'rsrc/externals/javelin/lib/__tests__/URI.js' => '003ed329',
     'rsrc/externals/javelin/lib/__tests__/behavior.js' => '1ea62783',
     'rsrc/externals/javelin/lib/behavior.js' => '8a3ed18b',
     'rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js' => 'e7c21fb3',
     'rsrc/externals/javelin/lib/control/typeahead/Typeahead.js' => 'c54eeefb',
     'rsrc/externals/javelin/lib/control/typeahead/normalizer/TypeaheadNormalizer.js' => '5f850b5c',
     'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js' => '84f34ab1',
     'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadOnDemandSource.js' => 'a79b75a4',
     'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadPreloadedSource.js' => '66815d9c',
     'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadSource.js' => '62e18640',
     'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadStaticSource.js' => 'cdde23f1',
     'rsrc/externals/raphael/g.raphael.js' => '40dde778',
     'rsrc/externals/raphael/g.raphael.line.js' => '40da039e',
     'rsrc/externals/raphael/raphael.js' => '51ee6b43',
     'rsrc/image/BFCFDA.png' => 'd5ec91f4',
     'rsrc/image/actions/edit.png' => '2fc41442',
     'rsrc/image/apple-touch-icon.png' => '8458dda7',
     'rsrc/image/avatar.png' => '3eb28cd9',
     'rsrc/image/checker_dark.png' => 'd8e65881',
     'rsrc/image/checker_light.png' => 'a0155918',
     'rsrc/image/credit_cards.png' => '72b8ede8',
     'rsrc/image/darkload.gif' => '1ffd3ec6',
     'rsrc/image/divot.png' => '94dded62',
     'rsrc/image/grippy_texture.png' => 'aca81e2f',
     'rsrc/image/icon/fatcow/arrow_branch.png' => '2537c01c',
     'rsrc/image/icon/fatcow/arrow_merge.png' => '21b660e0',
     'rsrc/image/icon/fatcow/bullet_black.png' => 'ff190031',
     'rsrc/image/icon/fatcow/bullet_orange.png' => 'e273e5bb',
     'rsrc/image/icon/fatcow/bullet_red.png' => 'c0b75434',
     'rsrc/image/icon/fatcow/calendar_edit.png' => '24632275',
     'rsrc/image/icon/fatcow/document_black.png' => '45fe1c60',
     'rsrc/image/icon/fatcow/flag_blue.png' => 'a01abb1d',
     'rsrc/image/icon/fatcow/flag_finish.png' => '67825cee',
     'rsrc/image/icon/fatcow/flag_ghost.png' => '20ca8783',
     'rsrc/image/icon/fatcow/flag_green.png' => '7e0eaa7a',
     'rsrc/image/icon/fatcow/flag_orange.png' => '9e73df66',
     'rsrc/image/icon/fatcow/flag_pink.png' => '7e92f3b2',
     'rsrc/image/icon/fatcow/flag_purple.png' => 'cc517522',
     'rsrc/image/icon/fatcow/flag_red.png' => '04ec726f',
     'rsrc/image/icon/fatcow/flag_yellow.png' => '73946fd4',
     'rsrc/image/icon/fatcow/folder.png' => '95a435af',
     'rsrc/image/icon/fatcow/folder_go.png' => '001cbc94',
     'rsrc/image/icon/fatcow/key_question.png' => '52a0c26a',
     'rsrc/image/icon/fatcow/link.png' => '7afd4d5e',
     'rsrc/image/icon/fatcow/page_white_edit.png' => '39a2eed8',
     'rsrc/image/icon/fatcow/page_white_link.png' => 'a90023c7',
     'rsrc/image/icon/fatcow/page_white_put.png' => '08c95a0c',
     'rsrc/image/icon/fatcow/page_white_text.png' => '1e1f79c3',
     'rsrc/image/icon/fatcow/source/conduit.png' => '4ea01d2f',
     'rsrc/image/icon/fatcow/source/email.png' => '9bab3239',
     'rsrc/image/icon/fatcow/source/fax.png' => '04195e68',
     'rsrc/image/icon/fatcow/source/mobile.png' => 'f1321264',
     'rsrc/image/icon/fatcow/source/tablet.png' => '49396799',
     'rsrc/image/icon/fatcow/source/web.png' => '136ccb5d',
     'rsrc/image/icon/fatcow/thumbnails/default160x120.png' => 'f2e8a2eb',
     'rsrc/image/icon/fatcow/thumbnails/default60x45.png' => '0118abed',
     'rsrc/image/icon/fatcow/thumbnails/image160x120.png' => '79bb556a',
     'rsrc/image/icon/fatcow/thumbnails/image60x45.png' => 'c5e1685e',
     'rsrc/image/icon/fatcow/thumbnails/pdf160x120.png' => 'ac9edbf5',
     'rsrc/image/icon/fatcow/thumbnails/pdf60x45.png' => 'c0db4143',
     'rsrc/image/icon/fatcow/thumbnails/zip160x120.png' => '75f9cd0f',
     'rsrc/image/icon/fatcow/thumbnails/zip60x45.png' => 'af11bf3e',
     'rsrc/image/icon/lightbox/close-2.png' => 'cc40e7c8',
     'rsrc/image/icon/lightbox/close-hover-2.png' => 'fb5d6d9e',
     'rsrc/image/icon/lightbox/left-arrow-2.png' => '8426133b',
     'rsrc/image/icon/lightbox/left-arrow-hover-2.png' => '701e5ee3',
     'rsrc/image/icon/lightbox/right-arrow-2.png' => '6d5519a0',
     'rsrc/image/icon/lightbox/right-arrow-hover-2.png' => '3a04aa21',
     'rsrc/image/icon/subscribe.png' => 'd03ed5a5',
     'rsrc/image/icon/tango/attachment.png' => 'ecc8022e',
     'rsrc/image/icon/tango/edit.png' => '929a1363',
     'rsrc/image/icon/tango/go-down.png' => '96d95e43',
     'rsrc/image/icon/tango/log.png' => 'b08cc63a',
     'rsrc/image/icon/tango/upload.png' => '7bbb7984',
     'rsrc/image/icon/unsubscribe.png' => '25725013',
     'rsrc/image/lightblue-header.png' => '5c168b6d',
     'rsrc/image/loading.gif' => '75d384cc',
     'rsrc/image/loading/boating_24.gif' => '5c90f086',
     'rsrc/image/loading/compass_24.gif' => 'b36b4f46',
     'rsrc/image/loading/loading_24.gif' => '26bc9adc',
     'rsrc/image/loading/loading_48.gif' => '6a4994c7',
     'rsrc/image/loading/loading_d48.gif' => 'cdcbe900',
     'rsrc/image/loading/loading_w24.gif' => '7662fa2b',
     'rsrc/image/main_texture.png' => '29a2c5ad',
     'rsrc/image/menu_texture.png' => '5a17580d',
     'rsrc/image/people/harding.png' => '45aa614e',
     'rsrc/image/people/jefferson.png' => 'afca0e53',
     'rsrc/image/people/lincoln.png' => '9369126d',
     'rsrc/image/people/mckinley.png' => 'fb8f16ce',
     'rsrc/image/people/taft.png' => 'd7bc402c',
     'rsrc/image/people/washington.png' => '40dd301c',
     'rsrc/image/phrequent_active.png' => 'a466a8ed',
     'rsrc/image/phrequent_inactive.png' => 'bfc15a69',
     'rsrc/image/search-white.png' => '64cc0d45',
     'rsrc/image/search.png' => '82625a7e',
     'rsrc/image/sprite-actions-X2.png' => '7dfd5652',
     'rsrc/image/sprite-actions.png' => '2ddd18c3',
     'rsrc/image/sprite-apps-X2.png' => 'db9e0970',
     'rsrc/image/sprite-apps-large-X2.png' => '0e4fa89b',
     'rsrc/image/sprite-apps-large.png' => 'f31388f8',
     'rsrc/image/sprite-apps-xlarge.png' => 'a751a580',
     'rsrc/image/sprite-apps.png' => 'b46a87ae',
     'rsrc/image/sprite-buttonbar-X2.png' => '2c09a184',
     'rsrc/image/sprite-buttonbar.png' => 'e98e96af',
     'rsrc/image/sprite-conpherence-X2.png' => 'cd2d08d7',
     'rsrc/image/sprite-conpherence.png' => 'a5ab2eb7',
     'rsrc/image/sprite-docs-X2.png' => '6dc1adad',
     'rsrc/image/sprite-docs.png' => '4636297f',
     'rsrc/image/sprite-gradient.png' => '4ece0b62',
     'rsrc/image/sprite-login-X2.png' => 'bf5ceccc',
     'rsrc/image/sprite-login.png' => 'c1e200b3',
     'rsrc/image/sprite-main-header.png' => '83521873',
     'rsrc/image/sprite-menu-X2.png' => '949974c6',
     'rsrc/image/sprite-menu.png' => '307d5da0',
     'rsrc/image/sprite-minicons-X2.png' => '55377e4e',
     'rsrc/image/sprite-minicons.png' => '272644ea',
     'rsrc/image/sprite-payments.png' => 'd8576309',
     'rsrc/image/sprite-projects-X2.png' => '218fdc8b',
     'rsrc/image/sprite-projects.png' => '631ff9a7',
     'rsrc/image/sprite-remarkup-X2.png' => '7ee1dc28',
     'rsrc/image/sprite-remarkup.png' => 'b4421f07',
-    'rsrc/image/sprite-status-X2.png' => '6cb4b401',
-    'rsrc/image/sprite-status.png' => '97eb1562',
     'rsrc/image/sprite-tokens-X2.png' => 'b4776580',
     'rsrc/image/sprite-tokens.png' => '25b75533',
     'rsrc/image/texture/card-gradient.png' => '815f26e8',
     'rsrc/image/texture/dark-menu-hover.png' => '5fa7ece8',
     'rsrc/image/texture/dark-menu.png' => '7e22296e',
     'rsrc/image/texture/grip.png' => '719404f3',
     'rsrc/image/texture/panel-header-gradient.png' => 'e3b8dcfe',
     'rsrc/image/texture/phlnx-bg.png' => '8d819209',
     'rsrc/image/texture/pholio-background.gif' => 'ba29239c',
     'rsrc/image/texture/table_header.png' => '5c433037',
     'rsrc/image/texture/table_header_hover.png' => '038ec3b9',
     'rsrc/image/texture/table_header_tall.png' => 'd56b434f',
     'rsrc/js/application/aphlict/Aphlict.js' => '493665ee',
     'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => '2a2dba85',
     'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => '0a6c2de6',
     'rsrc/js/application/auth/behavior-persona-login.js' => '9414ff18',
     'rsrc/js/application/config/behavior-reorder-fields.js' => '938aed89',
     'rsrc/js/application/conpherence/behavior-menu.js' => '7ee23816',
     'rsrc/js/application/conpherence/behavior-pontificate.js' => '53f6f2dd',
     'rsrc/js/application/conpherence/behavior-widget-pane.js' => '40b1ff90',
     'rsrc/js/application/countdown/timer.js' => '889c96f3',
     'rsrc/js/application/dashboard/behavior-dashboard-async-panel.js' => 'f1375ea5',
     'rsrc/js/application/dashboard/behavior-dashboard-move-panels.js' => 'fa187a68',
     'rsrc/js/application/differential/DifferentialInlineCommentEditor.js' => 'f2441746',
     'rsrc/js/application/differential/behavior-add-reviewers-and-ccs.js' => '533a187b',
     'rsrc/js/application/differential/behavior-comment-jump.js' => '71755c79',
     'rsrc/js/application/differential/behavior-comment-preview.js' => '127f2018',
     'rsrc/js/application/differential/behavior-diff-radios.js' => 'e1ff79b1',
-    'rsrc/js/application/differential/behavior-dropdown-menus.js' => '7f93ef26',
+    'rsrc/js/application/differential/behavior-dropdown-menus.js' => 'dfd45180',
     'rsrc/js/application/differential/behavior-edit-inline-comments.js' => '00861799',
     'rsrc/js/application/differential/behavior-keyboard-nav.js' => '173ce7e7',
     'rsrc/js/application/differential/behavior-populate.js' => 'dfdf9f34',
     'rsrc/js/application/differential/behavior-show-all-comments.js' => '7c273581',
     'rsrc/js/application/differential/behavior-show-field-details.js' => '441f2137',
     'rsrc/js/application/differential/behavior-show-more.js' => 'dd7e8ef5',
     'rsrc/js/application/differential/behavior-toggle-files.js' => 'ca3f91eb',
     'rsrc/js/application/differential/behavior-user-select.js' => 'a8d8459d',
     'rsrc/js/application/diffusion/DiffusionLocateFileSource.js' => '5afdb2f8',
     'rsrc/js/application/diffusion/behavior-audit-preview.js' => 'be81801d',
     'rsrc/js/application/diffusion/behavior-commit-branches.js' => 'bdaf4d04',
     'rsrc/js/application/diffusion/behavior-commit-graph.js' => 'f7f1289f',
     'rsrc/js/application/diffusion/behavior-jump-to.js' => '9db3d160',
     'rsrc/js/application/diffusion/behavior-load-blame.js' => '42126667',
     'rsrc/js/application/diffusion/behavior-locate-file.js' => '6d3e1947',
     'rsrc/js/application/diffusion/behavior-pull-lastmodified.js' => '2b228192',
     'rsrc/js/application/doorkeeper/behavior-doorkeeper-tag.js' => 'e5822781',
     'rsrc/js/application/files/behavior-icon-composer.js' => '8ef9ab58',
     'rsrc/js/application/files/behavior-launch-icon-composer.js' => '48086888',
     'rsrc/js/application/harbormaster/behavior-reorder-steps.js' => '957a7fde',
     'rsrc/js/application/herald/HeraldRuleEditor.js' => '22d2966a',
     'rsrc/js/application/herald/PathTypeahead.js' => 'f7fc67ec',
     'rsrc/js/application/herald/herald-rule-editor.js' => '7ebaeed3',
     'rsrc/js/application/maniphest/behavior-batch-editor.js' => 'fe80fb6d',
     'rsrc/js/application/maniphest/behavior-batch-selector.js' => 'ead554ec',
     'rsrc/js/application/maniphest/behavior-line-chart.js' => '64ef2fd2',
     'rsrc/js/application/maniphest/behavior-list-edit.js' => 'cf76cfd5',
     'rsrc/js/application/maniphest/behavior-subpriorityeditor.js' => '84845b5b',
     'rsrc/js/application/maniphest/behavior-transaction-controls.js' => 'dddd43ac',
     'rsrc/js/application/maniphest/behavior-transaction-expand.js' => '2f2e18aa',
     'rsrc/js/application/maniphest/behavior-transaction-preview.js' => 'f8248bc5',
     'rsrc/js/application/owners/OwnersPathEditor.js' => '46efd18e',
     'rsrc/js/application/owners/owners-path-editor.js' => '7a68dda3',
     'rsrc/js/application/passphrase/phame-credential-control.js' => '1e1c8a59',
     'rsrc/js/application/phame/phame-post-preview.js' => '61d927ec',
     'rsrc/js/application/pholio/behavior-pholio-mock-edit.js' => '1e1e8bb0',
     'rsrc/js/application/pholio/behavior-pholio-mock-view.js' => '28497740',
     'rsrc/js/application/phortune/behavior-balanced-payment-form.js' => '3b3e1664',
     'rsrc/js/application/phortune/behavior-stripe-payment-form.js' => '1693a296',
     'rsrc/js/application/phortune/behavior-test-payment-form.js' => 'b3e5ee60',
     'rsrc/js/application/phortune/phortune-credit-card-form.js' => '2290aeef',
-    'rsrc/js/application/policy/behavior-policy-control.js' => 'bc99b0f2',
+    'rsrc/js/application/policy/behavior-policy-control.js' => '71b4cbcc',
     'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '263aeb8c',
     'rsrc/js/application/ponder/behavior-votebox.js' => '327dbe61',
     'rsrc/js/application/projects/behavior-project-boards.js' => 'd8e135db',
     'rsrc/js/application/projects/behavior-project-create.js' => '065227cc',
     'rsrc/js/application/releeph/releeph-preview-branch.js' => '9eb2cedb',
     'rsrc/js/application/releeph/releeph-request-state-change.js' => 'd259e7c9',
     'rsrc/js/application/releeph/releeph-request-typeahead.js' => 'cd9e7094',
     'rsrc/js/application/repository/repository-crossreference.js' => '8ab282be',
     'rsrc/js/application/search/behavior-reorder-queries.js' => '37871df4',
     'rsrc/js/application/slowvote/behavior-slowvote-embed.js' => 'a51fdb2e',
     'rsrc/js/application/transactions/behavior-transaction-comment-form.js' => '9084a36f',
     'rsrc/js/application/transactions/behavior-transaction-list.js' => 'cf656c84',
     'rsrc/js/application/uiexample/JavelinViewExample.js' => 'd4a14807',
     'rsrc/js/application/uiexample/ReactorButtonExample.js' => '44524435',
     'rsrc/js/application/uiexample/ReactorCheckboxExample.js' => '7ba325ee',
     'rsrc/js/application/uiexample/ReactorFocusExample.js' => '82f568cd',
     'rsrc/js/application/uiexample/ReactorInputExample.js' => 'd6ca6b1c',
     'rsrc/js/application/uiexample/ReactorMouseoverExample.js' => '4e37e4de',
     'rsrc/js/application/uiexample/ReactorRadioExample.js' => '858f9728',
     'rsrc/js/application/uiexample/ReactorSelectExample.js' => '189e4fe3',
     'rsrc/js/application/uiexample/ReactorSendClassExample.js' => 'bf97561d',
     'rsrc/js/application/uiexample/ReactorSendPropertiesExample.js' => '551add57',
     'rsrc/js/application/uiexample/busy-example.js' => 'fbbce3bf',
     'rsrc/js/application/uiexample/gesture-example.js' => 'f42bb8c6',
     'rsrc/js/application/uiexample/notification-example.js' => 'c51a6616',
     'rsrc/js/core/Busy.js' => '6453c869',
     'rsrc/js/core/DragAndDropFileUpload.js' => 'ae6abfba',
     'rsrc/js/core/DraggableList.js' => '1681c4d4',
     'rsrc/js/core/FileUpload.js' => 'a4ae61bf',
     'rsrc/js/core/Hovercard.js' => '4f344388',
     'rsrc/js/core/KeyboardShortcut.js' => '1ae869f2',
     'rsrc/js/core/KeyboardShortcutManager.js' => 'ad7a69ca',
     'rsrc/js/core/MultirowRowManager.js' => '50395a1b',
     'rsrc/js/core/Notification.js' => '0c6946e7',
-    'rsrc/js/core/Prefab.js' => '0326e5d0',
+    'rsrc/js/core/Prefab.js' => '41ed7994',
     'rsrc/js/core/ShapedRequest.js' => '7cbe244b',
     'rsrc/js/core/TextAreaUtils.js' => 'b3ec3cfc',
     'rsrc/js/core/ToolTip.js' => '3915d490',
     'rsrc/js/core/behavior-active-nav.js' => 'c81bc98f',
     'rsrc/js/core/behavior-audio-source.js' => '59b251eb',
     'rsrc/js/core/behavior-autofocus.js' => '7319e029',
     'rsrc/js/core/behavior-crop.js' => 'b98fc918',
     'rsrc/js/core/behavior-dark-console.js' => 'e9fdb5e5',
     'rsrc/js/core/behavior-device.js' => '03d6ed07',
     'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '4a11ea9c',
     'rsrc/js/core/behavior-error-log.js' => 'a5d7cf86',
     'rsrc/js/core/behavior-fancy-datepicker.js' => '5d584426',
     'rsrc/js/core/behavior-file-tree.js' => 'c8728c70',
     'rsrc/js/core/behavior-form.js' => 'a9aaba0c',
     'rsrc/js/core/behavior-gesture.js' => 'fe2e0ba4',
     'rsrc/js/core/behavior-global-drag-and-drop.js' => '8fd76bab',
     'rsrc/js/core/behavior-high-security-warning.js' => '8fc1c918',
     'rsrc/js/core/behavior-history-install.js' => '7ee2b591',
     'rsrc/js/core/behavior-hovercard.js' => '9c808199',
     'rsrc/js/core/behavior-keyboard-pager.js' => 'b657bdf8',
     'rsrc/js/core/behavior-keyboard-shortcuts.js' => 'd75709e6',
     'rsrc/js/core/behavior-konami.js' => '5bc2cb21',
     'rsrc/js/core/behavior-lightbox-attachments.js' => '3aa45ad9',
     'rsrc/js/core/behavior-line-linker.js' => 'bc778103',
     'rsrc/js/core/behavior-more.js' => '9b9197be',
     'rsrc/js/core/behavior-object-selector.js' => 'e6f67523',
     'rsrc/js/core/behavior-oncopy.js' => 'c3e218fe',
     'rsrc/js/core/behavior-phabricator-nav.js' => 'b5842a5e',
     'rsrc/js/core/behavior-phabricator-remarkup-assist.js' => 'c021950a',
     'rsrc/js/core/behavior-refresh-csrf.js' => '7814b593',
     'rsrc/js/core/behavior-remarkup-preview.js' => 'f7379f45',
     'rsrc/js/core/behavior-reveal-content.js' => '8f24abfc',
     'rsrc/js/core/behavior-search-typeahead.js' => 'd8469741',
     'rsrc/js/core/behavior-select-on-click.js' => '0e34ca02',
     'rsrc/js/core/behavior-toggle-class.js' => 'a82a7769',
     'rsrc/js/core/behavior-tokenizer.js' => 'b3a4b884',
     'rsrc/js/core/behavior-tooltip.js' => '48db4145',
     'rsrc/js/core/behavior-watch-anchor.js' => '06e05112',
     'rsrc/js/core/behavior-workflow.js' => '0a3f3021',
     'rsrc/js/core/phtize.js' => 'd254d646',
     'rsrc/js/phui/behavior-phui-object-box-tabs.js' => 'a3e2244e',
     'rsrc/js/phui/behavior-phui-timeline-dropdown-menu.js' => '4d94d9c3',
     'rsrc/js/phuix/PHUIXActionListView.js' => 'b5c256b8',
-    'rsrc/js/phuix/PHUIXActionView.js' => '19a0b148',
+    'rsrc/js/phuix/PHUIXActionView.js' => '6e8cefa4',
     'rsrc/js/phuix/PHUIXDropdownMenu.js' => 'bd4c8dca',
     'rsrc/swf/aphlict.swf' => 'abac967d',
   ),
   'symbols' =>
   array(
     'aphront-bars' => '231ac33c',
     'aphront-contextbar-view-css' => '1c3b0529',
     'aphront-dark-console-css' => '6378ef3d',
     'aphront-dialog-view-css' => 'c01d24b4',
     'aphront-error-view-css' => '9f1d5518',
     'aphront-list-filter-view-css' => '2ae43867',
     'aphront-multi-column-view-css' => '1b95ab2e',
     'aphront-pager-view-css' => '2e3539af',
     'aphront-panel-view-css' => '5846dfa2',
     'aphront-request-failure-view-css' => 'da14df31',
     'aphront-table-view-css' => '88e80148',
     'aphront-tokenizer-control-css' => '36903077',
     'aphront-tooltip-css' => '9c90229d',
     'aphront-two-column-view-css' => '16ab3ad2',
-    'aphront-typeahead-control-css' => '466ac215',
+    'aphront-typeahead-control-css' => '1f4c9e23',
     'auth-css' => '1e655982',
     'config-options-css' => '7fedf08b',
     'conpherence-menu-css' => '561348ac',
     'conpherence-message-pane-css' => 'e46b612c',
     'conpherence-notification-css' => '403cf598',
     'conpherence-update-css' => '1099a660',
     'conpherence-widget-pane-css' => 'bf275a6c',
     'differential-changeset-view-css' => 'c45747f0',
     'differential-core-view-css' => '7ac3cabc',
     'differential-inline-comment-editor' => 'f2441746',
     'differential-results-table-css' => '239924f9',
     'differential-revision-add-comment-css' => 'c478bcaa',
     'differential-revision-comment-css' => '48186045',
     'differential-revision-history-css' => '0e8eb855',
     'differential-revision-list-css' => 'f3c47d33',
     'differential-table-of-contents-css' => '6bf8e1d2',
     'diffusion-commit-view-css' => '92d1e8f9',
     'diffusion-icons-css' => '384a0f7d',
     'diffusion-source-css' => '66fdf661',
     'diviner-shared-css' => '38813222',
     'font-fontawesome' => '73d075c3',
     'font-source-sans-pro' => '91d53463',
     'global-drag-and-drop-css' => '697324ad',
     'harbormaster-css' => 'cec833b7',
     'herald-css' => 'c544dd1c',
     'herald-rule-editor' => '22d2966a',
     'herald-test-css' => '778b008e',
     'inline-comment-summary-css' => '8cfd34e8',
     'javelin-aphlict' => '493665ee',
     'javelin-behavior' => '8a3ed18b',
     'javelin-behavior-aphlict-dropdown' => '2a2dba85',
     'javelin-behavior-aphlict-listen' => '0a6c2de6',
     'javelin-behavior-aphront-basic-tokenizer' => 'b3a4b884',
     'javelin-behavior-aphront-crop' => 'b98fc918',
     'javelin-behavior-aphront-drag-and-drop-textarea' => '4a11ea9c',
     'javelin-behavior-aphront-form-disable-on-submit' => 'a9aaba0c',
     'javelin-behavior-aphront-more' => '9b9197be',
     'javelin-behavior-audio-source' => '59b251eb',
     'javelin-behavior-audit-preview' => 'be81801d',
     'javelin-behavior-balanced-payment-form' => '3b3e1664',
     'javelin-behavior-config-reorder-fields' => '938aed89',
     'javelin-behavior-conpherence-menu' => '7ee23816',
     'javelin-behavior-conpherence-pontificate' => '53f6f2dd',
     'javelin-behavior-conpherence-widget-pane' => '40b1ff90',
     'javelin-behavior-countdown-timer' => '889c96f3',
     'javelin-behavior-dark-console' => 'e9fdb5e5',
     'javelin-behavior-dashboard-async-panel' => 'f1375ea5',
     'javelin-behavior-dashboard-move-panels' => 'fa187a68',
     'javelin-behavior-device' => '03d6ed07',
     'javelin-behavior-differential-add-reviewers-and-ccs' => '533a187b',
     'javelin-behavior-differential-comment-jump' => '71755c79',
     'javelin-behavior-differential-diff-radios' => 'e1ff79b1',
-    'javelin-behavior-differential-dropdown-menus' => '7f93ef26',
+    'javelin-behavior-differential-dropdown-menus' => 'dfd45180',
     'javelin-behavior-differential-edit-inline-comments' => '00861799',
     'javelin-behavior-differential-feedback-preview' => '127f2018',
     'javelin-behavior-differential-keyboard-navigation' => '173ce7e7',
     'javelin-behavior-differential-populate' => 'dfdf9f34',
     'javelin-behavior-differential-show-field-details' => '441f2137',
     'javelin-behavior-differential-show-more' => 'dd7e8ef5',
     'javelin-behavior-differential-toggle-files' => 'ca3f91eb',
     'javelin-behavior-differential-user-select' => 'a8d8459d',
     'javelin-behavior-diffusion-commit-branches' => 'bdaf4d04',
     'javelin-behavior-diffusion-commit-graph' => 'f7f1289f',
     'javelin-behavior-diffusion-jump-to' => '9db3d160',
     'javelin-behavior-diffusion-locate-file' => '6d3e1947',
     'javelin-behavior-diffusion-pull-lastmodified' => '2b228192',
     'javelin-behavior-doorkeeper-tag' => 'e5822781',
     'javelin-behavior-error-log' => 'a5d7cf86',
     'javelin-behavior-fancy-datepicker' => '5d584426',
     'javelin-behavior-global-drag-and-drop' => '8fd76bab',
     'javelin-behavior-harbormaster-reorder-steps' => '957a7fde',
     'javelin-behavior-herald-rule-editor' => '7ebaeed3',
     'javelin-behavior-high-security-warning' => '8fc1c918',
     'javelin-behavior-history-install' => '7ee2b591',
     'javelin-behavior-icon-composer' => '8ef9ab58',
     'javelin-behavior-konami' => '5bc2cb21',
     'javelin-behavior-launch-icon-composer' => '48086888',
     'javelin-behavior-lightbox-attachments' => '3aa45ad9',
     'javelin-behavior-line-chart' => '64ef2fd2',
     'javelin-behavior-load-blame' => '42126667',
     'javelin-behavior-maniphest-batch-editor' => 'fe80fb6d',
     'javelin-behavior-maniphest-batch-selector' => 'ead554ec',
     'javelin-behavior-maniphest-list-editor' => 'cf76cfd5',
     'javelin-behavior-maniphest-subpriority-editor' => '84845b5b',
     'javelin-behavior-maniphest-transaction-controls' => 'dddd43ac',
     'javelin-behavior-maniphest-transaction-expand' => '2f2e18aa',
     'javelin-behavior-maniphest-transaction-preview' => 'f8248bc5',
     'javelin-behavior-owners-path-editor' => '7a68dda3',
     'javelin-behavior-passphrase-credential-control' => '1e1c8a59',
     'javelin-behavior-persona-login' => '9414ff18',
     'javelin-behavior-phabricator-active-nav' => 'c81bc98f',
     'javelin-behavior-phabricator-autofocus' => '7319e029',
     'javelin-behavior-phabricator-busy-example' => 'fbbce3bf',
     'javelin-behavior-phabricator-file-tree' => 'c8728c70',
     'javelin-behavior-phabricator-gesture' => 'fe2e0ba4',
     'javelin-behavior-phabricator-gesture-example' => 'f42bb8c6',
     'javelin-behavior-phabricator-hovercards' => '9c808199',
     'javelin-behavior-phabricator-keyboard-pager' => 'b657bdf8',
     'javelin-behavior-phabricator-keyboard-shortcuts' => 'd75709e6',
     'javelin-behavior-phabricator-line-linker' => 'bc778103',
     'javelin-behavior-phabricator-nav' => 'b5842a5e',
     'javelin-behavior-phabricator-notification-example' => 'c51a6616',
     'javelin-behavior-phabricator-object-selector' => 'e6f67523',
     'javelin-behavior-phabricator-oncopy' => 'c3e218fe',
     'javelin-behavior-phabricator-remarkup-assist' => 'c021950a',
     'javelin-behavior-phabricator-reveal-content' => '8f24abfc',
     'javelin-behavior-phabricator-search-typeahead' => 'd8469741',
     'javelin-behavior-phabricator-show-all-transactions' => '7c273581',
     'javelin-behavior-phabricator-tooltips' => '48db4145',
     'javelin-behavior-phabricator-transaction-comment-form' => '9084a36f',
     'javelin-behavior-phabricator-transaction-list' => 'cf656c84',
     'javelin-behavior-phabricator-watch-anchor' => '06e05112',
     'javelin-behavior-phame-post-preview' => '61d927ec',
     'javelin-behavior-pholio-mock-edit' => '1e1e8bb0',
     'javelin-behavior-pholio-mock-view' => '28497740',
     'javelin-behavior-phui-object-box-tabs' => 'a3e2244e',
     'javelin-behavior-phui-timeline-dropdown-menu' => '4d94d9c3',
-    'javelin-behavior-policy-control' => 'bc99b0f2',
+    'javelin-behavior-policy-control' => '71b4cbcc',
     'javelin-behavior-policy-rule-editor' => '263aeb8c',
     'javelin-behavior-ponder-votebox' => '327dbe61',
     'javelin-behavior-project-boards' => 'd8e135db',
     'javelin-behavior-project-create' => '065227cc',
     'javelin-behavior-refresh-csrf' => '7814b593',
     'javelin-behavior-releeph-preview-branch' => '9eb2cedb',
     'javelin-behavior-releeph-request-state-change' => 'd259e7c9',
     'javelin-behavior-releeph-request-typeahead' => 'cd9e7094',
     'javelin-behavior-remarkup-preview' => 'f7379f45',
     'javelin-behavior-repository-crossreference' => '8ab282be',
     'javelin-behavior-search-reorder-queries' => '37871df4',
     'javelin-behavior-select-on-click' => '0e34ca02',
     'javelin-behavior-slowvote-embed' => 'a51fdb2e',
     'javelin-behavior-stripe-payment-form' => '1693a296',
     'javelin-behavior-test-payment-form' => 'b3e5ee60',
     'javelin-behavior-toggle-class' => 'a82a7769',
     'javelin-behavior-view-placeholder' => '2fa810fc',
     'javelin-behavior-workflow' => '0a3f3021',
     'javelin-color' => '7e41274a',
     'javelin-cookie' => '6b3dcf44',
     'javelin-diffusion-locate-file-source' => '5afdb2f8',
     'javelin-dom' => '07d99a3d',
     'javelin-dynval' => 'f6555212',
     'javelin-event' => '69815cac',
     'javelin-fx' => '54b612ba',
     'javelin-history' => 'c60f4327',
     'javelin-install' => '52a92793',
     'javelin-json' => '08e56a4e',
     'javelin-magical-init' => 'b88ab49e',
     'javelin-mask' => 'b9f26029',
     'javelin-reactor' => '77b1cf6f',
     'javelin-reactor-dom' => 'b6d401d6',
     'javelin-reactor-node-calmer' => '76f4ebed',
     'javelin-reactornode' => 'b4c30592',
     'javelin-request' => '7bad574b',
     'javelin-resource' => '356de121',
     'javelin-routable' => 'b3e7d692',
     'javelin-router' => '29274e2b',
     'javelin-stratcom' => 'c293f7b9',
     'javelin-tokenizer' => 'e7c21fb3',
     'javelin-typeahead' => 'c54eeefb',
     'javelin-typeahead-composite-source' => '84f34ab1',
     'javelin-typeahead-normalizer' => '5f850b5c',
     'javelin-typeahead-ondemand-source' => 'a79b75a4',
     'javelin-typeahead-preloaded-source' => '66815d9c',
     'javelin-typeahead-source' => '62e18640',
     'javelin-typeahead-static-source' => 'cdde23f1',
     'javelin-uri' => 'd9a9b862',
     'javelin-util' => '65b0b249',
     'javelin-vector' => 'bd0aedcd',
     'javelin-view' => '0f764c35',
     'javelin-view-html' => 'e5b406f9',
     'javelin-view-interpreter' => '0c33c1a0',
     'javelin-view-renderer' => '6c2b09a2',
     'javelin-view-visitor' => 'efe49472',
     'javelin-workflow' => '09b15cf1',
     'lightbox-attachment-css' => '7acac05d',
     'maniphest-batch-editor' => '8f380ebc',
     'maniphest-report-css' => '6fc16517',
     'maniphest-task-edit-css' => '8e23031b',
     'maniphest-task-summary-css' => '6df1a768',
     'multirow-row-manager' => '50395a1b',
     'owners-path-editor' => '46efd18e',
     'owners-path-editor-css' => '2f00933b',
     'paste-css' => 'aa1767d1',
     'path-typeahead' => 'f7fc67ec',
     'people-profile-css' => 'ba7b2762',
     'phabricator-action-header-view-css' => 'c14dfc57',
     'phabricator-action-list-view-css' => 'dcd9875f',
     'phabricator-application-launch-view-css' => 'd290ba21',
     'phabricator-busy' => '6453c869',
     'phabricator-chatlog-css' => '852140ff',
     'phabricator-content-source-view-css' => '4b8b05d4',
     'phabricator-core-css' => '40151074',
     'phabricator-countdown-css' => '86b7b0a0',
     'phabricator-crumbs-view-css' => '6a23399c',
     'phabricator-dashboard-css' => '2b41640b',
     'phabricator-drag-and-drop-file-upload' => 'ae6abfba',
     'phabricator-draggable-list' => '1681c4d4',
     'phabricator-fatal-config-template-css' => '25d446d6',
     'phabricator-feed-css' => '0d17c209',
     'phabricator-file-upload' => 'a4ae61bf',
     'phabricator-filetree-view-css' => 'a8c86ace',
     'phabricator-flag-css' => '5337623f',
     'phabricator-hovercard' => '4f344388',
     'phabricator-hovercard-view-css' => '46a13cf0',
     'phabricator-jump-nav' => 'f0c5e726',
     'phabricator-keyboard-shortcut' => '1ae869f2',
     'phabricator-keyboard-shortcut-manager' => 'ad7a69ca',
     'phabricator-main-menu-view' => '0207239c',
     'phabricator-nav-view-css' => '80e60fc1',
     'phabricator-notification' => '0c6946e7',
     'phabricator-notification-css' => 'ef2c9b34',
     'phabricator-notification-menu-css' => '99ffef72',
     'phabricator-object-selector-css' => '029a133d',
     'phabricator-phtize' => 'd254d646',
-    'phabricator-prefab' => '0326e5d0',
+    'phabricator-prefab' => '41ed7994',
     'phabricator-profile-css' => '33e6f703',
     'phabricator-project-tag-css' => '095c9404',
     'phabricator-remarkup-css' => '80c3a48c',
     'phabricator-search-results-css' => 'f240504c',
     'phabricator-settings-css' => 'ea8f5915',
     'phabricator-shaped-request' => '7cbe244b',
     'phabricator-side-menu-view-css' => '503699d0',
     'phabricator-slowvote-css' => '266df6a1',
     'phabricator-source-code-view-css' => '62a99814',
     'phabricator-standard-page-view' => '517cdfb1',
     'phabricator-textareautils' => 'b3ec3cfc',
     'phabricator-tooltip' => '3915d490',
     'phabricator-transaction-view-css' => 'ce491938',
     'phabricator-ui-example-css' => '528b19de',
     'phabricator-uiexample-javelin-view' => 'd4a14807',
     'phabricator-uiexample-reactor-button' => '44524435',
     'phabricator-uiexample-reactor-checkbox' => '7ba325ee',
     'phabricator-uiexample-reactor-focus' => '82f568cd',
     'phabricator-uiexample-reactor-input' => 'd6ca6b1c',
     'phabricator-uiexample-reactor-mouseover' => '4e37e4de',
     'phabricator-uiexample-reactor-radio' => '858f9728',
     'phabricator-uiexample-reactor-select' => '189e4fe3',
     'phabricator-uiexample-reactor-sendclass' => 'bf97561d',
     'phabricator-uiexample-reactor-sendproperties' => '551add57',
     'phabricator-zindex-css' => 'efb673ac',
     'phame-css' => '19ecc703',
     'pholio-css' => 'e059f955',
     'pholio-edit-css' => 'b9e59b6d',
     'pholio-inline-comments-css' => '52be33f0',
     'phortune-credit-card-form' => '2290aeef',
     'phortune-credit-card-form-css' => 'b25b4beb',
     'phrequent-css' => 'ffc185ad',
     'phriction-document-css' => '7d7f0071',
     'phui-box-css' => '7b3a2eed',
     'phui-button-css' => '3dbdbf0d',
     'phui-calendar-css' => '5e1ad989',
     'phui-calendar-day-css' => 'de035c8a',
     'phui-calendar-list-css' => 'c1d0ca59',
     'phui-calendar-month-css' => 'a92e47d2',
     'phui-document-view-css' => '3b078dc0',
     'phui-feed-story-css' => '3a59c2cf',
     'phui-font-icon-base-css' => '74cfb6a9',
     'phui-fontkit-css' => 'de84aa4a',
     'phui-form-css' => 'b78ec020',
     'phui-form-view-css' => '867463b4',
-    'phui-header-view-css' => '5d245c9c',
-    'phui-icon-view-css' => '00abbd26',
+    'phui-header-view-css' => '689dbc38',
+    'phui-icon-view-css' => 'ef701b9b',
     'phui-info-panel-css' => '27ea50a1',
     'phui-list-view-css' => '65eab261',
     'phui-object-box-css' => 'ce92d8ec',
     'phui-object-item-list-view-css' => '64b6b266',
     'phui-pinboard-view-css' => '874c22f9',
-    'phui-property-list-view-css' => 'af4b381f',
+    'phui-property-list-view-css' => 'c7cbe471',
     'phui-remarkup-preview-css' => '19ad512b',
     'phui-spacing-css' => '042804d6',
     'phui-status-list-view-css' => '2f562399',
     'phui-tag-view-css' => '5d09d99e',
     'phui-text-css' => '23e9b4b7',
     'phui-timeline-view-css' => '15ff2a9f',
     'phui-workboard-view-css' => '2bf82d00',
     'phui-workpanel-view-css' => 'fddd97bf',
     'phuix-action-list-view' => 'b5c256b8',
-    'phuix-action-view' => '19a0b148',
+    'phuix-action-view' => '6e8cefa4',
     'phuix-dropdown-menu' => 'bd4c8dca',
     'policy-css' => '957ea14c',
     'policy-edit-css' => '05cca26a',
     'policy-transaction-detail-css' => '82100a43',
     'ponder-comment-table-css' => '6cdccea7',
     'ponder-feed-view-css' => 'e62615b6',
     'ponder-post-css' => 'ebab8a70',
     'ponder-vote-css' => '8ed6ed8b',
     'raphael-core' => '51ee6b43',
     'raphael-g' => '40dde778',
     'raphael-g-line' => '40da039e',
     'releeph-core' => '9b3c5733',
     'releeph-preview-branch' => 'b7a6f4a5',
     'releeph-request-differential-create-dialog' => '8d8b92cd',
     'releeph-request-typeahead-css' => '667a48ae',
     'setup-issue-css' => '69e640e7',
     'sprite-actions-css' => '969ad0e5',
     'sprite-apps-css' => 'a0f5d4af',
     'sprite-apps-large-css' => 'd7ef733e',
     'sprite-apps-xlarge-css' => 'db66c878',
     'sprite-buttonbar-css' => 'ba1c5738',
     'sprite-conpherence-css' => '3b4a0487',
     'sprite-docs-css' => '5f65d0da',
     'sprite-gradient-css' => 'a10def53',
     'sprite-login-css' => '8d10fb28',
     'sprite-main-header-css' => '92720ee2',
     'sprite-menu-css' => '8da53882',
     'sprite-minicons-css' => 'df4f76fe',
     'sprite-payments-css' => 'cc085d44',
     'sprite-projects-css' => '7578fa56',
     'sprite-remarkup-css' => '5c396a57',
-    'sprite-status-css' => '25d7f92f',
     'sprite-tokens-css' => '1706b943',
     'subscribers-list-css' => '5bb30c78',
     'syntax-highlighting-css' => '3c18c1cb',
     'tokens-css' => '3d0f239e',
   ),
   'requires' =>
   array(
     '00861799' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-util',
       4 => 'javelin-vector',
       5 => 'differential-inline-comment-editor',
     ),
     '029a133d' =>
     array(
       0 => 'aphront-dialog-view-css',
     ),
-    '0326e5d0' =>
-    array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
-      2 => 'javelin-dom',
-      3 => 'javelin-typeahead',
-      4 => 'javelin-tokenizer',
-      5 => 'javelin-typeahead-preloaded-source',
-      6 => 'javelin-typeahead-ondemand-source',
-      7 => 'javelin-dom',
-      8 => 'javelin-stratcom',
-      9 => 'javelin-util',
-    ),
     '03d6ed07' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-vector',
       4 => 'javelin-install',
     ),
     '065227cc' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'javelin-workflow',
     ),
     '06e05112' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-vector',
     ),
     '07d99a3d' =>
     array(
       0 => 'javelin-magical-init',
       1 => 'javelin-install',
       2 => 'javelin-util',
       3 => 'javelin-vector',
       4 => 'javelin-stratcom',
     ),
     '08e56a4e' =>
     array(
       0 => 'javelin-install',
     ),
     '09b15cf1' =>
     array(
       0 => 'javelin-stratcom',
       1 => 'javelin-request',
       2 => 'javelin-dom',
       3 => 'javelin-vector',
       4 => 'javelin-install',
       5 => 'javelin-util',
       6 => 'javelin-mask',
       7 => 'javelin-uri',
       8 => 'javelin-routable',
     ),
     '0a3f3021' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-workflow',
       3 => 'javelin-dom',
       4 => 'javelin-router',
     ),
     '0a6c2de6' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-aphlict',
       2 => 'javelin-stratcom',
       3 => 'javelin-request',
       4 => 'javelin-uri',
       5 => 'javelin-dom',
       6 => 'javelin-json',
       7 => 'javelin-router',
       8 => 'phabricator-notification',
     ),
     '0c33c1a0' =>
     array(
       0 => 'javelin-view',
       1 => 'javelin-install',
       2 => 'javelin-dom',
     ),
     '0c6946e7' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'javelin-util',
       4 => 'phabricator-notification-css',
     ),
     '0e34ca02' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     '0f764c35' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
     ),
     '127f2018' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-request',
       4 => 'javelin-util',
       5 => 'phabricator-shaped-request',
     ),
     '1681c4d4' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'javelin-util',
       4 => 'javelin-vector',
       5 => 'javelin-magical-init',
     ),
     '1693a296' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'phortune-credit-card-form',
     ),
     '173ce7e7' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'phabricator-keyboard-shortcut',
     ),
     '189e4fe3' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-reactor-dom',
     ),
-    '19a0b148' =>
-    array(
-      0 => 'javelin-install',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-    ),
     '1ae869f2' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'phabricator-keyboard-shortcut-manager',
     ),
     '1e1c8a59' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'javelin-workflow',
       4 => 'javelin-util',
       5 => 'javelin-uri',
     ),
     '1e1e8bb0' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-workflow',
       4 => 'phabricator-phtize',
       5 => 'phabricator-drag-and-drop-file-upload',
       6 => 'phabricator-draggable-list',
     ),
     '2290aeef' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-json',
       3 => 'javelin-workflow',
       4 => 'javelin-util',
     ),
     '22d2966a' =>
     array(
       0 => 'multirow-row-manager',
       1 => 'javelin-install',
       2 => 'javelin-util',
       3 => 'javelin-dom',
       4 => 'javelin-stratcom',
       5 => 'javelin-json',
       6 => 'phabricator-prefab',
     ),
     '263aeb8c' =>
     array(
       0 => 'javelin-behavior',
       1 => 'multirow-row-manager',
       2 => 'javelin-dom',
       3 => 'javelin-util',
       4 => 'phabricator-prefab',
       5 => 'javelin-tokenizer',
       6 => 'javelin-typeahead',
       7 => 'javelin-typeahead-preloaded-source',
       8 => 'javelin-json',
     ),
     '29274e2b' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
     ),
     '2a2dba85' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-request',
       2 => 'javelin-stratcom',
       3 => 'javelin-vector',
       4 => 'javelin-dom',
       5 => 'javelin-uri',
       6 => 'javelin-behavior-device',
     ),
     '2b228192' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-workflow',
       4 => 'javelin-json',
     ),
     '2f2e18aa' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-workflow',
       3 => 'javelin-stratcom',
     ),
     '2fa810fc' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-view-renderer',
       3 => 'javelin-install',
     ),
     '327dbe61' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-stratcom',
       4 => 'javelin-request',
     ),
     '356de121' =>
     array(
       0 => 'javelin-util',
       1 => 'javelin-uri',
       2 => 'javelin-install',
     ),
     '37871df4' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-workflow',
       3 => 'javelin-dom',
       4 => 'phabricator-draggable-list',
     ),
     '3915d490' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-dom',
       3 => 'javelin-vector',
     ),
     '3aa45ad9' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-mask',
       4 => 'javelin-util',
       5 => 'phabricator-busy',
     ),
     '3b3e1664' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'phortune-credit-card-form',
     ),
     '40b1ff90' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'javelin-workflow',
       4 => 'javelin-util',
       5 => 'phabricator-notification',
       6 => 'javelin-behavior-device',
       7 => 'phuix-dropdown-menu',
       8 => 'phuix-action-list-view',
       9 => 'phuix-action-view',
     ),
+    '41ed7994' =>
+    array(
+      0 => 'javelin-install',
+      1 => 'javelin-util',
+      2 => 'javelin-dom',
+      3 => 'javelin-typeahead',
+      4 => 'javelin-tokenizer',
+      5 => 'javelin-typeahead-preloaded-source',
+      6 => 'javelin-typeahead-ondemand-source',
+      7 => 'javelin-dom',
+      8 => 'javelin-stratcom',
+      9 => 'javelin-util',
+    ),
     '441f2137' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     '46efd18e' =>
     array(
       0 => 'multirow-row-manager',
       1 => 'javelin-install',
       2 => 'path-typeahead',
       3 => 'javelin-dom',
       4 => 'javelin-util',
       5 => 'phabricator-prefab',
     ),
     '48db4145' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-behavior-device',
       2 => 'javelin-stratcom',
       3 => 'phabricator-tooltip',
     ),
     '493665ee' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
     ),
     '4a11ea9c' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'phabricator-drag-and-drop-file-upload',
       3 => 'phabricator-textareautils',
     ),
     '4d94d9c3' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'phuix-dropdown-menu',
     ),
     '4e37e4de' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-reactor-dom',
     ),
     '4f344388' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-vector',
       3 => 'javelin-request',
       4 => 'javelin-uri',
     ),
     '50395a1b' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-util',
     ),
     '52a92793' =>
     array(
       0 => 'javelin-util',
       1 => 'javelin-magical-init',
     ),
     '533a187b' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'phabricator-prefab',
     ),
     '53f6f2dd' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-workflow',
       4 => 'javelin-stratcom',
     ),
     '54b612ba' =>
     array(
       0 => 'javelin-color',
       1 => 'javelin-install',
       2 => 'javelin-util',
     ),
     '551add57' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-reactor-dom',
     ),
     '59b251eb' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-vector',
       3 => 'javelin-dom',
     ),
     '5afdb2f8' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-typeahead-preloaded-source',
       3 => 'javelin-util',
     ),
     '5bc2cb21' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
     ),
     '5d584426' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-util',
       2 => 'javelin-dom',
       3 => 'javelin-stratcom',
       4 => 'javelin-vector',
     ),
     '5f850b5c' =>
     array(
       0 => 'javelin-install',
     ),
     '61d927ec' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'phabricator-shaped-request',
     ),
-    '62e18640' =>
-    array(
-      0 => 'javelin-install',
-      1 => 'javelin-util',
-      2 => 'javelin-dom',
-      3 => 'javelin-typeahead-normalizer',
-    ),
     '6453c869' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-fx',
     ),
     '64ef2fd2' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-vector',
     ),
     '66815d9c' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-request',
       3 => 'javelin-typeahead-source',
     ),
     '69815cac' =>
     array(
       0 => 'javelin-install',
     ),
     '6b3dcf44' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
     ),
     '6c2b09a2' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
     ),
     '6d3e1947' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-diffusion-locate-file-source',
       2 => 'javelin-dom',
       3 => 'javelin-typeahead',
       4 => 'javelin-uri',
     ),
+    '6e8cefa4' =>
+    array(
+      0 => 'javelin-install',
+      1 => 'javelin-dom',
+      2 => 'javelin-util',
+    ),
     '71755c79' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
+    '71b4cbcc' =>
+    array(
+      0 => 'javelin-behavior',
+      1 => 'javelin-dom',
+      2 => 'javelin-util',
+      3 => 'phuix-dropdown-menu',
+      4 => 'phuix-action-list-view',
+      5 => 'phuix-action-view',
+      6 => 'javelin-workflow',
+    ),
     '7319e029' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
     ),
+    '62e18640' =>
+    array(
+      0 => 'javelin-install',
+      1 => 'javelin-util',
+      2 => 'javelin-dom',
+      3 => 'javelin-typeahead-normalizer',
+    ),
     '76f4ebed' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-reactor',
       2 => 'javelin-util',
     ),
     '77b1cf6f' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
     ),
     '7814b593' =>
     array(
       0 => 'javelin-request',
       1 => 'javelin-behavior',
       2 => 'javelin-dom',
       3 => 'javelin-router',
       4 => 'javelin-util',
       5 => 'phabricator-busy',
     ),
     '7a68dda3' =>
     array(
       0 => 'owners-path-editor',
       1 => 'javelin-behavior',
     ),
     '7ba325ee' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-reactor-dom',
     ),
     '7bad574b' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-stratcom',
       2 => 'javelin-util',
       3 => 'javelin-behavior',
       4 => 'javelin-json',
       5 => 'javelin-dom',
       6 => 'javelin-resource',
       7 => 'javelin-routable',
     ),
     '7c273581' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     '7cbe244b' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-request',
       3 => 'javelin-router',
     ),
     '7e41274a' =>
     array(
       0 => 'javelin-install',
     ),
     '7ebaeed3' =>
     array(
       0 => 'herald-rule-editor',
       1 => 'javelin-behavior',
     ),
     '7ee23816' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-stratcom',
       4 => 'javelin-workflow',
       5 => 'javelin-behavior-device',
       6 => 'javelin-history',
       7 => 'javelin-vector',
       8 => 'phabricator-shaped-request',
     ),
     '7ee2b591' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-history',
     ),
-    '7f93ef26' =>
-    array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'javelin-stratcom',
-      4 => 'phuix-dropdown-menu',
-      5 => 'phuix-action-list-view',
-      6 => 'phuix-action-view',
-      7 => 'phabricator-phtize',
-    ),
     '82f568cd' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-reactor-dom',
     ),
     '84845b5b' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'javelin-workflow',
       4 => 'phabricator-draggable-list',
     ),
     '84f34ab1' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-typeahead-source',
       2 => 'javelin-util',
     ),
     '858f9728' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-reactor-dom',
     ),
     '889c96f3' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
     ),
     '8a3ed18b' =>
     array(
       0 => 'javelin-magical-init',
       1 => 'javelin-util',
     ),
     '8ab282be' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'javelin-uri',
     ),
     '8ef9ab58' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
     ),
     '8f24abfc' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     '8fc1c918' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-uri',
       2 => 'phabricator-notification',
     ),
     '8fd76bab' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-uri',
       3 => 'javelin-mask',
       4 => 'phabricator-drag-and-drop-file-upload',
     ),
     '9084a36f' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-fx',
       4 => 'javelin-request',
       5 => 'phabricator-shaped-request',
     ),
     '938aed89' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-json',
       4 => 'phabricator-draggable-list',
     ),
     '9414ff18' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-resource',
       2 => 'javelin-stratcom',
       3 => 'javelin-workflow',
       4 => 'javelin-util',
     ),
     '957a7fde' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-workflow',
       3 => 'javelin-dom',
       4 => 'phabricator-draggable-list',
     ),
     '9b9197be' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     '9c808199' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-behavior-device',
       2 => 'javelin-stratcom',
       3 => 'javelin-vector',
       4 => 'phabricator-hovercard',
     ),
     '9db3d160' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-vector',
       2 => 'javelin-dom',
     ),
     '9eb2cedb' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-uri',
       3 => 'javelin-request',
     ),
     'a3e2244e' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     'a4ae61bf' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'phabricator-notification',
     ),
     'a51fdb2e' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-request',
       2 => 'javelin-stratcom',
       3 => 'javelin-dom',
     ),
     'a5d7cf86' =>
     array(
       0 => 'javelin-dom',
     ),
     'a79b75a4' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-request',
       3 => 'javelin-typeahead-source',
     ),
     'a82a7769' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     'a8d8459d' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
     ),
     'a9aaba0c' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     'ad7a69ca' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-stratcom',
       3 => 'javelin-dom',
       4 => 'javelin-vector',
     ),
     'ae6abfba' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-request',
       3 => 'javelin-dom',
       4 => 'javelin-uri',
       5 => 'phabricator-file-upload',
     ),
     'b3a4b884' =>
     array(
       0 => 'javelin-behavior',
       1 => 'phabricator-prefab',
     ),
     'b3e5ee60' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'phortune-credit-card-form',
     ),
     'b3e7d692' =>
     array(
       0 => 'javelin-install',
     ),
     'b3ec3cfc' =>
     array(
       0 => 'javelin-install',
     ),
     'b4c30592' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-reactor',
       2 => 'javelin-util',
       3 => 'javelin-reactor-node-calmer',
     ),
     'b5842a5e' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-behavior-device',
       2 => 'javelin-stratcom',
       3 => 'javelin-dom',
       4 => 'javelin-magical-init',
       5 => 'javelin-vector',
       6 => 'javelin-request',
       7 => 'javelin-util',
     ),
     'b5c256b8' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
     ),
     'b657bdf8' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-uri',
       2 => 'phabricator-keyboard-shortcut',
     ),
     'b6d401d6' =>
     array(
       0 => 'javelin-dom',
       1 => 'javelin-dynval',
       2 => 'javelin-reactor',
       3 => 'javelin-reactornode',
       4 => 'javelin-install',
       5 => 'javelin-util',
     ),
     'b98fc918' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-vector',
       3 => 'javelin-magical-init',
     ),
     'b9f26029' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
     ),
     'bc778103' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'javelin-history',
     ),
-    'bc99b0f2' =>
-    array(
-      0 => 'javelin-behavior',
-      1 => 'javelin-dom',
-      2 => 'javelin-util',
-      3 => 'phuix-dropdown-menu',
-      4 => 'phuix-action-list-view',
-      5 => 'phuix-action-view',
-      6 => 'javelin-workflow',
-    ),
     'bd0aedcd' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-event',
     ),
     'bd4c8dca' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-dom',
       3 => 'javelin-vector',
       4 => 'javelin-stratcom',
     ),
     'bdaf4d04' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-request',
     ),
     'be81801d' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'phabricator-shaped-request',
     ),
     'bf97561d' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-reactor-dom',
     ),
     'c021950a' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
       3 => 'phabricator-phtize',
       4 => 'phabricator-textareautils',
       5 => 'javelin-workflow',
       6 => 'javelin-vector',
     ),
     'c293f7b9' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-event',
       2 => 'javelin-util',
       3 => 'javelin-magical-init',
     ),
     'c3e218fe' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
     ),
     'c51a6616' =>
     array(
       0 => 'phabricator-notification',
       1 => 'javelin-stratcom',
       2 => 'javelin-behavior',
     ),
     'c54eeefb' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-vector',
       3 => 'javelin-util',
     ),
     'c60f4327' =>
     array(
       0 => 'javelin-stratcom',
       1 => 'javelin-install',
       2 => 'javelin-uri',
       3 => 'javelin-util',
     ),
     'c81bc98f' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-vector',
       3 => 'javelin-dom',
       4 => 'javelin-uri',
     ),
     'c8728c70' =>
     array(
       0 => 'javelin-behavior',
       1 => 'phabricator-keyboard-shortcut',
       2 => 'javelin-stratcom',
     ),
     'ca3f91eb' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'phabricator-phtize',
     ),
     'cd9e7094' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-typeahead',
       3 => 'javelin-typeahead-ondemand-source',
       4 => 'javelin-dom',
     ),
     'cdde23f1' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-typeahead-source',
     ),
     'cf656c84' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-workflow',
       3 => 'javelin-dom',
       4 => 'javelin-fx',
       5 => 'javelin-uri',
       6 => 'phabricator-textareautils',
     ),
     'cf76cfd5' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'javelin-workflow',
       4 => 'javelin-fx',
       5 => 'javelin-util',
     ),
     'd254d646' =>
     array(
       0 => 'javelin-util',
     ),
     'd259e7c9' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'javelin-workflow',
       4 => 'javelin-util',
       5 => 'phabricator-keyboard-shortcut',
     ),
     'd4a14807' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-view',
     ),
     'd6ca6b1c' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-reactor-dom',
       2 => 'javelin-view-html',
       3 => 'javelin-view-interpreter',
       4 => 'javelin-view-renderer',
     ),
     'd75709e6' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-workflow',
       2 => 'javelin-json',
       3 => 'javelin-dom',
       4 => 'phabricator-keyboard-shortcut',
     ),
     'd8469741' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-typeahead-ondemand-source',
       2 => 'javelin-typeahead',
       3 => 'javelin-dom',
       4 => 'javelin-uri',
       5 => 'javelin-util',
       6 => 'javelin-stratcom',
     ),
     'd8e135db' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-stratcom',
       4 => 'javelin-workflow',
       5 => 'phabricator-draggable-list',
     ),
     'd9a9b862' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-stratcom',
     ),
     'dd7e8ef5' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-workflow',
       3 => 'javelin-util',
       4 => 'javelin-stratcom',
     ),
     'dddd43ac' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'phabricator-prefab',
     ),
+    'dfd45180' =>
+    array(
+      0 => 'javelin-behavior',
+      1 => 'javelin-dom',
+      2 => 'javelin-util',
+      3 => 'javelin-stratcom',
+      4 => 'phuix-dropdown-menu',
+      5 => 'phuix-action-list-view',
+      6 => 'phuix-action-view',
+      7 => 'phabricator-phtize',
+    ),
     'dfdf9f34' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-workflow',
       2 => 'javelin-util',
       3 => 'javelin-dom',
       4 => 'javelin-stratcom',
       5 => 'javelin-behavior-device',
       6 => 'javelin-vector',
       7 => 'javelin-router',
       8 => 'phabricator-tooltip',
     ),
     'e1ff79b1' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     'e5822781' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-json',
       3 => 'javelin-workflow',
       4 => 'javelin-magical-init',
     ),
     'e5b406f9' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-view-visitor',
       3 => 'javelin-util',
     ),
     'e6f67523' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-request',
       3 => 'javelin-util',
     ),
     'e7c21fb3' =>
     array(
       0 => 'javelin-dom',
       1 => 'javelin-util',
       2 => 'javelin-stratcom',
       3 => 'javelin-install',
     ),
     'e9fdb5e5' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-util',
       3 => 'javelin-dom',
       4 => 'javelin-request',
       5 => 'phabricator-keyboard-shortcut',
     ),
     'ead554ec' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'javelin-util',
     ),
     'efe49472' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
     ),
     'f1375ea5' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-workflow',
     ),
     'f2441746' =>
     array(
       0 => 'javelin-dom',
       1 => 'javelin-util',
       2 => 'javelin-stratcom',
       3 => 'javelin-install',
       4 => 'javelin-request',
       5 => 'javelin-workflow',
     ),
     'f42bb8c6' =>
     array(
       0 => 'javelin-stratcom',
       1 => 'javelin-behavior',
       2 => 'javelin-vector',
       3 => 'javelin-dom',
     ),
     'f6555212' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-reactornode',
       2 => 'javelin-util',
       3 => 'javelin-reactor',
     ),
     'f7379f45' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'phabricator-shaped-request',
     ),
     'f7f1289f' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
     ),
     'f7fc67ec' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-typeahead',
       2 => 'javelin-dom',
       3 => 'javelin-request',
       4 => 'javelin-typeahead-ondemand-source',
       5 => 'javelin-util',
     ),
     'f8248bc5' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-json',
       4 => 'javelin-stratcom',
       5 => 'phabricator-shaped-request',
     ),
     'fa187a68' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-stratcom',
       4 => 'javelin-workflow',
       5 => 'phabricator-draggable-list',
     ),
     'fbbce3bf' =>
     array(
       0 => 'phabricator-busy',
       1 => 'javelin-behavior',
     ),
     'fe2e0ba4' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-behavior-device',
       2 => 'javelin-stratcom',
       3 => 'javelin-vector',
       4 => 'javelin-dom',
       5 => 'javelin-magical-init',
     ),
     'fe80fb6d' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'phabricator-prefab',
       4 => 'multirow-row-manager',
       5 => 'javelin-json',
     ),
     28497740 =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-util',
       2 => 'javelin-stratcom',
       3 => 'javelin-dom',
       4 => 'javelin-vector',
       5 => 'javelin-magical-init',
       6 => 'javelin-request',
       7 => 'javelin-history',
       8 => 'javelin-workflow',
       9 => 'javelin-mask',
       10 => 'javelin-behavior-device',
       11 => 'phabricator-keyboard-shortcut',
     ),
     36903077 =>
     array(
       0 => 'aphront-typeahead-control-css',
     ),
     42126667 =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-request',
     ),
     44524435 =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-dynval',
       4 => 'javelin-reactor-dom',
     ),
     48086888 =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-workflow',
     ),
   ),
   'packages' =>
   array(
     'core.pkg.css' =>
     array(
       0 => 'phabricator-core-css',
       1 => 'phabricator-zindex-css',
       2 => 'phui-button-css',
       3 => 'phabricator-standard-page-view',
       4 => 'aphront-dialog-view-css',
       5 => 'phui-form-view-css',
       6 => 'aphront-panel-view-css',
       7 => 'aphront-table-view-css',
       8 => 'aphront-tokenizer-control-css',
       9 => 'aphront-typeahead-control-css',
       10 => 'aphront-list-filter-view-css',
       11 => 'phabricator-jump-nav',
       12 => 'phabricator-remarkup-css',
       13 => 'syntax-highlighting-css',
       14 => 'aphront-pager-view-css',
       15 => 'phabricator-transaction-view-css',
       16 => 'aphront-tooltip-css',
       17 => 'phabricator-flag-css',
       18 => 'aphront-error-view-css',
       19 => 'sprite-remarkup-css',
       20 => 'sprite-gradient-css',
       21 => 'sprite-menu-css',
       22 => 'sprite-apps-large-css',
-      23 => 'sprite-status-css',
-      24 => 'phabricator-main-menu-view',
-      25 => 'phabricator-notification-css',
-      26 => 'phabricator-notification-menu-css',
-      27 => 'lightbox-attachment-css',
-      28 => 'phui-header-view-css',
-      29 => 'phabricator-filetree-view-css',
-      30 => 'phabricator-nav-view-css',
-      31 => 'phabricator-side-menu-view-css',
-      32 => 'phabricator-crumbs-view-css',
-      33 => 'phui-object-item-list-view-css',
-      34 => 'global-drag-and-drop-css',
-      35 => 'phui-spacing-css',
-      36 => 'phui-form-css',
-      37 => 'phui-icon-view-css',
-      38 => 'phabricator-application-launch-view-css',
-      39 => 'phabricator-action-list-view-css',
-      40 => 'phui-property-list-view-css',
-      41 => 'phui-tag-view-css',
-      42 => 'phui-list-view-css',
+      23 => 'phabricator-main-menu-view',
+      24 => 'phabricator-notification-css',
+      25 => 'phabricator-notification-menu-css',
+      26 => 'lightbox-attachment-css',
+      27 => 'phui-header-view-css',
+      28 => 'phabricator-filetree-view-css',
+      29 => 'phabricator-nav-view-css',
+      30 => 'phabricator-side-menu-view-css',
+      31 => 'phabricator-crumbs-view-css',
+      32 => 'phui-object-item-list-view-css',
+      33 => 'global-drag-and-drop-css',
+      34 => 'phui-spacing-css',
+      35 => 'phui-form-css',
+      36 => 'phui-icon-view-css',
+      37 => 'phabricator-application-launch-view-css',
+      38 => 'phabricator-action-list-view-css',
+      39 => 'phui-property-list-view-css',
+      40 => 'phui-tag-view-css',
+      41 => 'phui-list-view-css',
     ),
     'core.pkg.js' =>
     array(
       0 => 'javelin-behavior-aphront-basic-tokenizer',
       1 => 'javelin-behavior-workflow',
       2 => 'javelin-behavior-aphront-form-disable-on-submit',
       3 => 'phabricator-keyboard-shortcut-manager',
       4 => 'phabricator-keyboard-shortcut',
       5 => 'javelin-behavior-phabricator-keyboard-shortcuts',
       6 => 'javelin-behavior-refresh-csrf',
       7 => 'javelin-behavior-phabricator-watch-anchor',
       8 => 'javelin-behavior-phabricator-autofocus',
       9 => 'phuix-dropdown-menu',
       10 => 'phuix-action-list-view',
       11 => 'phuix-action-view',
       12 => 'phabricator-phtize',
       13 => 'javelin-behavior-phabricator-oncopy',
       14 => 'phabricator-tooltip',
       15 => 'javelin-behavior-phabricator-tooltips',
       16 => 'phabricator-prefab',
       17 => 'javelin-behavior-device',
       18 => 'javelin-behavior-toggle-class',
       19 => 'javelin-behavior-lightbox-attachments',
       20 => 'phabricator-busy',
       21 => 'javelin-aphlict',
       22 => 'phabricator-notification',
       23 => 'javelin-behavior-aphlict-listen',
       24 => 'javelin-behavior-phabricator-search-typeahead',
       25 => 'javelin-behavior-konami',
       26 => 'javelin-behavior-aphlict-dropdown',
       27 => 'javelin-behavior-history-install',
       28 => 'javelin-behavior-phabricator-gesture',
       29 => 'javelin-behavior-phabricator-active-nav',
       30 => 'javelin-behavior-phabricator-nav',
       31 => 'javelin-behavior-phabricator-remarkup-assist',
       32 => 'phabricator-textareautils',
       33 => 'phabricator-file-upload',
       34 => 'javelin-behavior-global-drag-and-drop',
       35 => 'javelin-behavior-phabricator-reveal-content',
       36 => 'phabricator-hovercard',
       37 => 'javelin-behavior-phabricator-hovercards',
       38 => 'javelin-color',
       39 => 'javelin-fx',
     ),
     'darkconsole.pkg.js' =>
     array(
       0 => 'javelin-behavior-dark-console',
       1 => 'javelin-behavior-error-log',
     ),
     'differential.pkg.css' =>
     array(
       0 => 'differential-core-view-css',
       1 => 'differential-changeset-view-css',
       2 => 'differential-results-table-css',
       3 => 'differential-revision-history-css',
       4 => 'differential-revision-list-css',
       5 => 'differential-table-of-contents-css',
       6 => 'differential-revision-comment-css',
       7 => 'differential-revision-add-comment-css',
       8 => 'phabricator-object-selector-css',
       9 => 'phabricator-content-source-view-css',
       10 => 'inline-comment-summary-css',
     ),
     'differential.pkg.js' =>
     array(
       0 => 'phabricator-drag-and-drop-file-upload',
       1 => 'phabricator-shaped-request',
       2 => 'javelin-behavior-differential-feedback-preview',
       3 => 'javelin-behavior-differential-edit-inline-comments',
       4 => 'javelin-behavior-differential-populate',
       5 => 'javelin-behavior-differential-show-more',
       6 => 'javelin-behavior-differential-diff-radios',
       7 => 'javelin-behavior-differential-comment-jump',
       8 => 'javelin-behavior-differential-add-reviewers-and-ccs',
       9 => 'javelin-behavior-differential-keyboard-navigation',
       10 => 'javelin-behavior-aphront-drag-and-drop-textarea',
       11 => 'javelin-behavior-phabricator-object-selector',
       12 => 'javelin-behavior-repository-crossreference',
       13 => 'javelin-behavior-load-blame',
       14 => 'differential-inline-comment-editor',
       15 => 'javelin-behavior-differential-dropdown-menus',
       16 => 'javelin-behavior-differential-toggle-files',
       17 => 'javelin-behavior-differential-user-select',
     ),
     'diffusion.pkg.css' =>
     array(
       0 => 'diffusion-commit-view-css',
       1 => 'diffusion-icons-css',
     ),
     'diffusion.pkg.js' =>
     array(
       0 => 'javelin-behavior-diffusion-pull-lastmodified',
       1 => 'javelin-behavior-diffusion-commit-graph',
       2 => 'javelin-behavior-audit-preview',
     ),
     'javelin.pkg.js' =>
     array(
       0 => 'javelin-util',
       1 => 'javelin-install',
       2 => 'javelin-event',
       3 => 'javelin-stratcom',
       4 => 'javelin-behavior',
       5 => 'javelin-resource',
       6 => 'javelin-request',
       7 => 'javelin-vector',
       8 => 'javelin-dom',
       9 => 'javelin-json',
       10 => 'javelin-uri',
       11 => 'javelin-workflow',
       12 => 'javelin-mask',
       13 => 'javelin-typeahead',
       14 => 'javelin-typeahead-normalizer',
       15 => 'javelin-typeahead-source',
       16 => 'javelin-typeahead-preloaded-source',
       17 => 'javelin-typeahead-ondemand-source',
       18 => 'javelin-tokenizer',
       19 => 'javelin-history',
     ),
     'maniphest.pkg.css' =>
     array(
       0 => 'maniphest-task-summary-css',
       1 => 'phabricator-project-tag-css',
     ),
     'maniphest.pkg.js' =>
     array(
       0 => 'javelin-behavior-maniphest-batch-selector',
       1 => 'javelin-behavior-maniphest-transaction-controls',
       2 => 'javelin-behavior-maniphest-transaction-preview',
       3 => 'javelin-behavior-maniphest-transaction-expand',
       4 => 'javelin-behavior-maniphest-subpriority-editor',
     ),
   ),
 );
diff --git a/resources/celerity/packages.php b/resources/celerity/packages.php
index 54872d07e3..bead57c355 100644
--- a/resources/celerity/packages.php
+++ b/resources/celerity/packages.php
@@ -1,178 +1,177 @@
 <?php
 
 return array(
   'javelin.pkg.js' => array(
     'javelin-util',
     'javelin-install',
     'javelin-event',
     'javelin-stratcom',
     'javelin-behavior',
     'javelin-resource',
     'javelin-request',
     'javelin-vector',
     'javelin-dom',
     'javelin-json',
     'javelin-uri',
     'javelin-workflow',
     'javelin-mask',
     'javelin-typeahead',
     'javelin-typeahead-normalizer',
     'javelin-typeahead-source',
     'javelin-typeahead-preloaded-source',
     'javelin-typeahead-ondemand-source',
     'javelin-tokenizer',
     'javelin-history',
   ),
   'core.pkg.js' => array(
     'javelin-behavior-aphront-basic-tokenizer',
     'javelin-behavior-workflow',
     'javelin-behavior-aphront-form-disable-on-submit',
     'phabricator-keyboard-shortcut-manager',
     'phabricator-keyboard-shortcut',
     'javelin-behavior-phabricator-keyboard-shortcuts',
     'javelin-behavior-refresh-csrf',
     'javelin-behavior-phabricator-watch-anchor',
     'javelin-behavior-phabricator-autofocus',
     'phuix-dropdown-menu',
     'phuix-action-list-view',
     'phuix-action-view',
     'phabricator-phtize',
     'javelin-behavior-phabricator-oncopy',
     'phabricator-tooltip',
     'javelin-behavior-phabricator-tooltips',
     'phabricator-prefab',
     'javelin-behavior-device',
     'javelin-behavior-toggle-class',
     'javelin-behavior-lightbox-attachments',
     'phabricator-busy',
     'javelin-aphlict',
     'phabricator-notification',
     'javelin-behavior-aphlict-listen',
     'javelin-behavior-phabricator-search-typeahead',
     'javelin-behavior-konami',
     'javelin-behavior-aphlict-dropdown',
     'javelin-behavior-history-install',
     'javelin-behavior-phabricator-gesture',
 
     'javelin-behavior-phabricator-active-nav',
     'javelin-behavior-phabricator-nav',
     'javelin-behavior-phabricator-remarkup-assist',
     'phabricator-textareautils',
     'phabricator-file-upload',
     'javelin-behavior-global-drag-and-drop',
     'javelin-behavior-phabricator-reveal-content',
     'phabricator-hovercard',
     'javelin-behavior-phabricator-hovercards',
     'javelin-color',
     'javelin-fx',
   ),
   'core.pkg.css' => array(
     'phabricator-core-css',
     'phabricator-zindex-css',
     'phui-button-css',
     'phabricator-standard-page-view',
     'aphront-dialog-view-css',
     'phui-form-view-css',
     'aphront-panel-view-css',
     'aphront-table-view-css',
     'aphront-tokenizer-control-css',
     'aphront-typeahead-control-css',
     'aphront-list-filter-view-css',
 
     'phabricator-jump-nav',
 
     'phabricator-remarkup-css',
     'syntax-highlighting-css',
     'aphront-pager-view-css',
     'phabricator-transaction-view-css',
     'aphront-tooltip-css',
     'phabricator-flag-css',
     'aphront-error-view-css',
 
     'sprite-remarkup-css',
     'sprite-gradient-css',
     'sprite-menu-css',
     'sprite-apps-large-css',
-    'sprite-status-css',
 
     'phabricator-main-menu-view',
     'phabricator-notification-css',
     'phabricator-notification-menu-css',
     'lightbox-attachment-css',
     'phui-header-view-css',
     'phabricator-filetree-view-css',
     'phabricator-nav-view-css',
     'phabricator-side-menu-view-css',
     'phabricator-crumbs-view-css',
     'phui-object-item-list-view-css',
     'global-drag-and-drop-css',
     'phui-spacing-css',
     'phui-form-css',
     'phui-icon-view-css',
 
     'phabricator-application-launch-view-css',
     'phabricator-action-list-view-css',
     'phui-property-list-view-css',
     'phui-tag-view-css',
     'phui-list-view-css',
   ),
   'differential.pkg.css' => array(
     'differential-core-view-css',
     'differential-changeset-view-css',
     'differential-results-table-css',
     'differential-revision-history-css',
     'differential-revision-list-css',
     'differential-table-of-contents-css',
     'differential-revision-comment-css',
     'differential-revision-add-comment-css',
     'phabricator-object-selector-css',
     'phabricator-content-source-view-css',
     'inline-comment-summary-css',
   ),
   'differential.pkg.js' => array(
     'phabricator-drag-and-drop-file-upload',
     'phabricator-shaped-request',
 
     'javelin-behavior-differential-feedback-preview',
     'javelin-behavior-differential-edit-inline-comments',
     'javelin-behavior-differential-populate',
     'javelin-behavior-differential-show-more',
     'javelin-behavior-differential-diff-radios',
     'javelin-behavior-differential-comment-jump',
     'javelin-behavior-differential-add-reviewers-and-ccs',
     'javelin-behavior-differential-keyboard-navigation',
     'javelin-behavior-aphront-drag-and-drop-textarea',
     'javelin-behavior-phabricator-object-selector',
     'javelin-behavior-repository-crossreference',
     'javelin-behavior-load-blame',
 
     'differential-inline-comment-editor',
     'javelin-behavior-differential-dropdown-menus',
     'javelin-behavior-differential-toggle-files',
     'javelin-behavior-differential-user-select',
   ),
   'diffusion.pkg.css' => array(
     'diffusion-commit-view-css',
     'diffusion-icons-css',
   ),
   'diffusion.pkg.js' => array(
     'javelin-behavior-diffusion-pull-lastmodified',
     'javelin-behavior-diffusion-commit-graph',
     'javelin-behavior-audit-preview',
   ),
   'maniphest.pkg.css' => array(
     'maniphest-task-summary-css',
     'phabricator-project-tag-css',
   ),
   'maniphest.pkg.js' => array(
     'javelin-behavior-maniphest-batch-selector',
     'javelin-behavior-maniphest-transaction-controls',
     'javelin-behavior-maniphest-transaction-preview',
     'javelin-behavior-maniphest-transaction-expand',
     'javelin-behavior-maniphest-subpriority-editor',
   ),
   'darkconsole.pkg.js' => array(
     'javelin-behavior-dark-console',
     'javelin-behavior-error-log',
   ),
 );
diff --git a/resources/sprite/manifest/status.json b/resources/sprite/manifest/status.json
deleted file mode 100644
index 9cfbf11bc3..0000000000
--- a/resources/sprite/manifest/status.json
+++ /dev/null
@@ -1,526 +0,0 @@
-{
-  "version" : 1,
-  "sprites" : {
-    "status-accept"               : {
-      "name" : "status-accept",
-      "rule" : ".status-accept",
-      "hash" : "6493498ca9beb344cffa6211fb80cbfd"
-    },
-    "status-accept-blue"          : {
-      "name" : "status-accept-blue",
-      "rule" : ".status-accept-blue",
-      "hash" : "c3bde2e1361bcd7259825ecaf2d4b2ff"
-    },
-    "status-accept-dark"          : {
-      "name" : "status-accept-dark",
-      "rule" : ".status-accept-dark",
-      "hash" : "a2ec73e144ea598be15b8acb63f3c096"
-    },
-    "status-accept-green"         : {
-      "name" : "status-accept-green",
-      "rule" : ".status-accept-green",
-      "hash" : "cf0c2339a111f54adfdcc0de5c18be22"
-    },
-    "status-accept-red"           : {
-      "name" : "status-accept-red",
-      "rule" : ".status-accept-red",
-      "hash" : "1466a3ed72f63971e38e669715cf5b98"
-    },
-    "status-accept-white"         : {
-      "name" : "status-accept-white",
-      "rule" : ".status-accept-white",
-      "hash" : "8ecccf5e2ce6658d8a1e963e4be6f6e9"
-    },
-    "status-add"                  : {
-      "name" : "status-add",
-      "rule" : ".status-add",
-      "hash" : "165d43c1451fb9ffd69c36ede87c7875"
-    },
-    "status-add-blue"             : {
-      "name" : "status-add-blue",
-      "rule" : ".status-add-blue",
-      "hash" : "8860efdd8f90eed700ae48595ace6b38"
-    },
-    "status-add-dark"             : {
-      "name" : "status-add-dark",
-      "rule" : ".status-add-dark",
-      "hash" : "38dc8634ccfe6fa30f467e97436e1a30"
-    },
-    "status-add-green"            : {
-      "name" : "status-add-green",
-      "rule" : ".status-add-green",
-      "hash" : "5610cd9924ad6b3461a20dd050ef4866"
-    },
-    "status-add-red"              : {
-      "name" : "status-add-red",
-      "rule" : ".status-add-red",
-      "hash" : "9e0abe2b6e37ef5a1a2522ad01002704"
-    },
-    "status-add-white"            : {
-      "name" : "status-add-white",
-      "rule" : ".status-add-white",
-      "hash" : "1a8ab412f40c569acdc709fb281fefde"
-    },
-    "status-down"                 : {
-      "name" : "status-down",
-      "rule" : ".status-down",
-      "hash" : "85d3b2376bbed1b48cb777f07a4e244e"
-    },
-    "status-down-blue"            : {
-      "name" : "status-down-blue",
-      "rule" : ".status-down-blue",
-      "hash" : "25baf216cd311f321656a5f3a327c38c"
-    },
-    "status-down-dark"            : {
-      "name" : "status-down-dark",
-      "rule" : ".status-down-dark",
-      "hash" : "bb82d18b729ac30956200b655eafeeb8"
-    },
-    "status-down-green"           : {
-      "name" : "status-down-green",
-      "rule" : ".status-down-green",
-      "hash" : "c29ad19910664ecc94e0d1fa99a0a6c0"
-    },
-    "status-down-red"             : {
-      "name" : "status-down-red",
-      "rule" : ".status-down-red",
-      "hash" : "644f0d38cad5cc6797fe81ed30b9bc6a"
-    },
-    "status-down-white"           : {
-      "name" : "status-down-white",
-      "rule" : ".status-down-white",
-      "hash" : "5bc0af6641ef545218ecced2d25e9a10"
-    },
-    "status-info"                 : {
-      "name" : "status-info",
-      "rule" : ".status-info",
-      "hash" : "3b9d6abe2fb44b0959208632a77d3582"
-    },
-    "status-info-blue"            : {
-      "name" : "status-info-blue",
-      "rule" : ".status-info-blue",
-      "hash" : "2acc8c62d8963bec9ce632de60a4da41"
-    },
-    "status-info-dark"            : {
-      "name" : "status-info-dark",
-      "rule" : ".status-info-dark",
-      "hash" : "d96f44c17e67d7c0c10a400e6ff294f1"
-    },
-    "status-info-green"           : {
-      "name" : "status-info-green",
-      "rule" : ".status-info-green",
-      "hash" : "28fc83a1f5bee4ac39a0dcd52e180818"
-    },
-    "status-info-red"             : {
-      "name" : "status-info-red",
-      "rule" : ".status-info-red",
-      "hash" : "fc26e5509140d8e9a3305a39c44773f0"
-    },
-    "status-info-white"           : {
-      "name" : "status-info-white",
-      "rule" : ".status-info-white",
-      "hash" : "b70025f459685371f8397b61944bef7d"
-    },
-    "status-left"                 : {
-      "name" : "status-left",
-      "rule" : ".status-left",
-      "hash" : "4649139ffc7e668b67d6978bbd5cbf15"
-    },
-    "status-left-blue"            : {
-      "name" : "status-left-blue",
-      "rule" : ".status-left-blue",
-      "hash" : "cdec5d2617cb7fcfbfea336881d267f0"
-    },
-    "status-left-dark"            : {
-      "name" : "status-left-dark",
-      "rule" : ".status-left-dark",
-      "hash" : "83b58d1cde130deb01971888ad0bcfc1"
-    },
-    "status-left-green"           : {
-      "name" : "status-left-green",
-      "rule" : ".status-left-green",
-      "hash" : "6b34445f1a034e71432a5823bed1c4d7"
-    },
-    "status-left-red"             : {
-      "name" : "status-left-red",
-      "rule" : ".status-left-red",
-      "hash" : "38ebb75c0fbcf6fe96def6c2ab70b343"
-    },
-    "status-left-white"           : {
-      "name" : "status-left-white",
-      "rule" : ".status-left-white",
-      "hash" : "9e89400271b55590e610188d93671934"
-    },
-    "status-minus"                : {
-      "name" : "status-minus",
-      "rule" : ".status-minus",
-      "hash" : "a232bd27513a71ce8f4cd163d8aa05cf"
-    },
-    "status-minus-blue"           : {
-      "name" : "status-minus-blue",
-      "rule" : ".status-minus-blue",
-      "hash" : "61ef81a9b78b4de4bf6303f8d51c86ef"
-    },
-    "status-minus-dark"           : {
-      "name" : "status-minus-dark",
-      "rule" : ".status-minus-dark",
-      "hash" : "db4ddb69a22c7f6f09669fe3c488c4f0"
-    },
-    "status-minus-green"          : {
-      "name" : "status-minus-green",
-      "rule" : ".status-minus-green",
-      "hash" : "9e5402f65601ced38a967d4e17b80f1c"
-    },
-    "status-minus-red"            : {
-      "name" : "status-minus-red",
-      "rule" : ".status-minus-red",
-      "hash" : "bcaf148bc842e398f08d8c01506bd5b6"
-    },
-    "status-minus-white"          : {
-      "name" : "status-minus-white",
-      "rule" : ".status-minus-white",
-      "hash" : "c5a3771452dda603fbaee87371044f5a"
-    },
-    "status-oh-closed"            : {
-      "name" : "status-oh-closed",
-      "rule" : ".status-oh-closed",
-      "hash" : "fa5f2ef65de3e55c9251aebbed662f7a"
-    },
-    "status-oh-closed-dark"       : {
-      "name" : "status-oh-closed-dark",
-      "rule" : ".status-oh-closed-dark",
-      "hash" : "926d6a4e9530a20cd9cd655b334e4f89"
-    },
-    "status-oh-ok"                : {
-      "name" : "status-oh-ok",
-      "rule" : ".status-oh-ok",
-      "hash" : "0d1a2962da8fa12dd41a11316ba7f2eb"
-    },
-    "status-oh-ok-dark"           : {
-      "name" : "status-oh-ok-dark",
-      "rule" : ".status-oh-ok-dark",
-      "hash" : "2daa23d9b1b6c66daac93625dbd26dbc"
-    },
-    "status-oh-open"              : {
-      "name" : "status-oh-open",
-      "rule" : ".status-oh-open",
-      "hash" : "8d759391597ad3925abf2b4b4aaed537"
-    },
-    "status-oh-open-green"        : {
-      "name" : "status-oh-open-green",
-      "rule" : ".status-oh-open-green",
-      "hash" : "18fbeb777a9c5a7d46e0ba0760d3a557"
-    },
-    "status-oh-open-red"          : {
-      "name" : "status-oh-open-red",
-      "rule" : ".status-oh-open-red",
-      "hash" : "982610ba3d0bad1aaa11dcd3b593adbf"
-    },
-    "status-open"                 : {
-      "name" : "status-open",
-      "rule" : ".status-open",
-      "hash" : "5b6b67382052982358d0047f07dd0424"
-    },
-    "status-open-blue"            : {
-      "name" : "status-open-blue",
-      "rule" : ".status-open-blue",
-      "hash" : "9632bb52d5f24941202848c2e3d4488a"
-    },
-    "status-open-dark"            : {
-      "name" : "status-open-dark",
-      "rule" : ".status-open-dark",
-      "hash" : "ca38ff5fc8a327d96cd1bbc23043fbb4"
-    },
-    "status-open-green"           : {
-      "name" : "status-open-green",
-      "rule" : ".status-open-green",
-      "hash" : "b4a2c17594a5301e2bd52a9df71819d3"
-    },
-    "status-open-red"             : {
-      "name" : "status-open-red",
-      "rule" : ".status-open-red",
-      "hash" : "f92b1544978d691da6912f937df54273"
-    },
-    "status-open-white"           : {
-      "name" : "status-open-white",
-      "rule" : ".status-open-white",
-      "hash" : "169dc0e8f36444ea30163181f9c88dc2"
-    },
-    "status-pl-summary"           : {
-      "name" : "status-pl-summary",
-      "rule" : ".status-pl-summary",
-      "hash" : "0abd0eab8617fb88f9b8f4d2f00e17b8"
-    },
-    "status-pl-testplan"          : {
-      "name" : "status-pl-testplan",
-      "rule" : ".status-pl-testplan",
-      "hash" : "03dbb3c53bfddfb553d49c6f27a76765"
-    },
-    "status-policy-admin"         : {
-      "name" : "status-policy-admin",
-      "rule" : ".status-policy-admin",
-      "hash" : "16c86a605a15a7a87f4d706c2122834c"
-    },
-    "status-policy-admin-white"   : {
-      "name" : "status-policy-admin-white",
-      "rule" : ".status-policy-admin-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-admin",
-      "hash" : "4b16ec5170bc30fb688f7e086e61a7f1"
-    },
-    "status-policy-all"           : {
-      "name" : "status-policy-all",
-      "rule" : ".status-policy-all",
-      "hash" : "7e8f9e8019ad7f668e51a097f0554ace"
-    },
-    "status-policy-all-white"     : {
-      "name" : "status-policy-all-white",
-      "rule" : ".status-policy-all-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-all",
-      "hash" : "24ed12bf6f58c21a82be125ace2ff0d0"
-    },
-    "status-policy-custom"        : {
-      "name" : "status-policy-custom",
-      "rule" : ".status-policy-custom",
-      "hash" : "3cf516b1e50412ec95594b9866ab1c39"
-    },
-    "status-policy-custom-white"  : {
-      "name" : "status-policy-custom-white",
-      "rule" : ".status-policy-custom-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-custom",
-      "hash" : "ff8b4cbe21f3b4254f343fffc170ef4b"
-    },
-    "status-policy-elist"         : {
-      "name" : "status-policy-elist",
-      "rule" : ".status-policy-elist",
-      "hash" : "da03d710291f394933260dbf43dbc654"
-    },
-    "status-policy-elist-white"   : {
-      "name" : "status-policy-elist-white",
-      "rule" : ".status-policy-elist-white",
-      "hash" : "57e90e9c91fd640e6a778ddc9a2fa015"
-    },
-    "status-policy-noone"         : {
-      "name" : "status-policy-noone",
-      "rule" : ".status-policy-noone",
-      "hash" : "e3403fb78718660105d86029518cf43c"
-    },
-    "status-policy-noone-white"   : {
-      "name" : "status-policy-noone-white",
-      "rule" : ".status-policy-noone-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-noone",
-      "hash" : "80fb9b153fec4d8136242c5ddc2d8e77"
-    },
-    "status-policy-project"       : {
-      "name" : "status-policy-project",
-      "rule" : ".status-policy-project",
-      "hash" : "2b77235f7057f3b29075d153345eacc6"
-    },
-    "status-policy-project-white" : {
-      "name" : "status-policy-project-white",
-      "rule" : ".status-policy-project-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-project",
-      "hash" : "ac2b6f19edb8d6c40f0bcb3fd477a067"
-    },
-    "status-policy-public"        : {
-      "name" : "status-policy-public",
-      "rule" : ".status-policy-public",
-      "hash" : "e7959890117091fb185816dbc888dfd2"
-    },
-    "status-policy-public-white"  : {
-      "name" : "status-policy-public-white",
-      "rule" : ".status-policy-public-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-public",
-      "hash" : "cf809ca49eefed5375c2ea081e721971"
-    },
-    "status-policy-unknown"       : {
-      "name" : "status-policy-unknown",
-      "rule" : ".status-policy-unknown",
-      "hash" : "0235fd879547c98ad658fa0375c386b6"
-    },
-    "status-policy-unknown-white" : {
-      "name" : "status-policy-unknown-white",
-      "rule" : ".status-policy-unknown-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-unknown",
-      "hash" : "98985bfa005672c4b88feaf88cfa72bc"
-    },
-    "status-policy-user"          : {
-      "name" : "status-policy-user",
-      "rule" : ".status-policy-user",
-      "hash" : "6c21aa20866d5b86f074bdcf4f487d40"
-    },
-    "status-policy-user-white"    : {
-      "name" : "status-policy-user-white",
-      "rule" : ".status-policy-user-white",
-      "hash" : "97a569e973df3f1e4fe012adf216ca40"
-    },
-    "status-question"             : {
-      "name" : "status-question",
-      "rule" : ".status-question",
-      "hash" : "f7290c6ba78eb37a6641eecfdc128f08"
-    },
-    "status-question-blue"        : {
-      "name" : "status-question-blue",
-      "rule" : ".status-question-blue",
-      "hash" : "44ebbdbe059ca77ae4dc6a6b98de1ccf"
-    },
-    "status-question-dark"        : {
-      "name" : "status-question-dark",
-      "rule" : ".status-question-dark",
-      "hash" : "5fdd5f2b089f4481a39760a50224d8b2"
-    },
-    "status-question-green"       : {
-      "name" : "status-question-green",
-      "rule" : ".status-question-green",
-      "hash" : "326dfc6c1841410ce0f22d702c872c01"
-    },
-    "status-question-red"         : {
-      "name" : "status-question-red",
-      "rule" : ".status-question-red",
-      "hash" : "18dbec41627f8c047c4e736f84dacb33"
-    },
-    "status-question-white"       : {
-      "name" : "status-question-white",
-      "rule" : ".status-question-white",
-      "hash" : "5e7f546f978d1d0545cad127ea3bcf80"
-    },
-    "status-reject"               : {
-      "name" : "status-reject",
-      "rule" : ".status-reject",
-      "hash" : "288489e716b390c5404969f9979b9ded"
-    },
-    "status-reject-blue"          : {
-      "name" : "status-reject-blue",
-      "rule" : ".status-reject-blue",
-      "hash" : "b0f51db6aa6ee85a24a1f4c13812d7ef"
-    },
-    "status-reject-dark"          : {
-      "name" : "status-reject-dark",
-      "rule" : ".status-reject-dark",
-      "hash" : "9b28c36f6cbd6d5d5731b971193a151e"
-    },
-    "status-reject-green"         : {
-      "name" : "status-reject-green",
-      "rule" : ".status-reject-green",
-      "hash" : "fc171843df97bcdc6e4679682b3b31e4"
-    },
-    "status-reject-red"           : {
-      "name" : "status-reject-red",
-      "rule" : ".status-reject-red",
-      "hash" : "6de0dd95a92d33bda228aaa9ba6deee5"
-    },
-    "status-reject-white"         : {
-      "name" : "status-reject-white",
-      "rule" : ".status-reject-white",
-      "hash" : "e709a3fb3081a395900deaef0591066c"
-    },
-    "status-right"                : {
-      "name" : "status-right",
-      "rule" : ".status-right",
-      "hash" : "cd61a821b88b7c76a43d7f405d54b6cc"
-    },
-    "status-right-blue"           : {
-      "name" : "status-right-blue",
-      "rule" : ".status-right-blue",
-      "hash" : "ca1cae1d93486785ec50458ba3b19082"
-    },
-    "status-right-dark"           : {
-      "name" : "status-right-dark",
-      "rule" : ".status-right-dark",
-      "hash" : "fb6600fd1775a8a4fb85709dc4f6c28c"
-    },
-    "status-right-green"          : {
-      "name" : "status-right-green",
-      "rule" : ".status-right-green",
-      "hash" : "9a52218e6c6d3968a05eb51865ed3cba"
-    },
-    "status-right-red"            : {
-      "name" : "status-right-red",
-      "rule" : ".status-right-red",
-      "hash" : "06bd9747ce4cc87282b2fb207c525f0c"
-    },
-    "status-right-white"          : {
-      "name" : "status-right-white",
-      "rule" : ".status-right-white",
-      "hash" : "be2ffb65a7799cd9a5e00c2334e378b2"
-    },
-    "status-time-green"           : {
-      "name" : "status-time-green",
-      "rule" : ".status-time-green",
-      "hash" : "5cb4771e10aaf79ac490bc93bd029d8f"
-    },
-    "status-time-orange"          : {
-      "name" : "status-time-orange",
-      "rule" : ".status-time-orange",
-      "hash" : "aa48043beff2c8576402dbccbe4ad3e2"
-    },
-    "status-time-red"             : {
-      "name" : "status-time-red",
-      "rule" : ".status-time-red",
-      "hash" : "e4dbf14f1ac16338b5e01aa04f2e267e"
-    },
-    "status-time-yellow"          : {
-      "name" : "status-time-yellow",
-      "rule" : ".status-time-yellow",
-      "hash" : "79756bcf7f2401d7e3a97ff03b981dcb"
-    },
-    "status-up"                   : {
-      "name" : "status-up",
-      "rule" : ".status-up",
-      "hash" : "d42ac0a3f7bbae3bf57478f533ae88f4"
-    },
-    "status-up-blue"              : {
-      "name" : "status-up-blue",
-      "rule" : ".status-up-blue",
-      "hash" : "44fc24b3646e29c949b639157c315140"
-    },
-    "status-up-dark"              : {
-      "name" : "status-up-dark",
-      "rule" : ".status-up-dark",
-      "hash" : "459ed916291bfa905676ae0818bb2e1b"
-    },
-    "status-up-green"             : {
-      "name" : "status-up-green",
-      "rule" : ".status-up-green",
-      "hash" : "6a682e48fc2f240b19bd175be52c9256"
-    },
-    "status-up-red"               : {
-      "name" : "status-up-red",
-      "rule" : ".status-up-red",
-      "hash" : "0e38f6282e542470ecb68e55fad7eb76"
-    },
-    "status-up-white"             : {
-      "name" : "status-up-white",
-      "rule" : ".status-up-white",
-      "hash" : "ce80e291bc905b2692ad9f3ece7cf206"
-    },
-    "status-warning"              : {
-      "name" : "status-warning",
-      "rule" : ".status-warning",
-      "hash" : "425a02c06f9590e9f7c078badf832d0c"
-    },
-    "status-warning-blue"         : {
-      "name" : "status-warning-blue",
-      "rule" : ".status-warning-blue",
-      "hash" : "93f5e066a01a874adc2c120cca4bd1fc"
-    },
-    "status-warning-dark"         : {
-      "name" : "status-warning-dark",
-      "rule" : ".status-warning-dark",
-      "hash" : "273a519299d7063710452d21c0bc6406"
-    },
-    "status-warning-green"        : {
-      "name" : "status-warning-green",
-      "rule" : ".status-warning-green",
-      "hash" : "991514e5b75509b27fd68d21755b9fa6"
-    },
-    "status-warning-red"          : {
-      "name" : "status-warning-red",
-      "rule" : ".status-warning-red",
-      "hash" : "b15f61f314cbda5486d3aa21990153ae"
-    },
-    "status-warning-white"        : {
-      "name" : "status-warning-white",
-      "rule" : ".status-warning-white",
-      "hash" : "62ff8f6bf696e58f71eb4e1c6fe9b2e1"
-    }
-  },
-  "scales"  : [
-    1,
-    2
-  ],
-  "header"  : "\/**\n * @provides sprite-status-css\n * @generated\n *\/\n\n.sprite-status {\n  background-image: url(\/rsrc\/image\/sprite-status.png);\n  background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n  .sprite-status {\n    background-image: url(\/rsrc\/image\/sprite-status-X2.png);\n    background-size: {X}px {Y}px;\n  }\n}\n",
-  "type"    : "standard"
-}
diff --git a/resources/sprite/status_1x/accept-blue.png b/resources/sprite/status_1x/accept-blue.png
deleted file mode 100644
index c5aaaee5e7..0000000000
Binary files a/resources/sprite/status_1x/accept-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/accept-dark.png b/resources/sprite/status_1x/accept-dark.png
deleted file mode 100644
index d9da80853e..0000000000
Binary files a/resources/sprite/status_1x/accept-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/accept-green.png b/resources/sprite/status_1x/accept-green.png
deleted file mode 100644
index bc77971ab0..0000000000
Binary files a/resources/sprite/status_1x/accept-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/accept-red.png b/resources/sprite/status_1x/accept-red.png
deleted file mode 100644
index c9ffd1fbf9..0000000000
Binary files a/resources/sprite/status_1x/accept-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/accept-white.png b/resources/sprite/status_1x/accept-white.png
deleted file mode 100644
index baf7373e55..0000000000
Binary files a/resources/sprite/status_1x/accept-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/accept.png b/resources/sprite/status_1x/accept.png
deleted file mode 100644
index d6b555762c..0000000000
Binary files a/resources/sprite/status_1x/accept.png and /dev/null differ
diff --git a/resources/sprite/status_1x/add-blue.png b/resources/sprite/status_1x/add-blue.png
deleted file mode 100644
index f71e265f56..0000000000
Binary files a/resources/sprite/status_1x/add-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/add-dark.png b/resources/sprite/status_1x/add-dark.png
deleted file mode 100644
index 8a1d1125b0..0000000000
Binary files a/resources/sprite/status_1x/add-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/add-green.png b/resources/sprite/status_1x/add-green.png
deleted file mode 100644
index 423d9914a0..0000000000
Binary files a/resources/sprite/status_1x/add-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/add-red.png b/resources/sprite/status_1x/add-red.png
deleted file mode 100644
index 6ba9509074..0000000000
Binary files a/resources/sprite/status_1x/add-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/add-white.png b/resources/sprite/status_1x/add-white.png
deleted file mode 100644
index 00907c2434..0000000000
Binary files a/resources/sprite/status_1x/add-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/add.png b/resources/sprite/status_1x/add.png
deleted file mode 100644
index 1aabe0fdc7..0000000000
Binary files a/resources/sprite/status_1x/add.png and /dev/null differ
diff --git a/resources/sprite/status_1x/down-blue.png b/resources/sprite/status_1x/down-blue.png
deleted file mode 100644
index 7694510ab2..0000000000
Binary files a/resources/sprite/status_1x/down-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/down-dark.png b/resources/sprite/status_1x/down-dark.png
deleted file mode 100644
index 0266a88261..0000000000
Binary files a/resources/sprite/status_1x/down-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/down-green.png b/resources/sprite/status_1x/down-green.png
deleted file mode 100644
index 44eee1688b..0000000000
Binary files a/resources/sprite/status_1x/down-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/down-red.png b/resources/sprite/status_1x/down-red.png
deleted file mode 100644
index 019699cc9e..0000000000
Binary files a/resources/sprite/status_1x/down-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/down-white.png b/resources/sprite/status_1x/down-white.png
deleted file mode 100644
index 8aa0498bfc..0000000000
Binary files a/resources/sprite/status_1x/down-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/down.png b/resources/sprite/status_1x/down.png
deleted file mode 100644
index 468758b917..0000000000
Binary files a/resources/sprite/status_1x/down.png and /dev/null differ
diff --git a/resources/sprite/status_1x/info-blue.png b/resources/sprite/status_1x/info-blue.png
deleted file mode 100644
index c8d614ffde..0000000000
Binary files a/resources/sprite/status_1x/info-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/info-dark.png b/resources/sprite/status_1x/info-dark.png
deleted file mode 100644
index d4a73ec2d4..0000000000
Binary files a/resources/sprite/status_1x/info-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/info-green.png b/resources/sprite/status_1x/info-green.png
deleted file mode 100644
index 8ae658a401..0000000000
Binary files a/resources/sprite/status_1x/info-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/info-red.png b/resources/sprite/status_1x/info-red.png
deleted file mode 100644
index 61125d0eab..0000000000
Binary files a/resources/sprite/status_1x/info-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/info-white.png b/resources/sprite/status_1x/info-white.png
deleted file mode 100644
index e3e3a05b76..0000000000
Binary files a/resources/sprite/status_1x/info-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/info.png b/resources/sprite/status_1x/info.png
deleted file mode 100644
index 74f979b30b..0000000000
Binary files a/resources/sprite/status_1x/info.png and /dev/null differ
diff --git a/resources/sprite/status_1x/left-blue.png b/resources/sprite/status_1x/left-blue.png
deleted file mode 100644
index c3c3fe15d3..0000000000
Binary files a/resources/sprite/status_1x/left-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/left-dark.png b/resources/sprite/status_1x/left-dark.png
deleted file mode 100644
index 445d678c7d..0000000000
Binary files a/resources/sprite/status_1x/left-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/left-green.png b/resources/sprite/status_1x/left-green.png
deleted file mode 100644
index 389f94a260..0000000000
Binary files a/resources/sprite/status_1x/left-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/left-red.png b/resources/sprite/status_1x/left-red.png
deleted file mode 100644
index d9556fed8d..0000000000
Binary files a/resources/sprite/status_1x/left-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/left-white.png b/resources/sprite/status_1x/left-white.png
deleted file mode 100644
index c02ae7a57b..0000000000
Binary files a/resources/sprite/status_1x/left-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/left.png b/resources/sprite/status_1x/left.png
deleted file mode 100644
index 70d914dc2c..0000000000
Binary files a/resources/sprite/status_1x/left.png and /dev/null differ
diff --git a/resources/sprite/status_1x/minus-blue.png b/resources/sprite/status_1x/minus-blue.png
deleted file mode 100644
index 7c45c6a42c..0000000000
Binary files a/resources/sprite/status_1x/minus-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/minus-dark.png b/resources/sprite/status_1x/minus-dark.png
deleted file mode 100644
index e23ec95946..0000000000
Binary files a/resources/sprite/status_1x/minus-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/minus-green.png b/resources/sprite/status_1x/minus-green.png
deleted file mode 100644
index 9245c2c0b9..0000000000
Binary files a/resources/sprite/status_1x/minus-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/minus-red.png b/resources/sprite/status_1x/minus-red.png
deleted file mode 100644
index 0b2838ae98..0000000000
Binary files a/resources/sprite/status_1x/minus-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/minus-white.png b/resources/sprite/status_1x/minus-white.png
deleted file mode 100644
index f806c33e7a..0000000000
Binary files a/resources/sprite/status_1x/minus-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/minus.png b/resources/sprite/status_1x/minus.png
deleted file mode 100644
index 7494e59e41..0000000000
Binary files a/resources/sprite/status_1x/minus.png and /dev/null differ
diff --git a/resources/sprite/status_1x/oh-closed-dark.png b/resources/sprite/status_1x/oh-closed-dark.png
deleted file mode 100644
index a0c94e1ccc..0000000000
Binary files a/resources/sprite/status_1x/oh-closed-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/oh-closed.png b/resources/sprite/status_1x/oh-closed.png
deleted file mode 100644
index 830c8c354b..0000000000
Binary files a/resources/sprite/status_1x/oh-closed.png and /dev/null differ
diff --git a/resources/sprite/status_1x/oh-ok-dark.png b/resources/sprite/status_1x/oh-ok-dark.png
deleted file mode 100644
index ec25388c21..0000000000
Binary files a/resources/sprite/status_1x/oh-ok-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/oh-ok.png b/resources/sprite/status_1x/oh-ok.png
deleted file mode 100644
index d2ff96e2b6..0000000000
Binary files a/resources/sprite/status_1x/oh-ok.png and /dev/null differ
diff --git a/resources/sprite/status_1x/oh-open-green.png b/resources/sprite/status_1x/oh-open-green.png
deleted file mode 100644
index 7b7c57a9fb..0000000000
Binary files a/resources/sprite/status_1x/oh-open-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/oh-open-red.png b/resources/sprite/status_1x/oh-open-red.png
deleted file mode 100644
index 7bfa8ea0bb..0000000000
Binary files a/resources/sprite/status_1x/oh-open-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/oh-open.png b/resources/sprite/status_1x/oh-open.png
deleted file mode 100644
index 8422beb768..0000000000
Binary files a/resources/sprite/status_1x/oh-open.png and /dev/null differ
diff --git a/resources/sprite/status_1x/open-blue.png b/resources/sprite/status_1x/open-blue.png
deleted file mode 100644
index 0dc1658f0c..0000000000
Binary files a/resources/sprite/status_1x/open-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/open-dark.png b/resources/sprite/status_1x/open-dark.png
deleted file mode 100644
index 6a03b21ecc..0000000000
Binary files a/resources/sprite/status_1x/open-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/open-green.png b/resources/sprite/status_1x/open-green.png
deleted file mode 100644
index a9e09e71cc..0000000000
Binary files a/resources/sprite/status_1x/open-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/open-red.png b/resources/sprite/status_1x/open-red.png
deleted file mode 100644
index c45f11f247..0000000000
Binary files a/resources/sprite/status_1x/open-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/open-white.png b/resources/sprite/status_1x/open-white.png
deleted file mode 100644
index 8bd1d357b0..0000000000
Binary files a/resources/sprite/status_1x/open-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/open.png b/resources/sprite/status_1x/open.png
deleted file mode 100644
index 1dfc7e1515..0000000000
Binary files a/resources/sprite/status_1x/open.png and /dev/null differ
diff --git a/resources/sprite/status_1x/pl-summary.png b/resources/sprite/status_1x/pl-summary.png
deleted file mode 100644
index b2274ae85e..0000000000
Binary files a/resources/sprite/status_1x/pl-summary.png and /dev/null differ
diff --git a/resources/sprite/status_1x/pl-testplan.png b/resources/sprite/status_1x/pl-testplan.png
deleted file mode 100644
index 22ad223bef..0000000000
Binary files a/resources/sprite/status_1x/pl-testplan.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-admin-white.png b/resources/sprite/status_1x/policy-admin-white.png
deleted file mode 100644
index 48b9624c0d..0000000000
Binary files a/resources/sprite/status_1x/policy-admin-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-admin.png b/resources/sprite/status_1x/policy-admin.png
deleted file mode 100644
index fed46ed926..0000000000
Binary files a/resources/sprite/status_1x/policy-admin.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-all-white.png b/resources/sprite/status_1x/policy-all-white.png
deleted file mode 100644
index e84b9efebc..0000000000
Binary files a/resources/sprite/status_1x/policy-all-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-all.png b/resources/sprite/status_1x/policy-all.png
deleted file mode 100644
index 6a569525b7..0000000000
Binary files a/resources/sprite/status_1x/policy-all.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-custom-white.png b/resources/sprite/status_1x/policy-custom-white.png
deleted file mode 100644
index 909c69ce86..0000000000
Binary files a/resources/sprite/status_1x/policy-custom-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-custom.png b/resources/sprite/status_1x/policy-custom.png
deleted file mode 100644
index bc707edafe..0000000000
Binary files a/resources/sprite/status_1x/policy-custom.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-elist-white.png b/resources/sprite/status_1x/policy-elist-white.png
deleted file mode 100644
index 1d28e6c28f..0000000000
Binary files a/resources/sprite/status_1x/policy-elist-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-elist.png b/resources/sprite/status_1x/policy-elist.png
deleted file mode 100644
index 384482fc79..0000000000
Binary files a/resources/sprite/status_1x/policy-elist.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-noone-white.png b/resources/sprite/status_1x/policy-noone-white.png
deleted file mode 100644
index 8e89ad3c46..0000000000
Binary files a/resources/sprite/status_1x/policy-noone-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-noone.png b/resources/sprite/status_1x/policy-noone.png
deleted file mode 100644
index e018714976..0000000000
Binary files a/resources/sprite/status_1x/policy-noone.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-project-white.png b/resources/sprite/status_1x/policy-project-white.png
deleted file mode 100644
index 4e39cc3ab5..0000000000
Binary files a/resources/sprite/status_1x/policy-project-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-project.png b/resources/sprite/status_1x/policy-project.png
deleted file mode 100644
index 8d9582d3d0..0000000000
Binary files a/resources/sprite/status_1x/policy-project.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-public-white.png b/resources/sprite/status_1x/policy-public-white.png
deleted file mode 100644
index 5bc2f31947..0000000000
Binary files a/resources/sprite/status_1x/policy-public-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-public.png b/resources/sprite/status_1x/policy-public.png
deleted file mode 100644
index c54f47a7cd..0000000000
Binary files a/resources/sprite/status_1x/policy-public.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-unknown-white.png b/resources/sprite/status_1x/policy-unknown-white.png
deleted file mode 100644
index 28398a7b47..0000000000
Binary files a/resources/sprite/status_1x/policy-unknown-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-unknown.png b/resources/sprite/status_1x/policy-unknown.png
deleted file mode 100644
index b415a2466f..0000000000
Binary files a/resources/sprite/status_1x/policy-unknown.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-user-white.png b/resources/sprite/status_1x/policy-user-white.png
deleted file mode 100644
index 2b4ae43457..0000000000
Binary files a/resources/sprite/status_1x/policy-user-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-user.png b/resources/sprite/status_1x/policy-user.png
deleted file mode 100644
index 1a33858470..0000000000
Binary files a/resources/sprite/status_1x/policy-user.png and /dev/null differ
diff --git a/resources/sprite/status_1x/question-blue.png b/resources/sprite/status_1x/question-blue.png
deleted file mode 100644
index bc2fe4a772..0000000000
Binary files a/resources/sprite/status_1x/question-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/question-dark.png b/resources/sprite/status_1x/question-dark.png
deleted file mode 100644
index 5a77cebe3f..0000000000
Binary files a/resources/sprite/status_1x/question-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/question-green.png b/resources/sprite/status_1x/question-green.png
deleted file mode 100644
index 9f34c1841c..0000000000
Binary files a/resources/sprite/status_1x/question-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/question-red.png b/resources/sprite/status_1x/question-red.png
deleted file mode 100644
index ff11aae3cc..0000000000
Binary files a/resources/sprite/status_1x/question-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/question-white.png b/resources/sprite/status_1x/question-white.png
deleted file mode 100644
index 216e3a5886..0000000000
Binary files a/resources/sprite/status_1x/question-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/question.png b/resources/sprite/status_1x/question.png
deleted file mode 100644
index f0f9af275f..0000000000
Binary files a/resources/sprite/status_1x/question.png and /dev/null differ
diff --git a/resources/sprite/status_1x/reject-blue.png b/resources/sprite/status_1x/reject-blue.png
deleted file mode 100644
index f897017977..0000000000
Binary files a/resources/sprite/status_1x/reject-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/reject-dark.png b/resources/sprite/status_1x/reject-dark.png
deleted file mode 100644
index ad504aa387..0000000000
Binary files a/resources/sprite/status_1x/reject-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/reject-green.png b/resources/sprite/status_1x/reject-green.png
deleted file mode 100644
index ad76e62db2..0000000000
Binary files a/resources/sprite/status_1x/reject-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/reject-red.png b/resources/sprite/status_1x/reject-red.png
deleted file mode 100644
index 9105004062..0000000000
Binary files a/resources/sprite/status_1x/reject-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/reject-white.png b/resources/sprite/status_1x/reject-white.png
deleted file mode 100644
index 0caf704258..0000000000
Binary files a/resources/sprite/status_1x/reject-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/reject.png b/resources/sprite/status_1x/reject.png
deleted file mode 100644
index 6c534a58dc..0000000000
Binary files a/resources/sprite/status_1x/reject.png and /dev/null differ
diff --git a/resources/sprite/status_1x/right-blue.png b/resources/sprite/status_1x/right-blue.png
deleted file mode 100644
index 71529b7504..0000000000
Binary files a/resources/sprite/status_1x/right-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/right-dark.png b/resources/sprite/status_1x/right-dark.png
deleted file mode 100644
index bb13cf6512..0000000000
Binary files a/resources/sprite/status_1x/right-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/right-green.png b/resources/sprite/status_1x/right-green.png
deleted file mode 100644
index fe6112d53f..0000000000
Binary files a/resources/sprite/status_1x/right-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/right-red.png b/resources/sprite/status_1x/right-red.png
deleted file mode 100644
index 7deab4df2d..0000000000
Binary files a/resources/sprite/status_1x/right-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/right-white.png b/resources/sprite/status_1x/right-white.png
deleted file mode 100644
index 78e1037014..0000000000
Binary files a/resources/sprite/status_1x/right-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/right.png b/resources/sprite/status_1x/right.png
deleted file mode 100644
index d1ad9f2a4f..0000000000
Binary files a/resources/sprite/status_1x/right.png and /dev/null differ
diff --git a/resources/sprite/status_1x/time-green.png b/resources/sprite/status_1x/time-green.png
deleted file mode 100644
index d514ed6853..0000000000
Binary files a/resources/sprite/status_1x/time-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/time-orange.png b/resources/sprite/status_1x/time-orange.png
deleted file mode 100644
index 1acad2715c..0000000000
Binary files a/resources/sprite/status_1x/time-orange.png and /dev/null differ
diff --git a/resources/sprite/status_1x/time-red.png b/resources/sprite/status_1x/time-red.png
deleted file mode 100644
index 5271c9a2af..0000000000
Binary files a/resources/sprite/status_1x/time-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/time-yellow.png b/resources/sprite/status_1x/time-yellow.png
deleted file mode 100644
index 0ed680ede4..0000000000
Binary files a/resources/sprite/status_1x/time-yellow.png and /dev/null differ
diff --git a/resources/sprite/status_1x/up-blue.png b/resources/sprite/status_1x/up-blue.png
deleted file mode 100644
index 5b9ad0bc76..0000000000
Binary files a/resources/sprite/status_1x/up-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/up-dark.png b/resources/sprite/status_1x/up-dark.png
deleted file mode 100644
index 05e7fd15c5..0000000000
Binary files a/resources/sprite/status_1x/up-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/up-green.png b/resources/sprite/status_1x/up-green.png
deleted file mode 100644
index c66ba2fd12..0000000000
Binary files a/resources/sprite/status_1x/up-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/up-red.png b/resources/sprite/status_1x/up-red.png
deleted file mode 100644
index ed73bffcd8..0000000000
Binary files a/resources/sprite/status_1x/up-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/up-white.png b/resources/sprite/status_1x/up-white.png
deleted file mode 100644
index d19bbf90f5..0000000000
Binary files a/resources/sprite/status_1x/up-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/up.png b/resources/sprite/status_1x/up.png
deleted file mode 100644
index 33d69869c4..0000000000
Binary files a/resources/sprite/status_1x/up.png and /dev/null differ
diff --git a/resources/sprite/status_1x/warning-blue.png b/resources/sprite/status_1x/warning-blue.png
deleted file mode 100644
index c3cc0625d3..0000000000
Binary files a/resources/sprite/status_1x/warning-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/warning-dark.png b/resources/sprite/status_1x/warning-dark.png
deleted file mode 100644
index 33de2b39ff..0000000000
Binary files a/resources/sprite/status_1x/warning-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/warning-green.png b/resources/sprite/status_1x/warning-green.png
deleted file mode 100644
index df2d007d07..0000000000
Binary files a/resources/sprite/status_1x/warning-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/warning-red.png b/resources/sprite/status_1x/warning-red.png
deleted file mode 100644
index eefd44cc42..0000000000
Binary files a/resources/sprite/status_1x/warning-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/warning-white.png b/resources/sprite/status_1x/warning-white.png
deleted file mode 100644
index ce515d61e4..0000000000
Binary files a/resources/sprite/status_1x/warning-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/warning.png b/resources/sprite/status_1x/warning.png
deleted file mode 100644
index 755960355d..0000000000
Binary files a/resources/sprite/status_1x/warning.png and /dev/null differ
diff --git a/resources/sprite/status_2x/accept-blue.png b/resources/sprite/status_2x/accept-blue.png
deleted file mode 100644
index 6b1586deb4..0000000000
Binary files a/resources/sprite/status_2x/accept-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/accept-dark.png b/resources/sprite/status_2x/accept-dark.png
deleted file mode 100644
index 587d9af04d..0000000000
Binary files a/resources/sprite/status_2x/accept-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/accept-green.png b/resources/sprite/status_2x/accept-green.png
deleted file mode 100644
index 9f681f26bc..0000000000
Binary files a/resources/sprite/status_2x/accept-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/accept-red.png b/resources/sprite/status_2x/accept-red.png
deleted file mode 100644
index 509273d5bb..0000000000
Binary files a/resources/sprite/status_2x/accept-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/accept-white.png b/resources/sprite/status_2x/accept-white.png
deleted file mode 100644
index 39efb34925..0000000000
Binary files a/resources/sprite/status_2x/accept-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/accept.png b/resources/sprite/status_2x/accept.png
deleted file mode 100644
index 3afd5e68da..0000000000
Binary files a/resources/sprite/status_2x/accept.png and /dev/null differ
diff --git a/resources/sprite/status_2x/add-blue.png b/resources/sprite/status_2x/add-blue.png
deleted file mode 100644
index 0edbb5db84..0000000000
Binary files a/resources/sprite/status_2x/add-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/add-dark.png b/resources/sprite/status_2x/add-dark.png
deleted file mode 100644
index e3533fa0f7..0000000000
Binary files a/resources/sprite/status_2x/add-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/add-green.png b/resources/sprite/status_2x/add-green.png
deleted file mode 100644
index 8eb93e897e..0000000000
Binary files a/resources/sprite/status_2x/add-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/add-red.png b/resources/sprite/status_2x/add-red.png
deleted file mode 100644
index e2ee8ba48d..0000000000
Binary files a/resources/sprite/status_2x/add-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/add-white.png b/resources/sprite/status_2x/add-white.png
deleted file mode 100644
index 71ad766187..0000000000
Binary files a/resources/sprite/status_2x/add-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/add.png b/resources/sprite/status_2x/add.png
deleted file mode 100644
index 75504bbb7d..0000000000
Binary files a/resources/sprite/status_2x/add.png and /dev/null differ
diff --git a/resources/sprite/status_2x/down-blue.png b/resources/sprite/status_2x/down-blue.png
deleted file mode 100644
index 185512d5cb..0000000000
Binary files a/resources/sprite/status_2x/down-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/down-dark.png b/resources/sprite/status_2x/down-dark.png
deleted file mode 100644
index 5e6d2f48fd..0000000000
Binary files a/resources/sprite/status_2x/down-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/down-green.png b/resources/sprite/status_2x/down-green.png
deleted file mode 100644
index 99a5ad61b3..0000000000
Binary files a/resources/sprite/status_2x/down-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/down-red.png b/resources/sprite/status_2x/down-red.png
deleted file mode 100644
index fc36c023dd..0000000000
Binary files a/resources/sprite/status_2x/down-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/down-white.png b/resources/sprite/status_2x/down-white.png
deleted file mode 100644
index 9a419a3a21..0000000000
Binary files a/resources/sprite/status_2x/down-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/down.png b/resources/sprite/status_2x/down.png
deleted file mode 100644
index b0b6bcfd55..0000000000
Binary files a/resources/sprite/status_2x/down.png and /dev/null differ
diff --git a/resources/sprite/status_2x/info-blue.png b/resources/sprite/status_2x/info-blue.png
deleted file mode 100644
index 92933a4eb7..0000000000
Binary files a/resources/sprite/status_2x/info-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/info-dark.png b/resources/sprite/status_2x/info-dark.png
deleted file mode 100644
index ab82a1951a..0000000000
Binary files a/resources/sprite/status_2x/info-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/info-green.png b/resources/sprite/status_2x/info-green.png
deleted file mode 100644
index 5913448a32..0000000000
Binary files a/resources/sprite/status_2x/info-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/info-red.png b/resources/sprite/status_2x/info-red.png
deleted file mode 100644
index 3571889bbe..0000000000
Binary files a/resources/sprite/status_2x/info-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/info-white.png b/resources/sprite/status_2x/info-white.png
deleted file mode 100644
index 8ef1aa7c09..0000000000
Binary files a/resources/sprite/status_2x/info-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/info.png b/resources/sprite/status_2x/info.png
deleted file mode 100644
index fc5f921a6a..0000000000
Binary files a/resources/sprite/status_2x/info.png and /dev/null differ
diff --git a/resources/sprite/status_2x/left-blue.png b/resources/sprite/status_2x/left-blue.png
deleted file mode 100644
index 297f594d89..0000000000
Binary files a/resources/sprite/status_2x/left-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/left-dark.png b/resources/sprite/status_2x/left-dark.png
deleted file mode 100644
index 34aef33b96..0000000000
Binary files a/resources/sprite/status_2x/left-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/left-green.png b/resources/sprite/status_2x/left-green.png
deleted file mode 100644
index 54c91f81b5..0000000000
Binary files a/resources/sprite/status_2x/left-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/left-red.png b/resources/sprite/status_2x/left-red.png
deleted file mode 100644
index ba9aa0e110..0000000000
Binary files a/resources/sprite/status_2x/left-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/left-white.png b/resources/sprite/status_2x/left-white.png
deleted file mode 100644
index a102b2f88d..0000000000
Binary files a/resources/sprite/status_2x/left-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/left.png b/resources/sprite/status_2x/left.png
deleted file mode 100644
index 871efb2c64..0000000000
Binary files a/resources/sprite/status_2x/left.png and /dev/null differ
diff --git a/resources/sprite/status_2x/minus-blue.png b/resources/sprite/status_2x/minus-blue.png
deleted file mode 100644
index 317ffed54f..0000000000
Binary files a/resources/sprite/status_2x/minus-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/minus-dark.png b/resources/sprite/status_2x/minus-dark.png
deleted file mode 100644
index f72b136956..0000000000
Binary files a/resources/sprite/status_2x/minus-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/minus-green.png b/resources/sprite/status_2x/minus-green.png
deleted file mode 100644
index ccb0efbb4a..0000000000
Binary files a/resources/sprite/status_2x/minus-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/minus-red.png b/resources/sprite/status_2x/minus-red.png
deleted file mode 100644
index f5e10318c6..0000000000
Binary files a/resources/sprite/status_2x/minus-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/minus-white.png b/resources/sprite/status_2x/minus-white.png
deleted file mode 100644
index ebcf13044e..0000000000
Binary files a/resources/sprite/status_2x/minus-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/minus.png b/resources/sprite/status_2x/minus.png
deleted file mode 100644
index 907cf18277..0000000000
Binary files a/resources/sprite/status_2x/minus.png and /dev/null differ
diff --git a/resources/sprite/status_2x/oh-closed-dark.png b/resources/sprite/status_2x/oh-closed-dark.png
deleted file mode 100644
index a88885ccff..0000000000
Binary files a/resources/sprite/status_2x/oh-closed-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/oh-closed.png b/resources/sprite/status_2x/oh-closed.png
deleted file mode 100644
index 7c57c4d1e8..0000000000
Binary files a/resources/sprite/status_2x/oh-closed.png and /dev/null differ
diff --git a/resources/sprite/status_2x/oh-ok-dark.png b/resources/sprite/status_2x/oh-ok-dark.png
deleted file mode 100644
index f7437a7e53..0000000000
Binary files a/resources/sprite/status_2x/oh-ok-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/oh-ok.png b/resources/sprite/status_2x/oh-ok.png
deleted file mode 100644
index 01d3a24747..0000000000
Binary files a/resources/sprite/status_2x/oh-ok.png and /dev/null differ
diff --git a/resources/sprite/status_2x/oh-open-green.png b/resources/sprite/status_2x/oh-open-green.png
deleted file mode 100644
index 2eb2b250a2..0000000000
Binary files a/resources/sprite/status_2x/oh-open-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/oh-open-red.png b/resources/sprite/status_2x/oh-open-red.png
deleted file mode 100644
index 198a3ff18a..0000000000
Binary files a/resources/sprite/status_2x/oh-open-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/oh-open.png b/resources/sprite/status_2x/oh-open.png
deleted file mode 100644
index 50786bcd21..0000000000
Binary files a/resources/sprite/status_2x/oh-open.png and /dev/null differ
diff --git a/resources/sprite/status_2x/open-blue.png b/resources/sprite/status_2x/open-blue.png
deleted file mode 100644
index 5a68c026f4..0000000000
Binary files a/resources/sprite/status_2x/open-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/open-dark.png b/resources/sprite/status_2x/open-dark.png
deleted file mode 100644
index 2f06ccf4e9..0000000000
Binary files a/resources/sprite/status_2x/open-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/open-green.png b/resources/sprite/status_2x/open-green.png
deleted file mode 100644
index 4e90c62d35..0000000000
Binary files a/resources/sprite/status_2x/open-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/open-red.png b/resources/sprite/status_2x/open-red.png
deleted file mode 100644
index 8c7fe4b8a0..0000000000
Binary files a/resources/sprite/status_2x/open-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/open-white.png b/resources/sprite/status_2x/open-white.png
deleted file mode 100644
index de5b7d226c..0000000000
Binary files a/resources/sprite/status_2x/open-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/open.png b/resources/sprite/status_2x/open.png
deleted file mode 100644
index cc2cd21d7f..0000000000
Binary files a/resources/sprite/status_2x/open.png and /dev/null differ
diff --git a/resources/sprite/status_2x/pl-summary.png b/resources/sprite/status_2x/pl-summary.png
deleted file mode 100644
index 0a8e863c88..0000000000
Binary files a/resources/sprite/status_2x/pl-summary.png and /dev/null differ
diff --git a/resources/sprite/status_2x/pl-testplan.png b/resources/sprite/status_2x/pl-testplan.png
deleted file mode 100644
index 3f9613fe5b..0000000000
Binary files a/resources/sprite/status_2x/pl-testplan.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-admin-white.png b/resources/sprite/status_2x/policy-admin-white.png
deleted file mode 100644
index c09d9c305f..0000000000
Binary files a/resources/sprite/status_2x/policy-admin-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-admin.png b/resources/sprite/status_2x/policy-admin.png
deleted file mode 100644
index 8421b277dc..0000000000
Binary files a/resources/sprite/status_2x/policy-admin.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-all-white.png b/resources/sprite/status_2x/policy-all-white.png
deleted file mode 100644
index fe00c57c2a..0000000000
Binary files a/resources/sprite/status_2x/policy-all-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-all.png b/resources/sprite/status_2x/policy-all.png
deleted file mode 100644
index 42053e8528..0000000000
Binary files a/resources/sprite/status_2x/policy-all.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-custom-white.png b/resources/sprite/status_2x/policy-custom-white.png
deleted file mode 100644
index 450137cb61..0000000000
Binary files a/resources/sprite/status_2x/policy-custom-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-custom.png b/resources/sprite/status_2x/policy-custom.png
deleted file mode 100644
index 64a67fe0a8..0000000000
Binary files a/resources/sprite/status_2x/policy-custom.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-elist-white.png b/resources/sprite/status_2x/policy-elist-white.png
deleted file mode 100644
index 852310a56c..0000000000
Binary files a/resources/sprite/status_2x/policy-elist-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-elist.png b/resources/sprite/status_2x/policy-elist.png
deleted file mode 100644
index a1ce7c050f..0000000000
Binary files a/resources/sprite/status_2x/policy-elist.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-noone-white.png b/resources/sprite/status_2x/policy-noone-white.png
deleted file mode 100644
index 219a67bbd3..0000000000
Binary files a/resources/sprite/status_2x/policy-noone-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-noone.png b/resources/sprite/status_2x/policy-noone.png
deleted file mode 100644
index 4b11d3f01f..0000000000
Binary files a/resources/sprite/status_2x/policy-noone.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-project-white.png b/resources/sprite/status_2x/policy-project-white.png
deleted file mode 100644
index 8289755fdb..0000000000
Binary files a/resources/sprite/status_2x/policy-project-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-project.png b/resources/sprite/status_2x/policy-project.png
deleted file mode 100644
index 4d777ca0b0..0000000000
Binary files a/resources/sprite/status_2x/policy-project.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-public-white.png b/resources/sprite/status_2x/policy-public-white.png
deleted file mode 100644
index 719c0fd44f..0000000000
Binary files a/resources/sprite/status_2x/policy-public-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-public.png b/resources/sprite/status_2x/policy-public.png
deleted file mode 100644
index 339c8dbc2a..0000000000
Binary files a/resources/sprite/status_2x/policy-public.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-unknown-white.png b/resources/sprite/status_2x/policy-unknown-white.png
deleted file mode 100644
index a3f73a38d1..0000000000
Binary files a/resources/sprite/status_2x/policy-unknown-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-unknown.png b/resources/sprite/status_2x/policy-unknown.png
deleted file mode 100644
index d6df5f1a1a..0000000000
Binary files a/resources/sprite/status_2x/policy-unknown.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-user-white.png b/resources/sprite/status_2x/policy-user-white.png
deleted file mode 100644
index 913c892356..0000000000
Binary files a/resources/sprite/status_2x/policy-user-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-user.png b/resources/sprite/status_2x/policy-user.png
deleted file mode 100644
index 3d6fcf050b..0000000000
Binary files a/resources/sprite/status_2x/policy-user.png and /dev/null differ
diff --git a/resources/sprite/status_2x/question-blue.png b/resources/sprite/status_2x/question-blue.png
deleted file mode 100644
index d9fdd76b7a..0000000000
Binary files a/resources/sprite/status_2x/question-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/question-dark.png b/resources/sprite/status_2x/question-dark.png
deleted file mode 100644
index c53f443d91..0000000000
Binary files a/resources/sprite/status_2x/question-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/question-green.png b/resources/sprite/status_2x/question-green.png
deleted file mode 100644
index 5107b89154..0000000000
Binary files a/resources/sprite/status_2x/question-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/question-red.png b/resources/sprite/status_2x/question-red.png
deleted file mode 100644
index 068a369390..0000000000
Binary files a/resources/sprite/status_2x/question-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/question-white.png b/resources/sprite/status_2x/question-white.png
deleted file mode 100644
index c1caf7419f..0000000000
Binary files a/resources/sprite/status_2x/question-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/question.png b/resources/sprite/status_2x/question.png
deleted file mode 100644
index 7e187f357d..0000000000
Binary files a/resources/sprite/status_2x/question.png and /dev/null differ
diff --git a/resources/sprite/status_2x/reject-blue.png b/resources/sprite/status_2x/reject-blue.png
deleted file mode 100644
index 8789cd9be2..0000000000
Binary files a/resources/sprite/status_2x/reject-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/reject-dark.png b/resources/sprite/status_2x/reject-dark.png
deleted file mode 100644
index c1991c6eb9..0000000000
Binary files a/resources/sprite/status_2x/reject-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/reject-green.png b/resources/sprite/status_2x/reject-green.png
deleted file mode 100644
index 7f49eebad0..0000000000
Binary files a/resources/sprite/status_2x/reject-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/reject-red.png b/resources/sprite/status_2x/reject-red.png
deleted file mode 100644
index e0f29d1bf3..0000000000
Binary files a/resources/sprite/status_2x/reject-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/reject-white.png b/resources/sprite/status_2x/reject-white.png
deleted file mode 100644
index ff7a314ae5..0000000000
Binary files a/resources/sprite/status_2x/reject-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/reject.png b/resources/sprite/status_2x/reject.png
deleted file mode 100644
index 06a90b023d..0000000000
Binary files a/resources/sprite/status_2x/reject.png and /dev/null differ
diff --git a/resources/sprite/status_2x/right-blue.png b/resources/sprite/status_2x/right-blue.png
deleted file mode 100644
index 81be3ae7e9..0000000000
Binary files a/resources/sprite/status_2x/right-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/right-dark.png b/resources/sprite/status_2x/right-dark.png
deleted file mode 100644
index ae92e97193..0000000000
Binary files a/resources/sprite/status_2x/right-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/right-green.png b/resources/sprite/status_2x/right-green.png
deleted file mode 100644
index d7290b18d5..0000000000
Binary files a/resources/sprite/status_2x/right-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/right-red.png b/resources/sprite/status_2x/right-red.png
deleted file mode 100644
index 3f1d48e223..0000000000
Binary files a/resources/sprite/status_2x/right-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/right-white.png b/resources/sprite/status_2x/right-white.png
deleted file mode 100644
index 0261cc0784..0000000000
Binary files a/resources/sprite/status_2x/right-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/right.png b/resources/sprite/status_2x/right.png
deleted file mode 100644
index 06190d0d1b..0000000000
Binary files a/resources/sprite/status_2x/right.png and /dev/null differ
diff --git a/resources/sprite/status_2x/time-green.png b/resources/sprite/status_2x/time-green.png
deleted file mode 100644
index 65ea095bd3..0000000000
Binary files a/resources/sprite/status_2x/time-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/time-orange.png b/resources/sprite/status_2x/time-orange.png
deleted file mode 100644
index 14ddd5f45f..0000000000
Binary files a/resources/sprite/status_2x/time-orange.png and /dev/null differ
diff --git a/resources/sprite/status_2x/time-red.png b/resources/sprite/status_2x/time-red.png
deleted file mode 100644
index 118dc561f2..0000000000
Binary files a/resources/sprite/status_2x/time-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/time-yellow.png b/resources/sprite/status_2x/time-yellow.png
deleted file mode 100644
index 7735d549bd..0000000000
Binary files a/resources/sprite/status_2x/time-yellow.png and /dev/null differ
diff --git a/resources/sprite/status_2x/up-blue.png b/resources/sprite/status_2x/up-blue.png
deleted file mode 100644
index ed96bd604a..0000000000
Binary files a/resources/sprite/status_2x/up-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/up-dark.png b/resources/sprite/status_2x/up-dark.png
deleted file mode 100644
index 1f43a5a127..0000000000
Binary files a/resources/sprite/status_2x/up-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/up-green.png b/resources/sprite/status_2x/up-green.png
deleted file mode 100644
index 4406e3496b..0000000000
Binary files a/resources/sprite/status_2x/up-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/up-red.png b/resources/sprite/status_2x/up-red.png
deleted file mode 100644
index 262c6730ec..0000000000
Binary files a/resources/sprite/status_2x/up-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/up-white.png b/resources/sprite/status_2x/up-white.png
deleted file mode 100644
index f59b378c14..0000000000
Binary files a/resources/sprite/status_2x/up-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/up.png b/resources/sprite/status_2x/up.png
deleted file mode 100644
index 24dea011c9..0000000000
Binary files a/resources/sprite/status_2x/up.png and /dev/null differ
diff --git a/resources/sprite/status_2x/warning-blue.png b/resources/sprite/status_2x/warning-blue.png
deleted file mode 100644
index 5a88becb1e..0000000000
Binary files a/resources/sprite/status_2x/warning-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/warning-dark.png b/resources/sprite/status_2x/warning-dark.png
deleted file mode 100644
index 4b1eb3dee8..0000000000
Binary files a/resources/sprite/status_2x/warning-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/warning-green.png b/resources/sprite/status_2x/warning-green.png
deleted file mode 100644
index 3ec7ec00f6..0000000000
Binary files a/resources/sprite/status_2x/warning-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/warning-red.png b/resources/sprite/status_2x/warning-red.png
deleted file mode 100644
index ad3c2d036c..0000000000
Binary files a/resources/sprite/status_2x/warning-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/warning-white.png b/resources/sprite/status_2x/warning-white.png
deleted file mode 100644
index 52814bc4af..0000000000
Binary files a/resources/sprite/status_2x/warning-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/warning.png b/resources/sprite/status_2x/warning.png
deleted file mode 100644
index baa2144ba6..0000000000
Binary files a/resources/sprite/status_2x/warning.png and /dev/null differ
diff --git a/scripts/celerity/generate_sprites.php b/scripts/celerity/generate_sprites.php
index 55574cfa54..4d75c97bda 100755
--- a/scripts/celerity/generate_sprites.php
+++ b/scripts/celerity/generate_sprites.php
@@ -1,94 +1,93 @@
 #!/usr/bin/env php
 <?php
 
 require_once dirname(dirname(__FILE__)).'/__init_script__.php';
 
 $args = new PhutilArgumentParser($argv);
 $args->setTagline('regenerate CSS sprite sheets');
 $args->setSynopsis(<<<EOHELP
 **sprites**
     Rebuild CSS sprite sheets.
 
 EOHELP
 );
 $args->parseStandardArguments();
 $args->parse(
   array(
     array(
       'name'  => 'force',
       'help'  => 'Force regeneration even if sources have not changed.',
     ),
   ));
 
 $root = dirname(phutil_get_library_root('phabricator'));
 $webroot = $root.'/webroot/rsrc';
 $webroot = Filesystem::readablePath($webroot);
 
 $generator = new CeleritySpriteGenerator();
 
 $sheets = array(
   'remarkup' => $generator->buildRemarkupSheet(),
   'menu' => $generator->buildMenuSheet(),
   'apps' => $generator->buildAppsSheet(),
   'actions' => $generator->buildActionsSheet(),
   'minicons' => $generator->buildMiniconsSheet(),
   'conpherence' => $generator->buildConpherenceSheet(),
   'apps-large' => $generator->buildAppsLargeSheet(),
   'payments' => $generator->buildPaymentsSheet(),
   'tokens' => $generator->buildTokenSheet(),
   'buttonbar' => $generator->buildButtonBarSheet(),
   'docs' => $generator->buildDocsSheet(),
   'gradient' => $generator->buildGradientSheet(),
   'main-header' => $generator->buildMainHeaderSheet(),
   'login' => $generator->buildLoginSheet(),
-  'status' => $generator->buildStatusSheet(),
   'projects' => $generator->buildProjectsSheet(),
 );
 
 list($err) = exec_manual('optipng');
 if ($err) {
   $have_optipng = false;
   echo phutil_console_format(
     "<bg:red> WARNING </bg> `optipng` not found in PATH.\n".
     "Sprites will not be optimized! Install `optipng`!\n");
 } else {
   $have_optipng = true;
 }
 
 foreach ($sheets as $name => $sheet) {
 
   $sheet->setBasePath($root);
 
   $manifest_path = $root.'/resources/sprite/manifest/'.$name.'.json';
   if (!$args->getArg('force')) {
     if (Filesystem::pathExists($manifest_path)) {
       $data = Filesystem::readFile($manifest_path);
       $data = json_decode($data, true);
       if (!$sheet->needsRegeneration($data)) {
         continue;
       }
     }
   }
 
   $sheet
     ->generateCSS($webroot."/css/sprite-{$name}.css")
     ->generateManifest($root."/resources/sprite/manifest/{$name}.json");
 
   foreach ($sheet->getScales() as $scale) {
     if ($scale == 1) {
       $sheet_name = "sprite-{$name}.png";
     } else {
       $sheet_name = "sprite-{$name}-X{$scale}.png";
     }
 
     $full_path = "{$webroot}/image/{$sheet_name}";
     $sheet->generateImage($full_path, $scale);
 
     if ($have_optipng) {
       echo "Optimizing...\n";
       phutil_passthru('optipng -o7 -clobber %s', $full_path);
     }
   }
 }
 
 echo "Done.\n";
diff --git a/src/applications/conpherence/view/ConpherenceLayoutView.php b/src/applications/conpherence/view/ConpherenceLayoutView.php
index 877559f3a1..3bd75347d8 100644
--- a/src/applications/conpherence/view/ConpherenceLayoutView.php
+++ b/src/applications/conpherence/view/ConpherenceLayoutView.php
@@ -1,239 +1,239 @@
 <?php
 
 final class ConpherenceLayoutView extends AphrontView {
 
   private $thread;
   private $baseURI;
   private $threadView;
   private $role;
   private $header;
   private $messages;
   private $replyForm;
 
   public function setMessages($messages) {
     $this->messages = $messages;
     return $this;
   }
 
   public function setReplyForm($reply_form) {
     $this->replyForm = $reply_form;
     return $this;
   }
 
   public function setHeader($header) {
     $this->header = $header;
     return $this;
   }
 
   public function setRole($role) {
     $this->role = $role;
     return $this;
   }
 
   public function getThreadView() {
     return $this->threadView;
   }
 
   public function setBaseURI($base_uri) {
     $this->baseURI = $base_uri;
     return $this;
   }
 
   public function setThread(ConpherenceThread $thread) {
     $this->thread = $thread;
     return $this;
   }
 
   public function setThreadView(ConpherenceThreadListView $thead_view) {
     $this->threadView = $thead_view;
     return $this;
   }
 
   public function render() {
     require_celerity_resource('conpherence-menu-css');
     require_celerity_resource('conpherence-message-pane-css');
     require_celerity_resource('conpherence-widget-pane-css');
 
     $layout_id = celerity_generate_unique_node_id();
 
     $selected_id = null;
     $selected_thread_id = null;
     if ($this->thread) {
       $selected_id = $this->thread->getPHID() . '-nav-item';
       $selected_thread_id = $this->thread->getID();
     }
     $this->initBehavior('conpherence-menu',
       array(
         'baseURI' => $this->baseURI,
         'layoutID' => $layout_id,
         'selectedID' => $selected_id,
         'selectedThreadID' => $selected_thread_id,
         'role' => $this->role,
         'hasThreadList' => (bool)$this->threadView,
         'hasThread' => (bool)$this->messages,
         'hasWidgets' => false,
       ));
 
     $this->initBehavior(
       'conpherence-widget-pane',
       array(
         'widgetBaseUpdateURI' => $this->baseURI . 'update/',
         'widgetRegistry' => array(
           'conpherence-message-pane' => array(
             'name' => pht('Thread'),
-            'icon' => 'comment',
+            'icon' => 'fa-comment',
             'deviceOnly' => true,
             'hasCreate' => false
           ),
           'widgets-people' => array(
             'name' => pht('Participants'),
-            'icon' => 'user',
+            'icon' => 'fa-users',
             'deviceOnly' => false,
             'hasCreate' => true,
             'createData' => array(
               'refreshFromResponse' => true,
               'action' => ConpherenceUpdateActions::ADD_PERSON,
               'customHref' => null
             )
           ),
           'widgets-files' => array(
             'name' => pht('Files'),
-            'icon' => 'file',
+            'icon' => 'fa-files-o',
             'deviceOnly' => false,
             'hasCreate' => false
           ),
           'widgets-calendar' => array(
             'name' => pht('Calendar'),
-            'icon' => 'calendar',
+            'icon' => 'fa-calendar',
             'deviceOnly' => false,
             'hasCreate' => true,
             'createData' => array(
               'refreshFromResponse' => false,
               'action' => ConpherenceUpdateActions::ADD_STATUS,
               'customHref' => '/calendar/event/create/'
             )
           ),
           'widgets-settings' => array(
             'name' => pht('Settings'),
-            'icon' => 'wrench',
+            'icon' => 'fa-wrench',
             'deviceOnly' => false,
             'hasCreate' => false
           ),
         )));
 
 
     return javelin_tag(
       'div',
       array(
         'id'    => $layout_id,
         'sigil' => 'conpherence-layout',
         'class' => 'conpherence-layout conpherence-role-'.$this->role,
       ),
       array(
         javelin_tag(
           'div',
           array(
             'class' => 'phabricator-nav-column-background',
             'sigil' => 'phabricator-nav-column-background',
           ),
           ''),
         javelin_tag(
           'div',
           array(
             'id' => 'conpherence-menu-pane',
             'class' => 'conpherence-menu-pane phabricator-side-menu',
             'sigil' => 'conpherence-menu-pane',
           ),
           $this->threadView),
         javelin_tag(
           'div',
           array(
             'class' => 'conpherence-content-pane',
           ),
           array(
             javelin_tag(
               'div',
               array(
                 'class' => 'conpherence-header-pane',
                 'id' => 'conpherence-header-pane',
                 'sigil' => 'conpherence-header-pane',
               ),
               nonempty($this->header, '')),
             javelin_tag(
               'div',
               array(
                 'class' => 'conpherence-no-threads',
                 'sigil' => 'conpherence-no-threads',
                 'style' => 'display: none;',
               ),
               array(
                 phutil_tag(
                   'div',
                   array(
                     'class' => 'text'
                   ),
                   pht('You do not have any messages yet.')),
                 javelin_tag(
                   'a',
                   array(
                     'href' => '/conpherence/new/',
                     'class' => 'button grey',
                     'sigil' => 'workflow',
                   ),
                   pht('Send a Message'))
             )),
             javelin_tag(
               'div',
               array(
                 'class' => 'conpherence-widget-pane',
                 'id' => 'conpherence-widget-pane',
                 'sigil' => 'conpherence-widget-pane',
               ),
               array(
                 phutil_tag(
                   'div',
                   array(
                     'class' => 'widgets-loading-mask'
                   ),
                   ''),
                 javelin_tag(
                   'div',
                   array(
                     'sigil' => 'conpherence-widgets-holder'
                   ),
                   ''))),
             javelin_tag(
               'div',
               array(
                 'class' => 'conpherence-message-pane',
                 'id' => 'conpherence-message-pane',
                 'sigil' => 'conpherence-message-pane'
               ),
               array(
                 javelin_tag(
                   'div',
                   array(
                     'class' => 'conpherence-messages',
                     'id' => 'conpherence-messages',
                     'sigil' => 'conpherence-messages',
                   ),
                   nonempty($this->messages, '')),
                 phutil_tag(
                   'div',
                   array(
                     'class' => 'messages-loading-mask',
                   ),
                   ''),
                 javelin_tag(
                   'div',
                   array(
                     'id' => 'conpherence-form',
                     'sigil' => 'conpherence-form'
                   ),
                   nonempty($this->replyForm, ''))
               )),
           )),
       ));
   }
 
 }
diff --git a/src/applications/differential/constants/DifferentialRevisionStatus.php b/src/applications/differential/constants/DifferentialRevisionStatus.php
index 64a330dc7e..61340d0111 100644
--- a/src/applications/differential/constants/DifferentialRevisionStatus.php
+++ b/src/applications/differential/constants/DifferentialRevisionStatus.php
@@ -1,115 +1,114 @@
 <?php
 
 /**
  * NOTE: you probably want {@class:ArcanistDifferentialRevisionStatus}.
  * This class just contains a mapping for color within the Differential
  * application.
  */
 
 final class DifferentialRevisionStatus {
 
   const COLOR_STATUS_DEFAULT = 'status';
   const COLOR_STATUS_DARK = 'status-dark';
   const COLOR_STATUS_GREEN = 'status-green';
   const COLOR_STATUS_RED = 'status-red';
 
   public static function getRevisionStatusColor($status) {
     $default = self::COLOR_STATUS_DEFAULT;
 
     $map = array(
       ArcanistDifferentialRevisionStatus::NEEDS_REVIEW   =>
         self::COLOR_STATUS_DEFAULT,
       ArcanistDifferentialRevisionStatus::NEEDS_REVISION =>
         self::COLOR_STATUS_RED,
       ArcanistDifferentialRevisionStatus::CHANGES_PLANNED =>
         self::COLOR_STATUS_RED,
       ArcanistDifferentialRevisionStatus::ACCEPTED       =>
         self::COLOR_STATUS_GREEN,
       ArcanistDifferentialRevisionStatus::CLOSED         =>
         self::COLOR_STATUS_DARK,
       ArcanistDifferentialRevisionStatus::ABANDONED      =>
         self::COLOR_STATUS_DARK,
       ArcanistDifferentialRevisionStatus::IN_PREPARATION =>
         self::COLOR_STATUS_DARK,
     );
     return idx($map, $status, $default);
   }
 
   public static function getRevisionStatusIcon($status) {
-    $default = 'oh-open';
+    $default = 'fa-square-o bluegrey';
 
     $map = array(
       ArcanistDifferentialRevisionStatus::NEEDS_REVIEW   =>
-        'oh-open',
+        'fa-square-o bluegrey',
       ArcanistDifferentialRevisionStatus::NEEDS_REVISION =>
-        'oh-open-red',
+        'fa-square-o red',
       ArcanistDifferentialRevisionStatus::CHANGES_PLANNED =>
-        'oh-open-red',
+        'fa-square-o red',
       ArcanistDifferentialRevisionStatus::ACCEPTED       =>
-        'oh-open-green',
+        'fa-square-o green',
       ArcanistDifferentialRevisionStatus::CLOSED         =>
-        'oh-closed-dark',
+        'fa-check-square-o',
       ArcanistDifferentialRevisionStatus::ABANDONED      =>
-        'oh-closed-dark',
+        'fa-check-square-o',
       ArcanistDifferentialRevisionStatus::IN_PREPARATION =>
-        'question-blue',
+        'fa-question-circle blue',
     );
     return idx($map, $status, $default);
   }
 
   public static function renderFullDescription($status) {
     $color = self::getRevisionStatusColor($status);
     $status_name =
       ArcanistDifferentialRevisionStatus::getNameForRevisionStatus($status);
 
     $img = id(new PHUIIconView())
-      ->setSpriteSheet(PHUIIconView::SPRITE_STATUS)
-      ->setSpriteIcon(self::getRevisionStatusIcon($status));
+      ->setIconFont(self::getRevisionStatusIcon($status));
 
     $tag = phutil_tag(
       'span',
       array(
         'class' => 'phui-header-'.$color.' plr',
       ),
       array(
         $img,
         $status_name,
       ));
 
     return $tag;
   }
 
   public static function getClosedStatuses() {
     $statuses = array(
       ArcanistDifferentialRevisionStatus::CLOSED,
       ArcanistDifferentialRevisionStatus::ABANDONED,
     );
 
     if (PhabricatorEnv::getEnvConfig('differential.close-on-accept')) {
       $statuses[] = ArcanistDifferentialRevisionStatus::ACCEPTED;
     }
 
     return $statuses;
   }
 
   public static function getOpenStatuses() {
     return array_diff(self::getAllStatuses(), self::getClosedStatuses());
   }
 
   public static function getAllStatuses() {
     return array(
       ArcanistDifferentialRevisionStatus::NEEDS_REVIEW,
       ArcanistDifferentialRevisionStatus::NEEDS_REVISION,
       ArcanistDifferentialRevisionStatus::CHANGES_PLANNED,
       ArcanistDifferentialRevisionStatus::ACCEPTED,
       ArcanistDifferentialRevisionStatus::CLOSED,
       ArcanistDifferentialRevisionStatus::ABANDONED,
       ArcanistDifferentialRevisionStatus::IN_PREPARATION,
     );
   }
 
   public static function isClosedStatus($status) {
     return in_array($status, self::getClosedStatuses());
   }
 
 }
diff --git a/src/applications/diffusion/controller/DiffusionRepositoryController.php b/src/applications/diffusion/controller/DiffusionRepositoryController.php
index 2149b8ef49..f58e9d3c8e 100644
--- a/src/applications/diffusion/controller/DiffusionRepositoryController.php
+++ b/src/applications/diffusion/controller/DiffusionRepositoryController.php
@@ -1,640 +1,640 @@
 <?php
 
 final class DiffusionRepositoryController extends DiffusionController {
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function processRequest() {
     $drequest = $this->getDiffusionRequest();
     $repository = $drequest->getRepository();
 
     $content = array();
 
     $crumbs = $this->buildCrumbs();
     $content[] = $crumbs;
 
     $content[] = $this->buildPropertiesTable($drequest->getRepository());
     $phids = array();
 
     try {
       $history_results = $this->callConduitWithDiffusionRequest(
         'diffusion.historyquery',
         array(
           'commit' => $drequest->getCommit(),
           'path' => $drequest->getPath(),
           'offset' => 0,
           'limit' => 15));
       $history = DiffusionPathChange::newFromConduit(
         $history_results['pathChanges']);
 
       foreach ($history as $item) {
         $data = $item->getCommitData();
         if ($data) {
           if ($data->getCommitDetail('authorPHID')) {
             $phids[$data->getCommitDetail('authorPHID')] = true;
           }
           if ($data->getCommitDetail('committerPHID')) {
             $phids[$data->getCommitDetail('committerPHID')] = true;
           }
         }
       }
       $history_exception = null;
     } catch (Exception $ex) {
       $history_results = null;
       $history = null;
       $history_exception = $ex;
     }
 
     try {
       $browse_results = DiffusionBrowseResultSet::newFromConduit(
         $this->callConduitWithDiffusionRequest(
           'diffusion.browsequery',
           array(
             'path' => $drequest->getPath(),
             'commit' => $drequest->getCommit(),
           )));
       $browse_paths = $browse_results->getPaths();
 
       foreach ($browse_paths as $item) {
         $data = $item->getLastCommitData();
         if ($data) {
           if ($data->getCommitDetail('authorPHID')) {
             $phids[$data->getCommitDetail('authorPHID')] = true;
           }
           if ($data->getCommitDetail('committerPHID')) {
             $phids[$data->getCommitDetail('committerPHID')] = true;
           }
         }
       }
 
       $browse_exception = null;
     } catch (Exception $ex) {
       $browse_results = null;
       $browse_paths = null;
       $browse_exception = $ex;
     }
 
     $phids = array_keys($phids);
     $handles = $this->loadViewerHandles($phids);
 
     if ($browse_results) {
       $readme = $this->callConduitWithDiffusionRequest(
         'diffusion.readmequery',
         array(
          'paths' => $browse_results->getPathDicts(),
          'commit' => $drequest->getStableCommit(),
         ));
     } else {
       $readme = null;
     }
 
     $content[] = $this->buildBrowseTable(
       $browse_results,
       $browse_paths,
       $browse_exception,
       $handles);
 
     $content[] = $this->buildHistoryTable(
       $history_results,
       $history,
       $history_exception,
       $handles);
 
     try {
       $content[] = $this->buildTagListTable($drequest);
     } catch (Exception $ex) {
       if (!$repository->isImporting()) {
         $content[] = $this->renderStatusMessage(
           pht('Unable to Load Tags'),
           $ex->getMessage());
       }
     }
 
     try {
       $content[] = $this->buildBranchListTable($drequest);
     } catch (Exception $ex) {
       if (!$repository->isImporting()) {
         $content[] = $this->renderStatusMessage(
           pht('Unable to Load Branches'),
           $ex->getMessage());
       }
     }
 
     if ($readme) {
       $box = new PHUIBoxView();
       $box->appendChild($readme);
       $box->addPadding(PHUI::PADDING_LARGE);
 
       $panel = new PHUIObjectBoxView();
       $panel->setHeaderText(pht('README'));
       $panel->appendChild($box);
       $content[] = $panel;
     }
 
     return $this->buildApplicationPage(
       $content,
       array(
         'title' => $drequest->getRepository()->getName(),
         'device' => true,
       ));
   }
 
   private function buildPropertiesTable(PhabricatorRepository $repository) {
     $user = $this->getRequest()->getUser();
 
     $header = id(new PHUIHeaderView())
       ->setHeader($repository->getName())
       ->setUser($user)
       ->setPolicyObject($repository);
 
     if (!$repository->isTracked()) {
-      $header->setStatus('policy-noone', '', pht('Inactive'));
+      $header->setStatus('fa-ban', 'dark', pht('Inactive'));
     } else if ($repository->isImporting()) {
-      $header->setStatus('time', 'red', pht('Importing...'));
+      $header->setStatus('fa-clock-o', 'indigo', pht('Importing...'));
     } else {
-      $header->setStatus('oh-ok', '', pht('Active'));
+      $header->setStatus('fa-check', 'bluegrey', pht('Active'));
     }
 
 
     $actions = $this->buildActionList($repository);
 
     $view = id(new PHUIPropertyListView())
       ->setUser($user);
 
     $project_phids = PhabricatorEdgeQuery::loadDestinationPHIDs(
       $repository->getPHID(),
       PhabricatorEdgeConfig::TYPE_OBJECT_HAS_PROJECT);
     if ($project_phids) {
       $this->loadHandles($project_phids);
       $view->addProperty(
         pht('Projects'),
         $this->renderHandlesForPHIDs($project_phids));
     }
 
     if ($repository->isHosted()) {
       $ssh_uri = $repository->getSSHCloneURIObject();
       if ($ssh_uri) {
         $clone_uri = $this->renderCloneCommand(
           $repository,
           $ssh_uri,
           $repository->getServeOverSSH(),
           '/settings/panel/ssh/');
 
         $view->addProperty(
           $repository->isSVN()
             ? pht('Checkout (SSH)')
             : pht('Clone (SSH)'),
           $clone_uri);
       }
 
       $http_uri = $repository->getHTTPCloneURIObject();
       if ($http_uri) {
         $clone_uri = $this->renderCloneCommand(
           $repository,
           $http_uri,
           $repository->getServeOverHTTP(),
           PhabricatorEnv::getEnvConfig('diffusion.allow-http-auth')
             ? '/settings/panel/vcspassword/'
             : null);
 
         $view->addProperty(
           $repository->isSVN()
             ? pht('Checkout (HTTP)')
             : pht('Clone (HTTP)'),
           $clone_uri);
       }
     } else {
       switch ($repository->getVersionControlSystem()) {
         case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
         case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
           $view->addProperty(
             pht('Clone'),
             $this->renderCloneCommand(
               $repository,
               $repository->getPublicCloneURI()));
           break;
         case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
           $view->addProperty(
             pht('Checkout'),
             $this->renderCloneCommand(
               $repository,
               $repository->getPublicCloneURI()));
           break;
       }
     }
 
     $description = $repository->getDetail('description');
     if (strlen($description)) {
       $description = PhabricatorMarkupEngine::renderOneObject(
         $repository,
         'description',
         $user);
       $view->addSectionHeader(pht('Description'));
       $view->addTextContent($description);
     }
 
     $view->setActionList($actions);
 
     return id(new PHUIObjectBoxView())
       ->setHeader($header)
       ->addPropertyList($view);
 
   }
 
   private function buildBranchListTable(DiffusionRequest $drequest) {
     $viewer = $this->getRequest()->getUser();
 
     if ($drequest->getBranch() === null) {
       return null;
     }
 
     $limit = 15;
 
     $branches = $this->callConduitWithDiffusionRequest(
       'diffusion.branchquery',
       array(
         'limit' => $limit + 1,
       ));
     if (!$branches) {
       return null;
     }
 
     $more_branches = (count($branches) > $limit);
     $branches = array_slice($branches, 0, $limit);
 
     $branches = DiffusionRepositoryRef::loadAllFromDictionaries($branches);
 
     $commits = id(new DiffusionCommitQuery())
       ->setViewer($viewer)
       ->withIdentifiers(mpull($branches, 'getCommitIdentifier'))
       ->withRepository($drequest->getRepository())
       ->execute();
 
     $table = id(new DiffusionBranchTableView())
       ->setUser($viewer)
       ->setDiffusionRequest($drequest)
       ->setBranches($branches)
       ->setCommits($commits);
 
     $panel = new PHUIObjectBoxView();
     $header = new PHUIHeaderView();
     $header->setHeader(pht('Branches'));
 
     if ($more_branches) {
       $header->setSubHeader(pht('Showing %d branches.', $limit));
     }
 
     $icon = id(new PHUIIconView())
       ->setIconFont('fa-fork');
 
     $button = new PHUIButtonView();
     $button->setText(pht("Show All Branches"));
     $button->setTag('a');
     $button->setIcon($icon);
     $button->setHref($drequest->generateURI(
             array(
               'action' => 'branches',
             )));
 
     $header->addActionLink($button);
     $panel->setHeader($header);
     $panel->appendChild($table);
 
     return $panel;
   }
 
   private function buildTagListTable(DiffusionRequest $drequest) {
     $viewer = $this->getRequest()->getUser();
 
     $tag_limit = 15;
     $tags = array();
     try {
       $tags = DiffusionRepositoryTag::newFromConduit(
         $this->callConduitWithDiffusionRequest(
           'diffusion.tagsquery',
           array(
             // On the home page, we want to find tags on any branch.
             'commit' => null,
             'limit' => $tag_limit + 1,
           )));
     } catch (ConduitException $e) {
       if ($e->getMessage() != 'ERR-UNSUPPORTED-VCS') {
         throw $e;
       }
     }
 
     if (!$tags) {
       return null;
     }
 
     $more_tags = (count($tags) > $tag_limit);
     $tags = array_slice($tags, 0, $tag_limit);
 
     $commits = id(new DiffusionCommitQuery())
       ->setViewer($viewer)
       ->withIdentifiers(mpull($tags, 'getCommitIdentifier'))
       ->withRepository($drequest->getRepository())
       ->needCommitData(true)
       ->execute();
 
     $view = id(new DiffusionTagListView())
       ->setUser($viewer)
       ->setDiffusionRequest($drequest)
       ->setTags($tags)
       ->setCommits($commits);
 
     $phids = $view->getRequiredHandlePHIDs();
     $handles = $this->loadViewerHandles($phids);
     $view->setHandles($handles);
 
     $panel = new PHUIObjectBoxView();
     $header = new PHUIHeaderView();
     $header->setHeader(pht('Tags'));
 
     if ($more_tags) {
       $header->setSubHeader(
         pht('Showing the %d most recent tags.', $tag_limit));
     }
 
     $icon = id(new PHUIIconView())
       ->setIconFont('fa-tag');
 
     $button = new PHUIButtonView();
     $button->setText(pht("Show All Tags"));
     $button->setTag('a');
     $button->setIcon($icon);
     $button->setHref($drequest->generateURI(
       array(
         'action' => 'tags',
       )));
 
     $header->addActionLink($button);
 
     $panel->setHeader($header);
     $panel->appendChild($view);
 
     return $panel;
   }
 
   private function buildActionList(PhabricatorRepository $repository) {
     $viewer = $this->getRequest()->getUser();
 
     $view_uri = $this->getApplicationURI($repository->getCallsign().'/');
     $edit_uri = $this->getApplicationURI($repository->getCallsign().'/edit/');
 
     $view = id(new PhabricatorActionListView())
       ->setUser($viewer)
       ->setObject($repository)
       ->setObjectURI($view_uri);
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $repository,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Repository'))
         ->setIcon('fa-pencil')
         ->setHref($edit_uri)
         ->setWorkflow(!$can_edit)
         ->setDisabled(!$can_edit));
 
     if ($repository->isHosted()) {
       $callsign = $repository->getCallsign();
       $push_uri = $this->getApplicationURI(
         'pushlog/?repositories=r'.$callsign);
 
       $view->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('View Push Logs'))
           ->setIcon('fa-list-alt')
           ->setHref($push_uri));
     }
 
     return $view;
   }
 
   private function buildHistoryTable(
     $history_results,
     $history,
     $history_exception,
     array $handles) {
 
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $drequest = $this->getDiffusionRequest();
     $repository = $drequest->getRepository();
 
     if ($history_exception) {
       if ($repository->isImporting()) {
         return $this->renderStatusMessage(
           pht('Still Importing...'),
           pht(
             'This repository is still importing. History is not yet '.
             'available.'));
       } else {
         return $this->renderStatusMessage(
           pht('Unable to Retrieve History'),
           $history_exception->getMessage());
       }
     }
 
     $history_table = id(new DiffusionHistoryTableView())
       ->setUser($viewer)
       ->setDiffusionRequest($drequest)
       ->setHandles($handles)
       ->setHistory($history);
 
     // TODO: Super sketchy.
     $history_table->loadRevisions();
 
     if ($history_results) {
       $history_table->setParents($history_results['parents']);
     }
 
     $history_table->setIsHead(true);
     $callsign = $drequest->getRepository()->getCallsign();
 
     $icon = id(new PHUIIconView())
       ->setIconFont('fa-list-alt');
 
     $button = id(new PHUIButtonView())
       ->setText(pht('View Full History'))
       ->setHref($drequest->generateURI(
         array(
           'action' => 'history',
         )))
       ->setTag('a')
       ->setIcon($icon);
 
     $panel = new PHUIObjectBoxView();
     $header = id(new PHUIHeaderView())
       ->setHeader(pht('Recent Commits'))
       ->addActionLink($button);
     $panel->setHeader($header);
     $panel->appendChild($history_table);
 
     return $panel;
   }
 
   private function buildBrowseTable(
     $browse_results,
     $browse_paths,
     $browse_exception,
     array $handles) {
 
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $drequest = $this->getDiffusionRequest();
     $repository = $drequest->getRepository();
 
     if ($browse_exception) {
       if ($repository->isImporting()) {
         // The history table renders a useful message.
         return null;
       } else {
         return $this->renderStatusMessage(
           pht('Unable to Retrieve Paths'),
           $browse_exception->getMessage());
       }
     }
 
     $browse_table = id(new DiffusionBrowseTableView())
       ->setUser($viewer)
       ->setDiffusionRequest($drequest)
       ->setHandles($handles);
     if ($browse_paths) {
       $browse_table->setPaths($browse_paths);
     } else {
       $browse_table->setPaths(array());
     }
 
     $browse_uri = $drequest->generateURI(array('action' => 'browse'));
 
     $browse_panel = new PHUIObjectBoxView();
     $header = id(new PHUIHeaderView())
       ->setHeader(pht('Repository'));
 
     $icon = id(new PHUIIconView())
       ->setIconFont('fa-folder-open');
 
     $button = new PHUIButtonView();
     $button->setText(pht('Browse Repository'));
     $button->setTag('a');
     $button->setIcon($icon);
     $button->setHref($browse_uri);
 
     $header->addActionLink($button);
     $browse_panel->setHeader($header);
 
     if ($repository->canUsePathTree()) {
       Javelin::initBehavior(
         'diffusion-locate-file',
         array(
           'controlID' => 'locate-control',
           'inputID' => 'locate-input',
           'browseBaseURI' => (string)$drequest->generateURI(
             array(
               'action' => 'browse',
             )),
           'uri' => (string)$drequest->generateURI(
             array(
               'action' => 'pathtree',
             )),
         ));
 
       $form = id(new AphrontFormView())
         ->setUser($viewer)
         ->appendChild(
           id(new AphrontFormTypeaheadControl())
             ->setHardpointID('locate-control')
             ->setID('locate-input')
             ->setLabel(pht('Locate File')));
       $browse_panel->appendChild($form->buildLayoutView());
     }
 
     $browse_panel->appendChild($browse_table);
 
     return $browse_panel;
   }
 
   private function renderCloneCommand(
     PhabricatorRepository $repository,
     $uri,
     $serve_mode = null,
     $manage_uri = null) {
 
     require_celerity_resource('diffusion-icons-css');
 
     Javelin::initBehavior('select-on-click');
 
     switch ($repository->getVersionControlSystem()) {
       case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
         $command = csprintf(
           'git clone %R',
           $uri);
         break;
       case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
         $command = csprintf(
           'hg clone %R',
           $uri);
         break;
       case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
         if ($repository->isHosted()) {
           $command = csprintf(
             'svn checkout %R %R',
             $uri,
             $repository->getCloneName());
         } else {
           $command = csprintf(
             'svn checkout %R',
             $uri);
         }
         break;
     }
 
     $input = javelin_tag(
       'input',
       array(
         'type' => 'text',
         'value' => (string)$command,
         'class' => 'diffusion-clone-uri',
         'sigil' => 'select-on-click',
         'readonly' => 'true',
       ));
 
     $extras = array();
     if ($serve_mode) {
       if ($serve_mode === PhabricatorRepository::SERVE_READONLY) {
         $extras[] = pht('(Read Only)');
       }
     }
 
     if ($manage_uri) {
       if ($this->getRequest()->getUser()->isLoggedIn()) {
         $extras[] = phutil_tag(
           'a',
           array(
             'href' => $manage_uri,
           ),
           pht('Manage Credentials'));
       }
     }
 
     if ($extras) {
       $extras = phutil_implode_html(' ', $extras);
       $extras = phutil_tag(
         'div',
         array(
           'class' => 'diffusion-clone-extras',
         ),
         $extras);
     }
 
     return array($input, $extras);
   }
 
 }
diff --git a/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php b/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php
index 50a74dd376..c70ce57e5a 100644
--- a/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php
+++ b/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php
@@ -1,1121 +1,1121 @@
 <?php
 
 final class DiffusionRepositoryEditMainController
   extends DiffusionRepositoryEditController {
 
   public function processRequest() {
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $drequest = $this->diffusionRequest;
     $repository = $drequest->getRepository();
 
     PhabricatorPolicyFilter::requireCapability(
       $viewer,
       $repository,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $is_svn = false;
     $is_git = false;
     $is_hg = false;
     switch ($repository->getVersionControlSystem()) {
       case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
         $is_git = true;
         break;
       case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
         $is_svn = true;
         break;
       case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
         $is_hg = true;
         break;
     }
 
     $has_branches = ($is_git || $is_hg);
     $has_local = $repository->usesLocalWorkingCopy();
 
     $crumbs = $this->buildApplicationCrumbs($is_main = true);
 
     $title = pht('Edit %s', $repository->getName());
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title);
     if ($repository->isTracked()) {
-      $header->setStatus('oh-ok', '', pht('Active'));
+      $header->setStatus('fa-check', 'bluegrey', pht('Active'));
     } else {
-      $header->setStatus('policy-noone', '', pht('Inactive'));
+      $header->setStatus('fa-ban', 'dark', pht('Inactive'));
     }
 
     $basic_actions = $this->buildBasicActions($repository);
     $basic_properties =
       $this->buildBasicProperties($repository, $basic_actions);
 
     $policy_actions = $this->buildPolicyActions($repository);
     $policy_properties =
       $this->buildPolicyProperties($repository, $policy_actions);
 
     $remote_properties = null;
     if (!$repository->isHosted()) {
       $remote_properties = $this->buildRemoteProperties(
         $repository,
         $this->buildRemoteActions($repository));
     }
 
     $encoding_actions = $this->buildEncodingActions($repository);
     $encoding_properties =
       $this->buildEncodingProperties($repository, $encoding_actions);
 
     $hosting_properties = $this->buildHostingProperties(
       $repository,
       $this->buildHostingActions($repository));
 
 
     $branches_properties = null;
     if ($has_branches) {
       $branches_properties = $this->buildBranchesProperties(
         $repository,
         $this->buildBranchesActions($repository));
     }
 
     $subversion_properties = null;
     if ($is_svn) {
       $subversion_properties = $this->buildSubversionProperties(
         $repository,
         $this->buildSubversionActions($repository));
     }
 
     $local_properties = null;
     if ($has_local) {
       $local_properties = $this->buildLocalProperties(
         $repository,
         $this->buildLocalActions($repository));
     }
 
     $actions_properties = $this->buildActionsProperties(
       $repository,
       $this->buildActionsActions($repository));
 
     $xactions = id(new PhabricatorRepositoryTransactionQuery())
       ->setViewer($viewer)
       ->withObjectPHIDs(array($repository->getPHID()))
       ->execute();
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($viewer);
     foreach ($xactions as $xaction) {
       if ($xaction->getComment()) {
         $engine->addObject(
           $xaction->getComment(),
           PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
       }
     }
     $engine->process();
 
     $xaction_view = id(new PhabricatorApplicationTransactionView())
       ->setUser($viewer)
       ->setObjectPHID($repository->getPHID())
       ->setTransactions($xactions)
       ->setMarkupEngine($engine);
 
     $boxes = array();
 
     $boxes[] = id(new PHUIObjectBoxView())
       ->setHeader($header)
       ->addPropertyList($basic_properties);
 
     $boxes[] = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Policies'))
       ->addPropertyList($policy_properties);
 
     $boxes[] = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Hosting'))
       ->addPropertyList($hosting_properties);
 
     if ($repository->canMirror()) {
       $mirror_actions = $this->buildMirrorActions($repository);
       $mirror_properties = $this->buildMirrorProperties(
         $repository,
         $mirror_actions);
 
       $mirrors = id(new PhabricatorRepositoryMirrorQuery())
         ->setViewer($viewer)
         ->withRepositoryPHIDs(array($repository->getPHID()))
         ->execute();
 
       $mirror_list = $this->buildMirrorList($repository, $mirrors);
 
       $boxes[] = id(new PhabricatorAnchorView())->setAnchorName('mirrors');
 
       $boxes[] = id(new PHUIObjectBoxView())
         ->setHeaderText(pht('Mirrors'))
         ->addPropertyList($mirror_properties);
 
       $boxes[] = $mirror_list;
     }
 
     if ($remote_properties) {
       $boxes[] = id(new PHUIObjectBoxView())
         ->setHeaderText(pht('Remote'))
         ->addPropertyList($remote_properties);
     }
 
     if ($local_properties) {
       $boxes[] = id(new PHUIObjectBoxView())
         ->setHeaderText(pht('Local'))
         ->addPropertyList($local_properties);
     }
 
     $boxes[] = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Text Encoding'))
       ->addPropertyList($encoding_properties);
 
     if ($branches_properties) {
       $boxes[] = id(new PHUIObjectBoxView())
         ->setHeaderText(pht('Branches'))
         ->addPropertyList($branches_properties);
     }
 
     if ($subversion_properties) {
       $boxes[] = id(new PHUIObjectBoxView())
         ->setHeaderText(pht('Subversion'))
         ->addPropertyList($subversion_properties);
     }
 
     $boxes[] = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Actions'))
       ->addPropertyList($actions_properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $boxes,
         $xaction_view,
       ),
       array(
         'title' => $title,
         'device' => true,
       ));
   }
 
   private function buildBasicActions(PhabricatorRepository $repository) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorActionListView())
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setUser($viewer);
 
     $edit = id(new PhabricatorActionView())
       ->setIcon('fa-pencil')
       ->setName(pht('Edit Basic Information'))
       ->setHref($this->getRepositoryControllerURI($repository, 'edit/basic/'));
     $view->addAction($edit);
 
     $activate = id(new PhabricatorActionView())
       ->setHref(
         $this->getRepositoryControllerURI($repository, 'edit/activate/'))
       ->setWorkflow(true);
 
     if ($repository->isTracked()) {
       $activate
         ->setIcon('fa-pause')
         ->setName(pht('Deactivate Repository'));
     } else {
       $activate
         ->setIcon('fa-play')
         ->setName(pht('Activate Repository'));
     }
 
     $view->addAction($activate);
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Delete Repository'))
         ->setIcon('fa-times')
         ->setHref(
           $this->getRepositoryControllerURI($repository, 'edit/delete/'))
         ->setDisabled(true)
         ->setWorkflow(true));
 
     return $view;
   }
 
   private function buildBasicProperties(
     PhabricatorRepository $repository,
     PhabricatorActionListView $actions) {
 
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setActionList($actions);
 
     $type = PhabricatorRepositoryType::getNameForRepositoryType(
       $repository->getVersionControlSystem());
 
     $view->addProperty(pht('Type'), $type);
     $view->addProperty(pht('Callsign'), $repository->getCallsign());
 
 
     $clone_name = $repository->getDetail('clone-name');
 
     if ($repository->isHosted()) {
       $view->addProperty(
         pht('Clone/Checkout As'),
         $clone_name
           ? $clone_name.'/'
           : phutil_tag('em', array(), $repository->getCloneName().'/'));
     }
 
     $project_phids = PhabricatorEdgeQuery::loadDestinationPHIDs(
       $repository->getPHID(),
       PhabricatorEdgeConfig::TYPE_OBJECT_HAS_PROJECT);
     if ($project_phids) {
       $this->loadHandles($project_phids);
       $project_text = $this->renderHandlesForPHIDs($project_phids);
     } else {
       $project_text = phutil_tag('em', array(), pht('None'));
     }
     $view->addProperty(
       pht('Projects'),
       $project_text);
 
     $view->addProperty(
       pht('Status'),
       $this->buildRepositoryStatus($repository));
 
     $description = $repository->getDetail('description');
     $view->addSectionHeader(pht('Description'));
     if (!strlen($description)) {
       $description = phutil_tag('em', array(), pht('No description provided.'));
     } else {
       $description = PhabricatorMarkupEngine::renderOneObject(
         $repository,
         'description',
         $viewer);
     }
     $view->addTextContent($description);
 
     return $view;
   }
 
   private function buildEncodingActions(PhabricatorRepository $repository) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorActionListView())
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setUser($viewer);
 
     $edit = id(new PhabricatorActionView())
       ->setIcon('fa-pencil')
       ->setName(pht('Edit Text Encoding'))
       ->setHref(
         $this->getRepositoryControllerURI($repository, 'edit/encoding/'));
     $view->addAction($edit);
 
     return $view;
   }
 
   private function buildEncodingProperties(
     PhabricatorRepository $repository,
     PhabricatorActionListView $actions) {
 
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setActionList($actions);
 
     $encoding = $repository->getDetail('encoding');
     if (!$encoding) {
       $encoding = phutil_tag('em', array(), pht('Use Default (UTF-8)'));
     }
 
     $view->addProperty(pht('Encoding'), $encoding);
 
     return $view;
   }
 
   private function buildPolicyActions(PhabricatorRepository $repository) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorActionListView())
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setUser($viewer);
 
     $edit = id(new PhabricatorActionView())
       ->setIcon('fa-pencil')
       ->setName(pht('Edit Policies'))
       ->setHref(
         $this->getRepositoryControllerURI($repository, 'edit/policy/'));
     $view->addAction($edit);
 
     return $view;
   }
 
   private function buildPolicyProperties(
     PhabricatorRepository $repository,
     PhabricatorActionListView $actions) {
 
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setActionList($actions);
 
     $descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
       $viewer,
       $repository);
 
     $view->addProperty(
       pht('Visible To'),
       $descriptions[PhabricatorPolicyCapability::CAN_VIEW]);
 
     $view->addProperty(
       pht('Editable By'),
       $descriptions[PhabricatorPolicyCapability::CAN_EDIT]);
 
     $pushable = $repository->isHosted()
       ? $descriptions[DiffusionCapabilityPush::CAPABILITY]
       : phutil_tag('em', array(), pht('Not a Hosted Repository'));
     $view->addProperty(pht('Pushable By'), $pushable);
 
     return $view;
   }
 
   private function buildBranchesActions(PhabricatorRepository $repository) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorActionListView())
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setUser($viewer);
 
     $edit = id(new PhabricatorActionView())
       ->setIcon('fa-pencil')
       ->setName(pht('Edit Branches'))
       ->setHref(
         $this->getRepositoryControllerURI($repository, 'edit/branches/'));
     $view->addAction($edit);
 
     return $view;
   }
 
   private function buildBranchesProperties(
     PhabricatorRepository $repository,
     PhabricatorActionListView $actions) {
 
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setActionList($actions);
 
     $default_branch = nonempty(
       $repository->getHumanReadableDetail('default-branch'),
       phutil_tag('em', array(), $repository->getDefaultBranch()));
     $view->addProperty(pht('Default Branch'), $default_branch);
 
     $track_only = nonempty(
       $repository->getHumanReadableDetail('branch-filter', array()),
       phutil_tag('em', array(), pht('Track All Branches')));
     $view->addProperty(pht('Track Only'), $track_only);
 
     $autoclose_only = nonempty(
       $repository->getHumanReadableDetail('close-commits-filter', array()),
       phutil_tag('em', array(), pht('Autoclose On All Branches')));
 
     if ($repository->getDetail('disable-autoclose')) {
       $autoclose_only = phutil_tag('em', array(), pht('Disabled'));
     }
 
     $view->addProperty(pht('Autoclose Only'), $autoclose_only);
 
     return $view;
   }
 
   private function buildSubversionActions(PhabricatorRepository $repository) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorActionListView())
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setUser($viewer);
 
     $edit = id(new PhabricatorActionView())
       ->setIcon('fa-pencil')
       ->setName(pht('Edit Subversion Info'))
       ->setHref(
         $this->getRepositoryControllerURI($repository, 'edit/subversion/'));
     $view->addAction($edit);
 
     return $view;
   }
 
   private function buildSubversionProperties(
     PhabricatorRepository $repository,
     PhabricatorActionListView $actions) {
 
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setActionList($actions);
 
     $svn_uuid = nonempty(
       $repository->getUUID(),
       phutil_tag('em', array(), pht('Not Configured')));
     $view->addProperty(pht('Subversion UUID'), $svn_uuid);
 
     $svn_subpath = nonempty(
       $repository->getHumanReadableDetail('svn-subpath'),
       phutil_tag('em', array(), pht('Import Entire Repository')));
     $view->addProperty(pht('Import Only'), $svn_subpath);
 
     return $view;
   }
 
   private function buildActionsActions(PhabricatorRepository $repository) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorActionListView())
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setUser($viewer);
 
     $edit = id(new PhabricatorActionView())
       ->setIcon('fa-pencil')
       ->setName(pht('Edit Actions'))
       ->setHref(
         $this->getRepositoryControllerURI($repository, 'edit/actions/'));
     $view->addAction($edit);
 
     return $view;
   }
 
   private function buildActionsProperties(
     PhabricatorRepository $repository,
     PhabricatorActionListView $actions) {
 
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setActionList($actions);
 
     $notify = $repository->getDetail('herald-disabled')
       ? pht('Off')
       : pht('On');
     $notify = phutil_tag('em', array(), $notify);
     $view->addProperty(pht('Publish/Notify'), $notify);
 
     $autoclose = $repository->getDetail('disable-autoclose')
       ? pht('Off')
       : pht('On');
     $autoclose = phutil_tag('em', array(), $autoclose);
     $view->addProperty(pht('Autoclose'), $autoclose);
 
     return $view;
   }
 
   private function buildRemoteActions(PhabricatorRepository $repository) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorActionListView())
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setUser($viewer);
 
     $edit = id(new PhabricatorActionView())
       ->setIcon('fa-pencil')
       ->setName(pht('Edit Remote'))
       ->setHref(
         $this->getRepositoryControllerURI($repository, 'edit/remote/'));
     $view->addAction($edit);
 
     return $view;
   }
 
   private function buildRemoteProperties(
     PhabricatorRepository $repository,
     PhabricatorActionListView $actions) {
 
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setActionList($actions);
 
     $view->addProperty(
       pht('Remote URI'),
       $repository->getHumanReadableDetail('remote-uri'));
 
     $credential_phid = $repository->getCredentialPHID();
     if ($credential_phid) {
       $this->loadHandles(array($credential_phid));
       $view->addProperty(
         pht('Credential'),
         $this->getHandle($credential_phid)->renderLink());
     }
 
     return $view;
   }
 
   private function buildLocalActions(PhabricatorRepository $repository) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorActionListView())
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setUser($viewer);
 
     $edit = id(new PhabricatorActionView())
       ->setIcon('fa-pencil')
       ->setName(pht('Edit Local'))
       ->setHref(
         $this->getRepositoryControllerURI($repository, 'edit/local/'));
     $view->addAction($edit);
 
     return $view;
   }
 
   private function buildLocalProperties(
     PhabricatorRepository $repository,
     PhabricatorActionListView $actions) {
 
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setActionList($actions);
 
     $view->addProperty(
       pht('Local Path'),
       $repository->getHumanReadableDetail('local-path'));
 
     return $view;
   }
 
   private function buildHostingActions(PhabricatorRepository $repository) {
     $user = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorActionListView())
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setUser($user);
 
     $edit = id(new PhabricatorActionView())
       ->setIcon('fa-pencil')
       ->setName(pht('Edit Hosting'))
       ->setHref(
         $this->getRepositoryControllerURI($repository, 'edit/hosting/'));
     $view->addAction($edit);
 
     if ($repository->canAllowDangerousChanges()) {
       if ($repository->shouldAllowDangerousChanges()) {
         $changes = id(new PhabricatorActionView())
           ->setIcon('fa-shield')
           ->setName(pht('Prevent Dangerous Changes'))
           ->setHref(
             $this->getRepositoryControllerURI($repository, 'edit/dangerous/'))
           ->setWorkflow(true);
       } else {
         $changes = id(new PhabricatorActionView())
           ->setIcon('fa-bullseye')
           ->setName(pht('Allow Dangerous Changes'))
           ->setHref(
             $this->getRepositoryControllerURI($repository, 'edit/dangerous/'))
           ->setWorkflow(true);
       }
       $view->addAction($changes);
     }
 
     return $view;
   }
 
   private function buildHostingProperties(
     PhabricatorRepository $repository,
     PhabricatorActionListView $actions) {
 
     $user = $this->getRequest()->getUser();
 
     $view = id(new PHUIPropertyListView())
       ->setUser($user)
       ->setActionList($actions);
 
     $hosting = $repository->isHosted()
       ? pht('Hosted on Phabricator')
       : pht('Hosted Elsewhere');
     $view->addProperty(pht('Hosting'), phutil_tag('em', array(), $hosting));
 
     $view->addProperty(
       pht('Serve over HTTP'),
       phutil_tag(
         'em',
         array(),
         PhabricatorRepository::getProtocolAvailabilityName(
           $repository->getServeOverHTTP())));
 
     $view->addProperty(
       pht('Serve over SSH'),
       phutil_tag(
         'em',
         array(),
         PhabricatorRepository::getProtocolAvailabilityName(
           $repository->getServeOverSSH())));
 
     if ($repository->canAllowDangerousChanges()) {
       if ($repository->shouldAllowDangerousChanges()) {
         $description = pht('Allowed');
       } else {
         $description = pht('Not Allowed');
       }
 
       $view->addProperty(
         pht('Dangerous Changes'),
         $description);
     }
 
     return $view;
   }
 
   private function buildRepositoryStatus(
     PhabricatorRepository $repository) {
 
     $viewer = $this->getRequest()->getUser();
 
     $view = new PHUIStatusListView();
 
     $messages = id(new PhabricatorRepositoryStatusMessage())
       ->loadAllWhere('repositoryID = %d', $repository->getID());
     $messages = mpull($messages, null, 'getStatusType');
 
     if ($repository->isTracked()) {
       $view->addItem(
         id(new PHUIStatusItemView())
           ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
           ->setTarget(pht('Repository Active')));
     } else {
       $view->addItem(
         id(new PHUIStatusItemView())
           ->setIcon(PHUIStatusItemView::ICON_WARNING, 'bluegrey')
           ->setTarget(pht('Repository Inactive'))
           ->setNote(
             pht('Activate this repository to begin or resume import.')));
       return $view;
     }
 
     $binaries = array();
     $svnlook_check = false;
     switch ($repository->getVersionControlSystem()) {
       case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
         $binaries[] = 'git';
         break;
       case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
         $binaries[] = 'svn';
         break;
       case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
         $binaries[] = 'hg';
         break;
     }
 
     if ($repository->isHosted()) {
       if ($repository->getServeOverHTTP() != PhabricatorRepository::SERVE_OFF) {
         switch ($repository->getVersionControlSystem()) {
           case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
             $binaries[] = 'git-http-backend';
             break;
           case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
             $binaries[] = 'svnserve';
             $binaries[] = 'svnadmin';
             $binaries[] = 'svnlook';
             $svnlook_check = true;
             break;
           case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
             $binaries[] = 'hg';
             break;
         }
       }
       if ($repository->getServeOverSSH() != PhabricatorRepository::SERVE_OFF) {
         switch ($repository->getVersionControlSystem()) {
           case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
             $binaries[] = 'git-receive-pack';
             $binaries[] = 'git-upload-pack';
             break;
           case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
             $binaries[] = 'svnserve';
             $binaries[] = 'svnadmin';
             $binaries[] = 'svnlook';
             $svnlook_check = true;
             break;
           case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
             $binaries[] = 'hg';
             break;
         }
       }
     }
 
     $binaries = array_unique($binaries);
     foreach ($binaries as $binary) {
       $where = Filesystem::resolveBinary($binary);
       if (!$where) {
         $view->addItem(
           id(new PHUIStatusItemView())
             ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
             ->setTarget(
               pht('Missing Binary %s', phutil_tag('tt', array(), $binary)))
             ->setNote(pht(
               "Unable to find this binary in the webserver's PATH. You may ".
               "need to configure %s.",
               $this->getEnvConfigLink())));
       } else {
         $view->addItem(
           id(new PHUIStatusItemView())
             ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
             ->setTarget(
               pht('Found Binary %s', phutil_tag('tt', array(), $binary)))
             ->setNote(phutil_tag('tt', array(), $where)));
       }
     }
 
     // This gets checked generically above. However, for svn commit hooks, we
     // need this to be in environment.append-paths because subversion strips
     // PATH.
     if ($svnlook_check) {
       $where = Filesystem::resolveBinary('svnlook');
       if ($where) {
         $path = substr($where, 0, strlen($where) - strlen('svnlook'));
         $dirs = PhabricatorEnv::getEnvConfig('environment.append-paths');
         $in_path = false;
         foreach ($dirs as $dir) {
           if (Filesystem::isDescendant($path, $dir)) {
             $in_path = true;
             break;
           }
         }
         if (!$in_path) {
           $view->addItem(
             id(new PHUIStatusItemView())
             ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
             ->setTarget(
               pht('Missing Binary %s', phutil_tag('tt', array(), $binary)))
             ->setNote(pht(
                 'Unable to find this binary in `environment.append-paths`. '.
                 'You need to configure %s and include %s.',
                 $this->getEnvConfigLink(),
                 $path)));
         }
       }
     }
 
     $doc_href = PhabricatorEnv::getDocLink('Managing Daemons with phd');
 
     $daemon_instructions = pht(
       'Use %s to start daemons. See %s.',
       phutil_tag('tt', array(), 'bin/phd start'),
       phutil_tag(
         'a',
         array(
           'href' => $doc_href,
         ),
         pht('Managing Daemons with phd')));
 
 
     $pull_daemon = id(new PhabricatorDaemonLogQuery())
       ->setViewer(PhabricatorUser::getOmnipotentUser())
       ->withStatus(PhabricatorDaemonLogQuery::STATUS_ALIVE)
       ->withDaemonClasses(array('PhabricatorRepositoryPullLocalDaemon'))
       ->setLimit(1)
       ->execute();
 
     if ($pull_daemon) {
       $view->addItem(
         id(new PHUIStatusItemView())
           ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
           ->setTarget(pht('Pull Daemon Running')));
     } else {
       $view->addItem(
         id(new PHUIStatusItemView())
           ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
           ->setTarget(pht('Pull Daemon Not Running'))
           ->setNote($daemon_instructions));
     }
 
 
     $task_daemon = id(new PhabricatorDaemonLogQuery())
       ->setViewer(PhabricatorUser::getOmnipotentUser())
       ->withStatus(PhabricatorDaemonLogQuery::STATUS_ALIVE)
       ->withDaemonClasses(array('PhabricatorTaskmasterDaemon'))
       ->setLimit(1)
       ->execute();
     if ($task_daemon) {
       $view->addItem(
         id(new PHUIStatusItemView())
           ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
           ->setTarget(pht('Task Daemon Running')));
     } else {
       $view->addItem(
         id(new PHUIStatusItemView())
           ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
           ->setTarget(pht('Task Daemon Not Running'))
           ->setNote($daemon_instructions));
     }
 
     if ($repository->usesLocalWorkingCopy()) {
       $local_parent = dirname($repository->getLocalPath());
       if (Filesystem::pathExists($local_parent)) {
         $view->addItem(
           id(new PHUIStatusItemView())
             ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
             ->setTarget(pht('Storage Directory OK'))
             ->setNote(phutil_tag('tt', array(), $local_parent)));
       } else {
         $view->addItem(
           id(new PHUIStatusItemView())
             ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
             ->setTarget(pht('No Storage Directory'))
             ->setNote(
               pht(
                 'Storage directory %s does not exist, or is not readable by '.
                 'the webserver. Create this directory or make it readable.',
                 phutil_tag('tt', array(), $local_parent))));
         return $view;
       }
 
       $local_path = $repository->getLocalPath();
       $message = idx($messages, PhabricatorRepositoryStatusMessage::TYPE_INIT);
       if ($message) {
         switch ($message->getStatusCode()) {
           case PhabricatorRepositoryStatusMessage::CODE_ERROR:
             $view->addItem(
               id(new PHUIStatusItemView())
               ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
                 ->setTarget(pht('Initialization Error'))
                 ->setNote($message->getParameter('message')));
             return $view;
           case PhabricatorRepositoryStatusMessage::CODE_OKAY:
               if (Filesystem::pathExists($local_path)) {
                 $view->addItem(
                   id(new PHUIStatusItemView())
                     ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
                     ->setTarget(pht('Working Copy OK'))
                     ->setNote(phutil_tag('tt', array(), $local_path)));
               } else {
                 $view->addItem(
                   id(new PHUIStatusItemView())
                     ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
                     ->setTarget(pht('Working Copy Error'))
                     ->setNote(
                       pht(
                         'Working copy %s has been deleted, or is not '.
                         'readable by the webserver. Make this directory '.
                         'readable. If it has been deleted, the daemons should '.
                         'restore it automatically.',
                         phutil_tag('tt', array(), $local_path))));
                 return $view;
               }
             break;
           case PhabricatorRepositoryStatusMessage::CODE_WORKING:
             $view->addItem(
               id(new PHUIStatusItemView())
                 ->setIcon(PHUIStatusItemView::ICON_CLOCK, 'green')
                 ->setTarget(pht('Initializing Working Copy'))
                 ->setNote(pht('Daemons are initializing the working copy.')));
             return $view;
           default:
             $view->addItem(
               id(new PHUIStatusItemView())
                 ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
                 ->setTarget(pht('Unknown Init Status'))
                 ->setNote($message->getStatusCode()));
             return $view;
         }
       } else {
         $view->addItem(
           id(new PHUIStatusItemView())
             ->setIcon(PHUIStatusItemView::ICON_CLOCK, 'orange')
             ->setTarget(pht('No Working Copy Yet'))
             ->setNote(
               pht('Waiting for daemons to build a working copy.')));
         return $view;
       }
     }
 
     $message = idx($messages, PhabricatorRepositoryStatusMessage::TYPE_FETCH);
     if ($message) {
       switch ($message->getStatusCode()) {
         case PhabricatorRepositoryStatusMessage::CODE_ERROR:
           $view->addItem(
             id(new PHUIStatusItemView())
               ->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
               ->setTarget(pht('Update Error'))
               ->setNote($message->getParameter('message')));
           return $view;
         case PhabricatorRepositoryStatusMessage::CODE_OKAY:
           $view->addItem(
             id(new PHUIStatusItemView())
               ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
               ->setTarget(pht('Updates OK'))
               ->setNote(
                 pht(
                   'Last updated %s.',
                   phabricator_datetime($message->getEpoch(), $viewer))));
           break;
       }
     } else {
       $view->addItem(
         id(new PHUIStatusItemView())
           ->setIcon(PHUIStatusItemView::ICON_CLOCK, 'orange')
           ->setTarget(pht('Waiting For Update'))
           ->setNote(
             pht('Waiting for daemons to read updates.')));
     }
 
     if ($repository->isImporting()) {
       $progress = queryfx_all(
         $repository->establishConnection('r'),
         'SELECT importStatus, count(*) N FROM %T WHERE repositoryID = %d
           GROUP BY importStatus',
         id(new PhabricatorRepositoryCommit())->getTableName(),
         $repository->getID());
 
       $done = 0;
       $total = 0;
       foreach ($progress as $row) {
         $total += $row['N'] * 4;
         $status = $row['importStatus'];
         if ($status & PhabricatorRepositoryCommit::IMPORTED_MESSAGE) {
           $done += $row['N'];
         }
         if ($status & PhabricatorRepositoryCommit::IMPORTED_CHANGE) {
           $done += $row['N'];
         }
         if ($status & PhabricatorRepositoryCommit::IMPORTED_OWNERS) {
           $done += $row['N'];
         }
         if ($status & PhabricatorRepositoryCommit::IMPORTED_HERALD) {
           $done += $row['N'];
         }
       }
 
       if ($total) {
         $percentage = 100 * ($done / $total);
       } else {
         $percentage = 0;
       }
 
       // Cap this at "99.99%", because it's confusing to users when the actual
       // fraction is "99.996%" and it rounds up to "100.00%".
       if ($percentage > 99.99) {
         $percentage = 99.99;
       }
 
       $percentage = sprintf('%.2f%%', $percentage);
 
       $view->addItem(
         id(new PHUIStatusItemView())
           ->setIcon(PHUIStatusItemView::ICON_CLOCK, 'green')
           ->setTarget(pht('Importing'))
           ->setNote(
             pht('%s Complete', $percentage)));
     } else {
       $view->addItem(
         id(new PHUIStatusItemView())
           ->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
           ->setTarget(pht('Fully Imported')));
     }
 
     if (idx($messages, PhabricatorRepositoryStatusMessage::TYPE_NEEDS_UPDATE)) {
       $view->addItem(
         id(new PHUIStatusItemView())
           ->setIcon(PHUIStatusItemView::ICON_UP, 'indigo')
           ->setTarget(pht('Prioritized'))
           ->setNote(pht('This repository will be updated soon.')));
     }
 
     return $view;
   }
 
   private function buildMirrorActions(
     PhabricatorRepository $repository) {
 
     $viewer = $this->getRequest()->getUser();
 
     $mirror_actions = id(new PhabricatorActionListView())
       ->setObjectURI($this->getRequest()->getRequestURI())
       ->setUser($viewer);
 
     $new_mirror_uri = $this->getRepositoryControllerURI(
       $repository,
       'mirror/edit/');
 
     $mirror_actions->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Add Mirror'))
         ->setIcon('fa-plus')
         ->setHref($new_mirror_uri)
         ->setWorkflow(true));
 
     return $mirror_actions;
   }
 
   private function buildMirrorProperties(
     PhabricatorRepository $repository,
     PhabricatorActionListView $actions) {
 
     $viewer = $this->getRequest()->getUser();
 
     $mirror_properties = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setActionList($actions);
 
     $mirror_properties->addProperty(
       '',
       phutil_tag(
         'em',
         array(),
         pht('Automatically push changes into other remotes.')));
 
     return $mirror_properties;
   }
 
   private function buildMirrorList(
     PhabricatorRepository $repository,
     array $mirrors) {
     assert_instances_of($mirrors, 'PhabricatorRepositoryMirror');
 
     $mirror_list = id(new PHUIObjectItemListView())
       ->setNoDataString(pht('This repository has no configured mirrors.'));
 
     foreach ($mirrors as $mirror) {
       $item = id(new PHUIObjectItemView())
         ->setHeader($mirror->getRemoteURI());
 
       $edit_uri = $this->getRepositoryControllerURI(
         $repository,
         'mirror/edit/'.$mirror->getID().'/');
 
       $delete_uri = $this->getRepositoryControllerURI(
         $repository,
         'mirror/delete/'.$mirror->getID().'/');
 
       $item->addAction(
         id(new PHUIListItemView())
           ->setIcon('fa-pencil')
           ->setHref($edit_uri)
           ->setWorkflow(true));
 
       $item->addAction(
         id(new PHUIListItemView())
           ->setIcon('fa-times')
           ->setHref($delete_uri)
           ->setWorkflow(true));
 
       $mirror_list->addItem($item);
     }
 
     return $mirror_list;
   }
 
   private function getEnvConfigLink() {
     $config_href = '/config/edit/environment.append-paths/';
     return phutil_tag(
       'a',
       array(
         'href' => $config_href,
       ),
       'environment.append-paths');
   }
 
 }
diff --git a/src/applications/harbormaster/controller/HarbormasterBuildViewController.php b/src/applications/harbormaster/controller/HarbormasterBuildViewController.php
index d3aadcec13..a459240234 100644
--- a/src/applications/harbormaster/controller/HarbormasterBuildViewController.php
+++ b/src/applications/harbormaster/controller/HarbormasterBuildViewController.php
@@ -1,376 +1,376 @@
 <?php
 
 final class HarbormasterBuildViewController
   extends HarbormasterController {
 
   private $id;
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $id = $this->id;
 
     $build = id(new HarbormasterBuildQuery())
       ->setViewer($viewer)
       ->withIDs(array($id))
       ->executeOne();
     if (!$build) {
       return new Aphront404Response();
     }
 
     $title = pht("Build %d", $id);
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title)
       ->setUser($viewer)
       ->setPolicyObject($build);
 
     if ($build->isRestarting()) {
-      $header->setStatus('warning', 'red', pht('Restarting'));
+      $header->setStatus('fa-exclamation-triangle', 'red', pht('Restarting'));
     } else if ($build->isStopping()) {
-      $header->setStatus('warning', 'red', pht('Stopping'));
+      $header->setStatus('fa-exclamation-triangle', 'red', pht('Stopping'));
     } else if ($build->isResuming()) {
-      $header->setStatus('warning', 'red', pht('Resuming'));
+      $header->setStatus('fa-exclamation-triangle', 'red', pht('Resuming'));
     }
 
     $box = id(new PHUIObjectBoxView())
       ->setHeader($header);
 
     $actions = $this->buildActionList($build);
     $this->buildPropertyLists($box, $build, $actions);
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb(
       $build->getBuildable()->getMonogram(),
       '/'.$build->getBuildable()->getMonogram());
     $crumbs->addTextCrumb($title);
 
     $build_targets = id(new HarbormasterBuildTargetQuery())
       ->setViewer($viewer)
       ->withBuildPHIDs(array($build->getPHID()))
       ->execute();
 
 
     if ($build_targets) {
       $messages = id(new HarbormasterBuildMessageQuery())
         ->setViewer($viewer)
         ->withBuildTargetPHIDs(mpull($build_targets, 'getPHID'))
         ->execute();
       $messages = mgroup($messages, 'getBuildTargetPHID');
     } else {
       $messages = array();
     }
 
     $targets = array();
     foreach ($build_targets as $build_target) {
       $header = id(new PHUIHeaderView())
         ->setHeader(pht(
           'Build Target %d (%s)',
           $build_target->getID(),
           $build_target->getImplementation()->getName()))
         ->setUser($viewer);
       $properties = new PHUIPropertyListView();
 
       $details = $build_target->getDetails();
       if ($details) {
         $properties->addSectionHeader(pht('Configuration Details'));
         foreach ($details as $key => $value) {
           $properties->addProperty($key, $value);
         }
       }
 
       $variables = $build_target->getVariables();
       if ($variables) {
         $properties->addSectionHeader(pht('Variables'));
         foreach ($variables as $key => $value) {
           $properties->addProperty($key, $value);
         }
       }
 
       $targets[] = id(new PHUIObjectBoxView())
         ->setHeader($header)
         ->addPropertyList($properties);
 
       $build_messages = idx($messages, $build_target->getPHID(), array());
       $targets[] = $this->buildMessages($build_messages);
 
       $targets[] = $this->buildArtifacts($build_target);
       $targets[] = $this->buildLog($build, $build_target);
     }
 
     $xactions = id(new HarbormasterBuildTransactionQuery())
       ->setViewer($viewer)
       ->withObjectPHIDs(array($build->getPHID()))
       ->execute();
     $timeline = id(new PhabricatorApplicationTransactionView())
       ->setUser($viewer)
       ->setObjectPHID($build->getPHID())
       ->setTransactions($xactions);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $box,
         $targets,
         $timeline,
       ),
       array(
         'title' => $title,
         'device' => true,
       ));
   }
 
   private function buildArtifacts(HarbormasterBuildTarget $build_target) {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $artifacts = id(new HarbormasterBuildArtifactQuery())
       ->setViewer($viewer)
       ->withBuildTargetPHIDs(array($build_target->getPHID()))
       ->execute();
 
     if (count($artifacts) === 0) {
       return null;
     }
 
     $list = new PHUIObjectItemListView();
 
     foreach ($artifacts as $artifact) {
       $list->addItem($artifact->getObjectItemView($viewer));
     }
 
     $header = id(new PHUIHeaderView())
       ->setHeader(pht('Build Artifacts'))
       ->setUser($viewer);
 
     $box = id(new PHUIObjectBoxView())
       ->setHeader($header);
 
     return array($box, $list);
   }
 
   private function buildLog(
     HarbormasterBuild $build,
     HarbormasterBuildTarget $build_target) {
 
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $limit = $request->getInt('l', 25);
 
     $logs = id(new HarbormasterBuildLogQuery())
       ->setViewer($viewer)
       ->withBuildTargetPHIDs(array($build_target->getPHID()))
       ->execute();
 
     $log_boxes = array();
     foreach ($logs as $log) {
       $start = 1;
       $lines = preg_split("/\r\n|\r|\n/", $log->getLogText());
       if ($limit !== 0) {
         $start = count($lines) - $limit;
         if ($start >= 1) {
           $lines = array_slice($lines, -$limit, $limit);
         } else {
           $start = 1;
         }
       }
       $log_view = new ShellLogView();
       $log_view->setLines($lines);
       $log_view->setStart($start);
 
       $header = id(new PHUIHeaderView())
         ->setHeader(pht(
           'Build Log %d (%s - %s)',
           $log->getID(),
           $log->getLogSource(),
           $log->getLogType()))
         ->setSubheader($this->createLogHeader($build, $log))
         ->setUser($viewer);
 
       $log_boxes[] = id(new PHUIObjectBoxView())
         ->setHeader($header)
         ->setForm($log_view);
     }
 
     return $log_boxes;
   }
 
   private function createLogHeader($build, $log) {
     $request = $this->getRequest();
     $limit = $request->getInt('l', 25);
 
     $lines_25 = $this->getApplicationURI('/build/'.$build->getID().'/?l=25');
     $lines_50 = $this->getApplicationURI('/build/'.$build->getID().'/?l=50');
     $lines_100 =
       $this->getApplicationURI('/build/'.$build->getID().'/?l=100');
     $lines_0 = $this->getApplicationURI('/build/'.$build->getID().'/?l=0');
 
     $link_25 = phutil_tag('a', array('href' => $lines_25), pht('25'));
     $link_50 = phutil_tag('a', array('href' => $lines_50), pht('50'));
     $link_100 = phutil_tag('a', array('href' => $lines_100), pht('100'));
     $link_0 = phutil_tag('a', array('href' => $lines_0), pht('Unlimited'));
 
     if ($limit === 25) {
       $link_25 = phutil_tag('strong', array(), $link_25);
     } else if ($limit === 50) {
       $link_50 = phutil_tag('strong', array(), $link_50);
     } else if ($limit === 100) {
       $link_100 = phutil_tag('strong', array(), $link_100);
     } else if ($limit === 0) {
       $link_0 = phutil_tag('strong', array(), $link_0);
     }
 
     return phutil_tag(
       'span',
       array(),
       array(
         $link_25,
         ' - ',
         $link_50,
         ' - ',
         $link_100,
         ' - ',
         $link_0,
         ' Lines'));
   }
 
   private function buildActionList(HarbormasterBuild $build) {
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $id = $build->getID();
 
     $list = id(new PhabricatorActionListView())
       ->setUser($viewer)
       ->setObject($build)
       ->setObjectURI("/build/{$id}");
 
     $can_restart = $build->canRestartBuild();
     $can_stop = $build->canStopBuild();
     $can_resume = $build->canResumeBuild();
 
     $list->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Restart Build'))
         ->setIcon('fa-backward')
         ->setHref($this->getApplicationURI('/build/restart/'.$id.'/'))
         ->setDisabled(!$can_restart)
         ->setWorkflow(true));
 
     $list->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Stop Build'))
         ->setIcon('fa-stop')
         ->setHref($this->getApplicationURI('/build/stop/'.$id.'/'))
         ->setDisabled(!$can_stop)
         ->setWorkflow(true));
 
     $list->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Resume Build'))
         ->setIcon('fa-play')
         ->setHref($this->getApplicationURI('/build/resume/'.$id.'/'))
         ->setDisabled(!$can_resume)
         ->setWorkflow(true));
 
     return $list;
   }
 
   private function buildPropertyLists(
     PHUIObjectBoxView $box,
     HarbormasterBuild $build,
     PhabricatorActionListView $actions) {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $properties = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setObject($build)
       ->setActionList($actions);
     $box->addPropertyList($properties);
 
     $properties->addProperty(
       pht('Status'),
       $this->getStatus($build));
 
     $handles = id(new PhabricatorHandleQuery())
       ->setViewer($viewer)
       ->withPHIDs(array(
         $build->getBuildablePHID(),
         $build->getBuildPlanPHID()))
       ->execute();
 
     $properties->addProperty(
       pht('Buildable'),
       $handles[$build->getBuildablePHID()]->renderLink());
 
     $properties->addProperty(
       pht('Build Plan'),
       $handles[$build->getBuildPlanPHID()]->renderLink());
 
   }
 
   private function getStatus(HarbormasterBuild $build) {
     if ($build->isStopping()) {
       return pht('Stopping');
     }
 
     return HarbormasterBuild::getBuildStatusName($build->getBuildStatus());
   }
 
   private function buildMessages(array $messages) {
     $viewer = $this->getRequest()->getUser();
 
     if ($messages) {
       $handles = id(new PhabricatorHandleQuery())
         ->setViewer($viewer)
         ->withPHIDs(mpull($messages, 'getAuthorPHID'))
         ->execute();
     } else {
       $handles = array();
     }
 
     $rows = array();
     foreach ($messages as $message) {
       $rows[] = array(
         $message->getID(),
         $handles[$message->getAuthorPHID()]->renderLink(),
         $message->getType(),
         $message->getIsConsumed() ? pht('Consumed') : null,
         phabricator_datetime($message->getDateCreated(), $viewer),
       );
     }
 
     $table = new AphrontTableView($rows);
     $table->setNoDataString(pht('No messages for this build target.'));
     $table->setHeaders(
       array(
         pht('ID'),
         pht('From'),
         pht('Type'),
         pht('Consumed'),
         pht('Received'),
       ));
     $table->setColumnClasses(
       array(
         '',
         '',
         'wide',
         '',
         'date',
       ));
 
     $box = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Build Target Messages'))
       ->appendChild($table);
 
     return $box;
   }
 
 
 
 }
diff --git a/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php b/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php
index 4bb38230c6..4486da3a1e 100644
--- a/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php
+++ b/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php
@@ -1,231 +1,231 @@
 <?php
 
 final class HarbormasterBuildableSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getApplicationClassName() {
     return 'PhabricatorApplicationHarbormaster';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $revisions = $this->readPHIDsFromRequest(
       $request,
       'revisions',
       array(
         DifferentialPHIDTypeRevision::TYPECONST,
       ));
 
     $repositories = $this->readPHIDsFromRequest(
       $request,
       'repositories',
       array(
         PhabricatorRepositoryPHIDTypeRepository::TYPECONST,
       ));
 
     $container_phids = array_merge($revisions, $repositories);
     $saved->setParameter('containerPHIDs', $container_phids);
 
     $commits = $this->readPHIDsFromRequest(
       $request,
       'commits',
       array(
         PhabricatorRepositoryPHIDTypeCommit::TYPECONST,
       ));
 
     $diffs = $this->readListFromRequest($request, 'diffs');
     if ($diffs) {
       $diffs = id(new DifferentialDiffQuery())
         ->setViewer($this->requireViewer())
         ->withIDs($diffs)
         ->execute();
       $diffs = mpull($diffs, 'getPHID', 'getPHID');
     }
 
     $buildable_phids = array_merge($commits, $diffs);
     $saved->setParameter('buildablePHIDs', $buildable_phids);
 
     $saved->setParameter(
       'manual',
       $this->readBoolFromRequest($request, 'manual'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new HarbormasterBuildableQuery())
       ->needContainerHandles(true)
       ->needBuildableHandles(true);
 
     $container_phids = $saved->getParameter('containerPHIDs', array());
     if ($container_phids) {
       $query->withContainerPHIDs($container_phids);
     }
 
     $buildable_phids = $saved->getParameter('buildablePHIDs', array());
 
     if ($buildable_phids) {
       $query->withBuildablePHIDs($buildable_phids);
     }
 
     $manual = $saved->getParameter('manual');
     if ($manual !== null) {
       $query->withManualBuildables($manual);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $container_phids = $saved_query->getParameter('containerPHIDs', array());
     $buildable_phids = $saved_query->getParameter('buildablePHIDs', array());
 
     $all_phids = array_merge($container_phids, $buildable_phids);
 
     $revision_names = array();
     $diff_names = array();
     $repository_names = array();
     $commit_names = array();
 
     if ($all_phids) {
       $objects = id(new PhabricatorObjectQuery())
         ->setViewer($this->requireViewer())
         ->withPHIDs($all_phids)
         ->execute();
 
       foreach ($all_phids as $phid) {
         $object = idx($objects, $phid);
         if (!$object) {
           continue;
         }
 
         if ($object instanceof DifferentialRevision) {
           $revision_names[] = 'D'.$object->getID();
         } else if ($object instanceof DifferentialDiff) {
           $diff_names[] = $object->getID();
         } else if ($object instanceof PhabricatorRepository) {
           $repository_names[] = 'r'.$object->getCallsign();
         } else if ($object instanceof PhabricatorRepositoryCommit) {
           $repository = $object->getRepository();
           $commit_names[] = $repository->formatCommitName(
             $object->getCommitIdentifier());
         }
       }
     }
 
     $form
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Differential Revisions'))
           ->setName('revisions')
           ->setValue(implode(', ', $revision_names)))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Differential Diffs'))
           ->setName('diffs')
           ->setValue(implode(', ', $diff_names)))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Repositories'))
           ->setName('repositories')
           ->setValue(implode(', ', $repository_names)))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel(pht('Commits'))
           ->setName('commits')
           ->setValue(implode(', ', $commit_names)))
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setLabel(pht('Origin'))
           ->setName('manual')
           ->setValue($this->getBoolFromQuery($saved_query, 'manual'))
           ->setOptions(
             array(
               '' => pht('(All Origins)'),
               'true' => pht('Manual Buildables'),
               'false' => pht('Automatic Buildables'),
             )));
   }
 
   protected function getURI($path) {
     return '/harbormaster/'.$path;
   }
 
   public function getBuiltinQueryNames() {
     $names = array(
       'all' => pht('All Buildables'),
     );
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
 
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function renderResultList(
     array $buildables,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($buildables, 'HarbormasterBuildable');
 
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     $list->setCards(true);
     foreach ($buildables as $buildable) {
       $id = $buildable->getID();
 
       $item = id(new PHUIObjectItemView())
         ->setHeader(pht('Buildable %d', $buildable->getID()));
       if ($buildable->getContainerHandle() !== null) {
         $item->addAttribute($buildable->getContainerHandle()->getName());
       }
       if ($buildable->getBuildableHandle() !== null) {
         $item->addAttribute($buildable->getBuildableHandle()->getFullName());
       }
 
       if ($id) {
         $item->setHref("/B{$id}");
       }
 
       if ($buildable->getIsManualBuildable()) {
-        $item->addIcon('wrench-grey', pht('Manual'));
+        $item->addIcon('fa-wrench grey', pht('Manual'));
       }
 
       switch ($buildable->getBuildableStatus()) {
         case HarbormasterBuildable::STATUS_PASSED:
           $item->setBarColor('green');
           $item->addByline(pht('Build Passed'));
           break;
         case HarbormasterBuildable::STATUS_FAILED:
           $item->setBarColor('red');
           $item->addByline(pht('Build Failed'));
           break;
         case HarbormasterBuildable::STATUS_BUILDING:
           $item->setBarColor('red');
           $item->addByline(pht('Building'));
           break;
 
       }
 
       $list->addItem($item);
 
     }
 
     return $list;
   }
 }
diff --git a/src/applications/herald/controller/HeraldRuleViewController.php b/src/applications/herald/controller/HeraldRuleViewController.php
index cea388ad3e..78c61194d1 100644
--- a/src/applications/herald/controller/HeraldRuleViewController.php
+++ b/src/applications/herald/controller/HeraldRuleViewController.php
@@ -1,189 +1,189 @@
 <?php
 
 final class HeraldRuleViewController extends HeraldController {
 
   private $id;
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $rule = id(new HeraldRuleQuery())
       ->setViewer($viewer)
       ->withIDs(array($this->id))
       ->needConditionsAndActions(true)
       ->executeOne();
     if (!$rule) {
       return new Aphront404Response();
     }
 
     $header = id(new PHUIHeaderView())
       ->setUser($viewer)
       ->setHeader($rule->getName())
       ->setPolicyObject($rule);
 
     if ($rule->getIsDisabled()) {
       $header->setStatus(
-        'oh-open',
-        'red',
+        'fa-ban',
+        'dark',
         pht('Disabled'));
     } else {
       $header->setStatus(
-        'oh-open',
-        null,
+        'fa-check',
+        'bluegrey',
         pht('Active'));
     }
 
     $actions = $this->buildActionView($rule);
     $properties = $this->buildPropertyView($rule, $actions);
 
     $id = $rule->getID();
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb("H{$id}");
     $crumbs->setActionList($actions);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
       ->addPropertyList($properties);
 
     $timeline = $this->buildTimeline($rule);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $timeline,
       ),
       array(
         'title' => $rule->getName(),
         'device' => true,
       ));
   }
 
   private function buildActionView(HeraldRule $rule) {
     $viewer = $this->getRequest()->getUser();
     $id = $rule->getID();
 
     $view = id(new PhabricatorActionListView())
       ->setUser($viewer)
       ->setObject($rule)
       ->setObjectURI($this->getApplicationURI("rule/{$id}/"));
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $rule,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Rule'))
         ->setHref($this->getApplicationURI("edit/{$id}/"))
         ->setIcon('fa-pencil')
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     if ($rule->getIsDisabled()) {
       $disable_uri = "disable/{$id}/enable/";
       $disable_icon = 'fa-check-circle-o';
       $disable_name = pht('Enable Rule');
     } else {
       $disable_uri = "disable/{$id}/disable/";
       $disable_icon = 'fa-ban';
       $disable_name = pht('Disable Rule');
     }
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Disable Rule'))
         ->setHref($this->getApplicationURI($disable_uri))
         ->setIcon($disable_icon)
         ->setName($disable_name)
         ->setDisabled(!$can_edit)
         ->setWorkflow(true));
 
     return $view;
   }
 
   private function buildPropertyView(
     HeraldRule $rule,
     PhabricatorActionListView $actions) {
 
     $viewer = $this->getRequest()->getUser();
 
     $this->loadHandles(HeraldAdapter::getHandlePHIDs($rule));
 
     $view = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setObject($rule)
       ->setActionList($actions);
 
     $view->addProperty(
       pht('Rule Type'),
       idx(HeraldRuleTypeConfig::getRuleTypeMap(), $rule->getRuleType()));
 
     if ($rule->isPersonalRule()) {
       $view->addProperty(
         pht('Author'),
         $this->getHandle($rule->getAuthorPHID())->renderLink());
     }
 
 
     $adapter = HeraldAdapter::getAdapterForContentType($rule->getContentType());
     if ($adapter) {
       $view->addProperty(
         pht('Applies To'),
         idx(
           HeraldAdapter::getEnabledAdapterMap($viewer),
           $rule->getContentType()));
 
       if ($rule->isObjectRule()) {
         $view->addProperty(
           pht('Trigger Object'),
           $this->getHandle($rule->getTriggerObjectPHID())->renderLink());
       }
 
       $view->invokeWillRenderEvent();
 
       $view->addSectionHeader(
         pht('Rule Description'),
         PHUIPropertyListView::ICON_SUMMARY);
       $view->addTextContent(
         $adapter->renderRuleAsText($rule, $this->getLoadedHandles()));
     }
 
     return $view;
   }
 
   private function buildTimeline(HeraldRule $rule) {
     $viewer = $this->getRequest()->getUser();
 
     $xactions = id(new HeraldTransactionQuery())
       ->setViewer($viewer)
       ->withObjectPHIDs(array($rule->getPHID()))
       ->needComments(true)
       ->execute();
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($viewer);
     foreach ($xactions as $xaction) {
       if ($xaction->getComment()) {
         $engine->addObject(
           $xaction->getComment(),
           PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
       }
     }
     $engine->process();
 
     return id(new PhabricatorApplicationTransactionView())
       ->setUser($viewer)
       ->setObjectPHID($rule->getPHID())
       ->setTransactions($xactions)
       ->setMarkupEngine($engine);
   }
 
 }
diff --git a/src/applications/maniphest/constants/ManiphestTaskStatus.php b/src/applications/maniphest/constants/ManiphestTaskStatus.php
index f7b552cdfc..d3a75050ac 100644
--- a/src/applications/maniphest/constants/ManiphestTaskStatus.php
+++ b/src/applications/maniphest/constants/ManiphestTaskStatus.php
@@ -1,313 +1,312 @@
 <?php
 
 /**
  * @task validate Configuration Validation
  */
 final class ManiphestTaskStatus extends ManiphestConstants {
 
   const STATUS_OPEN               = 'open';
   const STATUS_CLOSED_RESOLVED    = 'resolved';
   const STATUS_CLOSED_WONTFIX     = 'wontfix';
   const STATUS_CLOSED_INVALID     = 'invalid';
   const STATUS_CLOSED_DUPLICATE   = 'duplicate';
   const STATUS_CLOSED_SPITE       = 'spite';
 
   const SPECIAL_DEFAULT     = 'default';
   const SPECIAL_CLOSED      = 'closed';
   const SPECIAL_DUPLICATE   = 'duplicate';
 
   private static function getStatusConfig() {
     return PhabricatorEnv::getEnvConfig('maniphest.statuses');
   }
 
   private static function getEnabledStatusMap() {
     $spec = self::getStatusConfig();
 
     $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
     foreach ($spec as $const => $status) {
       if ($is_serious && !empty($status['silly'])) {
         unset($spec[$const]);
         continue;
       }
     }
 
     return $spec;
   }
 
   public static function getTaskStatusMap() {
     return ipull(self::getEnabledStatusMap(), 'name');
   }
 
   public static function getTaskStatusName($status) {
     return self::getStatusAttribute($status, 'name', pht('Unknown Status'));
   }
 
   public static function getTaskStatusFullName($status) {
     $name = self::getStatusAttribute($status, 'name.full');
     if ($name !== null) {
       return $name;
     }
 
     return self::getStatusAttribute($status, 'name', pht('Unknown Status'));
   }
 
   public static function renderFullDescription($status) {
     if (self::isOpenStatus($status)) {
       $color = 'status';
-      $icon = 'oh-open';
+      $icon = 'fa-square-o bluegrey';
     } else {
       $color = 'status-dark';
-      $icon = 'oh-closed-dark';
+      $icon = 'fa-check-square-o';
     }
 
     $img = id(new PHUIIconView())
-      ->setSpriteSheet(PHUIIconView::SPRITE_STATUS)
-      ->setSpriteIcon($icon);
+      ->setIconFont($icon);
 
     $tag = phutil_tag(
       'span',
       array(
         'class' => 'phui-header-'.$color.' plr',
       ),
       array(
         $img,
         self::getTaskStatusFullName($status),
       ));
 
     return $tag;
   }
 
   private static function getSpecialStatus($special) {
     foreach (self::getStatusConfig() as $const => $status) {
       if (idx($status, 'special') == $special) {
         return $const;
       }
     }
     return null;
   }
 
   public static function getDefaultStatus() {
     return self::getSpecialStatus(self::SPECIAL_DEFAULT);
   }
 
   public static function getDefaultClosedStatus() {
     return self::getSpecialStatus(self::SPECIAL_CLOSED);
   }
 
   public static function getDuplicateStatus() {
     return self::getSpecialStatus(self::SPECIAL_DUPLICATE);
   }
 
   public static function getOpenStatusConstants() {
     $result = array();
     foreach (self::getEnabledStatusMap() as $const => $status) {
       if (empty($status['closed'])) {
         $result[] = $const;
       }
     }
     return $result;
   }
 
   public static function getClosedStatusConstants() {
     $all = array_keys(self::getTaskStatusMap());
     $open = self::getOpenStatusConstants();
     return array_diff($all, $open);
   }
 
   public static function isOpenStatus($status) {
     foreach (self::getOpenStatusConstants() as $constant) {
       if ($status == $constant) {
         return true;
       }
     }
     return false;
   }
 
   public static function isClosedStatus($status) {
     return !self::isOpenStatus($status);
   }
 
   public static function getStatusActionName($status) {
     return self::getStatusAttribute($status, 'name.action');
   }
 
   public static function getStatusColor($status) {
     return self::getStatusAttribute($status, 'transaction.color');
   }
 
   public static function getStatusIcon($status) {
     return self::getStatusAttribute($status, 'transaction.icon');
   }
 
   public static function getStatusPrefixMap() {
     $map = array();
     foreach (self::getEnabledStatusMap() as $const => $status) {
       foreach (idx($status, 'prefixes', array()) as $prefix) {
         $map[$prefix] = $const;
       }
     }
 
     $map += array(
       'ref'           => null,
       'refs'          => null,
       'references'    => null,
       'cf.'           => null,
     );
 
     return $map;
   }
 
   public static function getStatusSuffixMap() {
     $map = array();
     foreach (self::getEnabledStatusMap() as $const => $status) {
       foreach (idx($status, 'suffixes', array()) as $prefix) {
         $map[$prefix] = $const;
       }
     }
     return $map;
   }
 
   private static function getStatusAttribute($status, $key, $default = null) {
     $config = self::getStatusConfig();
 
     $spec = idx($config, $status);
     if ($spec) {
       return idx($spec, $key, $default);
     }
 
     return $default;
   }
 
 
 /* -(  Configuration Validation  )------------------------------------------- */
 
 
   /**
    * @task validate
    */
   public static function isValidStatusConstant($constant) {
     if (strlen($constant) > 12) {
       return false;
     }
     if (!preg_match('/^[a-z0-9]+\z/', $constant)) {
       return false;
     }
     return true;
   }
 
 
   /**
    * @task validate
    */
   public static function validateConfiguration(array $config) {
     foreach ($config as $key => $value) {
       if (!self::isValidStatusConstant($key)) {
         throw new Exception(
           pht(
             'Key "%s" is not a valid status constant. Status constants must '.
             'be 1-12 characters long and contain only lowercase letters (a-z) '.
             'and digits (0-9). For example, "%s" or "%s" are reasonable '.
             'choices.',
             $key,
             'open',
             'closed'));
       }
       if (!is_array($value)) {
         throw new Exception(
           pht(
             'Value for key "%s" should be a dictionary.',
             $key));
       }
 
       PhutilTypeSpec::checkMap(
         $value,
         array(
           'name' => 'string',
           'name.full' => 'optional string',
           'name.action' => 'optional string',
           'closed' => 'optional bool',
           'special' => 'optional string',
           'transaction.icon' => 'optional string',
           'transaction.color' => 'optional string',
           'silly' => 'optional bool',
           'prefixes' => 'optional list<string>',
           'suffixes' => 'optional list<string>',
         ));
     }
 
     $special_map = array();
     foreach ($config as $key => $value) {
       $special = idx($value, 'special');
       if (!$special) {
         continue;
       }
 
       if (isset($special_map[$special])) {
         throw new Exception(
           pht(
             'Configuration has two statuses both marked with the special '.
             'attribute "%s" ("%s" and "%s"). There should be only one.',
             $special,
             $special_map[$special],
             $key));
       }
 
       switch ($special) {
         case self::SPECIAL_DEFAULT:
           if (!empty($value['closed'])) {
             throw new Exception(
               pht(
                 'Status "%s" is marked as default, but it is a closed '.
                 'status. The default status should be an open status.',
                 $key));
           }
           break;
         case self::SPECIAL_CLOSED:
           if (empty($value['closed'])) {
             throw new Exception(
               pht(
                 'Status "%s" is marked as the default status for closing '.
                 'tasks, but is not a closed status. It should be a closed '.
                 'status.',
                 $key));
           }
           break;
         case self::SPECIAL_DUPLICATE:
           if (empty($value['closed'])) {
             throw new Exception(
               pht(
                 'Status "%s" is marked as the status for closing tasks as '.
                 'duplicates, but it is not a closed status. It should '.
                 'be a closed status.',
                 $key));
           }
           break;
       }
 
       $special_map[$special] = $key;
     }
 
     // NOTE: We're not explicitly validating that we have at least one open
     // and one closed status, because the DEFAULT and CLOSED specials imply
     // that to be true. If those change in the future, that might become a
     // reasonable thing to validate.
 
     $required = array(
       self::SPECIAL_DEFAULT,
       self::SPECIAL_CLOSED,
       self::SPECIAL_DUPLICATE,
     );
 
     foreach ($required as $required_special) {
       if (!isset($special_map[$required_special])) {
         throw new Exception(
           pht(
             'Configuration defines no task status with special attribute '.
             '"%s", but you must specify a status which fills this special '.
             'role.',
             $required_special));
       }
     }
   }
 
 }
diff --git a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
index a932a839af..b2cc713181 100644
--- a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
+++ b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
@@ -1,153 +1,153 @@
 <?php
 
 final class PhabricatorApplicationDetailViewController
   extends PhabricatorApplicationsController{
 
   private $application;
 
   public function willProcessRequest(array $data) {
     $this->application = $data['application'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $selected = id(new PhabricatorApplicationQuery())
       ->setViewer($user)
       ->withClasses(array($this->application))
       ->executeOne();
     if (!$selected) {
       return new Aphront404Response();
     }
 
     $title = $selected->getName();
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb($selected->getName());
 
     $header = id(new PHUIHeaderView())
       ->setHeader($title)
       ->setUser($user)
       ->setPolicyObject($selected);
 
     if ($selected->isInstalled()) {
-      $header->setStatus('oh-ok', null, pht('Installed'));
+      $header->setStatus('fa-check', 'bluegrey', pht('Installed'));
     } else {
-      $header->setStatus('policy-noone', null, pht('Uninstalled'));
+      $header->setStatus('fa-ban', 'dark', pht('Uninstalled'));
     }
 
     $actions = $this->buildActionView($user, $selected);
     $properties = $this->buildPropertyView($selected, $actions);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
       ->addPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
       ),
       array(
         'title' => $title,
         'device' => true,
       ));
   }
 
   private function buildPropertyView(
     PhabricatorApplication $application,
     PhabricatorActionListView $actions) {
 
     $viewer = $this->getRequest()->getUser();
 
     $properties = id(new PHUIPropertyListView())
       ->addProperty(pht('Description'), $application->getShortDescription());
     $properties->setActionList($actions);
 
     if ($application->isBeta()) {
       $properties->addProperty(
         pht('Release'),
         pht('Beta'));
     }
 
     $descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
       $viewer,
       $application);
 
     $properties->addSectionHeader(pht('Policies'));
 
     foreach ($application->getCapabilities() as $capability) {
       $properties->addProperty(
         $application->getCapabilityLabel($capability),
         idx($descriptions, $capability));
     }
 
     return $properties;
   }
 
   private function buildActionView(
     PhabricatorUser $user,
     PhabricatorApplication $selected) {
 
     $view = id(new PhabricatorActionListView())
       ->setUser($user)
       ->setObjectURI($this->getRequest()->getRequestURI());
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $user,
       $selected,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $edit_uri = $this->getApplicationURI('edit/'.get_class($selected).'/');
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Policies'))
         ->setIcon('fa-pencil')
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit)
         ->setHref($edit_uri));
 
     if ($selected->canUninstall()) {
       if ($selected->isInstalled()) {
         $view->addAction(
           id(new PhabricatorActionView())
             ->setName(pht('Uninstall'))
             ->setIcon('fa-times')
             ->setDisabled(!$can_edit)
             ->setWorkflow(true)
             ->setHref(
               $this->getApplicationURI(get_class($selected).'/uninstall/')));
       } else {
         $action = id(new PhabricatorActionView())
           ->setName(pht('Install'))
           ->setIcon('fa-plus')
           ->setDisabled(!$can_edit)
           ->setWorkflow(true)
           ->setHref(
              $this->getApplicationURI(get_class($selected).'/install/'));
 
         $beta_enabled = PhabricatorEnv::getEnvConfig(
           'phabricator.show-beta-applications');
         if ($selected->isBeta() && !$beta_enabled) {
           $action->setDisabled(true);
         }
 
         $view->addAction($action);
       }
     } else {
       $view->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Uninstall'))
           ->setIcon('fa-times')
           ->setWorkflow(true)
           ->setDisabled(true)
           ->setHref(
             $this->getApplicationURI(get_class($selected).'/uninstall/')));
     }
 
     return $view;
   }
 
 }
diff --git a/src/applications/passphrase/controller/PassphraseCredentialViewController.php b/src/applications/passphrase/controller/PassphraseCredentialViewController.php
index bab9e17629..3c5a836761 100644
--- a/src/applications/passphrase/controller/PassphraseCredentialViewController.php
+++ b/src/applications/passphrase/controller/PassphraseCredentialViewController.php
@@ -1,208 +1,208 @@
 <?php
 
 final class PassphraseCredentialViewController extends PassphraseController {
 
   private $id;
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $credential = id(new PassphraseCredentialQuery())
       ->setViewer($viewer)
       ->withIDs(array($this->id))
       ->executeOne();
     if (!$credential) {
       return new Aphront404Response();
     }
 
     $type = PassphraseCredentialType::getTypeByConstant(
       $credential->getCredentialType());
     if (!$type) {
       throw new Exception(pht('Credential has invalid type "%s"!', $type));
     }
 
     $xactions = id(new PassphraseCredentialTransactionQuery())
       ->setViewer($viewer)
       ->withObjectPHIDs(array($credential->getPHID()))
       ->execute();
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($viewer);
 
     $timeline = id(new PhabricatorApplicationTransactionView())
       ->setUser($viewer)
       ->setObjectPHID($credential->getPHID())
       ->setTransactions($xactions);
 
     $title = pht('%s %s', 'K'.$credential->getID(), $credential->getName());
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb('K'.$credential->getID());
 
     $header = $this->buildHeaderView($credential);
     $actions = $this->buildActionView($credential, $type);
     $properties = $this->buildPropertyView($credential, $type, $actions);
 
     $box = id(new PHUIObjectBoxView())
       ->setHeader($header)
       ->addPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $box,
         $timeline,
       ),
       array(
         'title' => $title,
         'device' => true,
       ));
   }
 
   private function buildHeaderView(PassphraseCredential $credential) {
     $viewer = $this->getRequest()->getUser();
 
     $header = id(new PHUIHeaderView())
       ->setUser($viewer)
       ->setHeader($credential->getName())
       ->setPolicyObject($credential);
 
     if ($credential->getIsDestroyed()) {
-      $header->setStatus('reject', 'red', pht('Destroyed'));
+      $header->setStatus('fa-ban', 'red', pht('Destroyed'));
     }
 
     return $header;
   }
 
   private function buildActionView(
     PassphraseCredential $credential,
     PassphraseCredentialType $type) {
     $viewer = $this->getRequest()->getUser();
 
     $id = $credential->getID();
 
     $is_locked = $credential->getIsLocked();
     if ($is_locked) {
       $credential_lock_text = pht('Locked Permanently');
       $credential_lock_icon = 'fa-lock';
     } else {
       $credential_lock_text = pht('Lock Permanently');
       $credential_lock_icon = 'fa-unlock';
     }
 
     $actions = id(new PhabricatorActionListView())
       ->setObjectURI('/K'.$id)
       ->setUser($viewer);
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $credential,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Credential'))
         ->setIcon('fa-pencil')
         ->setHref($this->getApplicationURI("edit/{$id}/"))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     if (!$credential->getIsDestroyed()) {
       $actions->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Destroy Credential'))
           ->setIcon('fa-times')
           ->setHref($this->getApplicationURI("destroy/{$id}/"))
           ->setDisabled(!$can_edit)
           ->setWorkflow(true));
 
       $actions->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Show Secret'))
           ->setIcon('fa-eye')
           ->setHref($this->getApplicationURI("reveal/{$id}/"))
           ->setDisabled(!$can_edit || $is_locked)
           ->setWorkflow(true));
 
       if ($type->hasPublicKey()) {
         $actions->addAction(
           id(new PhabricatorActionView())
             ->setName(pht('Show Public Key'))
             ->setIcon('fa-download')
             ->setHref($this->getApplicationURI("public/{$id}/"))
             ->setWorkflow(true)
             ->setDisabled($is_locked));
       }
 
       $actions->addAction(
         id(new PhabricatorActionView())
           ->setName($credential_lock_text)
           ->setIcon($credential_lock_icon)
           ->setHref($this->getApplicationURI("lock/{$id}/"))
           ->setDisabled($is_locked)
           ->setWorkflow(true));
     }
 
 
     return $actions;
   }
 
   private function buildPropertyView(
     PassphraseCredential $credential,
     PassphraseCredentialType $type,
     PhabricatorActionListView $actions) {
     $viewer = $this->getRequest()->getUser();
 
     $properties = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setObject($credential)
       ->setActionList($actions);
 
     $properties->addProperty(
       pht('Credential Type'),
       $type->getCredentialTypeName());
 
     $descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
       $viewer,
       $credential);
 
     $properties->addProperty(
       pht('Editable By'),
       $descriptions[PhabricatorPolicyCapability::CAN_EDIT]);
 
     $properties->addProperty(
       pht('Username'),
       $credential->getUsername());
 
     $used_by_phids = PhabricatorEdgeQuery::loadDestinationPHIDs(
       $credential->getPHID(),
       PhabricatorEdgeConfig::TYPE_CREDENTIAL_USED_BY_OBJECT);
 
     if ($used_by_phids) {
       $this->loadHandles($used_by_phids);
       $properties->addProperty(
         pht('Used By'),
         $this->renderHandlesForPHIDs($used_by_phids));
     }
 
     $description = $credential->getDescription();
     if (strlen($description)) {
       $properties->addSectionHeader(
         pht('Description'),
         PHUIPropertyListView::ICON_SUMMARY);
       $properties->addTextContent(
         PhabricatorMarkupEngine::renderOneObject(
           id(new PhabricatorMarkupOneOff())
             ->setContent($description),
           'default',
           $viewer));
     }
 
     return $properties;
   }
 
 }
diff --git a/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php b/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php
index e4e99790ca..6028547b50 100644
--- a/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php
+++ b/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php
@@ -1,116 +1,116 @@
 <?php
 
 final class PassphraseCredentialSearchEngine
   extends PhabricatorApplicationSearchEngine {
 
   public function getApplicationClassName() {
     return 'PhabricatorApplicationPassphrase';
   }
 
   public function buildSavedQueryFromRequest(AphrontRequest $request) {
     $saved = new PhabricatorSavedQuery();
 
     $saved->setParameter(
       'isDestroyed',
       $this->readBoolFromRequest($request, 'isDestroyed'));
 
     return $saved;
   }
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new PassphraseCredentialQuery());
 
     $destroyed = $saved->getParameter('isDestroyed');
     if ($destroyed !== null) {
       $query->withIsDestroyed($destroyed);
     }
 
     return $query;
   }
 
   public function buildSearchForm(
     AphrontFormView $form,
     PhabricatorSavedQuery $saved_query) {
 
     $form->appendChild(
       id(new AphrontFormSelectControl())
         ->setName('isDestroyed')
         ->setLabel(pht('Status'))
         ->setValue($this->getBoolFromQuery($saved_query, 'isDestroyed'))
         ->setOptions(
           array(
             '' => pht('Show All Credentials'),
             'false' => pht('Show Only Active Credentials'),
             'true' => pht('Show Only Destroyed Credentials'),
           )));
 
   }
 
   protected function getURI($path) {
     return '/passphrase/'.$path;
   }
 
   public function getBuiltinQueryNames() {
     $names = array(
       'active' => pht('Active Credentials'),
       'all' => pht('All Credentials'),
     );
 
     return $names;
   }
 
   public function buildSavedQueryFromBuiltin($query_key) {
 
     $query = $this->newSavedQuery();
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
       case 'all':
         return $query;
       case 'active':
         return $query->setParameter('isDestroyed', false);
     }
 
     return parent::buildSavedQueryFromBuiltin($query_key);
   }
 
   protected function renderResultList(
     array $credentials,
     PhabricatorSavedQuery $query,
     array $handles) {
     assert_instances_of($credentials, 'PassphraseCredential');
 
     $viewer = $this->requireViewer();
 
     $list = new PHUIObjectItemListView();
     $list->setUser($viewer);
     foreach ($credentials as $credential) {
 
       $item = id(new PHUIObjectItemView())
         ->setObjectName('K'.$credential->getID())
         ->setHeader($credential->getName())
         ->setHref('/K'.$credential->getID())
         ->setObject($credential);
 
       $item->addAttribute(
         pht('Login: %s', $credential->getUsername()));
 
       if ($credential->getIsDestroyed()) {
-        $item->addIcon('disable', pht('Destroyed'));
+        $item->addIcon('fa-ban', pht('Destroyed'));
         $item->setDisabled(true);
       }
 
       $type = PassphraseCredentialType::getTypeByConstant(
         $credential->getCredentialType());
       if ($type) {
-        $item->addIcon('wrench', $type->getCredentialTypeName());
+        $item->addIcon('fa-wrench', $type->getCredentialTypeName());
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
 
 }
diff --git a/src/applications/people/phid/PhabricatorPeoplePHIDTypeUser.php b/src/applications/people/phid/PhabricatorPeoplePHIDTypeUser.php
index db6295006f..a4c344c326 100644
--- a/src/applications/people/phid/PhabricatorPeoplePHIDTypeUser.php
+++ b/src/applications/people/phid/PhabricatorPeoplePHIDTypeUser.php
@@ -1,90 +1,90 @@
 <?php
 
 final class PhabricatorPeoplePHIDTypeUser extends PhabricatorPHIDType {
 
   const TYPECONST = 'USER';
 
   public function getTypeConstant() {
     return self::TYPECONST;
   }
 
   public function getTypeName() {
     return pht('User');
   }
 
   public function getPHIDTypeApplicationClass() {
     return 'PhabricatorApplicationPeople';
   }
 
   public function getTypeIcon() {
-    return 'policy-all';
+    return 'fa-user bluegrey';
   }
 
   public function newObject() {
     return new PhabricatorUser();
   }
 
   protected function buildQueryForObjects(
     PhabricatorObjectQuery $query,
     array $phids) {
 
     return id(new PhabricatorPeopleQuery())
       ->withPHIDs($phids)
       ->needProfileImage(true)
       ->needStatus(true);
   }
 
   public function loadHandles(
     PhabricatorHandleQuery $query,
     array $handles,
     array $objects) {
 
     foreach ($handles as $phid => $handle) {
       $user = $objects[$phid];
       $realname = $user->getRealName();
 
       $handle->setName($user->getUsername());
       $handle->setURI('/p/'.$user->getUsername().'/');
       $handle->setFullName($user->getFullName());
       $handle->setImageURI($user->loadProfileImageURI());
       $handle->setDisabled(!$user->isUserActivated());
       if ($user->hasStatus()) {
         $status = $user->getStatus();
         $handle->setStatus($status->getTextStatus());
         $handle->setTitle($status->getTerseSummary($query->getViewer()));
       }
     }
 
   }
 
   public function canLoadNamedObject($name) {
     return preg_match('/^@.+/', $name);
   }
 
   public function loadNamedObjects(
     PhabricatorObjectQuery $query,
     array $names) {
 
     $id_map = array();
     foreach ($names as $name) {
       $id = substr($name, 1);
       $id_map[$id][] = $name;
     }
 
     $objects = id(new PhabricatorPeopleQuery())
       ->setViewer($query->getViewer())
       ->withUsernames(array_keys($id_map))
       ->execute();
 
     $results = array();
     foreach ($objects as $id => $object) {
       $username = $object->getUsername();
       foreach (idx($id_map, $username, array()) as $name) {
         $results[$name] = $object;
       }
     }
 
     return $results;
   }
 
 }
diff --git a/src/applications/policy/storage/PhabricatorPolicy.php b/src/applications/policy/storage/PhabricatorPolicy.php
index c32bb450a5..5240a64c80 100644
--- a/src/applications/policy/storage/PhabricatorPolicy.php
+++ b/src/applications/policy/storage/PhabricatorPolicy.php
@@ -1,355 +1,354 @@
 <?php
 
 final class PhabricatorPolicy
   extends PhabricatorPolicyDAO
   implements PhabricatorPolicyInterface {
 
   const ACTION_ALLOW = 'allow';
   const ACTION_DENY = 'deny';
 
   private $name;
   private $shortName;
   private $type;
   private $href;
   private $workflow;
   private $icon;
 
   protected $rules = array();
   protected $defaultAction = self::ACTION_DENY;
 
   private $ruleObjects = self::ATTACHABLE;
 
   public function getConfiguration() {
     return array(
       self::CONFIG_AUX_PHID => true,
       self::CONFIG_SERIALIZATION => array(
         'rules' => self::SERIALIZATION_JSON,
       ),
     ) + parent::getConfiguration();
   }
 
   public function generatePHID() {
     return PhabricatorPHID::generateNewPHID(
       PhabricatorPolicyPHIDTypePolicy::TYPECONST);
   }
 
   public static function newFromPolicyAndHandle(
     $policy_identifier,
     PhabricatorObjectHandle $handle = null) {
 
     $is_global = PhabricatorPolicyQuery::isGlobalPolicy($policy_identifier);
     if ($is_global) {
       return PhabricatorPolicyQuery::getGlobalPolicy($policy_identifier);
     }
 
     if (!$handle) {
       throw new Exception(
         "Policy identifier is an object PHID ('{$policy_identifier}'), but no ".
         "object handle was provided. A handle must be provided for object ".
         "policies.");
     }
 
     $handle_phid = $handle->getPHID();
     if ($policy_identifier != $handle_phid) {
       throw new Exception(
         "Policy identifier is an object PHID ('{$policy_identifier}'), but ".
         "the provided handle has a different PHID ('{$handle_phid}'). The ".
         "handle must correspond to the policy identifier.");
     }
 
     $policy = id(new PhabricatorPolicy())
       ->setPHID($policy_identifier)
       ->setHref($handle->getURI());
 
     $phid_type = phid_get_type($policy_identifier);
     switch ($phid_type) {
       case PhabricatorProjectPHIDTypeProject::TYPECONST:
         $policy->setType(PhabricatorPolicyType::TYPE_PROJECT);
         $policy->setName($handle->getName());
         break;
       case PhabricatorPeoplePHIDTypeUser::TYPECONST:
         $policy->setType(PhabricatorPolicyType::TYPE_USER);
         $policy->setName($handle->getFullName());
         break;
       case PhabricatorPolicyPHIDTypePolicy::TYPECONST:
         // TODO: This creates a weird handle-based version of a rule policy.
         // It behaves correctly, but can't be applied since it doesn't have
         // any rules. It is used to render transactions, and might need some
         // cleanup.
         break;
       default:
         $policy->setType(PhabricatorPolicyType::TYPE_MASKED);
         $policy->setName($handle->getFullName());
         break;
     }
 
     $policy->makeEphemeral();
 
     return $policy;
   }
 
   public function setType($type) {
     $this->type = $type;
     return $this;
   }
 
   public function getType() {
     if (!$this->type) {
       return PhabricatorPolicyType::TYPE_CUSTOM;
     }
     return $this->type;
   }
 
   public function setName($name) {
     $this->name = $name;
     return $this;
   }
 
   public function getName() {
     if (!$this->name) {
       return pht('Custom Policy');
     }
     return $this->name;
   }
 
   public function setShortName($short_name) {
     $this->shortName = $short_name;
     return $this;
   }
 
   public function getShortName() {
     if ($this->shortName) {
       return $this->shortName;
     }
     return $this->getName();
   }
 
   public function setHref($href) {
     $this->href = $href;
     return $this;
   }
 
   public function getHref() {
     return $this->href;
   }
 
   public function setWorkflow($workflow) {
     $this->workflow = $workflow;
     return $this;
   }
 
   public function getWorkflow() {
     return $this->workflow;
   }
 
   public function getIcon() {
     switch ($this->getType()) {
       case PhabricatorPolicyType::TYPE_GLOBAL:
         static $map = array(
-          PhabricatorPolicies::POLICY_PUBLIC  => 'policy-public',
-          PhabricatorPolicies::POLICY_USER    => 'policy-all',
-          PhabricatorPolicies::POLICY_ADMIN   => 'policy-admin',
-          PhabricatorPolicies::POLICY_NOONE   => 'policy-noone',
+          PhabricatorPolicies::POLICY_PUBLIC  => 'fa-globe',
+          PhabricatorPolicies::POLICY_USER    => 'fa-users',
+          PhabricatorPolicies::POLICY_ADMIN   => 'fa-eye',
+          PhabricatorPolicies::POLICY_NOONE   => 'fa-ban',
         );
-        return idx($map, $this->getPHID(), 'policy-unknown');
+        return idx($map, $this->getPHID(), 'fa-question-circle');
       case PhabricatorPolicyType::TYPE_USER:
-        return 'policy-user';
+        return 'fa-user';
       case PhabricatorPolicyType::TYPE_PROJECT:
-        return 'policy-project';
+        return 'fa-briefcase';
       case PhabricatorPolicyType::TYPE_CUSTOM:
       case PhabricatorPolicyType::TYPE_MASKED:
-        return 'policy-custom';
+        return 'fa-certificate';
       default:
-        return 'policy-unknown';
+        return 'fa-question-circle';
     }
   }
 
   public function getSortKey() {
     return sprintf(
       '%02d%s',
       PhabricatorPolicyType::getPolicyTypeOrder($this->getType()),
       $this->getSortName());
   }
 
   private function getSortName() {
     if ($this->getType() == PhabricatorPolicyType::TYPE_GLOBAL) {
       static $map = array(
         PhabricatorPolicies::POLICY_PUBLIC  => 0,
         PhabricatorPolicies::POLICY_USER    => 1,
         PhabricatorPolicies::POLICY_ADMIN   => 2,
         PhabricatorPolicies::POLICY_NOONE   => 3,
       );
       return idx($map, $this->getPHID());
     }
     return $this->getName();
   }
 
   public static function getPolicyExplanation(
     PhabricatorUser $viewer,
     $policy) {
 
     switch ($policy) {
       case PhabricatorPolicies::POLICY_PUBLIC:
         return pht('This object is public.');
       case PhabricatorPolicies::POLICY_USER:
         return pht('Logged in users can take this action.');
       case PhabricatorPolicies::POLICY_ADMIN:
         return pht('Administrators can take this action.');
       case PhabricatorPolicies::POLICY_NOONE:
         return pht('By default, no one can take this action.');
       default:
         $handle = id(new PhabricatorHandleQuery())
           ->setViewer($viewer)
           ->withPHIDs(array($policy))
           ->executeOne();
 
         $type = phid_get_type($policy);
         if ($type == PhabricatorProjectPHIDTypeProject::TYPECONST) {
           return pht(
             'Members of the project "%s" can take this action.',
             $handle->getFullName());
         } else if ($type == PhabricatorPeoplePHIDTypeUser::TYPECONST) {
           return pht(
             '%s can take this action.',
             $handle->getFullName());
         } else if ($type == PhabricatorPolicyPHIDTypePolicy::TYPECONST) {
           return pht(
             'This object has a custom policy controlling who can take this '.
             'action.');
         } else {
           return pht(
             'This object has an unknown or invalid policy setting ("%s").',
             $policy);
         }
     }
   }
 
   public function getFullName() {
     switch ($this->getType()) {
       case PhabricatorPolicyType::TYPE_PROJECT:
         return pht('Project: %s', $this->getName());
       case PhabricatorPolicyType::TYPE_MASKED:
         return pht('Other: %s', $this->getName());
       default:
         return $this->getName();
     }
   }
 
   public function renderDescription($icon=false) {
     $img = null;
     if ($icon) {
       $img = id(new PHUIIconView())
-        ->setSpriteSheet(PHUIIconView::SPRITE_STATUS)
-        ->setSpriteIcon($this->getIcon());
+        ->setIconFont($this->getIcon());
     }
 
     if ($this->getHref()) {
       $desc = javelin_tag(
         'a',
         array(
           'href' => $this->getHref(),
           'class' => 'policy-link',
           'sigil' => $this->getWorkflow() ? 'workflow' : null,
         ),
         array(
           $img,
           $this->getName(),
         ));
     } else {
       if ($img) {
         $desc = array($img, $this->getName());
       } else {
         $desc = $this->getName();
       }
     }
 
     switch ($this->getType()) {
       case PhabricatorPolicyType::TYPE_PROJECT:
         return pht('%s (Project)', $desc);
       case PhabricatorPolicyType::TYPE_CUSTOM:
         return $desc;
       case PhabricatorPolicyType::TYPE_MASKED:
         return pht(
           '%s (You do not have permission to view policy details.)',
           $desc);
       default:
         return $desc;
     }
   }
 
   /**
    * Return a list of custom rule classes (concrete subclasses of
    * @{class:PhabricatorPolicyRule}) this policy uses.
    *
    * @return list<string> List of class names.
    */
   public function getCustomRuleClasses() {
     $classes = array();
 
     foreach ($this->getRules() as $rule) {
       $class = idx($rule, 'rule');
       try {
         if (class_exists($class)) {
           $classes[$class] = $class;
         }
       } catch (Exception $ex) {
         continue;
       }
     }
 
     return array_keys($classes);
   }
 
   /**
    * Return a list of all values used by a given rule class to implement this
    * policy. This is used to bulk load data (like project memberships) in order
    * to apply policy filters efficiently.
    *
    * @param string Policy rule classname.
    * @return list<wild> List of values used in this policy.
    */
   public function getCustomRuleValues($rule_class) {
     $values = array();
     foreach ($this->getRules() as $rule) {
       if ($rule['rule'] == $rule_class) {
         $values[] = $rule['value'];
       }
     }
     return $values;
   }
 
   public function attachRuleObjects(array $objects) {
     $this->ruleObjects = $objects;
     return $this;
   }
 
   public function getRuleObjects() {
     return $this->assertAttached($this->ruleObjects);
   }
 
 
 /* -(  PhabricatorPolicyInterface  )----------------------------------------- */
 
 
   public function getCapabilities() {
     return array(
       PhabricatorPolicyCapability::CAN_VIEW,
     );
   }
 
   public function getPolicy($capability) {
     // NOTE: We implement policies only so we can comply with the interface.
     // The actual query skips them, as enforcing policies on policies seems
     // perilous and isn't currently required by the application.
     return PhabricatorPolicies::POLICY_PUBLIC;
   }
 
   public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
     return false;
   }
 
   public function describeAutomaticCapability($capability) {
     return null;
   }
 
 }
diff --git a/src/applications/project/controller/PhabricatorProjectColumnDetailController.php b/src/applications/project/controller/PhabricatorProjectColumnDetailController.php
index 36b15e130e..7277f114d8 100644
--- a/src/applications/project/controller/PhabricatorProjectColumnDetailController.php
+++ b/src/applications/project/controller/PhabricatorProjectColumnDetailController.php
@@ -1,165 +1,165 @@
 <?php
 
 final class PhabricatorProjectColumnDetailController
   extends PhabricatorProjectBoardController {
 
   private $id;
   private $projectID;
 
   public function willProcessRequest(array $data) {
     $this->projectID = $data['projectID'];
     $this->id = idx($data, 'id');
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $project = id(new PhabricatorProjectQuery())
       ->setViewer($viewer)
       ->requireCapabilities(
         array(
           PhabricatorPolicyCapability::CAN_VIEW,
         ))
       ->withIDs(array($this->projectID))
       ->executeOne();
 
     if (!$project) {
       return new Aphront404Response();
     }
     $this->setProject($project);
 
     $column = id(new PhabricatorProjectColumnQuery())
       ->setViewer($viewer)
       ->withIDs(array($this->id))
       ->requireCapabilities(
         array(
           PhabricatorPolicyCapability::CAN_VIEW,
         ))
         ->executeOne();
     if (!$column) {
       return new Aphront404Response();
     }
 
     $xactions = id(new PhabricatorProjectColumnTransactionQuery())
       ->setViewer($viewer)
       ->withObjectPHIDs(array($column->getPHID()))
       ->execute();
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($viewer);
 
     $timeline = id(new PhabricatorApplicationTransactionView())
       ->setUser($viewer)
       ->setObjectPHID($column->getPHID())
       ->setTransactions($xactions);
 
     $title = pht('%s', $column->getName());
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb(
       pht('Board'),
       $this->getApplicationURI('board/'.$project->getID().'/'));
     $crumbs->addTextCrumb($title);
 
     $header = $this->buildHeaderView($column);
     $actions = $this->buildActionView($column);
     $properties = $this->buildPropertyView($column, $actions);
 
     $box = id(new PHUIObjectBoxView())
       ->setHeader($header)
       ->addPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $box,
         $timeline,
       ),
       array(
         'title' => $title,
         'device' => true,
       ));
   }
 
   private function buildHeaderView(PhabricatorProjectColumn $column) {
     $viewer = $this->getRequest()->getUser();
 
     $header = id(new PHUIHeaderView())
       ->setUser($viewer)
       ->setHeader($column->getName())
       ->setPolicyObject($column);
 
     if ($column->isDeleted()) {
-      $header->setStatus('reject', 'red', pht('Deleted'));
+      $header->setStatus('fa-ban', 'dark', pht('Deleted'));
     }
 
     return $header;
   }
 
   private function buildActionView(PhabricatorProjectColumn $column) {
     $viewer = $this->getRequest()->getUser();
 
     $id = $column->getID();
     $project_id = $this->getProject()->getID();
     $base_uri = '/board/'.$project_id.'/';
 
     $actions = id(new PhabricatorActionListView())
       ->setObjectURI($this->getApplicationURI($base_uri.'column/'.$id.'/'))
       ->setUser($viewer);
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $column,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit column'))
         ->setIcon('fa-pencil')
         ->setHref($this->getApplicationURI($base_uri.'edit/'.$id.'/'))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     if (!$column->isDeleted()) {
       $actions->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Delete column'))
           ->setIcon('fa-times')
           ->setHref($this->getApplicationURI($base_uri.'delete/'.$id.'/'))
           ->setDisabled(!$can_edit)
           ->setWorkflow(true));
     } else {
       $actions->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Activate column'))
           ->setIcon('fa-play-circle-o')
           ->setHref($this->getApplicationURI($base_uri.'delete/'.$id.'/'))
           ->setDisabled(!$can_edit)
           ->setWorkflow(true));
     }
 
     return $actions;
   }
 
   private function buildPropertyView(
     PhabricatorProjectColumn $column,
     PhabricatorActionListView $actions) {
     $viewer = $this->getRequest()->getUser();
 
     $properties = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setObject($column)
       ->setActionList($actions);
 
     $descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
       $viewer,
       $column);
 
     $properties->addProperty(
       pht('Editable By'),
       $descriptions[PhabricatorPolicyCapability::CAN_EDIT]);
 
     return $properties;
   }
 
 }
diff --git a/src/applications/project/controller/PhabricatorProjectEditMainController.php b/src/applications/project/controller/PhabricatorProjectEditMainController.php
index e0d6848f5c..948bb1bc2f 100644
--- a/src/applications/project/controller/PhabricatorProjectEditMainController.php
+++ b/src/applications/project/controller/PhabricatorProjectEditMainController.php
@@ -1,157 +1,157 @@
 <?php
 
 final class PhabricatorProjectEditMainController
   extends PhabricatorProjectController {
 
   private $id;
 
   public function willProcessRequest(array $data) {
     $this->id = idx($data, 'id');
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $project = id(new PhabricatorProjectQuery())
       ->setViewer($viewer)
       ->withIDs(array($this->id))
       ->needImages(true)
       ->executeOne();
     if (!$project) {
       return new Aphront404Response();
     }
 
     $header = id(new PHUIHeaderView())
       ->setHeader(pht('Edit %s', $project->getName()))
       ->setUser($viewer)
       ->setPolicyObject($project)
       ->setImage($project->getProfileImageURI());
 
     if ($project->getStatus() == PhabricatorProjectStatus::STATUS_ACTIVE) {
-      $header->setStatus('oh-ok', '', pht('Active'));
+      $header->setStatus('fa-check', 'bluegrey', pht('Active'));
     } else {
-      $header->setStatus('policy-noone', '', pht('Archived'));
+      $header->setStatus('fa-ban', 'dark', pht('Archived'));
     }
 
     $actions = $this->buildActionListView($project);
     $properties = $this->buildPropertyListView($project, $actions);
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb(
       $project->getName(),
       $this->getApplicationURI('view/'.$project->getID().'/'));
     $crumbs->addTextCrumb(pht('Edit'));
     $crumbs->setActionList($actions);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
       ->addPropertyList($properties);
 
     $xactions = id(new PhabricatorProjectTransactionQuery())
       ->setViewer($viewer)
       ->withObjectPHIDs(array($project->getPHID()))
       ->execute();
 
     $timeline = id(new PhabricatorApplicationTransactionView())
       ->setUser($viewer)
       ->setObjectPHID($project->getPHID())
       ->setShouldTerminate(true)
       ->setTransactions($xactions);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $timeline,
       ),
       array(
         'title' => $project->getName(),
         'device' => true,
       ));
   }
 
   private function buildActionListView(PhabricatorProject $project) {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $id = $project->getID();
 
     $view = id(new PhabricatorActionListView())
       ->setUser($viewer)
       ->setObjectURI($request->getRequestURI());
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $project,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Details'))
         ->setIcon('fa-pencil')
         ->setHref($this->getApplicationURI("details/{$id}/"))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Picture'))
         ->setIcon('fa-picture-o')
         ->setHref($this->getApplicationURI("picture/{$id}/"))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     if ($project->isArchived()) {
       $view->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Unarchive Project'))
-          ->setIcon('fa-circle-check')
+          ->setIcon('fa-check')
           ->setHref($this->getApplicationURI("archive/{$id}/"))
           ->setDisabled(!$can_edit)
           ->setWorkflow(true));
     } else {
       $view->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Archive Project'))
           ->setIcon('fa-ban')
           ->setHref($this->getApplicationURI("archive/{$id}/"))
           ->setDisabled(!$can_edit)
           ->setWorkflow(true));
     }
 
     return $view;
   }
 
   private function buildPropertyListView(
     PhabricatorProject $project,
     PhabricatorActionListView $actions) {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $view = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setObject($project)
       ->setActionList($actions);
 
     $descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
       $viewer,
       $project);
 
     $view->addProperty(
       pht('Visible To'),
       $descriptions[PhabricatorPolicyCapability::CAN_VIEW]);
 
     $view->addProperty(
       pht('Editable By'),
       $descriptions[PhabricatorPolicyCapability::CAN_EDIT]);
 
     $view->addProperty(
       pht('Joinable By'),
       $descriptions[PhabricatorPolicyCapability::CAN_JOIN]);
 
     return $view;
   }
 
 
 }
diff --git a/src/applications/project/controller/PhabricatorProjectProfileController.php b/src/applications/project/controller/PhabricatorProjectProfileController.php
index 78f775a964..3586db683f 100644
--- a/src/applications/project/controller/PhabricatorProjectProfileController.php
+++ b/src/applications/project/controller/PhabricatorProjectProfileController.php
@@ -1,265 +1,265 @@
 <?php
 
 final class PhabricatorProjectProfileController
   extends PhabricatorProjectController {
 
   private $id;
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function willProcessRequest(array $data) {
     $this->id = idx($data, 'id');
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $project = id(new PhabricatorProjectQuery())
       ->setViewer($user)
       ->withIDs(array($this->id))
       ->needMembers(true)
       ->needImages(true)
       ->executeOne();
     if (!$project) {
       return new Aphront404Response();
     }
 
     $picture = $project->getProfileImageURI();
 
     require_celerity_resource('phabricator-profile-css');
 
     $tasks = $this->renderTasksPage($project);
 
     $query = new PhabricatorFeedQuery();
     $query->setFilterPHIDs(
       array(
         $project->getPHID(),
       ));
     $query->setLimit(50);
     $query->setViewer($this->getRequest()->getUser());
     $stories = $query->execute();
     $feed = $this->renderStories($stories);
 
     $content = phutil_tag_div(
       'phabricator-project-layout',
       array($tasks, $feed));
 
     $id = $this->id;
     $icon = id(new PHUIIconView())
           ->setIconFont('fa-columns');
     $board_btn = id(new PHUIButtonView())
         ->setTag('a')
         ->setText(pht('Workboards'))
         ->setHref($this->getApplicationURI("board/{$id}/"))
         ->setIcon($icon);
 
     $header = id(new PHUIHeaderView())
       ->setHeader($project->getName())
       ->setUser($user)
       ->setPolicyObject($project)
       ->setImage($picture)
       ->addActionLink($board_btn);
 
     if ($project->getStatus() == PhabricatorProjectStatus::STATUS_ACTIVE) {
-      $header->setStatus('oh-ok', '', pht('Active'));
+      $header->setStatus('fa-check', 'bluegrey', pht('Active'));
     } else {
-      $header->setStatus('policy-noone', '', pht('Archived'));
+      $header->setStatus('fa-ban', 'dark', pht('Archived'));
     }
 
     $actions = $this->buildActionListView($project);
     $properties = $this->buildPropertyListView($project, $actions);
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb($project->getName())
       ->setActionList($actions);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
       ->addPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         $content,
       ),
       array(
         'title' => $project->getName(),
         'device' => true,
       ));
   }
 
   private function renderFeedPage(PhabricatorProject $project) {
 
     $query = new PhabricatorFeedQuery();
     $query->setFilterPHIDs(array($project->getPHID()));
     $query->setViewer($this->getRequest()->getUser());
     $query->setLimit(100);
     $stories = $query->execute();
 
     if (!$stories) {
       return pht('There are no stories about this project.');
     }
 
     return $this->renderStories($stories);
   }
 
   private function renderStories(array $stories) {
     assert_instances_of($stories, 'PhabricatorFeedStory');
 
     $builder = new PhabricatorFeedBuilder($stories);
     $builder->setUser($this->getRequest()->getUser());
     $builder->setShowHovercards(true);
     $view = $builder->buildView();
 
     return phutil_tag_div(
       'profile-feed',
       $view->render());
   }
 
 
   private function renderTasksPage(PhabricatorProject $project) {
 
     $user = $this->getRequest()->getUser();
 
     $query = id(new ManiphestTaskQuery())
       ->setViewer($user)
       ->withAnyProjects(array($project->getPHID()))
       ->withStatuses(ManiphestTaskStatus::getOpenStatusConstants())
       ->setOrderBy(ManiphestTaskQuery::ORDER_PRIORITY)
       ->setLimit(10);
     $tasks = $query->execute();
 
     $phids = mpull($tasks, 'getOwnerPHID');
     $phids = array_merge(
       $phids,
       array_mergev(mpull($tasks, 'getProjectPHIDs')));
     $phids = array_filter($phids);
     $handles = $this->loadViewerHandles($phids);
 
     $task_list = new ManiphestTaskListView();
     $task_list->setUser($user);
     $task_list->setTasks($tasks);
     $task_list->setHandles($handles);
 
     $phid = $project->getPHID();
     $view_uri = urisprintf(
       '/maniphest/?statuses=%s&allProjects=%s#R',
       implode(',', ManiphestTaskStatus::getOpenStatusConstants()),
       $phid);
     $create_uri = '/maniphest/task/create/?projects='.$phid;
     $icon = id(new PHUIIconView())
       ->setIconFont('fa-list');
     $button_view = id(new PHUIButtonView())
       ->setTag('a')
       ->setText(pht('View All'))
       ->setHref($view_uri)
       ->setIcon($icon);
     $icon_new = id(new PHUIIconView())
       ->setIconFont('fa-plus');
     $button_add = id(new PHUIButtonView())
       ->setTag('a')
       ->setText(pht('New Task'))
       ->setHref($create_uri)
       ->setIcon($icon_new);
 
     $header = id(new PHUIHeaderView())
       ->setHeader(pht('Open Tasks'))
       ->addActionLink($button_add)
       ->addActionLink($button_view);
 
     $content = id(new PHUIObjectBoxView())
       ->setHeader($header)
       ->appendChild($task_list);
 
     return $content;
   }
 
   private function buildActionListView(PhabricatorProject $project) {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $id = $project->getID();
 
     $view = id(new PhabricatorActionListView())
       ->setUser($viewer)
       ->setObject($project)
       ->setObjectURI($request->getRequestURI());
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $project,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Project'))
         ->setIcon('fa-pencil')
         ->setHref($this->getApplicationURI("edit/{$id}/")));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Members'))
         ->setIcon('fa-users')
         ->setHref($this->getApplicationURI("members/{$id}/"))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     $action = null;
     if (!$project->isUserMember($viewer->getPHID())) {
       $can_join = PhabricatorPolicyFilter::hasCapability(
         $viewer,
         $project,
         PhabricatorPolicyCapability::CAN_JOIN);
 
       $action = id(new PhabricatorActionView())
         ->setUser($viewer)
         ->setRenderAsForm(true)
         ->setHref('/project/update/'.$project->getID().'/join/')
         ->setIcon('fa-plus')
         ->setDisabled(!$can_join)
         ->setName(pht('Join Project'));
     } else {
       $action = id(new PhabricatorActionView())
         ->setWorkflow(true)
         ->setHref('/project/update/'.$project->getID().'/leave/')
         ->setIcon('fa-times')
         ->setName(pht('Leave Project...'));
     }
     $view->addAction($action);
 
     return $view;
   }
 
   private function buildPropertyListView(
     PhabricatorProject $project,
     PhabricatorActionListView $actions) {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $this->loadHandles($project->getMemberPHIDs());
 
     $view = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setObject($project)
       ->setActionList($actions);
 
     $view->addProperty(
       pht('Members'),
       $project->getMemberPHIDs()
       ? $this->renderHandlesForPHIDs($project->getMemberPHIDs(), ',')
       : phutil_tag('em', array(), pht('None')));
 
     $field_list = PhabricatorCustomField::getObjectFields(
       $project,
       PhabricatorCustomField::ROLE_VIEW);
     $field_list->appendFieldsToPropertyList($project, $viewer, $view);
 
     return $view;
   }
 
 
 }
diff --git a/src/applications/project/phid/PhabricatorProjectPHIDTypeColumn.php b/src/applications/project/phid/PhabricatorProjectPHIDTypeColumn.php
index 63f2db084c..410800ea25 100644
--- a/src/applications/project/phid/PhabricatorProjectPHIDTypeColumn.php
+++ b/src/applications/project/phid/PhabricatorProjectPHIDTypeColumn.php
@@ -1,42 +1,46 @@
 <?php
 
 final class PhabricatorProjectPHIDTypeColumn extends PhabricatorPHIDType {
 
   const TYPECONST = 'PCOL';
 
   public function getTypeConstant() {
     return self::TYPECONST;
   }
 
   public function getTypeName() {
     return pht('Project Column');
   }
 
   public function newObject() {
     return new PhabricatorProjectColumn();
   }
 
+  public function getTypeIcon() {
+    return 'fa-columns bluegrey';
+  }
+
   protected function buildQueryForObjects(
     PhabricatorObjectQuery $query,
     array $phids) {
 
     return id(new PhabricatorProjectColumnQuery())
       ->withPHIDs($phids);
   }
 
   public function loadHandles(
     PhabricatorHandleQuery $query,
     array $handles,
     array $objects) {
 
     foreach ($handles as $phid => $handle) {
       $column = $objects[$phid];
 
       $handle->setName($column->getDisplayName());
       $handle->setURI('/project/board/'.$column->getProject()->getID().'/');
       $handle->setDisabled(
         $column->getStatus() == PhabricatorProjectColumn::STATUS_DELETED);
     }
   }
 
 }
diff --git a/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php b/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php
index 41a86f1d9b..0699ca74f4 100644
--- a/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php
+++ b/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php
@@ -1,109 +1,109 @@
 <?php
 
 final class PhabricatorProjectPHIDTypeProject extends PhabricatorPHIDType {
 
   const TYPECONST = 'PROJ';
 
   public function getTypeConstant() {
     return self::TYPECONST;
   }
 
   public function getTypeName() {
     return pht('Project');
   }
 
   public function getPHIDTypeApplicationClass() {
     return 'PhabricatorApplicationProject';
   }
 
   public function getTypeIcon() {
-    return 'policy-project';
+    return 'fa-briefcase bluegrey';
   }
 
   public function newObject() {
     return new PhabricatorProject();
   }
 
   protected function buildQueryForObjects(
     PhabricatorObjectQuery $query,
     array $phids) {
 
     return id(new PhabricatorProjectQuery())
       ->withPHIDs($phids)
       ->needImages(true);
   }
 
   public function loadHandles(
     PhabricatorHandleQuery $query,
     array $handles,
     array $objects) {
 
     foreach ($handles as $phid => $handle) {
       $project = $objects[$phid];
 
       $name = $project->getName();
       $id = $project->getID();
 
       $handle->setName($name);
       $handle->setObjectName('#'.rtrim($project->getPhrictionSlug(), '/'));
       $handle->setURI("/project/view/{$id}/");
       $handle->setImageURI($project->getProfileImageURI());
 
       if ($project->isArchived()) {
         $handle->setStatus(PhabricatorObjectHandleStatus::STATUS_CLOSED);
       }
     }
   }
 
   public static function getProjectMonogramPatternFragment() {
     // NOTE: See some discussion in ProjectRemarkupRule.
     return '[^\s,#]+';
   }
 
   public function canLoadNamedObject($name) {
     $fragment = self::getProjectMonogramPatternFragment();
     return preg_match('/^#'.$fragment.'$/i', $name);
   }
 
   public function loadNamedObjects(
     PhabricatorObjectQuery $query,
     array $names) {
 
     // If the user types "#YoloSwag", we still want to match "#yoloswag", so
     // we normalize, query, and then map back to the original inputs.
 
     $map = array();
     foreach ($names as $key => $slug) {
       $map[$this->normalizeSlug(substr($slug, 1))][] = $slug;
     }
 
     $projects = id(new PhabricatorProjectQuery())
       ->setViewer($query->getViewer())
       ->withPhrictionSlugs(array_keys($map))
       ->execute();
 
     $result = array();
     foreach ($projects as $project) {
       $slugs = array($project->getPhrictionSlug());
       foreach ($slugs as $slug) {
         foreach ($map[$slug] as $original) {
           $result[$original] = $project;
         }
       }
     }
 
     return $result;
   }
 
   private function normalizeSlug($slug) {
     // NOTE: We're using phutil_utf8_strtolower() (and not PhabricatorSlug's
     // normalize() method) because this normalization should be only somewhat
     // liberal. We want "#YOLO" to match against "#yolo", but "#\\yo!!lo"
     // should not. normalize() strips out most punctuation and leads to
     // excessively aggressive matches.
 
     return phutil_utf8_strtolower($slug).'/';
   }
 
 
 }
diff --git a/src/applications/releeph/controller/branch/ReleephBranchViewController.php b/src/applications/releeph/controller/branch/ReleephBranchViewController.php
index 09f1534f26..f282bc9883 100644
--- a/src/applications/releeph/controller/branch/ReleephBranchViewController.php
+++ b/src/applications/releeph/controller/branch/ReleephBranchViewController.php
@@ -1,202 +1,202 @@
 <?php
 
 final class ReleephBranchViewController extends ReleephBranchController
   implements PhabricatorApplicationSearchResultsControllerInterface {
 
   private $queryKey;
   private $branchID;
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function willProcessRequest(array $data) {
     $this->branchID = $data['branchID'];
     $this->queryKey = idx($data, 'queryKey');
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $branch = id(new ReleephBranchQuery())
       ->setViewer($viewer)
       ->withIDs(array($this->branchID))
       ->executeOne();
     if (!$branch) {
       return new Aphront404Response();
     }
     $this->setBranch($branch);
 
     $controller = id(new PhabricatorApplicationSearchController($request))
       ->setPreface($this->renderPreface())
       ->setQueryKey($this->queryKey)
       ->setSearchEngine($this->getSearchEngine())
       ->setNavigation($this->buildSideNavView());
 
     return $this->delegateToController($controller);
   }
 
   public function renderResultsList(
     array $requests,
     PhabricatorSavedQuery $query) {
 
     assert_instances_of($requests, 'ReleephRequest');
     $viewer = $this->getRequest()->getUser();
 
     // TODO: This is generally a bit sketchy, but we don't do this kind of
     // thing elsewhere at the moment. For the moment it shouldn't be hugely
     // costly, and we can batch things later. Generally, this commits fewer
     // sins than the old code did.
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($viewer);
 
     $list = array();
     foreach ($requests as $pull) {
       $field_list = PhabricatorCustomField::getObjectFields(
         $pull,
         PhabricatorCustomField::ROLE_VIEW);
 
       $field_list
         ->setViewer($viewer)
         ->readFieldsFromStorage($pull);
 
       foreach ($field_list->getFields() as $field) {
         if ($field->shouldMarkup()) {
           $field->setMarkupEngine($engine);
         }
       }
 
       $list[] = id(new ReleephRequestView())
         ->setUser($viewer)
         ->setCustomFields($field_list)
         ->setPullRequest($pull)
         ->setIsListView(true);
     }
 
     // This is quite sketchy, but the list has not actually rendered yet, so
     // this still allows us to batch the markup rendering.
     $engine->process();
 
     return $list;
   }
 
   public function buildSideNavView($for_app = false) {
     $user = $this->getRequest()->getUser();
 
     $nav = new AphrontSideNavFilterView();
     $nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
 
     $this->getSearchEngine()->addNavigationItems($nav->getMenu());
 
     $nav->selectFilter(null);
 
     return $nav;
   }
 
   private function getSearchEngine() {
     $branch = $this->getBranch();
     return id(new ReleephRequestSearchEngine())
       ->setBranch($branch)
       ->setBaseURI($this->getApplicationURI('branch/'.$branch->getID().'/'))
       ->setViewer($this->getRequest()->getUser());
   }
 
   public function buildApplicationCrumbs() {
     $crumbs = parent::buildApplicationCrumbs();
 
     $branch = $this->getBranch();
     if ($branch) {
       $pull_uri = $this->getApplicationURI('branch/pull/'.$branch->getID().'/');
       $crumbs->addAction(
         id(new PHUIListItemView())
           ->setHref($pull_uri)
           ->setName(pht('New Pull Request'))
           ->setIcon('fa-plus-square')
           ->setDisabled(!$branch->isActive()));
     }
 
     return $crumbs;
   }
 
   private function renderPreface() {
     $viewer = $this->getRequest()->getUser();
 
     $branch = $this->getBranch();
     $id = $branch->getID();
 
     $header = id(new PHUIHeaderView())
       ->setHeader($branch->getDisplayName())
       ->setUser($viewer)
       ->setPolicyObject($branch);
 
     if ($branch->getIsActive()) {
-      $header->setStatus('oh-ok', '', pht('Active'));
+      $header->setStatus('fa-check', 'bluegrey', pht('Active'));
     } else {
-      $header->setStatus('policy-noone', '', pht('Closed'));
+      $header->setStatus('fa-ban', 'dark', pht('Closed'));
     }
 
     $actions = id(new PhabricatorActionListView())
       ->setUser($viewer)
       ->setObject($branch)
       ->setObjectURI($this->getRequest()->getRequestURI());
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $branch,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $edit_uri = $this->getApplicationURI("branch/edit/{$id}/");
     $close_uri = $this->getApplicationURI("branch/close/{$id}/");
     $reopen_uri = $this->getApplicationURI("branch/re-open/{$id}/");
     $history_uri = $this->getApplicationURI("branch/{$id}/history/");
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Branch'))
         ->setHref($edit_uri)
         ->setIcon('fa-pencil')
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     if ($branch->getIsActive()) {
       $actions->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Close Branch'))
           ->setHref($close_uri)
           ->setIcon('fa-times')
           ->setDisabled(!$can_edit)
           ->setWorkflow(true));
     } else {
       $actions->addAction(
         id(new PhabricatorActionView())
           ->setName(pht('Reopen Branch'))
           ->setHref($reopen_uri)
           ->setIcon('fa-plus')
           ->setUser($viewer)
           ->setDisabled(!$can_edit)
           ->setWorkflow(true));
     }
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('View History'))
         ->setHref($history_uri)
         ->setIcon('fa-list'));
 
     $properties = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setObject($branch)
       ->setActionList($actions);
 
     $properties->addProperty(
       pht('Branch'),
       $branch->getName());
 
     return id(new PHUIObjectBoxView())
       ->setHeader($header)
       ->addPropertyList($properties);
   }
 
 }
diff --git a/src/applications/releeph/controller/product/ReleephProductViewController.php b/src/applications/releeph/controller/product/ReleephProductViewController.php
index 22b852d72a..2d72268a71 100644
--- a/src/applications/releeph/controller/product/ReleephProductViewController.php
+++ b/src/applications/releeph/controller/product/ReleephProductViewController.php
@@ -1,251 +1,251 @@
 <?php
 
 final class ReleephProductViewController extends ReleephProductController
   implements PhabricatorApplicationSearchResultsControllerInterface {
 
   private $productID;
   private $queryKey;
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function willProcessRequest(array $data) {
     $this->productID = idx($data, 'projectID');
     $this->queryKey = idx($data, 'queryKey');
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
     $product = id(new ReleephProductQuery())
       ->setViewer($viewer)
       ->withIDs(array($this->productID))
       ->executeOne();
     if (!$product) {
       return new Aphront404Response();
     }
     $this->setProduct($product);
 
     $controller = id(new PhabricatorApplicationSearchController($request))
       ->setQueryKey($this->queryKey)
       ->setPreface($this->renderPreface())
       ->setSearchEngine(
         id(new ReleephBranchSearchEngine())
           ->setProduct($product))
       ->setNavigation($this->buildSideNavView());
 
     return $this->delegateToController($controller);
   }
 
   public function renderResultsList(
     array $branches,
     PhabricatorSavedQuery $saved) {
     assert_instances_of($branches, 'ReleephBranch');
 
     $viewer = $this->getRequest()->getUser();
 
     $products = mpull($branches, 'getProduct');
     $repo_phids = mpull($products, 'getRepositoryPHID');
 
     $repos = id(new PhabricatorRepositoryQuery())
       ->setViewer($viewer)
       ->withPHIDs($repo_phids)
       ->execute();
     $repos = mpull($repos, null, 'getPHID');
 
     $phids = mpull($branches, 'getCreatedByUserPHID');
     $this->loadHandles($phids);
 
     $requests = array();
     if ($branches) {
       $requests = id(new ReleephRequestQuery())
         ->setViewer($viewer)
         ->withBranchIDs(mpull($branches, 'getID'))
         ->withStatus(ReleephRequestQuery::STATUS_OPEN)
         ->execute();
       $requests = mgroup($requests, 'getBranchID');
     }
 
     $list = id(new PHUIObjectItemListView())
       ->setUser($viewer);
     foreach ($branches as $branch) {
       $diffusion_href = null;
       $repo = idx($repos, $branch->getProduct()->getRepositoryPHID());
       if ($repo) {
         $drequest = DiffusionRequest::newFromDictionary(
           array(
             'user' => $viewer,
             'repository' => $repo,
           ));
 
         $diffusion_href = $drequest->generateURI(
           array(
             'action' => 'branch',
             'branch' => $branch->getName(),
           ));
       }
 
       $branch_link = $branch->getName();
       if ($diffusion_href) {
         $branch_link = phutil_tag(
           'a',
           array(
             'href' => $diffusion_href,
           ),
           $branch_link);
       }
 
       $item = id(new PHUIObjectItemView())
         ->setHeader($branch->getDisplayName())
         ->setHref($this->getApplicationURI('branch/'.$branch->getID().'/'))
         ->addAttribute($branch_link);
 
       if (!$branch->getIsActive()) {
         $item->setDisabled(true);
       }
 
       $commit = $branch->getCutPointCommit();
       if ($commit) {
         $item->addIcon(
           'none',
           phabricator_datetime($commit->getEpoch(), $viewer));
       }
 
       $open_count = count(idx($requests, $branch->getID(), array()));
       if ($open_count) {
         $item->setBarColor('orange');
         $item->addIcon(
           'fa-code-fork',
           pht('%d Open Pull Request(s)', new PhutilNumber($open_count)));
       }
 
       $list->addItem($item);
     }
 
     return $list;
   }
 
   public function buildSideNavView($for_app = false) {
     $viewer = $this->getRequest()->getUser();
     $product = $this->getProduct();
 
     $nav = new AphrontSideNavFilterView();
     $nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
 
     if ($for_app) {
       $nav->addFilter('product/create/', pht('Create Product'));
     }
 
     id(new ReleephBranchSearchEngine())
       ->setProduct($product)
       ->setViewer($viewer)
       ->addNavigationItems($nav->getMenu());
 
     $nav->selectFilter(null);
 
     return $nav;
   }
 
   public function buildApplicationCrumbs() {
     $crumbs = parent::buildApplicationCrumbs();
 
     $product = $this->getProduct();
     if ($product) {
       $crumbs->addAction(
         id(new PHUIListItemView())
           ->setHref($product->getURI('cutbranch/'))
           ->setName(pht('Cut New Branch'))
           ->setIcon('fa-plus'));
     }
 
     return $crumbs;
   }
 
   private function renderPreface() {
     $viewer = $this->getRequest()->getUser();
     $product = $this->getProduct();
 
     $id = $product->getID();
 
     $header = id(new PHUIHeaderView())
       ->setHeader($product->getName())
       ->setUser($viewer)
       ->setPolicyObject($product);
 
     if ($product->getIsActive()) {
-      $header->setStatus('oh-ok', '', pht('Active'));
+      $header->setStatus('fa-check', 'bluegrey', pht('Active'));
     } else {
-      $header->setStatus('policy-noone', '', pht('Inactive'));
+      $header->setStatus('fa-ban', 'dark', pht('Inactive'));
     }
 
     $actions = id(new PhabricatorActionListView())
       ->setUser($viewer)
       ->setObject($product)
       ->setObjectURI($this->getRequest()->getRequestURI());
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $product,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $edit_uri = $this->getApplicationURI("product/{$id}/edit/");
     $history_uri = $this->getApplicationURI("product/{$id}/history/");
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Product'))
         ->setHref($edit_uri)
         ->setIcon('fa-pencil')
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     if ($product->getIsActive()) {
       $status_name = pht('Deactivate Product');
       $status_href = "product/{$id}/action/deactivate/";
       $status_icon = 'fa-times';
     } else {
       $status_name = pht('Reactivate Product');
       $status_href = "product/{$id}/action/activate/";
       $status_icon = 'fa-plus-circle-o';
     }
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setName($status_name)
         ->setHref($this->getApplicationURI($status_href))
         ->setIcon($status_icon)
         ->setDisabled(!$can_edit)
         ->setWorkflow(true));
 
     $actions->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('View History'))
         ->setHref($history_uri)
         ->setIcon('fa-list'));
 
     $properties = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setObject($product);
 
     $properties->addProperty(
       pht('Repository'),
       $product->getRepository()->getName());
 
     $properties->setActionList($actions);
 
     $pushers = $product->getPushers();
     if ($pushers) {
       $this->loadHandles($pushers);
       $properties->addProperty(
         pht('Pushers'),
         $this->renderHandlesForPHIDs($pushers));
     }
 
     return id(new PHUIObjectBoxView())
       ->setHeader($header)
       ->addPropertyList($properties);
   }
 
 }
diff --git a/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php b/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php
index 884cdec99d..0c72687d1a 100644
--- a/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php
+++ b/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php
@@ -1,195 +1,196 @@
 <?php
 
 /**
  * @group slowvote
  */
 final class PhabricatorSlowvotePollController
   extends PhabricatorSlowvoteController {
 
   private $id;
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
 
     $poll = id(new PhabricatorSlowvoteQuery())
       ->setViewer($user)
       ->withIDs(array($this->id))
       ->needOptions(true)
       ->needChoices(true)
       ->needViewerChoices(true)
       ->executeOne();
     if (!$poll) {
       return new Aphront404Response();
     }
 
     $poll_view = id(new SlowvoteEmbedView())
       ->setHeadless(true)
       ->setUser($user)
       ->setPoll($poll);
 
     if ($request->isAjax()) {
       return id(new AphrontAjaxResponse())
         ->setContent(
           array(
             'pollID' => $poll->getID(),
             'contentHTML' => $poll_view->render(),
           ));
     }
 
-    $header_icon = $poll->getIsClosed() ? 'oh-closed' : 'open';
+    $header_icon = $poll->getIsClosed() ? 'fa-ban' : 'fa-circle-o';
     $header_name = $poll->getIsClosed() ? pht('Closed') : pht('Open');
+    $header_color = $poll->getIsClosed() ? 'dark' : 'bluegrey';
 
     $header = id(new PHUIHeaderView())
       ->setHeader($poll->getQuestion())
       ->setUser($user)
-      ->setStatus($header_icon, '', $header_name)
+      ->setStatus($header_icon, $header_color, $header_name)
       ->setPolicyObject($poll);
 
     $actions = $this->buildActionView($poll);
     $properties = $this->buildPropertyView($poll, $actions);
 
     $crumbs = $this->buildApplicationCrumbs();
     $crumbs->addTextCrumb('V'.$poll->getID());
 
     $xactions = $this->buildTransactions($poll);
     $add_comment = $this->buildCommentForm($poll);
 
     $object_box = id(new PHUIObjectBoxView())
       ->setHeader($header)
       ->addPropertyList($properties);
 
     return $this->buildApplicationPage(
       array(
         $crumbs,
         $object_box,
         phutil_tag(
           'div',
           array(
             'class' => 'mlt mml mmr',
           ),
           $poll_view),
         $xactions,
         $add_comment,
       ),
       array(
         'title' => 'V'.$poll->getID().' '.$poll->getQuestion(),
         'device' => true,
         'pageObjects' => array($poll->getPHID()),
       ));
   }
 
   private function buildActionView(PhabricatorSlowvotePoll $poll) {
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PhabricatorActionListView())
       ->setUser($viewer)
       ->setObject($poll);
 
     $can_edit = PhabricatorPolicyFilter::hasCapability(
       $viewer,
       $poll,
       PhabricatorPolicyCapability::CAN_EDIT);
 
     $is_closed = $poll->getIsClosed();
     $close_poll_text = $is_closed ? pht('Reopen Poll') : pht('Close Poll');
     $close_poll_icon = $is_closed ? 'fa-play-circle-o' : 'fa-ban';
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName(pht('Edit Poll'))
         ->setIcon('fa-pencil')
         ->setHref($this->getApplicationURI('edit/'.$poll->getID().'/'))
         ->setDisabled(!$can_edit)
         ->setWorkflow(!$can_edit));
 
     $view->addAction(
       id(new PhabricatorActionView())
         ->setName($close_poll_text)
         ->setIcon($close_poll_icon)
         ->setHref($this->getApplicationURI('close/'.$poll->getID().'/'))
         ->setDisabled(!$can_edit)
         ->setWorkflow(true));
 
     return $view;
   }
 
   private function buildPropertyView(
     PhabricatorSlowvotePoll $poll,
     PhabricatorActionListView $actions) {
 
     $viewer = $this->getRequest()->getUser();
 
     $view = id(new PHUIPropertyListView())
       ->setUser($viewer)
       ->setObject($poll)
       ->setActionList($actions);
 
     $view->invokeWillRenderEvent();
 
     if (strlen($poll->getDescription())) {
       $view->addTextContent(
         $output = PhabricatorMarkupEngine::renderOneObject(
           id(new PhabricatorMarkupOneOff())->setContent(
             $poll->getDescription()),
           'default',
           $viewer));
     }
 
     return $view;
   }
 
   private function buildTransactions(PhabricatorSlowvotePoll $poll) {
     $viewer = $this->getRequest()->getUser();
 
     $xactions = id(new PhabricatorSlowvoteTransactionQuery())
       ->setViewer($viewer)
       ->withObjectPHIDs(array($poll->getPHID()))
       ->execute();
 
     $engine = id(new PhabricatorMarkupEngine())
       ->setViewer($viewer);
     foreach ($xactions as $xaction) {
       if ($xaction->getComment()) {
         $engine->addObject(
           $xaction->getComment(),
           PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
       }
     }
     $engine->process();
 
     $timeline = id(new PhabricatorApplicationTransactionView())
       ->setUser($viewer)
       ->setObjectPHID($poll->getPHID())
       ->setTransactions($xactions)
       ->setMarkupEngine($engine);
 
     return $timeline;
   }
 
   private function buildCommentForm(PhabricatorSlowvotePoll $poll) {
     $viewer = $this->getRequest()->getUser();
 
     $is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
 
     $add_comment_header = $is_serious
       ? pht('Add Comment')
       : pht('Enter Deliberations');
 
     $draft = PhabricatorDraft::newFromUserAndKey($viewer, $poll->getPHID());
 
     return id(new PhabricatorApplicationTransactionCommentView())
       ->setUser($viewer)
       ->setObjectPHID($poll->getPHID())
       ->setDraft($draft)
       ->setHeaderText($add_comment_header)
       ->setAction($this->getApplicationURI('/comment/'.$poll->getID().'/'))
       ->setSubmitButtonName(pht('Add Comment'));
 
   }
 
 }
diff --git a/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php b/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php
index ad3e45ffb9..8ed9e92fbf 100644
--- a/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php
+++ b/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php
@@ -1,439 +1,439 @@
 <?php
 
 final class PhabricatorTypeaheadCommonDatasourceController
   extends PhabricatorTypeaheadDatasourceController {
 
   private $type;
 
   public function shouldAllowPublic() {
     return true;
   }
 
   public function willProcessRequest(array $data) {
     $this->type = $data['type'];
   }
 
   public function processRequest() {
     $request = $this->getRequest();
     $viewer = $request->getUser();
     $query = $request->getStr('q');
     $raw_query = $request->getStr('raw');
 
     $need_rich_data = false;
 
     $need_users = false;
     $need_agents = false;
     $need_applications = false;
     $need_lists = false;
     $need_projs = false;
     $need_repos = false;
     $need_packages = false;
     $need_upforgrabs = false;
     $need_arcanist_projects = false;
     $need_noproject = false;
     $need_symbols = false;
     $need_jump_objects = false;
     $need_build_plans = false;
     $need_task_priority = false;
     $need_macros = false;
     $need_legalpad_documents = false;
     switch ($this->type) {
       case 'mainsearch':
         $need_users = true;
         $need_applications = true;
         $need_rich_data = true;
         $need_symbols = true;
         $need_projs = true;
         $need_jump_objects = true;
         break;
       case 'searchowner':
         $need_users = true;
         $need_upforgrabs = true;
         break;
       case 'searchproject':
         $need_projs = true;
         $need_noproject = true;
         break;
       case 'users':
       case 'accounts':
       case 'authors':
         $need_users = true;
         break;
       case 'mailable':
       case 'allmailable':
         $need_users = true;
         $need_lists = true;
         $need_projs = true;
         break;
       case 'projects':
         $need_projs = true;
         break;
       case 'usersorprojects':
       case 'accountsorprojects':
         $need_users = true;
         $need_projs = true;
         break;
       case 'usersprojectsorpackages':
         $need_users = true;
         $need_projs = true;
         $need_packages = true;
         break;
       case 'repositories':
         $need_repos = true;
         break;
       case 'packages':
         $need_packages = true;
         break;
       case 'arcanistprojects':
         $need_arcanist_projects = true;
         break;
       case 'buildplans':
         $need_build_plans = true;
         break;
       case 'taskpriority':
         $need_task_priority = true;
         break;
       case 'macros':
         $need_macros = true;
         break;
       case 'legalpaddocuments':
         $need_legalpad_documents = true;
         break;
     }
 
     $results = array();
 
     if ($need_upforgrabs) {
       $results[] = id(new PhabricatorTypeaheadResult())
         ->setName('upforgrabs (Up For Grabs)')
         ->setPHID(ManiphestTaskOwner::OWNER_UP_FOR_GRABS);
     }
 
     if ($need_noproject) {
       $results[] = id(new PhabricatorTypeaheadResult())
         ->setName('noproject (No Project)')
         ->setPHID(ManiphestTaskOwner::PROJECT_NO_PROJECT);
     }
 
 
     if ($need_users) {
       $columns = array(
         'isSystemAgent',
         'isAdmin',
         'isDisabled',
         'userName',
         'realName',
         'phid');
 
       if ($query) {
         // This is an arbitrary limit which is just larger than any limit we
         // actually use in the application.
 
         // TODO: The datasource should pass this in the query.
         $limit = 15;
 
         $user_table = new PhabricatorUser();
         $conn_r = $user_table->establishConnection('r');
         $ids = queryfx_all(
           $conn_r,
           'SELECT id FROM %T WHERE username LIKE %>
             ORDER BY username ASC LIMIT %d',
           $user_table->getTableName(),
           $query,
           $limit);
         $ids = ipull($ids, 'id');
 
         if (count($ids) < $limit) {
           // If we didn't find enough username hits, look for real name hits.
           // We need to pull the entire pagesize so that we end up with the
           // right number of items if this query returns many duplicate IDs
           // that we've already selected.
 
           $realname_ids = queryfx_all(
             $conn_r,
             'SELECT DISTINCT userID FROM %T WHERE token LIKE %>
               ORDER BY token ASC LIMIT %d',
             PhabricatorUser::NAMETOKEN_TABLE,
             $query,
             $limit);
           $realname_ids = ipull($realname_ids, 'userID');
           $ids = array_merge($ids, $realname_ids);
 
           $ids = array_unique($ids);
           $ids = array_slice($ids, 0, $limit);
         }
 
         // Always add the logged-in user because some tokenizers autosort them
         // first. They'll be filtered out on the client side if they don't
         // match the query.
         $ids[] = $request->getUser()->getID();
 
         if ($ids) {
           $users = id(new PhabricatorUser())->loadColumnsWhere(
             $columns,
             'id IN (%Ld)',
             $ids);
         } else {
           $users = array();
         }
       } else {
         $users = id(new PhabricatorUser())->loadColumns($columns);
       }
 
       if ($need_rich_data) {
         $phids = mpull($users, 'getPHID');
         $handles = $this->loadViewerHandles($phids);
       }
 
       foreach ($users as $user) {
         $closed = null;
         if ($user->getIsDisabled()) {
           $closed = pht('Disabled');
         } else if ($user->getIsSystemAgent()) {
           $closed = pht('Bot/Script');
         }
 
         $result = id(new PhabricatorTypeaheadResult())
           ->setName($user->getFullName())
           ->setURI('/p/'.$user->getUsername())
           ->setPHID($user->getPHID())
           ->setPriorityString($user->getUsername())
-          ->setIcon('policy-all')
+          ->setIcon('fa-user bluegrey')
           ->setPriorityType('user')
           ->setClosed($closed);
 
         if ($need_rich_data) {
           $display_type = 'User';
           if ($user->getIsAdmin()) {
             $display_type = 'Administrator';
           }
           $result->setDisplayType($display_type);
           $result->setImageURI($handles[$user->getPHID()]->getImageURI());
         }
         $results[] = $result;
       }
     }
 
     if ($need_lists) {
       $lists = id(new PhabricatorMailingListQuery())
         ->setViewer($viewer)
         ->execute();
       foreach ($lists as $list) {
         $results[] = id(new PhabricatorTypeaheadResult())
           ->setName($list->getName())
           ->setURI($list->getURI())
           ->setPHID($list->getPHID());
       }
     }
 
     if ($need_build_plans) {
       $plans = id(new HarbormasterBuildPlanQuery())
         ->setViewer($viewer)
         ->execute();
       foreach ($plans as $plan) {
         $results[] = id(new PhabricatorTypeaheadResult())
           ->setName($plan->getName())
           ->setPHID($plan->getPHID());
       }
     }
 
     if ($need_task_priority) {
       $priority_map = ManiphestTaskPriority::getTaskPriorityMap();
       foreach ($priority_map as $value => $name) {
         // NOTE: $value is not a phid but is unique. This'll work.
         $results[] = id(new PhabricatorTypeaheadResult())
           ->setPHID($value)
           ->setName($name);
       }
     }
 
     if ($need_macros) {
       $macros = id(new PhabricatorMacroQuery())
         ->setViewer($viewer)
         ->withStatus(PhabricatorMacroQuery::STATUS_ACTIVE)
         ->execute();
       $macros = mpull($macros, 'getName', 'getPHID');
       foreach ($macros as $phid => $name) {
         $results[] = id(new PhabricatorTypeaheadResult())
           ->setPHID($phid)
           ->setName($name);
       }
     }
 
     if ($need_legalpad_documents) {
       $documents = id(new LegalpadDocumentQuery())
         ->setViewer($viewer)
         ->execute();
       $documents = mpull($documents, 'getTitle', 'getPHID');
       foreach ($documents as $phid => $title) {
         $results[] = id(new PhabricatorTypeaheadResult())
           ->setPHID($phid)
           ->setName($title);
       }
     }
 
     if ($need_projs) {
       $projs = id(new PhabricatorProjectQuery())
         ->setViewer($viewer)
         ->needImages(true)
         ->execute();
       foreach ($projs as $proj) {
         $closed = null;
         if ($proj->isArchived()) {
           $closed = pht('Archived');
         }
 
         $proj_result = id(new PhabricatorTypeaheadResult())
           ->setName($proj->getName())
           ->setDisplayType("Project")
           ->setURI('/project/view/'.$proj->getID().'/')
           ->setPHID($proj->getPHID())
-          ->setIcon('policy-project')
+          ->setIcon('fa-briefcase bluegrey')
           ->setClosed($closed);
 
         $proj_result->setImageURI($proj->getProfileImageURI());
 
         $results[] = $proj_result;
       }
     }
 
     if ($need_repos) {
       $repos = id(new PhabricatorRepositoryQuery())
         ->setViewer($viewer)
         ->execute();
       foreach ($repos as $repo) {
         $results[] = id(new PhabricatorTypeaheadResult())
           ->setName('r'.$repo->getCallsign().' ('.$repo->getName().')')
           ->setURI('/diffusion/'.$repo->getCallsign().'/')
           ->setPHID($repo->getPHID())
           ->setPriorityString('r'.$repo->getCallsign());
       }
     }
 
     if ($need_packages) {
       $packages = id(new PhabricatorOwnersPackage())->loadAll();
       foreach ($packages as $package) {
         $results[] = id(new PhabricatorTypeaheadResult())
           ->setIcon('pl-testplan')
           ->setName($package->getName())
           ->setURI('/owners/package/'.$package->getID().'/')
           ->setPHID($package->getPHID());
       }
     }
 
     if ($need_arcanist_projects) {
       $arcprojs = id(new PhabricatorRepositoryArcanistProject())->loadAll();
       foreach ($arcprojs as $proj) {
         $results[] = id(new PhabricatorTypeaheadResult())
           ->setName($proj->getName())
           ->setPHID($proj->getPHID());
       }
     }
 
     if ($need_applications) {
       $applications = PhabricatorApplication::getAllInstalledApplications();
       foreach ($applications as $application) {
         $uri = $application->getTypeaheadURI();
         if (!$uri) {
           continue;
         }
         $name = $application->getName().' '.$application->getShortDescription();
 
         $results[] = id(new PhabricatorTypeaheadResult())
           ->setName($name)
           ->setURI($uri)
           ->setPHID($application->getPHID())
           ->setPriorityString($application->getName())
           ->setDisplayName($application->getName())
           ->setDisplayType($application->getShortDescription())
           ->setImageuRI($application->getIconURI())
           ->setPriorityType('apps');
       }
     }
 
     if ($need_symbols) {
       $symbols = id(new DiffusionSymbolQuery())
         ->setNamePrefix($query)
         ->setLimit(15)
         ->needArcanistProjects(true)
         ->needRepositories(true)
         ->needPaths(true)
         ->execute();
       foreach ($symbols as $symbol) {
         $lang = $symbol->getSymbolLanguage();
         $name = $symbol->getSymbolName();
         $type = $symbol->getSymbolType();
         $proj = $symbol->getArcanistProject()->getName();
 
         $results[] = id(new PhabricatorTypeaheadResult())
           ->setName($name)
           ->setURI($symbol->getURI())
           ->setPHID(md5($symbol->getURI())) // Just needs to be unique.
           ->setDisplayName($name)
           ->setDisplayType(strtoupper($lang).' '.ucwords($type).' ('.$proj.')')
           ->setPriorityType('symb');
       }
     }
 
     if ($need_jump_objects) {
       $objects = id(new PhabricatorObjectQuery())
         ->setViewer($viewer)
         ->withNames(array($raw_query))
         ->execute();
       if ($objects) {
         $handles = id(new PhabricatorHandleQuery())
           ->setViewer($viewer)
           ->withPHIDs(mpull($objects, 'getPHID'))
           ->execute();
         $handle = head($handles);
         if ($handle) {
           $results[] = id(new PhabricatorTypeaheadResult())
             ->setName($handle->getFullName())
             ->setDisplayType($handle->getTypeName())
             ->setURI($handle->getURI())
             ->setPHID($handle->getPHID())
             ->setPriorityType('jump');
         }
       }
     }
 
     $content = mpull($results, 'getWireFormat');
 
     if ($request->isAjax()) {
       return id(new AphrontAjaxResponse())->setContent($content);
     }
 
     // If there's a non-Ajax request to this endpoint, show results in a tabular
     // format to make it easier to debug typeahead output.
 
     $rows = array();
     foreach ($results as $result) {
       $wire = $result->getWireFormat();
       $rows[] = $wire;
     }
 
     $table = new AphrontTableView($rows);
     $table->setHeaders(
       array(
         'Name',
         'URI',
         'PHID',
         'Priority',
         'Display Name',
         'Display Type',
         'Image URI',
         'Priority Type',
       ));
 
     $panel = new AphrontPanelView();
     $panel->setHeader('Typeahead Results');
     $panel->appendChild($table);
 
     return $this->buildStandardPageResponse(
       $panel,
       array(
         'title' => 'Typeahead Results',
       ));
   }
 
 }
diff --git a/src/infrastructure/celerity/CeleritySpriteGenerator.php b/src/infrastructure/celerity/CeleritySpriteGenerator.php
index 92e8060888..6e0c995413 100644
--- a/src/infrastructure/celerity/CeleritySpriteGenerator.php
+++ b/src/infrastructure/celerity/CeleritySpriteGenerator.php
@@ -1,806 +1,762 @@
 <?php
 
 final class CeleritySpriteGenerator {
 
   public function buildRemarkupSheet() {
 
     $scales = array(
       '1x'  => 1,
       '2x'  => 2,
     );
     $sprites = array();
 
     $template = id(new PhutilSprite())
       ->setSourceSize(14, 14);
 
     $remarkup_icons = $this->getDirectoryList('remarkup_1x');
     foreach ($remarkup_icons as $icon) {
       $prefix = 'remarkup_';
 
       // Strip 'text_' from these file names.
       $class_name = substr($icon, 5);
 
       if ($class_name == 'fullscreen_off') {
         $tcss = '.remarkup-control-fullscreen-mode .remarkup-assist-fullscreen';
       } else {
         $tcss = '.remarkup-assist-'.$class_name;
       }
 
       $sprite = id(clone $template)
         ->setName('remarkup-assist-'.$icon)
         ->setTargetCSS($tcss);
 
       foreach ($scales as $scale_key => $scale) {
         $path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
         $sprite->setSourceFile($path, $scale);
       }
       $sprites[] = $sprite;
     }
 
     $sheet = $this->buildSheet('remarkup', true);
     $sheet->setScales($scales);
     foreach ($sprites as $sprite) {
       $sheet->addSprite($sprite);
     }
 
     return $sheet;
   }
 
   public function buildActionsSheet() {
     $icons = $this->getDirectoryList('actions_white_1x');
 
     $colors = array(
       'dark',
       'grey',
       'white',
     );
 
     $scales = array(
       '1x'  => 1,
       '2x'  => 2,
     );
 
     $template = id(new PhutilSprite())
       ->setSourceSize(24, 24);
 
     $sprites = array();
     foreach ($colors as $color) {
       foreach ($icons as $icon) {
         $prefix = 'actions_';
         if (strlen($color)) {
           $prefix .= $color.'_';
         }
 
         $suffix = '';
         if (strlen($color)) {
           $suffix = '-'.$color;
         }
 
         $sprite = id(clone $template)
           ->setName('actions-'.$icon.$suffix);
 
         $tcss = array();
         $tcss[] = '.actions-'.$icon.$suffix;
         if ($color == 'dark') {
           $tcss[] = '.device-desktop '.
             '.actions-'.$icon.'-grey.phui-icon-view:hover';
         }
 
         $sprite->setTargetCSS(implode(', ', $tcss));
 
         foreach ($scales as $scale_key => $scale) {
           $path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
           $sprite->setSourceFile($path, $scale);
         }
         $sprites[] = $sprite;
       }
     }
 
     $sheet = $this->buildSheet('actions', true);
     $sheet->setScales($scales);
     foreach ($sprites as $sprite) {
       $sheet->addSprite($sprite);
     }
 
     return $sheet;
   }
 
     public function buildMiniconsSheet() {
     $icons = $this->getDirectoryList('minicons_white_1x');
 
     $colors = array(
       'white',
       'dark',
     );
 
     $scales = array(
       '1x'  => 1,
       '2x'  => 2,
     );
 
     $template = id(new PhutilSprite())
       ->setSourceSize(16, 16);
 
     $sprites = array();
     foreach ($colors as $color) {
       foreach ($icons as $icon) {
         $prefix = 'minicons_';
         if (strlen($color)) {
           $prefix .= $color.'_';
         }
 
         $suffix = '';
         if (strlen($color)) {
           $suffix = '-'.$color;
         }
 
         $sprite = id(clone $template)
           ->setName('minicons-'.$icon.$suffix);
 
         $sprite->setTargetCSS('.minicons-'.$icon.$suffix);
 
         foreach ($scales as $scale_key => $scale) {
           $path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
           $sprite->setSourceFile($path, $scale);
         }
         $sprites[] = $sprite;
       }
     }
 
     $sheet = $this->buildSheet('minicons', true);
     $sheet->setScales($scales);
     foreach ($sprites as $sprite) {
       $sheet->addSprite($sprite);
     }
 
     return $sheet;
   }
 
 
   public function buildMenuSheet() {
     $sprites = array();
 
     $sources = array(
       'seen_read_all' => array(
         'x' => 18,
         'y' => 18,
         'css' =>
           '.alert-notifications .phabricator-main-menu-alert-icon',
       ),
       'seen_have_unread' => array(
         'x' => 18,
         'y' => 18,
         'css' =>
           '.alert-notifications:hover .phabricator-main-menu-alert-icon',
       ),
       'unseen_any' => array(
         'x' => 18,
         'y' => 18,
         'css' =>
           '.alert-notifications.alert-unread .phabricator-main-menu-alert-icon',
       ),
       'arrow-right' => array(
         'x' => 9,
         'y' => 31,
         'css' => '.phabricator-crumb-divider',
       ),
       'search' => array(
         'x' => 24,
         'y' => 24,
         'css' => '.menu-icon-search',
       ),
       'search_blue' => array(
         'x' => 24,
         'y' => 24,
         'css' => '.menu-icon-search-blue',
       ),
       'new' => array(
         'x' => 24,
         'y' => 24,
         'css' => '.menu-icon-new',
       ),
       'new_blue' => array(
         'x' => 24,
         'y' => 24,
         'css' => '.menu-icon-new-blue',
       ),
       'app' => array(
         'x' => 24,
         'y' => 24,
         'css' => '.menu-icon-app',
       ),
       'app_blue' => array(
         'x' => 24,
         'y' => 24,
         'css' => '.menu-icon-app-blue',
       ),
       'logo' => array(
         'x' => 149,
         'y' => 26,
         'css' => '.phabricator-main-menu-logo-image',
       ),
       'conf-off' => array(
         'x' => 18,
         'y' => 18,
         'css' =>
           '.alert-notifications .phabricator-main-menu-message-icon',
       ),
       'conf-hover' => array(
         'x' => 18,
         'y' => 18,
         'css' =>
           '.alert-notifications:hover .phabricator-main-menu-message-icon',
       ),
       'conf-unseen' => array(
         'x' => 18,
         'y' => 18,
         'css' =>
           '.alert-notifications.message-unread '.
           '.phabricator-main-menu-message-icon',
       ),
     );
 
     $scales = array(
       '1x' => 1,
       '2x' => 2,
     );
 
     $template = new PhutilSprite();
     foreach ($sources as $name => $spec) {
       $sprite = id(clone $template)
         ->setName($name)
         ->setSourceSize($spec['x'], $spec['y'])
         ->setTargetCSS($spec['css']);
 
       foreach ($scales as $scale_name => $scale) {
         $path = 'menu_'.$scale_name.'/'.$name.'.png';
         $path = $this->getPath($path);
 
         $sprite->setSourceFile($path, $scale);
       }
       $sprites[] = $sprite;
     }
 
     $sheet = $this->buildSheet('menu', true);
     $sheet->setScales($scales);
     foreach ($sprites as $sprite) {
       $sheet->addSprite($sprite);
     }
 
     return $sheet;
   }
 
   public function buildTokenSheet() {
     $icons = $this->getDirectoryList('tokens_1x');
     $scales = array(
       '1x' => 1,
       '2x' => 2,
     );
     $template = id(new PhutilSprite())
       ->setSourceSize(16, 16);
 
     $sprites = array();
     $prefix = 'tokens_';
     foreach ($icons as $icon) {
       $sprite = id(clone $template)
         ->setName('tokens-'.$icon)
         ->setTargetCSS('.tokens-'.$icon);
 
       foreach ($scales as $scale_key => $scale) {
         $path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
         $sprite->setSourceFile($path, $scale);
       }
       $sprites[] = $sprite;
     }
 
     $sheet = $this->buildSheet('tokens', true);
     $sheet->setScales($scales);
     foreach ($sprites as $sprite) {
       $sheet->addSprite($sprite);
     }
 
     return $sheet;
   }
 
   public function buildButtonBarSheet() {
     $icons = $this->getDirectoryList('button_bar_1x');
     $scales = array(
       '1x' => 1,
       '2x' => 2,
     );
     $template = id(new PhutilSprite())
       ->setSourceSize(14, 14);
 
     $sprites = array();
     $prefix = 'button_bar_';
     foreach ($icons as $icon) {
       $sprite = id(clone $template)
         ->setName('buttonbar-'.$icon)
         ->setTargetCSS('.buttonbar-'.$icon);
 
       foreach ($scales as $scale_key => $scale) {
         $path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
         $sprite->setSourceFile($path, $scale);
       }
       $sprites[] = $sprite;
     }
 
     $sheet = $this->buildSheet('buttonbar', true);
     $sheet->setScales($scales);
     foreach ($sprites as $sprite) {
       $sheet->addSprite($sprite);
     }
 
     return $sheet;
   }
 
   public function buildProjectsSheet() {
     $icons = $this->getDirectoryList('projects_1x');
     $scales = array(
       '1x' => 1,
       '2x' => 2,
     );
     $template = id(new PhutilSprite())
       ->setSourceSize(50, 50);
 
     $sprites = array();
     $prefix = 'projects-';
     foreach ($icons as $icon) {
       $sprite = id(clone $template)
         ->setName($prefix.$icon)
         ->setTargetCSS('.'.$prefix.$icon);
 
       foreach ($scales as $scale_key => $scale) {
         $path = $this->getPath('projects_'.$scale_key.'/'.$icon.'.png');
         $sprite->setSourceFile($path, $scale);
       }
       $sprites[] = $sprite;
     }
 
     $sheet = $this->buildSheet('projects', true);
     $sheet->setScales($scales);
     foreach ($sprites as $sprite) {
       $sheet->addSprite($sprite);
     }
 
     return $sheet;
   }
 
   public function buildPaymentsSheet() {
     $icons = $this->getDirectoryList('payments_2x');
     $scales = array(
       '2x' => 1,
     );
     $template = id(new PhutilSprite())
       ->setSourceSize(60, 32);
 
     $sprites = array();
     $prefix = 'payments_';
     foreach ($icons as $icon) {
       $sprite = id(clone $template)
         ->setName('payments-'.$icon)
         ->setTargetCSS('.payments-'.$icon);
 
       foreach ($scales as $scale_key => $scale) {
         $path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
         $sprite->setSourceFile($path, $scale);
       }
       $sprites[] = $sprite;
     }
 
     $sheet = $this->buildSheet('payments', true);
     $sheet->setScales($scales);
     foreach ($sprites as $sprite) {
       $sheet->addSprite($sprite);
     }
 
     return $sheet;
   }
 
 
   public function buildConpherenceSheet() {
     $name = 'conpherence';
     $icons = $this->getDirectoryList($name.'_1x');
     $scales = array(
       '1x' => 1,
       '2x' => 2,
     );
     $template = id(new PhutilSprite())
       ->setSourceSize(32, 32);
 
     $sprites = array();
     foreach ($icons as $icon) {
       $color = preg_match('/_on/', $icon) ? 'on' : 'off';
 
       $prefix = $name.'_';
 
       $sprite = id(clone $template)
         ->setName($prefix.$icon);
 
       $tcss = array();
       $tcss[] = '.'.$prefix.$icon;
       if ($color == 'on') {
         $class = str_replace('_on', '_off', $prefix.$icon);
         $tcss[] = '.device-desktop .'.$class.':hover ';
       }
 
       $sprite->setTargetCSS(implode(', ', $tcss));
 
       foreach ($scales as $scale_key => $scale) {
         $path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
         $sprite->setSourceFile($path, $scale);
       }
       $sprites[] = $sprite;
     }
 
     $sheet = $this->buildSheet($name, true);
     $sheet->setScales($scales);
     foreach ($sprites as $sprite) {
       $sheet->addSprite($sprite);
     }
 
     return $sheet;
   }
 
   public function buildDocsSheet() {
     $icons = $this->getDirectoryList('docs_1x');
     $scales = array(
       '1x' => 1,
       '2x' => 2,
     );
     $template = id(new PhutilSprite())
       ->setSourceSize(32, 32);
 
     $sprites = array();
     $prefix = 'docs_';
     foreach ($icons as $icon) {
       $sprite = id(clone $template)
         ->setName($prefix.$icon)
         ->setTargetCSS('.'.$prefix.$icon);
 
       foreach ($scales as $scale_key => $scale) {
         $path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
         $sprite->setSourceFile($path, $scale);
       }
       $sprites[] = $sprite;
     }
 
     $sheet = $this->buildSheet('docs', true);
     $sheet->setScales($scales);
     foreach ($sprites as $sprite) {
       $sheet->addSprite($sprite);
     }
 
     return $sheet;
   }
 
   public function buildLoginSheet() {
     $icons = $this->getDirectoryList('login_1x');
     $scales = array(
       '1x' => 1,
       '2x' => 2,
     );
     $template = id(new PhutilSprite())
       ->setSourceSize(34, 34);
 
     $sprites = array();
     $prefix = 'login_';
     foreach ($icons as $icon) {
       $sprite = id(clone $template)
         ->setName('login-'.$icon)
         ->setTargetCSS('.login-'.$icon);
 
       foreach ($scales as $scale_key => $scale) {
         $path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
         $sprite->setSourceFile($path, $scale);
       }
       $sprites[] = $sprite;
     }
 
     $sheet = $this->buildSheet('login', true);
     $sheet->setScales($scales);
     foreach ($sprites as $sprite) {
       $sheet->addSprite($sprite);
     }
 
     return $sheet;
   }
 
-  public function buildStatusSheet() {
-    $icons = $this->getDirectoryList('status_1x');
-    $scales = array(
-      '1x' => 1,
-      '2x' => 2,
-    );
-    $template = id(new PhutilSprite())
-      ->setSourceSize(14, 14);
-
-    $sprites = array();
-    $prefix = 'status_';
-
-    $pre_rule = ', .phuix-dropdown-menu .phabricator-action-view:hover ';
-    $extra_css = array(
-      'policy-custom-white' => $pre_rule.'.status-policy-custom',
-      'policy-all-white' => $pre_rule.'.status-policy-all',
-      'policy-unknown-white' => $pre_rule.'.status-policy-unknown',
-      'policy-admin-white' => $pre_rule.'.status-policy-admin',
-      'policy-public-white' => $pre_rule.'.status-policy-public',
-      'policy-project-white' => $pre_rule.'.status-policy-project',
-      'policy-noone-white' => $pre_rule.'.status-policy-noone',
-    );
-
-    foreach ($icons as $icon) {
-      $sprite = id(clone $template)
-        ->setName('status-'.$icon)
-        ->setTargetCSS('.status-'.$icon.idx($extra_css, $icon));
-
-      foreach ($scales as $scale_key => $scale) {
-        $path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
-        $sprite->setSourceFile($path, $scale);
-      }
-      $sprites[] = $sprite;
-    }
-
-    $sheet = $this->buildSheet('status', true);
-    $sheet->setScales($scales);
-    foreach ($sprites as $sprite) {
-      $sheet->addSprite($sprite);
-    }
-
-    return $sheet;
-  }
-
   public function buildGradientSheet() {
     $gradients = $this->getDirectoryList('gradients');
 
     $template = new PhutilSprite();
 
     $unusual_heights = array(
       'dark-menu-label' => 25,
       'breadcrumbs'     => 31,
       'menu-label'      => 24,
       'red-header'      => 70,
       'blue-header'     => 70,
       'green-header'    => 70,
       'yellow-header'   => 70,
       'grey-header'     => 70,
       'dark-grey-header' => 70,
       'lightblue-header' => 240,
     );
 
     $extra_css = array(
       'dark-menu-label' =>
         ', .phabricator-dark-menu .phui-list-item-type-label',
       'menu-label' =>
         ', .phabricator-side-menu .phui-list-item-type-label',
     );
 
     $sprites = array();
     foreach ($gradients as $gradient) {
       $path = $this->getPath('gradients/'.$gradient.'.png');
       $sprite = id(clone $template)
         ->setName('gradient-'.$gradient)
         ->setSourceFile($path)
         ->setTargetCSS('.gradient-'.$gradient.idx($extra_css, $gradient));
 
       $sprite->setSourceSize(4, idx($unusual_heights, $gradient, 26));
 
       $sprites[] = $sprite;
     }
 
     $sheet = $this->buildSheet(
       'gradient',
       false,
       PhutilSpriteSheet::TYPE_REPEAT_X,
       ', .phabricator-dark-menu .phui-list-item-type-label, '.
       '.phabricator-side-menu .phui-list-item-type-label');
     foreach ($sprites as $sprite) {
       $sheet->addSprite($sprite);
     }
 
     return $sheet;
   }
 
   public function buildMainHeaderSheet() {
     $gradients = $this->getDirectoryList('main_header');
     $template = new PhutilSprite();
 
     $sprites = array();
     foreach ($gradients as $gradient) {
       $path = $this->getPath('main_header/'.$gradient.'.png');
       $sprite = id(clone $template)
         ->setName('main-header-'.$gradient)
         ->setSourceFile($path)
         ->setTargetCSS('.main-header-'.$gradient);
       $sprite->setSourceSize(6, 44);
       $sprites[] = $sprite;
     }
 
     $sheet = $this->buildSheet('main-header',
       false,
       PhutilSpriteSheet::TYPE_REPEAT_X);
 
     foreach ($sprites as $sprite) {
       $sheet->addSprite($sprite);
     }
 
     return $sheet;
   }
 
 
   public function buildAppsSheet() {
     return $this->buildAppsSheetVariant(1);
   }
 
   public function buildAppsLargeSheet() {
     return $this->buildAppsSheetVariant(2);
   }
 
   public function buildAppsXLargeSheet() {
     return $this->buildAppsSheetVariant(3);
   }
 
   private function buildAppsSheetVariant($variant) {
 
     if ($variant == 1) {
       $scales = array(
         '1x' => 1,
         '2x' => 2,
       );
       $variant_name = 'apps';
       $variant_short = '';
       $size_x = 14;
       $size_y = 14;
 
       $colors = array(
         'dark'  => 'dark',
       );
     } else if ($variant == 2) {
       $scales = array(
         '2x' => 1,
         '4x' => 2,
       );
       $variant_name = 'apps-large';
       $variant_short = '-large';
       $size_x = 28;
       $size_y = 28;
 
       $colors = array(
         'light' => 'lb',
         'dark'  => 'dark',
         'blue'  => 'blue',
       );
     } else {
       $scales = array(
         '4x' => 1,
       );
       $variant_name = 'apps-xlarge';
       $variant_short = '-xlarge';
       $size_x = 56;
       $size_y = 56;
 
       $colors = array(
         'dark'  => 'dark',
       );
     }
 
 
     $apps = $this->getDirectoryList('apps_dark_1x');
 
     $template = id(new PhutilSprite())
       ->setSourceSize($size_x, $size_y);
 
     $sprites = array();
     foreach ($apps as $app) {
       foreach ($colors as $color => $color_path) {
 
         $css = '.apps-'.$app.'-'.$color.$variant_short;
         if ($color == 'blue' && $variant_name == 'apps-large') {
           $css .= ', .phabricator-crumb-view:hover .apps-'.$app.'-dark-large';
         }
 
         $sprite = id(clone $template)
           ->setName('apps-'.$app.'-'.$color.$variant_short)
           ->setTargetCSS($css);
 
         foreach ($scales as $scale_name => $scale) {
           $path = $this->getPath(
             'apps_'.$color_path.'_'.$scale_name.'/'.$app.'.png');
           $sprite->setSourceFile($path, $scale);
         }
 
         $sprites[] = $sprite;
       }
     }
 
     $sheet = $this->buildSheet($variant_name, count($scales) > 1);
     $sheet->setScales($scales);
     foreach ($sprites as $sprite) {
       $sheet->addSprite($sprite);
     }
 
     return $sheet;
   }
 
 
   private function getPath($to_path = null) {
     $root = dirname(phutil_get_library_root('phabricator'));
     return $root.'/resources/sprite/'.$to_path;
   }
 
   private function getDirectoryList($dir) {
     $path = $this->getPath($dir);
 
     $result = array();
 
     $images = Filesystem::listDirectory($path, $include_hidden = false);
     foreach ($images as $image) {
       if (!preg_match('/\.png$/', $image)) {
         throw new Exception(
           "Expected file '{$image}' in '{$path}' to be a sprite source ".
           "ending in '.png'.");
       }
       $result[] = substr($image, 0, -4);
     }
 
     return $result;
   }
 
   private function buildSheet(
     $name,
     $has_retina,
     $type = null,
     $extra_css = '') {
 
     $sheet = new PhutilSpriteSheet();
 
     $at = '@';
 
     switch ($type) {
       case PhutilSpriteSheet::TYPE_STANDARD:
       default:
         $type = PhutilSpriteSheet::TYPE_STANDARD;
         $repeat_rule = 'no-repeat';
         break;
       case PhutilSpriteSheet::TYPE_REPEAT_X:
         $repeat_rule = 'repeat-x';
         break;
       case PhutilSpriteSheet::TYPE_REPEAT_Y:
         $repeat_rule = 'repeat-y';
         break;
     }
 
     $retina_rules = null;
     if ($has_retina) {
       $retina_rules = <<<EOCSS
 @media
 only screen and (min-device-pixel-ratio: 1.5),
 only screen and (-webkit-min-device-pixel-ratio: 1.5) {
   .sprite-{$name}{$extra_css} {
     background-image: url(/rsrc/image/sprite-{$name}-X2.png);
     background-size: {X}px {Y}px;
   }
 }
 EOCSS;
     }
 
     $sheet->setSheetType($type);
     $sheet->setCSSHeader(<<<EOCSS
 /**
  * @provides sprite-{$name}-css
  * {$at}generated
  */
 
 .sprite-{$name}{$extra_css} {
   background-image: url(/rsrc/image/sprite-{$name}.png);
   background-repeat: {$repeat_rule};
 }
 
 {$retina_rules}
 
 EOCSS
 );
 
     return $sheet;
   }
 }
diff --git a/src/view/control/AphrontTokenizerTemplateView.php b/src/view/control/AphrontTokenizerTemplateView.php
index 345f827d2e..678299df12 100644
--- a/src/view/control/AphrontTokenizerTemplateView.php
+++ b/src/view/control/AphrontTokenizerTemplateView.php
@@ -1,107 +1,107 @@
 <?php
 
 final class AphrontTokenizerTemplateView extends AphrontView {
 
   private $value;
   private $name;
   private $id;
 
   public function setID($id) {
     $this->id = $id;
     return $this;
   }
 
   public function setValue(array $value) {
     assert_instances_of($value, 'PhabricatorObjectHandle');
     $this->value = $value;
     return $this;
   }
 
   public function getValue() {
     return $this->value;
   }
 
   public function setName($name) {
     $this->name = $name;
     return $this;
   }
 
   public function getName() {
     return $this->name;
   }
 
   public function render() {
     require_celerity_resource('aphront-tokenizer-control-css');
 
     $id = $this->id;
     $name = $this->getName();
     $values = nonempty($this->getValue(), array());
 
     $tokens = array();
     foreach ($values as $key => $value) {
       $tokens[] = $this->renderToken(
         $value->getPHID(),
         $value->getFullName(),
-        $value->getTypeIcon());
+        $value->getType());
     }
 
     $input = javelin_tag(
       'input',
       array(
         'mustcapture' => true,
         'name'        => $name,
         'class'       => 'jx-tokenizer-input',
         'sigil'       => 'tokenizer-input',
         'style'       => 'width: 0px;',
         'disabled'    => 'disabled',
         'type'        => 'text',
       ));
 
     $content = $tokens;
     $content[] = $input;
     $content[] = phutil_tag('div', array('style' => 'clear: both;'), '');
 
     return phutil_tag(
       'div',
       array(
         'id' => $id,
         'class' => 'jx-tokenizer-container',
       ),
       $content);
   }
 
   private function renderToken($key, $value, $icon) {
     $input_name = $this->getName();
     if ($input_name) {
       $input_name .= '[]';
     }
 
     if ($icon) {
       $value = array(
         phutil_tag(
           'span',
           array(
-            'class' => 'phui-icon-view sprite-status status-'.$icon,
+            'class' => 'phui-icon-view phui-font-fa bluegrey '.$icon,
           )),
         $value);
     }
 
     return phutil_tag(
       'a',
       array(
         'class' => 'jx-tokenizer-token',
       ),
       array(
         $value,
         phutil_tag(
           'input',
           array(
             'type'  => 'hidden',
             'name'  => $input_name,
             'value' => $key,
           )),
         phutil_tag('span', array('class' => 'jx-tokenizer-x-placeholder'), ''),
       ));
   }
 
 }
diff --git a/src/view/form/control/AphrontFormPolicyControl.php b/src/view/form/control/AphrontFormPolicyControl.php
index 31b0798f8b..ee7d8edf1d 100644
--- a/src/view/form/control/AphrontFormPolicyControl.php
+++ b/src/view/form/control/AphrontFormPolicyControl.php
@@ -1,231 +1,230 @@
 <?php
 
 final class AphrontFormPolicyControl extends AphrontFormControl {
 
   private $object;
   private $capability;
   private $policies;
 
   public function setPolicyObject(PhabricatorPolicyInterface $object) {
     $this->object = $object;
     return $this;
   }
 
   public function setPolicies(array $policies) {
     assert_instances_of($policies, 'PhabricatorPolicy');
     $this->policies = $policies;
     return $this;
   }
 
   public function setCapability($capability) {
     $this->capability = $capability;
 
     $labels = array(
       PhabricatorPolicyCapability::CAN_VIEW => pht('Visible To'),
       PhabricatorPolicyCapability::CAN_EDIT => pht('Editable By'),
       PhabricatorPolicyCapability::CAN_JOIN => pht('Joinable By'),
     );
 
     if (isset($labels[$capability])) {
       $label = $labels[$capability];
     } else {
       $capobj = PhabricatorPolicyCapability::getCapabilityByKey($capability);
       if ($capobj) {
         $label = $capobj->getCapabilityName();
       } else {
         $label = pht('Capability "%s"', $capability);
       }
     }
 
     $this->setLabel($label);
 
     return $this;
   }
 
   protected function getCustomControlClass() {
     return 'aphront-form-control-policy';
   }
 
   protected function getOptions() {
     $capability = $this->capability;
 
     $options = array();
     foreach ($this->policies as $policy) {
       if ($policy->getPHID() == PhabricatorPolicies::POLICY_PUBLIC) {
         // Never expose "Public" for capabilities which don't support it.
         $capobj = PhabricatorPolicyCapability::getCapabilityByKey($capability);
         if (!$capobj || !$capobj->shouldAllowPublicPolicySetting()) {
           continue;
         }
       }
 
       $options[$policy->getType()][$policy->getPHID()] = array(
         'name' => phutil_utf8_shorten($policy->getName(), 28),
         'full' => $policy->getName(),
         'icon' => $policy->getIcon(),
       );
     }
 
     // If we were passed several custom policy options, throw away the ones
     // which aren't the value for this capability. For example, an object might
     // have a custom view pollicy and a custom edit policy. When we render
     // the selector for "Can View", we don't want to show the "Can Edit"
     // custom policy -- if we did, the menu would look like this:
     //
     //   Custom
     //     Custom Policy
     //     Custom Policy
     //
     // ...where one is the "view" custom policy, and one is the "edit" custom
     // policy.
 
     $type_custom = PhabricatorPolicyType::TYPE_CUSTOM;
     if (!empty($options[$type_custom])) {
       $options[$type_custom] = array_select_keys(
         $options[$type_custom],
         array($this->getValue()));
     }
 
     // If there aren't any custom policies, add a placeholder policy so we
     // render a menu item. This allows the user to switch to a custom policy.
 
     if (empty($options[$type_custom])) {
       $placeholder = new PhabricatorPolicy();
       $placeholder->setName(pht('Custom Policy...'));
       $options[$type_custom][$this->getCustomPolicyPlaceholder()] = array(
         'name' => $placeholder->getName(),
         'full' => $placeholder->getName(),
         'icon' => $placeholder->getIcon(),
       );
     }
 
     $options = array_select_keys(
       $options,
       array(
         PhabricatorPolicyType::TYPE_GLOBAL,
         PhabricatorPolicyType::TYPE_USER,
         PhabricatorPolicyType::TYPE_CUSTOM,
         PhabricatorPolicyType::TYPE_PROJECT,
       ));
 
     return $options;
   }
 
   protected function renderInput() {
     if (!$this->object) {
       throw new Exception(pht("Call setPolicyObject() before rendering!"));
     }
     if (!$this->capability) {
       throw new Exception(pht("Call setCapability() before rendering!"));
     }
 
     $policy = $this->object->getPolicy($this->capability);
     if (!$policy) {
       // TODO: Make this configurable.
       $policy = PhabricatorPolicies::POLICY_USER;
     }
 
     if (!$this->getValue()) {
       $this->setValue($policy);
     }
 
     $control_id = celerity_generate_unique_node_id();
     $input_id = celerity_generate_unique_node_id();
 
     $caret = phutil_tag(
       'span',
       array(
         'class' => 'caret',
       ));
 
     $input = phutil_tag(
       'input',
       array(
         'type' => 'hidden',
         'id' => $input_id,
         'name' => $this->getName(),
         'value' => $this->getValue(),
       ));
 
     $options = $this->getOptions();
 
     $order = array();
     $labels = array();
     foreach ($options as $key => $values) {
       $order[$key] = array_keys($values);
       $labels[$key] = PhabricatorPolicyType::getPolicyTypeName($key);
     }
 
     $flat_options = array_mergev($options);
 
     $icons = array();
     foreach (igroup($flat_options, 'icon') as $icon => $ignored) {
       $icons[$icon] = id(new PHUIIconView())
-        ->setSpriteSheet(PHUIIconView::SPRITE_STATUS)
-        ->setSpriteIcon($icon);
+        ->setIconFont($icon);
     }
 
 
     Javelin::initBehavior(
       'policy-control',
       array(
         'controlID' => $control_id,
         'inputID' => $input_id,
         'options' => $flat_options,
         'groups' => array_keys($options),
         'order' => $order,
         'icons' => $icons,
         'labels' => $labels,
         'value' => $this->getValue(),
         'customPlaceholder' => $this->getCustomPolicyPlaceholder(),
       ));
 
     $selected = idx($flat_options, $this->getValue(), array());
     $selected_icon = idx($selected, 'icon');
     $selected_name = idx($selected, 'name');
 
     return phutil_tag(
       'div',
       array(
       ),
       array(
         javelin_tag(
           'a',
           array(
             'class' => 'grey button dropdown has-icon policy-control',
             'href' => '#',
             'mustcapture' => true,
             'sigil' => 'policy-control',
             'id' => $control_id,
           ),
           array(
             $caret,
             javelin_tag(
               'span',
               array(
                 'sigil' => 'policy-label',
                 'class' => 'phui-button-text',
               ),
               array(
                 idx($icons, $selected_icon),
                 $selected_name,
               )),
           )),
         $input,
       ));
 
     return AphrontFormSelectControl::renderSelectTag(
       $this->getValue(),
       $this->getOptions(),
       array(
         'name'      => $this->getName(),
         'disabled'  => $this->getDisabled() ? 'disabled' : null,
         'id'        => $this->getID(),
       ));
   }
 
   private function getCustomPolicyPlaceholder() {
     return 'custom:placeholder';
   }
 
 }
diff --git a/src/view/phui/PHUIHeaderView.php b/src/view/phui/PHUIHeaderView.php
index 7d69fde223..6844314ea5 100644
--- a/src/view/phui/PHUIHeaderView.php
+++ b/src/view/phui/PHUIHeaderView.php
@@ -1,275 +1,273 @@
 <?php
 
 final class PHUIHeaderView extends AphrontView {
 
   const PROPERTY_STATUS = 1;
 
   private $objectName;
   private $header;
   private $tags = array();
   private $image;
   private $imageURL = null;
   private $subheader;
   private $gradient;
   private $noBackground;
   private $bleedHeader;
   private $properties = array();
   private $actionLinks = array();
   private $buttonBar = null;
   private $policyObject;
 
   public function setHeader($header) {
     $this->header = $header;
     return $this;
   }
 
   public function setObjectName($object_name) {
     $this->objectName = $object_name;
     return $this;
   }
 
   public function setNoBackground($nada) {
     $this->noBackground = $nada;
     return $this;
   }
 
   public function addTag(PHUITagView $tag) {
     $this->tags[] = $tag;
     return $this;
   }
 
   public function setImage($uri) {
     $this->image = $uri;
     return $this;
   }
 
   public function setImageURL($url) {
     $this->imageURL = $url;
     return $this;
   }
 
   public function setSubheader($subheader) {
     $this->subheader = $subheader;
     return $this;
   }
 
   public function setBleedHeader($bleed) {
     $this->bleedHeader = $bleed;
     return $this;
   }
 
   public function setGradient($gradient) {
     $this->gradient = $gradient;
     return $this;
   }
 
   public function setPolicyObject(PhabricatorPolicyInterface $object) {
     $this->policyObject = $object;
     return $this;
   }
 
   public function addProperty($property, $value) {
     $this->properties[$property] = $value;
     return $this;
   }
 
   public function addActionLink(PHUIButtonView $button) {
     $this->actionLinks[] = $button;
     return $this;
   }
 
   public function setButtonBar(PHUIButtonBarView $bb) {
     $this->buttonBar = $bb;
     return $this;
   }
 
   public function setStatus($icon, $color, $name) {
     $header_class = 'phui-header-status';
 
     if ($color) {
-      $icon = $icon.'-'.$color;
+      $icon = $icon.' '.$color;
       $header_class = $header_class.'-'.$color;
     }
 
     $img = id(new PHUIIconView())
-      ->setSpriteSheet(PHUIIconView::SPRITE_STATUS)
-      ->setSpriteIcon($icon);
+      ->setIconFont($icon);
 
     $tag = phutil_tag(
       'span',
       array(
         'class' => "{$header_class} plr",
       ),
       array(
         $img,
         $name,
       ));
 
     return $this->addProperty(self::PROPERTY_STATUS, $tag);
   }
 
   public function render() {
     require_celerity_resource('phui-header-view-css');
 
     $classes = array();
     $classes[] = 'phui-header-shell';
 
     if ($this->noBackground) {
       $classes[] = 'phui-header-no-backgound';
     }
 
     if ($this->bleedHeader) {
       $classes[] = 'phui-bleed-header';
     }
 
     if ($this->gradient) {
       $classes[] = 'sprite-gradient';
       $classes[] = 'gradient-'.$this->gradient.'-header';
     }
 
     if ($this->properties || $this->policyObject || $this->subheader) {
       $classes[] = 'phui-header-tall';
     }
 
     $image = null;
     if ($this->image) {
       $image = phutil_tag(
         ($this->imageURL ? 'a' : 'span'),
         array(
           'href' => $this->imageURL,
           'class' => 'phui-header-image',
           'style' => 'background-image: url('.$this->image.')',
         ),
         ' ');
       $classes[] = 'phui-header-has-image';
     }
 
     $header = array();
     $header[] = $this->header;
 
     if ($this->objectName) {
       array_unshift(
         $header,
         phutil_tag(
           'a',
           array(
             'href' => '/'.$this->objectName,
           ),
           $this->objectName),
         ' ');
     }
 
     if ($this->tags) {
       $header[] = ' ';
       $header[] = phutil_tag(
         'span',
         array(
           'class' => 'phui-header-tags',
         ),
         array_interleave(' ', $this->tags));
     }
 
     if ($this->subheader) {
       $header[] = phutil_tag(
         'div',
         array(
           'class' => 'phui-header-subheader',
         ),
         $this->subheader);
     }
 
     if ($this->properties || $this->policyObject) {
       $property_list = array();
       foreach ($this->properties as $type => $property) {
         switch ($type) {
           case self::PROPERTY_STATUS:
             $property_list[] = $property;
           break;
           default:
             throw new Exception('Incorrect Property Passed');
           break;
         }
       }
 
       if ($this->policyObject) {
         $property_list[] = $this->renderPolicyProperty($this->policyObject);
       }
 
       $header[] = phutil_tag(
         'div',
         array(
           'class' => 'phui-header-subheader',
         ),
         $property_list);
     }
 
     if ($this->actionLinks) {
       $actions = array();
       foreach ($this->actionLinks as $button) {
         $button->setColor(PHUIButtonView::SIMPLE);
         $button->addClass(PHUI::MARGIN_SMALL_LEFT);
         $button->addClass('phui-header-action-link');
         $actions[] = $button;
       }
       $header[] = phutil_tag(
         'div',
         array(
           'class' => 'phui-header-action-links',
         ),
         $actions);
     }
 
     if ($this->buttonBar) {
       $header[] = phutil_tag(
         'div',
         array(
           'class' => 'phui-header-action-links',
         ),
         $this->buttonBar);
     }
 
     return phutil_tag(
       'div',
       array(
         'class' => implode(' ', $classes),
       ),
       array(
         $image,
         phutil_tag(
           'h1',
           array(
             'class' => 'phui-header-view',
           ),
           $header),
       ));
   }
 
   private function renderPolicyProperty(PhabricatorPolicyInterface $object) {
     $policies = PhabricatorPolicyQuery::loadPolicies(
       $this->getUser(),
       $object);
 
     $view_capability = PhabricatorPolicyCapability::CAN_VIEW;
     $policy = idx($policies, $view_capability);
     if (!$policy) {
       return null;
     }
 
     $phid = $object->getPHID();
 
     $icon = id(new PHUIIconView())
-      ->setSpriteSheet(PHUIIconView::SPRITE_STATUS)
-      ->setSpriteIcon($policy->getIcon());
+      ->setIconFont($policy->getIcon().' bluegrey');
 
     $link = javelin_tag(
       'a',
       array(
         'class' => 'policy-link',
         'href' => '/policy/explain/'.$phid.'/'.$view_capability.'/',
         'sigil' => 'workflow',
       ),
       $policy->getShortName());
 
     return array($icon, $link);
   }
 }
diff --git a/src/view/phui/PHUIIconView.php b/src/view/phui/PHUIIconView.php
index 72c9bb4f13..bac9a363ed 100644
--- a/src/view/phui/PHUIIconView.php
+++ b/src/view/phui/PHUIIconView.php
@@ -1,117 +1,116 @@
 <?php
 
 final class PHUIIconView extends AphrontTagView {
 
   const SPRITE_MINICONS = 'minicons';
   const SPRITE_ACTIONS = 'actions';
   const SPRITE_APPS = 'apps';
   const SPRITE_TOKENS = 'tokens';
   const SPRITE_PAYMENTS = 'payments';
   const SPRITE_ICONS = 'icons';
   const SPRITE_LOGIN = 'login';
-  const SPRITE_STATUS = 'status';
   const SPRITE_PROJECTS = 'projects';
   const SPRITE_BUTTONBAR = 'buttonbar';
 
   const HEAD_SMALL = 'phuihead-small';
   const HEAD_MEDIUM = 'phuihead-medium';
 
   private $href = null;
   private $image;
   private $text;
   private $headSize = null;
 
   private $spriteIcon;
   private $spriteSheet;
   private $iconFont;
 
   public function setHref($href) {
     $this->href = $href;
     return $this;
   }
 
   public function setImage($image) {
     $this->image = $image;
     return $this;
   }
 
   public function setText($text) {
     $this->text = $text;
     return $this;
   }
 
   public function setHeadSize($size) {
     $this->headSize = $size;
     return $this;
   }
 
   public function setSpriteIcon($sprite) {
     $this->spriteIcon = $sprite;
     return $this;
   }
 
   public function setSpriteSheet($sheet) {
     $this->spriteSheet = $sheet;
     return $this;
   }
 
   public function setIconFont($icon) {
     $this->iconFont = $icon;
     return $this;
   }
 
   public function getTagName() {
     $tag = 'span';
     if ($this->href) {
       $tag = 'a';
     }
     return $tag;
   }
 
   public function getTagAttributes() {
     require_celerity_resource('phui-icon-view-css');
 
     $style = null;
     $classes = array();
     $classes[] = 'phui-icon-view';
 
     if ($this->spriteIcon) {
       require_celerity_resource('sprite-'.$this->spriteSheet.'-css');
       $classes[] = 'sprite-'.$this->spriteSheet;
       $classes[] = $this->spriteSheet.'-'.$this->spriteIcon;
 
     } elseif ($this->iconFont) {
       require_celerity_resource('phui-font-icon-base-css');
       require_celerity_resource('font-fontawesome');
       $classes[] = 'phui-font-fa';
       $classes[] = $this->iconFont;
 
     } else {
       if ($this->headSize) {
         $classes[] = $this->headSize;
       }
       $style = 'background-image: url('.$this->image.');';
     }
 
     if ($this->text) {
       $classes[] = 'phui-icon-has-text';
       $this->appendChild($this->text);
     }
 
     return array(
       'href' => $this->href,
       'style' => $style,
       'aural' => false,
       'class' => $classes,
     );
   }
 
   public static function getSheetManifest($sheet) {
     $root = dirname(phutil_get_library_root('phabricator'));
     $path = $root.'/resources/sprite/manifest/'.$sheet.'.json';
     $data = Filesystem::readFile($path);
     return idx(json_decode($data, true), 'sprites');
   }
 
 
 }
diff --git a/src/view/phui/PHUIPropertyListView.php b/src/view/phui/PHUIPropertyListView.php
index 9109173a77..2c5f02dd86 100644
--- a/src/view/phui/PHUIPropertyListView.php
+++ b/src/view/phui/PHUIPropertyListView.php
@@ -1,246 +1,245 @@
 <?php
 
 final class PHUIPropertyListView extends AphrontView {
 
   private $parts = array();
   private $hasKeyboardShortcuts;
   private $object;
   private $invokedWillRenderEvent;
   private $actionList;
   private $classes = array();
   private $stacked;
 
-  const ICON_SUMMARY = 'pl-summary';
-  const ICON_TESTPLAN = 'pl-testplan';
+  const ICON_SUMMARY = 'fa-align-left bluegrey';
+  const ICON_TESTPLAN = 'fa-file-text-o bluegrey';
 
   protected function canAppendChild() {
     return false;
   }
 
   public function setObject($object) {
     $this->object = $object;
     return $this;
   }
 
   public function setActionList(PhabricatorActionListView $list) {
     $this->actionList = $list;
     return $this;
   }
 
   public function setStacked($stacked) {
     $this->stacked = $stacked;
     return $this;
   }
 
   public function addClass($class) {
     $this->classes[] = $class;
     return $this;
   }
 
   public function setHasKeyboardShortcuts($has_keyboard_shortcuts) {
     $this->hasKeyboardShortcuts = $has_keyboard_shortcuts;
     return $this;
   }
 
   public function addProperty($key, $value) {
     $current = array_pop($this->parts);
 
     if (!$current || $current['type'] != 'property') {
       if ($current) {
         $this->parts[] = $current;
       }
       $current = array(
         'type' => 'property',
         'list' => array(),
       );
     }
 
     $current['list'][] = array(
       'key'   => $key,
       'value' => $value,
     );
 
     $this->parts[] = $current;
     return $this;
   }
 
   public function addSectionHeader($name, $icon=null) {
     $this->parts[] = array(
       'type' => 'section',
       'name' => $name,
       'icon' => $icon,
     );
     return $this;
   }
 
   public function addTextContent($content) {
     $this->parts[] = array(
       'type'    => 'text',
       'content' => $content,
     );
     return $this;
   }
 
   public function addImageContent($content) {
     $this->parts[] = array(
       'type'    => 'image',
       'content' => $content,
     );
     return $this;
   }
 
   public function invokeWillRenderEvent() {
     if ($this->object && $this->getUser() && !$this->invokedWillRenderEvent) {
       $event = new PhabricatorEvent(
         PhabricatorEventType::TYPE_UI_WILLRENDERPROPERTIES,
         array(
           'object'  => $this->object,
           'view'    => $this,
         ));
       $event->setUser($this->getUser());
       PhutilEventEngine::dispatchEvent($event);
     }
     $this->invokedWillRenderEvent = true;
   }
 
   public function render() {
     $this->invokeWillRenderEvent();
 
     require_celerity_resource('phui-property-list-view-css');
 
     $items = array();
     foreach ($this->parts as $part) {
       $type = $part['type'];
       switch ($type) {
         case 'property':
           $items[] = $this->renderPropertyPart($part);
           break;
         case 'section':
           $items[] = $this->renderSectionPart($part);
           break;
         case 'text':
         case 'image':
           $items[] = $this->renderTextPart($part);
           break;
         default:
           throw new Exception(pht("Unknown part type '%s'!", $type));
       }
     }
     $this->classes[] = 'phui-property-list-section';
     $classes = implode(' ', $this->classes);
 
     return phutil_tag(
       'div',
       array(
         'class' => $classes,
       ),
       array(
         $items,
       ));
   }
 
   private function renderPropertyPart(array $part) {
     $items = array();
     foreach ($part['list'] as $spec) {
       $key = $spec['key'];
       $value = $spec['value'];
 
       // NOTE: We append a space to each value to improve the behavior when the
       // user double-clicks a property value (like a URI) to select it. Without
       // the space, the label is also selected.
 
       $items[] = phutil_tag(
         'dt',
         array(
           'class' => 'phui-property-list-key',
         ),
         array($key, ' '));
 
       $items[] = phutil_tag(
         'dd',
         array(
           'class' => 'phui-property-list-value',
         ),
         array($value, ' '));
     }
 
     $stacked = '';
     if ($this->stacked) {
       $stacked = 'phui-property-list-stacked';
     }
 
     $list = phutil_tag(
       'dl',
       array(
         'class' => 'phui-property-list-properties '.$stacked,
       ),
       $items);
 
     $shortcuts = null;
     if ($this->hasKeyboardShortcuts) {
       $shortcuts = new AphrontKeyboardShortcutsAvailableView();
     }
 
     $list = phutil_tag(
       'div',
       array(
         'class' => 'phui-property-list-properties-wrap',
       ),
       array($shortcuts, $list));
 
     $action_list = null;
     if ($this->actionList) {
       $action_list = phutil_tag(
         'div',
         array(
           'class' => 'phui-property-list-actions',
         ),
         $this->actionList);
       $this->actionList = null;
     }
 
     return phutil_tag(
         'div',
         array(
           'class' => 'phui-property-list-container grouped',
         ),
         array($action_list, $list));
   }
 
   private function renderSectionPart(array $part) {
     $name = $part['name'];
     if ($part['icon']) {
       $icon = id(new PHUIIconView())
-        ->setSpriteSheet(PHUIIconView::SPRITE_STATUS)
-        ->setSpriteIcon($part['icon']);
+        ->setIconFont($part['icon']);
       $name = phutil_tag(
         'span',
         array(
           'class' => 'phui-property-list-section-header-icon',
         ),
         array($icon, $name));
     }
 
     return phutil_tag(
       'div',
       array(
         'class' => 'phui-property-list-section-header',
       ),
       $name);
   }
 
   private function renderTextPart(array $part) {
     $classes = array();
     $classes[] = 'phui-property-list-text-content';
     if ($part['type'] == 'image') {
       $classes[] = 'phui-property-list-image-content';
     }
     return phutil_tag(
       'div',
       array(
         'class' => implode($classes, ' '),
       ),
       $part['content']);
   }
 
 }
diff --git a/webroot/rsrc/css/aphront/typeahead.css b/webroot/rsrc/css/aphront/typeahead.css
index 923e2b3fa5..bd889bb571 100644
--- a/webroot/rsrc/css/aphront/typeahead.css
+++ b/webroot/rsrc/css/aphront/typeahead.css
@@ -1,72 +1,76 @@
 /**
  * @provides aphront-typeahead-control-css
  */
 
 div.jx-typeahead-hardpoint {
   position: relative;
-  _zoom: 1; /* Some kind of IE6 fix? */ /* yes */
+  _zoom: 1; /* Some kind of IE6 fix? */ /* yes */ /* why? */
 }
 
 div.jx-typeahead-results {
   position: absolute;
   border: 1px solid #96a6c7;
   border-top: 0px;
   padding: 0;
   background: #fefefe;
   width: 98%;
   box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2);
   margin: -1px 1% 0;
 }
 
 .aphront-form-control-typeahead div.jx-typeahead-results {
   width: 100%;
   margin: 0;
   box-sizing: border-box;
 }
 
 div.jx-typeahead-results a.jx-result {
   color: #333;
   display: block;
   font-size: 13px;
   border-bottom: 1px solid #e7e7e7;
   border-top: 1px solid #fff;
 }
 
 div.jx-typeahead-results a.jx-result:hover,
 div.jx-typeahead-results a.focused {
   display: block;
-  background: #dde6f9;
-  border-top: 1px solid #dde6f9;
-  border-bottom: 1px solid #d0dbf3;
+  background: {$lightblue};
+  border-top: 1px solid {$thinblueborder};
+  border-bottom: 1px solid {$thinblueborder};
   text-decoration: none;
 }
 
+div.jx-typeahead-results .phui-icon-view {
+  margin-top: 2px;
+}
+
 table.jx-typeahead button {
   margin-left: 3px;
 }
 
 table.jx-typeahead input {
   font-size: 13px;
   padding: 2px;
 }
 
 input.jx-typeahead-placeholder {
   color: {$lightgreytext};
 }
 
 div.jx-tokenizer-container-focused.jx-typeahead-waiting {
   border-color: {$lightblueborder};
 }
 
 div.jx-typeahead-results a.diffusion-locate-file {
  padding: 4px 8px;
  color: {$darkgreytext}
 }
 
 .diffusion-locate-file strong {
   color: {$blue};
 }
 
 .diffusion-locate-file .phui-icon-view {
   padding-right: 8px;
 }
diff --git a/webroot/rsrc/css/phui/phui-header-view.css b/webroot/rsrc/css/phui/phui-header-view.css
index 57d213a569..0c08aa9a96 100644
--- a/webroot/rsrc/css/phui/phui-header-view.css
+++ b/webroot/rsrc/css/phui/phui-header-view.css
@@ -1,133 +1,133 @@
 /**
  * @provides phui-header-view-css
  */
 
 .phui-header-shell {
   background-color: #e0e3ec;
   border-width: 1px 0;
   border-style: solid;
   border-color: #c0c5d1;
   overflow: hidden;
 }
 
 body .phui-header-shell.phui-header-no-backgound {
   background-color: transparent;
   border: none;
 }
 
 body .phui-header-shell.phui-bleed-header {
   background-color: #fff;
   border-bottom: 1px solid {$thinblueborder};
   width: auto;
   margin: 16px;
 }
 
 body .phui-header-shell.phui-bleed-header
   .phui-header-view {
   padding: 8px 24px 8px 0;
   color: {$bluetext};
 }
 
 .phui-header-shell + .phabricator-form-view {
   border-top-width: 0;
 }
 
 .phui-property-list-view + .diviner-document-section {
   margin-top: -1px;
 }
 
 .phui-header-view {
   padding: 16px;
   font-size: 15px;
   color: {$darkbluetext};
   position: relative;
 }
 
 .phui-header-view a,
 .phui-header-view a.simple {
   color: {$darkbluetext};
 }
 
 .phui-header-view .phui-header-action-links {
   position: absolute;
   top: 24px;
   right: 12px;
 }
 
 .phui-object-box .phui-header-view .phui-header-action-links {
   top: 5px;
   right: 0;
 }
 
 .phui-document-view .phui-header-view .phui-header-action-links {
   right: 8px;
   top: 12px;
 }
 
 .device-phone .phui-header-action-link .phui-button-text {
   visibility: hidden;
   width: 0;
   margin-left: 12px;
 }
 
 .phui-header-divider {
   margin: 0 4px;
   font-weight: normal;
   color: {$lightbluetext};
 }
 
 body.device-phone .phui-header-view {
   padding: 12px 8px;
 }
 
 .phui-header-tags {
   margin-left: 12px;
   font-size: 13px;
 }
 
 .phui-header-tags .phui-tag-view {
   margin-left: 4px;
 }
 
 .phui-header-image {
   display: inline-block;
   background-repeat: no-repeat;
   border: 1px solid white;
   width: 50px;
   height: 50px;
   margin: 12px;
   float: left;
 }
 
 .phui-header-subheader {
   color: {$lightbluetext};
   font-weight: normal;
   font-size: 13px;
   margin-top: 4px;
 }
 
-.phui-header-subheader .sprite-status {
+.phui-header-subheader .phui-icon-view {
   display: inline-block;
   margin: -2px 4px -2px 0;
 }
 
 .phui-header-subheader {
   color: {$bluetext};
 }
 
 .phui-header-subheader .policy-link {
   color: {$bluetext};
 }
 
 .phui-header-subheader .phui-header-status-dark {
   color: #111;
   text-shadow: 0 1px #fff;
 }
 
 .phui-header-subheader .phui-header-status-red {
   color: {$red};
 }
 
 .phui-header-subheader .phui-header-status-green {
   color: {$green};
 }
diff --git a/webroot/rsrc/css/phui/phui-icon.css b/webroot/rsrc/css/phui/phui-icon.css
index a8c19b5fa5..a18768ce6b 100644
--- a/webroot/rsrc/css/phui/phui-icon.css
+++ b/webroot/rsrc/css/phui/phui-icon.css
@@ -1,57 +1,56 @@
 /**
  * @provides phui-icon-view-css
  */
 
 .phui-icon-example .phui-icon-view {
   display: inline-block;
   vertical-align: top;
 }
 
 .phui-icon-view.sprite-minicons {
   height: 16px;
   width: 16px;
 }
 
 .phui-icon-view.sprite-actions {
   height: 24px;
   width: 24px;
 }
 
 .phui-icon-view.sprite-apps,
-.phui-icon-view.sprite-status,
 .phui-icon-view.sprite-buttonbar {
   height: 14px;
   width: 14px;
 }
 
 .phui-icon-view.sprite-tokens {
   height: 16px;
   width: 16px;
   display: inline-block;
   vertical-align: top;
 }
 
 .phui-icon-view.sprite-payments {
   height: 32px;
   width: 60px;
 }
 
 .phui-icon-view.sprite-login {
   height: 34px;
   width: 34px;
 }
 
 .phui-icon-view.phuihead-medium {
   height: 50px;
   width: 50px;
 }
 
 .phui-icon-view.phuihead-small {
   height: 35px;
   width: 35px;
   background-size: 35px;
 }
 
 .phui-icon-has-text:before {
   margin-right: 8px;
 }
diff --git a/webroot/rsrc/css/phui/phui-property-list-view.css b/webroot/rsrc/css/phui/phui-property-list-view.css
index 63dd032a6a..6efcb2f3fb 100644
--- a/webroot/rsrc/css/phui/phui-property-list-view.css
+++ b/webroot/rsrc/css/phui/phui-property-list-view.css
@@ -1,184 +1,184 @@
 /**
  * @provides phui-property-list-view-css
  */
 
 .phui-property-list-view {
   background-color: #fff;
 }
 
 .phui-property-list-view .keyboard-shortcuts-available {
   float: right;
   height: 16px;
   margin: 12px 10px -28px 0px;
   padding: 0px 20px 0px 0px;
   vertical-align: middle;
   color: {$greytext};
   text-align: right;
   font-size: 11px;
   background:
     url('/rsrc/image/icon/fatcow/key_question.png') right center no-repeat;
 }
 
 .device .keyboard-shortcuts-available {
   display: none;
 }
 
 .phui-property-group-noninitial,
 .phui-property-list-section-noninitial {
   border-color: {$thinblueborder};
   border-style: solid;
   border-width: 1px 0 0;
 }
 
 .device-desktop .phui-property-list-container {
   padding: 12px 0 12px 0;
   width: 100%;
 }
 
 .device .phui-property-list-container {
   padding: 12px 0 4px 0;
 }
 
 .phui-property-list-key {
   color: {$bluetext};
   font-weight: bold;
   overflow: hidden;
   white-space: nowrap;
 }
 
 .device-desktop .phui-property-list-key {
   width: 18%;
   margin-left: 1%;
   text-align: right;
   float: left;
   clear: left;
   margin-bottom: 4px;
 }
 
 .device .phui-property-list-key,
 .phui-property-list-properties.phui-property-list-stacked
   .phui-property-list-key {
   padding-left: 12px;
   text-align: left;
   margin-left: 0;
   width: auto;
 }
 
 .phui-property-list-value {
   color: {$darkgreytext};
   line-height: 17px;
 }
 
 .device-desktop .phui-property-list-value {
   width: 78%;
   margin-left: 1%;
   float: left;
   margin-bottom: 4px;
 }
 
 .device .phui-property-list-value,
 .phui-property-list-properties.phui-property-list-stacked
   .phui-property-list-value {
   padding: 0 16px;
   margin-bottom: 8px;
   width: auto;
   word-break: break-word;
 }
 
 .phui-property-list-section-header {
   color: {$bluetext};
   padding: 12px 16px 0px;
   text-transform: uppercase;
   font-weight: 700;
   border-color: {$thinblueborder};
   border-style: solid;
   border-width: 1px 0 0;
 }
 
 .phui-property-list-section-noninitial .phui-property-list-section-header {
   border-top: none;
 }
 
 .device .phui-property-list-section-header {
   padding-left: 8px;
 }
 
-.phui-property-list-section-header-icon .sprite-status {
+.phui-property-list-section-header-icon .phui-icon-view {
   display: inline-block;
   margin: -2px 4px -2px 0;
 }
 
 .phui-property-list-text-content {
   padding: 12px 16px;
   background: #fff;
   overflow: hidden;
 }
 
 .device .phui-property-list-text-content {
   padding: 8px;
 }
 
 /* In the common case where we immediately follow a header, move back up 30px
    so we snuggle next to the header. */
 .device-desktop .phui-header-view
   + .phabricator-action-list-view {
   margin-top: -30px;
 }
 
 .device-desktop .phui-header-view
   + .phabricator-action-list-view
   + .phui-property-list-view {
   margin-top: 0px;
 }
 
 
 .phui-property-list-image {
   margin: auto;
   max-width: 95%;
 }
 
 .phui-property-list-audio {
   display: block;
   margin: 16px auto;
   width: 50%;
   min-width: 240px;
 }
 
 /* When tags appear in property lists, give them a little more vertical
    spacing. */
 .phui-property-list-view .phui-tag-view {
   margin: 2px 0;
 }
 
 .phui-property-list-properties-wrap {
   float: left;
   width: 78%;
 }
 
 .device .phui-property-list-properties-wrap {
   width: auto;
   border: none;
 }
 
 .phui-property-list-actions {
   width: 20%;
   float: right;
   margin-right: 12px;
   border-left: 1px solid {$thinblueborder};
 }
 
 .device .phui-property-list-actions {
   float: none;
   width: auto;
   margin: -12px 0 12px 0;
 }
 
 .phui-property-list-image-content img {
   margin: 20px auto;
   background: url('/rsrc/image/checker_light.png');
   border: 1px solid {$lightblueborder};
 }
 
 .device-desktop .phui-property-list-image-content img:hover {
   background: url('/rsrc/image/checker_dark.png');
 }
diff --git a/webroot/rsrc/css/sprite-status.css b/webroot/rsrc/css/sprite-status.css
deleted file mode 100644
index cde9a513f9..0000000000
--- a/webroot/rsrc/css/sprite-status.css
+++ /dev/null
@@ -1,431 +0,0 @@
-/**
- * @provides sprite-status-css
- * @generated
- */
-
-.sprite-status {
-  background-image: url(/rsrc/image/sprite-status.png);
-  background-repeat: no-repeat;
-}
-
-@media
-only screen and (min-device-pixel-ratio: 1.5),
-only screen and (-webkit-min-device-pixel-ratio: 1.5) {
-  .sprite-status {
-    background-image: url(/rsrc/image/sprite-status-X2.png);
-    background-size: 150px 165px;
-  }
-}
-
-
-.status-accept-blue {
-  background-position: 0px 0px;
-}
-
-.status-accept-dark {
-  background-position: -15px 0px;
-}
-
-.status-accept-green {
-  background-position: -30px 0px;
-}
-
-.status-accept-red {
-  background-position: -45px 0px;
-}
-
-.status-accept-white {
-  background-position: -60px 0px;
-}
-
-.status-accept {
-  background-position: -75px 0px;
-}
-
-.status-add-blue {
-  background-position: -90px 0px;
-}
-
-.status-add-dark {
-  background-position: -105px 0px;
-}
-
-.status-add-green {
-  background-position: -120px 0px;
-}
-
-.status-add-red {
-  background-position: -135px 0px;
-}
-
-.status-add-white {
-  background-position: 0px -15px;
-}
-
-.status-add {
-  background-position: -15px -15px;
-}
-
-.status-down-blue {
-  background-position: -30px -15px;
-}
-
-.status-down-dark {
-  background-position: -45px -15px;
-}
-
-.status-down-green {
-  background-position: -60px -15px;
-}
-
-.status-down-red {
-  background-position: -75px -15px;
-}
-
-.status-down-white {
-  background-position: -90px -15px;
-}
-
-.status-down {
-  background-position: -105px -15px;
-}
-
-.status-info-blue {
-  background-position: -120px -15px;
-}
-
-.status-info-dark {
-  background-position: -135px -15px;
-}
-
-.status-info-green {
-  background-position: 0px -30px;
-}
-
-.status-info-red {
-  background-position: -15px -30px;
-}
-
-.status-info-white {
-  background-position: -30px -30px;
-}
-
-.status-info {
-  background-position: -45px -30px;
-}
-
-.status-left-blue {
-  background-position: -60px -30px;
-}
-
-.status-left-dark {
-  background-position: -75px -30px;
-}
-
-.status-left-green {
-  background-position: -90px -30px;
-}
-
-.status-left-red {
-  background-position: -105px -30px;
-}
-
-.status-left-white {
-  background-position: -120px -30px;
-}
-
-.status-left {
-  background-position: -135px -30px;
-}
-
-.status-minus-blue {
-  background-position: 0px -45px;
-}
-
-.status-minus-dark {
-  background-position: -15px -45px;
-}
-
-.status-minus-green {
-  background-position: -30px -45px;
-}
-
-.status-minus-red {
-  background-position: -45px -45px;
-}
-
-.status-minus-white {
-  background-position: -60px -45px;
-}
-
-.status-minus {
-  background-position: -75px -45px;
-}
-
-.status-oh-closed-dark {
-  background-position: -90px -45px;
-}
-
-.status-oh-closed {
-  background-position: -105px -45px;
-}
-
-.status-oh-ok-dark {
-  background-position: -120px -45px;
-}
-
-.status-oh-ok {
-  background-position: -135px -45px;
-}
-
-.status-oh-open-green {
-  background-position: 0px -60px;
-}
-
-.status-oh-open-red {
-  background-position: -15px -60px;
-}
-
-.status-oh-open {
-  background-position: -30px -60px;
-}
-
-.status-open-blue {
-  background-position: -45px -60px;
-}
-
-.status-open-dark {
-  background-position: -60px -60px;
-}
-
-.status-open-green {
-  background-position: -75px -60px;
-}
-
-.status-open-red {
-  background-position: -90px -60px;
-}
-
-.status-open-white {
-  background-position: -105px -60px;
-}
-
-.status-open {
-  background-position: -120px -60px;
-}
-
-.status-pl-summary {
-  background-position: -135px -60px;
-}
-
-.status-pl-testplan {
-  background-position: 0px -75px;
-}
-
-.status-policy-admin-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-admin {
-  background-position: -15px -75px;
-}
-
-.status-policy-admin {
-  background-position: -30px -75px;
-}
-
-.status-policy-all-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-all {
-  background-position: -45px -75px;
-}
-
-.status-policy-all {
-  background-position: -60px -75px;
-}
-
-.status-policy-custom-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-custom {
-  background-position: -75px -75px;
-}
-
-.status-policy-custom {
-  background-position: -90px -75px;
-}
-
-.status-policy-elist-white {
-  background-position: -105px -75px;
-}
-
-.status-policy-elist {
-  background-position: -120px -75px;
-}
-
-.status-policy-noone-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-noone {
-  background-position: -135px -75px;
-}
-
-.status-policy-noone {
-  background-position: 0px -90px;
-}
-
-.status-policy-project-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-project {
-  background-position: -15px -90px;
-}
-
-.status-policy-project {
-  background-position: -30px -90px;
-}
-
-.status-policy-public-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-public {
-  background-position: -45px -90px;
-}
-
-.status-policy-public {
-  background-position: -60px -90px;
-}
-
-.status-policy-unknown-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-unknown {
-  background-position: -75px -90px;
-}
-
-.status-policy-unknown {
-  background-position: -90px -90px;
-}
-
-.status-policy-user-white {
-  background-position: -105px -90px;
-}
-
-.status-policy-user {
-  background-position: -120px -90px;
-}
-
-.status-question-blue {
-  background-position: -135px -90px;
-}
-
-.status-question-dark {
-  background-position: 0px -105px;
-}
-
-.status-question-green {
-  background-position: -15px -105px;
-}
-
-.status-question-red {
-  background-position: -30px -105px;
-}
-
-.status-question-white {
-  background-position: -45px -105px;
-}
-
-.status-question {
-  background-position: -60px -105px;
-}
-
-.status-reject-blue {
-  background-position: -75px -105px;
-}
-
-.status-reject-dark {
-  background-position: -90px -105px;
-}
-
-.status-reject-green {
-  background-position: -105px -105px;
-}
-
-.status-reject-red {
-  background-position: -120px -105px;
-}
-
-.status-reject-white {
-  background-position: -135px -105px;
-}
-
-.status-reject {
-  background-position: 0px -120px;
-}
-
-.status-right-blue {
-  background-position: -15px -120px;
-}
-
-.status-right-dark {
-  background-position: -30px -120px;
-}
-
-.status-right-green {
-  background-position: -45px -120px;
-}
-
-.status-right-red {
-  background-position: -60px -120px;
-}
-
-.status-right-white {
-  background-position: -75px -120px;
-}
-
-.status-right {
-  background-position: -90px -120px;
-}
-
-.status-time-green {
-  background-position: -105px -120px;
-}
-
-.status-time-orange {
-  background-position: -120px -120px;
-}
-
-.status-time-red {
-  background-position: -135px -120px;
-}
-
-.status-time-yellow {
-  background-position: 0px -135px;
-}
-
-.status-up-blue {
-  background-position: -15px -135px;
-}
-
-.status-up-dark {
-  background-position: -30px -135px;
-}
-
-.status-up-green {
-  background-position: -45px -135px;
-}
-
-.status-up-red {
-  background-position: -60px -135px;
-}
-
-.status-up-white {
-  background-position: -75px -135px;
-}
-
-.status-up {
-  background-position: -90px -135px;
-}
-
-.status-warning-blue {
-  background-position: -105px -135px;
-}
-
-.status-warning-dark {
-  background-position: -120px -135px;
-}
-
-.status-warning-green {
-  background-position: -135px -135px;
-}
-
-.status-warning-red {
-  background-position: 0px -150px;
-}
-
-.status-warning-white {
-  background-position: -15px -150px;
-}
-
-.status-warning {
-  background-position: -30px -150px;
-}
diff --git a/webroot/rsrc/image/sprite-status-X2.png b/webroot/rsrc/image/sprite-status-X2.png
deleted file mode 100644
index c57de2ef41..0000000000
Binary files a/webroot/rsrc/image/sprite-status-X2.png and /dev/null differ
diff --git a/webroot/rsrc/image/sprite-status.png b/webroot/rsrc/image/sprite-status.png
deleted file mode 100644
index 5c96fd0c51..0000000000
Binary files a/webroot/rsrc/image/sprite-status.png and /dev/null differ
diff --git a/webroot/rsrc/js/application/differential/behavior-dropdown-menus.js b/webroot/rsrc/js/application/differential/behavior-dropdown-menus.js
index d8fe6ee0bb..12bd0191a2 100644
--- a/webroot/rsrc/js/application/differential/behavior-dropdown-menus.js
+++ b/webroot/rsrc/js/application/differential/behavior-dropdown-menus.js
@@ -1,167 +1,169 @@
 /**
  * @provides javelin-behavior-differential-dropdown-menus
  * @requires javelin-behavior
  *           javelin-dom
  *           javelin-util
  *           javelin-stratcom
  *           phuix-dropdown-menu
  *           phuix-action-list-view
  *           phuix-action-view
  *           phabricator-phtize
  */
 
 JX.behavior('differential-dropdown-menus', function(config) {
   var pht = JX.phtize(config.pht);
 
   function show_more(container) {
     var nodes = JX.DOM.scry(container, 'tr', 'context-target');
     for (var ii = 0; ii < nodes.length; ii++) {
       var show = JX.DOM.scry(nodes[ii], 'a', 'show-more');
       for (var jj = 0; jj < show.length; jj++) {
         if (JX.Stratcom.getData(show[jj]).type != 'all') {
           continue;
         }
         var event_data = {
           context : nodes[ii],
           show : show[jj]
         };
         JX.Stratcom.invoke('differential-reveal-context', null, event_data);
       }
     }
   }
 
   JX.Stratcom.listen(
     'click',
     'differential-reveal-all',
     function(e) {
       var containers = JX.DOM.scry(
         JX.$('differential-review-stage'),
         'div',
         'differential-changeset');
       for (var i=0; i < containers.length; i++) {
         show_more(containers[i]);
       }
       e.kill();
     });
 
   var buildmenu = function(e) {
     var button = e.getNode('differential-view-options');
     var data = JX.Stratcom.getData(button);
 
     if (data.menu) {
       return;
     }
 
     e.prevent();
 
     var menu = new JX.PHUIXDropdownMenu(button);
     var list = new JX.PHUIXActionListView();
 
     var add_link = function(icon, name, href, local) {
       if (!href) {
         return;
       }
 
       var link = new JX.PHUIXActionView()
         .setIcon(icon)
         .setName(name)
         .setHref(href)
         .setHandler(function(e) {
           if (local) {
             window.location.assign(href);
           } else {
             window.open(href);
           }
           menu.close();
           e.prevent();
         });
 
       list.addItem(link);
       return link;
     };
 
     var reveal_item = new JX.PHUIXActionView()
-      .setIcon('preview');
+      .setIcon('fa-eye');
     list.addItem(reveal_item);
 
     var visible_item = new JX.PHUIXActionView()
       .setHandler(function(e) {
         var diff = JX.DOM.scry(
           JX.$(data.containerID),
           'table',
           'differential-diff');
 
         JX.Stratcom.invoke('differential-toggle-file', null, {diff: diff});
         e.prevent();
         menu.close();
       });
     list.addItem(visible_item);
 
-    add_link('file', pht('Browse in Diffusion'), data.diffusionURI);
-    add_link('transcript', pht('View Standalone'), data.standaloneURI);
-    add_link('arrow_left', pht('Show Raw File (Left)'), data.leftURI);
-    add_link('arrow_right', pht('Show Raw File (Right)'), data.rightURI);
-    add_link('edit', pht('Open in Editor'), data.editor, true);
-    add_link('wrench', pht('Configure Editor'), data.editorConfigure);
+    add_link('fa-files', pht('Browse in Diffusion'), data.diffusionURI);
+    add_link('fa-file-o', pht('View Standalone'), data.standaloneURI);
+    add_link('fa-arrow-left', pht('Show Raw File (Left)'), data.leftURI);
+    add_link('fa-arrow-right', pht('Show Raw File (Right)'), data.rightURI);
+    add_link('fa-pencil', pht('Open in Editor'), data.editor, true);
+    add_link('fa-wrench', pht('Configure Editor'), data.editorConfigure);
 
 
     menu.setContent(list.getNode());
 
     menu.listen('open', function() {
 
       // When the user opens the menu, check if there are any "Show More"
       // links in the changeset body. If there aren't, disable the "Show
       // Entire File" menu item since it won't change anything.
 
       var nodes = JX.DOM.scry(JX.$(data.containerID), 'a', 'show-more');
       if (nodes.length) {
         reveal_item
           .setDisabled(false)
           .setName(pht('Show Entire File'))
+          .setIcon('fa-file-o')
           .setHandler(function(e) {
             show_more(JX.$(data.containerID));
             e.prevent();
             menu.close();
           });
       } else {
         reveal_item
           .setDisabled(true)
+          .setIcon('fa-file')
           .setName(pht('Entire File Shown'))
           .setHandler(function(e) { e.prevent(); });
       }
 
       visible_item.setDisabled(true);
       visible_item.setName(pht("Can't Toggle Unloaded File"));
       var diffs = JX.DOM.scry(
         JX.$(data.containerID),
         'table',
         'differential-diff');
 
       if (diffs.length > 1) {
         JX.$E(
           'More than one node with sigil "differential-diff" was found in "'+
           data.containerID+'."');
       } else if (diffs.length == 1) {
         diff = diffs[0];
         visible_item.setDisabled(false);
         if (JX.Stratcom.getData(diff).hidden) {
           visible_item
             .setName(pht('Expand File'))
-            .setIcon('unmerge');
+            .setIcon('fa-expand');
         } else {
           visible_item
             .setName(pht('Collapse File'))
-            .setIcon('merge');
+            .setIcon('fa-compress');
         }
       } else {
         // Do nothing when there is no diff shown in the table. For example,
         // the file is binary.
       }
 
     });
     data.menu = menu;
     menu.open();
   };
 
   JX.Stratcom.listen('click', 'differential-view-options', buildmenu);
 });
diff --git a/webroot/rsrc/js/application/policy/behavior-policy-control.js b/webroot/rsrc/js/application/policy/behavior-policy-control.js
index a1c0409df8..e5e0fa4b60 100644
--- a/webroot/rsrc/js/application/policy/behavior-policy-control.js
+++ b/webroot/rsrc/js/application/policy/behavior-policy-control.js
@@ -1,129 +1,129 @@
 /**
  * @provides javelin-behavior-policy-control
  * @requires javelin-behavior
  *           javelin-dom
  *           javelin-util
  *           phuix-dropdown-menu
  *           phuix-action-list-view
  *           phuix-action-view
  *           javelin-workflow
  * @javelin
  */
 JX.behavior('policy-control', function(config) {
   var control = JX.$(config.controlID);
   var input = JX.$(config.inputID);
   var value = config.value;
 
   var menu = new JX.PHUIXDropdownMenu(control)
     .setWidth(260)
     .setAlign('left');
 
   menu.listen('open', function() {
     var list = new JX.PHUIXActionListView();
 
     for (var ii = 0; ii < config.groups.length; ii++) {
       var group = config.groups[ii];
 
       list.addItem(
         new JX.PHUIXActionView()
           .setName(config.labels[group])
           .setDisabled(true));
 
       for (var jj = 0; jj < config.order[group].length; jj++) {
         var phid = config.order[group][jj];
 
         var onselect;
         if (group == 'custom') {
           onselect = JX.bind(null, function(phid) {
             var uri = get_custom_uri(phid);
 
             new JX.Workflow(uri)
               .setHandler(function(response) {
                 if (!response.phid) {
                   return;
                 }
 
                 replace_policy(phid, response.phid, response.info);
                 select_policy(response.phid);
               })
               .start();
 
           }, phid);
         } else {
           onselect = JX.bind(null, select_policy, phid);
         }
 
         var option = config.options[phid];
         var item = new JX.PHUIXActionView()
           .setName(option.name)
-          .setIcon(option.icon, 'status')
+          .setIcon(option.icon + ' bluegrey')
           .setHandler(JX.bind(null, function(fn, e) {
             e.prevent();
             menu.close();
             fn();
           }, onselect));
 
         if (phid == value) {
           item.setSelected(true);
         }
 
         list.addItem(item);
       }
     }
 
     menu.setContent(list.getNode());
   });
 
 
   var select_policy = function(phid) {
     JX.DOM.setContent(
       JX.DOM.find(control, 'span', 'policy-label'),
       render_option(phid));
 
     input.value = phid;
     value = phid;
   };
 
 
   var render_option = function(phid, with_title) {
     var option = config.options[phid];
 
     var name = option.name;
     if (with_title && (option.full != option.name)) {
       name = JX.$N('span', {title: option.full}, name);
     }
 
     return [JX.$H(config.icons[option.icon]), name];
   };
 
 
   /**
    * Get the workflow URI to create or edit a policy with a given PHID.
    */
   var get_custom_uri = function(phid) {
     var uri = '/policy/edit/';
     if (phid != config.customPlaceholder) {
       uri += phid + '/';
     }
     return uri;
   };
 
 
   /**
    * Replace an existing policy option with a new one. Used to swap out custom
    * policies after the user edits them.
    */
   var replace_policy = function(old_phid, new_phid, info) {
     config.options[new_phid] = info;
     for (var k in config.order) {
       for (var ii = 0; ii < config.order[k].length; ii++) {
         if (config.order[k][ii] == old_phid) {
           config.order[k][ii] = new_phid;
           return;
         }
       }
     }
   };
 
 
 });
diff --git a/webroot/rsrc/js/core/Prefab.js b/webroot/rsrc/js/core/Prefab.js
index 5f8142ce45..f4e0bead01 100644
--- a/webroot/rsrc/js/core/Prefab.js
+++ b/webroot/rsrc/js/core/Prefab.js
@@ -1,269 +1,269 @@
 /**
  * @provides phabricator-prefab
  * @requires javelin-install
  *           javelin-util
  *           javelin-dom
  *           javelin-typeahead
  *           javelin-tokenizer
  *           javelin-typeahead-preloaded-source
  *           javelin-typeahead-ondemand-source
  *           javelin-dom
  *           javelin-stratcom
  *           javelin-util
  * @javelin
  */
 
 /**
  * Utilities for client-side rendering (the greatest thing in the world).
  */
 JX.install('Prefab', {
 
   statics : {
     renderSelect : function(map, selected, attrs) {
       var select = JX.$N('select', attrs || {});
       for (var k in map) {
         select.options[select.options.length] = new Option(map[k], k);
         if (k == selected) {
           select.value = k;
         }
       }
       select.value = select.value || JX.keys(map)[0];
       return select;
     },
 
     /**
      * Build a Phabricator tokenizer out of a configuration with application
      * sorting, datasource and placeholder rules.
      *
      *   - `id` Root tokenizer ID (alternatively, pass `root`).
      *   - `root` Root tokenizer node (replaces `id`).
      *   - `src` Datasource URI.
      *   - `ondemand` Optional, use an ondemand source.
      *   - `value` Optional, initial value.
      *   - `limit` Optional, token limit.
      *   - `placeholder` Optional, placeholder text.
      *   - `username` Optional, username to sort first (i.e., viewer).
      *   - `icons` Optional, map of icons.
      *
      */
     buildTokenizer : function(config) {
       config.icons = config.icons || {};
 
       var root;
 
       try {
         root = config.root || JX.$(config.id);
       } catch (ex) {
         // If the root element does not exist, just return without building
         // anything. This happens in some cases -- like Conpherence -- where we
         // may load a tokenizer but not put it in the document.
         return;
       }
 
       var datasource;
 
       // Default to an ondemand source if no alternate configuration is
       // provided.
       var ondemand = true;
       if ('ondemand' in config) {
         ondemand = config.ondemand;
       }
 
       if (ondemand) {
         datasource = new JX.TypeaheadOnDemandSource(config.src);
       } else {
         datasource = new JX.TypeaheadPreloadedSource(config.src);
       }
 
       // Sort results so that the viewing user always comes up first; after
       // that, prefer unixname matches to realname matches.
 
       var sort_handler = function(value, list, cmp) {
         var priority_hits = {};
         var self_hits     = {};
 
         var tokens = this.tokenize(value);
 
         for (var ii = 0; ii < list.length; ii++) {
           var item = list[ii];
           if (!item.priority) {
             continue;
           }
 
           if (config.username && item.priority == config.username) {
             self_hits[item.id] = true;
           }
 
           for (var jj = 0; jj < tokens.length; jj++) {
             if (item.priority.substr(0, tokens[jj].length) == tokens[jj]) {
               priority_hits[item.id] = true;
             }
           }
         }
 
         list.sort(function(u, v) {
           if (self_hits[u.id] != self_hits[v.id]) {
             return self_hits[v.id] ? 1 : -1;
           }
 
           // If one result is open and one is closed, show the open result
           // first. The "!" tricks here are becaused closed values are display
           // strings, so the value is either `null` or some truthy string. If
           // we compare the values directly, we'll apply this rule to two
           // objects which are both closed but for different reasons, like
           // "Archived" and "Disabled".
 
           var u_open = !u.closed;
           var v_open = !v.closed;
 
           if (u_open != v_open) {
             if (u_open) {
               return -1;
             } else {
               return 1;
             }
           }
 
           if (priority_hits[u.id] != priority_hits[v.id]) {
             return priority_hits[v.id] ? 1 : -1;
           }
 
           // Sort users ahead of other result types.
           if (u.priorityType != v.priorityType) {
             if (u.priorityType == 'user') {
               return -1;
             }
             if (v.priorityType == 'user') {
               return 1;
             }
           }
 
           return cmp(u, v);
         });
       };
 
       var render_icon = function(icon) {
         return JX.$N(
           'span',
-          {className: 'phui-icon-view sprite-status status-' + icon});
+          {className: 'phui-icon-view phui-font-fa ' + icon});
       };
 
       datasource.setSortHandler(JX.bind(datasource, sort_handler));
 
       // Don't show any closed objects until the query is specific enough that
       // it only selects closed objects. Specifically, if the result list had
       // any open objects, remove all the closed objects from the list.
       var filter_handler = function(value, list) {
         // Look for any open result.
         var has_open = false;
         var ii;
         for (ii = 0; ii < list.length; ii++) {
           if (!list[ii].closed) {
             has_open = true;
             break;
           }
         }
 
         if (!has_open) {
           // Everything is closed, so just use it as-is.
           return list;
         }
 
         // Otherwise, only display the open results.
         var results = [];
         for (ii = 0; ii < list.length; ii++) {
           if (!list[ii].closed) {
             results.push(list[ii]);
           }
         }
 
         return results;
       };
 
       datasource.setFilterHandler(filter_handler);
 
       datasource.setTransformer(
         function(object) {
           var closed = object[9];
           var closed_ui;
           if (closed) {
             closed_ui = JX.$N(
               'div',
               {className: 'tokenizer-closed'},
               closed);
           }
 
           var icon = object[8];
           var icon_ui;
           if (icon) {
             icon_ui = render_icon(icon);
           }
 
           var display = JX.$N(
             'div',
             {className: 'tokenizer-result'},
             [icon_ui, object[0], closed_ui]);
           if (closed) {
             JX.DOM.alterClass(display, 'tokenizer-result-closed', true);
           }
 
           return {
             name: object[0],
             display: display,
             uri: object[1],
             id: object[2],
             priority: object[3],
             priorityType: object[7],
             icon: icon,
             closed: closed
           };
         });
 
       var typeahead = new JX.Typeahead(
         root,
         JX.DOM.find(root, 'input', 'tokenizer-input'));
       typeahead.setDatasource(datasource);
 
       var tokenizer = new JX.Tokenizer(root);
       tokenizer.setTypeahead(typeahead);
       tokenizer.setRenderTokenCallback(function(value, key) {
         var icon = datasource.getResult(key);
         if (icon) {
           icon = icon.icon;
         } else {
           icon = config.icons[key];
         }
 
         if (!icon) {
           return value;
         }
 
         icon = render_icon(icon);
 
         // TODO: Maybe we should render these closed tags in grey? Figure out
         // how we're going to use color.
 
         return [icon, value];
       });
 
       if (config.placeholder) {
         tokenizer.setPlaceholder(config.placeholder);
       }
 
       if (config.limit) {
         tokenizer.setLimit(config.limit);
       }
 
       if (config.value) {
         tokenizer.setInitialValue(config.value);
       }
 
       JX.Stratcom.addData(root, {'tokenizer' : tokenizer});
 
       return {
         tokenizer: tokenizer
       };
     }
   }
 
 });
diff --git a/webroot/rsrc/js/phuix/PHUIXActionView.js b/webroot/rsrc/js/phuix/PHUIXActionView.js
index 08ca975404..6fe82c059c 100644
--- a/webroot/rsrc/js/phuix/PHUIXActionView.js
+++ b/webroot/rsrc/js/phuix/PHUIXActionView.js
@@ -1,151 +1,149 @@
 /**
  * @provides phuix-action-view
  * @requires javelin-install
  *           javelin-dom
  *           javelin-util
  * @javelin
  */
 
 JX.install('PHUIXActionView', {
 
   members: {
     _node: null,
     _name: null,
     _icon: 'none',
-    _iconSheet: 'icons',
     _disabled: false,
     _handler: null,
     _selected: false,
 
     _iconNode: null,
     _nameNode: null,
 
     setDisabled: function(disabled) {
       this._disabled = disabled;
       JX.DOM.alterClass(
         this.getNode(),
         'phabricator-action-view-disabled',
         disabled);
 
       this._buildIconNode(true);
 
       return this;
     },
 
     setSelected: function(selected) {
       this._selected = selected;
       JX.DOM.alterClass(
         this.getNode(),
         'phabricator-action-view-selected',
         selected);
 
       return this;
     },
 
     setName: function(name) {
       this._name = name;
       this._buildNameNode(true);
       return this;
     },
 
     setHandler: function(handler) {
       this._handler = handler;
       this._buildNameNode(true);
       return this;
     },
 
-    setIcon: function(icon, sheet) {
+    setIcon: function(icon) {
       this._icon = icon;
-      this._iconSheet = sheet || this._iconSheet;
       this._buildIconNode(true);
       return this;
     },
 
     setHref: function(href) {
       this._href = href;
       this._buildNameNode(true);
       return this;
     },
 
     getNode: function() {
       if (!this._node) {
         var attr = {
           className: 'phabricator-action-view'
         };
 
         var content = [
           this._buildIconNode(),
           this._buildNameNode()
         ];
 
         this._node = JX.$N('li', attr, content);
       }
 
       return this._node;
     },
 
     _buildIconNode: function(dirty) {
       if (!this._iconNode || dirty) {
         var attr = {
           className: [
             'phui-icon-view',
             'phabricator-action-view-icon',
-            'sprite-' + this._iconSheet
+            'phui-font-fa'
           ].join(' ')
         };
         var node = JX.$N('span', attr);
 
-        var icon_class = this._iconSheet + '-' + this._icon;
+        var icon_class = this._icon;
         if (this._disabled) {
-          icon_class = icon_class + '-grey';
+          icon_class = icon_class + ' grey';
         }
 
         JX.DOM.alterClass(node, icon_class, true);
 
         if (this._iconNode && this._iconNode.parentNode) {
           JX.DOM.replace(this._iconNode, node);
         }
         this._iconNode = node;
       }
 
       return this._iconNode;
     },
 
     _buildNameNode: function(dirty) {
       if (!this._nameNode || dirty) {
         var attr = {
           className: 'phabricator-action-view-item'
         };
 
         var href = this._href;
         if (!href && this._handler) {
           href = '#';
         }
         if (href) {
           attr.href = href;
 
         }
 
         var tag = href ? 'a' : 'span';
 
         var node = JX.$N(tag, attr, this._name);
         JX.DOM.listen(node, 'click', null, JX.bind(this, this._onclick));
 
         if (this._nameNode && this._nameNode.parentNode) {
           JX.DOM.replace(this._nameNode, node);
         }
         this._nameNode = node;
       }
 
       return this._nameNode;
     },
 
     _onclick: function(e) {
       if (this._handler) {
         this._handler(e);
       }
     }
 
   }
 
 });