Revert "Move a bunch of slice typed metadata to new system (#28107)" (#28208)

This reverts commit 4d432aefc1a785e5f82ad78737376631748c9ec9.
diff --git a/BUILD b/BUILD
index 2c54275..cecfdba 100644
--- a/BUILD
+++ b/BUILD
@@ -1854,7 +1854,6 @@
         "src/core/lib/transport/error_utils.cc",
         "src/core/lib/transport/metadata.cc",
         "src/core/lib/transport/metadata_batch.cc",
-        "src/core/lib/transport/parsed_metadata.cc",
         "src/core/lib/transport/pid_controller.cc",
         "src/core/lib/transport/static_metadata.cc",
         "src/core/lib/transport/status_conversion.cc",
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4509a03..7353466 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2054,7 +2054,6 @@
   src/core/lib/transport/error_utils.cc
   src/core/lib/transport/metadata.cc
   src/core/lib/transport/metadata_batch.cc
-  src/core/lib/transport/parsed_metadata.cc
   src/core/lib/transport/pid_controller.cc
   src/core/lib/transport/static_metadata.cc
   src/core/lib/transport/status_conversion.cc
@@ -2644,7 +2643,6 @@
   src/core/lib/transport/error_utils.cc
   src/core/lib/transport/metadata.cc
   src/core/lib/transport/metadata_batch.cc
-  src/core/lib/transport/parsed_metadata.cc
   src/core/lib/transport/pid_controller.cc
   src/core/lib/transport/static_metadata.cc
   src/core/lib/transport/status_conversion.cc
diff --git a/Makefile b/Makefile
index b3d9f6e..2523b8c 100644
--- a/Makefile
+++ b/Makefile
@@ -1589,7 +1589,6 @@
     src/core/lib/transport/error_utils.cc \
     src/core/lib/transport/metadata.cc \
     src/core/lib/transport/metadata_batch.cc \
-    src/core/lib/transport/parsed_metadata.cc \
     src/core/lib/transport/pid_controller.cc \
     src/core/lib/transport/static_metadata.cc \
     src/core/lib/transport/status_conversion.cc \
@@ -2027,7 +2026,6 @@
     src/core/lib/transport/error_utils.cc \
     src/core/lib/transport/metadata.cc \
     src/core/lib/transport/metadata_batch.cc \
-    src/core/lib/transport/parsed_metadata.cc \
     src/core/lib/transport/pid_controller.cc \
     src/core/lib/transport/static_metadata.cc \
     src/core/lib/transport/status_conversion.cc \
diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml
index 56c9a93..f3f968a 100644
--- a/build_autogenerated.yaml
+++ b/build_autogenerated.yaml
@@ -1527,7 +1527,6 @@
   - src/core/lib/transport/error_utils.cc
   - src/core/lib/transport/metadata.cc
   - src/core/lib/transport/metadata_batch.cc
-  - src/core/lib/transport/parsed_metadata.cc
   - src/core/lib/transport/pid_controller.cc
   - src/core/lib/transport/static_metadata.cc
   - src/core/lib/transport/status_conversion.cc
@@ -2269,7 +2268,6 @@
   - src/core/lib/transport/error_utils.cc
   - src/core/lib/transport/metadata.cc
   - src/core/lib/transport/metadata_batch.cc
-  - src/core/lib/transport/parsed_metadata.cc
   - src/core/lib/transport/pid_controller.cc
   - src/core/lib/transport/static_metadata.cc
   - src/core/lib/transport/status_conversion.cc
diff --git a/config.m4 b/config.m4
index 1b3e6d8..9ed147c 100644
--- a/config.m4
+++ b/config.m4
@@ -642,7 +642,6 @@
     src/core/lib/transport/error_utils.cc \
     src/core/lib/transport/metadata.cc \
     src/core/lib/transport/metadata_batch.cc \
-    src/core/lib/transport/parsed_metadata.cc \
     src/core/lib/transport/pid_controller.cc \
     src/core/lib/transport/static_metadata.cc \
     src/core/lib/transport/status_conversion.cc \
diff --git a/config.w32 b/config.w32
index b1c51f9..328f654 100644
--- a/config.w32
+++ b/config.w32
@@ -608,7 +608,6 @@
     "src\\core\\lib\\transport\\error_utils.cc " +
     "src\\core\\lib\\transport\\metadata.cc " +
     "src\\core\\lib\\transport\\metadata_batch.cc " +
-    "src\\core\\lib\\transport\\parsed_metadata.cc " +
     "src\\core\\lib\\transport\\pid_controller.cc " +
     "src\\core\\lib\\transport\\static_metadata.cc " +
     "src\\core\\lib\\transport\\status_conversion.cc " +
diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec
index e97bccc..2bf1af9 100644
--- a/gRPC-Core.podspec
+++ b/gRPC-Core.podspec
@@ -1345,7 +1345,6 @@
                       'src/core/lib/transport/metadata.h',
                       'src/core/lib/transport/metadata_batch.cc',
                       'src/core/lib/transport/metadata_batch.h',
-                      'src/core/lib/transport/parsed_metadata.cc',
                       'src/core/lib/transport/parsed_metadata.h',
                       'src/core/lib/transport/pid_controller.cc',
                       'src/core/lib/transport/pid_controller.h',
diff --git a/grpc.gemspec b/grpc.gemspec
index 3afdc4b..6c28818 100644
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -1265,7 +1265,6 @@
   s.files += %w( src/core/lib/transport/metadata.h )
   s.files += %w( src/core/lib/transport/metadata_batch.cc )
   s.files += %w( src/core/lib/transport/metadata_batch.h )
-  s.files += %w( src/core/lib/transport/parsed_metadata.cc )
   s.files += %w( src/core/lib/transport/parsed_metadata.h )
   s.files += %w( src/core/lib/transport/pid_controller.cc )
   s.files += %w( src/core/lib/transport/pid_controller.h )
diff --git a/grpc.gyp b/grpc.gyp
index adc85f4..3a706eb 100644
--- a/grpc.gyp
+++ b/grpc.gyp
@@ -1030,7 +1030,6 @@
         'src/core/lib/transport/error_utils.cc',
         'src/core/lib/transport/metadata.cc',
         'src/core/lib/transport/metadata_batch.cc',
-        'src/core/lib/transport/parsed_metadata.cc',
         'src/core/lib/transport/pid_controller.cc',
         'src/core/lib/transport/static_metadata.cc',
         'src/core/lib/transport/status_conversion.cc',
@@ -1440,7 +1439,6 @@
         'src/core/lib/transport/error_utils.cc',
         'src/core/lib/transport/metadata.cc',
         'src/core/lib/transport/metadata_batch.cc',
-        'src/core/lib/transport/parsed_metadata.cc',
         'src/core/lib/transport/pid_controller.cc',
         'src/core/lib/transport/static_metadata.cc',
         'src/core/lib/transport/status_conversion.cc',
diff --git a/package.xml b/package.xml
index 94b6406..accda42 100644
--- a/package.xml
+++ b/package.xml
@@ -1245,7 +1245,6 @@
     <file baseinstalldir="/" name="src/core/lib/transport/metadata.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/transport/metadata_batch.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/transport/metadata_batch.h" role="src" />
-    <file baseinstalldir="/" name="src/core/lib/transport/parsed_metadata.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/transport/parsed_metadata.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/transport/pid_controller.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/transport/pid_controller.h" role="src" />
diff --git a/src/core/ext/filters/client_channel/backend_metric.cc b/src/core/ext/filters/client_channel/backend_metric.cc
index 0545e0e..fb6c2f7 100644
--- a/src/core/ext/filters/client_channel/backend_metric.cc
+++ b/src/core/ext/filters/client_channel/backend_metric.cc
@@ -49,11 +49,12 @@
 }  // namespace
 
 const LoadBalancingPolicy::BackendMetricAccessor::BackendMetricData*
-ParseBackendMetricData(const Slice& serialized_load_report, Arena* arena) {
+ParseBackendMetricData(const grpc_slice& serialized_load_report, Arena* arena) {
   upb::Arena upb_arena;
   xds_data_orca_v3_OrcaLoadReport* msg = xds_data_orca_v3_OrcaLoadReport_parse(
-      reinterpret_cast<const char*>(serialized_load_report.begin()),
-      serialized_load_report.size(), upb_arena.ptr());
+      reinterpret_cast<const char*>(
+          GRPC_SLICE_START_PTR(serialized_load_report)),
+      GRPC_SLICE_LENGTH(serialized_load_report), upb_arena.ptr());
   if (msg == nullptr) return nullptr;
   auto* backend_metric_data = arena->New<
       LoadBalancingPolicy::BackendMetricAccessor::BackendMetricData>();
diff --git a/src/core/ext/filters/client_channel/backend_metric.h b/src/core/ext/filters/client_channel/backend_metric.h
index 64f8ef6..47fb1e2 100644
--- a/src/core/ext/filters/client_channel/backend_metric.h
+++ b/src/core/ext/filters/client_channel/backend_metric.h
@@ -23,14 +23,13 @@
 
 #include "src/core/ext/filters/client_channel/lb_policy.h"
 #include "src/core/lib/gprpp/arena.h"
-#include "src/core/lib/slice/slice.h"
 
 namespace grpc_core {
 
 // Parses the serialized load report and allocates a BackendMetricData
 // object on the arena.
 const LoadBalancingPolicy::BackendMetricAccessor::BackendMetricData*
-ParseBackendMetricData(const Slice& serialized_load_report, Arena* arena);
+ParseBackendMetricData(const grpc_slice& serialized_load_report, Arena* arena);
 
 }  // namespace grpc_core
 
diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc
index 755b0b9..30707e0 100644
--- a/src/core/ext/filters/client_channel/client_channel.cc
+++ b/src/core/ext/filters/client_channel/client_channel.cc
@@ -2506,10 +2506,11 @@
 
   const BackendMetricData* GetBackendMetricData() override {
     if (lb_call_->backend_metric_data_ == nullptr) {
-      if (const auto* md = lb_call_->recv_trailing_metadata_->get_pointer(
-              XEndpointLoadMetricsBinMetadata())) {
+      grpc_linked_mdelem* md = lb_call_->recv_trailing_metadata_->legacy_index()
+                                   ->named.x_endpoint_load_metrics_bin;
+      if (md != nullptr) {
         lb_call_->backend_metric_data_ =
-            ParseBackendMetricData(*md, lb_call_->arena_);
+            ParseBackendMetricData(GRPC_MDVALUE(md->md), lb_call_->arena_);
       }
     }
     return lb_call_->backend_metric_data_;
@@ -2876,15 +2877,14 @@
       status = absl::Status(static_cast<absl::StatusCode>(code), message);
     } else {
       // Get status from headers.
-      const auto& md = *self->recv_trailing_metadata_;
-      const auto& fields = md.legacy_index()->named;
+      const auto& fields = self->recv_trailing_metadata_->legacy_index()->named;
       GPR_ASSERT(fields.grpc_status != nullptr);
       grpc_status_code code =
           grpc_get_status_code_from_metadata(fields.grpc_status->md);
       if (code != GRPC_STATUS_OK) {
         absl::string_view message;
-        if (const auto* grpc_message = md.get_pointer(GrpcMessageMetadata())) {
-          message = grpc_message->as_string_view();
+        if (fields.grpc_message != nullptr) {
+          message = StringViewFromSlice(GRPC_MDVALUE(fields.grpc_message->md));
         }
         status = absl::Status(static_cast<absl::StatusCode>(code), message);
       }
diff --git a/src/core/ext/filters/http/client/http_client_filter.cc b/src/core/ext/filters/http/client/http_client_filter.cc
index 84a9f2e..37fb8f1 100644
--- a/src/core/ext/filters/http/client/http_client_filter.cc
+++ b/src/core/ext/filters/http/client/http_client_filter.cc
@@ -138,10 +138,17 @@
     }
   }
 
-  if (grpc_core::Slice* grpc_message =
-          b->get_pointer(grpc_core::GrpcMessageMetadata())) {
-    *grpc_message =
-        grpc_core::PermissivePercentDecodeSlice(std::move(*grpc_message));
+  if (b->legacy_index()->named.grpc_message != nullptr) {
+    grpc_slice pct_decoded_msg = grpc_core::PermissivePercentDecodeSlice(
+        GRPC_MDVALUE(b->legacy_index()->named.grpc_message->md));
+    if (grpc_slice_is_equivalent(
+            pct_decoded_msg,
+            GRPC_MDVALUE(b->legacy_index()->named.grpc_message->md))) {
+      grpc_slice_unref_internal(pct_decoded_msg);
+    } else {
+      grpc_metadata_batch_set_value(b->legacy_index()->named.grpc_message,
+                                    pct_decoded_msg);
+    }
   }
 
   if (b->legacy_index()->named.content_type != nullptr) {
diff --git a/src/core/ext/filters/http/server/http_server_filter.cc b/src/core/ext/filters/http/server/http_server_filter.cc
index 2c63fe4..abf6d19 100644
--- a/src/core/ext/filters/http/server/http_server_filter.cc
+++ b/src/core/ext/filters/http/server/http_server_filter.cc
@@ -104,10 +104,18 @@
 }  // namespace
 
 static grpc_error_handle hs_filter_outgoing_metadata(grpc_metadata_batch* b) {
-  if (grpc_core::Slice* grpc_message =
-          b->get_pointer(grpc_core::GrpcMessageMetadata())) {
-    *grpc_message = grpc_core::PercentEncodeSlice(
-        std::move(*grpc_message), grpc_core::PercentEncodingType::Compatible);
+  if (b->legacy_index()->named.grpc_message != nullptr) {
+    grpc_slice pct_encoded_msg = grpc_core::PercentEncodeSlice(
+        GRPC_MDVALUE(b->legacy_index()->named.grpc_message->md),
+        grpc_core::PercentEncodingType::Compatible);
+    if (grpc_slice_is_equivalent(
+            pct_encoded_msg,
+            GRPC_MDVALUE(b->legacy_index()->named.grpc_message->md))) {
+      grpc_slice_unref_internal(pct_encoded_msg);
+    } else {
+      grpc_metadata_batch_set_value(b->legacy_index()->named.grpc_message,
+                                    pct_encoded_msg);
+    }
   }
   return GRPC_ERROR_NONE;
 }
@@ -298,11 +306,19 @@
     }
   }
 
-  if (b->legacy_index()->named.authority == nullptr) {
-    absl::optional<grpc_core::Slice> host = b->Take(grpc_core::HostMetadata());
-    if (host.has_value()) {
-      b->Append(":authority", std::move(*host));
-    }
+  if (b->legacy_index()->named.host != nullptr &&
+      b->legacy_index()->named.authority == nullptr) {
+    grpc_linked_mdelem* el = b->legacy_index()->named.host;
+    grpc_mdelem md = GRPC_MDELEM_REF(el->md);
+    b->Remove(el);
+    hs_add_error(
+        error_name, &error,
+        grpc_metadata_batch_add_head(
+            b, el,
+            grpc_mdelem_from_slices(GRPC_MDSTR_AUTHORITY,
+                                    grpc_slice_ref_internal(GRPC_MDVALUE(md))),
+            GRPC_BATCH_AUTHORITY));
+    GRPC_MDELEM_UNREF(md);
   }
 
   if (b->legacy_index()->named.authority == nullptr) {
diff --git a/src/core/ext/transport/binder/transport/binder_transport.cc b/src/core/ext/transport/binder/transport/binder_transport.cc
index f90d9ae..1d0f94e 100644
--- a/src/core/ext/transport/binder/transport/binder_transport.cc
+++ b/src/core/ext/transport/binder/transport/binder_transport.cc
@@ -319,52 +319,6 @@
   GRPC_BINDER_STREAM_UNREF(gbs, "recv_trailing_metadata");
 }
 
-namespace grpc_binder {
-namespace {
-
-class MetadataEncoder {
- public:
-  MetadataEncoder(bool is_client, Transaction* tx, Metadata* init_md)
-      : is_client_(is_client), tx_(tx), init_md_(init_md) {}
-
-  void Encode(grpc_mdelem md) {
-    absl::string_view key = grpc_core::StringViewFromSlice(GRPC_MDKEY(md));
-    absl::string_view value = grpc_core::StringViewFromSlice(GRPC_MDVALUE(md));
-    gpr_log(GPR_INFO, "send metadata key-value %s",
-            absl::StrCat(key, " ", value).c_str());
-    if (grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDSTR_PATH)) {
-      // TODO(b/192208403): Figure out if it is correct to simply drop '/'
-      // prefix and treat it as rpc method name
-      GPR_ASSERT(value[0] == '/');
-      std::string path = std::string(value).substr(1);
-
-      // Only client send method ref.
-      GPR_ASSERT(is_client_);
-      tx_->SetMethodRef(path);
-    } else if (grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_STATUS)) {
-      int status = grpc_get_status_code_from_metadata(md);
-      gpr_log(GPR_INFO, "send trailing metadata status = %d", status);
-      tx_->SetStatus(status);
-    } else {
-      init_md_->emplace_back(std::string(key), std::string(value));
-    }
-  }
-
-  template <typename Trait>
-  void Encode(Trait, const typename Trait::ValueType& value) {
-    init_md_->emplace_back(std::string(Trait::key()),
-                           std::string(Trait::Encode(value).as_string_view()));
-  }
-
- private:
-  const bool is_client_;
-  Transaction* const tx_;
-  Metadata* const init_md_;
-};
-
-}  // namespace
-}  // namespace grpc_binder
-
 static void perform_stream_op_locked(void* stream_op,
                                      grpc_error_handle /*error*/) {
   grpc_transport_stream_op_batch* op =
@@ -432,8 +386,25 @@
     grpc_binder::Metadata init_md;
     auto batch = op->payload->send_initial_metadata.send_initial_metadata;
 
-    grpc_binder::MetadataEncoder encoder(gbt->is_client, &tx, &init_md);
-    batch->Encode(&encoder);
+    batch->ForEach([&](grpc_mdelem md) {
+      absl::string_view key = grpc_core::StringViewFromSlice(GRPC_MDKEY(md));
+      absl::string_view value =
+          grpc_core::StringViewFromSlice(GRPC_MDVALUE(md));
+      gpr_log(GPR_INFO, "send initial metatday key-value %s",
+              absl::StrCat(key, " ", value).c_str());
+      if (grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDSTR_PATH)) {
+        // TODO(b/192208403): Figure out if it is correct to simply drop '/'
+        // prefix and treat it as rpc method name
+        GPR_ASSERT(value[0] == '/');
+        std::string path = std::string(value).substr(1);
+
+        // Only client send method ref.
+        GPR_ASSERT(gbt->is_client);
+        tx.SetMethodRef(path);
+      } else {
+        init_md.emplace_back(std::string(key), std::string(value));
+      }
+    });
     tx.SetPrefix(init_md);
   }
   if (op->send_message) {
@@ -467,10 +438,23 @@
     auto batch = op->payload->send_trailing_metadata.send_trailing_metadata;
     grpc_binder::Metadata trailing_metadata;
 
-    grpc_binder::MetadataEncoder encoder(gbt->is_client, &tx,
-                                         &trailing_metadata);
-    batch->Encode(&encoder);
+    batch->ForEach([&](grpc_mdelem md) {
+      // Client will not send trailing metadata.
+      GPR_ASSERT(!gbt->is_client);
 
+      if (grpc_slice_eq(GRPC_MDKEY(md), GRPC_MDSTR_GRPC_STATUS)) {
+        int status = grpc_get_status_code_from_metadata(md);
+        gpr_log(GPR_INFO, "send trailing metadata status = %d", status);
+        tx.SetStatus(status);
+      } else {
+        absl::string_view key = grpc_core::StringViewFromSlice(GRPC_MDKEY(md));
+        absl::string_view value =
+            grpc_core::StringViewFromSlice(GRPC_MDVALUE(md));
+        gpr_log(GPR_INFO, "send trailing metatday key-value %s",
+                absl::StrCat(key, " ", value).c_str());
+        trailing_metadata.emplace_back(std::string(key), std::string(value));
+      }
+    });
     // TODO(mingcl): Will we ever has key-value pair here? According to
     // wireformat client suffix data is always empty.
     tx.SetSuffix(trailing_metadata);
diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc
index 52c7f07..f3967bf 100644
--- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc
+++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc
@@ -2118,9 +2118,10 @@
                           GRPC_MDSTR_GRPC_STATUS,
                           grpc_core::UnmanagedMemorySlice(status_string)));
     if (!message.empty()) {
-      s->trailing_metadata_buffer.Set(
-          grpc_core::GrpcMessageMetadata(),
-          grpc_core::Slice::FromCopiedBuffer(message));
+      grpc_slice message_slice = grpc_slice_from_cpp_string(std::move(message));
+      GRPC_LOG_IF_ERROR("add_status_message",
+                        s->trailing_metadata_buffer.ReplaceOrAppend(
+                            GRPC_MDSTR_GRPC_MESSAGE, message_slice));
     }
     s->published_metadata[1] = GRPC_METADATA_SYNTHESIZED_FROM_FAKE;
     grpc_chttp2_maybe_complete_recv_trailing_metadata(t, s);
diff --git a/src/core/ext/transport/chttp2/transport/hpack_encoder.cc b/src/core/ext/transport/chttp2/transport/hpack_encoder.cc
index f7e740b..d70a30c 100644
--- a/src/core/ext/transport/chttp2/transport/hpack_encoder.cc
+++ b/src/core/ext/transport/chttp2/transport/hpack_encoder.cc
@@ -265,32 +265,6 @@
   VarintWriter<1> len_val_;
 };
 
-class BinaryStringValue {
- public:
-  explicit BinaryStringValue(const grpc_slice& value,
-                             bool use_true_binary_metadata)
-      : wire_value_(GetWireValue(value, use_true_binary_metadata, true)),
-        len_val_(wire_value_.length) {}
-
-  size_t prefix_length() const {
-    return len_val_.length() +
-           (wire_value_.insert_null_before_wire_value ? 1 : 0);
-  }
-
-  void WritePrefix(uint8_t* prefix_data) {
-    len_val_.Write(wire_value_.huffman_prefix, prefix_data);
-    if (wire_value_.insert_null_before_wire_value) {
-      prefix_data[len_val_.length()] = 0;
-    }
-  }
-
-  const grpc_slice& data() { return wire_value_.data; }
-
- private:
-  WireValue wire_value_;
-  VarintWriter<1> len_val_;
-};
-
 class NonBinaryStringValue {
  public:
   explicit NonBinaryStringValue(const grpc_slice& value)
@@ -382,30 +356,6 @@
   Add(emit.data());
 }
 
