diff --git a/api/test/peerconnection_quality_test_fixture.h b/api/test/peerconnection_quality_test_fixture.h
index b22b392..9538194 100644
--- a/api/test/peerconnection_quality_test_fixture.h
+++ b/api/test/peerconnection_quality_test_fixture.h
@@ -167,6 +167,9 @@
     // If is set, an RTCEventLog will be saved in that location and it will be
     // available for further analysis.
     virtual PeerConfigurer* SetRtcEventLogPath(std::string path) = 0;
+    // If is set, an AEC dump will be saved in that location and it will be
+    // available for further analysis.
+    virtual PeerConfigurer* SetAecDumpPath(std::string path) = 0;
     virtual PeerConfigurer* SetRTCConfiguration(
         PeerConnectionInterface::RTCConfiguration configuration) = 0;
   };
diff --git a/resources/pc_quality_smoke_test_alice_source.wav.sha1 b/resources/pc_quality_smoke_test_alice_source.wav.sha1
new file mode 100644
index 0000000..dd973ff
--- /dev/null
+++ b/resources/pc_quality_smoke_test_alice_source.wav.sha1
@@ -0,0 +1 @@
+28738955a60b9559b58b232e4d2d9cb7a1dd9b2a
\ No newline at end of file
diff --git a/resources/pc_quality_smoke_test_bob_source.wav.sha1 b/resources/pc_quality_smoke_test_bob_source.wav.sha1
new file mode 100644
index 0000000..73b1e60
--- /dev/null
+++ b/resources/pc_quality_smoke_test_bob_source.wav.sha1
@@ -0,0 +1 @@
+b18e0d654b84e6150dc79140f40dac3f8e675e7d
\ No newline at end of file
diff --git a/test/pc/e2e/BUILD.gn b/test/pc/e2e/BUILD.gn
index f11c89e..e46f33d 100644
--- a/test/pc/e2e/BUILD.gn
+++ b/test/pc/e2e/BUILD.gn
@@ -208,11 +208,13 @@
       "../../../modules/audio_device:audio_device_api",
       "../../../modules/audio_device:audio_device_impl",
       "../../../modules/audio_processing:api",
+      "../../../modules/audio_processing/aec_dump:aec_dump",
       "../../../p2p:rtc_p2p",
       "../../../pc:pc_test_utils",
       "../../../pc:peerconnection_wrapper",
       "../../../rtc_base",
       "../../../rtc_base:rtc_base_approved",
+      "../../../rtc_base:rtc_task_queue",
       "../../../test:copy_to_file_audio_capturer",
       "../../../test:video_test_common",
       "//third_party/abseil-cpp/absl/memory",
@@ -286,6 +288,20 @@
     ]
   }
 
+  peer_connection_e2e_smoke_test_resources = [
+    "../../../resources/pc_quality_smoke_test_alice_source.wav",
+    "../../../resources/pc_quality_smoke_test_bob_source.wav",
+  ]
+  if (is_ios) {
+    bundle_data("peer_connection_e2e_smoke_test_resources_bundle_data") {
+      testonly = true
+      sources = peer_connection_e2e_smoke_test_resources
+      outputs = [
+        "{{bundle_resources_dir}}/{{source_file_part}}",
+      ]
+    }
+  }
+
   rtc_source_set("peer_connection_e2e_smoke_test") {
     testonly = true
     sources = [
@@ -321,6 +337,10 @@
       "../../../test:test_support",
       "//third_party/abseil-cpp/absl/memory",
     ]
+    data = peer_connection_e2e_smoke_test_resources
+    if (is_ios) {
+      deps += [ ":peer_connection_e2e_smoke_test_resources_bundle_data" ]
+    }
   }
 
   rtc_source_set("stats_poller") {
diff --git a/test/pc/e2e/peer_connection_e2e_smoke_test.cc b/test/pc/e2e/peer_connection_e2e_smoke_test.cc
index 4bba7e9..f32e972 100644
--- a/test/pc/e2e/peer_connection_e2e_smoke_test.cc
+++ b/test/pc/e2e/peer_connection_e2e_smoke_test.cc
@@ -85,6 +85,9 @@
                      alice->AddVideoConfig(std::move(video_config));
                      AudioConfig audio_config;
                      audio_config.stream_label = "alice-audio";
+                     audio_config.mode = AudioConfig::Mode::kFile;
+                     audio_config.input_file_name = test::ResourcePath(
+                         "pc_quality_smoke_test_alice_source", "wav");
                      alice->SetAudioConfig(std::move(audio_config));
                    });
 
