diff --git a/resources/celerity/map.php b/resources/celerity/map.php
index 09a0a8b63..6c47792f4 100644
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -1,2188 +1,2188 @@
 <?php
 
 /**
  * This file is automatically generated. Use 'bin/celerity map' to rebuild it.
  * @generated
  */
 return array(
   'names' =>
   array(
     'core.pkg.css' => 'c88bd7c6',
     'core.pkg.js' => '417722ff',
     'darkconsole.pkg.js' => 'ca8671ce',
     'differential.pkg.css' => '12c11318',
     'differential.pkg.js' => '11a5b750',
     'diffusion.pkg.css' => '3783278d',
     'diffusion.pkg.js' => '5b4010f4',
     'javelin.pkg.js' => '0452e69d',
     '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' => 'ef989c67',
     'rsrc/css/aphront/multi-column.css' => '12f65921',
     'rsrc/css/aphront/notification.css' => '6901121e',
     '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' => 'de599000',
     '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' => '271456a1',
     'rsrc/css/application/auth/auth.css' => '1e655982',
     'rsrc/css/application/base/main-menu-view.css' => 'd36e0c11',
     'rsrc/css/application/base/notification-menu.css' => 'fc9a363c',
     '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' => '2aedca89',
     'rsrc/css/application/conpherence/notification.css' => '403cf598',
     'rsrc/css/application/conpherence/update.css' => '1099a660',
     'rsrc/css/application/conpherence/widget-pane.css' => '87b12e0c',
     'rsrc/css/application/contentsource/content-source-view.css' => '4b8b05d4',
     'rsrc/css/application/countdown/timer.css' => '86b7b0a0',
     'rsrc/css/application/diff/inline-comment-summary.css' => '14a91639',
     'rsrc/css/application/differential/add-comment.css' => 'c478bcaa',
     'rsrc/css/application/differential/changeset-view.css' => '1570a1ff',
     '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' => '2b7d0f54',
     'rsrc/css/application/herald/herald.css' => '59d48f01',
     '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' => '450826e1',
     'rsrc/css/application/pholio/pholio-edit.css' => 'b9e59b6d',
     'rsrc/css/application/pholio/pholio-inline-comments.css' => '52be33f0',
     'rsrc/css/application/pholio/pholio.css' => '2fa97dbe',
     '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.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' => '5f7bca25',
     'rsrc/css/application/uiexample/example.css' => '81adeffe',
     'rsrc/css/core/core.css' => 'da26ddb2',
     'rsrc/css/core/remarkup.css' => '0923dbd6',
     'rsrc/css/core/syntax.css' => '3c18c1cb',
     'rsrc/css/core/z-index.css' => '0d89d53c',
     'rsrc/css/diviner/diviner-shared.css' => '38813222',
     'rsrc/css/font/font-awesome.css' => '62bc244d',
     'rsrc/css/font/font-glyphicons-halflings.css' => 'c4c1c6b6',
     'rsrc/css/font/font-source-sans-pro.css' => '91d53463',
     'rsrc/css/font/phui-font-icon-base.css' => 'cc5465ba',
     'rsrc/css/layout/phabricator-action-header-view.css' => 'c14dfc57',
     'rsrc/css/layout/phabricator-action-list-view.css' => '81383e25',
     'rsrc/css/layout/phabricator-crumbs-view.css' => '2d9db584',
     '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' => '653ac588',
     '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' => '5b79f0ef',
     'rsrc/css/phui/phui-icon.css' => '322274f9',
     'rsrc/css/phui/phui-info-panel.css' => '27ea50a1',
     'rsrc/css/phui/phui-list.css' => 'ef8035b6',
     'rsrc/css/phui/phui-object-box.css' => 'ce92d8ec',
     'rsrc/css/phui/phui-object-item-list-view.css' => '8b459abe',
     'rsrc/css/phui/phui-pinboard-view.css' => '4b346c2a',
     'rsrc/css/phui/phui-property-list-view.css' => 'dbf53b12',
     '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' => '295d81c4',
     'rsrc/css/phui/phui-text.css' => '23e9b4b7',
-    'rsrc/css/phui/phui-timeline-view.css' => '18035042',
+    'rsrc/css/phui/phui-timeline-view.css' => '66803fc3',
     'rsrc/css/phui/phui-workboard-view.css' => '84f2c272',
     'rsrc/css/phui/phui-workpanel-view.css' => '97b69459',
     'rsrc/css/sprite-actions.css' => '969ad0e5',
     'rsrc/css/sprite-apps-large.css' => '5abf49e9',
     'rsrc/css/sprite-apps-xlarge.css' => 'db66c878',
     'rsrc/css/sprite-apps.css' => '6973a52b',
     '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-icons.css' => 'f19a828c',
     'rsrc/css/sprite-login.css' => '9fbaec81',
     '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-status.css' => '8bce1c97',
     'rsrc/css/sprite-tokens.css' => '1706b943',
     'rsrc/externals/font/fontawesome/fontawesome-webfont.eot' => 'b676fe4f',
     'rsrc/externals/font/fontawesome/fontawesome-webfont.ttf' => 'af66fc5c',
     'rsrc/externals/font/fontawesome/fontawesome-webfont.woff' => 'c713570f',
     'rsrc/externals/font/sourcesans/SourceSansPro.woff' => '3614608c',
     'rsrc/externals/font/sourcesans/SourceSansProBold.woff' => 'cbf46566',
     'rsrc/externals/javelin/core/Event.js' => '79473b62',
     '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' => '32a4d380',
     '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' => '23f9bb8d',
     'rsrc/externals/javelin/lib/Resource.js' => '356de121',
     'rsrc/externals/javelin/lib/URI.js' => 'd9a9b862',
     'rsrc/externals/javelin/lib/Vector.js' => '039fb90d',
     'rsrc/externals/javelin/lib/Workflow.js' => 'f28bf201',
     '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' => 'f778a573',
     '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' => 'c091b2d3',
     'rsrc/image/sprite-apps-large-X2.png' => 'e1396a83',
     'rsrc/image/sprite-apps-large.png' => '48cef7bd',
     'rsrc/image/sprite-apps-xlarge.png' => 'a751a580',
     'rsrc/image/sprite-apps.png' => '4f788e21',
     '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-icons-X2.png' => '0d5867c0',
     'rsrc/image/sprite-icons.png' => '3f754bda',
     'rsrc/image/sprite-login-X2.png' => '81c1344f',
     'rsrc/image/sprite-login.png' => '7c729508',
     '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-status-X2.png' => '82445ee0',
     'rsrc/image/sprite-status.png' => '926a896a',
     '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' => '845731b8',
     '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' => 'd8ef8659',
     'rsrc/js/application/countdown/timer.js' => '889c96f3',
     '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' => '5f004630',
     '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' => 'ce0c217a',
     '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/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-pull-lastmodified.js' => '75903ee1',
     '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' => 'c01153ea',
     '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' => '925c9bab',
     '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/DropdownMenu.js' => 'fb342e18',
     'rsrc/js/core/DropdownMenuItem.js' => '0f386ef4',
     '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/ShapedRequest.js' => 'dfa181a4',
     '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-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' => 'b4eef37b',
     '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' => 'c4b31646',
     'rsrc/js/core/behavior-remarkup-preview.js' => 'f7379f45',
     'rsrc/js/core/behavior-reveal-content.js' => '8f24abfc',
     'rsrc/js/core/behavior-search-typeahead.js' => 'f6b56f7a',
     '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' => 'fee00761',
     'rsrc/js/core/phtize.js' => 'd254d646',
     'rsrc/js/phui/behavior-phui-object-box-tabs.js' => 'a3e2244e',
     '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' => 'ef989c67',
     'aphront-multi-column-view-css' => '12f65921',
     'aphront-pager-view-css' => '2e3539af',
     'aphront-panel-view-css' => '5846dfa2',
     'aphront-request-failure-view-css' => 'da14df31',
     'aphront-table-view-css' => 'de599000',
     'aphront-tokenizer-control-css' => '36903077',
     'aphront-tooltip-css' => '9c90229d',
     'aphront-two-column-view-css' => '16ab3ad2',
     'aphront-typeahead-control-css' => '271456a1',
     'auth-css' => '1e655982',
     'config-options-css' => '7fedf08b',
     'conpherence-menu-css' => '561348ac',
     'conpherence-message-pane-css' => '2aedca89',
     'conpherence-notification-css' => '403cf598',
     'conpherence-update-css' => '1099a660',
     'conpherence-widget-pane-css' => '87b12e0c',
     'differential-changeset-view-css' => '1570a1ff',
     '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' => '62bc244d',
     'font-glyphicons-halflings' => 'c4c1c6b6',
     'font-source-sans-pro' => '91d53463',
     'global-drag-and-drop-css' => '697324ad',
     'harbormaster-css' => 'cec833b7',
     'herald-css' => '59d48f01',
     'herald-rule-editor' => '22d2966a',
     'herald-test-css' => '2b7d0f54',
     'inline-comment-summary-css' => '14a91639',
     'javelin-aphlict' => '493665ee',
     'javelin-behavior' => '8a3ed18b',
     'javelin-behavior-aphlict-dropdown' => '2a2dba85',
     'javelin-behavior-aphlict-listen' => '845731b8',
     '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' => 'd8ef8659',
     'javelin-behavior-countdown-timer' => '889c96f3',
     'javelin-behavior-dark-console' => 'e9fdb5e5',
     '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' => '5f004630',
     'javelin-behavior-differential-edit-inline-comments' => '00861799',
     'javelin-behavior-differential-feedback-preview' => '127f2018',
     'javelin-behavior-differential-keyboard-navigation' => '173ce7e7',
     'javelin-behavior-differential-populate' => 'ce0c217a',
     '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-pull-lastmodified' => '75903ee1',
     '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-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' => 'b4eef37b',
     'javelin-behavior-phabricator-oncopy' => 'c3e218fe',
     'javelin-behavior-phabricator-remarkup-assist' => 'c021950a',
     'javelin-behavior-phabricator-reveal-content' => '8f24abfc',
     'javelin-behavior-phabricator-search-typeahead' => 'f6b56f7a',
     'javelin-behavior-phabricator-show-all-transactions' => '7c273581',
     'javelin-behavior-phabricator-tooltips' => '48db4145',
     'javelin-behavior-phabricator-transaction-comment-form' => '9084a36f',
     'javelin-behavior-phabricator-transaction-list' => '925c9bab',
     '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-policy-control' => 'c01153ea',
     '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' => 'c4b31646',
     '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' => 'fee00761',
     'javelin-color' => '7e41274a',
     'javelin-cookie' => '6b3dcf44',
     'javelin-dom' => '32a4d380',
     'javelin-dynval' => 'f6555212',
     'javelin-event' => '79473b62',
     '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' => '23f9bb8d',
     'javelin-resource' => '356de121',
     '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' => 'f778a573',
     'javelin-typeahead-source' => '62e18640',
     'javelin-typeahead-static-source' => 'cdde23f1',
     'javelin-uri' => 'd9a9b862',
     'javelin-util' => '65b0b249',
     'javelin-vector' => '039fb90d',
     'javelin-view' => '0f764c35',
     'javelin-view-html' => 'e5b406f9',
     'javelin-view-interpreter' => '0c33c1a0',
     'javelin-view-renderer' => '6c2b09a2',
     'javelin-view-visitor' => 'efe49472',
     'javelin-workflow' => 'f28bf201',
     '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' => '81383e25',
     'phabricator-application-launch-view-css' => 'd290ba21',
     'phabricator-busy' => '6453c869',
     'phabricator-chatlog-css' => '852140ff',
     'phabricator-content-source-view-css' => '4b8b05d4',
     'phabricator-core-css' => 'da26ddb2',
     'phabricator-countdown-css' => '86b7b0a0',
     'phabricator-crumbs-view-css' => '2d9db584',
     'phabricator-drag-and-drop-file-upload' => 'ae6abfba',
     'phabricator-draggable-list' => '1681c4d4',
     'phabricator-dropdown-menu' => 'fb342e18',
     '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' => 'd36e0c11',
     'phabricator-menu-item' => '0f386ef4',
     'phabricator-nav-view-css' => '80e60fc1',
     'phabricator-notification' => '0c6946e7',
     'phabricator-notification-css' => '6901121e',
     'phabricator-notification-menu-css' => 'fc9a363c',
     'phabricator-object-selector-css' => '029a133d',
     'phabricator-phtize' => 'd254d646',
     'phabricator-prefab' => '0326e5d0',
     'phabricator-profile-css' => '33e6f703',
     'phabricator-project-tag-css' => '095c9404',
     'phabricator-remarkup-css' => '0923dbd6',
     'phabricator-search-results-css' => 'f240504c',
     'phabricator-settings-css' => 'ea8f5915',
     'phabricator-shaped-request' => 'dfa181a4',
     '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' => '81adeffe',
     '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' => '0d89d53c',
     'phame-css' => '450826e1',
     'pholio-css' => '2fa97dbe',
     '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' => '653ac588',
     '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' => 'cc5465ba',
     'phui-fontkit-css' => 'de84aa4a',
     'phui-form-css' => 'b78ec020',
     'phui-form-view-css' => '867463b4',
     'phui-header-view-css' => '5b79f0ef',
     'phui-icon-view-css' => '322274f9',
     'phui-info-panel-css' => '27ea50a1',
     'phui-list-view-css' => 'ef8035b6',
     'phui-object-box-css' => 'ce92d8ec',
     'phui-object-item-list-view-css' => '8b459abe',
     'phui-pinboard-view-css' => '4b346c2a',
     'phui-property-list-view-css' => 'dbf53b12',
     'phui-remarkup-preview-css' => '19ad512b',
     'phui-spacing-css' => '042804d6',
     'phui-status-list-view-css' => '2f562399',
     'phui-tag-view-css' => '295d81c4',
     'phui-text-css' => '23e9b4b7',
-    'phui-timeline-view-css' => '18035042',
+    'phui-timeline-view-css' => '66803fc3',
     'phui-workboard-view-css' => '84f2c272',
     'phui-workpanel-view-css' => '97b69459',
     'policy-css' => '957ea14c',
     'policy-edit-css' => '05cca26a',
     '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' => '6973a52b',
     'sprite-apps-large-css' => '5abf49e9',
     'sprite-apps-xlarge-css' => 'db66c878',
     'sprite-buttonbar-css' => 'ba1c5738',
     'sprite-conpherence-css' => '3b4a0487',
     'sprite-docs-css' => '5f65d0da',
     'sprite-gradient-css' => 'a10def53',
     'sprite-icons-css' => 'f19a828c',
     'sprite-login-css' => '9fbaec81',
     'sprite-main-header-css' => '92720ee2',
     'sprite-menu-css' => '8da53882',
     'sprite-minicons-css' => 'df4f76fe',
     'sprite-payments-css' => 'cc085d44',
     'sprite-projects-css' => '7578fa56',
     'sprite-status-css' => '8bce1c97',
     'sprite-tokens-css' => '1706b943',
     'subscribers-list-css' => '5bb30c78',
     'syntax-highlighting-css' => '3c18c1cb',
     'tokens-css' => '5f7bca25',
   ),
   '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',
     ),
     '039fb90d' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-event',
     ),
     '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',
     ),
     '08e56a4e' =>
     array(
       0 => 'javelin-install',
     ),
     '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',
     ),
     '0f386ef4' =>
     array(
       0 => 'javelin-install',
       1 => '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',
     ),
     '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',
     ),
     '23f9bb8d' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-stratcom',
       2 => 'javelin-util',
       3 => 'javelin-behavior',
       4 => 'javelin-json',
       5 => 'javelin-dom',
       6 => 'javelin-resource',
     ),
     '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',
     ),
     '2a2dba85' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-request',
       2 => 'javelin-stratcom',
       3 => 'javelin-vector',
       4 => 'javelin-dom',
       5 => 'javelin-uri',
       6 => 'javelin-behavior-device',
     ),
     '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',
     ),
     '32a4d380' =>
     array(
       0 => 'javelin-magical-init',
       1 => 'javelin-install',
       2 => 'javelin-util',
       3 => 'javelin-vector',
       4 => 'javelin-stratcom',
     ),
     '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',
     ),
     '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',
     ),
     '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',
     ),
     '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',
     ),
     '5f004630' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-stratcom',
       4 => 'phabricator-dropdown-menu',
       5 => 'phabricator-menu-item',
       6 => 'phabricator-phtize',
     ),
     '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',
     ),
     '6b3dcf44' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
     ),
     '6c2b09a2' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
     ),
     '71755c79' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     '7319e029' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
     ),
     '75903ee1' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-request',
     ),
     '76f4ebed' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-reactor',
       2 => 'javelin-util',
     ),
     '77b1cf6f' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
     ),
     '79473b62' =>
     array(
       0 => 'javelin-install',
     ),
     '7a68dda3' =>
     array(
       0 => 'owners-path-editor',
       1 => 'javelin-behavior',
     ),
     '7ba325ee' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-reactor-dom',
     ),
     '7c273581' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-dom',
     ),
     '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',
     ),
     '82f568cd' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-dom',
       2 => 'javelin-reactor-dom',
     ),
     '845731b8' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-aphlict',
       2 => 'javelin-stratcom',
       3 => 'javelin-request',
       4 => 'javelin-uri',
       5 => 'javelin-dom',
       6 => 'javelin-json',
       7 => 'phabricator-notification',
     ),
     '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',
     ),
     '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',
     ),
     '925c9bab' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-workflow',
       3 => 'javelin-dom',
       4 => 'javelin-fx',
       5 => 'javelin-util',
     ),
     '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',
     ),
     'b3ec3cfc' =>
     array(
       0 => 'javelin-install',
     ),
     'b4c30592' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-reactor',
       2 => 'javelin-util',
       3 => 'javelin-reactor-node-calmer',
     ),
     'b4eef37b' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-request',
       3 => 'javelin-util',
     ),
     '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',
     ),
     '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',
     ),
     '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',
     ),
     'c01153ea' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'phabricator-dropdown-menu',
       4 => 'phabricator-menu-item',
       5 => 'javelin-workflow',
     ),
     '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',
     ),
     'c4b31646' =>
     array(
       0 => 'javelin-request',
       1 => 'javelin-behavior',
       2 => 'javelin-dom',
       3 => 'phabricator-busy',
     ),
     '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',
     ),
     'ce0c217a' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-workflow',
       2 => 'javelin-util',
       3 => 'javelin-dom',
       4 => 'javelin-stratcom',
       5 => 'javelin-behavior-device',
       6 => 'javelin-vector',
       7 => 'phabricator-tooltip',
     ),
     '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',
     ),
     'd8e135db' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'javelin-stratcom',
       4 => 'javelin-workflow',
       5 => 'phabricator-draggable-list',
     ),
     'd8ef8659' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-stratcom',
       3 => 'javelin-workflow',
       4 => 'javelin-util',
       5 => 'phabricator-notification',
       6 => 'javelin-behavior-device',
       7 => 'phabricator-dropdown-menu',
       8 => 'phabricator-menu-item',
     ),
     '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',
     ),
     'dfa181a4' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-request',
     ),
     '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',
     ),
     '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',
     ),
     'f2441746' =>
     array(
       0 => 'javelin-dom',
       1 => 'javelin-util',
       2 => 'javelin-stratcom',
       3 => 'javelin-install',
       4 => 'javelin-request',
       5 => 'javelin-workflow',
     ),
     'f28bf201' =>
     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',
     ),
     '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',
     ),
     'f6b56f7a' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-typeahead-ondemand-source',
       2 => 'javelin-typeahead',
       3 => 'javelin-dom',
       4 => 'javelin-uri',
       5 => 'javelin-util',
       6 => 'javelin-stratcom',
     ),
     'f7379f45' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-dom',
       2 => 'javelin-util',
       3 => 'phabricator-shaped-request',
     ),
     'f778a573' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-request',
       3 => 'javelin-typeahead-source',
     ),
     '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',
     ),
     'fb342e18' =>
     array(
       0 => 'javelin-install',
       1 => 'javelin-util',
       2 => 'javelin-dom',
       3 => 'javelin-vector',
       4 => 'javelin-stratcom',
       5 => 'phabricator-menu-item',
     ),
     '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',
     ),
     'fee00761' =>
     array(
       0 => 'javelin-behavior',
       1 => 'javelin-stratcom',
       2 => 'javelin-workflow',
       3 => 'javelin-dom',
     ),
     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-icons-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',
     ),
     '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 => 'phabricator-menu-item',
       10 => 'phabricator-dropdown-menu',
       11 => 'phabricator-phtize',
       12 => 'javelin-behavior-phabricator-oncopy',
       13 => 'phabricator-tooltip',
       14 => 'javelin-behavior-phabricator-tooltips',
       15 => 'phabricator-prefab',
       16 => 'javelin-behavior-device',
       17 => 'javelin-behavior-toggle-class',
       18 => 'javelin-behavior-lightbox-attachments',
       19 => 'phabricator-busy',
       20 => 'javelin-aphlict',
       21 => 'phabricator-notification',
       22 => 'javelin-behavior-aphlict-listen',
       23 => 'javelin-behavior-phabricator-search-typeahead',
       24 => 'javelin-behavior-konami',
       25 => 'javelin-behavior-aphlict-dropdown',
       26 => 'javelin-behavior-history-install',
       27 => 'javelin-behavior-phabricator-gesture',
       28 => 'javelin-behavior-phabricator-active-nav',
       29 => 'javelin-behavior-phabricator-nav',
       30 => 'javelin-behavior-phabricator-remarkup-assist',
       31 => 'phabricator-textareautils',
       32 => 'phabricator-file-upload',
       33 => 'javelin-behavior-global-drag-and-drop',
       34 => 'javelin-behavior-phabricator-reveal-content',
       35 => 'phabricator-hovercard',
       36 => 'javelin-behavior-phabricator-hovercards',
       37 => 'javelin-color',
       38 => '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/src/applications/auth/storage/PhabricatorAuthProviderConfigTransaction.php b/src/applications/auth/storage/PhabricatorAuthProviderConfigTransaction.php
