diff --git a/editablefields.js b/editablefields.js
index 63486fd..81182a2 100755
--- a/editablefields.js
+++ b/editablefields.js
@@ -252,11 +252,19 @@ Drupal.editablefields.onchange = function(element) {
   else {
     // Send the field form for a 'editable' field.
     $.ajax({
+      dataType: 'json',
       type: "POST",
       url: Drupal.settings.editablefields.url_submit, 
       data: $(element).find('form').serialize() + "&nid=" + $(element).attr("nid") + "&field=" + $(element).attr("field")+ "&delta=" + $(element).attr("delta"),
       element: $(element),
       success: function(msg) {
+        // Call all callbacks.
+        if (msg.__callbacks) {
+          $.each(msg.__callbacks, function(i, callback) {
+            eval(callback)(element, msg);
+          });
+        }
+
         $(element).removeClass('editablefields_throbber');
 //        Drupal.editablefields.load(element);
         // Re-enable the widget
diff --git a/editablefields.module b/editablefields.module
index 42b5410..df840ae 100755
--- a/editablefields.module
+++ b/editablefields.module
@@ -326,7 +326,12 @@ function editablefields_submit() {
         }
       }
       // make sure sensible headers etc are sent...
-      drupal_set_header('Content-Type: text; charset=utf-8');
+      $object = new stdClass;
+      $object->__callbacks = array();
+      $object->nid = $node->nid;
+      // Allow other modules to extend the data returned.
+      drupal_alter('ajax_data', $object, 'editablefields', $html);
+      drupal_json($object);
     }
     else {
       drupal_set_header('HTTP/1.1 404 Not Found');
