diff --git a/page_manager/page_manager.admin.inc b/page_manager/page_manager.admin.inc
index 3dce041..19a23ce 100644
--- a/page_manager/page_manager.admin.inc
+++ b/page_manager/page_manager.admin.inc
@@ -1308,6 +1308,7 @@ function page_manager_handler_add_submit(&$form, &$form_state) {
   else {
     $handler->conf['title'] = $plugin['title'];
   }
+  $handler->conf['name'] = $form_state['values']['name'];
   $cache->new_handler = $handler;
 
   // Figure out which forms to present them with
@@ -1398,6 +1399,22 @@ function page_manager_handler_add_form($form, $form_state, $features = array())
       '#title' => t('Title'),
       '#description' => t('Administrative title of this variant. If you leave blank it will be automatically assigned.'),
     );
+
+    $form['name'] = array(
+      '#type' => 'machine_name',
+      '#title' => t('Machine name'),
+      '#required' => FALSE,
+      '#description' => t("A unique machine-readable name for this variant. It must only contain lowercase letters, numbers, and underscores. This name will be used when exporting the variant. If left empty the variant's name will be used instead."),
+      '#size' => 32,
+      '#maxlength' => 32,
+      '#machine_name' => array(
+        'exists' => 'page_manager_handler_check_machine_name',
+        'source' => array('title'),
+        'standalone' => TRUE,
+      ),
+      '#field_prefix' => '<span dir="ltr">' . $task['name'] . '__',
+      '#field_suffix' => '</span>&lrm;',
+    );
   }
 
   $form['handler'] = array(
@@ -1436,6 +1453,15 @@ function page_manager_handler_add_form($form, $form_state, $features = array())
   return $form;
 }
 
+/*
+ * Check if handler's machine-name is unique
+ */
+function page_manager_handler_check_machine_name($name, $element, $form_state) {
+  $name = $form_state['task']['name'] . '__' . $name;
+
+  return count(ctools_export_load_object('page_manager_handlers', 'names', array($name)));
+}
+
 /**
  * Rearrange the order of variants.
  */
diff --git a/page_manager/page_manager.module b/page_manager/page_manager.module
index da99a57..eaef7c8 100644
--- a/page_manager/page_manager.module
+++ b/page_manager/page_manager.module
@@ -416,16 +416,24 @@ function page_manager_cache_load($task_name) {
  */
 function page_manager_handler_get_name($task_name, $handlers, $handler) {
   $base = str_replace('-', '_', $task_name);
-  // Generate a unique name. Unlike most named objects, we don't let people choose
-  // names for task handlers because they mostly don't make sense.
-  $base .= '_' . $handler->handler;
-
-  // Once we have a base, check to see if it is used. If it is, start counting up.
-  $name = $base;
-  $count = 1;
-  // If taken
-  while (isset($handlers[$name])) {
-    $name = $base . '_' . ++$count;
+
+  // Optional machine name.
+  if (!empty($handler->conf['name'])) {
+    $name = $base . '__' . $handler->conf['name'];
+  }
+
+  // If no machine name was provided, generate a unique name.
+  else {
+    $base .= '__' . $handler->handler;
+
+    // Once we have a base, check to see if it is used. If it is, start
+    // counting up.
+    $name = $base;
+    $count = 1;
+    // If taken
+    while (isset($handlers[$name])) {
+      $name = $base . '_' . ++$count;
+    }
   }
 
   return $name;