-void HPackCompressor::Framer::EmitLitHdrWithBinaryStringKeyNotIdx(
-    const grpc_slice& key_slice, const grpc_slice& value_slice) {
-  GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX_V();
-  GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
-  StringKey key(key_slice);
-  key.WritePrefix(0x00, AddTiny(key.prefix_length()));
-  Add(grpc_slice_ref_internal(key.key()));
-  BinaryStringValue emit(value_slice, use_true_binary_metadata_);
-  emit.WritePrefix(AddTiny(emit.prefix_length()));
-  Add(emit.data());
-}
-
-void HPackCompressor::Framer::EmitLitHdrWithNonBinaryStringKeyNotIdx(
-    const grpc_slice& key_slice, const grpc_slice& value_slice) {
-  GRPC_STATS_INC_HPACK_SEND_LITHDR_NOTIDX_V();
-  GRPC_STATS_INC_HPACK_SEND_UNCOMPRESSED();
-  StringKey key(key_slice);
-  key.WritePrefix(0x00, AddTiny(key.prefix_length()));
-  Add(grpc_slice_ref_internal(key.key()));
-  NonBinaryStringValue emit(value_slice);
-  emit.WritePrefix(AddTiny(emit.prefix_length()));
-  Add(grpc_slice_ref_internal(emit.data()));
-}
-
 void HPackCompressor::Framer::AdvertiseTableSizeChange() {
   VarintWriter<3> w(compressor_->table_.max_size());
   w.Write(0x20, AddTiny(w.length()));
diff --git a/src/core/ext/transport/chttp2/transport/hpack_encoder.h b/src/core/ext/transport/chttp2/transport/hpack_encoder.h
index 9335520..0702a39 100644
--- a/src/core/ext/transport/chttp2/transport/hpack_encoder.h
+++ b/src/core/ext/transport/chttp2/transport/hpack_encoder.h
@@ -120,24 +120,6 @@
     void Encode(GrpcTimeoutMetadata, grpc_millis deadline);
     void Encode(TeMetadata, TeMetadata::ValueType value);
     void Encode(UserAgentMetadata, const Slice& slice);
-    void Encode(GrpcMessageMetadata, const Slice& slice) {
-      if (slice.empty()) return;
-      EmitLitHdrWithNonBinaryStringKeyNotIdx(
-          StaticSlice::FromStaticString("grpc-message").c_slice(),
-          slice.c_slice());
-    }
-    template <typename Which>
-    void Encode(Which, const Slice& slice) {
-      if (absl::EndsWith(Which::key(), "-bin")) {
-        EmitLitHdrWithBinaryStringKeyNotIdx(
-            StaticSlice::FromStaticString(Which::key()).c_slice(),
-            slice.c_slice());
-      } else {
-        EmitLitHdrWithNonBinaryStringKeyNotIdx(
-            StaticSlice::FromStaticString(Which::key()).c_slice(),
-            slice.c_slice());
-      }
-    }
 
    private:
     struct FramePrefix {
@@ -162,10 +144,6 @@
     void EmitLitHdrWithStringKeyIncIdx(grpc_mdelem elem);
     void EmitLitHdrWithNonBinaryStringKeyIncIdx(const grpc_slice& key_slice,
                                                 const grpc_slice& value_slice);
-    void EmitLitHdrWithBinaryStringKeyNotIdx(const grpc_slice& key_slice,
-                                             const grpc_slice& value_slice);
-    void EmitLitHdrWithNonBinaryStringKeyNotIdx(const grpc_slice& key_slice,
-                                                const grpc_slice& value_slice);
     void EmitLitHdrWithStringKeyNotIdx(grpc_mdelem elem);
 
     void EncodeAlwaysIndexed(uint32_t* index, const grpc_slice& key,
diff --git a/src/core/lib/security/authorization/cel_authorization_engine.cc b/src/core/lib/security/authorization/cel_authorization_engine.cc
index 2f3b3ac..a5d0a92 100644
--- a/src/core/lib/security/authorization/cel_authorization_engine.cc
+++ b/src/core/lib/security/authorization/cel_authorization_engine.cc
@@ -115,17 +115,17 @@
                                 mock_cel::CelValue::CreateStringView(method));
       }
     } else if (elem == kHeaders) {
+      std::multimap<absl::string_view, absl::string_view> headers =
+          args.GetHeaders();
       std::vector<std::pair<mock_cel::CelValue, mock_cel::CelValue>>
           header_items;
       for (const auto& header_key : header_keys_) {
-        std::string temp_value;
-        absl::optional<absl::string_view> header_value =
-            args.GetHeaderValue(header_key, &temp_value);
-        if (header_value.has_value()) {
+        auto header_item = headers.find(header_key);
+        if (header_item != headers.end()) {
           header_items.push_back(
               std::pair<mock_cel::CelValue, mock_cel::CelValue>(
                   mock_cel::CelValue::CreateStringView(header_key),
-                  mock_cel::CelValue::CreateStringView(*header_value)));
+                  mock_cel::CelValue::CreateStringView(header_item->second)));
         }
       }
       headers_ = mock_cel::ContainerBackedMapImpl::Create(
diff --git a/src/core/lib/security/authorization/evaluate_args.cc b/src/core/lib/security/authorization/evaluate_args.cc
index b57f0d9..80b713c 100644
--- a/src/core/lib/security/authorization/evaluate_args.cc
+++ b/src/core/lib/security/authorization/evaluate_args.cc
@@ -91,10 +91,11 @@
 
 absl::string_view EvaluateArgs::GetHost() const {
   absl::string_view host;
-  if (metadata_ != nullptr) {
-    if (auto* host_md = metadata_->get_pointer(HostMetadata())) {
-      host = host_md->as_string_view();
-    }
+  if (metadata_ != nullptr &&
+      metadata_->legacy_index()->named.host != nullptr) {
+    grpc_linked_mdelem* elem = metadata_->legacy_index()->named.host;
+    const grpc_slice& val = GRPC_MDVALUE(elem->md);
+    host = StringViewFromSlice(val);
   }
   return host;
 }
@@ -110,6 +111,20 @@
   return method;
 }
 
+std::multimap<absl::string_view, absl::string_view> EvaluateArgs::GetHeaders()
+    const {
+  std::multimap<absl::string_view, absl::string_view> headers;
+  if (metadata_ == nullptr) {
+    return headers;
+  }
+  metadata_->ForEach([&](grpc_mdelem md) {
+    const grpc_slice& key = GRPC_MDKEY(md);
+    const grpc_slice& val = GRPC_MDVALUE(md);
+    headers.emplace(StringViewFromSlice(key), StringViewFromSlice(val));
+  });
+  return headers;
+}
+
 absl::optional<absl::string_view> EvaluateArgs::GetHeaderValue(
     absl::string_view key, std::string* concatenated_value) const {
   if (metadata_ == nullptr) {
diff --git a/src/core/lib/security/authorization/evaluate_args.h b/src/core/lib/security/authorization/evaluate_args.h
index 36ff38f..3c345b3 100644
--- a/src/core/lib/security/authorization/evaluate_args.h
+++ b/src/core/lib/security/authorization/evaluate_args.h
@@ -58,6 +58,7 @@
   absl::string_view GetPath() const;
   absl::string_view GetHost() const;
   absl::string_view GetMethod() const;
+  std::multimap<absl::string_view, absl::string_view> GetHeaders() const;
   // Returns metadata value(s) for the specified key.
   // If the key is not present in the batch, returns absl::nullopt.
   // If the key is present exactly once in the batch, returns a string_view of
diff --git a/src/core/lib/slice/percent_encoding.cc b/src/core/lib/slice/percent_encoding.cc
index 98e17bc..257ed13 100644
--- a/src/core/lib/slice/percent_encoding.cc
+++ b/src/core/lib/slice/percent_encoding.cc
@@ -78,79 +78,135 @@
 }
 }  // namespace
 
-Slice PercentEncodeSlice(Slice slice, PercentEncodingType type) {
+grpc_slice PercentEncodeSlice(const grpc_slice& slice,
+                              PercentEncodingType type) {
   static const uint8_t hex[] = "0123456789ABCDEF";
 
   const BitSet<256>& lut = LookupTableForPercentEncodingType(type);
 
   // first pass: count the number of bytes needed to output this string
   size_t output_length = 0;
+  const uint8_t* slice_start = GRPC_SLICE_START_PTR(slice);
+  const uint8_t* slice_end = GRPC_SLICE_END_PTR(slice);
+  const uint8_t* p;
   bool any_reserved_bytes = false;
-  for (uint8_t c : slice) {
-    bool unres = lut.is_set(c);
+  for (p = slice_start; p < slice_end; p++) {
+    bool unres = lut.is_set(*p);
     output_length += unres ? 1 : 3;
     any_reserved_bytes |= !unres;
   }
   // no unreserved bytes: return the string unmodified
   if (!any_reserved_bytes) {
-    return slice;
+    return grpc_slice_ref_internal(slice);
   }
   // second pass: actually encode
-  auto out = MutableSlice::CreateUninitialized(output_length);
-  uint8_t* q = out.begin();
-  for (uint8_t c : slice) {
-    if (lut.is_set(c)) {
-      *q++ = c;
+  grpc_slice out = GRPC_SLICE_MALLOC(output_length);
+  uint8_t* q = GRPC_SLICE_START_PTR(out);
+  for (p = slice_start; p < slice_end; p++) {
+    if (lut.is_set(*p)) {
+      *q++ = *p;
     } else {
       *q++ = '%';
-      *q++ = hex[c >> 4];
-      *q++ = hex[c & 15];
+      *q++ = hex[*p >> 4];
+      *q++ = hex[*p & 15];
     }
   }
-  GPR_ASSERT(q == out.end());
-  return Slice(std::move(out));
+  GPR_ASSERT(q == GRPC_SLICE_END_PTR(out));
+  return out;
 }
 
-static bool ValidHex(const uint8_t* p, const uint8_t* end) {
+static bool valid_hex(const uint8_t* p, const uint8_t* end) {
   if (p >= end) return false;
   return (*p >= '0' && *p <= '9') || (*p >= 'a' && *p <= 'f') ||
          (*p >= 'A' && *p <= 'F');
 }
 
-static uint8_t DeHex(uint8_t c) {
+static uint8_t dehex(uint8_t c) {
   if (c >= '0' && c <= '9') return static_cast<uint8_t>(c - '0');
   if (c >= 'A' && c <= 'F') return static_cast<uint8_t>(c - 'A' + 10);
   if (c >= 'a' && c <= 'f') return static_cast<uint8_t>(c - 'a' + 10);
   GPR_UNREACHABLE_CODE(return 255);
 }
 
-Slice PermissivePercentDecodeSlice(Slice slice_in) {
+absl::optional<grpc_slice> PercentDecodeSlice(const grpc_slice& slice_in,
+                                              PercentEncodingType type) {
+  const uint8_t* p = GRPC_SLICE_START_PTR(slice_in);
+  const uint8_t* in_end = GRPC_SLICE_END_PTR(slice_in);
+  size_t out_length = 0;
   bool any_percent_encoded_stuff = false;
-  for (uint8_t c : slice_in) {
-    if (c == '%') {
+  const BitSet<256>& lut = LookupTableForPercentEncodingType(type);
+  while (p != in_end) {
+    if (*p == '%') {
+      if (!valid_hex(++p, in_end)) return {};
+      if (!valid_hex(++p, in_end)) return {};
+      p++;
+      out_length++;
       any_percent_encoded_stuff = true;
-      break;
+    } else if (lut.is_set(*p)) {
+      p++;
+      out_length++;
+    } else {
+      return {};
     }
   }
-  if (!any_percent_encoded_stuff) return slice_in;
-
-  MutableSlice out = slice_in.TakeMutable();
-  uint8_t* q = out.begin();
-  const uint8_t* p = out.begin();
-  const uint8_t* end = out.end();
-  while (p != end) {
+  if (!any_percent_encoded_stuff) {
+    return grpc_slice_ref_internal(slice_in);
+  }
+  p = GRPC_SLICE_START_PTR(slice_in);
+  grpc_slice slice_out = GRPC_SLICE_MALLOC(out_length);
+  uint8_t* q = GRPC_SLICE_START_PTR(slice_out);
+  while (p != in_end) {
     if (*p == '%') {
-      if (!ValidHex(p + 1, end) || !ValidHex(p + 2, end)) {
+      *q++ = static_cast<uint8_t>(dehex(p[1]) << 4) | (dehex(p[2]));
+      p += 3;
+    } else {
+      *q++ = *p++;
+    }
+  }
+  GPR_ASSERT(q == GRPC_SLICE_END_PTR(slice_out));
+  return slice_out;
+}
+
+grpc_slice PermissivePercentDecodeSlice(const grpc_slice& slice_in) {
+  const uint8_t* p = GRPC_SLICE_START_PTR(slice_in);
+  const uint8_t* in_end = GRPC_SLICE_END_PTR(slice_in);
+  size_t out_length = 0;
+  bool any_percent_encoded_stuff = false;
+  while (p != in_end) {
+    if (*p == '%') {
+      if (!valid_hex(p + 1, in_end) || !valid_hex(p + 2, in_end)) {
+        p++;
+        out_length++;
+      } else {
+        p += 3;
+        out_length++;
+        any_percent_encoded_stuff = true;
+      }
+    } else {
+      p++;
+      out_length++;
+    }
+  }
+  if (!any_percent_encoded_stuff) {
+    return grpc_slice_ref_internal(slice_in);
+  }
+  p = GRPC_SLICE_START_PTR(slice_in);
+  grpc_slice out = GRPC_SLICE_MALLOC(out_length);
+  uint8_t* q = GRPC_SLICE_START_PTR(out);
+  while (p != in_end) {
+    if (*p == '%') {
+      if (!valid_hex(p + 1, in_end) || !valid_hex(p + 2, in_end)) {
         *q++ = *p++;
       } else {
-        *q++ = static_cast<uint8_t>(DeHex(p[1]) << 4) | (DeHex(p[2]));
+        *q++ = static_cast<uint8_t>(dehex(p[1]) << 4) | (dehex(p[2]));
         p += 3;
       }
     } else {
       *q++ = *p++;
     }
   }
-  return Slice(out.TakeSubSlice(0, q - out.begin()));
+  GPR_ASSERT(q == GRPC_SLICE_END_PTR(out));
+  return out;
 }
 
 }  // namespace grpc_core
diff --git a/src/core/lib/slice/percent_encoding.h b/src/core/lib/slice/percent_encoding.h
index 830ef02..2cc85c5 100644
--- a/src/core/lib/slice/percent_encoding.h
+++ b/src/core/lib/slice/percent_encoding.h
@@ -34,26 +34,32 @@
 
 #include <grpc/slice.h>
 
-#include "src/core/lib/slice/slice.h"
-
 namespace grpc_core {
 
 enum class PercentEncodingType {
   // Flags [A-Za-z0-9-_.~] as unreserved bytes for the percent encoding routines
   URL,
   // Flags ascii7 non-control characters excluding '%' as unreserved bytes for
-  // the percent encoding routines
+  // the
+  // percent encoding routines
   Compatible
 };
 
 // Percent-encode a slice, returning the new slice (this cannot fail):
 // unreserved_bytes is a bitfield indicating which bytes are considered
 // unreserved and thus do not need percent encoding
-Slice PercentEncodeSlice(Slice slice, PercentEncodingType type);
+grpc_slice PercentEncodeSlice(const grpc_slice& slice,
+                              PercentEncodingType type);
+// Percent-decode a slice, strictly.
+// If the input is legal (contains no unreserved bytes, and legal % encodings),
+// returns the decoded slice.
+// If the input is not legal, returns {}.
+absl::optional<grpc_slice> PercentDecodeSlice(const grpc_slice& slice_in,
+                                              PercentEncodingType type);
 // Percent-decode a slice, permissively.
 // If a % triplet can not be decoded, pass it through verbatim.
 // This cannot fail.
-Slice PermissivePercentDecodeSlice(Slice slice_in);
+grpc_slice PermissivePercentDecodeSlice(const grpc_slice& slice_in);
 
 }  // namespace grpc_core
 
diff --git a/src/core/lib/slice/slice.h b/src/core/lib/slice/slice.h
index 0bb7ec1..6e315ed 100644
--- a/src/core/lib/slice/slice.h
+++ b/src/core/lib/slice/slice.h
@@ -162,14 +162,10 @@
   static Out FromCopiedString(std::string s) {
     return Out(grpc_slice_from_cpp_string(std::move(s)));
   }
-  static Out FromCopiedBuffer(const char* p, size_t len) {
-    return Out(UnmanagedMemorySlice(p, len));
-  }
-
   template <typename Buffer>
   static Out FromCopiedBuffer(const Buffer& buffer) {
-    return FromCopiedBuffer(reinterpret_cast<const char*>(buffer.data()),
-                            buffer.size());
+    return Out(UnmanagedMemorySlice(
+        reinterpret_cast<const char*>(buffer.data()), buffer.size()));
   }
 };
 
@@ -191,10 +187,6 @@
     return StaticSlice(grpc_slice_from_static_string(s));
   }
 
-  static StaticSlice FromStaticString(absl::string_view s) {
-    return StaticSlice(ExternallyManagedSlice(s.data(), s.size()));
-  }
-
   StaticSlice(const StaticSlice& other)
       : slice_detail::BaseSlice(other.c_slice()) {}
   StaticSlice& operator=(const StaticSlice& other) {
@@ -229,16 +221,6 @@
     return *this;
   }
 
-  static MutableSlice CreateUninitialized(size_t length) {
-    return MutableSlice(grpc_slice_malloc(length));
-  }
-
-  // Return a sub slice of this one. Leaves this slice in an indeterminate but
-  // valid state.
-  MutableSlice TakeSubSlice(size_t pos, size_t n) {
-    return MutableSlice(grpc_slice_sub_no_ref(TakeCSlice(), pos, pos + n));
-  }
-
   // Iterator access to the underlying bytes
   uint8_t* begin() { return mutable_data(); }
   uint8_t* end() { return mutable_data() + size(); }
@@ -253,7 +235,10 @@
   Slice() = default;
   ~Slice() { grpc_slice_unref_internal(c_slice()); }
   explicit Slice(const grpc_slice& slice) : slice_detail::BaseSlice(slice) {}
-  explicit Slice(slice_detail::BaseSlice&& other)
+  template <class SliceType>
+  explicit Slice(absl::enable_if_t<
+                 std::is_base_of<slice_detail::BaseSlice, SliceType>::value,
+                 SliceType>&& other)
       : slice_detail::BaseSlice(other.TakeCSlice()) {}
 
   Slice(const Slice&) = delete;
@@ -315,12 +300,6 @@
     return MutableSlice(grpc_slice_copy(c_slice()));
   }
 
-  // Return a sub slice of this one. Leaves this slice in an indeterminate but
-  // valid state.
-  Slice TakeSubSlice(size_t pos, size_t n) {
-    return Slice(grpc_slice_sub_no_ref(TakeCSlice(), pos, pos + n));
-  }
-
   Slice Ref() const { return Slice(grpc_slice_ref_internal(c_slice())); }
 
   Slice Copy() const { return Slice(grpc_slice_copy(c_slice())); }
diff --git a/src/core/lib/slice/static_slice.cc b/src/core/lib/slice/static_slice.cc
index 9f59753..4c13be7 100644
--- a/src/core/lib/slice/static_slice.cc
+++ b/src/core/lib/slice/static_slice.cc
@@ -32,144 +32,154 @@
 const uint8_t g_static_metadata_bytes[] = {
     58,  112, 97,  116, 104, 58,  109, 101, 116, 104, 111, 100, 58,  115, 116,
     97,  116, 117, 115, 58,  97,  117, 116, 104, 111, 114, 105, 116, 121, 58,
-    115, 99,  104, 101, 109, 101, 103, 114, 112, 99,  45,  115, 116, 97,  116,
-    117, 115, 103, 114, 112, 99,  45,  101, 110, 99,  111, 100, 105, 110, 103,
-    103, 114, 112, 99,  45,  97,  99,  99,  101, 112, 116, 45,  101, 110, 99,
-    111, 100, 105, 110, 103, 99,  111, 110, 116, 101, 110, 116, 45,  116, 121,
-    112, 101, 99,  111, 110, 116, 101, 110, 116, 45,  101, 110, 99,  111, 100,
-    105, 110, 103, 97,  99,  99,  101, 112, 116, 45,  101, 110, 99,  111, 100,
-    105, 110, 103, 103, 114, 112, 99,  45,  105, 110, 116, 101, 114, 110, 97,
-    108, 45,  101, 110, 99,  111, 100, 105, 110, 103, 45,  114, 101, 113, 117,
-    101, 115, 116, 103, 114, 112, 99,  45,  112, 114, 101, 118, 105, 111, 117,
-    115, 45,  114, 112, 99,  45,  97,  116, 116, 101, 109, 112, 116, 115, 103,
-    114, 112, 99,  45,  114, 101, 116, 114, 121, 45,  112, 117, 115, 104, 98,
-    97,  99,  107, 45,  109, 115, 103, 114, 112, 99,  45,  116, 105, 109, 101,
-    111, 117, 116, 49,  50,  51,  52,  47,  103, 114, 112, 99,  46,  108, 98,
-    46,  118, 49,  46,  76,  111, 97,  100, 66,  97,  108, 97,  110, 99,  101,
-    114, 47,  66,  97,  108, 97,  110, 99,  101, 76,  111, 97,  100, 47,  101,
-    110, 118, 111, 121, 46,  115, 101, 114, 118, 105, 99,  101, 46,  108, 111,
-    97,  100, 95,  115, 116, 97,  116, 115, 46,  118, 50,  46,  76,  111, 97,
-    100, 82,  101, 112, 111, 114, 116, 105, 110, 103, 83,  101, 114, 118, 105,
-    99,  101, 47,  83,  116, 114, 101, 97,  109, 76,  111, 97,  100, 83,  116,
-    97,  116, 115, 47,  101, 110, 118, 111, 121, 46,  115, 101, 114, 118, 105,
-    99,  101, 46,  108, 111, 97,  100, 95,  115, 116, 97,  116, 115, 46,  118,
-    51,  46,  76,  111, 97,  100, 82,  101, 112, 111, 114, 116, 105, 110, 103,
-    83,  101, 114, 118, 105, 99,  101, 47,  83,  116, 114, 101, 97,  109, 76,
-    111, 97,  100, 83,  116, 97,  116, 115, 47,  103, 114, 112, 99,  46,  104,
-    101, 97,  108, 116, 104, 46,  118, 49,  46,  72,  101, 97,  108, 116, 104,
-    47,  87,  97,  116, 99,  104, 47,  101, 110, 118, 111, 121, 46,  115, 101,
-    114, 118, 105, 99,  101, 46,  100, 105, 115, 99,  111, 118, 101, 114, 121,
-    46,  118, 50,  46,  65,  103, 103, 114, 101, 103, 97,  116, 101, 100, 68,
-    105, 115, 99,  111, 118, 101, 114, 121, 83,  101, 114, 118, 105, 99,  101,
-    47,  83,  116, 114, 101, 97,  109, 65,  103, 103, 114, 101, 103, 97,  116,
-    101, 100, 82,  101, 115, 111, 117, 114, 99,  101, 115, 47,  101, 110, 118,
-    111, 121, 46,  115, 101, 114, 118, 105, 99,  101, 46,  100, 105, 115, 99,
-    111, 118, 101, 114, 121, 46,  118, 51,  46,  65,  103, 103, 114, 101, 103,
-    97,  116, 101, 100, 68,  105, 115, 99,  111, 118, 101, 114, 121, 83,  101,
-    114, 118, 105, 99,  101, 47,  83,  116, 114, 101, 97,  109, 65,  103, 103,
-    114, 101, 103, 97,  116, 101, 100, 82,  101, 115, 111, 117, 114, 99,  101,
-    115, 100, 101, 102, 108, 97,  116, 101, 103, 122, 105, 112, 115, 116, 114,
-    101, 97,  109, 47,  103, 122, 105, 112, 116, 101, 116, 114, 97,  105, 108,
-    101, 114, 115, 71,  69,  84,  80,  79,  83,  84,  47,  47,  105, 110, 100,
-    101, 120, 46,  104, 116, 109, 108, 104, 116, 116, 112, 104, 116, 116, 112,
-    115, 50,  48,  48,  50,  48,  52,  50,  48,  54,  51,  48,  52,  52,  48,
-    48,  52,  48,  52,  53,  48,  48,  97,  99,  99,  101, 112, 116, 45,  99,
-    104, 97,  114, 115, 101, 116, 103, 122, 105, 112, 44,  32,  100, 101, 102,
-    108, 97,  116, 101, 97,  99,  99,  101, 112, 116, 45,  108, 97,  110, 103,
-    117, 97,  103, 101, 97,  99,  99,  101, 112, 116, 45,  114, 97,  110, 103,
-    101, 115, 97,  99,  99,  101, 112, 116, 97,  99,  99,  101, 115, 115, 45,
-    99,  111, 110, 116, 114, 111, 108, 45,  97,  108, 108, 111, 119, 45,  111,
-    114, 105, 103, 105, 110, 97,  103, 101, 97,  108, 108, 111, 119, 97,  117,
-    116, 104, 111, 114, 105, 122, 97,  116, 105, 111, 110, 99,  97,  99,  104,
-    101, 45,  99,  111, 110, 116, 114, 111, 108, 99,  111, 110, 116, 101, 110,
-    116, 45,  100, 105, 115, 112, 111, 115, 105, 116, 105, 111, 110, 99,  111,
-    110, 116, 101, 110, 116, 45,  108, 97,  110, 103, 117, 97,  103, 101, 99,
-    111, 110, 116, 101, 110, 116, 45,  108, 101, 110, 103, 116, 104, 99,  111,
-    110, 116, 101, 110, 116, 45,  108, 111, 99,  97,  116, 105, 111, 110, 99,
-    111, 110, 116, 101, 110, 116, 45,  114, 97,  110, 103, 101, 99,  111, 111,
-    107, 105, 101, 100, 97,  116, 101, 101, 116, 97,  103, 101, 120, 112, 101,
-    99,  116, 101, 120, 112, 105, 114, 101, 115, 102, 114, 111, 109, 104, 111,
-    115, 116, 105, 102, 45,  109, 97,  116, 99,  104, 105, 102, 45,  109, 111,
-    100, 105, 102, 105, 101, 100, 45,  115, 105, 110, 99,  101, 105, 102, 45,
-    110, 111, 110, 101, 45,  109, 97,  116, 99,  104, 105, 102, 45,  114, 97,
-    110, 103, 101, 105, 102, 45,  117, 110, 109, 111, 100, 105, 102, 105, 101,
-    100, 45,  115, 105, 110, 99,  101, 108, 97,  115, 116, 45,  109, 111, 100,
-    105, 102, 105, 101, 100, 108, 105, 110, 107, 108, 111, 99,  97,  116, 105,
-    111, 110, 109, 97,  120, 45,  102, 111, 114, 119, 97,  114, 100, 115, 112,
-    114, 111, 120, 121, 45,  97,  117, 116, 104, 101, 110, 116, 105, 99,  97,
-    116, 101, 112, 114, 111, 120, 121, 45,  97,  117, 116, 104, 111, 114, 105,
-    122, 97,  116, 105, 111, 110, 114, 97,  110, 103, 101, 114, 101, 102, 101,
-    114, 101, 114, 114, 101, 102, 114, 101, 115, 104, 114, 101, 116, 114, 121,
-    45,  97,  102, 116, 101, 114, 115, 101, 114, 118, 101, 114, 115, 101, 116,
-    45,  99,  111, 111, 107, 105, 101, 115, 116, 114, 105, 99,  116, 45,  116,
-    114, 97,  110, 115, 112, 111, 114, 116, 45,  115, 101, 99,  117, 114, 105,
-    116, 121, 116, 114, 97,  110, 115, 102, 101, 114, 45,  101, 110, 99,  111,
-    100, 105, 110, 103, 117, 115, 101, 114, 45,  97,  103, 101, 110, 116, 118,
-    97,  114, 121, 118, 105, 97,  119, 119, 119, 45,  97,  117, 116, 104, 101,
-    110, 116, 105, 99,  97,  116, 101, 48,  105, 100, 101, 110, 116, 105, 116,
-    121, 97,  112, 112, 108, 105, 99,  97,  116, 105, 111, 110, 47,  103, 114,
-    112, 99,  103, 114, 112, 99,  80,  85,  84,  108, 98,  45,  99,  111, 115,
-    116, 45,  98,  105, 110, 105, 100, 101, 110, 116, 105, 116, 121, 44,  100,
-    101, 102, 108, 97,  116, 101, 105, 100, 101, 110, 116, 105, 116, 121, 44,
-    103, 122, 105, 112, 100, 101, 102, 108, 97,  116, 101, 44,  103, 122, 105,
-    112, 105, 100, 101, 110, 116, 105, 116, 121, 44,  100, 101, 102, 108, 97,
-    116, 101, 44,  103, 122, 105, 112};
+    115, 99,  104, 101, 109, 101, 103, 114, 112, 99,  45,  109, 101, 115, 115,
+    97,  103, 101, 103, 114, 112, 99,  45,  115, 116, 97,  116, 117, 115, 103,
+    114, 112, 99,  45,  112, 97,  121, 108, 111, 97,  100, 45,  98,  105, 110,
+    103, 114, 112, 99,  45,  101, 110, 99,  111, 100, 105, 110, 103, 103, 114,
+    112, 99,  45,  97,  99,  99,  101, 112, 116, 45,  101, 110, 99,  111, 100,
+    105, 110, 103, 103, 114, 112, 99,  45,  115, 101, 114, 118, 101, 114, 45,
+    115, 116, 97,  116, 115, 45,  98,  105, 110, 103, 114, 112, 99,  45,  116,
+    97,  103, 115, 45,  98,  105, 110, 103, 114, 112, 99,  45,  116, 114, 97,
+    99,  101, 45,  98,  105, 110, 99,  111, 110, 116, 101, 110, 116, 45,  116,
+    121, 112, 101, 99,  111, 110, 116, 101, 110, 116, 45,  101, 110, 99,  111,
+    100, 105, 110, 103, 97,  99,  99,  101, 112, 116, 45,  101, 110, 99,  111,
+    100, 105, 110, 103, 103, 114, 112, 99,  45,  105, 110, 116, 101, 114, 110,
+    97,  108, 45,  101, 110, 99,  111, 100, 105, 110, 103, 45,  114, 101, 113,
+    117, 101, 115, 116, 104, 111, 115, 116, 103, 114, 112, 99,  45,  112, 114,
+    101, 118, 105, 111, 117, 115, 45,  114, 112, 99,  45,  97,  116, 116, 101,
+    109, 112, 116, 115, 103, 114, 112, 99,  45,  114, 101, 116, 114, 121, 45,
+    112, 117, 115, 104, 98,  97,  99,  107, 45,  109, 115, 120, 45,  101, 110,
+    100, 112, 111, 105, 110, 116, 45,  108, 111, 97,  100, 45,  109, 101, 116,
+    114, 105, 99,  115, 45,  98,  105, 110, 103, 114, 112, 99,  45,  116, 105,
+    109, 101, 111, 117, 116, 117, 115, 101, 114, 45,  97,  103, 101, 110, 116,
+    49,  50,  51,  52,  47,  103, 114, 112, 99,  46,  108, 98,  46,  118, 49,
+    46,  76,  111, 97,  100, 66,  97,  108, 97,  110, 99,  101, 114, 47,  66,
+    97,  108, 97,  110, 99,  101, 76,  111, 97,  100, 47,  101, 110, 118, 111,
+    121, 46,  115, 101, 114, 118, 105, 99,  101, 46,  108, 111, 97,  100, 95,
+    115, 116, 97,  116, 115, 46,  118, 50,  46,  76,  111, 97,  100, 82,  101,
+    112, 111, 114, 116, 105, 110, 103, 83,  101, 114, 118, 105, 99,  101, 47,
+    83,  116, 114, 101, 97,  109, 76,  111, 97,  100, 83,  116, 97,  116, 115,
+    47,  101, 110, 118, 111, 121, 46,  115, 101, 114, 118, 105, 99,  101, 46,
+    108, 111, 97,  100, 95,  115, 116, 97,  116, 115, 46,  118, 51,  46,  76,
+    111, 97,  100, 82,  101, 112, 111, 114, 116, 105, 110, 103, 83,  101, 114,
+    118, 105, 99,  101, 47,  83,  116, 114, 101, 97,  109, 76,  111, 97,  100,
+    83,  116, 97,  116, 115, 47,  103, 114, 112, 99,  46,  104, 101, 97,  108,
+    116, 104, 46,  118, 49,  46,  72,  101, 97,  108, 116, 104, 47,  87,  97,
+    116, 99,  104, 47,  101, 110, 118, 111, 121, 46,  115, 101, 114, 118, 105,
+    99,  101, 46,  100, 105, 115, 99,  111, 118, 101, 114, 121, 46,  118, 50,
+    46,  65,  103, 103, 114, 101, 103, 97,  116, 101, 100, 68,  105, 115, 99,
+    111, 118, 101, 114, 121, 83,  101, 114, 118, 105, 99,  101, 47,  83,  116,
+    114, 101, 97,  109, 65,  103, 103, 114, 101, 103, 97,  116, 101, 100, 82,
+    101, 115, 111, 117, 114, 99,  101, 115, 47,  101, 110, 118, 111, 121, 46,
+    115, 101, 114, 118, 105, 99,  101, 46,  100, 105, 115, 99,  111, 118, 101,
+    114, 121, 46,  118, 51,  46,  65,  103, 103, 114, 101, 103, 97,  116, 101,
+    100, 68,  105, 115, 99,  111, 118, 101, 114, 121, 83,  101, 114, 118, 105,
+    99,  101, 47,  83,  116, 114, 101, 97,  109, 65,  103, 103, 114, 101, 103,
+    97,  116, 101, 100, 82,  101, 115, 111, 117, 114, 99,  101, 115, 100, 101,
+    102, 108, 97,  116, 101, 103, 122, 105, 112, 115, 116, 114, 101, 97,  109,
+    47,  103, 122, 105, 112, 116, 101, 116, 114, 97,  105, 108, 101, 114, 115,
+    71,  69,  84,  80,  79,  83,  84,  47,  47,  105, 110, 100, 101, 120, 46,
+    104, 116, 109, 108, 104, 116, 116, 112, 104, 116, 116, 112, 115, 50,  48,
+    48,  50,  48,  52,  50,  48,  54,  51,  48,  52,  52,  48,  48,  52,  48,
+    52,  53,  48,  48,  97,  99,  99,  101, 112, 116, 45,  99,  104, 97,  114,
+    115, 101, 116, 103, 122, 105, 112, 44,  32,  100, 101, 102, 108, 97,  116,
+    101, 97,  99,  99,  101, 112, 116, 45,  108, 97,  110, 103, 117, 97,  103,
+    101, 97,  99,  99,  101, 112, 116, 45,  114, 97,  110, 103, 101, 115, 97,
+    99,  99,  101, 112, 116, 97,  99,  99,  101, 115, 115, 45,  99,  111, 110,
+    116, 114, 111, 108, 45,  97,  108, 108, 111, 119, 45,  111, 114, 105, 103,
+    105, 110, 97,  103, 101, 97,  108, 108, 111, 119, 97,  117, 116, 104, 111,
+    114, 105, 122, 97,  116, 105, 111, 110, 99,  97,  99,  104, 101, 45,  99,
+    111, 110, 116, 114, 111, 108, 99,  111, 110, 116, 101, 110, 116, 45,  100,
+    105, 115, 112, 111, 115, 105, 116, 105, 111, 110, 99,  111, 110, 116, 101,
+    110, 116, 45,  108, 97,  110, 103, 117, 97,  103, 101, 99,  111, 110, 116,
+    101, 110, 116, 45,  108, 101, 110, 103, 116, 104, 99,  111, 110, 116, 101,
+    110, 116, 45,  108, 111, 99,  97,  116, 105, 111, 110, 99,  111, 110, 116,
+    101, 110, 116, 45,  114, 97,  110, 103, 101, 99,  111, 111, 107, 105, 101,
+    100, 97,  116, 101, 101, 116, 97,  103, 101, 120, 112, 101, 99,  116, 101,
+    120, 112, 105, 114, 101, 115, 102, 114, 111, 109, 105, 102, 45,  109, 97,
+    116, 99,  104, 105, 102, 45,  109, 111, 100, 105, 102, 105, 101, 100, 45,
+    115, 105, 110, 99,  101, 105, 102, 45,  110, 111, 110, 101, 45,  109, 97,
+    116, 99,  104, 105, 102, 45,  114, 97,  110, 103, 101, 105, 102, 45,  117,
+    110, 109, 111, 100, 105, 102, 105, 101, 100, 45,  115, 105, 110, 99,  101,
+    108, 97,  115, 116, 45,  109, 111, 100, 105, 102, 105, 101, 100, 108, 105,
+    110, 107, 108, 111, 99,  97,  116, 105, 111, 110, 109, 97,  120, 45,  102,
+    111, 114, 119, 97,  114, 100, 115, 112, 114, 111, 120, 121, 45,  97,  117,
+    116, 104, 101, 110, 116, 105, 99,  97,  116, 101, 112, 114, 111, 120, 121,
+    45,  97,  117, 116, 104, 111, 114, 105, 122, 97,  116, 105, 111, 110, 114,
+    97,  110, 103, 101, 114, 101, 102, 101, 114, 101, 114, 114, 101, 102, 114,
+    101, 115, 104, 114, 101, 116, 114, 121, 45,  97,  102, 116, 101, 114, 115,
+    101, 114, 118, 101, 114, 115, 101, 116, 45,  99,  111, 111, 107, 105, 101,
+    115, 116, 114, 105, 99,  116, 45,  116, 114, 97,  110, 115, 112, 111, 114,
+    116, 45,  115, 101, 99,  117, 114, 105, 116, 121, 116, 114, 97,  110, 115,
+    102, 101, 114, 45,  101, 110, 99,  111, 100, 105, 110, 103, 118, 97,  114,
+    121, 118, 105, 97,  119, 119, 119, 45,  97,  117, 116, 104, 101, 110, 116,
+    105, 99,  97,  116, 101, 48,  105, 100, 101, 110, 116, 105, 116, 121, 97,
+    112, 112, 108, 105, 99,  97,  116, 105, 111, 110, 47,  103, 114, 112, 99,
+    103, 114, 112, 99,  80,  85,  84,  108, 98,  45,  99,  111, 115, 116, 45,
+    98,  105, 110, 105, 100, 101, 110, 116, 105, 116, 121, 44,  100, 101, 102,
+    108, 97,  116, 101, 105, 100, 101, 110, 116, 105, 116, 121, 44,  103, 122,
+    105, 112, 100, 101, 102, 108, 97,  116, 101, 44,  103, 122, 105, 112, 105,
+    100, 101, 110, 116, 105, 116, 121, 44,  100, 101, 102, 108, 97,  116, 101,
+    44,  103, 122, 105, 112};
 
 grpc_slice_refcount StaticSliceRefcount::kStaticSubRefcount;
 
 StaticSliceRefcount g_static_metadata_slice_refcounts[GRPC_STATIC_MDSTR_COUNT] =
     {
 
-        StaticSliceRefcount(0),  StaticSliceRefcount(1),
-        StaticSliceRefcount(2),  StaticSliceRefcount(3),
-        StaticSliceRefcount(4),  StaticSliceRefcount(5),
-        StaticSliceRefcount(6),  StaticSliceRefcount(7),
-        StaticSliceRefcount(8),  StaticSliceRefcount(9),
-        StaticSliceRefcount(10), StaticSliceRefcount(11),
-        StaticSliceRefcount(12), StaticSliceRefcount(13),
-        StaticSliceRefcount(14), StaticSliceRefcount(15),
-        StaticSliceRefcount(16), StaticSliceRefcount(17),
-        StaticSliceRefcount(18), StaticSliceRefcount(19),
-        StaticSliceRefcount(20), StaticSliceRefcount(21),
-        StaticSliceRefcount(22), StaticSliceRefcount(23),
-        StaticSliceRefcount(24), StaticSliceRefcount(25),
-        StaticSliceRefcount(26), StaticSliceRefcount(27),
-        StaticSliceRefcount(28), StaticSliceRefcount(29),
-        StaticSliceRefcount(30), StaticSliceRefcount(31),
-        StaticSliceRefcount(32), StaticSliceRefcount(33),
-        StaticSliceRefcount(34), StaticSliceRefcount(35),
-        StaticSliceRefcount(36), StaticSliceRefcount(37),
-        StaticSliceRefcount(38), StaticSliceRefcount(39),
-        StaticSliceRefcount(40), StaticSliceRefcount(41),
-        StaticSliceRefcount(42), StaticSliceRefcount(43),
-        StaticSliceRefcount(44), StaticSliceRefcount(45),
-        StaticSliceRefcount(46), StaticSliceRefcount(47),
-        StaticSliceRefcount(48), StaticSliceRefcount(49),
-        StaticSliceRefcount(50), StaticSliceRefcount(51),
-        StaticSliceRefcount(52), StaticSliceRefcount(53),
-        StaticSliceRefcount(54), StaticSliceRefcount(55),
-        StaticSliceRefcount(56), StaticSliceRefcount(57),
-        StaticSliceRefcount(58), StaticSliceRefcount(59),
-        StaticSliceRefcount(60), StaticSliceRefcount(61),
-        StaticSliceRefcount(62), StaticSliceRefcount(63),
-        StaticSliceRefcount(64), StaticSliceRefcount(65),
-        StaticSliceRefcount(66), StaticSliceRefcount(67),
-        StaticSliceRefcount(68), StaticSliceRefcount(69),
-        StaticSliceRefcount(70), StaticSliceRefcount(71),
-        StaticSliceRefcount(72), StaticSliceRefcount(73),
-        StaticSliceRefcount(74), StaticSliceRefcount(75),
-        StaticSliceRefcount(76), StaticSliceRefcount(77),
-        StaticSliceRefcount(78), StaticSliceRefcount(79),
-        StaticSliceRefcount(80), StaticSliceRefcount(81),
-        StaticSliceRefcount(82), StaticSliceRefcount(83),
-        StaticSliceRefcount(84), StaticSliceRefcount(85),
-        StaticSliceRefcount(86), StaticSliceRefcount(87),
-        StaticSliceRefcount(88), StaticSliceRefcount(89),
-        StaticSliceRefcount(90), StaticSliceRefcount(91),
-        StaticSliceRefcount(92), StaticSliceRefcount(93),
-        StaticSliceRefcount(94), StaticSliceRefcount(95),
-        StaticSliceRefcount(96), StaticSliceRefcount(97),
-        StaticSliceRefcount(98),
+        StaticSliceRefcount(0),   StaticSliceRefcount(1),
+        StaticSliceRefcount(2),   StaticSliceRefcount(3),
+        StaticSliceRefcount(4),   StaticSliceRefcount(5),
+        StaticSliceRefcount(6),   StaticSliceRefcount(7),
+        StaticSliceRefcount(8),   StaticSliceRefcount(9),
+        StaticSliceRefcount(10),  StaticSliceRefcount(11),
+        StaticSliceRefcount(12),  StaticSliceRefcount(13),
+        StaticSliceRefcount(14),  StaticSliceRefcount(15),
+        StaticSliceRefcount(16),  StaticSliceRefcount(17),
+        StaticSliceRefcount(18),  StaticSliceRefcount(19),
+        StaticSliceRefcount(20),  StaticSliceRefcount(21),
+        StaticSliceRefcount(22),  StaticSliceRefcount(23),
+        StaticSliceRefcount(24),  StaticSliceRefcount(25),
+        StaticSliceRefcount(26),  StaticSliceRefcount(27),
+        StaticSliceRefcount(28),  StaticSliceRefcount(29),
+        StaticSliceRefcount(30),  StaticSliceRefcount(31),
+        StaticSliceRefcount(32),  StaticSliceRefcount(33),
+        StaticSliceRefcount(34),  StaticSliceRefcount(35),
+        StaticSliceRefcount(36),  StaticSliceRefcount(37),
+        StaticSliceRefcount(38),  StaticSliceRefcount(39),
+        StaticSliceRefcount(40),  StaticSliceRefcount(41),
+        StaticSliceRefcount(42),  StaticSliceRefcount(43),
+        StaticSliceRefcount(44),  StaticSliceRefcount(45),
+        StaticSliceRefcount(46),  StaticSliceRefcount(47),
+        StaticSliceRefcount(48),  StaticSliceRefcount(49),
+        StaticSliceRefcount(50),  StaticSliceRefcount(51),
+        StaticSliceRefcount(52),  StaticSliceRefcount(53),
+        StaticSliceRefcount(54),  StaticSliceRefcount(55),
+        StaticSliceRefcount(56),  StaticSliceRefcount(57),
+        StaticSliceRefcount(58),  StaticSliceRefcount(59),
+        StaticSliceRefcount(60),  StaticSliceRefcount(61),
+        StaticSliceRefcount(62),  StaticSliceRefcount(63),
+        StaticSliceRefcount(64),  StaticSliceRefcount(65),
+        StaticSliceRefcount(66),  StaticSliceRefcount(67),
+        StaticSliceRefcount(68),  StaticSliceRefcount(69),
+        StaticSliceRefcount(70),  StaticSliceRefcount(71),
+        StaticSliceRefcount(72),  StaticSliceRefcount(73),
+        StaticSliceRefcount(74),  StaticSliceRefcount(75),
+        StaticSliceRefcount(76),  StaticSliceRefcount(77),
+        StaticSliceRefcount(78),  StaticSliceRefcount(79),
+        StaticSliceRefcount(80),  StaticSliceRefcount(81),
+        StaticSliceRefcount(82),  StaticSliceRefcount(83),
+        StaticSliceRefcount(84),  StaticSliceRefcount(85),
+        StaticSliceRefcount(86),  StaticSliceRefcount(87),
+        StaticSliceRefcount(88),  StaticSliceRefcount(89),
+        StaticSliceRefcount(90),  StaticSliceRefcount(91),
+        StaticSliceRefcount(92),  StaticSliceRefcount(93),
+        StaticSliceRefcount(94),  StaticSliceRefcount(95),
+        StaticSliceRefcount(96),  StaticSliceRefcount(97),
+        StaticSliceRefcount(98),  StaticSliceRefcount(99),
+        StaticSliceRefcount(100), StaticSliceRefcount(101),
+        StaticSliceRefcount(102), StaticSliceRefcount(103),
+        StaticSliceRefcount(104),
 };
 
 const StaticMetadataSlice
@@ -185,193 +195,205 @@
                             g_static_metadata_bytes + 19),
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[4].base, 7,
                             g_static_metadata_bytes + 29),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[5].base, 11,
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[5].base, 12,
                             g_static_metadata_bytes + 36),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 13,
-                            g_static_metadata_bytes + 47),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20,
-                            g_static_metadata_bytes + 60),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[8].base, 12,
-                            g_static_metadata_bytes + 80),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 16,
-                            g_static_metadata_bytes + 92),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 15,
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 11,
+                            g_static_metadata_bytes + 48),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 16,
+                            g_static_metadata_bytes + 59),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[8].base, 13,
+                            g_static_metadata_bytes + 75),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20,
+                            g_static_metadata_bytes + 88),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 21,
                             g_static_metadata_bytes + 108),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[11].base, 30,
