diff --git a/term_reference_tree.js b/term_reference_tree.js
index 950c655..8794263 100644
--- a/term_reference_tree.js
+++ b/term_reference_tree.js
@@ -253,6 +253,9 @@
           checkbox.parents('ul.term-reference-tree-level li').children('div.form-item').children('input[type=checkbox]').attr('checked', checkbox.attr('checked'));
         }
       }
+      if(item.hasClass('select-children')) {
+         checkbox.closest('li').find('input[type=checkbox]').attr('checked', checkbox.attr('checked'));
+      }
     }
   }
 })(jQuery);
\ No newline at end of file
diff --git a/term_reference_tree.module b/term_reference_tree.module
index 22d8ba5..f27172f 100644
--- a/term_reference_tree.module
+++ b/term_reference_tree.module
@@ -16,6 +16,7 @@ function term_reference_tree_field_widget_info() {
         'leaves_only' => 0,
         'filter_view' => '',
         'select_parents' => 0,
+        'select_children' => 0,
         'track_list' => 0,
         'token_display' => '',
       ),
@@ -218,6 +219,15 @@ function term_reference_tree_field_widget_settings_form($field, $instance) {
       '#element_validate' => array('_term_reference_tree_select_parents_validate'),
       '#return_value' => 1,
     );
+    
+    $form['select_children'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Select children automatically'),
+      '#description' => t("When turned on, this option causes the widget to automatically select the children of all selected items. <em>This option is only valid if an unlimited number of values can be selected.</em>"),
+      '#default_value' => $settings['select_children'],
+      '#element_validate' => array('_term_reference_tree_select_children_validate'),
+      '#return_value' => 1,
+    );
 
     if(module_exists('views')) {
       $views = views_get_all_views();
@@ -293,6 +303,17 @@ function _term_reference_tree_select_parents_validate($element, &$form_state) {
 }
 
 /**
+ * Makes sure that cardinality is unlimited if auto-select children is enabled.
+ */
+function _term_reference_tree_select_children_validate($element, &$form_state) {
+  if($form_state['values']['instance']['widget']['settings']['select_children'] == 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 Children Automatically is enabled.'));
+  }
+}
+
+/**
  * Implements hook_element_info().
  */
 function term_reference_tree_element_info() {
@@ -398,6 +419,9 @@ function term_reference_tree_process_checkbox_tree($element, $form_state) {
     if(array_key_exists('#select_parents', $element) && $element['#select_parents']) {
       $element['#attributes']['class'][] = 'select-parents';
     }
+    if(array_key_exists('#select_children', $element) && $element['#select_children']) {
+      $element['#attributes']['class'][] = 'select-children';
+    }
 
     if($max_choices != 1)
       $element['#tree'] = TRUE;
@@ -666,6 +690,7 @@ function term_reference_tree_field_widget_form(&$form, &$form_state, $field, $in
       $element['#leaves_only'] = $settings['leaves_only'];
       $element['#filter_view'] = module_exists('views') ? $settings['filter_view'] : '';
       $element['#select_parents'] = $settings['select_parents'];
+      $element['#select_children'] = $settings['select_children'];
       $element['#track_list'] = $settings['track_list'];
       $element['#parent_tid'] = $field['settings']['allowed_values'][0]['parent'];
       $element['#vocabulary'] = $voc->vid;
