diff --git a/eck.api.php b/eck.api.php
index e8d96e9..52fe239 100644
--- a/eck.api.php
+++ b/eck.api.php
@@ -144,3 +144,39 @@ function hook_eck_entity_save_message_alter(&$msg, $args, $context) {
 function hook_eck_bundle_save_message_alter(&$msg, $args, $context) {
   $msg = 'set this variable to change save message.';
 }
+
+/**
+ * Control access to ECK entities.
+ *
+ * Modules may implement this hook if they want to have a say in whether or not
+ * a given user has access to perform a given operation with ECK entities.
+ *
+ * @param string $op
+ *   The operation being performed. One of 'view', 'update', 'create' or
+ *   'delete'.
+ * @param mixed $entity_or_bundle
+ *   Normally, an entity to check access for. If this is NULL, we are checking
+ *   access for all entities of the given type. If this is a string
+ *   (representing the bundle to check access for; see parallel example in
+ *   node_access()) we are checking access for all entities of the given type
+ *   and bundle.
+ * @param object $account
+ *   The user to check access for. If this is NULL, access will be checked for
+ *   the current user.
+ * @param string $entity_type_name
+ *   A string representing the type of entity to check access for.
+ *
+ * @return bool
+ *   TRUE if access is granted, FALSE otherwise.
+ */
+function hook_eck_entity_access($op, $entity_or_bundle, $account, $entity_type_name) {
+  // Only check access for an entity.
+  if (is_object($entity_or_bundle)) {
+    $entity = $entity_or_bundle;
+    // Deny edit access if the current user is not the author of the entity.
+    if ($op == 'edit' && isset($entity->author) && $entity->author != $account->uid) {
+      return FALSE;
+    }
+  }
+  // Do not alter otherwise.
+}
diff --git a/eck.classes.inc b/eck.classes.inc
index 122bf5d..d5beb49 100644
--- a/eck.classes.inc
+++ b/eck.classes.inc
@@ -677,7 +677,7 @@ class Bundle extends DBObject {
 
     $entity_type_name = $entity_type->name;
 
-    if (!isset($entity_bundles[$entity_type_name])) {
+    if (!isset($entity_bundles[$entity_type_name]) || $entity_bundles[$entity_type_name] === array()) {
       $entity_bundles[$entity_type_name] = array();
       $bundles = Bundle::loadAll();
 
diff --git a/eck.entity.inc b/eck.entity.inc
index 964461e..bb16c29 100755
--- a/eck.entity.inc
+++ b/eck.entity.inc
@@ -453,6 +453,17 @@ function eck__entity__form_submit($form, &$state) {
   // lets set them in the entity.
   $wrapper = entity_metadata_wrapper($entity_type->name, $entity);
   foreach ($properties as $property => $info) {
+    // Add support for Title module and title field replacement
+    // @see https://www.drupal.org/node/1758878
+    if ($property == 'title' &&
+      module_exists('title') &&
+      isset($form['title']['#field_replacement'])) {
+      // Don't write form_value to entity property 'title' if
+      // title module replaced it with a field.
+      // @see https://www.drupal.org/node/1758878#comment-9872241
+      continue;
+    }
+
     // Use the value added by "pre_set" behavior callback, if any.
     if (array_key_exists($property, $data)) {
       $value = $data[$property];
diff --git a/eck.module b/eck.module
index a0e0da8..e7d7661 100644
--- a/eck.module
+++ b/eck.module
@@ -856,6 +856,17 @@ function eck__entity_access($op, $entity_or_bundle, $account, $entity_type_name)
 
   // @todo should auto-load entity author here.
 
+  // Allow modules to grant or deny access.
+  $access = module_invoke_all('eck_entity_access', $op, $entity_or_bundle, $account, $entity_type_name);
+  // Only grant access if at least one module granted access and no one denied
+  // access.
+  if (in_array(FALSE, $access, TRUE)) {
+    return FALSE;
+  }
+  elseif (in_array(TRUE, $access, TRUE)) {
+    return TRUE;
+  }
+  // If no hooks granted or restricted access, fall back to default check.
   return eck__multiple_access_check($permissions, FALSE, $account);
 }
 
diff --git a/views/handlers/eck_views_handler_field_link_delete.inc b/views/handlers/eck_views_handler_field_link_delete.inc
index 2cca82e..c418e49 100644
--- a/views/handlers/eck_views_handler_field_link_delete.inc
+++ b/views/handlers/eck_views_handler_field_link_delete.inc
@@ -8,17 +8,19 @@
 class eck_views_handler_field_link_delete extends eck_views_handler_field_link {
 
   function render_link($entity, $values) {
+    global $user;
     $entity_type = $entity->entityType();
     $entity_id = entity_id($entity_type, $entity);
     $bundle = $entity->bundle();
     $action = 'delete';
+    $access = module_invoke_all('eck_entity_access', $action, $entity, $user, $entity_type);
 
-    if (eck__multiple_access_check(
+    if (empty($access) || (in_array(TRUE, $access, TRUE) && eck__multiple_access_check(
       array(
         "eck administer entities",
         "eck {$action} entities",
         "eck administer {$entity_type} {$bundle} entities",
-        "eck {$action} {$entity_type} {$bundle} entities"))) {
+        "eck {$action} {$entity_type} {$bundle} entities")))) {
 
       $crud_info = get_bundle_crud_info($entity_type, $bundle);
       $this->options['alter']['make_link'] = TRUE;
@@ -40,4 +42,4 @@ class eck_views_handler_field_link_delete extends eck_views_handler_field_link {
     }
   }
 }
-// @codingStandardsIgnoreEnd
\ No newline at end of file
+// @codingStandardsIgnoreEnd
diff --git a/views/handlers/eck_views_handler_field_link_edit.inc b/views/handlers/eck_views_handler_field_link_edit.inc
index 6db0a2f..14ed524 100644
--- a/views/handlers/eck_views_handler_field_link_edit.inc
+++ b/views/handlers/eck_views_handler_field_link_edit.inc
@@ -8,16 +8,19 @@
 class eck_views_handler_field_link_edit extends eck_views_handler_field_link {
 
   function render_link($entity, $values) {
+    global $user;
     $entity_type = $entity->entityType();
     $entity_id = entity_id($entity_type, $entity);
     $bundle = $entity->bundle();
     $action = "edit";
-    if (eck__multiple_access_check(
+    $access = module_invoke_all('eck_entity_access', $action, $entity, $user, $entity_type);
+
+    if (empty($access) || (in_array(TRUE, $access, TRUE) && eck__multiple_access_check(
       array(
         "eck administer entities",
         "eck {$action} entities",
         "eck administer {$entity_type} {$bundle} entities",
-        "eck {$action} {$entity_type} {$bundle} entities"))) {
+        "eck {$action} {$entity_type} {$bundle} entities")))) {
 
       $crud_info = get_bundle_crud_info($entity_type, $bundle);
       $this->options['alter']['make_link'] = TRUE;
@@ -29,4 +32,4 @@ class eck_views_handler_field_link_edit extends eck_views_handler_field_link {
     }
   }
 }
-// @codingStandardsIgnoreEnd
\ No newline at end of file
+// @codingStandardsIgnoreEnd