-                            g_static_metadata_bytes + 123),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[12].base, 26,
-                            g_static_metadata_bytes + 153),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[13].base, 22,
-                            g_static_metadata_bytes + 179),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[14].base, 12,
-                            g_static_metadata_bytes + 201),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 1,
-                            g_static_metadata_bytes + 213),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[16].base, 1,
-                            g_static_metadata_bytes + 214),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[17].base, 1,
-                            g_static_metadata_bytes + 215),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[18].base, 1,
-                            g_static_metadata_bytes + 216),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[20].base, 36,
-                            g_static_metadata_bytes + 217),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[21].base, 65,
-                            g_static_metadata_bytes + 253),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[22].base, 65,
-                            g_static_metadata_bytes + 318),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[23].base, 28,
-                            g_static_metadata_bytes + 383),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[24].base, 80,
-                            g_static_metadata_bytes + 411),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[25].base, 80,
-                            g_static_metadata_bytes + 491),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[26].base, 7,
-                            g_static_metadata_bytes + 571),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 4,
-                            g_static_metadata_bytes + 578),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[28].base, 11,
-                            g_static_metadata_bytes + 582),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[29].base, 2,
-                            g_static_metadata_bytes + 593),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[30].base, 8,
-                            g_static_metadata_bytes + 595),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[31].base, 3,
-                            g_static_metadata_bytes + 603),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[32].base, 4,
-                            g_static_metadata_bytes + 606),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[33].base, 1,
-                            g_static_metadata_bytes + 610),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[34].base, 11,
-                            g_static_metadata_bytes + 611),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[11].base, 13,
+                            g_static_metadata_bytes + 129),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[12].base, 14,
+                            g_static_metadata_bytes + 142),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[13].base, 12,
+                            g_static_metadata_bytes + 156),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[14].base, 16,
+                            g_static_metadata_bytes + 168),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 15,
+                            g_static_metadata_bytes + 184),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[16].base, 30,
+                            g_static_metadata_bytes + 199),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[17].base, 4,
+                            g_static_metadata_bytes + 229),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[18].base, 26,
+                            g_static_metadata_bytes + 233),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 22,
+                            g_static_metadata_bytes + 259),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[20].base, 27,
+                            g_static_metadata_bytes + 281),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[21].base, 12,
+                            g_static_metadata_bytes + 308),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[22].base, 10,
+                            g_static_metadata_bytes + 320),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[23].base, 1,
+                            g_static_metadata_bytes + 330),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[24].base, 1,
+                            g_static_metadata_bytes + 331),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[25].base, 1,
+                            g_static_metadata_bytes + 332),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[26].base, 1,
+                            g_static_metadata_bytes + 333),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[28].base, 36,
+                            g_static_metadata_bytes + 334),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[29].base, 65,
+                            g_static_metadata_bytes + 370),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[30].base, 65,
+                            g_static_metadata_bytes + 435),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[31].base, 28,
+                            g_static_metadata_bytes + 500),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[32].base, 80,
+                            g_static_metadata_bytes + 528),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[33].base, 80,
+                            g_static_metadata_bytes + 608),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[34].base, 7,
+                            g_static_metadata_bytes + 688),
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[35].base, 4,
-                            g_static_metadata_bytes + 622),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[36].base, 5,
-                            g_static_metadata_bytes + 626),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[37].base, 3,
-                            g_static_metadata_bytes + 631),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[38].base, 3,
-                            g_static_metadata_bytes + 634),
+                            g_static_metadata_bytes + 695),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[36].base, 11,
+                            g_static_metadata_bytes + 699),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[37].base, 2,
+                            g_static_metadata_bytes + 710),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[38].base, 8,
+                            g_static_metadata_bytes + 712),
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[39].base, 3,
-                            g_static_metadata_bytes + 637),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[40].base, 3,
-                            g_static_metadata_bytes + 640),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[41].base, 3,
-                            g_static_metadata_bytes + 643),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[42].base, 3,
-                            g_static_metadata_bytes + 646),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[43].base, 3,
-                            g_static_metadata_bytes + 649),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[44].base, 14,
-                            g_static_metadata_bytes + 652),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[45].base, 13,
-                            g_static_metadata_bytes + 666),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[46].base, 15,
-                            g_static_metadata_bytes + 679),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[47].base, 13,
-                            g_static_metadata_bytes + 694),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[48].base, 6,
-                            g_static_metadata_bytes + 707),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[49].base, 27,
-                            g_static_metadata_bytes + 713),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[50].base, 3,
-                            g_static_metadata_bytes + 740),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[51].base, 5,
+                            g_static_metadata_bytes + 720),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[40].base, 4,
+                            g_static_metadata_bytes + 723),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[41].base, 1,
+                            g_static_metadata_bytes + 727),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[42].base, 11,
+                            g_static_metadata_bytes + 728),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[43].base, 4,
+                            g_static_metadata_bytes + 739),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[44].base, 5,
                             g_static_metadata_bytes + 743),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[52].base, 13,
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[45].base, 3,
                             g_static_metadata_bytes + 748),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[46].base, 3,
