diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php
index 83928ddb5..ac645498d 100644
--- a/src/__celerity_resource_map__.php
+++ b/src/__celerity_resource_map__.php
@@ -1,752 +1,752 @@
 <?php
 
 /**
  * This file is automatically generated. Use 'celerity_mapper.php' to rebuild
  * it.
  * @generated
  */
 
 celerity_register_resource_map(array(
-  'aphront-crumbs-view-css' =>
+  'javelin-behavior-diffusion-jump-to' =>
   array(
-    'uri' => '/res/c666a518/rsrc/css/aphront/crumbs-view.css',
-    'type' => 'css',
+    'uri' => '/res/4f3f6cdc/rsrc/js/application/diffusion/behavior-jump-to.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/aphront/crumbs-view.css',
+    'disk' => '/rsrc/js/application/diffusion/behavior-jump-to.js',
   ),
-  'aphront-dark-console-css' =>
+  'javelin-behavior-diffusion-pull-lastmodified' =>
   array(
-    'uri' => '/res/0417eb95/rsrc/css/aphront/dark-console.css',
-    'type' => 'css',
+    'uri' => '/res/6a5e7374/rsrc/js/application/diffusion/behavior-pull-lastmodified.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/aphront/dark-console.css',
+    'disk' => '/rsrc/js/application/diffusion/behavior-pull-lastmodified.js',
   ),
-  'aphront-dialog-view-css' =>
+  'javelin-behavior-owners-path-editor' =>
   array(
-    'uri' => '/res/9be517dc/rsrc/css/aphront/dialog-view.css',
-    'type' => 'css',
+    'uri' => '/res/7568aa22/rsrc/js/application/owners/owners-path-editor.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'owners-path-editor',
+      1 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/aphront/dialog-view.css',
+    'disk' => '/rsrc/js/application/owners/owners-path-editor.js',
   ),
-  'aphront-error-view-css' =>
+  'owners-path-editor' =>
   array(
-    'uri' => '/res/19b27527/rsrc/css/aphront/error-view.css',
-    'type' => 'css',
+    'uri' => '/res/b01c1ca9/rsrc/js/application/owners/OwnersPathEditor.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'multirow-row-manager',
+      1 => 'javelin-lib-dev',
+      2 => 'javelin-typeahead-dev',
+      3 => 'path-typeahead',
     ),
-    'disk' => '/rsrc/css/aphront/error-view.css',
+    'disk' => '/rsrc/js/application/owners/OwnersPathEditor.js',
   ),
-  'aphront-form-view-css' =>
+  'herald-rule-editor' =>
   array(
-    'uri' => '/res/82eca506/rsrc/css/aphront/form-view.css',
-    'type' => 'css',
+    'uri' => '/res/ec8e2110/rsrc/js/application/herald/HeraldRuleEditor.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'multirow-row-manager',
+      1 => 'javelin-lib-dev',
+      2 => 'javelin-typeahead-dev',
+      3 => 'path-typeahead',
     ),
-    'disk' => '/rsrc/css/aphront/form-view.css',
+    'disk' => '/rsrc/js/application/herald/HeraldRuleEditor.js',
   ),
-  'aphront-headsup-action-list-view-css' =>
+  'javelin-behavior-herald-rule-editor' =>
   array(
-    'uri' => '/res/fe9accb9/rsrc/css/aphront/headsup-action-list-view.css',
-    'type' => 'css',
+    'uri' => '/res/48108130/rsrc/js/application/herald/herald-rule-editor.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'herald-rule-editor',
+      1 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/aphront/headsup-action-list-view.css',
+    'disk' => '/rsrc/js/application/herald/herald-rule-editor.js',
   ),
-  'aphront-list-filter-view-css' =>
+  'path-typeahead' =>
   array(
-    'uri' => '/res/50a790ae/rsrc/css/aphront/list-filter-view.css',
-    'type' => 'css',
+    'uri' => '/res/42fb76c3/rsrc/js/application/herald/PathTypeahead.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'javelin-lib-dev',
+      1 => 'javelin-typeahead-dev',
     ),
-    'disk' => '/rsrc/css/aphront/list-filter-view.css',
+    'disk' => '/rsrc/js/application/herald/PathTypeahead.js',
   ),
-  'aphront-pager-view-css' =>
+  'javelin-behavior-differential-populate' =>
   array(
-    'uri' => '/res/73ec8cd5/rsrc/css/aphront/pager-view.css',
-    'type' => 'css',
+    'uri' => '/res/a13dcd7e/rsrc/js/application/differential/behavior-populate.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/aphront/pager-view.css',
+    'disk' => '/rsrc/js/application/differential/behavior-populate.js',
   ),
-  'aphront-panel-view-css' =>
+  'javelin-behavior-differential-add-reviewers' =>
   array(
-    'uri' => '/res/8f9f3632/rsrc/css/aphront/panel-view.css',
-    'type' => 'css',
+    'uri' => '/res/330154e4/rsrc/js/application/differential/behavior-add-reviewers.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/aphront/panel-view.css',
+    'disk' => '/rsrc/js/application/differential/behavior-add-reviewers.js',
   ),
-  'aphront-request-failure-view-css' =>
+  'javelin-behavior-differential-edit-inline-comments' =>
   array(
-    'uri' => '/res/97b8337a/rsrc/css/aphront/request-failure-view.css',
-    'type' => 'css',
+    'uri' => '/res/6a6f38e6/rsrc/js/application/differential/behavior-edit-inline-comments.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/aphront/request-failure-view.css',
+    'disk' => '/rsrc/js/application/differential/behavior-edit-inline-comments.js',
   ),
-  'aphront-side-nav-view-css' =>
+  'javelin-behavior-differential-show-more' =>
   array(
-    'uri' => '/res/4f4c5ca8/rsrc/css/aphront/side-nav-view.css',
-    'type' => 'css',
+    'uri' => '/res/ea998002/rsrc/js/application/differential/behavior-show-more.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/aphront/side-nav-view.css',
+    'disk' => '/rsrc/js/application/differential/behavior-show-more.js',
   ),
-  'aphront-table-view-css' =>
+  'javelin-behavior-differential-show-all-comments' =>
   array(
-    'uri' => '/res/03724b05/rsrc/css/aphront/table-view.css',
-    'type' => 'css',
+    'uri' => '/res/2a3592b8/rsrc/js/application/differential/behavior-show-all-comments.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/aphront/table-view.css',
+    'disk' => '/rsrc/js/application/differential/behavior-show-all-comments.js',
   ),
