diff --git a/workbench_moderation.admin.inc b/workbench_moderation.admin.inc
index 40cb183..003cd5c 100644
--- a/workbench_moderation.admin.inc
+++ b/workbench_moderation.admin.inc
@@ -180,6 +180,9 @@ function workbench_moderation_admin_transitions_form($form, &$form_state) {
       '#type' => 'value',
       '#value' => $transition,
     );
+    $element['name'] = array(
+      '#markup' => check_plain($transition->name),
+    );
     $element['from_name'] = array(
       '#markup' => check_plain(workbench_moderation_state_label($transition->from_name)),
     );
@@ -201,6 +204,11 @@ function workbench_moderation_admin_transitions_form($form, &$form_state) {
 
   array_unshift($options, t('- Choose state -'));
   $element = array();
+  $element['name'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Transition Name'),
+    '#size' => '35'
+  );
   $element['from_name'] = array(
     '#type' => 'select',
     '#title' => t('New transition'),
@@ -228,6 +236,7 @@ function theme_workbench_moderation_admin_transitions_form($variables) {
   $form = $variables['form'];
 
   $header = array(
+    t('Name'),
     t('From'),
     '',
     t('To'),
@@ -238,6 +247,7 @@ function theme_workbench_moderation_admin_transitions_form($variables) {
   foreach (element_children($form['transitions']) as $key) {
     $element = &$form['transitions'][$key];
     $row = array('data' => array());
+    $row['data']['name'] = drupal_render($element['name']);
     $row['data']['from'] = drupal_render($element['from_name']);
     $row['data'][] = '--&gt;';
     $row['data']['to'] = drupal_render($element['to_name']);
@@ -281,13 +291,14 @@ function workbench_moderation_admin_transitions_form_submit($form, &$form_state)
       workbench_moderation_transition_delete($transition['transition']);
       drupal_set_message(t('%from --&gt; %to has been deleted.', array('%from' => workbench_moderation_state_label($transition['transition']->from_name), '%to' => workbench_moderation_state_label($transition['transition']->to_name))));
     }
-    elseif (!empty($transition['from_name']) && !empty($transition['to_name'])) {
+    elseif (!empty($transition['name']) && !empty($transition['from_name']) && !empty($transition['to_name'])) {
       $new_transition = (object) array(
+        'name' => $transition['name'],
         'from_name' => $transition['from_name'],
         'to_name' => $transition['to_name'],
       );
       workbench_moderation_transition_save($new_transition);
-      drupal_set_message(t('%from --&gt; %to has been created.',array('%from' => workbench_moderation_state_label($new_transition->from_name), '%to' => workbench_moderation_state_label($new_transition->to_name))));
+      drupal_set_message(t('%name: %from --&gt; %to has been created.',array('%name' => $new_transition->name, '%from' => workbench_moderation_state_label($new_transition->from_name), '%to' => workbench_moderation_state_label($new_transition->to_name))));
     }
   }
 }
diff --git a/workbench_moderation.install b/workbench_moderation.install
index 0c660c0..2623a0a 100644
--- a/workbench_moderation.install
+++ b/workbench_moderation.install
@@ -81,6 +81,18 @@ function workbench_moderation_schema() {
   $schema['workbench_moderation_transitions'] = array(
     'description' => 'Defines the valid transitions for states',
     'fields' => array(
+      'id' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'unsigned' => TRUE,
+        'description' => 'Primary Key: Unique workbench_moderation transition identifier.',
+      ),
+      'name' => array(
+        'description' => 'The machine-readable name of this workbench_moderation transition.',
+        'type' => 'varchar',
+        'length' => 255,
+        'initial' => 'from_name',
+      ),
       'from_name' => array(
         'description' => 'The starting moderation state.',
         'type' => 'varchar',
@@ -94,6 +106,7 @@ function workbench_moderation_schema() {
         'not null' => FALSE,
       ),
     ),
+    'primary key' => array('id'),
   );
 
   $schema['workbench_moderation_node_history'] = array(
@@ -218,14 +231,17 @@ function _workbench_moderation_insert_values() {
   // Default transitions.
   $transitions = array(
     array(
+      'name' => 'draft-needs_review',
       'from_name' => 'draft',
       'to_name' => 'needs_review',
     ),
     array(
+      'name' => 'needs_review-draft',
       'from_name' => 'needs_review',
       'to_name' => 'draft',
     ),
     array(
+      'name' => 'needs_review-published',
       'from_name' => 'needs_review',
       'to_name' => 'published',
     ),
@@ -233,7 +249,7 @@ function _workbench_moderation_insert_values() {
 
   // Save default transitions to the database.
   $query = db_insert('workbench_moderation_transitions')
-    ->fields(array('from_name', 'to_name'));
+    ->fields(array('name', 'from_name', 'to_name'));
 
   foreach ($transitions as $transition) {
     $query->values($transition);
@@ -610,3 +626,35 @@ function workbench_moderation_update_7008() {
   ));
   db_add_primary_key('workbench_moderation_states', array('name'));
 }
+
+/**
+ * Add new fields to workbench_moderation_transitions table.
+ */
+function workbench_moderation_update_7009() {
+  $fields = array(
+    'id' => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+      'unsigned' => TRUE,
+      'description' => 'Primary Key: Unique workbench_moderation transition identifier.',
+    ),
+    'name' => array(
+      'description' => 'The machine-readable name of this workbench_moderation transition.',
+      'type' => 'varchar',
+      'length' => 255,
+      'initial' => 'from_name',
+    ),
+  );
+  // Add index too.
+  $index = array(
+    'primary key' => array('id'),
+  );
+
+  db_add_field('workbench_moderation_transitions', 'id', $fields['id'], $index);
+  db_add_field('workbench_moderation_transitions', 'name', $fields['name']);
+
+  // Fill in the blanks.
+  db_update('workbench_moderation_transitions')
+    ->expression('name', "CONCAT(from_name, '-', to_name)")
+    ->execute();
+}
diff --git a/workbench_moderation.module b/workbench_moderation.module
index f510e2e..993726c 100644
--- a/workbench_moderation.module
+++ b/workbench_moderation.module
@@ -1336,7 +1336,7 @@ function workbench_moderation_transitions() {
   $transitions = &drupal_static(__FUNCTION__);
   if (!isset($transitions)) {
     $query = db_select('workbench_moderation_transitions', 't')
-      ->fields('t', array('from_name', 'to_name'));
+      ->fields('t', array('id', 'name', 'from_name', 'to_name'));
 
     $alias_from = $query->addJoin('INNER', 'workbench_moderation_states', NULL, 't.from_name = %alias.name');
     $alias_to = $query->addJoin('INNER', 'workbench_moderation_states', NULL, 't.to_name = %alias.name');
@@ -1361,7 +1361,11 @@ function workbench_moderation_transitions() {
  */
 function workbench_moderation_transition_save($transition) {
   return db_merge('workbench_moderation_transitions')
-    ->key(array('from_name' => $transition->from_name, 'to_name' => $transition->to_name))
+    ->key(array(
+      'name' => $transition->name,
+      'from_name' => $transition->from_name,
+      'to_name' => $transition->to_name,
+    ))
     ->fields((array) $transition)
     ->execute();
 }
@@ -2113,3 +2117,79 @@ function workbench_moderation_ctools_plugin_api($module, $api) {
 function workbench_moderation_migrate_api() {
   return array('api' => 2);
 }
+
+/**
+ * Implements hook_entity_info().
+ */
+function workbench_moderation_entity_info() {
+  // Entification of transitions, for use with an entity reference field.
+  $entity_info['workbench_moderation_transition'] = array(
+    'label' => t('Workbench Moderation Transition'),
+    'label callback' => 'workbench_moderation_transition_label_callback',
+    'entity class' => 'Entity',
+    'controller class' => 'EntityAPIController',
+    'access callback' => 'workbench_moderation_transition_access',
+    'base table' => 'workbench_moderation_transitions',
+    'fieldable' => FALSE,
+    'module' => 'workbench_moderation',
+    'entity keys' => array(
+      'id' => 'id',
+    ),
+  );
+
+  return $entity_info;
+}
+
+/**
+ * Wrapper for user_access to admin workbench_moderation.
+ */
+function workbench_moderation_transition_access($op, $profile = NULL, $account = NULL) {
+  return user_access('administer workbench moderation');
+}
+
+/**
+ * Label callback for workbench_moderation_transitions, for reference fields.
+ */
+function workbench_moderation_transition_label_callback($workbench_moderation_transition, $type) {
+  return empty($workbench_moderation_transition->name) ? 'Unnamed Workbench Moderation Transition' : $workbench_moderation_transition->name;
+}
+
+/**
+ * Fetch a workbench_moderation_transition object.
+ *
+ * @param int $id
+ *   Integer specifying the workbench_moderation_transition id.
+ * @param bool $reset
+ *   A boolean indicating that the internal cache should be reset.
+ *
+ * @return obj
+ *   A fully-loaded $workbench_moderation_transition object,
+ *   or FALSE if it cannot be loaded.
+ *
+ * @see workbench_moderation_transition_load_multiple()
+ */
+function workbench_moderation_transition_load($id, $reset = FALSE) {
+  $workbench_moderation_transition = workbench_moderation_transition_load_multiple(array($id), array(), $reset);
+  return reset($workbench_moderation_transition);
+}
+
+/**
+ * Load multiple workbench_moderation_transition based on certain conditions.
+ *
+ * @param array $ids
+ *   An array of workbench_moderation_transition IDs.
+ * @param array $conditions
+ *   An array of conditions to match against the
+ *   {workbench_moderation_transition} table.
+ * @param bool $reset
+ *   A boolean indicating that the internal cache should be reset.
+ *
+ * @return array
+ *   An array of workbench_moderation_transition objects, indexed by wmpid.
+ *
+ * @see entity_load()
+ * @see workbench_moderation_transition_load()
+ */
+function workbench_moderation_transition_load_multiple($ids = array(), $conditions = array(), $reset = FALSE) {
+  return entity_load('workbench_moderation_transition', $ids, $conditions, $reset);
+}
