diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Block/CustomBlockBlock.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Block/CustomBlockBlock.php
index 514fc91..9ee6efc 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Block/CustomBlockBlock.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Block/CustomBlockBlock.php
@@ -153,11 +153,9 @@ public function build() {
     }
     else {
       return array(
-        '#markup' => t('Block with uuid %uuid does not exist. <a href="!url">Add custom block</a>.', array(
+        '#markup' => t('Block with uuid %uuid does not exist.', array(
           '%uuid' => $uuid,
-          '!url' => url('block/add')
         )),
-        '#access' => $this->account->hasPermission('administer blocks')
       );
     }
   }
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Derivative/CustomBlock.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Derivative/CustomBlock.php
index f93b413..706e522 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Derivative/CustomBlock.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Derivative/CustomBlock.php
@@ -8,6 +8,7 @@
 namespace Drupal\custom_block\Plugin\Derivative;
 
 use Drupal\Component\Plugin\Derivative\DerivativeBase;
+use Drupal\Component\Plugin\PluginBase;
 use Drupal\Core\Plugin\Discovery\ContainerDerivativeInterface;
 
 /**
@@ -23,6 +24,16 @@ public function getDerivativeDefinitions($base_plugin_definition) {
       $this->derivatives[$custom_block->uuid()] = $base_plugin_definition;
       $this->derivatives[$custom_block->uuid()]['admin_label'] = $custom_block->label();
     }
+    // Build missing/broken blocks.
+    /** @var \Drupal\block\BlockInterface $block */
+    foreach (entity_load_multiple('block') as $block) {
+      list(, $uuid) = explode(PluginBase::DERIVATIVE_SEPARATOR, $block->getPluginId());
+      if (!in_array($uuid, array_keys($this->derivatives))) {
+        $this->derivatives[$uuid] = $base_plugin_definition;
+        $this->derivatives[$uuid]['admin_label'] = t('Missing custom block %uuid', array('%uuid' => $uuid));
+      }
+    }
     return parent::getDerivativeDefinitions($base_plugin_definition);
   }
+
 }
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockPageViewTest.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockPageViewTest.php
index fafb357..2a04024 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockPageViewTest.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Tests/CustomBlockPageViewTest.php
@@ -31,7 +31,7 @@ public static function getInfo() {
   }
 
   /**
-   * Checks block edit functionality.
+   * Checks block edit and fallback functionality.
    */
   public function testPageEdit() {
     $this->drupalLogin($this->adminUser);
@@ -42,6 +42,11 @@ public function testPageEdit() {
 
     // Assert response was '200' and not '403 Access denied'.
     $this->assertResponse('200', 'User was able the view the block');
+
+    $this->drupalGet('<front>');
+    $this->assertRaw(t('Block with uuid %uuid does not exist.', array(
+      '%uuid' => 'foobar_gorilla',
+    )));
   }
 
 }
diff --git a/core/modules/block/custom_block/tests/modules/custom_block_test/config/install/block.block.foobar.yml b/core/modules/block/custom_block/tests/modules/custom_block_test/config/install/block.block.foobar.yml
new file mode 100644
index 0000000..939779c
--- /dev/null
+++ b/core/modules/block/custom_block/tests/modules/custom_block_test/config/install/block.block.foobar.yml
@@ -0,0 +1,35 @@
+id: foobar
+weight: null
+status: true
+langcode: en
+dependencies:
+  module:
+    - custom_block
+  theme:
+    - stark
+theme: stark
+region: sidebar_first
+plugin: 'custom_block:foobar_gorilla'
+settings:
+  label: Foobar
+  provider: custom_block
+  label_display: visible
+  cache:
+    max_age: -1
+    contexts: {  }
+  status: true
+  info: ''
+  view_mode: default
+  admin_label: ''
+  custom_block:
+    view_mode: default
+visibility:
+  path:
+    visibility: 0
+    pages: ''
+  role:
+    roles: {  }
+  node_type:
+    types:
+      article: '0'
+      page: '0'
diff --git a/core/modules/block/lib/Drupal/block/BlockInterface.php b/core/modules/block/lib/Drupal/block/BlockInterface.php
index de0d9de..80ec1be 100644
--- a/core/modules/block/lib/Drupal/block/BlockInterface.php
+++ b/core/modules/block/lib/Drupal/block/BlockInterface.php
@@ -32,4 +32,12 @@
    */
   public function getPlugin();
 
+  /**
+   * Returns the plugin instance id.
+   *
+   * @return string
+   *   The plugin instance id for this block.
+   */
+  public function getPluginId();
+
 }
diff --git a/core/modules/block/lib/Drupal/block/Entity/Block.php b/core/modules/block/lib/Drupal/block/Entity/Block.php
index f1111fe..1ed460e 100644
--- a/core/modules/block/lib/Drupal/block/Entity/Block.php
+++ b/core/modules/block/lib/Drupal/block/Entity/Block.php
@@ -189,4 +189,11 @@ public function getListCacheTags() {
     return array('theme' => $this->theme);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getPluginId() {
+    return $this->plugin;
+  }
+
 }
