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 cb3a8ac..4ba6faf 100644
--- a/linkchecker.module
+++ b/linkchecker.module
@@ -103,16 +103,17 @@ function linkchecker_menu() {
     'title' => 'Link checker',
   );
   $items['admin/reports/linkchecker'] = array(
-    'access arguments' => array('access broken links report'),
+    'access callback' => '_linkchecker_access',
     'description' => 'Shows a list of broken links in content.',
     'file' => 'linkchecker.pages.inc',
     'page callback' => 'linkchecker_admin_report_page',
     'title' => 'Broken links',
     'type' => MENU_NORMAL_ITEM,
+    'weight' => 1,
   );
   // Add the user menu item after node/edit tab.
   $items['user/%user/linkchecker'] = array(
-    'access callback' => '_linkchecker_user_access_account_broken_links_report',
+    'access callback' => '_linkchecker_access',
     'access arguments' => array(1),
     'description' => 'Shows a list of broken links in content.',
     'file' => 'linkchecker.pages.inc',
@@ -123,7 +124,7 @@ function linkchecker_menu() {
     'weight' => 3,
   );
   $items['linkchecker/%linkchecker_link/edit'] = array(
-    'access callback' => '_linkchecker_user_access_edit_link_settings',
+    'access callback' => '_linkchecker_access_edit_link_settings',
     'access arguments' => array(1),
     'file' => 'linkchecker.pages.inc',
     'page callback' => 'drupal_get_form',
@@ -152,20 +153,24 @@ function linkchecker_admin_paths() {
 /**
  * Access callback for user/%user/linkchecker.
  */
-function _linkchecker_user_access_account_broken_links_report($account) {
+function _linkchecker_access($account = NULL) {
   global $user;
 
+  if (!$account && arg(0) == 'user' && is_numeric(arg(1))) {
+    $account = user_load(arg(1));
+  }
+
   // Users with 'access own broken links report' permission can only view their
   // own report. Users with the 'access broken links report' permission can
   // view the report for any authenticated user.
-  return $account->uid && (($user->uid == $account->uid && user_access('access own broken links report')) || user_access('access broken links report'));
+  return (!empty($account->uid) && $user->uid == $account->uid && user_access('access own broken links report')) || user_access('access broken links report');
 }
 
 /**
  * Access callback for linkchecker/%linkchecker_link/edit.
  */
-function _linkchecker_user_access_edit_link_settings($link) {
-  return user_access('edit link settings') && _linkchecker_link_access($link);
+function _linkchecker_access_edit_link_settings($link) {
+  return user_access('access broken links report') || (user_access('edit link settings') && _linkchecker_link_access($link));
 }
 
 /**
@@ -563,10 +568,14 @@ function _linkchecker_status_handling(&$response, $link) {
   // element (naming it with the name attribute), or by any other element
   // (naming with the id attribute).
   // See http://www.w3.org/TR/html401/struct/links.html
+  //
+  // Notes:
+  // - '#top' is a reserved fragment that must not exist in a page.
   if ($response->code == 200
     && !empty($response->data)
     && !empty($response->headers['content-type'])
     && !empty($response->uri['fragment'])
+    && !in_array($response->uri['fragment'], array('#top'))
     && in_array($response->headers['content-type'], array('text/html', 'application/xhtml+xml', 'application/xml'))
     && !preg_match('/(\s[^>]*(name|id)(\s+)?=(\s+)?["\'])(' . preg_quote($response->uri['fragment'], '/') . ')(["\'][^>]*>)/i', $response->data)
     ) {
@@ -999,6 +1008,16 @@ function linkchecker_block_custom_delete_form_submit($form, &$form_state) {
 }
 
 /**
+ * Implements hook_views_api().
+ */
+function linkchecker_views_api() {
+  return array(
+    'api' => 3,
+    'path' => drupal_get_path('module', 'linkchecker') . '/views',
+  );
+}
+
+/**
  * Returns information from database about a user-created (custom) block.
  *
  * @param int $bid
@@ -1558,6 +1577,7 @@ function _linkchecker_parse_fields($entity_type, $bundle_name, $entity, $return_
             $item += array(
               'format' => NULL,
               'summary' => '',
+              'value' => '',
             );
             $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['value'], $item['format'], linkchecker_entity_language($entity_type, $entity), TRUE);
             $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['summary'], $item['format'], linkchecker_entity_language($entity_type, $entity), TRUE);
@@ -1572,6 +1592,7 @@ function _linkchecker_parse_fields($entity_type, $bundle_name, $entity, $return_
           foreach ($language as $item) {
             $item += array(
               'format' => NULL,
+              'value' => '',
             );
             $text_items[] = $text_items_by_field[$field['field_name']][] = _linkchecker_check_markup($item['value'], $item['format'], linkchecker_entity_language($entity_type, $entity), TRUE);
           }
@@ -2270,60 +2291,68 @@ function _linkchecker_link_check_status_filter($url) {
 }
 
 /**
- * Defines the list of allowed response codes for form input validation.
+ * 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',
+  );
+}
+
+/**
+ * Validates an HTTP status code.
  *
  * @param int $code
- *   An numeric response code.
+ *   An numeric HTTP status code.
  *
  * @return bool
  *   TRUE if the status code is valid, otherwise FALSE.
  */
 function _linkchecker_isvalid_response_code($code) {
+  $codes = _linkchecker_response_codes();
 
-  $responses = array(
-    100 => 'Continue',
-    101 => 'Switching Protocols',
-    200 => 'OK',
-    201 => 'Created',
-    202 => 'Accepted',
-    203 => 'Non-Authoritative Information',
-    204 => 'No Content',
-    205 => 'Reset Content',
-    206 => 'Partial Content',
-    300 => 'Multiple Choices',
-    301 => 'Moved Permanently',
-    302 => 'Found',
-    303 => 'See Other',
-    304 => 'Not Modified',
-    305 => 'Use Proxy',
-    307 => 'Temporary Redirect',
-    400 => 'Bad Request',
-    401 => 'Unauthorized',
-    402 => 'Payment Required',
-    403 => 'Forbidden',
-    404 => 'Not Found',
-    405 => 'Method Not Allowed',
-    406 => 'Not Acceptable',
-    407 => 'Proxy Authentication Required',
-    408 => 'Request Time-out',
-    409 => 'Conflict',
-    410 => 'Gone',
-    411 => 'Length Required',
-    412 => 'Precondition Failed',
-    413 => 'Request Entity Too Large',
-    414 => 'Request-URI Too Large',
-    415 => 'Unsupported Media Type',
-    416 => 'Requested range not satisfiable',
-    417 => 'Expectation Failed',
-    500 => 'Internal Server Error',
-    501 => 'Not Implemented',
-    502 => 'Bad Gateway',
-    503 => 'Service Unavailable',
-    504 => 'Gateway Time-out',
-    505 => 'HTTP Version not supported',
-  );
-
-  return array_key_exists($code, $responses);
+  return array_key_exists($code, $codes);
 }
 
 /**
@@ -2516,3 +2545,21 @@ function _linkchecker_array_values_recursive(array $array) {
 
   return $array_values;
 }
+
+/**
+ * Check if the link is an internal URL or not.
+ *
+ * @param object $link
+ *   Link object.
+ *
+ * @return bool
+ *   TRUE if link is internal, otherwise FALSE.
+ */
+function _linkchecker_is_internal_url(&$link) {
+  global $base_url;
+
+  if (strpos($link->url, $base_url) === 0) {
+    $link->internal = trim(substr($link->url, strlen($base_url)), " \t\r\n\0\\/");
+    return TRUE;
+  }
+}
diff --git a/linkchecker.pages.inc b/linkchecker.pages.inc
index b533149..1399529 100644
--- a/linkchecker.pages.inc
+++ b/linkchecker.pages.inc
@@ -293,21 +293,3 @@ function linkchecker_link_edit_form_submit($form, &$form_state) {
     drupal_set_message(t('The link settings for %url have been saved.', array('%url' => $form_state['values']['url'])));
   }
 }
-
-/**
- * Check if the link is an internal URL or not.
- *
- * @param object $link
- *   Link object.
- *
- * @return bool
- *   TRUE if link is internal, otherwise FALSE.
- */
-function _linkchecker_is_internal_url(&$link) {
-  global $base_url;
-
-  if (strpos($link->url, $base_url) === 0) {
-    $link->internal = trim(substr($link->url, strlen($base_url)), " \t\r\n\0\\/");
-    return TRUE;
-  }
-}
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..80f8431
--- /dev/null
+++ b/views/linkchecker.views_default.inc
@@ -0,0 +1,456 @@
+<?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']['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');
+  }
+
+}
