diff --git misc/ajax.js misc/ajax.js
index 6c1e239..30f50e7 100644
--- misc/ajax.js
+++ misc/ajax.js
@@ -540,19 +540,21 @@ Drupal.ajax.prototype.commands = {
    * Command to remove a chunk from the page.
    */
   remove: function (ajax, response, status) {
+    var wrapper = response.selector ? $(response.selector) : $(ajax.wrapper);
     var settings = response.settings || ajax.settings || Drupal.settings;
-    Drupal.detachBehaviors($(response.selector), settings);
-    $(response.selector).remove();
+    Drupal.detachBehaviors(wrapper, settings);
+    wrapper.remove();
   },
 
   /**
    * Command to mark a chunk changed.
    */
   changed: function (ajax, response, status) {
-    if (!$(response.selector).hasClass('ajax-changed')) {
-      $(response.selector).addClass('ajax-changed');
+    var wrapper = response.selector ? $(response.selector) : $(ajax.wrapper);
+    if (!wrapper.hasClass('ajax-changed')) {
+      wrapper.addClass('ajax-changed');
       if (response.asterisk) {
-        $(response.selector).find(response.asterisk).append(' <span class="ajax-changed">*</span> ');
+        wrapper.find(response.asterisk).append(' <span class="ajax-changed">*</span> ');
       }
     }
   },
@@ -568,7 +570,8 @@ Drupal.ajax.prototype.commands = {
    * Command to provide the jQuery css() function.
    */
   css: function (ajax, response, status) {
-    $(response.selector).css(response.argument);
+    var wrapper = response.selector ? $(response.selector) : $(ajax.wrapper);
+    wrapper.css(response.argument);
   },
 
   /**
@@ -587,14 +590,16 @@ Drupal.ajax.prototype.commands = {
    * Command to attach data using jQuery's data API.
    */
   data: function (ajax, response, status) {
-    $(response.selector).data(response.name, response.value);
+    var wrapper = response.selector ? $(response.selector) : $(ajax.wrapper);
+    wrapper.data(response.name, response.value);
   },
 
   /**
    * Command to apply a jQuery method.
    */
   invoke: function (ajax, response, status) {
-    var $element = $(response.selector);
+    var wrapper = response.selector ? $(response.selector) : $(ajax.wrapper);
+    var $element = wrapper;
     $element[response.method].apply($element, response.arguments);
   },
 
@@ -605,7 +610,8 @@ Drupal.ajax.prototype.commands = {
     // :even and :odd are reversed because jQuery counts from 0 and
     // we count from 1, so we're out of sync.
     // Match immediate children of the parent element to allow nesting.
-    $('> tbody > tr:visible, > tr:visible', $(response.selector))
+    var wrapper = response.selector ? $(response.selector) : $(ajax.wrapper);
+    $('> tbody > tr:visible, > tr:visible', wrapper)
       .removeClass('odd even')
       .filter(':even').addClass('odd').end()
       .filter(':odd').addClass('even');

