WebRTC-DeprecateGlobalFieldTrialString/Enabled/ - part 12/inf

rename WebRtcKeyValueConfig to FieldTrialsView

Bug: webrtc:10335
Change-Id: If725bd498c4c3daf144bee638230fa089fdde833
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/256965
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Jonas Oreland <jonaso@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36365}
diff --git a/api/BUILD.gn b/api/BUILD.gn
index b736f93..c3f3051 100644
--- a/api/BUILD.gn
+++ b/api/BUILD.gn
@@ -171,6 +171,7 @@
     ":audio_options_api",
     ":callfactory_api",
     ":fec_controller_api",
+    ":field_trials_view",
     ":frame_transformer_interface",
     ":libjingle_logging_api",
     ":media_stream_interface",
@@ -200,7 +201,6 @@
     "transport:enums",
     "transport:network_control",
     "transport:sctp_transport_factory_interface",
-    "transport:webrtc_key_value_config",
     "transport/rtp:rtp_source",
     "units:data_rate",
     "units:timestamp",
@@ -1224,9 +1224,15 @@
   }
 }
 
+rtc_source_set("field_trials_view") {
+  visibility = [ "*" ]
+  sources = [ "field_trials_view.h" ]
+  deps = [ "../rtc_base/system:rtc_export" ]
+  absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
+}
+
 rtc_source_set("webrtc_key_value_config") {
   visibility = [ "*" ]
   sources = [ "webrtc_key_value_config.h" ]
-  deps = [ "../rtc_base/system:rtc_export" ]
-  absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
+  deps = [ ":field_trials_view" ]
 }
diff --git a/api/audio_codecs/BUILD.gn b/api/audio_codecs/BUILD.gn
index 3c84af8..4fd30ce 100644
--- a/api/audio_codecs/BUILD.gn
+++ b/api/audio_codecs/BUILD.gn
@@ -32,7 +32,7 @@
     "..:array_view",
     "..:bitrate_allocation",
     "..:scoped_refptr",
-    "../../api:webrtc_key_value_config",
+    "../../api:field_trials_view",
     "../../rtc_base:checks",
     "../../rtc_base:rtc_base_approved",
     "../../rtc_base:sanitizer",
diff --git a/api/audio_codecs/L16/BUILD.gn b/api/audio_codecs/L16/BUILD.gn
index 9e4a0f1..b35e67b 100644
--- a/api/audio_codecs/L16/BUILD.gn
+++ b/api/audio_codecs/L16/BUILD.gn
@@ -21,7 +21,7 @@
   ]
   deps = [
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:pcm16b",
     "../../../rtc_base:rtc_base_approved",
     "../../../rtc_base:safe_minmax",
@@ -42,7 +42,7 @@
   ]
   deps = [
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:pcm16b",
     "../../../rtc_base:rtc_base_approved",
     "../../../rtc_base/system:rtc_export",
diff --git a/api/audio_codecs/L16/audio_decoder_L16.cc b/api/audio_codecs/L16/audio_decoder_L16.cc
index 874a8a5..a03abe2 100644
--- a/api/audio_codecs/L16/audio_decoder_L16.cc
+++ b/api/audio_codecs/L16/audio_decoder_L16.cc
@@ -38,7 +38,7 @@
 std::unique_ptr<AudioDecoder> AudioDecoderL16::MakeAudioDecoder(
     const Config& config,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   if (!config.IsOk()) {
     return nullptr;
   }
diff --git a/api/audio_codecs/L16/audio_decoder_L16.h b/api/audio_codecs/L16/audio_decoder_L16.h
index ade8f98..5a01b7d 100644
--- a/api/audio_codecs/L16/audio_decoder_L16.h
+++ b/api/audio_codecs/L16/audio_decoder_L16.h
@@ -18,7 +18,7 @@
 #include "api/audio_codecs/audio_codec_pair_id.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "api/audio_codecs/audio_format.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
@@ -41,7 +41,7 @@
   static std::unique_ptr<AudioDecoder> MakeAudioDecoder(
       const Config& config,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/L16/audio_encoder_L16.cc b/api/audio_codecs/L16/audio_encoder_L16.cc
index 3994f5c..20259b9 100644
--- a/api/audio_codecs/L16/audio_encoder_L16.cc
+++ b/api/audio_codecs/L16/audio_encoder_L16.cc
@@ -60,7 +60,7 @@
     const AudioEncoderL16::Config& config,
     int payload_type,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   AudioEncoderPcm16B::Config c;
   c.sample_rate_hz = config.sample_rate_hz;
   c.num_channels = config.num_channels;
diff --git a/api/audio_codecs/L16/audio_encoder_L16.h b/api/audio_codecs/L16/audio_encoder_L16.h
index e0916df..4750984 100644
--- a/api/audio_codecs/L16/audio_encoder_L16.h
+++ b/api/audio_codecs/L16/audio_encoder_L16.h
@@ -18,7 +18,7 @@
 #include "api/audio_codecs/audio_codec_pair_id.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
@@ -46,7 +46,7 @@
       const Config& config,
       int payload_type,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/audio_decoder_factory_template.h b/api/audio_codecs/audio_decoder_factory_template.h
index 4badd82..4e39365 100644
--- a/api/audio_codecs/audio_decoder_factory_template.h
+++ b/api/audio_codecs/audio_decoder_factory_template.h
@@ -15,8 +15,8 @@
 #include <vector>
 
 #include "api/audio_codecs/audio_decoder_factory.h"
+#include "api/field_trials_view.h"
 #include "api/scoped_refptr.h"
-#include "api/webrtc_key_value_config.h"
 #include "rtc_base/ref_counted_object.h"
 
 namespace webrtc {
@@ -34,7 +34,7 @@
   static std::unique_ptr<AudioDecoder> MakeAudioDecoder(
       const SdpAudioFormat& format,
       absl::optional<AudioCodecPairId> codec_pair_id,
-      const WebRtcKeyValueConfig* field_trials) {
+      const FieldTrialsView* field_trials) {
     return nullptr;
   }
 };
@@ -58,7 +58,7 @@
   static std::unique_ptr<AudioDecoder> MakeAudioDecoder(
       const SdpAudioFormat& format,
       absl::optional<AudioCodecPairId> codec_pair_id,
-      const WebRtcKeyValueConfig* field_trials) {
+      const FieldTrialsView* field_trials) {
     auto opt_config = T::SdpToConfig(format);
     return opt_config ? T::MakeAudioDecoder(*opt_config, codec_pair_id)
                       : Helper<Ts...>::MakeAudioDecoder(format, codec_pair_id,
@@ -69,7 +69,7 @@
 template <typename... Ts>
 class AudioDecoderFactoryT : public AudioDecoderFactory {
  public:
-  explicit AudioDecoderFactoryT(const WebRtcKeyValueConfig* field_trials) {
+  explicit AudioDecoderFactoryT(const FieldTrialsView* field_trials) {
     field_trials_ = field_trials;
   }
 
@@ -90,7 +90,7 @@
                                            field_trials_);
   }
 
-  const WebRtcKeyValueConfig* field_trials_;
+  const FieldTrialsView* field_trials_;
 };
 
 }  // namespace audio_decoder_factory_template_impl
@@ -127,7 +127,7 @@
 // how it is used.
 template <typename... Ts>
 rtc::scoped_refptr<AudioDecoderFactory> CreateAudioDecoderFactory(
-    const WebRtcKeyValueConfig* field_trials = nullptr) {
+    const FieldTrialsView* field_trials = nullptr) {
   // There's no technical reason we couldn't allow zero template parameters,
   // but such a factory couldn't create any decoders, and callers can do this
   // by mistake by simply forgetting the <> altogether. So we forbid it in
diff --git a/api/audio_codecs/audio_encoder_factory_template.h b/api/audio_codecs/audio_encoder_factory_template.h
index ceefab2..8490f46 100644
--- a/api/audio_codecs/audio_encoder_factory_template.h
+++ b/api/audio_codecs/audio_encoder_factory_template.h
@@ -15,8 +15,8 @@
 #include <vector>
 
 #include "api/audio_codecs/audio_encoder_factory.h"
+#include "api/field_trials_view.h"
 #include "api/scoped_refptr.h"
-#include "api/webrtc_key_value_config.h"
 #include "rtc_base/ref_counted_object.h"
 
 namespace webrtc {
@@ -38,7 +38,7 @@
       int payload_type,
       const SdpAudioFormat& format,
       absl::optional<AudioCodecPairId> codec_pair_id,
-      const WebRtcKeyValueConfig* field_trials) {
+      const FieldTrialsView* field_trials) {
     return nullptr;
   }
 };
@@ -66,7 +66,7 @@
       int payload_type,
       const SdpAudioFormat& format,
       absl::optional<AudioCodecPairId> codec_pair_id,
-      const WebRtcKeyValueConfig* field_trials) {
+      const FieldTrialsView* field_trials) {
     auto opt_config = T::SdpToConfig(format);
     if (opt_config) {
       return T::MakeAudioEncoder(*opt_config, payload_type, codec_pair_id);
@@ -80,7 +80,7 @@
 template <typename... Ts>
 class AudioEncoderFactoryT : public AudioEncoderFactory {
  public:
-  explicit AudioEncoderFactoryT(const WebRtcKeyValueConfig* field_trials) {
+  explicit AudioEncoderFactoryT(const FieldTrialsView* field_trials) {
     field_trials_ = field_trials;
   }
 
@@ -103,7 +103,7 @@
                                            field_trials_);
   }
 
-  const WebRtcKeyValueConfig* field_trials_;
+  const FieldTrialsView* field_trials_;
 };
 
 }  // namespace audio_encoder_factory_template_impl
@@ -145,7 +145,7 @@
 // how it is used.
 template <typename... Ts>
 rtc::scoped_refptr<AudioEncoderFactory> CreateAudioEncoderFactory(
-    const WebRtcKeyValueConfig* field_trials = nullptr) {
+    const FieldTrialsView* field_trials = nullptr) {
   // There's no technical reason we couldn't allow zero template parameters,
   // but such a factory couldn't create any encoders, and callers can do this
   // by mistake by simply forgetting the <> altogether. So we forbid it in
diff --git a/api/audio_codecs/builtin_audio_encoder_factory.cc b/api/audio_codecs/builtin_audio_encoder_factory.cc
index 4433893..530d64b 100644
--- a/api/audio_codecs/builtin_audio_encoder_factory.cc
+++ b/api/audio_codecs/builtin_audio_encoder_factory.cc
@@ -48,7 +48,7 @@
       const Config& config,
       int payload_type,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr) {
+      const FieldTrialsView* field_trials = nullptr) {
     return T::MakeAudioEncoder(config, payload_type, codec_pair_id,
                                field_trials);
   }
diff --git a/api/audio_codecs/g711/BUILD.gn b/api/audio_codecs/g711/BUILD.gn
index 1f0b7df..faac047 100644
--- a/api/audio_codecs/g711/BUILD.gn
+++ b/api/audio_codecs/g711/BUILD.gn
@@ -21,7 +21,7 @@
   ]
   deps = [
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:g711",
     "../../../rtc_base:rtc_base_approved",
     "../../../rtc_base:safe_minmax",
@@ -42,7 +42,7 @@
   ]
   deps = [
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:g711",
     "../../../rtc_base:rtc_base_approved",
     "../../../rtc_base/system:rtc_export",
diff --git a/api/audio_codecs/g711/audio_decoder_g711.cc b/api/audio_codecs/g711/audio_decoder_g711.cc
index b34b464..838f7e9 100644
--- a/api/audio_codecs/g711/audio_decoder_g711.cc
+++ b/api/audio_codecs/g711/audio_decoder_g711.cc
@@ -48,7 +48,7 @@
 std::unique_ptr<AudioDecoder> AudioDecoderG711::MakeAudioDecoder(
     const Config& config,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   if (!config.IsOk()) {
     RTC_DCHECK_NOTREACHED();
     return nullptr;
diff --git a/api/audio_codecs/g711/audio_decoder_g711.h b/api/audio_codecs/g711/audio_decoder_g711.h
index 62b0f88..0f7a98d 100644
--- a/api/audio_codecs/g711/audio_decoder_g711.h
+++ b/api/audio_codecs/g711/audio_decoder_g711.h
@@ -18,7 +18,7 @@
 #include "api/audio_codecs/audio_codec_pair_id.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "api/audio_codecs/audio_format.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
@@ -41,7 +41,7 @@
   static std::unique_ptr<AudioDecoder> MakeAudioDecoder(
       const Config& config,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/g711/audio_encoder_g711.cc b/api/audio_codecs/g711/audio_encoder_g711.cc
index 8c60304..1dca3b8 100644
--- a/api/audio_codecs/g711/audio_encoder_g711.cc
+++ b/api/audio_codecs/g711/audio_encoder_g711.cc
@@ -65,7 +65,7 @@
     const Config& config,
     int payload_type,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   if (!config.IsOk()) {
     RTC_DCHECK_NOTREACHED();
     return nullptr;
diff --git a/api/audio_codecs/g711/audio_encoder_g711.h b/api/audio_codecs/g711/audio_encoder_g711.h
index c2750e2..4b3eb84 100644
--- a/api/audio_codecs/g711/audio_encoder_g711.h
+++ b/api/audio_codecs/g711/audio_encoder_g711.h
@@ -18,7 +18,7 @@
 #include "api/audio_codecs/audio_codec_pair_id.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
@@ -46,7 +46,7 @@
       const Config& config,
       int payload_type,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/g722/BUILD.gn b/api/audio_codecs/g722/BUILD.gn
index fbce2c5..1441e6d 100644
--- a/api/audio_codecs/g722/BUILD.gn
+++ b/api/audio_codecs/g722/BUILD.gn
@@ -27,7 +27,7 @@
   deps = [
     ":audio_encoder_g722_config",
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:g722",
     "../../../rtc_base:rtc_base_approved",
     "../../../rtc_base:safe_minmax",
@@ -48,7 +48,7 @@
   ]
   deps = [
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:g722",
     "../../../rtc_base:rtc_base_approved",
     "../../../rtc_base/system:rtc_export",
diff --git a/api/audio_codecs/g722/audio_decoder_g722.cc b/api/audio_codecs/g722/audio_decoder_g722.cc
index 8f3a5c0..ed71634 100644
--- a/api/audio_codecs/g722/audio_decoder_g722.cc
+++ b/api/audio_codecs/g722/audio_decoder_g722.cc
@@ -37,7 +37,7 @@
 std::unique_ptr<AudioDecoder> AudioDecoderG722::MakeAudioDecoder(
     Config config,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   if (!config.IsOk()) {
     RTC_DCHECK_NOTREACHED();
     return nullptr;
diff --git a/api/audio_codecs/g722/audio_decoder_g722.h b/api/audio_codecs/g722/audio_decoder_g722.h
index 05e6130..6f7b253 100644
--- a/api/audio_codecs/g722/audio_decoder_g722.h
+++ b/api/audio_codecs/g722/audio_decoder_g722.h
@@ -18,7 +18,7 @@
 #include "api/audio_codecs/audio_codec_pair_id.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "api/audio_codecs/audio_format.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
@@ -35,7 +35,7 @@
   static std::unique_ptr<AudioDecoder> MakeAudioDecoder(
       Config config,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/g722/audio_encoder_g722.cc b/api/audio_codecs/g722/audio_encoder_g722.cc
index 812d66f..56a6c4d 100644
--- a/api/audio_codecs/g722/audio_encoder_g722.cc
+++ b/api/audio_codecs/g722/audio_encoder_g722.cc
@@ -63,7 +63,7 @@
     const AudioEncoderG722Config& config,
     int payload_type,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   if (!config.IsOk()) {
     RTC_DCHECK_NOTREACHED();
     return nullptr;
diff --git a/api/audio_codecs/g722/audio_encoder_g722.h b/api/audio_codecs/g722/audio_encoder_g722.h
index 14ddff7..78ceddd 100644
--- a/api/audio_codecs/g722/audio_encoder_g722.h
+++ b/api/audio_codecs/g722/audio_encoder_g722.h
@@ -19,7 +19,7 @@
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/g722/audio_encoder_g722_config.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
@@ -36,7 +36,7 @@
       const AudioEncoderG722Config& config,
       int payload_type,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/ilbc/BUILD.gn b/api/audio_codecs/ilbc/BUILD.gn
index 1cac7ed..8dab307 100644
--- a/api/audio_codecs/ilbc/BUILD.gn
+++ b/api/audio_codecs/ilbc/BUILD.gn
@@ -27,7 +27,7 @@
   deps = [
     ":audio_encoder_ilbc_config",
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:ilbc",
     "../../../rtc_base:rtc_base_approved",
     "../../../rtc_base:safe_minmax",
@@ -47,7 +47,7 @@
   ]
   deps = [
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:ilbc",
     "../../../rtc_base:rtc_base_approved",
   ]
diff --git a/api/audio_codecs/ilbc/audio_decoder_ilbc.cc b/api/audio_codecs/ilbc/audio_decoder_ilbc.cc
index 9a291ee..c583169 100644
--- a/api/audio_codecs/ilbc/audio_decoder_ilbc.cc
+++ b/api/audio_codecs/ilbc/audio_decoder_ilbc.cc
@@ -35,7 +35,7 @@
 std::unique_ptr<AudioDecoder> AudioDecoderIlbc::MakeAudioDecoder(
     Config config,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   return std::make_unique<AudioDecoderIlbcImpl>();
 }
 
diff --git a/api/audio_codecs/ilbc/audio_decoder_ilbc.h b/api/audio_codecs/ilbc/audio_decoder_ilbc.h
index 4d9a4b7..60566c8 100644
--- a/api/audio_codecs/ilbc/audio_decoder_ilbc.h
+++ b/api/audio_codecs/ilbc/audio_decoder_ilbc.h
@@ -18,7 +18,7 @@
 #include "api/audio_codecs/audio_codec_pair_id.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "api/audio_codecs/audio_format.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 
 namespace webrtc {
 
@@ -31,7 +31,7 @@
   static std::unique_ptr<AudioDecoder> MakeAudioDecoder(
       Config config,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/ilbc/audio_encoder_ilbc.cc b/api/audio_codecs/ilbc/audio_encoder_ilbc.cc
index 6525887..b497948 100644
--- a/api/audio_codecs/ilbc/audio_encoder_ilbc.cc
+++ b/api/audio_codecs/ilbc/audio_encoder_ilbc.cc
@@ -77,7 +77,7 @@
     const AudioEncoderIlbcConfig& config,
     int payload_type,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   if (!config.IsOk()) {
     RTC_DCHECK_NOTREACHED();
     return nullptr;
diff --git a/api/audio_codecs/ilbc/audio_encoder_ilbc.h b/api/audio_codecs/ilbc/audio_encoder_ilbc.h
index 8dd4928..a530684 100644
--- a/api/audio_codecs/ilbc/audio_encoder_ilbc.h
+++ b/api/audio_codecs/ilbc/audio_encoder_ilbc.h
@@ -19,7 +19,7 @@
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/ilbc/audio_encoder_ilbc_config.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 
 namespace webrtc {
 
@@ -35,7 +35,7 @@
       const AudioEncoderIlbcConfig& config,
       int payload_type,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/isac/BUILD.gn b/api/audio_codecs/isac/BUILD.gn
index b6aa810..2231371 100644
--- a/api/audio_codecs/isac/BUILD.gn
+++ b/api/audio_codecs/isac/BUILD.gn
@@ -65,7 +65,7 @@
   ]
   deps = [
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:isac_fix",
     "../../../rtc_base:rtc_base_approved",
     "../../../rtc_base/system:rtc_export",
@@ -85,7 +85,7 @@
   ]
   deps = [
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:isac_fix",
     "../../../rtc_base:rtc_base_approved",
     "../../../rtc_base/system:rtc_export",
@@ -105,7 +105,7 @@
   ]
   deps = [
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:isac",
     "../../../rtc_base:rtc_base_approved",
     "../../../rtc_base/system:rtc_export",
@@ -125,7 +125,7 @@
   ]
   deps = [
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:isac",
     "../../../rtc_base:rtc_base_approved",
     "../../../rtc_base/system:rtc_export",
diff --git a/api/audio_codecs/isac/audio_decoder_isac_fix.cc b/api/audio_codecs/isac/audio_decoder_isac_fix.cc
index 8927a16..b3ab91d 100644
--- a/api/audio_codecs/isac/audio_decoder_isac_fix.cc
+++ b/api/audio_codecs/isac/audio_decoder_isac_fix.cc
@@ -34,7 +34,7 @@
 std::unique_ptr<AudioDecoder> AudioDecoderIsacFix::MakeAudioDecoder(
     Config config,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   AudioDecoderIsacFixImpl::Config c;
   c.sample_rate_hz = 16000;
   return std::make_unique<AudioDecoderIsacFixImpl>(c);
diff --git a/api/audio_codecs/isac/audio_decoder_isac_fix.h b/api/audio_codecs/isac/audio_decoder_isac_fix.h
index 11b8766..8f61d9a 100644
--- a/api/audio_codecs/isac/audio_decoder_isac_fix.h
+++ b/api/audio_codecs/isac/audio_decoder_isac_fix.h
@@ -18,7 +18,7 @@
 #include "api/audio_codecs/audio_codec_pair_id.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "api/audio_codecs/audio_format.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
@@ -32,7 +32,7 @@
   static std::unique_ptr<AudioDecoder> MakeAudioDecoder(
       Config config,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/isac/audio_decoder_isac_float.cc b/api/audio_codecs/isac/audio_decoder_isac_float.cc
index ef27293..98f672b 100644
--- a/api/audio_codecs/isac/audio_decoder_isac_float.cc
+++ b/api/audio_codecs/isac/audio_decoder_isac_float.cc
@@ -43,7 +43,7 @@
 std::unique_ptr<AudioDecoder> AudioDecoderIsacFloat::MakeAudioDecoder(
     Config config,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   AudioDecoderIsacFloatImpl::Config c;
   c.sample_rate_hz = config.sample_rate_hz;
   if (!config.IsOk()) {
diff --git a/api/audio_codecs/isac/audio_decoder_isac_float.h b/api/audio_codecs/isac/audio_decoder_isac_float.h
index 501edfc..864c6b9 100644
--- a/api/audio_codecs/isac/audio_decoder_isac_float.h
+++ b/api/audio_codecs/isac/audio_decoder_isac_float.h
@@ -18,7 +18,7 @@
 #include "api/audio_codecs/audio_codec_pair_id.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "api/audio_codecs/audio_format.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
@@ -37,7 +37,7 @@
   static std::unique_ptr<AudioDecoder> MakeAudioDecoder(
       Config config,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/isac/audio_encoder_isac_fix.cc b/api/audio_codecs/isac/audio_encoder_isac_fix.cc
index 65a2d8f..3960377 100644
--- a/api/audio_codecs/isac/audio_encoder_isac_fix.cc
+++ b/api/audio_codecs/isac/audio_encoder_isac_fix.cc
@@ -57,7 +57,7 @@
     AudioEncoderIsacFix::Config config,
     int payload_type,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   AudioEncoderIsacFixImpl::Config c;
   c.frame_size_ms = config.frame_size_ms;
   c.bit_rate = config.bit_rate;
diff --git a/api/audio_codecs/isac/audio_encoder_isac_fix.h b/api/audio_codecs/isac/audio_encoder_isac_fix.h
index e8ff0fc..de0f1d1 100644
--- a/api/audio_codecs/isac/audio_encoder_isac_fix.h
+++ b/api/audio_codecs/isac/audio_encoder_isac_fix.h
@@ -18,7 +18,7 @@
 #include "api/audio_codecs/audio_codec_pair_id.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
@@ -46,7 +46,7 @@
       Config config,
       int payload_type,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/isac/audio_encoder_isac_float.cc b/api/audio_codecs/isac/audio_encoder_isac_float.cc
index 852cb69..e3e5008 100644
--- a/api/audio_codecs/isac/audio_encoder_isac_float.cc
+++ b/api/audio_codecs/isac/audio_encoder_isac_float.cc
@@ -69,7 +69,7 @@
     const AudioEncoderIsacFloat::Config& config,
     int payload_type,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   AudioEncoderIsacFloatImpl::Config c;
   c.payload_type = payload_type;
   c.sample_rate_hz = config.sample_rate_hz;
diff --git a/api/audio_codecs/isac/audio_encoder_isac_float.h b/api/audio_codecs/isac/audio_encoder_isac_float.h
index 8e1d505..d031d76 100644
--- a/api/audio_codecs/isac/audio_encoder_isac_float.h
+++ b/api/audio_codecs/isac/audio_encoder_isac_float.h
@@ -18,7 +18,7 @@
 #include "api/audio_codecs/audio_codec_pair_id.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
@@ -60,7 +60,7 @@
       const Config& config,
       int payload_type,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/opus/BUILD.gn b/api/audio_codecs/opus/BUILD.gn
index fbb116b..94d4d1b 100644
--- a/api/audio_codecs/opus/BUILD.gn
+++ b/api/audio_codecs/opus/BUILD.gn
@@ -46,7 +46,7 @@
   deps = [
     ":audio_encoder_opus_config",
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:webrtc_opus",
     "../../../rtc_base:rtc_base_approved",
     "../../../rtc_base/system:rtc_export",
@@ -66,7 +66,7 @@
   ]
   deps = [
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:webrtc_opus",
     "../../../rtc_base:rtc_base_approved",
     "../../../rtc_base/system:rtc_export",
@@ -84,7 +84,7 @@
   sources = [ "audio_encoder_multi_channel_opus.cc" ]
   deps = [
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:webrtc_multiopus",
     "../../../rtc_base:rtc_base_approved",
     "../../../rtc_base/system:rtc_export",
@@ -103,7 +103,7 @@
   deps = [
     ":audio_decoder_opus_config",
     "..:audio_codecs_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../modules/audio_coding:webrtc_multiopus",
     "../../../rtc_base:rtc_base_approved",
     "../../../rtc_base/system:rtc_export",
diff --git a/api/audio_codecs/opus/audio_decoder_multi_channel_opus.cc b/api/audio_codecs/opus/audio_decoder_multi_channel_opus.cc
index 5a0b794..0fb4e05 100644
--- a/api/audio_codecs/opus/audio_decoder_multi_channel_opus.cc
+++ b/api/audio_codecs/opus/audio_decoder_multi_channel_opus.cc
@@ -65,7 +65,7 @@
 std::unique_ptr<AudioDecoder> AudioDecoderMultiChannelOpus::MakeAudioDecoder(
     AudioDecoderMultiChannelOpusConfig config,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   return AudioDecoderMultiChannelOpusImpl::MakeAudioDecoder(config);
 }
 }  // namespace webrtc
diff --git a/api/audio_codecs/opus/audio_decoder_multi_channel_opus.h b/api/audio_codecs/opus/audio_decoder_multi_channel_opus.h
index 2dcd26b..eafd6c6 100644
--- a/api/audio_codecs/opus/audio_decoder_multi_channel_opus.h
+++ b/api/audio_codecs/opus/audio_decoder_multi_channel_opus.h
@@ -19,7 +19,7 @@
 #include "api/audio_codecs/audio_decoder.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/opus/audio_decoder_multi_channel_opus_config.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
@@ -34,7 +34,7 @@
   static std::unique_ptr<AudioDecoder> MakeAudioDecoder(
       AudioDecoderMultiChannelOpusConfig config,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/opus/audio_decoder_opus.cc b/api/audio_codecs/opus/audio_decoder_opus.cc
index 0fe3367..efc9a73 100644
--- a/api/audio_codecs/opus/audio_decoder_opus.cc
+++ b/api/audio_codecs/opus/audio_decoder_opus.cc
@@ -74,7 +74,7 @@
 std::unique_ptr<AudioDecoder> AudioDecoderOpus::MakeAudioDecoder(
     Config config,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   if (!config.IsOk()) {
     RTC_DCHECK_NOTREACHED();
     return nullptr;
diff --git a/api/audio_codecs/opus/audio_decoder_opus.h b/api/audio_codecs/opus/audio_decoder_opus.h
index 4e44309..138c037 100644
--- a/api/audio_codecs/opus/audio_decoder_opus.h
+++ b/api/audio_codecs/opus/audio_decoder_opus.h
@@ -18,7 +18,7 @@
 #include "api/audio_codecs/audio_codec_pair_id.h"
 #include "api/audio_codecs/audio_decoder.h"
 #include "api/audio_codecs/audio_format.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
@@ -36,7 +36,7 @@
   static std::unique_ptr<AudioDecoder> MakeAudioDecoder(
       Config config,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/opus/audio_encoder_multi_channel_opus.cc b/api/audio_codecs/opus/audio_encoder_multi_channel_opus.cc
index b71a000..14f480b 100644
--- a/api/audio_codecs/opus/audio_encoder_multi_channel_opus.cc
+++ b/api/audio_codecs/opus/audio_encoder_multi_channel_opus.cc
@@ -67,7 +67,7 @@
     const AudioEncoderMultiChannelOpusConfig& config,
     int payload_type,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   return AudioEncoderMultiChannelOpusImpl::MakeAudioEncoder(config,
                                                             payload_type);
 }
diff --git a/api/audio_codecs/opus/audio_encoder_multi_channel_opus.h b/api/audio_codecs/opus/audio_encoder_multi_channel_opus.h
index 58b959a..c1c4db3 100644
--- a/api/audio_codecs/opus/audio_encoder_multi_channel_opus.h
+++ b/api/audio_codecs/opus/audio_encoder_multi_channel_opus.h
@@ -19,7 +19,7 @@
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/opus/audio_encoder_multi_channel_opus_config.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
@@ -35,7 +35,7 @@
       const Config& config,
       int payload_type,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/opus/audio_encoder_opus.cc b/api/audio_codecs/opus/audio_encoder_opus.cc
index 26fe8cc..5b6322d 100644
--- a/api/audio_codecs/opus/audio_encoder_opus.cc
+++ b/api/audio_codecs/opus/audio_encoder_opus.cc
@@ -33,7 +33,7 @@
     const AudioEncoderOpusConfig& config,
     int payload_type,
     absl::optional<AudioCodecPairId> /*codec_pair_id*/,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   if (!config.IsOk()) {
     RTC_DCHECK_NOTREACHED();
     return nullptr;
diff --git a/api/audio_codecs/opus/audio_encoder_opus.h b/api/audio_codecs/opus/audio_encoder_opus.h
index 4fb0337..df93ae5 100644
--- a/api/audio_codecs/opus/audio_encoder_opus.h
+++ b/api/audio_codecs/opus/audio_encoder_opus.h
@@ -19,7 +19,7 @@
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/audio_codecs/audio_format.h"
 #include "api/audio_codecs/opus/audio_encoder_opus_config.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/system/rtc_export.h"
 
 namespace webrtc {
@@ -36,7 +36,7 @@
       const AudioEncoderOpusConfig& config,
       int payload_type,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 };
 
 }  // namespace webrtc
diff --git a/api/audio_codecs/opus_audio_encoder_factory.cc b/api/audio_codecs/opus_audio_encoder_factory.cc
index 867d200..8c286f2 100644
--- a/api/audio_codecs/opus_audio_encoder_factory.cc
+++ b/api/audio_codecs/opus_audio_encoder_factory.cc
@@ -38,7 +38,7 @@
       const Config& config,
       int payload_type,
       absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
-      const WebRtcKeyValueConfig* field_trials = nullptr) {
+      const FieldTrialsView* field_trials = nullptr) {
     return T::MakeAudioEncoder(config, payload_type, codec_pair_id,
                                field_trials);
   }
diff --git a/api/field_trials_view.h b/api/field_trials_view.h
new file mode 100644
index 0000000..299205d
--- /dev/null
+++ b/api/field_trials_view.h
@@ -0,0 +1,46 @@
+/*
+ *  Copyright 2019 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+#ifndef API_FIELD_TRIALS_VIEW_H_
+#define API_FIELD_TRIALS_VIEW_H_
+
+#include <string>
+
+#include "absl/strings/string_view.h"
+#include "rtc_base/system/rtc_export.h"
+
+namespace webrtc {
+
+// An interface that provides a key-value mapping for configuring internal
+// details of WebRTC. Note that there's no guarantess that the meaning of a
+// particular key value mapping will be preserved over time and no announcements
+// will be made if they are changed. It's up to the library user to ensure that
+// the behavior does not break.
+class RTC_EXPORT FieldTrialsView {
+ public:
+  virtual ~FieldTrialsView() = default;
+  // The configured value for the given key. Defaults to an empty string.
+  virtual std::string Lookup(absl::string_view key) const = 0;
+
+  bool IsEnabled(absl::string_view key) const {
+    return Lookup(key).find("Enabled") == 0;
+  }
+
+  bool IsDisabled(absl::string_view key) const {
+    return Lookup(key).find("Disabled") == 0;
+  }
+};
+
+// TODO(bugs.webrtc.org/10335): Remove once all migrated to
+// api/field_trials_view.h
+typedef FieldTrialsView WebRtcKeyValueConfig;
+
+}  // namespace webrtc
+
+#endif  // API_FIELD_TRIALS_VIEW_H_
diff --git a/api/ice_transport_interface.h b/api/ice_transport_interface.h
index c82027a..9d8bd5a 100644
--- a/api/ice_transport_interface.h
+++ b/api/ice_transport_interface.h
@@ -27,7 +27,7 @@
 }  // namespace cricket
 
 namespace webrtc {
-class WebRtcKeyValueConfig;
+class FieldTrialsView;
 
 // An ICE transport, as represented to the outside world.
 // This object is refcounted, and is therefore alive until the
@@ -84,8 +84,8 @@
     return ice_controller_factory_;
   }
 
-  const WebRtcKeyValueConfig* field_trials() { return field_trials_; }
-  void set_field_trials(const WebRtcKeyValueConfig* field_trials) {
+  const FieldTrialsView* field_trials() { return field_trials_; }
+  void set_field_trials(const FieldTrialsView* field_trials) {
     field_trials_ = field_trials;
   }
 
@@ -96,7 +96,7 @@
   AsyncResolverFactory* async_resolver_factory_ = nullptr;
   RtcEventLog* event_log_ = nullptr;
   cricket::IceControllerFactoryInterface* ice_controller_factory_ = nullptr;
-  const WebRtcKeyValueConfig* field_trials_ = nullptr;
+  const FieldTrialsView* field_trials_ = nullptr;
   // TODO(https://crbug.com/webrtc/12657): Redesign to have const members.
 };
 
diff --git a/api/peer_connection_interface.h b/api/peer_connection_interface.h
index 4c4a638..2f8e401 100644
--- a/api/peer_connection_interface.h
+++ b/api/peer_connection_interface.h
@@ -91,6 +91,7 @@
 #include "api/data_channel_interface.h"
 #include "api/dtls_transport_interface.h"
 #include "api/fec_controller.h"
+#include "api/field_trials_view.h"
 #include "api/ice_transport_interface.h"
 #include "api/jsep.h"
 #include "api/media_stream_interface.h"
@@ -117,7 +118,6 @@
 #include "api/transport/enums.h"
 #include "api/transport/network_control.h"
 #include "api/transport/sctp_transport_factory_interface.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/turn_customizer.h"
 #include "api/video/video_bitrate_allocator_factory.h"
 #include "call/rtp_transport_controller_send_factory_interface.h"
@@ -1435,7 +1435,7 @@
   std::unique_ptr<rtc::NetworkMonitorFactory> network_monitor_factory;
   std::unique_ptr<NetEqFactory> neteq_factory;
   std::unique_ptr<SctpTransportFactoryInterface> sctp_factory;
-  std::unique_ptr<WebRtcKeyValueConfig> trials;
+  std::unique_ptr<FieldTrialsView> trials;
   std::unique_ptr<RtpTransportControllerSendFactoryInterface>
       transport_controller_send_factory;
   std::unique_ptr<Metronome> metronome;
diff --git a/api/transport/BUILD.gn b/api/transport/BUILD.gn
index fb0fcf7..39157b0 100644
--- a/api/transport/BUILD.gn
+++ b/api/transport/BUILD.gn
@@ -32,7 +32,7 @@
   ]
 
   deps = [
-    ":webrtc_key_value_config",
+    "../../api:field_trials_view",
     "../rtc_event_log",
     "../units:data_rate",
     "../units:data_size",
@@ -45,16 +45,6 @@
   ]
 }
 
-rtc_source_set("webrtc_key_value_config") {
-  visibility = [ "*" ]
-  sources = [ "webrtc_key_value_config.h" ]
-  deps = [
-    "../../api:webrtc_key_value_config",
-    "../../rtc_base/system:rtc_export",
-  ]
-  absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
-}
-
 rtc_library("field_trial_based_config") {
   visibility = [ "*" ]
   sources = [
@@ -62,7 +52,7 @@
     "field_trial_based_config.h",
   ]
   deps = [
-    ":webrtc_key_value_config",
+    "../../api:field_trials_view",
     "../../system_wrappers:field_trial",
   ]
   absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
@@ -88,8 +78,8 @@
   ]
   deps = [
     ":network_control",
-    ":webrtc_key_value_config",
     "..:network_state_predictor_api",
+    "../../api:field_trials_view",
     "../../modules/congestion_controller/goog_cc",
   ]
   absl_deps = [ "//third_party/abseil-cpp/absl/base:core_headers" ]
diff --git a/api/transport/field_trial_based_config.h b/api/transport/field_trial_based_config.h
index 0754570..f0063ff 100644
--- a/api/transport/field_trial_based_config.h
+++ b/api/transport/field_trial_based_config.h
@@ -13,11 +13,11 @@
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 
 namespace webrtc {
 // Implementation using the field trial API fo the key value lookup.
-class FieldTrialBasedConfig : public WebRtcKeyValueConfig {
+class FieldTrialBasedConfig : public FieldTrialsView {
  public:
   std::string Lookup(absl::string_view key) const override;
 };
diff --git a/api/transport/network_control.h b/api/transport/network_control.h
index c2b005e..8623224 100644
--- a/api/transport/network_control.h
+++ b/api/transport/network_control.h
@@ -15,9 +15,9 @@
 #include <memory>
 
 #include "absl/base/attributes.h"
+#include "api/field_trials_view.h"
 #include "api/rtc_event_log/rtc_event_log.h"
 #include "api/transport/network_types.h"
-#include "api/transport/webrtc_key_value_config.h"
 
 namespace webrtc {
 
@@ -46,7 +46,7 @@
 
   // Optional override of configuration of WebRTC internals. Using nullptr here
   // indicates that the field trial API will be used.
-  const WebRtcKeyValueConfig* key_value_config = nullptr;
+  const FieldTrialsView* key_value_config = nullptr;
   // Optional override of event log.
   RtcEventLog* event_log = nullptr;
 };
@@ -132,7 +132,7 @@
 class NetworkStateEstimatorFactory {
  public:
   virtual std::unique_ptr<NetworkStateEstimator> Create(
-      const WebRtcKeyValueConfig* key_value_config) = 0;
+      const FieldTrialsView* key_value_config) = 0;
   virtual ~NetworkStateEstimatorFactory() = default;
 };
 }  // namespace webrtc
diff --git a/api/transport/webrtc_key_value_config.h b/api/transport/webrtc_key_value_config.h
deleted file mode 100644
index f666873..0000000
--- a/api/transport/webrtc_key_value_config.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright 2019 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-#ifndef API_TRANSPORT_WEBRTC_KEY_VALUE_CONFIG_H_
-#define API_TRANSPORT_WEBRTC_KEY_VALUE_CONFIG_H_
-
-// TODO(bugs.webrtc.org/10335): Remove once all migrated to
-// "api/webrtc_key_value_config.h".
-#include "api/webrtc_key_value_config.h"
-
-#endif  // API_TRANSPORT_WEBRTC_KEY_VALUE_CONFIG_H_
diff --git a/api/video/BUILD.gn b/api/video/BUILD.gn
index c096be8..dd78cac 100644
--- a/api/video/BUILD.gn
+++ b/api/video/BUILD.gn
@@ -269,7 +269,7 @@
 
   deps = [
     ":video_stream_decoder",
-    "../../api:webrtc_key_value_config",
+    "../../api:field_trials_view",
     "../../rtc_base:rtc_base_approved",
     "../../video:video_stream_decoder_impl",
     "../task_queue",
diff --git a/api/video/video_stream_decoder_create.cc b/api/video/video_stream_decoder_create.cc
index c64a2d8..e14c3bc 100644
--- a/api/video/video_stream_decoder_create.cc
+++ b/api/video/video_stream_decoder_create.cc
@@ -23,7 +23,7 @@
     std::map<int, std::pair<SdpVideoFormat, int>> decoder_settings,
     // TODO(jonaso, webrtc:10335): Consider what to do with factories
     // vs. field trials.
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   return std::make_unique<VideoStreamDecoderImpl>(
       callbacks, decoder_factory, task_queue_factory,
       std::move(decoder_settings), field_trials);
diff --git a/api/video/video_stream_decoder_create.h b/api/video/video_stream_decoder_create.h
index 9591412..974fd80 100644
--- a/api/video/video_stream_decoder_create.h
+++ b/api/video/video_stream_decoder_create.h
@@ -15,10 +15,10 @@
 #include <memory>
 #include <utility>
 
+#include "api/field_trials_view.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "api/video/video_stream_decoder.h"
 #include "api/video_codecs/sdp_video_format.h"
-#include "api/webrtc_key_value_config.h"
 
 namespace webrtc {
 // The `decoder_settings` parameter is a map between:
@@ -30,7 +30,7 @@
     VideoDecoderFactory* decoder_factory,
     TaskQueueFactory* task_queue_factory,
     std::map<int, std::pair<SdpVideoFormat, int>> decoder_settings,
-    const WebRtcKeyValueConfig* field_trials = nullptr);
+    const FieldTrialsView* field_trials = nullptr);
 
 }  // namespace webrtc
 
diff --git a/api/webrtc_key_value_config.h b/api/webrtc_key_value_config.h
index 32a2e47..e3cac59 100644
--- a/api/webrtc_key_value_config.h
+++ b/api/webrtc_key_value_config.h
@@ -10,32 +10,8 @@
 #ifndef API_WEBRTC_KEY_VALUE_CONFIG_H_
 #define API_WEBRTC_KEY_VALUE_CONFIG_H_
 
-#include <string>
-
-#include "absl/strings/string_view.h"
-#include "rtc_base/system/rtc_export.h"
-
-namespace webrtc {
-
-// An interface that provides a key-value mapping for configuring internal
-// details of WebRTC. Note that there's no guarantess that the meaning of a
-// particular key value mapping will be preserved over time and no announcements
-// will be made if they are changed. It's up to the library user to ensure that
-// the behavior does not break.
-class RTC_EXPORT WebRtcKeyValueConfig {
- public:
-  virtual ~WebRtcKeyValueConfig() = default;
-  // The configured value for the given key. Defaults to an empty string.
-  virtual std::string Lookup(absl::string_view key) const = 0;
-
-  bool IsEnabled(absl::string_view key) const {
-    return Lookup(key).find("Enabled") == 0;
-  }
-
-  bool IsDisabled(absl::string_view key) const {
-    return Lookup(key).find("Disabled") == 0;
-  }
-};
-}  // namespace webrtc
+// TODO(bugs.webrtc.org/10335): Remove once all migrated to
+// api/field_trials_view.h
+#include "api/field_trials_view.h"
 
 #endif  // API_WEBRTC_KEY_VALUE_CONFIG_H_
diff --git a/audio/BUILD.gn b/audio/BUILD.gn
index 5e51699..6ff2975 100644
--- a/audio/BUILD.gn
+++ b/audio/BUILD.gn
@@ -42,6 +42,7 @@
   deps = [
     "../api:array_view",
     "../api:call_api",
+    "../api:field_trials_view",
     "../api:frame_transformer_interface",
     "../api:function_view",
     "../api:rtp_headers",
@@ -49,7 +50,6 @@
     "../api:scoped_refptr",
     "../api:sequence_checker",
     "../api:transport_api",
-    "../api:webrtc_key_value_config",
     "../api/audio:aec3_factory",
     "../api/audio:audio_frame_api",
     "../api/audio:audio_frame_processor",
diff --git a/audio/audio_send_stream.cc b/audio/audio_send_stream.cc
index c291534..cc1320c 100644
--- a/audio/audio_send_stream.cc
+++ b/audio/audio_send_stream.cc
@@ -88,7 +88,7 @@
 }
 
 AudioAllocationConfig::AudioAllocationConfig(
-    const WebRtcKeyValueConfig& field_trials) {
+    const FieldTrialsView& field_trials) {
   Parser()->Parse(field_trials.Lookup(kKey));
   if (priority_bitrate_raw && !priority_bitrate.IsZero()) {
     RTC_LOG(LS_WARNING) << "'priority_bitrate' and '_raw' are mutually "
@@ -107,7 +107,7 @@
     RtcEventLog* event_log,
     RtcpRttStats* rtcp_rtt_stats,
     const absl::optional<RtpState>& suspended_rtp_state,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : AudioSendStream(
           clock,
           config,
@@ -142,7 +142,7 @@
     RtcEventLog* event_log,
     const absl::optional<RtpState>& suspended_rtp_state,
     std::unique_ptr<voe::ChannelSendInterface> channel_send,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : clock_(clock),
       field_trials_(field_trials),
       rtp_transport_queue_(rtp_transport->GetWorkerQueue()),
diff --git a/audio/audio_send_stream.h b/audio/audio_send_stream.h
index ad40a89..23c7213 100644
--- a/audio/audio_send_stream.h
+++ b/audio/audio_send_stream.h
@@ -15,8 +15,8 @@
 #include <utility>
 #include <vector>
 
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
-#include "api/webrtc_key_value_config.h"
 #include "audio/audio_level.h"
 #include "audio/channel_send.h"
 #include "call/audio_send_stream.h"
@@ -47,7 +47,7 @@
   absl::optional<double> bitrate_priority;
 
   std::unique_ptr<StructParametersParser> Parser();
-  explicit AudioAllocationConfig(const WebRtcKeyValueConfig& field_trials);
+  explicit AudioAllocationConfig(const FieldTrialsView& field_trials);
 };
 namespace internal {
 class AudioState;
@@ -64,7 +64,7 @@
                   RtcEventLog* event_log,
                   RtcpRttStats* rtcp_rtt_stats,
                   const absl::optional<RtpState>& suspended_rtp_state,
-                  const WebRtcKeyValueConfig& field_trials);
+                  const FieldTrialsView& field_trials);
   // For unit tests, which need to supply a mock ChannelSend.
   AudioSendStream(Clock* clock,
                   const webrtc::AudioSendStream::Config& config,
@@ -75,7 +75,7 @@
                   RtcEventLog* event_log,
                   const absl::optional<RtpState>& suspended_rtp_state,
                   std::unique_ptr<voe::ChannelSendInterface> channel_send,
-                  const WebRtcKeyValueConfig& field_trials);
+                  const FieldTrialsView& field_trials);
 
   AudioSendStream() = delete;
   AudioSendStream(const AudioSendStream&) = delete;
@@ -163,7 +163,7 @@
       RTC_RUN_ON(worker_thread_checker_);
 
   Clock* clock_;
-  const WebRtcKeyValueConfig& field_trials_;
+  const FieldTrialsView& field_trials_;
 
   SequenceChecker worker_thread_checker_;
   SequenceChecker pacer_thread_checker_;
diff --git a/audio/channel_send.cc b/audio/channel_send.cc
index d6b5823..3f2f13c 100644
--- a/audio/channel_send.cc
+++ b/audio/channel_send.cc
@@ -78,7 +78,7 @@
               uint32_t ssrc,
               rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
               TransportFeedbackObserver* feedback_observer,
-              const WebRtcKeyValueConfig& field_trials);
+              const FieldTrialsView& field_trials);
 
   ~ChannelSend() override;
 
@@ -459,7 +459,7 @@
     uint32_t ssrc,
     rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
     TransportFeedbackObserver* feedback_observer,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : ssrc_(ssrc),
       event_log_(rtc_event_log),
       _timeStamp(0),  // This is just an offset, RTP module will add it's own
@@ -950,7 +950,7 @@
     uint32_t ssrc,
     rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
     TransportFeedbackObserver* feedback_observer,
-    const WebRtcKeyValueConfig& field_trials) {
+    const FieldTrialsView& field_trials) {
   return std::make_unique<ChannelSend>(
       clock, task_queue_factory, rtp_transport, rtcp_rtt_stats, rtc_event_log,
       frame_encryptor, crypto_options, extmap_allow_mixed,
diff --git a/audio/channel_send.h b/audio/channel_send.h
index bfbfbee..a555b89 100644
--- a/audio/channel_send.h
+++ b/audio/channel_send.h
@@ -18,10 +18,10 @@
 #include "api/audio/audio_frame.h"
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/crypto/crypto_options.h"
+#include "api/field_trials_view.h"
 #include "api/frame_transformer_interface.h"
 #include "api/function_view.h"
 #include "api/task_queue/task_queue_factory.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/rtp_rtcp/include/report_block_data.h"
 #include "modules/rtp_rtcp/source/rtp_rtcp_interface.h"
 #include "modules/rtp_rtcp/source/rtp_sender_audio.h"
@@ -137,7 +137,7 @@
     uint32_t ssrc,
     rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
     TransportFeedbackObserver* feedback_observer,
-    const WebRtcKeyValueConfig& field_trials);
+    const FieldTrialsView& field_trials);
 
 }  // namespace voe
 }  // namespace webrtc
diff --git a/call/BUILD.gn b/call/BUILD.gn
index cb85feb..7bbb44d 100644
--- a/call/BUILD.gn
+++ b/call/BUILD.gn
@@ -42,6 +42,7 @@
     ":rtp_interfaces",
     ":video_stream_api",
     "../api:fec_controller_api",
+    "../api:field_trials_view",
     "../api:frame_transformer_interface",
     "../api:network_state_predictor_api",
     "../api:rtc_error",
@@ -60,7 +61,6 @@
     "../api/task_queue",
     "../api/transport:bitrate_settings",
     "../api/transport:network_control",
-    "../api/transport:webrtc_key_value_config",
     "../modules/async_audio_processing",
     "../modules/audio_device",
     "../modules/audio_processing",
@@ -106,6 +106,7 @@
   deps = [
     "../api:array_view",
     "../api:fec_controller_api",
+    "../api:field_trials_view",
     "../api:frame_transformer_interface",
     "../api:network_state_predictor_api",
     "../api:rtp_headers",
@@ -114,7 +115,6 @@
     "../api/rtc_event_log",
     "../api/transport:bitrate_settings",
     "../api/transport:network_control",
-    "../api/transport:webrtc_key_value_config",
     "../api/units:timestamp",
     "../common_video:frame_counts",
     "../modules/rtp_rtcp:rtp_rtcp_format",
@@ -174,11 +174,11 @@
     "../api:array_view",
     "../api:bitrate_allocation",
     "../api:fec_controller_api",
+    "../api:field_trials_view",
     "../api:network_state_predictor_api",
     "../api:rtp_parameters",
     "../api:sequence_checker",
     "../api:transport_api",
-    "../api:webrtc_key_value_config",
     "../api/rtc_event_log",
     "../api/transport:field_trial_based_config",
     "../api/transport:goog_cc",
@@ -286,12 +286,12 @@
     "../api:array_view",
     "../api:callfactory_api",
     "../api:fec_controller_api",
+    "../api:field_trials_view",
     "../api:rtp_headers",
     "../api:rtp_parameters",
     "../api:sequence_checker",
     "../api:simulated_network_api",
     "../api:transport_api",
-    "../api:webrtc_key_value_config",
     "../api/rtc_event_log",
     "../api/transport:network_control",
     "../api/units:time_delta",
diff --git a/call/adaptation/BUILD.gn b/call/adaptation/BUILD.gn
index 4661c3e..9ce8ccd 100644
--- a/call/adaptation/BUILD.gn
+++ b/call/adaptation/BUILD.gn
@@ -32,10 +32,10 @@
     "video_stream_input_state_provider.h",
   ]
   deps = [
+    "../../api:field_trials_view",
     "../../api:rtp_parameters",
     "../../api:scoped_refptr",
     "../../api:sequence_checker",
-    "../../api:webrtc_key_value_config",
     "../../api/adaptation:resource_adaptation_api",
     "../../api/task_queue:task_queue",
     "../../api/video:video_adaptation",
diff --git a/call/adaptation/video_stream_adapter.cc b/call/adaptation/video_stream_adapter.cc
index 313bcc3..f30a4d7 100644
--- a/call/adaptation/video_stream_adapter.cc
+++ b/call/adaptation/video_stream_adapter.cc
@@ -204,7 +204,7 @@
 VideoStreamAdapter::VideoStreamAdapter(
     VideoStreamInputStateProvider* input_state_provider,
     VideoStreamEncoderObserver* encoder_stats_observer,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : input_state_provider_(input_state_provider),
       encoder_stats_observer_(encoder_stats_observer),
       balanced_settings_(field_trials),
diff --git a/call/adaptation/video_stream_adapter.h b/call/adaptation/video_stream_adapter.h
index a4a52f4..92a5aec 100644
--- a/call/adaptation/video_stream_adapter.h
+++ b/call/adaptation/video_stream_adapter.h
@@ -18,10 +18,10 @@
 #include "absl/types/optional.h"
 #include "absl/types/variant.h"
 #include "api/adaptation/resource.h"
+#include "api/field_trials_view.h"
 #include "api/rtp_parameters.h"
 #include "api/video/video_adaptation_counters.h"
 #include "api/video/video_stream_encoder_observer.h"
-#include "api/webrtc_key_value_config.h"
 #include "call/adaptation/adaptation_constraint.h"
 #include "call/adaptation/degradation_preference_provider.h"
 #include "call/adaptation/video_source_restrictions.h"
@@ -125,7 +125,7 @@
  public:
   VideoStreamAdapter(VideoStreamInputStateProvider* input_state_provider,
                      VideoStreamEncoderObserver* encoder_stats_observer,
-                     const WebRtcKeyValueConfig& field_trials);
+                     const FieldTrialsView& field_trials);
   ~VideoStreamAdapter();
 
   VideoSourceRestrictions source_restrictions() const;
diff --git a/call/call.cc b/call/call.cc
index 22907b92..5b30661 100644
--- a/call/call.cc
+++ b/call/call.cc
@@ -247,7 +247,7 @@
 
   Stats GetStats() const override;
 
-  const WebRtcKeyValueConfig& trials() const override;
+  const FieldTrialsView& trials() const override;
 
   TaskQueueBase* network_thread() const override;
   TaskQueueBase* worker_thread() const override;
@@ -379,7 +379,7 @@
   const std::unique_ptr<BitrateAllocator> bitrate_allocator_;
   const Call::Config config_ RTC_GUARDED_BY(worker_thread_);
   // Maps to config_.trials, can be used from any thread via `trials()`.
-  const WebRtcKeyValueConfig& trials_;
+  const FieldTrialsView& trials_;
 
   NetworkState audio_network_state_ RTC_GUARDED_BY(worker_thread_);
   NetworkState video_network_state_ RTC_GUARDED_BY(worker_thread_);
@@ -1295,7 +1295,7 @@
   return stats;
 }
 
-const WebRtcKeyValueConfig& Call::trials() const {
+const FieldTrialsView& Call::trials() const {
   return trials_;
 }
 
diff --git a/call/call.h b/call/call.h
index 11451c5..e4652d2 100644
--- a/call/call.h
+++ b/call/call.h
@@ -174,7 +174,7 @@
   virtual void SetClientBitratePreferences(
       const BitrateSettings& preferences) = 0;
 
-  virtual const WebRtcKeyValueConfig& trials() const = 0;
+  virtual const FieldTrialsView& trials() const = 0;
 
   virtual TaskQueueBase* network_thread() const = 0;
   virtual TaskQueueBase* worker_thread() const = 0;
diff --git a/call/call_config.h b/call/call_config.h
index ef505a4..3072fa4 100644
--- a/call/call_config.h
+++ b/call/call_config.h
@@ -11,6 +11,7 @@
 #define CALL_CALL_CONFIG_H_
 
 #include "api/fec_controller.h"
+#include "api/field_trials_view.h"
 #include "api/metronome/metronome.h"
 #include "api/neteq/neteq_factory.h"
 #include "api/network_state_predictor.h"
@@ -18,7 +19,6 @@
 #include "api/task_queue/task_queue_factory.h"
 #include "api/transport/bitrate_settings.h"
 #include "api/transport/network_control.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "call/audio_state.h"
 #include "call/rtp_transport_config.h"
 #include "call/rtp_transport_controller_send_factory_interface.h"
@@ -70,7 +70,7 @@
 
   // Key-value mapping of internal configurations to apply,
   // e.g. field trials.
-  const WebRtcKeyValueConfig* trials = nullptr;
+  const FieldTrialsView* trials = nullptr;
 
   TaskQueueBase* const network_task_queue_ = nullptr;
   // RtpTransportControllerSend to use for this call.
diff --git a/call/call_factory.cc b/call/call_factory.cc
index 4035785..6d4b2aa 100644
--- a/call/call_factory.cc
+++ b/call/call_factory.cc
@@ -31,7 +31,7 @@
 namespace {
 using TimeScopedNetworkConfig = DegradedCall::TimeScopedNetworkConfig;
 
-bool ParseConfigParam(const WebRtcKeyValueConfig& trials,
+bool ParseConfigParam(const FieldTrialsView& trials,
                       absl::string_view exp_name,
                       int* field) {
   std::string group = trials.Lookup(exp_name);
@@ -42,7 +42,7 @@
 }
 
 absl::optional<TimeScopedNetworkConfig> ParseDegradationConfig(
-    const WebRtcKeyValueConfig& trials,
+    const FieldTrialsView& trials,
     bool send) {
   std::string exp_prefix = "WebRTCFakeNetwork";
   if (send) {
@@ -80,7 +80,7 @@
 }
 
 std::vector<TimeScopedNetworkConfig> GetNetworkConfigs(
-    const WebRtcKeyValueConfig& trials,
+    const FieldTrialsView& trials,
     bool send) {
   FieldTrialStructList<TimeScopedNetworkConfig> trials_list(
       {FieldTrialStructMember("queue_length_packets",
diff --git a/call/degraded_call.cc b/call/degraded_call.cc
index 0d01e86..ef53851 100644
--- a/call/degraded_call.cc
+++ b/call/degraded_call.cc
@@ -277,7 +277,7 @@
   return call_->GetStats();
 }
 
-const WebRtcKeyValueConfig& DegradedCall::trials() const {
+const FieldTrialsView& DegradedCall::trials() const {
   return call_->trials();
 }
 
diff --git a/call/degraded_call.h b/call/degraded_call.h
index dd80a0c..dfd041a 100644
--- a/call/degraded_call.h
+++ b/call/degraded_call.h
@@ -90,7 +90,7 @@
 
   Stats GetStats() const override;
 
-  const WebRtcKeyValueConfig& trials() const override;
+  const FieldTrialsView& trials() const override;
 
   TaskQueueBase* network_thread() const override;
   TaskQueueBase* worker_thread() const override;
diff --git a/call/receive_time_calculator.cc b/call/receive_time_calculator.cc
index d6ffd39..417168b 100644
--- a/call/receive_time_calculator.cc
+++ b/call/receive_time_calculator.cc
@@ -24,7 +24,7 @@
 }  // namespace
 
 ReceiveTimeCalculatorConfig::ReceiveTimeCalculatorConfig(
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : max_packet_time_repair("maxrep", TimeDelta::Millis(2000)),
       stall_threshold("stall", TimeDelta::Millis(5)),
       tolerance("tol", TimeDelta::Millis(1)),
@@ -39,12 +39,12 @@
 ReceiveTimeCalculatorConfig::~ReceiveTimeCalculatorConfig() = default;
 
 ReceiveTimeCalculator::ReceiveTimeCalculator(
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : config_(field_trials) {}
 
 std::unique_ptr<ReceiveTimeCalculator>
 ReceiveTimeCalculator::CreateFromFieldTrial(
-    const WebRtcKeyValueConfig& field_trials) {
+    const FieldTrialsView& field_trials) {
   if (!field_trials.IsEnabled(kBweReceiveTimeCorrection))
     return nullptr;
   return std::make_unique<ReceiveTimeCalculator>(field_trials);
diff --git a/call/receive_time_calculator.h b/call/receive_time_calculator.h
index 276ddda..57ba331 100644
--- a/call/receive_time_calculator.h
+++ b/call/receive_time_calculator.h
@@ -14,15 +14,14 @@
 
 #include <memory>
 
+#include "api/field_trials_view.h"
 #include "api/units/time_delta.h"
-#include "api/webrtc_key_value_config.h"
 #include "rtc_base/experiments/field_trial_parser.h"
 
 namespace webrtc {
 
 struct ReceiveTimeCalculatorConfig {
-  explicit ReceiveTimeCalculatorConfig(
-      const WebRtcKeyValueConfig& field_trials);
+  explicit ReceiveTimeCalculatorConfig(const FieldTrialsView& field_trials);
   ReceiveTimeCalculatorConfig(const ReceiveTimeCalculatorConfig&);
   ReceiveTimeCalculatorConfig& operator=(const ReceiveTimeCalculatorConfig&) =
       default;
@@ -44,8 +43,8 @@
 class ReceiveTimeCalculator {
  public:
   static std::unique_ptr<ReceiveTimeCalculator> CreateFromFieldTrial(
-      const WebRtcKeyValueConfig& field_trials);
-  explicit ReceiveTimeCalculator(const WebRtcKeyValueConfig& field_trials);
+      const FieldTrialsView& field_trials);
+  explicit ReceiveTimeCalculator(const FieldTrialsView& field_trials);
   int64_t ReconcileReceiveTimes(int64_t packet_time_us_,
                                 int64_t system_time_us_,
                                 int64_t safe_time_us_);
diff --git a/call/rtp_payload_params.cc b/call/rtp_payload_params.cc
index 5eff91f..ddd4470 100644
--- a/call/rtp_payload_params.cc
+++ b/call/rtp_payload_params.cc
@@ -127,7 +127,7 @@
 
 RtpPayloadParams::RtpPayloadParams(const uint32_t ssrc,
                                    const RtpPayloadState* state,
-                                   const WebRtcKeyValueConfig& trials)
+                                   const FieldTrialsView& trials)
     : ssrc_(ssrc),
       generic_picture_id_experiment_(
           absl::StartsWith(trials.Lookup("WebRTC-GenericPictureId"),
diff --git a/call/rtp_payload_params.h b/call/rtp_payload_params.h
index b1680a9..ff2de73 100644
--- a/call/rtp_payload_params.h
+++ b/call/rtp_payload_params.h
@@ -15,8 +15,8 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/video_codecs/video_encoder.h"
-#include "api/webrtc_key_value_config.h"
 #include "call/rtp_config.h"
 #include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor.h"
 #include "modules/rtp_rtcp/source/rtp_video_header.h"
@@ -34,7 +34,7 @@
  public:
   RtpPayloadParams(uint32_t ssrc,
                    const RtpPayloadState* state,
-                   const WebRtcKeyValueConfig& trials);
+                   const FieldTrialsView& trials);
   RtpPayloadParams(const RtpPayloadParams& other);
   ~RtpPayloadParams();
 
diff --git a/call/rtp_transport_config.h b/call/rtp_transport_config.h
index 3a2c76b..f2030b3 100644
--- a/call/rtp_transport_config.h
+++ b/call/rtp_transport_config.h
@@ -13,11 +13,11 @@
 
 #include <memory>
 
+#include "api/field_trials_view.h"
 #include "api/network_state_predictor.h"
 #include "api/rtc_event_log/rtc_event_log.h"
 #include "api/transport/bitrate_settings.h"
 #include "api/transport/network_control.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "rtc_base/task_queue.h"
 
 namespace webrtc {
@@ -43,7 +43,7 @@
 
   // Key-value mapping of internal configurations to apply,
   // e.g. field trials.
-  const WebRtcKeyValueConfig* trials = nullptr;
+  const FieldTrialsView* trials = nullptr;
 };
 }  // namespace webrtc
 
diff --git a/call/rtp_transport_controller_send.cc b/call/rtp_transport_controller_send.cc
index f366324..e9a8602 100644
--- a/call/rtp_transport_controller_send.cc
+++ b/call/rtp_transport_controller_send.cc
@@ -59,11 +59,11 @@
                             contraints.start_bitrate_bps, clock);
 }
 
-bool IsEnabled(const WebRtcKeyValueConfig& trials, absl::string_view key) {
+bool IsEnabled(const FieldTrialsView& trials, absl::string_view key) {
   return absl::StartsWith(trials.Lookup(key), "Enabled");
 }
 
-bool IsDisabled(const WebRtcKeyValueConfig& trials, absl::string_view key) {
+bool IsDisabled(const FieldTrialsView& trials, absl::string_view key) {
   return absl::StartsWith(trials.Lookup(key), "Disabled");
 }
 
@@ -74,7 +74,7 @@
 }  // namespace
 
 RtpTransportControllerSend::PacerSettings::PacerSettings(
-    const WebRtcKeyValueConfig& trials)
+    const FieldTrialsView& trials)
     : tq_disabled("Disabled"),
       holdback_window("holdback_window", PacingController::kMinSleepTime),
       holdback_packets("holdback_packets",
@@ -91,7 +91,7 @@
     const BitrateConstraints& bitrate_config,
     std::unique_ptr<ProcessThread> process_thread,
     TaskQueueFactory* task_queue_factory,
-    const WebRtcKeyValueConfig& trials)
+    const FieldTrialsView& trials)
     : clock_(clock),
       event_log_(event_log),
       bitrate_configurator_(bitrate_config),
diff --git a/call/rtp_transport_controller_send.h b/call/rtp_transport_controller_send.h
index ba14fdd..d9461db 100644
--- a/call/rtp_transport_controller_send.h
+++ b/call/rtp_transport_controller_send.h
@@ -59,7 +59,7 @@
       const BitrateConstraints& bitrate_config,
       std::unique_ptr<ProcessThread> process_thread,
       TaskQueueFactory* task_queue_factory,
-      const WebRtcKeyValueConfig& trials);
+      const FieldTrialsView& trials);
   ~RtpTransportControllerSend() override;
 
   RtpTransportControllerSend(const RtpTransportControllerSend&) = delete;
@@ -132,7 +132,7 @@
 
  private:
   struct PacerSettings {
-    explicit PacerSettings(const WebRtcKeyValueConfig& trials);
+    explicit PacerSettings(const FieldTrialsView& trials);
 
     bool use_task_queue_pacer() const { return !tq_disabled.Get(); }
 
@@ -223,7 +223,7 @@
   // and deleted before any other members.
   rtc::TaskQueue task_queue_;
 
-  const WebRtcKeyValueConfig& field_trials_;
+  const FieldTrialsView& field_trials_;
 };
 
 }  // namespace webrtc
diff --git a/call/rtp_video_sender.cc b/call/rtp_video_sender.cc
index c5de3a7..116c878 100644
--- a/call/rtp_video_sender.cc
+++ b/call/rtp_video_sender.cc
@@ -56,7 +56,7 @@
 using webrtc_internal_rtp_video_sender::RtpStreamSender;
 
 bool PayloadTypeSupportsSkippingFecPackets(const std::string& payload_name,
-                                           const WebRtcKeyValueConfig& trials) {
+                                           const FieldTrialsView& trials) {
   const VideoCodecType codecType = PayloadStringToCodecType(payload_name);
   if (codecType == kVideoCodecVP8 || codecType == kVideoCodecVP9) {
     return true;
@@ -70,7 +70,7 @@
 
 bool ShouldDisableRedAndUlpfec(bool flexfec_enabled,
                                const RtpConfig& rtp_config,
-                               const WebRtcKeyValueConfig& trials) {
+                               const FieldTrialsView& trials) {
   // Consistency of NACK and RED+ULPFEC parameters is checked in this function.
   const bool nack_enabled = rtp_config.nack.rtp_history_ms > 0;
 
@@ -126,7 +126,7 @@
     const RtpConfig& rtp,
     const std::map<uint32_t, RtpState>& suspended_ssrcs,
     int simulcast_index,
-    const WebRtcKeyValueConfig& trials) {
+    const FieldTrialsView& trials) {
   // If flexfec is configured that takes priority.
   if (rtp.flexfec.payload_type >= 0) {
     RTC_DCHECK_GE(rtp.flexfec.payload_type, 0);
@@ -197,7 +197,7 @@
     FrameEncryptorInterface* frame_encryptor,
     const CryptoOptions& crypto_options,
     rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
-    const WebRtcKeyValueConfig& trials) {
+    const FieldTrialsView& trials) {
   RTC_DCHECK_GT(rtp_config.ssrcs.size(), 0);
 
   RtpRtcpInterface::Configuration configuration;
@@ -359,7 +359,7 @@
     FrameEncryptorInterface* frame_encryptor,
     const CryptoOptions& crypto_options,
     rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : field_trials_(field_trials),
       send_side_bwe_with_overhead_(!absl::StartsWith(
           field_trials_.Lookup("WebRTC-SendSideBwe-WithOverhead"),
diff --git a/call/rtp_video_sender.h b/call/rtp_video_sender.h
index 1fa9a8b..c4a2b92 100644
--- a/call/rtp_video_sender.h
+++ b/call/rtp_video_sender.h
@@ -21,10 +21,10 @@
 #include "api/call/transport.h"
 #include "api/fec_controller.h"
 #include "api/fec_controller_override.h"
+#include "api/field_trials_view.h"
 #include "api/rtc_event_log/rtc_event_log.h"
 #include "api/sequence_checker.h"
 #include "api/video_codecs/video_encoder.h"
-#include "api/webrtc_key_value_config.h"
 #include "call/rtp_config.h"
 #include "call/rtp_payload_params.h"
 #include "call/rtp_transport_controller_send_interface.h"
@@ -86,7 +86,7 @@
       FrameEncryptorInterface* frame_encryptor,
       const CryptoOptions& crypto_options,  // move inside RtpTransport
       rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
-      const WebRtcKeyValueConfig& field_trials);
+      const FieldTrialsView& field_trials);
   ~RtpVideoSender() override;
 
   RtpVideoSender(const RtpVideoSender&) = delete;
@@ -167,7 +167,7 @@
                                  DataSize overhead_per_packet,
                                  Frequency framerate) const;
 
-  const WebRtcKeyValueConfig& field_trials_;
+  const FieldTrialsView& field_trials_;
   const bool send_side_bwe_with_overhead_;
   const bool use_frame_rate_for_overhead_;
   const bool has_packet_feedback_;
diff --git a/call/rtp_video_sender_unittest.cc b/call/rtp_video_sender_unittest.cc
index 7962ce2..b482b7f 100644
--- a/call/rtp_video_sender_unittest.cc
+++ b/call/rtp_video_sender_unittest.cc
@@ -119,7 +119,7 @@
       const std::map<uint32_t, RtpPayloadState>& suspended_payload_states,
       FrameCountObserver* frame_count_observer,
       rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
-      const WebRtcKeyValueConfig* field_trials = nullptr)
+      const FieldTrialsView* field_trials = nullptr)
       : time_controller_(Timestamp::Millis(1000000)),
         config_(CreateVideoSendStreamConfig(&transport_,
                                             ssrcs,
@@ -162,7 +162,7 @@
       int payload_type,
       const std::map<uint32_t, RtpPayloadState>& suspended_payload_states,
       FrameCountObserver* frame_count_observer,
-      const WebRtcKeyValueConfig* field_trials = nullptr)
+      const FieldTrialsView* field_trials = nullptr)
       : RtpVideoSenderTestFixture(ssrcs,
                                   rtx_ssrcs,
                                   payload_type,
@@ -176,7 +176,7 @@
       const std::vector<uint32_t>& rtx_ssrcs,
       int payload_type,
       const std::map<uint32_t, RtpPayloadState>& suspended_payload_states,
-      const WebRtcKeyValueConfig* field_trials = nullptr)
+      const FieldTrialsView* field_trials = nullptr)
       : RtpVideoSenderTestFixture(ssrcs,
                                   rtx_ssrcs,
                                   payload_type,
diff --git a/media/BUILD.gn b/media/BUILD.gn
index b9d9208..eb29077 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -51,13 +51,13 @@
     ":rtc_media_config",
     "../api:array_view",
     "../api:audio_options_api",
+    "../api:field_trials_view",
     "../api:frame_transformer_interface",
     "../api:media_stream_interface",
     "../api:rtc_error",
     "../api:rtp_parameters",
     "../api:scoped_refptr",
     "../api:sequence_checker",
-    "../api:webrtc_key_value_config",
     "../api/audio:audio_frame_processor",
     "../api/audio_codecs:audio_codecs_api",
     "../api/crypto:frame_decryptor_interface",
@@ -249,6 +249,7 @@
   deps = [
     ":rtc_media_base",
     "../api:call_api",
+    "../api:field_trials_view",
     "../api:libjingle_peerconnection_api",
     "../api:media_stream_interface",
     "../api:rtp_parameters",
@@ -261,7 +262,6 @@
     "../api/task_queue",
     "../api/transport:bitrate_settings",
     "../api/transport:field_trial_based_config",
-    "../api/transport:webrtc_key_value_config",
     "../api/transport/rtp:rtp_source",
     "../api/units:data_rate",
     "../api/video:video_bitrate_allocation",
@@ -453,7 +453,7 @@
   ]
   deps = [
     ":rtc_data_sctp_transport_internal",
-    "../api:webrtc_key_value_config",
+    "../api:field_trials_view",
     "../api/transport:sctp_transport_factory_interface",
     "../rtc_base:threading",
     "../rtc_base/experiments:field_trial_parser",
diff --git a/media/base/codec.cc b/media/base/codec.cc
index a01914d..4935e94 100644
--- a/media/base/codec.cc
+++ b/media/base/codec.cc
@@ -129,7 +129,7 @@
 }
 
 bool Codec::Matches(const Codec& codec,
-                    const webrtc::WebRtcKeyValueConfig* field_trials) const {
+                    const webrtc::FieldTrialsView* field_trials) const {
   // Match the codec id/name based on the typical static/dynamic name rules.
   // Matching is case-insensitive.
 
@@ -238,9 +238,8 @@
   return bitrate == c.bitrate && channels == c.channels && Codec::operator==(c);
 }
 
-bool AudioCodec::Matches(
-    const AudioCodec& codec,
-    const webrtc::WebRtcKeyValueConfig* field_trials) const {
+bool AudioCodec::Matches(const AudioCodec& codec,
+                         const webrtc::FieldTrialsView* field_trials) const {
   // If a nonzero clockrate is specified, it must match the actual clockrate.
   // If a nonzero bitrate is specified, it must match the actual bitrate,
   // unless the codec is VBR (0), where we just force the supplied value.
@@ -326,9 +325,8 @@
   return Codec::operator==(c) && packetization == c.packetization;
 }
 
-bool VideoCodec::Matches(
-    const VideoCodec& other,
-    const webrtc::WebRtcKeyValueConfig* field_trials) const {
+bool VideoCodec::Matches(const VideoCodec& other,
+                         const webrtc::FieldTrialsView* field_trials) const {
   return Codec::Matches(other, field_trials) &&
          IsSameCodecSpecific(name, params, other.name, other.params);
 }
diff --git a/media/base/codec.h b/media/base/codec.h
index 70ecfd3..c07cf60 100644
--- a/media/base/codec.h
+++ b/media/base/codec.h
@@ -17,9 +17,9 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/rtp_parameters.h"
 #include "api/video_codecs/sdp_video_format.h"
-#include "api/webrtc_key_value_config.h"
 #include "media/base/media_constants.h"
 #include "rtc_base/system/rtc_export.h"
 
@@ -76,9 +76,8 @@
   virtual ~Codec();
 
   // Indicates if this codec is compatible with the specified codec.
-  bool Matches(
-      const Codec& codec,
-      const webrtc::WebRtcKeyValueConfig* field_trials = nullptr) const;
+  bool Matches(const Codec& codec,
+               const webrtc::FieldTrialsView* field_trials = nullptr) const;
   bool MatchesCapability(const webrtc::RtpCodecCapability& capability) const;
 
   // Find the parameter for `name` and write the value to `out`.
@@ -135,9 +134,8 @@
   ~AudioCodec() override = default;
 
   // Indicates if this codec is compatible with the specified codec.
-  bool Matches(
-      const AudioCodec& codec,
-      const webrtc::WebRtcKeyValueConfig* field_trials = nullptr) const;
+  bool Matches(const AudioCodec& codec,
+               const webrtc::FieldTrialsView* field_trials = nullptr) const;
 
   std::string ToString() const;
 
@@ -168,9 +166,8 @@
   // Indicates if this video codec is the same as the other video codec, e.g. if
   // they are both VP8 or VP9, or if they are both H264 with the same H264
   // profile. H264 levels however are not compared.
-  bool Matches(
-      const VideoCodec& codec,
-      const webrtc::WebRtcKeyValueConfig* field_trials = nullptr) const;
+  bool Matches(const VideoCodec& codec,
+               const webrtc::FieldTrialsView* field_trials = nullptr) const;
 
   std::string ToString() const;
 
diff --git a/media/base/media_engine.cc b/media/base/media_engine.cc
index 21c3787..813657e 100644
--- a/media/base/media_engine.cc
+++ b/media/base/media_engine.cc
@@ -152,7 +152,7 @@
 }
 
 CompositeMediaEngine::CompositeMediaEngine(
-    std::unique_ptr<webrtc::WebRtcKeyValueConfig> trials,
+    std::unique_ptr<webrtc::FieldTrialsView> trials,
     std::unique_ptr<VoiceEngineInterface> audio_engine,
     std::unique_ptr<VideoEngineInterface> video_engine)
     : trials_(std::move(trials)),
diff --git a/media/base/media_engine.h b/media/base/media_engine.h
index 7b4dbe4..5a6a8c29 100644
--- a/media/base/media_engine.h
+++ b/media/base/media_engine.h
@@ -18,9 +18,9 @@
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
 #include "api/crypto/crypto_options.h"
+#include "api/field_trials_view.h"
 #include "api/rtp_parameters.h"
 #include "api/video/video_bitrate_allocator_factory.h"
-#include "api/webrtc_key_value_config.h"
 #include "call/audio_state.h"
 #include "media/base/codec.h"
 #include "media/base/media_channel.h"
@@ -137,10 +137,10 @@
 
 // CompositeMediaEngine constructs a MediaEngine from separate
 // voice and video engine classes.
-// Optionally owns a WebRtcKeyValueConfig trials map.
+// Optionally owns a FieldTrialsView trials map.
 class CompositeMediaEngine : public MediaEngineInterface {
  public:
-  CompositeMediaEngine(std::unique_ptr<webrtc::WebRtcKeyValueConfig> trials,
+  CompositeMediaEngine(std::unique_ptr<webrtc::FieldTrialsView> trials,
                        std::unique_ptr<VoiceEngineInterface> audio_engine,
                        std::unique_ptr<VideoEngineInterface> video_engine);
   CompositeMediaEngine(std::unique_ptr<VoiceEngineInterface> audio_engine,
@@ -156,7 +156,7 @@
   const VideoEngineInterface& video() const override;
 
  private:
-  const std::unique_ptr<webrtc::WebRtcKeyValueConfig> trials_;
+  const std::unique_ptr<webrtc::FieldTrialsView> trials_;
   const std::unique_ptr<VoiceEngineInterface> voice_engine_;
   const std::unique_ptr<VideoEngineInterface> video_engine_;
 };
diff --git a/media/base/test_utils.h b/media/base/test_utils.h
index fbd9f35..fb18485 100644
--- a/media/base/test_utils.h
+++ b/media/base/test_utils.h
@@ -39,7 +39,7 @@
 template <class C>
 bool ContainsMatchingCodec(const std::vector<C>& codecs,
                            const C& codec,
-                           const webrtc::WebRtcKeyValueConfig* field_trials) {
+                           const webrtc::FieldTrialsView* field_trials) {
   typename std::vector<C>::const_iterator it;
   for (it = codecs.begin(); it != codecs.end(); ++it) {
     if (it->Matches(codec, field_trials)) {
diff --git a/media/engine/fake_webrtc_call.h b/media/engine/fake_webrtc_call.h
index 498efcf..d2a867f 100644
--- a/media/engine/fake_webrtc_call.h
+++ b/media/engine/fake_webrtc_call.h
@@ -360,9 +360,7 @@
         *trials_, field_trial_string);
   }
 
-  const webrtc::WebRtcKeyValueConfig& trials() const override {
-    return *trials_;
-  }
+  const webrtc::FieldTrialsView& trials() const override { return *trials_; }
 
  private:
   webrtc::AudioSendStream* CreateAudioSendStream(
diff --git a/media/engine/simulcast.cc b/media/engine/simulcast.cc
index 3909685..93607e8 100644
--- a/media/engine/simulcast.cc
+++ b/media/engine/simulcast.cc
@@ -45,8 +45,7 @@
 constexpr double kDefaultMaxRoundupRate = 0.1;
 
 // TODO(webrtc:12415): Flip this to a kill switch when this feature launches.
-bool EnableLowresBitrateInterpolation(
-    const webrtc::WebRtcKeyValueConfig& trials) {
+bool EnableLowresBitrateInterpolation(const webrtc::FieldTrialsView& trials) {
   return absl::StartsWith(
       trials.Lookup("WebRTC-LowresSimulcastBitrateInterpolation"), "Enabled");
 }
@@ -134,7 +133,7 @@
 // Multiway: Number of temporal layers for each simulcast stream.
 int DefaultNumberOfTemporalLayers(int simulcast_id,
                                   bool screenshare,
-                                  const webrtc::WebRtcKeyValueConfig& trials) {
+                                  const webrtc::FieldTrialsView& trials) {
   RTC_CHECK_GE(simulcast_id, 0);
   RTC_CHECK_LT(simulcast_id, webrtc::kMaxSimulcastStreams);
 
@@ -291,7 +290,7 @@
                                 int height,
                                 size_t need_layers,
                                 size_t layer_count,
-                                const webrtc::WebRtcKeyValueConfig& trials) {
+                                const webrtc::FieldTrialsView& trials) {
   if (!absl::StartsWith(trials.Lookup(kUseLegacySimulcastLayerLimitFieldTrial),
                         "Disabled")) {
     // Max layers from one higher resolution in kSimulcastFormats will be used
@@ -327,7 +326,7 @@
     int max_qp,
     bool is_screenshare_with_conference_mode,
     bool temporal_layers_supported,
-    const webrtc::WebRtcKeyValueConfig& trials) {
+    const webrtc::FieldTrialsView& trials) {
   RTC_DCHECK_LE(min_layers, max_layers);
   RTC_DCHECK(max_layers > 1 || is_screenshare_with_conference_mode);
 
@@ -359,7 +358,7 @@
     int max_qp,
     bool temporal_layers_supported,
     bool base_heavy_tl3_rate_alloc,
-    const webrtc::WebRtcKeyValueConfig& trials) {
+    const webrtc::FieldTrialsView& trials) {
   std::vector<webrtc::VideoStream> layers(layer_count);
 
   const bool enable_lowres_bitrate_interpolation =
@@ -451,7 +450,7 @@
     int max_qp,
     bool temporal_layers_supported,
     bool base_heavy_tl3_rate_alloc,
-    const webrtc::WebRtcKeyValueConfig& trials) {
+    const webrtc::FieldTrialsView& trials) {
   auto max_screenshare_layers = kMaxScreenshareSimulcastLayers;
   size_t num_simulcast_layers =
       std::min<int>(max_layers, max_screenshare_layers);
diff --git a/media/engine/simulcast.h b/media/engine/simulcast.h
index aa8c394..e367830 100644
--- a/media/engine/simulcast.h
+++ b/media/engine/simulcast.h
@@ -15,7 +15,7 @@
 
 #include <vector>
 
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "api/units/data_rate.h"
 #include "api/video_codecs/video_encoder_config.h"
 
@@ -43,7 +43,7 @@
     int max_qp,
     bool is_screenshare_with_conference_mode,
     bool temporal_layers_supported,
-    const webrtc::WebRtcKeyValueConfig& trials);
+    const webrtc::FieldTrialsView& trials);
 
 // Gets the simulcast config layers for a non-screensharing case.
 std::vector<webrtc::VideoStream> GetNormalSimulcastLayers(
@@ -54,7 +54,7 @@
     int max_qp,
     bool temporal_layers_supported,
     bool base_heavy_tl3_rate_alloc,
-    const webrtc::WebRtcKeyValueConfig& trials);
+    const webrtc::FieldTrialsView& trials);
 
 // Gets simulcast config layers for screenshare settings.
 std::vector<webrtc::VideoStream> GetScreenshareLayers(
@@ -65,7 +65,7 @@
     int max_qp,
     bool temporal_layers_supported,
     bool base_heavy_tl3_rate_alloc,
-    const webrtc::WebRtcKeyValueConfig& trials);
+    const webrtc::FieldTrialsView& trials);
 
 }  // namespace cricket
 
diff --git a/media/engine/webrtc_media_engine.cc b/media/engine/webrtc_media_engine.cc
index f083b9c..3c28feb 100644
--- a/media/engine/webrtc_media_engine.cc
+++ b/media/engine/webrtc_media_engine.cc
@@ -30,9 +30,9 @@
     MediaEngineDependencies dependencies) {
   // TODO(sprang): Make populating `dependencies.trials` mandatory and remove
   // these fallbacks.
-  std::unique_ptr<webrtc::WebRtcKeyValueConfig> fallback_trials(
+  std::unique_ptr<webrtc::FieldTrialsView> fallback_trials(
       dependencies.trials ? nullptr : new webrtc::FieldTrialBasedConfig());
-  const webrtc::WebRtcKeyValueConfig& trials =
+  const webrtc::FieldTrialsView& trials =
       dependencies.trials ? *dependencies.trials : *fallback_trials;
   auto audio_engine = std::make_unique<WebRtcVoiceEngine>(
       dependencies.task_queue_factory, std::move(dependencies.adm),
@@ -137,7 +137,7 @@
     const std::vector<webrtc::RtpExtension>& extensions,
     bool (*supported)(absl::string_view),
     bool filter_redundant_extensions,
-    const webrtc::WebRtcKeyValueConfig& trials) {
+    const webrtc::FieldTrialsView& trials) {
   // Don't check against old parameters; this should have been done earlier.
   RTC_DCHECK(ValidateRtpExtensions(extensions, {}));
   RTC_DCHECK(supported);
diff --git a/media/engine/webrtc_media_engine.h b/media/engine/webrtc_media_engine.h
index ff97760..27d6f34 100644
--- a/media/engine/webrtc_media_engine.h
+++ b/media/engine/webrtc_media_engine.h
@@ -19,11 +19,11 @@
 #include "api/audio/audio_mixer.h"
 #include "api/audio_codecs/audio_decoder_factory.h"
 #include "api/audio_codecs/audio_encoder_factory.h"
+#include "api/field_trials_view.h"
 #include "api/rtp_parameters.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "api/transport/bitrate_settings.h"
 #include "api/transport/field_trial_based_config.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/video_codecs/video_decoder_factory.h"
 #include "api/video_codecs/video_encoder_factory.h"
 #include "media/base/codec.h"
@@ -53,7 +53,7 @@
   std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory;
   std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory;
 
-  const webrtc::WebRtcKeyValueConfig* trials = nullptr;
+  const webrtc::FieldTrialsView* trials = nullptr;
 };
 
 // CreateMediaEngine may be called on any thread, though the engine is
@@ -76,7 +76,7 @@
     const std::vector<webrtc::RtpExtension>& extensions,
     bool (*supported)(absl::string_view),
     bool filter_redundant_extensions,
-    const webrtc::WebRtcKeyValueConfig& trials);
+    const webrtc::FieldTrialsView& trials);
 
 webrtc::BitrateConstraints GetBitrateConfigForCodec(const Codec& codec);
 
diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc
index 58ae499..0e2cfa2 100644
--- a/media/engine/webrtc_video_engine.cc
+++ b/media/engine/webrtc_video_engine.cc
@@ -82,13 +82,11 @@
   return nullptr;
 }
 
-bool IsEnabled(const webrtc::WebRtcKeyValueConfig& trials,
-               absl::string_view name) {
+bool IsEnabled(const webrtc::FieldTrialsView& trials, absl::string_view name) {
   return absl::StartsWith(trials.Lookup(name), "Enabled");
 }
 
-bool IsDisabled(const webrtc::WebRtcKeyValueConfig& trials,
-                absl::string_view name) {
+bool IsDisabled(const webrtc::FieldTrialsView& trials, absl::string_view name) {
   return absl::StartsWith(trials.Lookup(name), "Disabled");
 }
 
@@ -107,7 +105,7 @@
 }
 
 void AddDefaultFeedbackParams(VideoCodec* codec,
-                              const webrtc::WebRtcKeyValueConfig& trials) {
+                              const webrtc::FieldTrialsView& trials) {
   // Don't add any feedback params for RED and ULPFEC.
   if (codec->name == kRedCodecName || codec->name == kUlpfecCodecName)
     return;
@@ -164,7 +162,7 @@
 std::vector<VideoCodec> GetPayloadTypesAndDefaultCodecs(
     const T* factory,
     bool is_decoder_factory,
-    const webrtc::WebRtcKeyValueConfig& trials) {
+    const webrtc::FieldTrialsView& trials) {
   if (!factory) {
     return {};
   }
@@ -331,7 +329,7 @@
 
 // Returns true if the given codec is disallowed from doing simulcast.
 bool IsCodecDisabledForSimulcast(const std::string& codec_name,
-                                 const webrtc::WebRtcKeyValueConfig& trials) {
+                                 const webrtc::FieldTrialsView& trials) {
   if (absl::EqualsIgnoreCase(codec_name, kVp9CodecName) ||
       absl::EqualsIgnoreCase(codec_name, kAv1CodecName)) {
     return true;
@@ -612,7 +610,7 @@
 WebRtcVideoEngine::WebRtcVideoEngine(
     std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory,
     std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory,
-    const webrtc::WebRtcKeyValueConfig& trials)
+    const webrtc::FieldTrialsView& trials)
     : decoder_factory_(std::move(video_decoder_factory)),
       encoder_factory_(std::move(video_encoder_factory)),
       trials_(trials) {
@@ -3498,7 +3496,7 @@
     int max_qp,
     bool is_screenshare,
     bool conference_mode,
-    const webrtc::WebRtcKeyValueConfig* trials)
+    const webrtc::FieldTrialsView* trials)
 
     : codec_name_(codec_name),
       max_qp_(max_qp),
diff --git a/media/engine/webrtc_video_engine.h b/media/engine/webrtc_video_engine.h
index 940985d..f70ebca 100644
--- a/media/engine/webrtc_video_engine.h
+++ b/media/engine/webrtc_video_engine.h
@@ -94,7 +94,7 @@
   WebRtcVideoEngine(
       std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory,
       std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory,
-      const webrtc::WebRtcKeyValueConfig& trials);
+      const webrtc::FieldTrialsView& trials);
 
   ~WebRtcVideoEngine() override;
 
@@ -116,7 +116,7 @@
   const std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory_;
   const std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
       bitrate_allocator_factory_;
-  const webrtc::WebRtcKeyValueConfig& trials_;
+  const webrtc::FieldTrialsView& trials_;
 };
 
 class WebRtcVideoChannel : public VideoMediaChannel,
@@ -658,7 +658,7 @@
                        int max_qp,
                        bool is_screenshare,
                        bool conference_mode,
-                       const webrtc::WebRtcKeyValueConfig* trials);
+                       const webrtc::FieldTrialsView* trials);
 
  private:
   std::vector<webrtc::VideoStream> CreateEncoderStreams(
@@ -686,7 +686,7 @@
   // layering and various settings.
   const bool conference_mode_;
   const webrtc::FieldTrialBasedConfig fallback_trials_;
-  const webrtc::WebRtcKeyValueConfig& trials_;
+  const webrtc::FieldTrialsView& trials_;
 };
 
 }  // namespace cricket
diff --git a/media/engine/webrtc_voice_engine.cc b/media/engine/webrtc_voice_engine.cc
index 54d1963..be4dab9 100644
--- a/media/engine/webrtc_voice_engine.cc
+++ b/media/engine/webrtc_voice_engine.cc
@@ -23,7 +23,7 @@
 #include "api/audio/audio_frame_processor.h"
 #include "api/audio_codecs/audio_codec_pair_id.h"
 #include "api/call/audio_sink.h"
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "media/base/audio_source.h"
 #include "media/base/media_constants.h"
 #include "media/base/stream_params.h"
@@ -126,7 +126,7 @@
 bool FindCodec(const std::vector<AudioCodec>& codecs,
                const AudioCodec& codec,
                AudioCodec* found_codec,
-               const webrtc::WebRtcKeyValueConfig* field_trials) {
+               const webrtc::FieldTrialsView* field_trials) {
   for (const AudioCodec& c : codecs) {
     if (c.Matches(codec, field_trials)) {
       if (found_codec != NULL) {
@@ -206,8 +206,7 @@
   }
 }
 
-bool IsEnabled(const webrtc::WebRtcKeyValueConfig& config,
-               absl::string_view trial) {
+bool IsEnabled(const webrtc::FieldTrialsView& config, absl::string_view trial) {
   return absl::StartsWith(config.Lookup(trial), "Enabled");
 }
 
@@ -229,7 +228,7 @@
         "use_slow_adaptation", &use_slow_adaptation);
   }
 
-  explicit AdaptivePtimeConfig(const webrtc::WebRtcKeyValueConfig& trials) {
+  explicit AdaptivePtimeConfig(const webrtc::FieldTrialsView& trials) {
     Parser()->Parse(trials.Lookup("WebRTC-Audio-AdaptivePtime"));
 #if WEBRTC_ENABLE_PROTOBUF
     webrtc::audio_network_adaptor::config::ControllerManager config;
@@ -299,7 +298,7 @@
     rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
     rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing,
     webrtc::AudioFrameProcessor* audio_frame_processor,
-    const webrtc::WebRtcKeyValueConfig& trials)
+    const webrtc::FieldTrialsView& trials)
     : task_queue_factory_(task_queue_factory),
       adm_(adm),
       encoder_factory_(encoder_factory),
diff --git a/media/engine/webrtc_voice_engine.h b/media/engine/webrtc_voice_engine.h
index 1a0b544..f15b9f5 100644
--- a/media/engine/webrtc_voice_engine.h
+++ b/media/engine/webrtc_voice_engine.h
@@ -17,11 +17,11 @@
 #include <vector>
 
 #include "api/audio_codecs/audio_encoder_factory.h"
+#include "api/field_trials_view.h"
 #include "api/scoped_refptr.h"
 #include "api/sequence_checker.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "api/transport/rtp/rtp_source.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "call/audio_state.h"
 #include "call/call.h"
 #include "media/base/media_engine.h"
@@ -55,7 +55,7 @@
       rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
       rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing,
       webrtc::AudioFrameProcessor* audio_frame_processor,
-      const webrtc::WebRtcKeyValueConfig& trials);
+      const webrtc::FieldTrialsView& trials);
 
   WebRtcVoiceEngine() = delete;
   WebRtcVoiceEngine(const WebRtcVoiceEngine&) = delete;
diff --git a/media/sctp/sctp_transport_factory.cc b/media/sctp/sctp_transport_factory.cc
index 21b5b02..51ce372 100644
--- a/media/sctp/sctp_transport_factory.cc
+++ b/media/sctp/sctp_transport_factory.cc
@@ -10,7 +10,7 @@
 
 #include "media/sctp/sctp_transport_factory.h"
 
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/system/unused.h"
 
 #ifdef WEBRTC_HAVE_DCSCTP
@@ -26,7 +26,7 @@
 
 SctpTransportFactory::SctpTransportFactory(
     rtc::Thread* network_thread,
-    const webrtc::WebRtcKeyValueConfig& field_trials)
+    const webrtc::FieldTrialsView& field_trials)
     : network_thread_(network_thread), use_usrsctp_("Disabled", false) {
   RTC_UNUSED(network_thread_);
 #ifdef WEBRTC_HAVE_DCSCTP
diff --git a/media/sctp/sctp_transport_factory.h b/media/sctp/sctp_transport_factory.h
index 4fcec8e..d117fde 100644
--- a/media/sctp/sctp_transport_factory.h
+++ b/media/sctp/sctp_transport_factory.h
@@ -13,8 +13,8 @@
 
 #include <memory>
 
+#include "api/field_trials_view.h"
 #include "api/transport/sctp_transport_factory_interface.h"
-#include "api/webrtc_key_value_config.h"
 #include "media/sctp/sctp_transport_internal.h"
 #include "rtc_base/experiments/field_trial_parser.h"
 #include "rtc_base/thread.h"
@@ -23,9 +23,8 @@
 
 class SctpTransportFactory : public webrtc::SctpTransportFactoryInterface {
  public:
-  explicit SctpTransportFactory(
-      rtc::Thread* network_thread,
-      const webrtc::WebRtcKeyValueConfig& field_trials);
+  explicit SctpTransportFactory(rtc::Thread* network_thread,
+                                const webrtc::FieldTrialsView& field_trials);
 
   std::unique_ptr<SctpTransportInternal> CreateSctpTransport(
       rtc::PacketTransportInternal* transport) override;
diff --git a/modules/audio_coding/BUILD.gn b/modules/audio_coding/BUILD.gn
index af76a11..8866b47 100644
--- a/modules/audio_coding/BUILD.gn
+++ b/modules/audio_coding/BUILD.gn
@@ -118,7 +118,7 @@
 
   deps = [
     "../../api:array_view",
-    "../../api:webrtc_key_value_config",
+    "../../api:field_trials_view",
     "../../api/audio_codecs:audio_codecs_api",
     "../../api/units:time_delta",
     "../../common_audio",
diff --git a/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc b/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc
index c8a26e8..a9208de 100644
--- a/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc
+++ b/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc
@@ -39,8 +39,7 @@
 AudioEncoderCopyRed::Config::Config(Config&&) = default;
 AudioEncoderCopyRed::Config::~Config() = default;
 
-size_t GetMaxRedundancyFromFieldTrial(
-    const WebRtcKeyValueConfig& field_trials) {
+size_t GetMaxRedundancyFromFieldTrial(const FieldTrialsView& field_trials) {
   const std::string red_trial =
       field_trials.Lookup("WebRTC-Audio-Red-For-Opus");
   size_t redundancy = 0;
@@ -51,9 +50,8 @@
   return redundancy;
 }
 
-AudioEncoderCopyRed::AudioEncoderCopyRed(
-    Config&& config,
-    const WebRtcKeyValueConfig& field_trials)
+AudioEncoderCopyRed::AudioEncoderCopyRed(Config&& config,
+                                         const FieldTrialsView& field_trials)
     : speech_encoder_(std::move(config.speech_encoder)),
       primary_encoded_(0, kAudioMaxRtpPacketLen),
       max_packet_length_(kAudioMaxRtpPacketLen),
diff --git a/modules/audio_coding/codecs/red/audio_encoder_copy_red.h b/modules/audio_coding/codecs/red/audio_encoder_copy_red.h
index e7471b3..359b5ea 100644
--- a/modules/audio_coding/codecs/red/audio_encoder_copy_red.h
+++ b/modules/audio_coding/codecs/red/audio_encoder_copy_red.h
@@ -21,8 +21,8 @@
 #include "absl/types/optional.h"
 #include "api/array_view.h"
 #include "api/audio_codecs/audio_encoder.h"
+#include "api/field_trials_view.h"
 #include "api/units/time_delta.h"
-#include "api/webrtc_key_value_config.h"
 #include "rtc_base/buffer.h"
 
 namespace webrtc {
@@ -43,8 +43,7 @@
     std::unique_ptr<AudioEncoder> speech_encoder;
   };
 
-  AudioEncoderCopyRed(Config&& config,
-                      const WebRtcKeyValueConfig& field_trials);
+  AudioEncoderCopyRed(Config&& config, const FieldTrialsView& field_trials);
 
   ~AudioEncoderCopyRed() override;
 
diff --git a/modules/congestion_controller/goog_cc/BUILD.gn b/modules/congestion_controller/goog_cc/BUILD.gn
index 2c50c32..9daedc6 100644
--- a/modules/congestion_controller/goog_cc/BUILD.gn
+++ b/modules/congestion_controller/goog_cc/BUILD.gn
@@ -31,11 +31,11 @@
     ":pushback_controller",
     ":send_side_bwe",
     "../..:module_api",
+    "../../../api:field_trials_view",
     "../../../api:network_state_predictor_api",
     "../../../api/rtc_event_log",
     "../../../api/transport:field_trial_based_config",
     "../../../api/transport:network_control",
-    "../../../api/transport:webrtc_key_value_config",
     "../../../api/units:data_rate",
     "../../../api/units:data_size",
     "../../../api/units:time_delta",
@@ -74,8 +74,8 @@
     "congestion_window_pushback_controller.h",
   ]
   deps = [
+    "../../../api:field_trials_view",
     "../../../api/transport:network_control",
-    "../../../api/transport:webrtc_key_value_config",
     "../../../api/units:data_size",
     "../../../rtc_base:checks",
     "../../../rtc_base/experiments:rate_control_settings",
@@ -92,9 +92,9 @@
     "alr_detector.h",
   ]
   deps = [
+    "../../../api:field_trials_view",
     "../../../api/rtc_event_log",
     "../../../api/transport:field_trial_based_config",
-    "../../../api/transport:webrtc_key_value_config",
     "../../../logging:rtc_event_pacing",
     "../../../rtc_base:checks",
     "../../../rtc_base:safe_conversions",
@@ -124,10 +124,10 @@
   ]
 
   deps = [
+    "../../../api:field_trials_view",
     "../../../api:network_state_predictor_api",
     "../../../api/rtc_event_log",
     "../../../api/transport:network_control",
-    "../../../api/transport:webrtc_key_value_config",
     "../../../api/units:data_rate",
     "../../../api/units:timestamp",
     "../../../logging:rtc_event_bwe",
@@ -153,9 +153,9 @@
   ]
   deps = [
     "../../../api:array_view",
+    "../../../api:field_trials_view",
     "../../../api:network_state_predictor_api",
     "../../../api/transport:network_control",
-    "../../../api/transport:webrtc_key_value_config",
     "../../../api/units:data_rate",
     "../../../api/units:data_size",
     "../../../api/units:time_delta",
@@ -176,8 +176,8 @@
     "loss_based_bandwidth_estimation.h",
   ]
   deps = [
+    "../../../api:field_trials_view",
     "../../../api/transport:network_control",
-    "../../../api/transport:webrtc_key_value_config",
     "../../../api/units:data_rate",
     "../../../api/units:time_delta",
     "../../../api/units:timestamp",
@@ -196,10 +196,10 @@
   deps = [
     ":loss_based_bwe_v1",
     ":loss_based_bwe_v2",
+    "../../../api:field_trials_view",
     "../../../api:network_state_predictor_api",
     "../../../api/rtc_event_log",
     "../../../api/transport:network_control",
-    "../../../api/transport:webrtc_key_value_config",
     "../../../api/units:data_rate",
     "../../../api/units:time_delta",
     "../../../api/units:timestamp",
@@ -228,10 +228,10 @@
 
   deps = [
     ":estimators",
+    "../../../api:field_trials_view",
     "../../../api:network_state_predictor_api",
     "../../../api/rtc_event_log",
     "../../../api/transport:network_control",
-    "../../../api/transport:webrtc_key_value_config",
     "../../../api/units:time_delta",
     "../../../api/units:timestamp",
     "../../../logging:rtc_event_bwe",
@@ -255,9 +255,9 @@
   ]
 
   deps = [
+    "../../../api:field_trials_view",
     "../../../api/rtc_event_log",
     "../../../api/transport:network_control",
-    "../../../api/transport:webrtc_key_value_config",
     "../../../api/units:data_rate",
     "../../../api/units:time_delta",
     "../../../api/units:timestamp",
@@ -327,6 +327,7 @@
         ":probe_controller",
         ":pushback_controller",
         ":send_side_bwe",
+        "../../../api:field_trials_view",
         "../../../api:network_state_predictor_api",
         "../../../api/rtc_event_log",
         "../../../api/test/network_emulation",
@@ -334,7 +335,6 @@
         "../../../api/transport:field_trial_based_config",
         "../../../api/transport:goog_cc",
         "../../../api/transport:network_control",
-        "../../../api/transport:webrtc_key_value_config",
         "../../../api/units:data_rate",
         "../../../api/units:data_size",
         "../../../api/units:time_delta",
diff --git a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.cc b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.cc
index f3c992f..08b42a8 100644
--- a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.cc
+++ b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.cc
@@ -22,7 +22,7 @@
 namespace webrtc {
 
 AcknowledgedBitrateEstimator::AcknowledgedBitrateEstimator(
-    const WebRtcKeyValueConfig* key_value_config)
+    const FieldTrialsView* key_value_config)
     : AcknowledgedBitrateEstimator(
           key_value_config,
           std::make_unique<BitrateEstimator>(key_value_config)) {}
@@ -30,7 +30,7 @@
 AcknowledgedBitrateEstimator::~AcknowledgedBitrateEstimator() {}
 
 AcknowledgedBitrateEstimator::AcknowledgedBitrateEstimator(
-    const WebRtcKeyValueConfig* key_value_config,
+    const FieldTrialsView* key_value_config,
     std::unique_ptr<BitrateEstimator> bitrate_estimator)
     : in_alr_(false), bitrate_estimator_(std::move(bitrate_estimator)) {}
 
diff --git a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.h b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.h
index 97dd965..d10846a 100644
--- a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.h
+++ b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.h
@@ -15,8 +15,8 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/transport/network_types.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/units/data_rate.h"
 #include "modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.h"
 #include "modules/congestion_controller/goog_cc/bitrate_estimator.h"
@@ -27,11 +27,11 @@
     : public AcknowledgedBitrateEstimatorInterface {
  public:
   AcknowledgedBitrateEstimator(
-      const WebRtcKeyValueConfig* key_value_config,
+      const FieldTrialsView* key_value_config,
       std::unique_ptr<BitrateEstimator> bitrate_estimator);
 
   explicit AcknowledgedBitrateEstimator(
-      const WebRtcKeyValueConfig* key_value_config);
+      const FieldTrialsView* key_value_config);
   ~AcknowledgedBitrateEstimator() override;
 
   void IncomingPacketFeedbackVector(
diff --git a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.cc b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.cc
index d5b1a13..283c9a8 100644
--- a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.cc
+++ b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.cc
@@ -21,7 +21,7 @@
 constexpr char RobustThroughputEstimatorSettings::kKey[];
 
 RobustThroughputEstimatorSettings::RobustThroughputEstimatorSettings(
-    const WebRtcKeyValueConfig* key_value_config) {
+    const FieldTrialsView* key_value_config) {
   Parser()->Parse(
       key_value_config->Lookup(RobustThroughputEstimatorSettings::kKey));
   if (min_packets < 10 || kMaxPackets < min_packets) {
@@ -64,7 +64,7 @@
 
 std::unique_ptr<AcknowledgedBitrateEstimatorInterface>
 AcknowledgedBitrateEstimatorInterface::Create(
-    const WebRtcKeyValueConfig* key_value_config) {
+    const FieldTrialsView* key_value_config) {
   RobustThroughputEstimatorSettings simplified_estimator_settings(
       key_value_config);
   if (simplified_estimator_settings.enabled) {
diff --git a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.h b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.h
index b6cee43..6dce69b 100644
--- a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.h
+++ b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.h
@@ -15,8 +15,8 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/transport/network_types.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/units/data_rate.h"
 #include "rtc_base/experiments/struct_parameters_parser.h"
 
@@ -28,7 +28,7 @@
 
   RobustThroughputEstimatorSettings() = delete;
   explicit RobustThroughputEstimatorSettings(
-      const WebRtcKeyValueConfig* key_value_config);
+      const FieldTrialsView* key_value_config);
 
   bool enabled = false;  // Set to true to use RobustThroughputEstimator.
 
@@ -64,7 +64,7 @@
 class AcknowledgedBitrateEstimatorInterface {
  public:
   static std::unique_ptr<AcknowledgedBitrateEstimatorInterface> Create(
-      const WebRtcKeyValueConfig* key_value_config);
+      const FieldTrialsView* key_value_config);
   virtual ~AcknowledgedBitrateEstimatorInterface();
 
   virtual void IncomingPacketFeedbackVector(
diff --git a/modules/congestion_controller/goog_cc/alr_detector.cc b/modules/congestion_controller/goog_cc/alr_detector.cc
index 6a62954..f1e649b 100644
--- a/modules/congestion_controller/goog_cc/alr_detector.cc
+++ b/modules/congestion_controller/goog_cc/alr_detector.cc
@@ -24,8 +24,7 @@
 namespace webrtc {
 
 namespace {
-AlrDetectorConfig GetConfigFromTrials(
-    const WebRtcKeyValueConfig* key_value_config) {
+AlrDetectorConfig GetConfigFromTrials(const FieldTrialsView* key_value_config) {
   RTC_CHECK(AlrExperimentSettings::MaxOneFieldTrialEnabled(*key_value_config));
   absl::optional<AlrExperimentSettings> experiment_settings =
       AlrExperimentSettings::CreateFromFieldTrial(
@@ -61,10 +60,10 @@
 AlrDetector::AlrDetector(AlrDetectorConfig config, RtcEventLog* event_log)
     : conf_(config), alr_budget_(0, true), event_log_(event_log) {}
 
-AlrDetector::AlrDetector(const WebRtcKeyValueConfig* key_value_config)
+AlrDetector::AlrDetector(const FieldTrialsView* key_value_config)
     : AlrDetector(GetConfigFromTrials(key_value_config), nullptr) {}
 
-AlrDetector::AlrDetector(const WebRtcKeyValueConfig* key_value_config,
+AlrDetector::AlrDetector(const FieldTrialsView* key_value_config,
                          RtcEventLog* event_log)
     : AlrDetector(GetConfigFromTrials(key_value_config), event_log) {}
 AlrDetector::~AlrDetector() {}
diff --git a/modules/congestion_controller/goog_cc/alr_detector.h b/modules/congestion_controller/goog_cc/alr_detector.h
index ee3fe92..5e7a3e1 100644
--- a/modules/congestion_controller/goog_cc/alr_detector.h
+++ b/modules/congestion_controller/goog_cc/alr_detector.h
@@ -13,10 +13,11 @@
 
 #include <stddef.h>
 #include <stdint.h>
+
 #include <memory>
 
 #include "absl/types/optional.h"
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "modules/pacing/interval_budget.h"
 #include "rtc_base/experiments/alr_experiment.h"
 #include "rtc_base/experiments/struct_parameters_parser.h"
@@ -46,9 +47,8 @@
 class AlrDetector {
  public:
   AlrDetector(AlrDetectorConfig config, RtcEventLog* event_log);
-  explicit AlrDetector(const WebRtcKeyValueConfig* key_value_config);
-  AlrDetector(const WebRtcKeyValueConfig* key_value_config,
-              RtcEventLog* event_log);
+  explicit AlrDetector(const FieldTrialsView* key_value_config);
+  AlrDetector(const FieldTrialsView* key_value_config, RtcEventLog* event_log);
   ~AlrDetector();
 
   void OnBytesSent(size_t bytes_sent, int64_t send_time_ms);
diff --git a/modules/congestion_controller/goog_cc/bitrate_estimator.cc b/modules/congestion_controller/goog_cc/bitrate_estimator.cc
index 09b214a..9c68e48 100644
--- a/modules/congestion_controller/goog_cc/bitrate_estimator.cc
+++ b/modules/congestion_controller/goog_cc/bitrate_estimator.cc
@@ -32,7 +32,7 @@
 
 }  // namespace
 
-BitrateEstimator::BitrateEstimator(const WebRtcKeyValueConfig* key_value_config)
+BitrateEstimator::BitrateEstimator(const FieldTrialsView* key_value_config)
     : sum_(0),
       initial_window_ms_("initial_window_ms",
                          kInitialRateWindowMs,
diff --git a/modules/congestion_controller/goog_cc/bitrate_estimator.h b/modules/congestion_controller/goog_cc/bitrate_estimator.h
index 34114f0..a6f9858 100644
--- a/modules/congestion_controller/goog_cc/bitrate_estimator.h
+++ b/modules/congestion_controller/goog_cc/bitrate_estimator.h
@@ -14,7 +14,7 @@
 #include <stdint.h>
 
 #include "absl/types/optional.h"
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "api/units/data_rate.h"
 #include "api/units/timestamp.h"
 #include "rtc_base/experiments/field_trial_parser.h"
@@ -28,7 +28,7 @@
 // unrelated to congestion.
 class BitrateEstimator {
  public:
-  explicit BitrateEstimator(const WebRtcKeyValueConfig* key_value_config);
+  explicit BitrateEstimator(const FieldTrialsView* key_value_config);
   virtual ~BitrateEstimator();
   virtual void Update(Timestamp at_time, DataSize amount, bool in_alr);
 
diff --git a/modules/congestion_controller/goog_cc/congestion_window_pushback_controller.cc b/modules/congestion_controller/goog_cc/congestion_window_pushback_controller.cc
index ec64282..2f188f3 100644
--- a/modules/congestion_controller/goog_cc/congestion_window_pushback_controller.cc
+++ b/modules/congestion_controller/goog_cc/congestion_window_pushback_controller.cc
@@ -23,7 +23,7 @@
 namespace webrtc {
 
 CongestionWindowPushbackController::CongestionWindowPushbackController(
-    const WebRtcKeyValueConfig* key_value_config)
+    const FieldTrialsView* key_value_config)
     : add_pacing_(
           absl::StartsWith(key_value_config->Lookup(
                                "WebRTC-AddPacingToCongestionWindowPushback"),
diff --git a/modules/congestion_controller/goog_cc/congestion_window_pushback_controller.h b/modules/congestion_controller/goog_cc/congestion_window_pushback_controller.h
index 7a49a83..ea9ed97 100644
--- a/modules/congestion_controller/goog_cc/congestion_window_pushback_controller.h
+++ b/modules/congestion_controller/goog_cc/congestion_window_pushback_controller.h
@@ -15,7 +15,7 @@
 #include <stdint.h>
 
 #include "absl/types/optional.h"
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "api/units/data_size.h"
 
 namespace webrtc {
@@ -28,7 +28,7 @@
 class CongestionWindowPushbackController {
  public:
   explicit CongestionWindowPushbackController(
-      const WebRtcKeyValueConfig* key_value_config);
+      const FieldTrialsView* key_value_config);
   void UpdateOutstandingData(int64_t outstanding_bytes);
   void UpdatePacingQueue(int64_t pacing_bytes);
   uint32_t UpdateTargetBitrate(uint32_t bitrate_bps);
diff --git a/modules/congestion_controller/goog_cc/delay_based_bwe.cc b/modules/congestion_controller/goog_cc/delay_based_bwe.cc
index 95d98b2..fddeca3 100644
--- a/modules/congestion_controller/goog_cc/delay_based_bwe.cc
+++ b/modules/congestion_controller/goog_cc/delay_based_bwe.cc
@@ -42,7 +42,7 @@
 constexpr char BweSeparateAudioPacketsSettings::kKey[];
 
 BweSeparateAudioPacketsSettings::BweSeparateAudioPacketsSettings(
-    const WebRtcKeyValueConfig* key_value_config) {
+    const FieldTrialsView* key_value_config) {
   Parser()->Parse(
       key_value_config->Lookup(BweSeparateAudioPacketsSettings::kKey));
 }
@@ -62,7 +62,7 @@
       recovered_from_overuse(false),
       backoff_in_alr(false) {}
 
-DelayBasedBwe::DelayBasedBwe(const WebRtcKeyValueConfig* key_value_config,
+DelayBasedBwe::DelayBasedBwe(const FieldTrialsView* key_value_config,
                              RtcEventLog* event_log,
                              NetworkStatePredictor* network_state_predictor)
     : event_log_(event_log),
diff --git a/modules/congestion_controller/goog_cc/delay_based_bwe.h b/modules/congestion_controller/goog_cc/delay_based_bwe.h
index d37e05f..dd4f7d8 100644
--- a/modules/congestion_controller/goog_cc/delay_based_bwe.h
+++ b/modules/congestion_controller/goog_cc/delay_based_bwe.h
@@ -18,9 +18,9 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/network_state_predictor.h"
 #include "api/transport/network_types.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "modules/congestion_controller/goog_cc/delay_increase_detector_interface.h"
 #include "modules/congestion_controller/goog_cc/inter_arrival_delta.h"
 #include "modules/congestion_controller/goog_cc/probe_bitrate_estimator.h"
@@ -37,7 +37,7 @@
 
   BweSeparateAudioPacketsSettings() = default;
   explicit BweSeparateAudioPacketsSettings(
-      const WebRtcKeyValueConfig* key_value_config);
+      const FieldTrialsView* key_value_config);
 
   bool enabled = false;
   int packet_threshold = 10;
@@ -59,7 +59,7 @@
     BandwidthUsage delay_detector_state;
   };
 
-  explicit DelayBasedBwe(const WebRtcKeyValueConfig* key_value_config,
+  explicit DelayBasedBwe(const FieldTrialsView* key_value_config,
                          RtcEventLog* event_log,
                          NetworkStatePredictor* network_state_predictor);
 
@@ -104,7 +104,7 @@
 
   rtc::RaceChecker network_race_;
   RtcEventLog* const event_log_;
-  const WebRtcKeyValueConfig* const key_value_config_;
+  const FieldTrialsView* const key_value_config_;
 
   // Alternatively, run two separate overuse detectors for audio and video,
   // and fall back to the audio one if we haven't seen a video packet in a
diff --git a/modules/congestion_controller/goog_cc/goog_cc_network_control.cc b/modules/congestion_controller/goog_cc/goog_cc_network_control.cc
index 1672032..5e85c9f 100644
--- a/modules/congestion_controller/goog_cc/goog_cc_network_control.cc
+++ b/modules/congestion_controller/goog_cc/goog_cc_network_control.cc
@@ -60,11 +60,11 @@
   }
 }
 
-bool IsEnabled(const WebRtcKeyValueConfig* config, absl::string_view key) {
+bool IsEnabled(const FieldTrialsView* config, absl::string_view key) {
   return absl::StartsWith(config->Lookup(key), "Enabled");
 }
 
-bool IsNotDisabled(const WebRtcKeyValueConfig* config, absl::string_view key) {
+bool IsNotDisabled(const FieldTrialsView* config, absl::string_view key) {
   return !absl::StartsWith(config->Lookup(key), "Disabled");
 }
 }  // namespace
diff --git a/modules/congestion_controller/goog_cc/goog_cc_network_control.h b/modules/congestion_controller/goog_cc/goog_cc_network_control.h
index 048279f..884b572 100644
--- a/modules/congestion_controller/goog_cc/goog_cc_network_control.h
+++ b/modules/congestion_controller/goog_cc/goog_cc_network_control.h
@@ -18,12 +18,12 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/network_state_predictor.h"
 #include "api/rtc_event_log/rtc_event_log.h"
 #include "api/transport/field_trial_based_config.h"
 #include "api/transport/network_control.h"
 #include "api/transport/network_types.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/units/data_rate.h"
 #include "api/units/data_size.h"
 #include "api/units/timestamp.h"
@@ -84,7 +84,7 @@
   PacerConfig GetPacingRates(Timestamp at_time) const;
   const FieldTrialBasedConfig trial_based_config_;
 
-  const WebRtcKeyValueConfig* const key_value_config_;
+  const FieldTrialsView* const key_value_config_;
   RtcEventLog* const event_log_;
   const bool packet_feedback_only_;
   FieldTrialFlag safe_reset_on_route_change_;
diff --git a/modules/congestion_controller/goog_cc/loss_based_bandwidth_estimation.cc b/modules/congestion_controller/goog_cc/loss_based_bandwidth_estimation.cc
index 33974dc..7524c84 100644
--- a/modules/congestion_controller/goog_cc/loss_based_bandwidth_estimation.cc
+++ b/modules/congestion_controller/goog_cc/loss_based_bandwidth_estimation.cc
@@ -75,7 +75,7 @@
   return 1.0f - exp(interval / window * -1.0);
 }
 
-bool IsEnabled(const webrtc::WebRtcKeyValueConfig& key_value_config,
+bool IsEnabled(const webrtc::FieldTrialsView& key_value_config,
                absl::string_view name) {
   return absl::StartsWith(key_value_config.Lookup(name), "Enabled");
 }
@@ -83,7 +83,7 @@
 }  // namespace
 
 LossBasedControlConfig::LossBasedControlConfig(
-    const WebRtcKeyValueConfig* key_value_config)
+    const FieldTrialsView* key_value_config)
     : enabled(IsEnabled(*key_value_config, kBweLossBasedControl)),
       min_increase_factor("min_incr", 1.02),
       max_increase_factor("max_incr", 1.08),
@@ -118,7 +118,7 @@
 LossBasedControlConfig::~LossBasedControlConfig() = default;
 
 LossBasedBandwidthEstimation::LossBasedBandwidthEstimation(
-    const WebRtcKeyValueConfig* key_value_config)
+    const FieldTrialsView* key_value_config)
     : config_(key_value_config),
       average_loss_(0),
       average_loss_max_(0),
diff --git a/modules/congestion_controller/goog_cc/loss_based_bandwidth_estimation.h b/modules/congestion_controller/goog_cc/loss_based_bandwidth_estimation.h
index 20ff092..9f69cab 100644
--- a/modules/congestion_controller/goog_cc/loss_based_bandwidth_estimation.h
+++ b/modules/congestion_controller/goog_cc/loss_based_bandwidth_estimation.h
@@ -13,8 +13,8 @@
 
 #include <vector>
 
+#include "api/field_trials_view.h"
 #include "api/transport/network_types.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/units/data_rate.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
@@ -23,7 +23,7 @@
 namespace webrtc {
 
 struct LossBasedControlConfig {
-  explicit LossBasedControlConfig(const WebRtcKeyValueConfig* key_value_config);
+  explicit LossBasedControlConfig(const FieldTrialsView* key_value_config);
   LossBasedControlConfig(const LossBasedControlConfig&);
   LossBasedControlConfig& operator=(const LossBasedControlConfig&) = default;
   ~LossBasedControlConfig();
@@ -52,7 +52,7 @@
 class LossBasedBandwidthEstimation {
  public:
   explicit LossBasedBandwidthEstimation(
-      const WebRtcKeyValueConfig* key_value_config);
+      const FieldTrialsView* key_value_config);
   // Returns the new estimate.
   DataRate Update(Timestamp at_time,
                   DataRate min_bitrate,
diff --git a/modules/congestion_controller/goog_cc/loss_based_bwe_v2.cc b/modules/congestion_controller/goog_cc/loss_based_bwe_v2.cc
index 7c72b99..616fe71 100644
--- a/modules/congestion_controller/goog_cc/loss_based_bwe_v2.cc
+++ b/modules/congestion_controller/goog_cc/loss_based_bwe_v2.cc
@@ -21,9 +21,9 @@
 #include "absl/algorithm/container.h"
 #include "absl/types/optional.h"
 #include "api/array_view.h"
+#include "api/field_trials_view.h"
 #include "api/network_state_predictor.h"
 #include "api/transport/network_types.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/units/data_rate.h"
 #include "api/units/data_size.h"
 #include "api/units/time_delta.h"
@@ -101,7 +101,7 @@
 
 }  // namespace
 
-LossBasedBweV2::LossBasedBweV2(const WebRtcKeyValueConfig* key_value_config)
+LossBasedBweV2::LossBasedBweV2(const FieldTrialsView* key_value_config)
     : config_(CreateConfig(key_value_config)) {
   if (!config_.has_value()) {
     RTC_LOG(LS_VERBOSE) << "The configuration does not specify that the "
@@ -225,7 +225,7 @@
 // Returns a `LossBasedBweV2::Config` iff the `key_value_config` specifies a
 // configuration for the `LossBasedBweV2` which is explicitly enabled.
 absl::optional<LossBasedBweV2::Config> LossBasedBweV2::CreateConfig(
-    const WebRtcKeyValueConfig* key_value_config) {
+    const FieldTrialsView* key_value_config) {
   FieldTrialParameter<bool> enabled("Enabled", false);
   FieldTrialParameter<double> bandwidth_rampup_upper_bound_factor(
       "BwRampupUpperBoundFactor", 1.1);
diff --git a/modules/congestion_controller/goog_cc/loss_based_bwe_v2.h b/modules/congestion_controller/goog_cc/loss_based_bwe_v2.h
index cc33387..0c496c8 100644
--- a/modules/congestion_controller/goog_cc/loss_based_bwe_v2.h
+++ b/modules/congestion_controller/goog_cc/loss_based_bwe_v2.h
@@ -17,9 +17,9 @@
 
 #include "absl/types/optional.h"
 #include "api/array_view.h"
+#include "api/field_trials_view.h"
 #include "api/network_state_predictor.h"
 #include "api/transport/network_types.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/units/data_rate.h"
 #include "api/units/data_size.h"
 #include "api/units/time_delta.h"
@@ -31,7 +31,7 @@
  public:
   // Creates a disabled `LossBasedBweV2` if the
   // `key_value_config` is not valid.
-  explicit LossBasedBweV2(const WebRtcKeyValueConfig* key_value_config);
+  explicit LossBasedBweV2(const FieldTrialsView* key_value_config);
 
   LossBasedBweV2(const LossBasedBweV2&) = delete;
   LossBasedBweV2& operator=(const LossBasedBweV2&) = delete;
@@ -112,7 +112,7 @@
   };
 
   static absl::optional<Config> CreateConfig(
-      const WebRtcKeyValueConfig* key_value_config);
+      const FieldTrialsView* key_value_config);
   bool IsConfigValid() const;
 
   // Returns `0.0` if not enough loss statistics have been received.
diff --git a/modules/congestion_controller/goog_cc/probe_controller.cc b/modules/congestion_controller/goog_cc/probe_controller.cc
index df753ed..9c263eb 100644
--- a/modules/congestion_controller/goog_cc/probe_controller.cc
+++ b/modules/congestion_controller/goog_cc/probe_controller.cc
@@ -91,7 +91,7 @@
 }  // namespace
 
 ProbeControllerConfig::ProbeControllerConfig(
-    const WebRtcKeyValueConfig* key_value_config)
+    const FieldTrialsView* key_value_config)
     : first_exponential_probe_scale("p1", 3.0),
       second_exponential_probe_scale("p2", 6.0),
       further_exponential_probe_scale("step_size", 2),
@@ -127,7 +127,7 @@
     default;
 ProbeControllerConfig::~ProbeControllerConfig() = default;
 
-ProbeController::ProbeController(const WebRtcKeyValueConfig* key_value_config,
+ProbeController::ProbeController(const FieldTrialsView* key_value_config,
                                  RtcEventLog* event_log)
     : enable_periodic_alr_probing_(false),
       in_rapid_recovery_experiment_(absl::StartsWith(
diff --git a/modules/congestion_controller/goog_cc/probe_controller.h b/modules/congestion_controller/goog_cc/probe_controller.h
index d0f1458..86931ee 100644
--- a/modules/congestion_controller/goog_cc/probe_controller.h
+++ b/modules/congestion_controller/goog_cc/probe_controller.h
@@ -18,16 +18,16 @@
 
 #include "absl/base/attributes.h"
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/rtc_event_log/rtc_event_log.h"
 #include "api/transport/network_control.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/units/data_rate.h"
 #include "rtc_base/experiments/field_trial_parser.h"
 
 namespace webrtc {
 
 struct ProbeControllerConfig {
-  explicit ProbeControllerConfig(const WebRtcKeyValueConfig* key_value_config);
+  explicit ProbeControllerConfig(const FieldTrialsView* key_value_config);
   ProbeControllerConfig(const ProbeControllerConfig&);
   ProbeControllerConfig& operator=(const ProbeControllerConfig&) = default;
   ~ProbeControllerConfig();
@@ -58,7 +58,7 @@
 // bitrate is adjusted by an application.
 class ProbeController {
  public:
-  explicit ProbeController(const WebRtcKeyValueConfig* key_value_config,
+  explicit ProbeController(const FieldTrialsView* key_value_config,
                            RtcEventLog* event_log);
   ~ProbeController();
 
diff --git a/modules/congestion_controller/goog_cc/robust_throughput_estimator.h b/modules/congestion_controller/goog_cc/robust_throughput_estimator.h
index de48a9b..b67b49f 100644
--- a/modules/congestion_controller/goog_cc/robust_throughput_estimator.h
+++ b/modules/congestion_controller/goog_cc/robust_throughput_estimator.h
@@ -16,8 +16,8 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/transport/network_types.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/units/data_rate.h"
 #include "modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_interface.h"
 
diff --git a/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.cc b/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.cc
index 631ef86..d0d7b83 100644
--- a/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.cc
+++ b/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.cc
@@ -17,10 +17,10 @@
 #include <string>
 
 #include "absl/strings/match.h"
+#include "api/field_trials_view.h"
 #include "api/network_state_predictor.h"
 #include "api/rtc_event_log/rtc_event.h"
 #include "api/rtc_event_log/rtc_event_log.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/units/data_rate.h"
 #include "api/units/time_delta.h"
 #include "logging/rtc_event_log/events/rtc_event_bwe_update_loss_based.h"
@@ -158,7 +158,7 @@
   return DataRate::BitsPerSec(capacity_estimate_bps_);
 }
 
-RttBasedBackoff::RttBasedBackoff(const WebRtcKeyValueConfig* key_value_config)
+RttBasedBackoff::RttBasedBackoff(const FieldTrialsView* key_value_config)
     : disabled_("Disabled"),
       configured_limit_("limit", TimeDelta::Seconds(3)),
       drop_fraction_("fraction", 0.8),
@@ -197,7 +197,7 @@
 RttBasedBackoff::~RttBasedBackoff() = default;
 
 SendSideBandwidthEstimation::SendSideBandwidthEstimation(
-    const WebRtcKeyValueConfig* key_value_config,
+    const FieldTrialsView* key_value_config,
     RtcEventLog* event_log)
     : rtt_backoff_(key_value_config),
       lost_packets_since_last_loss_update_(0),
diff --git a/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.h b/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.h
index bb53be8..cbcad86 100644
--- a/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.h
+++ b/modules/congestion_controller/goog_cc/send_side_bandwidth_estimation.h
@@ -20,9 +20,9 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/network_state_predictor.h"
 #include "api/transport/network_types.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/units/data_rate.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
@@ -57,7 +57,7 @@
 
 class RttBasedBackoff {
  public:
-  explicit RttBasedBackoff(const WebRtcKeyValueConfig* key_value_config);
+  explicit RttBasedBackoff(const FieldTrialsView* key_value_config);
   ~RttBasedBackoff();
   void UpdatePropagationRtt(Timestamp at_time, TimeDelta propagation_rtt);
   TimeDelta CorrectedRtt(Timestamp at_time) const;
@@ -78,7 +78,7 @@
 class SendSideBandwidthEstimation {
  public:
   SendSideBandwidthEstimation() = delete;
-  SendSideBandwidthEstimation(const WebRtcKeyValueConfig* key_value_config,
+  SendSideBandwidthEstimation(const FieldTrialsView* key_value_config,
                               RtcEventLog* event_log);
   ~SendSideBandwidthEstimation();
 
diff --git a/modules/congestion_controller/goog_cc/trendline_estimator.cc b/modules/congestion_controller/goog_cc/trendline_estimator.cc
index 7fdf66c..88182d4 100644
--- a/modules/congestion_controller/goog_cc/trendline_estimator.cc
+++ b/modules/congestion_controller/goog_cc/trendline_estimator.cc
@@ -34,8 +34,7 @@
 const char kBweWindowSizeInPacketsExperiment[] =
     "WebRTC-BweWindowSizeInPackets";
 
-size_t ReadTrendlineFilterWindowSize(
-    const WebRtcKeyValueConfig* key_value_config) {
+size_t ReadTrendlineFilterWindowSize(const FieldTrialsView* key_value_config) {
   std::string experiment_string =
       key_value_config->Lookup(kBweWindowSizeInPacketsExperiment);
   size_t window_size;
@@ -115,7 +114,7 @@
 constexpr char TrendlineEstimatorSettings::kKey[];
 
 TrendlineEstimatorSettings::TrendlineEstimatorSettings(
-    const WebRtcKeyValueConfig* key_value_config) {
+    const FieldTrialsView* key_value_config) {
   if (absl::StartsWith(
           key_value_config->Lookup(kBweWindowSizeInPacketsExperiment),
           "Enabled")) {
@@ -160,7 +159,7 @@
 }
 
 TrendlineEstimator::TrendlineEstimator(
-    const WebRtcKeyValueConfig* key_value_config,
+    const FieldTrialsView* key_value_config,
     NetworkStatePredictor* network_state_predictor)
     : settings_(key_value_config),
       smoothing_coef_(kDefaultTrendlineSmoothingCoeff),
diff --git a/modules/congestion_controller/goog_cc/trendline_estimator.h b/modules/congestion_controller/goog_cc/trendline_estimator.h
index 6fd44249..ffda25d 100644
--- a/modules/congestion_controller/goog_cc/trendline_estimator.h
+++ b/modules/congestion_controller/goog_cc/trendline_estimator.h
@@ -17,8 +17,8 @@
 #include <memory>
 #include <utility>
 
+#include "api/field_trials_view.h"
 #include "api/network_state_predictor.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "modules/congestion_controller/goog_cc/delay_increase_detector_interface.h"
 #include "rtc_base/experiments/struct_parameters_parser.h"
 
@@ -29,8 +29,7 @@
   static constexpr unsigned kDefaultTrendlineWindowSize = 20;
 
   TrendlineEstimatorSettings() = delete;
-  explicit TrendlineEstimatorSettings(
-      const WebRtcKeyValueConfig* key_value_config);
+  explicit TrendlineEstimatorSettings(const FieldTrialsView* key_value_config);
 
   // Sort the packets in the window. Should be redundant,
   // but then almost no cost.
@@ -51,7 +50,7 @@
 
 class TrendlineEstimator : public DelayIncreaseDetectorInterface {
  public:
-  TrendlineEstimator(const WebRtcKeyValueConfig* key_value_config,
+  TrendlineEstimator(const FieldTrialsView* key_value_config,
                      NetworkStatePredictor* network_state_predictor);
 
   ~TrendlineEstimator() override;
diff --git a/modules/pacing/BUILD.gn b/modules/pacing/BUILD.gn
index 90e0eb7..97b3a7b 100644
--- a/modules/pacing/BUILD.gn
+++ b/modules/pacing/BUILD.gn
@@ -33,14 +33,14 @@
   deps = [
     ":interval_budget",
     "..:module_api",
+    "../../api:field_trials_view",
+    "../../api:field_trials_view",
     "../../api:function_view",
     "../../api:sequence_checker",
-    "../../api:webrtc_key_value_config",
     "../../api/rtc_event_log",
     "../../api/task_queue:task_queue",
     "../../api/transport:field_trial_based_config",
     "../../api/transport:network_control",
-    "../../api/transport:webrtc_key_value_config",
     "../../api/units:data_rate",
     "../../api/units:data_size",
     "../../api/units:time_delta",
diff --git a/modules/pacing/DEPS b/modules/pacing/DEPS
index 1b2e6dc..42f3dfc 100644
--- a/modules/pacing/DEPS
+++ b/modules/pacing/DEPS
@@ -1,6 +1,6 @@
 include_rules = [
   "+system_wrappers", 
-  # Avoid directly using field_trial. Instead use WebRtcKeyValueConfig.
+  # Avoid directly using field_trial. Instead use FieldTrialsView.
   "-system_wrappers/include/field_trial.h",  
   "+logging/rtc_event_log"
 ]
diff --git a/modules/pacing/bitrate_prober.cc b/modules/pacing/bitrate_prober.cc
index ed4b776..d2b93da 100644
--- a/modules/pacing/bitrate_prober.cc
+++ b/modules/pacing/bitrate_prober.cc
@@ -33,7 +33,7 @@
 }  // namespace
 
 BitrateProberConfig::BitrateProberConfig(
-    const WebRtcKeyValueConfig* key_value_config)
+    const FieldTrialsView* key_value_config)
     : min_probe_packets_sent("min_probe_packets_sent", 5),
       min_probe_delta("min_probe_delta", TimeDelta::Millis(1)),
       min_probe_duration("min_probe_duration", TimeDelta::Millis(15)),
@@ -56,7 +56,7 @@
                             total_failed_probe_count_);
 }
 
-BitrateProber::BitrateProber(const WebRtcKeyValueConfig& field_trials)
+BitrateProber::BitrateProber(const FieldTrialsView& field_trials)
     : probing_state_(ProbingState::kDisabled),
       next_probe_time_(Timestamp::PlusInfinity()),
       total_probe_count_(0),
diff --git a/modules/pacing/bitrate_prober.h b/modules/pacing/bitrate_prober.h
index 3ac431c..94016d5 100644
--- a/modules/pacing/bitrate_prober.h
+++ b/modules/pacing/bitrate_prober.h
@@ -24,7 +24,7 @@
 class RtcEventLog;
 
 struct BitrateProberConfig {
-  explicit BitrateProberConfig(const WebRtcKeyValueConfig* key_value_config);
+  explicit BitrateProberConfig(const FieldTrialsView* key_value_config);
   BitrateProberConfig(const BitrateProberConfig&) = default;
   BitrateProberConfig& operator=(const BitrateProberConfig&) = default;
   ~BitrateProberConfig() = default;
@@ -46,7 +46,7 @@
 // on being protected by the caller.
 class BitrateProber {
  public:
-  explicit BitrateProber(const WebRtcKeyValueConfig& field_trials);
+  explicit BitrateProber(const FieldTrialsView& field_trials);
   ~BitrateProber();
 
   void SetEnabled(bool enable);
diff --git a/modules/pacing/paced_sender.cc b/modules/pacing/paced_sender.cc
index 56a1410..22c86f7 100644
--- a/modules/pacing/paced_sender.cc
+++ b/modules/pacing/paced_sender.cc
@@ -30,7 +30,7 @@
 
 PacedSender::PacedSender(Clock* clock,
                          PacketRouter* packet_router,
-                         const WebRtcKeyValueConfig& field_trials,
+                         const FieldTrialsView& field_trials,
                          ProcessThread* process_thread)
     : process_mode_(
           absl::StartsWith(field_trials.Lookup("WebRTC-Pacer-DynamicProcess"),
diff --git a/modules/pacing/paced_sender.h b/modules/pacing/paced_sender.h
index e938a1e..47fdaf3 100644
--- a/modules/pacing/paced_sender.h
+++ b/modules/pacing/paced_sender.h
@@ -19,10 +19,10 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/function_view.h"
 #include "api/transport/field_trial_based_config.h"
 #include "api/transport/network_types.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "modules/include/module.h"
 #include "modules/pacing/bitrate_prober.h"
 #include "modules/pacing/interval_budget.h"
@@ -56,7 +56,7 @@
   // optional once all callers have been updated.
   PacedSender(Clock* clock,
               PacketRouter* packet_router,
-              const WebRtcKeyValueConfig& field_trials,
+              const FieldTrialsView& field_trials,
               ProcessThread* process_thread = nullptr);
 
   ~PacedSender() override;
diff --git a/modules/pacing/paced_sender_unittest.cc b/modules/pacing/paced_sender_unittest.cc
index 6f2728b..e833f34 100644
--- a/modules/pacing/paced_sender_unittest.cc
+++ b/modules/pacing/paced_sender_unittest.cc
@@ -48,7 +48,7 @@
               (override));
 };
 
-class ProcessModeTrials : public WebRtcKeyValueConfig {
+class ProcessModeTrials : public FieldTrialsView {
  public:
   explicit ProcessModeTrials(bool dynamic_process) : mode_(dynamic_process) {}
 
diff --git a/modules/pacing/pacing_controller.cc b/modules/pacing/pacing_controller.cc
index 7430adf..d580c2c 100644
--- a/modules/pacing/pacing_controller.cc
+++ b/modules/pacing/pacing_controller.cc
@@ -40,17 +40,15 @@
 
 constexpr int kFirstPriority = 0;
 
-bool IsDisabled(const WebRtcKeyValueConfig& field_trials,
-                absl::string_view key) {
+bool IsDisabled(const FieldTrialsView& field_trials, absl::string_view key) {
   return absl::StartsWith(field_trials.Lookup(key), "Disabled");
 }
 
-bool IsEnabled(const WebRtcKeyValueConfig& field_trials,
-               absl::string_view key) {
+bool IsEnabled(const FieldTrialsView& field_trials, absl::string_view key) {
   return absl::StartsWith(field_trials.Lookup(key), "Enabled");
 }
 
-TimeDelta GetDynamicPaddingTarget(const WebRtcKeyValueConfig& field_trials) {
+TimeDelta GetDynamicPaddingTarget(const FieldTrialsView& field_trials) {
   FieldTrialParameter<TimeDelta> padding_target("timedelta",
                                                 TimeDelta::Millis(5));
   ParseFieldTrial({&padding_target},
@@ -94,7 +92,7 @@
 
 PacingController::PacingController(Clock* clock,
                                    PacketSender* packet_sender,
-                                   const WebRtcKeyValueConfig& field_trials,
+                                   const FieldTrialsView& field_trials,
                                    ProcessMode mode)
     : mode_(mode),
       clock_(clock),
diff --git a/modules/pacing/pacing_controller.h b/modules/pacing/pacing_controller.h
index 3947f03..c3e1dde 100644
--- a/modules/pacing/pacing_controller.h
+++ b/modules/pacing/pacing_controller.h
@@ -19,10 +19,10 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/function_view.h"
 #include "api/transport/field_trial_based_config.h"
 #include "api/transport/network_types.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "modules/pacing/bitrate_prober.h"
 #include "modules/pacing/interval_budget.h"
 #include "modules/pacing/round_robin_packet_queue.h"
@@ -85,7 +85,7 @@
 
   PacingController(Clock* clock,
                    PacketSender* packet_sender,
-                   const WebRtcKeyValueConfig& field_trials,
+                   const FieldTrialsView& field_trials,
                    ProcessMode mode);
 
   ~PacingController();
@@ -176,7 +176,7 @@
   const ProcessMode mode_;
   Clock* const clock_;
   PacketSender* const packet_sender_;
-  const WebRtcKeyValueConfig& field_trials_;
+  const FieldTrialsView& field_trials_;
 
   const bool drain_large_queues_;
   const bool send_padding_if_silent_;
diff --git a/modules/pacing/task_queue_paced_sender.cc b/modules/pacing/task_queue_paced_sender.cc
index 4849daf..1ae182c 100644
--- a/modules/pacing/task_queue_paced_sender.cc
+++ b/modules/pacing/task_queue_paced_sender.cc
@@ -31,7 +31,7 @@
 TaskQueuePacedSender::TaskQueuePacedSender(
     Clock* clock,
     PacingController::PacketSender* packet_sender,
-    const WebRtcKeyValueConfig& field_trials,
+    const FieldTrialsView& field_trials,
     TaskQueueFactory* task_queue_factory,
     TimeDelta max_hold_back_window,
     int max_hold_back_window_in_packets)
diff --git a/modules/pacing/task_queue_paced_sender.h b/modules/pacing/task_queue_paced_sender.h
index 10fdfd7..d72982f 100644
--- a/modules/pacing/task_queue_paced_sender.h
+++ b/modules/pacing/task_queue_paced_sender.h
@@ -19,12 +19,12 @@
 
 #include "absl/base/attributes.h"
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "api/units/data_size.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/pacing/pacing_controller.h"
 #include "modules/pacing/rtp_packet_pacer.h"
 #include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
@@ -45,7 +45,7 @@
   // latency.
   TaskQueuePacedSender(Clock* clock,
                        PacingController::PacketSender* packet_sender,
-                       const WebRtcKeyValueConfig& field_trials,
+                       const FieldTrialsView& field_trials,
                        TaskQueueFactory* task_queue_factory,
                        TimeDelta max_hold_back_window,
                        int max_hold_back_window_in_packets);
diff --git a/modules/remote_bitrate_estimator/BUILD.gn b/modules/remote_bitrate_estimator/BUILD.gn
index fd52b2d..b49e028 100644
--- a/modules/remote_bitrate_estimator/BUILD.gn
+++ b/modules/remote_bitrate_estimator/BUILD.gn
@@ -41,11 +41,11 @@
   }
 
   deps = [
+    "../../api:field_trials_view",
     "../../api:network_state_predictor_api",
     "../../api:rtp_headers",
     "../../api/transport:field_trial_based_config",
     "../../api/transport:network_control",
-    "../../api/transport:webrtc_key_value_config",
     "../../api/units:data_rate",
     "../../api/units:data_size",
     "../../api/units:time_delta",
diff --git a/modules/remote_bitrate_estimator/DEPS b/modules/remote_bitrate_estimator/DEPS
index 66a3201..35a6211 100644
--- a/modules/remote_bitrate_estimator/DEPS
+++ b/modules/remote_bitrate_estimator/DEPS
@@ -1,6 +1,6 @@
 include_rules = [
   "+logging/rtc_event_log",
   "+system_wrappers",
-  # Avoid directly using field_trial. Instead use WebRtcKeyValueConfig.
+  # Avoid directly using field_trial. Instead use FieldTrialsView.
   "-system_wrappers/include/field_trial.h",
 ]
diff --git a/modules/remote_bitrate_estimator/aimd_rate_control.cc b/modules/remote_bitrate_estimator/aimd_rate_control.cc
index 3297df9..e77336d 100644
--- a/modules/remote_bitrate_estimator/aimd_rate_control.cc
+++ b/modules/remote_bitrate_estimator/aimd_rate_control.cc
@@ -35,17 +35,15 @@
 
 constexpr char kBweBackOffFactorExperiment[] = "WebRTC-BweBackOffFactor";
 
-bool IsEnabled(const WebRtcKeyValueConfig& field_trials,
-               absl::string_view key) {
+bool IsEnabled(const FieldTrialsView& field_trials, absl::string_view key) {
   return absl::StartsWith(field_trials.Lookup(key), "Enabled");
 }
 
-bool IsNotDisabled(const WebRtcKeyValueConfig& field_trials,
-                   absl::string_view key) {
+bool IsNotDisabled(const FieldTrialsView& field_trials, absl::string_view key) {
   return !absl::StartsWith(field_trials.Lookup(key), "Disabled");
 }
 
-double ReadBackoffFactor(const WebRtcKeyValueConfig& key_value_config) {
+double ReadBackoffFactor(const FieldTrialsView& key_value_config) {
   std::string experiment_string =
       key_value_config.Lookup(kBweBackOffFactorExperiment);
   double backoff_factor;
@@ -67,10 +65,10 @@
 
 }  // namespace
 
-AimdRateControl::AimdRateControl(const WebRtcKeyValueConfig* key_value_config)
+AimdRateControl::AimdRateControl(const FieldTrialsView* key_value_config)
     : AimdRateControl(key_value_config, /* send_side =*/false) {}
 
-AimdRateControl::AimdRateControl(const WebRtcKeyValueConfig* key_value_config,
+AimdRateControl::AimdRateControl(const FieldTrialsView* key_value_config,
                                  bool send_side)
     : min_configured_bitrate_(congestion_controller::GetMinBitrate()),
       max_configured_bitrate_(DataRate::KilobitsPerSec(30000)),
diff --git a/modules/remote_bitrate_estimator/aimd_rate_control.h b/modules/remote_bitrate_estimator/aimd_rate_control.h
index 699b185..30e9710 100644
--- a/modules/remote_bitrate_estimator/aimd_rate_control.h
+++ b/modules/remote_bitrate_estimator/aimd_rate_control.h
@@ -14,8 +14,8 @@
 #include <stdint.h>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/transport/network_types.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/units/data_rate.h"
 #include "api/units/timestamp.h"
 #include "modules/congestion_controller/goog_cc/link_capacity_estimator.h"
@@ -30,8 +30,8 @@
 // multiplicatively.
 class AimdRateControl {
  public:
-  explicit AimdRateControl(const WebRtcKeyValueConfig* key_value_config);
-  AimdRateControl(const WebRtcKeyValueConfig* key_value_config, bool send_side);
+  explicit AimdRateControl(const FieldTrialsView* key_value_config);
+  AimdRateControl(const FieldTrialsView* key_value_config, bool send_side);
   ~AimdRateControl();
 
   // Returns true if the target bitrate has been initialized. This happens
diff --git a/modules/remote_bitrate_estimator/overuse_detector.cc b/modules/remote_bitrate_estimator/overuse_detector.cc
index 710b3b2..672822b 100644
--- a/modules/remote_bitrate_estimator/overuse_detector.cc
+++ b/modules/remote_bitrate_estimator/overuse_detector.cc
@@ -33,7 +33,7 @@
 const int kMaxNumDeltas = 60;
 
 bool AdaptiveThresholdExperimentIsDisabled(
-    const WebRtcKeyValueConfig& key_value_config) {
+    const FieldTrialsView& key_value_config) {
   std::string experiment_string =
       key_value_config.Lookup(kAdaptiveThresholdExperiment);
   const size_t kMinExperimentLength = kDisabledPrefixLength;
@@ -44,7 +44,7 @@
 
 // Gets thresholds from the experiment name following the format
 // "WebRTC-AdaptiveBweThreshold/Enabled-0.5,0.002/".
-bool ReadExperimentConstants(const WebRtcKeyValueConfig& key_value_config,
+bool ReadExperimentConstants(const FieldTrialsView& key_value_config,
                              double* k_up,
                              double* k_down) {
   std::string experiment_string =
@@ -57,7 +57,7 @@
                 "%lf,%lf", k_up, k_down) == 2;
 }
 
-OveruseDetector::OveruseDetector(const WebRtcKeyValueConfig* key_value_config)
+OveruseDetector::OveruseDetector(const FieldTrialsView* key_value_config)
     // Experiment is on by default, but can be disabled with finch by setting
     // the field trial string to "WebRTC-AdaptiveBweThreshold/Disabled/".
     : in_experiment_(!AdaptiveThresholdExperimentIsDisabled(*key_value_config)),
@@ -147,7 +147,7 @@
 }
 
 void OveruseDetector::InitializeExperiment(
-    const WebRtcKeyValueConfig& key_value_config) {
+    const FieldTrialsView& key_value_config) {
   RTC_DCHECK(in_experiment_);
   double k_up = 0.0;
   double k_down = 0.0;
diff --git a/modules/remote_bitrate_estimator/overuse_detector.h b/modules/remote_bitrate_estimator/overuse_detector.h
index 179e290..dfaea91 100644
--- a/modules/remote_bitrate_estimator/overuse_detector.h
+++ b/modules/remote_bitrate_estimator/overuse_detector.h
@@ -12,17 +12,17 @@
 
 #include <stdint.h>
 
+#include "api/field_trials_view.h"
 #include "api/network_state_predictor.h"
-#include "api/transport/webrtc_key_value_config.h"
 
 namespace webrtc {
 
 bool AdaptiveThresholdExperimentIsDisabled(
-    const WebRtcKeyValueConfig& key_value_config);
+    const FieldTrialsView& key_value_config);
 
 class OveruseDetector {
  public:
-  explicit OveruseDetector(const WebRtcKeyValueConfig* key_value_config);
+  explicit OveruseDetector(const FieldTrialsView* key_value_config);
   virtual ~OveruseDetector();
 
   OveruseDetector(const OveruseDetector&) = delete;
@@ -44,7 +44,7 @@
 
  private:
   void UpdateThreshold(double modified_offset, int64_t now_ms);
-  void InitializeExperiment(const WebRtcKeyValueConfig& key_value_config);
+  void InitializeExperiment(const FieldTrialsView& key_value_config);
 
   bool in_experiment_;
   double k_up_;
diff --git a/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc b/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc
index c1c5697..028d0db 100644
--- a/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc
+++ b/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc
@@ -44,7 +44,7 @@
   explicit Detector(int64_t last_packet_time_ms,
                     const OverUseDetectorOptions& options,
                     bool enable_burst_grouping,
-                    const WebRtcKeyValueConfig* key_value_config)
+                    const FieldTrialsView* key_value_config)
       : last_packet_time_ms(last_packet_time_ms),
         inter_arrival(90 * kTimestampGroupLengthMs,
                       kTimestampToMs,
diff --git a/modules/remote_bitrate_estimator/remote_estimator_proxy.cc b/modules/remote_bitrate_estimator/remote_estimator_proxy.cc
index 7107368..fd5f629 100644
--- a/modules/remote_bitrate_estimator/remote_estimator_proxy.cc
+++ b/modules/remote_bitrate_estimator/remote_estimator_proxy.cc
@@ -31,7 +31,7 @@
 RemoteEstimatorProxy::RemoteEstimatorProxy(
     Clock* clock,
     TransportFeedbackSender feedback_sender,
-    const WebRtcKeyValueConfig* key_value_config,
+    const FieldTrialsView* key_value_config,
     NetworkStateEstimator* network_state_estimator)
     : clock_(clock),
       feedback_sender_(std::move(feedback_sender)),
diff --git a/modules/remote_bitrate_estimator/remote_estimator_proxy.h b/modules/remote_bitrate_estimator/remote_estimator_proxy.h
index 4e9b2b5..438aa94 100644
--- a/modules/remote_bitrate_estimator/remote_estimator_proxy.h
+++ b/modules/remote_bitrate_estimator/remote_estimator_proxy.h
@@ -16,8 +16,8 @@
 #include <memory>
 #include <vector>
 
+#include "api/field_trials_view.h"
 #include "api/transport/network_control.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
 #include "modules/remote_bitrate_estimator/packet_arrival_map.h"
 #include "rtc_base/experiments/field_trial_parser.h"
@@ -42,7 +42,7 @@
       std::vector<std::unique_ptr<rtcp::RtcpPacket>> packets)>;
   RemoteEstimatorProxy(Clock* clock,
                        TransportFeedbackSender feedback_sender,
-                       const WebRtcKeyValueConfig* key_value_config,
+                       const FieldTrialsView* key_value_config,
                        NetworkStateEstimator* network_state_estimator);
   ~RemoteEstimatorProxy() override;
 
@@ -68,7 +68,7 @@
                                                     TimeDelta::Millis(100)};
     FieldTrialParameter<double> bandwidth_fraction{"frac", 0.05};
     explicit TransportWideFeedbackConfig(
-        const WebRtcKeyValueConfig* key_value_config) {
+        const FieldTrialsView* key_value_config) {
       ParseFieldTrial({&back_window, &min_interval, &max_interval,
                        &default_interval, &bandwidth_fraction},
                       key_value_config->Lookup(
diff --git a/modules/rtp_rtcp/BUILD.gn b/modules/rtp_rtcp/BUILD.gn
index 9922484..e6640fe 100644
--- a/modules/rtp_rtcp/BUILD.gn
+++ b/modules/rtp_rtcp/BUILD.gn
@@ -253,6 +253,7 @@
     "..:module_api_public",
     "..:module_fec_api",
     "../../api:array_view",
+    "../../api:field_trials_view",
     "../../api:frame_transformer_interface",
     "../../api:function_view",
     "../../api:libjingle_peerconnection_api",
@@ -267,7 +268,6 @@
     "../../api/rtc_event_log",
     "../../api/task_queue:task_queue",
     "../../api/transport:field_trial_based_config",
-    "../../api/transport:webrtc_key_value_config",
     "../../api/transport/rtp:dependency_descriptor",
     "../../api/transport/rtp:rtp_source",
     "../../api/units:data_rate",
diff --git a/modules/rtp_rtcp/DEPS b/modules/rtp_rtcp/DEPS
index dac95dd..3eec1ca 100644
--- a/modules/rtp_rtcp/DEPS
+++ b/modules/rtp_rtcp/DEPS
@@ -3,6 +3,6 @@
   "+common_video",
   "+logging/rtc_event_log",
   "+system_wrappers",
-  # Avoid directly using field_trial. Instead use WebRtcKeyValueConfig.
+  # Avoid directly using field_trial. Instead use FieldTrialsView.
   "-system_wrappers/include/field_trial.h",
 ]
diff --git a/modules/rtp_rtcp/source/deprecated/deprecated_rtp_sender_egress.cc b/modules/rtp_rtcp/source/deprecated/deprecated_rtp_sender_egress.cc
index db6b50a..35936c4 100644
--- a/modules/rtp_rtcp/source/deprecated/deprecated_rtp_sender_egress.cc
+++ b/modules/rtp_rtcp/source/deprecated/deprecated_rtp_sender_egress.cc
@@ -27,8 +27,7 @@
 constexpr int kBitrateStatisticsWindowMs = 1000;
 constexpr size_t kRtpSequenceNumberMapMaxEntries = 1 << 13;
 
-bool IsDisabled(absl::string_view name,
-                const WebRtcKeyValueConfig* field_trials) {
+bool IsDisabled(absl::string_view name, const FieldTrialsView* field_trials) {
   FieldTrialBasedConfig default_trials;
   auto& trials = field_trials ? *field_trials : default_trials;
   return absl::StartsWith(trials.Lookup(name), "Disabled");
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc
index 8592e42..48b0aac 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_rtcp_impl2_unittest.cc
@@ -157,7 +157,7 @@
   bool with_overhead = false;
 };
 
-class FieldTrialConfig : public WebRtcKeyValueConfig {
+class FieldTrialConfig : public FieldTrialsView {
  public:
   static FieldTrialConfig GetFromTestConfig(const TestConfig& config) {
     FieldTrialConfig trials;
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_interface.h b/modules/rtp_rtcp/source/rtp_rtcp_interface.h
index a411b23..48c6071 100644
--- a/modules/rtp_rtcp/source/rtp_rtcp_interface.h
+++ b/modules/rtp_rtcp/source/rtp_rtcp_interface.h
@@ -16,9 +16,9 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/frame_transformer_interface.h"
 #include "api/scoped_refptr.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/video/video_bitrate_allocation.h"
 #include "modules/rtp_rtcp/include/receive_statistics.h"
 #include "modules/rtp_rtcp/include/report_block_data.h"
@@ -128,7 +128,7 @@
 
     // If set, field trials are read from `field_trials`, otherwise
     // defaults to  webrtc::FieldTrialBasedConfig.
-    const WebRtcKeyValueConfig* field_trials = nullptr;
+    const FieldTrialsView* field_trials = nullptr;
 
     // SSRCs for media and retransmission, respectively.
     // FlexFec SSRC is fetched from `flexfec_sender`.
diff --git a/modules/rtp_rtcp/source/rtp_sender.cc b/modules/rtp_rtcp/source/rtp_sender.cc
index d5c6c16..6989efc 100644
--- a/modules/rtp_rtcp/source/rtp_sender.cc
+++ b/modules/rtp_rtcp/source/rtp_sender.cc
@@ -138,7 +138,7 @@
          extensions_map.IsRegistered(kRtpExtensionTransmissionTimeOffset);
 }
 
-double GetMaxPaddingSizeFactor(const WebRtcKeyValueConfig* field_trials) {
+double GetMaxPaddingSizeFactor(const FieldTrialsView* field_trials) {
   // Too low factor means RTX payload padding is rarely used and ineffective.
   // Too high means we risk interrupting regular media packets.
   // In practice, 3x seems to yield reasonable results.
diff --git a/modules/rtp_rtcp/source/rtp_sender.h b/modules/rtp_rtcp/source/rtp_sender.h
index d892970..0a80836 100644
--- a/modules/rtp_rtcp/source/rtp_sender.h
+++ b/modules/rtp_rtcp/source/rtp_sender.h
@@ -21,7 +21,7 @@
 #include "absl/types/optional.h"
 #include "api/array_view.h"
 #include "api/call/transport.h"
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "modules/rtp_rtcp/include/flexfec_sender.h"
 #include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
 #include "modules/rtp_rtcp/include/rtp_packet_sender.h"
diff --git a/modules/rtp_rtcp/source/rtp_sender_egress.cc b/modules/rtp_rtcp/source/rtp_sender_egress.cc
index e5c2e53..4a72059 100644
--- a/modules/rtp_rtcp/source/rtp_sender_egress.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_egress.cc
@@ -30,7 +30,7 @@
 constexpr TimeDelta kUpdateInterval =
     TimeDelta::Millis(kBitrateStatisticsWindowMs);
 
-bool IsTrialSetTo(const WebRtcKeyValueConfig* field_trials,
+bool IsTrialSetTo(const FieldTrialsView* field_trials,
                   absl::string_view name,
                   absl::string_view value) {
   FieldTrialBasedConfig default_trials;
diff --git a/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc
index ee7123b..33c06c4 100644
--- a/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_egress_unittest.cc
@@ -87,7 +87,7 @@
               (override));
 };
 
-class FieldTrialConfig : public WebRtcKeyValueConfig {
+class FieldTrialConfig : public FieldTrialsView {
  public:
   FieldTrialConfig() : overhead_enabled_(false) {}
   ~FieldTrialConfig() override {}
diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
index d77d566..c28dd68 100644
--- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
@@ -100,7 +100,7 @@
               (override));
 };
 
-class FieldTrialConfig : public WebRtcKeyValueConfig {
+class FieldTrialConfig : public FieldTrialsView {
  public:
   FieldTrialConfig() : max_padding_factor_(1200) {}
   ~FieldTrialConfig() override {}
diff --git a/modules/rtp_rtcp/source/rtp_sender_video.cc b/modules/rtp_rtcp/source/rtp_sender_video.cc
index 6d6ba33..614a386 100644
--- a/modules/rtp_rtcp/source/rtp_sender_video.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_video.cc
@@ -118,7 +118,7 @@
 }
 
 absl::optional<VideoPlayoutDelay> LoadVideoPlayoutDelayOverride(
-    const WebRtcKeyValueConfig* key_value_config) {
+    const FieldTrialsView* key_value_config) {
   RTC_DCHECK(key_value_config);
   FieldTrialOptional<int> playout_delay_min_ms("min_ms", absl::nullopt);
   FieldTrialOptional<int> playout_delay_max_ms("max_ms", absl::nullopt);
diff --git a/modules/rtp_rtcp/source/rtp_sender_video.h b/modules/rtp_rtcp/source/rtp_sender_video.h
index 5164969..206fcab 100644
--- a/modules/rtp_rtcp/source/rtp_sender_video.h
+++ b/modules/rtp_rtcp/source/rtp_sender_video.h
@@ -79,7 +79,7 @@
     bool require_frame_encryption = false;
     bool enable_retransmit_all_layers = false;
     absl::optional<int> red_payload_type;
-    const WebRtcKeyValueConfig* field_trials = nullptr;
+    const FieldTrialsView* field_trials = nullptr;
     rtc::scoped_refptr<FrameTransformerInterface> frame_transformer;
     TaskQueueBase* send_transport_queue = nullptr;
   };
diff --git a/modules/rtp_rtcp/source/rtp_sender_video_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_video_unittest.cc
index dc845e4..fc4fefe 100644
--- a/modules/rtp_rtcp/source/rtp_sender_video_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_video_unittest.cc
@@ -127,7 +127,7 @@
  public:
   TestRtpSenderVideo(Clock* clock,
                      RTPSender* rtp_sender,
-                     const WebRtcKeyValueConfig& field_trials)
+                     const FieldTrialsView& field_trials)
       : RTPSenderVideo([&] {
           Config config;
           config.clock = clock;
@@ -146,7 +146,7 @@
   }
 };
 
-class FieldTrials : public WebRtcKeyValueConfig {
+class FieldTrials : public FieldTrialsView {
  public:
   explicit FieldTrials(bool use_send_side_bwe_with_overhead)
       : use_send_side_bwe_with_overhead_(use_send_side_bwe_with_overhead),
diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn
index a328d91..ebc8303 100644
--- a/modules/video_coding/BUILD.gn
+++ b/modules/video_coding/BUILD.gn
@@ -81,8 +81,8 @@
 
   deps = [
     "..:module_api",
+    "../../api:field_trials_view",
     "../../api:sequence_checker",
-    "../../api:webrtc_key_value_config",
     "../../api/task_queue",
     "../../api/units:time_delta",
     "../../api/units:timestamp",
@@ -167,7 +167,7 @@
   ]
   deps = [
     ":video_coding_utility",
-    "../../api:webrtc_key_value_config",
+    "../../api:field_trials_view",
     "../../api/units:timestamp",
     "../../api/video:encoded_frame",
     "../../rtc_base:logging",
@@ -188,7 +188,7 @@
     "timing.h",
   ]
   deps = [
-    "../../api:webrtc_key_value_config",
+    "../../api:field_trials_view",
     "../../api/units:time_delta",
     "../../api/video:video_rtp_headers",
     "../../rtc_base:logging",
@@ -221,7 +221,7 @@
   ]
   deps = [
     ":rtt_filter",
-    "../../api:webrtc_key_value_config",
+    "../../api:field_trials_view",
     "../../api/units:data_size",
     "../../api/units:frequency",
     "../../api/units:time_delta",
@@ -310,11 +310,11 @@
     "..:module_fec_api",
     "../../api:array_view",
     "../../api:fec_controller_api",
+    "../../api:field_trials_view",
     "../../api:rtp_headers",
     "../../api:rtp_packet_info",
     "../../api:scoped_refptr",
     "../../api:sequence_checker",
-    "../../api:webrtc_key_value_config",
     "../../api/task_queue",
     "../../api/units:data_rate",
     "../../api/units:data_size",
@@ -422,10 +422,10 @@
     ":video_coding",
     "..:module_api",
     "..:module_api_public",
+    "../../api:field_trials_view",
     "../../api:rtp_headers",
     "../../api:rtp_packet_info",
     "../../api:sequence_checker",
-    "../../api:webrtc_key_value_config",
     "../../api/transport:field_trial_based_config",
     "../../api/units:timestamp",
     "../../api/video:encoded_image",
@@ -499,9 +499,9 @@
   deps = [
     ":video_codec_interface",
     "../../api:array_view",
+    "../../api:field_trials_view",
     "../../api:scoped_refptr",
     "../../api:sequence_checker",
-    "../../api:webrtc_key_value_config",
     "../../api/video:encoded_frame",
     "../../api/video:encoded_image",
     "../../api/video:video_adaptation",
@@ -755,10 +755,10 @@
     ":webrtc_libvpx_interface",
     ":webrtc_vp9_helpers",
     "../../api:fec_controller_api",
+    "../../api:field_trials_view",
     "../../api:refcountedbase",
     "../../api:scoped_refptr",
     "../../api/transport:field_trial_based_config",
-    "../../api/transport:webrtc_key_value_config",
     "../../api/video:video_frame",
     "../../api/video:video_frame_i010",
     "../../api/video:video_rtp_headers",
diff --git a/modules/video_coding/codecs/vp9/libvpx_vp9_decoder.cc b/modules/video_coding/codecs/vp9/libvpx_vp9_decoder.cc
index 669dc55..ffb4705 100644
--- a/modules/video_coding/codecs/vp9/libvpx_vp9_decoder.cc
+++ b/modules/video_coding/codecs/vp9/libvpx_vp9_decoder.cc
@@ -96,7 +96,7 @@
 
 LibvpxVp9Decoder::LibvpxVp9Decoder()
     : LibvpxVp9Decoder(FieldTrialBasedConfig()) {}
-LibvpxVp9Decoder::LibvpxVp9Decoder(const WebRtcKeyValueConfig& trials)
+LibvpxVp9Decoder::LibvpxVp9Decoder(const FieldTrialsView& trials)
     : decode_complete_callback_(nullptr),
       inited_(false),
       decoder_(nullptr),
diff --git a/modules/video_coding/codecs/vp9/libvpx_vp9_decoder.h b/modules/video_coding/codecs/vp9/libvpx_vp9_decoder.h
index e5636d8..a680441 100644
--- a/modules/video_coding/codecs/vp9/libvpx_vp9_decoder.h
+++ b/modules/video_coding/codecs/vp9/libvpx_vp9_decoder.h
@@ -14,7 +14,7 @@
 
 #ifdef RTC_ENABLE_VP9
 
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "api/video_codecs/video_decoder.h"
 #include "common_video/include/video_frame_buffer_pool.h"
 #include "modules/video_coding/codecs/vp9/include/vp9.h"
@@ -26,7 +26,7 @@
 class LibvpxVp9Decoder : public VP9Decoder {
  public:
   LibvpxVp9Decoder();
-  explicit LibvpxVp9Decoder(const WebRtcKeyValueConfig& trials);
+  explicit LibvpxVp9Decoder(const FieldTrialsView& trials);
 
   virtual ~LibvpxVp9Decoder();
 
diff --git a/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc b/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc
index 99680cb..c569053 100644
--- a/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc
+++ b/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.cc
@@ -194,7 +194,7 @@
 
 LibvpxVp9Encoder::LibvpxVp9Encoder(const cricket::VideoCodec& codec,
                                    std::unique_ptr<LibvpxInterface> interface,
-                                   const WebRtcKeyValueConfig& trials)
+                                   const FieldTrialsView& trials)
     : libvpx_(std::move(interface)),
       encoded_image_(),
       encoded_complete_callback_(nullptr),
@@ -1811,8 +1811,7 @@
 
 // static
 LibvpxVp9Encoder::VariableFramerateExperiment
-LibvpxVp9Encoder::ParseVariableFramerateConfig(
-    const WebRtcKeyValueConfig& trials) {
+LibvpxVp9Encoder::ParseVariableFramerateConfig(const FieldTrialsView& trials) {
   FieldTrialFlag enabled = FieldTrialFlag("Enabled");
   FieldTrialParameter<double> framerate_limit("min_fps", 5.0);
   FieldTrialParameter<int> qp("min_qp", 32);
@@ -1834,7 +1833,7 @@
 
 // static
 LibvpxVp9Encoder::QualityScalerExperiment
-LibvpxVp9Encoder::ParseQualityScalerConfig(const WebRtcKeyValueConfig& trials) {
+LibvpxVp9Encoder::ParseQualityScalerConfig(const FieldTrialsView& trials) {
   FieldTrialFlag disabled = FieldTrialFlag("Disabled");
   FieldTrialParameter<int> low_qp("low_qp", kLowVp9QpThreshold);
   FieldTrialParameter<int> high_qp("hihg_qp", kHighVp9QpThreshold);
@@ -1873,7 +1872,7 @@
 // static
 LibvpxVp9Encoder::PerformanceFlags
 LibvpxVp9Encoder::ParsePerformanceFlagsFromTrials(
-    const WebRtcKeyValueConfig& trials) {
+    const FieldTrialsView& trials) {
   struct Params : public PerformanceFlags::ParameterSet {
     int min_pixel_count = 0;
   };
diff --git a/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.h b/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.h
index b5e9cc6..8685464 100644
--- a/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.h
+++ b/modules/video_coding/codecs/vp9/libvpx_vp9_encoder.h
@@ -19,7 +19,7 @@
 #include <vector>
 
 #include "api/fec_controller_override.h"
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "api/video_codecs/video_encoder.h"
 #include "api/video_codecs/vp9_profile.h"
 #include "common_video/include/video_frame_buffer_pool.h"
@@ -37,7 +37,7 @@
  public:
   LibvpxVp9Encoder(const cricket::VideoCodec& codec,
                    std::unique_ptr<LibvpxInterface> interface,
-                   const WebRtcKeyValueConfig& trials);
+                   const FieldTrialsView& trials);
 
   ~LibvpxVp9Encoder() override;
 
@@ -190,7 +190,7 @@
     int frames_before_steady_state;
   } variable_framerate_experiment_;
   static VariableFramerateExperiment ParseVariableFramerateConfig(
-      const WebRtcKeyValueConfig& trials);
+      const FieldTrialsView& trials);
   FramerateControllerDeprecated variable_framerate_controller_;
 
   const struct QualityScalerExperiment {
@@ -199,7 +199,7 @@
     bool enabled;
   } quality_scaler_experiment_;
   static QualityScalerExperiment ParseQualityScalerConfig(
-      const WebRtcKeyValueConfig& trials);
+      const FieldTrialsView& trials);
   const bool external_ref_ctrl_;
 
   // Flags that can affect speed vs quality tradeoff, and are configureable per
@@ -234,7 +234,7 @@
       performance_flags_by_spatial_index_;
   void UpdatePerformanceFlags();
   static PerformanceFlags ParsePerformanceFlagsFromTrials(
-      const WebRtcKeyValueConfig& trials);
+      const FieldTrialsView& trials);
   static PerformanceFlags GetDefaultPerformanceFlags();
 
   int num_steady_state_frames_;
diff --git a/modules/video_coding/deprecated/BUILD.gn b/modules/video_coding/deprecated/BUILD.gn
index 9e4b65f..0155fc4 100644
--- a/modules/video_coding/deprecated/BUILD.gn
+++ b/modules/video_coding/deprecated/BUILD.gn
@@ -17,7 +17,7 @@
   deps = [
     "..:nack_requester",
     "../..:module_api",
-    "../../../api:webrtc_key_value_config",
+    "../../../api:field_trials_view",
     "../../../api/units:time_delta",
     "../../../api/units:timestamp",
     "../../../rtc_base:checks",
diff --git a/modules/video_coding/deprecated/nack_module.cc b/modules/video_coding/deprecated/nack_module.cc
index 4a6ae09..0768bc4 100644
--- a/modules/video_coding/deprecated/nack_module.cc
+++ b/modules/video_coding/deprecated/nack_module.cc
@@ -32,7 +32,7 @@
 const int kNumReorderingBuckets = 10;
 const int kDefaultSendNackDelayMs = 0;
 
-int64_t GetSendNackDelay(const WebRtcKeyValueConfig& field_trials) {
+int64_t GetSendNackDelay(const FieldTrialsView& field_trials) {
   int64_t delay_ms = strtol(
       field_trials.Lookup("WebRTC-SendNackDelayMs").c_str(), nullptr, 10);
   if (delay_ms > 0 && delay_ms <= 20) {
@@ -62,7 +62,7 @@
 
 absl::optional<DEPRECATED_NackModule::BackoffSettings>
 DEPRECATED_NackModule::BackoffSettings::ParseFromFieldTrials(
-    const WebRtcKeyValueConfig& field_trials) {
+    const FieldTrialsView& field_trials) {
   // Matches magic number in RTPSender::OnReceivedNack().
   const TimeDelta kDefaultMinRetryInterval = TimeDelta::Millis(5);
   // Upper bound on link-delay considered for exponential backoff.
@@ -91,7 +91,7 @@
     Clock* clock,
     NackSender* nack_sender,
     KeyFrameRequestSender* keyframe_request_sender,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : clock_(clock),
       nack_sender_(nack_sender),
       keyframe_request_sender_(keyframe_request_sender),
diff --git a/modules/video_coding/deprecated/nack_module.h b/modules/video_coding/deprecated/nack_module.h
index 8d17fff..3b49bd1 100644
--- a/modules/video_coding/deprecated/nack_module.h
+++ b/modules/video_coding/deprecated/nack_module.h
@@ -18,8 +18,8 @@
 #include <vector>
 
 #include "absl/base/attributes.h"
+#include "api/field_trials_view.h"
 #include "api/units/time_delta.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/include/module.h"
 #include "modules/include/module_common_types.h"
 #include "modules/video_coding/histogram.h"
@@ -35,7 +35,7 @@
   DEPRECATED_NackModule(Clock* clock,
                         NackSender* nack_sender,
                         KeyFrameRequestSender* keyframe_request_sender,
-                        const WebRtcKeyValueConfig& field_trials);
+                        const FieldTrialsView& field_trials);
 
   int OnReceivedPacket(uint16_t seq_num, bool is_keyframe);
   int OnReceivedPacket(uint16_t seq_num, bool is_keyframe, bool is_recovered);
@@ -72,7 +72,7 @@
   struct BackoffSettings {
     BackoffSettings(TimeDelta min_retry, TimeDelta max_rtt, double base);
     static absl::optional<BackoffSettings> ParseFromFieldTrials(
-        const WebRtcKeyValueConfig& field_trials);
+        const FieldTrialsView& field_trials);
 
     // Min time between nacks.
     const TimeDelta min_retry_interval;
diff --git a/modules/video_coding/frame_buffer2.cc b/modules/video_coding/frame_buffer2.cc
index bfa3b36..421da75 100644
--- a/modules/video_coding/frame_buffer2.cc
+++ b/modules/video_coding/frame_buffer2.cc
@@ -58,7 +58,7 @@
 FrameBuffer::FrameBuffer(Clock* clock,
                          VCMTiming* timing,
                          VCMReceiveStatisticsCallback* stats_callback,
-                         const WebRtcKeyValueConfig& field_trials)
+                         const FieldTrialsView& field_trials)
     : decoded_frames_history_(kMaxFramesHistory),
       clock_(clock),
       callback_queue_(nullptr),
diff --git a/modules/video_coding/frame_buffer2.h b/modules/video_coding/frame_buffer2.h
index cd4cbcd..48aceab 100644
--- a/modules/video_coding/frame_buffer2.h
+++ b/modules/video_coding/frame_buffer2.h
@@ -18,9 +18,9 @@
 #include <vector>
 
 #include "absl/container/inlined_vector.h"
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
 #include "api/video/encoded_frame.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/video_coding/include/video_coding_defines.h"
 #include "modules/video_coding/inter_frame_delay.h"
 #include "modules/video_coding/jitter_estimator.h"
@@ -49,7 +49,7 @@
   FrameBuffer(Clock* clock,
               VCMTiming* timing,
               VCMReceiveStatisticsCallback* stats_callback,
-              const WebRtcKeyValueConfig& field_trials);
+              const FieldTrialsView& field_trials);
 
   FrameBuffer() = delete;
   FrameBuffer(const FrameBuffer&) = delete;
diff --git a/modules/video_coding/frame_buffer2_unittest.cc b/modules/video_coding/frame_buffer2_unittest.cc
index b0e3f1d..def2e22 100644
--- a/modules/video_coding/frame_buffer2_unittest.cc
+++ b/modules/video_coding/frame_buffer2_unittest.cc
@@ -41,7 +41,7 @@
 
 class VCMTimingFake : public VCMTiming {
  public:
-  explicit VCMTimingFake(Clock* clock, const WebRtcKeyValueConfig& field_trials)
+  explicit VCMTimingFake(Clock* clock, const FieldTrialsView& field_trials)
       : VCMTiming(clock, field_trials) {}
 
   Timestamp RenderTime(uint32_t frame_timestamp, Timestamp now) const override {
diff --git a/modules/video_coding/frame_buffer3.cc b/modules/video_coding/frame_buffer3.cc
index 7be5ffa..fab4ca7 100644
--- a/modules/video_coding/frame_buffer3.cc
+++ b/modules/video_coding/frame_buffer3.cc
@@ -64,7 +64,7 @@
 
 FrameBuffer::FrameBuffer(int max_size,
                          int max_decode_history,
-                         const WebRtcKeyValueConfig& field_trials)
+                         const FieldTrialsView& field_trials)
     : legacy_frame_id_jump_behavior_(
           !field_trials.IsDisabled("WebRTC-LegacyFrameIdJumpBehavior")),
       max_size_(max_size),
diff --git a/modules/video_coding/frame_buffer3.h b/modules/video_coding/frame_buffer3.h
index 9683195..5bcfbd2 100644
--- a/modules/video_coding/frame_buffer3.h
+++ b/modules/video_coding/frame_buffer3.h
@@ -17,9 +17,9 @@
 
 #include "absl/container/inlined_vector.h"
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/units/timestamp.h"
 #include "api/video/encoded_frame.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/video_coding/utility/decoded_frames_history.h"
 
 namespace webrtc {
@@ -37,7 +37,7 @@
   FrameBuffer(int max_size,
               int max_decode_history,
               // TODO(hta): remove field trials!
-              const WebRtcKeyValueConfig& field_trials);
+              const FieldTrialsView& field_trials);
   FrameBuffer(const FrameBuffer&) = delete;
   FrameBuffer& operator=(const FrameBuffer&) = delete;
   ~FrameBuffer() = default;
diff --git a/modules/video_coding/generic_decoder.cc b/modules/video_coding/generic_decoder.cc
index 78d77d3..2a87198 100644
--- a/modules/video_coding/generic_decoder.cc
+++ b/modules/video_coding/generic_decoder.cc
@@ -29,7 +29,7 @@
 VCMDecodedFrameCallback::VCMDecodedFrameCallback(
     VCMTiming* timing,
     Clock* clock,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : _clock(clock),
       _timing(timing),
       _timestampMap(kDecoderFrameMemoryLength),
diff --git a/modules/video_coding/generic_decoder.h b/modules/video_coding/generic_decoder.h
index 34f22c4..a674858 100644
--- a/modules/video_coding/generic_decoder.h
+++ b/modules/video_coding/generic_decoder.h
@@ -13,10 +13,10 @@
 
 #include <string>
 
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
 #include "api/units/time_delta.h"
 #include "api/video_codecs/video_decoder.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/video_coding/encoded_frame.h"
 #include "modules/video_coding/include/video_codec_interface.h"
 #include "modules/video_coding/timestamp_map.h"
@@ -34,7 +34,7 @@
  public:
   VCMDecodedFrameCallback(VCMTiming* timing,
                           Clock* clock,
-                          const WebRtcKeyValueConfig& field_trials);
+                          const FieldTrialsView& field_trials);
   ~VCMDecodedFrameCallback() override;
   void SetUserReceiveCallback(VCMReceiveCallback* receiveCallback);
   VCMReceiveCallback* UserReceiveCallback();
diff --git a/modules/video_coding/include/video_coding.h b/modules/video_coding/include/video_coding.h
index 8cedc4a..80398fc 100644
--- a/modules/video_coding/include/video_coding.h
+++ b/modules/video_coding/include/video_coding.h
@@ -11,9 +11,9 @@
 #ifndef MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_H_
 #define MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_H_
 
+#include "api/field_trials_view.h"
 #include "api/video/video_frame.h"
 #include "api/video_codecs/video_decoder.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/include/module.h"
 #include "modules/rtp_rtcp/source/rtp_video_header.h"
 #include "modules/video_coding/include/video_coding_defines.h"
@@ -31,7 +31,7 @@
   // DEPRECATED.
   static VideoCodingModule* Create(
       Clock* clock,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 
   /*
    *   Receiver
diff --git a/modules/video_coding/jitter_buffer.cc b/modules/video_coding/jitter_buffer.cc
index 5983bc1..6464b8c 100644
--- a/modules/video_coding/jitter_buffer.cc
+++ b/modules/video_coding/jitter_buffer.cc
@@ -110,7 +110,7 @@
 
 VCMJitterBuffer::VCMJitterBuffer(Clock* clock,
                                  std::unique_ptr<EventWrapper> event,
-                                 const WebRtcKeyValueConfig& field_trials)
+                                 const FieldTrialsView& field_trials)
     : clock_(clock),
       running_(false),
       frame_event_(std::move(event)),
diff --git a/modules/video_coding/jitter_buffer.h b/modules/video_coding/jitter_buffer.h
index 70e65be..72feffd 100644
--- a/modules/video_coding/jitter_buffer.h
+++ b/modules/video_coding/jitter_buffer.h
@@ -17,7 +17,7 @@
 #include <set>
 #include <vector>
 
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "modules/include/module_common_types.h"
 #include "modules/include/module_common_types_public.h"
 #include "modules/video_coding/decoding_state.h"
@@ -72,7 +72,7 @@
  public:
   VCMJitterBuffer(Clock* clock,
                   std::unique_ptr<EventWrapper> event,
-                  const WebRtcKeyValueConfig& field_trials);
+                  const FieldTrialsView& field_trials);
 
   ~VCMJitterBuffer();
 
diff --git a/modules/video_coding/jitter_estimator.cc b/modules/video_coding/jitter_estimator.cc
index e38dfaa..acc36a9 100644
--- a/modules/video_coding/jitter_estimator.cc
+++ b/modules/video_coding/jitter_estimator.cc
@@ -17,11 +17,11 @@
 #include <cstdint>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/units/data_size.h"
 #include "api/units/frequency.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/video_coding/rtt_filter.h"
 #include "rtc_base/experiments/jitter_upper_bound_experiment.h"
 #include "rtc_base/numerics/safe_conversions.h"
@@ -50,7 +50,7 @@
 }  // namespace
 
 VCMJitterEstimator::VCMJitterEstimator(Clock* clock,
-                                       const WebRtcKeyValueConfig& field_trials)
+                                       const FieldTrialsView& field_trials)
     : fps_counter_(30),  // TODO(sprang): Use an estimator with limit based on
                          // time, rather than number of samples.
       time_deviation_upper_bound_(
diff --git a/modules/video_coding/jitter_estimator.h b/modules/video_coding/jitter_estimator.h
index 9672d88..20d318a 100644
--- a/modules/video_coding/jitter_estimator.h
+++ b/modules/video_coding/jitter_estimator.h
@@ -12,11 +12,11 @@
 #define MODULES_VIDEO_CODING_JITTER_ESTIMATOR_H_
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/units/data_size.h"
 #include "api/units/frequency.h"
 #include "api/units/time_delta.h"
 #include "api/units/timestamp.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/video_coding/rtt_filter.h"
 #include "rtc_base/rolling_accumulator.h"
 
@@ -27,7 +27,7 @@
 class VCMJitterEstimator {
  public:
   explicit VCMJitterEstimator(Clock* clock,
-                              const WebRtcKeyValueConfig& field_trials);
+                              const FieldTrialsView& field_trials);
   virtual ~VCMJitterEstimator();
   VCMJitterEstimator(const VCMJitterEstimator&) = delete;
   VCMJitterEstimator& operator=(const VCMJitterEstimator&) = delete;
diff --git a/modules/video_coding/nack_requester.cc b/modules/video_coding/nack_requester.cc
index 7cd824e..1db716b 100644
--- a/modules/video_coding/nack_requester.cc
+++ b/modules/video_coding/nack_requester.cc
@@ -32,7 +32,7 @@
 const int kNumReorderingBuckets = 10;
 const int kDefaultSendNackDelayMs = 0;
 
-int64_t GetSendNackDelay(const WebRtcKeyValueConfig& field_trials) {
+int64_t GetSendNackDelay(const FieldTrialsView& field_trials) {
   int64_t delay_ms = strtol(
       field_trials.Lookup("WebRTC-SendNackDelayMs").c_str(), nullptr, 10);
   if (delay_ms > 0 && delay_ms <= 20) {
@@ -109,7 +109,7 @@
 
 absl::optional<NackRequester::BackoffSettings>
 NackRequester::BackoffSettings::ParseFromFieldTrials(
-    const WebRtcKeyValueConfig& field_trials) {
+    const FieldTrialsView& field_trials) {
   // Matches magic number in RTPSender::OnReceivedNack().
   const TimeDelta kDefaultMinRetryInterval = TimeDelta::Millis(5);
   // Upper bound on link-delay considered for exponential backoff.
@@ -139,7 +139,7 @@
                              Clock* clock,
                              NackSender* nack_sender,
                              KeyFrameRequestSender* keyframe_request_sender,
-                             const WebRtcKeyValueConfig& field_trials)
+                             const FieldTrialsView& field_trials)
     : worker_thread_(current_queue),
       clock_(clock),
       nack_sender_(nack_sender),
diff --git a/modules/video_coding/nack_requester.h b/modules/video_coding/nack_requester.h
index a01fb7c..fc44a59 100644
--- a/modules/video_coding/nack_requester.h
+++ b/modules/video_coding/nack_requester.h
@@ -17,9 +17,9 @@
 #include <set>
 #include <vector>
 
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
 #include "api/units/time_delta.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/include/module_common_types.h"
 #include "modules/video_coding/histogram.h"
 #include "rtc_base/numerics/sequence_number_util.h"
@@ -72,7 +72,7 @@
                 Clock* clock,
                 NackSender* nack_sender,
                 KeyFrameRequestSender* keyframe_request_sender,
-                const WebRtcKeyValueConfig& field_trials);
+                const FieldTrialsView& field_trials);
   ~NackRequester();
 
   void ProcessNacks() override;
@@ -107,7 +107,7 @@
   struct BackoffSettings {
     BackoffSettings(TimeDelta min_retry, TimeDelta max_rtt, double base);
     static absl::optional<BackoffSettings> ParseFromFieldTrials(
-        const WebRtcKeyValueConfig& field_trials);
+        const FieldTrialsView& field_trials);
 
     // Min time between nacks.
     const TimeDelta min_retry_interval;
diff --git a/modules/video_coding/receiver.cc b/modules/video_coding/receiver.cc
index 1503731..3f954ec 100644
--- a/modules/video_coding/receiver.cc
+++ b/modules/video_coding/receiver.cc
@@ -32,7 +32,7 @@
 
 VCMReceiver::VCMReceiver(VCMTiming* timing,
                          Clock* clock,
-                         const WebRtcKeyValueConfig& field_trials)
+                         const FieldTrialsView& field_trials)
     : VCMReceiver::VCMReceiver(timing,
                                clock,
                                absl::WrapUnique(EventWrapper::Create()),
@@ -43,7 +43,7 @@
                          Clock* clock,
                          std::unique_ptr<EventWrapper> receiver_event,
                          std::unique_ptr<EventWrapper> jitter_buffer_event,
-                         const WebRtcKeyValueConfig& field_trials)
+                         const FieldTrialsView& field_trials)
     : clock_(clock),
       jitter_buffer_(clock_, std::move(jitter_buffer_event), field_trials),
       timing_(timing),
diff --git a/modules/video_coding/receiver.h b/modules/video_coding/receiver.h
index c82ec2d..0bf756c 100644
--- a/modules/video_coding/receiver.h
+++ b/modules/video_coding/receiver.h
@@ -14,7 +14,7 @@
 #include <memory>
 #include <vector>
 
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "modules/video_coding/event_wrapper.h"
 #include "modules/video_coding/include/video_coding.h"
 #include "modules/video_coding/include/video_coding_defines.h"
@@ -31,7 +31,7 @@
  public:
   VCMReceiver(VCMTiming* timing,
               Clock* clock,
-              const WebRtcKeyValueConfig& field_trials);
+              const FieldTrialsView& field_trials);
 
   // Using this constructor, you can specify a different event implemetation for
   // the jitter buffer. Useful for unit tests when you want to simulate incoming
@@ -41,7 +41,7 @@
               Clock* clock,
               std::unique_ptr<EventWrapper> receiver_event,
               std::unique_ptr<EventWrapper> jitter_buffer_event,
-              const WebRtcKeyValueConfig& field_trials);
+              const FieldTrialsView& field_trials);
 
   ~VCMReceiver();
 
diff --git a/modules/video_coding/timing.cc b/modules/video_coding/timing.cc
index da71279..f3d5cb4 100644
--- a/modules/video_coding/timing.cc
+++ b/modules/video_coding/timing.cc
@@ -24,7 +24,7 @@
 constexpr TimeDelta kZeroPlayoutDelayDefaultMinPacing = TimeDelta::Millis(8);
 }  // namespace
 
-VCMTiming::VCMTiming(Clock* clock, const WebRtcKeyValueConfig& field_trials)
+VCMTiming::VCMTiming(Clock* clock, const FieldTrialsView& field_trials)
     : clock_(clock),
       ts_extrapolator_(
           std::make_unique<TimestampExtrapolator>(clock_->CurrentTime())),
diff --git a/modules/video_coding/timing.h b/modules/video_coding/timing.h
index 7471740..5868178 100644
--- a/modules/video_coding/timing.h
+++ b/modules/video_coding/timing.h
@@ -14,9 +14,9 @@
 #include <memory>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/units/time_delta.h"
 #include "api/video/video_timing.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/video_coding/codec_timer.h"
 #include "rtc_base/experiments/field_trial_parser.h"
 #include "rtc_base/synchronization/mutex.h"
@@ -33,7 +33,7 @@
   static constexpr auto kDefaultRenderDelay = TimeDelta::Millis(10);
   static constexpr auto kDelayMaxChangeMsPerS = 100;
 
-  VCMTiming(Clock* clock, const WebRtcKeyValueConfig& field_trials);
+  VCMTiming(Clock* clock, const FieldTrialsView& field_trials);
   virtual ~VCMTiming() = default;
 
   // Resets the timing to the initial state.
diff --git a/modules/video_coding/video_coding_impl.cc b/modules/video_coding/video_coding_impl.cc
index f3187d9..3e105a6 100644
--- a/modules/video_coding/video_coding_impl.cc
+++ b/modules/video_coding/video_coding_impl.cc
@@ -13,10 +13,10 @@
 #include <algorithm>
 #include <memory>
 
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
 #include "api/transport/field_trial_based_config.h"
 #include "api/video/encoded_image.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/video_coding/include/video_codec_interface.h"
 #include "modules/video_coding/timing.h"
 #include "rtc_base/memory/always_valid_pointer.h"
@@ -45,7 +45,7 @@
 class VideoCodingModuleImpl : public VideoCodingModule {
  public:
   explicit VideoCodingModuleImpl(Clock* clock,
-                                 const WebRtcKeyValueConfig* field_trials)
+                                 const FieldTrialsView* field_trials)
       : VideoCodingModule(),
         field_trials_(field_trials),
         timing_(new VCMTiming(clock, *field_trials_)),
@@ -109,7 +109,7 @@
   }
 
  private:
-  AlwaysValidPointer<const WebRtcKeyValueConfig, FieldTrialBasedConfig>
+  AlwaysValidPointer<const FieldTrialsView, FieldTrialBasedConfig>
       field_trials_;
   SequenceChecker construction_thread_;
   const std::unique_ptr<VCMTiming> timing_;
@@ -121,7 +121,7 @@
 // new jitter buffer is in place.
 VideoCodingModule* VideoCodingModule::Create(
     Clock* clock,
-    const WebRtcKeyValueConfig* field_trials) {
+    const FieldTrialsView* field_trials) {
   RTC_DCHECK(clock);
   return new VideoCodingModuleImpl(clock, field_trials);
 }
diff --git a/modules/video_coding/video_coding_impl.h b/modules/video_coding/video_coding_impl.h
index 10adf55..3010b2f 100644
--- a/modules/video_coding/video_coding_impl.h
+++ b/modules/video_coding/video_coding_impl.h
@@ -16,8 +16,8 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/video_coding/decoder_database.h"
 #include "modules/video_coding/frame_buffer.h"
 #include "modules/video_coding/generic_decoder.h"
@@ -59,7 +59,7 @@
  public:
   VideoReceiver(Clock* clock,
                 VCMTiming* timing,
-                const WebRtcKeyValueConfig& field_trials);
+                const FieldTrialsView& field_trials);
   ~VideoReceiver() override;
 
   void RegisterReceiveCodec(uint8_t payload_type,
diff --git a/modules/video_coding/video_receiver.cc b/modules/video_coding/video_receiver.cc
index ebfdd1b..6db27c4 100644
--- a/modules/video_coding/video_receiver.cc
+++ b/modules/video_coding/video_receiver.cc
@@ -42,7 +42,7 @@
 
 VideoReceiver::VideoReceiver(Clock* clock,
                              VCMTiming* timing,
-                             const WebRtcKeyValueConfig& field_trials)
+                             const FieldTrialsView& field_trials)
     : clock_(clock),
       _timing(timing),
       _receiver(_timing, clock_, field_trials),
diff --git a/modules/video_coding/video_receiver2.cc b/modules/video_coding/video_receiver2.cc
index e0df761..8557d68 100644
--- a/modules/video_coding/video_receiver2.cc
+++ b/modules/video_coding/video_receiver2.cc
@@ -30,7 +30,7 @@
 
 VideoReceiver2::VideoReceiver2(Clock* clock,
                                VCMTiming* timing,
-                               const WebRtcKeyValueConfig& field_trials)
+                               const FieldTrialsView& field_trials)
     : clock_(clock),
       timing_(timing),
       decodedFrameCallback_(timing_, clock_, field_trials),
diff --git a/modules/video_coding/video_receiver2.h b/modules/video_coding/video_receiver2.h
index 45d774b..a634e0e 100644
--- a/modules/video_coding/video_receiver2.h
+++ b/modules/video_coding/video_receiver2.h
@@ -11,9 +11,9 @@
 #ifndef MODULES_VIDEO_CODING_VIDEO_RECEIVER2_H_
 #define MODULES_VIDEO_CODING_VIDEO_RECEIVER2_H_
 
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
 #include "api/video_codecs/video_decoder.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/video_coding/decoder_database.h"
 #include "modules/video_coding/encoded_frame.h"
 #include "modules/video_coding/generic_decoder.h"
@@ -31,7 +31,7 @@
  public:
   VideoReceiver2(Clock* clock,
                  VCMTiming* timing,
-                 const WebRtcKeyValueConfig& field_trials);
+                 const FieldTrialsView& field_trials);
   ~VideoReceiver2();
 
   void RegisterReceiveCodec(uint8_t payload_type,
diff --git a/p2p/BUILD.gn b/p2p/BUILD.gn
index 0524b56..9c2d839 100644
--- a/p2p/BUILD.gn
+++ b/p2p/BUILD.gn
@@ -86,12 +86,12 @@
   deps = [
     "../api:array_view",
     "../api:async_dns_resolver",
+    "../api:field_trials_view",
     "../api:libjingle_peerconnection_api",
     "../api:packet_socket_factory",
     "../api:rtc_error",
     "../api:scoped_refptr",
     "../api:sequence_checker",
-    "../api:webrtc_key_value_config",
     "../api:wrapping_async_dns_resolver",
     "../api/crypto:options",
     "../api/rtc_event_log",
@@ -239,11 +239,11 @@
       ":p2p_server_utils",
       ":p2p_test_utils",
       ":rtc_p2p",
+      "../api:field_trials_view",
       "../api:libjingle_peerconnection_api",
       "../api:mock_async_dns_resolver",
       "../api:packet_socket_factory",
       "../api:scoped_refptr",
-      "../api:webrtc_key_value_config",
       "../api/transport:stun_types",
       "../api/units:time_delta",
       "../rtc_base",
diff --git a/p2p/base/fake_port_allocator.h b/p2p/base/fake_port_allocator.h
index 3d93b07..59533fa 100644
--- a/p2p/base/fake_port_allocator.h
+++ b/p2p/base/fake_port_allocator.h
@@ -38,7 +38,7 @@
                              const std::string& username,
                              const std::string& password,
                              bool emit_localhost_for_anyaddress,
-                             const webrtc::WebRtcKeyValueConfig* field_trials) {
+                             const webrtc::FieldTrialsView* field_trials) {
     TestUDPPort* port =
         new TestUDPPort(thread, factory, network, min_port, max_port, username,
                         password, emit_localhost_for_anyaddress, field_trials);
@@ -58,7 +58,7 @@
               const std::string& username,
               const std::string& password,
               bool emit_localhost_for_anyaddress,
-              const webrtc::WebRtcKeyValueConfig* field_trials)
+              const webrtc::FieldTrialsView* field_trials)
       : UDPPort(thread,
                 factory,
                 network,
@@ -82,7 +82,7 @@
                            int component,
                            const std::string& ice_ufrag,
                            const std::string& ice_pwd,
-                           const webrtc::WebRtcKeyValueConfig& field_trials)
+                           const webrtc::FieldTrialsView& field_trials)
       : PortAllocatorSession(content_name,
                              component,
                              ice_ufrag,
@@ -207,7 +207,7 @@
   uint32_t candidate_filter_ = CF_ALL;
   int transport_info_update_count_ = 0;
   bool running_ = false;
-  const webrtc::WebRtcKeyValueConfig& field_trials_;
+  const webrtc::FieldTrialsView& field_trials_;
 };
 
 class FakePortAllocator : public cricket::PortAllocator {
diff --git a/p2p/base/p2p_transport_channel.cc b/p2p/base/p2p_transport_channel.cc
index a8d84b9..1daec12 100644
--- a/p2p/base/p2p_transport_channel.cc
+++ b/p2p/base/p2p_transport_channel.cc
@@ -24,8 +24,8 @@
 #include "absl/strings/match.h"
 #include "api/async_dns_resolver.h"
 #include "api/candidate.h"
+#include "api/field_trials_view.h"
 #include "api/task_queue/queued_task.h"
-#include "api/webrtc_key_value_config.h"
 #include "logging/rtc_event_log/ice_logger.h"
 #include "p2p/base/basic_async_resolver_factory.h"
 #include "p2p/base/basic_ice_controller.h"
@@ -61,7 +61,7 @@
 }
 
 uint32_t GetWeakPingIntervalInFieldTrial(
-    const webrtc::WebRtcKeyValueConfig* field_trials) {
+    const webrtc::FieldTrialsView* field_trials) {
   if (field_trials != nullptr) {
     uint32_t weak_ping_interval =
         ::strtoul(field_trials->Lookup("WebRTC-StunInterPacketDelay").c_str(),
@@ -134,7 +134,7 @@
     const std::string& transport_name,
     int component,
     PortAllocator* allocator,
-    const webrtc::WebRtcKeyValueConfig* field_trials)
+    const webrtc::FieldTrialsView* field_trials)
     : P2PTransportChannel(transport_name,
                           component,
                           allocator,
@@ -154,7 +154,7 @@
         owned_dns_resolver_factory,
     webrtc::RtcEventLog* event_log,
     IceControllerFactoryInterface* ice_controller_factory,
-    const webrtc::WebRtcKeyValueConfig* field_trials)
+    const webrtc::FieldTrialsView* field_trials)
     : transport_name_(transport_name),
       component_(component),
       allocator_(allocator),
@@ -709,7 +709,7 @@
 }
 
 void P2PTransportChannel::ParseFieldTrials(
-    const webrtc::WebRtcKeyValueConfig* field_trials) {
+    const webrtc::FieldTrialsView* field_trials) {
   if (field_trials == nullptr) {
     return;
   }
diff --git a/p2p/base/p2p_transport_channel.h b/p2p/base/p2p_transport_channel.h
index 24c4b85..4f0ac02 100644
--- a/p2p/base/p2p_transport_channel.h
+++ b/p2p/base/p2p_transport_channel.h
@@ -111,11 +111,10 @@
 
   // For testing only.
   // TODO(zstein): Remove once AsyncDnsResolverFactory is required.
-  P2PTransportChannel(
-      const std::string& transport_name,
-      int component,
-      PortAllocator* allocator,
-      const webrtc::WebRtcKeyValueConfig* field_trials = nullptr);
+  P2PTransportChannel(const std::string& transport_name,
+                      int component,
+                      PortAllocator* allocator,
+                      const webrtc::FieldTrialsView* field_trials = nullptr);
 
   ~P2PTransportChannel() override;
 
@@ -248,7 +247,7 @@
           owned_dns_resolver_factory,
       webrtc::RtcEventLog* event_log,
       IceControllerFactoryInterface* ice_controller_factory,
-      const webrtc::WebRtcKeyValueConfig* field_trials);
+      const webrtc::FieldTrialsView* field_trials);
   bool IsGettingPorts() {
     RTC_DCHECK_RUN_ON(network_thread_);
     return allocator_session()->IsGettingPorts();
@@ -400,7 +399,7 @@
   int64_t ComputeEstimatedDisconnectedTimeMs(int64_t now,
                                              Connection* old_connection);
 
-  void ParseFieldTrials(const webrtc::WebRtcKeyValueConfig* field_trials);
+  void ParseFieldTrials(const webrtc::FieldTrialsView* field_trials);
 
   webrtc::ScopedTaskSafety task_safety_;
   std::string transport_name_ RTC_GUARDED_BY(network_thread_);
diff --git a/p2p/base/p2p_transport_channel_unittest.cc b/p2p/base/p2p_transport_channel_unittest.cc
index c69530b..04d4850 100644
--- a/p2p/base/p2p_transport_channel_unittest.cc
+++ b/p2p/base/p2p_transport_channel_unittest.cc
@@ -4929,7 +4929,7 @@
   P2PTransportChannel& StartTransportChannel(
       bool prioritize_most_likely_to_work,
       int stable_writable_connection_ping_interval,
-      const webrtc::WebRtcKeyValueConfig* field_trials = nullptr) {
+      const webrtc::FieldTrialsView* field_trials = nullptr) {
     channel_.reset(
         new P2PTransportChannel("checks", 1, allocator(), field_trials));
     IceConfig config = channel_->config();
diff --git a/p2p/base/port.cc b/p2p/base/port.cc
index 72f4efb..74db59d 100644
--- a/p2p/base/port.cc
+++ b/p2p/base/port.cc
@@ -111,7 +111,7 @@
            const rtc::Network* network,
            const std::string& username_fragment,
            const std::string& password,
-           const webrtc::WebRtcKeyValueConfig* field_trials)
+           const webrtc::FieldTrialsView* field_trials)
     : thread_(thread),
       factory_(factory),
       type_(type),
@@ -142,7 +142,7 @@
            uint16_t max_port,
            const std::string& username_fragment,
            const std::string& password,
-           const webrtc::WebRtcKeyValueConfig* field_trials)
+           const webrtc::FieldTrialsView* field_trials)
     : thread_(thread),
       factory_(factory),
       type_(type),
diff --git a/p2p/base/port.h b/p2p/base/port.h
index 343170f..747700c 100644
--- a/p2p/base/port.h
+++ b/p2p/base/port.h
@@ -20,11 +20,11 @@
 
 #include "absl/types/optional.h"
 #include "api/candidate.h"
+#include "api/field_trials_view.h"
 #include "api/packet_socket_factory.h"
 #include "api/rtc_error.h"
 #include "api/transport/field_trial_based_config.h"
 #include "api/transport/stun.h"
-#include "api/webrtc_key_value_config.h"
 #include "logging/rtc_event_log/events/rtc_event_ice_candidate_pair.h"
 #include "logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.h"
 #include "logging/rtc_event_log/ice_logger.h"
@@ -189,7 +189,7 @@
        const rtc::Network* network,
        const std::string& username_fragment,
        const std::string& password,
-       const webrtc::WebRtcKeyValueConfig* field_trials = nullptr);
+       const webrtc::FieldTrialsView* field_trials = nullptr);
   Port(rtc::Thread* thread,
        const std::string& type,
        rtc::PacketSocketFactory* factory,
@@ -198,7 +198,7 @@
        uint16_t max_port,
        const std::string& username_fragment,
        const std::string& password,
-       const webrtc::WebRtcKeyValueConfig* field_trials = nullptr);
+       const webrtc::FieldTrialsView* field_trials = nullptr);
   ~Port() override;
 
   // Note that the port type does NOT uniquely identify different subclasses of
@@ -499,7 +499,7 @@
       MdnsNameRegistrationStatus::kNotStarted;
 
   rtc::WeakPtrFactory<Port> weak_factory_;
-  webrtc::AlwaysValidPointer<const webrtc::WebRtcKeyValueConfig,
+  webrtc::AlwaysValidPointer<const webrtc::FieldTrialsView,
                              webrtc::FieldTrialBasedConfig>
       field_trials_;
 
diff --git a/p2p/base/stun_port.cc b/p2p/base/stun_port.cc
index 46052a0..1dfab8f 100644
--- a/p2p/base/stun_port.cc
+++ b/p2p/base/stun_port.cc
@@ -158,7 +158,7 @@
                  const std::string& username,
                  const std::string& password,
                  bool emit_local_for_anyaddress,
-                 const webrtc::WebRtcKeyValueConfig* field_trials)
+                 const webrtc::FieldTrialsView* field_trials)
     : Port(thread,
            LOCAL_PORT_TYPE,
            factory,
@@ -182,7 +182,7 @@
                  const std::string& username,
                  const std::string& password,
                  bool emit_local_for_anyaddress,
-                 const webrtc::WebRtcKeyValueConfig* field_trials)
+                 const webrtc::FieldTrialsView* field_trials)
     : Port(thread,
            LOCAL_PORT_TYPE,
            factory,
@@ -615,7 +615,7 @@
     const std::string& password,
     const ServerAddresses& servers,
     absl::optional<int> stun_keepalive_interval,
-    const webrtc::WebRtcKeyValueConfig* field_trials) {
+    const webrtc::FieldTrialsView* field_trials) {
   // Using `new` to access a non-public constructor.
   auto port = absl::WrapUnique(new StunPort(thread, factory, network, min_port,
                                             max_port, username, password,
@@ -635,7 +635,7 @@
                    const std::string& username,
                    const std::string& password,
                    const ServerAddresses& servers,
-                   const webrtc::WebRtcKeyValueConfig* field_trials)
+                   const webrtc::FieldTrialsView* field_trials)
     : UDPPort(thread,
               factory,
               network,
diff --git a/p2p/base/stun_port.h b/p2p/base/stun_port.h
index 485fca8..de40745 100644
--- a/p2p/base/stun_port.h
+++ b/p2p/base/stun_port.h
@@ -41,7 +41,7 @@
       const std::string& password,
       bool emit_local_for_anyaddress,
       absl::optional<int> stun_keepalive_interval,
-      const webrtc::WebRtcKeyValueConfig* field_trials = nullptr) {
+      const webrtc::FieldTrialsView* field_trials = nullptr) {
     // Using `new` to access a non-public constructor.
     auto port = absl::WrapUnique(
         new UDPPort(thread, factory, network, socket, username, password,
@@ -63,7 +63,7 @@
       const std::string& password,
       bool emit_local_for_anyaddress,
       absl::optional<int> stun_keepalive_interval,
-      const webrtc::WebRtcKeyValueConfig* field_trials = nullptr) {
+      const webrtc::FieldTrialsView* field_trials = nullptr) {
     // Using `new` to access a non-public constructor.
     auto port = absl::WrapUnique(
         new UDPPort(thread, factory, network, min_port, max_port, username,
@@ -127,7 +127,7 @@
           const std::string& username,
           const std::string& password,
           bool emit_local_for_anyaddress,
-          const webrtc::WebRtcKeyValueConfig* field_trials);
+          const webrtc::FieldTrialsView* field_trials);
 
   UDPPort(rtc::Thread* thread,
           rtc::PacketSocketFactory* factory,
@@ -136,7 +136,7 @@
           const std::string& username,
           const std::string& password,
           bool emit_local_for_anyaddress,
-          const webrtc::WebRtcKeyValueConfig* field_trials);
+          const webrtc::FieldTrialsView* field_trials);
 
   bool Init();
 
@@ -275,7 +275,7 @@
       const std::string& password,
       const ServerAddresses& servers,
       absl::optional<int> stun_keepalive_interval,
-      const webrtc::WebRtcKeyValueConfig* field_trials);
+      const webrtc::FieldTrialsView* field_trials);
 
   void PrepareAddress() override;
 
@@ -288,7 +288,7 @@
            const std::string& username,
            const std::string& password,
            const ServerAddresses& servers,
-           const webrtc::WebRtcKeyValueConfig* field_trials);
+           const webrtc::FieldTrialsView* field_trials);
 };
 
 }  // namespace cricket
diff --git a/p2p/base/tcp_port.cc b/p2p/base/tcp_port.cc
index 8278ef0..1bbc9e9 100644
--- a/p2p/base/tcp_port.cc
+++ b/p2p/base/tcp_port.cc
@@ -92,7 +92,7 @@
                  const std::string& username,
                  const std::string& password,
                  bool allow_listen,
-                 const webrtc::WebRtcKeyValueConfig* field_trials)
+                 const webrtc::FieldTrialsView* field_trials)
     : Port(thread,
            LOCAL_PORT_TYPE,
            factory,
diff --git a/p2p/base/tcp_port.h b/p2p/base/tcp_port.h
index 80e9a83..969d43c 100644
--- a/p2p/base/tcp_port.h
+++ b/p2p/base/tcp_port.h
@@ -43,7 +43,7 @@
       const std::string& username,
       const std::string& password,
       bool allow_listen,
-      const webrtc::WebRtcKeyValueConfig* field_trials = nullptr) {
+      const webrtc::FieldTrialsView* field_trials = nullptr) {
     // Using `new` to access a non-public constructor.
     return absl::WrapUnique(new TCPPort(thread, factory, network, min_port,
                                         max_port, username, password,
@@ -74,7 +74,7 @@
           const std::string& username,
           const std::string& password,
           bool allow_listen,
-          const webrtc::WebRtcKeyValueConfig* field_trials);
+          const webrtc::FieldTrialsView* field_trials);
 
   // Handles sending using the local TCP socket.
   int SendTo(const void* data,
diff --git a/p2p/base/transport_description_factory.cc b/p2p/base/transport_description_factory.cc
index 18c4a28..7eb21da 100644
--- a/p2p/base/transport_description_factory.cc
+++ b/p2p/base/transport_description_factory.cc
@@ -22,7 +22,7 @@
 namespace cricket {
 
 TransportDescriptionFactory::TransportDescriptionFactory(
-    const webrtc::WebRtcKeyValueConfig& field_trials)
+    const webrtc::FieldTrialsView& field_trials)
     : secure_(SEC_DISABLED), field_trials_(field_trials) {}
 
 TransportDescriptionFactory::~TransportDescriptionFactory() = default;
diff --git a/p2p/base/transport_description_factory.h b/p2p/base/transport_description_factory.h
index 46f1c2f..b4d8822 100644
--- a/p2p/base/transport_description_factory.h
+++ b/p2p/base/transport_description_factory.h
@@ -13,7 +13,7 @@
 
 #include <memory>
 
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "p2p/base/ice_credentials_iterator.h"
 #include "p2p/base/transport_description.h"
 #include "rtc_base/rtc_certificate.h"
@@ -39,7 +39,7 @@
  public:
   // Default ctor; use methods below to set configuration.
   explicit TransportDescriptionFactory(
-      const webrtc::WebRtcKeyValueConfig& field_trials);
+      const webrtc::FieldTrialsView& field_trials);
   ~TransportDescriptionFactory();
 
   SecurePolicy secure() const { return secure_; }
@@ -75,7 +75,7 @@
       const TransportDescription* current_description,
       IceCredentialsIterator* ice_credentials) const;
 
-  const webrtc::WebRtcKeyValueConfig& trials() const { return field_trials_; }
+  const webrtc::FieldTrialsView& trials() const { return field_trials_; }
 
  private:
   bool SetSecurityInfo(TransportDescription* description,
@@ -83,7 +83,7 @@
 
   SecurePolicy secure_;
   rtc::scoped_refptr<rtc::RTCCertificate> certificate_;
-  const webrtc::WebRtcKeyValueConfig& field_trials_;
+  const webrtc::FieldTrialsView& field_trials_;
 };
 
 }  // namespace cricket
diff --git a/p2p/base/turn_port.cc b/p2p/base/turn_port.cc
index d984b6c..ddf63fa 100644
--- a/p2p/base/turn_port.cc
+++ b/p2p/base/turn_port.cc
@@ -226,7 +226,7 @@
                    const std::vector<std::string>& tls_elliptic_curves,
                    webrtc::TurnCustomizer* customizer,
                    rtc::SSLCertificateVerifier* tls_cert_verifier,
-                   const webrtc::WebRtcKeyValueConfig* field_trials)
+                   const webrtc::FieldTrialsView* field_trials)
     : Port(thread,
            RELAY_PORT_TYPE,
            factory,
@@ -266,7 +266,7 @@
                    const std::vector<std::string>& tls_elliptic_curves,
                    webrtc::TurnCustomizer* customizer,
                    rtc::SSLCertificateVerifier* tls_cert_verifier,
-                   const webrtc::WebRtcKeyValueConfig* field_trials)
+                   const webrtc::FieldTrialsView* field_trials)
     : Port(thread,
            RELAY_PORT_TYPE,
            factory,
@@ -945,9 +945,8 @@
 }
 
 // static
-bool TurnPort::AllowedTurnPort(
-    int port,
-    const webrtc::WebRtcKeyValueConfig* field_trials) {
+bool TurnPort::AllowedTurnPort(int port,
+                               const webrtc::FieldTrialsView* field_trials) {
   // Port 53, 80 and 443 are used for existing deployments.
   // Ports above 1024 are assumed to be OK to use.
   if (port == 53 || port == 80 || port == 443 || port >= 1024) {
diff --git a/p2p/base/turn_port.h b/p2p/base/turn_port.h
index 89e6bd6..fa76695 100644
--- a/p2p/base/turn_port.h
+++ b/p2p/base/turn_port.h
@@ -216,7 +216,7 @@
            const std::vector<std::string>& tls_elliptic_curves,
            webrtc::TurnCustomizer* customizer,
            rtc::SSLCertificateVerifier* tls_cert_verifier = nullptr,
-           const webrtc::WebRtcKeyValueConfig* field_trials = nullptr);
+           const webrtc::FieldTrialsView* field_trials = nullptr);
 
   TurnPort(rtc::Thread* thread,
            rtc::PacketSocketFactory* factory,
@@ -232,7 +232,7 @@
            const std::vector<std::string>& tls_elliptic_curves,
            webrtc::TurnCustomizer* customizer,
            rtc::SSLCertificateVerifier* tls_cert_verifier = nullptr,
-           const webrtc::WebRtcKeyValueConfig* field_trials = nullptr);
+           const webrtc::FieldTrialsView* field_trials = nullptr);
 
   // NOTE: This method needs to be accessible for StunPort
   // return true if entry was created (i.e channel_number consumed).
@@ -258,7 +258,7 @@
   typedef std::set<rtc::SocketAddress> AttemptedServerSet;
 
   static bool AllowedTurnPort(int port,
-                              const webrtc::WebRtcKeyValueConfig* field_trials);
+                              const webrtc::FieldTrialsView* field_trials);
   void OnMessage(rtc::Message* pmsg) override;
 
   bool CreateTurnClientSocket();
@@ -364,7 +364,7 @@
   // must outlive the TurnPort's lifetime.
   webrtc::TurnCustomizer* turn_customizer_ = nullptr;
 
-  const webrtc::WebRtcKeyValueConfig* field_trials_;
+  const webrtc::FieldTrialsView* field_trials_;
 
   // Optional TurnLoggingId.
   // An identifier set by application that is added to TURN_ALLOCATE_REQUEST
diff --git a/p2p/client/basic_port_allocator.cc b/p2p/client/basic_port_allocator.cc
index 10d855c..8b4bf57 100644
--- a/p2p/client/basic_port_allocator.cc
+++ b/p2p/client/basic_port_allocator.cc
@@ -253,9 +253,8 @@
                    turn_port_prune_policy(), turn_customizer());
 }
 
-void BasicPortAllocator::Init(
-    RelayPortFactoryInterface* relay_port_factory,
-    const webrtc::WebRtcKeyValueConfig* field_trials) {
+void BasicPortAllocator::Init(RelayPortFactoryInterface* relay_port_factory,
+                              const webrtc::FieldTrialsView* field_trials) {
   if (relay_port_factory != nullptr) {
     relay_port_factory_ = relay_port_factory;
   } else {
@@ -1686,7 +1685,7 @@
     const ServerAddresses& stun_servers,
     const std::string& username,
     const std::string& password,
-    const webrtc::WebRtcKeyValueConfig* field_trials)
+    const webrtc::FieldTrialsView* field_trials)
     : stun_servers(stun_servers), username(username), password(password) {
   if (!stun_servers.empty())
     stun_address = *(stun_servers.begin());
diff --git a/p2p/client/basic_port_allocator.h b/p2p/client/basic_port_allocator.h
index 6d650f5..01d07e7 100644
--- a/p2p/client/basic_port_allocator.h
+++ b/p2p/client/basic_port_allocator.h
@@ -15,8 +15,8 @@
 #include <string>
 #include <vector>
 
+#include "api/field_trials_view.h"
 #include "api/turn_customizer.h"
-#include "api/webrtc_key_value_config.h"
 #include "p2p/base/port_allocator.h"
 #include "p2p/client/relay_port_factory_interface.h"
 #include "p2p/client/turn_port_factory.h"
@@ -81,9 +81,7 @@
 
   void SetVpnList(const std::vector<rtc::NetworkMask>& vpn_list) override;
 
-  const webrtc::WebRtcKeyValueConfig* field_trials() const {
-    return field_trials_;
-  }
+  const webrtc::FieldTrialsView* field_trials() const { return field_trials_; }
 
  private:
   void OnIceRegathering(PortAllocatorSession* session,
@@ -92,12 +90,12 @@
   // This function makes sure that relay_port_factory_ and field_trials_ is set
   // properly.
   void Init(RelayPortFactoryInterface* relay_port_factory,
-            const webrtc::WebRtcKeyValueConfig* field_trials);
+            const webrtc::FieldTrialsView* field_trials);
 
   bool MdnsObfuscationEnabled() const override;
 
-  const webrtc::WebRtcKeyValueConfig* field_trials_;
-  std::unique_ptr<webrtc::WebRtcKeyValueConfig> owned_field_trials_;
+  const webrtc::FieldTrialsView* field_trials_;
+  std::unique_ptr<webrtc::FieldTrialsView> owned_field_trials_;
   rtc::NetworkManager* network_manager_;
   rtc::PacketSocketFactory* socket_factory_;
   int network_ignore_mask_ = rtc::kDefaultNetworkIgnoreMask;
@@ -310,7 +308,7 @@
   PortConfiguration(const ServerAddresses& stun_servers,
                     const std::string& username,
                     const std::string& password,
-                    const webrtc::WebRtcKeyValueConfig* field_trials = nullptr);
+                    const webrtc::FieldTrialsView* field_trials = nullptr);
 
   // Returns addresses of both the explicitly configured STUN servers,
   // and TURN servers that should be used as STUN servers.
diff --git a/p2p/client/relay_port_factory_interface.h b/p2p/client/relay_port_factory_interface.h
index 7d63fac..4eec5db 100644
--- a/p2p/client/relay_port_factory_interface.h
+++ b/p2p/client/relay_port_factory_interface.h
@@ -26,7 +26,7 @@
 
 namespace webrtc {
 class TurnCustomizer;
-class WebRtcKeyValueConfig;
+class FieldTrialsView;
 }  // namespace webrtc
 
 namespace cricket {
@@ -44,7 +44,7 @@
   std::string username;
   std::string password;
   webrtc::TurnCustomizer* turn_customizer = nullptr;
-  const webrtc::WebRtcKeyValueConfig* field_trials = nullptr;
+  const webrtc::FieldTrialsView* field_trials = nullptr;
 };
 
 // A factory for creating RelayPort's.
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
index 0ba0c68..792f0d3 100644
--- a/pc/BUILD.gn
+++ b/pc/BUILD.gn
@@ -379,10 +379,10 @@
     ":session_description",
     ":simulcast_description",
     ":used_ids",
+    "../api:field_trials_view",
     "../api:libjingle_peerconnection_api",
     "../api:rtp_parameters",
     "../api:rtp_transceiver_direction",
-    "../api:webrtc_key_value_config",
     "../api/crypto:options",
     "../media:rtc_data_sctp_transport_internal",
     "../media:rtc_media_base",
@@ -610,9 +610,9 @@
   deps = [
     ":external_hmac",
     "../api:array_view",
+    "../api:field_trials_view",
     "../api:scoped_refptr",
     "../api:sequence_checker",
-    "../api:webrtc_key_value_config",
     "../modules/rtp_rtcp:rtp_rtcp_format",
     "../rtc_base",
     "../rtc_base:checks",
@@ -635,9 +635,9 @@
   deps = [
     ":rtp_transport",
     ":srtp_session",
+    "../api:field_trials_view",
     "../api:libjingle_peerconnection_api",
     "../api:rtc_error",
-    "../api:webrtc_key_value_config",
     "../media:rtc_media_base",
     "../modules/rtp_rtcp:rtp_rtcp_format",
     "../p2p:rtc_p2p",
@@ -812,6 +812,7 @@
     "../api:call_api",
     "../api:callfactory_api",
     "../api:fec_controller_api",
+    "../api:field_trials_view",
     "../api:frame_transformer_interface",
     "../api:ice_transport_factory",
     "../api:libjingle_logging_api",
@@ -840,7 +841,6 @@
     "../api/transport:field_trial_based_config",
     "../api/transport:network_control",
     "../api/transport:sctp_transport_factory_interface",
-    "../api/transport:webrtc_key_value_config",
     "../api/units:data_rate",
     "../api/video:builtin_video_bitrate_allocator_factory",
     "../api/video:video_bitrate_allocator_factory",
@@ -952,6 +952,7 @@
     ":channel_manager",
     ":rtc_pc_base",
     "../api:callfactory_api",
+    "../api:field_trials_view",
     "../api:libjingle_peerconnection_api",
     "../api:media_stream_interface",
     "../api:refcountedbase",
@@ -960,7 +961,6 @@
     "../api/neteq:neteq_api",
     "../api/transport:field_trial_based_config",
     "../api/transport:sctp_transport_factory_interface",
-    "../api/transport:webrtc_key_value_config",
     "../media:rtc_data_sctp_transport_factory",
     "../media:rtc_media_base",
     "../p2p:rtc_p2p",
@@ -1228,6 +1228,8 @@
     ":usage_pattern",
     ":webrtc_session_description_factory",
     "../api:async_dns_resolver",
+    "../api:field_trials_view",
+    "../api:field_trials_view",
     "../api:libjingle_logging_api",
     "../api:libjingle_peerconnection_api",
     "../api:media_stream_interface",
@@ -1238,14 +1240,12 @@
     "../api:rtp_transceiver_direction",
     "../api:scoped_refptr",
     "../api:sequence_checker",
-    "../api:webrtc_key_value_config",
     "../api/adaptation:resource_adaptation_api",
     "../api/crypto:options",
     "../api/rtc_event_log:rtc_event_log",
     "../api/transport:bitrate_settings",
     "../api/transport:datagram_transport_interface",
     "../api/transport:enums",
-    "../api/transport:webrtc_key_value_config",
     "../api/video:video_bitrate_allocator_factory",
     "../api/video:video_codec_constants",
     "../call:call_interfaces",
@@ -1330,12 +1330,12 @@
     ":rtp_transceiver",
     ":stats_collector_interface",
     ":transport_stats",
+    "../api:field_trials_view",
     "../api:libjingle_peerconnection_api",
     "../api:media_stream_interface",
     "../api:rtp_parameters",
     "../api:scoped_refptr",
     "../api:sequence_checker",
-    "../api:webrtc_key_value_config",
     "../api/audio_codecs:audio_codecs_api",
     "../api/video:video_rtp_headers",
     "../call:call_interfaces",
@@ -1505,6 +1505,7 @@
     "../api:audio_options_api",
     "../api:callfactory_api",
     "../api:fec_controller_api",
+    "../api:field_trials_view",
     "../api:libjingle_peerconnection_api",
     "../api:media_stream_interface",
     "../api:network_state_predictor_api",
@@ -1520,7 +1521,6 @@
     "../api/transport:bitrate_settings",
     "../api/transport:network_control",
     "../api/transport:sctp_transport_factory_interface",
-    "../api/transport:webrtc_key_value_config",
     "../api/units:data_rate",
     "../call:call_interfaces",
     "../call:rtp_interfaces",
@@ -2333,6 +2333,8 @@
       "../api:create_peerconnection_factory",
       "../api:fake_frame_decryptor",
       "../api:fake_frame_encryptor",
+      "../api:field_trials_view",
+      "../api:field_trials_view",
       "../api:function_view",
       "../api:libjingle_logging_api",
       "../api:libjingle_peerconnection_api",
@@ -2344,7 +2346,6 @@
       "../api:rtc_error",
       "../api:rtp_transceiver_direction",
       "../api:scoped_refptr",
-      "../api:webrtc_key_value_config",
       "../api/adaptation:resource_adaptation_api",
       "../api/audio:audio_mixer_api",
       "../api/crypto:frame_decryptor_interface",
@@ -2357,7 +2358,6 @@
       "../api/transport:datagram_transport_interface",
       "../api/transport:field_trial_based_config",
       "../api/transport:sctp_transport_factory_interface",
-      "../api/transport:webrtc_key_value_config",
       "../api/transport/rtp:rtp_source",
       "../api/units:time_delta",
       "../api/units:timestamp",
@@ -2516,6 +2516,7 @@
       "../api:create_peerconnection_factory",
       "../api:fake_frame_decryptor",
       "../api:fake_frame_encryptor",
+      "../api:field_trials_view",
       "../api:function_view",
       "../api:libjingle_logging_api",
       "../api:libjingle_peerconnection_api",
@@ -2536,7 +2537,6 @@
       "../api/task_queue",
       "../api/task_queue:default_task_queue_factory",
       "../api/transport:field_trial_based_config",
-      "../api/transport:webrtc_key_value_config",
       "../api/transport/rtp:rtp_source",
       "../api/units:time_delta",
       "../api/video:builtin_video_bitrate_allocator_factory",
@@ -2632,18 +2632,18 @@
       "../api:audio_options_api",
       "../api:create_frame_generator",
       "../api:create_peerconnection_factory",
+      "../api:field_trials_view",
+      "../api:field_trials_view",
       "../api:libjingle_peerconnection_api",
       "../api:media_stream_interface",
       "../api:rtc_error",
       "../api:rtc_stats_api",
       "../api:scoped_refptr",
       "../api:sequence_checker",
-      "../api:webrtc_key_value_config",
       "../api/audio:audio_mixer_api",
       "../api/audio_codecs:audio_codecs_api",
       "../api/task_queue",
       "../api/task_queue:default_task_queue_factory",
-      "../api/transport:webrtc_key_value_config",
       "../api/video:builtin_video_bitrate_allocator_factory",
       "../api/video:video_frame",
       "../api/video:video_rtp_headers",
diff --git a/pc/connection_context.cc b/pc/connection_context.cc
index 84a0dd3..ae02261 100644
--- a/pc/connection_context.cc
+++ b/pc/connection_context.cc
@@ -74,7 +74,7 @@
 std::unique_ptr<SctpTransportFactoryInterface> MaybeCreateSctpFactory(
     std::unique_ptr<SctpTransportFactoryInterface> factory,
     rtc::Thread* network_thread,
-    const WebRtcKeyValueConfig& field_trials) {
+    const FieldTrialsView& field_trials) {
   if (factory) {
     return factory;
   }
diff --git a/pc/connection_context.h b/pc/connection_context.h
index 05f838f..3b8ac07 100644
--- a/pc/connection_context.h
+++ b/pc/connection_context.h
@@ -15,13 +15,13 @@
 #include <string>
 
 #include "api/call/call_factory_interface.h"
+#include "api/field_trials_view.h"
 #include "api/media_stream_interface.h"
 #include "api/peer_connection_interface.h"
 #include "api/ref_counted_base.h"
 #include "api/scoped_refptr.h"
 #include "api/sequence_checker.h"
 #include "api/transport/sctp_transport_factory_interface.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "media/base/media_engine.h"
 #include "p2p/base/basic_packet_socket_factory.h"
 #include "pc/channel_manager.h"
@@ -75,7 +75,7 @@
   rtc::Thread* network_thread() { return network_thread_; }
   const rtc::Thread* network_thread() const { return network_thread_; }
 
-  const WebRtcKeyValueConfig& trials() const { return *trials_.get(); }
+  const FieldTrialsView& trials() const { return *trials_.get(); }
 
   // Accessors only used from the PeerConnectionFactory class
   rtc::BasicNetworkManager* default_network_manager() {
@@ -114,7 +114,7 @@
   rtc::Thread* const signaling_thread_;
 
   // Accessed both on signaling thread and worker thread.
-  std::unique_ptr<WebRtcKeyValueConfig> const trials_;
+  std::unique_ptr<FieldTrialsView> const trials_;
 
   // channel_manager is accessed both on signaling thread and worker thread.
   std::unique_ptr<cricket::ChannelManager> channel_manager_;
diff --git a/pc/dtls_srtp_transport.cc b/pc/dtls_srtp_transport.cc
index 9ec14f5..28de50b 100644
--- a/pc/dtls_srtp_transport.cc
+++ b/pc/dtls_srtp_transport.cc
@@ -28,7 +28,7 @@
 namespace webrtc {
 
 DtlsSrtpTransport::DtlsSrtpTransport(bool rtcp_mux_enabled,
-                                     const WebRtcKeyValueConfig& field_trials)
+                                     const FieldTrialsView& field_trials)
     : SrtpTransport(rtcp_mux_enabled, field_trials) {}
 
 void DtlsSrtpTransport::SetDtlsTransports(
diff --git a/pc/dtls_srtp_transport.h b/pc/dtls_srtp_transport.h
index 2ee6e02..7958210 100644
--- a/pc/dtls_srtp_transport.h
+++ b/pc/dtls_srtp_transport.h
@@ -32,8 +32,7 @@
 // configures the SrtpSessions in the base class.
 class DtlsSrtpTransport : public SrtpTransport {
  public:
-  DtlsSrtpTransport(bool rtcp_mux_enabled,
-                    const WebRtcKeyValueConfig& field_trials);
+  DtlsSrtpTransport(bool rtcp_mux_enabled, const FieldTrialsView& field_trials);
 
   // Set P2P layer RTP/RTCP DtlsTransports. When using RTCP-muxing,
   // `rtcp_dtls_transport` is null.
diff --git a/pc/jsep_transport_controller.h b/pc/jsep_transport_controller.h
index 44d5981..e79ab05 100644
--- a/pc/jsep_transport_controller.h
+++ b/pc/jsep_transport_controller.h
@@ -139,7 +139,7 @@
     std::function<void(rtc::SSLHandshakeError)> on_dtls_handshake_error_;
 
     // Field trials.
-    const webrtc::WebRtcKeyValueConfig* field_trials;
+    const webrtc::FieldTrialsView* field_trials;
   };
 
   // The ICE related events are fired on the `network_thread`.
diff --git a/pc/media_session.cc b/pc/media_session.cc
index 2ab661c..71a6d0a 100644
--- a/pc/media_session.cc
+++ b/pc/media_session.cc
@@ -301,7 +301,7 @@
     bool include_rtx_streams,
     bool include_flexfec_stream,
     UniqueRandomIdGenerator* ssrc_generator,
-    const webrtc::WebRtcKeyValueConfig& field_trials) {
+    const webrtc::FieldTrialsView& field_trials) {
   StreamParams result;
   result.id = sender.track_id;
 
@@ -400,7 +400,7 @@
                             UniqueRandomIdGenerator* ssrc_generator,
                             StreamParamsVec* current_streams,
                             MediaContentDescriptionImpl<C>* content_description,
-                            const webrtc::WebRtcKeyValueConfig& field_trials) {
+                            const webrtc::FieldTrialsView& field_trials) {
   // SCTP streams are not negotiated using SDP/ContentDescriptions.
   if (IsSctpProtocol(content_description->protocol())) {
     return true;
@@ -711,7 +711,7 @@
     UniqueRandomIdGenerator* ssrc_generator,
     StreamParamsVec* current_streams,
     MediaContentDescriptionImpl<C>* offer,
-    const webrtc::WebRtcKeyValueConfig& field_trials) {
+    const webrtc::FieldTrialsView& field_trials) {
   offer->AddCodecs(codecs);
   if (!AddStreamParams(media_description_options.sender_options,
                        session_options.rtcp_cname, ssrc_generator,
@@ -726,12 +726,11 @@
 }
 
 template <class C>
-static bool ReferencedCodecsMatch(
-    const std::vector<C>& codecs1,
-    const int codec1_id,
-    const std::vector<C>& codecs2,
-    const int codec2_id,
-    const webrtc::WebRtcKeyValueConfig* field_trials) {
+static bool ReferencedCodecsMatch(const std::vector<C>& codecs1,
+                                  const int codec1_id,
+                                  const std::vector<C>& codecs2,
+                                  const int codec2_id,
+                                  const webrtc::FieldTrialsView* field_trials) {
   const C* codec1 = FindCodecById(codecs1, codec1_id);
   const C* codec2 = FindCodecById(codecs2, codec2_id);
   return codec1 != nullptr && codec2 != nullptr &&
@@ -756,7 +755,7 @@
                             const std::vector<C>& offered_codecs,
                             std::vector<C>* negotiated_codecs,
                             bool keep_offer_order,
-                            const webrtc::WebRtcKeyValueConfig* field_trials) {
+                            const webrtc::FieldTrialsView* field_trials) {
   for (const C& ours : local_codecs) {
     C theirs;
     // Note that we intentionally only find one matching codec for each of our
@@ -815,12 +814,11 @@
 // a member of `codecs1`. If `codec_to_match` is an RED or RTX codec, both
 // the codecs themselves and their associated codecs must match.
 template <class C>
-static bool FindMatchingCodec(
-    const std::vector<C>& codecs1,
-    const std::vector<C>& codecs2,
-    const C& codec_to_match,
-    C* found_codec,
-    const webrtc::WebRtcKeyValueConfig* field_trials) {
+static bool FindMatchingCodec(const std::vector<C>& codecs1,
+                              const std::vector<C>& codecs2,
+                              const C& codec_to_match,
+                              C* found_codec,
+                              const webrtc::FieldTrialsView* field_trials) {
   // `codec_to_match` should be a member of `codecs1`, in order to look up
   // RED/RTX codecs' associated codecs correctly. If not, that's a programming
   // error.
@@ -975,7 +973,7 @@
 static void MergeCodecs(const std::vector<C>& reference_codecs,
                         std::vector<C>* offered_codecs,
                         UsedPayloadTypes* used_pltypes,
-                        const webrtc::WebRtcKeyValueConfig* field_trials) {
+                        const webrtc::FieldTrialsView* field_trials) {
   // Add all new codecs that are not RTX/RED codecs.
   // The two-pass splitting of the loops means preferring payload types
   // of actual codecs with respect to collisions.
@@ -1050,7 +1048,7 @@
     const std::vector<webrtc::RtpCodecCapability>& codec_preferences,
     const Codecs& codecs,
     const Codecs& supported_codecs,
-    const webrtc::WebRtcKeyValueConfig* field_trials) {
+    const webrtc::FieldTrialsView* field_trials) {
   Codecs filtered_codecs;
   bool want_rtx = false;
   bool want_red = false;
@@ -1122,10 +1120,9 @@
 
 // Compute the union of `codecs1` and `codecs2`.
 template <class C>
-std::vector<C> ComputeCodecsUnion(
-    const std::vector<C>& codecs1,
-    const std::vector<C>& codecs2,
-    const webrtc::WebRtcKeyValueConfig* field_trials) {
+std::vector<C> ComputeCodecsUnion(const std::vector<C>& codecs1,
+                                  const std::vector<C>& codecs2,
+                                  const webrtc::FieldTrialsView* field_trials) {
   std::vector<C> all_codecs;
   UsedPayloadTypes used_payload_types;
   for (const C& codec : codecs1) {
@@ -1365,7 +1362,7 @@
     UniqueRandomIdGenerator* ssrc_generator,
     StreamParamsVec* current_streams,
     MediaContentDescriptionImpl<C>* answer,
-    const webrtc::WebRtcKeyValueConfig& field_trials) {
+    const webrtc::FieldTrialsView& field_trials) {
   std::vector<C> negotiated_codecs;
   NegotiateCodecs(local_codecs, offer->codecs(), &negotiated_codecs,
                   media_description_options.codec_preferences.empty(),
@@ -2054,7 +2051,7 @@
     AudioCodecs* audio_codecs,
     VideoCodecs* video_codecs,
     UsedPayloadTypes* used_pltypes,
-    const webrtc::WebRtcKeyValueConfig* field_trials) {
+    const webrtc::FieldTrialsView* field_trials) {
   for (const ContentInfo* content : current_active_contents) {
     if (IsMediaContentOfType(content, MEDIA_TYPE_AUDIO)) {
       const AudioContentDescription* audio =
@@ -2080,7 +2077,7 @@
     const std::vector<const ContentInfo*>& current_active_contents,
     AudioCodecs* audio_codecs,
     VideoCodecs* video_codecs) const {
-  const webrtc::WebRtcKeyValueConfig* field_trials =
+  const webrtc::FieldTrialsView* field_trials =
       &transport_desc_factory_->trials();
   // First - get all codecs from the current description if the media type
   // is used. Add them to `used_pltypes` so the payload type is not reused if a
@@ -2108,7 +2105,7 @@
     const SessionDescription& remote_offer,
     AudioCodecs* audio_codecs,
     VideoCodecs* video_codecs) const {
-  const webrtc::WebRtcKeyValueConfig* field_trials =
+  const webrtc::FieldTrialsView* field_trials =
       &transport_desc_factory_->trials();
   // First - get all codecs from the current description if the media type
   // is used. Add them to `used_pltypes` so the payload type is not reused if a
@@ -2297,7 +2294,7 @@
     StreamParamsVec* current_streams,
     SessionDescription* desc,
     IceCredentialsIterator* ice_credentials) const {
-  const webrtc::WebRtcKeyValueConfig* field_trials =
+  const webrtc::FieldTrialsView* field_trials =
       &transport_desc_factory_->trials();
   // Filter audio_codecs (which includes all codecs, with correctly remapped
   // payload types) based on transceiver direction.
@@ -2390,7 +2387,7 @@
     StreamParamsVec* current_streams,
     SessionDescription* desc,
     IceCredentialsIterator* ice_credentials) const {
-  const webrtc::WebRtcKeyValueConfig* field_trials =
+  const webrtc::FieldTrialsView* field_trials =
       &transport_desc_factory_->trials();
   // Filter video_codecs (which includes all codecs, with correctly remapped
   // payload types) based on transceiver direction.
@@ -2587,7 +2584,7 @@
     StreamParamsVec* current_streams,
     SessionDescription* answer,
     IceCredentialsIterator* ice_credentials) const {
-  const webrtc::WebRtcKeyValueConfig* field_trials =
+  const webrtc::FieldTrialsView* field_trials =
       &transport_desc_factory_->trials();
   RTC_CHECK(IsMediaContentOfType(offer_content, MEDIA_TYPE_AUDIO));
   const AudioContentDescription* offer_audio_description =
@@ -2706,7 +2703,7 @@
     StreamParamsVec* current_streams,
     SessionDescription* answer,
     IceCredentialsIterator* ice_credentials) const {
-  const webrtc::WebRtcKeyValueConfig* field_trials =
+  const webrtc::FieldTrialsView* field_trials =
       &transport_desc_factory_->trials();
   RTC_CHECK(IsMediaContentOfType(offer_content, MEDIA_TYPE_VIDEO));
   const VideoContentDescription* offer_video_description =
@@ -2932,7 +2929,7 @@
 }
 
 void MediaSessionDescriptionFactory::ComputeAudioCodecsIntersectionAndUnion() {
-  const webrtc::WebRtcKeyValueConfig* field_trials =
+  const webrtc::FieldTrialsView* field_trials =
       &transport_desc_factory_->trials();
   audio_sendrecv_codecs_.clear();
   all_audio_codecs_.clear();
@@ -2962,7 +2959,7 @@
 }
 
 void MediaSessionDescriptionFactory::ComputeVideoCodecsIntersectionAndUnion() {
-  const webrtc::WebRtcKeyValueConfig* field_trials =
+  const webrtc::FieldTrialsView* field_trials =
       &transport_desc_factory_->trials();
   video_sendrecv_codecs_.clear();
 
diff --git a/pc/media_session.h b/pc/media_session.h
index d6c7474..9a67ad1 100644
--- a/pc/media_session.h
+++ b/pc/media_session.h
@@ -19,10 +19,10 @@
 #include <vector>
 
 #include "api/crypto/crypto_options.h"
+#include "api/field_trials_view.h"
 #include "api/media_types.h"
 #include "api/rtp_parameters.h"
 #include "api/rtp_transceiver_direction.h"
-#include "api/webrtc_key_value_config.h"
 #include "media/base/media_constants.h"
 #include "media/base/rid_description.h"
 #include "media/base/stream_params.h"
diff --git a/pc/media_session_unittest.cc b/pc/media_session_unittest.cc
index 9d01e07..3ca6c85 100644
--- a/pc/media_session_unittest.cc
+++ b/pc/media_session_unittest.cc
@@ -4455,7 +4455,7 @@
 template <class Codec>
 bool CodecsMatch(const std::vector<Codec>& codecs1,
                  const std::vector<Codec>& codecs2,
-                 const webrtc::WebRtcKeyValueConfig* field_trials) {
+                 const webrtc::FieldTrialsView* field_trials) {
   if (codecs1.size() != codecs2.size()) {
     return false;
   }
diff --git a/pc/peer_connection.h b/pc/peer_connection.h
index 95bdfba..6ada0c0 100644
--- a/pc/peer_connection.h
+++ b/pc/peer_connection.h
@@ -27,6 +27,7 @@
 #include "api/crypto/crypto_options.h"
 #include "api/data_channel_interface.h"
 #include "api/dtls_transport_interface.h"
+#include "api/field_trials_view.h"
 #include "api/ice_transport_interface.h"
 #include "api/jsep.h"
 #include "api/media_stream_interface.h"
@@ -48,7 +49,6 @@
 #include "api/transport/data_channel_transport_interface.h"
 #include "api/transport/enums.h"
 #include "api/turn_customizer.h"
-#include "api/webrtc_key_value_config.h"
 #include "call/call.h"
 #include "p2p/base/ice_transport_internal.h"
 #include "p2p/base/port.h"
@@ -437,7 +437,7 @@
   }
   void RequestUsagePatternReportForTesting();
 
-  const WebRtcKeyValueConfig& trials() override { return context_->trials(); }
+  const FieldTrialsView& trials() override { return context_->trials(); }
 
  protected:
   // Available for rtc::scoped_refptr creation
diff --git a/pc/peer_connection_factory.h b/pc/peer_connection_factory.h
index f09ca66..4ee102a 100644
--- a/pc/peer_connection_factory.h
+++ b/pc/peer_connection_factory.h
@@ -21,6 +21,7 @@
 #include "absl/strings/string_view.h"
 #include "api/audio_options.h"
 #include "api/fec_controller.h"
+#include "api/field_trials_view.h"
 #include "api/media_stream_interface.h"
 #include "api/media_types.h"
 #include "api/metronome/metronome.h"
@@ -36,7 +37,6 @@
 #include "api/task_queue/task_queue_factory.h"
 #include "api/transport/network_control.h"
 #include "api/transport/sctp_transport_factory_interface.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "call/call.h"
 #include "call/rtp_transport_controller_send_factory_interface.h"
 #include "p2p/base/port_allocator.h"
@@ -115,7 +115,7 @@
     return options_;
   }
 
-  const WebRtcKeyValueConfig& trials() const { return context_->trials(); }
+  const FieldTrialsView& trials() const { return context_->trials(); }
 
  protected:
   // Constructor used by the static Create() method. Modifies the dependencies.
diff --git a/pc/peer_connection_internal.h b/pc/peer_connection_internal.h
index eaff20a..66897ee 100644
--- a/pc/peer_connection_internal.h
+++ b/pc/peer_connection_internal.h
@@ -179,7 +179,7 @@
   // Handler for the "channel closed" signal
   virtual void OnSctpDataChannelClosed(DataChannelInterface* channel) {}
 
-  virtual const WebRtcKeyValueConfig& trials() = 0;
+  virtual const FieldTrialsView& trials() = 0;
 };
 
 }  // namespace webrtc
diff --git a/pc/peer_connection_jsep_unittest.cc b/pc/peer_connection_jsep_unittest.cc
index 590fa90..ac355d5 100644
--- a/pc/peer_connection_jsep_unittest.cc
+++ b/pc/peer_connection_jsep_unittest.cc
@@ -21,6 +21,7 @@
 #include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
 #include "api/call/call_factory_interface.h"
+#include "api/field_trials_view.h"
 #include "api/jsep.h"
 #include "api/media_stream_interface.h"
 #include "api/media_types.h"
@@ -36,7 +37,6 @@
 #include "api/task_queue/task_queue_factory.h"
 #include "api/transport/field_trial_based_config.h"
 #include "api/transport/sctp_transport_factory_interface.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "media/base/media_engine.h"
 #include "media/base/stream_params.h"
 #include "media/engine/webrtc_media_engine.h"
diff --git a/pc/srtp_session.cc b/pc/srtp_session.cc
index b5b2442..41c9b46 100644
--- a/pc/srtp_session.cc
+++ b/pc/srtp_session.cc
@@ -18,7 +18,7 @@
 #include "absl/base/attributes.h"
 #include "absl/base/const_init.h"
 #include "api/array_view.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "modules/rtp_rtcp/source/rtp_util.h"
 #include "pc/external_hmac.h"
 #include "rtc_base/byte_order.h"
@@ -42,7 +42,7 @@
 
 SrtpSession::SrtpSession() {}
 
-SrtpSession::SrtpSession(const webrtc::WebRtcKeyValueConfig& field_trials) {
+SrtpSession::SrtpSession(const webrtc::FieldTrialsView& field_trials) {
   dump_plain_rtp_ = field_trials.IsEnabled("WebRTC-Debugging-RtpDump");
 }
 
diff --git a/pc/srtp_session.h b/pc/srtp_session.h
index c3979aa..1c61156 100644
--- a/pc/srtp_session.h
+++ b/pc/srtp_session.h
@@ -16,9 +16,9 @@
 
 #include <vector>
 
+#include "api/field_trials_view.h"
 #include "api/scoped_refptr.h"
 #include "api/sequence_checker.h"
-#include "api/webrtc_key_value_config.h"
 #include "rtc_base/synchronization/mutex.h"
 
 // Forward declaration to avoid pulling in libsrtp headers here
@@ -36,7 +36,7 @@
 class SrtpSession {
  public:
   SrtpSession();
-  explicit SrtpSession(const webrtc::WebRtcKeyValueConfig& field_trials);
+  explicit SrtpSession(const webrtc::FieldTrialsView& field_trials);
   ~SrtpSession();
 
   SrtpSession(const SrtpSession&) = delete;
diff --git a/pc/srtp_transport.cc b/pc/srtp_transport.cc
index b59fc1d..0991a25 100644
--- a/pc/srtp_transport.cc
+++ b/pc/srtp_transport.cc
@@ -35,7 +35,7 @@
 namespace webrtc {
 
 SrtpTransport::SrtpTransport(bool rtcp_mux_enabled,
-                             const WebRtcKeyValueConfig& field_trials)
+                             const FieldTrialsView& field_trials)
     : RtpTransport(rtcp_mux_enabled), field_trials_(field_trials) {}
 
 RTCError SrtpTransport::SetSrtpSendKey(const cricket::CryptoParams& params) {
diff --git a/pc/srtp_transport.h b/pc/srtp_transport.h
index 2fec29e..e4b0d9f 100644
--- a/pc/srtp_transport.h
+++ b/pc/srtp_transport.h
@@ -20,8 +20,8 @@
 
 #include "absl/types/optional.h"
 #include "api/crypto_params.h"
+#include "api/field_trials_view.h"
 #include "api/rtc_error.h"
-#include "api/webrtc_key_value_config.h"
 #include "p2p/base/packet_transport_internal.h"
 #include "pc/rtp_transport.h"
 #include "pc/srtp_session.h"
@@ -37,8 +37,7 @@
 // parameters for the SrtpSession underneath.
 class SrtpTransport : public RtpTransport {
  public:
-  SrtpTransport(bool rtcp_mux_enabled,
-                const WebRtcKeyValueConfig& field_trials);
+  SrtpTransport(bool rtcp_mux_enabled, const FieldTrialsView& field_trials);
 
   virtual ~SrtpTransport() = default;
 
@@ -170,7 +169,7 @@
 
   int decryption_failure_count_ = 0;
 
-  const WebRtcKeyValueConfig& field_trials_;
+  const FieldTrialsView& field_trials_;
 };
 
 }  // namespace webrtc
diff --git a/pc/stats_collector.cc b/pc/stats_collector.cc
index 44873fa..679a690 100644
--- a/pc/stats_collector.cc
+++ b/pc/stats_collector.cc
@@ -25,13 +25,13 @@
 #include "api/audio_codecs/audio_encoder.h"
 #include "api/candidate.h"
 #include "api/data_channel_interface.h"
+#include "api/field_trials_view.h"
 #include "api/media_types.h"
 #include "api/rtp_sender_interface.h"
 #include "api/scoped_refptr.h"
 #include "api/sequence_checker.h"
 #include "api/video/video_content_type.h"
 #include "api/video/video_timing.h"
-#include "api/webrtc_key_value_config.h"
 #include "call/call.h"
 #include "media/base/media_channel.h"
 #include "modules/audio_processing/include/audio_processing_statistics.h"
diff --git a/pc/stats_collector.h b/pc/stats_collector.h
index 794437e..ea719c6 100644
--- a/pc/stats_collector.h
+++ b/pc/stats_collector.h
@@ -26,11 +26,11 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/media_stream_interface.h"
 #include "api/peer_connection_interface.h"
 #include "api/scoped_refptr.h"
 #include "api/stats_types.h"
-#include "api/webrtc_key_value_config.h"
 #include "p2p/base/connection_info.h"
 #include "p2p/base/port.h"
 #include "pc/peer_connection_internal.h"
diff --git a/pc/test/fake_peer_connection_base.h b/pc/test/fake_peer_connection_base.h
index 2b4dd73..c886305 100644
--- a/pc/test/fake_peer_connection_base.h
+++ b/pc/test/fake_peer_connection_base.h
@@ -17,8 +17,8 @@
 #include <string>
 #include <vector>
 
+#include "api/field_trials_view.h"
 #include "api/sctp_transport_interface.h"
-#include "api/webrtc_key_value_config.h"
 #include "pc/peer_connection_internal.h"
 #include "test/scoped_key_value_config.h"
 
@@ -360,7 +360,7 @@
   void SetSctpDataMid(const std::string& mid) override {}
   void ResetSctpDataMid() override {}
 
-  const WebRtcKeyValueConfig& trials() override { return field_trials_; }
+  const FieldTrialsView& trials() override { return field_trials_; }
 
  protected:
   webrtc::test::ScopedKeyValueConfig field_trials_;
diff --git a/pc/test/integration_test_helpers.h b/pc/test/integration_test_helpers.h
index 00417d9..78c91af 100644
--- a/pc/test/integration_test_helpers.h
+++ b/pc/test/integration_test_helpers.h
@@ -33,6 +33,7 @@
 #include "api/candidate.h"
 #include "api/crypto/crypto_options.h"
 #include "api/data_channel_interface.h"
+#include "api/field_trials_view.h"
 #include "api/ice_transport_interface.h"
 #include "api/jsep.h"
 #include "api/media_stream_interface.h"
@@ -52,7 +53,6 @@
 #include "api/task_queue/default_task_queue_factory.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "api/transport/field_trial_based_config.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/uma_metrics.h"
 #include "api/video/video_rotation.h"
 #include "api/video_codecs/sdp_video_format.h"
@@ -1855,7 +1855,7 @@
                               expected_cipher_suite);
   }
 
-  const WebRtcKeyValueConfig& trials() const { return *field_trials_.get(); }
+  const FieldTrialsView& trials() const { return *field_trials_.get(); }
 
  protected:
   SdpSemantics sdp_semantics_;
@@ -1876,7 +1876,7 @@
   std::vector<std::unique_ptr<cricket::TestTurnCustomizer>> turn_customizers_;
   std::unique_ptr<PeerConnectionIntegrationWrapper> caller_;
   std::unique_ptr<PeerConnectionIntegrationWrapper> callee_;
-  std::unique_ptr<WebRtcKeyValueConfig> field_trials_;
+  std::unique_ptr<FieldTrialsView> field_trials_;
 };
 
 }  // namespace webrtc
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
index 4015fc9..c762b9f 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -943,11 +943,11 @@
     ":stringutils",
     ":threading",
     "../api:array_view",
+    "../api:field_trials_view",
     "../api:function_view",
     "../api:refcountedbase",
     "../api:scoped_refptr",
     "../api:sequence_checker",
-    "../api:webrtc_key_value_config",
     "../api/numerics",
     "../api/task_queue",
     "../api/transport:field_trial_based_config",
diff --git a/rtc_base/experiments/BUILD.gn b/rtc_base/experiments/BUILD.gn
index 5788484..2836352 100644
--- a/rtc_base/experiments/BUILD.gn
+++ b/rtc_base/experiments/BUILD.gn
@@ -15,8 +15,8 @@
   ]
   deps = [
     "../:rtc_base_approved",
+    "../../api:field_trials_view",
     "../../api/transport:field_trial_based_config",
-    "../../api/transport:webrtc_key_value_config",
   ]
   absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
 }
@@ -56,8 +56,8 @@
   deps = [
     ":field_trial_parser",
     "../:rtc_base_approved",
+    "../../api:field_trials_view",
     "../../api/transport:field_trial_based_config",
-    "../../api/transport:webrtc_key_value_config",
     "../../system_wrappers:field_trial",
   ]
   absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
@@ -71,8 +71,8 @@
   deps = [
     ":field_trial_parser",
     "../:rtc_base_approved",
+    "../../api:field_trials_view",
     "../../api/transport:field_trial_based_config",
-    "../../api/transport:webrtc_key_value_config",
     "../../system_wrappers:field_trial",
   ]
   absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
@@ -86,8 +86,8 @@
   deps = [
     ":field_trial_parser",
     "../:rtc_base_approved",
+    "../../api:field_trials_view",
     "../../api/transport:field_trial_based_config",
-    "../../api/transport:webrtc_key_value_config",
     "../../system_wrappers:field_trial",
   ]
   absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
@@ -126,7 +126,7 @@
   deps = [
     ":field_trial_parser",
     "../:rtc_base_approved",
-    "../../api:webrtc_key_value_config",
+    "../../api:field_trials_view",
     "../../api/video_codecs:video_codecs_api",
     "../../system_wrappers:field_trial",
   ]
@@ -195,8 +195,8 @@
   deps = [
     ":field_trial_parser",
     "../:rtc_base_approved",
+    "../../api:field_trials_view",
     "../../api/transport:field_trial_based_config",
-    "../../api/transport:webrtc_key_value_config",
     "../../api/units:data_size",
     "../../api/video_codecs:video_codecs_api",
     "../../system_wrappers:field_trial",
@@ -214,8 +214,8 @@
   ]
   deps = [
     ":field_trial_parser",
+    "../../api:field_trials_view",
     "../../api/transport:field_trial_based_config",
-    "../../api/transport:webrtc_key_value_config",
   ]
   absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
 }
@@ -228,8 +228,8 @@
   deps = [
     ":field_trial_parser",
     ":rate_control_settings",
+    "../../api:field_trials_view",
     "../../api/transport:field_trial_based_config",
-    "../../api/transport:webrtc_key_value_config",
   ]
   absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
 }
diff --git a/rtc_base/experiments/alr_experiment.cc b/rtc_base/experiments/alr_experiment.cc
index 119a401..36bf67d 100644
--- a/rtc_base/experiments/alr_experiment.cc
+++ b/rtc_base/experiments/alr_experiment.cc
@@ -32,7 +32,7 @@
 }
 
 bool AlrExperimentSettings::MaxOneFieldTrialEnabled(
-    const WebRtcKeyValueConfig& key_value_config) {
+    const FieldTrialsView& key_value_config) {
   return key_value_config.Lookup(kStrictPacingAndProbingExperimentName)
              .empty() ||
          key_value_config.Lookup(kScreenshareProbingBweExperimentName).empty();
@@ -46,7 +46,7 @@
 
 absl::optional<AlrExperimentSettings>
 AlrExperimentSettings::CreateFromFieldTrial(
-    const WebRtcKeyValueConfig& key_value_config,
+    const FieldTrialsView& key_value_config,
     const char* experiment_name) {
   absl::optional<AlrExperimentSettings> ret;
   std::string group_name = key_value_config.Lookup(experiment_name);
diff --git a/rtc_base/experiments/alr_experiment.h b/rtc_base/experiments/alr_experiment.h
index 5b0661c..bf6aa34 100644
--- a/rtc_base/experiments/alr_experiment.h
+++ b/rtc_base/experiments/alr_experiment.h
@@ -14,7 +14,7 @@
 #include <stdint.h>
 
 #include "absl/types/optional.h"
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 
 namespace webrtc {
 struct AlrExperimentSettings {
@@ -34,11 +34,10 @@
   static absl::optional<AlrExperimentSettings> CreateFromFieldTrial(
       const char* experiment_name);
   static absl::optional<AlrExperimentSettings> CreateFromFieldTrial(
-      const WebRtcKeyValueConfig& key_value_config,
+      const FieldTrialsView& key_value_config,
       const char* experiment_name);
   static bool MaxOneFieldTrialEnabled();
-  static bool MaxOneFieldTrialEnabled(
-      const WebRtcKeyValueConfig& key_value_config);
+  static bool MaxOneFieldTrialEnabled(const FieldTrialsView& key_value_config);
 
  private:
   AlrExperimentSettings() = default;
diff --git a/rtc_base/experiments/balanced_degradation_settings.cc b/rtc_base/experiments/balanced_degradation_settings.cc
index 7cd1a67..1652e31 100644
--- a/rtc_base/experiments/balanced_degradation_settings.cc
+++ b/rtc_base/experiments/balanced_degradation_settings.cc
@@ -332,7 +332,7 @@
       generic(generic) {}
 
 BalancedDegradationSettings::BalancedDegradationSettings(
-    const WebRtcKeyValueConfig& field_trials) {
+    const FieldTrialsView& field_trials) {
   FieldTrialStructList<Config> configs(
       {FieldTrialStructMember("pixels", [](Config* c) { return &c->pixels; }),
        FieldTrialStructMember("fps", [](Config* c) { return &c->fps; }),
diff --git a/rtc_base/experiments/balanced_degradation_settings.h b/rtc_base/experiments/balanced_degradation_settings.h
index 8255547..0b5e03d 100644
--- a/rtc_base/experiments/balanced_degradation_settings.h
+++ b/rtc_base/experiments/balanced_degradation_settings.h
@@ -14,8 +14,8 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/video_codecs/video_encoder.h"
-#include "api/webrtc_key_value_config.h"
 
 namespace webrtc {
 
@@ -23,7 +23,7 @@
  public:
   static constexpr int kNoFpsDiff = -100;
 
-  BalancedDegradationSettings(const WebRtcKeyValueConfig& field_trials);
+  BalancedDegradationSettings(const FieldTrialsView& field_trials);
   ~BalancedDegradationSettings();
 
   struct CodecTypeSpecific {
diff --git a/rtc_base/experiments/bandwidth_quality_scaler_settings.cc b/rtc_base/experiments/bandwidth_quality_scaler_settings.cc
index 332ab6b..0a9df49 100644
--- a/rtc_base/experiments/bandwidth_quality_scaler_settings.cc
+++ b/rtc_base/experiments/bandwidth_quality_scaler_settings.cc
@@ -16,7 +16,7 @@
 namespace webrtc {
 
 BandwidthQualityScalerSettings::BandwidthQualityScalerSettings(
-    const WebRtcKeyValueConfig* const key_value_config)
+    const FieldTrialsView* const key_value_config)
     : bitrate_state_update_interval_s_("bitrate_state_update_interval_s_") {
   ParseFieldTrial(
       {&bitrate_state_update_interval_s_},
diff --git a/rtc_base/experiments/bandwidth_quality_scaler_settings.h b/rtc_base/experiments/bandwidth_quality_scaler_settings.h
index 959aea5..21e115d 100644
--- a/rtc_base/experiments/bandwidth_quality_scaler_settings.h
+++ b/rtc_base/experiments/bandwidth_quality_scaler_settings.h
@@ -12,7 +12,7 @@
 #define RTC_BASE_EXPERIMENTS_BANDWIDTH_QUALITY_SCALER_SETTINGS_H_
 
 #include "absl/types/optional.h"
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/experiments/field_trial_parser.h"
 
 namespace webrtc {
@@ -25,7 +25,7 @@
 
  private:
   explicit BandwidthQualityScalerSettings(
-      const WebRtcKeyValueConfig* const key_value_config);
+      const FieldTrialsView* const key_value_config);
 
   FieldTrialOptional<uint32_t> bitrate_state_update_interval_s_;
 };
diff --git a/rtc_base/experiments/keyframe_interval_settings.cc b/rtc_base/experiments/keyframe_interval_settings.cc
index 76c85cb..413e2a9 100644
--- a/rtc_base/experiments/keyframe_interval_settings.cc
+++ b/rtc_base/experiments/keyframe_interval_settings.cc
@@ -21,7 +21,7 @@
 }  // namespace
 
 KeyframeIntervalSettings::KeyframeIntervalSettings(
-    const WebRtcKeyValueConfig* const key_value_config)
+    const FieldTrialsView* const key_value_config)
     : min_keyframe_send_interval_ms_("min_keyframe_send_interval_ms") {
   ParseFieldTrial({&min_keyframe_send_interval_ms_},
                   key_value_config->Lookup(kFieldTrialName));
diff --git a/rtc_base/experiments/keyframe_interval_settings.h b/rtc_base/experiments/keyframe_interval_settings.h
index 3f253f0..aff7854 100644
--- a/rtc_base/experiments/keyframe_interval_settings.h
+++ b/rtc_base/experiments/keyframe_interval_settings.h
@@ -12,7 +12,7 @@
 #define RTC_BASE_EXPERIMENTS_KEYFRAME_INTERVAL_SETTINGS_H_
 
 #include "absl/types/optional.h"
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/experiments/field_trial_parser.h"
 
 namespace webrtc {
@@ -29,8 +29,7 @@
   absl::optional<int> MinKeyframeSendIntervalMs() const;
 
  private:
-  explicit KeyframeIntervalSettings(
-      const WebRtcKeyValueConfig* key_value_config);
+  explicit KeyframeIntervalSettings(const FieldTrialsView* key_value_config);
 
   FieldTrialOptional<int> min_keyframe_send_interval_ms_;
 };
diff --git a/rtc_base/experiments/quality_rampup_experiment.cc b/rtc_base/experiments/quality_rampup_experiment.cc
index 35c83f7..509ba91 100644
--- a/rtc_base/experiments/quality_rampup_experiment.cc
+++ b/rtc_base/experiments/quality_rampup_experiment.cc
@@ -18,7 +18,7 @@
 namespace webrtc {
 
 QualityRampupExperiment::QualityRampupExperiment(
-    const WebRtcKeyValueConfig* const key_value_config)
+    const FieldTrialsView* const key_value_config)
     : min_pixels_("min_pixels"),
       min_duration_ms_("min_duration_ms"),
       max_bitrate_factor_("max_bitrate_factor") {
diff --git a/rtc_base/experiments/quality_rampup_experiment.h b/rtc_base/experiments/quality_rampup_experiment.h
index 719b189..e8048a3 100644
--- a/rtc_base/experiments/quality_rampup_experiment.h
+++ b/rtc_base/experiments/quality_rampup_experiment.h
@@ -12,7 +12,7 @@
 #define RTC_BASE_EXPERIMENTS_QUALITY_RAMPUP_EXPERIMENT_H_
 
 #include "absl/types/optional.h"
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/experiments/field_trial_parser.h"
 
 namespace webrtc {
@@ -38,7 +38,7 @@
 
  private:
   explicit QualityRampupExperiment(
-      const WebRtcKeyValueConfig* const key_value_config);
+      const FieldTrialsView* const key_value_config);
 
   FieldTrialOptional<int> min_pixels_;
   FieldTrialOptional<int> min_duration_ms_;
diff --git a/rtc_base/experiments/quality_scaler_settings.cc b/rtc_base/experiments/quality_scaler_settings.cc
index d2443b0..85c9925 100644
--- a/rtc_base/experiments/quality_scaler_settings.cc
+++ b/rtc_base/experiments/quality_scaler_settings.cc
@@ -20,7 +20,7 @@
 }  // namespace
 
 QualityScalerSettings::QualityScalerSettings(
-    const WebRtcKeyValueConfig* const key_value_config)
+    const FieldTrialsView* const key_value_config)
     : sampling_period_ms_("sampling_period_ms"),
       average_qp_window_("average_qp_window"),
       min_frames_("min_frames"),
diff --git a/rtc_base/experiments/quality_scaler_settings.h b/rtc_base/experiments/quality_scaler_settings.h
index b4b6a42..99827aa 100644
--- a/rtc_base/experiments/quality_scaler_settings.h
+++ b/rtc_base/experiments/quality_scaler_settings.h
@@ -12,7 +12,7 @@
 #define RTC_BASE_EXPERIMENTS_QUALITY_SCALER_SETTINGS_H_
 
 #include "absl/types/optional.h"
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/experiments/field_trial_parser.h"
 
 namespace webrtc {
@@ -30,8 +30,7 @@
   absl::optional<double> InitialBitrateFactor() const;
 
  private:
-  explicit QualityScalerSettings(
-      const WebRtcKeyValueConfig* const key_value_config);
+  explicit QualityScalerSettings(const FieldTrialsView* const key_value_config);
 
   FieldTrialOptional<int> sampling_period_ms_;
   FieldTrialOptional<int> average_qp_window_;
diff --git a/rtc_base/experiments/rate_control_settings.cc b/rtc_base/experiments/rate_control_settings.cc
index bed194e..91b475a 100644
--- a/rtc_base/experiments/rate_control_settings.cc
+++ b/rtc_base/experiments/rate_control_settings.cc
@@ -39,12 +39,12 @@
 const char* kScreenshareHysteresisFieldTrialname =
     "WebRTC-SimulcastScreenshareUpswitchHysteresisPercent";
 
-bool IsEnabled(const WebRtcKeyValueConfig* const key_value_config,
+bool IsEnabled(const FieldTrialsView* const key_value_config,
                absl::string_view key) {
   return absl::StartsWith(key_value_config->Lookup(key), "Enabled");
 }
 
-void ParseHysteresisFactor(const WebRtcKeyValueConfig* const key_value_config,
+void ParseHysteresisFactor(const FieldTrialsView* const key_value_config,
                            absl::string_view key,
                            double* output_value) {
   std::string group_name = key_value_config->Lookup(key);
@@ -94,7 +94,7 @@
 }
 
 RateControlSettings::RateControlSettings(
-    const WebRtcKeyValueConfig* const key_value_config) {
+    const FieldTrialsView* const key_value_config) {
   std::string congestion_window_config =
       key_value_config->Lookup(CongestionWindowConfig::kKey).empty()
           ? kCongestionWindowDefaultFieldTrialString
@@ -120,7 +120,7 @@
 }
 
 RateControlSettings RateControlSettings::ParseFromKeyValueConfig(
-    const WebRtcKeyValueConfig* const key_value_config) {
+    const FieldTrialsView* const key_value_config) {
   FieldTrialBasedConfig field_trial_config;
   return RateControlSettings(key_value_config ? key_value_config
                                               : &field_trial_config);
diff --git a/rtc_base/experiments/rate_control_settings.h b/rtc_base/experiments/rate_control_settings.h
index 1c38e92..bad16d2 100644
--- a/rtc_base/experiments/rate_control_settings.h
+++ b/rtc_base/experiments/rate_control_settings.h
@@ -12,7 +12,7 @@
 #define RTC_BASE_EXPERIMENTS_RATE_CONTROL_SETTINGS_H_
 
 #include "absl/types/optional.h"
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "api/units/data_size.h"
 #include "api/video_codecs/video_codec.h"
 #include "api/video_codecs/video_encoder_config.h"
@@ -57,7 +57,7 @@
 
   static RateControlSettings ParseFromFieldTrials();
   static RateControlSettings ParseFromKeyValueConfig(
-      const WebRtcKeyValueConfig* const key_value_config);
+      const FieldTrialsView* const key_value_config);
 
   // When CongestionWindowPushback is enabled, the pacer is oblivious to
   // the congestion window. The relation between outstanding data and
@@ -93,8 +93,7 @@
   bool BitrateAdjusterCanUseNetworkHeadroom() const;
 
  private:
-  explicit RateControlSettings(
-      const WebRtcKeyValueConfig* const key_value_config);
+  explicit RateControlSettings(const FieldTrialsView* const key_value_config);
 
   CongestionWindowConfig congestion_window_config_;
   VideoRateControlConfig video_config_;
diff --git a/rtc_base/experiments/stable_target_rate_experiment.cc b/rtc_base/experiments/stable_target_rate_experiment.cc
index fa7a97b..b7246d4 100644
--- a/rtc_base/experiments/stable_target_rate_experiment.cc
+++ b/rtc_base/experiments/stable_target_rate_experiment.cc
@@ -19,7 +19,7 @@
 }  // namespace
 
 StableTargetRateExperiment::StableTargetRateExperiment(
-    const WebRtcKeyValueConfig* const key_value_config,
+    const FieldTrialsView* const key_value_config,
     double default_video_hysteresis,
     double default_screenshare_hysteresis)
     : enabled_("enabled", false),
@@ -43,7 +43,7 @@
 }
 
 StableTargetRateExperiment StableTargetRateExperiment::ParseFromKeyValueConfig(
-    const WebRtcKeyValueConfig* const key_value_config) {
+    const FieldTrialsView* const key_value_config) {
   RateControlSettings rate_control =
       RateControlSettings::ParseFromKeyValueConfig(key_value_config);
   return StableTargetRateExperiment(
diff --git a/rtc_base/experiments/stable_target_rate_experiment.h b/rtc_base/experiments/stable_target_rate_experiment.h
index 299299c..be0f9da 100644
--- a/rtc_base/experiments/stable_target_rate_experiment.h
+++ b/rtc_base/experiments/stable_target_rate_experiment.h
@@ -11,7 +11,7 @@
 #ifndef RTC_BASE_EXPERIMENTS_STABLE_TARGET_RATE_EXPERIMENT_H_
 #define RTC_BASE_EXPERIMENTS_STABLE_TARGET_RATE_EXPERIMENT_H_
 
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/experiments/field_trial_parser.h"
 
 namespace webrtc {
@@ -22,7 +22,7 @@
   StableTargetRateExperiment(StableTargetRateExperiment&&);
   static StableTargetRateExperiment ParseFromFieldTrials();
   static StableTargetRateExperiment ParseFromKeyValueConfig(
-      const WebRtcKeyValueConfig* const key_value_config);
+      const FieldTrialsView* const key_value_config);
 
   bool IsEnabled() const;
   double GetVideoHysteresisFactor() const;
@@ -30,7 +30,7 @@
 
  private:
   explicit StableTargetRateExperiment(
-      const WebRtcKeyValueConfig* const key_value_config,
+      const FieldTrialsView* const key_value_config,
       double default_video_hysteresis,
       double default_screenshare_hysteresis);
 
diff --git a/rtc_base/network.cc b/rtc_base/network.cc
index b2bce37..b422b28 100644
--- a/rtc_base/network.cc
+++ b/rtc_base/network.cc
@@ -282,7 +282,7 @@
 }
 
 NetworkManagerBase::NetworkManagerBase(
-    const webrtc::WebRtcKeyValueConfig* field_trials)
+    const webrtc::FieldTrialsView* field_trials)
     : enumeration_permission_(NetworkManager::ENUMERATION_ALLOWED),
       signal_network_preference_change_(
           field_trials
@@ -515,7 +515,7 @@
 BasicNetworkManager::BasicNetworkManager(
     NetworkMonitorFactory* network_monitor_factory,
     SocketFactory* socket_factory,
-    const webrtc::WebRtcKeyValueConfig* field_trials)
+    const webrtc::FieldTrialsView* field_trials)
     : field_trials_(field_trials),
       network_monitor_factory_(network_monitor_factory),
       socket_factory_(socket_factory),
@@ -1137,15 +1137,13 @@
   return mdns_responder_provider_->GetMdnsResponder();
 }
 
-uint16_t Network::GetCost(
-    const webrtc::WebRtcKeyValueConfig* field_trials) const {
+uint16_t Network::GetCost(const webrtc::FieldTrialsView* field_trials) const {
   return GetCost(
-      *webrtc::AlwaysValidPointer<const webrtc::WebRtcKeyValueConfig,
+      *webrtc::AlwaysValidPointer<const webrtc::FieldTrialsView,
                                   webrtc::FieldTrialBasedConfig>(field_trials));
 }
 
-uint16_t Network::GetCost(
-    const webrtc::WebRtcKeyValueConfig& field_trials) const {
+uint16_t Network::GetCost(const webrtc::FieldTrialsView& field_trials) const {
   AdapterType type = IsVpn() ? underlying_type_for_vpn_ : type_;
   const bool use_differentiated_cellular_costs =
       field_trials.IsEnabled("WebRTC-UseDifferentiatedCellularCosts");
diff --git a/rtc_base/network.h b/rtc_base/network.h
index d01a418..067ecb4 100644
--- a/rtc_base/network.h
+++ b/rtc_base/network.h
@@ -21,9 +21,9 @@
 
 #include "absl/strings/string_view.h"
 #include "api/array_view.h"
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
 #include "api/transport/field_trial_based_config.h"
-#include "api/webrtc_key_value_config.h"
 #include "rtc_base/ip_address.h"
 #include "rtc_base/mdns_responder_interface.h"
 #include "rtc_base/memory/always_valid_pointer.h"
@@ -208,8 +208,7 @@
 // Base class for NetworkManager implementations.
 class RTC_EXPORT NetworkManagerBase : public NetworkManager {
  public:
-  NetworkManagerBase(
-      const webrtc::WebRtcKeyValueConfig* field_trials = nullptr);
+  NetworkManagerBase(const webrtc::FieldTrialsView* field_trials = nullptr);
   ~NetworkManagerBase() override;
 
   void GetNetworks(NetworkList* networks) const override;
@@ -281,24 +280,22 @@
   ABSL_DEPRECATED(
       "Use the version with socket_factory, see bugs.webrtc.org/13145")
   explicit BasicNetworkManager(
-      const webrtc::WebRtcKeyValueConfig* field_trials = nullptr)
+      const webrtc::FieldTrialsView* field_trials = nullptr)
       : BasicNetworkManager(
             /* network_monitor_factory= */ nullptr,
             /* socket_factory= */ nullptr,
             field_trials) {}
 
   // This is used by lots of downstream code.
-  BasicNetworkManager(
-      SocketFactory* socket_factory,
-      const webrtc::WebRtcKeyValueConfig* field_trials = nullptr)
+  BasicNetworkManager(SocketFactory* socket_factory,
+                      const webrtc::FieldTrialsView* field_trials = nullptr)
       : BasicNetworkManager(/* network_monitor_factory= */ nullptr,
                             socket_factory,
                             field_trials) {}
 
-  BasicNetworkManager(
-      NetworkMonitorFactory* network_monitor_factory,
-      SocketFactory* socket_factory,
-      const webrtc::WebRtcKeyValueConfig* field_trials = nullptr);
+  BasicNetworkManager(NetworkMonitorFactory* network_monitor_factory,
+                      SocketFactory* socket_factory,
+                      const webrtc::FieldTrialsView* field_trials = nullptr);
   ~BasicNetworkManager() override;
 
   void StartUpdating() override;
@@ -372,7 +369,7 @@
   bool sent_first_update_ = true;
   int start_count_ = 0;
   // Chromium create BasicNetworkManager() w/o field trials.
-  webrtc::AlwaysValidPointer<const webrtc::WebRtcKeyValueConfig,
+  webrtc::AlwaysValidPointer<const webrtc::FieldTrialsView,
                              webrtc::FieldTrialBasedConfig>
       field_trials_;
   std::vector<std::string> network_ignore_list_;
@@ -548,9 +545,8 @@
   // Port::OnNetworkTypeChanged is called).
   ABSL_DEPRECATED(
       "Use the version with field trials, see bugs.webrtc.org/webrtc:10335")
-  uint16_t GetCost(
-      const webrtc::WebRtcKeyValueConfig* field_trials = nullptr) const;
-  uint16_t GetCost(const webrtc::WebRtcKeyValueConfig& field_trials) const;
+  uint16_t GetCost(const webrtc::FieldTrialsView* field_trials = nullptr) const;
+  uint16_t GetCost(const webrtc::FieldTrialsView& field_trials) const;
 
   // A unique id assigned by the network manager, which may be signaled
   // to the remote side in the candidate.
diff --git a/rtc_base/network_monitor_factory.h b/rtc_base/network_monitor_factory.h
index b261ace..c76ed97 100644
--- a/rtc_base/network_monitor_factory.h
+++ b/rtc_base/network_monitor_factory.h
@@ -12,7 +12,7 @@
 #define RTC_BASE_NETWORK_MONITOR_FACTORY_H_
 
 namespace webrtc {
-class WebRtcKeyValueConfig;
+class FieldTrialsView;
 }  // namespace webrtc
 
 namespace rtc {
@@ -29,7 +29,7 @@
 class NetworkMonitorFactory {
  public:
   virtual NetworkMonitorInterface* CreateNetworkMonitor(
-      const webrtc::WebRtcKeyValueConfig& field_trials) = 0;
+      const webrtc::FieldTrialsView& field_trials) = 0;
 
   virtual ~NetworkMonitorFactory();
 
diff --git a/rtc_base/network_unittest.cc b/rtc_base/network_unittest.cc
index 5830793..ed02d8c 100644
--- a/rtc_base/network_unittest.cc
+++ b/rtc_base/network_unittest.cc
@@ -123,7 +123,7 @@
  public:
   FakeNetworkMonitorFactory() {}
   NetworkMonitorInterface* CreateNetworkMonitor(
-      const webrtc::WebRtcKeyValueConfig& field_trials) override {
+      const webrtc::FieldTrialsView& field_trials) override {
     return new FakeNetworkMonitor();
   }
 };
@@ -319,7 +319,7 @@
  public:
   TestBasicNetworkManager(NetworkMonitorFactory* network_monitor_factory,
                           SocketFactory* socket_factory,
-                          const webrtc::WebRtcKeyValueConfig& field_trials)
+                          const webrtc::FieldTrialsView& field_trials)
       : BasicNetworkManager(network_monitor_factory,
                             socket_factory,
                             &field_trials) {}
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index eb191ef..5b81737 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -1583,8 +1583,8 @@
         deps = [
           ":network_monitor_objc",
           ":network_monitor_observer",
+          "../api:field_trials_view",
           "../api:sequence_checker",
-          "../api:webrtc_key_value_config",
           "../rtc_base",
           "../rtc_base:threading",
           "../rtc_base/task_utils:pending_task_safety_flag",
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index 34264c2..4c42fa7 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -579,10 +579,10 @@
       ":generated_base_jni",
       ":internal_jni",
       ":native_api_jni",
+      "../../api:field_trials_view",
       "../../api:libjingle_peerconnection_api",
       "../../api:scoped_refptr",
       "../../api:sequence_checker",
-      "../../api:webrtc_key_value_config",
       "../../rtc_base",
       "../../rtc_base:checks",
       "../../rtc_base:ip_address",
diff --git a/sdk/android/src/jni/android_network_monitor.cc b/sdk/android/src/jni/android_network_monitor.cc
index ecf0adf..754267d 100644
--- a/sdk/android/src/jni/android_network_monitor.cc
+++ b/sdk/android/src/jni/android_network_monitor.cc
@@ -578,7 +578,7 @@
 
 rtc::NetworkMonitorInterface*
 AndroidNetworkMonitorFactory::CreateNetworkMonitor(
-    const WebRtcKeyValueConfig& field_trials) {
+    const FieldTrialsView& field_trials) {
   return new AndroidNetworkMonitor(AttachCurrentThreadIfNeeded(),
                                    j_application_context_);
 }
diff --git a/sdk/android/src/jni/android_network_monitor.h b/sdk/android/src/jni/android_network_monitor.h
index dfdb18f..60615bb 100644
--- a/sdk/android/src/jni/android_network_monitor.h
+++ b/sdk/android/src/jni/android_network_monitor.h
@@ -19,7 +19,7 @@
 
 #include "absl/strings/string_view.h"
 #include "absl/types/optional.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/network_monitor.h"
 #include "rtc_base/network_monitor_factory.h"
 #include "rtc_base/string_utils.h"
@@ -167,7 +167,7 @@
   ~AndroidNetworkMonitorFactory() override;
 
   rtc::NetworkMonitorInterface* CreateNetworkMonitor(
-      const WebRtcKeyValueConfig& field_trials) override;
+      const FieldTrialsView& field_trials) override;
 
  private:
   ScopedJavaGlobalRef<jobject> j_application_context_;
diff --git a/sdk/objc/native/src/objc_network_monitor.h b/sdk/objc/native/src/objc_network_monitor.h
index 7375bbb..04566d2 100644
--- a/sdk/objc/native/src/objc_network_monitor.h
+++ b/sdk/objc/native/src/objc_network_monitor.h
@@ -14,8 +14,8 @@
 #include <vector>
 
 #include "absl/strings/string_view.h"
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
-#include "api/webrtc_key_value_config.h"
 #include "rtc_base/network_monitor.h"
 #include "rtc_base/network_monitor_factory.h"
 #include "rtc_base/string_utils.h"
@@ -33,7 +33,7 @@
   ~ObjCNetworkMonitorFactory() override = default;
 
   rtc::NetworkMonitorInterface* CreateNetworkMonitor(
-      const WebRtcKeyValueConfig& field_trials) override;
+      const FieldTrialsView& field_trials) override;
 };
 
 class ObjCNetworkMonitor : public rtc::NetworkMonitorInterface,
diff --git a/sdk/objc/native/src/objc_network_monitor.mm b/sdk/objc/native/src/objc_network_monitor.mm
index 798d7ff..6a43b57 100644
--- a/sdk/objc/native/src/objc_network_monitor.mm
+++ b/sdk/objc/native/src/objc_network_monitor.mm
@@ -21,7 +21,7 @@
 namespace webrtc {
 
 rtc::NetworkMonitorInterface* ObjCNetworkMonitorFactory::CreateNetworkMonitor(
-    const WebRtcKeyValueConfig& field_trials) {
+    const FieldTrialsView& field_trials) {
   return new ObjCNetworkMonitor();
 }
 
diff --git a/test/BUILD.gn b/test/BUILD.gn
index b3c53bf..6b9524e 100644
--- a/test/BUILD.gn
+++ b/test/BUILD.gn
@@ -235,7 +235,7 @@
 
   deps = [
     ":field_trial",
-    "../api:webrtc_key_value_config",
+    "../api:field_trials_view",
     "../rtc_base:checks",
   ]
   absl_deps = [ "//third_party/abseil-cpp/absl/strings:strings" ]
@@ -249,7 +249,7 @@
 
   deps = [
     ":field_trial",
-    "../api:webrtc_key_value_config",
+    "../api:field_trials_view",
     "../rtc_base:checks",
     "../system_wrappers:field_trial",
   ]
diff --git a/test/explicit_key_value_config.cc b/test/explicit_key_value_config.cc
index 6a561fa..a080a0c 100644
--- a/test/explicit_key_value_config.cc
+++ b/test/explicit_key_value_config.cc
@@ -10,7 +10,7 @@
 
 #include "test/explicit_key_value_config.h"
 
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/checks.h"
 
 namespace webrtc {
diff --git a/test/explicit_key_value_config.h b/test/explicit_key_value_config.h
index 0a728ab..355f01d 100644
--- a/test/explicit_key_value_config.h
+++ b/test/explicit_key_value_config.h
@@ -15,12 +15,12 @@
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 
 namespace webrtc {
 namespace test {
 
-class ExplicitKeyValueConfig : public WebRtcKeyValueConfig {
+class ExplicitKeyValueConfig : public FieldTrialsView {
  public:
   explicit ExplicitKeyValueConfig(const std::string& s);
   std::string Lookup(absl::string_view key) const override;
diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn
index 6f96b0c..60aa5d6 100644
--- a/test/fuzzers/BUILD.gn
+++ b/test/fuzzers/BUILD.gn
@@ -687,7 +687,7 @@
     deps = [
       "..:test_support",
       "../../api:array_view",
-      "../../api/transport:webrtc_key_value_config",
+      "../../api:field_trials_view",
       "../../api/video:video_frame",
       "../../api/video_codecs:video_codecs_api",
       "../../modules/video_coding:frame_dependencies_calculator",
diff --git a/test/fuzzers/vp9_encoder_references_fuzzer.cc b/test/fuzzers/vp9_encoder_references_fuzzer.cc
index a26dc87..14eb845 100644
--- a/test/fuzzers/vp9_encoder_references_fuzzer.cc
+++ b/test/fuzzers/vp9_encoder_references_fuzzer.cc
@@ -14,7 +14,7 @@
 #include "absl/base/macros.h"
 #include "absl/container/inlined_vector.h"
 #include "api/array_view.h"
-#include "api/transport/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "api/video/video_frame.h"
 #include "api/video_codecs/video_codec.h"
 #include "api/video_codecs/video_encoder.h"
@@ -168,7 +168,7 @@
   LayerFrame frames_[kMaxFrameHistorySize];
 };
 
-class FieldTrials : public WebRtcKeyValueConfig {
+class FieldTrials : public FieldTrialsView {
  public:
   explicit FieldTrials(FuzzDataHelper& config)
       : flags_(config.ReadOrDefaultValue<uint8_t>(0)) {}
diff --git a/test/network/BUILD.gn b/test/network/BUILD.gn
index 6b53315..30cfb18 100644
--- a/test/network/BUILD.gn
+++ b/test/network/BUILD.gn
@@ -39,13 +39,13 @@
   ]
   deps = [
     "../../api:array_view",
+    "../../api:field_trials_view",
     "../../api:network_emulation_manager_api",
     "../../api:packet_socket_factory",
     "../../api:scoped_refptr",
     "../../api:sequence_checker",
     "../../api:simulated_network_api",
     "../../api:time_controller",
-    "../../api:webrtc_key_value_config",
     "../../api/numerics",
     "../../api/test/network_emulation",
     "../../api/transport:stun_types",
diff --git a/test/pc/e2e/BUILD.gn b/test/pc/e2e/BUILD.gn
index 8496a20..471ac3c 100644
--- a/test/pc/e2e/BUILD.gn
+++ b/test/pc/e2e/BUILD.gn
@@ -52,6 +52,7 @@
     deps = [
       "../../../api:callfactory_api",
       "../../../api:fec_controller_api",
+      "../../../api:field_trials_view",
       "../../../api:libjingle_peerconnection_api",
       "../../../api:packet_socket_factory",
       "../../../api:peer_connection_quality_test_fixture_api",
@@ -59,7 +60,6 @@
       "../../../api/rtc_event_log",
       "../../../api/task_queue",
       "../../../api/transport:network_control",
-      "../../../api/transport:webrtc_key_value_config",
       "../../../api/video_codecs:video_codecs_api",
       "../../../modules/audio_processing:api",
       "../../../p2p:rtc_p2p",
diff --git a/test/pc/e2e/peer_connection_quality_test_params.h b/test/pc/e2e/peer_connection_quality_test_params.h
index fae231c..d910826 100644
--- a/test/pc/e2e/peer_connection_quality_test_params.h
+++ b/test/pc/e2e/peer_connection_quality_test_params.h
@@ -18,11 +18,11 @@
 #include "api/audio/audio_mixer.h"
 #include "api/call/call_factory_interface.h"
 #include "api/fec_controller.h"
+#include "api/field_trials_view.h"
 #include "api/rtc_event_log/rtc_event_log_factory_interface.h"
 #include "api/task_queue/task_queue_factory.h"
 #include "api/test/peerconnection_quality_test_fixture.h"
 #include "api/transport/network_control.h"
-#include "api/transport/webrtc_key_value_config.h"
 #include "api/video_codecs/video_decoder_factory.h"
 #include "api/video_codecs/video_encoder_factory.h"
 #include "modules/audio_processing/include/audio_processing.h"
@@ -57,7 +57,7 @@
   std::unique_ptr<VideoEncoderFactory> video_encoder_factory;
   std::unique_ptr<VideoDecoderFactory> video_decoder_factory;
 
-  std::unique_ptr<WebRtcKeyValueConfig> trials;
+  std::unique_ptr<FieldTrialsView> trials;
 
   rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing;
   rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer;
diff --git a/test/scenario/scenario_config.h b/test/scenario/scenario_config.h
index c7320e9..c0dcd65 100644
--- a/test/scenario/scenario_config.h
+++ b/test/scenario/scenario_config.h
@@ -52,7 +52,7 @@
 
 struct CallClientConfig {
   TransportControllerConfig transport;
-  const WebRtcKeyValueConfig* field_trials = nullptr;
+  const FieldTrialsView* field_trials = nullptr;
 };
 
 struct PacketStreamConfig {
diff --git a/test/scoped_key_value_config.cc b/test/scoped_key_value_config.cc
index d6090b7..3b35c3d 100644
--- a/test/scoped_key_value_config.cc
+++ b/test/scoped_key_value_config.cc
@@ -10,7 +10,7 @@
 
 #include "test/scoped_key_value_config.h"
 
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "rtc_base/checks.h"
 #include "system_wrappers/include/field_trial.h"
 #include "test/field_trial.h"
diff --git a/test/scoped_key_value_config.h b/test/scoped_key_value_config.h
index a00f61a..0ecbddc 100644
--- a/test/scoped_key_value_config.h
+++ b/test/scoped_key_value_config.h
@@ -16,13 +16,13 @@
 #include <string>
 
 #include "absl/strings/string_view.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "test/field_trial.h"
 
 namespace webrtc {
 namespace test {
 
-class ScopedKeyValueConfig : public WebRtcKeyValueConfig {
+class ScopedKeyValueConfig : public FieldTrialsView {
  public:
   virtual ~ScopedKeyValueConfig();
   ScopedKeyValueConfig();
diff --git a/video/BUILD.gn b/video/BUILD.gn
index b57aa26..74f09b2 100644
--- a/video/BUILD.gn
+++ b/video/BUILD.gn
@@ -61,13 +61,13 @@
     ":video_stream_encoder_impl",
     "../api:array_view",
     "../api:fec_controller_api",
+    "../api:field_trials_view",
     "../api:frame_transformer_interface",
     "../api:libjingle_peerconnection_api",
     "../api:rtp_parameters",
     "../api:scoped_refptr",
     "../api:sequence_checker",
     "../api:transport_api",
-    "../api:webrtc_key_value_config",
     "../api/crypto:frame_decryptor_interface",
     "../api/crypto:options",
     "../api/rtc_event_log",
@@ -169,9 +169,9 @@
     ":frame_dumping_decoder",
     ":video",
     "../api:array_view",
+    "../api:field_trials_view",
     "../api:scoped_refptr",
     "../api:sequence_checker",
-    "../api:webrtc_key_value_config",
     "../api/crypto:frame_decryptor_interface",
     "../api/task_queue",
     "../api/transport:field_trial_based_config",
@@ -231,8 +231,8 @@
   ]
 
   deps = [
+    "../api:field_trials_view",
     "../api:sequence_checker",
-    "../api:webrtc_key_value_config",
     "../api/task_queue",
     "../api/transport:field_trial_based_config",
     "../api/video:encoded_frame",
@@ -279,8 +279,8 @@
   ]
 
   deps = [
+    "../api:field_trials_view",
     "../api:sequence_checker",
-    "../api:webrtc_key_value_config",
     "../api/task_queue",
     "../api/units:time_delta",
     "../api/video:video_frame",
@@ -312,8 +312,8 @@
     ":frame_decode_timing",
     ":task_queue_frame_decode_scheduler",
     ":video_receive_stream_timeout_tracker",
+    "../api:field_trials_view",
     "../api:sequence_checker",
-    "../api:webrtc_key_value_config",
     "../api/metronome",
     "../api/task_queue",
     "../api/units:data_size",
@@ -435,9 +435,9 @@
 
   deps = [
     ":frame_cadence_adapter",
+    "../api:field_trials_view",
     "../api:rtp_parameters",
     "../api:sequence_checker",
-    "../api:webrtc_key_value_config",
     "../api/adaptation:resource_adaptation_api",
     "../api/task_queue:task_queue",
     "../api/units:data_rate",
diff --git a/video/adaptation/BUILD.gn b/video/adaptation/BUILD.gn
index 84e6a32..9e946eb 100644
--- a/video/adaptation/BUILD.gn
+++ b/video/adaptation/BUILD.gn
@@ -33,10 +33,10 @@
   ]
 
   deps = [
+    "../../api:field_trials_view",
     "../../api:rtp_parameters",
     "../../api:scoped_refptr",
     "../../api:sequence_checker",
-    "../../api:webrtc_key_value_config",
     "../../api/adaptation:resource_adaptation_api",
     "../../api/task_queue:task_queue",
     "../../api/units:data_rate",
diff --git a/video/adaptation/balanced_constraint.cc b/video/adaptation/balanced_constraint.cc
index 2a54840..623b696 100644
--- a/video/adaptation/balanced_constraint.cc
+++ b/video/adaptation/balanced_constraint.cc
@@ -20,7 +20,7 @@
 
 BalancedConstraint::BalancedConstraint(
     DegradationPreferenceProvider* degradation_preference_provider,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : encoder_target_bitrate_bps_(absl::nullopt),
       balanced_settings_(field_trials),
       degradation_preference_provider_(degradation_preference_provider) {
diff --git a/video/adaptation/balanced_constraint.h b/video/adaptation/balanced_constraint.h
index ba465ab..22c7d29 100644
--- a/video/adaptation/balanced_constraint.h
+++ b/video/adaptation/balanced_constraint.h
@@ -14,8 +14,8 @@
 #include <string>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
-#include "api/webrtc_key_value_config.h"
 #include "call/adaptation/adaptation_constraint.h"
 #include "call/adaptation/degradation_preference_provider.h"
 #include "rtc_base/experiments/balanced_degradation_settings.h"
@@ -27,7 +27,7 @@
  public:
   BalancedConstraint(
       DegradationPreferenceProvider* degradation_preference_provider,
-      const WebRtcKeyValueConfig& field_trials);
+      const FieldTrialsView& field_trials);
   ~BalancedConstraint() override = default;
 
   void OnEncoderTargetBitrateUpdated(
diff --git a/video/adaptation/video_stream_encoder_resource_manager.cc b/video/adaptation/video_stream_encoder_resource_manager.cc
index 3b88ce5..24bcd2c 100644
--- a/video/adaptation/video_stream_encoder_resource_manager.cc
+++ b/video/adaptation/video_stream_encoder_resource_manager.cc
@@ -266,7 +266,7 @@
     bool experiment_cpu_load_estimator,
     std::unique_ptr<OveruseFrameDetector> overuse_detector,
     DegradationPreferenceProvider* degradation_preference_provider,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : field_trials_(field_trials),
       degradation_preference_provider_(degradation_preference_provider),
       bitrate_constraint_(std::make_unique<BitrateConstraint>()),
diff --git a/video/adaptation/video_stream_encoder_resource_manager.h b/video/adaptation/video_stream_encoder_resource_manager.h
index c01be84..9e4b271 100644
--- a/video/adaptation/video_stream_encoder_resource_manager.h
+++ b/video/adaptation/video_stream_encoder_resource_manager.h
@@ -21,6 +21,7 @@
 
 #include "absl/types/optional.h"
 #include "api/adaptation/resource.h"
+#include "api/field_trials_view.h"
 #include "api/rtp_parameters.h"
 #include "api/scoped_refptr.h"
 #include "api/task_queue/task_queue_base.h"
@@ -32,7 +33,6 @@
 #include "api/video_codecs/video_codec.h"
 #include "api/video_codecs/video_encoder.h"
 #include "api/video_codecs/video_encoder_config.h"
-#include "api/webrtc_key_value_config.h"
 #include "call/adaptation/resource_adaptation_processor_interface.h"
 #include "call/adaptation/video_stream_adapter.h"
 #include "call/adaptation/video_stream_input_state_provider.h"
@@ -81,7 +81,7 @@
       bool experiment_cpu_load_estimator,
       std::unique_ptr<OveruseFrameDetector> overuse_detector,
       DegradationPreferenceProvider* degradation_preference_provider,
-      const WebRtcKeyValueConfig& field_trials);
+      const FieldTrialsView& field_trials);
   ~VideoStreamEncoderResourceManager() override;
 
   void Initialize(rtc::TaskQueue* encoder_queue);
@@ -183,7 +183,7 @@
       const std::map<VideoAdaptationReason, VideoAdaptationCounters>&
           active_counts);
 
-  const WebRtcKeyValueConfig& field_trials_;
+  const FieldTrialsView& field_trials_;
   DegradationPreferenceProvider* const degradation_preference_provider_;
   std::unique_ptr<BitrateConstraint> bitrate_constraint_
       RTC_GUARDED_BY(encoder_queue_);
diff --git a/video/buffered_frame_decryptor.cc b/video/buffered_frame_decryptor.cc
index fb4ea76..24cbaf8 100644
--- a/video/buffered_frame_decryptor.cc
+++ b/video/buffered_frame_decryptor.cc
@@ -23,7 +23,7 @@
 BufferedFrameDecryptor::BufferedFrameDecryptor(
     OnDecryptedFrameCallback* decrypted_frame_callback,
     OnDecryptionStatusChangeCallback* decryption_status_change_callback,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : generic_descriptor_auth_experiment_(
           !field_trials.IsDisabled("WebRTC-GenericDescriptorAuth")),
       decrypted_frame_callback_(decrypted_frame_callback),
diff --git a/video/buffered_frame_decryptor.h b/video/buffered_frame_decryptor.h
index a12fc5d..681f89a 100644
--- a/video/buffered_frame_decryptor.h
+++ b/video/buffered_frame_decryptor.h
@@ -16,7 +16,7 @@
 
 #include "api/crypto/crypto_options.h"
 #include "api/crypto/frame_decryptor_interface.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "modules/video_coding/frame_object.h"
 
 namespace webrtc {
@@ -59,7 +59,7 @@
   explicit BufferedFrameDecryptor(
       OnDecryptedFrameCallback* decrypted_frame_callback,
       OnDecryptionStatusChangeCallback* decryption_status_change_callback,
-      const WebRtcKeyValueConfig& field_trials);
+      const FieldTrialsView& field_trials);
 
   ~BufferedFrameDecryptor();
   // This object cannot be copied.
diff --git a/video/frame_buffer_proxy.cc b/video/frame_buffer_proxy.cc
index c09c56a..d4da0da 100644
--- a/video/frame_buffer_proxy.cc
+++ b/video/frame_buffer_proxy.cc
@@ -43,7 +43,7 @@
                     FrameSchedulingReceiver* receiver,
                     TimeDelta max_wait_for_keyframe,
                     TimeDelta max_wait_for_frame,
-                    const WebRtcKeyValueConfig& field_trials)
+                    const FieldTrialsView& field_trials)
       : max_wait_for_keyframe_(max_wait_for_keyframe),
         max_wait_for_frame_(max_wait_for_frame),
         frame_buffer_(clock, timing, stats_proxy, field_trials),
@@ -182,7 +182,7 @@
       TimeDelta max_wait_for_keyframe,
       TimeDelta max_wait_for_frame,
       std::unique_ptr<FrameDecodeScheduler> frame_decode_scheduler,
-      const WebRtcKeyValueConfig& field_trials)
+      const FieldTrialsView& field_trials)
       : field_trials_(field_trials),
         max_wait_for_keyframe_(max_wait_for_keyframe),
         max_wait_for_frame_(max_wait_for_frame),
@@ -488,7 +488,7 @@
   }
 
   RTC_NO_UNIQUE_ADDRESS SequenceChecker worker_sequence_checker_;
-  const WebRtcKeyValueConfig& field_trials_;
+  const FieldTrialsView& field_trials_;
   const TimeDelta max_wait_for_keyframe_;
   const TimeDelta max_wait_for_frame_;
   const absl::optional<RttMultExperiment::Settings> rtt_mult_settings_ =
@@ -544,8 +544,7 @@
 
 constexpr const char* kFrameBufferFieldTrial = "WebRTC-FrameBuffer3";
 
-FrameBufferArm ParseFrameBufferFieldTrial(
-    const WebRtcKeyValueConfig& field_trials) {
+FrameBufferArm ParseFrameBufferFieldTrial(const FieldTrialsView& field_trials) {
   webrtc::FieldTrialEnum<FrameBufferArm> arm(
       "arm", FrameBufferArm::kFrameBuffer2,
       {
@@ -569,7 +568,7 @@
     TimeDelta max_wait_for_keyframe,
     TimeDelta max_wait_for_frame,
     DecodeSynchronizer* decode_sync,
-    const WebRtcKeyValueConfig& field_trials) {
+    const FieldTrialsView& field_trials) {
   switch (ParseFrameBufferFieldTrial(field_trials)) {
     case FrameBufferArm::kFrameBuffer3: {
       auto scheduler =
diff --git a/video/frame_buffer_proxy.h b/video/frame_buffer_proxy.h
index 1a61f99..e01b28c 100644
--- a/video/frame_buffer_proxy.h
+++ b/video/frame_buffer_proxy.h
@@ -13,10 +13,10 @@
 
 #include <memory>
 
+#include "api/field_trials_view.h"
 #include "api/metronome/metronome.h"
 #include "api/task_queue/task_queue_base.h"
 #include "api/video/encoded_frame.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/video_coding/include/video_coding_defines.h"
 #include "modules/video_coding/timing.h"
 #include "rtc_base/task_queue.h"
@@ -49,7 +49,7 @@
       TimeDelta max_wait_for_keyframe,
       TimeDelta max_wait_for_frame,
       DecodeSynchronizer* decode_sync,
-      const WebRtcKeyValueConfig& field_trials);
+      const FieldTrialsView& field_trials);
   virtual ~FrameBufferProxy() = default;
 
   // Run on the worker thread.
diff --git a/video/frame_buffer_proxy_unittest.cc b/video/frame_buffer_proxy_unittest.cc
index b133a94..d6f97db 100644
--- a/video/frame_buffer_proxy_unittest.cc
+++ b/video/frame_buffer_proxy_unittest.cc
@@ -198,7 +198,7 @@
               (override));
 };
 
-bool IsFrameBuffer2Enabled(const WebRtcKeyValueConfig& field_trials) {
+bool IsFrameBuffer2Enabled(const FieldTrialsView& field_trials) {
   return field_trials.Lookup("WebRTC-FrameBuffer3").find("arm:FrameBuffer2") !=
          std::string::npos;
 }
diff --git a/video/frame_cadence_adapter.cc b/video/frame_cadence_adapter.cc
index 10cabb3..7fc7939 100644
--- a/video/frame_cadence_adapter.cc
+++ b/video/frame_cadence_adapter.cc
@@ -210,7 +210,7 @@
  public:
   FrameCadenceAdapterImpl(Clock* clock,
                           TaskQueueBase* queue,
-                          const WebRtcKeyValueConfig& field_trials);
+                          const FieldTrialsView& field_trials);
   ~FrameCadenceAdapterImpl();
 
   // FrameCadenceAdapterInterface overrides.
@@ -546,7 +546,7 @@
 FrameCadenceAdapterImpl::FrameCadenceAdapterImpl(
     Clock* clock,
     TaskQueueBase* queue,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : clock_(clock),
       queue_(queue),
       zero_hertz_screenshare_enabled_(
@@ -742,7 +742,7 @@
 std::unique_ptr<FrameCadenceAdapterInterface>
 FrameCadenceAdapterInterface::Create(Clock* clock,
                                      TaskQueueBase* queue,
-                                     const WebRtcKeyValueConfig& field_trials) {
+                                     const FieldTrialsView& field_trials) {
   return std::make_unique<FrameCadenceAdapterImpl>(clock, queue, field_trials);
 }
 
diff --git a/video/frame_cadence_adapter.h b/video/frame_cadence_adapter.h
index 843d8eb..40e9805 100644
--- a/video/frame_cadence_adapter.h
+++ b/video/frame_cadence_adapter.h
@@ -14,11 +14,11 @@
 #include <memory>
 
 #include "absl/base/attributes.h"
+#include "api/field_trials_view.h"
 #include "api/task_queue/task_queue_base.h"
 #include "api/units/time_delta.h"
 #include "api/video/video_frame.h"
 #include "api/video/video_sink_interface.h"
-#include "api/webrtc_key_value_config.h"
 #include "rtc_base/synchronization/mutex.h"
 #include "rtc_base/thread_annotations.h"
 #include "system_wrappers/include/clock.h"
@@ -81,7 +81,7 @@
   static std::unique_ptr<FrameCadenceAdapterInterface> Create(
       Clock* clock,
       TaskQueueBase* queue,
-      const WebRtcKeyValueConfig& field_trials);
+      const FieldTrialsView& field_trials);
 
   // Call before using the rest of the API.
   virtual void Initialize(Callback* callback) = 0;
diff --git a/video/frame_cadence_adapter_unittest.cc b/video/frame_cadence_adapter_unittest.cc
index edc6cae..4770f05 100644
--- a/video/frame_cadence_adapter_unittest.cc
+++ b/video/frame_cadence_adapter_unittest.cc
@@ -60,7 +60,7 @@
 }
 
 std::unique_ptr<FrameCadenceAdapterInterface> CreateAdapter(
-    const WebRtcKeyValueConfig& field_trials,
+    const FieldTrialsView& field_trials,
     Clock* clock) {
   return FrameCadenceAdapterInterface::Create(clock, TaskQueueBase::Current(),
                                               field_trials);
diff --git a/video/frame_decode_timing_unittest.cc b/video/frame_decode_timing_unittest.cc
index 743e722..0066afe 100644
--- a/video/frame_decode_timing_unittest.cc
+++ b/video/frame_decode_timing_unittest.cc
@@ -31,7 +31,7 @@
 
 class FakeVCMTiming : public webrtc::VCMTiming {
  public:
-  explicit FakeVCMTiming(Clock* clock, const WebRtcKeyValueConfig& field_trials)
+  explicit FakeVCMTiming(Clock* clock, const FieldTrialsView& field_trials)
       : webrtc::VCMTiming(clock, field_trials) {}
 
   Timestamp RenderTime(uint32_t frame_timestamp, Timestamp now) const override {
diff --git a/video/receive_statistics_proxy.cc b/video/receive_statistics_proxy.cc
index 0a854ce..e42a559 100644
--- a/video/receive_statistics_proxy.cc
+++ b/video/receive_statistics_proxy.cc
@@ -77,7 +77,7 @@
   return ss.str();
 }
 
-bool EnableDecodeTimeHistogram(const WebRtcKeyValueConfig* field_trials) {
+bool EnableDecodeTimeHistogram(const FieldTrialsView* field_trials) {
   if (field_trials == nullptr) {
     return true;
   }
@@ -89,7 +89,7 @@
 ReceiveStatisticsProxy::ReceiveStatisticsProxy(
     uint32_t remote_ssrc,
     Clock* clock,
-    const WebRtcKeyValueConfig* field_trials)
+    const FieldTrialsView* field_trials)
     : clock_(clock),
       start_ms_(clock->TimeInMilliseconds()),
       enable_decode_time_histograms_(EnableDecodeTimeHistogram(field_trials)),
diff --git a/video/receive_statistics_proxy.h b/video/receive_statistics_proxy.h
index 8dab897..584b3c1 100644
--- a/video/receive_statistics_proxy.h
+++ b/video/receive_statistics_proxy.h
@@ -17,8 +17,8 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
-#include "api/webrtc_key_value_config.h"
 #include "call/video_receive_stream.h"
 #include "modules/include/module_common_types.h"
 #include "modules/video_coding/include/video_coding_defines.h"
@@ -45,7 +45,7 @@
  public:
   ReceiveStatisticsProxy(uint32_t remote_ssrc,
                          Clock* clock,
-                         const WebRtcKeyValueConfig* field_trials = nullptr);
+                         const FieldTrialsView* field_trials = nullptr);
   ~ReceiveStatisticsProxy() = default;
 
   VideoReceiveStream::Stats GetStats() const;
diff --git a/video/receive_statistics_proxy2.cc b/video/receive_statistics_proxy2.cc
index 5d49d36..5f12026 100644
--- a/video/receive_statistics_proxy2.cc
+++ b/video/receive_statistics_proxy2.cc
@@ -101,7 +101,7 @@
     uint32_t remote_ssrc,
     Clock* clock,
     TaskQueueBase* worker_thread,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : clock_(clock),
       start_ms_(clock->TimeInMilliseconds()),
       enable_decode_time_histograms_(
diff --git a/video/receive_statistics_proxy2.h b/video/receive_statistics_proxy2.h
index afe7458..328c92c 100644
--- a/video/receive_statistics_proxy2.h
+++ b/video/receive_statistics_proxy2.h
@@ -17,10 +17,10 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
 #include "api/task_queue/task_queue_base.h"
 #include "api/units/timestamp.h"
-#include "api/webrtc_key_value_config.h"
 #include "call/video_receive_stream.h"
 #include "modules/include/module_common_types.h"
 #include "modules/video_coding/include/video_coding_defines.h"
@@ -52,7 +52,7 @@
   ReceiveStatisticsProxy(uint32_t remote_ssrc,
                          Clock* clock,
                          TaskQueueBase* worker_thread,
-                         const WebRtcKeyValueConfig& field_trials);
+                         const FieldTrialsView& field_trials);
   ~ReceiveStatisticsProxy() override;
 
   VideoReceiveStream::Stats GetStats() const;
diff --git a/video/rtp_video_stream_receiver.cc b/video/rtp_video_stream_receiver.cc
index 1788823e..04484b9 100644
--- a/video/rtp_video_stream_receiver.cc
+++ b/video/rtp_video_stream_receiver.cc
@@ -19,7 +19,7 @@
 #include "absl/algorithm/container.h"
 #include "absl/memory/memory.h"
 #include "absl/types/optional.h"
-#include "api/webrtc_key_value_config.h"
+#include "api/field_trials_view.h"
 #include "media/base/media_constants.h"
 #include "modules/pacing/packet_router.h"
 #include "modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
@@ -59,7 +59,7 @@
 constexpr int kPacketBufferStartSize = 512;
 constexpr int kPacketBufferMaxSize = 2048;
 
-int PacketBufferMaxSize(const WebRtcKeyValueConfig& field_trials) {
+int PacketBufferMaxSize(const FieldTrialsView& field_trials) {
   // The group here must be a positive power of 2, in which case that is used as
   // size. All other values shall result in the default value being used.
   const std::string group_name =
@@ -212,7 +212,7 @@
     OnCompleteFrameCallback* complete_frame_callback,
     rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor,
     rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
-    const WebRtcKeyValueConfig* field_trials)
+    const FieldTrialsView* field_trials)
     : RtpVideoStreamReceiver(clock,
                              transport,
                              rtt_stats,
@@ -244,7 +244,7 @@
     OnCompleteFrameCallback* complete_frame_callback,
     rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor,
     rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
-    const WebRtcKeyValueConfig* field_trials)
+    const FieldTrialsView* field_trials)
     : field_trials_(field_trials ? *field_trials : owned_field_trials_),
       clock_(clock),
       config_(*config),
diff --git a/video/rtp_video_stream_receiver.h b/video/rtp_video_stream_receiver.h
index 1e0f7bc..f46f257 100644
--- a/video/rtp_video_stream_receiver.h
+++ b/video/rtp_video_stream_receiver.h
@@ -103,7 +103,7 @@
       OnCompleteFrameCallback* complete_frame_callback,
       rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor,
       rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
 
   RtpVideoStreamReceiver(
       Clock* clock,
@@ -125,7 +125,7 @@
       OnCompleteFrameCallback* complete_frame_callback,
       rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor,
       rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
-      const WebRtcKeyValueConfig* field_trials = nullptr);
+      const FieldTrialsView* field_trials = nullptr);
   ~RtpVideoStreamReceiver() override;
 
   void AddReceiveCodec(uint8_t payload_type,
@@ -329,7 +329,7 @@
                                      bool is_keyframe)
       RTC_RUN_ON(worker_task_checker_);
 
-  const WebRtcKeyValueConfig& field_trials_;
+  const FieldTrialsView& field_trials_;
   FieldTrialBasedConfig owned_field_trials_;
 
   Clock* const clock_;
diff --git a/video/rtp_video_stream_receiver2.cc b/video/rtp_video_stream_receiver2.cc
index 25687b3..9956760 100644
--- a/video/rtp_video_stream_receiver2.cc
+++ b/video/rtp_video_stream_receiver2.cc
@@ -56,7 +56,7 @@
 constexpr int kPacketBufferStartSize = 512;
 constexpr int kPacketBufferMaxSize = 2048;
 
-int PacketBufferMaxSize(const WebRtcKeyValueConfig& field_trials) {
+int PacketBufferMaxSize(const FieldTrialsView& field_trials) {
   // The group here must be a positive power of 2, in which case that is used as
   // size. All other values shall result in the default value being used.
   const std::string group_name =
@@ -109,7 +109,7 @@
     Clock* clock,
     NackSender* nack_sender,
     KeyFrameRequestSender* keyframe_request_sender,
-    const WebRtcKeyValueConfig& field_trials) {
+    const FieldTrialsView& field_trials) {
   if (config.rtp.nack.rtp_history_ms == 0)
     return nullptr;
 
@@ -218,7 +218,7 @@
     OnCompleteFrameCallback* complete_frame_callback,
     rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor,
     rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : field_trials_(field_trials),
       clock_(clock),
       config_(*config),
diff --git a/video/rtp_video_stream_receiver2.h b/video/rtp_video_stream_receiver2.h
index 88b012d..d907227 100644
--- a/video/rtp_video_stream_receiver2.h
+++ b/video/rtp_video_stream_receiver2.h
@@ -97,7 +97,7 @@
       OnCompleteFrameCallback* complete_frame_callback,
       rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor,
       rtc::scoped_refptr<FrameTransformerInterface> frame_transformer,
-      const WebRtcKeyValueConfig& field_trials);
+      const FieldTrialsView& field_trials);
   ~RtpVideoStreamReceiver2() override;
 
   void AddReceiveCodec(uint8_t payload_type,
@@ -287,7 +287,7 @@
                                      bool is_keyframe)
       RTC_RUN_ON(packet_sequence_checker_);
 
-  const WebRtcKeyValueConfig& field_trials_;
+  const FieldTrialsView& field_trials_;
   Clock* const clock_;
   // Ownership of this object lies with VideoReceiveStream, which owns `this`.
   const VideoReceiveStream::Config& config_;
diff --git a/video/send_statistics_proxy.cc b/video/send_statistics_proxy.cc
index aa8a078..bc4ff5d 100644
--- a/video/send_statistics_proxy.cc
+++ b/video/send_statistics_proxy.cc
@@ -110,7 +110,7 @@
 }
 
 absl::optional<int> GetFallbackMaxPixelsIfFieldTrialEnabled(
-    const webrtc::WebRtcKeyValueConfig& field_trials) {
+    const webrtc::FieldTrialsView& field_trials) {
   std::string group = field_trials.Lookup(kVp8ForcedFallbackEncoderFieldTrial);
   return (absl::StartsWith(group, "Enabled"))
              ? GetFallbackMaxPixels(group.substr(7))
@@ -118,7 +118,7 @@
 }
 
 absl::optional<int> GetFallbackMaxPixelsIfFieldTrialDisabled(
-    const webrtc::WebRtcKeyValueConfig& field_trials) {
+    const webrtc::FieldTrialsView& field_trials) {
   std::string group = field_trials.Lookup(kVp8ForcedFallbackEncoderFieldTrial);
   return (absl::StartsWith(group, "Disabled"))
              ? GetFallbackMaxPixels(group.substr(8))
@@ -132,7 +132,7 @@
     Clock* clock,
     const VideoSendStream::Config& config,
     VideoEncoderConfig::ContentType content_type,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : clock_(clock),
       payload_name_(config.rtp.payload_name),
       rtp_config_(config.rtp),
diff --git a/video/send_statistics_proxy.h b/video/send_statistics_proxy.h
index f5d17ea..a1319d8 100644
--- a/video/send_statistics_proxy.h
+++ b/video/send_statistics_proxy.h
@@ -17,10 +17,10 @@
 #include <string>
 #include <vector>
 
+#include "api/field_trials_view.h"
 #include "api/video/video_codec_constants.h"
 #include "api/video/video_stream_encoder_observer.h"
 #include "api/video_codecs/video_encoder_config.h"
-#include "api/webrtc_key_value_config.h"
 #include "call/video_send_stream.h"
 #include "modules/include/module_common_types_public.h"
 #include "modules/rtp_rtcp/include/report_block_data.h"
@@ -53,7 +53,7 @@
   SendStatisticsProxy(Clock* clock,
                       const VideoSendStream::Config& config,
                       VideoEncoderConfig::ContentType content_type,
-                      const WebRtcKeyValueConfig& field_trials);
+                      const FieldTrialsView& field_trials);
   ~SendStatisticsProxy() override;
 
   virtual VideoSendStream::Stats GetStats();
diff --git a/video/video_receive_stream2.cc b/video/video_receive_stream2.cc
index df99866..45415c3 100644
--- a/video/video_receive_stream2.cc
+++ b/video/video_receive_stream2.cc
@@ -130,8 +130,7 @@
   absl::optional<webrtc::ColorSpace> color_space_;
 };
 
-RenderResolution InitialDecoderResolution(
-    const WebRtcKeyValueConfig& field_trials) {
+RenderResolution InitialDecoderResolution(const FieldTrialsView& field_trials) {
   FieldTrialOptional<int> width("w");
   FieldTrialOptional<int> height("h");
   ParseFieldTrial({&width, &height},
diff --git a/video/video_send_stream.cc b/video/video_send_stream.cc
index ea51fb8..e3f04c8 100644
--- a/video/video_send_stream.cc
+++ b/video/video_send_stream.cc
@@ -63,7 +63,7 @@
 
 VideoStreamEncoder::BitrateAllocationCallbackType
 GetBitrateAllocationCallbackType(const VideoSendStream::Config& config,
-                                 const WebRtcKeyValueConfig& field_trials) {
+                                 const FieldTrialsView& field_trials) {
   if (webrtc::RtpExtension::FindHeaderExtensionByUri(
           config.rtp.extensions,
           webrtc::RtpExtension::kVideoLayersAllocationUri,
@@ -115,7 +115,7 @@
     const VideoStreamEncoderSettings& encoder_settings,
     VideoStreamEncoder::BitrateAllocationCallbackType
         bitrate_allocation_callback_type,
-    const WebRtcKeyValueConfig& field_trials) {
+    const FieldTrialsView& field_trials) {
   std::unique_ptr<TaskQueueBase, TaskQueueDeleter> encoder_queue =
       task_queue_factory->CreateTaskQueue("EncoderQueue",
                                           TaskQueueFactory::Priority::NORMAL);
@@ -147,7 +147,7 @@
     const std::map<uint32_t, RtpState>& suspended_ssrcs,
     const std::map<uint32_t, RtpPayloadState>& suspended_payload_states,
     std::unique_ptr<FecController> fec_controller,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : rtp_transport_queue_(transport->GetWorkerQueue()),
       transport_(transport),
       stats_proxy_(clock, config, encoder_config.content_type, field_trials),
diff --git a/video/video_send_stream.h b/video/video_send_stream.h
index 048de3d..1912307 100644
--- a/video/video_send_stream.h
+++ b/video/video_send_stream.h
@@ -16,9 +16,9 @@
 #include <vector>
 
 #include "api/fec_controller.h"
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
 #include "api/video/video_stream_encoder_interface.h"
-#include "api/webrtc_key_value_config.h"
 #include "call/bitrate_allocator.h"
 #include "call/video_receive_stream.h"
 #include "call/video_send_stream.h"
@@ -70,7 +70,7 @@
       const std::map<uint32_t, RtpState>& suspended_ssrcs,
       const std::map<uint32_t, RtpPayloadState>& suspended_payload_states,
       std::unique_ptr<FecController> fec_controller,
-      const WebRtcKeyValueConfig& field_trials);
+      const FieldTrialsView& field_trials);
 
   ~VideoSendStream() override;
 
diff --git a/video/video_send_stream_impl.cc b/video/video_send_stream_impl.cc
index 27e5541..c151374 100644
--- a/video/video_send_stream_impl.cc
+++ b/video/video_send_stream_impl.cc
@@ -192,7 +192,7 @@
 
 }  // namespace
 
-PacingConfig::PacingConfig(const WebRtcKeyValueConfig& field_trials)
+PacingConfig::PacingConfig(const FieldTrialsView& field_trials)
     : pacing_factor("factor", kStrictPacingMultiplier),
       max_pacing_delay("max_delay",
                        TimeDelta::Millis(PacedSender::kMaxQueueLengthMs)) {
@@ -214,7 +214,7 @@
     double initial_encoder_bitrate_priority,
     VideoEncoderConfig::ContentType content_type,
     RtpVideoSenderInterface* rtp_video_sender,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : clock_(clock),
       has_alr_probing_(config->periodic_alr_bandwidth_probing ||
                        GetAlrSettings(content_type)),
diff --git a/video/video_send_stream_impl.h b/video/video_send_stream_impl.h
index a2c3dfe..076b25d 100644
--- a/video/video_send_stream_impl.h
+++ b/video/video_send_stream_impl.h
@@ -19,13 +19,13 @@
 #include <vector>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/video/encoded_image.h"
 #include "api/video/video_bitrate_allocation.h"
 #include "api/video/video_bitrate_allocator.h"
 #include "api/video/video_stream_encoder_interface.h"
 #include "api/video_codecs/video_encoder.h"
 #include "api/video_codecs/video_encoder_config.h"
-#include "api/webrtc_key_value_config.h"
 #include "call/bitrate_allocator.h"
 #include "call/rtp_config.h"
 #include "call/rtp_transport_controller_send_interface.h"
@@ -46,7 +46,7 @@
 
 // Pacing buffer config; overridden by ALR config if provided.
 struct PacingConfig {
-  explicit PacingConfig(const WebRtcKeyValueConfig& field_trials);
+  explicit PacingConfig(const FieldTrialsView& field_trials);
   PacingConfig(const PacingConfig&);
   PacingConfig& operator=(const PacingConfig&) = default;
   ~PacingConfig();
@@ -75,7 +75,7 @@
                       double initial_encoder_bitrate_priority,
                       VideoEncoderConfig::ContentType content_type,
                       RtpVideoSenderInterface* rtp_video_sender,
-                      const WebRtcKeyValueConfig& field_trials);
+                      const FieldTrialsView& field_trials);
   ~VideoSendStreamImpl() override;
 
   void DeliverRtcp(const uint8_t* packet, size_t length);
diff --git a/video/video_stream_decoder_impl.cc b/video/video_stream_decoder_impl.cc
index 8704a6ef..5f275ff 100644
--- a/video/video_stream_decoder_impl.cc
+++ b/video/video_stream_decoder_impl.cc
@@ -24,7 +24,7 @@
     VideoDecoderFactory* decoder_factory,
     TaskQueueFactory* task_queue_factory,
     std::map<int, std::pair<SdpVideoFormat, int>> decoder_settings,
-    const WebRtcKeyValueConfig* field_trials)
+    const FieldTrialsView* field_trials)
     : field_trials_(field_trials),
       timing_(Clock::GetRealTimeClock(), *field_trials_),
       decode_callbacks_(this),
diff --git a/video/video_stream_decoder_impl.h b/video/video_stream_decoder_impl.h
index d4fe1f7..f76506f 100644
--- a/video/video_stream_decoder_impl.h
+++ b/video/video_stream_decoder_impl.h
@@ -16,10 +16,10 @@
 #include <utility>
 
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
 #include "api/transport/field_trial_based_config.h"
 #include "api/video/video_stream_decoder.h"
-#include "api/webrtc_key_value_config.h"
 #include "modules/video_coding/frame_buffer2.h"
 #include "modules/video_coding/timing.h"
 #include "rtc_base/memory/always_valid_pointer.h"
@@ -37,7 +37,7 @@
       VideoDecoderFactory* decoder_factory,
       TaskQueueFactory* task_queue_factory,
       std::map<int, std::pair<SdpVideoFormat, int>> decoder_settings,
-      const WebRtcKeyValueConfig* field_trials);
+      const FieldTrialsView* field_trials);
 
   ~VideoStreamDecoderImpl() override;
 
@@ -86,7 +86,7 @@
   VideoStreamDecoderImpl::DecodeResult DecodeFrame(
       std::unique_ptr<EncodedFrame> frame) RTC_RUN_ON(decode_queue_);
 
-  AlwaysValidPointer<const WebRtcKeyValueConfig, FieldTrialBasedConfig>
+  AlwaysValidPointer<const FieldTrialsView, FieldTrialBasedConfig>
       field_trials_;
   VCMTiming timing_;
   DecodeCallbacks decode_callbacks_;
diff --git a/video/video_stream_encoder.cc b/video/video_stream_encoder.cc
index 58a2620..c8bba6b 100644
--- a/video/video_stream_encoder.cc
+++ b/video/video_stream_encoder.cc
@@ -19,6 +19,7 @@
 
 #include "absl/algorithm/container.h"
 #include "absl/types/optional.h"
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
 #include "api/task_queue/queued_task.h"
 #include "api/task_queue/task_queue_base.h"
@@ -30,7 +31,6 @@
 #include "api/video/video_layers_allocation.h"
 #include "api/video_codecs/sdp_video_format.h"
 #include "api/video_codecs/video_encoder.h"
-#include "api/webrtc_key_value_config.h"
 #include "call/adaptation/resource_adaptation_processor.h"
 #include "call/adaptation/video_stream_adapter.h"
 #include "modules/video_coding/include/video_codec_initializer.h"
@@ -598,7 +598,7 @@
     std::unique_ptr<webrtc::TaskQueueBase, webrtc::TaskQueueDeleter>
         encoder_queue,
     BitrateAllocationCallbackType allocation_cb_type,
-    const WebRtcKeyValueConfig& field_trials)
+    const FieldTrialsView& field_trials)
     : field_trials_(field_trials),
       worker_queue_(TaskQueueBase::Current()),
       number_of_cores_(number_of_cores),
diff --git a/video/video_stream_encoder.h b/video/video_stream_encoder.h
index 6795986..f3dbd48 100644
--- a/video/video_stream_encoder.h
+++ b/video/video_stream_encoder.h
@@ -18,6 +18,7 @@
 #include <vector>
 
 #include "api/adaptation/resource.h"
+#include "api/field_trials_view.h"
 #include "api/sequence_checker.h"
 #include "api/units/data_rate.h"
 #include "api/video/video_bitrate_allocator.h"
@@ -28,7 +29,6 @@
 #include "api/video/video_stream_encoder_settings.h"
 #include "api/video_codecs/video_codec.h"
 #include "api/video_codecs/video_encoder.h"
-#include "api/webrtc_key_value_config.h"
 #include "call/adaptation/adaptation_constraint.h"
 #include "call/adaptation/resource_adaptation_processor.h"
 #include "call/adaptation/resource_adaptation_processor_interface.h"
@@ -81,7 +81,7 @@
       std::unique_ptr<webrtc::TaskQueueBase, webrtc::TaskQueueDeleter>
           encoder_queue,
       BitrateAllocationCallbackType allocation_cb_type,
-      const WebRtcKeyValueConfig& field_trials);
+      const FieldTrialsView& field_trials);
   ~VideoStreamEncoder() override;
 
   VideoStreamEncoder(const VideoStreamEncoder&) = delete;
@@ -252,7 +252,7 @@
 
   void RequestEncoderSwitch() RTC_RUN_ON(&encoder_queue_);
 
-  const WebRtcKeyValueConfig& field_trials_;
+  const FieldTrialsView& field_trials_;
   TaskQueueBase* const worker_queue_;
 
   const uint32_t number_of_cores_;
diff --git a/video/video_stream_encoder_unittest.cc b/video/video_stream_encoder_unittest.cc
index 09ca0b6..5999ab4 100644
--- a/video/video_stream_encoder_unittest.cc
+++ b/video/video_stream_encoder_unittest.cc
@@ -375,7 +375,7 @@
       const VideoStreamEncoderSettings& settings,
       VideoStreamEncoder::BitrateAllocationCallbackType
           allocation_callback_type,
-      const WebRtcKeyValueConfig& field_trials)
+      const FieldTrialsView& field_trials)
       : VideoStreamEncoder(time_controller->GetClock(),
                            1 /* number_of_cores */,
                            stats_proxy,
@@ -612,7 +612,7 @@
   MockableSendStatisticsProxy(Clock* clock,
                               const VideoSendStream::Config& config,
                               VideoEncoderConfig::ContentType content_type,
-                              const WebRtcKeyValueConfig& field_trials)
+                              const FieldTrialsView& field_trials)
       : SendStatisticsProxy(clock, config, content_type, field_trials) {}
 
   VideoSendStream::Stats GetStats() override {
@@ -681,7 +681,7 @@
   std::unique_ptr<AdaptedVideoStreamEncoder> CreateWithEncoderQueue(
       std::unique_ptr<FrameCadenceAdapterInterface> zero_hertz_adapter,
       std::unique_ptr<TaskQueueBase, TaskQueueDeleter> encoder_queue,
-      const WebRtcKeyValueConfig* field_trials = nullptr) {
+      const FieldTrialsView* field_trials = nullptr) {
     auto result = std::make_unique<AdaptedVideoStreamEncoder>(
         time_controller_.GetClock(),
         /*number_of_cores=*/1,