diff --git a/term_reference_tree.js b/term_reference_tree.js
index 61e5ed9..fcf1d5a 100644
--- a/term_reference_tree.js
+++ b/term_reference_tree.js
@@ -131,6 +131,18 @@ Drupal.behaviors.termReferenceTree = {
         //End process checkbox changes.
       } //End Want a cascading checking.
 
+      //On page load, check if the user wants a Select all helper. If so,
+      //prepend the helper to the begining of the list.
+      if($(this).hasClass('select-all-helper')) {
+        var _this = this;
+        var selectAll = $(Drupal.t('<a href="#">Select all</a>')).click(function(event) {
+          event.preventDefault();
+          $(_this).find('input[type=checkbox]').each(function() {
+            $(this).attr('checked', true);
+          });
+        });
+        $(this).prepend(selectAll);
+      }
     });
   }
 };
diff --git a/term_reference_tree.widget.inc b/term_reference_tree.widget.inc
index 1685a43..2b46371 100644
--- a/term_reference_tree.widget.inc
+++ b/term_reference_tree.widget.inc
@@ -18,6 +18,7 @@ function term_reference_tree_field_widget_info() {
         'filter_view' => '',
         'select_parents' => 0,
         'cascading_selection' => 0,
+        'select_all_helper' => 0,
         'track_list' => 0,
         'token_display' => '',
         'parent_term_id' => '',
@@ -70,6 +71,15 @@ function term_reference_tree_field_widget_settings_form($field, $instance) {
       '#return_value' => 1,
     );
 
+    $form['select_all_helper'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Select all helper'),
+      '#description' => t('When turned on, this option shows a "Select all" link on the widget that triggers all items to be selected on click.  <em>This option is only valid if an unlimited number of values can be selected.</em>'),
+      '#default_value' => $settings['select_all_helper'],
+      '#element_validate' => array('_term_reference_tree_select_all_helper_validate'),
+      '#return_value' => 1,
+    );
+
     if (module_exists('views')) {
       $views = views_get_all_views();
       $options = array('' => 'none');
@@ -254,6 +264,17 @@ function _term_reference_tree_cascading_selection_validate($element, &$form_stat
 }
 
 /**
+ * Makes sure that cardinality is unlimited if select all helper is enabled.
+ */
+function _term_reference_tree_select_all_helper_validate($element, &$form_state) {
+  if ($form_state['values']['instance']['widget']['settings']['select_all_helper'] == 1 && $form_state['values']['field']['cardinality'] != -1) {
+    // This is pretty wonky syntax for the field name in form_set_error, but it's
+    // correct.
+    form_set_error('field][cardinality', t('You must select an Unlimited number of values if Select all helper is enabled.'));
+  }
+}
+
+/**
  * Process the checkbox_tree widget.
  *
  * This function processes the checkbox_tree widget.
@@ -316,6 +337,10 @@ function term_reference_tree_process_checkbox_tree($element, $form_state) {
         '#max_choices' => $max_choices,
       );
     }
+
+    if (array_key_exists('#select_all_helper', $element) && $element['#select_all_helper']) {
+      $element['#attributes']['class'][] = 'select-all-helper';
+    }
   }
 
   return $element;
@@ -513,6 +538,7 @@ function term_reference_tree_field_widget_form(&$form, &$form_state, $field, $in
       $element['#filter_view'] = module_exists('views') ? $settings['filter_view'] : '';
       $element['#select_parents'] = $settings['select_parents'];
       $element['#cascading_selection'] = $settings['cascading_selection'];
+      $element['#select_all_helper'] = $settings['select_all_helper'];
       $element['#track_list'] = $settings['track_list'];
       $element['#parent_tid'] = $settings['parent_term_id'] ? $settings['parent_term_id'] : $field['settings']['allowed_values'][0]['parent'];
       $element['#vocabulary'] = $vocabulary;
