diff --git a/core/includes/entity.api.php b/core/includes/entity.api.php
index 08d0099ea8b9f0b423ebfdb5c6fc41c6ca1255ce..656f088722106821b8f19e97c396b2e628253663 100644
--- a/core/includes/entity.api.php
+++ b/core/includes/entity.api.php
@@ -94,11 +94,6 @@ function hook_entity_view_mode_info_alter(&$view_modes) {
  *     type in the EntityManager, but for the bundle only. When determining
  *     the URI of an entity, if a 'uri_callback' is defined for both the
  *     entity type and the bundle, the one for the bundle is used.
- *   - admin: An array of information that allows Field UI pages to attach
- *     themselves to the existing administration pages for the bundle.
- *     Elements:
- *     - real path: The actual path (no placeholder) of the bundle's main
- *       administration page. This will be used to generate links.
  *   - translatable: (optional) A boolean value specifying whether this bundle
  *     has translation support enabled. Defaults to FALSE.
  *
@@ -106,12 +101,7 @@ function hook_entity_view_mode_info_alter(&$view_modes) {
  * @see hook_entity_bundle_info_alter()
  */
 function hook_entity_bundle_info() {
-  $bundles['user']['user'] = array(
-    'label' => t('User'),
-    'admin' => array(
-      'path' => 'admin/config/people/accounts',
-    ),
-  );
+  $bundles['user']['user']['label'] = t('User');
   return $bundles;
 }
 
diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index d998c5034ccbfb9cc1395ce294eb366b0fe3105d..1ad1495e415aac2243a2f565f11234a293b3267e 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -200,4 +200,31 @@ public function getAccessController($entity_type) {
     return $this->controllers['access'][$entity_type];
   }
 
+  /**
+   * Returns the administration path for an entity type's bundle.
+   *
+   * @param string $entity_type
+   *   The entity type.
+   * @param string $bundle
+   *   The name of the bundle.
+   *
+   * @return string
+   *   The administration path for an entity type bundle, if it exists.
+   */
+  public function getAdminPath($entity_type, $bundle) {
+    $admin_path = '';
+    $entity_info = $this->getDefinition($entity_type);
+    // Check for an entity type's admin base path.
+    if (isset($entity_info['route_base_path'])) {
+      // If the entity type has a bundle prefix, strip it out of the path.
+      if (isset($entity_info['bundle_prefix'])) {
+        $bundle = str_replace($entity_info['bundle_prefix'], '', $bundle);
+      }
+      // Replace any dynamic 'bundle' portion of the path with the actual bundle.
+      $admin_path = str_replace('{bundle}', $bundle, $entity_info['route_base_path']);
+    }
+
+    return $admin_path;
+  }
+
 }
diff --git a/core/modules/block/custom_block/custom_block.module b/core/modules/block/custom_block/custom_block.module
index 1bcf41467c2da34e7115a5396905fefbf0efe05e..adf9f0f2c12ae1a3d80d5e53cd64719ce6529c95 100644
--- a/core/modules/block/custom_block/custom_block.module
+++ b/core/modules/block/custom_block/custom_block.module
@@ -184,12 +184,7 @@ function custom_block_entity_bundle_info() {
   $bundles = array();
   foreach (config_get_storage_names_with_prefix('custom_block.type.') as $config_name) {
     $config = config($config_name);
-    $bundles['custom_block'][$config->get('id')] = array(
-      'label' => $config->get('label'),
-      'admin' => array(
-        'real path' => 'admin/structure/custom-blocks/manage/' . $config->get('id'),
-      ),
-    );
+    $bundles['custom_block'][$config->get('id')]['label'] = $config->get('label');
   }
   return $bundles;
 }
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index 38aacc15cb3206b60dd2061886fb22cf12706f40..a4c7a42513e278a3c803a22577f9ef0290adedc9 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -118,9 +118,6 @@ function comment_entity_bundle_info() {
       // Provide the node type/bundle name for other modules, so it does not
       // have to be extracted manually from the bundle name.
       'node bundle' => $type,
-      'admin' => array(
-        'real path' => 'admin/structure/types/manage/' . $type . '/comment',
-      ),
     );
   }
   return $bundles;
