diff --git a/lib/csharp/src/Transport/THttpClient.cs b/lib/csharp/src/Transport/THttpClient.cs
index a56a3e8..e68d33d 100644
--- a/lib/csharp/src/Transport/THttpClient.cs
+++ b/lib/csharp/src/Transport/THttpClient.cs
@@ -26,6 +26,7 @@
 using System.Threading;
 using System.Linq;
 using System.Security.Cryptography.X509Certificates;
+using System.IO.Compression;
 
 namespace Thrift.Transport
 {
@@ -166,6 +167,7 @@
             try
             {
                 HttpWebRequest connection = CreateRequest();
+                connection.Headers.Add("Accept-Encoding", "gzip, deflate");
 
                 byte[] data = outputStream.ToArray();
                 connection.ContentLength = data.Length;
@@ -184,14 +186,29 @@
                             // Copy the response to a memory stream so that we can
                             // cleanly close the response and response stream.
                             inputStream = new MemoryStream();
-                            byte[] buffer = new byte[8096];
+                            byte[] buffer = new byte[8192];  // multiple of 4096
                             int bytesRead;
                             while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
                             {
-                                inputStream.Write (buffer, 0, bytesRead);
+                                inputStream.Write(buffer, 0, bytesRead);
                             }
                             inputStream.Seek(0, 0);
                         }
+
+                        foreach( var encoding in response.Headers.GetValues("Content-Encoding"))
+                        {
+                            switch(encoding)
+                            {
+                                case "gzip":
+                                    DecompressGZipped(ref inputStream);
+                                    break;
+                                case "deflate":
+                                    DecompressDeflated(ref inputStream);
+                                    break;
+                                default:
+                                    break;
+                            }
+                        }
                     }
                 }
             }
@@ -204,6 +221,30 @@
                 throw new TTransportException(TTransportException.ExceptionType.Unknown, "Couldn't connect to server: " + wx);
             }
         }
+
+        private void DecompressDeflated(ref Stream inputStream)
+        {
+            var tmp = new MemoryStream();
+            using (var decomp = new DeflateStream(inputStream, CompressionMode.Decompress))
+            {
+                decomp.CopyTo(tmp);
+            }
+            inputStream.Dispose();
+            inputStream = tmp;
+            inputStream.Seek(0, 0);
+        }
+
+        private void DecompressGZipped(ref Stream inputStream)
+        {
+            var tmp = new MemoryStream();
+            using (var decomp = new GZipStream(inputStream, CompressionMode.Decompress))
+            {
+                decomp.CopyTo(tmp);
+            }
+            inputStream.Dispose();
+            inputStream = tmp;
+            inputStream.Seek(0, 0);
+        }
 #endif
         private HttpWebRequest CreateRequest()
         {
