diff --git a/editablefields.js b/editablefields.js
index aa45902..2f453bf 100755
--- a/editablefields.js
+++ b/editablefields.js
@@ -218,11 +218,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');
         // Re-enable the widget.
         $(".messages.error").hide(1000, function() {
diff --git a/editablefields.module b/editablefields.module
index edf3987..73e2163 100755
--- a/editablefields.module
+++ b/editablefields.module
@@ -362,7 +362,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');
