diff --git a/includes/taxonomy_access.views.inc b/includes/taxonomy_access.views.inc
new file mode 100644
index 0000000..09f841b
--- /dev/null
+++ b/includes/taxonomy_access.views.inc
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Views integration for taxonomy_access.
+ */
+
+/**
+ * Implements hook_views_data().
+ */
+function taxonomy_access_views_data() {
+  $data = array();
+
+  // taxonomy_index.tid field already has a filter; define extra 'alias' field
+  $data['taxonomy_index']['taxonomy_access_list_terms'] = array(
+    'title' => t('Taxonomy Access: grant View Tag'),
+    'help' => t('Restrict results to terms for which the current user has View Tag access'),
+    'real field' => 'tid',
+    'filter' => array(
+      'handler' => 'taxonomy_access_handler_filter_list_terms',
+    ),
+  );
+
+  return $data;
+}
+
+/**
+ * Implements hook_views_handlers().
+ */
+function taxonomy_access_views_handlers() {
+  return array(
+    'info' => array(
+      'path' => drupal_get_path('module', 'taxonomy_access') . '/includes',
+    ),
+    'handlers' => array(
+      'taxonomy_access_handler_filter_list_terms' => array(
+        'parent' => 'views_handler_filter',
+      ),
+    ),
+  );
+}
diff --git a/includes/taxonomy_access_handler_filter_list_terms.inc b/includes/taxonomy_access_handler_filter_list_terms.inc
new file mode 100644
index 0000000..51610e8
--- /dev/null
+++ b/includes/taxonomy_access_handler_filter_list_terms.inc
@@ -0,0 +1,59 @@
+<?php
+
+/**
+ * @file
+ * Views handler: Filter on taxonomy terms the user has list (View Tag) access to.
+ *
+ * The terms are retrieved separately, before the view is executed.
+ * This can replace node_access filtering (which is generally slower)
+ * in specific cases.
+ * e.g. if Taxonomy Access is the only installed module implementing node_access,
+ * you could disable SQL rewriting and use this filter instead. At your own risk.
+ */
+
+/**
+ * Filters out forum terms which the user does not have access to.
+ */
+class taxonomy_access_handler_filter_list_terms extends views_handler_filter {
+
+  /**
+   * This filter has no operators, only options.
+   */
+  protected $no_operator = TRUE;
+
+  function operator_form(&$form, &$form_state) {
+  }
+
+  /**
+   * No admin summary supported.
+   */
+  function admin_summary() {
+  }
+
+  /**
+   * Determine if a filter can be exposed.
+   */
+  function can_expose() { return FALSE; }
+
+  function options_form(&$form, &$form_state) {
+  }
+
+  /**
+   * Add filters to the query.
+   */
+  public function query() {
+
+    // Get all terms the current user has access to.
+    $tids = taxonomy_access_user_list_terms();
+    // If TRUE, user has access to everything => we don't need to filter.
+    if ($tids !== TRUE) {
+      if (empty($tids) || !is_array($tids)) {
+        // Enforce an array that makes sure no results are returned.
+        $tids = array(0);
+      }
+
+      $this->ensure_my_table();
+      $this->query->add_where($this->options['group'], $this->table_alias . '.tid', $tids, 'IN');
+    }
+  }
+}
diff --git a/taxonomy_access.info b/taxonomy_access.info
index cfe7769..6ca2896 100644
--- a/taxonomy_access.info
+++ b/taxonomy_access.info
@@ -5,6 +5,7 @@ core = 7.x
 configure = admin/config/people/taxonomy_access
 
 files[] = taxonomy_access.test
+files[] = includes/taxonomy_access_handler_filter_list_terms.inc
 
 ; Information added by drupal.org packaging script on 2012-02-02
 version = "7.x-1.0-rc1+46-dev+patch"
diff --git a/taxonomy_access.module b/taxonomy_access.module
index 64b48ee..79cc2a4 100644
--- a/taxonomy_access.module
+++ b/taxonomy_access.module
@@ -1598,6 +1598,16 @@ function taxonomy_access_options_validate($element, &$form_state) {
 }
 
 /**
+ * Implements hook_views_api().
+ */
+function taxonomy_access_views_api() {
+  return array(
+    'api' => '3.0-alpha1',
+    'path' => drupal_get_path('module', 'taxonomy_access') . '/includes',
+  );
+}
+
+/**
  * Implements hook_help().
  */
 function taxonomy_access_help($path, $arg) {
