diff --git a/nodequeue.module b/nodequeue.module
index 24e186f..1abb155 100644
--- a/nodequeue.module
+++ b/nodequeue.module
@@ -1938,3 +1938,13 @@ function theme_nodequeue_subqueue_full_text() {
 function theme_nodequeue_subqueue_count_text($count) {
   return t('@count in queue', array('@count' => $count));
 }
+
+/**
+ * Implementation of hook_ctools_plugin_directory().
+ */
+function nodequeue_ctools_plugin_directory($module, $plugin) {
+  if ($module == 'ctools' && $plugin == 'access') {
+    return 'plugins/access';
+  }
+}
+
diff --git a/plugins/access/nodequeue.inc b/plugins/access/nodequeue.inc
new file mode 100644
index 0000000..f4dfbd8
--- /dev/null
+++ b/plugins/access/nodequeue.inc
@@ -0,0 +1,82 @@
+<?php
+/**
+ * @file
+ * Plugin to provide access control based upon nodequeues.
+ */
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'title' => t("Nodequeue"),
+  'description' => t('Control access by nodequeue.'),
+  'callback' => 'nodequeue_ctools_access_check',
+  'default' => array('type' => array()),
+  'settings form' => 'nodequeue_ctools_access_settings',
+  'settings form submit' => 'nodequeue_ctools_access_settings_submit',
+  'summary' => 'nodequeue_ctools_access_summary',
+  'required context' => new ctools_context_required(t('Node'), 'node'),
+);
+
+/**
+ * Settings form for the 'in nodequeue' access plugin.
+ */
+function nodequeue_ctools_access_settings(&$form, &$form_state, $conf) {
+  $queues = nodequeue_load_queues(nodequeue_get_all_qids(0));
+  foreach ($queues as $qid => $queue) {
+    $options[$queue->name] = check_plain($queue->title);
+  }
+
+  $form['settings']['queues'] = array(
+    '#title' => t('Nodequeue'),
+    '#type' => 'checkboxes',
+    '#options' => $options,
+    '#description' => t('Only nodes in the checked nodequeues will be valid.'),
+    '#default_value' => $conf['queues'],
+  );
+}
+
+/**
+ * Compress the nodequeues allowed to the minimum.
+ */
+function nodequeue_ctools_access_settings_submit(&$form, &$form_state) {
+  $form_state['values']['settings']['queues'] = array_filter($form_state['values']['settings']['queues']);
+}
+
+/**
+ * Check for access.
+ */
+function nodequeue_ctools_access_check($conf, $context) {
+  foreach ($conf['queues'] as $name) {
+    $queue = nodequeue_load_queue_by_name($name);
+    $pos = nodequeue_queue_position($queue->qid, $context->data->nid);
+    if ($pos !== FALSE) {
+      return TRUE;
+    }
+  }
+
+  return FALSE;
+}
+
+/**
+ * Provide a summary description based upon the checked node_types.
+ */
+function nodequeue_ctools_access_summary($conf, $context) {
+  if (!isset($conf['queues'])) {
+    $conf['queue'] = array();
+  }
+
+  $queues = array();
+  foreach (array_filter($conf['queues']) as $name) {
+    $queue = nodequeue_load_queue_by_name($name);
+    $queues[] = check_plain($queue->title);
+  }
+
+  if (empty($queues)) {
+    return t('@identifier is in any queue', array('@identifier' => $context->identifier));
+  }
+
+  return format_plural(count($queues), '@identifier is in "@queues"', '@identifier is in any of "@queues"', array('@queues' => implode(', ', $queues), '@identifier' => $context->identifier));
+}
+
