diff --git a/lib/Drupal/configuration/Config/MenuConfiguration.php b/lib/Drupal/configuration/Config/MenuConfiguration.php
index 7e353fd..1443762 100644
--- a/lib/Drupal/configuration/Config/MenuConfiguration.php
+++ b/lib/Drupal/configuration/Config/MenuConfiguration.php
@@ -13,7 +13,7 @@ use Drupal\configuration\Utils\ConfigIteratorSettings;
 class MenuConfiguration extends Configuration {
 
   protected function prepareBuild() {
-    $this->data = menu_load($this->getIdentifier());
+    $this->data = menu_load(str_replace('_', '-', $this->getIdentifier()));
     return $this;
   }
 
@@ -42,10 +42,10 @@ class MenuConfiguration extends Configuration {
    * Returns all the identifiers available for this component.
    */
   public static function getAllIdentifiers($component) {
-    $menus = db_query("SELECT menu_name FROM {menu_custom}")->fetchAll();
+    $menus = db_query("SELECT menu_name, title FROM {menu_custom}")->fetchAll();
     $return = array();
     foreach ($menus as $menu) {
-      $return[$menu->menu_name] = $menu->menu_name;
+      $return[str_replace('-', '_', $menu->menu_name)] = $menu->title;
     }
     return $return;
   }
@@ -54,9 +54,7 @@ class MenuConfiguration extends Configuration {
     if ($config->getComponent() == 'menu_link') {
       $config_data = $config->getData();
       if ($config_data['plid'] == 0) {
-        $identifier = current(explode('.', $config->getIdentifier()));
-        $menuarray = menu_load($identifier);
-        $menu = new MenuConfiguration($identifier);
+        $menu = new MenuConfiguration(str_replace('-', '_', $config_data['menu_name']));
         $menu->build();
         $config->addToDependencies($menu);
       }
diff --git a/lib/Drupal/configuration/Config/MenuLinkConfiguration.php b/lib/Drupal/configuration/Config/MenuLinkConfiguration.php
index af2a1ae..a97fe45 100644
--- a/lib/Drupal/configuration/Config/MenuLinkConfiguration.php
+++ b/lib/Drupal/configuration/Config/MenuLinkConfiguration.php
@@ -13,11 +13,35 @@ use Drupal\configuration\Utils\ConfigIteratorSettings;
 class MenuLinkConfiguration extends Configuration {
 
   protected function prepareBuild() {
-    list(, $mlid) = explode('.', $this->getIdentifier());
+    $mlid  = static::getMenuLinkByIdenfifier($this->getIdentifier());
     $this->data = menu_link_load($mlid);
+
+    $parent = db_select('menu_links', 'ml')
+                        ->fields('ml', array('menu_name', 'link_path', 'mlid'))
+                        ->condition('mlid', $this->data['plid'])
+                        ->execute()
+                        ->fetchObject();
+
+    $this->data['parent_identifier'] = sha1(str_replace('-', '_', $parent->menu_name) . ':' . $parent->link_path);
     return $this;
   }
 
+  public function __construct($identifier) {
+
+    parent::__construct($identifier);
+    $keys = array(
+      'link_path',
+      'link_title',
+      'menu_name',
+      'weight',
+      'expanded',
+      'options',
+      'router_path',
+      'parent_identifier',
+    );
+    $this->setKeysToExport($keys);
+  }
+
   public static function isActive() {
     return module_exists('menu');
   }
@@ -35,39 +59,76 @@ class MenuLinkConfiguration extends Configuration {
   }
 
   public function saveToActiveStore(ConfigIteratorSettings &$settings) {
-    menu_link_save($this->getData());
+    $data = $this->getData();
+
+    // Determine if the menu already exists.
+    $this->data['mlid'] = static::getMenuLinkByIdenfifier($this->getIdentifier());
+
+    if (!empty($this->data['parent_identifier'])) {
+      $data['plid'] = static::getMenuLinkByIdenfifier($this->data['parent_identifier']);
+    }
+    menu_link_save($data);
     $settings->addInfo('imported', $this->getUniqueId());
   }
 
+  static protected function getMenuLinkByIdenfifier($identifier) {
+    static $menu_links;
+
+    if (!isset($menu_links)) {
+      $res = db_select('menu_links', 'ml')
+                          ->fields('ml', array('menu_name', 'link_path', 'mlid'))
+                          ->execute()
+                          ->fetchAll();
+
+      $menu_links = array();
+      foreach ($res as $menu_link) {
+        $id = sha1(str_replace('-', '_', $menu_link->menu_name) . ':' . $menu_link->link_path);
+        $menu_links[$id] = $menu_link->mlid;
+      }
+    }
+    if (!empty($menu_links[$identifier])) {
+      return $menu_links[$identifier];
+    }
+  }
+
   /**
    * Returns all the identifiers available for this component.
    */
   public static function getAllIdentifiers($component) {
+    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));
-    $return = array();
+    $options = array();
     foreach ($menu_links as $key => $name) {
       list($menu_name, $mlid) = explode(':', $key, 2);
       if ($mlid != 0) {
-        $menulink_name = str_replace(' ', '_', trim(str_replace(array('-', "'"), '', $name)));
-        $return[$menu_name . '.' . $mlid . '.' . $menulink_name] = $menu_name . '.' . $mlid . '.' . $menulink_name;
+        $link = menu_link_load($mlid);
+        $identifier = sha1(str_replace('-', '_', $link['menu_name']) . ':' . $link['link_path']);
+        $options[$identifier] = "{$menu_name}: {$name}";
       }
     }
     $menu_admin = FALSE;
-    return $return;
+    return $options;
   }
 
   public static function alterDependencies(Configuration $config, &$stack) {
     if ($config->getComponent() == 'menu_link') {
-      list(, $mlid) = explode('.', $config->getIdentifier());
-      $config_data = $config->getData();
-      if ($config_data['plid'] > 0) {
-        $menulinkarray = menu_link_load($config_data['plid']);
-        $identifier = $menulinkarray['menu_name'] . '.' . $menulinkarray['mlid'] . '.' . str_replace(' ', '_', $menulinkarray['title']);
-        $menulink = new MenuLinkConfiguration($identifier);
-        $menulink->build();
-        $config->addToDependencies($menulink);
+      $mlid = static::getMenuLinkByIdenfifier($config->getIdentifier());
+      $menulink = menu_link_load($mlid);
+      if (!empty($menulink['plid'])) {
+        $parent_menulink = menu_link_load($menulink['plid']);
+        if ($parent_menulink) {
+          $identifier = sha1(str_replace('-', '_', $parent_menulink['menu_name']) . ':' . $parent_menulink['link_path']);
+          if (empty($stack['menu_link.' . $identifier])) {
+            $menulink_config = new MenuLinkConfiguration($identifier);
+            $menulink_config->build();
+            $config->addToDependencies($menulink_config);
+            $stack['menu_link.' . $identifier] = TRUE;
+          }
+        }
       }
     }
   }
-
 }
diff --git a/tests/configuration_test.info b/tests/configuration_test.info
index e58f6a6..01d47d0 100644
--- a/tests/configuration_test.info
+++ b/tests/configuration_test.info
@@ -12,6 +12,7 @@ files[] = handlers/text_formats.test
 files[] = handlers/variables.test
 files[] = handlers/views.test
 files[] = handlers/vocabularies.test
+files[] = handlers/menus.test
 
 dependencies[] = ctools
 dependencies[] = views
diff --git a/tests/handlers/menus.test b/tests/handlers/menus.test
new file mode 100644
index 0000000..68bf947
--- /dev/null
+++ b/tests/handlers/menus.test
@@ -0,0 +1,124 @@
+<?php
+
+/**
+ * @file
+ * Tests for Configuration Management: Content Types.
+ */
+
+use Drupal\configuration\Config\ConfigurationManagement;
+
+/**
+ * Base class for functional tests for configuration management.
+ */
+class ConfigurationHandlerMenuTestCase extends ConfigurationWebTestCase {
+
+  // Use the minimal profile, to avoid create the content type that will be
+  // imported
+  protected $profile = 'minimal';
+
+  /**
+   * Test info.
+   */
+  public static function getInfo() {
+    return array(
+      'name' => t('Handler: Menus'),
+      'description' => t('Test the configuration API for menu configurations'),
+      'group' => t('Configuration'),
+    );
+  }
+
+  /**
+   * Implementation of DrupalWebTestCase::setUp().
+   */
+  public function setUp($modules = array()) {
+    global $base_url;
+
+    if (empty($modules)) {
+      parent::setUp(array(
+        'configuration',
+        'menu',
+      ));
+    }
+    else {
+      parent::setUp($modules);
+    }
+  }
+
+  public function testImportToActiveStore() {
+    // Change the path from where the configurations are loaded.
+    ConfigurationManagement::setStream(drupal_get_path('module', 'configuration') . '/tests/test_configs/');
+
+    $config = 'menu.menu_test';
+    $results = ConfigurationManagement::importToActiveStore(array($config), FALSE, FALSE);
+    $imported = $results->getInfo('imported');
+    $this->assertTrue(in_array($config, $imported), "Configuration for $config was imported.");
+
+    $type_exists = db_query('SELECT 1 FROM {menu_custom} WHERE menu_name = :menu_name', array(':menu_name' => 'menu-test'))->fetchField();
+    $this->assertTrue($type_exists, "The menu was saved in the ActiveStore.");
+  }
+
+  public function testExportToDataStore() {
+    variable_set('configuration_config_path', $this->datastore_path);
+    $config_path = variable_get('configuration_config_path', $this->datastore_path);
+    file_prepare_directory($config_path);
+
+    ConfigurationManagement::setStream($config_path);
+
+    $menu = array(
+      'menu_name' => 'menu-drupal',
+      'title' => 'My menu',
+      'description' => 'This is my menu',
+    );
+    menu_save($menu);
+    $type_exists = db_query('SELECT 1 FROM {menu_custom} WHERE menu_name = :menu_name', array(':menu_name' => 'menu-drupal'))->fetchField();
+    $this->assertTrue($type_exists, "The menu was saved in the ActiveStore.");
+
+    $config = 'menu.menu_drupal';
+    $results = ConfigurationManagement::exportToDataStore(array($config), FALSE, FALSE);
+    $exported = $results->getInfo('exported');
+    $this->assertTrue(in_array($config, $exported), "Configuration for $config was exported.");
+
+    $file_for_config = $config_path . $config . '.inc';
+
+    $this->assertTrue(file_exists($file_for_config), "The file that storages the menu was created.");
+  }
+
+  public function testCheckModifications() {
+    // Change the path from where the configurations are loaded.
+    ConfigurationManagement::setStream(drupal_get_path('module', 'configuration') . '/tests/test_configs/');
+    $results = ConfigurationManagement::importToActiveStore(array('menu.menu_test'), FALSE, FALSE, TRUE);
+
+    $this->verbose('<pre>' . print_r($results->getInfo('imported'), TRUE) . '</pre>');
+
+    drupal_flush_all_caches();
+    $type_exists = db_query('SELECT 1 FROM {menu_custom} WHERE menu_name = :menu_name', array(':menu_name' => 'menu-test'))->fetchField();
+    $this->assertTrue($type_exists, "The menu was saved in the ActiveStore.");
+    $menu = ConfigurationManagement::createConfigurationInstance('menu.menu_test');
+    $initial_hash = $menu->loadFromActiveStore()->buildHash()->getHash();
+
+    $object = db_select('configuration_staging', 'cs')
+                        ->fields('cs')
+                        ->condition('component', 'menu')
+                        ->condition('identifier', 'menu_test')
+                        ->execute()
+                        ->fetchObject();
+    $this->assertTrue(!empty($object), 'The menu was suscessfully tracked.');
+
+    $menu = array(
+      'menu_name' => 'menu_test',
+      'title' => 'Modified',
+      'description' => 'Modified',
+    );
+    menu_save($menu);
+
+    $modified_hash = $menu->loadFromActiveStore()->buildHash()->getHash();
+    $this->assertFalse($initial_hash == $modified_hash, 'Menu hash is not the same after modify the menu.');
+    $results = ConfigurationManagement::revertActiveStore(array('menu.menu_test'), FALSE, FALSE);
+
+    $final_hash = $menu->loadFromActiveStore()->buildHash()->getHash();
+    $this->assertTrue($initial_hash == $final, 'Menu hash is the same after modify the menu.');
+    drupal_flush_all_caches();
+
+  }
+
+}
diff --git a/tests/test_configs/menu.menu_test.inc b/tests/test_configs/menu.menu_test.inc
new file mode 100644
index 0000000..4c6f08e
--- /dev/null
+++ b/tests/test_configs/menu.menu_test.inc
@@ -0,0 +1,17 @@
+<?php
+/**
+ * @file
+ * menu.menu_test.inc
+ */
+
+$data = array(
+  'menu_name' => 'menu-test',
+  'title' => 'Test',
+  'description' => 'My test menu',
+);
+
+$dependencies = array();
+
+$optional = array();
+
+$modules = array();
diff --git a/ui/configuration_ui.admin.inc b/ui/configuration_ui.admin.inc
index dfa0c18..e95deb2 100644
--- a/ui/configuration_ui.admin.inc
+++ b/ui/configuration_ui.admin.inc
@@ -218,6 +218,7 @@ function configuration_ui_config_info($config_id) {
   $config = ConfigurationManagement::createConfigurationInstance($config_id);
 
   $config->loadFromActiveStore();
+  $identifiers = $config->getAllIdentifiers($config->getComponent());
 
   $status = check_plain($config->getStatus());
   if ($diff_exists && $status != t('In Sync')) {
@@ -242,7 +243,8 @@ function configuration_ui_config_info($config_id) {
 
   $page = '';
 
-  $page .= '<h2>' . t('Configuration for: @config', array('@config' => $config->getUniqueID())) . '</h2>';
+  $page .= '<h2>' . t('Configuration for: @config', array('@config' => $identifiers[$config->getIdentifier()])) . '</h2>';
+  $page .= '<p>' . t('Identifier: @hash', array('@hash' => $config->getIdentifier())) . '</p>';
   $page .= '<p>' . t('Hash: @hash', array('@hash' => $config->getHash())) . '</p>';
 
   $page .= '<p>' . t('Status: <strong>!status</strong>', array('!status' => $status)) . '</p>';
