diff --git a/content_profile.module b/content_profile.module
index fb1026d..f917e89 100644
--- a/content_profile.module
+++ b/content_profile.module
@@ -11,7 +11,7 @@ require_once dirname(__FILE__) . '/content_profile.theme_vars.inc';
  * Implementation of hook_ctools_plugin_directory().
  */
 function content_profile_ctools_plugin_directory($module, $plugin) {
-  if ($module == 'ctools' && $plugin == 'relationships') {
+  if ($module == 'ctools' && ($plugin == 'access' || $plugin == 'relationships')) {
     return 'panels/' . $plugin;
   }
 }
diff --git a/panels/access/content_profile.inc b/panels/access/content_profile.inc
new file mode 100644
index 0000000..339821f
--- /dev/null
+++ b/panels/access/content_profile.inc
@@ -0,0 +1,50 @@
+<?php
+/**
+ * @file
+ * Plugin to provide access control based upon content_profile nodes.
+ */
+
+$plugin = array(
+  'title' => t("User: Content profile"),
+  'description' => t('Control access by Content profile.'),
+  'callback' => 'content_profile_access_check',
+  'default' => array('content_profile' => ''),
+  'settings form' => 'content_profile_access_settings',
+  'summary' => 'content_profile_access_summary',
+  'required context' => new ctools_context_required(t('User'), 'user'),
+);
+
+/**
+ * Settings form for the 'has a content_profile node' access plugin
+ */
+function content_profile_access_settings(&$form, &$form_state, $conf) {
+  $form['settings']['content_profile'] = array(
+    '#type' => 'radios',
+    '#title' => t('Content profile'),
+    '#default_value' => $conf['content_profile'],
+    '#options' => node_get_types('names'),
+    '#description' => t('Select the profile node type that the user is required to have.'),
+    '#required' => TRUE,
+  );
+}
+
+/**
+ * Check for access.
+ */
+function content_profile_access_check($conf, $context) {
+  if (empty($context) || empty($context->data) || empty($context->data->uid) || empty($conf['content_profile'])) {
+    return FALSE;
+  }
+  $node = array(
+    'type' => $conf['content_profile'],
+    'language' => $GLOBALS['language'],
+  );
+  return (content_profile_profile_exists((object)$node, $context->data->uid)) ? TRUE : FALSE;
+}
+
+/**
+ * Provide a summary description based upon the selected node type.
+ */
+function content_profile_access_summary($conf, $context) {
+  return t('@identifier has a %type Content profile node', array('@identifier' => $context->identifier, '%type' => $conf['content_profile']));
+}
