diff --git a/core/lib/Drupal/Core/Entity/Field/Type/Field.php b/core/lib/Drupal/Core/Entity/Field/Type/Field.php
index 03d17e4..c4fd47f 100644
--- a/core/lib/Drupal/Core/Entity/Field/Type/Field.php
+++ b/core/lib/Drupal/Core/Entity/Field/Type/Field.php
@@ -290,6 +290,19 @@ 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;
+    }
+
+    foreach (module_implements('field_ng_access') as $module) {
+      $function = $module . '_field_ng_access';
+      $access = $function($operation, $this, $account);
+      if ($access === FALSE) {
+        return FALSE;
+      }
+    }
+    // Grant access per default.
+    return TRUE;
   }
 }
diff --git a/core/modules/field/field.api.php b/core/modules/field/field.api.php
index 27304f4..5c6351e 100644
--- a/core/modules/field/field.api.php
+++ b/core/modules/field/field.api.php
@@ -6,7 +6,9 @@
  */
 
 use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Entity\Field\Type\Field;
 use Drupal\field\FieldUpdateForbiddenException;
+use Drupal\user\Plugin\Core\Entity\User;
 
 /**
  * Exposes "pseudo-field" components on fieldable entities.
@@ -2200,5 +2202,31 @@ function hook_field_access($op, $field, $entity_type, $entity, $account) {
 }
 
 /**
+ * Determine whether the user has access to a given field.
+ *
+ * This hook is invoked from Field::access() to let modules block access to
+ * operations on fields. If no module returns FALSE, the operation is allowed.
+ *
+ * @todo: This hook will replace hook_field_access() after all field access
+ * checks are converted to this new API.
+ *
+ * @param string $operation
+ *   The operation to be performed. Possible values: 'edit', 'view'.
+ * @param \Drupal\Core\Entity\Field\Type\Field $field
+ *   The field on which the operation is to be performed.
+ * @param \Drupal\user\Plugin\Core\Entity\User $account
+ *   The user account to check.
+ *
+ * @return bool
+ *   TRUE if the operation is allowed, and FALSE if the operation is denied.
+ */
+function hook_field_ng_access($operation, Field $field, User $account) {
+  if ($field->getName() == 'field_of_interest' && $operation == 'edit') {
+    return user_access('edit field of interest', $account);
+  }
+  return TRUE;
+}
+
+/**
  * @} End of "addtogroup hooks".
  */
diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldNGAccessTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldNGAccessTest.php
new file mode 100644
index 0000000..2aa7e2a
--- /dev/null
+++ b/core/modules/field/lib/Drupal/field/Tests/FieldNGAccessTest.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\field\Tests\FieldNGAccessTest.
+ */
+
+namespace Drupal\field\Tests;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests the functionality of field access.
+ */
+class FieldNGAccessTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('node', 'entity_test');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Field NG access tests',
+      'description' => 'Test Field NG access.',
+      'group' => 'Field API',
+    );
+  }
+
+  /**
+   * Test that hook_field_ng_access() is called.
+   *
+   * @see entity_test_field_ng_access()
+   */
+  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 f2b5b38..f20083b 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.module
+++ b/core/modules/system/tests/modules/entity_test/entity_test.module
@@ -5,7 +5,9 @@
  * Test module for the entity API providing an entity type for testing.
  */
 
+use Drupal\Core\Entity\Field\Type\Field;
 use Drupal\entity_test\Plugin\Core\Entity\EntityTest;
+use Drupal\user\Plugin\Core\Entity\User;
 
 
 /**
@@ -169,3 +171,14 @@ function entity_test_form_node_form_alter(&$form, &$form_state, $form_id) {
   $langcode = $form_state['controller']->getFormLangcode($form_state);
   variable_set('entity_form_langcode', $langcode);
 }
+
+/**
+ * Implements hook_field_ng_access().
+ *
+ * @see \Drupal\field\Tests\FieldNGAccessTest::testFieldAccess()
+ */
+function entity_test_field_ng_access($operation, Field $field, User $account) {
+  if ($field->getName() == 'field_test_text' && $field->value == 'no access value') {
+    return FALSE;
+  }
+}
