diff --git a/multiselect.js b/multiselect.js
index 6cb3335..24f2406 100644
--- a/multiselect.js
+++ b/multiselect.js
@@ -7,8 +7,8 @@
     attach: function(context) {
       // Remove the items that haven't been selected from the select box.
       $('select.multiselect_unsel:not(.multiselect-processed)', context).addClass('multiselect-processed').each(function() {
-        unselclass = '.' + this.id + '_unsel';
-        selclass = '.' + this.id + '_sel';
+        unselclass = '.' + multiselectescape(this.id) + '_unsel';
+        selclass = '.' + multiselectescape(this.id) + '_sel';
         $(unselclass).removeContentsFrom($(selclass));   
       });
   
@@ -20,35 +20,41 @@
   
       // Moves selection if it's double clicked to selected box
       $('select.multiselect_unsel:not(.multiselect-unsel-processed)', context).addClass('multiselect-unsel-processed').dblclick(function() {
-        unselclass = '.' + this.id + '_unsel';
-        selclass = '.' + this.id + '_sel';
+        unselclass = '.' + multiselectescape(this.id) + '_unsel';
+        selclass = '.' + multiselectescape(this.id) + '_sel';
         $(unselclass).moveSelectionTo($(selclass));
       });
   
       // Moves selection if it's double clicked to unselected box
       $('select.multiselect_sel:not(.multiselect-sel-processed)', context).addClass('multiselect-sel-processed').dblclick(function() {
-        unselclass = '.' + this.id + '_unsel';
-        selclass = '.' + this.id + '_sel';
+        unselclass = '.' + multiselectescape(this.id) + '_unsel';
+        selclass = '.' + multiselectescape(this.id) + '_sel';
         $(selclass).moveSelectionTo($(unselclass));
       });
   
       // Moves selection if add is clicked to selected box
       $('li.multiselect_add:not(.multiselect-add-processed)', context).addClass('multiselect-add-processed').click(function() {
-        unselclass = '.' + this.id + '_unsel';
-        selclass = '.' + this.id + '_sel';
+        unselclass = '.' + multiselectescape(this.id.replace('add', 'unsel'));
+        selclass = '.' + multiselectescape(this.id.replace('add', 'sel'));
         $(unselclass).moveSelectionTo($(selclass));
       });
   
       // Moves selection if remove is clicked to selected box
       $('li.multiselect_remove:not(.multiselect-remove-processed)', context).addClass('multiselect-remove-processed').click(function() {
-        unselclass = '.' + this.id + '_unsel';
-        selclass = '.' + this.id + '_sel';
+        unselclass = '.' + multiselectescape(this.id.replace('remove', 'unsel'));
+        selclass = '.' + multiselectescape(this.id.replace('remove', 'sel'));
         $(selclass).moveSelectionTo($(unselclass));
       });
     }
   };
 })(jQuery);
 
