diff --git a/resources/celerity/map.php b/resources/celerity/map.php
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -411,7 +411,7 @@
     'rsrc/js/application/phortune/behavior-stripe-payment-form.js' => '3f5d6dbf',
     'rsrc/js/application/phortune/behavior-test-payment-form.js' => 'fc91ab6c',
     'rsrc/js/application/phortune/phortune-credit-card-form.js' => '2290aeef',
-    'rsrc/js/application/policy/behavior-policy-control.js' => '1ed33505',
+    'rsrc/js/application/policy/behavior-policy-control.js' => '9a340b3d',
     'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '5e9f347c',
     'rsrc/js/application/ponder/behavior-votebox.js' => '4e9b766b',
     'rsrc/js/application/projects/behavior-project-boards.js' => '60292820',
@@ -639,7 +639,7 @@
     'javelin-behavior-pholio-mock-view' => 'e58bf807',
     'javelin-behavior-phui-object-box-tabs' => '2bfa2836',
     'javelin-behavior-phui-timeline-dropdown-menu' => '4d94d9c3',
-    'javelin-behavior-policy-control' => '1ed33505',
+    'javelin-behavior-policy-control' => '9a340b3d',
     'javelin-behavior-policy-rule-editor' => '5e9f347c',
     'javelin-behavior-ponder-votebox' => '4e9b766b',
     'javelin-behavior-project-boards' => '60292820',
@@ -954,15 +954,6 @@
       'javelin-dom',
       'javelin-reactor-dom',
     ),
-    '1ed33505' => array(
-      'javelin-behavior',
-      'javelin-dom',
-      'javelin-util',
-      'phuix-dropdown-menu',
-      'phuix-action-list-view',
-      'phuix-action-view',
-      'javelin-workflow',
-    ),
     '2035b9cb' => array(
       'javelin-behavior',
       'javelin-dom',
@@ -1604,6 +1595,15 @@
       'javelin-dom',
       'javelin-reactor-dom',
     ),
+    '9a340b3d' => array(
+      'javelin-behavior',
+      'javelin-dom',
+      'javelin-util',
+      'phuix-dropdown-menu',
+      'phuix-action-list-view',
+      'phuix-action-view',
+      'javelin-workflow',
+    ),
     '9c2623f4' => array(
       'javelin-behavior',
       'javelin-stratcom',
diff --git a/src/applications/policy/controller/PhabricatorPolicyEditController.php b/src/applications/policy/controller/PhabricatorPolicyEditController.php
--- a/src/applications/policy/controller/PhabricatorPolicyEditController.php
+++ b/src/applications/policy/controller/PhabricatorPolicyEditController.php
@@ -3,13 +3,7 @@
 final class PhabricatorPolicyEditController
   extends PhabricatorPolicyController {
 
-  private $phid;
-
-  public function willProcessRequest(array $data) {
-    $this->phid = idx($data, 'phid');
-  }
-
-  public function processRequest() {
+  public function handleRequest(AphrontRequest $request) {
     $request = $this->getRequest();
     $viewer = $request->getUser();
 
@@ -29,10 +23,11 @@
       'value' => null,
     );
 
-    if ($this->phid) {
+    $phid = $request->getURIData('phid');
+    if ($phid) {
       $policies = id(new PhabricatorPolicyQuery())
         ->setViewer($viewer)
-        ->withPHIDs(array($this->phid))
+        ->withPHIDs(array($phid))
         ->execute();
       if (!$policies) {
         return new Aphront404Response();
@@ -208,10 +203,18 @@
         'defaultRule' => $default_rule,
       ));
 
+    $title = pht('Custom Policy');
+
+    $key = $request->getStr('capability');
+    if ($key) {
+      $capability = PhabricatorPolicyCapability::getCapabilityByKey($key);
+      $title = pht('Custom "%s" Policy', $capability->getCapabilityName());
+    }
+
     $dialog = id(new AphrontDialogView())
       ->setWidth(AphrontDialogView::WIDTH_FULL)
       ->setUser($viewer)
-      ->setTitle(pht('Edit Policy'))
+      ->setTitle($title)
       ->appendChild($form)
       ->addSubmitButton(pht('Save Policy'))
       ->addCancelButton('#');
diff --git a/src/view/form/control/AphrontFormPolicyControl.php b/src/view/form/control/AphrontFormPolicyControl.php
--- a/src/view/form/control/AphrontFormPolicyControl.php
+++ b/src/view/form/control/AphrontFormPolicyControl.php
@@ -179,6 +179,7 @@
         'icons' => $icons,
         'labels' => $labels,
         'value' => $this->getValue(),
+        'capability' => $this->capability,
         'customPlaceholder' => $this->getCustomPolicyPlaceholder(),
       ));
 
diff --git a/webroot/rsrc/js/application/policy/behavior-policy-control.js b/webroot/rsrc/js/application/policy/behavior-policy-control.js
--- a/webroot/rsrc/js/application/policy/behavior-policy-control.js
+++ b/webroot/rsrc/js/application/policy/behavior-policy-control.js
@@ -35,7 +35,7 @@
         var onselect;
         if (group == 'custom') {
           onselect = JX.bind(null, function(phid) {
-            var uri = get_custom_uri(phid);
+            var uri = get_custom_uri(phid, config.capability);
 
             new JX.Workflow(uri)
               .setHandler(function(response) {
@@ -100,11 +100,12 @@
   /**
    * Get the workflow URI to create or edit a policy with a given PHID.
    */
-  var get_custom_uri = function(phid) {
+  var get_custom_uri = function(phid, capability) {
     var uri = '/policy/edit/';
     if (phid != config.customPlaceholder) {
       uri += phid + '/';
     }
+    uri += '?capability=' + capability;
     return uri;
   };