-  'aphront-tokenizer-control-css' =>
+  'javelin-behavior-differential-feedback-preview' =>
   array(
-    'uri' => '/res/190349be/rsrc/css/aphront/tokenizer.css',
-    'type' => 'css',
+    'uri' => '/res/8695d8b8/rsrc/js/application/differential/behavior-comment-preview.js',
+    'type' => 'js',
     'requires' =>
     array(
-      0 => 'aphront-typeahead-control-css',
+      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/aphront/tokenizer.css',
+    'disk' => '/rsrc/js/application/differential/behavior-comment-preview.js',
   ),
-  'aphront-typeahead-control-css' =>
+  'javelin-behavior-differential-diff-radios' =>
   array(
-    'uri' => '/res/928df9f0/rsrc/css/aphront/typeahead.css',
-    'type' => 'css',
+    'uri' => '/res/fdeb3823/rsrc/js/application/differential/behavior-diff-radios.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/aphront/typeahead.css',
+    'disk' => '/rsrc/js/application/differential/behavior-diff-radios.js',
   ),
-  'phabricator-standard-page-view' =>
+  'javelin-behavior-phabricator-object-selector' =>
   array(
-    'uri' => '/res/0d41ea7c/rsrc/css/application/base/standard-page-view.css',
-    'type' => 'css',
+    'uri' => '/res/c0f12b29/rsrc/js/application/core/behavior-object-selector.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/application/base/standard-page-view.css',
+    'disk' => '/rsrc/js/application/core/behavior-object-selector.js',
   ),
-  'differential-revision-add-comment-css' =>
+  'javelin-behavior-aphront-basic-tokenizer' =>
   array(
-    'uri' => '/res/aaae14d3/rsrc/css/application/differential/add-comment.css',
-    'type' => 'css',
+    'uri' => '/res/8317d761/rsrc/js/application/core/behavior-tokenizer.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/application/differential/add-comment.css',
+    'disk' => '/rsrc/js/application/core/behavior-tokenizer.js',
   ),
-  'differential-changeset-view-css' =>
+  'javelin-behavior-error-log' =>
   array(
-    'uri' => '/res/f26ca6f9/rsrc/css/application/differential/changeset-view.css',
-    'type' => 'css',
+    'uri' => '/res/c57a323f/rsrc/js/application/core/behavior-error-log.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/application/differential/changeset-view.css',
+    'disk' => '/rsrc/js/application/core/behavior-error-log.js',
   ),
-  'differential-core-view-css' =>
+  'multirow-row-manager' =>
   array(
-    'uri' => '/res/525d1a12/rsrc/css/application/differential/core.css',
-    'type' => 'css',
+    'uri' => '/res/330d076b/rsrc/js/application/core/MultirowRowManager.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/application/differential/core.css',
+    'disk' => '/rsrc/js/application/core/MultirowRowManager.js',
   ),
-  'differential-revision-comment-list-css' =>
+  'javelin-behavior-dark-console' =>
   array(
-    'uri' => '/res/10b9a829/rsrc/css/application/differential/revision-comment-list.css',
-    'type' => 'css',
+    'uri' => '/res/020b0265/rsrc/js/application/core/behavior-dark-console.js',
+    'type' => 'js',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/application/differential/revision-comment-list.css',
+    'disk' => '/rsrc/js/application/core/behavior-dark-console.js',
   ),
-  'differential-revision-comment-css' =>
+  'javelin-behavior-workflow' =>
   array(
-    'uri' => '/res/7185c7fe/rsrc/css/application/differential/revision-comment.css',
-    'type' => 'css',
+    'uri' => '/res/15446e7e/rsrc/js/application/core/behavior-workflow.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/application/differential/revision-comment.css',
+    'disk' => '/rsrc/js/application/core/behavior-workflow.js',
   ),
-  'differential-revision-detail-css' =>
+  'javelin-behavior-maniphest-transaction-controls' =>
   array(
-    'uri' => '/res/a63e2d06/rsrc/css/application/differential/revision-detail.css',
-    'type' => 'css',
+    'uri' => '/res/fc6a8722/rsrc/js/application/maniphest/behavior-transaction-controls.js',
+    'type' => 'js',
     'requires' =>
     array(
+      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/css/application/differential/revision-detail.css',
+    'disk' => '/rsrc/js/application/maniphest/behavior-transaction-controls.js',
   ),
-  'differential-revision-history-css' =>
+  'javelin-typeahead-prod' =>
   array(
-    'uri' => '/res/755f3da3/rsrc/css/application/differential/revision-history.css',
-    'type' => 'css',
+    'uri' => '/res/69d5fad1/rsrc/js/javelin/typeahead.min.js',
+    'type' => 'js',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/application/differential/revision-history.css',
+    'disk' => '/rsrc/js/javelin/typeahead.min.js',
   ),
-  'differential-table-of-contents-css' =>
+  'javelin-workflow-prod' =>
   array(
-    'uri' => '/res/e68f6f05/rsrc/css/application/differential/table-of-contents.css',
-    'type' => 'css',
+    'uri' => '/res/b758e0a0/rsrc/js/javelin/workflow.min.js',
+    'type' => 'js',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/application/differential/table-of-contents.css',
+    'disk' => '/rsrc/js/javelin/workflow.min.js',
   ),
-  'diffusion-commit-view-css' =>
+  'javelin-magical-init' =>
   array(
-    'uri' => '/res/8c139192/rsrc/css/application/diffusion/commit-view.css',
-    'type' => 'css',
+    'uri' => '/res/76614f84/rsrc/js/javelin/init.dev.js',
+    'type' => 'js',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/application/diffusion/commit-view.css',
+    'disk' => '/rsrc/js/javelin/init.dev.js',
   ),
-  'diffusion-source-css' =>
+  'javelin-workflow-dev' =>
   array(
-    'uri' => '/res/7f50817b/rsrc/css/application/diffusion/diffusion-source.css',
-    'type' => 'css',
+    'uri' => '/res/c6b17f93/rsrc/js/javelin/workflow.dev.js',
+    'type' => 'js',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/application/diffusion/diffusion-source.css',
+    'disk' => '/rsrc/js/javelin/workflow.dev.js',
   ),
-  'phabricator-directory-css' =>
+  'javelin-lib-dev' =>
   array(
-    'uri' => '/res/6a000601/rsrc/css/application/directory/phabricator-directory.css',
-    'type' => 'css',
+    'uri' => '/res/a0e7a5e9/rsrc/js/javelin/javelin.dev.js',
+    'type' => 'js',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/application/directory/phabricator-directory.css',
+    'disk' => '/rsrc/js/javelin/javelin.dev.js',
   ),
-  'herald-test-css' =>
+  'javelin-init-prod' =>
   array(
-    'uri' => '/res/28269358/rsrc/css/application/herald/herald-test.css',
-    'type' => 'css',
+    'uri' => '/res/1267c868/rsrc/js/javelin/init.min.js',
+    'type' => 'js',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/application/herald/herald-test.css',
+    'disk' => '/rsrc/js/javelin/init.min.js',
   ),
-  'herald-css' =>
+  'javelin-lib-prod' =>
   array(
-    'uri' => '/res/211a4b1b/rsrc/css/application/herald/herald.css',
-    'type' => 'css',
+    'uri' => '/res/2f2b3b2e/rsrc/js/javelin/javelin.min.js',
+    'type' => 'js',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/application/herald/herald.css',
+    'disk' => '/rsrc/js/javelin/javelin.min.js',
   ),
-  'mainphest-task-detail-css' =>
+  'javelin-typeahead-dev' =>
   array(
-    'uri' => '/res/e5f3beca/rsrc/css/application/maniphest/task-detail.css',
-    'type' => 'css',
+    'uri' => '/res/6de6ae59/rsrc/js/javelin/typeahead.dev.js',
+    'type' => 'js',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/application/maniphest/task-detail.css',
+    'disk' => '/rsrc/js/javelin/typeahead.dev.js',
   ),
-  'maniphest-task-summary-css' =>
+  'diffusion-commit-view-css' =>
   array(
-    'uri' => '/res/8dc6fb13/rsrc/css/application/maniphest/task-summary.css',
+    'uri' => '/res/8c139192/rsrc/css/application/diffusion/commit-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/application/maniphest/task-summary.css',
+    'disk' => '/rsrc/css/application/diffusion/commit-view.css',
   ),
-  'maniphest-transaction-detail-css' =>
+  'diffusion-source-css' =>
   array(
-    'uri' => '/res/16725026/rsrc/css/application/maniphest/transaction-detail.css',
+    'uri' => '/res/7f50817b/rsrc/css/application/diffusion/diffusion-source.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/application/maniphest/transaction-detail.css',
+    'disk' => '/rsrc/css/application/diffusion/diffusion-source.css',
   ),
-  'phabricator-object-selector-css' =>
+  'owners-path-editor-css' =>
   array(
-    'uri' => '/res/52a7e289/rsrc/css/application/objectselector/object-selector.css',
+    'uri' => '/res/f40dc6b1/rsrc/css/application/owners/owners-path-editor.css',
     'type' => 'css',
     'requires' =>
     array(
-      0 => 'aphront-dialog-view-css',
     ),
-    'disk' => '/rsrc/css/application/objectselector/object-selector.css',
+    'disk' => '/rsrc/css/application/owners/owners-path-editor.css',
   ),
-  'owners-path-editor-css' =>
+  'herald-css' =>
   array(
-    'uri' => '/res/f40dc6b1/rsrc/css/application/owners/owners-path-editor.css',
+    'uri' => '/res/211a4b1b/rsrc/css/application/herald/herald.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/application/owners/owners-path-editor.css',
+    'disk' => '/rsrc/css/application/herald/herald.css',
   ),
-  'phabricator-profile-css' =>
+  'herald-test-css' =>
   array(
-    'uri' => '/res/259ad37f/rsrc/css/application/people/profile.css',
+    'uri' => '/res/28269358/rsrc/css/application/herald/herald-test.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/application/people/profile.css',
+    'disk' => '/rsrc/css/application/herald/herald-test.css',
   ),
-  'phabricator-ui-example-css' =>
+  'phabricator-profile-css' =>
   array(
-    'uri' => '/res/365a10f1/rsrc/css/application/uiexample/example.css',
+    'uri' => '/res/259ad37f/rsrc/css/application/people/profile.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/application/uiexample/example.css',
+    'disk' => '/rsrc/css/application/people/profile.css',
   ),
-  'phabricator-core-buttons-css' =>
+  'differential-table-of-contents-css' =>
   array(
-    'uri' => '/res/53b4f712/rsrc/css/core/buttons.css',
+    'uri' => '/res/e68f6f05/rsrc/css/application/differential/table-of-contents.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/core/buttons.css',
+    'disk' => '/rsrc/css/application/differential/table-of-contents.css',
   ),
-  'phabricator-core-css' =>
+  'differential-revision-history-css' =>
   array(
-    'uri' => '/res/6eebb99b/rsrc/css/core/core.css',
+    'uri' => '/res/755f3da3/rsrc/css/application/differential/revision-history.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/core/core.css',
+    'disk' => '/rsrc/css/application/differential/revision-history.css',
   ),
-  'phabricator-remarkup-css' =>
+  'differential-changeset-view-css' =>
   array(
-    'uri' => '/res/2eebb293/rsrc/css/core/remarkup.css',
+    'uri' => '/res/f26ca6f9/rsrc/css/application/differential/changeset-view.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/core/remarkup.css',
+    'disk' => '/rsrc/css/application/differential/changeset-view.css',
   ),
-  'syntax-highlighting-css' =>
+  'differential-revision-comment-list-css' =>
   array(
-    'uri' => '/res/fb673ece/rsrc/css/core/syntax.css',
+    'uri' => '/res/10b9a829/rsrc/css/application/differential/revision-comment-list.css',
     'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/css/core/syntax.css',
+    'disk' => '/rsrc/css/application/differential/revision-comment-list.css',
   ),
-  'multirow-row-manager' =>
+  'differential-revision-detail-css' =>
   array(
-    'uri' => '/res/330d076b/rsrc/js/application/core/MultirowRowManager.js',
-    'type' => 'js',
+    'uri' => '/res/a63e2d06/rsrc/css/application/differential/revision-detail.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/js/application/core/MultirowRowManager.js',
+    'disk' => '/rsrc/css/application/differential/revision-detail.css',
   ),
-  'javelin-behavior-dark-console' =>
+  'differential-revision-comment-css' =>
   array(
-    'uri' => '/res/020b0265/rsrc/js/application/core/behavior-dark-console.js',
-    'type' => 'js',
+    'uri' => '/res/7185c7fe/rsrc/css/application/differential/revision-comment.css',
+    'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/js/application/core/behavior-dark-console.js',
+    'disk' => '/rsrc/css/application/differential/revision-comment.css',
   ),
-  'javelin-behavior-error-log' =>
+  'differential-revision-add-comment-css' =>
   array(
-    'uri' => '/res/c57a323f/rsrc/js/application/core/behavior-error-log.js',
-    'type' => 'js',
+    'uri' => '/res/aaae14d3/rsrc/css/application/differential/add-comment.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/js/application/core/behavior-error-log.js',
+    'disk' => '/rsrc/css/application/differential/add-comment.css',
   ),
-  'javelin-behavior-phabricator-object-selector' =>
+  'differential-core-view-css' =>
   array(
-    'uri' => '/res/c0f12b29/rsrc/js/application/core/behavior-object-selector.js',
-    'type' => 'js',
+    'uri' => '/res/525d1a12/rsrc/css/application/differential/core.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/js/application/core/behavior-object-selector.js',
+    'disk' => '/rsrc/css/application/differential/core.css',
   ),
-  'javelin-behavior-aphront-basic-tokenizer' =>
+  'phabricator-standard-page-view' =>
   array(
-    'uri' => '/res/8317d761/rsrc/js/application/core/behavior-tokenizer.js',
-    'type' => 'js',
+    'uri' => '/res/0d41ea7c/rsrc/css/application/base/standard-page-view.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/js/application/core/behavior-tokenizer.js',
+    'disk' => '/rsrc/css/application/base/standard-page-view.css',
   ),
-  'javelin-behavior-workflow' =>
+  'phabricator-ui-example-css' =>
   array(
-    'uri' => '/res/15446e7e/rsrc/js/application/core/behavior-workflow.js',
-    'type' => 'js',
+    'uri' => '/res/365a10f1/rsrc/css/application/uiexample/example.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/js/application/core/behavior-workflow.js',
+    'disk' => '/rsrc/css/application/uiexample/example.css',
   ),
-  'javelin-behavior-differential-add-reviewers' =>
+  'phabricator-object-selector-css' =>
   array(
-    'uri' => '/res/330154e4/rsrc/js/application/differential/behavior-add-reviewers.js',
-    'type' => 'js',
+    'uri' => '/res/52a7e289/rsrc/css/application/objectselector/object-selector.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
+      0 => 'aphront-dialog-view-css',
     ),
-    'disk' => '/rsrc/js/application/differential/behavior-add-reviewers.js',
+    'disk' => '/rsrc/css/application/objectselector/object-selector.css',
   ),
-  'javelin-behavior-differential-feedback-preview' =>
+  'maniphest-task-summary-css' =>
   array(
-    'uri' => '/res/8695d8b8/rsrc/js/application/differential/behavior-comment-preview.js',
-    'type' => 'js',
+    'uri' => '/res/8dc6fb13/rsrc/css/application/maniphest/task-summary.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/js/application/differential/behavior-comment-preview.js',
+    'disk' => '/rsrc/css/application/maniphest/task-summary.css',
   ),
-  'javelin-behavior-differential-diff-radios' =>
+  'mainphest-task-detail-css' =>
   array(
-    'uri' => '/res/fdeb3823/rsrc/js/application/differential/behavior-diff-radios.js',
-    'type' => 'js',
+    'uri' => '/res/e5f3beca/rsrc/css/application/maniphest/task-detail.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/js/application/differential/behavior-diff-radios.js',
+    'disk' => '/rsrc/css/application/maniphest/task-detail.css',
   ),
-  'javelin-behavior-differential-edit-inline-comments' =>
+  'maniphest-transaction-detail-css' =>
   array(
-    'uri' => '/res/74747b2e/rsrc/js/application/differential/behavior-edit-inline-comments.js',
-    'type' => 'js',
+    'uri' => '/res/16725026/rsrc/css/application/maniphest/transaction-detail.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/js/application/differential/behavior-edit-inline-comments.js',
+    'disk' => '/rsrc/css/application/maniphest/transaction-detail.css',
   ),
-  'javelin-behavior-differential-populate' =>
+  'phabricator-directory-css' =>
   array(
-    'uri' => '/res/a13dcd7e/rsrc/js/application/differential/behavior-populate.js',
-    'type' => 'js',
+    'uri' => '/res/6a000601/rsrc/css/application/directory/phabricator-directory.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/js/application/differential/behavior-populate.js',
+    'disk' => '/rsrc/css/application/directory/phabricator-directory.css',
   ),
-  'javelin-behavior-differential-show-all-comments' =>
+  'phabricator-remarkup-css' =>
   array(
-    'uri' => '/res/2a3592b8/rsrc/js/application/differential/behavior-show-all-comments.js',
-    'type' => 'js',
+    'uri' => '/res/1fc75ba6/rsrc/css/core/remarkup.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/js/application/differential/behavior-show-all-comments.js',
+    'disk' => '/rsrc/css/core/remarkup.css',
   ),
-  'javelin-behavior-differential-show-more' =>
+  'phabricator-core-buttons-css' =>
   array(
-    'uri' => '/res/ea998002/rsrc/js/application/differential/behavior-show-more.js',
-    'type' => 'js',
+    'uri' => '/res/53b4f712/rsrc/css/core/buttons.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/js/application/differential/behavior-show-more.js',
+    'disk' => '/rsrc/css/core/buttons.css',
   ),
-  'javelin-behavior-diffusion-jump-to' =>
+  'syntax-highlighting-css' =>
   array(
-    'uri' => '/res/4f3f6cdc/rsrc/js/application/diffusion/behavior-jump-to.js',
-    'type' => 'js',
+    'uri' => '/res/fb673ece/rsrc/css/core/syntax.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/js/application/diffusion/behavior-jump-to.js',
+    'disk' => '/rsrc/css/core/syntax.css',
   ),
-  'javelin-behavior-diffusion-pull-lastmodified' =>
+  'phabricator-core-css' =>
   array(
-    'uri' => '/res/6a5e7374/rsrc/js/application/diffusion/behavior-pull-lastmodified.js',
-    'type' => 'js',
+    'uri' => '/res/6eebb99b/rsrc/css/core/core.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/js/application/diffusion/behavior-pull-lastmodified.js',
+    'disk' => '/rsrc/css/core/core.css',
   ),
-  'herald-rule-editor' =>
+  'aphront-side-nav-view-css' =>
   array(
-    'uri' => '/res/ec8e2110/rsrc/js/application/herald/HeraldRuleEditor.js',
-    'type' => 'js',
+    'uri' => '/res/4f4c5ca8/rsrc/css/aphront/side-nav-view.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'multirow-row-manager',
-      1 => 'javelin-lib-dev',
-      2 => 'javelin-typeahead-dev',
-      3 => 'path-typeahead',
     ),
-    'disk' => '/rsrc/js/application/herald/HeraldRuleEditor.js',
+    'disk' => '/rsrc/css/aphront/side-nav-view.css',
   ),