+// Adds escape slashes to brackets for accurate jQuery selector matches
+// usage escape('string');
+var multiselectescape = function(str){
+    return str.replace('[', '\\[').replace(']', '\\]');
+}
+
 // Selects all the items in the select box it is called from.
 // usage $('nameofselectbox').selectAll();
 jQuery.fn.selectAll = function() {
diff --git a/multiselect.module b/multiselect.module
index 8966df0..94b1685 100644
--- a/multiselect.module
+++ b/multiselect.module
@@ -92,19 +92,21 @@ function multiselect_field_widget_form(&$form, &$form_state, $field, $instance,
 
   $widget = _multiselect_build_widget_code($options, $items, $element, $required);
 
+  $elid = (empty($element['#id'])) ? $element['#field_name'] : $element['#id'];
+
   // Build the basic select box using Form API.
   $element += array(
     '#type' => 'select',
     '#title' => $element['#title'],
     '#description' => $element['#description'],
-    '#required' => $required,
+    // '#required' => $required,
     '#multiple' => $multiple,
     '#options' => $options,
     //'#options' => $selected_options,
     '#size' => 10,
     '#prefix' => $widget['prefix_pre'] . $widget['prefix_options'] . $widget['prefix_post'],
     '#suffix' => "\n</div>\n",
-    '#attributes' => array('class' => array($widget['selfield'], 'multiselect_sel'), 'id' => array($element['#field_name'])),
+    '#attributes' => array('class' => array($widget['selfield'], 'multiselect_sel'), 'id' => array($elid)),
     '#default_value' => $default_value,
     '#value_key' => $value_key,
     '#element_validate' => array('options_field_widget_validate'),
@@ -197,13 +199,14 @@ function _multiselect_build_widget_code($options, $items, $element, $required =
   foreach ($options as $key => $value) {
     if (!isset($selected_options[$key])) {
       $unselected_options[$key] = $value;
-      //$selected_options[$key] = $value;
     }
   }
+  
+  $elid = (empty($element['#id'])) ? $element['#field_name'] : $element['#id'];
 
   // Set up useful variables.
-  $selfield = $element['#field_name'] . "_sel";
-  $unselfield = $element['#field_name'] . "_unsel";
+  $selfield = $elid . "_sel";
+  $unselfield = $elid . "_unsel";
 
   // Call methods to create prefix. (ie the non-selected table, etc)
   $prefix_pre = '<div class="form-item multiselect"><label for="edit-title">' . t($element['#title']) . ':';
@@ -211,21 +214,30 @@ function _multiselect_build_widget_code($options, $items, $element, $required =
     $prefix_pre .= '<span class="form-required" title="' . t('This field is required.') . '"> * </span>';
   }
   $prefix_pre .= "</label>\n";
-  $prefix_pre .= "<div id=\"multiselect_labels" . "_" . $element['#field_name'] . "\" class=\"multiselect_labels\"><div id=\"label_unselected" . "_" . $element['#field_name'] . "\" class=\"label_unselected\">" . t('Available Options') . ":</div>\n";
-  $prefix_pre .= "<div id=\"label_selected" . "_" . $element['#field_name'] . "\" class=\"label_selected\">" . t('Selected Options') . ":</div>\n</div>\n";
-  $prefix_pre .= "<div id=\"multiselect_available" . "_" . $element['#field_name'] . "\" class=\"multiselect_available\">";
+  $prefix_pre .= "<div id=\"multiselect_labels" . "_" . $elid . "\" class=\"multiselect_labels\"><div id=\"label_unselected" . "_" . $elid . "\" class=\"label_unselected\">" . t('Available Options') . ":</div>\n";
+  $prefix_pre .= "<div id=\"label_selected" . "_" . $elid . "\" class=\"label_selected\">" . t('Selected Options') . ":</div>\n</div>\n";
+  $prefix_pre .= "<div id=\"multiselect_available" . "_" . $elid . "\" class=\"multiselect_available\">";
   if (array_key_exists('#size', $element)) {
     $size = $element['#size']; // Modules can pass in the size of the select boxes.
   }
   else {
     $size = '10'; // Default size.
   }
-  $prefix_pre .= "<select name=\"" . $unselfield . "\" multiple=\"multiple\" class=\"form-multiselect " . $unselfield . " multiselect_unsel\" id=\"" . $element['#field_name'] . "\" size=\"" . $size . "\">\n";
+  
+  $attr = array(
+    'name' => $unselfield,
+    'multiple' => TRUE,
+    'class' => array('form-multiselect', $unselfield, 'multiselect_unsel'),
+    'id' => array($elid),
+    'size' => $size,
+  );
+  
+  $prefix_pre .= '<select' . drupal_attributes($attr) . '>';
   $prefix_options = _multiselect_html_for_box_options($unselected_options);
   $prefix_post = "</select>\n</div>\n";
-  $prefix_post .= "<ul id=\"multiselect_btns" . "_" . $element['#field_name'] . "\" class=\"multiselect_btns\">
-<li class=\"multiselect_add\" id=\"" . $element['#field_name'] . "\"><a href=\"javascript:;\">Add</a></li>
-<li class=\"multiselect_remove\" id=\"" . $element['#field_name'] . "\"><a href=\"javascript:;\">Remove</a></li>
+  $prefix_post .= "<ul id=\"multiselect_btns" . "_" . $elid . "\" class=\"multiselect_btns\">
+<li class=\"multiselect_add\" id=\"" . $elid . "_add\"><a href=\"javascript:;\">Add</a></li>
+<li class=\"multiselect_remove\" id=\"" . $elid . "_remove\"><a href=\"javascript:;\">Remove</a></li>
 </ul>";
 
   $widget['selected_options'] = $selected_options;
@@ -235,6 +247,8 @@ function _multiselect_build_widget_code($options, $items, $element, $required =
   $widget['prefix_pre'] = $prefix_pre;
   $widget['prefix_options'] = $prefix_options;
   $widget['prefix_post'] = $prefix_post;
+  
+  
 
   return $widget;
 }
@@ -287,7 +301,8 @@ function multiselect_theme() {
  */
 function theme_multiselect($variables) {
   $element = $variables['element'];
-  element_set_attributes($element, array('id', 'name', 'size', 'multiple', 'default_value', 'required'));
+  element_set_attributes($element, array('id', 'name', 'size', 'multiple', 'default_value'));
+  if ($variables['element']['#required']) element_set_attributes($element, array('required')); // workaround for proper required attribute handling
   _form_set_class($element, array('form-multiselect'));
   $options = $element['#options']; // All available options as defined by the element
   $items = $element['#default_value']; // All selected options are referred to as "items".
@@ -299,7 +314,7 @@ function theme_multiselect($variables) {
   // Add a couple of things into the attributes.
   $element['#attributes']['class'][] = $widget['selfield'];
   $element['#attributes']['class'][] = "multiselect_sel";
-  $element['#attributes']['id'] = $element['#field_name'];
+  $element['#attributes']['id'] = $element['#id'];
 
   return $widget['prefix_pre'] . $widget['prefix_options'] . $widget['prefix_post'] . '<div class="form-item form-type-select"><select' . drupal_attributes($element['#attributes']) . '>' . _multiselect_html_for_box_options($widget['selected_options']) . '</select></div>' . "\n</div>\n";
 }
