diff --git a/resources/celerity/map.php b/resources/celerity/map.php
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -9,7 +9,7 @@
   'names' => array(
     'conpherence.pkg.css' => '3c8a0668',
     'conpherence.pkg.js' => '020aebcf',
-    'core.pkg.css' => '5a4a5010',
+    'core.pkg.css' => 'c69171e6',
     'core.pkg.js' => '73a06a9f',
     'differential.pkg.css' => '8d8360fb',
     'differential.pkg.js' => '0b037a4f',
@@ -155,7 +155,7 @@
     'rsrc/css/phui/phui-form-view.css' => '01b796c0',
     'rsrc/css/phui/phui-form.css' => '159e2d9c',
     'rsrc/css/phui/phui-head-thing.css' => 'd7f293df',
-    'rsrc/css/phui/phui-header-view.css' => '285c9139',
+    'rsrc/css/phui/phui-header-view.css' => 'b500eeea',
     'rsrc/css/phui/phui-hovercard.css' => '6ca90fa0',
     'rsrc/css/phui/phui-icon-set-selector.css' => '7aa5f3ec',
     'rsrc/css/phui/phui-icon.css' => '4cbc684a',
@@ -168,6 +168,7 @@
     'rsrc/css/phui/phui-object-box.css' => 'f434b6be',
     'rsrc/css/phui/phui-pager.css' => 'd022c7ad',
     'rsrc/css/phui/phui-pinboard-view.css' => '1f08f5d8',
+    'rsrc/css/phui/phui-policy-section-view.css' => '139fdc64',
     'rsrc/css/phui/phui-property-list-view.css' => 'cad62236',
     'rsrc/css/phui/phui-remarkup-preview.css' => '91767007',
     'rsrc/css/phui/phui-segment-bar-view.css' => '5166b370',
@@ -842,7 +843,7 @@
     'phui-form-css' => '159e2d9c',
     'phui-form-view-css' => '01b796c0',
     'phui-head-thing-view-css' => 'd7f293df',
-    'phui-header-view-css' => '285c9139',
+    'phui-header-view-css' => 'b500eeea',
     'phui-hovercard' => '074f0783',
     'phui-hovercard-view-css' => '6ca90fa0',
     'phui-icon-set-selector-css' => '7aa5f3ec',
@@ -863,6 +864,7 @@
     'phui-oi-simple-ui-css' => '6a30fa46',
     'phui-pager-css' => 'd022c7ad',
     'phui-pinboard-view-css' => '1f08f5d8',
+    'phui-policy-section-view-css' => '139fdc64',
     'phui-property-list-view-css' => 'cad62236',
     'phui-remarkup-preview-css' => '91767007',
     'phui-segment-bar-view-css' => '5166b370',
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -4198,6 +4198,7 @@
     'PhabricatorPolicyRef' => 'applications/policy/view/PhabricatorPolicyRef.php',
     'PhabricatorPolicyRequestExceptionHandler' => 'aphront/handler/PhabricatorPolicyRequestExceptionHandler.php',
     'PhabricatorPolicyRule' => 'applications/policy/rule/PhabricatorPolicyRule.php',
+    'PhabricatorPolicyRulesView' => 'applications/policy/view/PhabricatorPolicyRulesView.php',
     'PhabricatorPolicySearchEngineExtension' => 'applications/policy/engineextension/PhabricatorPolicySearchEngineExtension.php',
     'PhabricatorPolicyStrengthConstants' => 'applications/policy/constants/PhabricatorPolicyStrengthConstants.php',
     'PhabricatorPolicyTestCase' => 'applications/policy/__tests__/PhabricatorPolicyTestCase.php',
@@ -10679,6 +10680,7 @@
     'PhabricatorPolicyRef' => 'Phobject',
     'PhabricatorPolicyRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler',
     'PhabricatorPolicyRule' => 'Phobject',
+    'PhabricatorPolicyRulesView' => 'AphrontView',
     'PhabricatorPolicySearchEngineExtension' => 'PhabricatorSearchEngineExtension',
     'PhabricatorPolicyStrengthConstants' => 'PhabricatorPolicyConstants',
     'PhabricatorPolicyTestCase' => 'PhabricatorTestCase',
diff --git a/src/applications/policy/controller/PhabricatorPolicyExplainController.php b/src/applications/policy/controller/PhabricatorPolicyExplainController.php
--- a/src/applications/policy/controller/PhabricatorPolicyExplainController.php
+++ b/src/applications/policy/controller/PhabricatorPolicyExplainController.php
@@ -318,7 +318,7 @@
       ->setViewer($viewer)
       ->setIcon($handle->getIcon().' bluegrey')
       ->setHeader(pht('Object Policy'))
-      ->appendList(
+      ->appendParagraph(
         array(
           array(
             phutil_tag('strong', array(), pht('%s:', $capability_name)),
@@ -337,6 +337,13 @@
             $policy->getPHID()),
         ));
 
+    if ($policy->isCustomPolicy()) {
+      $rules_view = id(new PhabricatorPolicyRulesView())
+        ->setViewer($viewer)
+        ->setPolicy($policy);
+      $object_section->appendRulesView($rules_view);
+    }
+
     $strength = $this->getStrengthInformation($object, $policy, $capability);
     if ($strength) {
       $object_section->appendHint($strength);
diff --git a/src/applications/policy/view/PHUIPolicySectionView.php b/src/applications/policy/view/PHUIPolicySectionView.php
--- a/src/applications/policy/view/PHUIPolicySectionView.php
+++ b/src/applications/policy/view/PHUIPolicySectionView.php
@@ -93,6 +93,16 @@
     return $this->appendChild(phutil_tag('p', array(), $content));
   }
 
+  public function appendRulesView(PhabricatorPolicyRulesView $rules_view) {
+    return $this->appendChild(
+      phutil_tag(
+        'div',
+        array(
+          'class' => 'phui-policy-section-view-rules',
+        ),
+        $rules_view));
+  }
+
   protected function getTagAttributes() {
     return array(
       'class' => 'phui-policy-section-view',
@@ -100,7 +110,7 @@
   }
 
   protected function getTagContent() {
-    require_celerity_resource('phui-header-view-css');
+    require_celerity_resource('phui-policy-section-view-css');
 
     $icon_view = null;
     $icon = $this->getIcon();
diff --git a/src/applications/policy/view/PhabricatorPolicyRulesView.php b/src/applications/policy/view/PhabricatorPolicyRulesView.php
new file mode 100644
--- /dev/null
+++ b/src/applications/policy/view/PhabricatorPolicyRulesView.php
@@ -0,0 +1,84 @@
+<?php
+
+final class PhabricatorPolicyRulesView
+  extends AphrontView {
+
+  private $policy;
+
+  public function setPolicy(PhabricatorPolicy $policy) {
+    $this->policy = $policy;
+    return $this;
+  }
+
+  public function getPolicy() {
+    return $this->policy;
+  }
+
+  public function render() {
+    $policy = $this->getPolicy();
+
+    require_celerity_resource('policy-transaction-detail-css');
+
+    $rule_objects = array();
+    foreach ($policy->getCustomRuleClasses() as $class) {
+      $rule_objects[$class] = newv($class, array());
+    }
+
+    $policy = clone $policy;
+    $policy->attachRuleObjects($rule_objects);
+
+    $details = array();
+    $details[] = phutil_tag(
+      'p',
+      array(
+        'class' => 'policy-transaction-detail-intro',
+      ),
+      pht('These rules are processed in order:'));
+
+    foreach ($policy->getRules() as $index => $rule) {
+      $rule_object = $rule_objects[$rule['rule']];
+      if ($rule['action'] == 'allow') {
+        $icon = 'fa-check-circle green';
+      } else {
+        $icon = 'fa-minus-circle red';
+      }
+      $icon = id(new PHUIIconView())
+        ->setIcon($icon)
+        ->setText(
+          ucfirst($rule['action']).' '.$rule_object->getRuleDescription());
+
+      $handle_phids = $rule_object->getRequiredHandlePHIDsForSummary(
+        $rule['value']);
+      if ($handle_phids) {
+        $value = $this->getViewer()
+          ->renderHandleList($handle_phids)
+          ->setAsInline(true);
+      } else {
+        $value = $rule['value'];
+      }
+
+      $details[] = phutil_tag('div',
+        array(
+          'class' => 'policy-transaction-detail-row',
+        ),
+        array(
+          $icon,
+          $value,
+        ));
+    }
+
+    $details[] = phutil_tag(
+      'p',
+      array(
+        'class' => 'policy-transaction-detail-end',
+      ),
+      pht(
+        'If no rules match, %s all other users.',
+        phutil_tag('b',
+        array(),
+        $policy->getDefaultAction())));
+
+    return $details;
+  }
+
+}
diff --git a/src/applications/transactions/controller/PhabricatorApplicationTransactionValueController.php b/src/applications/transactions/controller/PhabricatorApplicationTransactionValueController.php
--- a/src/applications/transactions/controller/PhabricatorApplicationTransactionValueController.php
+++ b/src/applications/transactions/controller/PhabricatorApplicationTransactionValueController.php
@@ -58,89 +58,16 @@
       return new Aphront404Response();
     }
 
-    $rule_objects = array();
-    foreach ($policy->getCustomRuleClasses() as $class) {
-      $rule_objects[$class] = newv($class, array());
-    }
-    $policy->attachRuleObjects($rule_objects);
+    $rules_view = id(new PhabricatorPolicyRulesView())
+      ->setViewer($viewer)
+      ->setPolicy($policy);
 
-    $this->requireResource('policy-transaction-detail-css');
     $cancel_uri = $this->guessCancelURI($viewer, $xaction);
 
     return $this->newDialog()
       ->setTitle($policy->getFullName())
       ->setWidth(AphrontDialogView::WIDTH_FORM)
-      ->appendChild($this->renderPolicyDetails($policy, $rule_objects))
+      ->appendChild($rules_view)
       ->addCancelButton($cancel_uri, pht('Close'));
   }
-
-  private function extractPHIDs(
-    PhabricatorPolicy $policy,
-    array $rule_objects) {
-
-    $phids = array();
-    foreach ($policy->getRules() as $rule) {
-      $rule_object = $rule_objects[$rule['rule']];
-      $phids[] =
-        $rule_object->getRequiredHandlePHIDsForSummary($rule['value']);
-    }
-    return array_filter(array_mergev($phids));
-  }
-
-  private function renderPolicyDetails(
-    PhabricatorPolicy $policy,
-    array $rule_objects) {
-    $details = array();
-    $details[] = phutil_tag(
-      'p',
-      array(
-        'class' => 'policy-transaction-detail-intro',
-      ),
-      pht('These rules are processed in order:'));
-
-    foreach ($policy->getRules() as $index => $rule) {
-      $rule_object = $rule_objects[$rule['rule']];
-      if ($rule['action'] == 'allow') {
-        $icon = 'fa-check-circle green';
-      } else {
-        $icon = 'fa-minus-circle red';
-      }
-      $icon = id(new PHUIIconView())
-        ->setIcon($icon)
-        ->setText(
-          ucfirst($rule['action']).' '.$rule_object->getRuleDescription());
-
-      $handle_phids = $rule_object->getRequiredHandlePHIDsForSummary(
-        $rule['value']);
-      if ($handle_phids) {
-        $value = $this->getViewer()
-          ->renderHandleList($handle_phids)
-          ->setAsInline(true);
-      } else {
-        $value = $rule['value'];
-      }
-
-      $details[] = phutil_tag('div',
-        array(
-          'class' => 'policy-transaction-detail-row',
-        ),
-        array(
-          $icon,
-          $value,
-        ));
-    }
-
-    $details[] = phutil_tag(
-      'p',
-      array(
-        'class' => 'policy-transaction-detail-end',
-      ),
-      pht(
-        'If no rules match, %s all other users.',
-        phutil_tag('b',
-        array(),
-        $policy->getDefaultAction())));
-    return $details;
-  }
-
 }
diff --git a/webroot/rsrc/css/phui/phui-header-view.css b/webroot/rsrc/css/phui/phui-header-view.css
--- a/webroot/rsrc/css/phui/phui-header-view.css
+++ b/webroot/rsrc/css/phui/phui-header-view.css
@@ -354,45 +354,3 @@
 .phui-header-view .phui-tag-indigo a {
   color: {$sh-indigotext};
 }
-
-.phui-policy-section-view {
-  margin-bottom: 24px;
-}
-
-.phui-policy-section-view-header {
-  background: {$bluebackground};
-  border-bottom: 1px solid {$lightblueborder};
-  padding: 4px 8px;
-  color: {$darkbluetext};
-  margin-bottom: 8px;
-}
-
-.phui-policy-section-view-header-text {
-  font-weight: bold;
-}
-
-.phui-policy-section-view-header .phui-icon-view {
-  margin-right: 8px;
-}
-
-.phui-policy-section-view-link {
-  float: right;
-}
-
-.phui-policy-section-view-link .phui-icon-view {
-  color: {$bluetext};
-}
-
-.phui-policy-section-view-hint {
-  color: {$greytext};
-  background: {$lightbluebackground};
-  padding: 8px;
-}
-
-.phui-policy-section-view-body {
-  padding: 0 12px;
-}
-
-.phui-policy-section-view-inactive-rule {
-  color: {$greytext};
-}
diff --git a/webroot/rsrc/css/phui/phui-policy-section-view.css b/webroot/rsrc/css/phui/phui-policy-section-view.css
new file mode 100644
--- /dev/null
+++ b/webroot/rsrc/css/phui/phui-policy-section-view.css
@@ -0,0 +1,62 @@
+/**
+ * @provides phui-policy-section-view-css
+ */
+
+.phui-policy-section-view {
+  margin-bottom: 24px;
+}
+
+.phui-policy-section-view-header {
+  background: {$bluebackground};
+  border-bottom: 1px solid {$lightblueborder};
+  padding: 4px 8px;
+  color: {$darkbluetext};
+  margin-bottom: 8px;
+}
+
+.phui-policy-section-view-header-text {
+  font-weight: bold;
+}
+
+.phui-policy-section-view-header .phui-icon-view {
+  margin-right: 8px;
+}
+
+.phui-policy-section-view-link {
+  float: right;
+}
+
+.phui-policy-section-view-link .phui-icon-view {
+  color: {$bluetext};
+}
+
+.phui-policy-section-view-hint {
+  color: {$greytext};
+  background: {$lightbluebackground};
+  padding: 8px;
+}
+
+.phui-policy-section-view-body {
+  padding: 0 12px;
+}
+
+.phui-policy-section-view-inactive-rule {
+  color: {$greytext};
+}
+
+.phui-policy-section-view-rules {
+  margin: 8px 0;
+  padding: 8px;
+  background: {$lightbluebackground};
+  border: 1px solid {$lightblueborder};
+}
+
+.phui-policy-section-view .phui-policy-section-view-body ul {
+  margin: 8px 0;
+  padding: 0 16px 0 24px;
+  list-style: disc;
+}
+
+.phui-policy-section-view .phui-policy-section-view-body p + p {
+  margin-top: 8px;
+}