-  'path-typeahead' =>
+  'aphront-list-filter-view-css' =>
   array(
-    'uri' => '/res/42fb76c3/rsrc/js/application/herald/PathTypeahead.js',
-    'type' => 'js',
+    'uri' => '/res/50a790ae/rsrc/css/aphront/list-filter-view.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
-      1 => 'javelin-typeahead-dev',
     ),
-    'disk' => '/rsrc/js/application/herald/PathTypeahead.js',
+    'disk' => '/rsrc/css/aphront/list-filter-view.css',
   ),
-  'javelin-behavior-herald-rule-editor' =>
+  'aphront-tokenizer-control-css' =>
   array(
-    'uri' => '/res/48108130/rsrc/js/application/herald/herald-rule-editor.js',
-    'type' => 'js',
+    'uri' => '/res/190349be/rsrc/css/aphront/tokenizer.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'herald-rule-editor',
-      1 => 'javelin-lib-dev',
+      0 => 'aphront-typeahead-control-css',
     ),
-    'disk' => '/rsrc/js/application/herald/herald-rule-editor.js',
+    'disk' => '/rsrc/css/aphront/tokenizer.css',
   ),
-  'javelin-behavior-maniphest-transaction-controls' =>
+  'aphront-request-failure-view-css' =>
   array(
-    'uri' => '/res/fc6a8722/rsrc/js/application/maniphest/behavior-transaction-controls.js',
-    'type' => 'js',
+    'uri' => '/res/97b8337a/rsrc/css/aphront/request-failure-view.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/js/application/maniphest/behavior-transaction-controls.js',
+    'disk' => '/rsrc/css/aphront/request-failure-view.css',
   ),
