diff --git a/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php b/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
index 6da6940..77ab8d3 100644
--- a/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
+++ b/core/lib/Drupal/Component/Plugin/Discovery/DerivativeDiscoveryDecorator.php
@@ -34,7 +34,7 @@ public function __construct(DiscoveryInterface $decorated) {
    * Implements Drupal\Component\Plugin\Discovery\DiscoveryInterface::getDefinition().
    */
   public function getDefinition($plugin_id) {
-    list($base_plugin_id, $derivative_id) = $this->decodePluginId($plugin_id);
+    list($base_plugin_id, $derivative_id) = static::decodePluginId($plugin_id);
 
     $plugin_definition = $this->decorated->getDefinition($base_plugin_id);
     if (isset($plugin_definition)) {
@@ -68,7 +68,7 @@ protected function getDerivatives(array $base_plugin_definitions) {
       if ($derivative_fetcher) {
         $derivative_definitions = $derivative_fetcher->getDerivativeDefinitions($plugin_definition);
         foreach ($derivative_definitions as $derivative_id => $derivative_definition) {
-          $plugin_id = $this->encodePluginId($base_plugin_id, $derivative_id);
+          $plugin_id = static::encodePluginId($base_plugin_id, $derivative_id);
           $plugin_definitions[$plugin_id] = $derivative_definition;
         }
       }
@@ -90,7 +90,7 @@ protected function getDerivatives(array $base_plugin_definitions) {
    *   An array with the base plugin id as the first index and the derivative id
    *   as the second. If there is no derivative id it will be null.
    */
-  protected function decodePluginId($plugin_id) {
+  public static function decodePluginId($plugin_id) {
     // Try and split the passed plugin definition into a plugin and a
     // derivative id. We don't need to check for !== FALSE because a leading
     // colon would break the derivative system and doesn't makes sense.
@@ -112,7 +112,7 @@ protected function decodePluginId($plugin_id) {
    * @return string
    *   A uniquely encoded combination of the $base_plugin_id and $derivative_id.
    */
-  protected function encodePluginId($base_plugin_id, $derivative_id) {
+  public static function encodePluginId($base_plugin_id, $derivative_id) {
     if ($derivative_id) {
       return "$base_plugin_id:$derivative_id";
     }
diff --git a/core/lib/Drupal/Core/Entity/Plugin/DataType/Deriver/EntityDeriver.php b/core/lib/Drupal/Core/Entity/Plugin/DataType/Deriver/EntityDeriver.php
index 4de5d6e..c7e06b4 100644
--- a/core/lib/Drupal/Core/Entity/Plugin/DataType/Deriver/EntityDeriver.php
+++ b/core/lib/Drupal/Core/Entity/Plugin/DataType/Deriver/EntityDeriver.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\Entity\Plugin\DataType\Deriver;
 
+use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
 use Drupal\Core\Entity\EntityManager;
 use Drupal\Core\Plugin\Discovery\ContainerDerivativeInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -90,7 +91,8 @@ public function getDerivativeDefinitions(array $base_plugin_definition) {
       // Incorporate the bundles as entity:$entity_type:$bundle, if any.
       foreach (entity_get_bundles($entity_type) as $bundle => $bundle_info) {
         if ($bundle !== $entity_type) {
-          $this->derivatives[$entity_type . ':' . $bundle] = array(
+          $derivative_id = DerivativeDiscoveryDecorator::encodePluginId($entity_type, $bundle);
+          $this->derivatives[$derivative_id] = array(
             'label' => $bundle_info['label'],
             'class' => $info['class'],
             'constraints' => array(
diff --git a/core/modules/block/block.module b/core/modules/block/block.module
index 8d38c1c..839533a 100644
--- a/core/modules/block/block.module
+++ b/core/modules/block/block.module
@@ -5,6 +5,7 @@
  * Controls the visual building blocks a page is constructed with.
  */
 
+use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
 use Drupal\Component\Plugin\Exception\PluginException;
 use Drupal\Component\Utility\NestedArray;
 
@@ -567,8 +568,9 @@ function block_user_role_delete($role) {
  * Implements hook_menu_delete().
  */
 function block_menu_delete($menu) {
+  $derivative_id = DerivativeDiscoveryDecorator::encodePluginId('system_menu_block', $menu->id());
   foreach (entity_load_multiple('block') as $block) {
-    if ($block->get('plugin') == 'system_menu_block:' . $menu->id()) {
+    if ($block->get('plugin') == $derivative_id) {
       $block->delete();
     }
   }
diff --git a/core/modules/block/lib/Drupal/block/Tests/BlockHtmlIdTest.php b/core/modules/block/lib/Drupal/block/Tests/BlockHtmlIdTest.php
index c719fbe..0c1d1ed 100644
--- a/core/modules/block/lib/Drupal/block/Tests/BlockHtmlIdTest.php
+++ b/core/modules/block/lib/Drupal/block/Tests/BlockHtmlIdTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\block\Tests;
 
+use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -39,7 +40,8 @@ function setUp() {
     \Drupal::state()->set('block_test.content', $current_content);
 
     // Enable our test blocks.
-    $this->drupalPlaceBlock('system_menu_block:tools');
+    $derivative_id = DerivativeDiscoveryDecorator::encodePluginId('system_menu_block', 'tools');
+    $this->drupalPlaceBlock($derivative_id);
     $this->drupalPlaceBlock('test_html_id', array('machine_name' => 'test_id_block'));
   }
 
diff --git a/core/modules/block/lib/Drupal/block/Tests/BlockTemplateSuggestionsUnitTest.php b/core/modules/block/lib/Drupal/block/Tests/BlockTemplateSuggestionsUnitTest.php
index cf50e78..e25bd9e 100644
--- a/core/modules/block/lib/Drupal/block/Tests/BlockTemplateSuggestionsUnitTest.php
+++ b/core/modules/block/lib/Drupal/block/Tests/BlockTemplateSuggestionsUnitTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\block\Tests;
 
+use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -37,8 +38,9 @@ function testBlockThemeHookSuggestions() {
     // an underscore (not transformed) and a hyphen (transformed to underscore),
     // and generates possibilities for each level of derivative.
     // @todo Clarify this comment.
+    $derivative_id = DerivativeDiscoveryDecorator::encodePluginId('system_menu_block', 'admin');
     $block = entity_create('block', array(
-      'plugin' => 'system_menu_block:admin',
+      'plugin' => $derivative_id,
       'region' => 'footer',
       'id' => \Drupal::config('system.theme')->get('default') . '.machinename',
     ));
diff --git a/core/modules/block/lib/Drupal/block/Tests/BlockUiTest.php b/core/modules/block/lib/Drupal/block/Tests/BlockUiTest.php
index d996b1e..e545046 100644
--- a/core/modules/block/lib/Drupal/block/Tests/BlockUiTest.php
+++ b/core/modules/block/lib/Drupal/block/Tests/BlockUiTest.php
@@ -45,12 +45,13 @@ function setUp() {
     ));
     $this->drupalLogin($this->adminUser);
 
+    $derivative_id = DerivativeDiscoveryDecorator::encodePluginId('system_menu_block', 'tools');
     // Enable some test blocks.
     $this->testBlocks = array(
       array(
         'label' => 'Tools',
         'tr' => '5',
-        'plugin_id' => 'system_menu_block:tools',
+        'plugin_id' => $derivative_id,
         'settings' => array('region' => 'sidebar_second', 'machine_name' => 'tools'),
         'test_weight' => '-1',
       ),
diff --git a/core/modules/views/lib/Drupal/views/Plugin/entity_reference/selection/ViewsSelection.php b/core/modules/views/lib/Drupal/views/Plugin/entity_reference/selection/ViewsSelection.php
index 5a7dba5..6cd1663 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/entity_reference/selection/ViewsSelection.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/entity_reference/selection/ViewsSelection.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\views\Plugin\entity_reference\selection;
 
+use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
 use Drupal\Core\Annotation\Translation;
 use Drupal\Core\Database\Query\SelectInterface;
 use Drupal\Core\Entity\EntityInterface;
@@ -71,7 +72,8 @@ public static function settingsForm(FieldDefinitionInterface $field_definition)
       if ($view->storage->get('base_table') == $entity_info['base_table']) {
         $name = $view->storage->get('id');
         $display = $view->storage->get('display');
-        $options[$name . ':' . $display_id] = $name . ' - ' . $display[$display_id]['display_title'];
+        $derivative_id = DerivativeDiscoveryDecorator::encodePluginId($name, $display_id);
+        $options[$derivative_id] = $name . ' - ' . $display[$display_id]['display_title'];
       }
     }
 
@@ -83,7 +85,10 @@ public static function settingsForm(FieldDefinitionInterface $field_definition)
     $form['view']['#element_validate'] = array(array($plugin, 'settingsFormValidate'));
 
     if ($options) {
-      $default = !empty($view_settings['view_name']) ? $view_settings['view_name'] . ':' . $view_settings['display_name'] : NULL;
+      $default = NULL;
+      if (!empty($view_settings['view_name'])) {
+        $default = DerivativeDiscoveryDecorator::encodePluginId($view_settings['view_name'], $view_settings['display_name']);
+      }
       $form['view']['view_and_display'] = array(
         '#type' => 'select',
         '#title' => t('View used to select the entities'),
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/area/View.php b/core/modules/views/lib/Drupal/views/Plugin/views/area/View.php
index 103df0a..b12011b 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/area/View.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/area/View.php
@@ -8,6 +8,7 @@
 namespace Drupal\views\Plugin\views\area;
 
 use Drupal\Component\Annotation\PluginID;
+use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
 
 /**
  * Views area handlers. Insert a view inside of an area.
@@ -33,7 +34,7 @@ protected function defineOptions() {
   public function buildOptionsForm(&$form, &$form_state) {
     parent::buildOptionsForm($form, $form_state);
 
-    $view_display = $this->view->storage->id() . ':' . $this->view->current_display;
+    $view_display = DerivativeDiscoveryDecorator::encodePluginId($$this->view->storage->id(), $this->view->current_display);
 
     $options = array('' => t('-Select-'));
     $options += views_get_views_as_options(FALSE, 'all', $view_display, FALSE, TRUE);
diff --git a/core/modules/views/lib/Drupal/views/Tests/ModuleTest.php b/core/modules/views/lib/Drupal/views/Tests/ModuleTest.php
index 9d8b391..d134fde 100644
--- a/core/modules/views/lib/Drupal/views/Tests/ModuleTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/ModuleTest.php
@@ -10,6 +10,7 @@
 /**
  * Tests basic functions from the Views module.
  */
+use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
 use Drupal\views\Plugin\views\filter\Standard;
 use Drupal\Component\Utility\String;
 
@@ -208,7 +209,8 @@ public function testLoadFunctions() {
     $expected_opt_groups = array();
     foreach ($all_views as $id => $view) {
       foreach ($view->get('display') as $display_id => $display) {
-          $expected_opt_groups[$view->id()][$view->id() . ':' . $display['id']] = t('@view : @display', array('@view' => $view->id(), '@display' => $display['id']));
+        $derivative_id = DerivativeDiscoveryDecorator::encodePluginId($view->id(), $display['id']);
+        $expected_opt_groups[$view->id()][$derivative_id] = t('@view : @display', array('@view' => $view->id(), '@display' => $display['id']));
       }
     }
     $this->assertIdentical($expected_opt_groups, views_get_views_as_options(FALSE, 'all', NULL, TRUE), 'Expected option array for an option group returned.');
@@ -289,7 +291,8 @@ protected function formatViewOptions(array $views = array()) {
     $expected_options = array();
     foreach ($views as $id => $view) {
       foreach ($view->get('display') as $display_id => $display) {
-        $expected_options[$view->id() . ':' . $display['id']] = t('View: @view - Display: @display',
+        $derivative_id = DerivativeDiscoveryDecorator::encodePluginId($view->id(), $display['id']);
+        $expected_options[$derivative_id] = t('View: @view - Display: @display',
           array('@view' => $view->id(), '@display' => $display['id']));
       }
     }
diff --git a/core/modules/views/views.module b/core/modules/views/views.module
index d8e0712..5e7f537 100644
--- a/core/modules/views/views.module
+++ b/core/modules/views/views.module
@@ -9,6 +9,7 @@
  * incoming page and block requests.
  */
 
+use Drupal\Component\Plugin\Discovery\DerivativeDiscoveryDecorator;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Database\Query\AlterableInterface;
 use Drupal\Core\Language\Language;
@@ -1031,9 +1032,7 @@ function views_get_views_as_options($views_only = FALSE, $filter = 'all', $exclu
     $exclude_view_display = $exclude_view->current_display;
   }
   else {
-    // Append a ':' to the $exclude_view string so we always have more than one
-    // item to explode.
-    list($exclude_view_name, $exclude_view_display) = explode(':', "$exclude_view:");
+    list($exclude_view_name, $exclude_view_display) = DerivativeDiscoveryDecorator::decodePluginId($exclude_view);
   }
 
   $options = array();
@@ -1047,11 +1046,12 @@ function views_get_views_as_options($views_only = FALSE, $filter = 'all', $exclu
     else {
       foreach ($view->get('display') as $display_id => $display) {
         if (!($id == $exclude_view_name && $display_id == $exclude_view_display)) {
+          $derivative_id = DerivativeDiscoveryDecorator::encodePluginId($id, $display['id']);
           if ($optgroup) {
-            $options[$id][$id . ':' . $display['id']] = t('@view : @display', array('@view' => $id, '@display' => $display['id']));
+            $options[$id][$derivative_id] = t('@view : @display', array('@view' => $id, '@display' => $display['id']));
           }
           else {
-            $options[$id . ':' . $display['id']] = t('View: @view - Display: @display', array('@view' => $id, '@display' => $display['id']));
+            $options[$derivative_id] = t('View: @view - Display: @display', array('@view' => $id, '@display' => $display['id']));
           }
         }
       }
