wip
diff --git a/test/cpp/interop/interop_client.cc b/test/cpp/interop/interop_client.cc
index f08f90b..9803102 100644
--- a/test/cpp/interop/interop_client.cc
+++ b/test/cpp/interop/interop_client.cc
@@ -93,6 +93,15 @@
   std::unique_ptr<TestService::Stub> stub(TestService::NewStub(channel_));
 
   ClientContext context;
+  // XXX: add UNCOMPRESSABLE to the mix
+  //
+  // XXX: 1) set request.response_compression to all the diff available
+  // compression values. We can't check the compression method used at the
+  // application level, but if something is wrong, two different implementations
+  // of gRPC (java vs c) won't be able to communicate.
+  //
+  // 2) for UNCOMPRESSABLE, verify that the response can be whatever, most
+  // likely uncompressed
   request->set_response_type(PayloadType::COMPRESSABLE);
   request->set_response_size(kLargeResponseSize);
   grpc::string payload(kLargeRequestSize, '\0');
@@ -157,6 +166,7 @@
 void InteropClient::DoLargeUnary() {
   gpr_log(GPR_INFO, "Sending a large unary rpc...");
   SimpleRequest request;
+  request.set_response_compression(grpc::testing::GZIP);
   SimpleResponse response;
   PerformLargeUnary(&request, &response);
   gpr_log(GPR_INFO, "Large unary done.");
diff --git a/test/cpp/interop/server.cc b/test/cpp/interop/server.cc
index 22b8910..91954aa 100644
--- a/test/cpp/interop/server.cc
+++ b/test/cpp/interop/server.cc
@@ -80,16 +80,32 @@
 
 bool SetPayload(PayloadType type, int size, Payload* payload) {
   PayloadType response_type = type;
-  // TODO(yangg): Support UNCOMPRESSABLE payload.
-  if (type != PayloadType::COMPRESSABLE) {
-    return false;
-  }
   payload->set_type(response_type);
   std::unique_ptr<char[]> body(new char[size]());
   payload->set_body(body.get(), size);
   return true;
 }
 
+template <typename RequestType>
+void SetResponseCompression(ServerContext* context,
+                            const RequestType& request) {
+  if (request.has_response_compression()) {
+    switch (request.response_compression()) {
+      case grpc::testing::NONE:
+        context->set_compression_algorithm(GRPC_COMPRESS_NONE);
+        break;
+      case grpc::testing::GZIP:
+        context->set_compression_algorithm(GRPC_COMPRESS_GZIP);
+        break;
+      case grpc::testing::DEFLATE:
+        context->set_compression_algorithm(GRPC_COMPRESS_DEFLATE);
+        break;
+    }
+  } else {
+    context->set_compression_algorithm(GRPC_COMPRESS_NONE);
+  }
+}
+
 class TestServiceImpl : public TestService::Service {
  public:
   Status EmptyCall(ServerContext* context, const grpc::testing::Empty* request,
@@ -99,6 +115,7 @@
 
   Status UnaryCall(ServerContext* context, const SimpleRequest* request,
                    SimpleResponse* response) {
+    SetResponseCompression(context, *request);
     if (request->has_response_size() && request->response_size() > 0) {
       if (!SetPayload(request->response_type(), request->response_size(),
                       response->mutable_payload())) {
@@ -111,6 +128,7 @@
   Status StreamingOutputCall(
       ServerContext* context, const StreamingOutputCallRequest* request,
       ServerWriter<StreamingOutputCallResponse>* writer) {
+    SetResponseCompression(context, *request);
     StreamingOutputCallResponse response;
     bool write_success = true;
     response.mutable_payload()->set_type(request->response_type());
@@ -149,6 +167,7 @@
     StreamingOutputCallResponse response;
     bool write_success = true;
     while (write_success && stream->Read(&request)) {
+      SetResponseCompression(context, request);
       response.mutable_payload()->set_type(request.payload().type());
       if (request.response_parameters_size() == 0) {
         return Status(grpc::StatusCode::INTERNAL,
diff --git a/test/cpp/interop/server_helper.cc b/test/cpp/interop/server_helper.cc
index 0f8b89c..58017ba 100644
--- a/test/cpp/interop/server_helper.cc
+++ b/test/cpp/interop/server_helper.cc
@@ -36,10 +36,12 @@
 #include <memory>
 
 #include <gflags/gflags.h>
-#include "test/core/end2end/data/ssl_test_data.h"
 #include <grpc++/config.h>
 #include <grpc++/server_credentials.h>
 
+#include "src/core/surface/call.h"
+#include "test/core/end2end/data/ssl_test_data.h"
+
 DECLARE_bool(enable_ssl);
 
 namespace grpc {
@@ -62,5 +64,9 @@
     const ::grpc::ServerContext& context)
     : context_(context) {}
 
+grpc_compression_algorithm
+InteropContextInspector::GetCallCompressionAlgorithm() const {
+  return grpc_call_get_compression_algorithm(context_.call_);
+}
 }  // namespace testing
 }  // namespace grpc
diff --git a/test/cpp/interop/server_helper.h b/test/cpp/interop/server_helper.h
index d738d05..006a0e3 100644
--- a/test/cpp/interop/server_helper.h
+++ b/test/cpp/interop/server_helper.h
@@ -36,6 +36,7 @@
 
 #include <memory>
 
+#include <grpc/compression.h>
 #include <grpc++/server_context.h>
 #include <grpc++/server_credentials.h>
 
@@ -49,6 +50,7 @@
   InteropContextInspector(const ::grpc::ServerContext& context);
 
   // Inspector methods, able to peek inside ServerContext go here.
+  grpc_compression_algorithm GetCallCompressionAlgorithm() const;
 
  private:
   const ::grpc::ServerContext& context_;