index bb5b35b98..bb02531e1 100644
--- a/src/applications/auth/storage/PhabricatorAuthProviderConfigTransaction.php
+++ b/src/applications/auth/storage/PhabricatorAuthProviderConfigTransaction.php
@@ -1,142 +1,142 @@
 <?php
 
 final class PhabricatorAuthProviderConfigTransaction
   extends PhabricatorApplicationTransaction {
 
   const TYPE_ENABLE         = 'config:enable';
   const TYPE_REGISTRATION   = 'config:registration';
   const TYPE_LINK           = 'config:link';
   const TYPE_UNLINK         = 'config:unlink';
   const TYPE_PROPERTY       = 'config:property';
 
   const PROPERTY_KEY        = 'auth:property';
 
   private $provider;
 
   public function setProvider(PhabricatorAuthProvider $provider) {
     $this->provider = $provider;
     return $this;
   }
 
   public function getProvider() {
     return $this->provider;
   }
 
   public function getApplicationName() {
     return 'auth';
   }
 
   public function getApplicationTransactionType() {
     return PhabricatorPHIDConstants::PHID_TYPE_AUTH;
   }
 
   public function getApplicationTransactionCommentObject() {
     return null;
   }
 
   public function getIcon() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_ENABLE:
         if ($new) {
-          return 'new';
+          return 'fa-play';
         } else {
-          return 'delete';
+          return 'fa-pause';
         }
     }
 
     return parent::getIcon();
   }
 
   public function getColor() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_ENABLE:
         if ($new) {
           return 'green';
         } else {
           return 'red';
         }
     }
 
     return parent::getColor();
   }
 
   public function getTitle() {
     $author_phid = $this->getAuthorPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_ENABLE:
         if ($old === null) {
           return pht(
             '%s created this provider.',
             $this->renderHandleLink($author_phid));
         } else if ($new) {
           return pht(
             '%s enabled this provider.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s disabled this provider.',
             $this->renderHandleLink($author_phid));
         }
         break;
       case self::TYPE_REGISTRATION:
         if ($new) {
           return pht(
             '%s enabled registration.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s disabled registration.',
             $this->renderHandleLink($author_phid));
         }
         break;
       case self::TYPE_LINK:
         if ($new) {
           return pht(
             '%s enabled accont linking.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s disabled account linking.',
             $this->renderHandleLink($author_phid));
         }
         break;
       case self::TYPE_UNLINK:
         if ($new) {
           return pht(
             '%s enabled account unlinking.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s disabled account unlinking.',
             $this->renderHandleLink($author_phid));
         }
         break;
       case self::TYPE_PROPERTY:
         $provider = $this->getProvider();
         if ($provider) {
           $title = $provider->renderConfigPropertyTransactionTitle($this);
           if (strlen($title)) {
             return $title;
           }
         }
 
         return pht(
           '%s edited a property of this provider.',
           $this->renderHandleLink($author_phid));
         break;
     }
 
     return parent::getTitle();
   }
 
 }
diff --git a/src/applications/config/storage/PhabricatorConfigTransaction.php b/src/applications/config/storage/PhabricatorConfigTransaction.php
index 579b8b3b6..ccabf44d8 100644
--- a/src/applications/config/storage/PhabricatorConfigTransaction.php
+++ b/src/applications/config/storage/PhabricatorConfigTransaction.php
@@ -1,118 +1,118 @@
 <?php
 
 final class PhabricatorConfigTransaction
   extends PhabricatorApplicationTransaction {
 
   const TYPE_EDIT = 'config:edit';
 
   public function getApplicationName() {
     return 'config';
   }
 
   public function getApplicationTransactionType() {
     return PhabricatorConfigPHIDTypeConfig::TYPECONST;
   }
 
   public function getApplicationTransactionCommentObject() {
     return null;
   }
 
   public function getTitle() {
     $author_phid = $this->getAuthorPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_EDIT:
 
         // TODO: After T2213 show the actual values too; for now, we don't
         // have the tools to do it without making a bit of a mess of it.
 
         $old_del = idx($old, 'deleted');
         $new_del = idx($new, 'deleted');
         if ($old_del && !$new_del) {
           return pht(
             '%s created this configuration entry.',
             $this->renderHandleLink($author_phid));
         } else if (!$old_del && $new_del) {
           return pht(
             '%s deleted this configuration entry.',
             $this->renderHandleLink($author_phid));
         } else if ($old_del && $new_del) {
           // This is a bug.
           return pht(
             '%s deleted this configuration entry (again?).',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s edited this configuration entry.',
             $this->renderHandleLink($author_phid));
         }
         break;
     }
 
     return parent::getTitle();
   }
 
 
   public function getIcon() {
     switch ($this->getTransactionType()) {
       case self::TYPE_EDIT:
-        return 'edit';
+        return 'fa-pencil';
     }
 
     return parent::getIcon();
   }
 
   public function hasChangeDetails() {
     switch ($this->getTransactionType()) {
       case self::TYPE_EDIT:
         return true;
     }
     return parent::hasChangeDetails();
   }
 
   public function renderChangeDetails(PhabricatorUser $viewer) {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     if ($old['deleted']) {
       $old_text = '';
     } else {
       $old_text = PhabricatorConfigJSON::prettyPrintJSON($old['value']);
     }
 
     if ($new['deleted']) {
       $new_text = '';
     } else {
       $new_text = PhabricatorConfigJSON::prettyPrintJSON($new['value']);
     }
 
     return $this->renderTextCorpusChangeDetails(
       $viewer,
       $old_text,
       $new_text);
   }
 
   public function getColor() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_EDIT:
         $old_del = idx($old, 'deleted');
         $new_del = idx($new, 'deleted');
 
         if ($old_del && !$new_del) {
           return PhabricatorTransactions::COLOR_GREEN;
         } else if (!$old_del && $new_del) {
           return PhabricatorTransactions::COLOR_RED;
         } else {
           return PhabricatorTransactions::COLOR_BLUE;
         }
         break;
     }
   }
 
 }
diff --git a/src/applications/differential/storage/DifferentialTransaction.php b/src/applications/differential/storage/DifferentialTransaction.php
index 0f06e054d..3ab075230 100644
--- a/src/applications/differential/storage/DifferentialTransaction.php
+++ b/src/applications/differential/storage/DifferentialTransaction.php
@@ -1,491 +1,492 @@
 <?php
 
 final class DifferentialTransaction extends PhabricatorApplicationTransaction {
 
   private $isCommandeerSideEffect;
 
 
   public function setIsCommandeerSideEffect($is_side_effect) {
     $this->isCommandeerSideEffect = $is_side_effect;
     return $this;
   }
 
   public function getIsCommandeerSideEffect() {
     return $this->isCommandeerSideEffect;
   }
 
   const TYPE_INLINE = 'differential:inline';
   const TYPE_UPDATE = 'differential:update';
   const TYPE_ACTION = 'differential:action';
   const TYPE_STATUS = 'differential:status';
 
   public function getApplicationName() {
     return 'differential';
   }
 
   public function getApplicationTransactionType() {
     return DifferentialPHIDTypeRevision::TYPECONST;
   }
 
   public function getApplicationTransactionCommentObject() {
     return new DifferentialTransactionComment();
   }
 
   public function shouldHide() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_UPDATE:
         // Older versions of this transaction have an ID for the new value,
         // and/or do not record the old value. Only hide the transaction if
         // the new value is a PHID, indicating that this is a newer style
         // transaction.
         if ($old === null) {
           if (phid_get_type($new) == DifferentialPHIDTypeDiff::TYPECONST) {
             return true;
           }
         }
         break;
 
       case PhabricatorTransactions::TYPE_EDGE:
         $add = array_diff_key($new, $old);
         $rem = array_diff_key($old, $new);
 
         // Hide metadata-only edge transactions. These correspond to users
         // accepting or rejecting revisions, but the change is always explicit
         // because of the TYPE_ACTION transaction. Rendering these transactions
         // just creates clutter.
 
         if (!$add && !$rem) {
           return true;
         }
         break;
     }
 
     return parent::shouldHide();
   }
 
   public function shouldHideForMail(array $xactions) {
     switch ($this->getTransactionType()) {
       case self::TYPE_INLINE:
         // Hide inlines when rendering mail transactions if any other
         // transaction type exists.
         foreach ($xactions as $xaction) {
           if ($xaction->getTransactionType() != self::TYPE_INLINE) {
             return true;
           }
         }
 
         // If only inline transactions exist, we just render the first one.
         return ($this !== head($xactions));
     }
 
     return parent::shouldHideForMail($xactions);
   }
 
   public function getBodyForMail() {
     switch ($this->getTransactionType()) {
       case self::TYPE_INLINE:
         // Don't render inlines into the mail body; they render into a special
         // section immediately after the body instead.
         return null;
     }
 
     return parent::getBodyForMail();
   }
 
   public function getRequiredHandlePHIDs() {
     $phids = parent::getRequiredHandlePHIDs();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_UPDATE:
         if ($new) {
           $phids[] = $new;
         }
         break;
     }
 
     return $phids;
   }
 
   public function getActionName() {
     switch ($this->getTransactionType()) {
       case self::TYPE_INLINE:
         return pht('Commented On');
       case self::TYPE_UPDATE:
         $old = $this->getOldValue();
         if ($old === null) {
           return pht('Request');
         } else {
           return pht('Updated');
         }
       case self::TYPE_ACTION:
         $map = array(
           DifferentialAction::ACTION_ACCEPT => pht('Accepted'),
           DifferentialAction::ACTION_REJECT => pht('Requested Changes To'),
           DifferentialAction::ACTION_RETHINK => pht('Planned Changes To'),
           DifferentialAction::ACTION_ABANDON => pht('Abandoned'),
           DifferentialAction::ACTION_CLOSE => pht('Closed'),
           DifferentialAction::ACTION_REQUEST => pht('Requested A Review Of'),
           DifferentialAction::ACTION_RESIGN => pht('Resigned From'),
           DifferentialAction::ACTION_ADDREVIEWERS => pht('Added Reviewers'),
           DifferentialAction::ACTION_CLAIM => pht('Commandeered'),
           DifferentialAction::ACTION_REOPEN => pht('Reopened'),
         );
         $name = idx($map, $this->getNewValue());
         if ($name !== null) {
           return $name;
         }
         break;
     }
 
     return parent::getActionName();
   }
 
   public function getMailTags() {
     $tags = array();
 
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_SUBSCRIBERS;
         $tags[] = MetaMTANotificationType::TYPE_DIFFERENTIAL_CC;
         break;
       case self::TYPE_ACTION:
         switch ($this->getNewValue()) {
           case DifferentialAction::ACTION_CLOSE:
             $tags[] = MetaMTANotificationType::TYPE_DIFFERENTIAL_CLOSED;
             break;
         }
         break;
       case self::TYPE_UPDATE:
         $old = $this->getOldValue();
         if ($old === null) {
           $tags[] = MetaMTANotificationType::TYPE_DIFFERENTIAL_REVIEW_REQUEST;
         } else {
           $tags[] = MetaMTANotificationType::TYPE_DIFFERENTIAL_UPDATED;
         }
         break;
       case PhabricatorTransactions::TYPE_EDGE:
         switch ($this->getMetadataValue('edge:type')) {
           case PhabricatorEdgeConfig::TYPE_DREV_HAS_REVIEWER:
             $tags[] = MetaMTANotificationType::TYPE_DIFFERENTIAL_REVIEWERS;
             break;
         }
         break;
       case PhabricatorTransactions::TYPE_COMMENT:
       case self::TYPE_INLINE:
         $tags[] = MetaMTANotificationType::TYPE_DIFFERENTIAL_COMMENT;
         break;
     }
 
     if (!$tags) {
       $tags[] = MetaMTANotificationType::TYPE_DIFFERENTIAL_OTHER;
     }
 
     return $tags;
   }
 
   public function getTitle() {
     $author_phid = $this->getAuthorPHID();
     $author_handle = $this->renderHandleLink($author_phid);
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_INLINE:
         return pht(
           '%s added inline comments.',
           $author_handle);
       case self::TYPE_UPDATE:
         if ($new) {
           // TODO: Migrate to PHIDs and use handles here?
           if (phid_get_type($new) == DifferentialPHIDTypeDiff::TYPECONST) {
             return pht(
               '%s updated this revision to %s.',
               $author_handle,
               $this->renderHandleLink($new));
           } else {
             return pht(
               '%s updated this revision.',
               $author_handle);
           }
         } else {
           return pht(
             '%s updated this revision.',
             $author_handle);
         }
       case self::TYPE_ACTION:
         return DifferentialAction::getBasicStoryText($new, $author_handle);
       case self::TYPE_STATUS:
         switch ($this->getNewValue()) {
           case ArcanistDifferentialRevisionStatus::ACCEPTED:
             return pht(
               'This revision is now accepted and ready to land.');
           case ArcanistDifferentialRevisionStatus::NEEDS_REVISION:
             return pht(
               'This revision now requires changes to proceed.');
           case ArcanistDifferentialRevisionStatus::NEEDS_REVIEW:
             return pht(
               'This revision now requires review to proceed.');
         }
     }
 
     return parent::getTitle();
   }
 
   public function getTitleForFeed(PhabricatorFeedStory $story) {
     $author_phid = $this->getAuthorPHID();
     $object_phid = $this->getObjectPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     $author_link = $this->renderHandleLink($author_phid);
     $object_link = $this->renderHandleLink($object_phid);
 
     switch ($this->getTransactionType()) {
       case self::TYPE_INLINE:
         return pht(
           '%s added inline comments to %s.',
           $author_link,
           $object_link);
       case self::TYPE_UPDATE:
         return pht(
           '%s updated the diff for %s.',
           $author_link,
           $object_link);
       case self::TYPE_ACTION:
         switch ($new) {
           case DifferentialAction::ACTION_ACCEPT:
             return pht(
               '%s accepted %s.',
               $author_link,
               $object_link);
           case DifferentialAction::ACTION_REJECT:
             return pht(
               '%s requested changes to %s.',
               $author_link,
               $object_link);
           case DifferentialAction::ACTION_RETHINK:
             return pht(
               '%s planned changes to %s.',
               $author_link,
               $object_link);
           case DifferentialAction::ACTION_ABANDON:
             return pht(
               '%s abandoned %s.',
               $author_link,
               $object_link);
           case DifferentialAction::ACTION_CLOSE:
             return pht(
               '%s closed %s.',
               $author_link,
               $object_link);
           case DifferentialAction::ACTION_REQUEST:
             return pht(
               '%s requested review of %s.',
               $author_link,
               $object_link);
           case DifferentialAction::ACTION_RECLAIM:
             return pht(
               '%s reclaimed %s.',
               $author_link,
               $object_link);
           case DifferentialAction::ACTION_RESIGN:
             return pht(
               '%s resigned from %s.',
               $author_link,
               $object_link);
           case DifferentialAction::ACTION_CLAIM:
             return pht(
               '%s commandeered %s.',
               $author_link,
               $object_link);
           case DifferentialAction::ACTION_REOPEN:
             return pht(
               '%s reopened %s.',
               $author_link,
               $object_link);
         }
         break;
       case self::TYPE_STATUS:
         switch ($this->getNewValue()) {
           case ArcanistDifferentialRevisionStatus::ACCEPTED:
             return pht(
               '%s is now accepted and ready to land.',
               $object_link);
           case ArcanistDifferentialRevisionStatus::NEEDS_REVISION:
             return pht(
               '%s now requires changes to proceed.',
               $object_link);
           case ArcanistDifferentialRevisionStatus::NEEDS_REVIEW:
             return pht(
               '%s now requires review to proceed.',
               $object_link);
         }
     }
 
     return parent::getTitleForFeed($story);
   }
 
   public function getIcon() {
     switch ($this->getTransactionType()) {
       case self::TYPE_INLINE:
-        return 'comment';
+        return 'fa-comment';
       case self::TYPE_UPDATE:
-        return 'refresh';
+        return 'fa-refresh';
       case self::TYPE_STATUS:
         switch ($this->getNewValue()) {
           case ArcanistDifferentialRevisionStatus::ACCEPTED:
-            return 'enable';
+            return 'fa-check';
           case ArcanistDifferentialRevisionStatus::NEEDS_REVISION:
-            return 'delete';
+            return 'fa-times';
           case ArcanistDifferentialRevisionStatus::NEEDS_REVIEW:
-            return 'refresh';
+            return 'fa-undo';
         }
         break;
       case self::TYPE_ACTION:
         switch ($this->getNewValue()) {
           case DifferentialAction::ACTION_CLOSE:
-            return 'ok';
+            return 'fa-check-square-o';
           case DifferentialAction::ACTION_ACCEPT:
-            return 'enable';
+            return 'fa-check';
           case DifferentialAction::ACTION_REJECT:
+            return 'fa-times';
           case DifferentialAction::ACTION_ABANDON:
-            return 'delete';
+            return 'fa-plane';
           case DifferentialAction::ACTION_RETHINK:
-            return 'disable';
+            return 'fa-headphones';
           case DifferentialAction::ACTION_REQUEST:
-            return 'refresh';
+            return 'fa-refresh';
           case DifferentialAction::ACTION_RECLAIM:
           case DifferentialAction::ACTION_REOPEN:
-            return 'new';
+            return 'fa-bullhorn';
           case DifferentialAction::ACTION_RESIGN:
-            return 'undo';
+            return 'fa-flag';
           case DifferentialAction::ACTION_CLAIM:
-            return 'user';
+            return 'fa-flag';
         }
     }
 
     return parent::getIcon();
   }
 
   public function shouldDisplayGroupWith(array $group) {
 
     // Never group status changes with other types of actions, they're indirect
     // and don't make sense when combined with direct actions.
 
     $type_status = self::TYPE_STATUS;
 
     if ($this->getTransactionType() == $type_status) {
       return false;
     }
 
     foreach ($group as $xaction) {
       if ($xaction->getTransactionType() == $type_status) {
         return false;
       }
     }
 
     return parent::shouldDisplayGroupWith($group);
   }
 
 
   public function getColor() {
     switch ($this->getTransactionType()) {
       case self::TYPE_UPDATE:
         return PhabricatorTransactions::COLOR_SKY;
       case self::TYPE_STATUS:
         switch ($this->getNewValue()) {
           case ArcanistDifferentialRevisionStatus::ACCEPTED:
             return PhabricatorTransactions::COLOR_GREEN;
           case ArcanistDifferentialRevisionStatus::NEEDS_REVISION:
             return PhabricatorTransactions::COLOR_RED;
           case ArcanistDifferentialRevisionStatus::NEEDS_REVIEW:
             return PhabricatorTransactions::COLOR_ORANGE;
         }
         break;
       case self::TYPE_ACTION:
         switch ($this->getNewValue()) {
           case DifferentialAction::ACTION_CLOSE:
             return PhabricatorTransactions::COLOR_BLUE;
           case DifferentialAction::ACTION_ACCEPT:
             return PhabricatorTransactions::COLOR_GREEN;
           case DifferentialAction::ACTION_REJECT:
             return PhabricatorTransactions::COLOR_RED;
           case DifferentialAction::ACTION_ABANDON:
             return PhabricatorTransactions::COLOR_BLACK;
           case DifferentialAction::ACTION_RETHINK:
             return PhabricatorTransactions::COLOR_RED;
           case DifferentialAction::ACTION_REQUEST:
             return PhabricatorTransactions::COLOR_SKY;
           case DifferentialAction::ACTION_RECLAIM:
             return PhabricatorTransactions::COLOR_SKY;
           case DifferentialAction::ACTION_REOPEN:
             return PhabricatorTransactions::COLOR_SKY;
           case DifferentialAction::ACTION_RESIGN:
             return PhabricatorTransactions::COLOR_ORANGE;
           case DifferentialAction::ACTION_CLAIM:
             return PhabricatorTransactions::COLOR_YELLOW;
         }
     }
 
 
     return parent::getColor();
   }
 
   public function getNoEffectDescription() {
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_EDGE:
         switch ($this->getMetadataValue('edge:type')) {
           case PhabricatorEdgeConfig::TYPE_DREV_HAS_REVIEWER:
             return pht(
               'The reviewers you are trying to add are already reviewing '.
               'this revision.');
         }
         break;
       case DifferentialTransaction::TYPE_ACTION:
         switch ($this->getNewValue()) {
           case DifferentialAction::ACTION_CLOSE:
             return pht('This revision is already closed.');
           case DifferentialAction::ACTION_ABANDON:
             return pht('This revision has already been abandoned.');
           case DifferentialAction::ACTION_RECLAIM:
             return pht(
               'You can not reclaim this revision because his revision is '.
               'not abandoned.');
           case DifferentialAction::ACTION_REOPEN:
             return pht(
               'You can not reopen this revision because this revision is '.
               'not closed.');
           case DifferentialAction::ACTION_RETHINK:
             return pht('This revision already requires changes.');
           case DifferentialAction::ACTION_REQUEST:
             return pht('Review is already requested for this revision.');
           case DifferentialAction::ACTION_RESIGN:
             return pht(
               'You can not resign from this revision because you are not '.
               'a reviewer.');
           case DifferentialAction::ACTION_CLAIM:
             return pht(
               'You can not commandeer this revision because you already own '.
               'it.');
           case DifferentialAction::ACTION_ACCEPT:
             return pht(
               'You have already accepted this revision.');
           case DifferentialAction::ACTION_REJECT:
             return pht(
               'You have already requested changes to this revision.');
         }
         break;
     }
 
     return parent::getNoEffectDescription();
   }
 
 
 }