+                            g_static_metadata_bytes + 751),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[47].base, 3,
+                            g_static_metadata_bytes + 754),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[48].base, 3,
+                            g_static_metadata_bytes + 757),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[49].base, 3,
+                            g_static_metadata_bytes + 760),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[50].base, 3,
+                            g_static_metadata_bytes + 763),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[51].base, 3,
+                            g_static_metadata_bytes + 766),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[52].base, 14,
+                            g_static_metadata_bytes + 769),
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[53].base, 13,
-                            g_static_metadata_bytes + 761),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[54].base, 19,
-                            g_static_metadata_bytes + 774),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[55].base, 16,
-                            g_static_metadata_bytes + 793),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[56].base, 14,
-                            g_static_metadata_bytes + 809),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[57].base, 16,
-                            g_static_metadata_bytes + 823),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[58].base, 13,
-                            g_static_metadata_bytes + 839),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[59].base, 6,
-                            g_static_metadata_bytes + 852),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[60].base, 4,
-                            g_static_metadata_bytes + 858),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[61].base, 4,
-                            g_static_metadata_bytes + 862),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[62].base, 6,
-                            g_static_metadata_bytes + 866),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[63].base, 7,
-                            g_static_metadata_bytes + 872),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[64].base, 4,
-                            g_static_metadata_bytes + 879),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[65].base, 4,
-                            g_static_metadata_bytes + 883),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[66].base, 8,
-                            g_static_metadata_bytes + 887),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[67].base, 17,
-                            g_static_metadata_bytes + 895),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[68].base, 13,
-                            g_static_metadata_bytes + 912),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[69].base, 8,
-                            g_static_metadata_bytes + 925),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[70].base, 19,
-                            g_static_metadata_bytes + 933),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[71].base, 13,
-                            g_static_metadata_bytes + 952),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[72].base, 4,
-                            g_static_metadata_bytes + 965),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[73].base, 8,
+                            g_static_metadata_bytes + 783),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[54].base, 15,
+                            g_static_metadata_bytes + 796),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[55].base, 13,
+                            g_static_metadata_bytes + 811),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[56].base, 6,
+                            g_static_metadata_bytes + 824),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[57].base, 27,
+                            g_static_metadata_bytes + 830),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[58].base, 3,
+                            g_static_metadata_bytes + 857),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[59].base, 5,
+                            g_static_metadata_bytes + 860),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[60].base, 13,
+                            g_static_metadata_bytes + 865),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[61].base, 13,
+                            g_static_metadata_bytes + 878),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[62].base, 19,
+                            g_static_metadata_bytes + 891),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[63].base, 16,
+                            g_static_metadata_bytes + 910),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[64].base, 14,
+                            g_static_metadata_bytes + 926),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[65].base, 16,
+                            g_static_metadata_bytes + 940),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[66].base, 13,
+                            g_static_metadata_bytes + 956),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[67].base, 6,
                             g_static_metadata_bytes + 969),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[74].base, 12,
-                            g_static_metadata_bytes + 977),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[75].base, 18,
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[68].base, 4,
+                            g_static_metadata_bytes + 975),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[69].base, 4,
+                            g_static_metadata_bytes + 979),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[70].base, 6,
+                            g_static_metadata_bytes + 983),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[71].base, 7,
                             g_static_metadata_bytes + 989),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[76].base, 19,
-                            g_static_metadata_bytes + 1007),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[77].base, 5,
-                            g_static_metadata_bytes + 1026),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[78].base, 7,
-                            g_static_metadata_bytes + 1031),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[79].base, 7,
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[72].base, 4,
+                            g_static_metadata_bytes + 996),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[73].base, 8,
+                            g_static_metadata_bytes + 1000),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[74].base, 17,
+                            g_static_metadata_bytes + 1008),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[75].base, 13,
+                            g_static_metadata_bytes + 1025),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[76].base, 8,
                             g_static_metadata_bytes + 1038),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[80].base, 11,
-                            g_static_metadata_bytes + 1045),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[81].base, 6,
-                            g_static_metadata_bytes + 1056),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[82].base, 10,
-                            g_static_metadata_bytes + 1062),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[83].base, 25,
-                            g_static_metadata_bytes + 1072),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[84].base, 17,
-                            g_static_metadata_bytes + 1097),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[85].base, 10,
-                            g_static_metadata_bytes + 1114),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[86].base, 4,
-                            g_static_metadata_bytes + 1124),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[87].base, 3,
-                            g_static_metadata_bytes + 1128),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[88].base, 16,
-                            g_static_metadata_bytes + 1131),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[89].base, 1,
-                            g_static_metadata_bytes + 1147),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[90].base, 8,
-                            g_static_metadata_bytes + 1148),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[91].base, 16,
-                            g_static_metadata_bytes + 1156),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[77].base, 19,
+                            g_static_metadata_bytes + 1046),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[78].base, 13,
+                            g_static_metadata_bytes + 1065),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[79].base, 4,
+                            g_static_metadata_bytes + 1078),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[80].base, 8,
+                            g_static_metadata_bytes + 1082),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[81].base, 12,
+                            g_static_metadata_bytes + 1090),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[82].base, 18,
+                            g_static_metadata_bytes + 1102),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[83].base, 19,
+                            g_static_metadata_bytes + 1120),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[84].base, 5,
+                            g_static_metadata_bytes + 1139),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[85].base, 7,
+                            g_static_metadata_bytes + 1144),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[86].base, 7,
+                            g_static_metadata_bytes + 1151),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[87].base, 11,
+                            g_static_metadata_bytes + 1158),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[88].base, 6,
+                            g_static_metadata_bytes + 1169),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[89].base, 10,
+                            g_static_metadata_bytes + 1175),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[90].base, 25,
+                            g_static_metadata_bytes + 1185),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[91].base, 17,
+                            g_static_metadata_bytes + 1210),
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[92].base, 4,
-                            g_static_metadata_bytes + 1172),
+                            g_static_metadata_bytes + 1227),
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[93].base, 3,
-                            g_static_metadata_bytes + 1176),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[94].base, 11,
-                            g_static_metadata_bytes + 1179),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[95].base, 16,
-                            g_static_metadata_bytes + 1190),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 13,
-                            g_static_metadata_bytes + 1206),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[97].base, 12,
-                            g_static_metadata_bytes + 1219),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[98].base, 21,
                             g_static_metadata_bytes + 1231),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[94].base, 16,
+                            g_static_metadata_bytes + 1234),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[95].base, 1,
+                            g_static_metadata_bytes + 1250),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 8,
+                            g_static_metadata_bytes + 1251),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[97].base, 16,
+                            g_static_metadata_bytes + 1259),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[98].base, 4,
+                            g_static_metadata_bytes + 1275),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[99].base, 3,
+                            g_static_metadata_bytes + 1279),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[100].base, 11,
+                            g_static_metadata_bytes + 1282),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[101].base, 16,
+                            g_static_metadata_bytes + 1293),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[102].base, 13,
+                            g_static_metadata_bytes + 1309),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[103].base, 12,
+                            g_static_metadata_bytes + 1322),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[104].base, 21,
+                            g_static_metadata_bytes + 1334),
 };
 }  // namespace grpc_core
diff --git a/src/core/lib/slice/static_slice.h b/src/core/lib/slice/static_slice.h
index 267b7ab..15c0278 100644
--- a/src/core/lib/slice/static_slice.h
+++ b/src/core/lib/slice/static_slice.h
@@ -38,7 +38,7 @@
 static_assert(
     std::is_trivially_destructible<grpc_core::StaticMetadataSlice>::value,
     "StaticMetadataSlice must be trivially destructible.");
-#define GRPC_STATIC_MDSTR_COUNT 99
+#define GRPC_STATIC_MDSTR_COUNT 105
 /* ":path" */
 #define GRPC_MDSTR_PATH (::grpc_core::g_static_metadata_slice_table[0])
 /* ":method" */
@@ -49,236 +49,253 @@
 #define GRPC_MDSTR_AUTHORITY (::grpc_core::g_static_metadata_slice_table[3])
 /* ":scheme" */
 #define GRPC_MDSTR_SCHEME (::grpc_core::g_static_metadata_slice_table[4])
+/* "grpc-message" */
+#define GRPC_MDSTR_GRPC_MESSAGE (::grpc_core::g_static_metadata_slice_table[5])
 /* "grpc-status" */
-#define GRPC_MDSTR_GRPC_STATUS (::grpc_core::g_static_metadata_slice_table[5])
+#define GRPC_MDSTR_GRPC_STATUS (::grpc_core::g_static_metadata_slice_table[6])
+/* "grpc-payload-bin" */
+#define GRPC_MDSTR_GRPC_PAYLOAD_BIN \
+  (::grpc_core::g_static_metadata_slice_table[7])
 /* "grpc-encoding" */
-#define GRPC_MDSTR_GRPC_ENCODING (::grpc_core::g_static_metadata_slice_table[6])
+#define GRPC_MDSTR_GRPC_ENCODING (::grpc_core::g_static_metadata_slice_table[8])
 /* "grpc-accept-encoding" */
 #define GRPC_MDSTR_GRPC_ACCEPT_ENCODING \
-  (::grpc_core::g_static_metadata_slice_table[7])
+  (::grpc_core::g_static_metadata_slice_table[9])
+/* "grpc-server-stats-bin" */
+#define GRPC_MDSTR_GRPC_SERVER_STATS_BIN \
+  (::grpc_core::g_static_metadata_slice_table[10])
+/* "grpc-tags-bin" */
+#define GRPC_MDSTR_GRPC_TAGS_BIN \
+  (::grpc_core::g_static_metadata_slice_table[11])
+/* "grpc-trace-bin" */
+#define GRPC_MDSTR_GRPC_TRACE_BIN \
+  (::grpc_core::g_static_metadata_slice_table[12])
 /* "content-type" */
-#define GRPC_MDSTR_CONTENT_TYPE (::grpc_core::g_static_metadata_slice_table[8])
+#define GRPC_MDSTR_CONTENT_TYPE (::grpc_core::g_static_metadata_slice_table[13])
 /* "content-encoding" */
 #define GRPC_MDSTR_CONTENT_ENCODING \
-  (::grpc_core::g_static_metadata_slice_table[9])
+  (::grpc_core::g_static_metadata_slice_table[14])
 /* "accept-encoding" */
 #define GRPC_MDSTR_ACCEPT_ENCODING \
-  (::grpc_core::g_static_metadata_slice_table[10])
+  (::grpc_core::g_static_metadata_slice_table[15])
 /* "grpc-internal-encoding-request" */
 #define GRPC_MDSTR_GRPC_INTERNAL_ENCODING_REQUEST \
-  (::grpc_core::g_static_metadata_slice_table[11])
+  (::grpc_core::g_static_metadata_slice_table[16])
+/* "host" */
+#define GRPC_MDSTR_HOST (::grpc_core::g_static_metadata_slice_table[17])
 /* "grpc-previous-rpc-attempts" */
 #define GRPC_MDSTR_GRPC_PREVIOUS_RPC_ATTEMPTS \
-  (::grpc_core::g_static_metadata_slice_table[12])
+  (::grpc_core::g_static_metadata_slice_table[18])
 /* "grpc-retry-pushback-ms" */
 #define GRPC_MDSTR_GRPC_RETRY_PUSHBACK_MS \
-  (::grpc_core::g_static_metadata_slice_table[13])
+  (::grpc_core::g_static_metadata_slice_table[19])
+/* "x-endpoint-load-metrics-bin" */
+#define GRPC_MDSTR_X_ENDPOINT_LOAD_METRICS_BIN \
+  (::grpc_core::g_static_metadata_slice_table[20])
 /* "grpc-timeout" */
-#define GRPC_MDSTR_GRPC_TIMEOUT (::grpc_core::g_static_metadata_slice_table[14])
+#define GRPC_MDSTR_GRPC_TIMEOUT (::grpc_core::g_static_metadata_slice_table[21])
+/* "user-agent" */
+#define GRPC_MDSTR_USER_AGENT (::grpc_core::g_static_metadata_slice_table[22])
 /* "1" */
-#define GRPC_MDSTR_1 (::grpc_core::g_static_metadata_slice_table[15])
+#define GRPC_MDSTR_1 (::grpc_core::g_static_metadata_slice_table[23])
 /* "2" */
-#define GRPC_MDSTR_2 (::grpc_core::g_static_metadata_slice_table[16])
+#define GRPC_MDSTR_2 (::grpc_core::g_static_metadata_slice_table[24])
 /* "3" */
-#define GRPC_MDSTR_3 (::grpc_core::g_static_metadata_slice_table[17])
+#define GRPC_MDSTR_3 (::grpc_core::g_static_metadata_slice_table[25])
 /* "4" */
-#define GRPC_MDSTR_4 (::grpc_core::g_static_metadata_slice_table[18])
+#define GRPC_MDSTR_4 (::grpc_core::g_static_metadata_slice_table[26])
 /* "" */
-#define GRPC_MDSTR_EMPTY (::grpc_core::g_static_metadata_slice_table[19])
+#define GRPC_MDSTR_EMPTY (::grpc_core::g_static_metadata_slice_table[27])
 /* "/grpc.lb.v1.LoadBalancer/BalanceLoad" */
 #define GRPC_MDSTR_SLASH_GRPC_DOT_LB_DOT_V1_DOT_LOADBALANCER_SLASH_BALANCELOAD \
-  (::grpc_core::g_static_metadata_slice_table[20])
+  (::grpc_core::g_static_metadata_slice_table[28])
 /* "/envoy.service.load_stats.v2.LoadReportingService/StreamLoadStats" */
 #define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V2_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS \
-  (::grpc_core::g_static_metadata_slice_table[21])
+  (::grpc_core::g_static_metadata_slice_table[29])
 /* "/envoy.service.load_stats.v3.LoadReportingService/StreamLoadStats" */
 #define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_LOAD_STATS_DOT_V3_DOT_LOADREPORTINGSERVICE_SLASH_STREAMLOADSTATS \
-  (::grpc_core::g_static_metadata_slice_table[22])
+  (::grpc_core::g_static_metadata_slice_table[30])
 /* "/grpc.health.v1.Health/Watch" */
 #define GRPC_MDSTR_SLASH_GRPC_DOT_HEALTH_DOT_V1_DOT_HEALTH_SLASH_WATCH \
-  (::grpc_core::g_static_metadata_slice_table[23])
+  (::grpc_core::g_static_metadata_slice_table[31])
 /* "/envoy.service.discovery.v2.AggregatedDiscoveryService/StreamAggregatedResources"
  */
 #define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V2_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES \
-  (::grpc_core::g_static_metadata_slice_table[24])
+  (::grpc_core::g_static_metadata_slice_table[32])
 /* "/envoy.service.discovery.v3.AggregatedDiscoveryService/StreamAggregatedResources"
  */
 #define GRPC_MDSTR_SLASH_ENVOY_DOT_SERVICE_DOT_DISCOVERY_DOT_V3_DOT_AGGREGATEDDISCOVERYSERVICE_SLASH_STREAMAGGREGATEDRESOURCES \
-  (::grpc_core::g_static_metadata_slice_table[25])
+  (::grpc_core::g_static_metadata_slice_table[33])
 /* "deflate" */
-#define GRPC_MDSTR_DEFLATE (::grpc_core::g_static_metadata_slice_table[26])
+#define GRPC_MDSTR_DEFLATE (::grpc_core::g_static_metadata_slice_table[34])
 /* "gzip" */
-#define GRPC_MDSTR_GZIP (::grpc_core::g_static_metadata_slice_table[27])
+#define GRPC_MDSTR_GZIP (::grpc_core::g_static_metadata_slice_table[35])
 /* "stream/gzip" */
 #define GRPC_MDSTR_STREAM_SLASH_GZIP \
-  (::grpc_core::g_static_metadata_slice_table[28])
+  (::grpc_core::g_static_metadata_slice_table[36])
 /* "te" */
-#define GRPC_MDSTR_TE (::grpc_core::g_static_metadata_slice_table[29])
+#define GRPC_MDSTR_TE (::grpc_core::g_static_metadata_slice_table[37])
 /* "trailers" */
-#define GRPC_MDSTR_TRAILERS (::grpc_core::g_static_metadata_slice_table[30])
+#define GRPC_MDSTR_TRAILERS (::grpc_core::g_static_metadata_slice_table[38])
 /* "GET" */
-#define GRPC_MDSTR_GET (::grpc_core::g_static_metadata_slice_table[31])
+#define GRPC_MDSTR_GET (::grpc_core::g_static_metadata_slice_table[39])
 /* "POST" */
-#define GRPC_MDSTR_POST (::grpc_core::g_static_metadata_slice_table[32])
+#define GRPC_MDSTR_POST (::grpc_core::g_static_metadata_slice_table[40])
 /* "/" */
-#define GRPC_MDSTR_SLASH (::grpc_core::g_static_metadata_slice_table[33])
+#define GRPC_MDSTR_SLASH (::grpc_core::g_static_metadata_slice_table[41])
 /* "/index.html" */
 #define GRPC_MDSTR_SLASH_INDEX_DOT_HTML \
-  (::grpc_core::g_static_metadata_slice_table[34])
+  (::grpc_core::g_static_metadata_slice_table[42])
 /* "http" */
-#define GRPC_MDSTR_HTTP (::grpc_core::g_static_metadata_slice_table[35])
+#define GRPC_MDSTR_HTTP (::grpc_core::g_static_metadata_slice_table[43])
 /* "https" */
-#define GRPC_MDSTR_HTTPS (::grpc_core::g_static_metadata_slice_table[36])
+#define GRPC_MDSTR_HTTPS (::grpc_core::g_static_metadata_slice_table[44])
 /* "200" */
-#define GRPC_MDSTR_200 (::grpc_core::g_static_metadata_slice_table[37])
+#define GRPC_MDSTR_200 (::grpc_core::g_static_metadata_slice_table[45])
 /* "204" */
-#define GRPC_MDSTR_204 (::grpc_core::g_static_metadata_slice_table[38])
+#define GRPC_MDSTR_204 (::grpc_core::g_static_metadata_slice_table[46])
 /* "206" */
-#define GRPC_MDSTR_206 (::grpc_core::g_static_metadata_slice_table[39])
+#define GRPC_MDSTR_206 (::grpc_core::g_static_metadata_slice_table[47])
 /* "304" */
-#define GRPC_MDSTR_304 (::grpc_core::g_static_metadata_slice_table[40])
+#define GRPC_MDSTR_304 (::grpc_core::g_static_metadata_slice_table[48])
 /* "400" */
-#define GRPC_MDSTR_400 (::grpc_core::g_static_metadata_slice_table[41])
+#define GRPC_MDSTR_400 (::grpc_core::g_static_metadata_slice_table[49])
 /* "404" */
-#define GRPC_MDSTR_404 (::grpc_core::g_static_metadata_slice_table[42])
+#define GRPC_MDSTR_404 (::grpc_core::g_static_metadata_slice_table[50])
 /* "500" */
-#define GRPC_MDSTR_500 (::grpc_core::g_static_metadata_slice_table[43])
+#define GRPC_MDSTR_500 (::grpc_core::g_static_metadata_slice_table[51])
 /* "accept-charset" */
 #define GRPC_MDSTR_ACCEPT_CHARSET \
-  (::grpc_core::g_static_metadata_slice_table[44])
+  (::grpc_core::g_static_metadata_slice_table[52])
 /* "gzip, deflate" */
 #define GRPC_MDSTR_GZIP_COMMA_DEFLATE \
-  (::grpc_core::g_static_metadata_slice_table[45])
+  (::grpc_core::g_static_metadata_slice_table[53])
 /* "accept-language" */
 #define GRPC_MDSTR_ACCEPT_LANGUAGE \
-  (::grpc_core::g_static_metadata_slice_table[46])
+  (::grpc_core::g_static_metadata_slice_table[54])
 /* "accept-ranges" */
 #define GRPC_MDSTR_ACCEPT_RANGES \