-  'owners-path-editor' =>
+  'aphront-dark-console-css' =>
   array(
-    'uri' => '/res/b01c1ca9/rsrc/js/application/owners/OwnersPathEditor.js',
-    'type' => 'js',
+    'uri' => '/res/0417eb95/rsrc/css/aphront/dark-console.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'multirow-row-manager',
-      1 => 'javelin-lib-dev',
-      2 => 'javelin-typeahead-dev',
-      3 => 'path-typeahead',
     ),
-    'disk' => '/rsrc/js/application/owners/OwnersPathEditor.js',
+    'disk' => '/rsrc/css/aphront/dark-console.css',
   ),
-  'javelin-behavior-owners-path-editor' =>
+  'aphront-panel-view-css' =>
   array(
-    'uri' => '/res/7568aa22/rsrc/js/application/owners/owners-path-editor.js',
-    'type' => 'js',
+    'uri' => '/res/8f9f3632/rsrc/css/aphront/panel-view.css',
+    'type' => 'css',
     'requires' =>
     array(
-      0 => 'owners-path-editor',
-      1 => 'javelin-lib-dev',
     ),
-    'disk' => '/rsrc/js/application/owners/owners-path-editor.js',
+    'disk' => '/rsrc/css/aphront/panel-view.css',
   ),
