diff --git a/src/applications/nuance/controller/NuanceQueueEditController.php b/src/applications/nuance/controller/NuanceQueueEditController.php
--- a/src/applications/nuance/controller/NuanceQueueEditController.php
+++ b/src/applications/nuance/controller/NuanceQueueEditController.php
@@ -2,43 +2,36 @@
 
 final class NuanceQueueEditController extends NuanceController {
 
-  private $queueID;
+  public function handleRequest(AphrontRequest $request) {
+    $viewer = $this->getViewer();
 
-  public function setQueueID($queue_id) {
-    $this->queueID = $queue_id;
-    return $this;
-  }
-  public function getQueueID() {
-    return $this->queueID;
-  }
-
-  public function willProcessRequest(array $data) {
-    $this->setQueueID(idx($data, 'id'));
-  }
-
-  public function processRequest() {
-    $request = $this->getRequest();
-    $user = $request->getUser();
-
-    $queue_id = $this->getQueueID();
+    $queue_id = $request->getURIData('id');
     $is_new = !$queue_id;
-
     if ($is_new) {
-      $queue = new NuanceQueue();
-
+      $queue = NuanceQueue::initializeNewQueue();
     } else {
       $queue = id(new NuanceQueueQuery())
-        ->setViewer($user)
+        ->setViewer($viewer)
         ->withIDs(array($queue_id))
         ->executeOne();
-    }
-
-    if (!$queue) {
-      return new Aphront404Response();
+      if (!$queue) {
+        return new Aphront404Response();
+      }
     }
 
     $crumbs = $this->buildApplicationCrumbs();
-    $title = 'TODO';
+    $crumbs->addTextCrumb(
+      pht('Queues'),
+      $this->getApplicationURI('queue/'));
+
+    if ($is_new) {
+      $title = pht('Create Queue');
+      $crumbs->addTextCrumb(pht('Create'));
+    } else {
+      $title = pht('Edit %s', $queue->getName());
+      $crumbs->addTextCrumb($queue->getName(), $queue->getURI());
+      $crumbs->addTextCrumb(pht('Edit'));
+    }
 
     return $this->buildApplicationPage(
       $crumbs,
diff --git a/src/applications/nuance/query/NuanceQueueQuery.php b/src/applications/nuance/query/NuanceQueueQuery.php
--- a/src/applications/nuance/query/NuanceQueueQuery.php
+++ b/src/applications/nuance/query/NuanceQueueQuery.php
@@ -18,39 +18,38 @@
 
   protected function loadPage() {
     $table = new NuanceQueue();
-    $conn_r = $table->establishConnection('r');
+    $conn = $table->establishConnection('r');
 
     $data = queryfx_all(
-      $conn_r,
-      'SELECT FROM %T %Q %Q %Q',
+      $conn,
+      '%Q FROM %T %Q %Q %Q',
+      $this->buildSelectClause($conn),
       $table->getTableName(),
-      $this->buildWhereClause($conn_r),
-      $this->buildOrderClause($conn_r),
-      $this->buildLimitClause($conn_r));
+      $this->buildWhereClause($conn),
+      $this->buildOrderClause($conn),
+      $this->buildLimitClause($conn));
 
     return $table->loadAllFromArray($data);
   }
 
-  protected function buildWhereClause(AphrontDatabaseConnection $conn_r) {
-    $where = array();
+  protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) {
+    $where = parent::buildWhereClauseParts($conn);
 
-    $where[] = $this->buildPagingClause($conn_r);
-
-    if ($this->ids) {
+    if ($this->ids !== null) {
       $where[] = qsprintf(
-        $conn_r,
+        $conn,
         'id IN (%Ld)',
         $this->ids);
     }
 
-    if ($this->phids) {
+    if ($this->phids !== null) {
       $where[] = qsprintf(
-        $conn_r,
+        $conn,
         'phid IN (%Ls)',
         $this->phids);
     }
 
-    return $this->formatWhereClause($where);
+    return $where;
   }
 
 }
diff --git a/src/applications/nuance/storage/NuanceQueue.php b/src/applications/nuance/storage/NuanceQueue.php
--- a/src/applications/nuance/storage/NuanceQueue.php
+++ b/src/applications/nuance/storage/NuanceQueue.php
@@ -2,7 +2,9 @@
 
 final class NuanceQueue
   extends NuanceDAO
-  implements PhabricatorPolicyInterface {
+  implements
+    PhabricatorPolicyInterface,
+    PhabricatorApplicationTransactionInterface {
 
   protected $name;
   protected $mailKey;
@@ -24,6 +26,10 @@
       NuanceQueuePHIDType::TYPECONST);
   }
 
+  public static function initializeNewQueue() {
+    return new NuanceQueue();
+  }
+
   public function save() {
     if (!$this->getMailKey()) {
       $this->setMailKey(Filesystem::readRandomCharacters(20));
@@ -35,6 +41,10 @@
     return '/nuance/queue/view/'.$this->getID().'/';
   }
 
+
+/* -(  PhabricatorPolicyInterface  )----------------------------------------- */
+
+
   public function getCapabilities() {
     return array(
       PhabricatorPolicyCapability::CAN_VIEW,
@@ -59,4 +69,26 @@
     return null;
   }
 
+
+/* -(  PhabricatorApplicationTransactionInterface  )------------------------- */
+
+
+  public function getApplicationTransactionEditor() {
+    return new NuanceQueueEditor();
+  }
+
+  public function getApplicationTransactionObject() {
+    return $this;
+  }
+
+  public function getApplicationTransactionTemplate() {
+    return new NuanceQueueTransaction();
+  }
+
+  public function willRenderTimeline(
+    PhabricatorApplicationTransactionView $timeline,
+    AphrontRequest $request) {
+    return $timeline;
+  }
+
 }