diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 09fe145..73a127c 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -255,6 +255,8 @@ public function build(ContainerBuilder $container) {
       ->addTag('event_subscriber');
     $container->register('access_check.default', 'Drupal\Core\Access\DefaultAccessCheck')
       ->addTag('access_check');
+    $container->register('access_check.entity', 'Drupal\Core\Entity\EntityAccessCheck')
+      ->addTag('access_check');
     $container->register('maintenance_mode_subscriber', 'Drupal\Core\EventSubscriber\MaintenanceModeSubscriber')
       ->addTag('event_subscriber');
     $container->register('path_subscriber', 'Drupal\Core\EventSubscriber\PathSubscriber')
diff --git a/core/lib/Drupal/Core/Entity/EntityAccessCheck.php b/core/lib/Drupal/Core/Entity/EntityAccessCheck.php
new file mode 100644
index 0000000..2cd2b64
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/EntityAccessCheck.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\EntityAccessCheck.
+ */
+
+namespace Drupal\Core\Entity;
+
+use Drupal\Core\Access\AccessCheckInterface;
+use Drupal\Core\Entity\EntityInterface;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Provides a generic access checker for entities.
+ */
+class EntityAccessCheck implements AccessCheckInterface {
+
+  /**
+   * Implements \Drupal\Core\Access\AccessCheckInterface::applies().
+   */
+  public function applies(Route $route) {
+    return array_key_exists('_access_entity', $route->getRequirements());
+  }
+
+  /**
+   * Implements \Drupal\Core\Access\AccessCheckInterface::access().
+   *
+   * The value of the '_access_entity' key must be in the pattern
+   * 'slug.operation.' The slug corresponds to the named param {slug}.
+   * This will check a node for 'update' access:
+   * @code
+   * pattern: '/foo/{node}/bar'
+   * requirements:
+   *   _access_entity: 'node.update'
+   * @endcode
+   */
+  public function access(Route $route, Request $request) {
+    $requirements = $route->getRequirements();
+    // Split up the slug and the operation.
+    list($slug, $operation) = explode('.', $requirements['_access_entity']);
+    // If this slug is in the request, and it is an entity, check its access.
+    if ($request->attributes->has($slug)) {
+      $entity = $request->attributes->get($slug);
+      if ($entity instanceof EntityInterface) {
+        return $entity->access($operation);
+      }
+    }
+  }
+
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityRouteAccessTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityRouteAccessTest.php
new file mode 100644
index 0000000..ce2ef71
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityRouteAccessTest.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Tests\Entity\EntityRouteAccessTest.
+ */
+
+namespace Drupal\system\Tests\Entity;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests the route-based Entity access.
+ */
+class EntityRouteAccessTest extends WebTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('entity_test');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Entity Route Access',
+      'description' => 'Tests route-based Entity access.',
+      'group' => 'Entity API',
+    );
+  }
+
+  /**
+   * Tests access to delete an entity.
+   */
+  public function testDelete() {
+    entity_create('entity_test', array())->save();
+
+    // Attempt to delete the entity without permission.
+    $this->drupalGet('entity_test/1/delete');
+    $this->assertResponse(403);
+
+    // Log in as a privileged user and delete the entity.
+    $this->drupalLogin($this->drupalCreateUser(array('administer entity_test content')));
+    $this->drupalGet('entity_test/1/delete');
+    $this->assertResponse(200);
+
+    // Attempt to delete the entity again.
+    $this->drupalGet('entity_test/1/delete');
+    $this->assertResponse(404);
+  }
+
+}
diff --git a/core/modules/system/tests/modules/entity_test/entity_test.routing.yml b/core/modules/system/tests/modules/entity_test/entity_test.routing.yml
new file mode 100644
index 0000000..fcb7ea4
--- /dev/null
+++ b/core/modules/system/tests/modules/entity_test/entity_test.routing.yml
@@ -0,0 +1,6 @@
+entity_test_access:
+  pattern: '/entity_test/{entity_test}/delete'
+  defaults:
+    _content: 'Drupal\entity_test\Controller\EntityTestController::deletePage'
+  requirements:
+    _access_entity: 'entity_test.delete'
diff --git a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Controller/EntityTestController.php b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Controller/EntityTestController.php
new file mode 100644
index 0000000..2cdb98a
--- /dev/null
+++ b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Controller/EntityTestController.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\entity_test\Controller\EntityTestController.
+ */
+
+namespace Drupal\entity_test\Controller;
+
+use Drupal\entity_test\Plugin\Core\Entity\EntityTest;
+
+/**
+ * Provides a controller for page callbacks for entity_test.
+ */
+class EntityTestController {
+
+  /**
+   * Returns the delete page.
+   */
+  public function deletePage(EntityTest $entity_test) {
+    $entity_test->delete();
+    return t('The test entity has been deleted.');
+  }
+
+}
diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityAccessCheckTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityAccessCheckTest.php
new file mode 100644
index 0000000..3478cc6
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Entity/EntityAccessCheckTest.php
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Tests\Core\Entity\EntityAccessCheckTest.
+ */
+
+namespace Drupal\Tests\Core\Entity;
+
+use Symfony\Component\HttpFoundation\Request;
+use Drupal\Core\Entity\EntityAccessCheck;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * Tests the entity access controller.
+ *
+ * @group Entity
+ */
+class EntityAccessCheckTest extends UnitTestCase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Entity access check test',
+      'description' => 'Unit test of entity access checking system.',
+      'group' => 'Entity'
+    );
+  }
+
+  /**
+   * Test the method for determining if the access check applies to a specific
+   * route or not
+   */
+  public function testApplies() {
+    $applies_check = new EntityAccessCheck();
+
+    $route = $this->getMockBuilder('Symfony\Component\Routing\Route')
+                  ->disableOriginalConstructor()
+                  ->getMock();
+    $route->expects($this->any())
+          ->method('getRequirements')
+          ->will($this->returnValue(array('_access_entity' => '')));
+    $res = $applies_check->applies($route);
+    $this->assertEquals(TRUE, $res);
+
+    $route = $this->getMockBuilder('Symfony\Component\Routing\Route')
+                  ->disableOriginalConstructor()
+                  ->getMock();
+    $route->expects($this->any())
+          ->method('getRequirements')
+          ->will($this->returnValue(array()));
+    $res = $applies_check->applies($route);
+    $this->assertEquals(FALSE, $res);
+  }
+
+
+  /**
+   * Test the method for checking access to routes.
+   */
+  public function testAccess() {
+    $args = array('/foo', array(), array("_access_entity: 'node.update'"));
+    $route = $this->getMockBuilder('Symfony\Component\Routing\Route')
+                  ->setConstructorArgs($args)
+                  ->getMock();
+    $request = $this->getMockBuilder('Symfony\Component\HttpFoundation\Request')
+                    ->disableOriginalConstructor()
+                    ->getMock();
+    $access_check = new EntityAccessCheck();
+    $operation = $access_check->access($route, $request);
+    $this->assertEquals('node.update', $operation);
+  }
+}
+