diff --git a/core/modules/contact/contact.module b/core/modules/contact/contact.module
index 1d48c7d9bc488c7ae5f7fad154cede2504bc5ee0..3ef1ce6fb33e4e44482b4bb0a57ae15592393197 100644
--- a/core/modules/contact/contact.module
+++ b/core/modules/contact/contact.module
@@ -176,13 +176,7 @@ function contact_entity_bundle_info() {
   $bundles = array();
   foreach (config_get_storage_names_with_prefix('contact.category.') as $config_name) {
     $config = config($config_name);
-    $bundles['contact_message'][$config->get('id')] = array(
-      'label' => $config->get('label'),
-      'admin' => array(
-        'real path' => 'admin/structure/contact/manage/' . $config->get('id'),
-        'access arguments' => array('administer contact forms'),
-      ),
-    );
+    $bundles['contact_message'][$config->get('id')]['label'] = $config->get('label');
   }
   return $bundles;
 }
diff --git a/core/modules/field_ui/field_ui.admin.inc b/core/modules/field_ui/field_ui.admin.inc
index eda59c8e2a12853ac2d35969fe74f1912a528113..e419063ef39f5fa2473a7a3e596fad3db4ad29a8 100644
--- a/core/modules/field_ui/field_ui.admin.inc
+++ b/core/modules/field_ui/field_ui.admin.inc
@@ -14,6 +14,7 @@ function field_ui_fields_list() {
   $instances = field_info_instances();
   $field_types = field_info_field_types();
   $bundles = entity_get_bundles();
+  $entity_manager = Drupal::entityManager();
 
   $modules = system_rebuild_module_data();
 
@@ -37,7 +38,7 @@ function field_ui_fields_list() {
         }
 
         // Add the current instance.
-        $admin_path = field_ui_bundle_admin_path($entity_type, $bundle);
+        $admin_path = $entity_manager->getAdminPath($entity_type, $bundle);
         $rows[$field_name]['data'][2][] = $admin_path ? l($bundles[$entity_type][$bundle]['label'], $admin_path . '/fields') : $bundles[$entity_type][$bundle]['label'];
       }
     }
@@ -454,6 +455,6 @@ function field_ui_next_destination($entity_type, $bundle) {
     unset($_REQUEST['destinations']);
     return field_ui_get_destinations($destinations);
   }
-  $admin_path = field_ui_bundle_admin_path($entity_type, $bundle);
+  $admin_path = Drupal::entityManager()->getAdminPath($entity_type, $bundle);
   return $admin_path . '/fields';
 }
diff --git a/core/modules/field_ui/field_ui.module b/core/modules/field_ui/field_ui.module
index 4f348395d15373c54c95d5fb8e3aeabda0adcd0b..88d2ce7090c012fc800fb94c1f1eb6b1fb9c83f3 100644
--- a/core/modules/field_ui/field_ui.module
+++ b/core/modules/field_ui/field_ui.module
@@ -258,17 +258,6 @@ function field_ui_entity_bundle_rename($entity_type, $bundle_old, $bundle_new) {
   state()->set('menu_rebuild_needed', TRUE);
 }
 
-/**
- * Determines the adminstration path for a bundle.
- */
-function field_ui_bundle_admin_path($entity_type, $bundle_name) {
-  $bundles = entity_get_bundles($entity_type);
-  $bundle_info = $bundles[$bundle_name];
-  if (isset($bundle_info['admin'])) {
-    return isset($bundle_info['admin']['real path']) ? $bundle_info['admin']['real path'] : $bundle_info['admin']['path'];
-  }
-}
-
 /**
  * Identifies inactive fields within a bundle.
  */
