diff --git a/lib/js/thrift.js b/lib/js/thrift.js
index b8ca2c0..c7a46fd 100644
--- a/lib/js/thrift.js
+++ b/lib/js/thrift.js
@@ -56,7 +56,7 @@
         var length = 0;
         for (var k in obj) {
             if (obj.hasOwnProperty(k)) {
-              length++;
+                length++;
             }
         }
 
@@ -75,8 +75,8 @@
 Thrift.TException = {};
 Thrift.TException.prototype = {
     initialize: function(message, code) {
-            this.message = message;
-            this.code = (code === null) ? 0 : code;
+        this.message = message;
+        this.code = (code === null) ? 0 : code;
     }
 };
 
@@ -186,19 +186,16 @@
 
     //Gets the browser specific XmlHttpRequest Object
     getXmlHttpRequestObject: function() {
-
         try { return new XMLHttpRequest(); } catch (e1) { }
         try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch (e2) { }
         try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch (e3) { }
 
         throw "Your browser doesn't support the XmlHttpRequest object.";
-
     },
 
-    flush: function() {
-
+    flush: function(async) {
         //async mode
-        if (this.url === undefined || this.url === '') {
+        if (async || this.url === undefined || this.url === '') {
             return this.send_buf;
         }
 
@@ -225,6 +222,54 @@
         this.rpos = 0;
     },
 
+    jqRequest: function(client, postData, args, recv_method) {
+        if (typeof jQuery === 'undefined' ||
+            typeof jQuery.Deferred === 'undefined') {
+            throw 'Thrift.js requires jQuery 1.5+ to use asynchronous requests';
+        }
+
+        // Deferreds
+        var deferred = jQuery.Deferred();
+        var completeDfd = jQuery._Deferred();
+        var dfd = deferred.promise();
+        dfd.success = dfd.done;
+        dfd.error = dfd.fail;
+        dfd.complete = completeDfd.done;
+
+        var jqXHR = jQuery.ajax({
+            url: this.url,
+            data: postData,
+            type: 'POST',
+            cache: false,
+            dataType: 'text',
+            context: this,
+            success: this.jqResponse,
+            error: function(xhr, status, e) {
+                deferred.rejectWith(client, jQuery.merge([e], xhr.tArgs));
+            },
+            complete: function(xhr, status) {
+                completeDfd.resolveWith(client, [xhr, status]);
+            }
+        });
+
+        deferred.done(jQuery.makeArray(args).pop()); //pop callback from args
+        jqXHR.tArgs = args;
+        jqXHR.tClient = client;
+        jqXHR.tRecvFn = recv_method;
+        jqXHR.tDfd = deferred;
+        return dfd;
+    },
+
+    jqResponse: function(responseData, textStatus, jqXHR) {
+      this.setRecvBuffer(responseData);
+      try {
+          var value = jqXHR.tRecvFn.call(jqXHR.tClient);
+          jqXHR.tDfd.resolveWith(jqXHR, jQuery.merge([value], jqXHR.tArgs));
+      } catch (ex) {
+          jqXHR.tDfd.rejectWith(jqXHR, jQuery.merge([ex], jqXHR.tArgs));
+      }
+    },
+
     setRecvBuffer: function(buf) {
         this.recv_buf = buf;
         this.recv_buf_sz = this.recv_buf.length;
@@ -531,7 +576,11 @@
         this.rstack = [];
         this.rpos = [];
 
-        this.robj = eval(this.transport.readAll());
+        if (typeof jQuery !== 'undefined') {
+            this.robj = jQuery.parseJSON(this.transport.readAll());
+        } else {
+            this.robj = eval(this.transport.readAll());
+        }
 
         var r = {};
         var version = this.robj.shift();
@@ -551,7 +600,6 @@
         return r;
     },
 
-
     readMessageEnd: function() {
     },
 
@@ -617,7 +665,6 @@
         r.ftype = ftype;
         r.fid = fid;
 
-
         return r;
     },
 
@@ -632,7 +679,6 @@
     },
 
     readMapBegin: function(keyType, valType, size) {
-
         var map = this.rstack.pop();
 
         var r = {};
@@ -652,14 +698,12 @@
     },
 
     readListBegin: function(elemType, size) {
-
         var list = this.rstack[this.rstack.length - 1];
 
         var r = {};
         r.etype = Thrift.Protocol.RType[list.shift()];
         r.size = list.shift();
 
-
         this.rpos.push(this.rstack.length);
         this.rstack.push(list);
 
@@ -698,7 +742,6 @@
         return this.readI32();
     },
 
-
     readI32: function(f) {
         if (f === undefined) {
             f = this.rstack[this.rstack.length - 1];
@@ -753,5 +796,4 @@
     skip: function(type) {
         throw 'skip not supported yet';
     }
-
 };
