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
@@ -1498,6 +1498,7 @@
     'PhabricatorDashboardPanelSearchApplicationCustomField' => 'applications/dashboard/customfield/PhabricatorDashboardPanelSearchApplicationCustomField.php',
     'PhabricatorDashboardPanelSearchEngine' => 'applications/dashboard/query/PhabricatorDashboardPanelSearchEngine.php',
     'PhabricatorDashboardPanelSearchQueryCustomField' => 'applications/dashboard/customfield/PhabricatorDashboardPanelSearchQueryCustomField.php',
+    'PhabricatorDashboardPanelTabsCustomField' => 'applications/dashboard/customfield/PhabricatorDashboardPanelTabsCustomField.php',
     'PhabricatorDashboardPanelTransaction' => 'applications/dashboard/storage/PhabricatorDashboardPanelTransaction.php',
     'PhabricatorDashboardPanelTransactionEditor' => 'applications/dashboard/editor/PhabricatorDashboardPanelTransactionEditor.php',
     'PhabricatorDashboardPanelTransactionQuery' => 'applications/dashboard/query/PhabricatorDashboardPanelTransactionQuery.php',
@@ -4319,6 +4320,7 @@
     'PhabricatorDashboardPanelSearchApplicationCustomField' => 'PhabricatorStandardCustomField',
     'PhabricatorDashboardPanelSearchEngine' => 'PhabricatorApplicationSearchEngine',
     'PhabricatorDashboardPanelSearchQueryCustomField' => 'PhabricatorStandardCustomField',
+    'PhabricatorDashboardPanelTabsCustomField' => 'PhabricatorStandardCustomField',
     'PhabricatorDashboardPanelTransaction' => 'PhabricatorApplicationTransaction',
     'PhabricatorDashboardPanelTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
     'PhabricatorDashboardPanelTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
diff --git a/src/applications/dashboard/customfield/PhabricatorDashboardPanelTabsCustomField.php b/src/applications/dashboard/customfield/PhabricatorDashboardPanelTabsCustomField.php
new file mode 100644
--- /dev/null
+++ b/src/applications/dashboard/customfield/PhabricatorDashboardPanelTabsCustomField.php
@@ -0,0 +1,71 @@
+<?php
+
+final class PhabricatorDashboardPanelTabsCustomField
+  extends PhabricatorStandardCustomField {
+
+  public function getFieldType() {
+    return 'dashboard.tabs';
+  }
+
+  public function shouldAppearInApplicationSearch() {
+    return false;
+  }
+
+  public function readValueFromRequest(AphrontRequest $request) {
+    $value = array();
+
+    $names = $request->getArr($this->getFieldKey().'_name');
+    $panels = $request->getArr($this->getFieldKey().'_panelID');
+    foreach ($names as $idx => $name) {
+      $panel_id = idx($panels, $idx);
+      if (strlen($name) && $panel_id) {
+        $value[] = array(
+          'name' => $name,
+          'panelID' => $panel_id,
+        );
+      }
+    }
+
+    $this->setFieldValue($value);
+  }
+
+  public function renderEditControl(array $handles) {
+    $panels = id(new PhabricatorDashboardPanelQuery())
+      ->setViewer($this->getViewer())
+      ->execute();
+
+    $panel_map = array();
+    foreach ($panels as $panel) {
+      $panel_map[$panel->getID()] = pht(
+        '%s %s',
+        $panel->getMonogram(),
+        $panel->getName());
+    }
+    $panel_map = array(
+      '' => pht('(None)'),
+    ) + $panel_map;
+
+    $value = $this->getFieldValue();
+    if (!is_array($value)) {
+      $value = array();
+    }
+
+    $out = array();
+    for ($ii = 1; $ii <= 6; $ii++) {
+      $tab = idx($value, ($ii - 1), array());
+      $out[] = id(new AphrontFormTextControl())
+        ->setName($this->getFieldKey().'_name[]')
+        ->setValue(idx($tab, 'name'))
+        ->setLabel(pht('Tab %d Name', $ii));
+
+      $out[] = id(new AphrontFormSelectControl())
+        ->setName($this->getFieldKey().'_panelID[]')
+        ->setValue(idx($tab, 'panelID'))
+        ->setOptions($panel_map)
+        ->setLabel(pht('Tab %d Panel', $ii));
+    }
+
+    return $out;
+  }
+
+}
diff --git a/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeTabs.php b/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeTabs.php
--- a/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeTabs.php
+++ b/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeTabs.php
@@ -19,8 +19,8 @@
   public function getFieldSpecifications() {
     return array(
       'config' => array(
-        'name' => pht('JSON Config'),
-        'type' => 'remarkup',
+        'name' => pht('Tabs'),
+        'type' => 'dashboard.tabs',
       ),
     );
   }
@@ -35,9 +35,13 @@
     PhabricatorDashboardPanel $panel,
     PhabricatorDashboardPanelRenderingEngine $engine) {
 
-    $config = phutil_json_decode($panel->getProperty('config'), null);
-    if ($config === null) {
-      throw new Exception(pht('The configuration is not valid JSON.'));
+    $config = $panel->getProperty('config');
+    if (!is_array($config)) {
+      // NOTE: The older version of this panel stored raw JSON.
+      $config = phutil_json_decode($config, null);
+      if ($config === null) {
+        throw new Exception(pht('The configuration is not valid JSON.'));
+      }
     }
 
     $list = id(new PHUIListView())