diff --git a/core/modules/menu_link_content/tests/src/Unit/MenuLinkContentAccessTest.php b/core/modules/menu_link_content/tests/src/Unit/MenuLinkContentAccessTest.php
new file mode 100644
index 0000000..913cb15
--- /dev/null
+++ b/core/modules/menu_link_content/tests/src/Unit/MenuLinkContentAccessTest.php
@@ -0,0 +1,263 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\menu_link_content\Unit\MenuLinkContentAccessTest.
+ */
+
+namespace Drupal\Tests\menu_link_content\Unit;
+
+use Drupal\Core\Access\AccessResult;
+use Drupal\menu_link_content\MenuLinkContentAccessControlHandler;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\menu_link_content\MenuLinkContentAccessControlHandler
+ * @group menu_link_content
+ */
+class MenuLinkContentAccessTest extends UnitTestCase {
+
+  /**
+   * The menu link content access control handler that is subject of this test.
+   *
+   * @var \Drupal\menu_link_content\MenuLinkContentAccessControlHandler
+   */
+  protected $accessControlHandler;
+
+  /**
+   * A reflection of MenuLinkContentAccessControlHandler::checkAccess.
+   *
+   * @var \ReflectionMethod
+   */
+  protected $checkAccessMethod;
+
+  /**
+   * The access manager of the access control handler.
+   *
+   * @var \Drupal\Core\Access\AccessManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $accessManager;
+
+  /**
+   * The menu link content entity used for testing.
+   *
+   * @var \Drupal\menu_link_content\Entity\MenuLinkContent|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $entity;
+
+  /**
+   * The account used for testing.
+   *
+   * @var \Drupal\Core\Session\AccountInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $account;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+
+    // Setup the class we want to test.
+    $entityType = $this->getMock('\Drupal\Core\Entity\EntityTypeInterface');
+    $this->accessManager = $this->getMock('\Drupal\Core\Access\AccessManagerInterface');
+    $this->accessControlHandler = new MenuLinkContentAccessControlHandler($entityType, $this->accessManager);
+
+    // Setup a reflection method for the private method we want to test.
+    $this->checkAccessMethod = new \ReflectionMethod($this->accessControlHandler, 'checkAccess');
+    $this->checkAccessMethod->setAccessible(TRUE);
+
+    $this->entity = $this->getMockBuilder('Drupal\menu_link_content\Entity\MenuLinkContent')
+      ->disableOriginalConstructor()
+      ->getMock();
+
+    $this->account = $this->getMock('\Drupal\Core\Session\AccountInterface');
+  }
+
+  /**
+   * @covers ::checkAccess
+   *
+   * Tests 'view' access.
+   */
+  public function testViewAccess() {
+
+    $operation = 'view';
+    $langcode = '';
+    $access = $this->checkAccessMethod->invoke($this->accessControlHandler, $this->entity, $operation, $langcode, $this->account);
+
+    $this->assertInstanceOf('\Drupal\Core\Access\AccessResultNeutral', $access);
+  }
+
+  /**
+   * @covers ::checkAccess
+   *
+   * Test 'update' access if the user has no permission 'administer menu'.
+   */
+  public function testUpdateAccessNoAdministerMenu() {
+
+    $operation = 'update';
+    $langcode = '';
+    $this->account->expects($this->once())
+      ->method('hasPermission')
+      ->with('administer menu')
+      ->will($this->returnValue(FALSE));
+
+    $access = $this->checkAccessMethod->invoke($this->accessControlHandler, $this->entity, $operation, $langcode, $this->account);
+    $this->assertInstanceOf('\Drupal\Core\Access\AccessResultNeutral', $access);
+  }
+
+  /**
+   * @covers ::checkAccess
+   *
+   * Test 'update' access if the URL is external.
+   */
+  public function testUpdateAccessNoURL() {
+
+    $operation = 'update';
+    $langcode = '';
+    $this->entity->expects($this->once())
+      ->method('getCacheTags')
+      ->will(($this->returnValue(array('test_cache_tag'))));
+    $this->entity->expects($this->once())
+      ->method('getUrlObject')
+      ->will(($this->returnValue(FALSE)));
+    $this->account->expects($this->once())
+      ->method('hasPermission')
+      ->with('administer menu')
+      ->will($this->returnValue(TRUE));
+
+    $access = $this->checkAccessMethod->invoke($this->accessControlHandler, $this->entity, $operation, $langcode, $this->account);
+    $this->assertInstanceOf('\Drupal\Core\Access\AccessResultAllowed', $access);
+  }
+
+  /**
+   * @covers ::checkAccess
+   *
+   * Test 'update' access if the URL is external.
+   */
+  public function testUpdateAccessExternalURL() {
+
+    $operation = 'update';
+    $langcode = '';
+
+    $url = $this->getMockBuilder('Drupal\Core\Url')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $url->expects($this->once())
+      ->method('isRouted')
+      ->will($this->returnValue(FALSE));
+
+    $this->entity->expects($this->once())
+      ->method('getCacheTags')
+      ->will(($this->returnValue(array('test_cache_tag'))));
+    $this->entity->expects($this->once())
+      ->method('getUrlObject')
+      ->will(($this->returnValue($url)));
+    $this->account->expects($this->once())
+      ->method('hasPermission')
+      ->with('administer menu')
+      ->will($this->returnValue(TRUE));
+
+    $access = $this->checkAccessMethod->invoke($this->accessControlHandler, $this->entity, $operation, $langcode, $this->account);
+    $this->assertInstanceOf('\Drupal\Core\Access\AccessResultAllowed', $access);
+  }
+
+  /**
+   * @covers ::checkAccess
+   *
+   * Test 'update' access of internal link if the link is accessible.
+   */
+  public function testUpdateAccessInternalURL() {
+
+    $operation = 'update';
+    $langcode = '';
+
+    $url = $this->getMockBuilder('Drupal\Core\Url')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $url->expects($this->once())
+      ->method('isRouted')
+      ->will($this->returnValue(TRUE));
+    $url->expects($this->once())
+      ->method('getRouteParameters')
+      ->will($this->returnValue(array()));
+
+    $this->entity->expects($this->once())
+      ->method('getCacheTags')
+      ->will($this->returnValue(array('test_cache_tag')));
+    $this->entity->expects($this->once())
+      ->method('getUrlObject')
+      ->will($this->returnValue($url));
+
+    // Use a random access (A, N, F) for the named route access.
+    $options = array(AccessResult::allowed(), AccessResult::neutral(), AccessResult::forbidden());
+    /** @var \Drupal\Core\Access\AccessResult $random_access */
+    $random_access = $options[array_rand($options)];
+    $this->accessManager->expects($this->once())
+      ->method('checkNamedRoute')
+    ->will($this->returnValue($random_access));
+
+    $this->account->expects($this->once())
+      ->method('hasPermission')
+      ->with('administer menu')
+      ->will($this->returnValue(TRUE));
+
+    $access = $this->checkAccessMethod->invoke($this->accessControlHandler, $this->entity, $operation, $langcode, $this->account);
+
+    // The final access must be equal to the (random) named route access.
+    $this->assertInstanceOf(get_class($random_access), $access);
+  }
+
+  /**
+   * @covers ::checkAccess
+   *
+   * Tests 'delete' access of new entity.
+   */
+  public function __testDeleteAccessNewEntity() {
+
+    $operation = 'delete';
+    $langcode = '';
+
+    $this->entity->expects($this->once())
+      ->method('isNew')
+      ->will($this->returnValue(TRUE));
+    $this->entity->expects($this->once())
+      ->method('getCacheTags')
+      ->will($this->returnValue(array('test_cache_tag')));
+    $access = $this->checkAccessMethod->invoke($this->accessControlHandler, $this->entity, $operation, $langcode, $this->account);
+
+    $this->assertInstanceOf('\Drupal\Core\Access\AccessResultNeutral', $access);
+  }
+
+  /**
+   * @covers ::checkAccess
+   *
+   * Tests 'delete' access of existing entity.
+   */
+  public function testDeleteAccessNoAdministerMenu() {
+
+    $operation = 'delete';
+    $langcode = '';
+
+    $this->entity->expects($this->once())
+      ->method('isNew')
+      ->will($this->returnValue(FALSE));
+    $this->entity->expects($this->once())
+      ->method('getCacheTags')
+      ->will($this->returnValue(array('test_cache_tag')));
+
+    // Use a random (TRUE, FALSE) 'administer menu' permission.
+    $options = array(AccessResult::allowed(), AccessResult::neutral());
+    /** @var \Drupal\Core\Access\AccessResult $random_access */
+    $random_access = $options[array_rand($options)];
+    $this->account->expects($this->once())
+      ->method('hasPermission')
+      ->with('administer menu')
+      ->will($this->returnValue($random_access->isAllowed()));
+
+    $access = $this->checkAccessMethod->invoke($this->accessControlHandler, $this->entity, $operation, $langcode, $this->account);
+
+    // The final access must follow to the (random) 'administer menu'
+    // permission. TRUE -> Allowed, FALSE -> Neutral.
+    $this->assertInstanceOf(get_class($random_access), $access);
+  }
+}
