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 db45024..50bbc21 100644
--- a/menu_fields.module
+++ b/menu_fields.module
@@ -577,3 +577,13 @@ 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/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;
+  }
+}