-  'javelin-magical-init' =>
+  'aphront-typeahead-control-css' =>
   array(
-    'uri' => '/res/76614f84/rsrc/js/javelin/init.dev.js',
-    'type' => 'js',
+    'uri' => '/res/928df9f0/rsrc/css/aphront/typeahead.css',
+    'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/js/javelin/init.dev.js',
+    'disk' => '/rsrc/css/aphront/typeahead.css',
   ),
-  'javelin-init-prod' =>
+  'aphront-form-view-css' =>
   array(
-    'uri' => '/res/1267c868/rsrc/js/javelin/init.min.js',
-    'type' => 'js',
+    'uri' => '/res/82eca506/rsrc/css/aphront/form-view.css',
+    'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/js/javelin/init.min.js',
+    'disk' => '/rsrc/css/aphront/form-view.css',
   ),
-  'javelin-lib-dev' =>
+  'aphront-dialog-view-css' =>
   array(
-    'uri' => '/res/a0e7a5e9/rsrc/js/javelin/javelin.dev.js',
-    'type' => 'js',
+    'uri' => '/res/9be517dc/rsrc/css/aphront/dialog-view.css',
+    'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/js/javelin/javelin.dev.js',
+    'disk' => '/rsrc/css/aphront/dialog-view.css',
   ),
-  'javelin-lib-prod' =>
+  'aphront-crumbs-view-css' =>
   array(
-    'uri' => '/res/2f2b3b2e/rsrc/js/javelin/javelin.min.js',
-    'type' => 'js',
+    'uri' => '/res/c666a518/rsrc/css/aphront/crumbs-view.css',
+    'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/js/javelin/javelin.min.js',
+    'disk' => '/rsrc/css/aphront/crumbs-view.css',
   ),
-  'javelin-typeahead-dev' =>
+  'aphront-table-view-css' =>
   array(
-    'uri' => '/res/6de6ae59/rsrc/js/javelin/typeahead.dev.js',
-    'type' => 'js',
+    'uri' => '/res/03724b05/rsrc/css/aphront/table-view.css',
+    'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/js/javelin/typeahead.dev.js',
+    'disk' => '/rsrc/css/aphront/table-view.css',
   ),
-  'javelin-typeahead-prod' =>
+  'aphront-headsup-action-list-view-css' =>
   array(
-    'uri' => '/res/69d5fad1/rsrc/js/javelin/typeahead.min.js',
-    'type' => 'js',
+    'uri' => '/res/fe9accb9/rsrc/css/aphront/headsup-action-list-view.css',
+    'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/js/javelin/typeahead.min.js',
+    'disk' => '/rsrc/css/aphront/headsup-action-list-view.css',
   ),