diff --git a/src/applications/harbormaster/storage/configuration/HarbormasterBuildPlanTransaction.php b/src/applications/harbormaster/storage/configuration/HarbormasterBuildPlanTransaction.php
index bf03518d5..96e6f5d7d 100644
--- a/src/applications/harbormaster/storage/configuration/HarbormasterBuildPlanTransaction.php
+++ b/src/applications/harbormaster/storage/configuration/HarbormasterBuildPlanTransaction.php
@@ -1,84 +1,84 @@
 <?php
 
 final class HarbormasterBuildPlanTransaction
   extends PhabricatorApplicationTransaction {
 
   const TYPE_NAME = 'harbormaster:name';
   const TYPE_STATUS = 'harbormaster:status';
 
   public function getApplicationName() {
     return 'harbormaster';
   }
 
   public function getApplicationTransactionType() {
     return HarbormasterPHIDTypeBuildPlan::TYPECONST;
   }
 
   public function getApplicationTransactionCommentObject() {
     return new HarbormasterBuildPlanTransactionComment();
   }
 
   public function getIcon() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_NAME:
         if ($old === null) {
-          return 'create';
+          return 'fa-plus';
         }
         break;
     }
 
     return parent::getIcon();
   }
 
   public function getColor() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_NAME:
         if ($old === null) {
           return 'green';
         }
         break;
     }
 
     return parent::getIcon();
   }
 
   public function getTitle() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
     $author_handle = $this->renderHandleLink($this->getAuthorPHID());
 
     switch ($this->getTransactionType()) {
       case self::TYPE_NAME:
         if ($old === null) {
           return pht(
             '%s created this build plan.',
             $author_handle);
         } else {
           return pht(
             '%s renamed this build plan from "%s" to "%s".',
             $author_handle,
             $old,
             $new);
         }
       case self::TYPE_STATUS:
         if ($new == HarbormasterBuildPlan::STATUS_DISABLED) {
           return pht(
             '%s disabled this build plan.',
             $author_handle);
         } else {
           return pht(
             '%s enabled this build plan.',
             $author_handle);
         }
     }
 
     return parent::getTitle();
   }
 
 }
diff --git a/src/applications/harbormaster/storage/configuration/HarbormasterBuildStepTransaction.php b/src/applications/harbormaster/storage/configuration/HarbormasterBuildStepTransaction.php
index f30bb6767..ca04a9818 100644
--- a/src/applications/harbormaster/storage/configuration/HarbormasterBuildStepTransaction.php
+++ b/src/applications/harbormaster/storage/configuration/HarbormasterBuildStepTransaction.php
@@ -1,60 +1,60 @@
 <?php
 
 final class HarbormasterBuildStepTransaction
   extends PhabricatorApplicationTransaction {
 
   const TYPE_CREATE = 'harbormaster:step:create';
 
   public function getApplicationName() {
     return 'harbormaster';
   }
 
   public function getApplicationTransactionType() {
     return HarbormasterPHIDTypeBuildStep::TYPECONST;
   }
 
   public function getTitle() {
     $author_phid = $this->getAuthorPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_CREATE:
         return pht(
           '%s created this build step.',
           $this->renderHandleLink($author_phid));
     }
 
     return parent::getTitle();
   }
 
   public function getIcon() {
     $author_phid = $this->getAuthorPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_CREATE:
-        return 'create';
+        return 'fa-plus';
     }
 
     return parent::getIcon();
   }
 
   public function getColor() {
     $author_phid = $this->getAuthorPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_CREATE:
         return 'green';
     }
 
     return parent::getColor();
   }
 
 }
diff --git a/src/applications/herald/storage/HeraldRuleTransaction.php b/src/applications/herald/storage/HeraldRuleTransaction.php
index d63c47725..11eb4012b 100644
--- a/src/applications/herald/storage/HeraldRuleTransaction.php
+++ b/src/applications/herald/storage/HeraldRuleTransaction.php
@@ -1,92 +1,92 @@
 <?php
 
 final class HeraldRuleTransaction
   extends PhabricatorApplicationTransaction {
 
   const TYPE_EDIT = 'herald:edit';
   const TYPE_DISABLE = 'herald:disable';
 
   public function getApplicationName() {
     return 'herald';
   }
 
   public function getApplicationTransactionType() {
     return HeraldPHIDTypeRule::TYPECONST;
   }
 
   public function getApplicationTransactionCommentObject() {
     return new HeraldRuleTransactionComment();
   }
 
   public function getColor() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_DISABLE:
         if ($new) {
           return 'red';
         } else {
           return 'green';
         }
     }
 
     return parent::getColor();
   }
 
   public function getActionName() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_DISABLE:
         if ($new) {
           return pht('Disabled');
         } else {
           return pht('Enabled');
         }
     }
 
     return parent::getActionName();
   }
 
   public function getIcon() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_DISABLE:
         if ($new) {
-          return 'disable';
+          return 'fa-pause';
         } else {
-          return 'enable';
+          return 'fa-play';
         }
     }
 
     return parent::getIcon();
   }
 
 
   public function getTitle() {
     $author_phid = $this->getAuthorPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_DISABLE:
         if ($new) {
           return pht(
             '%s disabled this rule.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s enabled this rule.',
             $this->renderHandleLink($author_phid));
         }
     }
 
     return parent::getTitle();
   }
 
 }
diff --git a/src/applications/macro/storage/PhabricatorMacroTransaction.php b/src/applications/macro/storage/PhabricatorMacroTransaction.php
index c29cb9226..c2bd27950 100644
--- a/src/applications/macro/storage/PhabricatorMacroTransaction.php
+++ b/src/applications/macro/storage/PhabricatorMacroTransaction.php
@@ -1,303 +1,303 @@
 <?php
 
 final class PhabricatorMacroTransaction
   extends PhabricatorApplicationTransaction {
 
   public function getApplicationName() {
     return 'file';
   }
 
   public function getTableName() {
     return 'macro_transaction';
   }
 
   public function getApplicationTransactionType() {
     return PhabricatorMacroPHIDTypeMacro::TYPECONST;
   }
 
   public function getApplicationTransactionCommentObject() {
     return new PhabricatorMacroTransactionComment();
   }
 
   public function getRequiredHandlePHIDs() {
     $phids = parent::getRequiredHandlePHIDs();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case PhabricatorMacroTransactionType::TYPE_FILE:
       case PhabricatorMacroTransactionType::TYPE_AUDIO:
         if ($old !== null) {
           $phids[] = $old;
         }
         $phids[] = $new;
         break;
     }
 
     return $phids;
   }
 
   public function shouldHide() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case PhabricatorMacroTransactionType::TYPE_NAME:
         return ($old === null);
     }
 
     return parent::shouldHide();
   }
 
   public function getTitle() {
     $author_phid = $this->getAuthorPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case PhabricatorMacroTransactionType::TYPE_NAME:
         return pht(
           '%s renamed this macro from "%s" to "%s".',
           $this->renderHandleLink($author_phid),
           $old,
           $new);
         break;
       case PhabricatorMacroTransactionType::TYPE_DISABLED:
         if ($new) {
           return pht(
             '%s disabled this macro.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s restored this macro.',
             $this->renderHandleLink($author_phid));
         }
         break;
 
       case PhabricatorMacroTransactionType::TYPE_AUDIO:
         if (!$old) {
           return pht(
             '%s attached audio: %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($new));
         } else {
           return pht(
             '%s changed the audio for this macro from %s to %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($old),
             $this->renderHandleLink($new));
         }
 
       case PhabricatorMacroTransactionType::TYPE_AUDIO_BEHAVIOR:
         switch ($new) {
           case PhabricatorFileImageMacro::AUDIO_BEHAVIOR_ONCE:
             return pht(
               '%s set the audio to play once.',
               $this->renderHandleLink($author_phid));
           case PhabricatorFileImageMacro::AUDIO_BEHAVIOR_LOOP:
             return pht(
               '%s set the audio to loop.',
               $this->renderHandleLink($author_phid));
           default:
             return pht(
               '%s disabled the audio for this macro.',
               $this->renderHandleLink($author_phid));
         }
 
       case PhabricatorMacroTransactionType::TYPE_FILE:
         if ($old === null) {
           return pht(
             '%s created this macro.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s changed the image for this macro from %s to %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($old),
             $this->renderHandleLink($new));
         }
         break;
     }
 
     return parent::getTitle();
   }
 
   public function getTitleForFeed(PhabricatorFeedStory $story) {
     $author_phid = $this->getAuthorPHID();
     $object_phid = $this->getObjectPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case PhabricatorMacroTransactionType::TYPE_NAME:
         return pht(
           '%s renamed %s from "%s" to "%s".',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid),
           $old,
           $new);
       case PhabricatorMacroTransactionType::TYPE_DISABLED:
         if ($new) {
           return pht(
             '%s disabled %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid));
         } else {
           return pht(
             '%s restored %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid));
         }
       case PhabricatorMacroTransactionType::TYPE_FILE:
         if ($old === null) {
           return pht(
             '%s created %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid));
         } else {
           return pht(
             '%s updated the image for %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid));
         }
 
       case PhabricatorMacroTransactionType::TYPE_AUDIO:
         if (!$old) {
           return pht(
             '%s attached audio to %s: %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid),
             $this->renderHandleLink($new));
         } else {
           return pht(
             '%s changed the audio for %s from %s to %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid),
             $this->renderHandleLink($old),
             $this->renderHandleLink($new));
         }
 
       case PhabricatorMacroTransactionType::TYPE_AUDIO_BEHAVIOR:
         switch ($new) {
           case PhabricatorFileImageMacro::AUDIO_BEHAVIOR_ONCE:
             return pht(
               '%s set the audio for %s to play once.',
               $this->renderHandleLink($author_phid),
               $this->renderHandleLink($object_phid));
           case PhabricatorFileImageMacro::AUDIO_BEHAVIOR_LOOP:
             return pht(
               '%s set the audio for %s to loop.',
               $this->renderHandleLink($author_phid),
               $this->renderHandleLink($object_phid));
           default:
             return pht(
               '%s disabled the audio for %s.',
               $this->renderHandleLink($author_phid),
               $this->renderHandleLink($object_phid));
         }
 
     }
 
     return parent::getTitleForFeed($story);
   }
 
   public function getActionName() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case PhabricatorMacroTransactionType::TYPE_NAME:
         if ($old === null) {
           return pht('Created');
         } else {
           return pht('Renamed');
         }
       case PhabricatorMacroTransactionType::TYPE_DISABLED:
         if ($new) {
           return pht('Disabled');
         } else {
           return pht('Restored');
         }
       case PhabricatorMacroTransactionType::TYPE_FILE:
         if ($old === null) {
           return pht('Created');
         } else {
           return pht('Edited Image');
         }
 
       case PhabricatorMacroTransactionType::TYPE_AUDIO:
         return pht('Audio');
 
       case PhabricatorMacroTransactionType::TYPE_AUDIO_BEHAVIOR:
         return pht('Audio Behavior');
 
     }
 
     return parent::getActionName();
   }
 
   public function getActionStrength() {
     switch ($this->getTransactionType()) {
       case PhabricatorMacroTransactionType::TYPE_DISABLED:
         return 2.0;
       case PhabricatorMacroTransactionType::TYPE_FILE:
         return 1.5;
     }
     return parent::getActionStrength();
   }
 
   public function getIcon() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case PhabricatorMacroTransactionType::TYPE_NAME:
-        return 'edit';
+        return 'fa-pencil';
       case PhabricatorMacroTransactionType::TYPE_FILE:
         if ($old === null) {
-          return 'create';
+          return 'fa-plus';
         } else {
-          return 'edit';
+          return 'fa-pencil';
         }
       case PhabricatorMacroTransactionType::TYPE_DISABLED:
         if ($new) {
-          return 'delete';
+          return 'fa-times';
         } else {
-          return 'undo';
+          return 'fa-undo';
         }
       case PhabricatorMacroTransactionType::TYPE_AUDIO:
-        return 'herald';
+        return 'fa-headphones';
     }
 
     return parent::getIcon();
   }
 
   public function getColor() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case PhabricatorMacroTransactionType::TYPE_NAME:
         return PhabricatorTransactions::COLOR_BLUE;
       case PhabricatorMacroTransactionType::TYPE_FILE:
         if ($old === null) {
           return PhabricatorTransactions::COLOR_GREEN;
         } else {
           return PhabricatorTransactions::COLOR_BLUE;
         }
       case PhabricatorMacroTransactionType::TYPE_DISABLED:
         if ($new) {
           return PhabricatorTransactions::COLOR_BLACK;
         } else {
           return PhabricatorTransactions::COLOR_SKY;
         }
     }
 
     return parent::getColor();
   }
 
 
 }
diff --git a/src/applications/maniphest/storage/ManiphestTransaction.php b/src/applications/maniphest/storage/ManiphestTransaction.php
index e05e0de0e..721fa1f29 100644
--- a/src/applications/maniphest/storage/ManiphestTransaction.php
+++ b/src/applications/maniphest/storage/ManiphestTransaction.php
@@ -1,756 +1,756 @@
 <?php
 
 final class ManiphestTransaction
   extends PhabricatorApplicationTransaction {
 
   const TYPE_TITLE = 'title';
   const TYPE_STATUS = 'status';
   const TYPE_DESCRIPTION = 'description';
   const TYPE_OWNER  = 'reassign';
   const TYPE_CCS = 'ccs';
   const TYPE_PROJECTS = 'projects';
   const TYPE_PRIORITY = 'priority';
   const TYPE_EDGE = 'edge';
   const TYPE_SUBPRIORITY = 'subpriority';
   const TYPE_PROJECT_COLUMN = 'projectcolumn';
 
   // NOTE: this type is deprecated. Keep it around for legacy installs
   // so any transactions render correctly.
   const TYPE_ATTACH = 'attach';
 
   public function getApplicationName() {
     return 'maniphest';
   }
 
   public function getApplicationTransactionType() {
     return ManiphestPHIDTypeTask::TYPECONST;
   }
 
   public function getApplicationTransactionCommentObject() {
     return new ManiphestTransactionComment();
   }
 
   public function shouldGenerateOldValue() {
     switch ($this->getTransactionType()) {
       case self::TYPE_PROJECT_COLUMN:
       case self::TYPE_EDGE:
         return false;
     }
 
     return parent::shouldGenerateOldValue();
   }
 
   public function getRequiredHandlePHIDs() {
     $phids = parent::getRequiredHandlePHIDs();
 
     $new = $this->getNewValue();
     $old = $this->getOldValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_OWNER:
         if ($new) {
           $phids[] = $new;
         }
 
         if ($old) {
           $phids[] = $old;
         }
         break;
       case self::TYPE_CCS:
       case self::TYPE_PROJECTS:
         $phids = array_mergev(
           array(
             $phids,
             nonempty($old, array()),
             nonempty($new, array()),
           ));
         break;
       case self::TYPE_PROJECT_COLUMN:
         $phids[] = $new['projectPHID'];
         $phids[] = head($new['columnPHIDs']);
         break;
       case self::TYPE_EDGE:
         $phids = array_mergev(
           array(
             $phids,
             array_keys(nonempty($old, array())),
             array_keys(nonempty($new, array())),
           ));
         break;
       case self::TYPE_ATTACH:
         $old = nonempty($old, array());
         $new = nonempty($new, array());
         $phids = array_mergev(
           array(
             $phids,
             array_keys(idx($new, 'FILE', array())),
             array_keys(idx($old, 'FILE', array())),
           ));
         break;
 
     }
 
     return $phids;
   }
 
   public function shouldHide() {
     switch ($this->getTransactionType()) {
       case self::TYPE_DESCRIPTION:
       case self::TYPE_PRIORITY:
       case self::TYPE_STATUS:
         if ($this->getOldValue() === null) {
           return true;
         } else {
           return false;
         }
         break;
       case self::TYPE_SUBPRIORITY:
         return true;
     }
 
     return parent::shouldHide();
   }
 
   public function getActionStrength() {
     switch ($this->getTransactionType()) {
       case self::TYPE_TITLE:
         return 1.4;
       case self::TYPE_STATUS:
         return 1.3;
       case self::TYPE_OWNER:
         return 1.2;
       case self::TYPE_PRIORITY:
         return 1.1;
     }
 
     return parent::getActionStrength();
   }
 
 
   public function getColor() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_OWNER:
         if ($this->getAuthorPHID() == $new) {
           return 'green';
         } else if (!$new) {
           return 'black';
         } else if (!$old) {
           return 'green';
         } else {
           return 'green';
         }
 
       case self::TYPE_STATUS:
         $color = ManiphestTaskStatus::getStatusColor($new);
         if ($color !== null) {
           return $color;
         }
 
         if (ManiphestTaskStatus::isOpenStatus($new)) {
           return 'green';
         } else {
           return 'black';
         }
 
       case self::TYPE_PRIORITY:
         if ($old == ManiphestTaskPriority::getDefaultPriority()) {
           return 'green';
         } else if ($old > $new) {
           return 'grey';
         } else {
           return 'yellow';
         }
 
     }
 
     return parent::getColor();
   }
 
   public function getActionName() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_TITLE:
         if ($old === null) {
           return pht('Created');
         }
 
         return pht('Retitled');
 
       case self::TYPE_STATUS:
         $action = ManiphestTaskStatus::getStatusActionName($new);
         if ($action) {
           return $action;
         }
 
         $old_closed = ManiphestTaskStatus::isClosedStatus($old);
         $new_closed = ManiphestTaskStatus::isClosedStatus($new);
 
         if ($new_closed && !$old_closed) {
           return pht('Closed');
         } else if (!$new_closed && $old_closed) {
           return pht('Reopened');
         } else {
           return pht('Changed Status');
         }
 
       case self::TYPE_DESCRIPTION:
         return pht('Edited');
 
       case self::TYPE_OWNER:
         if ($this->getAuthorPHID() == $new) {
           return pht('Claimed');
         } else if (!$new) {
           return pht('Up For Grabs');
         } else if (!$old) {
           return pht('Assigned');
         } else {
           return pht('Reassigned');
         }
 
       case self::TYPE_CCS:
         return pht('Changed CC');
 
       case self::TYPE_PROJECTS:
         return pht('Changed Projects');
 
       case self::TYPE_PROJECT_COLUMN:
         return pht('Changed Project Column');
 
       case self::TYPE_PRIORITY:
         if ($old == ManiphestTaskPriority::getDefaultPriority()) {
           return pht('Triaged');
         } else if ($old > $new) {
           return pht('Lowered Priority');
         } else {
           return pht('Raised Priority');
         }
 
       case self::TYPE_EDGE:
       case self::TYPE_ATTACH:
         return pht('Attached');
     }
 
     return parent::getActionName();
   }
 
   public function getIcon() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_OWNER:
-        return 'user';
+        return 'fa-user';
 
       case self::TYPE_CCS:
-        return 'meta-mta';
+        return 'fa-envelope';
 
       case self::TYPE_TITLE:
         if ($old === null) {
-          return 'create';
+          return 'fa-pencil';
         }
 
-        return 'edit';
+        return 'fa-pencil';
 
       case self::TYPE_STATUS:
         $action = ManiphestTaskStatus::getStatusIcon($new);
         if ($action !== null) {
           return $action;
         }
 
         if (ManiphestTaskStatus::isClosedStatus($new)) {
-          return 'check';
+          return 'fa-check-square-o';
         } else {
-          return 'edit';
+          return 'fa-pencil';
         }
 
       case self::TYPE_DESCRIPTION:
-        return 'edit';
+        return 'fa-pencil';
 
       case self::TYPE_PROJECTS:
-        return 'project';
+        return 'fa-briefcase';
 
       case self::TYPE_PROJECT_COLUMN:
-        return 'workboard';
+        return 'fa-columns';
 
       case self::TYPE_PRIORITY:
         if ($old == ManiphestTaskPriority::getDefaultPriority()) {
-          return 'normal-priority';
+          return 'fa-arrow-right';
           return pht('Triaged');
         } else if ($old > $new) {
-          return 'lower-priority';
+          return 'fa-arrow-down';
         } else {
-          return 'raise-priority';
+          return 'fa-arrow-up';
         }
 
       case self::TYPE_EDGE:
       case self::TYPE_ATTACH:
