diff --git a/core/modules/menu/lib/Drupal/menu/Access/DeleteLinkAccessCheck.php b/core/modules/menu/lib/Drupal/menu/Access/DeleteLinkAccessCheck.php
deleted file mode 100644
index f4438e7267c31e0b16b553185153ce1c027fcaf3..0000000000000000000000000000000000000000
--- a/core/modules/menu/lib/Drupal/menu/Access/DeleteLinkAccessCheck.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\menu\Access\DeleteLinkAccessCheck.
- */
-
-namespace Drupal\menu\Access;
-
-use Drupal\Core\Access\AccessCheckInterface;
-use Symfony\Component\Routing\Route;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Access check for menu link delete routes.
- */
-class DeleteLinkAccessCheck implements AccessCheckInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function applies(Route $route) {
-    return array_key_exists('_access_menu_delete_link', $route->getRequirements());
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function access(Route $route, Request $request) {
-    if (user_access('administer menu') && $menu_link = $request->attributes->get('menu_link')) {
-      // Links defined via hook_menu may not be deleted. Updated items are an
-      // exception, as they can be broken.
-      return $menu_link->module !== 'system' || $menu_link->updated;
-    }
-    return FALSE;
-  }
-}
diff --git a/core/modules/menu/lib/Drupal/menu/Access/DeleteMenuAccessCheck.php b/core/modules/menu/lib/Drupal/menu/Access/DeleteMenuAccessCheck.php
deleted file mode 100644
index ef00dd0c2e32c9cf59f30219ac596a226561cf70..0000000000000000000000000000000000000000
--- a/core/modules/menu/lib/Drupal/menu/Access/DeleteMenuAccessCheck.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\menu\Access\DeleteMenuAccessCheck.
- */
-
-namespace Drupal\menu\Access;
-
-use Drupal\Core\Access\AccessCheckInterface;
-use Symfony\Component\Routing\Route;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Access check for menu delete routes.
- */
-class DeleteMenuAccessCheck implements AccessCheckInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function applies(Route $route) {
-    return array_key_exists('_access_menu_delete_menu', $route->getRequirements());
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function access(Route $route, Request $request) {
-    if (user_access('administer menu') && $menu = $request->attributes->get('menu')) {
-      // System-defined menus may not be deleted.
-      $system_menus = menu_list_system_menus();
-      return !isset($system_menus[$menu->id()]);
-    }
-    return FALSE;
-  }
-}
diff --git a/core/modules/menu/lib/Drupal/menu/MenuFormController.php b/core/modules/menu/lib/Drupal/menu/MenuFormController.php
index 4eeab27f5229916521337b247bb1aafae896848b..ad1003f1d99e3d1bdca7a76a40dbb199cd67d466 100644
--- a/core/modules/menu/lib/Drupal/menu/MenuFormController.php
+++ b/core/modules/menu/lib/Drupal/menu/MenuFormController.php
@@ -71,10 +71,8 @@ public function form(array $form, array &$form_state) {
    */
   protected function actions(array $form, array &$form_state) {
     $actions = parent::actions($form, $form_state);
-    $menu = $this->entity;
 
-    $system_menus = menu_list_system_menus();
-    $actions['delete']['#access'] = !$menu->isNew() && !isset($system_menus[$menu->id()]);
+    $actions['delete']['#access'] = !$this->entity->isNew() && $this->entity->access('delete');
 
     return $actions;
   }
@@ -114,8 +112,7 @@ public function save(array $form, array &$form_state) {
    * Overrides Drupal\Core\Entity\EntityFormController::delete().
    */
   public function delete(array $form, array &$form_state) {
-    $menu = $this->entity;
-    $form_state['redirect'] = 'admin/structure/menu/manage/' . $menu->id() . '/delete';
+    $form_state['redirect'] = 'admin/structure/menu/manage/' . $this->entity->id() . '/delete';
   }
 
 }
diff --git a/core/modules/menu/lib/Drupal/menu/MenuListController.php b/core/modules/menu/lib/Drupal/menu/MenuListController.php
index 1ed22000a6251998dd7954c6e441fc85eaf5f616..d6bdc96bebc72bb59034b31d1acbde49f32e0d96 100644
--- a/core/modules/menu/lib/Drupal/menu/MenuListController.php
+++ b/core/modules/menu/lib/Drupal/menu/MenuListController.php
@@ -55,13 +55,11 @@ public function getOperations(EntityInterface $entity) {
       'options' => $uri['options'],
       'weight' => 20,
     );
-    // System menus could not be deleted.
-    $system_menus = menu_list_system_menus();
-    if (isset($system_menus[$entity->id()])) {
-      unset($operations['delete']);
+    if ($entity->access('delete')) {
+      $operations['delete']['title'] = t('Delete menu');
     }
     else {
-      $operations['delete']['title'] = t('Delete menu');
+      unset($operations['delete']);
     }
     return $operations;
   }
diff --git a/core/modules/menu/menu.admin.inc b/core/modules/menu/menu.admin.inc
index f08ddbdf29e56b40c1367ec5add9a88842f2b90a..199dc28aa9a79a1b42aef3c0059fd747f47c659f 100644
--- a/core/modules/menu/menu.admin.inc
+++ b/core/modules/menu/menu.admin.inc
@@ -125,7 +125,6 @@ function menu_overview_form($form, &$form_state) {
 function _menu_overview_tree_form($tree, $delta = 50) {
   $form = &drupal_static(__FUNCTION__, array('#tree' => TRUE));
   foreach ($tree as $data) {
-    $title = '';
     $item = $data['link'];
     // Don't show callbacks; these have $item['hidden'] < 0.
     if ($item && $item['hidden'] >= 0) {
diff --git a/core/modules/menu/menu.routing.yml b/core/modules/menu/menu.routing.yml
index aafe5c3525ae330c74028be73e4512cb0c504777..7b651b5b2d9a1e08fc8cc2ac6ed2035a0650ab4d 100644
--- a/core/modules/menu/menu.routing.yml
+++ b/core/modules/menu/menu.routing.yml
@@ -17,11 +17,11 @@ menu_link_delete:
   defaults:
     _form: '\Drupal\menu\Form\MenuLinkDeleteForm'
   requirements:
-    _access_menu_delete_link: 'TRUE'
+    _entity_access: menu_link.delete
 
 menu_delete_menu:
   pattern: 'admin/structure/menu/manage/{menu}/delete'
   defaults:
     _form: '\Drupal\menu\Form\MenuDeleteMenuForm'
   requirements:
-    _access_menu_delete_menu: 'TRUE'
+    _entity_access: menu.delete
diff --git a/core/modules/menu/menu.services.yml b/core/modules/menu/menu.services.yml
deleted file mode 100644
index f417d6f3c57e8579221ea7bd9cd39c95c33676d1..0000000000000000000000000000000000000000
--- a/core/modules/menu/menu.services.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-services:
-  access_check.menu.delete_link:
-    class: Drupal\menu\Access\DeleteLinkAccessCheck
-    tags:
-      - { name: access_check }
-  access_check.menu.delete_menu:
-    class: Drupal\menu\Access\DeleteMenuAccessCheck
-    tags:
-      - { name: access_check }
diff --git a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkAccessController.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkAccessController.php
new file mode 100644
index 0000000000000000000000000000000000000000..15d02eb9285f58477498bd884d0b294a889b7815
--- /dev/null
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkAccessController.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\menu_link\MenuLinkAccessController.
+ */
+
+namespace Drupal\menu_link;
+
+use Drupal\Core\Entity\EntityAccessController;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\user\Plugin\Core\Entity\User;
+
+/**
+ * Defines an access controller for the menu link entity.
+ *
+ * @see \Drupal\menu_link\Plugin\Core\Entity\MenuLink
+ */
+class MenuLinkAccessController extends EntityAccessController {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function checkAccess(EntityInterface $entity, $operation, $langcode, User $account) {
+    $access = user_access('administer menu', $account);
+    if ($access && $operation == 'delete') {
+      // Only items created by the menu module can be deleted.
+      return $entity->module == 'menu';
+    }
+    return $access;
+  }
+
+}
diff --git a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php
index 9aa76d44a1284b91eb9398cade3b71f871f79275..200b73b790b5e57a64f800cde5164a99f2d50ee3 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php
@@ -172,7 +172,7 @@ public function form(array $form, array &$form_state) {
   protected function actions(array $form, array &$form_state) {
     $element = parent::actions($form, $form_state);
     $element['submit']['#button_type'] = 'primary';
-    $element['delete']['#access'] = $this->entity->module == 'menu';
+    $element['delete']['#access'] = $this->entity->access('delete');
 
     return $element;
   }
diff --git a/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php b/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php
index 5af23d776543f7bab6b7243322f9c39f8e207c11..7e7c5cf05896674438984df273e9378b4be01e11 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php
@@ -24,6 +24,7 @@
  *   module = "menu_link",
  *   controllers = {
  *     "storage" = "Drupal\menu_link\MenuLinkStorageController",
+ *     "access" = "Drupal\menu_link\MenuLinkAccessController",
  *     "render" = "Drupal\Core\Entity\EntityRenderController",
  *     "form" = {
  *       "default" = "Drupal\menu_link\MenuLinkFormController"
diff --git a/core/modules/system/lib/Drupal/system/MenuAccessController.php b/core/modules/system/lib/Drupal/system/MenuAccessController.php
new file mode 100644
index 0000000000000000000000000000000000000000..25f3e9c4b629c23d8cf61d5ff08496b6c658c23e
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/MenuAccessController.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\MenuAccessController.
+ */
+
+namespace Drupal\system;
+
+use Drupal\Core\Entity\EntityAccessController;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\user\Plugin\Core\Entity\User;
+
+/**
+ * Defines an access controller for the menu entity.
+ *
+ * @see \Drupal\system\Plugin\Core\Entity\Menu
+ */
+class MenuAccessController extends EntityAccessController {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function checkAccess(EntityInterface $entity, $operation, $langcode, User $account) {
+    if ($operation == 'delete') {
+      // System-defined menus may not be deleted.
+      // @todo Refactor https://drupal.org/node/1882552
+      $system_menus = menu_list_system_menus();
+      return !isset($system_menus[$entity->id()]);
+    }
+    return user_access('administer menu', $account);
+  }
+
+}
diff --git a/core/modules/system/lib/Drupal/system/Plugin/Core/Entity/Menu.php b/core/modules/system/lib/Drupal/system/Plugin/Core/Entity/Menu.php
index f12e2a6a6586abeabac1be8dab2935530a755d70..ef690c2f5f0524fcdc17961a4f34bf97be97fc11 100644
--- a/core/modules/system/lib/Drupal/system/Plugin/Core/Entity/Menu.php
+++ b/core/modules/system/lib/Drupal/system/Plugin/Core/Entity/Menu.php
@@ -20,7 +20,8 @@
  *   label = @Translation("Menu"),
  *   module = "system",
  *   controllers = {
- *     "storage" = "Drupal\Core\Config\Entity\ConfigStorageController"
+ *     "storage" = "Drupal\Core\Config\Entity\ConfigStorageController",
+ *     "access" = "Drupal\system\MenuAccessController"
  *   },
  *   config_prefix = "menu.menu",
  *   entity_keys = {