diff --git a/core/lib/Drupal/Core/Entity/EntityAccessController.php b/core/lib/Drupal/Core/Entity/EntityAccessController.php
index 4c436ca..112baf2 100644
--- a/core/lib/Drupal/Core/Entity/EntityAccessController.php
+++ b/core/lib/Drupal/Core/Entity/EntityAccessController.php
@@ -45,17 +45,28 @@ public function access(EntityInterface $entity, $operation, $langcode = Language
     // - At least one module says to grant access.
     $access = module_invoke_all($entity->entityType() . '_access', $entity->getBCEntity(), $operation, $account, $langcode);
 
+    if ($return = $this->processAccessHookResults($access) === NULL) {
+      // No result from hook, so entity checks are done.
+      $return = (bool) $this->checkAccess($entity, $operation, $langcode, $account);
+    }
+    return $this->setCache($return, $entity, $operation, $langcode, $account);
+  }
+
+  /**
+   * We grant access to the entity if both of these conditions are met:
+   * - No modules say to deny access.
+   * - At least one module says to grant access.
+   */
+  protected function processAccessHookResults($access) {
     if (in_array(FALSE, $access, TRUE)) {
-      $return = FALSE;
+      return FALSE;
     }
     elseif (in_array(TRUE, $access, TRUE)) {
-      $return = TRUE;
+      return TRUE;
     }
     else {
-      // No result from hook, so entity checks are done.
-      $return = (bool) $this->checkAccess($entity, $operation, $langcode, $account);
+      return;
     }
-    return $this->setCache($return, $entity, $operation, $langcode, $account);
   }
 
   /**
diff --git a/core/modules/node/lib/Drupal/node/NodeAccessController.php b/core/modules/node/lib/Drupal/node/NodeAccessController.php
index d7cfd2c..c90710d 100644
--- a/core/modules/node/lib/Drupal/node/NodeAccessController.php
+++ b/core/modules/node/lib/Drupal/node/NodeAccessController.php
@@ -31,6 +31,30 @@ public function access(EntityInterface $entity, $operation, $langcode = Language
     return parent::access($entity, $operation, $langcode, $account);
   }
 
+  public function createAccess($type, $account = NULL) {
+    if (user_access('bypass node access', $account)) {
+      return TRUE;
+    }
+    if (!user_access('access content', $account)) {
+      return FALSE;
+    }
+
+    $access = module_invoke_all('node_create_access', $account);
+
+    $configured_types = node_permissions_get_configured_types();
+    if (isset($configured_types[$type])) {
+      if (user_access('create ' . $type . ' content', $account)) {
+        $access[] = NODE_ACCESS_ALLOW;
+      }
+    }
+
+    if ($return = $this->processAccessHookResults($access) !== NULL) {
+      return $return;
+    }
+
+    return NODE_ACCESS_DENY;
+  }
+
   /**
    * {@inheritdoc}
    */
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index fbdf07d..ebe8704 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -2462,9 +2462,11 @@ function node_form_system_themes_admin_form_submit($form, &$form_state) {
  * @see node_menu()
  */
 function node_access($op, $node, $account = NULL, $langcode = NULL) {
+  $access_controller = entity_access_controller('node');
+
   if (!$node instanceof EntityInterface) {
     $type = is_object($node) ? $node->type : $node;
-    $node = entity_create('node', array('type' => $type));
+    return $access_controller->createAccess($type, $account);
   }
 
   // If no language code was provided, default to the node's langcode.
@@ -2490,7 +2492,7 @@ function node_access($op, $node, $account = NULL, $langcode = NULL) {
     $account = user_load($account->uid);
   }
 
-  return entity_access_controller('node')->access($node, $op, $langcode, $account);
+  return $access_controller->access($node, $op, $langcode, $account);
 }
 
 /**
diff --git a/core/modules/translation/translation.module b/core/modules/translation/translation.module
index e8e872e..56d53de 100644
--- a/core/modules/translation/translation.module
+++ b/core/modules/translation/translation.module
@@ -119,14 +119,14 @@ function translation_permission() {
 }
 
 /**
- * Implements hook_node_access().
+ * Implements hook_node_create_access().
  */
-function translation_node_access($node, $op, $account, $langcode) {
+function translation_node_create_access($account) {
   $query = Drupal::request()->query;
   $translation = $query->get('translation');
   $target = $query->get('target');
   $request_has_translation_arg = !empty($translation) && !empty($target) && is_numeric($translation);
-  if ($op == 'create' && $request_has_translation_arg) {
+  if ($request_has_translation_arg) {
     $source_node = node_load($translation);
     if (empty($source_node) || !translation_user_can_translate_node($source_node, $account)){
       return NODE_ACCESS_DENY;