-        return 'attach';
+        return 'fa-thumb-tack';
 
     }
 
     return parent::getIcon();
   }
 
 
 
   public function getTitle() {
     $author_phid = $this->getAuthorPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_TITLE:
         if ($old === null) {
           return pht(
             '%s created this task.',
             $this->renderHandleLink($author_phid));
         }
         return pht(
           '%s changed the title from "%s" to "%s".',
           $this->renderHandleLink($author_phid),
           $old,
           $new);
 
       case self::TYPE_DESCRIPTION:
         return pht(
           '%s edited the task description.',
           $this->renderHandleLink($author_phid));
 
       case self::TYPE_STATUS:
         $old_closed = ManiphestTaskStatus::isClosedStatus($old);
         $new_closed = ManiphestTaskStatus::isClosedStatus($new);
 
         $old_name = ManiphestTaskStatus::getTaskStatusName($old);
         $new_name = ManiphestTaskStatus::getTaskStatusName($new);
 
         if ($new_closed && !$old_closed) {
           if ($new == ManiphestTaskStatus::getDuplicateStatus()) {
             return pht(
               '%s closed this task as a duplicate.',
               $this->renderHandleLink($author_phid));
           } else {
             return pht(
               '%s closed this task as "%s".',
               $this->renderHandleLink($author_phid),
               $new_name);
           }
         } else if (!$new_closed && $old_closed) {
           return pht(
             '%s reopened this task as "%s".',
             $this->renderHandleLink($author_phid),
             $new_name);
         } else {
           return pht(
             '%s changed the task status from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $old_name,
             $new_name);
         }
 
       case self::TYPE_OWNER:
         if ($author_phid == $new) {
           return pht(
             '%s claimed this task.',
             $this->renderHandleLink($author_phid));
         } else if (!$new) {
           return pht(
             '%s placed this task up for grabs.',
             $this->renderHandleLink($author_phid));
         } else if (!$old) {
           return pht(
             '%s assigned this task to %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($new));
         } else {
           return pht(
             '%s reassigned this task from %s to %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($old),
             $this->renderHandleLink($new));
         }
 
       case self::TYPE_PROJECTS:
         $added = array_diff($new, $old);
         $removed = array_diff($old, $new);
         if ($added && !$removed) {
           return pht(
             '%s added %d project(s): %s',
             $this->renderHandleLink($author_phid),
             count($added),
             $this->renderHandleList($added));
         } else if ($removed && !$added) {
           return pht(
             '%s removed %d project(s): %s',
             $this->renderHandleLink($author_phid),
             count($removed),
             $this->renderHandleList($removed));
         } else if ($removed && $added) {
           return pht(
             '%s changed project(s), added %d: %s; removed %d: %s',
             $this->renderHandleLink($author_phid),
             count($added),
             $this->renderHandleList($added),
             count($removed),
             $this->renderHandleList($removed));
         } else {
           // This is hit when rendering previews.
           return pht(
             '%s changed projects...',
             $this->renderHandleLink($author_phid));
         }
 
       case self::TYPE_PRIORITY:
         $old_name = ManiphestTaskPriority::getTaskPriorityName($old);
         $new_name = ManiphestTaskPriority::getTaskPriorityName($new);
 
         if ($old == ManiphestTaskPriority::getDefaultPriority()) {
           return pht(
             '%s triaged this task as "%s" priority.',
             $this->renderHandleLink($author_phid),
             $new_name);
         } else if ($old > $new) {
           return pht(
             '%s lowered the priority of this task from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $old_name,
             $new_name);
         } else {
           return pht(
             '%s raised the priority of this task from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $old_name,
             $new_name);
         }
 
       case self::TYPE_CCS:
         // TODO: Remove this when we switch to subscribers. Just reuse the
         // code in the parent.
         $clone = clone $this;
         $clone->setTransactionType(PhabricatorTransactions::TYPE_SUBSCRIBERS);
         return $clone->getTitle();
 
       case self::TYPE_EDGE:
         // TODO: Remove this when we switch to real edges. Just reuse the
         // code in the parent;
         $clone = clone $this;
         $clone->setTransactionType(PhabricatorTransactions::TYPE_EDGE);
         return $clone->getTitle();
 
       case self::TYPE_ATTACH:
         $old = nonempty($old, array());
         $new = nonempty($new, array());
         $new = array_keys(idx($new, 'FILE', array()));
         $old = array_keys(idx($old, 'FILE', array()));
 
         $added = array_diff($new, $old);
         $removed = array_diff($old, $new);
         if ($added && !$removed) {
           return pht(
             '%s attached %d file(s): %s',
             $this->renderHandleLink($author_phid),
             count($added),
             $this->renderHandleList($added));
         } else if ($removed && !$added) {
           return pht(
             '%s detached %d file(s): %s',
             $this->renderHandleLink($author_phid),
             count($removed),
             $this->renderHandleList($removed));
         } else {
           return pht(
             '%s changed file(s), attached %d: %s; detached %d: %s',
             $this->renderHandleLink($author_phid),
             count($added),
             $this->renderHandleList($added),
             count($removed),
             $this->renderHandleList($removed));
         }
 
       case self::TYPE_PROJECT_COLUMN:
         $project_phid = $new['projectPHID'];
         $column_phid = head($new['columnPHIDs']);
         return pht(
           '%s moved this task to %s on the %s workboard.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($column_phid),
           $this->renderHandleLink($project_phid));
        break;
 
 
     }
 
     return parent::getTitle();
   }
 
   public function getTitleForFeed(PhabricatorFeedStory $story) {
     $author_phid = $this->getAuthorPHID();
     $object_phid = $this->getObjectPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_TITLE:
         if ($old === null) {
           return pht(
             '%s created %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid));
         }
 
         return pht(
           '%s renamed %s from "%s" to "%s".',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid),
           $old,
           $new);
 
       case self::TYPE_DESCRIPTION:
         return pht(
           '%s edited the description of %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
 
       case self::TYPE_STATUS:
         $old_closed = ManiphestTaskStatus::isClosedStatus($old);
         $new_closed = ManiphestTaskStatus::isClosedStatus($new);
 
         $old_name = ManiphestTaskStatus::getTaskStatusName($old);
         $new_name = ManiphestTaskStatus::getTaskStatusName($new);
 
         if ($new_closed && !$old_closed) {
           if ($new == ManiphestTaskStatus::getDuplicateStatus()) {
             return pht(
               '%s closed %s as a duplicate.',
               $this->renderHandleLink($author_phid),
               $this->renderHandleLink($object_phid));
           } else {
             return pht(
               '%s closed %s as "%s".',
               $this->renderHandleLink($author_phid),
               $this->renderHandleLink($object_phid),
               $new_name);
           }
         } else if (!$new_closed && $old_closed) {
           return pht(
             '%s reopened %s as "%s".',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid),
             $new_name);
         } else {
           return pht(
             '%s changed the status of %s from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid),
             $old_name,
             $new_name);
         }
 
       case self::TYPE_OWNER:
         if ($author_phid == $new) {
           return pht(
             '%s claimed %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid));
         } else if (!$new) {
           return pht(
             '%s placed %s up for grabs.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid));
         } else if (!$old) {
           return pht(
             '%s assigned %s to %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid),
             $this->renderHandleLink($new));
         } else {
           return pht(
             '%s reassigned %s from %s to %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid),
             $this->renderHandleLink($old),
             $this->renderHandleLink($new));
         }
 
       case self::TYPE_PROJECTS:
         $added = array_diff($new, $old);
         $removed = array_diff($old, $new);
         if ($added && !$removed) {
           return pht(
             '%s added %d project(s) to %s: %s',
             $this->renderHandleLink($author_phid),
             count($added),
             $this->renderHandleLink($object_phid),
             $this->renderHandleList($added));
         } else if ($removed && !$added) {
           return pht(
             '%s removed %d project(s) from %s: %s',
             $this->renderHandleLink($author_phid),
             count($removed),
             $this->renderHandleLink($object_phid),
             $this->renderHandleList($removed));
         } else if ($removed && $added) {
           return pht(
             '%s changed project(s) of %s, added %d: %s; removed %d: %s',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid),
             count($added),
             $this->renderHandleList($added),
             count($removed),
             $this->renderHandleList($removed));
         }
 
       case self::TYPE_PRIORITY:
         $old_name = ManiphestTaskPriority::getTaskPriorityName($old);
         $new_name = ManiphestTaskPriority::getTaskPriorityName($new);
 
         if ($old == ManiphestTaskPriority::getDefaultPriority()) {
           return pht(
             '%s triaged %s as "%s" priority.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid),
             $new_name);
         } else if ($old > $new) {
           return pht(
             '%s lowered the priority of %s from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid),
             $old_name,
             $new_name);
         } else {
           return pht(
             '%s raised the priority of %s from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid),
             $old_name,
             $new_name);
         }
 
       case self::TYPE_CCS:
         // TODO: Remove this when we switch to subscribers. Just reuse the
         // code in the parent.
         $clone = clone $this;
         $clone->setTransactionType(PhabricatorTransactions::TYPE_SUBSCRIBERS);
         return $clone->getTitleForFeed($story);
 
       case self::TYPE_EDGE:
         // TODO: Remove this when we switch to real edges. Just reuse the
         // code in the parent;
         $clone = clone $this;
         $clone->setTransactionType(PhabricatorTransactions::TYPE_EDGE);
         return $clone->getTitleForFeed($story);
 
       case self::TYPE_ATTACH:
         $old = nonempty($old, array());
         $new = nonempty($new, array());
         $new = array_keys(idx($new, 'FILE', array()));
         $old = array_keys(idx($old, 'FILE', array()));
 
         $added = array_diff($new, $old);
         $removed = array_diff($old, $new);
         if ($added && !$removed) {
           return pht(
             '%s attached %d file(s) of %s: %s',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid),
             count($added),
             $this->renderHandleList($added));
         } else if ($removed && !$added) {
           return pht(
             '%s detached %d file(s) of %s: %s',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid),
             count($removed),
             $this->renderHandleList($removed));
         } else {
           return pht(
             '%s changed file(s) for %s, attached %d: %s; detached %d: %s',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid),
             count($added),
             $this->renderHandleList($added),
             count($removed),
             $this->renderHandleList($removed));
         }
 
       case self::TYPE_PROJECT_COLUMN:
         $project_phid = $new['projectPHID'];
         $column_phid = head($new['columnPHIDs']);
         return pht(
           '%s moved %s to %s on the %s workboard.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid),
           $this->renderHandleLink($column_phid),
           $this->renderHandleLink($project_phid));
        break;
     }
 
     return parent::getTitleForFeed($story);
   }
 
   public function hasChangeDetails() {
     switch ($this->getTransactionType()) {
       case self::TYPE_DESCRIPTION:
         return true;
     }
     return parent::hasChangeDetails();
   }
 
   public function renderChangeDetails(PhabricatorUser $viewer) {
     return $this->renderTextCorpusChangeDetails(
       $viewer,
       $this->getOldValue(),
       $this->getNewValue());
   }
 
   public function getMailTags() {
     $tags = array();
     switch ($this->getTransactionType()) {
       case self::TYPE_STATUS:
         $tags[] = MetaMTANotificationType::TYPE_MANIPHEST_STATUS;
         break;
       case self::TYPE_OWNER:
         $tags[] = MetaMTANotificationType::TYPE_MANIPHEST_OWNER;
         break;
       case self::TYPE_CCS:
         $tags[] = MetaMTANotificationType::TYPE_MANIPHEST_CC;
         break;
       case self::TYPE_PROJECTS:
         $tags[] = MetaMTANotificationType::TYPE_MANIPHEST_PROJECTS;
         break;
       case self::TYPE_PRIORITY:
         $tags[] = MetaMTANotificationType::TYPE_MANIPHEST_PRIORITY;
         break;
       case PhabricatorTransactions::TYPE_COMMENT:
         $tags[] = MetaMTANotificationType::TYPE_MANIPHEST_COMMENT;
         break;
       default:
         $tags[] = MetaMTANotificationType::TYPE_MANIPHEST_OTHER;
         break;
     }
     return $tags;
   }
 
   public function getNoEffectDescription() {
 
     switch ($this->getTransactionType()) {
       case self::TYPE_STATUS:
         return pht('The task already has the selected status.');
       case self::TYPE_OWNER:
         return pht('The task already has the selected owner.');
       case self::TYPE_PROJECTS:
         return pht('The task is already associated with those projects.');
       case self::TYPE_PRIORITY:
         return pht('The task already has the selected priority.');
     }
 
     return parent::getNoEffectDescription();
   }
 
 }
diff --git a/src/applications/paste/storage/PhabricatorPasteTransaction.php b/src/applications/paste/storage/PhabricatorPasteTransaction.php
index 453c13802..a62f6be5f 100644
--- a/src/applications/paste/storage/PhabricatorPasteTransaction.php
+++ b/src/applications/paste/storage/PhabricatorPasteTransaction.php
@@ -1,131 +1,131 @@
 <?php
 
 final class PhabricatorPasteTransaction
   extends PhabricatorApplicationTransaction {
 
   const TYPE_CREATE = 'paste.create';
   const TYPE_TITLE = 'paste.title';
   const TYPE_LANGUAGE = 'paste.language';
 
   public function getApplicationName() {
     return 'pastebin';
   }
 
   public function getApplicationTransactionType() {
     return PhabricatorPastePHIDTypePaste::TYPECONST;
   }
 
   public function getApplicationTransactionCommentObject() {
     return new PhabricatorPasteTransactionComment();
   }
 
   public function getRequiredHandlePHIDs() {
     $phids = parent::getRequiredHandlePHIDs();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_CREATE:
         $phids[] = $this->getObjectPHID();
         break;
     }
 
     return $phids;
   }
 
   public function shouldHide() {
     $old = $this->getOldValue();
     switch ($this->getTransactionType()) {
       case self::TYPE_TITLE:
       case self::TYPE_LANGUAGE:
         return $old === null;
     }
     return parent::shouldHide();
   }
 
   public function getIcon() {
     switch ($this->getTransactionType()) {
       case self::TYPE_CREATE:
-        return 'create';
+        return 'fa-plus';
         break;
       case self::TYPE_TITLE:
       case self::TYPE_LANGUAGE:
-        return 'edit';
+        return 'fa-pencil';
         break;
     }
     return parent::getIcon();
   }
 
   public function getTitle() {
     $author_phid = $this->getAuthorPHID();
     $object_phid = $this->getObjectPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     $type = $this->getTransactionType();
     switch ($type) {
       case PhabricatorPasteTransaction::TYPE_CREATE:
         return pht(
           '%s created "%s".',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
         break;
       case PhabricatorPasteTransaction::TYPE_TITLE:
         return pht(
           '%s updated the paste\'s title to "%s".',
           $this->renderHandleLink($author_phid),
           $new);
         break;
       case PhabricatorPasteTransaction::TYPE_LANGUAGE:
         return pht(
           "%s updated the paste's language.",
           $this->renderHandleLink($author_phid));
         break;
     }
 
     return parent::getTitle();
   }
 
   public function getTitleForFeed(PhabricatorFeedStory $story) {
     $author_phid = $this->getAuthorPHID();
     $object_phid = $this->getObjectPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     $type = $this->getTransactionType();
     switch ($type) {
       case PhabricatorPasteTransaction::TYPE_CREATE:
         return pht(
           '%s created %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
         break;
       case PhabricatorPasteTransaction::TYPE_TITLE:
         return pht(
           '%s updated the title for %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
         break;
       case PhabricatorPasteTransaction::TYPE_LANGUAGE:
         return pht(
           '%s update the language for %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
         break;
     }
 
     return parent::getTitleForFeed($story);
   }
 
   public function getColor() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case PhabricatorPasteTransaction::TYPE_CREATE:
         return PhabricatorTransactions::COLOR_GREEN;
     }
 
     return parent::getColor();
   }
 }
diff --git a/src/applications/pholio/storage/PholioTransaction.php b/src/applications/pholio/storage/PholioTransaction.php
index d65414f09..c2e6c415f 100644
--- a/src/applications/pholio/storage/PholioTransaction.php
+++ b/src/applications/pholio/storage/PholioTransaction.php
@@ -1,335 +1,335 @@
 <?php
 
 final class PholioTransaction extends PhabricatorApplicationTransaction {
 
   public function getApplicationName() {
     return 'pholio';
   }
 
   public function getApplicationTransactionType() {
     return PholioPHIDTypeMock::TYPECONST;
   }
 
   public function getApplicationTransactionCommentObject() {
     return new PholioTransactionComment();
   }
 
   public function getApplicationTransactionViewObject() {
     return new PholioTransactionView();
   }
 
   public function getRequiredHandlePHIDs() {
     $phids = parent::getRequiredHandlePHIDs();
     $phids[] = $this->getObjectPHID();
 
     $new = $this->getNewValue();
     $old = $this->getOldValue();
 
     switch ($this->getTransactionType()) {
       case PholioTransactionType::TYPE_IMAGE_FILE:
         $phids = array_merge($phids, $new, $old);
         break;
       case PholioTransactionType::TYPE_IMAGE_REPLACE:
         $phids[] = $new;
         $phids[] = $old;
         break;
       case PholioTransactionType::TYPE_IMAGE_DESCRIPTION:
       case PholioTransactionType::TYPE_IMAGE_NAME:
       case PholioTransactionType::TYPE_IMAGE_SEQUENCE:
         $phids[] = key($new);
         break;
     }
 
     return $phids;
   }
 
   public function shouldHide() {
     $old = $this->getOldValue();
 
     switch ($this->getTransactionType()) {
       case PholioTransactionType::TYPE_DESCRIPTION:
         return ($old === null);
       case PholioTransactionType::TYPE_IMAGE_NAME:
       case PholioTransactionType::TYPE_IMAGE_DESCRIPTION:
         return ($old === array(null => null));
       // this is boring / silly to surface; changing sequence is NBD
       case PholioTransactionType::TYPE_IMAGE_SEQUENCE:
         return true;
     }
 
     return parent::shouldHide();
   }
 
   public function getIcon() {
     switch ($this->getTransactionType()) {
       case PholioTransactionType::TYPE_INLINE:
-        return 'comment';
+        return 'fa-comment';
       case PholioTransactionType::TYPE_NAME:
       case PholioTransactionType::TYPE_DESCRIPTION:
       case PholioTransactionType::TYPE_IMAGE_NAME:
       case PholioTransactionType::TYPE_IMAGE_DESCRIPTION:
       case PholioTransactionType::TYPE_IMAGE_SEQUENCE:
-        return 'edit';
+        return 'fa-pencil';
       case PholioTransactionType::TYPE_IMAGE_FILE:
       case PholioTransactionType::TYPE_IMAGE_REPLACE:
-        return 'attach';
+        return 'fa-picture-o';
     }
 
     return parent::getIcon();
   }
 
   public function getTitle() {
     $author_phid = $this->getAuthorPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     $type = $this->getTransactionType();
     switch ($type) {
       case PholioTransactionType::TYPE_NAME:
         if ($old === null) {
           return pht(
             '%s created "%s".',
             $this->renderHandleLink($author_phid),
             $new);
         } else {
           return pht(
             '%s renamed this mock from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $old,
             $new);
         }
         break;
       case PholioTransactionType::TYPE_DESCRIPTION:
         return pht(
           "%s updated the mock's description.",
           $this->renderHandleLink($author_phid));
         break;
       case PholioTransactionType::TYPE_INLINE:
         $count = 1;
         foreach ($this->getTransactionGroup() as $xaction) {
           if ($xaction->getTransactionType() == $type) {
             $count++;
           }
         }
 
         return pht(
           '%s added %d inline comment(s).',
           $this->renderHandleLink($author_phid),
           $count);
         break;
       case PholioTransactionType::TYPE_IMAGE_REPLACE:
         return pht(
           '%s replaced %s with %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($old),
           $this->renderHandleLink($new));
         break;
       case PholioTransactionType::TYPE_IMAGE_FILE:
         $add = array_diff($new, $old);
         $rem = array_diff($old, $new);
 
         if ($add && $rem) {
           return pht(
             '%s edited image(s), added %d: %s; removed %d: %s.',
             $this->renderHandleLink($author_phid),
             count($add),
             $this->renderHandleList($add),
             count($rem),
             $this->renderHandleList($rem));
         } else if ($add) {
           return pht(
             '%s added %d image(s): %s.',
             $this->renderHandleLink($author_phid),
             count($add),
             $this->renderHandleList($add));
         } else {
           return pht(
             '%s removed %d image(s): %s.',
             $this->renderHandleLink($author_phid),
             count($rem),
             $this->renderHandleList($rem));
         }
         break;
 
       case PholioTransactionType::TYPE_IMAGE_NAME:
         return pht(
           '%s renamed an image (%s) from "%s" to "%s".',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink(key($new)),
           reset($old),
           reset($new));
         break;
       case PholioTransactionType::TYPE_IMAGE_DESCRIPTION:
         return pht(
           '%s updated an image\'s (%s) description.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink(key($new)));
         break;
       case PholioTransactionType::TYPE_IMAGE_SEQUENCE:
         return pht(
           '%s updated an image\'s (%s) sequence.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink(key($new)));
         break;
     }
 
     return parent::getTitle();
   }
 
   public function getTitleForFeed(PhabricatorFeedStory $story) {
     $author_phid = $this->getAuthorPHID();
     $object_phid = $this->getObjectPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     $type = $this->getTransactionType();
     switch ($type) {
       case PholioTransactionType::TYPE_NAME:
         if ($old === null) {
           return pht(
             '%s created %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid));
         } else {
           return pht(
             '%s renamed %s from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid),
             $old,
             $new);
         }
         break;
       case PholioTransactionType::TYPE_DESCRIPTION:
         return pht(
           '%s updated the description for %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
         break;
       case PholioTransactionType::TYPE_INLINE:
         return pht(
           '%s added an inline comment to %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
         break;
       case PholioTransactionType::TYPE_IMAGE_REPLACE:
       case PholioTransactionType::TYPE_IMAGE_FILE:
         return pht(
           '%s updated images of %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
         break;
       case PholioTransactionType::TYPE_IMAGE_NAME:
         return pht(
           '%s updated the image names of %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
         break;
       case PholioTransactionType::TYPE_IMAGE_DESCRIPTION:
         return pht(
           '%s updated image descriptions of %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
         break;
       case PholioTransactionType::TYPE_IMAGE_SEQUENCE:
         return pht(
           '%s updated image sequence of %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
         break;
     }
 
     return parent::getTitleForFeed($story);
   }
 
   public function getBodyForFeed(PhabricatorFeedStory $story) {
     $text = null;
     switch ($this->getTransactionType()) {
       case PholioTransactionType::TYPE_NAME:
         if ($this->getOldValue() === null) {
           $mock = $story->getPrimaryObject();
           $text = $mock->getDescription();
         }
         break;
       case PholioTransactionType::TYPE_INLINE:
         $text = $this->getComment()->getContent();
         break;
     }
 
     if ($text) {
       return phutil_escape_html_newlines(
         phutil_utf8_shorten($text, 128));
     }
 
     return parent::getBodyForFeed($story);
   }
 
   public function hasChangeDetails() {
     switch ($this->getTransactionType()) {
       case PholioTransactionType::TYPE_DESCRIPTION:
       case PholioTransactionType::TYPE_IMAGE_DESCRIPTION:
         return true;
     }
     return parent::hasChangeDetails();
   }
 
   public function renderChangeDetails(PhabricatorUser $viewer) {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
     if ($this->getTransactionType() ==
         PholioTransactionType::TYPE_IMAGE_DESCRIPTION) {
       $old = reset($old);
       $new = reset($new);
     }
 
     return $this->renderTextCorpusChangeDetails(
       $viewer,
       $old,
       $new);
   }
 
   public function getColor() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case PholioTransactionType::TYPE_NAME:
         if ($old === null) {
           return PhabricatorTransactions::COLOR_GREEN;
         }
       case PholioTransactionType::TYPE_DESCRIPTION:
       case PholioTransactionType::TYPE_IMAGE_NAME:
       case PholioTransactionType::TYPE_IMAGE_DESCRIPTION:
       case PholioTransactionType::TYPE_IMAGE_SEQUENCE:
         return PhabricatorTransactions::COLOR_BLUE;
       case PholioTransactionType::TYPE_IMAGE_REPLACE:
         return PhabricatorTransactions::COLOR_YELLOW;
       case PholioTransactionType::TYPE_IMAGE_FILE:
         $add = array_diff($new, $old);
         $rem = array_diff($old, $new);
         if ($add && $rem) {
           return PhabricatorTransactions::COLOR_YELLOW;
         } else if ($add) {
           return PhabricatorTransactions::COLOR_GREEN;
         } else {
           return PhabricatorTransactions::COLOR_RED;
         }
     }
 
     return parent::getColor();
   }
 
   public function getNoEffectDescription() {
     switch ($this->getTransactionType()) {
       case PholioTransactionType::TYPE_IMAGE_NAME:
         return pht('The image title was not updated.');
       case PholioTransactionType::TYPE_IMAGE_DESCRIPTION:
         return pht('The image description was not updated.');
       case PholioTransactionType::TYPE_IMAGE_SEQUENCE:
         return pht('The image sequence was not updated.');
     }
 
     return parent::getNoEffectDescription();
   }
 }
diff --git a/src/applications/ponder/storage/PonderQuestionTransaction.php b/src/applications/ponder/storage/PonderQuestionTransaction.php
index a1ed5d47c..67d89201a 100644
--- a/src/applications/ponder/storage/PonderQuestionTransaction.php
+++ b/src/applications/ponder/storage/PonderQuestionTransaction.php
@@ -1,306 +1,306 @@
 <?php
 
 final class PonderQuestionTransaction
   extends PhabricatorApplicationTransaction {
 
   const TYPE_TITLE = 'ponder.question:question';
   const TYPE_CONTENT = 'ponder.question:content';
   const TYPE_ANSWERS = 'ponder.question:answer';
   const TYPE_STATUS = 'ponder.question:status';
 
   public function getApplicationName() {
     return 'ponder';
   }
 
   public function getTableName() {
     return 'ponder_questiontransaction';
   }
 
   public function getApplicationTransactionType() {
     return PonderPHIDTypeQuestion::TYPECONST;
   }
 
   public function getApplicationTransactionCommentObject() {
     return new PonderQuestionTransactionComment();
   }
 
   public function getRequiredHandlePHIDs() {
     $phids = parent::getRequiredHandlePHIDs();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_ANSWERS:
         $phids[] = $this->getNewAnswerPHID();
         $phids[] = $this->getObjectPHID();
         break;
     }
 
     return $phids;
   }
 
   public function getTitle() {
     $author_phid = $this->getAuthorPHID();
     $object_phid = $this->getObjectPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_TITLE:
         if ($old === null) {
           return pht(
             '%s asked this question.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s edited the question title from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $old,
             $new);
         }
       case self::TYPE_CONTENT:
         return pht(
           '%s edited the question description.',
           $this->renderHandleLink($author_phid));
       case self::TYPE_ANSWERS:
         $answer_handle = $this->getHandle($this->getNewAnswerPHID());
         $question_handle = $this->getHandle($object_phid);
         return pht(
           '%s answered %s',
           $this->renderHandleLink($author_phid),
           $answer_handle->renderLink($question_handle->getFullName()));
       case self::TYPE_STATUS:
         switch ($new) {
           case PonderQuestionStatus::STATUS_OPEN:
             return pht(
               '%s reopened this question.',
               $this->renderHandleLink($author_phid));
           case PonderQuestionStatus::STATUS_CLOSED:
             return pht(
               '%s closed this question.',
               $this->renderHandleLink($author_phid));
         }
     }
 
     return parent::getTitle();
   }
 
   public function getIcon() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_TITLE:
       case self::TYPE_CONTENT:
-        return 'edit';
+        return 'fa-pencil';
       case self::TYPE_STATUS:
         switch ($new) {
           case PonderQuestionStatus::STATUS_OPEN:
-            return 'enable';
+            return 'fa-check-circle';
           case PonderQuestionStatus::STATUS_CLOSED:
-            return 'disable';
+            return 'fa-minus-circle';
         }
       case self::TYPE_ANSWERS:
-        return 'new';
+        return 'fa-plus';
     }
 
     return parent::getIcon();
   }
 
   public function getColor() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_TITLE:
       case self::TYPE_CONTENT:
         return PhabricatorTransactions::COLOR_BLUE;
       case self::TYPE_ANSWERS:
         return PhabricatorTransactions::COLOR_GREEN;
       case self::TYPE_STATUS:
         switch ($new) {
           case PonderQuestionStatus::STATUS_OPEN:
             return PhabricatorTransactions::COLOR_GREEN;
           case PonderQuestionStatus::STATUS_CLOSED:
             return PhabricatorTransactions::COLOR_BLACK;
         }
     }
   }
 
   public function hasChangeDetails() {
     switch ($this->getTransactionType()) {
       case self::TYPE_CONTENT:
         return true;
     }
     return parent::hasChangeDetails();
   }
 
   public function renderChangeDetails(PhabricatorUser $viewer) {
     return $this->renderTextCorpusChangeDetails(
       $viewer,
       $this->getOldValue(),
       $this->getNewValue());
   }
 
   public function getActionStrength() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_TITLE:
         if ($old === null) {
           return 3;
         }
         break;
       case self::TYPE_ANSWERS:
         return 2;
     }
 
     return parent::getActionStrength();
   }
 
   public function getActionName() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_TITLE:
         if ($old === null) {
           return pht('Asked');
         }
         break;
       case self::TYPE_ANSWERS:
         return pht('Answered');
     }
 
     return parent::getActionName();
   }
 
   public function shouldHide() {
     switch ($this->getTransactionType()) {
       case self::TYPE_CONTENT:
         if ($this->getOldValue() === null) {
           return true;
         } else {
           return false;
         }
         break;
     }
 
     return parent::shouldHide();
   }
 
   public function getTitleForFeed(PhabricatorFeedStory $story) {
     $author_phid = $this->getAuthorPHID();
     $object_phid = $this->getObjectPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_TITLE:
         if ($old === null) {
           return pht(
             '%s asked a question: %s',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid));
         } else {
           return pht(
             '%s edited the title of %s (was "%s")',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid),
             $old);
         }
       case self::TYPE_CONTENT:
         return pht(
           '%s edited the description of %s',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
       case self::TYPE_ANSWERS:
         $answer_handle = $this->getHandle($this->getNewAnswerPHID());
         $question_handle = $this->getHandle($object_phid);
         return pht(
           '%s answered %s',
           $this->renderHandleLink($author_phid),
           $answer_handle->renderLink($question_handle->getFullName()));
       case self::TYPE_STATUS:
         switch ($new) {
           case PonderQuestionStatus::STATUS_OPEN:
             return pht(
               '%s reopened %s',
               $this->renderHandleLink($author_phid),
               $this->renderHandleLink($object_phid));
           case PonderQuestionStatus::STATUS_CLOSED:
             return pht(
               '%s closed %s',
               $this->renderHandleLink($author_phid),
               $this->renderHandleLink($object_phid));
         }
     }
 
     return parent::getTitleForFeed($story);
   }
 
   public function getBodyForFeed(PhabricatorFeedStory $story) {
     $new = $this->getNewValue();
     $old = $this->getOldValue();
 
     $body = null;
 
     switch ($this->getTransactionType()) {
       case self::TYPE_TITLE:
         if ($old === null) {
           $question = $story->getObject($this->getObjectPHID());
           return phutil_escape_html_newlines(
             phutil_utf8_shorten($question->getContent(), 128));
         }
         break;
       case self::TYPE_ANSWERS:
         $answer = $this->getNewAnswerObject($story);
         if ($answer) {
           return phutil_escape_html_newlines(
             phutil_utf8_shorten($answer->getContent(), 128));
         }
         break;
     }
 
     return parent::getBodyForFeed($story);
   }
 
   /**
    * Currently the application only supports adding answers one at a time.
    * This data is stored as a list of phids. Use this function to get the
    * new phid.
    */
   private function getNewAnswerPHID() {
     $new = $this->getNewValue();
     $old = $this->getOldValue();
     $add = array_diff($new, $old);
 
     if (count($add) != 1) {
       throw new Exception(
         'There should be only one answer added at a time.');
     }
 
     return reset($add);
   }
 
   /**
    * Generally, the answer object is only available if the transaction
    * type is self::TYPE_ANSWERS.
    *
    * Some stories - notably ones made before D7027 - will be of the more
    * generic @{class:PhabricatorApplicationTransactionFeedStory}. These
    * poor stories won't have the PonderAnswer loaded, and thus will have
    * less cool information.
    */
   private function getNewAnswerObject(PhabricatorFeedStory $story) {
     if ($story instanceof PonderTransactionFeedStory) {
       $answer_phid = $this->getNewAnswerPHID();
       if ($answer_phid) {
         return $story->getObject($answer_phid);
       }
     }
     return null;
   }
 
 }
