diff --git a/views_secondary_row.theme.inc b/views_secondary_row.theme.inc
index 7727df5..e7256dd 100644
--- a/views_secondary_row.theme.inc
+++ b/views_secondary_row.theme.inc
@@ -31,7 +31,6 @@ use Drupal\Core\Url;
  * Version history: Aligned with Views 7.x-3.6, not changed in 3.13
  */
 function template_preprocess_views_secondary_row_view_table(&$variables) {
-  dpm(__FUNCTION__);
   $view = $variables['view'];
 
   // We need the raw data for this grouping, which is passed in
@@ -56,6 +55,22 @@ function template_preprocess_views_secondary_row_view_table(&$variables) {
   // A boolean variable which stores whether the table has a responsive class.
   $responsive = FALSE;
 
+  // Check if secondary rows are specified. If not, just call the default 'table' preprocessing.
+  $has_secondary_row = FALSE;
+  foreach ($columns as $field => $column) {
+    if (!empty($options['info'][$field]['break2'])) {
+      $has_secondary_row = TRUE;
+    }
+  }
+  if (!$has_secondary_row) {
+    template_preprocess_views_view_table($variables);
+    return;
+  }
+  else {
+    $default_row_class = isset($options['default_row_class']) ? $options['default_row_class'] : TRUE;
+    $special_row_class = isset($options['special_row_class']) ? $options['special_row_class'] : TRUE;
+  }
+
   $query = tablesort_get_query_parameters();
   if (isset($view->exposed_raw_input)) {
     $query += $view->exposed_raw_input;
@@ -72,7 +87,9 @@ function template_preprocess_views_secondary_row_view_table(&$variables) {
     }
 
     // Render the header labels.
-    if ($field == $column && empty($fields[$field]->options['exclude'])) {
+    // Skip the header labels that are broken into the secondary row.
+    if ($field == $column && empty($fields[$field]->options['exclude']) && empty($options['info'][$field]['break2'])) {
+
       $label = !empty($fields[$field]) ? $fields[$field]->label() : '';
       if (empty($options['info'][$field]['sortable']) || !$fields[$field]->clickSortable()) {
         $variables['header'][$field]['content'] = $label;
@@ -152,6 +169,21 @@ function template_preprocess_views_secondary_row_view_table(&$variables) {
         continue;
       }
 
+      // Make all rows even rows, so that there's an empty odd/secondary row between them,
+      // where the "secondary row" fields can be placed.
+      $primary_row_num = $num * 2;
+      $secondary_row_num = $primary_row_num + 1;
+      $old_num = $num;
+      if (!empty($options['info'][$field]['break2'])) {
+        $num = $secondary_row_num;
+//        $target_column = $options['info'][$field]['break2'];
+        $column = $options['info'][$field]['break2'];
+      }
+      else {
+        $num = $primary_row_num;
+//        $target_column = $column;
+      }
+
       // Reference to the column in the loop to make the code easier to read.
       $column_reference =& $variables['rows'][$num]['columns'][$column];
 
@@ -166,6 +198,27 @@ function template_preprocess_views_secondary_row_view_table(&$variables) {
         $column_reference['attributes'] = array();
       }
 
+      // Add field classes.
+      // Respect primary/secondary rows.
+//      $variables['field_classes'][$column][$num] = '';
+//
+//      if ($fields[$field]->options['element_default_classes']) {
+//        $variables['field_classes'][$column][$num] = "views-field views-field-" . $variables['fields'][$field];
+//      }
+//      if ($classes = $fields[$field]->element_classes($num)) {
+//        if ($variables['field_classes'][$column][$num]) {
+//          $variables['field_classes'][$column][$num] .= ' ';
+//        }
+//
+//        $variables['field_classes'][$column][$num] .= $classes;
+//      }
+//      $variables['field_attributes'][$column][$num] = array();
+
+      // Add colspan to secondary row.
+      if ($num == $secondary_row_num && !empty($options['info'][$field]['colspan2'])) {
+        $column_reference['attributes']['colspan'][] = $options['info'][$field]['colspan2'];
+      }
+
       if ($classes = $fields[$field]->elementClasses($num)) {
         $column_reference['attributes']['class'][] = $classes;
       }
@@ -181,16 +234,33 @@ function template_preprocess_views_secondary_row_view_table(&$variables) {
       }
 
       if (!empty($fields[$field])) {
-        $field_output = $handler->getField($num, $field);
+        // Modification for secondary row.
+//      if (!empty($fields[$field]) ) { // } && empty($fields[$field]->options['exclude'])) {
+//        $field_output = $handler->getField($num, $field);
+        $field_output = $handler->getField($old_num, $field);
         $column_reference['wrapper_element'] = $fields[$field]->elementType(TRUE, TRUE);
         if (!isset($column_reference['content'])) {
           $column_reference['content'] = [];
         }
 
+        // Residue of D7 secondary row.
+//        $field_output = $renders[$old_num][$field];
+//        $element_type = $fields[$field]->element_type(TRUE, TRUE);
+//        if ($element_type) {
+//          $field_output = '<' . $element_type . '>' . $field_output . '</' . $element_type . '>';
+//        }
+
         // Only bother with separators and stuff if the field shows up.
         // Place the field into the column, along with an optional separator.
         if (trim($field_output) != '') {
-          if (!empty($column_reference['content']) && !empty($options['info'][$column]['separator'])) {
+          // Todo D8-port: test separators in first and secondary row.
+          if ($num == $secondary_row_num && !empty($options['info'][$column]['separator2'])) {
+            $column_reference['content'][] = [
+              'separator' => ['#markup' => $options['info'][$column]['separator2']],
+              'field_output' => ['#markup' => $field_output]
+            ];
+          }
+          elseif (!empty($column_reference['content']) && !empty($options['info'][$column]['separator'])) {
             $column_reference['content'][] = [
               'separator' => ['#markup' => $options['info'][$column]['separator']],
               'field_output' => ['#markup' => $field_output]
@@ -202,6 +272,24 @@ function template_preprocess_views_secondary_row_view_table(&$variables) {
             ];
           }
         }
+/*
+        // @todo test D8-port
+        if (!empty($variables['rows'][$num][$column])) {
+          if($num == $secondary_row_num) {
+            if (!empty($options['info'][$column]['separator2'])) {
+              $variables['rows'][$num][$column] .= \Drupal\Component\Utility\Xss::filterAdmin($options['info'][$column]['separator2']);
+            }
+          }
+          else
+            if (!empty($options['info'][$column]['separator'])) {
+              $variables['rows'][$num][$column] .= \Drupal\Component\Utility\Xss::filterAdmin($options['info'][$column]['separator']);
+            }
+        }
+        else {
+          $variables['rows'][$num][$column] = '';
+        }
+*/
+        $variables['rows'][$num][$column] .= $field_output;
       }
       $column_reference['attributes'] = new Attribute($column_reference['attributes']);
     }
@@ -222,17 +310,52 @@ function template_preprocess_views_secondary_row_view_table(&$variables) {
     }
   }
 
+  // Reorder rows, since we appended the odd/secondary rows at the end of the list.
+  ksort($variables['rows']);
+  // Reorder columns, since fields may be in different order as target columns.
+  foreach ($variables['rows'] as $num => $row) {
+    if ($num % 2 == 0) {
+      continue;
+    }
+    $ordered = array();
+    /* // @todo D8-port
+        foreach ($columns as $field => $column) {
+          if (isset($row[$column])) {
+            $ordered[$column] = $row[$column];
+          }
+        }
+        $variables['rows'][$num] = $ordered;
+    */
+  }
+
   // Hide table header if all labels are empty.
   if (!$has_header_labels) {
     $variables['header'] = array();
   }
 
+  $count = 0;
   foreach ($variables['rows'] as $num => $row) {
     $variables['rows'][$num]['attributes'] = array();
     if ($row_class = $handler->getRowClass($num)) {
       $variables['rows'][$num]['attributes']['class'][] = $row_class;
     }
     $variables['rows'][$num]['attributes'] = new Attribute($variables['rows'][$num]['attributes']);
+    /* // @todo test D8-port
+        $variables['row_classes'][$num] = array();
+        if ($special_row_class) {
+          // Views secondary row: give both lines the same class.
+          //$variables['row_classes'][$num][] = ($count++ % 2 == 0) ? 'odd' : 'even';
+          $variables['row_classes'][$num][] = (($count++ / 2) % 2 == 0) ? 'odd' : 'even';
+        }
+        if ($row_class = $handler->get_row_class($num)) {
+          $variables['row_classes'][$num][] = $row_class;
+        }
+      }
+
+      if ($special_row_class) {
+        $variables['row_classes'][0][] = 'views-row-first';
+        $variables['row_classes'][count($variables['row_classes']) - 1][] = 'views-row-last';
+    */
   }
 
   if (empty($variables['rows']) && !empty($options['empty_table'])) {
@@ -345,11 +468,11 @@ function template_preprocess_views_secondary_row_style_plugin_table(&$variables)
     $row[]['data'] = $form['columns'][$id];
     $row[]['data'] = $form['info'][$id]['align'];
     $row[]['data'] = $form['info'][$id]['separator'];
-    // Begin insert views_secondary_row
-    $row[]['data'] = $form['info'][$id]['break'];
+    // Begin insert views_secondary_row.
+    $row[]['data'] = $form['info'][$id]['break2'];
     $row[]['data'] = $form['info'][$id]['separator2'];
-    $row[]['data'] = $form['info'][$id]['colspan'];
-    // End insert views_secondary_row
+    $row[]['data'] = $form['info'][$id]['colspan2'];
+    // End insert views_secondary_row.
 
     if (!empty($form['info'][$id]['sortable'])) {
       $row[] = array(