-  (::grpc_core::g_static_metadata_slice_table[47])
+  (::grpc_core::g_static_metadata_slice_table[55])
 /* "accept" */
-#define GRPC_MDSTR_ACCEPT (::grpc_core::g_static_metadata_slice_table[48])
+#define GRPC_MDSTR_ACCEPT (::grpc_core::g_static_metadata_slice_table[56])
 /* "access-control-allow-origin" */
 #define GRPC_MDSTR_ACCESS_CONTROL_ALLOW_ORIGIN \
-  (::grpc_core::g_static_metadata_slice_table[49])
+  (::grpc_core::g_static_metadata_slice_table[57])
 /* "age" */
-#define GRPC_MDSTR_AGE (::grpc_core::g_static_metadata_slice_table[50])
+#define GRPC_MDSTR_AGE (::grpc_core::g_static_metadata_slice_table[58])
 /* "allow" */
-#define GRPC_MDSTR_ALLOW (::grpc_core::g_static_metadata_slice_table[51])
+#define GRPC_MDSTR_ALLOW (::grpc_core::g_static_metadata_slice_table[59])
 /* "authorization" */
 #define GRPC_MDSTR_AUTHORIZATION \
-  (::grpc_core::g_static_metadata_slice_table[52])
+  (::grpc_core::g_static_metadata_slice_table[60])
 /* "cache-control" */
 #define GRPC_MDSTR_CACHE_CONTROL \
-  (::grpc_core::g_static_metadata_slice_table[53])
+  (::grpc_core::g_static_metadata_slice_table[61])
 /* "content-disposition" */
 #define GRPC_MDSTR_CONTENT_DISPOSITION \
-  (::grpc_core::g_static_metadata_slice_table[54])
+  (::grpc_core::g_static_metadata_slice_table[62])
 /* "content-language" */
 #define GRPC_MDSTR_CONTENT_LANGUAGE \
-  (::grpc_core::g_static_metadata_slice_table[55])
+  (::grpc_core::g_static_metadata_slice_table[63])
 /* "content-length" */
 #define GRPC_MDSTR_CONTENT_LENGTH \
-  (::grpc_core::g_static_metadata_slice_table[56])
+  (::grpc_core::g_static_metadata_slice_table[64])
 /* "content-location" */
 #define GRPC_MDSTR_CONTENT_LOCATION \
-  (::grpc_core::g_static_metadata_slice_table[57])
+  (::grpc_core::g_static_metadata_slice_table[65])
 /* "content-range" */
 #define GRPC_MDSTR_CONTENT_RANGE \
-  (::grpc_core::g_static_metadata_slice_table[58])
+  (::grpc_core::g_static_metadata_slice_table[66])
 /* "cookie" */
-#define GRPC_MDSTR_COOKIE (::grpc_core::g_static_metadata_slice_table[59])
+#define GRPC_MDSTR_COOKIE (::grpc_core::g_static_metadata_slice_table[67])
 /* "date" */
-#define GRPC_MDSTR_DATE (::grpc_core::g_static_metadata_slice_table[60])
+#define GRPC_MDSTR_DATE (::grpc_core::g_static_metadata_slice_table[68])
 /* "etag" */
-#define GRPC_MDSTR_ETAG (::grpc_core::g_static_metadata_slice_table[61])
+#define GRPC_MDSTR_ETAG (::grpc_core::g_static_metadata_slice_table[69])
 /* "expect" */
-#define GRPC_MDSTR_EXPECT (::grpc_core::g_static_metadata_slice_table[62])
+#define GRPC_MDSTR_EXPECT (::grpc_core::g_static_metadata_slice_table[70])
 /* "expires" */
-#define GRPC_MDSTR_EXPIRES (::grpc_core::g_static_metadata_slice_table[63])
+#define GRPC_MDSTR_EXPIRES (::grpc_core::g_static_metadata_slice_table[71])
 /* "from" */
-#define GRPC_MDSTR_FROM (::grpc_core::g_static_metadata_slice_table[64])
-/* "host" */
-#define GRPC_MDSTR_HOST (::grpc_core::g_static_metadata_slice_table[65])
+#define GRPC_MDSTR_FROM (::grpc_core::g_static_metadata_slice_table[72])
 /* "if-match" */
-#define GRPC_MDSTR_IF_MATCH (::grpc_core::g_static_metadata_slice_table[66])
+#define GRPC_MDSTR_IF_MATCH (::grpc_core::g_static_metadata_slice_table[73])
 /* "if-modified-since" */
 #define GRPC_MDSTR_IF_MODIFIED_SINCE \
-  (::grpc_core::g_static_metadata_slice_table[67])
+  (::grpc_core::g_static_metadata_slice_table[74])
 /* "if-none-match" */
 #define GRPC_MDSTR_IF_NONE_MATCH \
-  (::grpc_core::g_static_metadata_slice_table[68])
+  (::grpc_core::g_static_metadata_slice_table[75])
 /* "if-range" */
-#define GRPC_MDSTR_IF_RANGE (::grpc_core::g_static_metadata_slice_table[69])
+#define GRPC_MDSTR_IF_RANGE (::grpc_core::g_static_metadata_slice_table[76])
 /* "if-unmodified-since" */
 #define GRPC_MDSTR_IF_UNMODIFIED_SINCE \
-  (::grpc_core::g_static_metadata_slice_table[70])
+  (::grpc_core::g_static_metadata_slice_table[77])
 /* "last-modified" */
 #define GRPC_MDSTR_LAST_MODIFIED \
-  (::grpc_core::g_static_metadata_slice_table[71])
+  (::grpc_core::g_static_metadata_slice_table[78])
 /* "link" */
-#define GRPC_MDSTR_LINK (::grpc_core::g_static_metadata_slice_table[72])
+#define GRPC_MDSTR_LINK (::grpc_core::g_static_metadata_slice_table[79])
 /* "location" */
-#define GRPC_MDSTR_LOCATION (::grpc_core::g_static_metadata_slice_table[73])
+#define GRPC_MDSTR_LOCATION (::grpc_core::g_static_metadata_slice_table[80])
 /* "max-forwards" */
-#define GRPC_MDSTR_MAX_FORWARDS (::grpc_core::g_static_metadata_slice_table[74])
+#define GRPC_MDSTR_MAX_FORWARDS (::grpc_core::g_static_metadata_slice_table[81])
 /* "proxy-authenticate" */
 #define GRPC_MDSTR_PROXY_AUTHENTICATE \
-  (::grpc_core::g_static_metadata_slice_table[75])
+  (::grpc_core::g_static_metadata_slice_table[82])
 /* "proxy-authorization" */
 #define GRPC_MDSTR_PROXY_AUTHORIZATION \
-  (::grpc_core::g_static_metadata_slice_table[76])
+  (::grpc_core::g_static_metadata_slice_table[83])
 /* "range" */
-#define GRPC_MDSTR_RANGE (::grpc_core::g_static_metadata_slice_table[77])
+#define GRPC_MDSTR_RANGE (::grpc_core::g_static_metadata_slice_table[84])
 /* "referer" */
-#define GRPC_MDSTR_REFERER (::grpc_core::g_static_metadata_slice_table[78])
+#define GRPC_MDSTR_REFERER (::grpc_core::g_static_metadata_slice_table[85])
 /* "refresh" */
-#define GRPC_MDSTR_REFRESH (::grpc_core::g_static_metadata_slice_table[79])
+#define GRPC_MDSTR_REFRESH (::grpc_core::g_static_metadata_slice_table[86])
 /* "retry-after" */
-#define GRPC_MDSTR_RETRY_AFTER (::grpc_core::g_static_metadata_slice_table[80])
+#define GRPC_MDSTR_RETRY_AFTER (::grpc_core::g_static_metadata_slice_table[87])
 /* "server" */
-#define GRPC_MDSTR_SERVER (::grpc_core::g_static_metadata_slice_table[81])
+#define GRPC_MDSTR_SERVER (::grpc_core::g_static_metadata_slice_table[88])
 /* "set-cookie" */
-#define GRPC_MDSTR_SET_COOKIE (::grpc_core::g_static_metadata_slice_table[82])
+#define GRPC_MDSTR_SET_COOKIE (::grpc_core::g_static_metadata_slice_table[89])
 /* "strict-transport-security" */
 #define GRPC_MDSTR_STRICT_TRANSPORT_SECURITY \
-  (::grpc_core::g_static_metadata_slice_table[83])
+  (::grpc_core::g_static_metadata_slice_table[90])
 /* "transfer-encoding" */
 #define GRPC_MDSTR_TRANSFER_ENCODING \
-  (::grpc_core::g_static_metadata_slice_table[84])
-/* "user-agent" */
-#define GRPC_MDSTR_USER_AGENT (::grpc_core::g_static_metadata_slice_table[85])
+  (::grpc_core::g_static_metadata_slice_table[91])
 /* "vary" */
-#define GRPC_MDSTR_VARY (::grpc_core::g_static_metadata_slice_table[86])
+#define GRPC_MDSTR_VARY (::grpc_core::g_static_metadata_slice_table[92])
 /* "via" */
-#define GRPC_MDSTR_VIA (::grpc_core::g_static_metadata_slice_table[87])
+#define GRPC_MDSTR_VIA (::grpc_core::g_static_metadata_slice_table[93])
 /* "www-authenticate" */
 #define GRPC_MDSTR_WWW_AUTHENTICATE \
-  (::grpc_core::g_static_metadata_slice_table[88])
+  (::grpc_core::g_static_metadata_slice_table[94])
 /* "0" */
-#define GRPC_MDSTR_0 (::grpc_core::g_static_metadata_slice_table[89])
+#define GRPC_MDSTR_0 (::grpc_core::g_static_metadata_slice_table[95])
 /* "identity" */
-#define GRPC_MDSTR_IDENTITY (::grpc_core::g_static_metadata_slice_table[90])
+#define GRPC_MDSTR_IDENTITY (::grpc_core::g_static_metadata_slice_table[96])
 /* "application/grpc" */
 #define GRPC_MDSTR_APPLICATION_SLASH_GRPC \
-  (::grpc_core::g_static_metadata_slice_table[91])
+  (::grpc_core::g_static_metadata_slice_table[97])
 /* "grpc" */
-#define GRPC_MDSTR_GRPC (::grpc_core::g_static_metadata_slice_table[92])
+#define GRPC_MDSTR_GRPC (::grpc_core::g_static_metadata_slice_table[98])
 /* "PUT" */
-#define GRPC_MDSTR_PUT (::grpc_core::g_static_metadata_slice_table[93])
+#define GRPC_MDSTR_PUT (::grpc_core::g_static_metadata_slice_table[99])
 /* "lb-cost-bin" */
-#define GRPC_MDSTR_LB_COST_BIN (::grpc_core::g_static_metadata_slice_table[94])
+#define GRPC_MDSTR_LB_COST_BIN (::grpc_core::g_static_metadata_slice_table[100])
 /* "identity,deflate" */
 #define GRPC_MDSTR_IDENTITY_COMMA_DEFLATE \
-  (::grpc_core::g_static_metadata_slice_table[95])
+  (::grpc_core::g_static_metadata_slice_table[101])
 /* "identity,gzip" */
 #define GRPC_MDSTR_IDENTITY_COMMA_GZIP \
-  (::grpc_core::g_static_metadata_slice_table[96])
+  (::grpc_core::g_static_metadata_slice_table[102])
 /* "deflate,gzip" */
 #define GRPC_MDSTR_DEFLATE_COMMA_GZIP \
-  (::grpc_core::g_static_metadata_slice_table[97])
+  (::grpc_core::g_static_metadata_slice_table[103])
 /* "identity,deflate,gzip" */
 #define GRPC_MDSTR_IDENTITY_COMMA_DEFLATE_COMMA_GZIP \
-  (::grpc_core::g_static_metadata_slice_table[98])
+  (::grpc_core::g_static_metadata_slice_table[104])
 
 namespace grpc_core {
 extern StaticSliceRefcount
diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc
index bb5a115..309c5b7 100644
--- a/src/core/lib/surface/call.cc
+++ b/src/core/lib/surface/call.cc
@@ -899,6 +899,7 @@
 static int prepare_application_metadata(grpc_call* call, int count,
                                         grpc_metadata* metadata,
                                         int is_trailing,
+                                        int prepend_extra_metadata,
                                         grpc_metadata* additional_metadata,
                                         int additional_metadata_count) {
   int total_count = count + additional_metadata_count;
@@ -931,6 +932,16 @@
     }
     return 0;
   }
+  if (prepend_extra_metadata) {
+    if (call->send_extra_metadata_count == 0) {
+      prepend_extra_metadata = 0;
+    } else {
+      for (i = 0; i < call->send_extra_metadata_count; i++) {
+        GRPC_LOG_IF_ERROR("prepare_application_metadata",
+                          batch->LinkTail(&call->send_extra_metadata[i]));
+      }
+    }
+  }
   for (i = 0; i < total_count; i++) {
     grpc_metadata* md = get_md_elem(metadata, additional_metadata, i, count);
     grpc_linked_mdelem* l = linked_from_md(md);
@@ -940,6 +951,7 @@
     }
     GRPC_LOG_IF_ERROR("prepare_application_metadata", error);
   }
+  call->send_extra_metadata_count = 0;
 
   return 1;
 }
@@ -1077,10 +1089,12 @@
                                  static_cast<intptr_t>(status_code));
       gpr_free(peer);
     }
-    auto grpc_message = b->Take(grpc_core::GrpcMessageMetadata());
-    if (grpc_message.has_value()) {
-      error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE,
-                                 grpc_message->as_string_view());
+    if (b->legacy_index()->named.grpc_message != nullptr) {
+      error = grpc_error_set_str(
+          error, GRPC_ERROR_STR_GRPC_MESSAGE,
+          grpc_core::StringViewFromSlice(
+              GRPC_MDVALUE(b->legacy_index()->named.grpc_message->md)));
+      b->Remove(GRPC_BATCH_GRPC_MESSAGE);
     } else if (error != GRPC_ERROR_NONE) {
       error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, "");
     }
@@ -1661,20 +1675,10 @@
         }
         stream_op->send_initial_metadata = true;
         call->sent_initial_metadata = true;
-        if (call->is_client) {
-          // TODO(ctiller): this will turn into explicit Set() calls once we
-          // migrate :path, :authority.
-          for (int i = 0; i < call->send_extra_metadata_count; i++) {
-            GRPC_LOG_IF_ERROR("prepare_client_metadata",
-                              call->send_initial_metadata.LinkTail(
-                                  &call->send_extra_metadata[i]));
-          }
-          call->send_extra_metadata_count = 0;
-        }
         if (!prepare_application_metadata(
                 call, static_cast<int>(op->data.send_initial_metadata.count),
-                op->data.send_initial_metadata.metadata, 0, &compression_md,
-                static_cast<int>(additional_metadata_count))) {
+                op->data.send_initial_metadata.metadata, 0, call->is_client,
+                &compression_md, static_cast<int>(additional_metadata_count))) {
           error = GRPC_CALL_ERROR_INVALID_METADATA;
           goto done_with_error;
         }
@@ -1766,17 +1770,10 @@
         }
         stream_op->send_trailing_metadata = true;
         call->sent_final_op = true;
-
-        if (!prepare_application_metadata(
-                call,
-                static_cast<int>(
-                    op->data.send_status_from_server.trailing_metadata_count),
-                op->data.send_status_from_server.trailing_metadata, 1, nullptr,
-                0)) {
-          error = GRPC_CALL_ERROR_INVALID_METADATA;
-          goto done_with_error;
-        }
-
+        GPR_ASSERT(call->send_extra_metadata_count == 0);
+        call->send_extra_metadata_count = 1;
+        call->send_extra_metadata[0].md = grpc_get_reffed_status_elem(
+            op->data.send_status_from_server.status);
         grpc_error_handle status_error =
             op->data.send_status_from_server.status == GRPC_STATUS_OK
                 ? GRPC_ERROR_NONE
@@ -1787,26 +1784,36 @@
                       static_cast<intptr_t>(
                           op->data.send_status_from_server.status));
         if (op->data.send_status_from_server.status_details != nullptr) {
-          call->send_trailing_metadata.Set(
-              grpc_core::GrpcMessageMetadata(),
-              grpc_core::Slice(grpc_slice_copy(
-                  *op->data.send_status_from_server.status_details)));
+          call->send_extra_metadata[1].md = grpc_mdelem_from_slices(
+              GRPC_MDSTR_GRPC_MESSAGE,
+              grpc_slice_copy(
+                  *op->data.send_status_from_server.status_details));
+          call->send_extra_metadata_count++;
           if (status_error != GRPC_ERROR_NONE) {
-            status_error = grpc_error_set_str(
-                status_error, GRPC_ERROR_STR_GRPC_MESSAGE,
-                grpc_core::StringViewFromSlice(
-                    *op->data.send_status_from_server.status_details));
+            char* msg = grpc_slice_to_c_string(
+                GRPC_MDVALUE(call->send_extra_metadata[1].md));
+            status_error = grpc_error_set_str(status_error,
+                                              GRPC_ERROR_STR_GRPC_MESSAGE, msg);
+            gpr_free(msg);
           }
         }
 
         call->status_error.set(status_error);
         GRPC_ERROR_UNREF(status_error);
 
-        GRPC_LOG_IF_ERROR(
-            "set call status",
-            call->send_trailing_metadata.Append(grpc_get_reffed_status_elem(
-                op->data.send_status_from_server.status)));
-
+        if (!prepare_application_metadata(
+                call,
+                static_cast<int>(
+                    op->data.send_status_from_server.trailing_metadata_count),
+                op->data.send_status_from_server.trailing_metadata, 1, 1,
+                nullptr, 0)) {
+          for (int n = 0; n < call->send_extra_metadata_count; n++) {
+            GRPC_MDELEM_UNREF(call->send_extra_metadata[n].md);
+          }
+          call->send_extra_metadata_count = 0;
+          error = GRPC_CALL_ERROR_INVALID_METADATA;
+          goto done_with_error;
+        }
         stream_op_payload->send_trailing_metadata.send_trailing_metadata =
             &call->send_trailing_metadata;
         stream_op_payload->send_trailing_metadata.sent =
diff --git a/src/core/lib/transport/metadata_batch.h b/src/core/lib/transport/metadata_batch.h
index 6ea4ae3..d2b8de6 100644
--- a/src/core/lib/transport/metadata_batch.h
+++ b/src/core/lib/transport/metadata_batch.h
@@ -138,9 +138,11 @@
   }
 };
 
-struct SimpleSliceBasedMetadata {
+// user-agent metadata trait.
+struct UserAgentMetadata {
   using ValueType = Slice;
   using MementoType = Slice;
+  static absl::string_view key() { return "user-agent"; }
   static MementoType ParseMemento(Slice value) { return value.TakeOwned(); }
   static ValueType MementoToValue(MementoType value) { return value; }
   static Slice Encode(const ValueType& x) { return x.Ref(); }
@@ -149,139 +151,68 @@
   }
 };
 