diff --git a/src/applications/releeph/storage/ReleephProductTransaction.php b/src/applications/releeph/storage/ReleephProductTransaction.php
index 3a389499b..629d73c76 100644
--- a/src/applications/releeph/storage/ReleephProductTransaction.php
+++ b/src/applications/releeph/storage/ReleephProductTransaction.php
@@ -1,108 +1,108 @@
 <?php
 
 final class ReleephProductTransaction
   extends PhabricatorApplicationTransaction {
 
   const TYPE_ACTIVE = 'releeph:product:active';
 
   public function getApplicationName() {
     return 'releeph';
   }
 
   public function getApplicationTransactionType() {
     return ReleephPHIDTypeProduct::TYPECONST;
   }
 
   public function getColor() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_ACTIVE:
         if ($new) {
           return 'green';
         } else {
           return 'black';
         }
         break;
     }
 
     return parent::getColor();
   }
 
   public function getIcon() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_ACTIVE:
         if ($new) {
-          return 'edit';
+          return 'fa-pencil';
         } else {
-          return 'delete';
+          return 'fa-times';
         }
         break;
     }
 
     return parent::getIcon();
   }
 
   public function getTitle() {
     $author_phid = $this->getAuthorPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_ACTIVE:
         if ($new) {
           return pht(
             '%s activated this product.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s deactivated this product.',
             $this->renderHandleLink($author_phid));
         }
         break;
     }
 
     return parent::getTitle();
   }
 
   public function getTitleForFeed(PhabricatorFeedStory $story) {
     $author_phid = $this->getAuthorPHID();
     $object_phid = $this->getObjectPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_ACTIVE:
         if ($new) {
           return pht(
             '%s activated release product %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid));
         } else {
           return pht(
             '%s deactivated release product %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid));
         }
         break;
     }
 
     return parent::getTitleForFeed($story);
   }
 
   public function getNoEffectDescription() {
     switch ($this->getTransactionType()) {
       case self::TYPE_ACTIVE:
         return pht('The product is already in that state.');
     }
 
     return parent::getNoEffectDescription();
   }
 
 }
diff --git a/src/applications/repository/storage/PhabricatorRepositoryTransaction.php b/src/applications/repository/storage/PhabricatorRepositoryTransaction.php
index 1cec40529..7190dc057 100644
--- a/src/applications/repository/storage/PhabricatorRepositoryTransaction.php
+++ b/src/applications/repository/storage/PhabricatorRepositoryTransaction.php
@@ -1,390 +1,390 @@
 <?php
 
 final class PhabricatorRepositoryTransaction
   extends PhabricatorApplicationTransaction {
 
   const TYPE_VCS = 'repo:vcs';
   const TYPE_ACTIVATE     = 'repo:activate';
   const TYPE_NAME         = 'repo:name';
   const TYPE_DESCRIPTION  = 'repo:description';
   const TYPE_ENCODING     = 'repo:encoding';
   const TYPE_DEFAULT_BRANCH = 'repo:default-branch';
   const TYPE_TRACK_ONLY = 'repo:track-only';
   const TYPE_AUTOCLOSE_ONLY = 'repo:autoclose-only';
   const TYPE_SVN_SUBPATH = 'repo:svn-subpath';
   const TYPE_UUID = 'repo:uuid';
   const TYPE_NOTIFY = 'repo:notify';
   const TYPE_AUTOCLOSE = 'repo:autoclose';
   const TYPE_REMOTE_URI = 'repo:remote-uri';
   const TYPE_LOCAL_PATH = 'repo:local-path';
   const TYPE_HOSTING = 'repo:hosting';
   const TYPE_PROTOCOL_HTTP = 'repo:serve-http';
   const TYPE_PROTOCOL_SSH = 'repo:serve-ssh';
   const TYPE_PUSH_POLICY = 'repo:push-policy';
   const TYPE_CREDENTIAL = 'repo:credential';
   const TYPE_DANGEROUS = 'repo:dangerous';
   const TYPE_CLONE_NAME = 'repo:clone-name';
 
   // TODO: Clean up these legacy transaction types.
   const TYPE_SSH_LOGIN = 'repo:ssh-login';
   const TYPE_SSH_KEY = 'repo:ssh-key';
   const TYPE_SSH_KEYFILE = 'repo:ssh-keyfile';
   const TYPE_HTTP_LOGIN = 'repo:http-login';
   const TYPE_HTTP_PASS = 'repo:http-pass';
 
   public function getApplicationName() {
     return 'repository';
   }
 
   public function getApplicationTransactionType() {
     return PhabricatorRepositoryPHIDTypeRepository::TYPECONST;
   }
 
   public function getApplicationTransactionCommentObject() {
     return null;
   }
 
   public function getRequiredHandlePHIDs() {
     $phids = parent::getRequiredHandlePHIDs();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_PUSH_POLICY:
         $phids[] = $old;
         $phids[] = $new;
         break;
     }
 
     return $phids;
   }
 
   public function shouldHide() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_REMOTE_URI:
       case self::TYPE_SSH_LOGIN:
       case self::TYPE_SSH_KEY:
       case self::TYPE_SSH_KEYFILE:
       case self::TYPE_HTTP_LOGIN:
       case self::TYPE_HTTP_PASS:
         // Hide null vs empty string changes.
         return (!strlen($old) && !strlen($new));
       case self::TYPE_LOCAL_PATH:
       case self::TYPE_NAME:
         // Hide these on create, they aren't interesting and we have an
         // explicit "create" transaction.
         if (!strlen($old)) {
           return true;
         }
         break;
     }
 
     return parent::shouldHide();
   }
 
   public function getIcon() {
     switch ($this->getTransactionType()) {
       case self::TYPE_VCS:
-        return 'create';
+        return 'fa-plus';
     }
     return parent::getIcon();
   }
 
   public function getColor() {
     switch ($this->getTransactionType()) {
       case self::TYPE_VCS:
         return 'green';
     }
     return parent::getIcon();
   }
 
   public function getTitle() {
     $author_phid = $this->getAuthorPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case self::TYPE_VCS:
         return pht(
           '%s created this repository.',
           $this->renderHandleLink($author_phid));
       case self::TYPE_ACTIVATE:
         if ($new) {
           return pht(
             '%s activated this repository.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s deactivated this repository.',
             $this->renderHandleLink($author_phid));
         }
       case self::TYPE_NAME:
         return pht(
           '%s renamed this repository from "%s" to "%s".',
           $this->renderHandleLink($author_phid),
           $old,
           $new);
       case self::TYPE_DESCRIPTION:
         return pht(
           '%s updated the description of this repository.',
           $this->renderHandleLink($author_phid));
       case self::TYPE_ENCODING:
         if (strlen($old) && !strlen($new)) {
           return pht(
             '%s removed the "%s" encoding configured for this repository.',
             $this->renderHandleLink($author_phid),
             $old);
         } else if (strlen($new) && !strlen($old)) {
           return pht(
             '%s set the encoding for this repository to "%s".',
             $this->renderHandleLink($author_phid),
             $new);
         } else {
           return pht(
             '%s changed the repository encoding from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $old,
             $new);
         }
       case self::TYPE_DEFAULT_BRANCH:
         if (!strlen($new)) {
           return pht(
             '%s removed "%s" as the default branch.',
             $this->renderHandleLink($author_phid),
             $old);
         } else if (!strlen($old)) {
           return pht(
             '%s set the default branch to "%s".',
             $this->renderHandleLink($author_phid),
             $new);
         } else {
           return pht(
             '%s changed the default branch from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $old,
             $new);
         }
         break;
       case self::TYPE_TRACK_ONLY:
         if (!$new) {
           return pht(
             '%s set this repository to track all branches.',
             $this->renderHandleLink($author_phid));
         } else if (!$old) {
           return pht(
             '%s set this repository to track branches: %s.',
             $this->renderHandleLink($author_phid),
             implode(', ', $new));
         } else {
           return pht(
             '%s changed track branches from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             implode(', ', $old),
             implode(', ', $new));
         }
         break;
       case self::TYPE_AUTOCLOSE_ONLY:
         if (!$new) {
           return pht(
             '%s set this repository to autoclose on all branches.',
             $this->renderHandleLink($author_phid));
         } else if (!$old) {
           return pht(
             '%s set this repository to autoclose on branches: %s.',
             $this->renderHandleLink($author_phid),
             implode(', ', $new));
         } else {
           return pht(
             '%s changed autoclose branches from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             implode(', ', $old),
             implode(', ', $new));
         }
         break;
       case self::TYPE_UUID:
         if (!strlen($new)) {
           return pht(
             '%s removed "%s" as the repository UUID.',
             $this->renderHandleLink($author_phid),
             $old);
         } else if (!strlen($old)) {
           return pht(
             '%s set the repository UUID to "%s".',
             $this->renderHandleLink($author_phid),
             $new);
         } else {
           return pht(
             '%s changed the repository UUID from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $old,
             $new);
         }
         break;
       case self::TYPE_SVN_SUBPATH:
         if (!strlen($new)) {
           return pht(
             '%s removed "%s" as the Import Only path.',
             $this->renderHandleLink($author_phid),
             $old);
         } else if (!strlen($old)) {
           return pht(
             '%s set the repository to import only "%s".',
             $this->renderHandleLink($author_phid),
             $new);
         } else {
           return pht(
             '%s changed the import path from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $old,
             $new);
         }
         break;
       case self::TYPE_NOTIFY:
         if ($new) {
           return pht(
             '%s enabled notifications and publishing for this repository.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s disabled notifications and publishing for this repository.',
             $this->renderHandleLink($author_phid));
         }
         break;
       case self::TYPE_AUTOCLOSE:
         if ($new) {
           return pht(
             '%s enabled autoclose for this repository.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s disabled autoclose for this repository.',
             $this->renderHandleLink($author_phid));
         }
         break;
       case self::TYPE_REMOTE_URI:
         if (!strlen($old)) {
           return pht(
             '%s set the remote URI for this repository to "%s".',
             $this->renderHandleLink($author_phid),
             $new);
         } else if (!strlen($new)) {
           return pht(
             '%s removed the remote URI for this repository.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s changed the remote URI for this repository from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $old,
             $new);
         }
         break;
       case self::TYPE_SSH_LOGIN:
         return pht(
           '%s updated the SSH login for this repository.',
           $this->renderHandleLink($author_phid));
       case self::TYPE_SSH_KEY:
         return pht(
           '%s updated the SSH key for this repository.',
           $this->renderHandleLink($author_phid));
       case self::TYPE_SSH_KEYFILE:
         return pht(
           '%s updated the SSH keyfile for this repository.',
           $this->renderHandleLink($author_phid));
       case self::TYPE_HTTP_LOGIN:
         return pht(
           '%s updated the HTTP login for this repository.',
           $this->renderHandleLink($author_phid));
       case self::TYPE_HTTP_PASS:
         return pht(
           '%s updated the HTTP password for this repository.',
           $this->renderHandleLink($author_phid));
       case self::TYPE_LOCAL_PATH:
         return pht(
           '%s changed the local path from "%s" to "%s".',
           $this->renderHandleLink($author_phid),
           $old,
           $new);
       case self::TYPE_HOSTING:
         if ($new) {
           return pht(
             '%s changed this repository to be hosted on Phabricator.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s changed this repository to track a remote elsewhere.',
             $this->renderHandleLink($author_phid));
         }
       case self::TYPE_PROTOCOL_HTTP:
         return pht(
           '%s changed the availability of this repository over HTTP from '.
           '"%s" to "%s".',
           $this->renderHandleLink($author_phid),
           PhabricatorRepository::getProtocolAvailabilityName($old),
           PhabricatorRepository::getProtocolAvailabilityName($new));
       case self::TYPE_PROTOCOL_SSH:
         return pht(
           '%s changed the availability of this repository over SSH from '.
           '"%s" to "%s".',
           $this->renderHandleLink($author_phid),
           PhabricatorRepository::getProtocolAvailabilityName($old),
           PhabricatorRepository::getProtocolAvailabilityName($new));
       case self::TYPE_PUSH_POLICY:
         return pht(
           '%s changed the push policy of this repository from "%s" to "%s".',
           $this->renderHandleLink($author_phid),
           $this->renderPolicyName($old),
           $this->renderPolicyName($new));
       case self::TYPE_DANGEROUS:
         if ($new) {
           return pht(
             '%s disabled protection against dangerous changes.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s enabled protection against dangerous changes.',
             $this->renderHandleLink($author_phid));
         }
       case self::TYPE_CLONE_NAME:
         if (strlen($old) && !strlen($new)) {
           return pht(
             '%s removed the clone name of this repository.',
             $this->renderHandleLink($author_phid));
         } else if (strlen($new) && !strlen($old)) {
           return pht(
             '%s set the clone name of this repository to "%s".',
             $this->renderHandleLink($author_phid),
             $new);
         } else {
           return pht(
             '%s changed the clone name of this repository from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $old,
             $new);
         }
     }
 
     return parent::getTitle();
   }
 
   public function hasChangeDetails() {
     switch ($this->getTransactionType()) {
       case self::TYPE_DESCRIPTION:
         return true;
     }
     return parent::hasChangeDetails();
   }
 
   public function renderChangeDetails(PhabricatorUser $viewer) {
     return $this->renderTextCorpusChangeDetails(
       $viewer,
       $this->getOldValue(),
       $this->getNewValue());
   }
 
 }
