diff --git a/linkchecker.info b/linkchecker.info
index eb73aa3..e7cf6da 100644
--- a/linkchecker.info
+++ b/linkchecker.info
@@ -4,3 +4,11 @@ configure = admin/config/content/linkchecker
 core = 7.x
 files[] = linkchecker.drush.inc
 files[] = linkchecker.test
+
+; Views handlers
+files[] = views/handlers/linkchecker_handler_field_linkchecker_block_custom_block_edit.inc
+files[] = views/handlers/linkchecker_handler_field_linkchecker_link_link_edit.inc
+files[] = views/handlers/linkchecker_handler_field_linkchecker_link_redirect_add.inc
+files[] = views/handlers/linkchecker_handler_field_linkchecker_link_url.inc
+files[] = views/handlers/linkchecker_handler_filter_linkchecker_link_code.inc
+files[] = views/plugins/linkchecker_plugin_access.inc
diff --git a/linkchecker.module b/linkchecker.module
index 81ffc25..0428e9f 100644
--- a/linkchecker.module
+++ b/linkchecker.module
@@ -2379,6 +2379,56 @@ function _linkchecker_link_check_status_filter($url) {
   return $status;
 }
 
+ /**
+ * Returns a list of HTTP status codes.
+ */
+function _linkchecker_response_codes() {
+  return array(
+    100 => '(100) - Continue',
+    101 => '(101) - Switching Protocols',
+    200 => '(200) - OK',
+    201 => '(201) - Created',
+    202 => '(202) - Accepted',
+    203 => '(203) - Non-Authoritative Information',
+    204 => '(204) - No Content',
+    205 => '(205) - Reset Content',
+    206 => '(206) - Partial Content',
+    300 => '(300) - Multiple Choices',
+    301 => '(301) - Moved Permanently',
+    302 => '(302) - Found',
+    303 => '(303) - See Other',
+    304 => '(304) - Not Modified',
+    305 => '(305) - Use Proxy',
+    307 => '(307) - Temporary Redirect',
+    400 => '(400) - Bad Request',
+    401 => '(401) - Unauthorized',
+    402 => '(402) - Payment Required',
+    403 => '(403) - Forbidden',
+    404 => '(404) - Not Found',
+    405 => '(405) - Method Not Allowed',
+    406 => '(406) - Not Acceptable',
+    407 => '(407) - Proxy Authentication Required',
+    408 => '(408) - Request Time-out',
+    409 => '(409) - Conflict',
+    410 => '(410) - Gone',
+    411 => '(411) - Length Required',
+    412 => '(412) - Precondition Failed',
+    413 => '(413) - Request Entity Too Large',
+    414 => '(414) - Request-URI Too Large',
+    415 => '(415) - Unsupported Media Type',
+    416 => '(416) - Requested range not satisfiable',
+    417 => '(417) - Expectation Failed',
+    500 => '(500) - Internal Server Error',
+    501 => '(501) - Not Implemented',
+    502 => '(502) - Bad Gateway',
+    503 => '(503) - Service Unavailable',
+    504 => '(504) - Gateway Time-out',
+    505 => '(505) - HTTP Version not supported',
+    -10053 => '(10053) - Connection timed out. Time to First Byte Timeout.',
+    -11001 => '(11001) - Host not found',
+  );
+}
+
 /**
  * Defines the list of allowed response codes for form input validation.
  *
diff --git a/views/handlers/linkchecker_handler_field_linkchecker_block_custom_block_edit.inc b/views/handlers/linkchecker_handler_field_linkchecker_block_custom_block_edit.inc
new file mode 100644
index 0000000..591ecf5
--- /dev/null
+++ b/views/handlers/linkchecker_handler_field_linkchecker_block_custom_block_edit.inc
@@ -0,0 +1,97 @@
+<?php
+
+/**
+ * @file
+ * Definition of linkchecker_handler_field_linkchecker_block_custom_block_edit.
+ */
+
+/**
+ * Field handler to present a block edit link.
+ *
+ * @ingroup views_field_handlers
+ */
+class linkchecker_handler_field_linkchecker_block_custom_block_edit extends views_handler_field {
+
+  /**
+   * {@inheritdoc}
+   */
+  function construct() {
+    parent::construct();
+
+    $this->additional_fields['bid'] = 'bid';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function option_definition() {
+    $options = parent::option_definition();
+
+    $options['destination'] = array('default' => TRUE, 'bool' => TRUE);
+    $options['text'] = array('default' => '', 'translatable' => TRUE);
+
+    return $options;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  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);
+
+    $form['destination'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Use destination'),
+      '#description' => t('Add destination to the link'),
+      '#default_value' => $this->options['destination'],
+      '#fieldset' => 'more',
+    );
+
+    // 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);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function query() {
+    $this->ensure_my_table();
+    $this->add_additional_fields();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function render($values) {
+    // Check there is an actual value, as on a relationship there may not be.
+    if ($bid = $this->get_value($values, 'bid')) {
+      return $this->render_link($bid);
+    }
+  }
+
+  /**
+   * Renders the link.
+   */
+  function render_link($bid) {
+    if (user_access('administer blocks')) {
+      $this->options['alter']['make_link'] = TRUE;
+      $this->options['alter']['path'] = 'admin/structure/block/manage/block/' . $bid . '/configure';
+
+      if (!empty($this->options['destination'])) {
+        $this->options['alter']['query'] = drupal_get_destination();
+      }
+
+      $text = !empty($this->options['text']) ? $this->options['text'] : t('Edit block');
+
+      return $text;
+    }
+  }
+
+}
diff --git a/views/handlers/linkchecker_handler_field_linkchecker_link_link_edit.inc b/views/handlers/linkchecker_handler_field_linkchecker_link_link_edit.inc
new file mode 100644
index 0000000..5aa5f10
--- /dev/null
+++ b/views/handlers/linkchecker_handler_field_linkchecker_link_link_edit.inc
@@ -0,0 +1,97 @@
+<?php
+
+/**
+ * @file
+ * Definition of linkchecker_handler_field_linkchecker_link_link_edit.
+ */
+
+/**
+ * Field handler to present a linkchecker edit link.
+ *
+ * @ingroup views_field_handlers
+ */
+class linkchecker_handler_field_linkchecker_link_link_edit extends views_handler_field {
+
+  /**
+   * {@inheritdoc}
+   */
+  function construct() {
+    parent::construct();
+
+    $this->additional_fields['lid'] = 'lid';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function option_definition() {
+    $options = parent::option_definition();
+
+    $options['destination'] = array('default' => TRUE, 'bool' => TRUE);
+    $options['text'] = array('default' => '', 'translatable' => TRUE);
+
+    return $options;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  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);
+
+    $form['destination'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Use destination'),
+      '#description' => t('Add destination to the link'),
+      '#default_value' => $this->options['destination'],
+      '#fieldset' => 'more',
+    );
+
+    // 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);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function query() {
+    $this->ensure_my_table();
+    $this->add_additional_fields();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function render($values) {
+    // Check there is an actual value, as on a relationship there may not be.
+    if ($lid = $this->get_value($values, 'lid')) {
+      return $this->render_link($lid);
+    }
+  }
+
+  /**
+   * Renders the link.
+   */
+  function render_link($lid) {
+    if (_linkchecker_access_edit_link_settings(array('lid' => $lid))) {
+      $this->options['alter']['make_link'] = TRUE;
+      $this->options['alter']['path'] = 'linkchecker/' . $lid . '/edit';
+
+      if (!empty($this->options['destination'])) {
+        $this->options['alter']['query'] = drupal_get_destination();
+      }
+
+      $text = !empty($this->options['text']) ? $this->options['text'] : t('Edit link settings');
+
+      return $text;
+    }
+  }
+
+}
diff --git a/views/handlers/linkchecker_handler_field_linkchecker_link_redirect_add.inc b/views/handlers/linkchecker_handler_field_linkchecker_link_redirect_add.inc
new file mode 100644
index 0000000..cf23df9
--- /dev/null
+++ b/views/handlers/linkchecker_handler_field_linkchecker_link_redirect_add.inc
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * @file
+ * Definition of linkchecker_handler_field_linkchecker_link_redirect_add.
+ */
+
+/**
+ * Field handler to present an add redirect link.
+ *
+ * @ingroup views_field_handlers
+ */
+class linkchecker_handler_field_linkchecker_link_redirect_add extends views_handler_field {
+
+  /**
+   * {@inheritdoc}
+   */
+  function construct() {
+    parent::construct();
+
+    $this->additional_fields['lid'] = 'lid';
+    $this->additional_fields['url'] = 'url';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function option_definition() {
+    $options = parent::option_definition();
+
+    $options['destination'] = array('default' => TRUE, 'bool' => TRUE);
+    $options['text'] = array('default' => '', 'translatable' => TRUE);
+
+    return $options;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  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);
+
+    $form['destination'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Use destination'),
+      '#description' => t('Add destination to the link'),
+      '#default_value' => $this->options['destination'],
+      '#fieldset' => 'more',
+    );
+
+    // 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);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function query() {
+    $this->ensure_my_table();
+    $this->add_additional_fields();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function render($values) {
+    // Check there is an actual value, as on a relationship there may not be.
+    if (($lid = $this->get_value($values, 'lid')) && ($url = $this->get_value($values, 'url'))) {
+      $link = (object) array('lid' => $lid, 'url' => $url);
+      return $this->render_link($link);
+    }
+  }
+
+  /**
+   * Renders the link.
+   */
+  function render_link($link) {
+    if (user_access('administer redirects') && _linkchecker_is_internal_url($link)) {
+      $this->options['alter']['make_link'] = TRUE;
+      $this->options['alter']['path'] = 'admin/config/search/redirect/add';
+
+      if (!empty($this->options['destination'])) {
+        $this->options['alter']['query'] = drupal_get_destination();
+      }
+
+      $this->options['alter']['query']['source'] = $link->url;
+      $text = !empty($this->options['text']) ? $this->options['text'] : t('Create redirect');
+
+      return $text;
+    }
+  }
+
+}
diff --git a/views/handlers/linkchecker_handler_field_linkchecker_link_url.inc b/views/handlers/linkchecker_handler_field_linkchecker_link_url.inc
new file mode 100644
index 0000000..6ad66b3
--- /dev/null
+++ b/views/handlers/linkchecker_handler_field_linkchecker_link_url.inc
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Definition of linkchecker_handler_field_linkchecker_link_url.
+ */
+
+/**
+ * Field handler to present a linkchecker url.
+ *
+ * @ingroup views_field_handlers
+ */
+class linkchecker_handler_field_linkchecker_link_url extends views_handler_field {
+
+  /**
+   * {@inheritdoc}
+   */
+  function construct() {
+    parent::construct();
+
+    $this->additional_fields['lid'] = 'lid';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function render($values) {
+    // Check there is an actual value, as on a relationship there may not be.
+    if ($lid = $this->get_value($values, 'lid') && $url = $this->get_value($values)) {
+      $link = (object) array('lid' => $lid, 'url' => $url);
+      return $this->render_link($link);
+    }
+  }
+
+  /**
+   * Renders the link.
+   */
+  function render_link($link) {
+    if (user_access('access broken links report') || _linkchecker_link_access($link)) {
+      $this->options['alter']['make_link'] = TRUE;
+      $this->options['alter']['path'] = $link->url;
+      return $link->url;
+    }
+    else {
+      return t('Permission restrictions deny you access to this broken link.');
+    }
+  }
+
+}
diff --git a/views/handlers/linkchecker_handler_filter_linkchecker_link_code.inc b/views/handlers/linkchecker_handler_filter_linkchecker_link_code.inc
new file mode 100644
index 0000000..e2f79a5
--- /dev/null
+++ b/views/handlers/linkchecker_handler_filter_linkchecker_link_code.inc
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Definition of linkchecker_handler_filter_linkchecker_link_code.
+ */
+
+/**
+ * Filter by http status code.
+ *
+ * @ingroup views_filter_handlers
+ */
+class linkchecker_handler_filter_linkchecker_link_code extends views_handler_filter_in_operator {
+
+  /**
+   * {@inheritdoc}
+   */
+  function get_value_options() {
+    if (isset($this->value_options)) {
+      return;
+    }
+
+    $this->value_options = _linkchecker_response_codes();
+  }
+
+}
diff --git a/views/linkchecker.views.inc b/views/linkchecker.views.inc
new file mode 100644
index 0000000..e4c0179
--- /dev/null
+++ b/views/linkchecker.views.inc
@@ -0,0 +1,307 @@
+<?php
+
+/**
+ * @file
+ * Views callbacks for the linkchecker module.
+ */
+
+/**
+ * Implements hook_views_data().
+ */
+function linkchecker_views_data() {
+  $data['linkchecker_link'] = array(
+    'table' => array(
+      'group' => t('Broken links'),
+      // Define this as a base table.
+      'base' => array(
+        'field' => 'lid',
+        'title' => t('Broken links'),
+        'help' => t('Broken links related to nodes, blocks, comments, fields, etc.'),
+      ),
+      // Define joins.
+      'join' => array(
+        'linkchecker_block_custom' => array(
+          'left_field' => 'lid',
+          'field' => 'lid',
+        ),
+        'linkchecker_comment' => array(
+          'left_field' => 'lid',
+          'field' => 'lid',
+        ),
+        'linkchecker_node' => array(
+          'left_field' => 'lid',
+          'field' => 'lid',
+        ),
+      ),
+    ),
+    // Describe table fields to views.
+    'lid' => array(
+      'title' => t('Link ID'),
+      'help' => t("The unique linkchecker link ID."),
+      'field' => array(
+        'handler' => 'views_handler_field_numeric',
+        'click sortable' => TRUE,
+      ),
+      'sort' => array(
+        'handler' => 'views_handler_sort',
+      ),
+      'filter' => array(
+        'handler' => 'views_handler_filter_numeric',
+      ),
+    ),
+    'url' => array(
+      'title' => t('URL'),
+      'help' => t('The URL of a link in a broken links report.'),
+      'field' => array(
+        'handler' => 'linkchecker_handler_field_linkchecker_link_url',
+        'click sortable' => TRUE,
+      ),
+      'sort' => array(
+        'handler' => 'views_handler_sort',
+      ),
+      'filter' => array(
+        'handler' => 'views_handler_filter_string',
+      ),
+      'argument' => array(
+        'handler' => 'views_handler_argument_string',
+      ),
+    ),
+    // HTTP status code.
+    'code' => array(
+      'title' => t('HTTP status code'),
+      'help' => t('The status code returned by HTTP requests to the link.'),
+      'field' => array(
+        'handler' => 'views_handler_field_numeric',
+        'click sortable' => TRUE,
+      ),
+      'sort' => array(
+        'handler' => 'views_handler_sort',
+      ),
+      'filter' => array(
+        'handler' => 'linkchecker_handler_filter_linkchecker_link_code',
+      ),
+    ),
+    // Error message.
+    'error' => array(
+      'title' => t('Error message'),
+      'help' => t('The error message received from the remote server while doing link checking.'),
+      'field' => array(
+        'handler' => 'views_handler_field',
+        'click sortable' => TRUE,
+      ),
+      'sort' => array(
+        'handler' => 'views_handler_sort',
+      ),
+      'filter' => array(
+        'handler' => 'views_handler_filter_string',
+      ),
+    ),
+    // Fail count.
+    'fail_count' => array(
+      'title' => t('Fail count'),
+      'help' => t('The number of times a request for the URL has failed.'),
+      'field' => array(
+        'handler' => 'views_handler_field_numeric',
+        'click sortable' => TRUE,
+      ),
+      'sort' => array(
+        'handler' => 'views_handler_sort',
+      ),
+      'filter' => array(
+        'handler' => 'views_handler_filter_numeric',
+      ),
+    ),
+    // Last checked unix timestamp.
+    'last_checked' => array(
+      'title' => t('Last checked'),
+      'help' => t('Unix timestamp of the last link check.'),
+      'field' => array(
+        'handler' => 'views_handler_field_date',
+        'click sortable' => TRUE,
+      ),
+      'sort' => array(
+        'handler' => 'views_handler_sort_date',
+      ),
+      'filter' => array(
+        'handler' => 'views_handler_filter_date',
+      ),
+    ),
+    // Status (TRUE|FALSE if the link check is enabled|disabled).
+    'status' => array(
+      'title' => t('Status'),
+      'help' => t('Whether or not the link should be checked for being broken.'),
+      'field' => array(
+        'handler' => 'views_handler_field_boolean',
+        'click sortable' => TRUE,
+      ),
+      'filter' => array(
+        'handler' => 'views_handler_filter_boolean_operator',
+        'label' => t('Check link status'),
+        'type' => 'enabled-disabled',
+      ),
+      'sort' => array(
+        'handler' => 'views_handler_sort',
+      ),
+    ),
+    // Link to edit the link settings.
+    'link_edit' => array(
+      'field' => array(
+        'title' => t('Edit link settings'),
+        'help' => t('Provide a simple link to edit the link settings.'),
+        'handler' => 'linkchecker_handler_field_linkchecker_link_link_edit',
+      ),
+    ),
+  );
+
+  $data['linkchecker_node'] = array(
+    'table' => array(
+      'group' => t('Broken links'),
+      'join' => array(
+        'linkchecker_link' => array(
+          'left_field' => 'lid',
+          'field' => 'lid',
+        ),
+        'node' => array(
+          'left_field' => 'nid',
+          'field' => 'nid',
+        ),
+      ),
+    ),
+    // Describe table fields to views.
+    'lid' => array(
+      'title' => t('Link ID'),
+      'help' => t("The unique linkchecker link ID."),
+    ),
+    'nid' => array(
+      'title' => t('Content with link'),
+      'help' => t('Relate all content associted with a link.'),
+      'relationship' => array(
+        'handler' => 'views_handler_relationship',
+        'base' => 'node',
+        'base field' => 'nid',
+        'label' => t('Node'),
+        'skip base' => 'node',
+      ),
+    ),
+  );
+
+  if (module_exists('comment')) {
+    $data['linkchecker_comment'] = array(
+      'table' => array(
+        'group' => t('Broken links'),
+        'join' => array(
+          'linkchecker_link' => array(
+            'left_field' => 'lid',
+            'field' => 'lid',
+          ),
+          'comment' => array(
+            'left_field' => 'cid',
+            'field' => 'cid',
+          ),
+        ),
+      ),
+      // Describe table fields to views.
+      'lid' => array(
+        'title' => t('Link ID'),
+        'help' => t("The unique linkchecker link ID."),
+      ),
+      'cid' => array(
+        'title' => t('Comment with link'),
+        'help' => t('Relate all comments associted with a link.'),
+        'relationship' => array(
+          'handler' => 'views_handler_relationship',
+          'base' => 'comment',
+          'base field' => 'cid',
+          'label' => t('Comment'),
+          'skip base' => 'comment',
+        ),
+      ),
+    );
+  }
+
+  if (module_exists('block')) {
+    $data['linkchecker_block_custom'] = array(
+      'table' => array(
+        'group' => t('Broken links'),
+        'join' => array(
+          'linkchecker_link' => array(
+            'left_field' => 'lid',
+            'field' => 'lid',
+          ),
+        ),
+      ),
+      // Describe table fields to views.
+      'lid' => array(
+        'title' => t('Link ID'),
+        'help' => t('The unique linkchecker link ID.'),
+      ),
+      'bid' => array(
+        'title' => t('Block ID'),
+        'help' => t('The unique block ID.'),
+        'field' => array(
+          'handler' => 'views_handler_field_numeric',
+          'click sortable' => TRUE,
+        ),
+        'sort' => array(
+          'handler' => 'views_handler_sort',
+        ),
+        'filter' => array(
+          'handler' => 'views_handler_filter_numeric',
+        ),
+      ),
+      // Link to edit the block.
+      'block_edit' => array(
+        'field' => array(
+          'title' => t('Edit block'),
+          'help' => t('Provide a simple link to edit the block.'),
+          'handler' => 'linkchecker_handler_field_linkchecker_block_custom_block_edit',
+        ),
+      ),
+    );
+  }
+
+  // Add a 'Redirect add' link if the Redirect module is installed.
+  if (module_exists('redirect')) {
+    $data['linkchecker_link']['redirect_add'] = array(
+      'field' => array(
+        'title' => t('Create redirect'),
+        'help' => t('Provide a simple link to create a redirect.'),
+        'handler' => 'linkchecker_handler_field_linkchecker_link_redirect_add',
+      ),
+    );
+  }
+
+  return $data;
+}
+
+/**
+ * Implements hook_views_plugins().
+ */
+function linkchecker_views_plugins() {
+  return array(
+    'access' => array(
+      'linkchecker' => array(
+        'title' => t('Linkchecker'),
+        'handler' => 'linkchecker_plugin_access',
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_views_pre_render().
+ */
+function linkchecker_views_pre_render(&$view) {
+  // If the view's base table is linkchecker_link and it's a page display.
+  if ($view->base_table == 'linkchecker_link' && $view->display[$view->current_display]->display_plugin == 'page') {
+    // Set a status message if any unchecked links exist.
+    $links_unchecked = db_query('SELECT COUNT(1) FROM {linkchecker_link} WHERE last_checked = :last_checked AND status = :status', array(':last_checked' => 0, ':status' => 1))->fetchField();
+    if ($links_unchecked > 0) {
+      $links_all = db_query('SELECT COUNT(1) FROM {linkchecker_link} WHERE status = :status', array(':status' => 1))->fetchField();
+      drupal_set_message(format_plural($links_unchecked,
+        'There is 1 unchecked link of about @links_all links in the database. Please be patient until all links have been checked via cron.',
+        'There are @count unchecked links of about @links_all links in the database. Please be patient until all links have been checked via cron.',
+        array('@links_all' => $links_all)), 'warning');
+    }
+  }
+}
diff --git a/views/linkchecker.views_default.inc b/views/linkchecker.views_default.inc
new file mode 100644
index 0000000..dd7c55b
--- /dev/null
+++ b/views/linkchecker.views_default.inc
@@ -0,0 +1,457 @@
+<?php
+
+/**
+ * @file
+ * Default views for the Linkchecker module.
+ */
+
+/**
+ * Implements hook_views_default_views().
+ */
+function linkchecker_views_default_views() {
+  $export = array();
+
+  $comment = module_exists('comment');
+  $block = module_exists('block');
+  $redirect = module_exists('redirect');
+
+  $view = new view();
+  $view->name = 'linkchecker_reports';
+  $view->description = 'Display a list of broken links.';
+  $view->tag = 'default';
+  $view->base_table = 'linkchecker_link';
+  $view->human_name = 'Advanced Broken links';
+  $view->core = 0;
+  $view->api_version = '3.0';
+  $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+  /* Display: Defaults */
+  $handler = $view->new_display('default', 'Defaults', 'default');
+  $handler->display->display_options['title'] = 'Advanced Broken links';
+  $handler->display->display_options['items_per_page'] = 0;
+  $handler->display->display_options['use_more_always'] = FALSE;
+  $handler->display->display_options['access']['type'] = 'linkchecker';
+  $handler->display->display_options['cache']['type'] = 'none';
+  $handler->display->display_options['query']['type'] = 'views_query';
+  $handler->display->display_options['query']['options']['query_comment'] = FALSE;
+  $handler->display->display_options['exposed_form']['type'] = 'basic';
+  $handler->display->display_options['exposed_form']['options']['reset_button'] = TRUE;
+  $handler->display->display_options['pager']['type'] = 'full';
+  $handler->display->display_options['pager']['options']['items_per_page'] = '50';
+  $handler->display->display_options['pager']['options']['offset'] = '0';
+  $handler->display->display_options['pager']['options']['id'] = '0';
+  $handler->display->display_options['style_plugin'] = 'table';
+  $handler->display->display_options['style_options']['columns'] = array(
+    'url' => 'url',
+    'code' => 'code',
+    'error' => 'error',
+    'link_edit' => 'link_edit',
+    'nid' => 'nid',
+    'edit_node' => 'edit_node',
+  );
+  if ($comment) {
+    $handler->display->display_options['style_options']['columns'] += array(
+      'cid' => 'cid',
+      'edit_comment' => 'edit_comment',
+    );
+  }
+  if ($block) {
+    $handler->display->display_options['style_options']['columns'] += array(
+      'bid' => 'bid',
+      'block_edit' => 'block_edit',
+    );
+  }
+  if ($redirect) {
+    $handler->display->display_options['style_options']['columns'] += array(
+      'redirect_add' => 'redirect_add',
+    );
+  }
+  $handler->display->display_options['style_options']['columns'] += array(
+    'nothing' => 'nothing',
+  );
+  $handler->display->display_options['style_options']['default'] = 'url';
+  $handler->display->display_options['style_options']['info'] = array(
+    'url' => array(
+      'sortable' => 1,
+      'default_sort_order' => 'desc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'code' => array(
+      'sortable' => 1,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'error' => array(
+      'sortable' => 1,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'link_edit' => array(
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'nid' => array(
+      'sortable' => 0,
+      'default_sort_order' => 'asc',
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+    'edit_node' => array(
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+  );
+  if ($comment) {
+    $handler->display->display_options['style_options']['info'] += array(
+      'cid' => array(
+        'sortable' => 0,
+        'default_sort_order' => 'asc',
+        'align' => '',
+        'separator' => '',
+        'empty_column' => 0,
+      ),
+      'edit_comment' => array(
+        'align' => '',
+        'separator' => '',
+        'empty_column' => 0,
+      ),
+    );
+  }
+  if ($block) {
+    $handler->display->display_options['style_options']['info'] += array(
+      'bid' => array(
+        'sortable' => 0,
+        'default_sort_order' => 'asc',
+        'align' => '',
+        'separator' => '',
+        'empty_column' => 0,
+      ),
+      'block_edit' => array(
+        'align' => '',
+        'separator' => '',
+        'empty_column' => 0,
+      ),
+    );
+  }
+  if ($redirect) {
+    $handler->display->display_options['style_options']['info'] += array(
+      'redirect_add' => array(
+        'align' => '',
+        'separator' => '',
+        'empty_column' => 0,
+      ),
+    );
+  }
+  $handler->display->display_options['style_options']['info'] += array(
+    'nothing' => array(
+      'align' => '',
+      'separator' => '',
+      'empty_column' => 0,
+    ),
+  );
+  $handler->display->display_options['style_options']['sticky'] = TRUE;
+  $handler->display->display_options['style_options']['empty_table'] = TRUE;
+  /* No results behavior: Global: Text area */
+  $handler->display->display_options['empty']['area']['id'] = 'area';
+  $handler->display->display_options['empty']['area']['table'] = 'views';
+  $handler->display->display_options['empty']['area']['field'] = 'area';
+  $handler->display->display_options['empty']['area']['empty'] = TRUE;
+  $handler->display->display_options['empty']['area']['content'] = 'No broken links have been found.';
+  $handler->display->display_options['empty']['area']['format'] = 'plain_text';
+  /* Relationship: Broken links: Content with link */
+  $handler->display->display_options['relationships']['nid']['id'] = 'nid';
+  $handler->display->display_options['relationships']['nid']['table'] = 'linkchecker_node';
+  $handler->display->display_options['relationships']['nid']['field'] = 'nid';
+  if ($comment) {
+    /* Relationship: Broken links: Comment with link */
+    $handler->display->display_options['relationships']['cid']['id'] = 'cid';
+    $handler->display->display_options['relationships']['cid']['table'] = 'linkchecker_comment';
+    $handler->display->display_options['relationships']['cid']['field'] = 'cid';
+  }
+  /* Field: Broken links: URL */
+  $handler->display->display_options['fields']['url']['id'] = 'url';
+  $handler->display->display_options['fields']['url']['table'] = 'linkchecker_link';
+  $handler->display->display_options['fields']['url']['field'] = 'url';
+  $handler->display->display_options['fields']['url']['alter']['max_length'] = '40';
+  $handler->display->display_options['fields']['url']['alter']['word_boundary'] = FALSE;
+  $handler->display->display_options['fields']['url']['alter']['trim'] = TRUE;
+  $handler->display->display_options['fields']['url']['hide_empty'] = TRUE;
+  /* Field: Broken links: HTTP status code */
+  $handler->display->display_options['fields']['code']['id'] = 'code';
+  $handler->display->display_options['fields']['code']['table'] = 'linkchecker_link';
+  $handler->display->display_options['fields']['code']['field'] = 'code';
+  $handler->display->display_options['fields']['code']['label'] = 'Response';
+  $handler->display->display_options['fields']['code']['separator'] = '';
+  /* Field: Broken links: Error message */
+  $handler->display->display_options['fields']['error']['id'] = 'error';
+  $handler->display->display_options['fields']['error']['table'] = 'linkchecker_link';
+  $handler->display->display_options['fields']['error']['field'] = 'error';
+  $handler->display->display_options['fields']['error']['label'] = 'Error';
+  /* Field: Broken links: Edit link settings */
+  $handler->display->display_options['fields']['link_edit']['id'] = 'link_edit';
+  $handler->display->display_options['fields']['link_edit']['table'] = 'linkchecker_link';
+  $handler->display->display_options['fields']['link_edit']['field'] = 'link_edit';
+  $handler->display->display_options['fields']['link_edit']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['link_edit']['alter']['alter_text'] = TRUE;
+  $handler->display->display_options['fields']['link_edit']['alter']['text'] = '<li>Edit link settings</li>';
+  $handler->display->display_options['fields']['link_edit']['hide_empty'] = TRUE;
+  /* Field: Content: Nid */
+  $handler->display->display_options['fields']['nid']['id'] = 'nid';
+  $handler->display->display_options['fields']['nid']['table'] = 'node';
+  $handler->display->display_options['fields']['nid']['field'] = 'nid';
+  $handler->display->display_options['fields']['nid']['relationship'] = 'nid';
+  $handler->display->display_options['fields']['nid']['exclude'] = TRUE;
+  /* Field: Content: Edit link */
+  $handler->display->display_options['fields']['edit_node']['id'] = 'edit_node';
+  $handler->display->display_options['fields']['edit_node']['table'] = 'views_entity_node';
+  $handler->display->display_options['fields']['edit_node']['field'] = 'edit_node';
+  $handler->display->display_options['fields']['edit_node']['relationship'] = 'nid';
+  $handler->display->display_options['fields']['edit_node']['label'] = 'Edit node';
+  $handler->display->display_options['fields']['edit_node']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['edit_node']['alter']['alter_text'] = TRUE;
+  $handler->display->display_options['fields']['edit_node']['alter']['text'] = '<li>Edit node [nid]</li>';
+  $handler->display->display_options['fields']['edit_node']['hide_empty'] = TRUE;
+  if ($comment) {
+    /* Field: Comment: ID */
+    $handler->display->display_options['fields']['cid']['id'] = 'cid';
+    $handler->display->display_options['fields']['cid']['table'] = 'comment';
+    $handler->display->display_options['fields']['cid']['field'] = 'cid';
+    $handler->display->display_options['fields']['cid']['relationship'] = 'cid';
+    $handler->display->display_options['fields']['cid']['exclude'] = TRUE;
+    $handler->display->display_options['fields']['cid']['alter']['alter_text'] = TRUE;
+    $handler->display->display_options['fields']['cid']['alter']['text'] = '<li>Edit comment [cid]</li>';
+    $handler->display->display_options['fields']['cid']['alter']['make_link'] = TRUE;
+    $handler->display->display_options['fields']['cid']['alter']['path'] = 'comment/[cid]/edit';
+    $handler->display->display_options['fields']['cid']['hide_empty'] = TRUE;
+    $handler->display->display_options['fields']['cid']['link_to_comment'] = FALSE;
+  }
+  if ($block) {
+    /* Field: Broken links: Block ID */
+    $handler->display->display_options['fields']['bid']['id'] = 'bid';
+    $handler->display->display_options['fields']['bid']['table'] = 'linkchecker_block_custom';
+    $handler->display->display_options['fields']['bid']['field'] = 'bid';
+    $handler->display->display_options['fields']['bid']['exclude'] = TRUE;
+    $handler->display->display_options['fields']['bid']['separator'] = '';
+    /* Field: Broken links: Edit block */
+    $handler->display->display_options['fields']['block_edit']['id'] = 'block_edit';
+    $handler->display->display_options['fields']['block_edit']['table'] = 'linkchecker_block_custom';
+    $handler->display->display_options['fields']['block_edit']['field'] = 'block_edit';
+    $handler->display->display_options['fields']['block_edit']['exclude'] = TRUE;
+    $handler->display->display_options['fields']['block_edit']['alter']['alter_text'] = TRUE;
+    $handler->display->display_options['fields']['block_edit']['alter']['text'] = '<li>Edit block [bid]</li>';
+    $handler->display->display_options['fields']['block_edit']['hide_empty'] = TRUE;
+  }
+  if ($redirect) {
+    /* Field: Broken links: Create redirect */
+    $handler->display->display_options['fields']['redirect_add']['id'] = 'redirect_add';
+    $handler->display->display_options['fields']['redirect_add']['table'] = 'linkchecker_link';
+    $handler->display->display_options['fields']['redirect_add']['field'] = 'redirect_add';
+    $handler->display->display_options['fields']['redirect_add']['exclude'] = TRUE;
+    $handler->display->display_options['fields']['redirect_add']['alter']['alter_text'] = TRUE;
+    $handler->display->display_options['fields']['redirect_add']['alter']['text'] = '<li>Create redirect</li>';
+    $handler->display->display_options['fields']['redirect_add']['hide_empty'] = TRUE;
+  }
+  /* Field: Global: Custom text */
+  $handler->display->display_options['fields']['nothing']['id'] = 'nothing';
+  $handler->display->display_options['fields']['nothing']['table'] = 'views';
+  $handler->display->display_options['fields']['nothing']['field'] = 'nothing';
+  $handler->display->display_options['fields']['nothing']['label'] = 'Operations';
+  $handler->display->display_options['fields']['nothing']['alter']['text'] = '<ul>
+  [link_edit]
+  [edit_node]';
+  $handler->display->display_options['fields']['nothing']['alter']['text'] .= $comment ? "\n  [cid]" : '';
+  $handler->display->display_options['fields']['nothing']['alter']['text'] .= $block ? "\n  [block_edit]" : '' ;
+  $handler->display->display_options['fields']['nothing']['alter']['text'] .= $redirect ? "\n  [redirect_add]" : '';
+  $handler->display->display_options['fields']['nothing']['alter']['text'] .= "\n</ul>";
+  $nothing_translatable = $handler->display->display_options['fields']['nothing']['alter']['text'];
+  $handler->display->display_options['fields']['nothing']['hide_empty'] = TRUE;
+  $handler->display->display_options['fields']['nothing']['hide_alter_empty'] = TRUE;
+  /* Sort criterion: Broken links: Last checked */
+  $handler->display->display_options['sorts']['last_checked']['id'] = 'last_checked';
+  $handler->display->display_options['sorts']['last_checked']['table'] = 'linkchecker_link';
+  $handler->display->display_options['sorts']['last_checked']['field'] = 'last_checked';
+  $handler->display->display_options['sorts']['last_checked']['order'] = 'DESC';
+  /* Filter criterion: Broken links: HTTP status code */
+  $handler->display->display_options['filters']['code']['id'] = 'code';
+  $handler->display->display_options['filters']['code']['table'] = 'linkchecker_link';
+  $handler->display->display_options['filters']['code']['field'] = 'code';
+  $handler->display->display_options['filters']['code']['value'] = array(
+    100 => '100',
+    101 => '101',
+    201 => '201',
+    202 => '202',
+    203 => '203',
+    204 => '204',
+    205 => '205',
+    206 => '206',
+    300 => '300',
+    301 => '301',
+    302 => '302',
+    303 => '303',
+    304 => '304',
+    305 => '305',
+    307 => '307',
+    400 => '400',
+    401 => '401',
+    402 => '402',
+    403 => '403',
+    404 => '404',
+    405 => '405',
+    406 => '406',
+    407 => '407',
+    408 => '408',
+    409 => '409',
+    410 => '410',
+    411 => '411',
+    412 => '412',
+    413 => '413',
+    414 => '414',
+    415 => '415',
+    416 => '416',
+    417 => '417',
+    500 => '500',
+    501 => '501',
+    502 => '502',
+    503 => '503',
+    504 => '504',
+    505 => '505',
+    -10053 => '-10053',
+    -11001 => '-11001',
+  );
+  $handler->display->display_options['filters']['code']['group'] = 1;
+  $handler->display->display_options['filters']['code']['exposed'] = TRUE;
+  $handler->display->display_options['filters']['code']['expose']['operator_id'] = 'code_op';
+  $handler->display->display_options['filters']['code']['expose']['label'] = 'HTTP status code';
+  $handler->display->display_options['filters']['code']['expose']['operator'] = 'code_op';
+  $handler->display->display_options['filters']['code']['expose']['identifier'] = 'code';
+  $handler->display->display_options['filters']['code']['expose']['remember_roles'] = array(
+    2 => '2',
+    1 => 0,
+    3 => 0,
+  );
+  $handler->display->display_options['filters']['code']['expose']['reduce'] = TRUE;
+  /* Filter criterion: Broken links: Last checked */
+  $handler->display->display_options['filters']['last_checked']['id'] = 'last_checked';
+  $handler->display->display_options['filters']['last_checked']['table'] = 'linkchecker_link';
+  $handler->display->display_options['filters']['last_checked']['field'] = 'last_checked';
+  $handler->display->display_options['filters']['last_checked']['operator'] = '!=';
+  $handler->display->display_options['filters']['last_checked']['value']['value'] = '0';
+  $handler->display->display_options['filters']['last_checked']['group'] = 1;
+  /* Filter criterion: Broken links: Status */
+  $handler->display->display_options['filters']['status']['id'] = 'status';
+  $handler->display->display_options['filters']['status']['table'] = 'linkchecker_link';
+  $handler->display->display_options['filters']['status']['field'] = 'status';
+  $handler->display->display_options['filters']['status']['value'] = '1';
+  $handler->display->display_options['filters']['status']['group'] = 1;
+  /* Filter criterion: Broken links: Error message */
+  $handler->display->display_options['filters']['error']['id'] = 'error';
+  $handler->display->display_options['filters']['error']['table'] = 'linkchecker_link';
+  $handler->display->display_options['filters']['error']['field'] = 'error';
+  $handler->display->display_options['filters']['error']['operator'] = 'contains';
+  $handler->display->display_options['filters']['error']['exposed'] = TRUE;
+  $handler->display->display_options['filters']['error']['expose']['operator_id'] = 'error_op';
+  $handler->display->display_options['filters']['error']['expose']['label'] = 'Error message';
+  $handler->display->display_options['filters']['error']['expose']['operator'] = 'error_op';
+  $handler->display->display_options['filters']['error']['expose']['identifier'] = 'error';
+  $handler->display->display_options['filters']['error']['expose']['remember_roles'] = array(
+    2 => '2',
+    1 => 0,
+    3 => 0,
+  );
+
+  /* Display: Admin Broken links */
+  $handler = $view->new_display('page', 'Admin Broken links', 'linkchecker_admin_report_page');
+  $handler->display->display_options['display_description'] = 'Shows a list of broken links in content, with advanced filters.';
+  $handler->display->display_options['defaults']['hide_admin_links'] = FALSE;
+  $handler->display->display_options['path'] = 'admin/reports/linkchecker_adv';
+  $handler->display->display_options['menu']['type'] = 'normal';
+  $handler->display->display_options['menu']['title'] = 'Advanced Broken links';
+  $handler->display->display_options['menu']['description'] = 'Shows a list of broken links in content, with advanced filters.';
+  $handler->display->display_options['menu']['weight'] = '2';
+  $handler->display->display_options['menu']['name'] = 'management';
+  $handler->display->display_options['menu']['context'] = 0;
+  $handler->display->display_options['menu']['context_only_inline'] = 0;
+
+  /* Display: User Broken links */
+  $handler = $view->new_display('page', 'User Broken links', 'linkchecker_user_report_page');
+  $handler->display->display_options['display_description'] = 'Shows a list of broken links in authors content, with advanced filters.';
+  $handler->display->display_options['defaults']['hide_admin_links'] = FALSE;
+  $handler->display->display_options['defaults']['arguments'] = FALSE;
+  $handler->display->display_options['path'] = 'user/%user/linkchecker_adv';
+  $handler->display->display_options['menu']['type'] = 'tab';
+  $handler->display->display_options['menu']['title'] = 'Advanced Broken links';
+  $handler->display->display_options['menu']['description'] = 'Shows a list of broken links in authors content, with advanced filters.';
+  $handler->display->display_options['menu']['weight'] = '4';
+  $handler->display->display_options['menu']['name'] = 'user-menu';
+  $handler->display->display_options['menu']['context'] = 0;
+
+  $translatables['linkchecker_reports'] = array(
+    t('Defaults'),
+    t('Advanced Broken links'),
+    t('more'),
+    t('Apply'),
+    t('Reset'),
+    t('Sort by'),
+    t('Asc'),
+    t('Desc'),
+    t('Items per page'),
+    t('- All -'),
+    t('Offset'),
+    t('« first'),
+    t('‹ previous'),
+    t('next ›'),
+    t('last »'),
+    t('No broken links have been found.'),
+    t('Node'),
+    t('URL'),
+    t('Response'),
+    t('.'),
+    t('Error'),
+    t('Edit link settings'),
+    t('<li>Edit link settings</li>'),
+    t('Nid'),
+    t('Edit node'),
+    t('<li>Edit node [nid]</li>'),
+    t('Operations'),
+    t($nothing_translatable),
+    t('Admin Broken links'),
+    t('Shows a list of broken links in content.'),
+    t('User Broken links'),
+    t('Shows a list of broken links in authors content.'),
+  );
+
+  if ($comment) {
+    $translatables['linkchecker_reports'] += array(
+      t('Comment'),
+      t('ID'),
+      t('Edit link'),
+      t('<li>Edit comment [cid]</li>'),
+    );
+  }
+  if ($block) {
+    $translatables['linkchecker_reports'] += array(
+      t('Block ID'),
+      t('Edit block'),
+      t('<li>Edit block [bid]</li>'),
+    );
+  }
+  if ($redirect) {
+    $translatables['linkchecker_reports'] += array(
+      t('Create redirect'),
+      t('<li>Create redirect</li>'),
+    );
+  }
+
+  $export['linkchecker_reports'] = $view;
+
+  return $export;
+}
diff --git a/views/plugins/linkchecker_plugin_access.inc b/views/plugins/linkchecker_plugin_access.inc
new file mode 100644
index 0000000..8cc48da
--- /dev/null
+++ b/views/plugins/linkchecker_plugin_access.inc
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @file
+ * Definition of linkchecker_plugin_access.
+ */
+
+/**
+ * Access plugin for the linkchecker module.
+ *
+ * @ingroup views_access_plugins
+ */
+class linkchecker_plugin_access extends views_plugin_access {
+
+  /**
+   * {@inheritdoc}
+   */
+  function access($account) {
+    return _linkchecker_access($account);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function get_access_callback() {
+    return array('_linkchecker_access', array());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  function summary_title() {
+    return t('Linkchecker');
+  }
+
+}
