diff --git a/modules/shs/js/shs.js b/modules/shs/js/shs.js
index 28cea53..8104bd1 100644
--- a/modules/shs/js/shs.js
+++ b/modules/shs/js/shs.js
@@ -43,6 +43,8 @@
                 $select.addClass('error');
               }
               $select.appendTo($field.parent());
+              $label = shsLabelCreate($field.attr('id'), level);
+              $label.appendTo($field.parent());
               // Retrieve data for this level.
               getTermChildren($select, fieldSettings, parent_id, parent.tid, $field.attr('id'));
               // Use current term id as parent id for the next level.
@@ -65,6 +67,8 @@
               // Try to add one additional level.
               $select = shsElementCreate($field.attr('id'), fieldSettings, level);
               $select.appendTo($field.parent());
+              $label = shsLabelCreate($field.attr('id'), level);
+              $label.appendTo($field.parent());
               // Retrieve data for this level.
               getTermChildren($select, fieldSettings, parent_id, 0, $field.attr('id'));
             }
@@ -80,7 +84,7 @@
    *   Element to fill with terms.
    * @param settings
    *   Field settings.
-   * @param parent_value
+   * @param parent_value 
     *   Value which has been selected in the parent element (== "selected term").
     * @param default_value
     *   Value to use as default.
@@ -127,6 +131,7 @@
 
           if (data.data.length == 0 && !(settings.settings.create_new_terms && (settings.settings.create_new_levels || (parent_value + default_value == 0)))) {
             // Remove element.
+            $element.next('label').remove(); // label
             $element.remove();
             return;
           }
@@ -221,6 +226,7 @@
       },
       complete: function(xhr, status) {
         // Remove container.
+        $container.next('label').remove(); // label
         $container.remove();
         // Display triggering element.
         $triggering_element.fadeIn();
@@ -247,9 +253,11 @@
       if (Drupal.settings.chosen) {
         // Remove element created by chosen.
         var elem_id = $(this).attr('id');
+        $('#' + elem_id.replace(/-/g, '_') + '_chzn').next('label').remove(); // label
         $('#' + elem_id.replace(/-/g, '_') + '_chzn').remove();
       }
       // Remove element.
+      $(this).next('label').remove(); // label
       $(this).remove();
     });
     //$triggering_element.nextAll('.chzn-container').remove();
@@ -283,6 +291,7 @@
         .bind('click', function(event) {
           event.preventDefault();
           // Remove container.
+          $container.next('label').remove(); // label
           $container.remove();
           // Reset value of triggering element.
           $triggering_element.val(0);
@@ -315,6 +324,7 @@
           }
           else {
             // Remove container.
+            $container.next('label').remove(); // label
             $container.remove();
             // Reset value of triggering element.
             $triggering_element.val(0);
@@ -329,6 +339,8 @@
       level++;
       $element_new = shsElementCreate(base_id, settings, level);
       $element_new.appendTo($triggering_element.parent());
+      $label = shsLabelCreate(base_id, level);
+      $label.appendTo($triggering_element.parent());
       // Retrieve list of items for the new element.
       getTermChildren($element_new, settings, $triggering_element.val(), 0, base_id);
     }
@@ -381,6 +393,16 @@
     return $element;
   }
 
+  shsLabelCreate = function(base_id, level) {
+    // Create element.
+      $element = $('<label>')
+        .attr('for', base_id + '-select-' + level)
+        .addClass('element-invisible')
+        .html('Hierarchical category level ' + level);
+    // Return the new element.
+    return $element;
+  }
+
   /**
    * Update value of original (hidden) field.
    *
