--- shs.js.notpatched	2014-11-26 14:06:35.024759786 +0100
+++ shs.js	2014-11-26 14:39:21.501449238 +0100
@@ -249,10 +249,23 @@
       complete: function(xhr, status) {
         // Remove container.
         $container.remove();
-        // Display triggering element.
-        $triggering_element.fadeIn();
-        $triggering_element.css('display','inline-block');
-      }
+
+        // Try to convert the element to a "Chosen" element.
+        if (!elementConvertToChosen($triggering_element, settings)) {
+          // Display triggering element.
+          $triggering_element.fadeIn();
+          $triggering_element.css('display','inline-block');
+        }
+
+        // Add next level in hierarchy if new levels may be created.
+        if ((settings.settings.create_new_terms && settings.settings.create_new_levels) || settings.settings.test_create_new_levels) {
+          level++;
+          $element_new = shsElementCreate(base_id, settings, level);
+          $element_new.appendTo($triggering_element.parent());
+          // Retrieve list of items for the new element.
+          getTermChildren($element_new, settings, $triggering_element.val(), 0, base_id);
+        }		
+	  }
     });
   }
 
@@ -319,6 +332,7 @@
           // Reset value of triggering element.
           $triggering_element.val(settings.settings.any_value);
 
+		  // Try to convert the element to a "Chosen" element.
           if (!elementConvertToChosen($triggering_element, settings)) {
             // Display triggering element.
             $triggering_element.fadeIn();
@@ -342,7 +356,7 @@
           // Create a term object.
           var term = {
             vid: settings.vid,
-            parent: (level == 1) ? 0 : ($triggering_element.prev('select').val() || 0),
+			parent: (level == 1) ? 0 : ($triggering_element.prevAll('select:first').val() || 0),
             name: termName
           };
           if (termName.length > 0) {
@@ -352,11 +366,15 @@
             // Remove container.
             $container.remove();
             // Reset value of triggering element.
-            $triggering_element.val(0);
-            // Display triggering element.
-            $triggering_element.fadeIn();
-            $triggering_element.css('display','inline-block');;
-          }
+            $triggering_element.val(settings.settings.any_value);
+
+            // Try to convert the element to a "Chosen" element.
+            if (!elementConvertToChosen($triggering_element, settings)) {
+              // Display triggering element.
+              $triggering_element.fadeIn();
+              $triggering_element.css('display','inline-block');
+			}
+		  }
         });
       $save.appendTo($buttons);
     }
@@ -486,7 +504,16 @@
   elementConvertToChosen = function($element, settings) {
     if (Drupal.settings.chosen) {
       $element.removeClass('chzn-done');
-      var minWidth = Drupal.settings.chosen.minimum_width;
+
+      // Chosen will not apply properly to hidden select element: it does not set
+      // the proper width to its container.
+      // Our select element is hidden by default, so we show it here and let
+      // Chosen hide the element back when it has finished with it.
+      $element.show();
+
+      var minWidth = Drupal.settings.chosen.minimum_width,
+          selector = Drupal.settings.chosen.selector;
+
       // Define options for chosen.
       var options = {};
       options.search_contains = Drupal.settings.chosen.search_contains;
@@ -494,10 +521,6 @@
       options.placeholder_text_single = Drupal.settings.chosen.placeholder_text_single;
       options.no_results_text = Drupal.settings.chosen.no_results_text;
 
-      // Get element selector from settings (and remove "visible" option since
-      // our select element is hidden by default).
-      var selector = Drupal.settings.chosen.selector.replace(/:visible/, '');
-
       if ((settings.settings.use_chosen == 'always') || ((settings.settings.use_chosen == 'chosen') && ($element.is(selector) && $element.find('option').size() >= Drupal.settings.chosen.minimum))) {
         $element.css({
           width : ($element.width() < minWidth) ? minWidth : $element.width()
