         # cached search results.
         @request_finished()
         return
-    new (Ajax.Request)('/post.json',
-      parameters:
+
+    xhr = jQuery.ajax '/post.json',
+      data:
         tags: search
         api_version: 2
         filter: 1
         include_tags: 1
         include_votes: 1
         include_pools: 1
-      method: 'get'
-      onCreate: ((resp) ->
-        @current_ajax_requests.push resp.request
-        return
-      ).bind(this)
-      onComplete: ((resp) ->
-        @current_ajax_requests = @current_ajax_requests.without(resp.request)
-        @request_finished()
-        return
-      ).bind(this)
-      onSuccess: ((resp) ->
-        if @current_ajax_requests.indexOf(resp.request) == -1
-          return
-        resp = resp.responseJSON
-        @result.posts = resp.posts
-        Post.register_resp resp
-        @cached_posts.set search, @result.posts
-        return
-      ).bind(this)
-      onFailure: ((resp) ->
-        error = 'error ' + resp.status
-        if resp.responseJSON
-          error = resp.responseJSON.reason
-        notice 'Error loading posts: ' + error
-        @result.error = true
-        return
-      ).bind(this))
+      dataType: 'json'
+    .done (resp) =>
+      @result.posts = resp.posts
+      Post.register_resp resp
+      @cached_posts.set search, @result.posts
+    .fail (xhr, status) ->
+      error = resp.responseJSON?.reason ? "error #{status}"
+      notice "Error loading posts: #{error}"
+      @result.error = true
+    .always =>
+      @xhr.delete xhr
+      @request_finished()
+
+    @xhr.add xhr
+
     return
 
   request_finished: ->
-    if @current_ajax_requests.length
+    if @xhr.size > 0
       return
 
     # Event handlers for the events we fire below might make requests back to us.  Save and

    @loaded_extended_results = extending

    # Discard any running AJAX requests.
    @current_ajax_requests = []
    @result = {}
    @result.load_options = load_options
    @result.tags = tags
    @result.disable_cache = disable_cache
    if !@result.tags?

      # If no search is specified, don't run one; return empty results.
      @request_finished()
      return

    @load()
    return

  perform_search: (event) =>
    tags = event.memo.tags
    @last_seen_tags = tags
    results_mode = event.memo.results_mode or 'center-on-first'