diff --git a/src/applications/slowvote/storage/PhabricatorSlowvoteTransaction.php b/src/applications/slowvote/storage/PhabricatorSlowvoteTransaction.php
index 9769767bb..47b8091b9 100644
--- a/src/applications/slowvote/storage/PhabricatorSlowvoteTransaction.php
+++ b/src/applications/slowvote/storage/PhabricatorSlowvoteTransaction.php
@@ -1,126 +1,132 @@
 <?php
 
 final class PhabricatorSlowvoteTransaction
   extends PhabricatorApplicationTransaction {
 
   const TYPE_QUESTION     = 'vote:question';
   const TYPE_DESCRIPTION  = 'vote:description';
   const TYPE_RESPONSES    = 'vote:responses';
   const TYPE_SHUFFLE      = 'vote:shuffle';
 
   public function getApplicationName() {
     return 'slowvote';
   }
 
   public function getApplicationTransactionType() {
     return PhabricatorSlowvotePHIDTypePoll::TYPECONST;
   }
 
   public function getApplicationTransactionCommentObject() {
     return new PhabricatorSlowvoteTransactionComment();
   }
 
   public function shouldHide() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case PhabricatorSlowvoteTransaction::TYPE_DESCRIPTION:
       case PhabricatorSlowvoteTransaction::TYPE_RESPONSES:
       case PhabricatorSlowvoteTransaction::TYPE_SHUFFLE:
         return ($old === null);
     }
 
     return parent::shouldHide();
   }
 
   public function getTitle() {
     $author_phid = $this->getAuthorPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case PhabricatorSlowvoteTransaction::TYPE_QUESTION:
         if ($old === null) {
           return pht(
             '%s created this poll.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s changed the poll question from "%s" to "%s".',
             $this->renderHandleLink($author_phid),
             $old,
             $new);
         }
         break;
       case PhabricatorSlowvoteTransaction::TYPE_DESCRIPTION:
         return pht(
           '%s updated the description for this poll.',
           $this->renderHandleLink($author_phid));
       case PhabricatorSlowvoteTransaction::TYPE_RESPONSES:
         // TODO: This could be more detailed
         return pht(
           '%s changed who can see the responses.',
           $this->renderHandleLink($author_phid));
       case PhabricatorSlowvoteTransaction::TYPE_SHUFFLE:
         if ($new) {
           return pht(
             '%s made poll responses appear in a random order.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s made poll responses appear in a fixed order.',
             $this->renderHandleLink($author_phid));
         }
         break;
     }
 
     return parent::getTitle();
   }
 
   public function getIcon() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case PhabricatorSlowvoteTransaction::TYPE_QUESTION:
+        if ($old === null) {
+          return 'fa-plus';
+        } else {
+          return 'fa-pencil';
+        }
       case PhabricatorSlowvoteTransaction::TYPE_DESCRIPTION:
       case PhabricatorSlowvoteTransaction::TYPE_RESPONSES:
+        return 'fa-pencil';
       case PhabricatorSlowvoteTransaction::TYPE_SHUFFLE:
-        return 'edit';
+        return 'fa-refresh';
     }
 
     return parent::getIcon();
   }
 
 
   public function getColor() {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case PhabricatorSlowvoteTransaction::TYPE_QUESTION:
       case PhabricatorSlowvoteTransaction::TYPE_DESCRIPTION:
       case PhabricatorSlowvoteTransaction::TYPE_RESPONSES:
       case PhabricatorSlowvoteTransaction::TYPE_SHUFFLE:
         return PhabricatorTransactions::COLOR_BLUE;
     }
 
     return parent::getColor();
   }
 
   public function hasChangeDetails() {
     switch ($this->getTransactionType()) {
       case PhabricatorSlowvoteTransaction::TYPE_DESCRIPTION:
         return true;
     }
     return parent::hasChangeDetails();
   }
 
   public function renderChangeDetails(PhabricatorUser $viewer) {
     return $this->renderTextCorpusChangeDetails($viewer);
   }
 
 
 }
diff --git a/src/applications/transactions/storage/PhabricatorApplicationTransaction.php b/src/applications/transactions/storage/PhabricatorApplicationTransaction.php
index 78836bf85..4654df287 100644
--- a/src/applications/transactions/storage/PhabricatorApplicationTransaction.php
+++ b/src/applications/transactions/storage/PhabricatorApplicationTransaction.php
@@ -1,928 +1,928 @@
 <?php
 
 abstract class PhabricatorApplicationTransaction
   extends PhabricatorLiskDAO
   implements PhabricatorPolicyInterface {
 
   const TARGET_TEXT = 'text';
   const TARGET_HTML = 'html';
 
   protected $phid;
   protected $objectPHID;
   protected $authorPHID;
   protected $viewPolicy;
   protected $editPolicy;
 
   protected $commentPHID;
   protected $commentVersion = 0;
   protected $transactionType;
   protected $oldValue;
   protected $newValue;
   protected $metadata = array();
 
   protected $contentSource;
 
   private $comment;
   private $commentNotLoaded;
 
   private $handles;
   private $renderingTarget = self::TARGET_HTML;
   private $transactionGroup = array();
   private $viewer = self::ATTACHABLE;
   private $object = self::ATTACHABLE;
   private $oldValueHasBeenSet = false;
 
   private $ignoreOnNoEffect;
 
 
   /**
    * Flag this transaction as a pure side-effect which should be ignored when
    * applying transactions if it has no effect, even if transaction application
    * would normally fail. This both provides users with better error messages
    * and allows transactions to perform optional side effects.
    */
   public function setIgnoreOnNoEffect($ignore) {
     $this->ignoreOnNoEffect = $ignore;
     return $this;
   }
 
   public function getIgnoreOnNoEffect() {
     return $this->ignoreOnNoEffect;
   }
 
   public function shouldGenerateOldValue() {
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_BUILDABLE:
       case PhabricatorTransactions::TYPE_TOKEN:
       case PhabricatorTransactions::TYPE_CUSTOMFIELD:
         return false;
     }
     return true;
   }
 
   abstract public function getApplicationTransactionType();
 
   private function getApplicationObjectTypeName() {
     $types = PhabricatorPHIDType::getAllTypes();
 
     $type = idx($types, $this->getApplicationTransactionType());
     if ($type) {
       return $type->getTypeName();
     }
 
     return pht('Object');
   }
 
   public function getApplicationTransactionCommentObject() {
     throw new Exception("Not implemented!");
   }
 
   public function getApplicationTransactionViewObject() {
     return new PhabricatorApplicationTransactionView();
   }
 
   public function getMetadataValue($key, $default = null) {
     return idx($this->metadata, $key, $default);
   }
 
   public function setMetadataValue($key, $value) {
     $this->metadata[$key] = $value;
     return $this;
   }
 
   public function generatePHID() {
     $type = PhabricatorApplicationTransactionPHIDTypeTransaction::TYPECONST;
     $subtype = $this->getApplicationTransactionType();
 
     return PhabricatorPHID::generateNewPHID($type, $subtype);
   }
 
   public function getConfiguration() {
     return array(
       self::CONFIG_AUX_PHID => true,
       self::CONFIG_SERIALIZATION => array(
         'oldValue' => self::SERIALIZATION_JSON,
         'newValue' => self::SERIALIZATION_JSON,
         'metadata' => self::SERIALIZATION_JSON,
       ),
     ) + parent::getConfiguration();
   }
 
   public function setContentSource(PhabricatorContentSource $content_source) {
     $this->contentSource = $content_source->serialize();
     return $this;
   }
 
   public function getContentSource() {
     return PhabricatorContentSource::newFromSerialized($this->contentSource);
   }
 
   public function hasComment() {
     return $this->getComment() && strlen($this->getComment()->getContent());
   }
 
   public function getComment() {
     if ($this->commentNotLoaded) {
       throw new Exception("Comment for this transaction was not loaded.");
     }
     return $this->comment;
   }
 
   public function attachComment(
     PhabricatorApplicationTransactionComment $comment) {
     $this->comment = $comment;
     $this->commentNotLoaded = false;
     return $this;
   }
 
   public function setCommentNotLoaded($not_loaded) {
     $this->commentNotLoaded = $not_loaded;
     return $this;
   }
 
   public function attachObject($object) {
     $this->object = $object;
     return $this;
   }
 
   public function getObject() {
     return $this->assertAttached($this->object);
   }
 
   public function getRemarkupBlocks() {
     $blocks = array();
 
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_CUSTOMFIELD:
         $field = $this->getTransactionCustomField();
         if ($field) {
           $custom_blocks = $field->getApplicationTransactionRemarkupBlocks(
             $this);
           foreach ($custom_blocks as $custom_block) {
             $blocks[] = $custom_block;
           }
         }
         break;
     }
 
     if ($this->getComment()) {
       $blocks[] = $this->getComment()->getContent();
     }
 
     return $blocks;
   }
 
   public function setOldValue($value) {
     $this->oldValueHasBeenSet = true;
     $this->writeField('oldValue', $value);
     return $this;
   }
 
   public function hasOldValue() {
     return $this->oldValueHasBeenSet;
   }
 
 
 /* -(  Rendering  )---------------------------------------------------------- */
 
   public function setRenderingTarget($rendering_target) {
     $this->renderingTarget = $rendering_target;
     return $this;
   }
 
   public function getRenderingTarget() {
     return $this->renderingTarget;
   }
 
   public function attachViewer(PhabricatorUser $viewer) {
     $this->viewer = $viewer;
     return $this;
   }
 
   public function getViewer() {
     return $this->assertAttached($this->viewer);
   }
 
   public function getRequiredHandlePHIDs() {
     $phids = array();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     $phids[] = array($this->getAuthorPHID());
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_CUSTOMFIELD:
         $field = $this->getTransactionCustomField();
         if ($field) {
           $phids[] = $field->getApplicationTransactionRequiredHandlePHIDs(
             $this);
         }
         break;
       case PhabricatorTransactions::TYPE_SUBSCRIBERS:
         $phids[] = $old;
         $phids[] = $new;
         break;
       case PhabricatorTransactions::TYPE_EDGE:
         $phids[] = ipull($old, 'dst');
         $phids[] = ipull($new, 'dst');
         break;
       case PhabricatorTransactions::TYPE_EDIT_POLICY:
       case PhabricatorTransactions::TYPE_VIEW_POLICY:
       case PhabricatorTransactions::TYPE_JOIN_POLICY:
         if (!PhabricatorPolicyQuery::isGlobalPolicy($old)) {
           $phids[] = array($old);
         }
         if (!PhabricatorPolicyQuery::isGlobalPolicy($new)) {
           $phids[] = array($new);
         }
         break;
       case PhabricatorTransactions::TYPE_TOKEN:
         break;
       case PhabricatorTransactions::TYPE_BUILDABLE:
         $phid = $this->getMetadataValue('harbormaster:buildablePHID');
         if ($phid) {
           $phids[] = array($phid);
         }
         break;
     }
 
     return array_mergev($phids);
   }
 
   public function setHandles(array $handles) {
     $this->handles = $handles;
     return $this;
   }
 
   public function getHandle($phid) {
     if (empty($this->handles[$phid])) {
       throw new Exception(
         pht(
           'Transaction ("%s") requires a handle ("%s") that it did not '.
           'load.',
           $this->getPHID(),
           $phid));
     }
     return $this->handles[$phid];
   }
 
   public function getHandleIfExists($phid) {
     return idx($this->handles, $phid);
   }
 
   public function getHandles() {
     if ($this->handles === null) {
       throw new Exception(
         'Transaction requires handles and it did not load them.'
       );
     }
     return $this->handles;
   }
 
   public function renderHandleLink($phid) {
     if ($this->renderingTarget == self::TARGET_HTML) {
       return $this->getHandle($phid)->renderLink();
     } else {
       return $this->getHandle($phid)->getLinkName();
     }
   }
 
   public function renderHandleList(array $phids) {
     $links = array();
     foreach ($phids as $phid) {
       $links[] = $this->renderHandleLink($phid);
     }
     if ($this->renderingTarget == self::TARGET_HTML) {
       return phutil_implode_html(', ', $links);
     } else {
       return implode(', ', $links);
     }
   }
 
   private function renderSubscriberList(array $phids, $change_type) {
     if ($this->getRenderingTarget() == self::TARGET_TEXT) {
       return $this->renderHandleList($phids);
     } else {
       $handles = array_select_keys($this->getHandles(), $phids);
       return id(new SubscriptionListStringBuilder())
         ->setHandles($handles)
         ->setObjectPHID($this->getPHID())
         ->buildTransactionString($change_type);
     }
   }
 
   public function renderPolicyName($phid) {
     $policy = PhabricatorPolicy::newFromPolicyAndHandle(
       $phid,
       $this->getHandleIfExists($phid));
     if ($this->renderingTarget == self::TARGET_HTML) {
       $output = $policy->renderDescription();
     } else {
       $output = hsprintf('%s', $policy->getFullName());
     }
     return $output;
   }
 
   public function getIcon() {
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_COMMENT:
-        return 'comment';
+        return 'fa-comment';
       case PhabricatorTransactions::TYPE_SUBSCRIBERS:
-        return 'message';
+        return 'fa-envelope';
       case PhabricatorTransactions::TYPE_VIEW_POLICY:
       case PhabricatorTransactions::TYPE_EDIT_POLICY:
       case PhabricatorTransactions::TYPE_JOIN_POLICY:
-        return 'lock';
+        return 'fa-lock';
       case PhabricatorTransactions::TYPE_EDGE:
-        return 'link';
+        return 'fa-link';
       case PhabricatorTransactions::TYPE_BUILDABLE:
-        return 'wrench';
+        return 'fa-wrench';
       case PhabricatorTransactions::TYPE_TOKEN:
         if ($this->getNewValue()) {
-          return 'like';
+          return 'fa-thumbs-o-up';
         } else {
-          return 'dislike';
+          return 'fa-thumbs-o-down';
         }
     }
 
-    return 'edit';
+    return 'fa-pencil';
   }
 
   public function getToken() {
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_TOKEN:
         $old = $this->getOldValue();
         $new = $this->getNewValue();
         if ($new) {
           $icon = substr($new, 10);
         } else {
           $icon = substr($old, 10);
         }
         return array($icon, !$this->getNewValue());
     }
 
     return array(null, null);
   }
 
   public function getColor() {
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_BUILDABLE:
         switch ($this->getNewValue()) {
           case HarbormasterBuildable::STATUS_PASSED:
             return 'green';
           case HarbormasterBuildable::STATUS_FAILED:
             return 'red';
         }
         break;
     }
     return null;
   }
 
   protected function getTransactionCustomField() {
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_CUSTOMFIELD:
         $key = $this->getMetadataValue('customfield:key');
         if (!$key) {
           return null;
         }
 
         $field = PhabricatorCustomField::getObjectField(
           $this->getObject(),
           PhabricatorCustomField::ROLE_APPLICATIONTRANSACTIONS,
           $key);
         if (!$field) {
           return null;
         }
 
         $field->setViewer($this->getViewer());
         return $field;
     }
 
     return null;
   }
 
   public function shouldHide() {
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_VIEW_POLICY:
       case PhabricatorTransactions::TYPE_EDIT_POLICY:
       case PhabricatorTransactions::TYPE_JOIN_POLICY:
         if ($this->getOldValue() === null) {
           return true;
         } else {
           return false;
         }
         break;
       case PhabricatorTransactions::TYPE_CUSTOMFIELD:
         $field = $this->getTransactionCustomField();
         if ($field) {
           return $field->shouldHideInApplicationTransactions($this);
         }
     }
 
     return false;
   }
 
   public function shouldHideForMail(array $xactions) {
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_TOKEN:
         return true;
       case PhabricatorTransactions::TYPE_BUILDABLE:
         switch ($this->getNewValue()) {
           case HarbormasterBuildable::STATUS_PASSED:
             // For now, just never send mail when builds pass. We might let
             // you customize this later, but in most cases this is probably
             // completely uninteresting.
             return true;
         }
     }
 
     return $this->shouldHide();
   }
 
   public function shouldHideForFeed() {
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_TOKEN:
         return true;
     }
 
     return $this->shouldHide();
   }
 
   public function getTitleForMail() {
     return id(clone $this)->setRenderingTarget('text')->getTitle();
   }
 
   public function getBodyForMail() {
     $comment = $this->getComment();
     if ($comment && strlen($comment->getContent())) {
       return $comment->getContent();
     }
     return null;
   }
 
   public function getNoEffectDescription() {
 
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_COMMENT:
         return pht('You can not post an empty comment.');
       case PhabricatorTransactions::TYPE_VIEW_POLICY:
         return pht(
           'This %s already has that view policy.',
           $this->getApplicationObjectTypeName());
       case PhabricatorTransactions::TYPE_EDIT_POLICY:
         return pht(
           'This %s already has that edit policy.',
           $this->getApplicationObjectTypeName());
       case PhabricatorTransactions::TYPE_JOIN_POLICY:
         return pht(
           'This %s already has that join policy.',
           $this->getApplicationObjectTypeName());
       case PhabricatorTransactions::TYPE_SUBSCRIBERS:
         return pht(
           'All users are already subscribed to this %s.',
           $this->getApplicationObjectTypeName());
       case PhabricatorTransactions::TYPE_EDGE:
         return pht('Edges already exist; transaction has no effect.');
     }
 
     return pht('Transaction has no effect.');
   }
 
   public function getTitle() {
     $author_phid = $this->getAuthorPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_COMMENT:
         return pht(
           '%s added a comment.',
           $this->renderHandleLink($author_phid));
       case PhabricatorTransactions::TYPE_VIEW_POLICY:
         return pht(
           '%s changed the visibility of this %s from "%s" to "%s".',
           $this->renderHandleLink($author_phid),
           $this->getApplicationObjectTypeName(),
           $this->renderPolicyName($old),
           $this->renderPolicyName($new));
       case PhabricatorTransactions::TYPE_EDIT_POLICY:
         return pht(
           '%s changed the edit policy of this %s from "%s" to "%s".',
           $this->renderHandleLink($author_phid),
           $this->getApplicationObjectTypeName(),
           $this->renderPolicyName($old),
           $this->renderPolicyName($new));
       case PhabricatorTransactions::TYPE_JOIN_POLICY:
         return pht(
           '%s changed the join policy of this %s from "%s" to "%s".',
           $this->renderHandleLink($author_phid),
           $this->getApplicationObjectTypeName(),
           $this->renderPolicyName($old),
           $this->renderPolicyName($new));
       case PhabricatorTransactions::TYPE_SUBSCRIBERS:
         $add = array_diff($new, $old);
         $rem = array_diff($old, $new);
 
         if ($add && $rem) {
           return pht(
             '%s edited subscriber(s), added %d: %s; removed %d: %s.',
             $this->renderHandleLink($author_phid),
             count($add),
             $this->renderSubscriberList($add, 'add'),
             count($rem),
             $this->renderSubscriberList($rem, 'rem'));
         } else if ($add) {
           return pht(
             '%s added %d subscriber(s): %s.',
             $this->renderHandleLink($author_phid),
             count($add),
             $this->renderSubscriberList($add, 'add'));
         } else if ($rem) {
           return pht(
             '%s removed %d subscriber(s): %s.',
             $this->renderHandleLink($author_phid),
             count($rem),
             $this->renderSubscriberList($rem, 'rem'));
         } else {
           // This is used when rendering previews, before the user actually
           // selects any CCs.
           return pht(
             '%s updated subscribers...',
             $this->renderHandleLink($author_phid));
         }
         break;
       case PhabricatorTransactions::TYPE_EDGE:
         $new = ipull($new, 'dst');
         $old = ipull($old, 'dst');
         $add = array_diff($new, $old);
         $rem = array_diff($old, $new);
         $type = $this->getMetadata('edge:type');
         $type = head($type);
 
         if ($add && $rem) {
           $string = PhabricatorEdgeConfig::getEditStringForEdgeType($type);
           return pht(
             $string,
             $this->renderHandleLink($author_phid),
             count($add),
             $this->renderHandleList($add),
             count($rem),
             $this->renderHandleList($rem));
         } else if ($add) {
           $string = PhabricatorEdgeConfig::getAddStringForEdgeType($type);
           return pht(
             $string,
             $this->renderHandleLink($author_phid),
             count($add),
             $this->renderHandleList($add));
         } else if ($rem) {
           $string = PhabricatorEdgeConfig::getRemoveStringForEdgeType($type);
           return pht(
             $string,
             $this->renderHandleLink($author_phid),
             count($rem),
             $this->renderHandleList($rem));
         } else {
           return pht(
             '%s edited edge metadata.',
             $this->renderHandleLink($author_phid));
         }
 
       case PhabricatorTransactions::TYPE_CUSTOMFIELD:
         $field = $this->getTransactionCustomField();
         if ($field) {
           return $field->getApplicationTransactionTitle($this);
         } else {
           return pht(
             '%s edited a custom field.',
             $this->renderHandleLink($author_phid));
         }
 
       case PhabricatorTransactions::TYPE_TOKEN:
         if ($old && $new) {
           return pht(
             '%s updated a token.',
             $this->renderHandleLink($author_phid));
         } else if ($old) {
           return pht(
             '%s rescinded a token.',
             $this->renderHandleLink($author_phid));
         } else {
           return pht(
             '%s awarded a token.',
             $this->renderHandleLink($author_phid));
         }
 
       case PhabricatorTransactions::TYPE_BUILDABLE:
         switch ($this->getNewValue()) {
           case HarbormasterBuildable::STATUS_PASSED:
             return pht(
               '%s completed building %s.',
               $this->renderHandleLink($author_phid),
               $this->renderHandleLink(
                 $this->getMetadataValue('harbormaster:buildablePHID')));
           case HarbormasterBuildable::STATUS_FAILED:
             return pht(
               '%s failed to build %s!',
               $this->renderHandleLink($author_phid),
               $this->renderHandleLink(
                 $this->getMetadataValue('harbormaster:buildablePHID')));
           default:
             return null;
         }
 
       default:
         return pht(
           '%s edited this %s.',
           $this->renderHandleLink($author_phid),
           $this->getApplicationObjectTypeName());
     }
   }
 
   public function getTitleForFeed(PhabricatorFeedStory $story) {
     $author_phid = $this->getAuthorPHID();
     $object_phid = $this->getObjectPHID();
 
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_COMMENT:
         return pht(
           '%s added a comment to %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
       case PhabricatorTransactions::TYPE_VIEW_POLICY:
         return pht(
           '%s changed the visibility for %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
       case PhabricatorTransactions::TYPE_EDIT_POLICY:
         return pht(
           '%s changed the edit policy for %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
       case PhabricatorTransactions::TYPE_JOIN_POLICY:
         return pht(
           '%s changed the join policy for %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
       case PhabricatorTransactions::TYPE_SUBSCRIBERS:
         return pht(
           '%s updated subscribers of %s.',
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
       case PhabricatorTransactions::TYPE_EDGE:
         $type = $this->getMetadata('edge:type');
         $type = head($type);
         $string = PhabricatorEdgeConfig::getFeedStringForEdgeType($type);
         return pht(
           $string,
           $this->renderHandleLink($author_phid),
           $this->renderHandleLink($object_phid));
       case PhabricatorTransactions::TYPE_CUSTOMFIELD:
         $field = $this->getTransactionCustomField();
         if ($field) {
           return $field->getApplicationTransactionTitleForFeed($this, $story);
         } else {
           return pht(
             '%s edited a custom field on %s.',
             $this->renderHandleLink($author_phid),
             $this->renderHandleLink($object_phid));
         }
       case PhabricatorTransactions::TYPE_BUILDABLE:
         switch ($this->getNewValue()) {
           case HarbormasterBuildable::STATUS_PASSED:
             return pht(
               '%s completed building %s for %s.',
               $this->renderHandleLink($author_phid),
               $this->renderHandleLink(
                 $this->getMetadataValue('harbormaster:buildablePHID')),
               $this->renderHandleLink($object_phid));
           case HarbormasterBuildable::STATUS_FAILED:
             return pht(
               '%s failed to build %s for %s.',
               $this->renderHandleLink($author_phid),
               $this->renderHandleLink(
                 $this->getMetadataValue('harbormaster:buildablePHID')),
               $this->renderHandleLink($object_phid));
           default:
             return null;
         }
 
     }
 
     return $this->getTitle();
   }
 
   public function getBodyForFeed(PhabricatorFeedStory $story) {
     $old = $this->getOldValue();
     $new = $this->getNewValue();
 
     $body = null;
 
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_COMMENT:
         $text = $this->getComment()->getContent();
         $body = phutil_escape_html_newlines(
           phutil_utf8_shorten($text, 128));
         break;
     }
     return $body;
   }
 
   public function getActionStrength() {
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_COMMENT:
         return 0.5;
     }
     return 1.0;
   }
 
   public function isCommentTransaction() {
     if ($this->hasComment()) {
       return true;
     }
 
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_COMMENT:
         return true;
     }
 
     return false;
   }
 
   public function getActionName() {
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_COMMENT:
         return pht('Commented On');
       case PhabricatorTransactions::TYPE_VIEW_POLICY:
       case PhabricatorTransactions::TYPE_EDIT_POLICY:
       case PhabricatorTransactions::TYPE_JOIN_POLICY:
         return pht('Changed Policy');
       case PhabricatorTransactions::TYPE_SUBSCRIBERS:
         return pht('Changed Subscribers');
       case PhabricatorTransactions::TYPE_BUILDABLE:
         switch ($this->getNewValue()) {
           case HarbormasterBuildable::STATUS_PASSED:
             return pht('Build Passed');
           case HarbormasterBuildable::STATUS_FAILED:
             return pht('Build Failed');
           default:
             return pht('Build Status');
         }
       default:
         return pht('Updated');
     }
   }
 
   public function getMailTags() {
     return array();
   }
 
   public function hasChangeDetails() {
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_CUSTOMFIELD:
         $field = $this->getTransactionCustomField();
         if ($field) {
           return $field->getApplicationTransactionHasChangeDetails($this);
         }
         break;
     }
     return false;
   }
 
   public function renderChangeDetails(PhabricatorUser $viewer) {
     switch ($this->getTransactionType()) {
       case PhabricatorTransactions::TYPE_CUSTOMFIELD:
         $field = $this->getTransactionCustomField();
         if ($field) {
           return $field->getApplicationTransactionChangeDetails($this, $viewer);
         }
         break;
     }
 
     return $this->renderTextCorpusChangeDetails();
   }
 
   public function renderTextCorpusChangeDetails(
     PhabricatorUser $viewer,
     $old,
     $new) {
 
     require_celerity_resource('differential-changeset-view-css');
 
     $view = id(new PhabricatorApplicationTransactionTextDiffDetailView())
       ->setUser($viewer)
       ->setOldText($old)
       ->setNewText($new);
 
     return $view->render();
   }
 
   public function attachTransactionGroup(array $group) {
     assert_instances_of($group, 'PhabricatorApplicationTransaction');
     $this->transactionGroup = $group;
     return $this;
   }
 
   public function getTransactionGroup() {
     return $this->transactionGroup;
   }
 
   /**
    * Should this transaction be visually grouped with an existing transaction
    * group?
    *
    * @param list<PhabricatorApplicationTransaction> List of transactions.
    * @return bool True to display in a group with the other transactions.
    */
   public function shouldDisplayGroupWith(array $group) {
     $this_source = null;
     if ($this->getContentSource()) {
       $this_source = $this->getContentSource()->getSource();
     }
 
     foreach ($group as $xaction) {
       // Don't group transactions by different authors.
       if ($xaction->getAuthorPHID() != $this->getAuthorPHID()) {
         return false;
       }
 
       // Don't group transactions for different objects.
       if ($xaction->getObjectPHID() != $this->getObjectPHID()) {
         return false;
       }
 
       // Don't group anything into a group which already has a comment.
       if ($xaction->isCommentTransaction()) {
         return false;
       }
 
       // Don't group transactions from different content sources.
       $other_source = null;
       if ($xaction->getContentSource()) {
         $other_source = $xaction->getContentSource()->getSource();
       }
 
       if ($other_source != $this_source) {
         return false;
       }
 
       // Don't group transactions which happened more than 2 minutes apart.
       $apart = abs($xaction->getDateCreated() - $this->getDateCreated());
       if ($apart > (60 * 2)) {
         return false;
       }
     }
 
     return true;
   }
 
   public function renderExtraInformationLink() {
     $herald_xscript_id = $this->getMetadataValue('herald:transcriptID');
 
     if ($herald_xscript_id) {
       return phutil_tag(
         'a',
         array(
           'href' => '/herald/transcript/'.$herald_xscript_id.'/',
         ),
         pht('View Herald Transcript'));
     }
 
     return null;
   }
 
 
 /* -(  PhabricatorPolicyInterface Implementation  )-------------------------- */
 
 
   public function getCapabilities() {
     return array(
       PhabricatorPolicyCapability::CAN_VIEW,
       PhabricatorPolicyCapability::CAN_EDIT,
     );
   }
 
   public function getPolicy($capability) {
     switch ($capability) {
       case PhabricatorPolicyCapability::CAN_VIEW:
         return $this->getViewPolicy();
       case PhabricatorPolicyCapability::CAN_EDIT:
         return $this->getEditPolicy();
     }
   }
 
   public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
     return ($viewer->getPHID() == $this->getAuthorPHID());
   }
 
   public function describeAutomaticCapability($capability) {
     // TODO: (T603) Exact policies are unclear here.
     return null;
   }
 
 
 }
