Index: resources/sql/autopatches/20140108.ddbpname.1.sql
===================================================================
--- /dev/null
+++ resources/sql/autopatches/20140108.ddbpname.1.sql
@@ -0,0 +1,2 @@
+ALTER TABLE {$NAMESPACE}_drydock.drydock_blueprint
+  ADD blueprintName VARCHAR(255) NOT NULL AFTER className;
Index: resources/sql/autopatches/20140108.ddbpname.2.php
===================================================================
--- /dev/null
+++ resources/sql/autopatches/20140108.ddbpname.2.php
@@ -0,0 +1,23 @@
+<?php
+
+echo "Adding names to Drydock blueprints.\n";
+
+$table = new DrydockBlueprint();
+$conn_w = $table->establishConnection('w');
+$iterator = new LiskMigrationIterator($table);
+foreach ($iterator as $blueprint) {
+  $id = $blueprint->getID();
+
+  echo "Populating blueprint {$id}...\n";
+
+  if (!strlen($blueprint->getBlueprintName())) {
+    queryfx(
+      $conn_w,
+      'UPDATE %T SET blueprintName = %s WHERE id = %d',
+      $table->getTableName(),
+      pht('Blueprint %s', $id),
+      $id);
+  }
+}
+
+echo "Done.\n";
Index: src/applications/drydock/blueprint/DrydockPreallocatedHostBlueprintImplementation.php
===================================================================
--- src/applications/drydock/blueprint/DrydockPreallocatedHostBlueprintImplementation.php
+++ src/applications/drydock/blueprint/DrydockPreallocatedHostBlueprintImplementation.php
@@ -8,7 +8,7 @@
   }
 
   public function getBlueprintName() {
-    return pht('Remote Host (Preallocated)');
+    return pht('Preallocated Remote Hosts');
   }
 
   public function getDescription() {
Index: src/applications/drydock/controller/DrydockBlueprintEditController.php
===================================================================
--- src/applications/drydock/controller/DrydockBlueprintEditController.php
+++ src/applications/drydock/controller/DrydockBlueprintEditController.php
@@ -36,26 +36,42 @@
         return new Aphront400Response();
       }
 
-      $blueprint = new DrydockBlueprint();
+      $blueprint = DrydockBlueprint::initializeNewBlueprint($viewer);
       $blueprint->setClassName($class);
       $cancel_uri = $this->getApplicationURI('blueprint/');
     }
 
+    $v_name = $blueprint->getBlueprintName();
+    $e_name = true;
+    $errors = array();
 
     if ($request->isFormPost()) {
       $v_view_policy = $request->getStr('viewPolicy');
       $v_edit_policy = $request->getStr('editPolicy');
+      $v_name = $request->getStr('name');
+      if (!strlen($v_name)) {
+        $e_name = pht('Required');
+        $errors[] = pht('You must name this blueprint.');
+      }
 
-      // TODO: Should we use transactions here?
+      // TODO: We should use transactions here.
       $blueprint->setViewPolicy($v_view_policy);
       $blueprint->setEditPolicy($v_edit_policy);
+      $blueprint->setBlueprintName($v_name);
 
-      $blueprint->save();
+      if (!$errors) {
+        $blueprint->save();
 
-      $id = $blueprint->getID();
-      $save_uri = $this->getApplicationURI("blueprint/{$id}/");
+        $id = $blueprint->getID();
+        $save_uri = $this->getApplicationURI("blueprint/{$id}/");
 
-      return id(new AphrontRedirectResponse())->setURI($save_uri);
+        return id(new AphrontRedirectResponse())->setURI($save_uri);
+      }
+    }
+
+    $error_view = null;
+    if ($errors) {
+      $error_view = id(new AphrontErrorView())->setErrors($errors);
     }
 
     $policies = id(new PhabricatorPolicyQuery())
@@ -67,6 +83,12 @@
       ->setUser($viewer)
       ->addHiddenInput('class', $request->getStr('class'))
       ->appendChild(
+        id(new AphrontFormTextControl())
+          ->setLabel(pht('Name'))
+          ->setName('name')
+          ->setValue($v_name)
+          ->setError($e_name))
+      ->appendChild(
         id(new AphrontFormStaticControl())
           ->setLabel(pht('Blueprint Type'))
           ->setValue($impl->getBlueprintName()))
@@ -105,6 +127,7 @@
 
     $box = id(new PHUIObjectBoxView())
       ->setHeaderText($header)
+      ->setFormError($error_view)
       ->setForm($form);
 
     return $this->buildApplicationPage(
Index: src/applications/drydock/controller/DrydockBlueprintListController.php
===================================================================
--- src/applications/drydock/controller/DrydockBlueprintListController.php
+++ src/applications/drydock/controller/DrydockBlueprintListController.php
@@ -33,19 +33,15 @@
 
     foreach ($blueprints as $blueprint) {
       $item = id(new PHUIObjectItemView())
-        ->setHeader($blueprint->getClassName())
+        ->setHeader($blueprint->getBlueprintName())
         ->setHref($this->getApplicationURI('/blueprint/'.$blueprint->getID()))
         ->setObjectName(pht('Blueprint %d', $blueprint->getID()));
 
-      if ($blueprint->getImplementation()->isEnabled()) {
-        $item->addAttribute(pht('Enabled'));
-        $item->setBarColor('green');
-      } else {
-        $item->addAttribute(pht('Disabled'));
-        $item->setBarColor('red');
+      if (!$blueprint->getImplementation()->isEnabled()) {
+        $item->setDisabled(true);
       }
 
-      $item->addAttribute($blueprint->getImplementation()->getDescription());
+      $item->addAttribute($blueprint->getImplementation()->getBlueprintName());
 
       $view->addItem($item);
     }
Index: src/applications/drydock/controller/DrydockBlueprintViewController.php
===================================================================
--- src/applications/drydock/controller/DrydockBlueprintViewController.php
+++ src/applications/drydock/controller/DrydockBlueprintViewController.php
@@ -20,10 +20,12 @@
       return new Aphront404Response();
     }
 
-    $title = 'Blueprint '.$blueprint->getID().' '.$blueprint->getClassName();
+    $title = $blueprint->getBlueprintName();
 
     $header = id(new PHUIHeaderView())
-      ->setHeader($title);
+      ->setHeader($title)
+      ->setUser($viewer)
+      ->setPolicyObject($blueprint);
 
     $actions = $this->buildActionListView($blueprint);
     $properties = $this->buildPropertyListView($blueprint, $actions);
@@ -99,8 +101,8 @@
     $view->setActionList($actions);
 
     $view->addProperty(
-      pht('Implementation'),
-      $blueprint->getClassName());
+      pht('Type'),
+      $blueprint->getImplementation()->getBlueprintName());
 
     return $view;
   }
Index: src/applications/drydock/storage/DrydockBlueprint.php
===================================================================
--- src/applications/drydock/storage/DrydockBlueprint.php
+++ src/applications/drydock/storage/DrydockBlueprint.php
@@ -3,14 +3,19 @@
 final class DrydockBlueprint extends DrydockDAO
   implements PhabricatorPolicyInterface {
 
-  protected $phid;
   protected $className;
+  protected $blueprintName;
   protected $viewPolicy;
   protected $editPolicy;
-  protected $details;
+  protected $details = array();
 
   private $implementation = self::ATTACHABLE;
 
+  public static function initializeNewBlueprint(PhabricatorUser $actor) {
+    return id(new DrydockBlueprint())
+      ->setBlueprintName('');
+  }
+
   public function getConfiguration() {
     return array(
       self::CONFIG_AUX_PHID => true,