diff --git a/tablefield.module b/tablefield.module
index 0b8751c..43ead4c 100644
--- a/tablefield.module
+++ b/tablefield.module
@@ -288,6 +288,7 @@ function tablefield_field_is_empty($item, $field) {

   // Remove the preference fields to see if the table cells are all empty.
   unset($item['tablefield']['rebuild']);
+  unset($item['tablefield']['caption']);
   unset($item['tablefield']['import']);
   if (!empty($item['tablefield'])) {
     foreach ($item['tablefield'] as $cell) {
@@ -361,6 +362,9 @@ function tablefield_field_formatter_view($entity_type, $entity, $field, $instanc
   $formatter = $display['type'];

   foreach ($items as $delta => $table) {
+    // Check for table caption.
+    $raw = unserialize($table['value']);
+    $caption = isset($raw['caption'])? $raw['caption']: '';

     // Rationalize the stored data.
     if (!empty($table['tabledata'])) {
@@ -427,6 +431,7 @@ function tablefield_field_formatter_view($entity_type, $entity, $field, $instanc
         'entity_id' => $entity_id,
         'field_name' => $field['field_name'],
         'langcode' => $langcode,
+        'caption' => $caption,
         'formatter' => $formatter,
       ));
     }
@@ -698,7 +703,6 @@ function tablefield_field_widget_form(&$form, &$form_state, $field, $instance, $
     '#title' => t('File upload'),
     '#type' => 'file',
   );
-
   $element['tablefield']['import']['import'] = array(
     '#type' => 'button',
     '#validate' => array(),
@@ -717,6 +721,21 @@ function tablefield_field_widget_form(&$form, &$form_state, $field, $instance, $
     ),
   );

+  // Provide caption field to describe the data contained in the table.
+  $caption = '';
+  if (isset($items[$delta]['value'])) {
+    $raw = unserialize($items[$delta]['value']);
+    if (isset($raw['caption'])) {
+      $caption = $raw['caption'];
+    }
+  }
+  $element['tablefield']['caption'] = array(
+    '#title' => t('Table description'),
+    '#description' => t('This brief caption will be associated with the table and will help Assitive Technology, like screen readers, better describe the content within.'),
+    '#type' => 'textfield',
+    '#default_value' => isset($caption) ? $caption : ''
+  );
+
   // Allow the user to select input filters.
   if (!empty($field['settings']['cell_processing'])) {
     $element['#base_type'] = $element['#type'];
@@ -851,6 +870,7 @@ function tablefield_rationalize_table($tablefield) {
     // Remove exterraneous form data.
     $count_cols = $tablefield['rebuild']['count_cols'];
     $count_rows = $tablefield['rebuild']['count_rows'];
+    unset($tablefield['caption']);
     unset($tablefield['rebuild']);
     unset($tablefield['import']);

@@ -881,6 +901,7 @@ function tablefield_theme() {
         'entity_id' => NULL,
         'field_name' => NULL,
         'langcode' => NULL,
+        'caption' => NULL,
         'formatter' => NULL,
         'attributes' => array(),
       ),
@@ -899,6 +920,13 @@ function theme_tablefield_view($variables) {
     ),
   );

+  // 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')) {
@@ -912,6 +940,7 @@ function theme_tablefield_view($variables) {
         'header' => $variables['header'],
         'rows' => $variables['rows'],
         'attributes' => $attributes,
+        'caption' => $variables['caption'],
       )
     )
     . $export
