diff --git a/core/modules/views/src/Plugin/views/style/Table.php b/core/modules/views/src/Plugin/views/style/Table.php
index c49f6e9..4d34042 100644
--- a/core/modules/views/src/Plugin/views/style/Table.php
+++ b/core/modules/views/src/Plugin/views/style/Table.php
@@ -68,6 +68,7 @@ protected function defineOptions() {
     $options['columns'] = array('default' => array());
     $options['default'] = array('default' => '');
     $options['info'] = array('default' => array());
+    $options['row_header'] = array('default' => '');
     $options['override'] = array('default' => TRUE);
     $options['sticky'] = array('default' => FALSE);
     $options['order'] = array('default' => 'asc');
@@ -273,6 +274,16 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
       $default = -1;
     }
 
+    if (isset($this->options['row_header'])) {
+      $row_header = $this->options['row_header'];
+      if (!isset($columns[$row_header])) {
+        $row_header = -1;
+      }
+    }
+    else {
+      $row_header = -1;
+    }
+
     foreach ($columns as $field => $column) {
       $column_selector = ':input[name="style_options[columns][' . $field . ']"]';
 
@@ -327,6 +338,23 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
           ),
         );
       }
+      $row_header_id = Html::getUniqueId('edit-row-header-' . $field);
+      $form['row_header'][$field] = array(
+        '#title' => $this->t('Row header for @field', array('@field' => $field)),
+        '#title_display' => 'invisible',
+        '#type' => 'radio',
+        '#return_value' => $field,
+        '#parents' => array('style_options', 'row_header'),
+        '#id' => $row_header_id,
+        // because 'radio' doesn't fully support '#id' =(
+        '#attributes' => array('id' => $row_header_id),
+        '#default_value' => $row_header,
+        '#states' => array(
+          'visible' => array(
+          $column_selector => array('value' => $field),
+          ),
+        ),
+      );
       $form['info'][$field]['align'] = array(
         '#title' => $this->t('Alignment for @field', array('@field' => $field)),
         '#title_display' => 'invisible',
@@ -397,6 +425,17 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
       '#default_value' => $default,
     );
 
+    // Provide a radio for no row header
+    $form['row_header'][-1] = array(
+      '#title' => $this->t('No row header'),
+      '#title_display' => 'invisible',
+      '#type' => 'radio',
+      '#return_value' => -1,
+      '#parents' => array('style_options', 'row_header'),
+      '#id' => 'edit-row_header-0',
+      '#default_value' => $row_header,
+    );
+
     $form['empty_table'] = array(
       '#type' => 'checkbox',
       '#title' => $this->t('Show the empty text in the table'),
diff --git a/core/modules/views/templates/views-view-table.html.twig b/core/modules/views/templates/views-view-table.html.twig
index 0c0b445..e2e9e89 100644
--- a/core/modules/views/templates/views-view-table.html.twig
+++ b/core/modules/views/templates/views-view-table.html.twig
@@ -26,6 +26,7 @@
  *     used.
  * - responsive: A flag indicating whether table is responsive.
  * - sticky: A flag indicating whether table header is sticky.
+ * - row_header: The field that should be marked up as a table header on each row.
  *
  * @see template_preprocess_views_view_table()
  *
@@ -71,7 +72,7 @@
               ]
             %}
           {% endif %}
-          <th{{ column.attributes.addClass(column_classes).setAttribute('scope', 'col') }}>
+          <th {{ column.attributes.addClass(column_classes).setAttribute('scope', 'col') }}>
             {%- if column.wrapper_element -%}
               <{{ column.wrapper_element }}>
                 {%- if column.url -%}
@@ -94,7 +95,7 @@
   {% endif %}
   <tbody>
     {% for row in rows %}
