diff --git a/entity.module b/entity.module
index 1e7603d..372a8f1 100644
--- a/entity.module
+++ b/entity.module
@@ -1212,3 +1212,12 @@ function _entity_info_add_metadata_callbacks(&$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 "plugins/$plugin";
+  }
+}
diff --git a/includes/entity.property.inc b/includes/entity.property.inc
index 2c7700b..7cdcb05 100644
--- a/includes/entity.property.inc
+++ b/includes/entity.property.inc
@@ -44,9 +44,9 @@ function entity_get_property_info($entity_type = NULL) {
 /**
  * Gets an array of info about all properties of a given entity type.
  *
- * In contrast to entity_get_property_info(), this function returns info about
- * all properties the entity might have, thus it adds an all properties assigned
- * to entity bundles.
+ * In contrast to entity_get_property_info(), this function returns info 
+ * about all properties the entity might have, thus it adds an all 
+ * properties assigned to entity bundles.
  *
  * @param $entity_type
  *   (optiona) The entity type to return properties for.
diff --git a/plugins/access/entity.inc b/plugins/access/entity.inc
new file mode 100644
index 0000000..32290d2
--- /dev/null
+++ b/plugins/access/entity.inc
@@ -0,0 +1,91 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Plugin to provide access control based upon entity-metadata.
+ */
+
+/**
+ * Plugins declaration.
+ */
+$plugin = array(
+  'title' => t("Entity property"),
+  '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_entity_metadata_ctools_access_check',
+  'settings form' => 'entity_entity_metadata_ctools_access_settings',
+  'summary' => 'entity_entity_metadata_ctools_access_summary',
+  'get child' => 'entity_entity_metadata_ctools_access_get_child',
+  'get children' => 'entity_entity_metadata_ctools_access_get_children',
+);
+
+function entity_entity_metadata_ctools_access_get_child($plugin, $parent, $child) {
+  $plugins = entity_entity_metadata_ctools_access_get_children($plugin, $parent);
+  return $plugins[$parent . ':' . $child];
+}
+
+function entity_entity_metadata_ctools_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 $name => $property) {
+      if (!empty($property['access callback']) || !empty($property['setter permission'])) {
+        $property += array('description' => '');
+
+        $plugin['title'] = t('@entity: @label', array('@entity' => ucfirst($entity_type), '@label' => $property['label']));
+        $plugin['keyword'] = $entity_type . ':' . $name;
+        $plugin['description'] = t('Control access of @label property.', array('@label' => $property['label']));
+        $plugin['name'] = $parent. ':' . $entity_type . '_' . $name;
+        $plugin['required context'] = new ctools_context_required(t(ucfirst($entity_type)), $entity_type);
+        $plugins[$parent. ':' . $entity_type . '_' . $name] = $plugin;
+      }
+    }
+  }
+
+  return $plugins;
+}
+
+/**
+ * Form callback.
+ */
+function entity_entity_metadata_ctools_access_settings($form, &$form_state, $conf) {
+  // This is needed to allow other settings to pass.
+  return $form;
+}
+
+/**
+ * Check for access.
+ */
+function entity_entity_metadata_ctools_access_check($conf, $context, $plugin) {
+  if (empty($context) || empty($context->data)) {
+    return;
+  }
+
+  // Get the entity.
+  $entity = $context->data;
+  list($entity_type, $property) = explode(':', $plugin['keyword'], 2);
+
+  $wrapper = entity_metadata_wrapper($entity_type, $entity);
+  if (!$wrapper || !isset($wrapper->{$property})) {
+    return FALSE;
+  }
+  
+  // Access check on the property.
+  if (!$wrapper->{$property}->access('view')) {
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+
+/**
+ * Provide a summary description based upon the checked property.
+ */
+function entity_entity_metadata_ctools_access_summary($conf, $context, $plugin) {
+  return t('"@s" @name', array('@s' => $context->identifier, '@name' => $plugin['title']));
+}
+
