diff --git a/core/lib/Drupal/Core/Theme/ThemeManager.php b/core/lib/Drupal/Core/Theme/ThemeManager.php
index a100374..c666ff7 100644
--- a/core/lib/Drupal/Core/Theme/ThemeManager.php
+++ b/core/lib/Drupal/Core/Theme/ThemeManager.php
@@ -143,6 +143,8 @@ protected function theme($hook, $variables = array()) {
 
     $theme_registry = $this->themeRegistry->getRuntime();
 
+    $theme_hooks = $hook;
+
     // If an array of hook candidates were passed, use the first one that has an
     // implementation.
     if (is_array($hook)) {
@@ -232,6 +234,9 @@ protected function theme($hook, $variables = array()) {
     // If _theme() was invoked with a direct theme suggestion like
     // '#theme' => 'node__article', add it to the suggestions array before
     // invoking suggestion alter hooks.
+    if ($hook != $theme_hooks) {
+      $suggestions = array_merge($suggestions, (array) $theme_hooks);
+    }
     if (isset($info['base hook'])) {
       $suggestions[] = $hook;
     }
diff --git a/core/modules/system/src/Tests/Theme/ThemeSuggestionsAlterTest.php b/core/modules/system/src/Tests/Theme/ThemeSuggestionsAlterTest.php
index 1db3583..ece21d1 100644
--- a/core/modules/system/src/Tests/Theme/ThemeSuggestionsAlterTest.php
+++ b/core/modules/system/src/Tests/Theme/ThemeSuggestionsAlterTest.php
@@ -156,6 +156,30 @@ public function testSuggestionsAlterInclude() {
     $this->assertText('Function suggested via suggestion alter hook found in include file.', 'Include file loaded for second request.');
   }
 
+
+  /**
+   * Tests hook_theme_suggestions_HOOK().
+   */
+  public function testArraySuggestions() {
+    $this->drupalGet('theme-test/array-suggestions');
+    $this->assertText('Template for testing suggestion hooks with an array of theme suggestions.');
+
+    // Enable the theme_suggestions_test module to test modules implementing
+    // suggestions hooks.
+    \Drupal::service('module_installer')->install(array('theme_suggestions_test'));
+
+    // Install test_theme to provide a template for the suggestion added in
+    // theme_suggestions_test module.
+    $this->config('system.theme')
+      ->set('default', 'test_theme')
+      ->save();
+
+    $this->resetAll();
+    $this->drupalGet('theme-test/array-suggestions');
+    $this->assertText('Template overridden based on new theme suggestion provided by a module via hook_theme_suggestions_HOOK().');
+  }
+
+
   /**
    * Tests execution order of theme suggestion alter hooks.
    *
diff --git a/core/modules/system/tests/modules/theme_suggestions_test/theme_suggestions_test.module b/core/modules/system/tests/modules/theme_suggestions_test/theme_suggestions_test.module
index 974856a..1d8cbf2 100644
--- a/core/modules/system/tests/modules/theme_suggestions_test/theme_suggestions_test.module
+++ b/core/modules/system/tests/modules/theme_suggestions_test/theme_suggestions_test.module
@@ -55,3 +55,10 @@ function theme_suggestions_test_theme_suggestions_theme_test_specific_suggestion
 function theme_suggestions_test_theme_suggestions_theme_test_suggestions_include_alter(array &$suggestions, array $variables, $hook) {
   $suggestions[] = 'theme_suggestions_test_include';
 }
+
+/**
+ * Implements hook_theme_suggestions_HOOK().
+ */
+function theme_suggestions_test_theme_suggestions_theme_test_array_suggestions(array $variables) {
+  return array('theme_test_array_suggestions__suggestion_from_hook');
+}
diff --git a/core/modules/system/tests/modules/theme_test/src/ThemeTestController.php b/core/modules/system/tests/modules/theme_test/src/ThemeTestController.php
index 335ed83..887fa3a 100644
--- a/core/modules/system/tests/modules/theme_test/src/ThemeTestController.php
+++ b/core/modules/system/tests/modules/theme_test/src/ThemeTestController.php
@@ -133,6 +133,14 @@ function suggestionAlterInclude() {
   }
 
   /**
+   * Menu callback for testing suggestion hooks with an array of theme hooks.
+   */
+  public function arraySuggestions() {
+    return array('#theme' => array('theme_test_array_suggestions__not_implemented', 'theme_test_array_suggestions'));
+  }
+
+
+  /**
    * Controller to ensure that no theme is initialized.
    *
    * @return \Symfony\Component\HttpFoundation\JsonResponse
diff --git a/core/modules/system/tests/modules/theme_test/templates/theme-test-array-suggestions.html.twig b/core/modules/system/tests/modules/theme_test/templates/theme-test-array-suggestions.html.twig
new file mode 100644
index 0000000..bb52340
--- /dev/null
+++ b/core/modules/system/tests/modules/theme_test/templates/theme-test-array-suggestions.html.twig
@@ -0,0 +1,2 @@
+{# Output for Theme API test #}
+Template for testing suggestion hooks with an array of theme suggestions.
diff --git a/core/modules/system/tests/modules/theme_test/theme_test.module b/core/modules/system/tests/modules/theme_test/theme_test.module
index 7ba5c2d..b4778d1 100644
--- a/core/modules/system/tests/modules/theme_test/theme_test.module
+++ b/core/modules/system/tests/modules/theme_test/theme_test.module
@@ -52,6 +52,9 @@ function theme_test_theme($existing, $type, $theme, $path) {
     'variables' => array(),
     'function' => 'theme_theme_test_function_template_override',
   );
+  $items['theme_test_array_suggestions'] = array(
+    'variables' => array(),
+  );
   $info['test_theme_not_existing_function'] = array(
     'function' => 'test_theme_not_existing_function',
   );
diff --git a/core/modules/system/tests/modules/theme_test/theme_test.routing.yml b/core/modules/system/tests/modules/theme_test/theme_test.routing.yml
index 2dbd188..00c9034 100644
--- a/core/modules/system/tests/modules/theme_test/theme_test.routing.yml
+++ b/core/modules/system/tests/modules/theme_test/theme_test.routing.yml
@@ -97,6 +97,13 @@ suggestion_alter_include:
   requirements:
     _access: 'TRUE'
 
+theme_test.array_suggestions:
+  path: '/theme-test/array-suggestions'
+  defaults:
+    _controller: '\Drupal\theme_test\ThemeTestController::arraySuggestions'
+  requirements:
+    _access: 'TRUE'
+
 theme_test.non_html:
   path: '/theme-test/non-html'
   defaults:
diff --git a/core/modules/system/tests/themes/test_theme/templates/theme-test-array-suggestions--suggestion-from-hook.html.twig b/core/modules/system/tests/themes/test_theme/templates/theme-test-array-suggestions--suggestion-from-hook.html.twig
new file mode 100644
index 0000000..2a00d59
--- /dev/null
+++ b/core/modules/system/tests/themes/test_theme/templates/theme-test-array-suggestions--suggestion-from-hook.html.twig
@@ -0,0 +1,2 @@
+{# Output for Theme API test #}
+Template overridden based on new theme suggestion provided by a module via hook_theme_suggestions_HOOK().
diff --git a/core/modules/views/src/Tests/ViewsThemeIntegrationTest.php b/core/modules/views/src/Tests/ViewsThemeIntegrationTest.php
index 91de60c..6c67ee8 100644
--- a/core/modules/views/src/Tests/ViewsThemeIntegrationTest.php
+++ b/core/modules/views/src/Tests/ViewsThemeIntegrationTest.php
@@ -81,4 +81,29 @@ public function testThemedViewPage() {
     $this->assertRaw("test_basetheme_views_post_render", "Views title changed by test_basetheme.test_basetheme_views_post_render");
   }
 
+  /**
+   * Tests the views theme suggestions in debug mode.
+   */
+  public function testThemeSuggestionsInDebug() {
+    $parameters = $this->container->getParameter('twig.config');
+    $parameters['debug'] = TRUE;
+    $this->setContainerParameter('twig.config', $parameters);
+    $this->rebuildContainer();
+    $this->resetAll();
+
+    $build = [
+      '#type' => 'view',
+      '#name' => 'test_page_display',
+      '#display_id' => 'default',
+      '#arguments' => array(),
+    ];
+
+    $output = drupal_render($build, TRUE);
+
+    $this->assertTrue(strpos($output, '* views-view--test-page-display--default.html.twig') !== FALSE);
+    $this->assertTrue(strpos($output, '* views-view--default.html.twig') !== FALSE);
+    $this->assertTrue(strpos($output, '* views-view--test-page-display.html.twig') !== FALSE);
+    $this->assertTrue(strpos($output, 'x views-view.html.twig') !== FALSE);
+  }
+
 }
diff --git a/core/themes/engines/twig/twig.engine b/core/themes/engines/twig/twig.engine
index 39e866a..81fc717 100644
--- a/core/themes/engines/twig/twig.engine
+++ b/core/themes/engines/twig/twig.engine
@@ -93,6 +93,7 @@ function twig_render_template($template_file, array $variables) {
       if (strpos($variables['theme_hook_original'], '__') === FALSE) {
         $suggestions[] = $variables['theme_hook_original'];
       }
+      $suggestions = array_unique($suggestions);
       foreach ($suggestions as &$suggestion) {
         $template = strtr($suggestion, '_', '-') . $extension;
         $prefix = ($template == $current_template) ? 'x' : '*';
