diff --git a/core/includes/entity.api.php b/core/includes/entity.api.php
index 7b42253..b5d784d 100644
--- a/core/includes/entity.api.php
+++ b/core/includes/entity.api.php
@@ -392,3 +392,33 @@ function hook_entity_field_info_alter(&$info, $entity_type) {
     $info['definitions']['mymodule_text']['class'] = '\Drupal\anothermodule\EntityComputedText';
   }
 }
+
+/**
+ * Alters the default access behaviour for a given field.
+ *
+ * This hook is invoked from Field::access() to let modules alter access to
+ * operations on fields.
+ *
+ * @todo: This hook will replace hook_field_access() after all field access
+ * checks are converted to this new API.
+ *
+ * @param bool $access
+ *   Access flag reference that can be altered. TRUE if the operation is
+ *   allowed, and FALSE if the operation is denied.
+ * @param array $context
+ *   Context array on the performed operation with the following keys:
+ *   - access: the original access flag from the default implementation
+ *     (boolean).
+ *   - operation: either "view" or "edit" (string).
+ *   - field: the field object (\Drupal\Core\Entity\Field\Type\Field).
+ *   - account: the user account to check access for
+ *     (Drupal\user\Plugin\Core\Entity\User).
+ */
+function hook_entity_field_access_alter(&$access, array $context) {
+  $field = $context['field'];
+  $operation = $context['operation'];
+  $account = $context['account'];
+  if ($field->getName() == 'field_of_interest' && $operation == 'edit') {
+    $access = user_access('edit field of interest', $account);
+  }
+}
diff --git a/core/lib/Drupal/Core/Entity/Field/Type/Field.php b/core/lib/Drupal/Core/Entity/Field/Type/Field.php
index 03d17e4..fcde772 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/Field.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/Field.php
@@ -290,6 +290,20 @@ public function __clone() {
    * Implements AccessibleInterface::access().
    */
   public function access($operation = 'view', User $account = NULL) {
-    // TODO: Implement access() method. Use item access.
+    global $user;
+    if (!isset($account)) {
+      $account = $user;
+    }
+    // Grant access per default.
+    $access = TRUE;
+    $context = array(
+      'access' => $access,
+      'operation' => $operation,
+      'field' => $this,
+      'account' => $account,
+    );
+    drupal_alter('entity_field_access', $access, $context);
+
+    return $access;
   }
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/FieldAccessTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/FieldAccessTest.php
new file mode 100644
index 0000000..c2ca5fa
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/FieldAccessTest.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Tests\Entity\FieldAccessTest.
+ */
+
+namespace Drupal\system\Tests\Entity;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests the functionality of field access.
+ */
+class FieldAccessTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('entity_test');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Field access tests',
+      'description' => 'Test Field level access.',
+      'group' => 'Entity API',
+    );
+  }
+
+  /**
+   * Tests that hook_entity_field_access_alter() is called.
+   *
+   * @see entity_test_entity_field_access_alter()
+   */
+  function testFieldAccess() {
+    $values = array(
+      'name' => $this->randomName(),
+      'user_id' => 1,
+      'field_test_text' => array(
+        'value' => 'no access value',
+        'format' => 'full_html',
+      ),
+    );
+    $entity = entity_create('entity_test', $values);
+    $this->assertFalse($entity->field_test_text->access('view'), 'Access to the field was denied.');
+  }
+}
diff --git a/core/modules/system/tests/modules/entity_test/entity_test.module b/core/modules/system/tests/modules/entity_test/entity_test.module
index 2752729..7f47da7 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.module
+++ b/core/modules/system/tests/modules/entity_test/entity_test.module
@@ -251,3 +251,15 @@ function entity_test_entity_test_insert($entity) {
     throw new Exception("Test exception rollback.");
   }
 }
+
+/**
+ * Implements hook_entity_field_access_alter().
+ *
+ * @see \Drupal\system\Tests\Entity\FieldAccessTest::testFieldAccess()
+ */
+function entity_test_entity_field_access_alter(&$access, $context) {
+  $field = $context['field'];
+  if ($field->getName() == 'field_test_text' && $field->value == 'no access value') {
+    $access = FALSE;
+  }
+}
