diff --git a/tablefield.module b/tablefield.module
index 88a74b6..fd2b942 100644
--- a/tablefield.module
+++ b/tablefield.module
@@ -1,4 +1,5 @@
 <?php
+
 /**
  * @file
  * Provides a set of fields that can be used to store tabular data with a node.
@@ -344,7 +345,25 @@ function tablefield_field_is_empty($item, $field) {
 function tablefield_field_formatter_info() {
   return array(
     'tablefield_default' => array(
-      'label' => t('Tabular View'),
+      'label' => t('Tabular view'),
+      'field types' => array('tablefield'),
+      'settings' => array(
+        'trim_trailing_rows' => FALSE,
+        'trim_trailing_cols' => FALSE,
+        'hide_cols_skip_head' => FALSE,
+      ),
+    ),
+    'format_raw' => array(
+      'label' => t('Raw data (JSON)'),
+      'field types' => array('tablefield'),
+      'settings' => array(
+        'trim_trailing_rows' => FALSE,
+        'trim_trailing_cols' => FALSE,
+        'hide_cols_skip_head' => FALSE,
+      ),
+    ),
+    'format_raw_header_keys' => array(
+      'label' => t('Raw data (JSON) with header values as keys (if not empty)'),
       'field types' => array('tablefield'),
       'settings' => array(
         'trim_trailing_rows' => FALSE,
@@ -406,101 +425,162 @@ function tablefield_field_formatter_settings_form($field, $instance, $view_mode,
 function tablefield_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
   $element = array();
   $settings = $display['settings'];
-  $formatter = $display['type'];
-
   foreach ($items as $delta => $table) {
-    // Check for table caption.
-    $raw = unserialize($table['value']);
-    $caption = isset($raw['caption']) ? check_plain($raw['caption']) : '';
-
-    // Rationalize the stored data.
-    if (!empty($table['tablefield'])) {
-      $tabledata = $table['tablefield'];
-    }
-    elseif (!empty($table['value'])) {
-      $tabledata = unserialize($table['value']);
-    }
+    switch ($display['type']) {
+      case 'format_raw':
+        $value = unserialize($table['value']);
+        // Remove unneeded data.
+        unset($value['rebuild']);
+        unset($value['import']);
+        unset($value['paste']);
+        foreach ($value['tabledata'] as $key => $row) {
+          unset($row['weight']);
+          $value['tabledata'][$key] = $row;
+        }
+        // Assign the markup showing pretty print on node pages.
+        if (menu_get_object()) {
+          $element[$delta] = array(
+            '#markup' => '<pre>' . str_replace(array("\r", "\n", "\t"), "<br />", json_encode($value, JSON_PRETTY_PRINT)) . '</pre>',
+          );
+        }
+        // And raw on other pages.
+        else {
+          $element[$delta] = array(
+            '#markup' => drupal_json_encode($value),
+          );
+        }
+        break;
+
+      case 'format_raw_header_keys':
+        $value = unserialize($table['value']);
+        // Remove unneeded data.
+        unset($value['rebuild']);
+        unset($value['import']);
+        unset($value['paste']);
+        // Keep first row values (header) to use for array keys later.
+        $keys = $value['tabledata']['row_0'];
+        // If a header value is empty use the column key (col_#).
+        foreach ($keys as $key => $content) {
+          if (empty($content)) {
+            $keys[$key] = $key;
+          }
+        }
+        unset($keys['weight']);
+        // Remove the first row (header).
+        unset($value['tabledata']['row_0']);
+        foreach ($value['tabledata'] as $key => $row) {
+          unset($row['weight']);
+          $row = array_combine($keys, $row);
+          $value['tabledata'][$key] = $row;
+        }
+        // Assign the markup showing pretty print on node pages.
+        if (menu_get_object()) {
+          $element[$delta] = array(
+            '#markup' => '<pre>' . str_replace(array("\r", "\n", "\t"), "<br />", json_encode($value, JSON_PRETTY_PRINT)) . '</pre>',
+          );
+        }
+        // And raw on other pages.
+        else {
+          $element[$delta] = array(
+            '#markup' => drupal_json_encode($value),
+          );
+        }
+        break;
 
-    // Run the table through input filters.
-    if (isset($tabledata['tabledata'])) {
-      if (!empty($tabledata['tabledata'])) {
+      default:
+        // Check for table caption.
+        $raw = unserialize($table['value']);
+        $caption = isset($raw['caption']) ? check_plain($raw['caption']) : '';
 
-        if (!empty($settings['trim_trailing_rows'])) {
-          $tabledata['tabledata'] = tablefield_rtrim_rows($tabledata['tabledata']);
+        // Rationalize the stored data.
+        if (!empty($table['tablefield'])) {
+          $tabledata = $table['tablefield'];
         }
-
-        if (!empty($settings['trim_trailing_cols'])) {
-          $tabledata['tabledata'] = tablefield_rtrim_cols($tabledata['tabledata']);
+        elseif (!empty($table['value'])) {
+          $tabledata = unserialize($table['value']);
         }
 
-        if (!empty($settings['hide_cols_skip_head'])) {
-          $tabledata['tabledata'] = tablefield_rtrim_cols($tabledata['tabledata'], TRUE);
-        }
+        // Run the table through input filters.
+        if (isset($tabledata['tabledata'])) {
+          if (!empty($tabledata['tabledata'])) {
+
+            if (!empty($settings['trim_trailing_rows'])) {
+              $tabledata['tabledata'] = tablefield_rtrim_rows($tabledata['tabledata']);
+            }
 
-        foreach ($tabledata['tabledata'] as $row_key => $row) {
-          foreach ($row as $col_key => $cell) {
-            if (!empty($table['format']) && $col_key !== 'weight') {
-              $tabledata[$row_key][$col_key] = array(
-                'data' => check_markup($cell, $table['format']),
-                'class' => array($row_key, $col_key),
-              );
+            if (!empty($settings['trim_trailing_cols'])) {
+              $tabledata['tabledata'] = tablefield_rtrim_cols($tabledata['tabledata']);
             }
-            elseif ($col_key !== 'weight') {
-              $tabledata[$row_key][$col_key] = array(
-                'data' => check_plain($cell),
-                'class' => array($row_key, $col_key),
-              );
+
+            if (!empty($settings['hide_cols_skip_head'])) {
+              $tabledata['tabledata'] = tablefield_rtrim_cols($tabledata['tabledata'], TRUE);
+            }
+
+            foreach ($tabledata['tabledata'] as $row_key => $row) {
+              foreach ($row as $col_key => $cell) {
+                if (!empty($table['format']) && $col_key !== 'weight') {
+                  $tabledata[$row_key][$col_key] = array(
+                    'data' => check_markup($cell, $table['format']),
+                    'class' => array($row_key, $col_key),
+                  );
+                }
+                elseif ($col_key !== 'weight') {
+                  $tabledata[$row_key][$col_key] = array(
+                    'data' => check_plain($cell),
+                    'class' => array($row_key, $col_key),
+                  );
+                }
+              }
             }
           }
-        }
-      }
 
-      // Pull the header for theming.
-      unset($tabledata['caption']);
-      unset($tabledata['tabledata']);
-      unset($tabledata['rebuild']);
-      unset($tabledata['import']);
-      unset($tabledata['paste']);
-      $header_data = isset($tabledata['row_0']) ? $tabledata['row_0'] : NULL;
-
-      // Check for an empty header, if so we don't want to theme it.
-      $noheader = TRUE;
-      if (empty($field['settings']['hide_headers']) && $header_data) {
-        foreach ($header_data as $cell) {
-          if (strlen($cell['data']) > 0) {
-            $noheader = FALSE;
-            break;
+          // Pull the header for theming.
+          unset($tabledata['caption']);
+          unset($tabledata['tabledata']);
+          unset($tabledata['rebuild']);
+          unset($tabledata['import']);
+          unset($tabledata['paste']);
+          $header_data = isset($tabledata['row_0']) ? $tabledata['row_0'] : NULL;
+
+          // Check for an empty header, if so we don't want to theme it.
+          $noheader = TRUE;
+          if (empty($field['settings']['hide_headers']) && $header_data) {
+            foreach ($header_data as $cell) {
+              if (strlen($cell['data']) > 0) {
+                $noheader = FALSE;
+                break;
+              }
+            }
           }
-        }
-      }
 
-      $header = $noheader ? NULL : $header_data;
-      $entity_info = entity_get_info($entity_type);
-      $entity_id = !empty($entity_info['entity keys']['id']) ? $entity->{$entity_info['entity keys']['id']} : NULL;
-
-      // Remove the first row from the tabledata.
-      array_shift($tabledata);
-      // Theme the table for display.
-      $element[$delta] = array(
-        '#theme' => 'tablefield_view',
-        '#attributes' => array(
-          'id' => drupal_html_id('tablefield-' . $delta),
-          'class' => array('tablefield'),
-        ),
-        '#caption' => $caption,
-        '#sticky' => isset($field['settings']['sticky']) ? $field['settings']['sticky'] : NULL,
-        '#header' => $header,
-        '#rows' => $tabledata,
-        '#delta' => $delta,
-        '#export' => isset($field['settings']['export']) ? $field['settings']['export'] : NULL,
-        '#entity_type' => $entity_type,
-        '#entity_id' => $entity_id,
-        '#field_name' => $field['field_name'],
-        '#langcode' => $langcode,
-        '#formatter' => $formatter,
-      );
+          $header = $noheader ? NULL : $header_data;
+          $entity_info = entity_get_info($entity_type);
+          $entity_id = !empty($entity_info['entity keys']['id']) ? $entity->{$entity_info['entity keys']['id']} : NULL;
+
+          // Remove the first row from the tabledata.
+          array_shift($tabledata);
+          // Theme the table for display.
+          $element[$delta] = array(
+            '#theme' => 'tablefield_view',
+            '#attributes' => array(
+              'id' => drupal_html_id('tablefield-' . $delta),
+              'class' => array('tablefield'),
+            ),
+            '#caption' => $caption,
+            '#sticky' => isset($field['settings']['sticky']) ? $field['settings']['sticky'] : NULL,
+            '#header' => $header,
+            '#rows' => $tabledata,
+            '#delta' => $delta,
+            '#export' => isset($field['settings']['export']) ? $field['settings']['export'] : NULL,
+            '#entity_type' => $entity_type,
+            '#entity_id' => $entity_id,
+            '#field_name' => $field['field_name'],
+            '#langcode' => $langcode,
+            '#formatter' => $formatter,
+          );
+        }
+        break;
     }
-
   }
   return $element;
 }