-// user-agent metadata trait.
-struct UserAgentMetadata : public SimpleSliceBasedMetadata {
-  static absl::string_view key() { return "user-agent"; }
-};
-
-// grpc-message metadata trait.
-struct GrpcMessageMetadata : public SimpleSliceBasedMetadata {
-  static absl::string_view key() { return "grpc-message"; }
-};
-
-// host metadata trait.
-struct HostMetadata : public SimpleSliceBasedMetadata {
-  static absl::string_view key() { return "host"; }
-};
-
-// x-endpoint-load-metrics-bin metadata trait.
-struct XEndpointLoadMetricsBinMetadata : public SimpleSliceBasedMetadata {
-  static absl::string_view key() { return "x-endpoint-load-metrics-bin"; }
-};
-
-// grpc-server-stats-bin metadata trait.
-struct GrpcServerStatsBinMetadata : public SimpleSliceBasedMetadata {
-  static absl::string_view key() { return "grpc-server-stats-bin"; }
-};
-
-// grpc-trace-bin metadata trait.
-struct GrpcTraceBinMetadata : public SimpleSliceBasedMetadata {
-  static absl::string_view key() { return "grpc-trace-bin"; }
-};
-
-// grpc-tags-bin metadata trait.
-struct GrpcTagsBinMetadata : public SimpleSliceBasedMetadata {
-  static absl::string_view key() { return "grpc-tags-bin"; }
-};
-
 namespace metadata_detail {
 
-// Helper type - maps a string name to a trait.
-template <typename... Traits>
-struct NameLookup;
+// Inner implementation of MetadataMap<Container>::Parse()
+// Recursive in terms of metadata trait, tries each known type in order by doing
+// a string comparison on key, and if that key is found parses it. If not found,
+// calls not_found to generate the result value.
+template <typename Container, typename... Traits>
+struct ParseHelper;
 
-template <typename Trait, typename... Traits>
-struct NameLookup<Trait, Traits...> {
-  // Call op->Found(Trait()) if op->name == Trait::key() for some Trait in
-  // Traits. If not found, call op->NotFount().
-  template <typename Op>
-  static auto Lookup(absl::string_view key, Op* op)
-      -> decltype(op->Found(Trait())) {
+template <typename Container, typename Trait, typename... Traits>
+struct ParseHelper<Container, Trait, Traits...> {
+  template <typename NotFound>
+  static ParsedMetadata<Container> Parse(absl::string_view key, Slice value,
+                                         uint32_t transport_size,
+                                         NotFound not_found) {
     if (key == Trait::key()) {
-      return op->Found(Trait());
+      return ParsedMetadata<Container>(
+          Trait(), Trait::ParseMemento(value.TakeOwned()), transport_size);
     }
-    return NameLookup<Traits...>::Lookup(key, op);
+    return ParseHelper<Container, Traits...>::Parse(key, std::move(value),
+                                                    transport_size, not_found);
   }
 };
 
-template <>
-struct NameLookup<> {
-  template <typename Op>
-  static auto Lookup(absl::string_view key, Op* op)
-      -> decltype(op->NotFound(key)) {
-    return op->NotFound(key);
-  }
-};
-
-// Helper to take a slice to a memento to a value.
-// By splitting this part out we can scale code size as the number of (memento,
-// value) types, rather than as the number of traits.
-template <typename ParseMementoFn, typename MementoToValueFn>
-struct ParseValue {
-  template <ParseMementoFn parse_memento, MementoToValueFn memento_to_value>
-  static GPR_ATTRIBUTE_NOINLINE auto Parse(Slice* value)
-      -> decltype(memento_to_value(parse_memento(std::move(*value)))) {
-    return memento_to_value(parse_memento(std::move(*value)));
-  }
-};
-
-// This is an "Op" type for NameLookup.
-// Used for MetadataMap::Parse, its Found/NotFound methods turn a slice into a
-// ParsedMetadata object.
 template <typename Container>
-class ParseHelper {
- public:
-  ParseHelper(Slice value, size_t transport_size)
-      : value_(std::move(value)), transport_size_(transport_size) {}
-
-  template <typename Trait>
-  ParsedMetadata<Container> Found(Trait trait) {
-    return ParsedMetadata<Container>(
-        trait, Trait::ParseMemento(std::move(value_)), transport_size_);
+struct ParseHelper<Container> {
+  template <typename NotFound>
+  static ParsedMetadata<Container> Parse(absl::string_view, Slice value,
+                                         uint32_t, NotFound not_found) {
+    return not_found(std::move(value));
   }
-
-  GPR_ATTRIBUTE_NOINLINE ParsedMetadata<Container> NotFound(
-      absl::string_view key) {
-    return ParsedMetadata<Container>(
-        grpc_mdelem_from_slices(grpc_slice_intern(grpc_slice_from_static_buffer(
-                                    key.data(), key.size())),
-                                value_.TakeCSlice()));
-  }
-
- private:
-  Slice value_;
-  const size_t transport_size_;
 };
 
-// This is an "Op" type for NameLookup.
-// Used for MetadataMap::Parse, its Found/NotFound methods turn a slice into a
-// value and add it to a container.
+// Inner implementation of MetadataMap<Container>::Append()
+// Recursive in terms of metadata trait, tries each known type in order by doing
+// a string comparison on key, and if that key is found sets it. If not found,
+// calls not_found to append generically.
+template <typename Container, typename... Traits>
+struct AppendHelper;
+
+template <typename Container, typename Trait, typename... Traits>
+struct AppendHelper<Container, Trait, Traits...> {
+  template <typename NotFound>
+  static void Append(Container* container, absl::string_view key, Slice value,
+                     NotFound not_found) {
+    if (key == Trait::key()) {
+      container->Set(Trait(), Trait::MementoToValue(
+                                  Trait::ParseMemento(value.TakeOwned())));
+      return;
+    }
+    AppendHelper<Container, Traits...>::Append(container, key, std::move(value),
+                                               not_found);
+  }
+};
+
 template <typename Container>
-class AppendHelper {
- public:
-  AppendHelper(Container* container, Slice value)
-      : container_(container), value_(std::move(value)) {}
-
-  template <typename Trait>
-  GPR_ATTRIBUTE_NOINLINE void Found(Trait trait) {
-    container_->Set(
-        trait, ParseValue<decltype(Trait::ParseMemento),
-                          decltype(Trait::MementoToValue)>::
-                   template Parse<Trait::ParseMemento, Trait::MementoToValue>(
-                       &value_));
+struct AppendHelper<Container> {
+  template <typename NotFound>
+  static void Append(Container*, absl::string_view, Slice value,
+                     NotFound not_found) {
+    not_found(std::move(value));
   }
-
-  void NotFound(absl::string_view key) {
-    GPR_ASSERT(GRPC_ERROR_NONE ==
-               container_->Append(grpc_mdelem_from_slices(
-                   grpc_slice_intern(
-                       grpc_slice_from_static_buffer(key.data(), key.length())),
-                   value_.TakeCSlice())));
-  }
-
- private:
-  Container* const container_;
-  Slice value_;
 };
 
 }  // namespace metadata_detail
@@ -308,7 +239,7 @@
 //   // The type that's stored in compression/decompression tables
 //   using MementoType = ...;
 //   // The string key for this metadata type (for transports that require it)
-//   static absl::string_view key() { return "grpc-xyz"; }
+//   static constexpr absl::string_view key() { return "grpc-xyz"; }
 //   // Parse a memento from a slice
 //   // Takes ownership of value
 //   static MementoType ParseMemento(Slice value) { ... }
@@ -421,12 +352,9 @@
   //  m.Remove(T());
   template <typename Which>
   absl::optional<typename Which::ValueType> Take(Which which) {
-    if (auto* p = get_pointer(which)) {
-      absl::optional<typename Which::ValueType> value(std::move(*p));
-      Remove(which);
-      return value;
-    }
-    return {};
+    auto value = get(which);
+    Remove(which);
+    return value;
   }
 
   // Parse metadata from a key/value pair, and return an object representing
@@ -435,9 +363,16 @@
   // Once we don't care about interning anymore, make that change!
   static ParsedMetadata<MetadataMap> Parse(absl::string_view key, Slice value,
                                            uint32_t transport_size) {
-    metadata_detail::ParseHelper<MetadataMap> helper(value.TakeOwned(),
-                                                     transport_size);
-    return metadata_detail::NameLookup<Traits...>::Lookup(key, &helper);
+    bool parsed = true;
+    auto out = metadata_detail::ParseHelper<MetadataMap, Traits...>::Parse(
+        key, std::move(value), transport_size, [&](Slice value) {
+          parsed = false;
+          return ParsedMetadata<MetadataMap>(grpc_mdelem_from_slices(
+              grpc_slice_intern(
+                  grpc_slice_from_static_buffer(key.data(), key.size())),
+              value.TakeCSlice()));
+        });
+    return out;
   }
 
   // Set a value from a parsed metadata object.
@@ -448,8 +383,14 @@
 
   // Append a key/value pair - takes ownership of value
   void Append(absl::string_view key, Slice value) {
-    metadata_detail::AppendHelper<MetadataMap> helper(this, value.TakeOwned());
-    metadata_detail::NameLookup<Traits...>::Lookup(key, &helper);
+    metadata_detail::AppendHelper<MetadataMap, Traits...>::Append(
+        this, key, std::move(value), [this, key](Slice value) {
+          GPR_ASSERT(GRPC_ERROR_NONE ==
+                     Append(grpc_mdelem_from_slices(
+                         grpc_slice_intern(grpc_slice_from_static_buffer(
+                             key.data(), key.length())),
+                         value.TakeCSlice())));
+        });
   }
 
   //
@@ -967,12 +908,9 @@
 
 }  // namespace grpc_core
 
-using grpc_metadata_batch = grpc_core::MetadataMap<
-    grpc_core::GrpcTimeoutMetadata, grpc_core::TeMetadata,
-    grpc_core::UserAgentMetadata, grpc_core::GrpcMessageMetadata,
-    grpc_core::HostMetadata, grpc_core::XEndpointLoadMetricsBinMetadata,
-    grpc_core::GrpcServerStatsBinMetadata, grpc_core::GrpcTraceBinMetadata,
-    grpc_core::GrpcTagsBinMetadata>;
+using grpc_metadata_batch =
+    grpc_core::MetadataMap<grpc_core::GrpcTimeoutMetadata,
+                           grpc_core::TeMetadata, grpc_core::UserAgentMetadata>;
 
 inline void grpc_metadata_batch_clear(grpc_metadata_batch* batch) {
   batch->Clear();
diff --git a/src/core/lib/transport/parsed_metadata.cc b/src/core/lib/transport/parsed_metadata.cc
deleted file mode 100644
index d819393..0000000
--- a/src/core/lib/transport/parsed_metadata.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2021 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include <grpc/support/port_platform.h>
-
-#include "src/core/lib/transport/parsed_metadata.h"
-
-namespace grpc_core {
-namespace metadata_detail {
-
-std::string MakeDebugString(absl::string_view key, absl::string_view value) {
-  return absl::StrCat(key, ": ", value);
-}
-
-Slice SliceFromBuffer(const Buffer& buffer) {
-  return Slice(grpc_slice_ref_internal(buffer.slice));
-}
-
-void DestroySliceValue(const Buffer& value) {
-  grpc_slice_unref_internal(value.slice);
-}
-
-}  // namespace metadata_detail
-}  // namespace grpc_core
diff --git a/src/core/lib/transport/parsed_metadata.h b/src/core/lib/transport/parsed_metadata.h
index 5a2ca1e..366dc3d 100644
--- a/src/core/lib/transport/parsed_metadata.h
+++ b/src/core/lib/transport/parsed_metadata.h
@@ -41,51 +41,6 @@
       sizeof(typename Which::MementoType) <= sizeof(uint64_t);
 };
 
-// Storage type for a single metadata entry.
-union Buffer {
-  uint64_t trivial;
-  void* pointer;
-  grpc_slice slice;
-  grpc_mdelem mdelem;
-};
-
-// Given a key and a value, concatenate together to make a debug string.
-// Split out to avoid template bloat.
-std::string MakeDebugString(absl::string_view key, absl::string_view value);
-
-// Wrapper around MakeDebugString.
-// For the value part, use two functions - one to extract a typed field from
-// Buffer, and a second (sourced from the trait) to generate a displayable debug
-// string from the field value. We try to maximize indirection/code sharing here
-// as this is not critical path code and we'd like to avoid some code bloat -
-// better to scale by number of types than then number of metadata traits!
-template <typename Field, typename CompatibleWithField, typename Display>
-GPR_ATTRIBUTE_NOINLINE std::string MakeDebugStringPipeline(
-    absl::string_view key, const Buffer& value,
-    Field (*field_from_buffer)(const Buffer&),
-    Display (*display_from_field)(CompatibleWithField)) {
-  return MakeDebugString(
-      key, absl::StrCat(display_from_field(field_from_buffer(value))));
-}
-
-// Extract a trivial field value from a Buffer - for MakeDebugStringPipeline.
-template <typename Field>
-Field FieldFromTrivial(const Buffer& value) {
-  return static_cast<Field>(value.trivial);
-}
-
-// Extract a pointer field value from a Buffer - for MakeDebugStringPipeline.
-template <typename Field>
-Field FieldFromPointer(const Buffer& value) {
-  return *static_cast<const Field*>(value.pointer);
-}
-
-// Extract a Slice from a Buffer.
-Slice SliceFromBuffer(const Buffer& buffer);
-
-// Unref the grpc_slice part of a Buffer (assumes it is in fact a grpc_slice).
-void DestroySliceValue(const Buffer& value);
-
 }  // namespace metadata_detail
 
 // A parsed metadata value.
@@ -122,7 +77,6 @@
         transport_size_(transport_size) {
     value_.pointer = new typename Which::MementoType(std::move(value));
   }
-  // Construct metadata from a Slice typed value.
   template <typename Which>
   ParsedMetadata(Which, Slice value, uint32_t transport_size)
       : vtable_(ParsedMetadata::template SliceTraitVTable<Which>()),
@@ -169,13 +123,7 @@
   uint32_t transport_size() const { return transport_size_; }
   // Create a new parsed metadata with the same key but a different value.
   ParsedMetadata WithNewValue(Slice value) const {
-    ParsedMetadata result;
-    result.vtable_ = vtable_;
-    result.value_ = value_;
-    result.transport_size_ =
-        TransportSize(vtable_->key_length(value_), value.length());
-    vtable_->with_new_value(&value, &result);
-    return result;
+    return vtable_->with_new_value(value_, &value);
   }
   std::string DebugString() const { return vtable_->debug_string(value_); }
 
@@ -186,19 +134,24 @@
   }
 
  private:
-  using Buffer = metadata_detail::Buffer;
+  union Buffer {
+    uint64_t trivial;
+    void* pointer;
+    grpc_slice slice;
+    grpc_mdelem mdelem;
+  };
 
   struct VTable {
     const bool is_binary_header;
     void (*const destroy)(const Buffer& value);
     grpc_error_handle (*const set)(const Buffer& value,
                                    MetadataContainer* container);
-    // result is a bitwise copy of the originating ParsedMetadata.
-    void (*const with_new_value)(Slice* new_value, ParsedMetadata* result);
-    std::string (*const debug_string)(const Buffer& value);
-    // TODO(ctiller): when we delete mdelem, make this a simple integer constant
-    // on the vtable
-    size_t (*const key_length)(const Buffer& value);
+    // TODO(ctiller): ideally we'd pass new_value by value here, but there was
+    // an apparent miscompile with gcc-4.9 and WithNewValue - passing a pointer
+    // here fixed it.
+    ParsedMetadata (*const with_new_value)(const Buffer& value,
+                                           Slice* new_value);
+    std::string (*debug_string)(const Buffer& value);
   };
 
   static const VTable* EmptyVTable();
@@ -211,18 +164,11 @@
   template <bool kIsBinaryHeader>
   static const VTable* MdelemVtable();
 
-  template <Slice (*ParseMemento)(Slice)>
-  GPR_ATTRIBUTE_NOINLINE void WithNewValueSetSlice(Slice* slice) {
-    value_.slice = ParseMemento(std::move(*slice)).TakeCSlice();
-  }
-
   const VTable* vtable_;
   Buffer value_;
   uint32_t transport_size_;
 };
 
-namespace metadata_detail {}  // namespace metadata_detail
-
 template <typename MetadataContainer>
 const typename ParsedMetadata<MetadataContainer>::VTable*
 ParsedMetadata<MetadataContainer>::EmptyVTable() {
@@ -233,12 +179,9 @@
       // set
       [](const Buffer&, MetadataContainer*) { return GRPC_ERROR_NONE; },
       // with_new_value
-      [](Slice*, ParsedMetadata*) {},
+      [](const Buffer&, Slice*) { return ParsedMetadata(); },
       // debug_string
-      [](const Buffer&) -> std::string { return "empty"; },
-      // key_length
-      [](const Buffer&) -> size_t { return 0; },
-  };
+      [](const Buffer&) -> std::string { return "empty"; }};
   return &vtable;
 }
 
@@ -258,19 +201,18 @@
         return GRPC_ERROR_NONE;
       },
       // with_new_value
-      [](Slice* value, ParsedMetadata* result) {
-        result->value_.trivial = Which::ParseMemento(std::move(*value));
+      [](const Buffer&, Slice* value) {
+        const auto length = value->length();
+        return ParsedMetadata(Which(), Which::ParseMemento(std::move(*value)),
+                              TransportSize(Which::key().length(), length));
       },
       // debug_string
       [](const Buffer& value) {
-        return metadata_detail::MakeDebugStringPipeline(
-            Which::key(), value,
-            metadata_detail::FieldFromTrivial<typename Which::MementoType>,
-            Which::DisplayValue);
-      },
-      // key_length
-      [](const Buffer&) { return Which::key().size(); },
-  };
+        return absl::StrCat(
+            Which::key(), ": ",
+            Which::DisplayValue(
+                static_cast<typename Which::MementoType>(value.trivial)));
+      }};
   return &vtable;
 }
 
@@ -291,20 +233,16 @@
         return GRPC_ERROR_NONE;
       },
       // with_new_value
-      [](Slice* value, ParsedMetadata* result) {
-        result->value_.pointer = new
-            typename Which::MementoType(Which::ParseMemento(std::move(*value)));
+      [](const Buffer&, Slice* value) {
+        const auto length = value->length();
+        return ParsedMetadata(Which(), Which::ParseMemento(std::move(*value)),
+                              TransportSize(Which::key().length(), length));
       },
       // debug_string
       [](const Buffer& value) {
-        return metadata_detail::MakeDebugStringPipeline(
-            Which::key(), value,
-            metadata_detail::FieldFromPointer<typename Which::MementoType>,
-            Which::DisplayValue);
-      },
-      // key_length
-      [](const Buffer&) { return Which::key().size(); },
-  };
+        auto* p = static_cast<typename Which::MementoType*>(value.pointer);
+        return absl::StrCat(Which::key(), ": ", Which::DisplayValue(*p));
+      }};
   return &vtable;
 }
 
@@ -315,26 +253,24 @@
   static const VTable vtable = {
       absl::EndsWith(Which::key(), "-bin"),
       // destroy
-      metadata_detail::DestroySliceValue,
+      [](const Buffer& value) { grpc_slice_unref_internal(value.slice); },
       // set
       [](const Buffer& value, MetadataContainer* map) {
-        map->Set(Which(), Which::MementoToValue(
-                              metadata_detail::SliceFromBuffer(value)));
+        map->Set(Which(), Slice(grpc_slice_ref_internal(value.slice)));
         return GRPC_ERROR_NONE;
       },
       // with_new_value
-      [](Slice* value, ParsedMetadata* result) {
-        result->WithNewValueSetSlice<Which::ParseMemento>(value);
+      [](const Buffer&, Slice* value) {
+        const auto length = value->length();
+        return ParsedMetadata(Which(), Which::ParseMemento(std::move(*value)),
+                              TransportSize(Which::key().length(), length));
       },
       // debug_string
       [](const Buffer& value) {
-        return metadata_detail::MakeDebugStringPipeline(
-            Which::key(), value, metadata_detail::SliceFromBuffer,
-            Which::DisplayValue);
-      },
-      // key_length
-      [](const Buffer&) { return Which::key().size(); },
-  };
+        return absl::StrCat(
+            Which::key(), ": ",
+            Which::DisplayValue(Slice(grpc_slice_ref_internal(value.slice))));
+      }};
   return &vtable;
 }
 
@@ -358,21 +294,16 @@
         return err;
       },
       // with_new_value
-      [](Slice* value_slice, ParsedMetadata* result) {
-        result->value_.mdelem = grpc_mdelem_from_slices(
+      [](const Buffer& value, Slice* value_slice) {
+        return ParsedMetadata(grpc_mdelem_from_slices(
             static_cast<const ManagedMemorySlice&>(
-                grpc_slice_ref_internal(GRPC_MDKEY(result->value_.mdelem))),
-            value_slice->TakeCSlice());
+                grpc_slice_ref_internal(GRPC_MDKEY(value.mdelem))),
+            value_slice->TakeCSlice()));
       },
       // debug_string
       [](const Buffer& value) {
-        return metadata_detail::MakeDebugString(
-            StringViewFromSlice(GRPC_MDKEY(value.mdelem)),
-            StringViewFromSlice(GRPC_MDVALUE(value.mdelem)));
-      },
-      // key_length
-      [](const Buffer& value) {
-        return GRPC_SLICE_LENGTH(GRPC_MDKEY(value.mdelem));
+        return absl::StrCat(StringViewFromSlice(GRPC_MDKEY(value.mdelem)), ": ",
+                            StringViewFromSlice(GRPC_MDVALUE(value.mdelem)));
       }};
   return &vtable;
 }
diff --git a/src/core/lib/transport/static_metadata.cc b/src/core/lib/transport/static_metadata.cc
index 0ea4b61..6bc50f7 100644
--- a/src/core/lib/transport/static_metadata.cc
+++ b/src/core/lib/transport/static_metadata.cc
@@ -35,506 +35,506 @@
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[3].base, 10,
                             g_static_metadata_bytes + 19),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         0),
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 7,
                             g_static_metadata_bytes + 5),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[31].base, 3,
-                            g_static_metadata_bytes + 603),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[39].base, 3,
+                            g_static_metadata_bytes + 720),
         1),
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 7,
                             g_static_metadata_bytes + 5),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[32].base, 4,
-                            g_static_metadata_bytes + 606),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[40].base, 4,
+                            g_static_metadata_bytes + 723),
         2),
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[0].base, 5,
                             g_static_metadata_bytes + 0),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[33].base, 1,
-                            g_static_metadata_bytes + 610),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[41].base, 1,
+                            g_static_metadata_bytes + 727),
         3),
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[0].base, 5,
                             g_static_metadata_bytes + 0),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[34].base, 11,
-                            g_static_metadata_bytes + 611),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[42].base, 11,
+                            g_static_metadata_bytes + 728),
         4),
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[4].base, 7,
                             g_static_metadata_bytes + 29),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[35].base, 4,
-                            g_static_metadata_bytes + 622),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[43].base, 4,
+                            g_static_metadata_bytes + 739),
         5),
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[4].base, 7,
                             g_static_metadata_bytes + 29),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[36].base, 5,
-                            g_static_metadata_bytes + 626),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[44].base, 5,
+                            g_static_metadata_bytes + 743),
         6),
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[2].base, 7,
                             g_static_metadata_bytes + 12),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[37].base, 3,
-                            g_static_metadata_bytes + 631),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[45].base, 3,
+                            g_static_metadata_bytes + 748),
         7),
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[2].base, 7,
                             g_static_metadata_bytes + 12),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[38].base, 3,
-                            g_static_metadata_bytes + 634),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[46].base, 3,
+                            g_static_metadata_bytes + 751),
         8),
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[2].base, 7,
                             g_static_metadata_bytes + 12),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[39].base, 3,
-                            g_static_metadata_bytes + 637),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[47].base, 3,
+                            g_static_metadata_bytes + 754),
         9),
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[2].base, 7,
                             g_static_metadata_bytes + 12),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[40].base, 3,
-                            g_static_metadata_bytes + 640),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[48].base, 3,
+                            g_static_metadata_bytes + 757),
         10),
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[2].base, 7,
                             g_static_metadata_bytes + 12),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[41].base, 3,
-                            g_static_metadata_bytes + 643),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[49].base, 3,
+                            g_static_metadata_bytes + 760),
         11),
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[2].base, 7,
                             g_static_metadata_bytes + 12),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[42].base, 3,
-                            g_static_metadata_bytes + 646),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[50].base, 3,
+                            g_static_metadata_bytes + 763),
         12),
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[2].base, 7,
                             g_static_metadata_bytes + 12),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[43].base, 3,
-                            g_static_metadata_bytes + 649),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[51].base, 3,
+                            g_static_metadata_bytes + 766),
         13),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[44].base, 14,
-                            g_static_metadata_bytes + 652),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[52].base, 14,
+                            g_static_metadata_bytes + 769),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         14),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 15,
-                            g_static_metadata_bytes + 108),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[45].base, 13,
-                            g_static_metadata_bytes + 666),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 15,
+                            g_static_metadata_bytes + 184),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[53].base, 13,
+                            g_static_metadata_bytes + 783),
         15),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[46].base, 15,