-  'javelin-workflow-dev' =>
+  'aphront-error-view-css' =>
   array(
-    'uri' => '/res/c6b17f93/rsrc/js/javelin/workflow.dev.js',
-    'type' => 'js',
+    'uri' => '/res/19b27527/rsrc/css/aphront/error-view.css',
+    'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/js/javelin/workflow.dev.js',
+    'disk' => '/rsrc/css/aphront/error-view.css',
   ),
-  'javelin-workflow-prod' =>
+  'aphront-pager-view-css' =>
   array(
-    'uri' => '/res/b758e0a0/rsrc/js/javelin/workflow.min.js',
-    'type' => 'js',
+    'uri' => '/res/73ec8cd5/rsrc/css/aphront/pager-view.css',
+    'type' => 'css',
     'requires' =>
     array(
     ),
-    'disk' => '/rsrc/js/javelin/workflow.min.js',
+    'disk' => '/rsrc/css/aphront/pager-view.css',
   ),
 ), array (
   'packages' =>
   array (
-    '5493883d' =>
+    'd06872a7' =>
     array (
       'name' => 'core.pkg.css',
       'symbols' =>
       array (
         0 => 'phabricator-core-css',
         1 => 'phabricator-core-buttons-css',
         2 => 'phabricator-standard-page-view',
         3 => 'aphront-dialog-view-css',
         4 => 'aphront-form-view-css',
         5 => 'aphront-panel-view-css',
         6 => 'aphront-side-nav-view-css',
         7 => 'aphront-table-view-css',
         8 => 'aphront-crumbs-view-css',
         9 => 'aphront-tokenizer-control-css',
         10 => 'aphront-typeahead-control-css',
         11 => 'phabricator-directory-css',
         12 => 'phabricator-remarkup-css',
         13 => 'syntax-highlighting-css',
       ),
-      'uri' => '/res/pkg/5493883d/core.pkg.css',
+      'uri' => '/res/pkg/d06872a7/core.pkg.css',
       'type' => 'css',
     ),
     '8d8a971a' =>
     array (
       'name' => 'differential.pkg.css',
       'symbols' =>
       array (
         0 => 'differential-core-view-css',
         1 => 'differential-changeset-view-css',
         2 => 'differential-revision-detail-css',
         3 => 'differential-revision-history-css',
         4 => 'differential-table-of-contents-css',
         5 => 'differential-revision-comment-css',
         6 => 'differential-revision-add-comment-css',
         7 => 'differential-revision-comment-list-css',
       ),
       'uri' => '/res/pkg/8d8a971a/differential.pkg.css',
       'type' => 'css',
     ),
-    '30d594cf' =>
+    '6c786373' =>
     array (
       'name' => 'differential.pkg.js',
       'symbols' =>
       array (
         0 => 'javelin-behavior-differential-feedback-preview',
         1 => 'javelin-behavior-differential-edit-inline-comments',
         2 => 'javelin-behavior-differential-populate',
         3 => 'javelin-behavior-differential-show-more',
         4 => 'javelin-behavior-differential-diff-radios',
       ),
-      'uri' => '/res/pkg/30d594cf/differential.pkg.js',
+      'uri' => '/res/pkg/6c786373/differential.pkg.js',
       'type' => 'js',
     ),
     'eadf6ec3' =>
     array (
       'name' => 'diffusion.pkg.css',
       'symbols' =>
       array (
         0 => 'diffusion-commit-view-css',
       ),
       'uri' => '/res/pkg/eadf6ec3/diffusion.pkg.css',
       'type' => 'css',
     ),
   ),
   'reverse' =>
   array (
-    'phabricator-core-css' => '5493883d',
-    'phabricator-core-buttons-css' => '5493883d',
-    'phabricator-standard-page-view' => '5493883d',
-    'aphront-dialog-view-css' => '5493883d',
-    'aphront-form-view-css' => '5493883d',
-    'aphront-panel-view-css' => '5493883d',
-    'aphront-side-nav-view-css' => '5493883d',
-    'aphront-table-view-css' => '5493883d',
-    'aphront-crumbs-view-css' => '5493883d',
-    'aphront-tokenizer-control-css' => '5493883d',
-    'aphront-typeahead-control-css' => '5493883d',
-    'phabricator-directory-css' => '5493883d',
-    'phabricator-remarkup-css' => '5493883d',
-    'syntax-highlighting-css' => '5493883d',
+    'phabricator-core-css' => 'd06872a7',
+    'phabricator-core-buttons-css' => 'd06872a7',
+    'phabricator-standard-page-view' => 'd06872a7',
+    'aphront-dialog-view-css' => 'd06872a7',
+    'aphront-form-view-css' => 'd06872a7',
+    'aphront-panel-view-css' => 'd06872a7',
+    'aphront-side-nav-view-css' => 'd06872a7',
+    'aphront-table-view-css' => 'd06872a7',
+    'aphront-crumbs-view-css' => 'd06872a7',
+    'aphront-tokenizer-control-css' => 'd06872a7',
+    'aphront-typeahead-control-css' => 'd06872a7',
+    'phabricator-directory-css' => 'd06872a7',
+    'phabricator-remarkup-css' => 'd06872a7',
+    'syntax-highlighting-css' => 'd06872a7',
     'differential-core-view-css' => '8d8a971a',
     'differential-changeset-view-css' => '8d8a971a',
     'differential-revision-detail-css' => '8d8a971a',
     'differential-revision-history-css' => '8d8a971a',
     'differential-table-of-contents-css' => '8d8a971a',
     'differential-revision-comment-css' => '8d8a971a',
     'differential-revision-add-comment-css' => '8d8a971a',
     'differential-revision-comment-list-css' => '8d8a971a',
-    'javelin-behavior-differential-feedback-preview' => '30d594cf',
-    'javelin-behavior-differential-edit-inline-comments' => '30d594cf',
-    'javelin-behavior-differential-populate' => '30d594cf',
-    'javelin-behavior-differential-show-more' => '30d594cf',
-    'javelin-behavior-differential-diff-radios' => '30d594cf',
+    'javelin-behavior-differential-feedback-preview' => '6c786373',
+    'javelin-behavior-differential-edit-inline-comments' => '6c786373',
+    'javelin-behavior-differential-populate' => '6c786373',
+    'javelin-behavior-differential-show-more' => '6c786373',
+    'javelin-behavior-differential-diff-radios' => '6c786373',
     'diffusion-commit-view-css' => 'eadf6ec3',
   ),
 ));
