diff --git a/ctools/access/entity.inc b/ctools/access/entity.inc
new file mode 100644
index 0000000..7c328e1
--- /dev/null
+++ b/ctools/access/entity.inc
@@ -0,0 +1,104 @@
+<?php
+
+/**
+ * @file
+ * Plugin to provide access control based upon access to entity.
+ */
+
+/**
+ * Plugin declaration.
+ */
+$plugin = array(
+  'title' => t('Entity access'),
+  'description' => t('Control access by entity access. For example, if the current user can edit the node the access plugin will return TRUE.'),
+  'callback' => 'entity_ctools_entity_access_check',
+  'settings form' => 'entity_ctools_entity_access_settings',
+  'default' => array(
+    'operation' => 'view',
+  ),
+  'summary' => 'entity_ctools_entity_access_summary',
+  'get child' => 'entity_ctools_entity_access_get_child',
+  'get children' => 'entity_ctools_entity_access_get_children',
+);
+
+function entity_ctools_entity_access_get_child($plugin, $parent, $child) {
+  $plugin_name = $parent. ':' . $child;
+  $plugin = array_merge($plugin, _entity_ctools_entity_prepare_plugin($child, $plugin_name));
+  return $plugin;
+}
+
+function entity_ctools_entity_access_get_children($plugin, $parent) {
+  $plugins = array();
+  foreach (array_keys(entity_get_info()) as $entity_type) {
+    if (entity_type_supports($entity_type, 'access')) {
+      $plugin_name = $parent. ':' . $entity_type;
+      $plugin = _entity_ctools_entity_prepare_plugin($entity_type, $plugin_name);
+      $plugins[$parent. ':' . $entity_type] = $plugin;
+    }
+  }
+
+  return $plugins;
+}
+
+/**
+ * Helper function; Prepare plugin definitions.
+ *
+ * @param $entity_type
+ *   The entity type.
+ * @param $plugin_name
+ *   The plugin name.
+ */
+function _entity_ctools_entity_prepare_plugin($entity_type, $plugin_name) {
+  $plugin['title'] = t('@entity access', array('@entity' => ucfirst($entity_type)));
+  $plugin['keyword'] = $entity_type;
+  $plugin['description'] = t('Control access of entity @entity.', array('@entity' => ucfirst($entity_type)));
+  $plugin['name'] = $plugin_name;
+  $plugin['required context'] = new ctools_context_required(t(ucfirst($entity_type)), 'entity:' . $entity_type);
+  return $plugin;
+}
+
+/**
+ * Form callback.
+ */
+function entity_ctools_entity_access_settings($form, &$form_state, $conf) {
+  $form['settings']['operation'] = array(
+    '#type' => 'select',
+    '#title' => t('Operation'),
+    '#description' => t('The operation (view or edit) to be checked against the property.'),
+    '#options' => array(
+      'view' => t('View'),
+      'update' => t('Update'),
+      'create' => t('Create'),
+      'delete' => t('Delete'),
+    ),
+    '#default_value' => $conf['operation'],
+    '#required' => TRUE,
+  );
+  return $form;
+}
+
+/**
+ * Check for access based on access to entity access.
+ */
+function entity_ctools_entity_access_check($conf, $context, $plugin) {
+  if (empty($context) || empty($context->data)) {
+    return;
+  }
+
+  // Get the entity.
+  $entity = $context->data;
+  list(, $entity_type) = explode(':', $plugin['name']);
+
+  $wrapper = entity_metadata_wrapper($entity_type, $entity);
+  // Access check on the entity.
+  return $wrapper->access($conf['operation']);
+}
+
+
+/**
+ * Provide a summary description based upon the checked property.
+ */
+function entity_ctools_entity_access_summary($conf, $context, $plugin) {
+  return t('"@s" @name', array('@s' => $context->identifier, '@name' => $plugin['title']));
+}
+
diff --git a/ctools/access/entity_property.inc b/ctools/access/entity_property.inc
new file mode 100644
index 0000000..be9dbef
--- /dev/null
+++ b/ctools/access/entity_property.inc
@@ -0,0 +1,120 @@
+<?php
+
+/**
+ * @file
+ * Plugin to provide access control based upon access to entity-property.
+ */
+
+/**
+ * Plugin declaration.
+ */
+$plugin = array(
+  'title' => t('Entity property access'),
+  'description' => t('Control access by entity property. For example, if the current user can view the node author of a certain node the access plugin will return TRUE.'),
+  'callback' => 'entity_ctools_entity_property_access_check',
+  'settings form' => 'entity_ctools_entity_property_access_settings',
+  'default' => array(
+    'operation' => 'view',
+  ),
+  'summary' => 'entity_ctools_entity_property_access_summary',
+  'get child' => 'entity_ctools_entity_property_access_get_child',
+  'get children' => 'entity_ctools_entity_property_access_get_children',
+);
+
+function entity_ctools_entity_property_access_get_child($plugin, $parent, $child) {
+  list($entity_type, $property_name) = explode(':', $child, 2);
+  $properties = entity_get_all_property_info($entity_type);
+  $property = $properties[$property_name];
+
+  $plugin_name = $parent. ':' . $child;
+  $plugin = array_merge($plugin, _entity_ctools_entity_property_prepare_plugin($entity_type, $property, $property_name, $plugin_name));
+  return $plugin;
+}
+
+function entity_ctools_entity_property_access_get_children($plugin, $parent) {
+  // Get all the entity types that have metadata properties.
+  $entity_types = array_keys(entity_get_property_info());
+
+  $plugins = array();
+  foreach ($entity_types as $entity_type) {
+    // Get all the properties of the entity type.
+    foreach (entity_get_all_property_info($entity_type) as $property_name => $property) {
+      if (!empty($property['access callback']) || !empty($property['setter permission'])) {
+        $plugin_name = $parent. ':' . $entity_type . ':' . $property_name;
+        $plugin = _entity_ctools_entity_property_prepare_plugin($entity_type, $property, $property_name, $plugin_name);
+        // Separate the entity type from the property name.
+        $plugins[$parent. ':' . $entity_type . ':' . $property_name] = $plugin;
+      }
+    }
+  }
+
+  return $plugins;
+}
+
+/**
+ * Helper function; Prepare plugin definitions.
+ *
+ * @param $entity_type
+ *   The entity type.
+ * @param $property
+ *   The entity property definition array.
+ * @param $plugin_name
+ *   The plugin name.
+ */
+function _entity_ctools_entity_property_prepare_plugin($entity_type, $property, $property_name, $plugin_name) {
+  $property += array('description' => '');
+  $plugin['title'] = t('@entity: @label', array('@entity' => ucfirst($entity_type), '@label' => $property['label']));
+  $plugin['keyword'] = $entity_type . ':' . $property_name;
+  $plugin['description'] = t('Control access of @label property.', array('@label' => $property['label']));
+  $plugin['name'] = $plugin_name;
+  $plugin['required context'] = new ctools_context_required(t(ucfirst($entity_type)), 'entity:' . $entity_type);
+  return $plugin;
+}
+
+/**
+ * Form callback.
+ */
+function entity_ctools_entity_property_access_settings($form, &$form_state, $conf) {
+  $form['settings']['operation'] = array(
+    '#type' => 'select',
+    '#title' => t('Operation'),
+    '#description' => t('The operation (view or edit) to be checked against the property.'),
+    '#options' => array(
+      'view' => t('View'),
+      'edit' => t('Edit'),
+    ),
+    '#default_value' => $conf['operation'],
+    '#required' => TRUE,
+  );
+  return $form;
+}
+
+/**
+ * Check for access based on access to entity property.
+ */
+function entity_ctools_entity_property_access_check($conf, $context, $plugin) {
+  if (empty($context) || empty($context->data)) {
+    return;
+  }
+
+  // Get the entity.
+  $entity = $context->data;
+  list($entity_type, $name) = explode(':', $plugin['keyword'], 2);
+
+  $wrapper = entity_metadata_wrapper($entity_type, $entity);
+  if (!$wrapper || !isset($wrapper->{$name})) {
+    return FALSE;
+  }
+
+  // Access check on the property.
+  return $wrapper->{$name}->access($conf['operation']);
+}
+
+
+/**
+ * Provide a summary description based upon the checked property.
+ */
+function entity_ctools_entity_property_access_summary($conf, $context, $plugin) {
+  return t('"@s" @name', array('@s' => $context->identifier, '@name' => $plugin['title']));
+}
+
diff --git a/entity.module b/entity.module
index 0f552a3..65d4a09 100644
--- a/entity.module
+++ b/entity.module
@@ -1227,3 +1227,12 @@ function _entity_info_add_metadata(&$entity_info) {
     $entity_info['taxonomy_vocabulary']['token type'] = 'vocabulary';
   }
 }
+
+/**
+ * Implements hook_ctools_plugin_directory().
+ */
+function entity_ctools_plugin_directory($module, $plugin) {
+  if ($module == 'ctools' && !empty($plugin)) {
+    return "ctools/$plugin";
+  }
+}