-                            g_static_metadata_bytes + 679),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[54].base, 15,
+                            g_static_metadata_bytes + 796),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         16),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[47].base, 13,
-                            g_static_metadata_bytes + 694),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[55].base, 13,
+                            g_static_metadata_bytes + 811),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         17),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[48].base, 6,
-                            g_static_metadata_bytes + 707),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[56].base, 6,
+                            g_static_metadata_bytes + 824),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         18),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[49].base, 27,
-                            g_static_metadata_bytes + 713),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[57].base, 27,
+                            g_static_metadata_bytes + 830),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         19),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[50].base, 3,
-                            g_static_metadata_bytes + 740),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[58].base, 3,
+                            g_static_metadata_bytes + 857),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         20),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[51].base, 5,
-                            g_static_metadata_bytes + 743),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[59].base, 5,
+                            g_static_metadata_bytes + 860),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         21),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[52].base, 13,
-                            g_static_metadata_bytes + 748),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[60].base, 13,
+                            g_static_metadata_bytes + 865),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         22),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[53].base, 13,
-                            g_static_metadata_bytes + 761),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[61].base, 13,
+                            g_static_metadata_bytes + 878),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         23),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[54].base, 19,
-                            g_static_metadata_bytes + 774),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[62].base, 19,
+                            g_static_metadata_bytes + 891),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         24),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 16,
-                            g_static_metadata_bytes + 92),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[14].base, 16,
+                            g_static_metadata_bytes + 168),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         25),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[55].base, 16,
-                            g_static_metadata_bytes + 793),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[63].base, 16,
+                            g_static_metadata_bytes + 910),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         26),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[56].base, 14,
-                            g_static_metadata_bytes + 809),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[64].base, 14,
+                            g_static_metadata_bytes + 926),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         27),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[57].base, 16,
-                            g_static_metadata_bytes + 823),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[65].base, 16,
+                            g_static_metadata_bytes + 940),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         28),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[58].base, 13,
-                            g_static_metadata_bytes + 839),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[66].base, 13,
+                            g_static_metadata_bytes + 956),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         29),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[8].base, 12,
-                            g_static_metadata_bytes + 80),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[13].base, 12,
+                            g_static_metadata_bytes + 156),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         30),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[59].base, 6,
-                            g_static_metadata_bytes + 852),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[67].base, 6,
+                            g_static_metadata_bytes + 969),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         31),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[60].base, 4,
-                            g_static_metadata_bytes + 858),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[68].base, 4,
+                            g_static_metadata_bytes + 975),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         32),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[61].base, 4,
-                            g_static_metadata_bytes + 862),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[69].base, 4,
+                            g_static_metadata_bytes + 979),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         33),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[62].base, 6,
-                            g_static_metadata_bytes + 866),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[70].base, 6,
+                            g_static_metadata_bytes + 983),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         34),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[63].base, 7,
-                            g_static_metadata_bytes + 872),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[71].base, 7,
+                            g_static_metadata_bytes + 989),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         35),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[64].base, 4,
-                            g_static_metadata_bytes + 879),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[72].base, 4,
+                            g_static_metadata_bytes + 996),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         36),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[65].base, 4,
-                            g_static_metadata_bytes + 883),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[17].base, 4,
+                            g_static_metadata_bytes + 229),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         37),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[66].base, 8,
-                            g_static_metadata_bytes + 887),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[73].base, 8,
+                            g_static_metadata_bytes + 1000),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         38),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[67].base, 17,
-                            g_static_metadata_bytes + 895),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[74].base, 17,
+                            g_static_metadata_bytes + 1008),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         39),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[68].base, 13,
-                            g_static_metadata_bytes + 912),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[75].base, 13,
+                            g_static_metadata_bytes + 1025),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         40),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[69].base, 8,
-                            g_static_metadata_bytes + 925),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[76].base, 8,
+                            g_static_metadata_bytes + 1038),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         41),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[70].base, 19,
-                            g_static_metadata_bytes + 933),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[77].base, 19,
+                            g_static_metadata_bytes + 1046),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         42),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[71].base, 13,
-                            g_static_metadata_bytes + 952),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[78].base, 13,
+                            g_static_metadata_bytes + 1065),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         43),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[72].base, 4,
-                            g_static_metadata_bytes + 965),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[79].base, 4,
+                            g_static_metadata_bytes + 1078),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         44),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[73].base, 8,
-                            g_static_metadata_bytes + 969),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[80].base, 8,
+                            g_static_metadata_bytes + 1082),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         45),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[74].base, 12,
-                            g_static_metadata_bytes + 977),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[81].base, 12,
+                            g_static_metadata_bytes + 1090),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         46),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[75].base, 18,
-                            g_static_metadata_bytes + 989),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[82].base, 18,
+                            g_static_metadata_bytes + 1102),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         47),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[76].base, 19,
-                            g_static_metadata_bytes + 1007),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[83].base, 19,
+                            g_static_metadata_bytes + 1120),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         48),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[77].base, 5,
-                            g_static_metadata_bytes + 1026),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[84].base, 5,
+                            g_static_metadata_bytes + 1139),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         49),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[78].base, 7,
-                            g_static_metadata_bytes + 1031),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[85].base, 7,
+                            g_static_metadata_bytes + 1144),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         50),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[79].base, 7,
-                            g_static_metadata_bytes + 1038),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[86].base, 7,
+                            g_static_metadata_bytes + 1151),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         51),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[80].base, 11,
-                            g_static_metadata_bytes + 1045),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[87].base, 11,
+                            g_static_metadata_bytes + 1158),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         52),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[81].base, 6,
-                            g_static_metadata_bytes + 1056),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[88].base, 6,
+                            g_static_metadata_bytes + 1169),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         53),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[82].base, 10,
-                            g_static_metadata_bytes + 1062),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[89].base, 10,
+                            g_static_metadata_bytes + 1175),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         54),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[83].base, 25,
-                            g_static_metadata_bytes + 1072),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[90].base, 25,
+                            g_static_metadata_bytes + 1185),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         55),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[84].base, 17,
-                            g_static_metadata_bytes + 1097),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[91].base, 17,
+                            g_static_metadata_bytes + 1210),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         56),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[85].base, 10,
-                            g_static_metadata_bytes + 1114),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[22].base, 10,
+                            g_static_metadata_bytes + 320),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         57),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[86].base, 4,
-                            g_static_metadata_bytes + 1124),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[92].base, 4,
+                            g_static_metadata_bytes + 1227),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         58),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[87].base, 3,
-                            g_static_metadata_bytes + 1128),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[93].base, 3,
+                            g_static_metadata_bytes + 1231),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         59),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[88].base, 16,
-                            g_static_metadata_bytes + 1131),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[94].base, 16,
+                            g_static_metadata_bytes + 1234),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         60),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[5].base, 11,
-                            g_static_metadata_bytes + 36),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[89].base, 1,
-                            g_static_metadata_bytes + 1147),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 11,
+                            g_static_metadata_bytes + 48),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[95].base, 1,
+                            g_static_metadata_bytes + 1250),
         61),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[5].base, 11,
-                            g_static_metadata_bytes + 36),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 1,
-                            g_static_metadata_bytes + 213),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 11,
+                            g_static_metadata_bytes + 48),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[23].base, 1,
+                            g_static_metadata_bytes + 330),
         62),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[5].base, 11,
-                            g_static_metadata_bytes + 36),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[16].base, 1,
-                            g_static_metadata_bytes + 214),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 11,
+                            g_static_metadata_bytes + 48),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[24].base, 1,
+                            g_static_metadata_bytes + 331),
         63),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 13,
-                            g_static_metadata_bytes + 47),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[90].base, 8,
-                            g_static_metadata_bytes + 1148),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[8].base, 13,
+                            g_static_metadata_bytes + 75),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 8,
+                            g_static_metadata_bytes + 1251),
         64),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 13,
-                            g_static_metadata_bytes + 47),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 4,
-                            g_static_metadata_bytes + 578),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[8].base, 13,
+                            g_static_metadata_bytes + 75),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[35].base, 4,
+                            g_static_metadata_bytes + 695),
         65),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[6].base, 13,
-                            g_static_metadata_bytes + 47),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[26].base, 7,
-                            g_static_metadata_bytes + 571),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[8].base, 13,
+                            g_static_metadata_bytes + 75),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[34].base, 7,
+                            g_static_metadata_bytes + 688),
         66),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[8].base, 12,
-                            g_static_metadata_bytes + 80),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[91].base, 16,
-                            g_static_metadata_bytes + 1156),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[13].base, 12,
+                            g_static_metadata_bytes + 156),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[97].base, 16,
+                            g_static_metadata_bytes + 1259),
         67),
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[4].base, 7,
                             g_static_metadata_bytes + 29),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[92].base, 4,
-                            g_static_metadata_bytes + 1172),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[98].base, 4,
+                            g_static_metadata_bytes + 1275),
         68),
     StaticMetadata(
         StaticMetadataSlice(&g_static_metadata_slice_refcounts[1].base, 7,
                             g_static_metadata_bytes + 5),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[93].base, 3,
-                            g_static_metadata_bytes + 1176),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[99].base, 3,
+                            g_static_metadata_bytes + 1279),
         69),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 15,
-                            g_static_metadata_bytes + 108),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 15,
+                            g_static_metadata_bytes + 184),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         70),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 16,
-                            g_static_metadata_bytes + 92),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[90].base, 8,
-                            g_static_metadata_bytes + 1148),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[14].base, 16,
+                            g_static_metadata_bytes + 168),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 8,
+                            g_static_metadata_bytes + 1251),
         71),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 16,
-                            g_static_metadata_bytes + 92),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 4,
-                            g_static_metadata_bytes + 578),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[14].base, 16,
+                            g_static_metadata_bytes + 168),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[35].base, 4,
+                            g_static_metadata_bytes + 695),
         72),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[94].base, 11,
-                            g_static_metadata_bytes + 1179),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[19].base, 0,
-                            g_static_metadata_bytes + 217),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[100].base, 11,
+                            g_static_metadata_bytes + 1282),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 0,
+                            g_static_metadata_bytes + 334),
         73),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20,
-                            g_static_metadata_bytes + 60),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[90].base, 8,
-                            g_static_metadata_bytes + 1148),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20,
+                            g_static_metadata_bytes + 88),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 8,
+                            g_static_metadata_bytes + 1251),
         74),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20,
-                            g_static_metadata_bytes + 60),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[26].base, 7,
-                            g_static_metadata_bytes + 571),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20,
+                            g_static_metadata_bytes + 88),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[34].base, 7,
+                            g_static_metadata_bytes + 688),
         75),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20,
-                            g_static_metadata_bytes + 60),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[95].base, 16,
-                            g_static_metadata_bytes + 1190),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20,
+                            g_static_metadata_bytes + 88),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[101].base, 16,
+                            g_static_metadata_bytes + 1293),
         76),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20,
-                            g_static_metadata_bytes + 60),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 4,
-                            g_static_metadata_bytes + 578),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20,
+                            g_static_metadata_bytes + 88),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[35].base, 4,
+                            g_static_metadata_bytes + 695),
         77),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20,
-                            g_static_metadata_bytes + 60),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 13,
-                            g_static_metadata_bytes + 1206),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20,
+                            g_static_metadata_bytes + 88),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[102].base, 13,
+                            g_static_metadata_bytes + 1309),
         78),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20,
-                            g_static_metadata_bytes + 60),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[97].base, 12,
-                            g_static_metadata_bytes + 1219),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20,
+                            g_static_metadata_bytes + 88),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[103].base, 12,
+                            g_static_metadata_bytes + 1322),
         79),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[7].base, 20,
-                            g_static_metadata_bytes + 60),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[98].base, 21,
-                            g_static_metadata_bytes + 1231),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[9].base, 20,
+                            g_static_metadata_bytes + 88),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[104].base, 21,
+                            g_static_metadata_bytes + 1334),
         80),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 15,
-                            g_static_metadata_bytes + 108),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[90].base, 8,
-                            g_static_metadata_bytes + 1148),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 15,
+                            g_static_metadata_bytes + 184),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 8,
+                            g_static_metadata_bytes + 1251),
         81),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 15,
-                            g_static_metadata_bytes + 108),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[27].base, 4,
-                            g_static_metadata_bytes + 578),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 15,
+                            g_static_metadata_bytes + 184),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[35].base, 4,
+                            g_static_metadata_bytes + 695),
         82),
     StaticMetadata(
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[10].base, 15,
-                            g_static_metadata_bytes + 108),
-        StaticMetadataSlice(&g_static_metadata_slice_refcounts[96].base, 13,
-                            g_static_metadata_bytes + 1206),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[15].base, 15,
+                            g_static_metadata_bytes + 184),
+        StaticMetadataSlice(&g_static_metadata_slice_refcounts[102].base, 13,
+                            g_static_metadata_bytes + 1309),
         83),
 };
 
@@ -978,17 +978,17 @@
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 4, 6, 6, 8, 8, 2, 4, 4};
 
 static const int8_t elems_r[] = {
-    18, 11, -8,  0,  -1,  -46, 11,  0,   13,  10,  7,   0,   0,   0,
-    0,  0,  0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    0,  0,  0,   0,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    0,  0,  -51, 0,  -54, -55, -56, -57, -58, -59, -60, -61, -62, -63,
-    0,  33, 32,  31, 30,  29,  29,  28,  27,  26,  25,  24,  23,  22,
-    21, 20, 19,  18, 17,  16,  15,  14,  13,  12,  11,  10,  9,   8,
-    7,  6,  5,   4,  4,   3,   0,   0,   0,   0,   0,   -8,  0};
+    15, 10, -8, 0,  2,  -77, -42, 0,   9,  -4,  0,   0,   0,   11,  0,
+    -7, 0,  5,  0,  0,  0,   0,   -4,  0,  0,   0,   0,   0,   0,   0,
+    0,  0,  0,  0,  0,  0,   0,   0,   0,  0,   0,   0,   0,   0,   0,
+    0,  0,  0,  0,  0,  0,   0,   -63, 0,  -47, -68, -48, -71, -72, 0,
+    30, 29, 28, 27, 27, 26,  25,  24,  23, 22,  21,  20,  19,  18,  17,
+    17, 16, 16, 15, 14, 13,  12,  11,  10, 9,   8,   7,   6,   5,   4,
+    3,  2,  1,  1,  2,  1,   0,   0,   0,  0,   0,   -10, 0};
 static uint32_t elems_phash(uint32_t i) {
-  i -= 33;
-  uint32_t x = i % 97;
-  uint32_t y = i / 97;
+  i -= 41;
+  uint32_t x = i % 103;
+  uint32_t y = i / 103;
   uint32_t h = x;
   if (y < GPR_ARRAY_SIZE(elems_r)) {
     uint32_t delta = static_cast<uint32_t>(elems_r[y]);
@@ -998,25 +998,25 @@
 }
 
 static const uint16_t elem_keys[] = {
-    235,  236,  237,  238,  239,  240,  241,  719,  720,  431,  432,  130,
-    131,  1009, 910,  811,  620,  621,  33,   34,   584,  1017, 918,  4375,
-    4573, 4672, 4771, 4870, 4969, 5068, 5167, 5266, 5365, 5464, 5563, 5662,
-    5761, 5860, 5959, 1035, 6058, 6157, 6256, 6355, 6454, 6553, 6652, 6751,
-    6850, 6949, 7048, 7147, 7246, 7345, 7444, 7543, 7642, 7741, 7840, 7939,
-    8038, 8137, 8236, 8335, 8434, 8533, 488,  8632, 8731, 9325, 0,    783,
-    0,    192,  0,    0,    788,  789,  790,  791,  684,  316,  0,    0,
-    1080, 981,  0,    883,  510,  511,  1086};
+    255,  256,   257,  258,  259,  260,  261,  979,  980,  1602, 144,  145,
+    463,  464,   1497, 41,   42,   1610, 874,  875,  653,  654,  1505, 1392,
+    725,  1812,  2337, 5487, 5802, 6012, 6117, 6222, 6327, 6432, 6537, 1628,
+    6642, 6747,  6852, 6957, 7062, 7167, 7272, 7377, 7482, 7587, 7692, 5697,
+    7797, 7902,  5907, 8007, 8112, 8217, 8322, 8427, 8532, 8637, 8742, 8847,
+    8952, 9057,  9162, 9267, 9372, 9477, 9582, 518,  9687, 1041, 204,  9792,
+    9897, 10527, 1046, 1047, 1048, 1049, 1671, 0,    936,  0,    0,    1566,
+    1677, 0,     0,    342,  0,    0,    0,    0,    0,    1462};
 static const uint8_t elem_idxs[] = {
-    7,  8,  9,   10,  11, 12, 13,  75, 77,  5,  6,   1,   2,  70, 25, 30,
-    66, 65, 3,   4,   61, 82, 72,  14, 16,  17, 18,  19,  20, 21, 22, 23,
-    24, 26, 27,  28,  29, 31, 32,  15, 33,  34, 35,  36,  37, 38, 39, 40,
-    41, 42, 43,  44,  45, 46, 47,  48, 49,  50, 51,  52,  53, 54, 55, 56,
-    57, 58, 68,  59,  60, 73, 255, 74, 255, 69, 255, 255, 76, 78, 79, 80,
-    64, 0,  255, 255, 81, 71, 255, 67, 62,  63, 83};
+    7,  8,   9,   10, 11, 12,  13,  75, 77,  70,  1,   2,   5,   6,  25, 3,
+    4,  82,  66,  65, 62, 63,  72,  30, 61,  37,  57,  14,  17,  19, 20, 21,
+    22, 23,  24,  15, 26, 27,  28,  29, 31,  32,  33,  34,  35,  36, 38, 16,
+    39, 40,  18,  41, 42, 43,  44,  45, 46,  47,  48,  49,  50,  51, 52, 53,
+    54, 55,  56,  68, 58, 74,  69,  59, 60,  73,  76,  78,  79,  80, 81, 255,
+    64, 255, 255, 71, 83, 255, 255, 0,  255, 255, 255, 255, 255, 67};
 
 grpc_mdelem grpc_static_mdelem_for_static_strings(intptr_t a, intptr_t b) {
   if (a == -1 || b == -1) return GRPC_MDNULL;
-  uint32_t k = static_cast<uint32_t>(a * 99 + b);
+  uint32_t k = static_cast<uint32_t>(a * 105 + b);
   uint32_t h = elems_phash(k);
   return h < GPR_ARRAY_SIZE(elem_keys) && elem_keys[h] == k &&
                  elem_idxs[h] != 255
diff --git a/src/core/lib/transport/static_metadata.h b/src/core/lib/transport/static_metadata.h
index 488e5ec..accf46e 100644
--- a/src/core/lib/transport/static_metadata.h
+++ b/src/core/lib/transport/static_metadata.h
@@ -264,15 +264,22 @@
   GRPC_BATCH_STATUS,
   GRPC_BATCH_AUTHORITY,
   GRPC_BATCH_SCHEME,
+  GRPC_BATCH_GRPC_MESSAGE,
   GRPC_BATCH_GRPC_STATUS,
+  GRPC_BATCH_GRPC_PAYLOAD_BIN,
   GRPC_BATCH_GRPC_ENCODING,
   GRPC_BATCH_GRPC_ACCEPT_ENCODING,
+  GRPC_BATCH_GRPC_SERVER_STATS_BIN,
+  GRPC_BATCH_GRPC_TAGS_BIN,
+  GRPC_BATCH_GRPC_TRACE_BIN,
   GRPC_BATCH_CONTENT_TYPE,
   GRPC_BATCH_CONTENT_ENCODING,
   GRPC_BATCH_ACCEPT_ENCODING,
   GRPC_BATCH_GRPC_INTERNAL_ENCODING_REQUEST,
+  GRPC_BATCH_HOST,
   GRPC_BATCH_GRPC_PREVIOUS_RPC_ATTEMPTS,
   GRPC_BATCH_GRPC_RETRY_PUSHBACK_MS,
+  GRPC_BATCH_X_ENDPOINT_LOAD_METRICS_BIN,
   GRPC_BATCH_CALLOUTS_COUNT
 } grpc_metadata_batch_callouts_index;
 
@@ -284,15 +291,22 @@
     struct grpc_linked_mdelem* status;
     struct grpc_linked_mdelem* authority;
     struct grpc_linked_mdelem* scheme;
+    struct grpc_linked_mdelem* grpc_message;
     struct grpc_linked_mdelem* grpc_status;
+    struct grpc_linked_mdelem* grpc_payload_bin;
     struct grpc_linked_mdelem* grpc_encoding;
     struct grpc_linked_mdelem* grpc_accept_encoding;
+    struct grpc_linked_mdelem* grpc_server_stats_bin;
+    struct grpc_linked_mdelem* grpc_tags_bin;
+    struct grpc_linked_mdelem* grpc_trace_bin;
     struct grpc_linked_mdelem* content_type;
     struct grpc_linked_mdelem* content_encoding;
     struct grpc_linked_mdelem* accept_encoding;
     struct grpc_linked_mdelem* grpc_internal_encoding_request;
+    struct grpc_linked_mdelem* host;
     struct grpc_linked_mdelem* grpc_previous_rpc_attempts;
     struct grpc_linked_mdelem* grpc_retry_pushback_ms;
+    struct grpc_linked_mdelem* x_endpoint_load_metrics_bin;
   } named;
 } grpc_metadata_batch_callouts;
 
diff --git a/src/cpp/ext/filters/census/client_filter.cc b/src/cpp/ext/filters/census/client_filter.cc
index 08fda59..7fec2fa 100644
--- a/src/cpp/ext/filters/census/client_filter.cc
+++ b/src/cpp/ext/filters/census/client_filter.cc
@@ -100,16 +100,19 @@
   size_t tracing_len = TraceContextSerialize(context_.Context(), tracing_buf,
                                              kMaxTraceContextLen);
   if (tracing_len > 0) {
-    send_initial_metadata->Set(grpc_core::GrpcTraceBinMetadata(),
-                               grpc_core::Slice(grpc_core::UnmanagedMemorySlice(
-                                   tracing_buf, tracing_len)));
+    GRPC_LOG_IF_ERROR(
+        "census grpc_filter",
+        send_initial_metadata->Append(grpc_mdelem_from_slices(
+            GRPC_MDSTR_GRPC_TRACE_BIN,
+            grpc_core::UnmanagedMemorySlice(tracing_buf, tracing_len))));
   }
   grpc_slice tags = grpc_empty_slice();
   // TODO(unknown): Add in tagging serialization.
   size_t encoded_tags_len = StatsContextSerialize(kMaxTagsLen, &tags);
   if (encoded_tags_len > 0) {
-    send_initial_metadata->Set(grpc_core::GrpcTagsBinMetadata(),
-                               grpc_core::Slice(tags));
+    GRPC_LOG_IF_ERROR("census grpc_filter",
+                      send_initial_metadata->Append(grpc_mdelem_from_slices(
+                          GRPC_MDSTR_GRPC_TAGS_BIN, tags)));
   }
 }
 