diff --git a/src/applications/uiexample/examples/PHUIIconExample.php b/src/applications/uiexample/examples/PHUIIconExample.php
index 1a5fa1c90..af7e3f27b 100644
--- a/src/applications/uiexample/examples/PHUIIconExample.php
+++ b/src/applications/uiexample/examples/PHUIIconExample.php
@@ -1,615 +1,614 @@
 <?php
 
 final class PHUIIconExample extends PhabricatorUIExample {
 
   public function getName() {
     return 'Icons and Images';
   }
 
   public function getDescription() {
     return 'Easily render icons or images with links and sprites.';
   }
 
   private function listFontAwesome() {
     return array(
       'fa-glass',
       'fa-music',
       'fa-search',
       'fa-envelope-o',
       'fa-heart',
       'fa-star',
       'fa-star-o',
       'fa-user',
       'fa-film',
       'fa-th-large',
       'fa-th',
       'fa-th-list',
       'fa-check',
       'fa-times',
       'fa-search-plus',
       'fa-search-minus',
       'fa-power-off',
       'fa-signal',
       'fa-cog',
       'fa-trash-o',
       'fa-home',
       'fa-file-o',
       'fa-clock-o',
       'fa-road',
       'fa-download',
       'fa-arrow-circle-o-down',
       'fa-arrow-circle-o-up',
       'fa-inbox',
       'fa-play-circle-o',
       'fa-repeat',
       'fa-refresh',
       'fa-list-alt',
       'fa-lock',
       'fa-flag',
       'fa-headphones',
       'fa-volume-off',
       'fa-volume-down',
       'fa-volume-up',
       'fa-qrcode',
       'fa-barcode',
       'fa-tag',
       'fa-tags',
       'fa-book',
       'fa-bookmark',
       'fa-print',
       'fa-camera',
       'fa-font',
       'fa-bold',
       'fa-italic',
       'fa-text-height',
       'fa-text-width',
       'fa-align-left',
       'fa-align-center',
       'fa-align-right',
       'fa-align-justify',
       'fa-list',
       'fa-outdent',
       'fa-indent',
       'fa-video-camera',
       'fa-picture-o',
       'fa-pencil',
       'fa-map-marker',
       'fa-adjust',
       'fa-tint',
       'fa-pencil-square-o',
       'fa-share-square-o',
       'fa-check-square-o',
       'fa-arrows',
       'fa-step-backward',
       'fa-fast-backward',
       'fa-backward',
       'fa-play',
       'fa-pause',
       'fa-stop',
       'fa-forward',
       'fa-fast-forward',
       'fa-step-forward',
       'fa-eject',
       'fa-chevron-left',
       'fa-chevron-right',
       'fa-plus-circle',
       'fa-minus-circle',
       'fa-times-circle',
       'fa-check-circle',
       'fa-question-circle',
       'fa-info-circle',
       'fa-crosshairs',
       'fa-times-circle-o',
       'fa-check-circle-o',
       'fa-ban',
       'fa-arrow-left',
       'fa-arrow-right',
       'fa-arrow-up',
       'fa-arrow-down',
       'fa-share',
       'fa-expand',
       'fa-compress',
       'fa-plus',
       'fa-minus',
       'fa-asterisk',
       'fa-exclamation-circle',
       'fa-gift',
       'fa-leaf',
       'fa-fire',
       'fa-eye',
       'fa-eye-slash',
       'fa-exclamation-triangle',
       'fa-plane',
       'fa-calendar',
       'fa-random',
       'fa-comment',
       'fa-magnet',
       'fa-chevron-up',
       'fa-chevron-down',
       'fa-retweet',
       'fa-shopping-cart',
       'fa-folder',
       'fa-folder-open',
       'fa-arrows-v',
       'fa-arrows-h',
       'fa-bar-chart-o',
       'fa-twitter-square',
       'fa-facebook-square',
       'fa-camera-retro',
       'fa-key',
       'fa-cogs',
       'fa-comments',
       'fa-thumbs-o-up',
       'fa-thumbs-o-down',
       'fa-star-half',
       'fa-heart-o',
       'fa-sign-out',
       'fa-linkedin-square',
       'fa-thumb-tack',
       'fa-external-link',
       'fa-sign-in',
       'fa-trophy',
       'fa-github-square',
       'fa-upload',
       'fa-lemon-o',
       'fa-phone',
       'fa-square-o',
       'fa-bookmark-o',
       'fa-phone-square',
       'fa-twitter',
       'fa-facebook',
       'fa-github',
       'fa-unlock',
       'fa-credit-card',
       'fa-rss',
       'fa-hdd-o',
       'fa-bullhorn',
       'fa-bell',
       'fa-certificate',
       'fa-hand-o-right',
       'fa-hand-o-left',
       'fa-hand-o-up',
       'fa-hand-o-down',
       'fa-arrow-circle-left',
       'fa-arrow-circle-right',
       'fa-arrow-circle-up',
       'fa-arrow-circle-down',
       'fa-globe',
       'fa-wrench',
       'fa-tasks',
       'fa-filter',
       'fa-briefcase',
       'fa-arrows-alt',
       'fa-users',
       'fa-link',
       'fa-cloud',
       'fa-flask',
       'fa-scissors',
       'fa-files-o',
       'fa-paperclip',
       'fa-floppy-o',
       'fa-square',
       'fa-bars',
       'fa-list-ul',
       'fa-list-ol',
       'fa-strikethrough',
       'fa-underline',
       'fa-table',
       'fa-magic',
       'fa-truck',
       'fa-pinterest',
       'fa-pinterest-square',
       'fa-google-plus-square',
       'fa-google-plus',
       'fa-money',
       'fa-caret-down',
       'fa-caret-up',
       'fa-caret-left',
       'fa-caret-right',
       'fa-columns',
       'fa-sort',
       'fa-sort-asc',
       'fa-sort-desc',
       'fa-envelope',
       'fa-linkedin',
       'fa-undo',
       'fa-gavel',
       'fa-tachometer',
       'fa-comment-o',
       'fa-comments-o',
       'fa-bolt',
       'fa-sitemap',
       'fa-umbrella',
       'fa-clipboard',
       'fa-lightbulb-o',
       'fa-exchange',
       'fa-cloud-download',
       'fa-cloud-upload',
       'fa-user-md',
       'fa-stethoscope',
       'fa-suitcase',
       'fa-bell-o',
       'fa-coffee',
       'fa-cutlery',
       'fa-file-text-o',
       'fa-building-o',
       'fa-hospital-o',
       'fa-ambulance',
       'fa-medkit',
       'fa-fighter-jet',
       'fa-beer',
       'fa-h-square',
       'fa-plus-square',
       'fa-angle-double-left',
       'fa-angle-double-right',
       'fa-angle-double-up',
       'fa-angle-double-down',
       'fa-angle-left',
       'fa-angle-right',
       'fa-angle-up',
       'fa-angle-down',
       'fa-desktop',
       'fa-laptop',
       'fa-tablet',
       'fa-mobile',
       'fa-circle-o',
       'fa-quote-left',
       'fa-quote-right',
       'fa-spinner',
       'fa-circle',
       'fa-reply',
       'fa-github-alt',
       'fa-folder-o',
       'fa-folder-open-o',
       'fa-smile-o',
       'fa-frown-o',
       'fa-meh-o',
       'fa-gamepad',
       'fa-keyboard-o',
       'fa-flag-o',
       'fa-flag-checkered',
       'fa-terminal',
       'fa-code',
       'fa-reply-all',
       'fa-mail-reply-all',
       'fa-star-half-o',
       'fa-location-arrow',
       'fa-crop',
       'fa-code-fork',
       'fa-chain-broken',
       'fa-question',
       'fa-info',
       'fa-exclamation',
       'fa-superscript',
       'fa-subscript',
       'fa-eraser',
       'fa-puzzle-piece',
       'fa-microphone',
       'fa-microphone-slash',
       'fa-shield',
       'fa-calendar-o',
       'fa-fire-extinguisher',
       'fa-rocket',
       'fa-maxcdn',
       'fa-chevron-circle-left',
       'fa-chevron-circle-right',
       'fa-chevron-circle-up',
       'fa-chevron-circle-down',
       'fa-html5',
       'fa-css3',
       'fa-anchor',
       'fa-unlock-alt',
       'fa-bullseye',
       'fa-ellipsis-h',
       'fa-ellipsis-v',
       'fa-rss-square',
       'fa-play-circle',
       'fa-ticket',
       'fa-minus-square',
       'fa-minus-square-o',
       'fa-level-up',
       'fa-level-down',
       'fa-check-square',
       'fa-pencil-square',
       'fa-external-link-square',
       'fa-share-square',
       'fa-compass',
       'fa-caret-square-o-down',
       'fa-caret-square-o-up',
       'fa-caret-square-o-right',
       'fa-eur',
       'fa-gbp',
       'fa-usd',
       'fa-inr',
       'fa-jpy',
       'fa-rub',
       'fa-krw',
       'fa-btc',
       'fa-file',
       'fa-file-text',
       'fa-sort-alpha-asc',
       'fa-sort-alpha-desc',
       'fa-sort-amount-asc',
       'fa-sort-amount-desc',
       'fa-sort-numeric-asc',
       'fa-sort-numeric-desc',
       'fa-thumbs-up',
       'fa-thumbs-down',
       'fa-youtube-square',
       'fa-youtube',
       'fa-xing',
       'fa-xing-square',
       'fa-youtube-play',
       'fa-dropbox',
       'fa-stack-overflow',
       'fa-instagram',
       'fa-flickr',
       'fa-adn',
       'fa-bitbucket',
       'fa-bitbucket-square',
       'fa-tumblr',
       'fa-tumblr-square',
       'fa-long-arrow-down',
       'fa-long-arrow-up',
       'fa-long-arrow-left',
       'fa-long-arrow-right',
       'fa-apple',
       'fa-windows',
       'fa-android',
       'fa-linux',
       'fa-dribbble',
       'fa-skype',
       'fa-foursquare',
       'fa-trello',
       'fa-female',
       'fa-male',
       'fa-gittip',
       'fa-sun-o',
       'fa-moon-o',
       'fa-archive',
       'fa-bug',
       'fa-vk',
       'fa-weibo',
       'fa-renren',
       'fa-pagelines',
       'fa-stack-exchange',
       'fa-arrow-circle-o-right',
       'fa-arrow-circle-o-left',
       'fa-caret-square-o-left',
       'fa-dot-circle-o',
       'fa-wheelchair',
       'fa-vimeo-square',
       'fa-try',
       'fa-plus-square-o',
     );
   }
 
   private function listColors() {
     return array(
       null,
       'bluegrey',
       'white',
       'red',
       'orange',
       'yellow',
       'green',
       'blue',
       'sky',
       'indigo',
       'violet',
       'lightgreytext',
       'lightbluetext',
     );
   }
 
   private function listTransforms() {
     return array(
       'ph-rotate-90',
       'ph-rotate-180',
       'ph-rotate-270',
       'ph-flip-horizontal',
       'ph-flip-vertical',
       'ph-spin',
     );
   }
 
   public function renderExample() {
 
     $colors = $this->listColors();
     $trans = $this->listTransforms();
     $fas = $this->listFontAwesome();
 
     $cicons = array();
     foreach ($colors as $color) {
       $cicons[] = id(new PHUIIconView())
         ->addClass('phui-example-icon-transform')
-        ->setFontAwesome('fa-tag '.$color)
+        ->setIconFont('fa-tag '.$color)
         ->setText(pht('fa-tag %s', $color));
     }
     $ficons = array();
     foreach ($fas as $fa) {
-
       $ficons[] = id(new PHUIIconView())
         ->addClass('phui-example-icon-name')
-        ->setFontAwesome($fa)
+        ->setIconFont($fa)
         ->setText($fa);
     }
 
     $person1 = new PHUIIconView();
     $person1->setHeadSize(PHUIIconView::HEAD_MEDIUM);
     $person1->setHref('http://en.wikipedia.org/wiki/George_Washington');
     $person1->setImage(
       celerity_get_resource_uri('/rsrc/image/people/washington.png'));
 
     $person2 = new PHUIIconView();
     $person2->setHeadSize(PHUIIconView::HEAD_MEDIUM);
     $person2->setHref('http://en.wikipedia.org/wiki/Warren_G._Harding');
     $person2->setImage(
       celerity_get_resource_uri('/rsrc/image/people/harding.png'));
 
     $person3 = new PHUIIconView();
     $person3->setHeadSize(PHUIIconView::HEAD_MEDIUM);
     $person3->setHref('http://en.wikipedia.org/wiki/William_Howard_Taft');
     $person3->setImage(
       celerity_get_resource_uri('/rsrc/image/people/taft.png'));
 
     $person4 = new PHUIIconView();
     $person4->setHeadSize(PHUIIconView::HEAD_SMALL);
     $person4->setHref('http://en.wikipedia.org/wiki/George_Washington');
     $person4->setImage(
       celerity_get_resource_uri('/rsrc/image/people/washington.png'));
 
     $person5 = new PHUIIconView();
     $person5->setHeadSize(PHUIIconView::HEAD_SMALL);
     $person5->setHref('http://en.wikipedia.org/wiki/Warren_G._Harding');
     $person5->setImage(
       celerity_get_resource_uri('/rsrc/image/people/harding.png'));
 
     $person6 = new PHUIIconView();
     $person6->setHeadSize(PHUIIconView::HEAD_SMALL);
     $person6->setHref('http://en.wikipedia.org/wiki/William_Howard_Taft');
     $person6->setImage(
       celerity_get_resource_uri('/rsrc/image/people/taft.png'));
 
     $card1 = id(new PHUIIconView())
       ->setSpriteSheet(PHUIIconView::SPRITE_PAYMENTS)
       ->setSpriteIcon('visa')
       ->addClass(PHUI::MARGIN_SMALL_RIGHT);
 
     $card2 = id(new PHUIIconView())
       ->setSpriteSheet(PHUIIconView::SPRITE_PAYMENTS)
       ->setSpriteIcon('mastercard')
       ->addClass(PHUI::MARGIN_SMALL_RIGHT);
 
     $card3 = id(new PHUIIconView())
       ->setSpriteSheet(PHUIIconView::SPRITE_PAYMENTS)
       ->setSpriteIcon('paypal')
       ->addClass(PHUI::MARGIN_SMALL_RIGHT);
 
     $card4 = id(new PHUIIconView())
       ->setSpriteSheet(PHUIIconView::SPRITE_PAYMENTS)
       ->setSpriteIcon('americanexpress')
       ->addClass(PHUI::MARGIN_SMALL_RIGHT);
 
     $card5 = id(new PHUIIconView())
       ->setSpriteSheet(PHUIIconView::SPRITE_PAYMENTS)
       ->setSpriteIcon('googlecheckout');
 
     $actions = array(
       'settings-grey',
       'heart-grey',
       'tag-grey',
       'new-grey',
       'search-grey',
       'move-grey');
     $actionview = array();
     foreach ($actions as $action) {
       $actionview[] = id(new PHUIIconView())
         ->setSpriteSheet(PHUIIconView::SPRITE_ACTIONS)
         ->setSpriteIcon($action)
         ->setHref('#');
     }
 
     $tokens = array(
       'like-1',
       'like-2',
       'heart-1',
       'heart-2');
     $tokenview = array();
     foreach ($tokens as $token) {
       $tokenview[] =
         id(new PHUIIconView())
           ->setSpriteSheet(PHUIIconView::SPRITE_TOKENS)
           ->setSpriteIcon($token);
     }
 
     $logins = array(
       'Asana',
       'Dropbox',
       'Google',
       'Github');
     $loginview = array();
     foreach ($logins as $login) {
       $loginview[] =
         id(new PHUIIconView())
           ->setSpriteSheet(PHUIIconView::SPRITE_LOGIN)
           ->setSpriteIcon($login)
           ->addClass(PHUI::MARGIN_SMALL_RIGHT);
     }
 
     $layout_cicons = id(new PHUIBoxView())
       ->appendChild($cicons)
       ->addMargin(PHUI::MARGIN_LARGE);
 
     $layout_fa = id(new PHUIBoxView())
       ->appendChild($ficons)
       ->addMargin(PHUI::MARGIN_LARGE);
 
     $layout1 = id(new PHUIBoxView())
       ->appendChild($actionview)
       ->addMargin(PHUI::MARGIN_MEDIUM);
 
     $layout2 = id(new PHUIBoxView())
       ->appendChild(array($person1, $person2, $person3))
       ->addMargin(PHUI::MARGIN_MEDIUM);
 
     $layout2a = id(new PHUIBoxView())
       ->appendChild(array($person4, $person5, $person6))
       ->addMargin(PHUI::MARGIN_MEDIUM);
 
     $layout3 = id(new PHUIBoxView())
       ->appendChild($tokenview)
       ->addMargin(PHUI::MARGIN_MEDIUM);
 
     $layout4 = id(new PHUIBoxView())
       ->appendChild(array($card1, $card2, $card3, $card4, $card5))
       ->addMargin(PHUI::MARGIN_MEDIUM);
 
     $layout5 = id(new PHUIBoxView())
       ->appendChild($loginview)
       ->addMargin(PHUI::MARGIN_MEDIUM);
 
     $fontawesome = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Font Awesome'))
       ->appendChild($layout_fa);
 
     $transforms = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Colors and Transforms'))
       ->appendChild($layout_cicons);
 
     $wrap1 = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Action Icons!'))
       ->appendChild($layout1);
 
     $wrap2 = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('People!'))
       ->appendChild(array($layout2, $layout2a));
 
     $wrap3 = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Tokens'))
       ->appendChild($layout3);
 
     $wrap4 = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Payments'))
       ->appendChild($layout4);
 
     $wrap5 = id(new PHUIObjectBoxView())
       ->setHeaderText(pht('Authentication'))
       ->appendChild($layout5);
 
     return phutil_tag(
       'div',
         array(
           'class' => 'phui-icon-example',
         ),
         array(
           $fontawesome,
           $transforms,
           $wrap1,
           $wrap2,
           $wrap3,
           $wrap4,
           $wrap5
         ));
         }
 }
