diff --git a/modules/shortcut/shortcut.admin.inc b/modules/shortcut/shortcut.admin.inc
index 2e8ddb4..31c7b71 100644
--- a/modules/shortcut/shortcut.admin.inc
+++ b/modules/shortcut/shortcut.admin.inc
@@ -206,12 +206,19 @@ function shortcut_set_admin() {
  * @see shortcut_set_add_form_submit()
  */
 function shortcut_set_add_form($form, &$form_state) {
-  $form['new'] = array(
+  $form['title'] = array(
     '#type' => 'textfield',
     '#title' => t('Set name'),
     '#description' => t('The new set is created by copying items from your default shortcut set.'),
     '#required' => TRUE,
   );
+  $form['set_name'] = array(
+    '#type' => 'machine_name',
+    '#machine_name' => array(
+      'exists' => 'shortcut_set_name_exists',
+      'source' => array('title'),
+    ),
+  );
 
   $form['actions'] = array('#type' => 'actions');
   $form['actions']['submit'] = array(
@@ -227,8 +234,12 @@ function shortcut_set_add_form($form, &$form_state) {
  */
 function shortcut_set_add_form_validate($form, &$form_state) {
   // Check to prevent a duplicate title.
-  if (shortcut_set_title_exists($form_state['values']['new'])) {
-    form_set_error('new', t('The shortcut set %name already exists. Choose another name.', array('%name' => $form_state['values']['new'])));
+  if (shortcut_set_title_exists($form_state['values']['title'])) {
+    form_set_error('title', t('The shortcut set %name already exists. Choose another name.', array('%name' => $form_state['values']['title'])));
+  }
+  // Check to prevent a conflict with an existing custom menu.
+  if (menu_load($form_state['values']['set_name'])) {
+    form_set_error('set_name', t('A menu %name already exists. Choose another machine name.'), array('%name' => $form_state['values']['set_name']));
   }
 }
 
@@ -239,7 +250,8 @@ function shortcut_set_add_form_submit($form, &$form_state) {
   // Save a new shortcut set with links copied from the user's default set.
   $default_set = shortcut_default_set();
   $set = (object) array(
-    'title' => $form_state['values']['new'],
+    'set_name' => $form_state['values']['set_name'],
+    'title' => $form_state['values']['title'],
     'links' => menu_links_clone($default_set->links),
   );
   shortcut_set_save($set);
diff --git a/modules/shortcut/shortcut.module b/modules/shortcut/shortcut.module
index 2f6db0a..191f908 100644
--- a/modules/shortcut/shortcut.module
+++ b/modules/shortcut/shortcut.module
@@ -331,9 +331,8 @@ function shortcut_set_load($set_name) {
  * @param $shortcut_set
  *   An object containing the following properties:
  *   - 'title': The title of the shortcut set.
- *   - 'set_name': (optional) The internal name of the shortcut set. If
- *     omitted, a new shortcut set will be created, and the 'set_name' property
- *     will be added to the passed-in object.
+ *   - 'set_name': (optional) The machine name of the shortcut set. If not
+ *     provided a unique machine name will be automatically generated.
  *   - 'links': (optional) An array of menu links to save for the shortcut set.
  *     Each link is an array containing at least the following keys (which will
  *     be expanded to fill in other default values after the shortcut set is
@@ -350,11 +349,15 @@ function shortcut_set_load($set_name) {
  */
 function shortcut_set_save(&$shortcut_set) {
   // First save the shortcut set itself.
-  if (isset($shortcut_set->set_name)) {
+  $is_new = !isset($shortcut_set->set_name) || !shortcut_set_name_exists($shortcut_set->set_name);
+
+  if (!$is_new) {
     $return = drupal_write_record('shortcut_set', $shortcut_set, 'set_name');
   }
   else {
-    $shortcut_set->set_name = shortcut_set_get_unique_name();
+    if (!isset($shortcut_set->set_name)) {
+      $shortcut_set->set_name = shortcut_set_get_unique_name();
+    }
     $return = drupal_write_record('shortcut_set', $shortcut_set);
   }
   // If links were provided for the set, save them.
@@ -590,15 +593,27 @@ function shortcut_sets() {
 /**
  * Check to see if a shortcut set with the given title already exists.
  *
- * @param $title
+ * @param string $title
  *   Human-readable name of the shortcut set to check.
  *
- * @return
+ * @return bool
  *   TRUE if a shortcut set with that title exists; FALSE otherwise.
  */
 function shortcut_set_title_exists($title) {
   return (bool) db_query_range('SELECT 1 FROM {shortcut_set} WHERE title = :title', 0, 1, array(':title' => $title))->fetchField();
 }
+/**
+ * Check to see if a shortcut set with the given set name already exists.
+ *
+ * @param string $set_name
+ *   Machine name of the shortcut set to check.
+ *
+ * @return bool
+ *   TRUE if a shortcut set with that set name exists; FALSE otherwise.
+ */
+function shortcut_set_name_exists($set_name) {
+  return (bool) db_query_range('SELECT 1 FROM {shortcut_set} WHERE set_name = :name', 0, 1, array(':name' => $set_name))->fetchField();
+}
 
 /**
  * Determines if a path corresponds to a valid shortcut link.
diff --git a/modules/shortcut/shortcut.test b/modules/shortcut/shortcut.test
index 2bd9605..7121d65 100644
--- a/modules/shortcut/shortcut.test
+++ b/modules/shortcut/shortcut.test
@@ -48,9 +48,15 @@ class ShortcutTestCase extends DrupalWebTestCase {
   /**
    * Creates a generic shortcut set.
    */
-  function generateShortcutSet($title = '', $default_links = TRUE) {
+  function generateShortcutSet($title = '', $default_links = TRUE, $set_name = '') {
     $set = new stdClass();
     $set->title = empty($title) ? $this->randomName(10) : $title;
+
+    // Set name is generated automatically if not set.
+    if (!empty($set_name)) {
+      $set->set_name = $set_name;
+    }
+
     if ($default_links) {
       $set->links = array();
       $set->links[] = $this->generateShortcutLink('node/add');
@@ -75,7 +81,7 @@ class ShortcutTestCase extends DrupalWebTestCase {
 
   /**
    * Extracts information from shortcut set links.
-   * 
+   *
    * @param object $set
    *   The shortcut set object to extract information from.
    * @param string $key
@@ -318,7 +324,7 @@ class ShortcutSetsTestCase extends ShortcutTestCase {
    */
   function testShortcutSetRename() {
     $set = $this->set;
-    
+
     $new_title = $this->randomName(10);
     $this->drupalPost('admin/config/user-interface/shortcut/' . $set->set_name . '/edit', array('title' => $new_title), t('Save'));
     $set = shortcut_set_load($set->set_name);
@@ -368,4 +374,16 @@ class ShortcutSetsTestCase extends ShortcutTestCase {
     $this->drupalGet('admin/config/user-interface/shortcut/' . SHORTCUT_DEFAULT_SET_NAME . '/delete');
     $this->assertResponse(403);
   }
+
+  /**
+   * Tests creating a new shortcut set with a defined set name.
+   */
+  function testShortcutSetCreateWithSetName() {
+    $random_name = $this->randomName(10);
+    $new_set = $this->generateShortcutSet($random_name, TRUE, $random_name);
+    $sets = shortcut_sets();
+    $this->assertTrue(isset($sets[$random_name]), 'Successfully created a shortcut set with a defined set name.');
+    $this->drupalGet('user/' . $this->admin_user->uid . '/shortcuts');
+    $this->assertText($new_set->title, 'Generated shortcut set was listed as a choice on the user account page.');
+  }
 }
