Comments and derived bugfixes.
diff --git a/src/core/channel/channel_args.c b/src/core/channel/channel_args.c
index 4a18246..55b4cb6 100644
--- a/src/core/channel/channel_args.c
+++ b/src/core/channel/channel_args.c
@@ -148,44 +148,58 @@
   return grpc_channel_args_copy_and_add(a, &tmp, 1);
 }
 
-/** Returns the compression algorithm's enabled states bitset from \a a. If not
- * found, return a biset with all algorithms enabled */
-static gpr_uint32 find_compression_algorithm_states_bitset(
-    const grpc_channel_args *a) {
-  gpr_uint32 states_bitset = (1u << GRPC_COMPRESS_ALGORITHMS_COUNT) - 1;
+/** Returns 1 if the argument for compression algorithm's enabled states bitset
+ * was found in \a a, returning the arg's value in \a states. Otherwise, returns
+ * 0. */
+static int find_compression_algorithm_states_bitset(
+    const grpc_channel_args *a, int **states_arg) {
   if (a != NULL) {
     size_t i;
     for (i = 0; i < a->num_args; ++i) {
       if (a->args[i].type == GRPC_ARG_INTEGER &&
           !strcmp(GRPC_COMPRESSION_ALGORITHM_STATE_ARG, a->args[i].key)) {
-        states_bitset = a->args[i].value.integer;
-        break;
+        *states_arg = &a->args[i].value.integer;
+        return 1; /* GPR_TRUE */
       }
     }
   }
-  return states_bitset;
+  return 0; /* GPR_FALSE */
 }
 
 grpc_channel_args *grpc_channel_args_compression_algorithm_set_state(
     grpc_channel_args *a,
     grpc_compression_algorithm algorithm,
     int state) {
-  gpr_uint32 states_bitset = find_compression_algorithm_states_bitset(a);
-  grpc_arg tmp;
+  int *states_arg;
+  grpc_channel_args *result = a;
+  const int states_arg_found =
+      find_compression_algorithm_states_bitset(a, &states_arg);
 
-  if (state != 0) {
-    GPR_BITSET(&states_bitset, algorithm);
-  } else {
-    GPR_BITCLEAR(&states_bitset, algorithm);
+  if (!states_arg_found) {
+    /* create a new arg */
+    grpc_arg tmp;
+    tmp.type = GRPC_ARG_INTEGER;
+    tmp.key = GRPC_COMPRESSION_ALGORITHM_STATE_ARG;
+    states_arg = &tmp.value.integer;
+    result = grpc_channel_args_copy_and_add(a, &tmp, 1);
   }
 
-  tmp.type = GRPC_ARG_INTEGER;
-  tmp.key = GRPC_COMPRESSION_ALGORITHM_STATE_ARG;
-  tmp.value.integer = states_bitset;
-  return grpc_channel_args_copy_and_add(a, &tmp, 1);
+  /* update either the new arg's value or the already present one */
+  if (state != 0) {
+    GPR_BITSET(states_arg, algorithm);
+  } else {
+    GPR_BITCLEAR(states_arg, algorithm);
+  }
+
+  return result;
 }
 
 int grpc_channel_args_compression_algorithm_get_states(
     const grpc_channel_args *a) {
-  return find_compression_algorithm_states_bitset(a);
+  int *states_arg;
+  if (find_compression_algorithm_states_bitset(a, &states_arg)) {
+    return *states_arg;
+  } else {
+    return  (1u << GRPC_COMPRESS_ALGORITHMS_COUNT) - 1; /* All algs. enabled */
+  }
 }
diff --git a/src/core/channel/compress_filter.c b/src/core/channel/compress_filter.c
index 68060f9..0729b5c 100644
--- a/src/core/channel/compress_filter.c
+++ b/src/core/channel/compress_filter.c
@@ -306,6 +306,7 @@
   channel_data *channeld = elem->channel_data;
   grpc_compression_algorithm algo_idx;
   const char *supported_algorithms_names[GRPC_COMPRESS_ALGORITHMS_COUNT - 1];
+  size_t supported_algorithms_idx = 0;
   char *accept_encoding_str;
   size_t accept_encoding_str_len;
 
@@ -344,15 +345,15 @@
             GRPC_MDSTR_REF(channeld->mdstr_outgoing_compression_algorithm_key),
             grpc_mdstr_from_string(mdctx, algorithm_name, 0));
     if (algo_idx > 0) {
-      supported_algorithms_names[algo_idx - 1] = algorithm_name;
+      supported_algorithms_names[supported_algorithms_idx++] = algorithm_name;
     }
   }
 
   /* TODO(dgq): gpr_strjoin_sep could be made to work with statically allocated
    * arrays, as to avoid the heap allocs */
-  accept_encoding_str = gpr_strjoin_sep(
-      supported_algorithms_names, GPR_ARRAY_SIZE(supported_algorithms_names),
-      ", ", &accept_encoding_str_len);
+  accept_encoding_str =
+      gpr_strjoin_sep(supported_algorithms_names, supported_algorithms_idx,
+                      ", ", &accept_encoding_str_len);
 
   channeld->mdelem_accept_encoding = grpc_mdelem_from_metadata_strings(
       mdctx, GRPC_MDSTR_REF(channeld->mdstr_compression_capabilities_key),
diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc
index 3e9ba5c..eb2a984 100644
--- a/src/cpp/server/server.cc
+++ b/src/cpp/server/server.cc
@@ -187,21 +187,22 @@
 
 static grpc_server* CreateServer(
     int max_message_size, const grpc_compression_options& compression_options) {
+  grpc_arg args[2];
+  size_t args_idx = 0;
   if (max_message_size > 0) {
-    grpc_arg args[2];
-    args[0].type = GRPC_ARG_INTEGER;
-    args[0].key = const_cast<char*>(GRPC_ARG_MAX_MESSAGE_LENGTH);
-    args[0].value.integer = max_message_size;
-
-    args[1].type = GRPC_ARG_INTEGER;
-    args[1].key = const_cast<char*>(GRPC_COMPRESSION_ALGORITHM_STATE_ARG);
-    args[1].value.integer = compression_options.enabled_algorithms_bitset;
-
-    grpc_channel_args channel_args = {2, args};
-    return grpc_server_create(&channel_args, nullptr);
-  } else {
-    return grpc_server_create(nullptr, nullptr);
+    args[args_idx].type = GRPC_ARG_INTEGER;
+    args[args_idx].key = const_cast<char*>(GRPC_ARG_MAX_MESSAGE_LENGTH);
+    args[args_idx].value.integer = max_message_size;
+    args_idx++;
   }
+
+  args[args_idx].type = GRPC_ARG_INTEGER;
+  args[args_idx].key = const_cast<char*>(GRPC_COMPRESSION_ALGORITHM_STATE_ARG);
+  args[args_idx].value.integer = compression_options.enabled_algorithms_bitset;
+  args_idx++;
+
+  grpc_channel_args channel_args = {args_idx, args};
+  return grpc_server_create(&channel_args, nullptr);
 }
 
 Server::Server(ThreadPoolInterface* thread_pool, bool thread_pool_owned,