diff --git a/include/grpc++/impl/codegen/call.h b/include/grpc++/impl/codegen/call.h
index aac78eddedbf607127c4702e4bfe9140cf8eb5e4..a9e5978b43bb2a7f32bf2b9fef75abb2a9057d97 100644
--- a/include/grpc++/impl/codegen/call.h
+++ b/include/grpc++/impl/codegen/call.h
@@ -190,7 +190,7 @@ class CallOpSendInitialMetadata {
     initial_metadata_count_ = metadata.size();
     initial_metadata_ = FillMetadataArray(metadata);
     // TODO(dgq): expose compression level in API so it can be properly set.
-    compression_level_ = GRPC_COMPRESS_LEVEL_NONE;
+    maybe_compression_level_.is_set = false;
   }
 
  protected:
@@ -202,9 +202,8 @@ class CallOpSendInitialMetadata {
     op->reserved = NULL;
     op->data.send_initial_metadata.count = initial_metadata_count_;
     op->data.send_initial_metadata.metadata = initial_metadata_;
-    op->data.send_initial_metadata.maybe_compression_level.is_set = true;
-    op->data.send_initial_metadata.maybe_compression_level.compression_level =
-        compression_level_;
+    memcpy(&op->data.send_initial_metadata.maybe_compression_level,
+           &maybe_compression_level_, sizeof(maybe_compression_level_));
   }
   void FinishOp(bool* status, int max_message_size) {
     if (!send_) return;
@@ -216,7 +215,10 @@ class CallOpSendInitialMetadata {
   uint32_t flags_;
   size_t initial_metadata_count_;
   grpc_metadata* initial_metadata_;
-  grpc_compression_level compression_level_;
+  struct {
+    bool is_set;
+    grpc_compression_level level;
+  } maybe_compression_level_;
 };
 
 class CallOpSendMessage {