@@ -98,10 +101,13 @@
                      bob->AddVideoConfig(std::move(video_config));
                      AudioConfig audio_config;
                      audio_config.stream_label = "bob-audio";
+                     audio_config.mode = AudioConfig::Mode::kFile;
+                     audio_config.input_file_name = test::ResourcePath(
+                         "pc_quality_smoke_test_bob_source", "wav");
                      bob->SetAudioConfig(std::move(audio_config));
                    });
 
-  RunParams run_params(TimeDelta::seconds(5));
+  RunParams run_params(TimeDelta::seconds(7));
   run_params.video_encoder_bitrate_multiplier = 1.1;
   fixture->Run(run_params);
 
diff --git a/test/pc/e2e/peer_connection_quality_test.cc b/test/pc/e2e/peer_connection_quality_test.cc
index dfee644..24d778b 100644
--- a/test/pc/e2e/peer_connection_quality_test.cc
+++ b/test/pc/e2e/peer_connection_quality_test.cc
@@ -234,6 +234,9 @@
   signaling_thread->SetName(kSignalThreadName, nullptr);
   signaling_thread->Start();
 
+  // Create a |task_queue_|.
+  task_queue_ = absl::make_unique<TaskQueueForTest>("pc_e2e_quality_test");
+
   // Create call participants: Alice and Bob.
   // Audio streams are intercepted in AudioDeviceModule, so if it is required to
   // catch output of Alice's stream, Alice's output_dump_file_name should be
@@ -259,7 +262,7 @@
           [this]() { StartVideo(alice_video_sources_); }),
       video_quality_analyzer_injection_helper_.get(), signaling_thread.get(),
       alice_audio_output_dump_file_name,
-      run_params.video_encoder_bitrate_multiplier);
+      run_params.video_encoder_bitrate_multiplier, task_queue_.get());
   bob_ = TestPeer::CreateTestPeer(
       std::move(bob_components), std::move(bob_params),
       absl::make_unique<FixturePeerConnectionObserver>(
@@ -270,7 +273,7 @@
           [this]() { StartVideo(bob_video_sources_); }),
       video_quality_analyzer_injection_helper_.get(), signaling_thread.get(),
       bob_audio_output_dump_file_name,
-      run_params.video_encoder_bitrate_multiplier);
+      run_params.video_encoder_bitrate_multiplier, task_queue_.get());
 
   int num_cores = CpuInfo::DetectNumberOfCores();
   RTC_DCHECK_GE(num_cores, 1);
@@ -302,8 +305,6 @@
                                  webrtc::RtcEventLog::kImmediateOutput);
   }
 
-  // Create a |task_queue_|.
-  task_queue_ = absl::make_unique<TaskQueueForTest>("pc_e2e_quality_test");
   // Setup call.
   signaling_thread->Invoke<void>(
       RTC_FROM_HERE,
@@ -345,6 +346,10 @@
   RTC_CHECK(no_timeout) << "Failed to stop Stats polling after "
                         << kStatsPollingStopTimeout.seconds() << " seconds.";
 
+  // We need to detach AEC dumping from peers, because dump uses |task_queue_|
+  // inside.
+  alice_->DetachAecDump();
+  bob_->DetachAecDump();
   // Destroy |task_queue_|. It is done to stop all running tasks and prevent
   // their access to any call related objects after these objects will be
   // destroyed during call tear down.
@@ -449,7 +454,9 @@
       if (p->audio_config.value().mode == AudioConfig::Mode::kFile) {
         RTC_CHECK(p->audio_config.value().input_file_name);
         RTC_CHECK(
-            test::FileExists(p->audio_config.value().input_file_name.value()));
+            test::FileExists(p->audio_config.value().input_file_name.value()))
+            << p->audio_config.value().input_file_name.value()
+            << " doesn't exist";
       }
     }
   }
diff --git a/test/pc/e2e/peer_connection_quality_test.h b/test/pc/e2e/peer_connection_quality_test.h
index 1be72e7..556c2fa 100644
--- a/test/pc/e2e/peer_connection_quality_test.h
+++ b/test/pc/e2e/peer_connection_quality_test.h
@@ -123,6 +123,10 @@
     params_->rtc_event_log_path = std::move(path);
     return this;
   }
