diff -u b/term_reference_tree.js b/term_reference_tree.js
--- b/term_reference_tree.js
+++ b/term_reference_tree.js
@@ -1,14 +1,16 @@
 (function($) {
 
-Drupal.ajax.prototype.commands.term_reference_tree_append_children = function(ajax, response, status) {
-  $(ajax.wrapper).siblings('.term-reference-tree-button').removeClass('term-reference-tree-collapsed');
-  $newElement = $('<div></div>').html(response.data);
-  Drupal.attachBehaviors($newElement);
-  $newElement = $newElement.contents();
-  $newElement.show();
-  $(ajax.wrapper).replaceWith($newElement);
-  var $tree = $newElement.parents('.term-reference-tree');
-  checkMaxChoices($tree, false);
+if (Drupal.ajax) {
+  Drupal.ajax.prototype.commands.term_reference_tree_append_children = function (ajax, response, status) {
+    $(ajax.wrapper).siblings('.term-reference-tree-button').removeClass('term-reference-tree-collapsed');
+    $newElement = $('<div></div>').html(response.data);
+    Drupal.attachBehaviors($newElement);
+    $newElement = $newElement.contents();
+    $newElement.show();
+    $(ajax.wrapper).replaceWith($newElement);
+    var $tree = $newElement.parents('.term-reference-tree');
+    checkMaxChoices($tree, false);
+  }
 }
 
 /**
diff -u b/term_reference_tree.module b/term_reference_tree.module
--- b/term_reference_tree.module
+++ b/term_reference_tree.module
@@ -112,19 +112,19 @@
   if (isset($children_tree[$parent_tid])) {
     foreach($children_tree[$parent_tid] as $child_tid) {
       $term = $terms[$child_tid];
-      $term->render_children = FALSE;
-      $term->children_selected = FALSE;
       $has_children = isset($children_tree[$term->tid]);
+      // This ajax_expanded property defines whether or not this parent term
+      // should be expanded in case we use ajax.
+      $term->ajax_expanded = FALSE;
+      // Set default to TRUE if this term is in default value.
+      $term->default = isset($default[$term->tid]);
 
       if ($has_children) {
         $term->children = _term_reference_tree_get_term_hierarchy_recursive($term->tid, $terms, $children_tree, $default, $opened, $use_ajax);
-        $term->children_selected = _term_reference_tree_children_selected($term, $default);
 
-        // Display child terms if we're no in ajax mode or if one of them is
-        // selected or opened.
-        if (!$use_ajax || $term->children_selected || in_array($term->tid, $opened)) {
-          $term->render_children = TRUE;
-        }
+        // Expand this parent term if it was opened via ajax or if one of its
+        // children is default or ajax_expanded.
+        $term->ajax_expanded = in_array($term->tid, $opened) || _term_reference_tree_ajax_expanded($term);
       }
       $tree[$term->tid] = $term;
     }
@@ -132,12 +132,10 @@
   return $tree;
 }
 
-function _term_reference_tree_children_selected($term, $default) {
-  if (!empty($term->children)) {
-    foreach ($term->children as $child) {
-      if (isset($default[$child->tid])) {
-        return TRUE;
-      }
+function _term_reference_tree_ajax_expanded($term) {
+  foreach ($term->children as $child) {
+    if ($child->default || $child->ajax_expanded) {
+      return TRUE;
     }
   }
   return FALSE;
diff -u b/term_reference_tree.widget.inc b/term_reference_tree.widget.inc
--- b/term_reference_tree.widget.inc
+++ b/term_reference_tree.widget.inc
@@ -314,7 +314,7 @@
 
     $tree = new stdClass();
     $tree->children = $terms;
-    $tree->render_children = TRUE;
+    $tree->ajax_expanded = TRUE;
     $element[] = _term_reference_tree_build_level($element, $tree, $form_state, $default, $max_choices, array(), 1);
 
     // Add a track list element?
@@ -749,18 +749,23 @@
  *   A completed checkbox_tree_level element.
  */
 function _term_reference_tree_build_level($element, $term, $form_state, $value, $max_choices, $parent_tids, $depth) {
+  // Always expand this parent if we are in ajax mode and ajax_expanded is TRUE.
+  // Or when we're not in ajax mode and start_minimized is FALSE.
+  $expand = ($element['#use_ajax'] && $term->ajax_expanded) || (!$element['#use_ajax'] && !$element['#start_minimized']);
   $container = array(
     '#max_choices' => $max_choices,
     '#leaves_only' => isset($element['#leaves_only']) ? $element['#leaves_only'] : FALSE,
     '#start_minimized' => isset($element['#start_minimized']) ? $element['#start_minimized'] : FALSE,
-    '#level_start_minimized' => $depth > 1 && $element['#start_minimized'] && !($term->children_selected),
+    '#level_start_minimized' => $depth > 1 && !$expand,
     '#depth' => $depth,
   );
 
   // Adds checkbox_tree_level when children exists
   // or ajax wrapper when children are not loaded.
   if (!empty($term->children)) {
-    if ($term->render_children) {
+    // Build the children render arrays if we don't use ajax or if this parent
+    // needs to be expanded in ajax mode.
+    if (!$element['#use_ajax'] || $term->ajax_expanded) {
       $container['#type'] = 'checkbox_tree_level';
       foreach ($term->children as $child) {
         $container[$child->tid] = _term_reference_tree_build_item($element, $child, $form_state, $value, $max_choices, $parent_tids, $container, $depth);
