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 45560dc..0000000
--- 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\StaticAccessCheckInterface;
-use Symfony\Component\Routing\Route;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Access check for menu link delete routes.
- */
-class DeleteLinkAccessCheck implements StaticAccessCheckInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function appliesTo() {
-    return array('_access_menu_delete_link');
-  }
-
-  /**
-   * {@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 e8fb6f2..0000000
--- 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\StaticAccessCheckInterface;
-use Symfony\Component\Routing\Route;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Access check for menu delete routes.
- */
-class DeleteMenuAccessCheck implements StaticAccessCheckInterface {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function appliesTo() {
-    return array('_access_menu_delete_menu');
-  }
-
-  /**
-   * {@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/MenuAccessController.php b/core/modules/menu/lib/Drupal/menu/MenuAccessController.php
index b7128c0..48ef135 100644
--- a/core/modules/menu/lib/Drupal/menu/MenuAccessController.php
+++ b/core/modules/menu/lib/Drupal/menu/MenuAccessController.php
@@ -32,7 +32,7 @@ protected function checkAccess(EntityInterface $entity, $operation, $langcode, A
     }
 
     if (in_array($operation, array('update', 'delete'))) {
-      return user_access('administer menu', $account);
+      return $account->hasPermission('administer menu');
     }
   }
 
@@ -40,7 +40,7 @@ protected function checkAccess(EntityInterface $entity, $operation, $langcode, A
    * {@inheritdoc}
    */
   protected function checkCreateAccess(AccountInterface $account, array $context, $entity_bundle = NULL) {
-    return user_access('administer menu', $account);
+    return $account->hasPermission('administer menu');
   }
 
 }
diff --git a/core/modules/menu/lib/Drupal/menu/MenuFormController.php b/core/modules/menu/lib/Drupal/menu/MenuFormController.php
index a709d2e..bfb395b 100644
--- a/core/modules/menu/lib/Drupal/menu/MenuFormController.php
+++ b/core/modules/menu/lib/Drupal/menu/MenuFormController.php
@@ -97,10 +97,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');
 
     // Add the language configuration submit handler. This is needed because the
     // submit button has custom submit handlers.
@@ -171,8 +169,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/menu.admin.inc b/core/modules/menu/menu.admin.inc
index 7346712..8095a4d 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) {
@@ -163,31 +162,27 @@ function _menu_overview_tree_form($tree, $delta = 50) {
       );
       // Build a list of operations.
       $operations = array();
-      $links = array();
-      $links['edit'] = array(
+      $operations['edit'] = array(
         'title' => t('Edit'),
         'href' => 'admin/structure/menu/item/' . $item['mlid'] . '/edit',
       );
-      $operations['edit'] = array('#type' => 'link', '#title' => t('Edit'), '#href' => 'admin/structure/menu/item/' . $item['mlid'] . '/edit');
       // Only items created by the menu module can be deleted.
       if ($item['module'] == 'menu' || $item['updated'] == 1) {
-        $links['delete'] = array(
+        $operations['delete'] = array(
           'title' => t('Delete'),
           'href' => 'admin/structure/menu/item/' . $item['mlid'] . '/delete',
         );
-        $operations['delete'] = array('#type' => 'link', '#title' => t('Delete'), '#href' => 'admin/structure/menu/item/' . $item['mlid'] . '/delete');
       }
       // Set the reset column.
       elseif ($item['module'] == 'system' && $item['customized']) {
-        $links['reset'] = array(
+        $operations['reset'] = array(
           'title' => t('Reset'),
           'href' => 'admin/structure/menu/item/' . $item['mlid'] . '/reset',
         );
-        $operations['reset'] = array('#type' => 'link', '#title' => t('Reset'), '#href' => 'admin/structure/menu/item/' . $item['mlid'] . '/reset');
       }
       $form[$mlid]['operations'] = array(
         '#type' => 'operations',
-        '#links' => $links,
+        '#links' => $operations,
       );
     }
 
diff --git a/core/modules/menu/menu.routing.yml b/core/modules/menu/menu.routing.yml
index 62c54f2..7d7ac83 100644
--- a/core/modules/menu/menu.routing.yml
+++ b/core/modules/menu/menu.routing.yml
@@ -10,18 +10,18 @@ menu_link_reset:
   defaults:
     _entity_form: 'menu_link.reset'
   requirements:
-    _permission: 'administer menu'
+    _permission: 'menu_link.reset'
 
 menu_link_delete:
   pattern: 'admin/structure/menu/item/{menu_link}/delete'
   defaults:
     _entity_form: 'menu_link.delete'
   requirements:
-    _access_menu_delete_link: 'TRUE'
+    _entity_access: 'menu_link.delete'
 
 menu_delete_menu:
   pattern: 'admin/structure/menu/manage/{menu}/delete'
   defaults:
     _entity_form: 'menu.delete'
   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 f417d6f..0000000
--- 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 0000000..ba5f43d
--- /dev/null
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkAccessController.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\menu_link\MenuLinkAccessController.
+ */
+
+namespace Drupal\menu_link;
+
+use Drupal\Core\Entity\EntityAccessController;
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Session\AccountInterface;
+
+/**
+ * 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, AccountInterface $account) {
+    $access = $account->hasPermission('administer menu');
+    if ($access) {
+      switch ($operation) {
+        case 'reset':
+          // Reset allowed for items defined via hook_menu() and customized.
+          return $entity->module == 'system' || $entity->customized;
+
+        case 'delete':
+          // Only items created by the menu module can be deleted.
+          return $entity->module == 'menu' || $entity->updated;
+
+      }
+    }
+    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 8eb4458..9d58de9 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php
@@ -208,7 +208,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 7f227f8..f8a6e5f 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
@@ -28,6 +28,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 0000000..d955d95
--- /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\Core\Session\AccountInterface;
+
+/**
+ * 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, AccountInterface $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 f12e2a6..ef690c2 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 = {