+  PeerConfigurer* SetAecDumpPath(std::string path) override {
+    params_->aec_dump_path = std::move(path);
+    return this;
+  }
   PeerConfigurer* SetRTCConfiguration(
       PeerConnectionInterface::RTCConfiguration configuration) override {
     params_->rtc_configuration = std::move(configuration);
diff --git a/test/pc/e2e/peer_connection_quality_test_params.h b/test/pc/e2e/peer_connection_quality_test_params.h
index 079e5eb..76dd406 100644
--- a/test/pc/e2e/peer_connection_quality_test_params.h
+++ b/test/pc/e2e/peer_connection_quality_test_params.h
@@ -104,6 +104,9 @@
   // If |rtc_event_log_path| is set, an RTCEventLog will be saved in that
   // location and it will be available for further analysis.
   absl::optional<std::string> rtc_event_log_path;
+  // If |aec_dump_path| is set, an AEC dump will be saved in that location and
+  // it will be available for further analysis.
+  absl::optional<std::string> aec_dump_path;
 
   PeerConnectionInterface::RTCConfiguration rtc_configuration;
 };
diff --git a/test/pc/e2e/test_peer.cc b/test/pc/e2e/test_peer.cc
index 1726fe6..d5e4379 100644
--- a/test/pc/e2e/test_peer.cc
+++ b/test/pc/e2e/test_peer.cc
@@ -21,6 +21,7 @@
 #include "logging/rtc_event_log/rtc_event_log_factory.h"
 #include "media/engine/webrtc_media_engine.h"
 #include "modules/audio_device/include/audio_device.h"
+#include "modules/audio_processing/aec_dump/aec_dump_factory.h"
 #include "modules/audio_processing/include/audio_processing.h"
 #include "p2p/client/basic_port_allocator.h"
 #include "rtc_base/location.h"
@@ -33,8 +34,6 @@
 constexpr int16_t kGeneratedAudioMaxAmplitude = 32000;
 constexpr int kSamplingFrequencyInHz = 48000;
 
-using AudioConfig = PeerConnectionE2EQualityTestFixture::AudioConfig;
-
 // Sets mandatory entities in injectable components like |pcf_dependencies|
 // and |pc_dependencies| if they are omitted. Also setup required
 // dependencies, that won't be specially provided by factory and will be just
@@ -53,175 +52,232 @@
   }
 }
 