diff --git a/src/view/phui/PHUIIconView.php b/src/view/phui/PHUIIconView.php
index 6972da66c..a9f35c7c2 100644
--- a/src/view/phui/PHUIIconView.php
+++ b/src/view/phui/PHUIIconView.php
@@ -1,116 +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 $fontAwesome;
+  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 setFontAwesome($fa) {
-    $this->fontAwesome = $fa;
+  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->fontAwesome) {
+    } elseif ($this->iconFont) {
       require_celerity_resource('phui-font-icon-base-css');
       require_celerity_resource('font-fontawesome');
       $classes[] = 'phui-font-fa';
-      $classes[] = $this->fontAwesome;
+      $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,
       '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/PHUITimelineEventView.php b/src/view/phui/PHUITimelineEventView.php
index b637f928d..a1a622c7c 100644
--- a/src/view/phui/PHUITimelineEventView.php
+++ b/src/view/phui/PHUITimelineEventView.php
@@ -1,412 +1,410 @@
 <?php
 
 final class PHUITimelineEventView extends AphrontView {
 
   const DELIMITER = " \xC2\xB7 ";
 
   private $userHandle;
   private $title;
   private $icon;
   private $color;
   private $classes = array();
   private $contentSource;
   private $dateCreated;
   private $anchor;
   private $isEditable;
   private $isEdited;
   private $transactionPHID;
   private $isPreview;
   private $eventGroup = array();
   private $hideByDefault;
   private $token;
   private $tokenRemoved;
 
   public function setHideByDefault($hide_by_default) {
     $this->hideByDefault = $hide_by_default;
     return $this;
   }
 
   public function getHideByDefault() {
     return $this->hideByDefault;
   }
 
   public function setTransactionPHID($transaction_phid) {
     $this->transactionPHID = $transaction_phid;
     return $this;
   }
 
   public function getTransactionPHID() {
     return $this->transactionPHID;
   }
 
   public function setIsEdited($is_edited) {
     $this->isEdited = $is_edited;
     return $this;
   }
 
   public function getIsEdited() {
     return $this->isEdited;
   }
 
   public function setIsPreview($is_preview) {
     $this->isPreview = $is_preview;
     return $this;
   }
 
   public function getIsPreview() {
     return $this->isPreview;
   }
 
   public function setIsEditable($is_editable) {
     $this->isEditable = $is_editable;
     return $this;
   }
 
   public function getIsEditable() {
     return $this->isEditable;
   }
 
   public function setDateCreated($date_created) {
     $this->dateCreated = $date_created;
     return $this;
   }
 
   public function getDateCreated() {
     return $this->dateCreated;
   }
 
   public function setContentSource(PhabricatorContentSource $content_source) {
     $this->contentSource = $content_source;
     return $this;
   }
 
   public function getContentSource() {
     return $this->contentSource;
   }
 
   public function setUserHandle(PhabricatorObjectHandle $handle) {
     $this->userHandle = $handle;
     return $this;
   }
 
   public function setAnchor($anchor) {
     $this->anchor = $anchor;
     return $this;
   }
 
   public function getAnchor() {
     return $this->anchor;
   }
 
   public function setTitle($title) {
     $this->title = $title;
     return $this;
   }
 
   public function addClass($class) {
     $this->classes[] = $class;
     return $this;
   }
 
   public function setIcon($icon) {
     $this->icon = $icon;
     return $this;
   }
 
   public function setColor($color) {
     $this->color = $color;
     return $this;
   }
 
   public function setToken($token, $removed=false) {
     $this->token = $token;
     $this->tokenRemoved = $removed;
     return $this;
   }
 
   public function getEventGroup() {
     return array_merge(array($this), $this->eventGroup);
   }
 
   public function addEventToGroup(PHUITimelineEventView $event) {
     $this->eventGroup[] = $event;
     return $this;
   }
 
   protected function renderEventTitle($is_first_event, $force_icon) {
     $title = $this->title;
     if (($title === null) && !$this->hasChildren()) {
       $title = '';
     }
 
     if ($is_first_event) {
       $extra = array();
       $is_first_extra = true;
       foreach ($this->getEventGroup() as $event) {
         $extra[] = $event->renderExtra($is_first_extra);
         $is_first_extra = false;
       }
       $extra = array_reverse($extra);
       $extra = array_mergev($extra);
       $extra = javelin_tag(
         'span',
         array(
           'sigil' => 'timeline-extra',
           'class' => 'phui-timeline-extra',
         ),
         phutil_implode_html(self::DELIMITER, $extra));
     } else {
       $extra = null;
     }
 
     if ($title !== null || $extra) {
       $title_classes = array();
       $title_classes[] = 'phui-timeline-title';
 
       $icon = null;
       if ($this->icon || $force_icon) {
         $title_classes[] = 'phui-timeline-title-with-icon';
       }
 
       if ($this->icon) {
         $fill_classes = array();
         $fill_classes[] = 'phui-timeline-icon-fill';
         if ($this->color) {
           $fill_classes[] = 'phui-timeline-icon-fill-'.$this->color;
         }
 
+        $icon = id(new PHUIIconView())
+          ->setIconFont($this->icon.' white')
+          ->addClass('phui-timeline-icon');
+
         $icon = phutil_tag(
           'span',
           array(
             'class' => implode(' ', $fill_classes),
           ),
-          phutil_tag(
-            'span',
-            array(
-              'class' => 'phui-timeline-icon sprite-icons '.
-                         'icons-'.$this->icon.'-white',
-            ),
-            ''));
+          $icon);
       }
 
       $token = null;
       if ($this->token) {
         $token = id(new PHUIIconView())
           ->addClass('phui-timeline-token')
           ->setSpriteSheet(PHUIIconView::SPRITE_TOKENS)
           ->setSpriteIcon($this->token);
         if ($this->tokenRemoved) {
           $token->addClass('strikethrough');
         }
       }
 
       $title = phutil_tag(
         'div',
         array(
           'class' => implode(' ', $title_classes),
         ),
         array($icon, $token, $title, $extra));
     }
 
     return $title;
   }
 
   public function render() {
 
     $events = $this->getEventGroup();
 
     // Move events with icons first.
     $icon_keys = array();
     foreach ($this->getEventGroup() as $key => $event) {
       if ($event->icon) {
         $icon_keys[] = $key;
       }
     }
     $events = array_select_keys($events, $icon_keys) + $events;
     $force_icon = (bool)$icon_keys;
 
     $group_titles = array();
     $group_children = array();
     $is_first_event = true;
     foreach ($events as $event) {
       $group_titles[] = $event->renderEventTitle($is_first_event, $force_icon);
       $is_first_event = false;
       if ($event->hasChildren()) {
         $group_children[] = $event->renderChildren();
       }
     }
 
     $wedge = phutil_tag(
       'div',
       array(
         'class' => 'phui-timeline-wedge phui-timeline-border',
       ),
       '');
 
     $image_uri = $this->userHandle->getImageURI();
     $image = phutil_tag(
       'div',
       array(
         'style' => 'background-image: url('.$image_uri.')',
         'class' => 'phui-timeline-image',
       ),
       '');
 
     $content_classes = array();
     $content_classes[] = 'phui-timeline-content';
 
     $classes = array();
     $classes[] = 'phui-timeline-event-view';
     if ($group_children) {
       $classes[] = 'phui-timeline-major-event';
       $content = phutil_tag(
         'div',
         array(
           'class' => 'phui-timeline-inner-content',
         ),
         array(
           $group_titles,
           phutil_tag(
             'div',
             array(
               'class' => 'phui-timeline-core-content',
             ),
             $group_children),
         ));
     } else {
       $classes[] = 'phui-timeline-minor-event';
       $content = $group_titles;
     }
 
     $content = phutil_tag(
       'div',
       array(
         'class' => 'phui-timeline-group phui-timeline-border',
       ),
       $content);
 
     $content = phutil_tag(
       'div',
       array(
         'class' => implode(' ', $content_classes),
       ),
       array($image, $wedge, $content));
 
     $outer_classes = $this->classes;
     $outer_classes[] = 'phui-timeline-shell';
     $color = null;
     foreach ($this->getEventGroup() as $event) {
       if ($event->color) {
         $color = $event->color;
         break;
       }
     }
 
     if ($color) {
       $outer_classes[] = 'phui-timeline-'.$color;
     }
 
     $sigil = null;
     $meta = null;
     if ($this->getTransactionPHID()) {
       $sigil = 'transaction';
       $meta = array(
         'phid' => $this->getTransactionPHID(),
         'anchor' => $this->anchor,
       );
     }
 
     return javelin_tag(
       'div',
       array(
         'class' => implode(' ', $outer_classes),
         'id' => $this->anchor ? 'anchor-'.$this->anchor : null,
         'sigil' => $sigil,
         'meta' => $meta,
       ),
       phutil_tag(
         'div',
         array(
           'class' => implode(' ', $classes),
         ),
         $content));
   }
 
   private function renderExtra($is_first_extra) {
     $extra = array();
 
     if ($this->getIsPreview()) {
       $extra[] = pht('PREVIEW');
     } else {
       $xaction_phid = $this->getTransactionPHID();
 
       if ($this->getIsEdited()) {
         $extra[] = javelin_tag(
           'a',
           array(
             'href'  => '/transactions/history/'.$xaction_phid.'/',
             'sigil' => 'workflow transaction-edit-history',
           ),
           pht('Edited'));
       }
 
       if ($this->getIsEditable()) {
         $extra[] = javelin_tag(
           'a',
           array(
             'href'  => '/transactions/edit/'.$xaction_phid.'/',
             'sigil' => 'workflow transaction-edit',
           ),
           pht('Edit'));
       }
 
       if ($is_first_extra) {
         $source = $this->getContentSource();
         if ($source) {
           $extra[] = id(new PhabricatorContentSourceView())
             ->setContentSource($source)
             ->setUser($this->getUser())
             ->render();
         }
 
         $date_created = null;
         foreach ($this->getEventGroup() as $event) {
           if ($event->getDateCreated()) {
             if ($date_created === null) {
               $date_created = $event->getDateCreated();
             } else {
               $date_created = min($event->getDateCreated(), $date_created);
             }
           }
         }
 
         if ($date_created) {
           $date = phabricator_datetime(
             $this->getDateCreated(),
             $this->getUser());
           if ($this->anchor) {
             Javelin::initBehavior('phabricator-watch-anchor');
 
             $anchor = id(new PhabricatorAnchorView())
               ->setAnchorName($this->anchor)
               ->render();
 
             $date = array(
               $anchor,
               phutil_tag(
                 'a',
                 array(
                   'href' => '#'.$this->anchor,
                 ),
                 $date),
             );
           }
           $extra[] = $date;
         }
       }
     }
 
     return $extra;
   }
 
 }
diff --git a/webroot/rsrc/css/phui/phui-timeline-view.css b/webroot/rsrc/css/phui/phui-timeline-view.css
index 437774a9b..fac31ce13 100644
--- a/webroot/rsrc/css/phui/phui-timeline-view.css
+++ b/webroot/rsrc/css/phui/phui-timeline-view.css
@@ -1,316 +1,314 @@
 /**
  * @provides phui-timeline-view-css
  */
 
 .phui-timeline-view {
   padding: 0 16px;
   background-image: url('/rsrc/image/BFCFDA.png');
   background-repeat: repeat-y;
   background-position: 94px;
 }
 
 .device-tablet .phui-timeline-view {
   background-position: 31px;
 }
 
 .device-phone .phui-timeline-view {
   padding: 0;
   background-position: 24px;
 }
 
 .phui-timeline-major-event .phui-timeline-group {
   border-left: 1px solid {$lightblueborder};
   border-right: 1px solid {$lightblueborder};
 }
 
 .device-desktop .phui-timeline-event-view {
   margin-left: 62px;
   position: relative;
 }
 
 .device-desktop .phui-timeline-event-view.phui-timeline-minor-event {
   margin-left: 65px;
 }
 
 .device-desktop .phui-timeline-spacer {
   min-height: 16px;
 }
 
 .device-desktop .phui-timeline-event-view.the-worlds-end {
   background: {$lightblueborder};
   width: 9px;
   height: 9px;
   border-radius: 2px;
   margin-left: 74px;
 }
 
 .device-desktop .phui-timeline-wedge {
   border-bottom: 1px solid {$lightblueborder};
   position: absolute;
   width: 12px;
 }
 
 .device-phone .phui-timeline-minor-event,
 .device-tablet .phui-timeline-minor-event {
   padding-left: 3px;
 }
 
 .phui-timeline-major-event .phui-timeline-content {
   border-top: 1px solid {$lightblueborder};
   border-bottom: 1px solid {$lightblueborder};
 }
 
 .phui-timeline-title {
   line-height: 18px;
   min-height: 18px;
   position: relative;
   color: {$bluetext};
 }
 
 .phui-timeline-minor-event .phui-timeline-title {
   padding: 4px 8px 4px 33px;
 }
 
 .phui-timeline-title a {
   font-weight: bold;
   color: {$darkbluetext};
 }
 
 .device-desktop .phui-timeline-wedge {
   left: -12px;
 }
 
 .device-desktop .phui-timeline-major-event .phui-timeline-wedge {
   top: 24px;
 }
 
 .device-desktop .phui-timeline-minor-event .phui-timeline-wedge {
   top: 12px;
   left: -18px;
   width: 20px;
 }
 
 .phui-timeline-image {
   background-repeat: no-repeat;
   position: absolute;
   border-radius: 3px;
 }
 
 .device-desktop .phui-timeline-major-event .phui-timeline-image {
   width: 50px;
   height: 50px;
   top: 0px;
   left: -62px;
 }
 
 .device-desktop .phui-timeline-minor-event .phui-timeline-image {
   width: 26px;
   height: 26px;
   background-size: 26px auto;
   left: -41px;
 }
 
 .phui-timeline-major-event .phui-timeline-title {
   background: {$lightgreybackground};
   min-height: 18px;
 }
 
 .phui-timeline-title {
   padding: 5px 8px;
   overflow-x: auto;
   overflow-y: hidden;
 }
 
 .phui-timeline-title-with-icon {
   padding-left: 38px;
 }
 
 .phui-timeline-view .phui-icon-view.phui-timeline-token {
   vertical-align: middle;
   margin-right: 4px;
 }
 
 .phui-timeline-token.strikethrough {
   position: relative;
 }
 
 .phui-timeline-token.strikethrough:before {
   position: absolute;
   content: "";
   left: 0;
   top: 50%;
   right: 0;
   border-top: 3px solid;
   border-color: {$darkbluetext};
 
   -webkit-transform:rotate(-40deg);
   -moz-transform:rotate(-40deg);
   -ms-transform:rotate(-40deg);
   -o-transform:rotate(-40deg);
   transform:rotate(-40deg);
 }
 
 .phui-timeline-major-event .phui-timeline-content
   .phui-timeline-core-content {
   padding: 16px 12px;
   line-height: 18px;
   background: #fff;
 }
 
 .phui-timeline-core-content {
   overflow-x: auto;
 }
 
 .phui-timeline-core-content .comment-deleted {
   font-style: italic;
 }
 
 .device .phui-timeline-event-view {
   min-height: 23px;
   position: relative;
 }
 
 .device-phone .phui-timeline-event-view {
   margin: 0 8px;
 }
 
 .device .phui-timeline-image {
   display: none;
 }
 
 .device .phui-timeline-spacer {
   min-height: 8px;
   border-width: 0;
 }
 
 .phui-timeline-icon-fill {
   position: absolute;
   width: 30px;
   height: 30px;
   background-color: {$lightblueborder};
   top: 0;
   left: 0;
 }
 
 .phui-timeline-icon {
   position: absolute;
-  left: 8px;
-  top: 8px;
-  height: 14px;
-  width: 14px;
+  left: 9px;
+  top: -5px;
 }
 
 .phui-timeline-minor-event .phui-timeline-icon-fill {
   height: 26px;
   width: 26px;
   border-radius: 3px;
 }
 
 .phui-timeline-minor-event .phui-timeline-icon {
-  top: 6px;
-  left: 6px;
+  top: -5px;
+  left: 7px;
 }
 
 .phui-timeline-extra,
 .phui-timeline-extra .phabricator-content-source-view {
   font-size: 11px;
   font-weight: normal;
   color: {$lightbluetext};
 }
 
 .phui-timeline-title .phui-timeline-extra a {
   font-weight: normal;
   color: {$bluetext};
 }
 
 .device-desktop .phui-timeline-extra {
   float: right;
 }
 
 .device .phui-timeline-extra {
   display: inline-block;
   line-height: 16px;
   margin-left: 8px;
 }
 
 .device-phone .phui-timeline-extra {
   display: block;
   margin: 0;
 }
 
 .phui-timeline-icon-fill-red {
   background-color: {$red};
 }
 
 .phui-timeline-icon-fill-orange {
   background-color: {$orange};
 }
 
 .phui-timeline-icon-fill-yellow {
   background-color: {$yellow};
 }
 
 .phui-timeline-icon-fill-green {
   background-color: {$green};
 }
 
 .phui-timeline-icon-fill-sky {
   background-color: {$sky};
 }
 
 .phui-timeline-icon-fill-blue {
   background-color: {$blue};
 }
 
 .phui-timeline-icon-fill-indigo {
   background-color: {$indigo};
 }
 
 .phui-timeline-icon-fill-violet {
   background-color: {$violet};
 }
 
 .phui-timeline-icon-fill-grey {
   background-color: #888;
 }
 
 .phui-timeline-icon-fill-black {
   background-color: #333;
 }
 
 .phui-timeline-shell.anchor-target {
   background: rgba(255, 255, 0, 0.50);
   box-shadow: 0 0 3px 6px rgba(255, 255, 0, 0.50);
 }
 
 .phui-timeline-preview-header {
   background: #e0e3ec;
   color: {$darkgreytext};
   padding: 4px 1.25%;
   border: solid {$blueborder} 1px 0;
 }
 
 .phui-timeline-change-details {
   padding: 10px 0;
   border-style: solid;
   border-color: #efefef;
   border-width: 1px 0;
 }
 
 .phui-timeline-older-transactions-are-hidden {
   background: {$lightyellow};
   border: 1px solid {$yellow};
   text-align: center;
   padding: 12px;
   color: {$darkgreytext};
 }
 
 .device-phone .phui-timeline-older-transactions-are-hidden {
   margin: 0 8px;
 }
 
 
 .phui-timeline-title .phui-timeline-extra-information a {
   font-weight: normal;
   color: {$bluetext};
 }