diff --git a/webform_view.inc b/webform_view.inc
index df79f64..ef720f1 100644
--- a/webform_view.inc
+++ b/webform_view.inc
@@ -301,38 +301,6 @@ function _webform_render_view($component, $value_serialized = NULL, $filter = TR
 }
 
 /**
- * Deal with what happens when one of our custom components is submitted.
- *
- * Implements _webform_submit_component().
- */
-function _webform_submit_view($component, $value) {
-  // $value is an array, should contain indexed clusters of information
-  // one for each row.
-  // eg array(
-  // 51 => array('item' => 'the node title', 'quantity' => 2)
-  // )
-
-  // Can clear out blank values here.
-  // eg 'quantity';
-  $required_key = $component['extra']['filter_field_id'];
-  // If this key is set, then rows without it are skipped.
-  $return = array();
-  foreach ($value as $key => $row) {
-    if (is_array($row)) {
-      if (($required_key == '<none>') || !empty($row[$required_key])) {
-        $return[$key] = $row;
-      }
-    }
-  }
-
-  // Webform internals just can't deal with nested arrays, so at this point we
-  // have to hide our data in serialized form. Dull, but the only way to be
-  // safe it seems.
-
-  return serialize($return);
-}
-
-/**
  * Declare rendering routines for our element.
  *
  * Called by webform to register theme functions that the individual
@@ -358,86 +326,19 @@ function _webform_theme_view() {
 }
 
 /**
- * Return the result of a component value for display in a table.
- *
- * Implements _webform_table_COMPONENTNAME()
- */
-function _webform_table_view($component, $raw_value) {
-  if (!empty($raw_value)) {
-    $structured_value = unserialize(reset($raw_value));
-    // Set the value as a single string.
-    // As this may be highly structured, abuse CSV delimiters and cram it all
-    // together.
-    return struct_to_plaintext($structured_value);
-  }
-  else {
-    return '';
-  }
-}
-
-/**
- * Return the header for this component to be displayed in a CSV file.
- *
- * Implements _webform_csv_headers_COMPONENT()
- *
- * @see _webform_csv_headers_component()
- */
-function _webform_csv_headers_view($component, $export_options) {
-  $header = array();
-  $header[0] = '';
-  $header[1] = '';
-  $header[2] = $component['name'];
-  return $header;
-}
-
-/**
- * Format the submitted data of a component for CSV downloading.
- *
- * In theory, this could be used to change the number of columns in the
- * output and re-split my fields, but nah.
- *
- * Implements _webform_csv_data_COMPONENT()
- *
- * @see _webform_csv_data_component()
- */
-function _webform_csv_data_view($component, $export_options, $raw_value) {
-  $return = array();
-  if (!empty($raw_value)) {
-    $structured_value = unserialize(reset($raw_value));
-    $return[] = struct_to_plaintext($structured_value);
-  }
-  return $return;
-}
-
-/**
  * Implements _webform_display_component().
  *
  * The $value available here has been flattened and serialized
  * - unpack it before use.
  */