-std::unique_ptr<TestAudioDeviceModule::Capturer> CreateAudioCapturer(
-    AudioConfig audio_config) {
-  if (audio_config.mode == AudioConfig::Mode::kGenerated) {
-    return TestAudioDeviceModule::CreatePulsedNoiseCapturer(
-        kGeneratedAudioMaxAmplitude, kSamplingFrequencyInHz);
-  }
-  if (audio_config.mode == AudioConfig::Mode::kFile) {
-    RTC_DCHECK(audio_config.input_file_name);
-    return TestAudioDeviceModule::CreateWavFileReader(
-        audio_config.input_file_name.value());
-  }
-  RTC_NOTREACHED() << "Unknown audio_config->mode";
-  return nullptr;
-}
+struct TestPeerComponents {
+  using AudioConfig = PeerConnectionE2EQualityTestFixture::AudioConfig;
 
-rtc::scoped_refptr<AudioDeviceModule> CreateAudioDeviceModule(
-    absl::optional<AudioConfig> audio_config,
-    absl::optional<std::string> audio_output_file_name) {
-  std::unique_ptr<TestAudioDeviceModule::Capturer> capturer;
-  if (audio_config) {
-    capturer = CreateAudioCapturer(audio_config.value());
-  } else {
-    // If we have no audio config we still need to provide some audio device.
-    // In such case use generated capturer. Despite of we provided audio here,
-    // in test media setup audio stream won't be added into peer connection.
-    capturer = TestAudioDeviceModule::CreatePulsedNoiseCapturer(
-        kGeneratedAudioMaxAmplitude, kSamplingFrequencyInHz);
-  }
-  RTC_DCHECK(capturer);
+  rtc::scoped_refptr<PeerConnectionFactoryInterface> peer_connection_factory;
+  rtc::scoped_refptr<PeerConnectionInterface> peer_connection;
+  rtc::scoped_refptr<AudioProcessing> audio_processing;
 
-  if (audio_config && audio_config->input_dump_file_name) {
-    capturer = absl::make_unique<test::CopyToFileAudioCapturer>(
-        std::move(capturer), audio_config->input_dump_file_name.value());
+  TestPeerComponents(std::unique_ptr<InjectableComponents> components,
+                     const Params& params,
+                     MockPeerConnectionObserver* observer,
+                     VideoQualityAnalyzerInjectionHelper* video_analyzer_helper,
+                     rtc::Thread* signaling_thread,
+                     absl::optional<std::string> audio_output_file_name,
+                     double bitrate_multiplier,
+                     rtc::TaskQueue* task_queue) {
+    std::map<std::string, absl::optional<int>> stream_required_spatial_index;
+    for (auto& video_config : params.video_configs) {
+      // Stream label should be set by fixture implementation here.
+      RTC_DCHECK(video_config.stream_label);
+      bool res = stream_required_spatial_index
+                     .insert({*video_config.stream_label,
+                              video_config.target_spatial_index})
+                     .second;
+      RTC_DCHECK(res) << "Duplicate video_config.stream_label="
+                      << *video_config.stream_label;
+    }
+
+    // Create audio processing, that will be used to create media engine that
+    // then will be added into peer connection. See CreateMediaEngine(...).
+    audio_processing = webrtc::AudioProcessingBuilder().Create();
+    if (params.aec_dump_path) {
+      audio_processing->AttachAecDump(
+          AecDumpFactory::Create(*params.aec_dump_path, -1, task_queue));
+    }
+
+    // Create peer connection factory.
+    PeerConnectionFactoryDependencies pcf_deps = CreatePCFDependencies(
+        std::move(components->pcf_dependencies), params.audio_config,
+        bitrate_multiplier, std::move(stream_required_spatial_index),
+        video_analyzer_helper, components->network_thread, signaling_thread,
+        std::move(audio_output_file_name), task_queue);
+    peer_connection_factory =
+        CreateModularPeerConnectionFactory(std::move(pcf_deps));
+
+    // Create peer connection.
+    PeerConnectionDependencies pc_deps =
+        CreatePCDependencies(std::move(components->pc_dependencies), observer);
+    peer_connection = peer_connection_factory->CreatePeerConnection(
+        params.rtc_configuration, std::move(pc_deps));
   }
 
-  std::unique_ptr<TestAudioDeviceModule::Renderer> renderer;
-  if (audio_output_file_name) {
-    renderer = TestAudioDeviceModule::CreateBoundedWavFileWriter(
-        audio_output_file_name.value(), kSamplingFrequencyInHz);
-  } else {
-    renderer =
-        TestAudioDeviceModule::CreateDiscardRenderer(kSamplingFrequencyInHz);
+  std::unique_ptr<TestAudioDeviceModule::Capturer> CreateAudioCapturer(
+      AudioConfig audio_config) {
+    if (audio_config.mode == AudioConfig::Mode::kGenerated) {
+      return TestAudioDeviceModule::CreatePulsedNoiseCapturer(
+          kGeneratedAudioMaxAmplitude, kSamplingFrequencyInHz);
+    }
+    if (audio_config.mode == AudioConfig::Mode::kFile) {
+      RTC_DCHECK(audio_config.input_file_name);
+      return TestAudioDeviceModule::CreateWavFileReader(
+          audio_config.input_file_name.value());
+    }
+    RTC_NOTREACHED() << "Unknown audio_config->mode";
+    return nullptr;
   }
 
-  return TestAudioDeviceModule::CreateTestAudioDeviceModule(
-      std::move(capturer), std::move(renderer), /*speed=*/1.f);
-}
+  rtc::scoped_refptr<AudioDeviceModule> CreateAudioDeviceModule(
+      absl::optional<AudioConfig> audio_config,
+      absl::optional<std::string> audio_output_file_name) {
+    std::unique_ptr<TestAudioDeviceModule::Capturer> capturer;
+    if (audio_config) {
+      capturer = CreateAudioCapturer(audio_config.value());
+    } else {
+      // If we have no audio config we still need to provide some audio device.
+      // In such case use generated capturer. Despite of we provided audio here,
+      // in test media setup audio stream won't be added into peer connection.
+      capturer = TestAudioDeviceModule::CreatePulsedNoiseCapturer(
+          kGeneratedAudioMaxAmplitude, kSamplingFrequencyInHz);
+    }
+    RTC_DCHECK(capturer);
 
-std::unique_ptr<VideoEncoderFactory> CreateVideoEncoderFactory(
-    PeerConnectionFactoryComponents* pcf_dependencies,
-    VideoQualityAnalyzerInjectionHelper* video_analyzer_helper,
-    double bitrate_multiplier,
-    std::map<std::string, absl::optional<int>> stream_required_spatial_index) {
-  std::unique_ptr<VideoEncoderFactory> video_encoder_factory;
-  if (pcf_dependencies->video_encoder_factory != nullptr) {
-    video_encoder_factory = std::move(pcf_dependencies->video_encoder_factory);
-  } else {
-    video_encoder_factory = CreateBuiltinVideoEncoderFactory();
-  }
-  return video_analyzer_helper->WrapVideoEncoderFactory(
-      std::move(video_encoder_factory), bitrate_multiplier,
-      std::move(stream_required_spatial_index));
-}
+    if (audio_config && audio_config->input_dump_file_name) {
+      capturer = absl::make_unique<test::CopyToFileAudioCapturer>(
+          std::move(capturer), audio_config->input_dump_file_name.value());
+    }
 
-std::unique_ptr<VideoDecoderFactory> CreateVideoDecoderFactory(
-    PeerConnectionFactoryComponents* pcf_dependencies,
-    VideoQualityAnalyzerInjectionHelper* video_analyzer_helper) {
-  std::unique_ptr<VideoDecoderFactory> video_decoder_factory;
-  if (pcf_dependencies->video_decoder_factory != nullptr) {
-    video_decoder_factory = std::move(pcf_dependencies->video_decoder_factory);
-  } else {
-    video_decoder_factory = CreateBuiltinVideoDecoderFactory();
-  }
-  return video_analyzer_helper->WrapVideoDecoderFactory(
-      std::move(video_decoder_factory));
-}
+    std::unique_ptr<TestAudioDeviceModule::Renderer> renderer;
+    if (audio_output_file_name) {
+      renderer = TestAudioDeviceModule::CreateBoundedWavFileWriter(
+          audio_output_file_name.value(), kSamplingFrequencyInHz);
+    } else {
+      renderer =
+          TestAudioDeviceModule::CreateDiscardRenderer(kSamplingFrequencyInHz);
+    }
 
-std::unique_ptr<cricket::MediaEngineInterface> CreateMediaEngine(
-    PeerConnectionFactoryComponents* pcf_dependencies,
-    absl::optional<AudioConfig> audio_config,
-    double bitrate_multiplier,
-    std::map<std::string, absl::optional<int>> stream_required_spatial_index,
-    VideoQualityAnalyzerInjectionHelper* video_analyzer_helper,
-    absl::optional<std::string> audio_output_file_name) {
-  rtc::scoped_refptr<AudioDeviceModule> adm = CreateAudioDeviceModule(
-      std::move(audio_config), std::move(audio_output_file_name));
-
-  std::unique_ptr<VideoEncoderFactory> video_encoder_factory =
-      CreateVideoEncoderFactory(pcf_dependencies, video_analyzer_helper,
-                                bitrate_multiplier,
-                                std::move(stream_required_spatial_index));
-  std::unique_ptr<VideoDecoderFactory> video_decoder_factory =
-      CreateVideoDecoderFactory(pcf_dependencies, video_analyzer_helper);
-
-  return cricket::WebRtcMediaEngineFactory::Create(
-      adm, webrtc::CreateBuiltinAudioEncoderFactory(),
-      webrtc::CreateBuiltinAudioDecoderFactory(),
-      std::move(video_encoder_factory), std::move(video_decoder_factory),
-      /*audio_mixer=*/nullptr, webrtc::AudioProcessingBuilder().Create());
-}
-
-// Creates PeerConnectionFactoryDependencies objects, providing entities
-// from InjectableComponents::PeerConnectionFactoryComponents and also
-// creating entities, that are required for correct injection of media quality
-// analyzers.
-PeerConnectionFactoryDependencies CreatePCFDependencies(
-    std::unique_ptr<PeerConnectionFactoryComponents> pcf_dependencies,
-    absl::optional<AudioConfig> audio_config,
-    double bitrate_multiplier,
-    std::map<std::string, absl::optional<int>> stream_required_spatial_index,
-    VideoQualityAnalyzerInjectionHelper* video_analyzer_helper,
-    rtc::Thread* network_thread,
-    rtc::Thread* signaling_thread,
-    absl::optional<std::string> audio_output_file_name) {
-  PeerConnectionFactoryDependencies pcf_deps;
-  pcf_deps.network_thread = network_thread;
-  pcf_deps.signaling_thread = signaling_thread;
-  pcf_deps.media_engine = CreateMediaEngine(
-      pcf_dependencies.get(), std::move(audio_config), bitrate_multiplier,
-      std::move(stream_required_spatial_index), video_analyzer_helper,
-      std::move(audio_output_file_name));
-
-  pcf_deps.call_factory = std::move(pcf_dependencies->call_factory);
-  pcf_deps.event_log_factory = std::move(pcf_dependencies->event_log_factory);
-
-  if (pcf_dependencies->fec_controller_factory != nullptr) {
-    pcf_deps.fec_controller_factory =
-        std::move(pcf_dependencies->fec_controller_factory);
-  }
-  if (pcf_dependencies->network_controller_factory != nullptr) {
-    pcf_deps.network_controller_factory =
-        std::move(pcf_dependencies->network_controller_factory);
-  }
-  if (pcf_dependencies->media_transport_factory != nullptr) {
-    pcf_deps.media_transport_factory =
-        std::move(pcf_dependencies->media_transport_factory);
+    return TestAudioDeviceModule::CreateTestAudioDeviceModule(
+        std::move(capturer), std::move(renderer), /*speed=*/1.f);
   }
 
-  return pcf_deps;
-}
-
-// Creates PeerConnectionDependencies objects, providing entities
-// from InjectableComponents::PeerConnectionComponents.
-PeerConnectionDependencies CreatePCDependencies(
-    std::unique_ptr<PeerConnectionComponents> pc_dependencies,
-    PeerConnectionObserver* observer) {
-  PeerConnectionDependencies pc_deps(observer);
-
-  auto port_allocator = absl::make_unique<cricket::BasicPortAllocator>(
-      pc_dependencies->network_manager);
-
-  // This test does not support TCP
-  int flags = cricket::PORTALLOCATOR_DISABLE_TCP;
-  port_allocator->set_flags(port_allocator->flags() | flags);
-
-  pc_deps.allocator = std::move(port_allocator);
-
-  if (pc_dependencies->async_resolver_factory != nullptr) {
-    pc_deps.async_resolver_factory =
-        std::move(pc_dependencies->async_resolver_factory);
+  std::unique_ptr<VideoEncoderFactory> CreateVideoEncoderFactory(
+      PeerConnectionFactoryComponents* pcf_dependencies,
+      VideoQualityAnalyzerInjectionHelper* video_analyzer_helper,
+      double bitrate_multiplier,
+      std::map<std::string, absl::optional<int>>
+          stream_required_spatial_index) {
+    std::unique_ptr<VideoEncoderFactory> video_encoder_factory;
+    if (pcf_dependencies->video_encoder_factory != nullptr) {
+      video_encoder_factory =
+          std::move(pcf_dependencies->video_encoder_factory);
+    } else {
+      video_encoder_factory = CreateBuiltinVideoEncoderFactory();
+    }
+    return video_analyzer_helper->WrapVideoEncoderFactory(
+        std::move(video_encoder_factory), bitrate_multiplier,
+        std::move(stream_required_spatial_index));
   }
-  if (pc_dependencies->cert_generator != nullptr) {
-    pc_deps.cert_generator = std::move(pc_dependencies->cert_generator);
+
+  std::unique_ptr<VideoDecoderFactory> CreateVideoDecoderFactory(
+      PeerConnectionFactoryComponents* pcf_dependencies,
+      VideoQualityAnalyzerInjectionHelper* video_analyzer_helper) {
+    std::unique_ptr<VideoDecoderFactory> video_decoder_factory;
+    if (pcf_dependencies->video_decoder_factory != nullptr) {
+      video_decoder_factory =
+          std::move(pcf_dependencies->video_decoder_factory);
+    } else {
+      video_decoder_factory = CreateBuiltinVideoDecoderFactory();
+    }
+    return video_analyzer_helper->WrapVideoDecoderFactory(
+        std::move(video_decoder_factory));
   }
-  if (pc_dependencies->tls_cert_verifier != nullptr) {
-    pc_deps.tls_cert_verifier = std::move(pc_dependencies->tls_cert_verifier);
+
+  std::unique_ptr<cricket::MediaEngineInterface> CreateMediaEngine(
+      PeerConnectionFactoryComponents* pcf_dependencies,
+      absl::optional<AudioConfig> audio_config,
+      double bitrate_multiplier,
+      std::map<std::string, absl::optional<int>> stream_required_spatial_index,
+      VideoQualityAnalyzerInjectionHelper* video_analyzer_helper,
+      absl::optional<std::string> audio_output_file_name,
+      rtc::TaskQueue* task_queue) {
+    rtc::scoped_refptr<AudioDeviceModule> adm = CreateAudioDeviceModule(
+        std::move(audio_config), std::move(audio_output_file_name));
+
+    std::unique_ptr<VideoEncoderFactory> video_encoder_factory =
+        CreateVideoEncoderFactory(pcf_dependencies, video_analyzer_helper,
+                                  bitrate_multiplier,
+                                  std::move(stream_required_spatial_index));
+    std::unique_ptr<VideoDecoderFactory> video_decoder_factory =
+        CreateVideoDecoderFactory(pcf_dependencies, video_analyzer_helper);
+
+    return cricket::WebRtcMediaEngineFactory::Create(
+        adm, webrtc::CreateBuiltinAudioEncoderFactory(),
+        webrtc::CreateBuiltinAudioDecoderFactory(),
+        std::move(video_encoder_factory), std::move(video_decoder_factory),
+        /*audio_mixer=*/nullptr, audio_processing);
   }
-  return pc_deps;
-}
+
+  // Creates PeerConnectionFactoryDependencies objects, providing entities
+  // from InjectableComponents::PeerConnectionFactoryComponents and also
+  // creating entities, that are required for correct injection of media quality
+  // analyzers.
+  PeerConnectionFactoryDependencies CreatePCFDependencies(
+      std::unique_ptr<PeerConnectionFactoryComponents> pcf_dependencies,
+      absl::optional<AudioConfig> audio_config,
+      double bitrate_multiplier,
+      std::map<std::string, absl::optional<int>> stream_required_spatial_index,
+      VideoQualityAnalyzerInjectionHelper* video_analyzer_helper,
+      rtc::Thread* network_thread,
+      rtc::Thread* signaling_thread,
+      absl::optional<std::string> audio_output_file_name,
+      rtc::TaskQueue* task_queue) {
+    PeerConnectionFactoryDependencies pcf_deps;
+    pcf_deps.network_thread = network_thread;
+    pcf_deps.signaling_thread = signaling_thread;
+    pcf_deps.media_engine = CreateMediaEngine(
+        pcf_dependencies.get(), std::move(audio_config), bitrate_multiplier,
+        std::move(stream_required_spatial_index), video_analyzer_helper,
+        std::move(audio_output_file_name), task_queue);
+
+    pcf_deps.call_factory = std::move(pcf_dependencies->call_factory);
+    pcf_deps.event_log_factory = std::move(pcf_dependencies->event_log_factory);
+
+    if (pcf_dependencies->fec_controller_factory != nullptr) {
+      pcf_deps.fec_controller_factory =
+          std::move(pcf_dependencies->fec_controller_factory);
+    }
+    if (pcf_dependencies->network_controller_factory != nullptr) {
+      pcf_deps.network_controller_factory =
+          std::move(pcf_dependencies->network_controller_factory);
+    }
+    if (pcf_dependencies->media_transport_factory != nullptr) {
+      pcf_deps.media_transport_factory =
+          std::move(pcf_dependencies->media_transport_factory);
+    }
+
+    return pcf_deps;
+  }
+
+  // Creates PeerConnectionDependencies objects, providing entities
+  // from InjectableComponents::PeerConnectionComponents.
+  PeerConnectionDependencies CreatePCDependencies(
+      std::unique_ptr<PeerConnectionComponents> pc_dependencies,
+      PeerConnectionObserver* observer) {
+    PeerConnectionDependencies pc_deps(observer);
+
+    auto port_allocator = absl::make_unique<cricket::BasicPortAllocator>(
+        pc_dependencies->network_manager);
+
+    // This test does not support TCP
+    int flags = cricket::PORTALLOCATOR_DISABLE_TCP;
+    port_allocator->set_flags(port_allocator->flags() | flags);
+
+    pc_deps.allocator = std::move(port_allocator);
+
+    if (pc_dependencies->async_resolver_factory != nullptr) {
+      pc_deps.async_resolver_factory =
+          std::move(pc_dependencies->async_resolver_factory);
+    }
+    if (pc_dependencies->cert_generator != nullptr) {
+      pc_deps.cert_generator = std::move(pc_dependencies->cert_generator);
+    }
+    if (pc_dependencies->tls_cert_verifier != nullptr) {
+      pc_deps.tls_cert_verifier = std::move(pc_dependencies->tls_cert_verifier);
+    }
+    return pc_deps;
+  }
+};
 
 }  // namespace
 
@@ -232,41 +288,21 @@
     VideoQualityAnalyzerInjectionHelper* video_analyzer_helper,
     rtc::Thread* signaling_thread,
     absl::optional<std::string> audio_output_file_name,
-    double bitrate_multiplier) {
+    double bitrate_multiplier,
+    rtc::TaskQueue* task_queue) {
   RTC_DCHECK(components);
   RTC_DCHECK(params);
   SetMandatoryEntities(components.get());
   params->rtc_configuration.sdp_semantics = SdpSemantics::kUnifiedPlan;
 
-  std::map<std::string, absl::optional<int>> stream_required_spatial_index;
-  for (auto& video_config : params->video_configs) {
-    // Stream label should be set by fixture implementation here.
-    RTC_DCHECK(video_config.stream_label);
-    bool res = stream_required_spatial_index
-                   .insert({*video_config.stream_label,
-                            video_config.target_spatial_index})
-                   .second;
-    RTC_DCHECK(res) << "Duplicate video_config.stream_label="
-                    << *video_config.stream_label;
-  }
+  TestPeerComponents tpc(std::move(components), *params, observer.get(),
+                         video_analyzer_helper, signaling_thread,
+                         std::move(audio_output_file_name), bitrate_multiplier,
+                         task_queue);
 
-  // Create peer connection factory.
-  PeerConnectionFactoryDependencies pcf_deps = CreatePCFDependencies(
-      std::move(components->pcf_dependencies), params->audio_config,
-      bitrate_multiplier, std::move(stream_required_spatial_index),
-      video_analyzer_helper, components->network_thread, signaling_thread,
-      std::move(audio_output_file_name));
-  rtc::scoped_refptr<PeerConnectionFactoryInterface> pcf =
-      CreateModularPeerConnectionFactory(std::move(pcf_deps));
-
-  // Create peer connection.
-  PeerConnectionDependencies pc_deps = CreatePCDependencies(
-      std::move(components->pc_dependencies), observer.get());
-  rtc::scoped_refptr<PeerConnectionInterface> pc =
-      pcf->CreatePeerConnection(params->rtc_configuration, std::move(pc_deps));
-
-  return absl::WrapUnique(
-      new TestPeer(pcf, pc, std::move(observer), std::move(params)));
+  return absl::WrapUnique(new TestPeer(
+      tpc.peer_connection_factory, tpc.peer_connection, std::move(observer),
+      std::move(params), tpc.audio_processing));
 }
 
 bool TestPeer::AddIceCandidates(
@@ -289,11 +325,13 @@
     rtc::scoped_refptr<PeerConnectionFactoryInterface> pc_factory,
     rtc::scoped_refptr<PeerConnectionInterface> pc,
     std::unique_ptr<MockPeerConnectionObserver> observer,
-    std::unique_ptr<Params> params)
+    std::unique_ptr<Params> params,
+    rtc::scoped_refptr<AudioProcessing> audio_processing)
     : PeerConnectionWrapper::PeerConnectionWrapper(std::move(pc_factory),
                                                    std::move(pc),
                                                    std::move(observer)),
-      params_(std::move(params)) {}
+      params_(std::move(params)),
+      audio_processing_(audio_processing) {}
 
 }  // namespace webrtc_pc_e2e
 }  // namespace webrtc
diff --git a/test/pc/e2e/test_peer.h b/test/pc/e2e/test_peer.h
index 0cc9389..decc418 100644
--- a/test/pc/e2e/test_peer.h
+++ b/test/pc/e2e/test_peer.h
@@ -22,6 +22,7 @@
 #include "pc/peer_connection_wrapper.h"
 #include "pc/test/mock_peer_connection_observers.h"
 #include "rtc_base/network.h"
+#include "rtc_base/task_queue.h"
 #include "rtc_base/thread.h"
 #include "test/pc/e2e/analyzer/video/video_quality_analyzer_injection_helper.h"
 #include "test/pc/e2e/peer_connection_quality_test_params.h"
@@ -54,9 +55,11 @@
       VideoQualityAnalyzerInjectionHelper* video_analyzer_helper,
       rtc::Thread* signaling_thread,
       absl::optional<std::string> audio_output_file_name,
-      double bitrate_multiplier);
+      double bitrate_multiplier,
+      rtc::TaskQueue* task_queue);
 
   Params* params() const { return params_.get(); }
+  void DetachAecDump() { audio_processing_->DetachAecDump(); }
 
   // Adds provided |candidates| to the owned peer connection.
   bool AddIceCandidates(
@@ -66,9 +69,11 @@
   TestPeer(rtc::scoped_refptr<PeerConnectionFactoryInterface> pc_factory,
            rtc::scoped_refptr<PeerConnectionInterface> pc,
            std::unique_ptr<MockPeerConnectionObserver> observer,
-           std::unique_ptr<Params> params);
+           std::unique_ptr<Params> params,
+           rtc::scoped_refptr<AudioProcessing> audio_processing);
 
   std::unique_ptr<Params> params_;
+  rtc::scoped_refptr<AudioProcessing> audio_processing_;
 };
 
 }  // namespace webrtc_pc_e2e
