diff --git a/uuid.module b/uuid.module
index a2f1e2e..6857b70 100644
--- a/uuid.module
+++ b/uuid.module
@@ -179,5 +179,253 @@ function uuid_features_api() {
       'features_source' => TRUE,
       'file' => drupal_get_path('module', 'uuid') .'/uuid.features.inc',
     ),
+    'uuid_menu_links' => array(
+      'name' => t('UUID Menu links'),
+      'default_hook' => 'uuid_menu_default_menu_links',
+      'feature_source' => TRUE,
+      'default_file' => FEATURES_DEFAULTS_INCLUDED,
+    )
   );
 }
+
+/**
+ * Implements hook_features_export_options().
+ */
+function uuid_menu_links_features_export_options() {
+  global $menu_admin;
+  // Need to set this to TRUE in order to get menu links that the
+  // current user may not have access to (i.e. user/login)
+  $menu_admin = TRUE;
+  $menu_links = menu_parent_options(menu_get_menus(), array('mlid' => 0));
+  $options = array();
+  foreach ($menu_links as $key => $name) {
+    list($menu_name, $mlid) = explode(':', $key, 2);
+    if ($mlid != 0) {
+      $link = menu_link_load($mlid);
+      $identifier = uuid_menu_links_features_identifier($link);
+      $options[$identifier] = "{$menu_name}: {$name}";
+    }
+  }
+  $menu_admin = FALSE;
+  return $options;
+}
+
+/**
+ * Callback for generating the menu link exportable identifier.
+ */
+function uuid_menu_links_features_identifier($link) {
+  return isset($link['menu_name'], $link['link_path']) ? $link['menu_name'] . ":" . uuid_menu_path_to_uri_transform($link['link_path']) : FALSE;
+}
+
+/**
+ * Implements hook_features_export().
+ */
+function uuid_menu_links_features_export($data, &$export, $module_name = '') {
+  // Default hooks are provided by the feature module so we need to add
+  // it as a dependency.
+  $export['dependencies']['features'] = 'features';
+  $export['dependencies']['menu'] = 'menu';
+  $export['dependencies']['uuid'] = 'uuid';
+
+  // Collect a link to module map
+  $pipe = array();
+  $map = features_get_default_map('uuid_menu_links', 'uuid_menu_links_features_identifier');
+  foreach ($data as $identifier) {
+    if ($link = uuid_menu_link_load($identifier)) {
+      // If this link is provided by a different module, add it as a dependency.
+      if (isset($map[$identifier]) && $map[$identifier] != $module_name) {
+        $export['dependencies'][$map[$identifier]] = $map[$identifier];
+      }
+      else {
+        $export['features']['uuid_menu_links'][$identifier] = $identifier;
+      }
+      // For now, exclude a variety of common menus from automatic export.
+      // They may still be explicitly included in a Feature if the builder
+      // chooses to do so.
+      if (!in_array($link['menu_name'], array('features', 'primary-links', 'secondary-links', 'navigation', 'admin', 'devel'))) {
+        $pipe['menu_custom'][] = $link['menu_name'];
+      }
+    }
+  }
+  return $pipe;
+}
+
+/**
+ * Implements hook_features_export_render()
+ */
+function uuid_menu_links_features_export_render($module, $data) {
+  $code = array();
+  $code[] = '  $uuid_menu_links = array();';
+  $code[] = '';
+
+  $translatables = array();
+  foreach ($data as $identifier) {
+    if ($link = uuid_menu_link_load($identifier)) {
+      uuid_menu_path_to_uri_transform($link['link_path']);
+      // Replace plid with a parent path.
+      if (!empty($link['plid']) && $parent = menu_link_load($link['plid'])) {
+        $link['parent_path'] = $parent['link_path'];
+        uuid_menu_path_to_uri_transform($link['parent_path']);
+      }
+      unset($link['plid']);
+      unset($link['mlid']);
+
+      $code[] = "  // Exported menu link: {$identifier}";
+      $code[] = "  \$uuid_menu_links['{$identifier}'] = ". features_var_export($link, '  ') .";";
+      $translatables[] = $link['link_title'];
+    }
+  }
+  if (!empty($translatables)) {
+    $code[] = features_translatables_export($translatables, '  ');
+  }
+
+  $code[] = '';
+  $code[] = '  return $uuid_menu_links;';
+  $code = implode("\n", $code);
+  return array('uuid_menu_default_menu_links' => $code);
+}
+
+/**
+ * Implements hook_features_export_revert().
+ */
+function uuid_menu_links_features_revert($module) {
+  uuid_menu_links_features_rebuild($module);
+}
+
+/**
+ * Implements hook_features_export_rebuild().
+ */
+function uuid_menu_links_features_rebuild($module) {
+  if ($menu_links = features_get_default('uuid_menu_links', $module)) {
+    uuid_menu_links_features_rebuild_ordered($menu_links);
+  }
+}
+
+/**
+ * Generate a depth tree of all menu links.
+ */
+function uuid_menu_links_features_rebuild_ordered($menu_links, $reset = FALSE) {
+  static $ordered;
+  static $all_links;
+  if (!isset($ordered) || $reset) {
+    $ordered = array();
+    $unordered = features_get_default('uuid_menu_links');
+
+    // Order all links by depth.
+    if ($unordered) {
+      do {
+        $current = count($unordered);
+        foreach ($unordered as $key => $link) {
+          $identifier = uuid_menu_links_features_identifier($link);
+          $parent = isset($link['parent_path']) ? $link['menu_name'] . ":" . uuid_menu_path_to_uri_transform($link['parent_path']) : '';
+          if (isset($parent)) {
+            $ordered[$identifier] = 0;
+            $all_links[$identifier] = $link;
+            unset($unordered[$key]);
+          }
+          elseif (isset($ordered[$parent])) {
+            $ordered[$identifier] = $ordered[$parent] + 1;
+            $all_links[$identifier] = $link;
+            unset($unordered[$key]);
+          }
+        }
+      } while (count($unordered) < $current);
+    }
+    asort($ordered);
+  }
+
+  // Ensure any default menu items that do not exist are created.
+  foreach (array_keys($ordered) as $identifier) {
+    $link = $all_links[$identifier];
+    $existing = uuid_menu_link_load($identifier);
+    if (!$existing || in_array($link, $menu_links)) {
+      // Retrieve the mlid if this is an existing item.
+      if ($existing) {
+        $link['mlid'] = $existing['mlid'];
+      }
+      // Retrieve the plid for a parent link.
+      if (!empty($link['parent_path']) && $parent = uuid_menu_link_load($link['menu_name'] . ":" . uuid_menu_path_to_uri_transform($link['parent_path']))) {
+        $link['plid'] = $parent['mlid'];
+        uuid_menu_uri_to_path_transform($link['parent_path']);
+      }
+      else {
+        $link['plid'] = 0;
+      }
+      uuid_menu_uri_to_path_transform($link['link_path']);
+      menu_link_save($link);
+    }
+  }
+}
+
+/**
+ * Load a menu link by its menu_name:link_path identifier.
+ */
+function uuid_menu_link_load($identifier) {
+  list($menu_name, $uri) = explode(':', $identifier, 2);
+  $link_path = uuid_menu_uri_to_path_transform($uri);
+
+  $link = db_select('menu_links')
+    ->fields('menu_links', array('menu_name', 'mlid', 'plid', 'link_path', 'router_path', 'link_title', 'options', 'module', 'hidden', 'external', 'has_children', 'expanded', 'weight'))
+    ->condition('menu_name', $menu_name)
+    ->condition('link_path', $link_path)
+    ->execute()
+    ->fetchAssoc();
+  if ($link) {
+    $link['options'] = unserialize($link['options']);
+    return $link;
+  }
+
+  return FALSE;
+}
+
+/**
+ * Convert local IDs in drupal paths to UUIDs.
+ */
+function uuid_menu_path_to_uri_transform(&$url) {
+  $args = explode('/', $url);
+  if (!empty($args) && isset($args[1])) {
+    if ($args[0] == 'node' && is_numeric($args[1])) {
+      $args[1] = current(entity_get_uuid_by_id('node', array($args[1])));
+      $url = implode('/', $args);
+    }
+    elseif ($args[0] == 'user' && is_numeric($args[1])) {
+      $args[1] = current(entity_get_uuid_by_id('taxonomy_term', array($args[1])));
+      $url = implode('/', $args);
+    }
+    elseif (isset($args[2]) && $args[0] == 'taxonomy' && $args[1] == 'term' && is_numeric($args[2])) {
+      $args[2] = current(entity_get_uuid_by_id('taxonomy_term', array($args[2])));
+      $url = implode('/', $args);
+    }
+  }
+
+  // Allow modules to do custom transformations.
+  drupal_alter('uuid_menu_path_to_uri', $url);
+
+  return $url;
+}
+
+/**
+ * Convert local IDs in drupal paths to UUIDs.
+ */
+function uuid_menu_uri_to_path_transform(&$uri) {
+  $args = explode('/', $uri);
+  if (!empty($args) && isset($args[1])) {
+    if ($args[0] == 'node') {
+      $args[1] = current(entity_get_id_by_uuid('node', array($args[1])));
+      $uri = implode('/', $args);
+    }
+    elseif ($args[0] == 'user') {
+      $args[1] = current(entity_get_id_by_uuid('taxonomy_term', array($args[1])));
+      $uri = implode('/', $args);
+    }
+    elseif (isset($args[2]) && $args[0] == 'taxonomy' && $args[1] == 'term') {
+      $args[2] = current(entity_get_id_by_uuid('taxonomy_term', array($args[2])));
+      $uri = implode('/', $args);
+    }
+  }
+
+  // Allow modules to do custom transformations.
+  drupal_alter('uuid_menu_uri_to_path', $uri);
+
+  return $uri;
+}