diff --git a/src/applications/differential/view/inlinecomment/DifferentialInlineCommentView.php b/src/applications/differential/view/inlinecomment/DifferentialInlineCommentView.php
index b293ef07f..31644466f 100644
--- a/src/applications/differential/view/inlinecomment/DifferentialInlineCommentView.php
+++ b/src/applications/differential/view/inlinecomment/DifferentialInlineCommentView.php
@@ -1,178 +1,186 @@
 <?php
 
 /*
  * Copyright 2011 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
  *   http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
 final class DifferentialInlineCommentView extends AphrontView {
 
   private $inlineComment;
   private $onRight;
   private $buildScaffolding;
   private $handles;
   private $markupEngine;
   private $editable;
 
   public function setInlineComment(DifferentialInlineComment $comment) {
     $this->inlineComment = $comment;
     return $this;
   }
 
   public function setOnRight($on_right) {
     $this->onRight = $on_right;
     return $this;
   }
 
   public function setBuildScaffolding($scaffold) {
     $this->buildScaffolding = $scaffold;
     return $this;
   }
 
   public function setHandles(array $handles) {
     $this->handles = $handles;
     return $this;
   }
 
   public function setMarkupEngine(PhutilMarkupEngine $engine) {
     $this->markupEngine = $engine;
     return $this;
   }
 
   public function setEditable($editable) {
     $this->editable = $editable;
     return $this;
   }
 
   public function render() {
 
     $inline = $this->inlineComment;
 
     $start = $inline->getLineNumber();
     $length = $inline->getLineLength();
     if ($length) {
       $end = $start + $length;
       $line = 'Lines '.number_format($start).'-'.number_format($end);
     } else {
       $line = 'Line '.number_format($start);
     }
 
     $metadata = array(
       'id' => $inline->getID(),
       'number' => $inline->getLineNumber(),
       'length' => $inline->getLineLength(),
       'on_right' => $this->onRight,
     );
 
     $sigil = 'differential-inline-comment';
 
     $content = $inline->getContent();
     $handles = $this->handles;
 
     $links = array();
+
+    $links[] = javelin_render_tag(
+      'a',
+      array(
+        'href'        => '#',
+        'mustcapture' => true,
+        'sigil'       => 'differential-inline-reply',
+        'meta'        => array(
+          'is_new' => true,
+          'changeset' => $inline->getChangesetID(),
+          'number' => $inline->getLineNumber(),
+          'length' => $inline->getLineLength(),
+          'on_right' => $this->onRight,
+        )
+      ),
+      'Reply');
+
     if ($this->editable) {
       $links[] = javelin_render_tag(
         'a',
         array(
           'href'        => '#',
           'mustcapture' => true,
           'sigil'       => 'differential-inline-edit',
         ),
         'Edit');
       $links[] = javelin_render_tag(
         'a',
         array(
           'href'        => '#',
           'mustcapture' => true,
           'sigil'       => 'differential-inline-delete',
         ),
         'Delete');
     }
 
     if ($links) {
       $links =
         '<span class="differential-inline-comment-links">'.
           implode(' &middot; ', $links).
         '</span>';
     } else {
       $links = null;
     }
 
     $cache = $inline->getCache();
     if (strlen($cache)) {
       $content = $cache;
     } else {
       $content = $this->markupEngine->markupText($content);
       if ($inline->getID()) {
         $inline->setCache($content);
         $inline->save();
       }
     }
 
     $anchor = phutil_render_tag(
       'a',
       array(
         'name' => 'inline-'.$inline->getID(),
       ),
       '');
 
     $markup = javelin_render_tag(
       'div',
       array(
         'class' => 'differential-inline-comment',
         'sigil' => $sigil,
         'meta'  => $metadata,
       ),
       '<div class="differential-inline-comment-head">'.
         $anchor.
         $links.
         '<span class="differential-inline-comment-line">'.$line.'</span>'.
         phutil_escape_html($handles[$inline->getAuthorPHID()]->getName()).
       '</div>'.
       '<div class="phabricator-remarkup">'.
         $content.
       '</div>');
 
     return $this->scaffoldMarkup($markup);
   }
 
   private function scaffoldMarkup($markup) {
     if (!$this->buildScaffolding) {
       return $markup;
     }
 
-    if ($this->onRight) {
-      return
-        '<table>'.
-          '<tr>'.
-            '<th></th>'.
-            '<td></td>'.
-            '<th></th>'.
-            '<td>'.$markup.'</td>'.
-          '</tr>'.
-        '</table>';
-    } else {
-      return
-        '<table>'.
-          '<tr>'.
-            '<th></th>'.
-            '<td>'.$markup.'</td>'.
-            '<th></th>'.
-            '<td></td>'.
-          '</tr>'.
-        '</table>';
-    }
+    $left_markup = !$this->onRight ? $markup : '';
+    $right_markup = $this->onRight ? $markup : '';
+
+    return
+      '<table>'.
+        '<tr class="inline">'.
+          '<th></th>'.
+          '<td>'.$left_markup.'</td>'.
+          '<th></th>'.
+          '<td>'.$right_markup.'</td>'.
+        '</tr>'.
+      '</table>';
   }
 
 }
diff --git a/webroot/rsrc/js/application/differential/behavior-edit-inline-comments.js b/webroot/rsrc/js/application/differential/behavior-edit-inline-comments.js
index a071abf7e..bac90bde4 100644
--- a/webroot/rsrc/js/application/differential/behavior-edit-inline-comments.js
+++ b/webroot/rsrc/js/application/differential/behavior-edit-inline-comments.js
@@ -1,236 +1,265 @@
 /**
  * @provides javelin-behavior-differential-edit-inline-comments
  * @requires javelin-lib-dev
  */
 
 JX.behavior('differential-edit-inline-comments', function(config) {
 
   var selecting = false;
   var reticle = JX.$N('div', {className: 'differential-reticle'});
   JX.DOM.hide(reticle);
   document.body.appendChild(reticle);
 
   var origin = null;
   var target = null;
   var root   = null;
   var changeset = null;
   var workflow = false;
   var is_new = false;
 
   function updateReticle() {
     var top = origin;
     var bot = target;
     if (JX.$V(top).y > JX.$V(bot).y) {
       var tmp = top;
       top = bot;
       bot = tmp;
     }
-
     var code = target.nextSibling;
 
     var pos = JX.$V(top).add(1 + JX.$V.getDim(target).x, 0);
     var dim = JX.$V.getDim(code).add(-4, 0);
     dim.y = (JX.$V(bot).y - pos.y) + JX.$V.getDim(bot).y;
 
     pos.setPos(reticle);
     dim.setDim(reticle);
 
     JX.DOM.show(reticle);
   }
 
   function hideReticle() {
     JX.DOM.hide(reticle);
   }
 
   function finishSelect() {
     selecting = false;
     workflow = false;
     hideReticle();
   }
 
   function drawInlineComment(table, anchor, r) {
     copyRows(table, JX.$N('div', JX.HTML(r.markup)), anchor);
     finishSelect();
   }
 
   function isOnRight(node) {
     return node.parentNode.firstChild != node;
   }
 
   function isNewFile(node) {
     var data = JX.Stratcom.getData(root);
     return isOnRight(node) || (data.left != data.right);
   }
 
   function getRowNumber(th_node) {
     try {
       return parseInt(th_node.id.match(/^C\d+[ON]L(\d+)$/)[1], 10);
     } catch (x) {
       return undefined;
     }
   }
 
+  function isInlineCommentNode(target) {
+    return target &&
+            (!JX.DOM.isType(target, 'tr')
+             || target.className.indexOf('inline') !== -1);
+
+  }
+
+  function findInlineCommentTarget(target) {
+    while (isInlineCommentNode(target)) {
+      target = target.nextSibling;
+    }
+    return target;
+  }
+
   JX.Stratcom.listen(
     'mousedown',
     ['differential-changeset', 'tag:th'],
     function(e) {
       if (workflow  ||
           selecting ||
           getRowNumber(e.getTarget()) === undefined) {
         return;
       }
 
       selecting = true;
       root = e.getNode('differential-changeset');
 
       origin = target = e.getTarget();
 
       var data = e.getNodeData('differential-changeset');
       if (isOnRight(target)) {
         changeset = data.left;
       } else {
         changeset = data.right;
       }
 
       updateReticle();
 
       e.kill();
     });
 
   JX.Stratcom.listen(
     'mouseover',
     ['differential-changeset', 'tag:th'],
     function(e) {
       if (!selecting ||
           workflow ||
           (getRowNumber(e.getTarget()) === undefined) ||
           (isOnRight(e.getTarget()) != isOnRight(origin)) ||
           (e.getNode('differential-changeset') !== root)) {
         return;
       }
 
       target = e.getTarget();
 
       updateReticle();
     });
 
   JX.Stratcom.listen(
     'mouseup',
     null,
     function(e) {
       if (workflow || !selecting) {
         return;
       }
 
       var o = getRowNumber(origin);
       var t = getRowNumber(target);
 
       var insert;
       var len;
       if (t < o) {
         len = (o - t);
         o = t;
         insert = origin.parentNode;
       } else {
         len = (t - o);
         insert = target.parentNode;
       }
 
       var data = {
         op: 'new',
         changeset: changeset,
         number: o,
         length: len,
         is_new: isNewFile(target) ? 1 : 0,
         on_right: isOnRight(target) ? 1 : 0
       };
 
       workflow = true;
 
       var w = new JX.Workflow(config.uri, data)
         .setHandler(function(r) {
           // Skip over any rows which contain inline feedback. Don't mimic this!
           // We're shipping around raw HTML here for performance reasons, but
           // normally you should use sigils to encode this kind of data on
           // the document.
-          var target = insert.nextSibling;
-          while (target &&
-                 (!JX.DOM.isType(target, 'tr')
-                  || target.className.indexOf('inline') !== -1)) {
-            target = target.nextSibling;
-          }
+          var target = findInlineCommentTarget(insert.nextSibling);
           drawInlineComment(insert.parentNode, target, r);
           finishSelect();
           JX.Stratcom.invoke('differential-inline-comment-update');
         })
         .setCloseHandler(finishSelect);
 
 
       w.listen('error', function(e) {
         // TODO: uh, tell the user I guess
         finishSelect();
         JX.Stratcom.context().stop();
       });
 
       w.start();
 
       e.kill();
     });
 
   JX.Stratcom.listen(
     ['mouseover', 'mouseout'],
     'differential-inline-comment',
     function(e) {
       if (selecting || workflow) {
         return;
       }
 
       if (e.getType() == 'mouseout') {
         hideReticle();
       } else {
         root = e.getNode('differential-changeset');
 
         var data = e.getNodeData('differential-inline-comment');
         var change = e.getNodeData('differential-changeset');
 
         var prefix;
         if (data.on_right) {
           prefix = 'C' + (change.left) + 'NL';
         } else {
           prefix = 'C' + (change.right) + 'OL';
         }
 
         origin = JX.$(prefix + data.number);
         target = JX.$(prefix + (parseInt(data.number, 10) +
                                 parseInt(data.length, 10)));
 
         updateReticle();
       }
     });
 
+  JX.Stratcom.listen(
+    'click',
+    [['differential-inline-comment', 'differential-inline-reply']],
+    function(e) {
+      new JX.Workflow(config.uri, e.getNodeData('differential-inline-reply'))
+        .setHandler(function(r) {
+          var base_row =
+            findInlineCommentTarget(
+              e.getNode('differential-inline-comment')
+               .parentNode
+               .parentNode
+            );
+          drawInlineComment(base_row.parentNode, base_row, r);
+          JX.Stratcom.invoke('differential-inline-comment-update');
+        })
+        .start();
+
+      e.kill();
+    }
+  );
+
   JX.Stratcom.listen(
     'click',
     [['differential-inline-comment', 'differential-inline-delete'],
      ['differential-inline-comment', 'differential-inline-edit']],
     function(e) {
       var data = {
         op: e.getNode('differential-inline-edit') ? 'edit' : 'delete',
         id: e.getNodeData('differential-inline-comment').id,
         on_right: e.getNodeData('differential-inline-comment').on_right,
       };
       new JX.Workflow(config.uri, data)
         .setHandler(function(r) {
           var base_row = e.getNode('differential-inline-comment')
             .parentNode
             .parentNode;
           if (data.op == 'edit' && r.markup) {
             drawInlineComment(base_row.parentNode, base_row, r);
           }
           JX.DOM.remove(base_row);
           JX.Stratcom.invoke('differential-inline-comment-update');
         })
         .start();
       e.kill();
     });
 
 });