diff --git a/core/modules/node/lib/Drupal/node/NodeAccess.php b/core/modules/node/lib/Drupal/node/NodeAccess.php
new file mode 100644
index 0000000..61c29f1
--- /dev/null
+++ b/core/modules/node/lib/Drupal/node/NodeAccess.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\node\NodeAccess.
+ */
+
+namespace Drupal\node;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\user\Plugin\Core\Entity\User;
+
+/**
+ * Defines an injectable node access service.
+ */
+class NodeAccess {
+
+  public function check($op, $node, $account = NULL, $langcode = NULL) {
+    if (!$node instanceof EntityInterface) {
+      $type = is_object($node) ? $node->type : $node;
+      $node = entity_create('node', array('type' => $type));
+    }
+
+    // If no language code was provided, default to the node's langcode.
+    if (empty($langcode)) {
+      $langcode = $node->langcode;
+      // If the Language module is enabled, try to use the language from content
+      // negotiation.
+      if (module_exists('language')) {
+        // Load languages the node exists in.
+        $node_translations = $node->getTranslationLanguages();
+        // Load the language from content negotiation.
+        $content_negotiation_langcode = language(LANGUAGE_TYPE_CONTENT)->langcode;
+        // If there is a translation available, use it.
+        if (isset($node_translations[$content_negotiation_langcode])) {
+          $langcode = $content_negotiation_langcode;
+        }
+      }
+    }
+
+    // Make sure that if an account is passed, that it is a fully loaded user
+    // object.
+    if ($account && !($account instanceof User)) {
+      $account = user_load($account->uid);
+    }
+
+    $method = $op . 'Access';
+    return entity_access_controller('node')->$method($node, $langcode, $account);
+  }
+}
\ No newline at end of file
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTestBase.php b/core/modules/node/lib/Drupal/node/Tests/NodeTestBase.php
index 957e4ee..cc8ec3b 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeTestBase.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeTestBase.php
@@ -13,6 +13,7 @@
  * Sets up page and article content types.
  */
 abstract class NodeTestBase extends WebTestBase {
+  protected $access;
 
   /**
    * Modules to enable.
@@ -24,6 +25,8 @@
   function setUp() {
     parent::setUp();
 
+    $this->access = drupal_container()->get('node.access');
+
     // Create Basic page and Article node types.
     if ($this->profile != 'standard') {
       $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page'));
@@ -57,7 +60,7 @@ function assertNodeAccess(array $ops, $node, $account, $langcode = NULL) {
           '%langcode' => !empty($langcode) ? $langcode : 'empty'
         )
       );
-      $this->assertEqual($result, node_access($op, $node, $account, $langcode), $msg);
+      $this->assertEqual($result, $this->access->check($op, $node, $account, $langcode), $msg);
     }
   }
 
diff --git a/core/modules/node/node.services.yml b/core/modules/node/node.services.yml
new file mode 100644
index 0000000..4111485
--- /dev/null
+++ b/core/modules/node/node.services.yml
@@ -0,0 +1,3 @@
+services:
+  node.access:
+    class: Drupal\node\NodeAccess