@@ -330,7 +319,8 @@ function field_ui_form_node_type_form_alter(&$form, $form_state) {
  */
 function field_ui_form_node_type_form_submit($form, &$form_state) {
   if ($form_state['triggering_element']['#parents'][0] === 'save_continue') {
-    $form_state['redirect'] = field_ui_bundle_admin_path('node', $form_state['values']['type']) .'/fields';
+    $admin_path = Drupal::entityManager()->getAdminPath('node', $form_state['values']['type']);
+    $form_state['redirect'] = "$admin_path/fields";
   }
 }
 
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
index 836cc882a0c79408dcdaf4192870ab1590135144..cf4f6dec9814d45537d50689bfaaf189e67769c3 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php
@@ -486,7 +486,7 @@ public function submitForm(array &$form, array &$form_state) {
           }
 
           $view_mode_label = $view_modes[$view_mode]['label'];
-          $path = field_ui_bundle_admin_path($this->entity_type, $this->bundle) . "/display/$view_mode";
+          $path = $this->entityManager->getAdminPath($this->entity_type, $this->bundle) . "/display/$view_mode";
           drupal_set_message(t('The %view_mode mode now uses custom display settings. You might want to <a href="@url">configure them</a>.', array('%view_mode' => $view_mode_label, '@url' => url($path))));
         }
         $bundle_settings['view_modes'][$view_mode]['custom_settings'] = !empty($value);
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldDeleteForm.php b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldDeleteForm.php
index f74ecb65f89dc5f7a4c294cbd8d1e8ca9b2b8b1f..ec13c507000a7244f8041947c48b8b0c4ea92776 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldDeleteForm.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldDeleteForm.php
@@ -8,12 +8,15 @@
 namespace Drupal\field_ui\Form;
 
 use Drupal\Core\Form\ConfirmFormBase;
+use Drupal\Core\ControllerInterface;
+use Drupal\Core\Entity\EntityManager;
 use Drupal\field\Plugin\Core\Entity\FieldInstance;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Provides a form for removing a field instance from a bundle.
  */
