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
@@ -3708,6 +3708,7 @@
     'PhabricatorProjectWatcherListView' => 'applications/project/view/PhabricatorProjectWatcherListView.php',
     'PhabricatorProjectWorkboardBackgroundColor' => 'applications/project/constants/PhabricatorProjectWorkboardBackgroundColor.php',
     'PhabricatorProjectWorkboardProfileMenuItem' => 'applications/project/menuitem/PhabricatorProjectWorkboardProfileMenuItem.php',
+    'PhabricatorProjectWorkboardTransaction' => 'applications/project/xaction/PhabricatorProjectWorkboardTransaction.php',
     'PhabricatorProjectsAncestorsSearchEngineAttachment' => 'applications/project/engineextension/PhabricatorProjectsAncestorsSearchEngineAttachment.php',
     'PhabricatorProjectsCurtainExtension' => 'applications/project/engineextension/PhabricatorProjectsCurtainExtension.php',
     'PhabricatorProjectsEditEngineExtension' => 'applications/project/engineextension/PhabricatorProjectsEditEngineExtension.php',
@@ -9148,6 +9149,7 @@
     'PhabricatorProjectWatcherListView' => 'PhabricatorProjectUserListView',
     'PhabricatorProjectWorkboardBackgroundColor' => 'Phobject',
     'PhabricatorProjectWorkboardProfileMenuItem' => 'PhabricatorProfileMenuItem',
+    'PhabricatorProjectWorkboardTransaction' => 'PhabricatorProjectTransactionType',
     'PhabricatorProjectsAncestorsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment',
     'PhabricatorProjectsCurtainExtension' => 'PHUICurtainExtension',
     'PhabricatorProjectsEditEngineExtension' => 'PhabricatorEditEngineExtension',
diff --git a/src/applications/project/controller/PhabricatorProjectBoardDisableController.php b/src/applications/project/controller/PhabricatorProjectBoardDisableController.php
--- a/src/applications/project/controller/PhabricatorProjectBoardDisableController.php
+++ b/src/applications/project/controller/PhabricatorProjectBoardDisableController.php
@@ -33,7 +33,8 @@
       $xactions = array();
 
       $xactions[] = id(new PhabricatorProjectTransaction())
-        ->setTransactionType(PhabricatorProjectTransaction::TYPE_HASWORKBOARD)
+        ->setTransactionType(
+            PhabricatorProjectWorkboardTransaction::TRANSACTIONTYPE)
         ->setNewValue(0);
 
       id(new PhabricatorProjectTransactionEditor())
diff --git a/src/applications/project/controller/PhabricatorProjectBoardImportController.php b/src/applications/project/controller/PhabricatorProjectBoardImportController.php
--- a/src/applications/project/controller/PhabricatorProjectBoardImportController.php
+++ b/src/applications/project/controller/PhabricatorProjectBoardImportController.php
@@ -61,8 +61,18 @@
           ->setProperties($import_column->getProperties())
           ->save();
       }
+      $xactions = array();
+      $xactions[] = id(new PhabricatorProjectTransaction())
+        ->setTransactionType(
+            PhabricatorProjectWorkboardTransaction::TRANSACTIONTYPE)
+        ->setNewValue(1);
 
-      $project->setHasWorkboard(1)->save();
+      id(new PhabricatorProjectTransactionEditor())
+        ->setActor($viewer)
+        ->setContentSourceFromRequest($request)
+        ->setContinueOnNoEffect(true)
+        ->setContinueOnMissingFields(true)
+        ->applyTransactions($project, $xactions);
 
       $table->saveTransaction();
 
diff --git a/src/applications/project/controller/PhabricatorProjectBoardViewController.php b/src/applications/project/controller/PhabricatorProjectBoardViewController.php
--- a/src/applications/project/controller/PhabricatorProjectBoardViewController.php
+++ b/src/applications/project/controller/PhabricatorProjectBoardViewController.php
@@ -966,7 +966,18 @@
           ->setProjectPHID($project->getPHID())
           ->save();
 
-        $project->setHasWorkboard(1)->save();
+          $xactions = array();
+          $xactions[] = id(new PhabricatorProjectTransaction())
+            ->setTransactionType(
+                PhabricatorProjectWorkboardTransaction::TRANSACTIONTYPE)
+            ->setNewValue(1);
+
+          id(new PhabricatorProjectTransactionEditor())
+            ->setActor($viewer)
+            ->setContentSourceFromRequest($request)
+            ->setContinueOnNoEffect(true)
+            ->setContinueOnMissingFields(true)
+            ->applyTransactions($project, $xactions);
 
         return id(new AphrontRedirectResponse())
           ->setURI($board_uri);
@@ -1050,7 +1061,8 @@
       $xactions = array();
 
       $xactions[] = id(new PhabricatorProjectTransaction())
-        ->setTransactionType(PhabricatorProjectTransaction::TYPE_HASWORKBOARD)
+        ->setTransactionType(
+            PhabricatorProjectWorkboardTransaction::TRANSACTIONTYPE)
         ->setNewValue(1);
 
       id(new PhabricatorProjectTransactionEditor())
diff --git a/src/applications/project/editor/PhabricatorProjectTransactionEditor.php b/src/applications/project/editor/PhabricatorProjectTransactionEditor.php
--- a/src/applications/project/editor/PhabricatorProjectTransactionEditor.php
+++ b/src/applications/project/editor/PhabricatorProjectTransactionEditor.php
@@ -30,7 +30,6 @@
     $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY;
     $types[] = PhabricatorTransactions::TYPE_JOIN_POLICY;
 
