diff --git a/tablefield.module b/tablefield.module
index ce108c2..00f4043 100644
--- a/tablefield.module
+++ b/tablefield.module
@@ -279,6 +279,7 @@ function tablefield_field_is_empty($item, $field) {
   }
 
   // Remove the preference fields to see if the table cells are all empty
+  unset($item['tablefield']['accessibility']);
   unset($item['tablefield']['rebuild']);
   unset($item['tablefield']['import']);
   if (!empty($item['tablefield'])) {
@@ -313,7 +314,12 @@ function tablefield_field_formatter_view($entity_type, $entity, $field, $instanc
   $formatter = $display['type'];
 
   foreach ($items as $delta => $table) {
-
+    $raw = unserialize($table['value']);
+    // check for table accessibility array
+    if (isset($raw['accessibility'])) {
+      $caption = $raw['accessibility']['caption'];
+      $summary = $raw['accessibility']['summary'];
+    }
     // Rationalize the stored data
     if (!empty($table['tablefield'])) {
       $tabledata = tablefield_rationalize_table($table['tablefield']);
@@ -364,6 +370,8 @@ function tablefield_field_formatter_view($entity_type, $entity, $field, $instanc
         'entity_id' => $entity_id,
         'field_name' => $field['field_name'],
         'langcode' => $langcode,
+        'caption' => $caption,
+        'summary' => $summary,
       ));
     }
 
@@ -535,6 +543,35 @@ function tablefield_field_widget_form(&$form, &$form_state, $field, $instance, $
     '#markup' => '</table>',
   );
 
+  // table accessibility fields
+  $element['tablefield']['accessibility'] = array(
+    '#title' => t('Accessibility'),
+    '#description' => t('Additional fields to help better describe the data in your table.'),
+    '#attributes' => array('id' => 'form-tablefield-' . $field['field_name'] . '-' . $delta . '-accessibility', 'class' => array('form-tablefield-accessibility')),
+    '#type' => 'fieldset',
+    '#tree' => TRUE,
+    '#collapsible' => TRUE,
+    '#prefix' => '<div id="tablefield-' . $field['field_name'] . '-' . $delta . '-accessibility-wrapper">',
+    '#suffix' => '</div>',
+  );
+  if (isset($items[$delta]['value'])) {
+    $raw = unserialize($items[$delta]['value']);
+    $caption = $raw['accessibility']['caption'];
+    $summary = $raw['accessibility']['summary'];
+  }
+  $element['tablefield']['accessibility']['caption'] = array(
+    '#title' => t('Caption'),
+    '#description' => t('Provide a brief decription of the data the table contains, this is associated to the table and helps Assitive Technology, like screen readers, better describe your tables content.'),
+    '#type' => 'textfield',
+    '#default_value' => isset($caption) ? $caption : '',
+  );
+  $element['tablefield']['accessibility']['summary'] = array(
+    '#title' => t('Summary'),
+    '#description' => t('The summary attribute helps describe the structure of complex tables. It is better to have simple tables, but this attribute can help when that is not possible.'),
+    '#type' => 'textfield',
+    '#default_value' => isset($summary) ? $summary : '',
+  );
+
   // If the user doesn't have rebuild perms, we pass along the data as a value.
   // Otherwise, we will provide form elements to specify the size and ajax rebuild.
   if (isset($field['settings']['restrict_rebuild']) && $field['settings']['restrict_rebuild'] && !user_access('rebuild tablefield')) {
@@ -783,6 +820,7 @@ function tablefield_rationalize_table($tablefield) {
     // Remove exterraneous form data
     $count_cols = $tablefield['rebuild']['count_cols'];
     $count_rows = $tablefield['rebuild']['count_rows'];
+    unset($tablefield['accessibility']);
     unset($tablefield['rebuild']);
     unset($tablefield['import']);
 
@@ -813,6 +851,8 @@ function tablefield_theme() {
         'entity_id' => NULL,
         'field_name' => NULL,
         'langcode' => NULL,
+        'caption' => NULL,
+        'summary' => NULL,
       ),
     ),
   );
@@ -827,8 +867,14 @@ function theme_tablefield_view($variables) {
     'class' => array(
       'tablefield'
     ),
+    'summary' => $variables['summary'],
   );
-
+  // apply scope property to headers for accessibility
+  if (is_array($variables['header'])) {
+    foreach($variables['header'] as &$header) {
+      $header['scope'] = 'col';
+    }
+  }
   // If the user has access to the csv export option, display it now.
   $export = '';
   if ($variables['export'] && user_access('export tablefield')) {
@@ -842,6 +888,7 @@ function theme_tablefield_view($variables) {
         'header' => $variables['header'],
         'rows' => $variables['rows'],
         'attributes' => $attributes,
+        'caption' => $variables['caption'],
       )
     )
     . $export
