diff --git a/achievements.module b/achievements.module
index b0746da..51fd747 100644
--- a/achievements.module
+++ b/achievements.module
@@ -748,3 +748,21 @@ function achievements_form_user_profile_form_alter(&$form, $form_state) {
     $form['achievements_optout']['#access'] = FALSE;
   }
 }
+
+/**
+ * Implements hook_ctools_plugin_directory().
+ */
+function achievements_ctools_plugin_directory($owner, $plugin_type) {
+  if ($owner == 'ctools' && !empty($plugin_type)) {
+    return "plugins/{$plugin_type}";
+  }
+}
+
+/**
+ * Implement hook_ctools_plugin_api().
+ */
+function achievements_ctools_plugin_api($module, $api) {
+  if ($module == 'page_manager' && $api == 'pages_default') {
+    return array('version' => 1);
+  }
+}
diff --git a/plugins/access/achievement_unlocked.inc b/plugins/access/achievement_unlocked.inc
new file mode 100644
index 0000000..99c7ddd
--- /dev/null
+++ b/plugins/access/achievement_unlocked.inc
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'title' => t("User: unlocked Achievement"),
+  'description' => t('Control access by achievement condition.'),
+  'callback' => 'achievement_unlocked_access_check',
+  'default' => array(),
+  'settings form' => 'achievement_unlocked_access_settings',
+  'summary' => 'achievement_unlocked_access_summary',
+  'required context' => new ctools_context_required(t('User'), 'user'),
+);
+
+
+/**
+ * Settings form for the 'achievement_unlocked' access plugin
+ */
+function achievement_unlocked_access_settings($form, &$form_state, $conf) {
+  // Find all achievement IDs.
+  $achievement_ids = achievements_get_achievements();
+
+  $form['settings']['achievement_id'] = array(
+    '#type' => 'select',
+    '#options' => $achievement_ids,
+    '#title' => t('Achievement'),
+    '#default_value' => $conf['achievement_id'],
+    '#description' => t('Only users who unlocked this achievement will be able to access it.'),
+  );
+
+  return $form;
+}
+
+/**
+ * Check for access.
+ */
+function achievement_unlocked_access_check($conf, $context) {
+  if (empty($context) || empty($context->data)) {
+    return FALSE;
+  }
+
+  return achievements_unlocked_already($conf['achievement_id'], $context->data->uid);
+}
+
+/**
+ * Provide a summary description based upon the checked achievements.
+ */
+function achievement_unlocked_access_summary($conf, $context) {
+  if (!isset($conf['achievement_id'])) {
+    return t('Error, unset achievement ID');
+  }
+
+  $achievement_ids = achievements_get_achievements();
+  return t('@identifier unlocked @achievement', array('@identifier' => $context->identifier, '@achievement' => $achievement_ids[$conf['achievement_id']]['title']));
+}