-    $types[] = PhabricatorProjectTransaction::TYPE_HASWORKBOARD;
     $types[] = PhabricatorProjectTransaction::TYPE_DEFAULT_SORT;
     $types[] = PhabricatorProjectTransaction::TYPE_DEFAULT_FILTER;
     $types[] = PhabricatorProjectTransaction::TYPE_BACKGROUND;
@@ -43,8 +42,6 @@
     PhabricatorApplicationTransaction $xaction) {
 
     switch ($xaction->getTransactionType()) {
-      case PhabricatorProjectTransaction::TYPE_HASWORKBOARD:
-        return (int)$object->getHasWorkboard();
       case PhabricatorProjectTransaction::TYPE_DEFAULT_SORT:
         return $object->getDefaultWorkboardSort();
       case PhabricatorProjectTransaction::TYPE_DEFAULT_FILTER:
@@ -64,8 +61,6 @@
       case PhabricatorProjectTransaction::TYPE_DEFAULT_SORT:
       case PhabricatorProjectTransaction::TYPE_DEFAULT_FILTER:
         return $xaction->getNewValue();
-      case PhabricatorProjectTransaction::TYPE_HASWORKBOARD:
-        return (int)$xaction->getNewValue();
       case PhabricatorProjectTransaction::TYPE_BACKGROUND:
         $value = $xaction->getNewValue();
         if (!strlen($value)) {
@@ -82,9 +77,6 @@
     PhabricatorApplicationTransaction $xaction) {
 
     switch ($xaction->getTransactionType()) {
-      case PhabricatorProjectTransaction::TYPE_HASWORKBOARD:
-        $object->setHasWorkboard($xaction->getNewValue());
-        return;
       case PhabricatorProjectTransaction::TYPE_DEFAULT_SORT:
         $object->setDefaultWorkboardSort($xaction->getNewValue());
         return;
@@ -107,7 +99,6 @@
     $new = $xaction->getNewValue();
 
     switch ($xaction->getTransactionType()) {
-      case PhabricatorProjectTransaction::TYPE_HASWORKBOARD:
       case PhabricatorProjectTransaction::TYPE_DEFAULT_SORT:
       case PhabricatorProjectTransaction::TYPE_DEFAULT_FILTER:
       case PhabricatorProjectTransaction::TYPE_BACKGROUND:
diff --git a/src/applications/project/storage/PhabricatorProjectTransaction.php b/src/applications/project/storage/PhabricatorProjectTransaction.php
--- a/src/applications/project/storage/PhabricatorProjectTransaction.php
+++ b/src/applications/project/storage/PhabricatorProjectTransaction.php
@@ -3,7 +3,6 @@
 final class PhabricatorProjectTransaction
   extends PhabricatorModularTransaction {
 
-  const TYPE_HASWORKBOARD = 'project:hasworkboard';
   const TYPE_DEFAULT_SORT = 'project:sort';
   const TYPE_DEFAULT_FILTER = 'project:filter';
   const TYPE_BACKGROUND = 'project:background';
@@ -61,7 +60,6 @@
 
   public function shouldHideForFeed() {
     switch ($this->getTransactionType()) {
-      case self::TYPE_HASWORKBOARD:
       case self::TYPE_DEFAULT_SORT:
       case self::TYPE_DEFAULT_FILTER:
       case self::TYPE_BACKGROUND:
@@ -73,7 +71,7 @@
 
   public function shouldHideForMail(array $xactions) {
     switch ($this->getTransactionType()) {
-      case self::TYPE_HASWORKBOARD:
+      case PhabricatorProjectWorkboardTransaction::TRANSACTIONTYPE:
       case self::TYPE_DEFAULT_SORT:
       case self::TYPE_DEFAULT_FILTER:
       case self::TYPE_BACKGROUND:
@@ -142,17 +140,6 @@
         }
         break;
 
-      case self::TYPE_HASWORKBOARD:
-        if ($new) {
-          return pht(
-            '%s enabled the workboard for this project.',
-            $author_handle);
-        } else {
-          return pht(
-            '%s disabled the workboard for this project.',
-            $author_handle);
-        }
-
       case self::TYPE_DEFAULT_SORT:
         return pht(
           '%s changed the default sort order for the project workboard.',
diff --git a/src/applications/project/xaction/PhabricatorProjectWorkboardTransaction.php b/src/applications/project/xaction/PhabricatorProjectWorkboardTransaction.php
new file mode 100644
--- /dev/null
+++ b/src/applications/project/xaction/PhabricatorProjectWorkboardTransaction.php
@@ -0,0 +1,38 @@
+<?php
+
+final class PhabricatorProjectWorkboardTransaction
+  extends PhabricatorProjectTransactionType {
+
+  const TRANSACTIONTYPE = 'project:hasworkboard';
+
+  public function generateOldValue($object) {
+    return (int)$object->getHasWorkboard();
+  }
+
+  public function generateNewValue($object, $value) {
+    return (int)$value;
+  }
+
+  public function applyInternalEffects($object, $value) {
+    $object->setHasWorkboard($value);
+  }
+
+  public function getTitle() {
+    $new = $this->getNewValue();
+
+    if ($new) {
+      return pht(
+        '%s enabled the workboard for this project.',
+        $this->renderAuthor());
+    } else {
+      return pht(
+        '%s disabled the workboard for this project.',
+        $this->renderAuthor());
+    }
+  }
+
+  public function shouldHide() {
+    return true;
+  }
+
+}