@@ -126,12 +129,14 @@
 namespace {
 
 void FilterTrailingMetadata(grpc_metadata_batch* b, uint64_t* elapsed_time) {
-  absl::optional<grpc_core::Slice> grpc_server_stats_bin =
-      b->Take(grpc_core::GrpcServerStatsBinMetadata());
-  if (grpc_server_stats_bin.has_value()) {
+  if (b->legacy_index()->named.grpc_server_stats_bin != nullptr) {
     ServerStatsDeserialize(
-        reinterpret_cast<const char*>(grpc_server_stats_bin->data()),
-        grpc_server_stats_bin->size(), elapsed_time);
+        reinterpret_cast<const char*>(GRPC_SLICE_START_PTR(
+            GRPC_MDVALUE(b->legacy_index()->named.grpc_server_stats_bin->md))),
+        GRPC_SLICE_LENGTH(
+            GRPC_MDVALUE(b->legacy_index()->named.grpc_server_stats_bin->md)),
+        elapsed_time);
+    b->Remove(b->legacy_index()->named.grpc_server_stats_bin);
   }
 }
 
diff --git a/src/cpp/ext/filters/census/server_filter.cc b/src/cpp/ext/filters/census/server_filter.cc
index 3d2a5c8..0a84680 100644
--- a/src/cpp/ext/filters/census/server_filter.cc
+++ b/src/cpp/ext/filters/census/server_filter.cc
@@ -39,8 +39,8 @@
 // server metadata elements
 struct ServerMetadataElements {
   grpc_slice path;
-  grpc_core::Slice tracing_slice;
-  grpc_core::Slice census_proto;
+  grpc_slice tracing_slice;
+  grpc_slice census_proto;
 };
 
 void FilterInitialMetadata(grpc_metadata_batch* b,
@@ -49,13 +49,15 @@
     sml->path = grpc_slice_ref_internal(
         GRPC_MDVALUE(b->legacy_index()->named.path->md));
   }
-  auto grpc_trace_bin = b->Take(grpc_core::GrpcTraceBinMetadata());
-  if (grpc_trace_bin.has_value()) {
-    sml->tracing_slice = std::move(*grpc_trace_bin);
+  if (b->legacy_index()->named.grpc_trace_bin != nullptr) {
+    sml->tracing_slice = grpc_slice_ref_internal(
+        GRPC_MDVALUE(b->legacy_index()->named.grpc_trace_bin->md));
+    b->Remove(GRPC_BATCH_GRPC_TRACE_BIN);
   }
-  auto grpc_tags_bin = b->Take(grpc_core::GrpcTagsBinMetadata());
-  if (grpc_tags_bin.has_value()) {
-    sml->census_proto = std::move(*grpc_tags_bin);
+  if (b->legacy_index()->named.grpc_tags_bin != nullptr) {
+    sml->census_proto = grpc_slice_ref_internal(
+        GRPC_MDVALUE(b->legacy_index()->named.grpc_tags_bin->md));
+    b->Remove(GRPC_BATCH_GRPC_TAGS_BIN);
   }
 }
 
@@ -89,12 +91,24 @@
     GPR_ASSERT(initial_metadata != nullptr);
     ServerMetadataElements sml;
     sml.path = grpc_empty_slice();
+    sml.tracing_slice = grpc_empty_slice();
+    sml.census_proto = grpc_empty_slice();
     FilterInitialMetadata(initial_metadata, &sml);
     calld->path_ = grpc_slice_ref_internal(sml.path);
     calld->method_ = GetMethod(&calld->path_);
     calld->qualified_method_ = absl::StrCat("Recv.", calld->method_);
-    GenerateServerContext(sml.tracing_slice.as_string_view(),
+    const char* tracing_str =
+        GRPC_SLICE_IS_EMPTY(sml.tracing_slice)
+            ? ""
+            : reinterpret_cast<const char*>(
+                  GRPC_SLICE_START_PTR(sml.tracing_slice));
+    size_t tracing_str_len = GRPC_SLICE_IS_EMPTY(sml.tracing_slice)
+                                 ? 0
+                                 : GRPC_SLICE_LENGTH(sml.tracing_slice);
+    GenerateServerContext(absl::string_view(tracing_str, tracing_str_len),
                           calld->qualified_method_, &calld->context_);
+    grpc_slice_unref_internal(sml.tracing_slice);
+    grpc_slice_unref_internal(sml.census_proto);
     grpc_slice_unref_internal(sml.path);
     grpc_census_call_set_context(
         calld->gc_, reinterpret_cast<census_context*>(&calld->context_));
@@ -128,9 +142,14 @@
     size_t len = ServerStatsSerialize(absl::ToInt64Nanoseconds(elapsed_time_),
                                       stats_buf_, kMaxServerStatsLen);
     if (len > 0) {
-      op->send_trailing_metadata()->batch()->Set(
-          grpc_core::GrpcServerStatsBinMetadata(),
-          grpc_core::Slice(grpc_core::UnmanagedMemorySlice(stats_buf_, len)));
+      GRPC_LOG_IF_ERROR(
+          "census grpc_filter",
+          grpc_metadata_batch_add_tail(
+              op->send_trailing_metadata()->batch(), &census_bin_,
+              grpc_mdelem_from_slices(
+                  GRPC_MDSTR_GRPC_SERVER_STATS_BIN,
+                  grpc_core::UnmanagedMemorySlice(stats_buf_, len)),
+              GRPC_BATCH_GRPC_SERVER_STATS_BIN));
     }
   }
   // Call next op.
diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py
index b439665..4bd2952 100644
--- a/src/python/grpcio/grpc_core_dependencies.py
+++ b/src/python/grpcio/grpc_core_dependencies.py
@@ -617,7 +617,6 @@
     'src/core/lib/transport/error_utils.cc',
     'src/core/lib/transport/metadata.cc',
     'src/core/lib/transport/metadata_batch.cc',
-    'src/core/lib/transport/parsed_metadata.cc',
     'src/core/lib/transport/pid_controller.cc',
     'src/core/lib/transport/static_metadata.cc',
     'src/core/lib/transport/status_conversion.cc',
diff --git a/test/core/end2end/fuzzers/hpack.dictionary b/test/core/end2end/fuzzers/hpack.dictionary
index a86c2f5..a87c218 100644
--- a/test/core/end2end/fuzzers/hpack.dictionary
+++ b/test/core/end2end/fuzzers/hpack.dictionary
@@ -4,16 +4,24 @@
 "\x07:status"
 "\x0A:authority"
 "\x07:scheme"
+"\x0Cgrpc-message"
 "\x0Bgrpc-status"
+"\x10grpc-payload-bin"
 "\x0Dgrpc-encoding"
 "\x14grpc-accept-encoding"
+"\x15grpc-server-stats-bin"
+"\x0Dgrpc-tags-bin"
+"\x0Egrpc-trace-bin"
 "\x0Ccontent-type"
 "\x10content-encoding"
 "\x0Faccept-encoding"
 "\x1Egrpc-internal-encoding-request"
+"\x04host"
 "\x1Agrpc-previous-rpc-attempts"
 "\x16grpc-retry-pushback-ms"
+"\x1Bx-endpoint-load-metrics-bin"
 "\x0Cgrpc-timeout"
+"\x0Auser-agent"
 "\x011"
 "\x012"
 "\x013"
@@ -64,7 +72,6 @@
 "\x06expect"
 "\x07expires"
 "\x04from"
-"\x04host"
 "\x08if-match"
 "\x11if-modified-since"
 "\x0Dif-none-match"
@@ -84,7 +91,6 @@
 "\x0Aset-cookie"
 "\x19strict-transport-security"
 "\x11transfer-encoding"
-"\x0Auser-agent"
 "\x04vary"
 "\x03via"
 "\x10www-authenticate"
diff --git a/test/core/security/evaluate_args_test.cc b/test/core/security/evaluate_args_test.cc
index b57d76d..a8df9b3 100644
--- a/test/core/security/evaluate_args_test.cc
+++ b/test/core/security/evaluate_args_test.cc
@@ -35,6 +35,7 @@
   EXPECT_EQ(args.GetPath(), nullptr);
   EXPECT_EQ(args.GetMethod(), nullptr);
   EXPECT_EQ(args.GetHost(), nullptr);
+  EXPECT_THAT(args.GetHeaders(), ::testing::ElementsAre());
   EXPECT_EQ(args.GetHeaderValue("some_key", nullptr), absl::nullopt);
 }
 
@@ -56,6 +57,16 @@
   EXPECT_EQ(args.GetMethod(), "GET");
 }
 
+TEST_F(EvaluateArgsTest, GetHeadersSuccess) {
+  util_.AddPairToMetadata("host", "host123");
+  util_.AddPairToMetadata(":path", "/expected/path");
+  EvaluateArgs args = util_.MakeEvaluateArgs();
+  EXPECT_THAT(args.GetHeaders(),
+              ::testing::UnorderedElementsAre(
+                  ::testing::Pair("host", "host123"),
+                  ::testing::Pair(":path", "/expected/path")));
+}
+
 TEST_F(EvaluateArgsTest, GetHeaderValueSuccess) {
   util_.AddPairToMetadata("key123", "value123");
   EvaluateArgs args = util_.MakeEvaluateArgs();
diff --git a/test/core/slice/percent_decode_fuzzer.cc b/test/core/slice/percent_decode_fuzzer.cc
index afaae3a..25d90a3 100644
--- a/test/core/slice/percent_decode_fuzzer.cc
+++ b/test/core/slice/percent_decode_fuzzer.cc
@@ -31,8 +31,20 @@
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
   grpc_init();
-  grpc_core::PermissivePercentDecodeSlice(
-      grpc_core::Slice::FromCopiedBuffer((const char*)data, size));
+  grpc_slice input = grpc_slice_from_copied_buffer((const char*)data, size);
+  absl::optional<grpc_slice> output;
+  output =
+      grpc_core::PercentDecodeSlice(input, grpc_core::PercentEncodingType::URL);
+  if (output.has_value()) {
+    grpc_slice_unref(*output);
+  }
+  output = grpc_core::PercentDecodeSlice(
+      input, grpc_core::PercentEncodingType::Compatible);
+  if (output.has_value()) {
+    grpc_slice_unref(*output);
+  }
+  grpc_slice_unref(grpc_core::PermissivePercentDecodeSlice(input));
+  grpc_slice_unref(input);
   grpc_shutdown();
   return 0;
 }
diff --git a/test/core/slice/percent_encode_fuzzer.cc b/test/core/slice/percent_encode_fuzzer.cc
index e145d15..782d1f9 100644
--- a/test/core/slice/percent_encode_fuzzer.cc
+++ b/test/core/slice/percent_encode_fuzzer.cc
@@ -32,13 +32,22 @@
 static void test(const uint8_t* data, size_t size,
                  grpc_core::PercentEncodingType type) {
   grpc_init();
-  auto input = grpc_core::Slice::FromCopiedBuffer(
-      reinterpret_cast<const char*>(data), size);
-  auto output = grpc_core::PercentEncodeSlice(input.Ref(), type);
-  auto permissive_decoded_output =
-      grpc_core::PermissivePercentDecodeSlice(std::move(output));
-  // decoded output must always match the input
-  GPR_ASSERT(input == permissive_decoded_output);
+  grpc_slice input =
+      grpc_slice_from_copied_buffer(reinterpret_cast<const char*>(data), size);
+  grpc_slice output = grpc_core::PercentEncodeSlice(input, type);
+  absl::optional<grpc_slice> decoded_output =
+      grpc_core::PercentDecodeSlice(output, type);
+  // encoder must always produce decodable output
+  GPR_ASSERT(decoded_output.has_value());
+  grpc_slice permissive_decoded_output =
+      grpc_core::PermissivePercentDecodeSlice(output);
+  // and decoded output must always match the input
+  GPR_ASSERT(grpc_slice_eq(input, *decoded_output));
+  GPR_ASSERT(grpc_slice_eq(input, permissive_decoded_output));
+  grpc_slice_unref(input);
+  grpc_slice_unref(output);
+  grpc_slice_unref(*decoded_output);
+  grpc_slice_unref(permissive_decoded_output);
   grpc_shutdown();
 }
 
diff --git a/test/core/slice/percent_encoding_test.cc b/test/core/slice/percent_encoding_test.cc
index bdc877a..d756637 100644
--- a/test/core/slice/percent_encoding_test.cc
+++ b/test/core/slice/percent_encoding_test.cc
@@ -29,10 +29,10 @@
 #define TEST_VECTOR(raw, encoded, dict) \
   test_vector(raw, sizeof(raw) - 1, encoded, sizeof(encoded) - 1, dict)
 
-#define TEST_NONCONFORMANT_VECTOR(encoded, permissive_unencoded) \
-  test_nonconformant_vector(encoded, sizeof(encoded) - 1,        \
-                            permissive_unencoded,                \
-                            sizeof(permissive_unencoded) - 1)
+#define TEST_NONCONFORMANT_VECTOR(encoded, permissive_unencoded, dict) \
+  test_nonconformant_vector(encoded, sizeof(encoded) - 1,              \
+                            permissive_unencoded,                      \
+                            sizeof(permissive_unencoded) - 1, dict)
 
 static void test_vector(const char* raw, size_t raw_length, const char* encoded,
                         size_t encoded_length,
@@ -44,32 +44,46 @@
   gpr_free(raw_msg);
   gpr_free(encoded_msg);
 
-  auto raw_slice = grpc_core::Slice::FromCopiedBuffer(raw, raw_length);
-  auto encoded_slice =
-      grpc_core::Slice::FromCopiedBuffer(encoded, encoded_length);
-  auto raw2encoded_slice = grpc_core::PercentEncodeSlice(raw_slice.Ref(), type);
-  auto encoded2raw_permissive_slice =
-      grpc_core::PermissivePercentDecodeSlice(encoded_slice.Ref());
+  grpc_slice raw_slice = grpc_slice_from_copied_buffer(raw, raw_length);
+  grpc_slice encoded_slice =
+      grpc_slice_from_copied_buffer(encoded, encoded_length);
+  grpc_slice raw2encoded_slice = grpc_core::PercentEncodeSlice(raw_slice, type);
+  absl::optional<grpc_slice> encoded2raw_slice =
+      grpc_core::PercentDecodeSlice(encoded_slice, type);
+  GPR_ASSERT(encoded2raw_slice.has_value());
+  grpc_slice encoded2raw_permissive_slice =
+      grpc_core::PermissivePercentDecodeSlice(encoded_slice);
 
-  char* raw2encoded_msg = grpc_dump_slice(raw2encoded_slice.c_slice(),
-                                          GPR_DUMP_HEX | GPR_DUMP_ASCII);
+  char* raw2encoded_msg =
+      grpc_dump_slice(raw2encoded_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
+  char* encoded2raw_msg =
+      grpc_dump_slice(*encoded2raw_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
   char* encoded2raw_permissive_msg = grpc_dump_slice(
-      encoded2raw_permissive_slice.c_slice(), GPR_DUMP_HEX | GPR_DUMP_ASCII);
+      encoded2raw_permissive_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
   gpr_log(GPR_DEBUG,
-          "Result:\nraw2encoded = %s\nencoded2raw_permissive "
+          "Result:\nraw2encoded = %s\nencoded2raw = %s\nencoded2raw_permissive "
           "= %s",
-          raw2encoded_msg, encoded2raw_permissive_msg);
+          raw2encoded_msg, encoded2raw_msg, encoded2raw_permissive_msg);
   gpr_free(raw2encoded_msg);
+  gpr_free(encoded2raw_msg);
   gpr_free(encoded2raw_permissive_msg);
 
-  GPR_ASSERT(raw_slice == encoded2raw_permissive_slice);
-  GPR_ASSERT(encoded_slice == raw2encoded_slice);
+  GPR_ASSERT(grpc_slice_eq(raw_slice, *encoded2raw_slice));
+  GPR_ASSERT(grpc_slice_eq(raw_slice, encoded2raw_permissive_slice));
+  GPR_ASSERT(grpc_slice_eq(encoded_slice, raw2encoded_slice));
+
+  grpc_slice_unref(*encoded2raw_slice);
+  grpc_slice_unref(encoded2raw_permissive_slice);
+  grpc_slice_unref(raw2encoded_slice);
+  grpc_slice_unref(raw_slice);
+  grpc_slice_unref(encoded_slice);
 }
 
 static void test_nonconformant_vector(const char* encoded,
                                       size_t encoded_length,
                                       const char* permissive_unencoded,
-                                      size_t permissive_unencoded_length) {
+                                      size_t permissive_unencoded_length,
+                                      grpc_core::PercentEncodingType type) {
   char* permissive_unencoded_msg =
       gpr_dump(permissive_unencoded, permissive_unencoded_length,
                GPR_DUMP_HEX | GPR_DUMP_ASCII);
@@ -80,20 +94,28 @@
   gpr_free(permissive_unencoded_msg);
   gpr_free(encoded_msg);
 
-  auto permissive_unencoded_slice = grpc_core::Slice::FromCopiedBuffer(
+  grpc_slice permissive_unencoded_slice = grpc_slice_from_copied_buffer(
       permissive_unencoded, permissive_unencoded_length);
-  auto encoded_slice =
-      grpc_core::Slice::FromCopiedBuffer(encoded, encoded_length);
-  auto encoded2raw_permissive_slice =
-      grpc_core::PermissivePercentDecodeSlice(std::move(encoded_slice));
+  grpc_slice encoded_slice =
+      grpc_slice_from_copied_buffer(encoded, encoded_length);
+  absl::optional<grpc_slice> encoded2raw_slice =
+      grpc_core::PercentDecodeSlice(encoded_slice, type);
+  GPR_ASSERT(!encoded2raw_slice.has_value());
+  grpc_slice encoded2raw_permissive_slice =
+      grpc_core::PermissivePercentDecodeSlice(encoded_slice);
 
   char* encoded2raw_permissive_msg = grpc_dump_slice(
-      encoded2raw_permissive_slice.c_slice(), GPR_DUMP_HEX | GPR_DUMP_ASCII);
+      encoded2raw_permissive_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
   gpr_log(GPR_DEBUG, "Result:\nencoded2raw_permissive = %s",
           encoded2raw_permissive_msg);
   gpr_free(encoded2raw_permissive_msg);
 
-  GPR_ASSERT(permissive_unencoded_slice == encoded2raw_permissive_slice);
+  GPR_ASSERT(
+      grpc_slice_eq(permissive_unencoded_slice, encoded2raw_permissive_slice));
+
+  grpc_slice_unref(permissive_unencoded_slice);
+  grpc_slice_unref(encoded2raw_permissive_slice);
+  grpc_slice_unref(encoded_slice);
 }
 
 int main(int argc, char** argv) {
@@ -113,10 +135,10 @@
   TEST_VECTOR("\xff", "%FF", grpc_core::PercentEncodingType::URL);
   TEST_VECTOR("\xee", "%EE", grpc_core::PercentEncodingType::URL);
   TEST_VECTOR("%2", "%252", grpc_core::PercentEncodingType::URL);
-  TEST_NONCONFORMANT_VECTOR("%", "%");
-  TEST_NONCONFORMANT_VECTOR("%A", "%A");
-  TEST_NONCONFORMANT_VECTOR("%AG", "%AG");
-  TEST_NONCONFORMANT_VECTOR("\0", "\0");
+  TEST_NONCONFORMANT_VECTOR("%", "%", grpc_core::PercentEncodingType::URL);
+  TEST_NONCONFORMANT_VECTOR("%A", "%A", grpc_core::PercentEncodingType::URL);
+  TEST_NONCONFORMANT_VECTOR("%AG", "%AG", grpc_core::PercentEncodingType::URL);
+  TEST_NONCONFORMANT_VECTOR("\0", "\0", grpc_core::PercentEncodingType::URL);
   grpc_shutdown();
   return 0;
 }
diff --git a/test/core/util/evaluate_args_test_util.h b/test/core/util/evaluate_args_test_util.h
index ab12dc5..f7b0b5c 100644
--- a/test/core/util/evaluate_args_test_util.h
+++ b/test/core/util/evaluate_args_test_util.h
@@ -33,8 +33,14 @@
   ~EvaluateArgsTestUtil() { delete channel_args_; }
 
   void AddPairToMetadata(const char* key, const char* value) {
-    metadata_.Append(
-        key, Slice(grpc_slice_intern(grpc_slice_from_static_string(value))));
+    metadata_storage_.emplace_back();
+    auto& storage = metadata_storage_.back();
+    ASSERT_EQ(grpc_metadata_batch_add_tail(
+                  &metadata_, &storage,
+                  grpc_mdelem_from_slices(
+                      grpc_slice_intern(grpc_slice_from_static_string(key)),
+                      grpc_slice_intern(grpc_slice_from_static_string(value)))),
+              GRPC_ERROR_NONE);
   }
 
   void SetLocalEndpoint(absl::string_view local_uri) {
@@ -57,6 +63,7 @@
 
  private:
   ScopedArenaPtr arena_ = MakeScopedArena(1024);
+  std::list<grpc_linked_mdelem> metadata_storage_;
   grpc_metadata_batch metadata_{arena_.get()};
   MockAuthorizationEndpoint endpoint_{/*local_uri=*/"", /*peer_uri=*/""};
   grpc_auth_context auth_context_{nullptr};
diff --git a/test/cpp/microbenchmarks/bm_chttp2_hpack.cc b/test/cpp/microbenchmarks/bm_chttp2_hpack.cc
index 96ecb64..529f41e 100644
--- a/test/cpp/microbenchmarks/bm_chttp2_hpack.cc
+++ b/test/cpp/microbenchmarks/bm_chttp2_hpack.cc
@@ -303,20 +303,24 @@
                      GRPC_MDSTR_AUTHORITY,
                      grpc_slice_intern(grpc_slice_from_static_string(
                          "foo.test.google.fr:1234"))))));
-    b->Set(grpc_core::GrpcTraceBinMetadata(),
-           grpc_core::Slice(grpc_core::StaticSlice::FromStaticString(
-               "\x00\x01\x02\x03\x04\x05\x06\x07\x08"
-               "\x09\x0a\x0b\x0c\x0d\x0e\x0f"
-               "\x10\x11\x12\x13\x14\x15\x16\x17\x18"
-               "\x19\x1a\x1b\x1c\x1d\x1e\x1f"
-               "\x20\x21\x22\x23\x24\x25\x26\x27\x28"
-               "\x29\x2a\x2b\x2c\x2d\x2e\x2f"
-               "\x30")));
-    b->Set(grpc_core::GrpcTagsBinMetadata(),
-           grpc_core::Slice(grpc_core::StaticSlice::FromStaticString(
-               "\x00\x01\x02\x03\x04\x05\x06\x07\x08"
-               "\x09\x0a\x0b\x0c\x0d\x0e\x0f"
-               "\x10\x11\x12\x13")));
+    GPR_ASSERT(GRPC_LOG_IF_ERROR(
+        "addmd",
+        b->Append(grpc_mdelem_from_slices(
+            GRPC_MDSTR_GRPC_TRACE_BIN,
+            grpc_slice_from_static_string("\x00\x01\x02\x03\x04\x05\x06\x07\x08"
+                                          "\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+                                          "\x10\x11\x12\x13\x14\x15\x16\x17\x18"
+                                          "\x19\x1a\x1b\x1c\x1d\x1e\x1f"
+                                          "\x20\x21\x22\x23\x24\x25\x26\x27\x28"
+                                          "\x29\x2a\x2b\x2c\x2d\x2e\x2f"
+                                          "\x30")))));
+    GPR_ASSERT(GRPC_LOG_IF_ERROR(
+        "addmd",
+        b->Append(grpc_mdelem_from_slices(
+            GRPC_MDSTR_GRPC_TAGS_BIN,
+            grpc_slice_from_static_string("\x00\x01\x02\x03\x04\x05\x06\x07\x08"
+                                          "\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+                                          "\x10\x11\x12\x13")))));
     GPR_ASSERT(GRPC_LOG_IF_ERROR(
         "addmd",
         b->Append(
diff --git a/test/cpp/util/grpc_tool_test.cc b/test/cpp/util/grpc_tool_test.cc
index 8a52b81..9dec8a2 100644
--- a/test/cpp/util/grpc_tool_test.cc
+++ b/test/cpp/util/grpc_tool_test.cc
@@ -937,11 +937,10 @@
                                    std::bind(PrintStream, &output_stream,
                                              std::placeholders::_1)));
 
-  std::string output = output_stream.str();
-
   // Expected output: "message: "true""
   // deadline not greater than timeout + current time
-  EXPECT_TRUE(nullptr != strstr(output.c_str(), "message: \"true\"")) << output;
+  EXPECT_TRUE(nullptr !=
+              strstr(output_stream.str().c_str(), "message: \"true\""));
   ShutdownServer();
 }
 
diff --git a/tools/codegen/core/gen_static_metadata.py b/tools/codegen/core/gen_static_metadata.py
index f89d961..71e69b7 100755
--- a/tools/codegen/core/gen_static_metadata.py
+++ b/tools/codegen/core/gen_static_metadata.py
@@ -35,20 +35,28 @@
 
 CONFIG = [
     # metadata strings
+    'host',
+    'grpc-timeout',
     'grpc-internal-encoding-request',
+    'grpc-payload-bin',
     ':path',
     'grpc-encoding',
     'grpc-accept-encoding',
+    'user-agent',
     ':authority',
+    'grpc-message',
     'grpc-status',
+    'grpc-server-stats-bin',
+    'grpc-tags-bin',
+    'grpc-trace-bin',
     'grpc-previous-rpc-attempts',
     'grpc-retry-pushback-ms',
-    'grpc-timeout',
     '1',
     '2',
     '3',
     '4',
     '',
+    'x-endpoint-load-metrics-bin',
     # well known method names
     '/grpc.lb.v1.LoadBalancer/BalanceLoad',
     '/envoy.service.load_stats.v2.LoadReportingService/StreamLoadStats',
@@ -150,15 +158,22 @@
     ':status',
     ':authority',
     ':scheme',
+    'grpc-message',
     'grpc-status',
+    'grpc-payload-bin',
     'grpc-encoding',
     'grpc-accept-encoding',
+    'grpc-server-stats-bin',
+    'grpc-tags-bin',
+    'grpc-trace-bin',
     'content-type',
     'content-encoding',
     'accept-encoding',
     'grpc-internal-encoding-request',
+    'host',
     'grpc-previous-rpc-attempts',
     'grpc-retry-pushback-ms',
+    'x-endpoint-load-metrics-bin',
 ]
 
 COMPRESSION_ALGORITHMS = [
diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal
index 5e20ff4..6234711 100644
--- a/tools/doxygen/Doxyfile.c++.internal
+++ b/tools/doxygen/Doxyfile.c++.internal
@@ -2240,7 +2240,6 @@
 src/core/lib/transport/metadata.h \
 src/core/lib/transport/metadata_batch.cc \
 src/core/lib/transport/metadata_batch.h \
-src/core/lib/transport/parsed_metadata.cc \
 src/core/lib/transport/parsed_metadata.h \
 src/core/lib/transport/pid_controller.cc \
 src/core/lib/transport/pid_controller.h \
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index 31012bd..b9549a8 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -2041,7 +2041,6 @@
 src/core/lib/transport/metadata.h \
 src/core/lib/transport/metadata_batch.cc \
 src/core/lib/transport/metadata_batch.h \
-src/core/lib/transport/parsed_metadata.cc \
 src/core/lib/transport/parsed_metadata.h \
 src/core/lib/transport/pid_controller.cc \
 src/core/lib/transport/pid_controller.h \