diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn
index 1ab974d..26ddb10 100644
--- a/modules/video_coding/BUILD.gn
+++ b/modules/video_coding/BUILD.gn
@@ -480,9 +480,6 @@
   rtc_source_set("video_codecs_test_framework") {
     testonly = true
     sources = [
-      "codecs/test/mock/mock_packet_manipulator.h",
-      "codecs/test/packet_manipulator.cc",
-      "codecs/test/packet_manipulator.h",
       "codecs/test/stats.cc",
       "codecs/test/stats.h",
       "codecs/test/test_config.cc",
@@ -629,7 +626,6 @@
     testonly = true
 
     sources = [
-      "codecs/test/packet_manipulator_unittest.cc",
       "codecs/test/stats_unittest.cc",
       "codecs/test/test_config_unittest.cc",
       "codecs/test/videoprocessor_unittest.cc",
diff --git a/modules/video_coding/codecs/test/mock/mock_packet_manipulator.h b/modules/video_coding/codecs/test/mock/mock_packet_manipulator.h
deleted file mode 100644
index ed76055..0000000
--- a/modules/video_coding/codecs/test/mock/mock_packet_manipulator.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2011 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 MODULES_VIDEO_CODING_CODECS_TEST_MOCK_MOCK_PACKET_MANIPULATOR_H_
-#define MODULES_VIDEO_CODING_CODECS_TEST_MOCK_MOCK_PACKET_MANIPULATOR_H_
-
-#include <string>
-
-#include "modules/video_coding/codecs/test/packet_manipulator.h"
-#include "test/gmock.h"
-#include "typedefs.h"  // NOLINT(build/include)
-#include "common_video/include/video_frame.h"
-
-namespace webrtc {
-namespace test {
-
-class MockPacketManipulator : public PacketManipulator {
- public:
-  MOCK_METHOD1(ManipulatePackets, int(webrtc::EncodedImage* encoded_image));
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // MODULES_VIDEO_CODING_CODECS_TEST_MOCK_MOCK_PACKET_MANIPULATOR_H_
diff --git a/modules/video_coding/codecs/test/packet_manipulator.cc b/modules/video_coding/codecs/test/packet_manipulator.cc
deleted file mode 100644
index 779faf6..0000000
--- a/modules/video_coding/codecs/test/packet_manipulator.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-#include "modules/video_coding/codecs/test/packet_manipulator.h"
-
-#include <stdio.h>
-
-#include "rtc_base/checks.h"
-#include "rtc_base/format_macros.h"
-
-namespace webrtc {
-namespace test {
-
-PacketManipulatorImpl::PacketManipulatorImpl(PacketReader* packet_reader,
-                                             const NetworkingConfig& config,
-                                             bool verbose)
-    : packet_reader_(packet_reader),
-      config_(config),
-      verbose_(verbose),
-      active_burst_packets_(0),
-      random_seed_(1) {
-  RTC_DCHECK(packet_reader);
-}
-
-int PacketManipulatorImpl::ManipulatePackets(
-    webrtc::EncodedImage* encoded_image) {
-  int nbr_packets_dropped = 0;
-  // There's no need to build a copy of the image data since viewing an
-  // EncodedImage object, setting the length to a new lower value represents
-  // that everything is dropped after that position in the byte array.
-  // EncodedImage._size is the allocated bytes.
-  // EncodedImage._length is how many that are filled with data.
-  int new_length = 0;
-  packet_reader_->InitializeReading(encoded_image->_buffer,
-                                    encoded_image->_length,
-                                    config_.packet_size_in_bytes);
-  uint8_t* packet = nullptr;
-  int nbr_bytes_to_read;
-  // keep track of if we've lost any packets, since then we shall loose
-  // the remains of the current frame:
-  bool packet_loss_has_occurred = false;
-  while ((nbr_bytes_to_read = packet_reader_->NextPacket(&packet)) > 0) {
-    // Check if we're currently in a packet loss burst that is not completed:
-    if (active_burst_packets_ > 0) {
-      active_burst_packets_--;
-      nbr_packets_dropped++;
-    } else if (RandomUniform() < config_.packet_loss_probability ||
-               packet_loss_has_occurred) {
-      packet_loss_has_occurred = true;
-      nbr_packets_dropped++;
-      if (config_.packet_loss_mode == kBurst) {
-        // Initiate a new burst
-        active_burst_packets_ = config_.packet_loss_burst_length - 1;
-      }
-    } else {
-      new_length += nbr_bytes_to_read;
-    }
-  }
-  encoded_image->_length = new_length;
-  if (nbr_packets_dropped > 0) {
-    // Must set completeFrame to false to inform the decoder about this:
-    encoded_image->_completeFrame = false;
-    if (verbose_) {
-      printf("Dropped %d packets for frame %d (frame length: %" PRIuS ")\n",
-             nbr_packets_dropped, encoded_image->_timeStamp,
-             encoded_image->_length);
-    }
-  }
-  return nbr_packets_dropped;
-}
-
-void PacketManipulatorImpl::InitializeRandomSeed(unsigned int seed) {
-  random_seed_ = seed;
-}
-
-inline double PacketManipulatorImpl::RandomUniform() {
-  // Use the previous result as new seed before each rand() call. Doing this
-  // it doesn't matter if other threads are calling rand() since we'll always
-  // get the same behavior as long as we're using a fixed initial seed.
-  critsect_.Enter();
-  srand(random_seed_);
-  random_seed_ = rand();  // NOLINT (rand_r instead of rand)
-  critsect_.Leave();
-  return (random_seed_ + 1.0) / (RAND_MAX + 1.0);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/packet_manipulator.h b/modules/video_coding/codecs/test/packet_manipulator.h
deleted file mode 100644
index 5a2c9cc..0000000
--- a/modules/video_coding/codecs/test/packet_manipulator.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *  Copyright (c) 2012 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 MODULES_VIDEO_CODING_CODECS_TEST_PACKET_MANIPULATOR_H_
-#define MODULES_VIDEO_CODING_CODECS_TEST_PACKET_MANIPULATOR_H_
-
-#include <stdlib.h>
-
-#include "modules/video_coding/include/video_codec_interface.h"
-#include "rtc_base/criticalsection.h"
-#include "test/testsupport/packet_reader.h"
-
-namespace webrtc {
-namespace test {
-
-// Which mode the packet loss shall be performed according to.
-enum PacketLossMode {
-  // Drops packets with a configured probability independently for each packet
-  kUniform,
-  // Drops packets similar to uniform but when a packet is being dropped, the
-  // number of lost packets in a row is equal to the configured burst length.
-  kBurst
-};
-
-// Contains configurations related to networking and simulation of
-// scenarios caused by network interference.
-struct NetworkingConfig {
-  NetworkingConfig()
-      : packet_size_in_bytes(1500),
-        max_payload_size_in_bytes(1440),
-        packet_loss_mode(kUniform),
-        packet_loss_probability(0.0),
-        packet_loss_burst_length(1) {}
-
-  // Packet size in bytes. Default: 1500 bytes.
-  size_t packet_size_in_bytes;
-
-  // Encoder specific setting of maximum size in bytes of each payload.
-  // Default: 1440 bytes.
-  size_t max_payload_size_in_bytes;
-
-  // Packet loss mode. Two different packet loss models are supported:
-  // uniform or burst. This setting has no effect unless
-  // packet_loss_probability is >0.
-  // Default: uniform.
-  PacketLossMode packet_loss_mode;
-
-  // Packet loss probability. A value between 0.0 and 1.0 that defines the
-  // probability of a packet being lost. 0.1 means 10% and so on.
-  // Default: 0 (no loss).
-  double packet_loss_probability;
-
-  // Packet loss burst length. Defines how many packets will be lost in a burst
-  // when a packet has been decided to be lost. Must be >=1. Default: 1.
-  int packet_loss_burst_length;
-};
-
-// Class for simulating packet loss on the encoded frame data.
-// When a packet loss has occurred in a frame, the remaining data in that
-// frame is lost (even if burst length is only a single packet).
-// TODO(kjellander): Support discarding only individual packets in the frame
-// when CL 172001 has been submitted. This also requires a correct
-// fragmentation header to be passed to the decoder.
-//
-// To get a repeatable packet drop pattern, re-initialize the random seed
-// using InitializeRandomSeed before each test run.
-class PacketManipulator {
- public:
-  virtual ~PacketManipulator() {}
-
-  // Manipulates the data of the encoded_image to simulate parts being lost
-  // during transport.
-  // If packets are dropped from frame data, the completedFrame field will be
-  // set to false.
-  // Returns the number of packets being dropped.
-  virtual int ManipulatePackets(webrtc::EncodedImage* encoded_image) = 0;
-};
-
-class PacketManipulatorImpl : public PacketManipulator {
- public:
-  PacketManipulatorImpl(PacketReader* packet_reader,
-                        const NetworkingConfig& config,
-                        bool verbose);
-  ~PacketManipulatorImpl() = default;
-  int ManipulatePackets(webrtc::EncodedImage* encoded_image) override;
-  virtual void InitializeRandomSeed(unsigned int seed);
-
- protected:
-  // Returns a uniformly distributed random value between 0.0 and 1.0
-  virtual double RandomUniform();
-
- private:
-  PacketReader* const packet_reader_;
-  const NetworkingConfig& config_;
-  const bool verbose_;
-  // Used to simulate a burst over several frames.
-  int active_burst_packets_;
-  rtc::CriticalSection critsect_;
-  unsigned int random_seed_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // MODULES_VIDEO_CODING_CODECS_TEST_PACKET_MANIPULATOR_H_
diff --git a/modules/video_coding/codecs/test/packet_manipulator_unittest.cc b/modules/video_coding/codecs/test/packet_manipulator_unittest.cc
deleted file mode 100644
index 3a226d6..0000000
--- a/modules/video_coding/codecs/test/packet_manipulator_unittest.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-#include "modules/video_coding/codecs/test/packet_manipulator.h"
-
-#include <queue>
-
-#include "modules/video_coding/include/video_codec_interface.h"
-#include "test/gtest.h"
-#include "test/testsupport/unittest_utils.h"
-#include "typedefs.h"  // NOLINT(build/include)
-
-namespace webrtc {
-namespace test {
-
-const double kNeverDropProbability = 0.0;
-const double kAlwaysDropProbability = 1.0;
-const int kBurstLength = 1;
-
-class PacketManipulatorTest : public PacketRelatedTest {
- protected:
-  PacketReader packet_reader_;
-  EncodedImage image_;
-  NetworkingConfig drop_config_;
-  NetworkingConfig no_drop_config_;
-
-  PacketManipulatorTest() {
-    image_._buffer = packet_data_;
-    image_._length = kPacketDataLength;
-    image_._size = kPacketDataLength;
-
-    drop_config_.packet_size_in_bytes = kPacketSizeInBytes;
-    drop_config_.packet_loss_probability = kAlwaysDropProbability;
-    drop_config_.packet_loss_burst_length = kBurstLength;
-    drop_config_.packet_loss_mode = kUniform;
-
-    no_drop_config_.packet_size_in_bytes = kPacketSizeInBytes;
-    no_drop_config_.packet_loss_probability = kNeverDropProbability;
-    no_drop_config_.packet_loss_burst_length = kBurstLength;
-    no_drop_config_.packet_loss_mode = kUniform;
-  }
-
-  virtual ~PacketManipulatorTest() {}
-
-  void SetUp() { PacketRelatedTest::SetUp(); }
-
-  void TearDown() { PacketRelatedTest::TearDown(); }
-
-  void VerifyPacketLoss(int expected_nbr_packets_dropped,
-                        int actual_nbr_packets_dropped,
-                        size_t expected_packet_data_length,
-                        uint8_t* expected_packet_data,
-                        const EncodedImage& actual_image) {
-    EXPECT_EQ(expected_nbr_packets_dropped, actual_nbr_packets_dropped);
-    EXPECT_EQ(expected_packet_data_length, image_._length);
-    EXPECT_EQ(0, memcmp(expected_packet_data, actual_image._buffer,
-                        expected_packet_data_length));
-  }
-};
-
-TEST_F(PacketManipulatorTest, Constructor) {
-  PacketManipulatorImpl manipulator(&packet_reader_, no_drop_config_, false);
-}
-
-TEST_F(PacketManipulatorTest, DropNone) {
-  PacketManipulatorImpl manipulator(&packet_reader_, no_drop_config_, false);
-  int nbr_packets_dropped = manipulator.ManipulatePackets(&image_);
-  VerifyPacketLoss(0, nbr_packets_dropped, kPacketDataLength, packet_data_,
-                   image_);
-}
-
-TEST_F(PacketManipulatorTest, UniformDropNoneSmallFrame) {
-  size_t data_length = 400;  // smaller than the packet size
-  image_._length = data_length;
-  PacketManipulatorImpl manipulator(&packet_reader_, no_drop_config_, false);
-  int nbr_packets_dropped = manipulator.ManipulatePackets(&image_);
-
-  VerifyPacketLoss(0, nbr_packets_dropped, data_length, packet_data_, image_);
-}
-
-TEST_F(PacketManipulatorTest, UniformDropAll) {
-  PacketManipulatorImpl manipulator(&packet_reader_, drop_config_, false);
-  int nbr_packets_dropped = manipulator.ManipulatePackets(&image_);
-  VerifyPacketLoss(kPacketDataNumberOfPackets, nbr_packets_dropped, 0,
-                   packet_data_, image_);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/stats.h b/modules/video_coding/codecs/test/stats.h
index 41a700e..2133a7a 100644
--- a/modules/video_coding/codecs/test/stats.h
+++ b/modules/video_coding/codecs/test/stats.h
@@ -57,11 +57,6 @@
   // Quantization.
   int qp = -1;
 
-  // How many packets were discarded of the encoded frame data (if any).
-  size_t packets_dropped = 0;
-  size_t total_packets = 0;
-  size_t manipulated_length = 0;
-
   // Quality.
   float psnr = 0.0;
   float ssim = 0.0;
diff --git a/modules/video_coding/codecs/test/test_config.h b/modules/video_coding/codecs/test/test_config.h
index 849967c..77848b0 100644
--- a/modules/video_coding/codecs/test/test_config.h
+++ b/modules/video_coding/codecs/test/test_config.h
@@ -16,21 +16,11 @@
 
 #include "common_types.h"  // NOLINT(build/include)
 #include "modules/video_coding/codecs/h264/include/h264_globals.h"
-#include "modules/video_coding/codecs/test/packet_manipulator.h"
+#include "modules/video_coding/include/video_codec_interface.h"
 
 namespace webrtc {
 namespace test {
 
-// Defines which frame types shall be excluded from packet loss and when.
-enum ExcludeFrameTypes {
-  // Will exclude the first keyframe in the video sequence from packet loss.
-  // Following keyframes will be targeted for packet loss.
-  kExcludeOnlyFirstKeyFrame,
-  // Exclude all keyframes from packet loss, no matter where in the video
-  // sequence they occur.
-  kExcludeAllKeyFrames
-};
-
 // Test configuration for a test run.
 struct TestConfig {
   class EncodedFrameChecker {
@@ -73,12 +63,8 @@
   // Number of frames to process.
   size_t num_frames = 0;
 
-  // Configurations related to networking.
-  NetworkingConfig networking_config;
-
-  // Decides how the packet loss simulations shall exclude certain frames from
-  // packet loss.
-  ExcludeFrameTypes exclude_frame_types = kExcludeOnlyFirstKeyFrame;
+  // Bitstream constraints.
+  size_t max_payload_size_bytes = 1440;
 
   // Force the encoder and decoder to use a single core for processing.
   // Using a single core is necessary to get a deterministic behavior for the
diff --git a/modules/video_coding/codecs/test/videoprocessor.cc b/modules/video_coding/codecs/test/videoprocessor.cc
index 168f6bb..b1b038f 100644
--- a/modules/video_coding/codecs/test/videoprocessor.cc
+++ b/modules/video_coding/codecs/test/videoprocessor.cc
@@ -97,7 +97,6 @@
 VideoProcessor::VideoProcessor(webrtc::VideoEncoder* encoder,
                                webrtc::VideoDecoder* decoder,
                                FrameReader* analysis_frame_reader,
-                               PacketManipulator* packet_manipulator,
                                const TestConfig& config,
                                Stats* stats,
                                IvfFileWriter* encoded_frame_writer,
@@ -108,7 +107,6 @@
       bitrate_allocator_(CreateBitrateAllocator(&config_)),
       encode_callback_(this),
       decode_callback_(this),
-      packet_manipulator_(packet_manipulator),
       analysis_frame_reader_(analysis_frame_reader),
       encoded_frame_writer_(encoded_frame_writer),
       decoded_frame_writer_(decoded_frame_writer),
@@ -117,12 +115,10 @@
       last_decoded_frame_num_(0),
       num_encoded_frames_(0),
       num_decoded_frames_(0),
-      first_key_frame_has_been_excluded_(false),
       last_decoded_frame_buffer_(analysis_frame_reader->FrameLength()),
       stats_(stats) {
   RTC_DCHECK(encoder);
   RTC_DCHECK(decoder);
-  RTC_DCHECK(packet_manipulator);
   RTC_DCHECK(analysis_frame_reader);
   RTC_DCHECK(stats);
 
@@ -133,11 +129,10 @@
                WEBRTC_VIDEO_CODEC_OK);
 
   // Initialize the encoder and decoder.
-  RTC_CHECK_EQ(
-      encoder_->InitEncode(&config_.codec_settings,
-                           static_cast<int>(config_.NumberOfCores()),
-                           config_.networking_config.max_payload_size_in_bytes),
-      WEBRTC_VIDEO_CODEC_OK);
+  RTC_CHECK_EQ(encoder_->InitEncode(&config_.codec_settings,
+                                    static_cast<int>(config_.NumberOfCores()),
+                                    config_.max_payload_size_bytes),
+               WEBRTC_VIDEO_CODEC_OK);
   RTC_CHECK_EQ(decoder_->InitDecode(&config_.codec_settings,
                                     static_cast<int>(config_.NumberOfCores())),
                WEBRTC_VIDEO_CODEC_OK);
@@ -218,13 +213,6 @@
     RTC_CHECK_GT(frame_number, last_encoded_frame_num_);
   }
 
-  // Check for dropped frames.
-  bool last_frame_missing = false;
-  if (frame_number > 0) {
-    const FrameStatistic* last_encoded_frame_stat =
-        stats_->GetFrame(last_encoded_frame_num_);
-    last_frame_missing = (last_encoded_frame_stat->manipulated_length == 0);
-  }
   last_encoded_frame_num_ = frame_number;
 
   // Update frame statistics.
@@ -237,32 +225,13 @@
   frame_stat->qp = encoded_image.qp_;
   frame_stat->target_bitrate_kbps =
       bitrate_allocation_.GetSpatialLayerSum(0) / 1000;
-  frame_stat->total_packets =
-      encoded_image._length / config_.networking_config.packet_size_in_bytes +
-      1;
   frame_stat->max_nalu_size_bytes = GetMaxNaluSizeBytes(encoded_image, config_);
 
-  // Make a raw copy of |encoded_image| to feed to the decoder.
-  size_t copied_buffer_size = encoded_image._length +
-                              EncodedImage::GetBufferPaddingBytes(codec);
-  std::unique_ptr<uint8_t[]> copied_buffer(new uint8_t[copied_buffer_size]);
-  memcpy(copied_buffer.get(), encoded_image._buffer, encoded_image._length);
-  EncodedImage copied_image = encoded_image;
-  copied_image._size = copied_buffer_size;
-  copied_image._buffer = copied_buffer.get();
-
-  // Simulate packet loss.
-  if (!ExcludeFrame(copied_image)) {
-    frame_stat->packets_dropped =
-        packet_manipulator_->ManipulatePackets(&copied_image);
-  }
-  frame_stat->manipulated_length = copied_image._length;
-
   // For the highest measurement accuracy of the decode time, the start/stop
   // time recordings should wrap the Decode call as tightly as possible.
   frame_stat->decode_start_ns = rtc::TimeNanos();
   frame_stat->decode_return_code =
-      decoder_->Decode(copied_image, last_frame_missing, nullptr);
+      decoder_->Decode(encoded_image, false, nullptr);
 
   if (encoded_frame_writer_) {
     RTC_CHECK(encoded_frame_writer_->WriteFrame(encoded_image, codec));
@@ -337,27 +306,5 @@
   RTC_CHECK(decoded_frame_writer_->WriteFrame(buffer->data()));
 }
 
-bool VideoProcessor::ExcludeFrame(const EncodedImage& encoded_image) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-  if (encoded_image._frameType != kVideoFrameKey) {
-    return false;
-  }
-  bool exclude_frame = false;
-  switch (config_.exclude_frame_types) {
-    case kExcludeOnlyFirstKeyFrame:
-      if (!first_key_frame_has_been_excluded_) {
-        first_key_frame_has_been_excluded_ = true;
-        exclude_frame = true;
-      }
-      break;
-    case kExcludeAllKeyFrames:
-      exclude_frame = true;
-      break;
-    default:
-      RTC_NOTREACHED();
-  }
-  return exclude_frame;
-}
-
 }  // namespace test
 }  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/videoprocessor.h b/modules/video_coding/codecs/test/videoprocessor.h
index 6aaef5f..5467d41 100644
--- a/modules/video_coding/codecs/test/videoprocessor.h
+++ b/modules/video_coding/codecs/test/videoprocessor.h
@@ -19,7 +19,6 @@
 #include "api/video/video_frame.h"
 #include "common_video/libyuv/include/webrtc_libyuv.h"
 #include "modules/video_coding/codecs/h264/include/h264_globals.h"
-#include "modules/video_coding/codecs/test/packet_manipulator.h"
 #include "modules/video_coding/codecs/test/stats.h"
 #include "modules/video_coding/codecs/test/test_config.h"
 #include "modules/video_coding/include/video_codec_interface.h"
@@ -46,23 +45,12 @@
 // The class processes a frame at the time for the configured input file.
 // It maintains state of where in the source input file the processing is at.
 //
-// Regarding packet loss: Note that keyframes are excluded (first or all
-// depending on the ExcludeFrameTypes setting). This is because if key frames
-// would be altered, all the following delta frames would be pretty much
-// worthless. VP8 has an error-resilience feature that makes it able to handle
-// packet loss in key non-first keyframes, which is why only the first is
-// excluded by default.
-// Packet loss in such important frames is handled on a higher level in the
-// Video Engine, where signaling would request a retransmit of the lost packets,
-// since they're so important.
-//
 // Note this class is not thread safe and is meant for simple testing purposes.
 class VideoProcessor {
  public:
   VideoProcessor(webrtc::VideoEncoder* encoder,
                  webrtc::VideoDecoder* decoder,
                  FrameReader* analysis_frame_reader,
-                 PacketManipulator* packet_manipulator,
                  const TestConfig& config,
                  Stats* stats,
                  IvfFileWriter* encoded_frame_writer,
@@ -177,7 +165,6 @@
   void FrameDecoded(const webrtc::VideoFrame& image);
 
   void WriteDecodedFrameToFile(rtc::Buffer* buffer);
-  bool ExcludeFrame(const EncodedImage& encoded_image);
 
   TestConfig config_ RTC_GUARDED_BY(sequence_checker_);
 
@@ -190,9 +177,6 @@
   VideoProcessorEncodeCompleteCallback encode_callback_;
   VideoProcessorDecodeCompleteCallback decode_callback_;
 
-  // Fake network.
-  PacketManipulator* const packet_manipulator_;
-
   // Input frames. Used as reference at frame quality evaluation.
   // Async codecs might queue frames. To handle that we keep input frame
   // and release it after corresponding coded frame is decoded and quality
@@ -218,9 +202,6 @@
   size_t num_encoded_frames_ RTC_GUARDED_BY(sequence_checker_);
   size_t num_decoded_frames_ RTC_GUARDED_BY(sequence_checker_);
 
-  // Keep track of if we have excluded the first key frame from packet loss.
-  bool first_key_frame_has_been_excluded_ RTC_GUARDED_BY(sequence_checker_);
-
   // Keep track of the last successfully decoded frame, since we write that
   // frame to disk when decoding fails.
   rtc::Buffer last_decoded_frame_buffer_ RTC_GUARDED_BY(sequence_checker_);
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc b/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
index fcdcd38..c12a7ee 100644
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
+++ b/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
@@ -489,15 +489,12 @@
   }
 
   cpu_process_time_.reset(new CpuProcessTime(config_));
-  packet_manipulator_.reset(new PacketManipulatorImpl(
-      &packet_reader_, config_.networking_config, false));
 
   rtc::Event sync_event(false, false);
   task_queue->PostTask([this, &sync_event]() {
     processor_ = rtc::MakeUnique<VideoProcessor>(
-        encoder_.get(), decoder_.get(), analysis_frame_reader_.get(),
-        packet_manipulator_.get(), config_, &stats_,
-        encoded_frame_writer_.get(), decoded_frame_writer_.get());
+        encoder_.get(), decoder_.get(), analysis_frame_reader_.get(), config_,
+        &stats_, encoded_frame_writer_.get(), decoded_frame_writer_.get());
     sync_event.Set();
   });
   sync_event.Wait(rtc::Event::kForever);
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest.h b/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
index adcae54..33d31f8 100644
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
+++ b/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
@@ -21,7 +21,6 @@
 #include "common_video/h264/h264_common.h"
 #include "media/engine/webrtcvideodecoderfactory.h"
 #include "media/engine/webrtcvideoencoderfactory.h"
-#include "modules/video_coding/codecs/test/packet_manipulator.h"
 #include "modules/video_coding/codecs/test/stats.h"
 #include "modules/video_coding/codecs/test/test_config.h"
 #include "modules/video_coding/codecs/test/videoprocessor.h"
@@ -29,7 +28,6 @@
 #include "test/gtest.h"
 #include "test/testsupport/frame_reader.h"
 #include "test/testsupport/frame_writer.h"
-#include "test/testsupport/packet_reader.h"
 
 namespace webrtc {
 namespace test {
@@ -145,8 +143,6 @@
   std::unique_ptr<FrameWriter> analysis_frame_writer_;
   std::unique_ptr<IvfFileWriter> encoded_frame_writer_;
   std::unique_ptr<FrameWriter> decoded_frame_writer_;
-  PacketReader packet_reader_;
-  std::unique_ptr<PacketManipulator> packet_manipulator_;
   Stats stats_;
   std::unique_ptr<VideoProcessor> processor_;
   std::unique_ptr<CpuProcessTime> cpu_process_time_;
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest_openh264.cc b/modules/video_coding/codecs/test/videoprocessor_integrationtest_openh264.cc
index 45a1fb0..8194292 100644
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest_openh264.cc
+++ b/modules/video_coding/codecs/test/videoprocessor_integrationtest_openh264.cc
@@ -40,7 +40,6 @@
     config_.output_filename =
         TempFilename(OutputPath(), "videoprocessor_integrationtest_libvpx");
     config_.num_frames = kNumFrames;
-    config_.networking_config.packet_loss_probability = 0.0;
     // Only allow encoder/decoder to use single core, for predictability.
     config_.use_single_core = true;
     config_.hw_encoder = false;
@@ -70,7 +69,7 @@
 TEST_F(VideoProcessorIntegrationTestOpenH264, SingleNalUnit) {
   config_.h264_codec_settings.packetization_mode =
       H264PacketizationMode::SingleNalUnit;
-  config_.networking_config.max_payload_size_in_bytes = 500;
+  config_.max_payload_size_bytes = 500;
   config_.SetCodecSettings(kVideoCodecH264, 1, false, false, true, false,
                            kResilienceOn, kCifWidth, kCifHeight);
 
@@ -81,8 +80,7 @@
 
   std::vector<QualityThresholds> quality_thresholds = {{37, 35, 0.93, 0.91}};
 
-  BitstreamThresholds bs_thresholds = {
-      config_.networking_config.max_payload_size_in_bytes};
+  BitstreamThresholds bs_thresholds = {config_.max_payload_size_bytes};
 
   ProcessFramesAndMaybeVerify(rate_profiles, &rc_thresholds,
                               &quality_thresholds, &bs_thresholds,
diff --git a/modules/video_coding/codecs/test/videoprocessor_unittest.cc b/modules/video_coding/codecs/test/videoprocessor_unittest.cc
index f8caa05e..ff00fc2 100644
--- a/modules/video_coding/codecs/test/videoprocessor_unittest.cc
+++ b/modules/video_coding/codecs/test/videoprocessor_unittest.cc
@@ -12,7 +12,6 @@
 
 #include "api/video/i420_buffer.h"
 #include "common_types.h"  // NOLINT(build/include)
-#include "modules/video_coding/codecs/test/mock/mock_packet_manipulator.h"
 #include "modules/video_coding/codecs/test/videoprocessor.h"
 #include "modules/video_coding/include/mock/mock_video_codec_interface.h"
 #include "modules/video_coding/include/video_coding.h"
@@ -20,7 +19,6 @@
 #include "test/gmock.h"
 #include "test/gtest.h"
 #include "test/testsupport/mock/mock_frame_reader.h"
-#include "test/testsupport/packet_reader.h"
 #include "test/testsupport/unittest_utils.h"
 #include "test/video_codec_settings.h"
 #include "typedefs.h"  // NOLINT(build/include)
@@ -53,8 +51,7 @@
     EXPECT_CALL(frame_reader_mock_, FrameLength())
         .WillRepeatedly(Return(kFrameSize));
     video_processor_ = rtc::MakeUnique<VideoProcessor>(
-        &encoder_mock_, &decoder_mock_, &frame_reader_mock_,
-        &packet_manipulator_mock_, config_, &stats_,
+        &encoder_mock_, &decoder_mock_, &frame_reader_mock_, config_, &stats_,
         nullptr /* encoded_frame_writer */, nullptr /* decoded_frame_writer */);
   }
 
@@ -77,7 +74,6 @@
   MockVideoEncoder encoder_mock_;
   MockVideoDecoder decoder_mock_;
   MockFrameReader frame_reader_mock_;
-  MockPacketManipulator packet_manipulator_mock_;
   Stats stats_;
   std::unique_ptr<VideoProcessor> video_processor_;
 };
diff --git a/test/BUILD.gn b/test/BUILD.gn
index 8eaaae3..75727f8 100644
--- a/test/BUILD.gn
+++ b/test/BUILD.gn
@@ -169,8 +169,6 @@
   sources = [
     "gmock.h",
     "gtest.h",
-    "testsupport/packet_reader.cc",
-    "testsupport/packet_reader.h",
     "testsupport/unittest_utils.h",
   ]
 
@@ -346,7 +344,6 @@
       "single_threaded_task_queue_unittest.cc",
       "testsupport/always_passing_unittest.cc",
       "testsupport/metrics/video_metrics_unittest.cc",
-      "testsupport/packet_reader_unittest.cc",
       "testsupport/perf_test_unittest.cc",
       "testsupport/test_artifacts_unittest.cc",
       "testsupport/y4m_frame_writer_unittest.cc",
diff --git a/test/testsupport/packet_reader.cc b/test/testsupport/packet_reader.cc
deleted file mode 100644
index ba52f94..0000000
--- a/test/testsupport/packet_reader.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-#include "test/testsupport/packet_reader.h"
-
-#include <assert.h>
-#include <stdio.h>
-#include <algorithm>
-
-namespace webrtc {
-namespace test {
-
-PacketReader::PacketReader()
-    : initialized_(false) {}
-
-PacketReader::~PacketReader() {}
-
-void PacketReader::InitializeReading(uint8_t* data,
-                                     size_t data_length_in_bytes,
-                                     size_t packet_size_in_bytes) {
-  assert(data);
-  assert(packet_size_in_bytes > 0);
-  data_ = data;
-  data_length_ = data_length_in_bytes;
-  packet_size_ = packet_size_in_bytes;
-  currentIndex_ = 0;
-  initialized_ = true;
-}
-
-int PacketReader::NextPacket(uint8_t** packet_pointer) {
-  if (!initialized_) {
-    fprintf(stderr, "Attempting to use uninitialized PacketReader!\n");
-    return -1;
-  }
-  *packet_pointer = data_ + currentIndex_;
-  size_t old_index = currentIndex_;
-  currentIndex_ = std::min(currentIndex_ + packet_size_, data_length_);
-  return static_cast<int>(currentIndex_ - old_index);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/packet_reader.h b/test/testsupport/packet_reader.h
deleted file mode 100644
index dbdb3da..0000000
--- a/test/testsupport/packet_reader.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright (c) 2011 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 TEST_TESTSUPPORT_PACKET_READER_H_
-#define TEST_TESTSUPPORT_PACKET_READER_H_
-
-#include <cstddef>
-#include "typedefs.h"  // NOLINT(build/include)
-
-namespace webrtc {
-namespace test {
-
-// Reads chunks of data to simulate network packets from a byte array.
-class PacketReader {
- public:
-  PacketReader();
-  virtual ~PacketReader();
-
-  // Inizializes a new reading operation. Must be done before invoking the
-  // NextPacket method.
-  // * data_length_in_bytes is the length of the data byte array.
-  //   0 length will result in no packets are read.
-  // * packet_size_in_bytes is the number of bytes to read in each NextPacket
-  //   method call. Must be > 0
-  virtual void InitializeReading(uint8_t* data, size_t data_length_in_bytes,
-                                 size_t packet_size_in_bytes);
-
-  // Moves the supplied pointer to the beginning of the next packet.
-  // Returns:
-  // *  The size of the packet ready to read (lower than the packet size for
-  //    the last packet)
-  // *  0 if there are no more packets to read
-  // * -1 if InitializeReading has not been called (also prints to stderr).
-  virtual int NextPacket(uint8_t** packet_pointer);
-
- private:
-  uint8_t* data_;
-  size_t data_length_;
-  size_t packet_size_;
-  size_t currentIndex_;
-  bool initialized_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // TEST_TESTSUPPORT_PACKET_READER_H_
diff --git a/test/testsupport/packet_reader_unittest.cc b/test/testsupport/packet_reader_unittest.cc
deleted file mode 100644
index 3255151..0000000
--- a/test/testsupport/packet_reader_unittest.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-#include "test/testsupport/packet_reader.h"
-
-#include "test/gtest.h"
-#include "test/testsupport/unittest_utils.h"
-
-namespace webrtc {
-namespace test {
-
-class PacketReaderTest: public PacketRelatedTest {
- protected:
-  PacketReaderTest() {}
-  virtual ~PacketReaderTest() {}
-  void SetUp() {
-    reader_ = new PacketReader();
-  }
-  void TearDown() {
-    delete reader_;
-  }
-  void VerifyPacketData(size_t expected_length,
-                        int actual_length,
-                        uint8_t* original_data_pointer,
-                        uint8_t* new_data_pointer) {
-    EXPECT_EQ(static_cast<int>(expected_length), actual_length);
-    EXPECT_EQ(*original_data_pointer, *new_data_pointer);
-    EXPECT_EQ(0, memcmp(original_data_pointer, new_data_pointer,
-                        actual_length));
-  }
-  PacketReader* reader_;
-};
-
-// Test lack of initialization
-TEST_F(PacketReaderTest, Uninitialized) {
-  uint8_t* data_pointer = NULL;
-  EXPECT_EQ(-1, reader_->NextPacket(&data_pointer));
-  EXPECT_EQ(NULL, data_pointer);
-}
-
-TEST_F(PacketReaderTest, InitializeZeroLengthArgument) {
-  reader_->InitializeReading(packet_data_, 0, kPacketSizeInBytes);
-  ASSERT_EQ(0, reader_->NextPacket(&packet_data_pointer_));
-}
-
-// Test with something smaller than one packet
-TEST_F(PacketReaderTest, NormalSmallData) {
-  const int kDataLengthInBytes = 1499;
-  uint8_t data[kDataLengthInBytes];
-  uint8_t* data_pointer = data;
-  memset(data, 1, kDataLengthInBytes);
-
-  reader_->InitializeReading(data, kDataLengthInBytes, kPacketSizeInBytes);
-  int length_to_read = reader_->NextPacket(&data_pointer);
-  VerifyPacketData(kDataLengthInBytes, length_to_read, data, data_pointer);
-  EXPECT_EQ(0, data_pointer - data);  // pointer hasn't moved
-
-  // Reading another one shall result in 0 bytes:
-  length_to_read = reader_->NextPacket(&data_pointer);
-  EXPECT_EQ(0, length_to_read);
-  EXPECT_EQ(kDataLengthInBytes, data_pointer - data);
-}
-
-// Test with data length that exactly matches one packet
-TEST_F(PacketReaderTest, NormalOnePacketData) {
-  uint8_t data[kPacketSizeInBytes];
-  uint8_t* data_pointer = data;
-  memset(data, 1, kPacketSizeInBytes);
-
-  reader_->InitializeReading(data, kPacketSizeInBytes, kPacketSizeInBytes);
-  int length_to_read = reader_->NextPacket(&data_pointer);
-  VerifyPacketData(kPacketSizeInBytes, length_to_read, data, data_pointer);
-  EXPECT_EQ(0, data_pointer - data);  // pointer hasn't moved
-
-  // Reading another one shall result in 0 bytes:
-  length_to_read = reader_->NextPacket(&data_pointer);
-  EXPECT_EQ(0, length_to_read);
-  EXPECT_EQ(kPacketSizeInBytes, static_cast<size_t>(data_pointer - data));
-}
-
-// Test with data length that will result in 3 packets
-TEST_F(PacketReaderTest, NormalLargeData) {
-  reader_->InitializeReading(packet_data_, kPacketDataLength,
-                             kPacketSizeInBytes);
-
-  int length_to_read = reader_->NextPacket(&packet_data_pointer_);
-  VerifyPacketData(kPacketSizeInBytes, length_to_read,
-                   packet1_, packet_data_pointer_);
-
-  length_to_read = reader_->NextPacket(&packet_data_pointer_);
-  VerifyPacketData(kPacketSizeInBytes, length_to_read,
-                   packet2_, packet_data_pointer_);
-
-  length_to_read = reader_->NextPacket(&packet_data_pointer_);
-  VerifyPacketData(1u, length_to_read,
-                   packet3_, packet_data_pointer_);
-
-  // Reading another one shall result in 0 bytes:
-  length_to_read = reader_->NextPacket(&packet_data_pointer_);
-  EXPECT_EQ(0, length_to_read);
-  EXPECT_EQ(kPacketDataLength,
-            static_cast<size_t>(packet_data_pointer_ - packet_data_));
-}
-
-// Test with empty data.
-TEST_F(PacketReaderTest, EmptyData) {
-  const int kDataLengthInBytes = 0;
-  // But don't really try to allocate a zero-length array...
-  uint8_t data[kPacketSizeInBytes];
-  uint8_t* data_pointer = data;
-  reader_->InitializeReading(data, kDataLengthInBytes, kPacketSizeInBytes);
-  EXPECT_EQ(kDataLengthInBytes, reader_->NextPacket(&data_pointer));
-  // Do it again to make sure nothing changes
-  EXPECT_EQ(kDataLengthInBytes, reader_->NextPacket(&data_pointer));
-}
-
-}  // namespace test
-}  // namespace webrtc
