Index: menu_block.module
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- menu_block.module	(revision c6195b4829e3687ccd7e635d6ab2ee15ac7ec9fd)
+++ menu_block.module	(revision )
@@ -1,5 +1,7 @@
 <?php
 
+use Drupal\Core\Block\BlockPluginInterface;
+
 /**
  * Implements hook_theme_suggestions_HOOK() for "block".
  */
@@ -98,4 +100,13 @@
   }
 
   return $suggestions;
+}
+
+/**
+ * Implements hook_block_view_alter().
+ */
+function menu_block_block_view_alter(array &$build, BlockPluginInterface $block) {
+  if ($block->getBaseId() === 'menu_block') {
+    $build['#configuration']['label'] = $block->blockLabel();
+  }
 }
Index: src/Plugin/Block/MenuBlock.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- src/Plugin/Block/MenuBlock.php	(revision c6195b4829e3687ccd7e635d6ab2ee15ac7ec9fd)
+++ src/Plugin/Block/MenuBlock.php	(revision )
@@ -3,6 +3,7 @@
 namespace Drupal\menu_block\Plugin\Block;
 
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\menu_link_content\Entity\MenuLinkContent;
 use Drupal\system\Entity\Menu;
 use Drupal\system\Plugin\Block\SystemMenuBlock;
 
@@ -54,6 +55,23 @@
       '#description' => $this->t('Alter the options in “Menu levels” to be relative to the fixed parent item. The block will only contain children of the selected menu link.'),
     ];
 
+    $form['advanced']['label_type'] = [
+      '#type' => 'select',
+      '#title' => 'Use the following as title',
+      '#options' => [
+        'block' => $this->t('Block title'),
+        'menu' => $this->t('Menu title'),
+        'parent' => $this->t('Active trail\'s parent title'),
+        'root' => $this->t('Active trail\'s root title')
+      ],
+      '#default_value' => $config['label_type'],
+      '#states' => [
+        'visible' => [
+          ':input[name="settings[label_display]"]' => ['checked' => TRUE]
+        ]
+      ]
+    ];
+
     $form['style'] = [
       '#type' => 'details',
       '#title' => $this->t('HTML and style options'),
@@ -103,6 +121,7 @@
     $this->configuration['expand'] = $form_state->getValue('expand');
     $this->configuration['parent'] = $form_state->getValue('parent');
     $this->configuration['suggestion'] = $form_state->getValue('suggestion');
+    $this->configuration['label_type'] = $form_state->getValue('label_type');
   }
 
   /**
@@ -184,8 +203,93 @@
       'depth' => 0,
       'expand' => 0,
       'parent' => $this->getDerivativeId() . ':',
+      'label_type' => 'block',
       'suggestion' => strtr($this->getDerivativeId(), '-', '_'),
     ];
+  }
+
+  /**
+   * @return string
+   */
+  public function blockLabel() {
+    switch ($this->configuration['label_type']) {
+      case 'menu':
+        return $this->getMenuTitle();
+        break;
+      case 'parent':
+        return $this->getActiveTrailParentTitle();
+        break;
+      case 'root':
+        return $this->getActiveTrailRootTitle();
+        break;
+      case 'block':
+      default:
+        return $this->label();
+    }
+  }
+
+  /**
+   * @return string
+   */
+  protected function getMenuTitle() {
+    return Menu::load($this->getDerivativeId())->label();
+  }
+
+  /**
+   * @return string
+   */
+  protected function getActiveTrailParentTitle() {
+    $activeTrailIds = $this->getDerivativeActiveTrailIds();
+
+    if ($activeTrailIds) {
+      $pointer = count($activeTrailIds) > 1 ? next($activeTrailIds) : reset($activeTrailIds);
+      return $this->getMenuLinkTitleByPluginId($pointer);
+    }
+    else {
+      return '';
+    }
+  }
+
+  /**
+   * @return string
+   */
+  protected function getActiveTrailRootTitle() {
+    $activeTrailIds = $this->getDerivativeActiveTrailIds();
+
+    if ($activeTrailIds) {
+      return $this->getMenuLinkTitleByPluginId(end($activeTrailIds));
+    }
+    else {
+      return '';
+    }
+  }
+
+  /**
+   * @return array
+   */
+  private function getDerivativeActiveTrailIds() {
+    $menuId = $this->getDerivativeId();
+    return array_filter($this->menuActiveTrail->getActiveTrailIds($menuId));
+  }
+
+  /**
+   * @param string $pluginId
+   * @return string
+   */
+  private function getMenuLinkTitleByPluginId($pluginId) {
+    list($entityType, $entityUuid) = explode(':', $pluginId);
+    $parentIds = \Drupal::entityQuery($entityType)
+      ->condition('uuid', $entityUuid)
+      ->execute();
+
+    if ($parentIds) {
+      $parentId = reset($parentIds);
+      $parent = MenuLinkContent::load($parentId);
+
+      return $parent->getTitle();
+    }
+
+    return '';
   }
 
 }
