diff --git editablefields.module editablefields.module
index 7bd1a3e..8388b99 100755
--- editablefields.module
+++ editablefields.module
@@ -100,8 +100,15 @@ function editablefields_field_formatter_info() {
 function theme_editablefields_formatter_editable($element) {
   static $js_ready;
 
+  static $rendered_elements = array();
   $field_name = $element['#field_name'];
-  $field = content_fields($field_name);
+
+  if (isset($rendered_elements[$field_name])) {
+    return;
+  }
+  $rendered_elements[$field_name] = TRUE;
+
+  $field = content_fields($field_name, $element['#node']->type);
 
   $revision = !empty($element['#node']->vid) ? $element['#node']->vid : NULL;
   $node = node_load($element['#node']->nid, $revision);
@@ -185,7 +192,7 @@ function theme_editablefields_formatter_editable($element) {
       else {
         // $node seems to be incomplete, so we reload it
         $node = node_load($node->nid, $revision);
-        return $pre . drupal_get_form('editablefields_form', $node, $field_name, $delta) . $post;
+        return $pre . drupal_get_form('editablefields_form', $node, $field_name) . $post;
       }
     }
   }
@@ -214,8 +221,8 @@ function editablefields_forms() {
 /**
  * Form builder callback.
  */
-function editablefields_form_builder(&$form_state, $node, $field_name, $delta) {
-  $field = content_fields($field_name);
+function editablefields_form_builder(&$form_state, $node, $field_name, $delta = NULL) {
+  $field = content_fields($field_name, $node->type);
   $form = array('#node' => $node);
 //  $form_state = array('values' => array($field['field_name'] => $default_value));
   module_load_include('inc', 'content', 'includes/content.node_form');
@@ -347,8 +354,18 @@ function editablefields_submit() {
      * right value - I dislike this code - JMB */
     if (is_array($node->{$field_name})) {
       $field = content_fields($field_name, $node->type);
+      $field_widget_type = $field['widget']['type'];
+
+      reset($field['columns']);
+      $field_column_key = key($field['columns']);
 
       $items = &$form_state['values'][$field_name];
+      switch ($field['type']) {
+        case 'nodereference':
+        case 'userreference':
+          $items = array_pop($items);
+          break;
+      }
 
       if (empty($items)) {
         foreach (array_keys($field['columns']) as $column) {
@@ -360,31 +377,46 @@ function editablefields_submit() {
           }
         }
       }
-
-      if (isset($items['value'])) {
-        if (!($field['widget']['type'] == 'optionwidgets_buttons' && $field['multiple'])) {
-          $items = array($items);
-        }
-      }
-
-      // go through content_set_empty if this is NOT a checkbox multi valued element
-      if (!($field['widget']['type'] == 'optionwidgets_buttons' && $field['multiple'])) {
-        $items = content_set_empty($field, $items);
-      }
-
-      switch ($field['type']) {
-        case 'nodereference':
-        case 'userreference':
-          if ($field['multiple']) {
-            reset($field['columns']);
-            $items[key($field['columns'])] = array_pop($items);
+      $widgets_values_flipped = array('optionwidgets_select', 'nodereference_select', 'nodereference_autocomplete', 'userreference_select');
+
+      switch($field_widget_type) {
+        case 'nodereference_select':
+        case 'nodereference_buttons':
+        case 'optionwidgets_select':
+        case 'optionwidgets_buttons':
+          /**
+           * If $items['value'] is an array (checkboxes) $items will look like this:
+           *   $items = array(array('value' => array(
+           *     'selectedKey1' => 'Value 1'
+           *     'selectedKey2' => 'Value 2'
+           *   )));
+           * otherwise:
+           *   $items = array('value' => 'selectedKeyX');
+           */
+          $items_temp = array();
+          if (!is_array($items[$field_column_key])) {
+            $items_temp = array(array($field_column_key => $items[$field_column_key]));
+          }
+          else {
+            foreach($items[$field_column_key] as $key => $value) {
+
+              if ($field_widget_type == 'nodereference_autocomplete') {
+                $value = array('nid' => $value);
+              }
+              // if it's a select widget, our value is in $value
+              if (in_array($field_widget_type, $widgets_values_flipped)) {
+                $key = $value;
+              }
+              $items_temp[] = array($field_column_key => $key);
+            }
           }
+          $items = $items_temp;
           break;
       }
 
-      drupal_execute('editablefields_form', $form_state, $node, $field_name, $delta);
+      drupal_execute('editablefields_form', $form_state, $node, $field_name);
 
-      $err = drupal_get_messages();
+      $err = drupal_get_messages('error');
 
       if (count($err) > 0) {
         drupal_set_header('HTTP/1.1 404 Not Found');
@@ -397,19 +429,8 @@ function editablefields_submit() {
         exit();
       }
 
-      // the matrix field identifies itself as being multivalue, but in fact, it is not.
-      if ((content_handle('widget', 'multiple values', $field) == CONTENT_HANDLE_CORE) && ($field['type'] != matrix)) {
-        if ($node->{$field_name}[$delta] != $form_state['values'][$field_name][0]) {
-          $node->{$field_name}[$delta] = $form_state['values'][$field_name][0];
-          node_save($node);
-        }
-      }
-      else {
-        if ($node->{$field_name} != $form_state['values'][$field_name]) {
-          $node->{$field_name} = $form_state['values'][$field_name];
-          node_save($node);
-        }
-      }
+      $node->{$field_name} = $items;
+      node_save($node);
       // make sure sensible headers etc are sent...
       drupal_set_header('Content-Type: text; charset=utf-8');
     }
