diff --git a/term_reference_tree.js b/term_reference_tree.js
index 4b3fdb0..319312f 100644
--- a/term_reference_tree.js
+++ b/term_reference_tree.js
@@ -77,7 +77,7 @@
           });
           
           //Change track list when controls are clicked.
-          $(this).find('.form-' + input_type).click(function(event){
+          $(this).find('.form-' + input_type).change(function(event){
             //Remove the "nothing selected" message if showing - add it later if needed.
             removeNothingSelectedMessage(track_list_container);
             var event_target = $(event.target);
@@ -102,6 +102,31 @@
           }); //End process checkbox changes.
         } //End Want a track list.
         
+        //On page load, check if the user wants a cascading selection.
+        if($(this).hasClass('term-reference-tree-cascading-selection')) {
+
+          //Check children when checkboxes are clicked.
+          $(this).find('.form-checkbox').change(function(event) {
+            var event_target = $(event.target);
+            var control_id = event_target.attr('id');
+            var children = event_target.parent().next().children().children('div.form-type-checkbox').children('input[id^="' + control_id + '-children"]');
+            if(event_target.attr('checked')) {
+              //Checkbox checked - check children if none were checked.
+              if(!$(children).filter(':checked').length) {
+                $(children).click().trigger('change');
+              }
+            }
+            else {
+              //Checkbox unchecked. Uncheck children if all were checked.
+              if(!$(children).not(':checked').length) {
+                $(children).click().trigger('change');
+              }
+            }
+
+          });
+          //End process checkbox changes.
+        } //End Want a cascading checking.
+
       });
     }
   };
diff --git a/term_reference_tree.widget.inc b/term_reference_tree.widget.inc
index 6ca7167..8bae7a1 100644
--- a/term_reference_tree.widget.inc
+++ b/term_reference_tree.widget.inc
@@ -17,6 +17,7 @@ function term_reference_tree_field_widget_info() {
         'leaves_only' => 0,
         'filter_view' => '',
         'select_parents' => 0,
+        'cascading_selection' => 0,
         'track_list' => 0,
         'token_display' => '',
         'parent_term_id' => '',
@@ -105,6 +106,15 @@ function term_reference_tree_field_widget_settings_form($field, $instance) {
       '#return_value' => 1,
     );
 
+    $form['cascading_selection'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Cascading selection'),
+      '#description' => t('On parent selection, automatically select children if none were selected. Some may then be manually unselected. In the same way, on parent unselection, unselect children if all were selected. <em>This option is only valid if an unlimited number of values can be selected.</em>'),
+      '#default_value' => $settings['cascading_selection'],
+      '#element_validate' => array('_term_reference_tree_cascading_selection_validate'),
+      '#return_value' => 1,
+    );
+
     if (module_exists('views')) {
       $views = views_get_all_views();
       $options = array('' => 'none');
@@ -231,6 +241,17 @@ function _term_reference_tree_select_parents_validate($element, &$form_state) {
 }
 
 /**
+ * Makes sure that cardinality is unlimited if cascading selection is enabled.
+ */
+function _term_reference_tree_cascading_selection_validate($element, &$form_state) {
+  if ($form_state['values']['instance']['widget']['settings']['cascading_selection'] == 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 Cascading selection is enabled.'));
+  }
+}
+
+/**
  * Process the checkbox_tree widget.
  * 
  * This function processes the checkbox_tree widget.
@@ -327,6 +348,10 @@ function theme_checkbox_tree($variables) {
     $attributes['class'][] = "term-reference-tree-collapsed";
   }
 
+  if (array_key_exists('#cascading_selection', $element) && $element['#cascading_selection']) {
+    $attributes['class'][] = "term-reference-tree-cascading-selection";
+  }
+
   $add_track_list = FALSE;
   if (array_key_exists('#track_list', $element) && $element['#track_list']) {
     $attributes['class'][] = "term-reference-tree-track-list-shown";
@@ -485,6 +510,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['#cascading_selection'] = $settings['cascading_selection'];
       $element['#track_list'] = $settings['track_list'];
       $element['#parent_tid'] = $settings['parent_term_id'] || $field['settings']['allowed_values'][0]['parent'];
       $element['#vocabulary'] = $voc->vid;
