diff --git a/entity.module b/entity.module
index 576e0e2..38c5877 100644
--- a/entity.module
+++ b/entity.module
@@ -105,6 +105,45 @@ function entity_object_load($entity_id, $entity_type) {
 }
 
 /**
+ * Page callback to show links to add an entity of a specific bundle.
+ *
+ * @param $entity_type
+ *   The type of the entity.
+ */
+function entity_ui_bundle_add_page($entity_type) {
+  $info = entity_get_info($entity_type);
+  $items = array();
+  foreach ($info['bundles'] as $bundle_name => $bundle_info) {
+    $bundle_url_str = str_replace('_', '-', $bundle_name);
+    $items[] = l(t('Add @label', array('@label' => $bundle_info['label'])), $info['admin ui']['path'] . '/add/' . $bundle_url_str);
+  }
+  return theme('item_list', array('items' => $items));
+}
+
+/**
+ * Page callback to add an entity of a specific bundle.
+ *
+ * @param $entity_type
+ *   The type of the entity.
+ * @param $bundle_name
+ *   The bundle machine name converted to a URL string, i.e., with the
+ *   underscores converted to hyphens.
+ */
+function entity_ui_get_bundle_add_form($entity_type, $bundle_url_str) {
+  $bundle_name = str_replace('-', '_', $bundle_url_str);
+  $info = entity_get_info($entity_type);
+  $bundle_key = $info['entity keys']['bundle'];
+
+  // Make a stub entity of the right bundle to pass to the entity_ui_get_form().
+  $values = array(
+    $bundle_key => $bundle_name,
+  );
+  $entity = entity_create($entity_type, $values);
+
+  return entity_ui_get_form($entity_type, $entity, 'add');
+}
+
+/**
  * A wrapper around entity_load() to load a single entity by name or numeric id.
  *
  * @todo: Re-name entity_load() to entity_load_multiple() in d8 core and this
diff --git a/includes/entity.ui.inc b/includes/entity.ui.inc
index a449b25..638e4e6 100644
--- a/includes/entity.ui.inc
+++ b/includes/entity.ui.inc
@@ -48,15 +48,37 @@ class EntityDefaultUIController {
       'type' => MENU_DEFAULT_LOCAL_TASK,
       'weight' => -10,
     );
-    $items[$this->path . '/add'] = array(
-      'title callback' => 'entity_ui_get_action_title',
-      'title arguments' => array('add', $this->entityType),
-      'page callback' => 'entity_ui_get_form',
-      'page arguments' => array($this->entityType, NULL, 'add'),
-      'access callback' => 'entity_access',
-      'access arguments' => array('create', $this->entityType),
-      'type' => MENU_LOCAL_ACTION,
-    );
+    // The entity add UI is either for a single bundle or for multiple.
+    if (count($this->entityInfo['bundles']) == 1) {
+      $items[$this->path . '/add'] = array(
+        'title callback' => 'entity_ui_get_action_title',
+        'title arguments' => array('add', $this->entityType),
+        'page callback' => 'entity_ui_get_form',
+        'page arguments' => array($this->entityType, NULL, 'add'),
+        'access callback' => 'entity_access',
+        'access arguments' => array('create', $this->entityType),
+        'type' => MENU_LOCAL_ACTION,
+      );
+    }
+    else {
+      $items[$this->path . '/add'] = array(
+        'title callback' => 'entity_ui_get_action_title',
+        'title arguments' => array('add', $this->entityType),
+        'page callback' => 'entity_ui_bundle_add_page',
+        'page arguments' => array($this->entityType),
+        'access callback' => 'entity_access',
+        'access arguments' => array('create', $this->entityType),
+        'type' => MENU_LOCAL_ACTION,
+      );
+      $items[$this->path . '/add/%'] = array(
+        'title callback' => 'entity_ui_get_action_title',
+        'title arguments' => array('add', $this->entityType),
+        'page callback' => 'entity_ui_get_bundle_add_form',
+        'page arguments' => array($this->entityType, $id_count + 1),
+        'access callback' => 'entity_access',
+        'access arguments' => array('create', $this->entityType),
+      );
+    }
     $items[$this->path . '/manage/' . $wildcard] = array(
       'title' => 'Edit',
       'title callback' => 'entity_label',
@@ -108,9 +130,11 @@ class EntityDefaultUIController {
 
     if (!empty($this->entityInfo['admin ui']['file'])) {
       // Add in the include file for the entity form.
-      foreach (array("/manage/$wildcard", "/manage/$wildcard/clone", '/add') as $path_end) {
-        $items[$this->path . $path_end]['file'] = $this->entityInfo['admin ui']['file'];
-        $items[$this->path . $path_end]['file path'] = isset($this->entityInfo['admin ui']['file path']) ? $this->entityInfo['admin ui']['file path'] : drupal_get_path('module', $this->entityInfo['module']);
+      foreach (array("/manage/$wildcard", "/manage/$wildcard/clone", '/add', '/add/%') as $path_end) {
+        if (isset($items[$this->path . $path_end])) {
+          $items[$this->path . $path_end]['file'] = $this->entityInfo['admin ui']['file'];
+          $items[$this->path . $path_end]['file path'] = isset($this->entityInfo['admin ui']['file path']) ? $this->entityInfo['admin ui']['file path'] : drupal_get_path('module', $this->entityInfo['module']);
+        }
       }
     }
     return $items;
@@ -614,17 +638,28 @@ function entity_ui_get_page_title($op, $entity_type, $entity = NULL) {
     case 'export':
       return t('Export @label', array('@label' => $label));
   }
-  return entity_ui_get_action_title($op, $entity_type);
+  if (isset($entity)) {
+    list(, , $bundle) = entity_extract_ids($entity_type, $entity);
+  }
+  return entity_ui_get_action_title($op, $entity_type, $bundle);
 }
 
 /**
  * Gets the page/menu title for local action operations.
  */
-function entity_ui_get_action_title($op, $entity_type) {
+function entity_ui_get_action_title($op, $entity_type, $bundle_name = NULL) {
   $info = entity_get_info($entity_type);
   switch ($op) {
     case 'add':
-      return t('Add @entity_type', array('@entity_type' => drupal_strtolower($info['label'])));
+      if (isset($bundle_name)) {
+        return t('Add @bundle_name @entity_type', array(
+          '@bundle_name' => drupal_strtolower($info['bundles'][$bundle_name]['label']),
+          '@entity_type' => drupal_strtolower($info['label']),
+        ));
+      }
+      else {
+        return t('Add @entity_type', array('@entity_type' => drupal_strtolower($info['label'])));
+      }
     case 'import':
       return t('Import @entity_type', array('@entity_type' => drupal_strtolower($info['label'])));
   }