-      <tr{{ row.attributes }}>
+      <tr {{ row.attributes }}>
         {% for key, column in row.columns %}
           {% if column.default_classes %}
             {%
@@ -106,7 +107,11 @@
               {% set column_classes = column_classes|merge(['views-field-' ~ field]) %}
             {% endfor %}
           {% endif %}
-          <td{{ column.attributes.addClass(column_classes) }}>
+          {% if (key) == (row_header) %}
+            <th scope="row" {{ column.attributes.addClass(column_classes) }}>
+          {% else %}
+            <td {{ column.attributes.addClass(column_classes) }}>
+          {% endif %}
             {%- if column.wrapper_element -%}
               <{{ column.wrapper_element }}>
               {% for content in column.content %}
@@ -118,7 +123,11 @@
                 {{- content.separator }}{{ content.field_output -}}
               {% endfor %}
             {%- endif %}
-          </td>
+          {% if (key) == (row_header) %}
+            </th>
+          {% else %}
+            </td>
+          {% endif %}
         {% endfor %}
       </tr>
     {% endfor %}
diff --git a/core/modules/views/views.theme.inc b/core/modules/views/views.theme.inc
index 94c519e..0048bc0 100644
--- a/core/modules/views/views.theme.inc
+++ b/core/modules/views/views.theme.inc
@@ -660,6 +660,8 @@ function template_preprocess_views_view_table(&$variables) {
     // This is needed to target tables constructed by this function.
     $variables['responsive'] = TRUE;
   }
+
+  $variables['row_header'] = $handler->options['row_header'];
 }
 
 /**
diff --git a/core/modules/views_ui/views_ui.theme.inc b/core/modules/views_ui/views_ui.theme.inc
index 926f82a..16ab083 100644
--- a/core/modules/views_ui/views_ui.theme.inc
+++ b/core/modules/views_ui/views_ui.theme.inc
@@ -400,6 +400,10 @@ function template_preprocess_views_ui_style_plugin_table(&$variables) {
   $header = array(
     t('Field'),
     t('Column'),
+    array(
+      'data' => t('Row Header'),
+      'align' => 'center',
+    ),
     t('Align'),
     t('Separator'),
     array(
@@ -428,6 +432,7 @@ function template_preprocess_views_ui_style_plugin_table(&$variables) {
     $row = array();
     $row[]['data'] = $form['info'][$id]['name'];
     $row[]['data'] = $form['columns'][$id];
+    $row[]['data'] = $form['row_header'][$id];
     $row[]['data'] = $form['info'][$id]['align'];
     $row[]['data'] = $form['info'][$id]['separator'];
 
@@ -462,13 +467,14 @@ function template_preprocess_views_ui_style_plugin_table(&$variables) {
   }
 
   // Add the special 'None' row.
-  $rows[] = array(array('data' => t('None'), 'colspan' => 6), array('align' => 'center', 'data' => $form['default'][-1]), array('colspan' => 2));
+  $rows[] = array(array('data' => t('None'), 'colspan' => 2), array('align' => 'center', 'data' => $form['row_header'][-1]), array('colspan' => 4), array('align' => 'center', 'data' => $form['default'][-1]), array('colspan' => 2));
 
   // Unset elements from the form array that are used to build the table so that
   // they are not rendered twice.
   unset($form['default']);
   unset($form['info']);
   unset($form['columns']);
+  unset($form['row_header']);
 
   $variables['table'] = array(
     '#type' => 'table',
diff --git a/core/themes/classy/templates/views/views-view-table.html.twig b/core/themes/classy/templates/views/views-view-table.html.twig
index 8eccec0..f1fe1d5 100644
--- a/core/themes/classy/templates/views/views-view-table.html.twig
+++ b/core/themes/classy/templates/views/views-view-table.html.twig
@@ -26,6 +26,7 @@
  *     used.
  * - responsive: A flag indicating whether table is responsive.
  * - sticky: A flag indicating whether table header is sticky.
+ * - row_header: The field that should be marked up as a table header on each row.
  *
  * @see template_preprocess_views_view_table()
  */
@@ -106,7 +107,11 @@
               {% set column_classes = column_classes|merge(['views-field-' ~ field]) %}
             {% endfor %}
           {% endif %}
-          <td{{ column.attributes.addClass(column_classes) }}>
+          {% if (key) == (row_header) %}
+            <th scope="row" {{ column.attributes.addClass(column_classes) }}>
+          {% else %}
+            <td {{ column.attributes.addClass(column_classes) }}>
+          {% endif %}
             {%- if column.wrapper_element -%}
               <{{ column.wrapper_element }}>
               {% for content in column.content %}
@@ -118,7 +123,11 @@
                 {{- content.separator }}{{ content.field_output -}}
               {% endfor %}
             {%- endif %}
-          </td>
+          {% if (key) == (row_header) %}
+            </th>
+          {% else %}
+            </td>
+          {% endif %}
         {% endfor %}
       </tr>
     {% endfor %}