-class FieldDeleteForm extends ConfirmFormBase {
+class FieldDeleteForm extends ConfirmFormBase implements ControllerInterface {
 
   /**
    * The field instance being deleted.
@@ -22,6 +25,32 @@ class FieldDeleteForm extends ConfirmFormBase {
    */
   protected $instance;
 
+  /**
+   * The entity manager.
+   *
+   * @var \Drupal\Core\Entity\EntityManager
+   */
+  protected $entityManager;
+
+  /**
+   * Constructs a new FieldDeleteForm object.
+   *
+   * @param \Drupal\Core\Entity\EntityManager $entity_manager
+   *   The entity manager.
+   */
+  public function __construct(EntityManager $entity_manager) {
+    $this->entityManager = $entity_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('plugin.manager.entity')
+    );
+  }
+
   /**
    * {@inheritdoc}
    */
@@ -47,7 +76,7 @@ protected function getConfirmText() {
    * {@inheritdoc}
    */
   protected function getCancelPath() {
-    return field_ui_bundle_admin_path($this->instance->entity_type, $this->instance->bundle) . '/fields';
+    return $this->entityManager->getAdminPath($this->instance->entity_type, $this->instance->bundle) . '/fields';
   }
 
   /**
@@ -77,7 +106,7 @@ public function submitForm(array &$form, array &$form_state) {
       drupal_set_message(t('There was a problem removing the %field from the %type content type.', array('%field' => $this->instance->label(), '%type' => $bundle_label)), 'error');
     }
 
-    $admin_path = field_ui_bundle_admin_path($this->instance->entity_type, $this->instance->bundle);
+    $admin_path = $this->entityManager->getAdminPath($this->instance->entity_type, $this->instance->bundle);
     $form_state['redirect'] = field_ui_get_destinations(array($admin_path . '/fields'));
 
     // Fields are purged on cron. However field module prevents disabling modules
diff --git a/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php b/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php
index 8973d952224ca2a21175efd3c46aa148046e812c..a8cd8912fa968dcfc8412bfa10c4c8d4190dc71b 100644
--- a/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php
+++ b/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php
@@ -83,7 +83,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL,
     form_load_include($form_state, 'inc', 'field_ui', 'field_ui.admin');
     $this->entity_type = $entity_type;
     $this->bundle = $bundle;
-    $this->adminPath = field_ui_bundle_admin_path($this->entity_type, $this->bundle);
+    $this->adminPath = $this->entityManager->getAdminPath($this->entity_type, $this->bundle);
   }
 
   /**
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index de5b8d59797c6346a7f610fc7f03f0cf9dc47f5a..0d92454f19123e389f02db309c649dc6644043be 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -213,15 +213,10 @@ function node_entity_view_mode_info() {
 function node_entity_bundle_info() {
   $bundles = array();
   // Bundles must provide a human readable name so we can create help and error
-  // messages, and the path to attach Field admin pages to.
+  // messages.
   node_type_cache_reset();
   foreach (node_type_get_names() as $type => $name) {
-    $bundles['node'][$type] = array(
-      'label' => $name,
-      'admin' => array(
-        'real path' => 'admin/structure/types/manage/' . $type,
-      ),
-    );
+    $bundles['node'][$type]['label'] = $name;
   }
   return $bundles;
 }
diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module
index b33bd0efd3f4a8d5fa8cbba3ad3ac48bde081f58..910b79388520f3d1b5081268b039315363f976a4 100644
--- a/core/modules/taxonomy/taxonomy.module
+++ b/core/modules/taxonomy/taxonomy.module
@@ -125,12 +125,7 @@ function taxonomy_entity_bundle_info() {
   $bundles = array();
   foreach (taxonomy_vocabulary_get_names() as $id) {
     $config = config('taxonomy.vocabulary.' . $id);
-    $bundles['taxonomy_term'][$id] = array(
-      'label' => $config->get('name'),
-      'admin' => array(
-        'real path' => 'admin/structure/taxonomy/manage/' . $id,
-      ),
-    );
+    $bundles['taxonomy_term'][$id]['label'] = $config->get('name');
   }
   return $bundles;
 }
diff --git a/core/modules/translation_entity/translation_entity.pages.inc b/core/modules/translation_entity/translation_entity.pages.inc
index 6d743fb0ab6cdff675d1344aa50308c11085eb8f..38ae80bbc3340e8b2cd04d794fdcd870131ac39a 100644
--- a/core/modules/translation_entity/translation_entity.pages.inc
+++ b/core/modules/translation_entity/translation_entity.pages.inc
@@ -17,6 +17,7 @@
  */
 function translation_entity_overview(EntityInterface $entity) {
   $controller = translation_entity_controller($entity->entityType());
+  $entity_manager = Drupal::entityManager();
   $languages = language_list();
   $original = $entity->language()->langcode;
   $translations = $entity->getTranslationLanguages();
@@ -124,7 +125,7 @@ function translation_entity_overview(EntityInterface $entity) {
             $links['add']['title'] = t('Add');
           }
           elseif ($field_ui) {
-            $entity_path = field_ui_bundle_admin_path($entity->entityType(), $entity->bundle());
+            $entity_path = $entity_manager->getAdminPath($entity->entityType(), $entity->bundle());
             // Link directly to the fields tab to make it easier to find the
             // setting to enable translation on fields.
             $path = $entity_path . '/fields';
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 5f0b0f8959688884351cf485e366a58406b3cfae..dcec95a35d180f64cae229eb9c0d8952c48b6f56 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -143,12 +143,7 @@ function user_entity_view_mode_info() {
  * Implements hook_entity_bundle_info().
  */
 function user_entity_bundle_info() {
-  $bundles['user']['user'] = array(
-    'label' => t('User'),
-    'admin' => array(
-      'path' => 'admin/config/people/accounts',
-    ),
-  );
+  $bundles['user']['user']['label'] = t('User');
   return $bundles;
 }