diff --git a/menu_fields.admin.inc b/menu_fields.admin.inc
index 871b898..428550d 100644
--- a/menu_fields.admin.inc
+++ b/menu_fields.admin.inc
@@ -5,6 +5,47 @@
  */
 
 /**
+ * Menu callback which shows an overview page of all the custom menus and
+ * their descriptions.
+ *
+ * Basic version taken from menu_overview_page(). Since that functions output
+ * can not be altered easily, it has been token over and modified here. The
+ * drawback ist, that changes to the core function do not propagate in here. So
+ * new core releases must be examined for changes to this function and the
+ * changes must be ported in here.
+ */
+function menu_fields_menu_overview_page() {
+  module_load_include('inc', 'menu', 'admin.menu');
+  $enabled_menus = menu_fields_enabled_menus();
+
+  // Direct copy from menu_overview_page().
+  $result = db_query("SELECT * FROM {menu_custom} ORDER BY title", array(), array('fetch' => PDO::FETCH_ASSOC));
+  $header = array(t('Title'), array('data' => t('Operations'), 'colspan' => '5')); // <- colspan has been changed from 3 to 5
+  $rows = array();
+  foreach ($result as $menu) {
+    $row = array(theme('menu_admin_overview', array('title' => $menu['title'], 'name' => $menu['menu_name'], 'description' => $menu['description'])));
+    $row[] = array('data' => l(t('list links'), 'admin/structure/menu/manage/' . $menu['menu_name']));
+    $row[] = array('data' => l(t('edit menu'), 'admin/structure/menu/manage/' . $menu['menu_name'] . '/edit'));
+
+    // Start: Specific to menu_fields
+    if (in_array($menu['menu_name'], $enabled_menus)) {
+      $row[] = array('data' => l(t('manage fields'), 'admin/structure/menu/manage/' . $menu['menu_name'] . '/fields'));
+      $row[] = array('data' => l(t('manage display'), 'admin/structure/menu/manage/' . $menu['menu_name'] . '/display'));
+    }
+    else {
+      $row[] = '';
+      $row[] = '';
+    }
+    // End: Specific to menu_fields
+
+    $row[] = array('data' => l(t('add link'), 'admin/structure/menu/manage/' . $menu['menu_name'] . '/add'));
+    $rows[] = $row;
+  }
+
+  return theme('table', array('header' => $header, 'rows' => $rows));
+}
+
+/**
  * Form definition for menu fields configuration.
  */
 function menu_fields_field_configuration_form() {
@@ -40,14 +81,14 @@ function menu_fields_field_configuration_form() {
         'data' => array(
           '#type' => 'link',
           '#title' => t('Manage fields'),
-          '#href' => 'admin/structure/menu_fields/' . menu_fields_create_machine_name($key) . '/fields',
+          '#href' => 'admin/structure/menu/manage/' . $key . '/fields',
         ),
       );
       $options[$key]['operation_display'] = array(
         'data' => array(
           '#type' => 'link',
           '#title' => t('Manage display'),
-          '#href' => 'admin/structure/menu_fields/' . menu_fields_create_machine_name($key) . '/display',
+          '#href' => 'admin/structure/menu/manage/' . $key . '/display',
         ),
       );
 
diff --git a/menu_fields.info b/menu_fields.info
index df74e74..da16a00 100644
--- a/menu_fields.info
+++ b/menu_fields.info
@@ -6,3 +6,9 @@ dependencies[] = menu (>7.8)
 dependencies[] = entity
 
 configure = admin/structure/menu_fields
+
+files[] = views/menu_fields_handler_field_menu_link_path.inc
+files[] = views/menu_fields_handler_field_menu_link.inc
+files[] = views/menu_fields_views_plugin_argument_default_mlid.inc
+files[] = views/menu_fields_views_plugin_argument_default_plid.inc
+files[] = views/menu_fields_views_handler_relationship_node.inc
\ No newline at end of file
diff --git a/menu_fields.module b/menu_fields.module
index b7f8b36..4857a71 100644
--- a/menu_fields.module
+++ b/menu_fields.module
@@ -21,17 +21,99 @@ function menu_fields_permission() {
 function menu_fields_theme($existing, $type, $theme, $path) {
   return array(
     'entity__menu_fields' => array(
+      'base hook' => 'entity',
+      'render element' => 'elements',
+      'template' => 'entity--menu-fields',
+      'path' => $path . '/templates',
+      'pattern' => 'entity__menu_fields__',
+    ),
+    'menu_fields_menu_link' => array(
       'render element' => 'elements',
-      'template' => 'templates/entity--menu-fields',
     ),
   );
 }
 
+function menu_fields_entity_view($entity, $type, $view_mode, $langcode) {
+  if ($type != 'menu_fields') {
+    return;
+  }
+
+  list(, , $bundle) = entity_extract_ids('menu_fields', $entity);
+  $link = menu_link_load($entity->mlid);
+  if (!$link) {
+    return;
+  }
+
+  // Get our extra field display values.
+  $extra_fields = field_info_extra_fields('menu_fields', $bundle, 'display');
+
+  if ($extra_fields['menu_fields_link']['display'][$view_mode]['visible']) {
+    $parameters = array(
+      'active_trail' => array($link['plid']),
+      'only_active_trail' => FALSE,
+      'min_depth' => $link['depth'],
+      'max_depth' => $link['depth'],
+      'conditions' => array('mlid' => $link['mlid']),
+    );
+    $links = menu_build_tree($link['menu_name'], $parameters);
+    reset($links);
+    $first_key = key($links);
+    $links[$first_key]['link']['render_menu_fields'] = FALSE;
+    // TODO: Dirty work around. Sometimes the title arguments are not resolved
+    // resulting in an error message caused by an unloaded node object.
+    if (!empty($links[$first_key]['link']['title'])) {
+      $links[$first_key]['link']['title_callback'] = NULL;
+      $links[$first_key]['link']['title_arguments'] = NULL;
+    }
+    $entity->content['menu_fields_link'] = menu_tree_output($links);
+    $entity->content['menu_fields_link']['#weight'] = $extra_fields['menu_fields_link']['display'][$view_mode]['weight'];
+  }
+
+  if ($extra_fields['menu_fields_link_children']['display'][$view_mode]['visible'] && $link['has_children']) {
+    $parameters = array(
+        'active_trail' => array($link['plid']),
+        'only_active_trail' => FALSE,
+        'min_depth' => $link['depth'] + 1,
+        'max_depth' => $link['depth'] + 1,
+        'conditions' => array('plid' => $link['mlid']),
+      );
+    $links = menu_build_tree($link['menu_name'], $parameters);
+    reset($links);
+    $first_key = key($links);
+    // TODO: Dirty work around. Sometimes the title arguments are not resolved
+    // resulting in an error message caused by an unloaded node object.
+    if (!empty($links[$first_key]['link']['title'])) {
+      $links[$first_key]['link']['title_callback'] = NULL;
+      $links[$first_key]['link']['title_arguments'] = NULL;
+    }
+    $entity->content['menu_fields_link_children'] = menu_tree_output($links);
+    $entity->content['menu_fields_link_children']['#weight'] = $extra_fields['menu_fields_link_children']['display'][$view_mode]['weight'];
+  }
+
+  if ($extra_fields['menu_fields_link_path']['display'][$view_mode]['visible']) {
+    $entity->content['menu_fields_link_path'] = array(
+      '#type' => 'item',
+      '#markup' => ($link['href'] === '<front>') ? variable_get('site_frontpage', 'node') : $link['href'],
+      '#weight' => $extra_fields['menu_fields_link_path']['display'][$view_mode]['weight'],
+    );
+  }
+
+  if ($extra_fields['menu_fields_link_title']['display'][$view_mode]['visible']) {
+    $entity->content['menu_fields_link_title'] = array(
+      '#type' => 'item',
+      '#markup' => $link['link_title'],
+      '#weight' => $extra_fields['menu_fields_link_title']['display'][$view_mode]['weight'],
+    );
+  }
+
+}
+
 /**
  * Implements hook_preprocess_entity().
  */
 function menu_fields_preprocess_entity(&$vars) {
   if ($vars['entity_type'] == 'menu_fields') {
+
     // Pass the menu link to the template.
     if (!empty($vars['menu_fields']->link)) {
       // If this is from rendering the menu link, the entity will have the
@@ -39,14 +121,39 @@ function menu_fields_preprocess_entity(&$vars) {
       $vars['link'] = $vars['menu_fields']->link;
     }
     else {
+      // This comes directly from entity_view, no menu link has been rendered
+      // yet, which means that menu_fields_preprocess_menu_link() has not been
+      // triggered neither.
       $vars['link'] = menu_link_load($vars['menu_fields']->mlid);
     }
 
     // Suggest our own template which doesn't print the title/url to the entity.
     $vars['theme_hook_suggestions'][] = 'entity__menu_fields';
-    // Allow the theme to provide different templates for each bundle.
-    $vars['theme_hook_suggestions'][] = 'entity__menu_fields__' . $vars['elements']['#bundle'];
+    $vars['theme_hook_suggestions'][] = 'menu_fields';
+    $vars['theme_hook_suggestions'][] = 'menu_fields__' . $vars['elements']['#bundle'];
+    $vars['theme_hook_suggestions'][] = 'menu_fields__' . $vars['elements']['#bundle'] . '__' . $vars['elements']['#view_mode'];
+  }
+}
+
+/**
+ * Theme a menu link
+ *
+ * @param array $variables
+ * @return string
+ */
+function theme_menu_fields_menu_link($variables) {
+  $element = $variables['element'];
+  $sub_menu = '';
+
+  $render_fields = !isset($element['#original_link']['render_menu_fields']) || $element['#original_link']['render_menu_fields'];
+
+  // Yes, we replace the menu link entirely. What else should we do?
+  if ($element['#menu_fields'] && $render_fields) {
+    $menu_fields = drupal_render($element['#menu_fields']);
+    return $menu_fields . "\n";
   }
+  $output = l($element['#title'], $element['#href'], $element['#localized_options']);
+  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . "</li>\n";
 }
 
 /**
@@ -61,6 +168,11 @@ function menu_fields_preprocess_menu_link(&$vars) {
     return;
   }
 
+  $render_fields = !isset($element['#original_link']['render_menu_fields']) || $element['#original_link']['render_menu_fields'];
+  if (!$render_fields) {
+    return;
+  }
+
   $mlid = $element['#original_link']['mlid'];
   $entity = menu_fields_load_by_mlid($mlid);
 
@@ -83,25 +195,11 @@ function menu_fields_preprocess_menu_link(&$vars) {
   // Stash the link on the entity object so we can pass it to the template.
   $entity->link = $element['#original_link'];
 
-  $view = entity_view('menu_fields', array($entity), 'full');
-
-  // Get our extra field display values.
-  $extra_fields = field_info_extra_fields('menu_fields', $entity->bundle(), 'display');
-
-  // We must add our extra field values into the view to be rendered.
-  foreach ($view['menu_fields'] as $id => &$entity_view) {
-    $entity_view['menu_fields_links_primary'] = array(
-      '#markup' => l($element['#title'], $element['#href'], $element['#localized_options']),
-      '#weight' => $extra_fields['menu_fields_links_primary']['display']['default']['weight'],
-    );
-    $entity_view['menu_fields_links_secondary'] = array(
-      '#markup' => isset($element['#below']) ? drupal_render($element['#below']) : '',
-      '#weight' => $extra_fields['menu_fields_links_secondary']['display']['default']['weight'],
-    );
-  }
-
-  $element['#below'] = $view;
+  $view = entity_view('menu_fields', array($entity), isset($vars['#view_mode']) ? $vars['#view_mode'] : 'default');
+  $element['#menu_fields'] = $view;
   $element['#attributes']['class'][] = 'menu-fields-menu-link';
+
+  $vars['theme_hook_suggestions'][] = 'menu_fields_menu_link';
 }
 
 /**
@@ -111,20 +209,34 @@ function menu_fields_field_extra_fields() {
   $info = array();
   foreach (menu_fields_enabled_menus() as $menu) {
     $menu = menu_fields_create_machine_name($menu);
-    if (!isset($info['menu_fields'][$menu]['display']['menu_fields_links_primary'])) {
-      $info['menu_fields'][$menu]['display']['menu_fields_links_primary'] = array(
-        'label' => t('Primary link'),
-        'description' => t('The main top level link.'),
+    if (!isset($info['menu_fields'][$menu]['display']['menu_fields_link'])) {
+      $info['menu_fields'][$menu]['display']['menu_fields_link'] = array(
+        'label' => t('Menu link'),
+        'description' => t('A fully rendered menu link (default style).'),
         'weight' => 10,
       );
     }
-    if (!isset($info['menu_fields'][$menu]['display']['menu_fields_links_secondary'])) {
-      $info['menu_fields'][$menu]['display']['menu_fields_links_secondary'] = array(
+    if (!isset($info['menu_fields'][$menu]['display']['menu_fields_link_children'])) {
+      $info['menu_fields'][$menu]['display']['menu_fields_link_children'] = array(
         'label' => t('Child links'),
-        'description' => t('Children links of the primary menu item.'),
+        'description' => t('Children links of the menu item.'),
         'weight' => 20,
       );
     }
+    if (!isset($info['menu_fields'][$menu]['display']['menu_fields_link_path'])) {
+      $info['menu_fields'][$menu]['display']['menu_fields_link_path'] = array(
+        'label' => t('Link path'),
+        'description' => t('The link path of the menu item.'),
+        'weight' => 30,
+      );
+    }
+    if (!isset($info['menu_fields'][$menu]['display']['menu_fields_link_title'])) {
+      $info['menu_fields'][$menu]['display']['menu_fields_link_title'] = array(
+        'label' => t('Link title'),
+        'description' => t('The link title of the menu item.'),
+        'weight' => 40,
+      );
+    }
   }
   return $info;
 }
@@ -133,66 +245,106 @@ function menu_fields_field_extra_fields() {
  * Implements hook_menu().
  */
 function menu_fields_menu() {
-  $items['admin/structure/menu_fields'] = array(
+  $items['admin/structure/menu/menu-fields'] = array(
     'title' => 'Menu fields',
-    'type' => MENU_NORMAL_ITEM,
+    'type' => MENU_LOCAL_TASK,
     'description' => 'Configure menu fields.',
     'access arguments' => array('administer menu fields'),
     'page arguments' => array('menu_fields_field_configuration_form'),
     'page callback' => 'drupal_get_form',
     'file' => 'menu_fields.admin.inc',
-    'weight' => 0,
-  );
-  // Menu items to add field/display tabs on the menu listing page.
-  $items['admin/structure/menu/manage/%/fields'] = array(
-    'title' => 'Manage Fields',
-    'page callback' => 'menu_fields_tab_redirect',
-    'page arguments' => array(4, 'fields'),
-    'access arguments' => array('administer menu fields'),
-    'type' => MENU_LOCAL_TASK,
-    'weight' => 5,
-  );
-  $items['admin/structure/menu/manage/%/display'] = array(
-    'title' => 'Manage Display',
-    'page callback' => 'menu_fields_tab_redirect',
-    'page arguments' => array(4, 'display'),
-    'access arguments' => array('administer menu fields'),
-    'type' => MENU_LOCAL_TASK,
     'weight' => 10,
   );
   return $items;
 }
 
 /**
- * Redirect callback used to simulate tab on menu pages.
+ * Implements hook_menu_alter().
  *
- * @param string $menu
- *   Menu name.
- * @param string $destination
- *   End of the destination path.
+ * Add support for drupal style "manage fields" and "manage display" tabs.
  */
-function menu_fields_tab_redirect($menu, $destination = '') {
-  $active_menus = variable_get('menu_fields_menus', array());
-  if (!in_array($menu, $active_menus)) {
-    drupal_set_message(t('Menu Fields integration is currently not enabled for "%menu".', array(
-      '%menu' => $menu,
-    )), 'warning');
+function menu_fields_menu_alter(&$items) {
+  foreach ($items as $path => $item) {
+    $map = explode('/', $path);
+    $map_count = count($map);
+    if (strpos($path, 'admin/structure/menu/manage/%/fields') !== FALSE && $map_count == 6) {
+      $items[$path]['page arguments'][0] = 'menu_fields_field_ui_field_overview_form';
+      $items[$path]['type'] = MENU_LOCAL_TASK;
+    }
+    if (strpos($path, 'admin/structure/menu/manage/%/display') !== FALSE && $map_count == 6) {
+      $items[$path]['page arguments'][0] = 'menu_fields_field_ui_display_overview_form';
+    }
+    if (strpos($path, 'admin/structure/menu/manage/%/display') !== FALSE && $map_count == 7) {
+      $items[$path]['page arguments'][0] = 'menu_fields_field_ui_display_overview_form';
+      $items[$path]['access callback'] = 'menu_fields_field_ui_view_mode_menu_access';
+      // $items[$path]['access arguments'] = array(4);
+    }
+    if (strpos($path, '%field_ui_menu') !== FALSE) {
+      $path_new = str_replace('%field_ui_menu', '%menu_fields_field_ui_menu', $path);
+      $items[$path_new] = $items[$path];
+      unset($items[$path]);
+    }
   }
-  $value = menu_fields_create_machine_name($menu);
-  drupal_goto('admin/structure/menu_fields/' . $value . '/' . $destination);
+  $items['admin/structure/menu']['page callback'] = 'menu_fields_menu_overview_page';
+  $items['admin/structure/menu']['file'] = 'menu_fields.admin.inc';
+  $items['admin/structure/menu']['file path'] = drupal_get_path('module', 'menu_fields');
 }
 
 /**
- * Implements hook_menu_alter().
+ * Menu loader; Load a field instance based on field and bundle name.
+ *
+ * @param $field_name
+ *   The name of the field, as contained in the path.
+ * @param $entity_type
+ *   The name of the entity.
+ * @param $bundle_name
+ *   The name of the bundle, as contained in the path.
+ * @param $bundle_pos
+ *   The position of $bundle_name in $map.
+ * @param $map
+ *   The translated menu router path argument map.
+ *
+ * @return
+ *   The field instance array.
+ *
+ * @ingroup field
  */
-function menu_fields_menu_alter(&$items) {
-  $menus = menu_fields_enabled_menus();
-  foreach ($menus as $key => $value) {
-    $value = menu_fields_create_machine_name($value);
-    // Hide the field display
-    $items['admin/structure/menu_fields/' . $value . '/fields']['type'] = MENU_CALLBACK;
-    $items['admin/structure/menu_fields/' . $value . '/display']['type'] = MENU_CALLBACK;
-  }
+function menu_fields_field_ui_menu_load($field_name, $entity_type, $bundle_name, $bundle_pos, $map) {
+  $bundle_name = str_replace('-', '_', $bundle_name);
+  $map[$bundle_pos] = str_replace('-', '_', $map[$bundle_pos]);
+  return field_ui_menu_load($field_name, $entity_type, $bundle_name, $bundle_pos, $map);
+}
+
+/**
+ * Wrapper around field_ui_field_overview_form().
+ */
+function menu_fields_field_ui_field_overview_form($form, &$form_state, $entity_type, $bundle) {
+  $bundle = menu_fields_create_machine_name($bundle);
+  $form = field_ui_field_overview_form($form, $form_state, $entity_type, $bundle);
+  return $form;
+}
+
+/**
+ * Wrapper around field_ui_field_overview_form_submit().
+ */
+function menu_fields_field_ui_field_overview_form_submit($form, &$form_state) {
+  field_ui_field_overview_form_submit($form, $form_state);
+}
+
+/**
+ * Wrapper around field_ui_display_overview_form().
+ */
+function menu_fields_field_ui_display_overview_form($form, &$form_state, $entity_type, $bundle, $view_mode) {
+  $bundle = menu_fields_create_machine_name($bundle);
+  $form = field_ui_display_overview_form($form, $form_state, $entity_type, $bundle, $view_mode);
+  return $form;
+}
+
+/**
+ * Wrapper around field_ui_field_overview_form_submit().
+ */
+function menu_fields_field_ui_display_overview_form_submit($form, &$form_state) {
+  field_ui_display_overview_form_submit($form, $form_state);
 }
 
 /**
@@ -244,49 +396,6 @@ function menu_fields_form_menu_edit_item_alter(&$form, &$form_state) {
 }
 
 /**
- * Implements hook_form_FORM_ID_alter().
- *
- * Modify the field settings form to display menu links.
- */
-function menu_fields_form_field_ui_field_overview_form_alter(&$form, &$form_state, $form_id) {
-  if ($form['#entity_type'] == 'menu_fields') {
-    menu_fields_add_menu_links_form_alter($form, $form_state, $form_id);
-  }
-}
-
-/**
- * Implements hook_form_FORM_ID_alter().
- *
- * Modify the display settings form to display menu links.
- */
-function menu_fields_form_field_ui_display_overview_form_alter(&$form, &$form_state, $form_id) {
-  if ($form['#entity_type'] == 'menu_fields') {
-    menu_fields_add_menu_links_form_alter($form, $form_state, $form_id);
-  }
-}
-
-/**
- * Alters a form to include menu links.
- *
- * @see menu_fields_form_field_ui_display_overview_form_alter()
- * @see menu_fields_form_field_ui_field_overview_form_alter()
- */
-function menu_fields_add_menu_links_form_alter(&$form, &$form_state, $form_id) {
-  // Add some useful contextual links to manage this menu.
-  $form['links'] = array(
-    '#type' => 'container',
-    '#weight' => -999,
-    'links' => array(
-      '#theme' => 'item_list',
-      '#items' => array(
-        l(t('List Links'), 'admin/structure/menu/manage/' . str_replace('_', '-', $form['#bundle'])),
-        l(t('Edit Menu'), 'admin/structure/menu/manage/' . str_replace('_', '-', $form['#bundle']) . '/edit'),
-      ),
-    ),
-  );
-}
-
-/**
  * Implements hook_menu_link_delete().
  */
 function menu_fields_menu_link_delete($link) {
@@ -446,8 +555,11 @@ function menu_fields_entity_info() {
 
     if (in_array($key, $enabled_menus)) {
       $bundles[$machine_name]['admin'] = array(
-        'path' => 'admin/structure/menu_fields/' . $machine_name,
-        'access arguments' => array('administer menu fields'),
+        'path' => 'admin/structure/menu/manage/%',
+        'real path' => 'admin/structure/menu/manage/' . str_replace('_', '-', $machine_name),
+        'bundle argument' => 4,
+        'access callback' => 'menu_fields_admin_access',
+        'access arguments' => array(4),
       );
     }
   }
@@ -467,12 +579,41 @@ function menu_fields_entity_info() {
     'bundles' => $bundles,
     'entity class' => 'Entity',
     'module' => 'menu_fields',
+    'view modes' => array(
+      'full' => array(
+        'label' => t('Full'),
+        'default' => FALSE,
+      ),
+      'block' => array(
+        'label' => t('Block'),
+        'default' => FALSE,
+      ),
+    ),
   );
 
   return $info;
 }
 
 /**
+ * Entity admin access callback.
+ *
+ * @param string $menu
+ * @return boolean
+ * @see menu_fields_entity_info()
+ */
+function menu_fields_admin_access($menu) {
+  $enabled_menus = menu_fields_enabled_menus();
+  if (!in_array($menu, $enabled_menus)) {
+    return FALSE;
+  }
+  return user_access('administer menu fields');
+}
+
+function menu_fields_field_ui_view_mode_menu_access($entity_type, $bundle, $view_mode, $access_callback) {
+  return _field_ui_view_mode_menu_access($entity_type, str_replace('-', '_', $bundle), $view_mode, $access_callback, $bundle);
+}
+
+/**
  * Gets the Menu Fields entity for given Menu Link ID.
  *
  * @param int $mlid
@@ -550,3 +691,14 @@ function menu_fields_entity_id_by_menu($menu_name) {
 function menu_fields_create_machine_name($value) {
   return str_replace('-', '_', $value);
 }
+
+/**
+ * Implements hook_views_api().
+ */
+function menu_fields_views_api() {
+  return array(
+    'api' => 3,
+    'path' => drupal_get_path('module', 'menu_fields') . '/views',
+  );
+}
+
diff --git a/templates/entity--menu-fields.tpl.php b/templates/entity--menu-fields.tpl.php
index 280d02a..f0d42c3 100644
--- a/templates/entity--menu-fields.tpl.php
+++ b/templates/entity--menu-fields.tpl.php
@@ -3,10 +3,32 @@
  * @file
  * Used to override the default entity template.
  * @see entity.tpl.php
+ *
+ * Available variables:
+ * - $content: An array of comment items. Use render($content) to print them all, or
+ *   print a subset such as render($content['field_example']). Use
+ *   hide($content['field_example']) to temporarily suppress the printing of a
+ *   given element.
+ * - $title: The (sanitized) entity label.
+ * - $url: Direct url of the current entity if specified.
+ * - $page: Flag for the full page state.
+ * - $classes: String of classes that can be used to style contextually through
+ *   CSS. It can be manipulated through the variable $classes_array from
+ *   preprocess functions. By default the following classes are available, where
+ *   the parts enclosed by {} are replaced by the appropriate values:
+ *   - entity-{ENTITY_TYPE}
+ *   - {ENTITY_TYPE}-{BUNDLE}
+ *
+ * Other variables:
+ * - $classes_array: Array of html class attribute values. It is flattened
+ *   into a string within the variable $classes.
+ * - $menu_fields: The full menu item field entity
+ * - $field_*: Any fields available for the current menu item.
+ *
  */
 ?>
 <div class="<?php print $classes; ?> clearfix"<?php print $attributes; ?>>
   <div class="content"<?php print $content_attributes; ?>>
-    <?php print render($content) ?>
+    <?php print render($content); ?>
   </div>
 </div>
diff --git a/views/menu_fields.views.inc b/views/menu_fields.views.inc
new file mode 100644
index 0000000..c55d065
--- /dev/null
+++ b/views/menu_fields.views.inc
@@ -0,0 +1,201 @@
+<?php
+
+/**
+ * Implements hook_views_data().
+ */
+function menu_fields_views_data() {
+  $data = array();
+  $data['menu_fields']['table']['group'] = t('Menu fields');
+  $data['menu_fields']['table']['entity type'] = 'menu_fields';
+  $data['menu_fields']['table']['base'] = array(
+    'field' => 'mlid', // This is the identifier field for the view.
+    'title' => t('Menu fields'),
+    'help' => t('The menu fields table'),
+    'weight' => -10,
+  );
+
+  $data['menu_fields']['table']['join'] = array(
+    'menu_links' => array(
+      'left_field' => 'mlid',
+      'field' => 'mlid',
+    ),
+  );
+
+  $data['menu_fields']['mlid'] = array(
+    'title' => t('Menu link id (mlid)'),
+    'help' => t('The ID of a menu item.'),
+    'relationship' => array(
+      'base' => 'menu_links', // The name of the table to join with.
+      'base field' => 'mlid', // The name of the field on the joined table.
+      // 'field' => 'nid' -- see hook_views_data_alter(); not needed here.
+      'handler' => 'views_handler_relationship',
+      'label' => t('Relates to menu links'),
+      'title' => t('Menu links'),
+      'help' => t('Add relation to the link properties of a menu item if any'),
+    ),
+  );
+  $data['menu_fields']['menu_name'] = array(
+    'title' => t('Menu name'),
+    'help' => t('The menu that a menu item belongs to.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE, // This is use by the table display plugin.
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+    ),
+  );
+
+  $data['menu_links']['table']['group'] = t('Menu fields');
+  $data['menu_links']['table']['base'] = array(
+    'field' => 'mlid', // This is the identifier field for the view.
+    'title' => t('Menu links'),
+    'help' => t('The drupal menu links table'),
+    'weight' => -10,
+  );
+  $data['menu_links']['table']['join'] = array(
+    'menu_fields' => array(
+      'left_field' => 'mlid',
+      'field' => 'mlid',
+    ),
+  );
+  $data['menu_links']['mlid'] = array(
+    'title' => t('Menu link id (mlid)'),
+    'help' => t('The ID of a menu item.'),
+    'relationship' => array(
+      'base' => 'menu_fields', // The name of the table to join with.
+      'base field' => 'mlid', // The name of the field on the joined table.
+      // 'field' => 'nid' -- see hook_views_data_alter(); not needed here.
+      'handler' => 'views_handler_relationship',
+      'label' => t('Menu fields'),
+      'title' => t('Menu fields'),
+      'help' => t('Add relation to the fields of a menu item if any'),
+    ),
+    'field' => array(
+      'handler' => 'views_handler_field_numeric',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_numeric',
+    ),
+  );
+  $data['menu_links']['plid'] = array(
+    'title' => t('Parent menu link id (plid)'),
+    'help' => t('The ID of a menu items parent.'),
+    'relationship' => array(
+      'base' => 'menu_links', // The name of the table to join with.
+      'base field' => 'mlid', // The name of the field on the joined table.
+      // 'field' => 'nid' -- see hook_views_data_alter(); not needed here.
+      'handler' => 'views_handler_relationship',
+      'label' => t('Menu parent'),
+      'title' => t('Menu parent'),
+      'help' => t('Add relation to the parent of a menu item if any'),
+    ),
+    'field' => array(
+      'handler' => 'views_handler_field_numeric',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_numeric',
+    ),
+  );
+  $data['menu_links']['link_title'] = array(
+    'title' => t('Menu item title'),
+    'help' => t('The title of a menu item.'),
+    'field' => array(
+      'handler' => 'menu_fields_handler_field_menu_link',
+      'click sortable' => TRUE, // This is use by the table display plugin.
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+    ),
+  );
+  $data['menu_links']['link_path'] = array(
+    'title' => t('Menu item path'),
+    'help' => t('The link path of a menu item.'),
+    'field' => array(
+      'handler' => 'views_handler_field',
+      'click sortable' => TRUE, // This is use by the table display plugin.
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+    ),
+  );
+  $data['menu_links']['node'] = array(
+    'title' => t('Menu items node'),
+    'help' => t('The generic path of a menu item.'),
+    'relationship' => array(
+      'base' => 'node', // The name of the table to join with.
+      'base field' => 'nid', // The name of the field on the joined table.
+      'field' => 'link_path',
+      'handler' => 'menu_fields_views_handler_relationship_node',
+      'label' => t('Links target node'),
+      'title' => t('Links target node'),
+      'help' => t('Add relation to the links target node (if any)'),
+    ),
+  );
+  $data['menu_links']['weight'] = array(
+    'title' => t('Menu item weight'),
+    'help' => t("The weight of a menu item."),
+    'field' => array(
+      'handler' => 'views_handler_field_numeric',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+  $data['menu_links']['depth'] = array(
+    'title' => t('Menu item depth'),
+    'help' => t("The depth of a menu items in it's menu."),
+    'field' => array(
+      'handler' => 'views_handler_field_numeric',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+    ),
+  );
+  return $data;
+}
+
+/**
+ * Implements hook_views_plugins().
+ */
+function menu_fields_views_plugins() {
+  return array(
+    'argument default' => array(
+      'menu_fields' => array(
+        'title' => t('Menu link ID from URL context'),
+        'handler' => 'menu_fields_views_plugin_argument_default_mlid',
+      ),
+    ),
+  );
+}
\ No newline at end of file
diff --git a/views/menu_fields_handler_field_menu_link.inc b/views/menu_fields_handler_field_menu_link.inc
new file mode 100644
index 0000000..cec23c7
--- /dev/null
+++ b/views/menu_fields_handler_field_menu_link.inc
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * @file
+ * Contains the basic 'node' field handler.
+ */
+
+/**
+ * Field handler to provide simple renderer that allows linking to a node.
+ * Definition terms:
+ * - link_to_node default: Should this field have the checkbox "link to node" enabled by default.
+ *
+ * @ingroup views_field_handlers
+ */
+class menu_fields_handler_field_menu_link extends views_handler_field {
+
+  function init(&$view, &$options) {
+    parent::init($view, $options);
+    // Don't add the additional fields to groupby
+    if (!empty($this->options['link_to_content'])) {
+      $this->additional_fields['mlid'] = array('table' => 'menu_links', 'field' => 'mlid');
+      $this->additional_fields['link_path'] = array('table' => 'menu_links', 'field' => 'link_path');
+    }
+  }
+
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['link_to_content'] = array('default' => isset($this->definition['link_to_content']) ? $this->definition['link_to_content'] : FALSE, 'bool' => TRUE);
+    return $options;
+  }
+
+  /**
+   * Provide link to node option
+   */
+  function options_form(&$form, &$form_state) {
+    $form['link_to_content'] = array(
+      '#title' => t('Link this field to the linked content'),
+      '#description' => t("Enable to override this field's links."),
+      '#type' => 'checkbox',
+      '#default_value' => !empty($this->options['link_to_content']),
+    );
+
+    parent::options_form($form, $form_state);
+  }
+
+  /**
+   * Render whatever the data is as a link to the node.
+   *
+   * Data should be made XSS safe prior to calling this function.
+   */
+  function render_link($data, $values) {
+    if (!empty($this->options['link_to_content']) && !empty($this->additional_fields['link_path'])) {
+      if ($data !== NULL && $data !== '') {
+        $this->options['alter']['make_link'] = TRUE;
+        $this->options['alter']['path'] = $this->get_value($values, 'link_path');
+      }
+      else {
+        $this->options['alter']['make_link'] = FALSE;
+      }
+    }
+    return $data;
+  }
+
+  function render($values) {
+    $value = $this->get_value($values);
+    return $this->render_link($this->sanitize_value($value), $values);
+  }
+}
diff --git a/views/menu_fields_handler_field_menu_link_path.inc b/views/menu_fields_handler_field_menu_link_path.inc
new file mode 100644
index 0000000..cc9bcf6
--- /dev/null
+++ b/views/menu_fields_handler_field_menu_link_path.inc
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Definition of views_handler_field_node_link.
+ */
+
+/**
+ * Field handler to present a link to the node.
+ *
+ * @ingroup views_field_handlers
+ */
+class menu_fields_handler_field_menu_link_path extends views_handler_field_entity {
+
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['text'] = array('default' => '', 'translatable' => TRUE);
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    $form['text'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Text to display'),
+      '#default_value' => $this->options['text'],
+    );
+    parent::options_form($form, $form_state);
+
+    // The path is set by render_link function so don't allow to set it.
+    $form['alter']['path'] = array('#access' => FALSE);
+    $form['alter']['external'] = array('#access' => FALSE);
+  }
+
+  function render($values) {
+    if ($menu_link = menu_link_load($values->mlid)) {
+      return $this->render_link($menu_link, $values);
+    }
+  }
+
+  function render_link($menu_link, $values) {
+    $this->options['alter']['make_link'] = TRUE;
+    $this->options['alter']['path'] = $menu_link['link_path'];
+    $text = !empty($this->options['text']) ? $this->options['text'] : $menu_link['link_title'];
+    return $text;
+  }
+}
diff --git a/views/menu_fields_views_handler_relationship_node.inc b/views/menu_fields_views_handler_relationship_node.inc
new file mode 100644
index 0000000..83d5b79
--- /dev/null
+++ b/views/menu_fields_views_handler_relationship_node.inc
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * @file
+ * Definition of views_handler_relationship_node_term_data.
+ */
+
+/**
+ * Relationship handler to return the taxonomy terms of nodes.
+ *
+ * @ingroup views_relationship_handlers
+ */
+class menu_fields_views_handler_relationship_node extends views_handler_relationship  {
+  function init(&$view, &$options) {
+    parent::init($view, $options);
+  }
+
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['menu'] = array('default' => '');
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    $menus = menu_get_menus();
+    $options = array();
+    foreach ($menus as $key => $menu_name) {
+      $options[$key] = check_plain($menu_name);
+    }
+
+    $form['menu'] = array(
+      '#type' => 'select',
+      '#title' => t('Menu'),
+      '#options' => $options,
+      '#default_value' => $this->options['menu'],
+      '#description' => t('Choose which menu you wish to relate.'),
+    );
+    parent::options_form($form, $form_state);
+  }
+
+  /**
+   * Called to implement a relationship in a query.
+   */
+  function query() {
+    $this->ensure_my_table();
+
+    $def = $this->definition;
+    $def['table'] = 'node';
+
+    $def['left_table'] = $this->table_alias;
+    $def['left_field'] = 'link_path';
+    $def['field'] = 'link_path';
+    $def['type'] = 'INNER';
+
+    $query = db_select('menu_links', 'ml');
+    $query->addJoin($def['type'], 'node', 'n', 'REPLACE(ml.link_path, \'node/\', \'\') = n.nid');
+    $query->fields('n');
+    $query->fields('ml', array('link_path'));
+    $def['table formula'] = $query;
+
+    $join = new views_join();
+
+    $join->definition = $def;
+    $join->construct();
+    $join->adjusted = TRUE;
+
+    // use a short alias for this:
+    $alias = $def['table'] . '_' . $this->table;
+
+    $this->alias = $this->query->add_relationship($alias, $join, 'node', $this->relationship);
+  }
+}
diff --git a/views/menu_fields_views_plugin_argument_default_mlid.inc b/views/menu_fields_views_plugin_argument_default_mlid.inc
new file mode 100644
index 0000000..99de93c
--- /dev/null
+++ b/views/menu_fields_views_plugin_argument_default_mlid.inc
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @file
+ * Contains the menu item from URL argument default plugin.
+ */
+
+/**
+ * Default argument plugin to extract a menu item from the url context
+ *
+ * This plugin actually has no options so it does not need to do a great deal.
+ */
+class menu_fields_views_plugin_argument_default_mlid extends views_plugin_argument_default {
+
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['menu_name'] = array('default' => '');
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    $form['warning'] = array(
+      '#type' => 'item',
+      '#markup' => '',
+      '#description' => t('Note: The detection will fail for the frontpage link if it has been created using <em>"&lt;front&gt;"</em>.'),
+    );
+    $form['menu_name'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Menu name'),
+      '#default_value' => $this->options['menu_name'],
+    );
+  }
+
+  function get_argument() {
+    $link = menu_link_get_preferred(NULL, $this->options['menu_name']);
+    return isset($link['mlid']) ? $link['mlid'] : NULL;
+  }
+}
diff --git a/views/menu_fields_views_plugin_argument_default_plid.inc b/views/menu_fields_views_plugin_argument_default_plid.inc
new file mode 100644
index 0000000..bbe5e8c
--- /dev/null
+++ b/views/menu_fields_views_plugin_argument_default_plid.inc
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @file
+ * Contains the menu item from URL argument default plugin.
+ */
+
+/**
+ * Default argument plugin to extract a menu item from the url context
+ *
+ * This plugin actually has no options so it does not need to do a great deal.
+ */
+class menu_fields_views_plugin_argument_default_plid extends views_plugin_argument_default {
+
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['menu_name'] = array('default' => '');
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    $form['warning'] = array(
+      '#type' => 'item',
+      '#markup' => '',
+      '#description' => t('Note: The detection will fail for the frontpage link if it has been created using <em>"&lt;front&gt;"</em>.'),
+    );
+    $form['menu_name'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Menu name'),
+      '#default_value' => $this->options['menu_name'],
+    );
+  }
+
+  function get_argument() {
+    $link = menu_link_get_preferred(NULL, $this->options['menu_name']);
+    return isset($link['plid']) ? $link['plid'] : NULL;
+  }
+}
