diff --git a/core/modules/outside_in/outside_in.module b/core/modules/outside_in/outside_in.module
index a7fab7b..147b824 100644
--- a/core/modules/outside_in/outside_in.module
+++ b/core/modules/outside_in/outside_in.module
@@ -34,6 +34,11 @@ function outside_in_help($route_name, RouteMatchInterface $route_match) {
  */
 function outside_in_contextual_links_view_alter(&$element, $items) {
   if (isset($element['#links']['outside-inblock-configure'])) {
+    if (!empty($element['#contextual_links']['block']['metadata']['remove_outside_in'])) {
+      unset($element['#links']['outside-inblock-configure']);
+      unset($items['outside_in.block_configure']);
+      return;
+    }
     $element['#links']['outside-inblock-configure']['attributes'] = [
       'class' => ['use-ajax'],
       'data-dialog-type' => 'dialog',
@@ -55,6 +60,12 @@ function outside_in_block_view_alter(array &$build) {
   $build['#contextual_links']['outside_in'] = [
     'route_parameters' => [],
   ];
+  if (!\Drupal::service('outside_in.manager')->isBlockEditable($build['#plugin_id']) && isset($build['#contextual_links']['block'])) {
+    // If this block should not be editable flag for contextual link removable.
+    // The individual links are not available here to remove.
+    $build['#contextual_links']['block']['metadata']['remove_outside_in'] = TRUE;
+  }
+
 }
 
 /**
@@ -93,7 +104,9 @@ function outside_in_entity_type_build(array &$entity_types) {
 function outside_in_preprocess_block(&$variables) {
   // The main system block does not contain the block contextual links.
   $variables['#cache']['contexts'][] = 'outside_in_is_applied';
-  if ($variables['plugin_id'] !== 'system_main_block' && \Drupal::service('outside_in.manager')->isApplicable()) {
+  /** @var \Drupal\outside_in\OutsideInManagerInterface $outside_in_manager */
+  $outside_in_manager = \Drupal::service('outside_in.manager');
+  if ($outside_in_manager->isBlockEditable($variables['plugin_id']) && $outside_in_manager->isApplicable()) {
     // Add class and attributes to all blocks to allow Javascript to target.
     $variables['attributes']['class'][] = 'outside-in-editable';
     $variables['attributes']['data-drupal-outsidein'] = 'editable';
diff --git a/core/modules/outside_in/src/OutsideInManager.php b/core/modules/outside_in/src/OutsideInManager.php
index 666a938..6549e2a 100644
--- a/core/modules/outside_in/src/OutsideInManager.php
+++ b/core/modules/outside_in/src/OutsideInManager.php
@@ -63,4 +63,12 @@ public function isApplicable() {
     return $this->account->hasPermission('administer blocks') && !$is_admin_route && !$is_admin_demo_route;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function isBlockEditable($plugin_id) {
+    $non_editable_blocks = ['page_title_block', 'system_main_block'];
+    return !in_array($plugin_id, $non_editable_blocks);
+  }
+
 }
diff --git a/core/modules/outside_in/src/OutsideInManagerInterface.php b/core/modules/outside_in/src/OutsideInManagerInterface.php
index 684adb3..0cfc70c 100644
--- a/core/modules/outside_in/src/OutsideInManagerInterface.php
+++ b/core/modules/outside_in/src/OutsideInManagerInterface.php
@@ -15,4 +15,15 @@
    */
   public function isApplicable();
 
+  /**
+   * Checks whether a block should be covered by this module.
+   *
+   * @param string $plugin_id
+   *   The plugin id for the block to check.
+   *
+   * @return bool
+   *   TRUE if the block should the "Quick Edit" link provided by this module.
+   */
+  public function isBlockEditable($plugin_id);
+
 }