-function _webform_display_view($component, $value_serialized, $format = 'html', $sid = NULL) {
+function _webform_display_view($component, $value_serialized, $format = 'html', $submission = array()) {
   $value = array();
-  if ($sid !== NULL) {
-    // Looking at an already submitted form,
-    // we need to get some more data from the database.
-    $node = node_load($component['nid']);
-    $sub = webform_get_submission($component['nid'], $sid);
-    foreach ($sub->data as $key => $val) {
-      // Only add non-component data.
-      if (!in_array($key, array_keys($node->webform['components']))) {
-        $item = node_load($key);
-
-        foreach ($val as $k => $v) {
-          $val[$k] = token_replace($v, array('node' => $item));
-        }
-        $value[] = $val;
-      }
-    }
-  }
-  else {
-    foreach ($component['children'] as $key => $val) {
-      if (!isset($val['nid'])) {
-        $value[] = unserialize($val['value']);
+  if (!empty($submission)) {
+    foreach ($component['children'] as $cid => $field) {
+      if ($field['type'] == 'hidden') {
+        // Data is stored in the first hidden field
+        $value = unserialize($submission->data[$cid][0]);
+        break;
       }
     }
   }
@@ -511,7 +412,12 @@ function theme_webform_display_view($variables) {
   // Theme the order like a table.
   if ($element['#format'] == 'html') {
     $first_row = reset($element['#value']);
-    $header = $first_row ? array_keys($first_row) : array();
+    $header = array();
+    if ($first_row) {
+      foreach ($first_row as $key => $val) {
+        $header[] = t($element[$key]['#title']);
+      }
+    }
     return theme('table', array('header' => $header, 'rows' => $element['#value']));
   }
   // Plaintext equivalent.
@@ -551,34 +457,3 @@ function array_to_plaintext_table($rows) {
   }
   return implode("\n", $lines);
 }
-
-/**
- * Another way to flatten data readabley.
- *
- * @param array $structured_value
- *   Probably an array.
- *
- * @return string
- *   Slightly formatted version of the input.
- */
-function struct_to_plaintext($structured_value) {
-  $output = '';
-  if (is_array($structured_value)) {
-    foreach ($structured_value as $row_id => $row) {
-      if (!empty($row)) {
-        // Need to flatten arrays maybe.
-        foreach ($row as $field => $val) {
-          if (is_array($val)) {
-            $row[$field] = '(' . implode('|', $val) . ')';
-          }
-        }
-        $output .= check_plain(implode(', ', $row)) . '; ';
-      }
-    }
-  }
-  else {
-    // Should not get here?
-    $output = check_plain(print_r($structured_value, 1));
-  }
-  return $output;
-}
diff --git a/webform_view.info b/webform_view.info
index 23ca324..94b11d6 100644
--- a/webform_view.info
+++ b/webform_view.info
@@ -1,8 +1,8 @@
 name = Webform View
 description = Allow webform submissions to have views embedded
 core = 7.x
-dependencies[] = webform
-dependencies[] = views
+dependencies[] = webform (>=7.x-4.10)
+dependencies[] = views (7.x-3.x)
 
 package = "Webform"
 
diff --git a/webform_view.module b/webform_view.module
index 46ce665..7c0c82f 100644
--- a/webform_view.module
+++ b/webform_view.module
@@ -97,9 +97,13 @@ function webform_view_form_webform_client_form_alter(&$form, $form_state, $form_
     if ($component['type'] == 'view') {
       // Current component is a webform_view.
       $form_key = $component['form_key'];
-      $items = array();
+      $val = array();
       $first_field = NULL;
 
+      // Can clear out blank values here.
+      // eg 'quantity';
+      $required_key = $component['extra']['filter_field_id'];
+
       $inputs = $form_state['input']['submitted'];
       if (is_array($inputs[$form_key])) {
         foreach ($inputs[$form_key] as $nid => $values) {
@@ -107,38 +111,32 @@ function webform_view_form_webform_client_form_alter(&$form, $form_state, $form_
             // Iterate each node in the view.
             $node = node_load($nid);
 
-            $val = array();
             // Flatten the embedded view values.
             if (is_array($component['children'])) {
               foreach ($component['children'] as $key => $field) {
                 // If value was submitted, use it, else use default.
                 $v = (isset($values[$field['form_key']])) ? $values[$field['form_key']] : $field['value'];
+                $val[$nid][$field['form_key']] = token_replace($v, array('node' => $node));
 
-                $val[$field['form_key']] = token_replace($v, array('node' => $node));
-
-                if ($first_field === NULL) {
-                  // Discover which was the first field defined.
+                // Discover which was the first hidden field defined.
+                if (($first_field === NULL) && ($field['type'] == 'hidden')) {
                   $first_field = $field['form_key'];
                 }
               }
             }
-            // This data structure enables the proper display
-            // of the embedded view inputs on preview
-            // and also stores the data in the webform_submitted_data table.
-            $form['#node']->webform['components'][$nid] = array(
-              'cid' => $nid,
-              'pid' => $component['cid'],
-              'form_key' => $nid,
-              'value' => serialize($val),
-            );
-
-            $items[] = implode(', ', $val);
           }
         }
       }
-      // This stores a nice, text version to show in table view or CSV export.
+      // This stores the submitted data in serialized format in the first
+      // hidden field.
       if ($first_field !== NULL) {
-        $form['submitted'][$form_key][$first_field]['#value'] = implode("\n", $items);
+        // If required key is set, then rows without it are skipped.
+        foreach ($val as $nid => $v) {
+          if (($required_key != '<none>')  && empty($v[$required_key])) {
+            unset($val[$nid]);
+          }
+        }
+        $form['submitted'][$form_key][$first_field]['#value'] = serialize($val);
       }
     }
   }
@@ -204,14 +202,44 @@ function webform_view_field_formatter_view($entity_type, $entity, $field, $insta
 }
 
 /**
- * Respond to the loading of Webform submissions.
- *
- * Unpack our data so it can be retrieved and displayed in reports.
- *
- * @param array $submissions
- *   An array of Webform submissions that are being loaded, keyed by the
- *   submission ID. Modifications to the submissions are done by reference.
+ * Implements hook_webform_csv_header_alter().
+ */
+function webform_view_webform_csv_header_alter(&$header, $component) {
+  $node = node_load($component['nid']);
+  if ($component['type'] == 'view') {
+    // This component is a webform_view, use name as header
+    $header[2] = t($component['name']);
+  } else {
+    // Current component parent is a webform_view, hide headers
+    if ($node->webform['components'][$component['pid']]['type'] == 'view') {
+      $header[2] = NULL;
+    }
+  }
+}
+
+/**
+ * Implements hook_webform_csv_data_alter().
  */
-function webform_view_webform_submission_load(&$submissions) {
-  // Unused - this is too high-level
+function webform_view_webform_csv_data_alter(&$data, $component, $submission) {
+  $node = node_load($component['nid']);
+  if ($component['type'] == 'view') {
+    // This component is a webform_view
+    foreach ($node->webform['components'] as $cid => $comp) {
+      // Get the data from the first hidden field that is a child of this one
+      // and display each field separated with colon, and each item with a bar
+      if (($comp['pid'] == $component['cid']) && ($comp['type'] == 'hidden')) {
+        $values = array();
+        foreach (unserialize($submission->data[$cid][0]) as $val) {
+          $values[] = implode(':', $val);
+        }
+        $data = implode('|', $values);
+        break;
+      }
+    }
+  } else {
+    // Current component parent is a webform_view, hide any data
+    if ($node->webform['components'][$component['pid']]['type'] == 'view') {
+      $data = NULL;
+    }
+  }
 }
