diff --git a/views/cck_select_other_handler_filter.inc b/views/cck_select_other_handler_filter.inc
index b9896b4..c64b933 100644
--- a/views/cck_select_other_handler_filter.inc
+++ b/views/cck_select_other_handler_filter.inc
@@ -1,6 +1,7 @@
 <?php
 /**
  * @file
+ * cck_select_other_handler_filter.inc
  */
 
 
@@ -10,7 +11,7 @@
 class cck_select_other_handler_filter extends views_handler_filter_in_operator {
 
   /**
-   * Init
+   * @inheritdoc
    */
   function init(&$view, &$options) {
     parent::init($view, $options);
@@ -19,21 +20,42 @@ class cck_select_other_handler_filter extends views_handler_filter_in_operator {
   }
 
   /**
-   * Exposed form
+   * @inheritdoc
    */
   function exposed_form(&$form, &$form_state) {
     parent::exposed_form($form, $form_state);
 
     $identifier = $this->options['expose']['identifier'];
 
-    // Populate other default value if any.
-    $otherdef = '';
-    $other_values = array_diff($this->value, $this->value_options);
-    if (!empty($other_values)) {
-      $otherdef = array_pop($other_values);
-      $form[$identifier]['select_other_list']['#default_value'][] = 'other';
+    if (!is_array($form_state['input'][$identifier])) {
+      // Form input is reduced to one value sometimes, and this causes issues
+      // with the array parents.
+      $form_state['input'][$identifier] = array(
+        'select_other_list' => $this->value,
+        'select_other_text_input' => '',
+      );
     }
 
+    // Add the javascript settings to the form element.
+    $settings = array(
+      $identifier => array(
+        'list_element' => str_replace('_', '-', 'edit-' . $identifier . '-select-other-list'),
+        'input_element' => str_replace('_', '-', 'edit-' . $identifier . '-select-other-text-input'),
+      ),
+    );
+    $form[$identifier]['#attached']['js'] = array(
+      array(
+       'data' => array('CCKSelectOther' => $settings),
+       'type' => 'setting',
+      ),
+      drupal_get_path('module', 'cck_select_other') . '/cck_select_other.js',
+    );
+
+    // Change element parents to use exposed identifier.
+    $form[$identifier]['#parents'] = array($identifier);
+    $form[$identifier]['select_other_list']['#parents'] = array($identifier, 'select_other_list');
+
+    // Add the select other text input element.
     $form[$identifier]['select_other_text_input'] = array(
       '#type' => 'textfield',
       '#title' => t('Other'),
@@ -41,47 +63,44 @@ class cck_select_other_handler_filter extends views_handler_filter_in_operator {
       '#attributes' => array(
         'class' => array('form-text select_other_text_input'),
       ),
-      '#default_value' => $otherdef,
-      '#parents' => array('options', 'value', 'select_other_text_input'),
+      '#parents' => array($identifier, 'select_other_text_input'),
       '#size' => 10,
     );
 
-    $form[$identifier]['#parents'] = array('options', $identifier);
-    $form[$identifier]['select_other_list']['#type'] = 'select';
+    // Only display multiple select list when explicitly required.
     $form[$identifier]['select_other_list']['#multiple'] = $this->options['expose']['multiple'];
-    $form[$identifier]['select_other_list']['#parents'] = array('options', $identifier, 'select_other_list');
-    $form[$identifier]['select_other_text_input']['#parents'] = array('options', $identifier, 'select_other_text_input');
 
     if (empty($form_state['exposed']) || empty($this->options['expose']['required'])) {
       // If we're configuring an exposed filter, add an <Any> option.
       $any_label = variable_get('views_exposed_filter_any_label', 'new_any') == 'old_any' ? '<Any>' : t('- Any -');
       $form[$identifier]['select_other_list']['#options'] = array('All' => $any_label) + $form[$identifier]['select_other_list']['#options'];
     }
-
-    $field_id = str_replace('_', '-', 'options-' . $identifier);
-    drupal_add_js(array('CCKSelectOther' => array(array('field_id' => $field_id))), array('type' => 'setting'));
   }
 
+  /**
+   * @inheritdoc
+   */
   function exposed_submit(&$form, &$form_state) {
     $identifier = $this->options['expose']['identifier'];
-    $values = $form_state['values']['options'][$identifier];
+    $values = $form_state['values'][$identifier];
     $form_state['values'][$identifier] = array();
+    $text_input = $values['select_other_text_input'];
 
     if (is_array($values['select_other_list'])) {
-      // Multiple values will be stored in an array.
-      foreach ($values['select_other_list'] as $key => $value) {
-        if ($value && $key == $value) {
-          if ($value <> 'other') {
-            $form_state['values'][$identifier][] = $value;
-          }
-          else {
-            // Set the other value instead of 'other'
-            $form_state['values'][$identifier][] = $values['select_other_text_input'];
-          }
+      // Reduce the values into a simple array.
+      $form_state['values'][$identifier] = array_reduce($values['select_other_list'], function(&$result, $item) use ($text_input) {
+        if ($item <> 'other') {
+          $result[] = $item;
         }
-      }
+        else {
+          $result[] = $text_input;
+        }
+
+        return $result;
+      });
     }
     else {
+      // Reduce into a single value.
       if ($values['select_other_list'] == 'other') {
         $form_state['values'][$identifier] = $values['select_other_text_input'];
       }
@@ -89,52 +108,46 @@ class cck_select_other_handler_filter extends views_handler_filter_in_operator {
         $form_state['values'][$identifier] = $values['select_other_list'];
       }
     }
-
   }
 
   /**
-   * Value form
+   * @inheritdoc
    */
   function value_form(&$form, &$form_state) {
-    static $js;
-
     parent::value_form($form, $form_state);
 
     $default = array();
-    foreach ($this->value as $key => $value) {
-      // Populate default values.
-      if (in_array($value, $this->value_options)) {
-        $default[] = $value;
-      }
-      else {
-        $default[] = 'other';
-      }
-    }
+    $value_keys = array_keys($this->value_options);
+
+    // Populate default values based on the value option keys.
+    $default = array_reduce($this->value, function(&$result, $item) use ($value_keys) {
+      $result[] = in_array($item, $value_keys) ? $item : 'other';
+      return $result;
+    });
 
     $options = $form['value']['#options'];
+    unset($form['value']['#options']);
+
     $form['value'] = array(
       '#type' => 'container',
       '#tree' => TRUE,
-      '#parents' => array('options', 'value'),
+      '#parents' => array('value'),
       'select_other_list' => array(
-        // @note I am using checkboxes instead of select in the filter.
-        '#type' => 'checkboxes',
+        '#type' => 'select',
         '#options' => $options,
+        '#multiple' => TRUE,
         '#default_value' => $default,
-        '#parents' => array('options', 'value', 'select_other_list'),
+        '#parents' => array('value', 'select_other_list'),
       ),
     );
-
-    if (!$js) {
-      drupal_add_js(drupal_get_path('module', 'cck_select_other') . '/cck_select_other.js');
-      $js = TRUE;
-    }
-    drupal_add_js(array('CCKSelectOther' => array(array('field_id' => 'options-value'))), array('type' => 'setting'));
   }
 
+  /**
+   * @inheritdoc
+   */
   function value_submit($form, &$form_state) {
     // Capture the values into a separate array and reset the value array.
-    $values = $form_state['values']['options']['value'];
+    $values = $form_state['values']['value'];
     $form_state['values']['options']['value'] = array();
 
     foreach ($values['select_other_list'] as $key => $value) {
@@ -144,6 +157,9 @@ class cck_select_other_handler_filter extends views_handler_filter_in_operator {
     }
   }
 
+  /**
+   * @inheritdoc
+   */
   function get_value_options() {
     $this->value_options = cck_select_other_options($this->instance);
 
@@ -151,19 +167,24 @@ class cck_select_other_handler_filter extends views_handler_filter_in_operator {
     unset($this->value_options['']);
     unset($this->value_options['_none']);
   }
-  
+
+  /**
+   * @inheritdoc
+   */
   function accept_exposed_input($input) {
     $ret = parent::accept_exposed_input($input);
     return $ret;
   }
 
+  /**
+   * @inheritdoc
+   */
   function admin_summary() {
     if (!empty($this->options['exposed'])) {
       return t('exposed');
     }
 
     $info = $this->operators();
-
     $this->get_value_options();
 
     if (!is_array($this->value)) {
@@ -188,22 +209,37 @@ class cck_select_other_handler_filter extends views_handler_filter_in_operator {
       $i++;
     }
 
-    return $operator . (($values !== '') ? ' (' . $values . ')' : '');
+    return $operator . (($values !== '') ? ' ' . $values : '');
   }
 
+  /**
+   * @inheritdoc
+   */
   function op_simple() {
-    if (empty($this->value)) {
+    if (empty($this->value) || in_array('All', $this->value)) {
+      // Do not query if no value selected or select all selected.
       return;
     }
 
-    if (in_array('other', $this->value)) {
+    if (!$this->is_exposed() && in_array('other', $this->value)) {
       // We need to reverse the operator and find the inverse.
       $this->ensure_my_table();
 
-      $values = array_diff($this->value_options, $this->value);
+      // views_handler::value_options is not set here anymore.
+      $value_options = cck_select_other_options($this->instance);
+
+      $values = array_diff($value_options, $this->value);
       $operator = ($this->operator == 'in') ? 'not in' : 'in';
       $this->query->add_where($this->options['group'], "$this->table_alias.$this->real_field", array_values($values), $operator);
     }
+    elseif ($this->is_exposed() && empty($this->value[0][0])) {
+      // Need to do something a bit different for exposed forms.
+      $this->ensure_my_table();
+
+      $value_options = cck_select_other_options($this->instance);
+      $operator = ($this->operator == 'in')  ? 'not in' : 'in';
+      $this->query->add_Where($this->options['group'], "$this->table_alias.$this->real_field", array_values($value_options), $operator);
+    }
     else {
       // Query as normal.
       parent::op_simple();
