diff --git a/core/modules/views/templates/views-view.html.twig b/core/modules/views/templates/views-view.html.twig
new file mode 100644
index 0000000..77e5073
--- /dev/null
+++ b/core/modules/views/templates/views-view.html.twig
@@ -0,0 +1,91 @@
+{#
+/**
+ * @file
+ * Default theme implementation for main view template.
+ *
+ * Available variables:
+ * - attributes: Remaining HTML attributes for the element.
+ * - attributes.class: HTML classes that can be used to style contextually
+ *    through CSS. Which includes:
+ *    .view
+ *    .view-[css_name]
+ *    .view-id-[view_name]
+ *    .view-display-id-[display_name]
+ *    .view-dom-id-[dom_id]
+ * - css_name: A css-safe version of the view name.
+ * - css_class: The user-specified class names, if any.
+ * - header: The view header.
+ * - footer: The view footer.
+ * - rows: The results of the view query, if any.
+ * - empty_message: The empty text to display if the view is empty.
+ * - pager: The pager next/prev links to display, if any.
+ * - exposed: Exposed widget form/info to display.
+ * - feed_icon: Feed icon to display, if any.
+ * - more: A link to view more, if any.
+ *
+ * @ingroup views_templates
+ */
+#}
+<div{{ attributes }}>
+
+  {{ title_prefix }}
+  {% if title is not empty %}
+    {{ title }}
+  {% endif %}
+  {{ title_suffix }}
+
+  {% if header is not empty %}
+    <div class="view-header">
+      {{ header }}
+    </div>
+  {% endif %}
+
+  {% if exposed %}
+    <div class="view-filters">
+      {{ exposed }}
+    </div>
+  {% endif %}
+
+  {% if attachment_before is not empty %}
+    <div class="attachment attachment-before">
+      {{ attachment_before }}
+    </div>
+  {% endif %}
+
+  {% if rows %}
+    <div class="view-content">
+      {{ rows }}
+    </div>
+  {% elseif empty_message is not empty  %}
+    <div class="view-empty">
+      {{ empty_message }}
+    </div>
+  {% endif %}
+
+  {% if pager %}
+    {{ pager }}
+  {% endif %}
+
+  {% if attachment_after is not empty %}
+    <div class="attachment attachment-after">
+      {{ attachment_after }}
+    </div>
+  {% endif %}
+
+  {% if more is not empty %}
+    {{ more }}
+  {% endif %}
+
+  {% if footer is not empty %}
+    <div class="view-footer">
+      {{ footer }}
+    </div>
+  {% endif %}
+
+  {% if feed_icon %}
+    <div class="feed-icon">
+      {{ feed_icon }}
+    </div>
+  {% endif %}
+
+</div>
diff --git a/core/modules/views/templates/views-view.tpl.php b/core/modules/views/templates/views-view.tpl.php
deleted file mode 100644
index ca8faef..0000000
--- a/core/modules/views/templates/views-view.tpl.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-
-/**
- * @file
- * Main view template.
- *
- * Variables available:
- * - $attributes: An instance of Attributes class that can be manipulated as an
- *   array and printed as a string.
- *   It includes the 'class' information, which includes:
- *    .view
- *    .view-[css_name]
- *    .view-id-[view_name]
- *    .view-display-id-[display_name]
- *    .view-dom-id-[dom_id]
- * - $css_name: A css-safe version of the view name.
- * - $css_class: The user-specified classes names, if any
- * - $header: The view header
- * - $footer: The view footer
- * - $rows: The results of the view query, if any
- * - $empty: The empty text to display if the view is empty
- * - $pager: The pager next/prev links to display, if any
- * - $exposed: Exposed widget form/info to display
- * - $feed_icon: Feed icon to display, if any
- * - $more: A link to view more, if any
- *
- * @ingroup views_templates
- */
-?>
-<div <?php print $attributes; ?>>
-  <?php print render($title_prefix); ?>
-  <?php if ($title): ?>
-    <?php print $title; ?>
-  <?php endif; ?>
-  <?php print render($title_suffix); ?>
-  <?php if ($header): ?>
-    <div class="view-header">
-      <?php print render($header); ?>
-    </div>
-  <?php endif; ?>
-
-  <?php if ($exposed): ?>
-    <div class="view-filters">
-      <?php print $exposed; ?>
-    </div>
-  <?php endif; ?>
-
-  <?php if ($attachment_before): ?>
-    <div class="attachment attachment-before">
-      <?php print render($attachment_before); ?>
-    </div>
-  <?php endif; ?>
-
-  <?php if ($rows = render($rows)): ?>
-    <div class="view-content">
-      <?php print $rows; ?>
-    </div>
-  <?php elseif ($empty): ?>
-    <div class="view-empty">
-      <?php print render($empty); ?>
-    </div>
-  <?php endif; ?>
-
-  <?php if ($pager): ?>
-    <?php print $pager; ?>
-  <?php endif; ?>
-
-  <?php if ($attachment_after): ?>
-    <div class="attachment attachment-after">
-      <?php print render($attachment_after); ?>
-    </div>
-  <?php endif; ?>
-
-  <?php if ($more): ?>
-    <?php print $more; ?>
-  <?php endif; ?>
-
-  <?php if ($footer): ?>
-    <div class="view-footer">
-      <?php print render($footer); ?>
-    </div>
-  <?php endif; ?>
-
-  <?php if ($feed_icon): ?>
-    <div class="feed-icon">
-      <?php print $feed_icon; ?>
-    </div>
-  <?php endif; ?>
-
-</div><?php /* class view */ ?>
diff --git a/core/modules/views/tests/views_test_data/templates/views-view--frontpage.html.twig b/core/modules/views/tests/views_test_data/templates/views-view--frontpage.html.twig
new file mode 100644
index 0000000..129ab8e
--- /dev/null
+++ b/core/modules/views/tests/views_test_data/templates/views-view--frontpage.html.twig
@@ -0,0 +1,83 @@
+{#
+/**
+ * @file
+ * Default theme implementation for main view template.
+ *
+ * Available variables:
+ * - attributes: Remaining HTML attributes for the element.
+ * - attributes.class: HTML classes that can be used to style contextually
+ *    through CSS. Which includes:
+ *    .view
+ *    .view-[css_name]
+ *    .view-id-[view_name]
+ *    .view-display-id-[display_name]
+ *    .view-dom-id-[dom_id]
+ * - css_name: A css-safe version of the view name.
+ * - css_class: The user-specified class names, if any.
+ * - header: The view header.
+ * - footer: The view footer.
+ * - rows: The results of the view query, if any.
+ * - empty_message: The empty text to display if the view is empty.
+ * - pager: The pager next/prev links to display, if any.
+ * - exposed: Exposed widget form/info to display.
+ * - feed_icon: Feed icon to display, if any.
+ * - more: A link to view more, if any.
+ *
+ * @ingroup views_templates
+ */
+#}
+<div{{ attributes }}>
+  {% if header is not empty %}
+    <div class="view-header">
+      {{ header }}
+    </div>
+  {% endif %}
+
+  {% if exposed %}
+    <div class="view-filters">
+      {{ exposed }}
+    </div>
+  {% endif %}
+
+  {% if attachment_before is not empty %}
+    <div class="attachment attachment-before">
+      {{ attachment_before }}
+    </div>
+  {% endif %}
+
+  {% if rows %}
+    <div class="view-content">
+      {{ rows }}
+    </div>
+  {% elseif empty_message is not empty  %}
+    <div class="view-empty">
+      {{ empty_message }}
+    </div>
+  {% endif %}
+
+  {% if pager %}
+    {{ pager }}
+  {% endif %}
+
+  {% if attachment_after is not empty %}
+    <div class="attachment attachment-after">
+      {{ attachment_after }}
+    </div>
+  {% endif %}
+
+  {% if more is not empty %}
+    {{ more }}
+  {% endif %}
+
+  {% if footer is not empty %}
+    <div class="view-footer">
+      {{ footer }}
+    </div>
+  {% endif %}
+
+  {% if feed_icon %}
+    <div class="feed-icon">
+      {{ feed_icon }}
+    </div>
+  {% endif %}
+</div>
diff --git a/core/modules/views/tests/views_test_data/templates/views-view--frontpage.tpl.php b/core/modules/views/tests/views_test_data/templates/views-view--frontpage.tpl.php
deleted file mode 100644
index 5e6c8fa..0000000
--- a/core/modules/views/tests/views_test_data/templates/views-view--frontpage.tpl.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-
-/**
- * @file
- * Main view template.
- *
- * Variables available:
- * - $attributes: An instance of Attributes class that can be manipulated as an
- *   array and printed as a string.
- *   It includes the 'class' information, which includes:
- *    .view
- *    .view-[css_name]
- *    .view-id-[view_name]
- *    .view-display-id-[display_name]
- *    .view-dom-id-[dom_id]
- * - $css_name: A css-safe version of the view name.
- * - $css_class: The user-specified classes names, if any
- * - $header: The view header
- * - $footer: The view footer
- * - $rows: The results of the view query, if any
- * - $empty: The empty text to display if the view is empty
- * - $pager: The pager next/prev links to display, if any
- * - $exposed: Exposed widget form/info to display
- * - $feed_icon: Feed icon to display, if any
- * - $more: A link to view more, if any
- *
- * @ingroup views_templates
- */
-?>
-<div <?php print $attributes; ?>>
-  <?php if ($header): ?>
-    <div class="view-header">
-      <?php print $header; ?>
-    </div>
-  <?php endif; ?>
-
-  <?php if ($exposed): ?>
-    <div class="view-filters">
-      <?php print $exposed; ?>
-    </div>
-  <?php endif; ?>
-
-  <?php if ($attachment_before): ?>
-    <div class="attachment attachment-before">
-      <?php print $attachment_before; ?>
-    </div>
-  <?php endif; ?>
-
-  <?php if ($rows): ?>
-    <div class="view-content">
-      <?php print $rows; ?>
-    </div>
-  <?php elseif ($empty): ?>
-    <div class="view-empty">
-      <?php print $empty; ?>
-    </div>
-  <?php endif; ?>
-
-  <?php if ($pager): ?>
-    <?php print $pager; ?>
-  <?php endif; ?>
-
-  <?php if ($attachment_after): ?>
-    <div class="attachment attachment-after">
-      <?php print $attachment_after; ?>
-    </div>
-  <?php endif; ?>
-
-  <?php if ($more): ?>
-    <?php print $more; ?>
-  <?php endif; ?>
-
-  <?php if ($footer): ?>
-    <div class="view-footer">
-      <?php print $footer; ?>
-    </div>
-  <?php endif; ?>
-
-  <?php if ($feed_icon): ?>
-    <div class="feed-icon">
-      <?php print $feed_icon; ?>
-    </div>
-  <?php endif; ?>
-
-</div> <?php /* class view */ ?>
diff --git a/core/modules/views/views.theme.inc b/core/modules/views/views.theme.inc
index 0bae0fc..6e06c33 100644
--- a/core/modules/views/views.theme.inc
+++ b/core/modules/views/views.theme.inc
@@ -42,67 +42,67 @@ function _views_theme_functions($hook, ViewExecutable $view, $display = NULL) {
 /**
  * Preprocess the primary theme implementation for a view.
  */
-function template_preprocess_views_view(&$vars) {
+function template_preprocess_views_view(&$variables) {
   global $base_path;
 
-  $view = $vars['view'];
+  $view = $variables['view'];
 
-  $vars['rows'] = (!empty($view->result) || $view->style_plugin->even_empty()) ? $view->style_plugin->render($view->result) : '';
+  $variables['rows'] = (!empty($view->result) || $view->style_plugin->even_empty()) ? $view->style_plugin->render($view->result) : array();
   // Force a render array so CSS/JS can be added.
-  if (!is_array($vars['rows'])) {
-    $vars['rows'] = array('#markup' => $vars['rows']);
+  if (!is_array($variables['rows'])) {
+    $variables['rows'] = array('#markup' => $variables['rows']);
   }
 
-  $vars['css_name'] = drupal_clean_css_identifier($view->storage->id());
-  $vars['id'] = $view->storage->id();
-  $vars['display_id'] = $view->current_display;
+  $variables['css_name'] = drupal_clean_css_identifier($view->storage->id());
+  $variables['id'] = $view->storage->id();
+  $variables['display_id'] = $view->current_display;
 
   // Basic classes
-  $vars['css_class'] = '';
+  $variables['css_class'] = '';
 
-  $vars['attributes']['class'] = array();
-  $vars['attributes']['class'][] = 'view';
-  $vars['attributes']['class'][] = 'view-' . drupal_clean_css_identifier($vars['id']);
-  $vars['attributes']['class'][] = 'view-id-' . $vars['id'];
-  $vars['attributes']['class'][] = 'view-display-id-' . $vars['display_id'];
+  $variables['attributes']['class'] = array();
+  $variables['attributes']['class'][] = 'view';
+  $variables['attributes']['class'][] = 'view-' . drupal_clean_css_identifier($variables['id']);
+  $variables['attributes']['class'][] = 'view-id-' . $variables['id'];
+  $variables['attributes']['class'][] = 'view-display-id-' . $variables['display_id'];
 
   $css_class = $view->display_handler->getOption('css_class');
   if (!empty($css_class)) {
-    $vars['css_class'] = preg_replace('/[^a-zA-Z0-9- ]/', '-', $css_class);
-    $vars['attributes']['class'][] = $vars['css_class'];
+    $variables['css_class'] = preg_replace('/[^a-zA-Z0-9- ]/', '-', $css_class);
+    $variables['attributes']['class'][] = $variables['css_class'];
   }
 
-  $empty = empty($view->result);
-  $vars['header'] = $view->display_handler->renderArea('header', $empty);
-  $vars['footer'] = $view->display_handler->renderArea('footer', $empty);
-  $vars['empty'] = $empty ? $view->display_handler->renderArea('empty', $empty) : FALSE;
+  $empty_message = empty($view->result);
+  $variables['header'] = $view->display_handler->renderArea('header', $empty_message);
+  $variables['footer'] = $view->display_handler->renderArea('footer', $empty_message);
+  $variables['empty_message'] = $empty_message ? $view->display_handler->renderArea('empty', $empty_message) : FALSE;
 
-  $vars['exposed']    = !empty($view->exposed_widgets) ? $view->exposed_widgets : '';
-  $vars['more']       = $view->display_handler->renderMoreLink();
-  $vars['feed_icon']  = !empty($view->feed_icon) ? $view->feed_icon : '';
+  $variables['exposed'] = !empty($view->exposed_widgets) ? $view->exposed_widgets : '';
+  $variables['more'] = $view->display_handler->renderMoreLink();
+  $variables['feed_icon'] = !empty($view->feed_icon) ? $view->feed_icon : '';
 
-  $vars['pager']      = '';
+  $variables['pager'] = '';
 
   // @todo: Figure out whether this belongs into views_ui_preprocess_views_view.
   // Render title for the admin preview.
-  $vars['title'] = !empty($view->views_ui_context) ? filter_xss_admin($view->getTitle()) : '';
+  $variables['title'] = !empty($view->views_ui_context) ? filter_xss_admin($view->getTitle()) : '';
 
   if ($view->display_handler->renderPager()) {
     $exposed_input = isset($view->exposed_raw_input) ? $view->exposed_raw_input : NULL;
-    $vars['pager'] = $view->renderPager($exposed_input);
+    $variables['pager'] = $view->renderPager($exposed_input);
   }
 
   if (!empty($view->attachment_before)) {
-    $vars['attachment_before'] = $view->attachment_before;
+    $variables['attachment_before'] = $view->attachment_before;
   }
   else {
-    $vars['attachment_before'] = array();
+    $variables['attachment_before'] = array();
   }
   if (!empty($view->attachment_after)) {
-    $vars['attachment_after'] = $view->attachment_after;
+    $variables['attachment_after'] = $view->attachment_after;
   }
   else {
-    $vars['attachment_after'] = array();
+    $variables['attachment_after'] = array();
   }
 
   // Add contextual links to the view. We need to attach them to the dummy
@@ -110,8 +110,8 @@ function template_preprocess_views_view(&$vars) {
   // attached to an array (not an object) in order to process them. For our
   // purposes, it doesn't matter what we attach them to, since once they are
   // processed by contextual_preprocess() they will appear in the $title_suffix
-  // variable (which we will then render in views-view.tpl.php).
-  views_add_contextual_links($vars['view_array'], 'view', $view, $view->current_display);
+  // variable (which we will then render in views-view.html.twig).
+  views_add_contextual_links($variables['view_array'], 'view', $view, $view->current_display);
 
   // Attachments are always updated with the outer view, never by themselves,
   // so they do not have dom ids.
@@ -125,8 +125,8 @@ function template_preprocess_views_view(&$vars) {
     // we set up a hash with the current time, $dom_id, to issue a "unique" identifier for
     // each view. This identifier is written to both Drupal.settings and the DIV
     // wrapper.
-    $vars['dom_id'] = $view->dom_id;
-    $vars['attributes']['class'][] = 'view-dom-id-' . $vars['dom_id'];
+    $variables['dom_id'] = $view->dom_id;
+    $variables['attributes']['class'][] = 'view-dom-id-' . $variables['dom_id'];
   }
 
   // If using AJAX, send identifying data about this view.
@@ -135,13 +135,13 @@ function template_preprocess_views_view(&$vars) {
       'views' => array(
         'ajax_path' => url('views/ajax'),
         'ajaxViews' => array(
-          'views_dom_id:' . $vars['dom_id'] => array(
+          'views_dom_id:' . $variables['dom_id'] => array(
             'view_name' => $view->storage->id(),
             'view_display_id' => $view->current_display,
             'view_args' => check_plain(implode('/', $view->args)),
             'view_path' => check_plain(current_path()),
             'view_base_path' => $view->getPath(),
-            'view_dom_id' => $vars['dom_id'],
+            'view_dom_id' => $variables['dom_id'],
             // To fit multiple views on a page, the programmer may have
             // overridden the display's pager_element.
             'pager_element' => isset($view->pager) ? $view->pager->get_pager_id() : 0,
@@ -156,21 +156,21 @@ function template_preprocess_views_view(&$vars) {
   // If form fields were found in the View, reformat the View output as a form.
   if (views_view_has_form_elements($view)) {
     // Copy the rows so as not to modify them by reference when rendering.
-    $rows = $vars['rows'];
+    $rows = $variables['rows'];
     $rows = drupal_render($rows);
-    $output = !empty($rows) ? $rows : $vars['empty'];
+    $output = !empty($rows) ? $rows : $variables['empty_message'];
     $form = drupal_get_form(views_form_id($view), $view, $output);
     // The form is requesting that all non-essential views elements be hidden,
     // usually because the rendered step is not a view result.
     if ($form['show_view_elements']['#value'] == FALSE) {
-      $vars['header'] = '';
-      $vars['exposed'] = '';
-      $vars['pager'] = '';
-      $vars['footer'] = '';
-      $vars['more'] = '';
-      $vars['feed_icon'] = '';
+      $variables['header'] = '';
+      $variables['exposed'] = '';
+      $variables['pager'] = '';
+      $variables['footer'] = '';
+      $variables['more'] = '';
+      $variables['feed_icon'] = '';
     }
-    $vars['rows'] = $form;
+    $variables['rows'] = $form;
   }
 }
 
@@ -1104,7 +1104,7 @@ function theme_views_mini_pager($vars) {
  * or some combination thereof.
  *
  * For each view, there will be a minimum of two templates used. The first
- * is used for all views: views-view.tpl.php.
+ * is used for all views: views-view.html.twig.
  *
  * The second template is determined by the style selected for the view. Note
  * that certain aspects of the view can also change which style is used; for
@@ -1124,7 +1124,7 @@ function theme_views_mini_pager($vars) {
  * - views-view--foobar--page.tpl.php
  * - views-view--page.tpl.php
  * - views-view--foobar.tpl.php
- * - views-view.tpl.php
+ * - views-view.html.twig
  *
  * - views-view-unformatted--foobar--page.tpl.php
  * - views-view-unformatted--page.tpl.php
diff --git a/core/modules/views/views_ui/views_ui.module b/core/modules/views/views_ui/views_ui.module
index 8434656..4e4bbe6 100644
--- a/core/modules/views/views_ui/views_ui.module
+++ b/core/modules/views/views_ui/views_ui.module
@@ -242,23 +242,23 @@ function views_ui_cache_set(ViewUI $view) {
 }
 
 /**
- * Theme preprocess for views-view.tpl.php.
+ * Theme preprocess for views-view.html.twig.
  */
-function views_ui_preprocess_views_view(&$vars) {
-  $view = $vars['view'];
+function views_ui_preprocess_views_view(&$variables) {
+  $view = $variables['view'];
   if (!empty($view->live_preview) && Drupal::moduleHandler()->moduleExists('contextual')) {
     $view->hide_admin_links = TRUE;
     foreach (array('title', 'header', 'exposed', 'rows', 'pager', 'more', 'footer', 'empty', 'attachment_after', 'attachment_before') as $section) {
-      if (!empty($vars[$section])) {
-        $vars[$section] = array(
+      if (!empty($variables[$section])) {
+        $variables[$section] = array(
           '#theme' => 'views_ui_view_preview_section',
           '#view' => $view,
           '#section' => $section,
-          '#content' => is_array($vars[$section]) ? drupal_render($vars[$section]) : $vars[$section],
+          '#content' => $variables[$section],
           '#theme_wrappers' => array('views_ui_container'),
           '#attributes' => array('class' => 'contextual-region'),
         );
-        $vars[$section] = drupal_render($vars[$section]);
+        $variables[$section] = $variables[$section];
       }
     }
   }
