diff --git a/api/transport/network_types.cc b/api/transport/network_types.cc
index d0a0c4a..db2a30b 100644
--- a/api/transport/network_types.cc
+++ b/api/transport/network_types.cc
@@ -31,15 +31,6 @@
 PacketResult::PacketResult(const PacketResult& other) = default;
 PacketResult::~PacketResult() = default;
 
-bool PacketResult::ReceiveTimeOrder::operator()(const PacketResult& lhs,
-                                                const PacketResult& rhs) {
-  if (lhs.receive_time != rhs.receive_time)
-    return lhs.receive_time < rhs.receive_time;
-  if (lhs.sent_packet.send_time != rhs.sent_packet.send_time)
-    return lhs.sent_packet.send_time < rhs.sent_packet.send_time;
-  return lhs.sent_packet.sequence_number < rhs.sent_packet.sequence_number;
-}
-
 TransportPacketsFeedback::TransportPacketsFeedback() = default;
 TransportPacketsFeedback::TransportPacketsFeedback(
     const TransportPacketsFeedback& other) = default;
@@ -73,13 +64,23 @@
 
 std::vector<PacketResult> TransportPacketsFeedback::SortedByReceiveTime()
     const {
+  class PacketResultComparator {
+   public:
+    inline bool operator()(const PacketResult& lhs, const PacketResult& rhs) {
+      if (lhs.receive_time != rhs.receive_time)
+        return lhs.receive_time < rhs.receive_time;
+      if (lhs.sent_packet.send_time != rhs.sent_packet.send_time)
+        return lhs.sent_packet.send_time < rhs.sent_packet.send_time;
+      return lhs.sent_packet.sequence_number < rhs.sent_packet.sequence_number;
+    }
+  };
   std::vector<PacketResult> res;
   for (const PacketResult& fb : packet_feedbacks) {
     if (fb.receive_time.IsFinite()) {
       res.push_back(fb);
     }
   }
-  std::sort(res.begin(), res.end(), PacketResult::ReceiveTimeOrder());
+  std::sort(res.begin(), res.end(), PacketResultComparator());
   return res;
 }
 
diff --git a/api/transport/network_types.h b/api/transport/network_types.h
index dcbe3c4..16c8211 100644
--- a/api/transport/network_types.h
+++ b/api/transport/network_types.h
@@ -131,11 +131,6 @@
 // Packet level feedback
 
 struct PacketResult {
-  class ReceiveTimeOrder {
-   public:
-    bool operator()(const PacketResult& lhs, const PacketResult& rhs);
-  };
-
   PacketResult();
   PacketResult(const PacketResult&);
   ~PacketResult();
diff --git a/modules/congestion_controller/goog_cc/BUILD.gn b/modules/congestion_controller/goog_cc/BUILD.gn
index 46e5bdb..3948444 100644
--- a/modules/congestion_controller/goog_cc/BUILD.gn
+++ b/modules/congestion_controller/goog_cc/BUILD.gn
@@ -52,6 +52,7 @@
     "../../../system_wrappers",
     "../../bitrate_controller",
     "../../remote_bitrate_estimator",
+    "../../rtp_rtcp:rtp_rtcp_format",
     "//third_party/abseil-cpp/absl/memory",
     "//third_party/abseil-cpp/absl/types:optional",
   ]
@@ -122,10 +123,8 @@
 
   deps = [
     "../../../api:network_state_predictor_api",
-    "../../../api/transport:network_control",
     "../../../api/transport:webrtc_key_value_config",
     "../../../api/units:data_rate",
-    "../../../api/units:timestamp",
     "../../../logging:rtc_event_bwe",
     "../../../logging:rtc_event_log_api",
     "../../../rtc_base:checks",
@@ -136,6 +135,7 @@
     "../../../rtc_base:safe_minmax",
     "../../../rtc_base/experiments:field_trial_parser",
     "../../remote_bitrate_estimator",
+    "../../rtp_rtcp:rtp_rtcp_format",
     "//third_party/abseil-cpp/absl/memory",
     "//third_party/abseil-cpp/absl/types:optional",
   ]
@@ -152,7 +152,6 @@
     ":estimators",
     "../../../api:network_state_predictor_api",
     "../../../api/transport:network_control",
-    "../../../api/transport:network_control",
     "../../../api/transport:webrtc_key_value_config",
     "../../../logging:rtc_event_bwe",
     "../../../logging:rtc_event_log_api",
@@ -162,6 +161,7 @@
     "../../../system_wrappers:metrics",
     "../../pacing",
     "../../remote_bitrate_estimator",
+    "../../rtp_rtcp:rtp_rtcp_format",
     "//third_party/abseil-cpp/absl/memory",
     "//third_party/abseil-cpp/absl/types:optional",
   ]
@@ -256,6 +256,8 @@
       "../../../test:test_support",
       "../../../test/scenario",
       "../../pacing",
+      "../../remote_bitrate_estimator",
+      "../../rtp_rtcp:rtp_rtcp_format",
       "//testing/gmock",
       "//third_party/abseil-cpp/absl/memory",
     ]
diff --git a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.cc b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.cc
index 9129516..4566984 100644
--- a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.cc
+++ b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.cc
@@ -15,11 +15,18 @@
 #include <utility>
 
 #include "absl/memory/memory.h"
+#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/numerics/safe_conversions.h"
 
 namespace webrtc {
 
+namespace {
+bool IsInSendTimeHistory(const PacketFeedback& packet) {
+  return packet.send_time_ms != PacketFeedback::kNoSendTime;
+}
+}  // namespace
+
 AcknowledgedBitrateEstimator::AcknowledgedBitrateEstimator(
     const WebRtcKeyValueConfig* key_value_config)
     : AcknowledgedBitrateEstimator(
@@ -34,36 +41,56 @@
     : in_alr_(false), bitrate_estimator_(std::move(bitrate_estimator)) {}
 
 void AcknowledgedBitrateEstimator::IncomingPacketFeedbackVector(
-    const std::vector<PacketResult>& packet_feedback_vector) {
+    const std::vector<PacketFeedback>& packet_feedback_vector) {
   RTC_DCHECK(std::is_sorted(packet_feedback_vector.begin(),
                             packet_feedback_vector.end(),
-                            PacketResult::ReceiveTimeOrder()));
+                            PacketFeedbackComparator()));
   for (const auto& packet : packet_feedback_vector) {
-    if (alr_ended_time_ && packet.sent_packet.send_time > *alr_ended_time_) {
-      bitrate_estimator_->ExpectFastRateChange();
-      alr_ended_time_.reset();
+    if (IsInSendTimeHistory(packet)) {
+      MaybeExpectFastRateChange(packet.send_time_ms);
+      int acknowledged_estimate = rtc::dchecked_cast<int>(packet.payload_size);
+      acknowledged_estimate += packet.unacknowledged_data;
+      bitrate_estimator_->Update(packet.arrival_time_ms, acknowledged_estimate,
+                                 in_alr_);
     }
-    DataSize acknowledged_estimate = packet.sent_packet.size;
-    acknowledged_estimate += packet.sent_packet.prior_unacked_data;
-    bitrate_estimator_->Update(packet.receive_time, acknowledged_estimate,
-                               in_alr_);
   }
 }
 
+absl::optional<uint32_t> AcknowledgedBitrateEstimator::bitrate_bps() const {
+  return bitrate_estimator_->bitrate_bps();
+}
+
+absl::optional<uint32_t> AcknowledgedBitrateEstimator::PeekBps() const {
+  return bitrate_estimator_->PeekBps();
+}
+
 absl::optional<DataRate> AcknowledgedBitrateEstimator::bitrate() const {
-  return bitrate_estimator_->bitrate();
+  if (bitrate_bps())
+    return DataRate::bps(*bitrate_bps());
+  return absl::nullopt;
 }
 
 absl::optional<DataRate> AcknowledgedBitrateEstimator::PeekRate() const {
-  return bitrate_estimator_->PeekRate();
+  if (PeekBps())
+    return DataRate::bps(*PeekBps());
+  return absl::nullopt;
 }
 
-void AcknowledgedBitrateEstimator::SetAlrEndedTime(Timestamp alr_ended_time) {
-  alr_ended_time_.emplace(alr_ended_time);
+void AcknowledgedBitrateEstimator::SetAlrEndedTimeMs(
+    int64_t alr_ended_time_ms) {
+  alr_ended_time_ms_.emplace(alr_ended_time_ms);
 }
 
 void AcknowledgedBitrateEstimator::SetAlr(bool in_alr) {
   in_alr_ = in_alr;
 }
 
+void AcknowledgedBitrateEstimator::MaybeExpectFastRateChange(
+    int64_t packet_send_time_ms) {
+  if (alr_ended_time_ms_ && packet_send_time_ms > *alr_ended_time_ms_) {
+    bitrate_estimator_->ExpectFastRateChange();
+    alr_ended_time_ms_.reset();
+  }
+}
+
 }  // namespace webrtc
diff --git a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.h b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.h
index a173007..986d17a 100644
--- a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.h
+++ b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.h
@@ -15,13 +15,14 @@
 #include <vector>
 
 #include "absl/types/optional.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/bitrate_estimator.h"
 
 namespace webrtc {
 
+struct PacketFeedback;
+
 class AcknowledgedBitrateEstimator {
  public:
   AcknowledgedBitrateEstimator(
@@ -33,14 +34,17 @@
   ~AcknowledgedBitrateEstimator();
 
   void IncomingPacketFeedbackVector(
-      const std::vector<PacketResult>& packet_feedback_vector);
+      const std::vector<PacketFeedback>& packet_feedback_vector);
+  absl::optional<uint32_t> bitrate_bps() const;
+  absl::optional<uint32_t> PeekBps() const;
   absl::optional<DataRate> bitrate() const;
   absl::optional<DataRate> PeekRate() const;
   void SetAlr(bool in_alr);
-  void SetAlrEndedTime(Timestamp alr_ended_time);
+  void SetAlrEndedTimeMs(int64_t alr_ended_time_ms);
 
  private:
-  absl::optional<Timestamp> alr_ended_time_;
+  void MaybeExpectFastRateChange(int64_t packet_arrival_time_ms);
+  absl::optional<int64_t> alr_ended_time_ms_;
   bool in_alr_;
   std::unique_ptr<BitrateEstimator> bitrate_estimator_;
 };
diff --git a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_unittest.cc b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_unittest.cc
index e16849d..f406d97 100644
--- a/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_unittest.cc
+++ b/modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator_unittest.cc
@@ -14,6 +14,7 @@
 
 #include "absl/memory/memory.h"
 #include "api/transport/field_trial_based_config.h"
+#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 #include "rtc_base/fake_clock.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
@@ -35,9 +36,8 @@
 class MockBitrateEstimator : public BitrateEstimator {
  public:
   using BitrateEstimator::BitrateEstimator;
-  MOCK_METHOD3(Update,
-               void(Timestamp at_time, DataSize data_size, bool in_alr));
-  MOCK_CONST_METHOD0(bitrate, absl::optional<DataRate>());
+  MOCK_METHOD3(Update, void(int64_t now_ms, int bytes, bool in_alr));
+  MOCK_CONST_METHOD0(bitrate_bps, absl::optional<uint32_t>());
   MOCK_METHOD0(ExpectFastRateChange, void());
 };
 
@@ -58,38 +58,43 @@
   return states;
 }
 
-std::vector<PacketResult> CreateFeedbackVector() {
-  std::vector<PacketResult> packet_feedback_vector(2);
-  packet_feedback_vector[0].receive_time = Timestamp::ms(kFirstArrivalTimeMs);
-  packet_feedback_vector[0].sent_packet.send_time =
-      Timestamp::ms(kFirstSendTimeMs);
-  packet_feedback_vector[0].sent_packet.sequence_number = kSequenceNumber;
-  packet_feedback_vector[0].sent_packet.size = DataSize::bytes(kPayloadSize);
-  packet_feedback_vector[1].receive_time =
-      Timestamp::ms(kFirstArrivalTimeMs + 10);
-  packet_feedback_vector[1].sent_packet.send_time =
-      Timestamp::ms(kFirstSendTimeMs + 10);
-  packet_feedback_vector[1].sent_packet.sequence_number = kSequenceNumber;
-  packet_feedback_vector[1].sent_packet.size =
-      DataSize::bytes(kPayloadSize + 10);
+std::vector<PacketFeedback> CreateFeedbackVector() {
+  std::vector<PacketFeedback> packet_feedback_vector;
+  const PacedPacketInfo pacing_info;
+  packet_feedback_vector.push_back(
+      PacketFeedback(kFirstArrivalTimeMs, kFirstSendTimeMs, kSequenceNumber,
+                     kPayloadSize, pacing_info));
+  packet_feedback_vector.push_back(
+      PacketFeedback(kFirstArrivalTimeMs + 10, kFirstSendTimeMs + 10,
+                     kSequenceNumber, kPayloadSize + 10, pacing_info));
   return packet_feedback_vector;
 }
 
 }  // anonymous namespace
 
+TEST(TestAcknowledgedBitrateEstimator, DontAddPacketsWhichAreNotInSendHistory) {
+  auto states = CreateTestStates();
+  std::vector<PacketFeedback> packet_feedback_vector;
+  packet_feedback_vector.push_back(
+      PacketFeedback(kFirstArrivalTimeMs, kSequenceNumber));
+  EXPECT_CALL(*states.mock_bitrate_estimator, Update(_, _, _)).Times(0);
+  states.acknowledged_bitrate_estimator->IncomingPacketFeedbackVector(
+      packet_feedback_vector);
+}
+
 TEST(TestAcknowledgedBitrateEstimator, UpdateBandwidth) {
   auto states = CreateTestStates();
   auto packet_feedback_vector = CreateFeedbackVector();
   {
     InSequence dummy;
     EXPECT_CALL(*states.mock_bitrate_estimator,
-                Update(packet_feedback_vector[0].receive_time,
-                       packet_feedback_vector[0].sent_packet.size,
+                Update(packet_feedback_vector[0].arrival_time_ms,
+                       static_cast<int>(packet_feedback_vector[0].payload_size),
                        /*in_alr*/ false))
         .Times(1);
     EXPECT_CALL(*states.mock_bitrate_estimator,
-                Update(packet_feedback_vector[1].receive_time,
-                       packet_feedback_vector[1].sent_packet.size,
+                Update(packet_feedback_vector[1].arrival_time_ms,
+                       static_cast<int>(packet_feedback_vector[1].payload_size),
                        /*in_alr*/ false))
         .Times(1);
   }
@@ -103,31 +108,31 @@
   {
     InSequence dummy;
     EXPECT_CALL(*states.mock_bitrate_estimator,
-                Update(packet_feedback_vector[0].receive_time,
-                       packet_feedback_vector[0].sent_packet.size,
+                Update(packet_feedback_vector[0].arrival_time_ms,
+                       static_cast<int>(packet_feedback_vector[0].payload_size),
                        /*in_alr*/ false))
         .Times(1);
     EXPECT_CALL(*states.mock_bitrate_estimator, ExpectFastRateChange())
         .Times(1);
     EXPECT_CALL(*states.mock_bitrate_estimator,
-                Update(packet_feedback_vector[1].receive_time,
-                       packet_feedback_vector[1].sent_packet.size,
+                Update(packet_feedback_vector[1].arrival_time_ms,
+                       static_cast<int>(packet_feedback_vector[1].payload_size),
                        /*in_alr*/ false))
         .Times(1);
   }
-  states.acknowledged_bitrate_estimator->SetAlrEndedTime(
-      Timestamp::ms(kFirstArrivalTimeMs + 1));
+  states.acknowledged_bitrate_estimator->SetAlrEndedTimeMs(kFirstArrivalTimeMs +
+                                                           1);
   states.acknowledged_bitrate_estimator->IncomingPacketFeedbackVector(
       packet_feedback_vector);
 }
 
 TEST(TestAcknowledgedBitrateEstimator, ReturnBitrate) {
   auto states = CreateTestStates();
-  absl::optional<DataRate> return_value = DataRate::kbps(42);
-  EXPECT_CALL(*states.mock_bitrate_estimator, bitrate())
+  absl::optional<uint32_t> return_value(42);
+  EXPECT_CALL(*states.mock_bitrate_estimator, bitrate_bps())
       .Times(1)
       .WillOnce(Return(return_value));
-  EXPECT_EQ(return_value, states.acknowledged_bitrate_estimator->bitrate());
+  EXPECT_EQ(return_value, states.acknowledged_bitrate_estimator->bitrate_bps());
 }
 
 }  // namespace webrtc*/
diff --git a/modules/congestion_controller/goog_cc/bitrate_estimator.cc b/modules/congestion_controller/goog_cc/bitrate_estimator.cc
index 68e924e..a2c9857 100644
--- a/modules/congestion_controller/goog_cc/bitrate_estimator.cc
+++ b/modules/congestion_controller/goog_cc/bitrate_estimator.cc
@@ -58,14 +58,13 @@
 
 BitrateEstimator::~BitrateEstimator() = default;
 
-void BitrateEstimator::Update(Timestamp at_time, DataSize amount, bool in_alr) {
+void BitrateEstimator::Update(int64_t now_ms, int bytes, bool in_alr) {
   int rate_window_ms = noninitial_window_ms_.Get();
   // We use a larger window at the beginning to get a more stable sample that
   // we can use to initialize the estimate.
   if (bitrate_estimate_kbps_ < 0.f)
     rate_window_ms = initial_window_ms_.Get();
-  float bitrate_sample_kbps =
-      UpdateWindow(at_time.ms(), amount.bytes(), rate_window_ms);
+  float bitrate_sample_kbps = UpdateWindow(now_ms, bytes, rate_window_ms);
   if (bitrate_sample_kbps < 0.0f)
     return;
   if (bitrate_estimate_kbps_ < 0.0f) {
@@ -101,7 +100,7 @@
       std::max(bitrate_estimate_kbps_, estimate_floor_.Get().kbps<float>());
   bitrate_estimate_var_ = sample_var * pred_bitrate_estimate_var /
                           (sample_var + pred_bitrate_estimate_var);
-  BWE_TEST_LOGGING_PLOT(1, "acknowledged_bitrate", at_time.ms(),
+  BWE_TEST_LOGGING_PLOT(1, "acknowledged_bitrate", now_ms,
                         bitrate_estimate_kbps_ * 1000);
 }
 
@@ -133,15 +132,15 @@
   return bitrate_sample;
 }
 
-absl::optional<DataRate> BitrateEstimator::bitrate() const {
+absl::optional<uint32_t> BitrateEstimator::bitrate_bps() const {
   if (bitrate_estimate_kbps_ < 0.f)
     return absl::nullopt;
-  return DataRate::kbps(bitrate_estimate_kbps_);
+  return bitrate_estimate_kbps_ * 1000;
 }
 
-absl::optional<DataRate> BitrateEstimator::PeekRate() const {
+absl::optional<uint32_t> BitrateEstimator::PeekBps() const {
   if (current_window_ms_ > 0)
-    return DataSize::bytes(sum_) / TimeDelta::ms(current_window_ms_);
+    return sum_ * 8000 / current_window_ms_;
   return absl::nullopt;
 }
 
diff --git a/modules/congestion_controller/goog_cc/bitrate_estimator.h b/modules/congestion_controller/goog_cc/bitrate_estimator.h
index c657dbc..0ef429b 100644
--- a/modules/congestion_controller/goog_cc/bitrate_estimator.h
+++ b/modules/congestion_controller/goog_cc/bitrate_estimator.h
@@ -16,7 +16,6 @@
 #include "absl/types/optional.h"
 #include "api/transport/webrtc_key_value_config.h"
 #include "api/units/data_rate.h"
-#include "api/units/timestamp.h"
 #include "rtc_base/experiments/field_trial_parser.h"
 
 namespace webrtc {
@@ -30,10 +29,10 @@
  public:
   explicit BitrateEstimator(const WebRtcKeyValueConfig* key_value_config);
   virtual ~BitrateEstimator();
-  virtual void Update(Timestamp at_time, DataSize amount, bool in_alr);
+  virtual void Update(int64_t now_ms, int bytes, bool in_alr);
 
-  virtual absl::optional<DataRate> bitrate() const;
-  absl::optional<DataRate> PeekRate() const;
+  virtual absl::optional<uint32_t> bitrate_bps() const;
+  absl::optional<uint32_t> PeekBps() const;
 
   virtual void ExpectFastRateChange();
 
diff --git a/modules/congestion_controller/goog_cc/delay_based_bwe.cc b/modules/congestion_controller/goog_cc/delay_based_bwe.cc
index bd140f6..0f60002 100644
--- a/modules/congestion_controller/goog_cc/delay_based_bwe.cc
+++ b/modules/congestion_controller/goog_cc/delay_based_bwe.cc
@@ -79,14 +79,17 @@
 DelayBasedBwe::~DelayBasedBwe() {}
 
 DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector(
-    const TransportPacketsFeedback& msg,
+    const std::vector<PacketFeedback>& packet_feedback_vector,
     absl::optional<DataRate> acked_bitrate,
     absl::optional<DataRate> probe_bitrate,
     absl::optional<NetworkStateEstimate> network_estimate,
-    bool in_alr) {
+    bool in_alr,
+    Timestamp at_time) {
+  RTC_DCHECK(std::is_sorted(packet_feedback_vector.begin(),
+                            packet_feedback_vector.end(),
+                            PacketFeedbackComparator()));
   RTC_DCHECK_RUNS_SERIALIZED(&network_race_);
 
-  auto packet_feedback_vector = msg.SortedByReceiveTime();
   // TODO(holmer): An empty feedback vector here likely means that
   // all acks were too late and that the send time history had
   // timed out. We should reduce the rate when this occurs.
@@ -105,8 +108,10 @@
   bool recovered_from_overuse = false;
   BandwidthUsage prev_detector_state = delay_detector_->State();
   for (const auto& packet_feedback : packet_feedback_vector) {
+    if (packet_feedback.send_time_ms < 0)
+      continue;
     delayed_feedback = false;
-    IncomingPacketFeedback(packet_feedback, msg.feedback_time);
+    IncomingPacketFeedback(packet_feedback, at_time);
     if (prev_detector_state == BandwidthUsage::kBwUnderusing &&
         delay_detector_->State() == BandwidthUsage::kBwNormal) {
       recovered_from_overuse = true;
@@ -123,11 +128,12 @@
   rate_control_.SetNetworkStateEstimate(network_estimate);
   return MaybeUpdateEstimate(acked_bitrate, probe_bitrate,
                              std::move(network_estimate),
-                             recovered_from_overuse, in_alr, msg.feedback_time);
+                             recovered_from_overuse, in_alr, at_time);
 }
 
-void DelayBasedBwe::IncomingPacketFeedback(const PacketResult& packet_feedback,
-                                           Timestamp at_time) {
+void DelayBasedBwe::IncomingPacketFeedback(
+    const PacketFeedback& packet_feedback,
+    Timestamp at_time) {
   // Reset if the stream has timed out.
   if (last_seen_packet_.IsInfinite() ||
       at_time - last_seen_packet_ > kStreamTimeOut) {
@@ -141,7 +147,7 @@
 
   uint32_t send_time_24bits =
       static_cast<uint32_t>(
-          ((static_cast<uint64_t>(packet_feedback.sent_packet.send_time.ms())
+          ((static_cast<uint64_t>(packet_feedback.send_time_ms)
             << kAbsSendTimeFraction) +
            500) /
           1000) &
@@ -154,13 +160,11 @@
   int64_t t_delta = 0;
   int size_delta = 0;
   bool calculated_deltas = inter_arrival_->ComputeDeltas(
-      timestamp, packet_feedback.receive_time.ms(), at_time.ms(),
-      packet_feedback.sent_packet.size.bytes(), &ts_delta, &t_delta,
-      &size_delta);
+      timestamp, packet_feedback.arrival_time_ms, at_time.ms(),
+      packet_feedback.payload_size, &ts_delta, &t_delta, &size_delta);
   double ts_delta_ms = (1000.0 * ts_delta) / (1 << kInterArrivalShift);
-  delay_detector_->Update(t_delta, ts_delta_ms,
-                          packet_feedback.sent_packet.send_time.ms(),
-                          packet_feedback.receive_time.ms(), calculated_deltas);
+  delay_detector_->Update(t_delta, ts_delta_ms, packet_feedback.send_time_ms,
+                          packet_feedback.arrival_time_ms, calculated_deltas);
 }
 
 DataRate DelayBasedBwe::TriggerOveruse(Timestamp at_time,
diff --git a/modules/congestion_controller/goog_cc/delay_based_bwe.h b/modules/congestion_controller/goog_cc/delay_based_bwe.h
index c24295d..4841dde 100644
--- a/modules/congestion_controller/goog_cc/delay_based_bwe.h
+++ b/modules/congestion_controller/goog_cc/delay_based_bwe.h
@@ -25,6 +25,7 @@
 #include "modules/remote_bitrate_estimator/aimd_rate_control.h"
 #include "modules/remote_bitrate_estimator/include/bwe_defines.h"
 #include "modules/remote_bitrate_estimator/inter_arrival.h"
+#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"  // For PacketFeedback
 #include "rtc_base/constructor_magic.h"
 #include "rtc_base/race_checker.h"
 
@@ -50,11 +51,12 @@
   virtual ~DelayBasedBwe();
 
   Result IncomingPacketFeedbackVector(
-      const TransportPacketsFeedback& msg,
+      const std::vector<PacketFeedback>& packet_feedback_vector,
       absl::optional<DataRate> acked_bitrate,
       absl::optional<DataRate> probe_bitrate,
       absl::optional<NetworkStateEstimate> network_estimate,
-      bool in_alr);
+      bool in_alr,
+      Timestamp at_time);
   void OnRttUpdate(TimeDelta avg_rtt);
   bool LatestEstimate(std::vector<uint32_t>* ssrcs, DataRate* bitrate) const;
   void SetStartBitrate(DataRate start_bitrate);
@@ -67,7 +69,7 @@
 
  private:
   friend class GoogCcStatePrinter;
-  void IncomingPacketFeedback(const PacketResult& packet_feedback,
+  void IncomingPacketFeedback(const PacketFeedback& packet_feedback,
                               Timestamp at_time);
   Result MaybeUpdateEstimate(
       absl::optional<DataRate> acked_bitrate,
diff --git a/modules/congestion_controller/goog_cc/delay_based_bwe_unittest.cc b/modules/congestion_controller/goog_cc/delay_based_bwe_unittest.cc
index 9d8d226..9a602c2 100644
--- a/modules/congestion_controller/goog_cc/delay_based_bwe_unittest.cc
+++ b/modules/congestion_controller/goog_cc/delay_based_bwe_unittest.cc
@@ -24,16 +24,40 @@
 const PacedPacketInfo kPacingInfo0(0, kNumProbesCluster0, 2000);
 const PacedPacketInfo kPacingInfo1(1, kNumProbesCluster1, 4000);
 constexpr float kTargetUtilizationFraction = 0.95f;
+constexpr Timestamp kDummyTimestamp = Timestamp::Seconds<1000>();
 }  // namespace
 
+TEST_F(DelayBasedBweTest, NoCrashEmptyFeedback) {
+  std::vector<PacketFeedback> packet_feedback_vector;
+  bitrate_estimator_->IncomingPacketFeedbackVector(
+      packet_feedback_vector, /*acked_bitrate*/ absl::nullopt,
+      /*probe_bitrate*/ absl::nullopt, /*network_estimate*/ absl::nullopt,
+      /*in_alr*/ false, kDummyTimestamp);
+}
+
+TEST_F(DelayBasedBweTest, NoCrashOnlyLostFeedback) {
+  std::vector<PacketFeedback> packet_feedback_vector;
+  packet_feedback_vector.push_back(PacketFeedback(PacketFeedback::kNotReceived,
+                                                  PacketFeedback::kNoSendTime,
+                                                  0, 1500, PacedPacketInfo()));
+  packet_feedback_vector.push_back(PacketFeedback(PacketFeedback::kNotReceived,
+                                                  PacketFeedback::kNoSendTime,
+                                                  1, 1500, PacedPacketInfo()));
+  bitrate_estimator_->IncomingPacketFeedbackVector(
+      packet_feedback_vector, /*acked_bitrate*/ absl::nullopt,
+      /*probe_bitrate*/ absl::nullopt, /*network_estimate*/ absl::nullopt,
+      /*in_alr*/ false, kDummyTimestamp);
+}
+
 TEST_F(DelayBasedBweTest, ProbeDetection) {
   int64_t now_ms = clock_.TimeInMilliseconds();
+  uint16_t seq_num = 0;
 
   // First burst sent at 8 * 1000 / 10 = 800 kbps.
   for (int i = 0; i < kNumProbesCluster0; ++i) {
     clock_.AdvanceTimeMilliseconds(10);
     now_ms = clock_.TimeInMilliseconds();
-    IncomingFeedback(now_ms, now_ms, 1000, kPacingInfo0);
+    IncomingFeedback(now_ms, now_ms, seq_num++, 1000, kPacingInfo0);
   }
   EXPECT_TRUE(bitrate_observer_.updated());
 
@@ -41,7 +65,7 @@
   for (int i = 0; i < kNumProbesCluster1; ++i) {
     clock_.AdvanceTimeMilliseconds(5);
     now_ms = clock_.TimeInMilliseconds();
-    IncomingFeedback(now_ms, now_ms, 1000, kPacingInfo1);
+    IncomingFeedback(now_ms, now_ms, seq_num++, 1000, kPacingInfo1);
   }
 
   EXPECT_TRUE(bitrate_observer_.updated());
@@ -50,15 +74,16 @@
 
 TEST_F(DelayBasedBweTest, ProbeDetectionNonPacedPackets) {
   int64_t now_ms = clock_.TimeInMilliseconds();
+  uint16_t seq_num = 0;
   // First burst sent at 8 * 1000 / 10 = 800 kbps, but with every other packet
   // not being paced which could mess things up.
   for (int i = 0; i < kNumProbesCluster0; ++i) {
     clock_.AdvanceTimeMilliseconds(5);
     now_ms = clock_.TimeInMilliseconds();
-    IncomingFeedback(now_ms, now_ms, 1000, kPacingInfo0);
+    IncomingFeedback(now_ms, now_ms, seq_num++, 1000, kPacingInfo0);
     // Non-paced packet, arriving 5 ms after.
     clock_.AdvanceTimeMilliseconds(5);
-    IncomingFeedback(now_ms, now_ms, 100, PacedPacketInfo());
+    IncomingFeedback(now_ms, now_ms, seq_num++, 100, PacedPacketInfo());
   }
 
   EXPECT_TRUE(bitrate_observer_.updated());
@@ -67,6 +92,7 @@
 
 TEST_F(DelayBasedBweTest, ProbeDetectionFasterArrival) {
   int64_t now_ms = clock_.TimeInMilliseconds();
+  uint16_t seq_num = 0;
   // First burst sent at 8 * 1000 / 10 = 800 kbps.
   // Arriving at 8 * 1000 / 5 = 1600 kbps.
   int64_t send_time_ms = 0;
@@ -74,7 +100,7 @@
     clock_.AdvanceTimeMilliseconds(1);
     send_time_ms += 10;
     now_ms = clock_.TimeInMilliseconds();
-    IncomingFeedback(now_ms, send_time_ms, 1000, kPacingInfo0);
+    IncomingFeedback(now_ms, send_time_ms, seq_num++, 1000, kPacingInfo0);
   }
 
   EXPECT_FALSE(bitrate_observer_.updated());
@@ -82,6 +108,7 @@
 
 TEST_F(DelayBasedBweTest, ProbeDetectionSlowerArrival) {
   int64_t now_ms = clock_.TimeInMilliseconds();
+  uint16_t seq_num = 0;
   // First burst sent at 8 * 1000 / 5 = 1600 kbps.
   // Arriving at 8 * 1000 / 7 = 1142 kbps.
   // Since the receive rate is significantly below the send rate, we expect to
@@ -91,7 +118,7 @@
     clock_.AdvanceTimeMilliseconds(7);
     send_time_ms += 5;
     now_ms = clock_.TimeInMilliseconds();
-    IncomingFeedback(now_ms, send_time_ms, 1000, kPacingInfo1);
+    IncomingFeedback(now_ms, send_time_ms, seq_num++, 1000, kPacingInfo1);
   }
 
   EXPECT_TRUE(bitrate_observer_.updated());
@@ -101,6 +128,7 @@
 
 TEST_F(DelayBasedBweTest, ProbeDetectionSlowerArrivalHighBitrate) {
   int64_t now_ms = clock_.TimeInMilliseconds();
+  uint16_t seq_num = 0;
   // Burst sent at 8 * 1000 / 1 = 8000 kbps.
   // Arriving at 8 * 1000 / 2 = 4000 kbps.
   // Since the receive rate is significantly below the send rate, we expect to
@@ -110,7 +138,7 @@
     clock_.AdvanceTimeMilliseconds(2);
     send_time_ms += 1;
     now_ms = clock_.TimeInMilliseconds();
-    IncomingFeedback(now_ms, send_time_ms, 1000, kPacingInfo1);
+    IncomingFeedback(now_ms, send_time_ms, seq_num++, 1000, kPacingInfo1);
   }
 
   EXPECT_TRUE(bitrate_observer_.updated());
@@ -135,7 +163,7 @@
   RateIncreaseReorderingTestHelper(730000);
 }
 TEST_F(DelayBasedBweTest, RateIncreaseRtpTimestamps) {
-  RateIncreaseRtpTimestampsTestHelper(622);
+  RateIncreaseRtpTimestampsTestHelper(627);
 }
 
 TEST_F(DelayBasedBweTest, CapacityDropOneStream) {
@@ -194,7 +222,7 @@
     // The purpose of this test is to ensure that we back down even if we don't
     // have any acknowledged bitrate estimate yet. Hence, if the test works
     // as expected, we should not have a measured bitrate yet.
-    EXPECT_FALSE(acknowledged_bitrate_estimator_->bitrate().has_value());
+    EXPECT_FALSE(acknowledged_bitrate_estimator_->bitrate_bps().has_value());
     if (overuse) {
       EXPECT_TRUE(bitrate_observer_.updated());
       EXPECT_NEAR(bitrate_observer_.latest_bitrate(), kStartBitrate.bps() / 2,
@@ -242,7 +270,7 @@
     // The purpose of this test is to ensure that we back down even if we don't
     // have any acknowledged bitrate estimate yet. Hence, if the test works
     // as expected, we should not have a measured bitrate yet.
-    EXPECT_FALSE(acknowledged_bitrate_estimator_->bitrate().has_value());
+    EXPECT_FALSE(acknowledged_bitrate_estimator_->bitrate_bps().has_value());
     if (overuse) {
       EXPECT_TRUE(bitrate_observer_.updated());
       EXPECT_NEAR(bitrate_observer_.latest_bitrate(), kStartBitrate.bps() / 2,
diff --git a/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.cc b/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.cc
index bc0be2b..8baaf3d 100644
--- a/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.cc
+++ b/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.cc
@@ -28,13 +28,17 @@
 namespace test {
 
 void TestBitrateObserver::OnReceiveBitrateChanged(
+    const std::vector<uint32_t>& ssrcs,
     uint32_t bitrate) {
   latest_bitrate_ = bitrate;
   updated_ = true;
 }
 
 RtpStream::RtpStream(int fps, int bitrate_bps)
-    : fps_(fps), bitrate_bps_(bitrate_bps), next_rtp_time_(0) {
+    : fps_(fps),
+      bitrate_bps_(bitrate_bps),
+      next_rtp_time_(0),
+      sequence_number_(0) {
   RTC_CHECK_GT(fps_, 0);
 }
 
@@ -42,7 +46,7 @@
 // previous frame, no frame will be generated. The frame is split into
 // packets.
 int64_t RtpStream::GenerateFrame(int64_t time_now_us,
-                                 std::vector<PacketResult>* packets) {
+                                 std::vector<PacketFeedback>* packets) {
   if (time_now_us < next_rtp_time_) {
     return next_rtp_time_;
   }
@@ -52,10 +56,9 @@
       std::max<size_t>((bits_per_frame + 4 * kMtu) / (8 * kMtu), 1u);
   size_t payload_size = (bits_per_frame + 4 * n_packets) / (8 * n_packets);
   for (size_t i = 0; i < n_packets; ++i) {
-    PacketResult packet;
-    packet.sent_packet.send_time =
-        Timestamp::us(time_now_us + kSendSideOffsetUs);
-    packet.sent_packet.size = DataSize::bytes(payload_size);
+    PacketFeedback packet(-1, sequence_number_++);
+    packet.send_time_ms = (time_now_us + kSendSideOffsetUs) / 1000;
+    packet.payload_size = payload_size;
     packets->push_back(packet);
   }
   next_rtp_time_ = time_now_us + (1000000 + fps_ / 2) / fps_;
@@ -121,7 +124,7 @@
 
 // TODO(holmer): Break out the channel simulation part from this class to make
 // it possible to simulate different types of channels.
-int64_t StreamGenerator::GenerateFrame(std::vector<PacketResult>* packets,
+int64_t StreamGenerator::GenerateFrame(std::vector<PacketFeedback>* packets,
                                        int64_t time_now_us) {
   RTC_CHECK(packets != NULL);
   RTC_CHECK(packets->empty());
@@ -130,15 +133,14 @@
       std::min_element(streams_.begin(), streams_.end(), RtpStream::Compare);
   (*it)->GenerateFrame(time_now_us, packets);
   int i = 0;
-  for (PacketResult& packet : *packets) {
+  for (PacketFeedback& packet : *packets) {
     int capacity_bpus = capacity_ / 1000;
     int64_t required_network_time_us =
-        (8 * 1000 * packet.sent_packet.size.bytes() + capacity_bpus / 2) /
-        capacity_bpus;
+        (8 * 1000 * packet.payload_size + capacity_bpus / 2) / capacity_bpus;
     prev_arrival_time_us_ =
         std::max(time_now_us + required_network_time_us,
                  prev_arrival_time_us_ + required_network_time_us);
-    packet.receive_time = Timestamp::us(prev_arrival_time_us_);
+    packet.arrival_time_ms = prev_arrival_time_us_ / 1000;
     ++i;
   }
   it = std::min_element(streams_.begin(), streams_.end(), RtpStream::Compare);
@@ -185,38 +187,37 @@
 
 void DelayBasedBweTest::IncomingFeedback(int64_t arrival_time_ms,
                                          int64_t send_time_ms,
+                                         uint16_t sequence_number,
                                          size_t payload_size) {
-  IncomingFeedback(arrival_time_ms, send_time_ms, payload_size,
+  IncomingFeedback(arrival_time_ms, send_time_ms, sequence_number, payload_size,
                    PacedPacketInfo());
 }
 
 void DelayBasedBweTest::IncomingFeedback(int64_t arrival_time_ms,
                                          int64_t send_time_ms,
+                                         uint16_t sequence_number,
                                          size_t payload_size,
                                          const PacedPacketInfo& pacing_info) {
   RTC_CHECK_GE(arrival_time_ms + arrival_time_offset_ms_, 0);
-  PacketResult packet;
-  packet.receive_time =
-      Timestamp::ms(arrival_time_ms + arrival_time_offset_ms_);
-  packet.sent_packet.send_time = Timestamp::ms(send_time_ms);
-  packet.sent_packet.size = DataSize::bytes(payload_size);
-  packet.sent_packet.pacing_info = pacing_info;
-  if (packet.sent_packet.pacing_info.probe_cluster_id !=
-      PacedPacketInfo::kNotAProbe)
+  PacketFeedback packet(arrival_time_ms + arrival_time_offset_ms_, send_time_ms,
+                        sequence_number, payload_size, pacing_info);
+  std::vector<PacketFeedback> packets;
+  packets.push_back(packet);
+  if (packet.send_time_ms != PacketFeedback::kNoSendTime &&
+      packet.pacing_info.probe_cluster_id != PacedPacketInfo::kNotAProbe)
     probe_bitrate_estimator_->HandleProbeAndEstimateBitrate(packet);
 
-  TransportPacketsFeedback msg;
-  msg.feedback_time = Timestamp::ms(clock_.TimeInMilliseconds());
-  msg.packet_feedbacks.push_back(packet);
-  acknowledged_bitrate_estimator_->IncomingPacketFeedbackVector(
-      msg.SortedByReceiveTime());
+  acknowledged_bitrate_estimator_->IncomingPacketFeedbackVector(packets);
   DelayBasedBwe::Result result =
       bitrate_estimator_->IncomingPacketFeedbackVector(
-          msg, acknowledged_bitrate_estimator_->bitrate(),
+          packets, acknowledged_bitrate_estimator_->bitrate(),
           probe_bitrate_estimator_->FetchAndResetLastEstimatedBitrate(),
-          /*network_estimate*/ absl::nullopt, /*in_alr*/ false);
+          /*network_estimate*/ absl::nullopt, /*in_alr*/ false,
+          Timestamp::ms(clock_.TimeInMilliseconds()));
+  const uint32_t kDummySsrc = 0;
   if (result.updated) {
-    bitrate_observer_.OnReceiveBitrateChanged(result.target_bitrate.bps());
+    bitrate_observer_.OnReceiveBitrateChanged({kDummySsrc},
+                                              result.target_bitrate.bps());
   }
 }
 
@@ -229,8 +230,7 @@
 bool DelayBasedBweTest::GenerateAndProcessFrame(uint32_t ssrc,
                                                 uint32_t bitrate_bps) {
   stream_generator_->SetBitrateBps(bitrate_bps);
-  std::vector<PacketResult> packets;
-
+  std::vector<PacketFeedback> packets;
   int64_t next_time_us =
       stream_generator_->GenerateFrame(&packets, clock_.TimeInMicroseconds());
   if (packets.empty())
@@ -238,29 +238,28 @@
 
   bool overuse = false;
   bitrate_observer_.Reset();
-  clock_.AdvanceTimeMicroseconds(packets.back().receive_time.us() -
+  clock_.AdvanceTimeMicroseconds(1000 * packets.back().arrival_time_ms -
                                  clock_.TimeInMicroseconds());
   for (auto& packet : packets) {
-    RTC_CHECK_GE(packet.receive_time.ms() + arrival_time_offset_ms_, 0);
-    packet.receive_time += TimeDelta::ms(arrival_time_offset_ms_);
+    RTC_CHECK_GE(packet.arrival_time_ms + arrival_time_offset_ms_, 0);
+    packet.arrival_time_ms += arrival_time_offset_ms_;
 
-    if (packet.sent_packet.pacing_info.probe_cluster_id !=
-        PacedPacketInfo::kNotAProbe)
+    if (packet.send_time_ms != PacketFeedback::kNoSendTime &&
+        packet.pacing_info.probe_cluster_id != PacedPacketInfo::kNotAProbe)
       probe_bitrate_estimator_->HandleProbeAndEstimateBitrate(packet);
   }
 
   acknowledged_bitrate_estimator_->IncomingPacketFeedbackVector(packets);
-  TransportPacketsFeedback msg;
-  msg.packet_feedbacks = packets;
-  msg.feedback_time = Timestamp::ms(clock_.TimeInMilliseconds());
-
   DelayBasedBwe::Result result =
       bitrate_estimator_->IncomingPacketFeedbackVector(
-          msg, acknowledged_bitrate_estimator_->bitrate(),
+          packets, acknowledged_bitrate_estimator_->bitrate(),
           probe_bitrate_estimator_->FetchAndResetLastEstimatedBitrate(),
-          /*network_estimate*/ absl::nullopt, /*in_alr*/ false);
+          /*network_estimate*/ absl::nullopt, /*in_alr*/ false,
+          Timestamp::ms(clock_.TimeInMilliseconds()));
+  const uint32_t kDummySsrc = 0;
   if (result.updated) {
-    bitrate_observer_.OnReceiveBitrateChanged(result.target_bitrate.bps());
+    bitrate_observer_.OnReceiveBitrateChanged({kDummySsrc},
+                                              result.target_bitrate.bps());
     if (!first_update_ && result.target_bitrate.bps() < bitrate_bps)
       overuse = true;
     first_update_ = false;
@@ -309,6 +308,7 @@
   const PacedPacketInfo kPacingInfo(0, 5, 5000);
   DataRate bitrate = DataRate::Zero();
   int64_t send_time_ms = 0;
+  uint16_t sequence_number = 0;
   std::vector<uint32_t> ssrcs;
   EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate));
   EXPECT_EQ(0u, ssrcs.size());
@@ -330,8 +330,8 @@
       EXPECT_FALSE(bitrate_observer_.updated());
       bitrate_observer_.Reset();
     }
-    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms, kMtu,
-                     pacing_info);
+    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms,
+                     sequence_number++, kMtu, pacing_info);
     clock_.AdvanceTimeMilliseconds(1000 / kFramerate);
     send_time_ms += kFrameIntervalMs;
   }
@@ -351,6 +351,7 @@
   const int kFrameIntervalMs = 1000 / kFramerate;
   const PacedPacketInfo kPacingInfo(0, 5, 5000);
   int64_t send_time_ms = 0;
+  uint16_t sequence_number = 0;
   // Inserting packets for five seconds to get a valid estimate.
   for (int i = 0; i < 5 * kFramerate + 1 + kNumInitialPackets; ++i) {
     // NOTE!!! If the following line is moved under the if case then this test
@@ -365,8 +366,8 @@
 
       EXPECT_FALSE(bitrate_observer_.updated());  // No valid estimate.
     }
-    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms, kMtu,
-                     pacing_info);
+    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms,
+                     sequence_number++, kMtu, pacing_info);
     clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
     send_time_ms += kFrameIntervalMs;
   }
@@ -376,9 +377,12 @@
   for (int i = 0; i < 10; ++i) {
     clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs);
     send_time_ms += 2 * kFrameIntervalMs;
-    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms, 1000);
+    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms,
+                     sequence_number + 2, 1000);
     IncomingFeedback(clock_.TimeInMilliseconds(),
-                     send_time_ms - kFrameIntervalMs, 1000);
+                     send_time_ms - kFrameIntervalMs, sequence_number + 1,
+                     1000);
+    sequence_number += 2;
   }
   EXPECT_TRUE(bitrate_observer_.updated());
   EXPECT_NEAR(expected_bitrate_bps, bitrate_observer_.latest_bitrate(),
@@ -477,10 +481,12 @@
   const int kFramerate = 50;  // 50 fps to avoid rounding errors.
   const int kFrameIntervalMs = 1000 / kFramerate;
   int64_t send_time_ms = 0;
+  uint16_t sequence_number = 0;
   // Initial set of frames to increase the bitrate. 6 seconds to have enough
   // time for the first estimate to be generated and for Process() to be called.
   for (int i = 0; i <= 6 * kFramerate; ++i) {
-    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms, 1000);
+    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms,
+                     sequence_number++, 1000);
 
     clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
     send_time_ms += kFrameIntervalMs;
@@ -495,7 +501,8 @@
     for (int j = 0; j < kTimestampGroupLength; ++j) {
       // Insert |kTimestampGroupLength| frames with just 1 timestamp ticks in
       // between. Should be treated as part of the same group by the estimator.
-      IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms, 100);
+      IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms,
+                       sequence_number++, 100);
       clock_.AdvanceTimeMilliseconds(kFrameIntervalMs / kTimestampGroupLength);
       send_time_ms += 1;
     }
@@ -512,9 +519,11 @@
   const int kFramerate = 100;
   const int kFrameIntervalMs = 1000 / kFramerate;
   int64_t send_time_ms = 0;
+  uint16_t sequence_number = 0;
 
   for (size_t i = 0; i < 3000; ++i) {
-    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms, 1000);
+    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms,
+                     sequence_number++, 1000);
     clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
     send_time_ms += kFrameIntervalMs;
   }
@@ -526,7 +535,8 @@
   send_time_ms += silence_time_s * 1000;
 
   for (size_t i = 0; i < 24; ++i) {
-    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms, 1000);
+    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms,
+                     sequence_number++, 1000);
     clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs);
     send_time_ms += kFrameIntervalMs;
   }
diff --git a/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.h b/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.h
index e6275d6..84831d9 100644
--- a/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.h
+++ b/modules/congestion_controller/goog_cc/delay_based_bwe_unittest_helper.h
@@ -21,6 +21,8 @@
 #include "api/transport/network_types.h"
 #include "modules/congestion_controller/goog_cc/acknowledged_bitrate_estimator.h"
 #include "modules/congestion_controller/goog_cc/delay_based_bwe.h"
+#include "modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
+#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 #include "rtc_base/constructor_magic.h"
 #include "system_wrappers/include/clock.h"
 #include "test/field_trial.h"
@@ -29,12 +31,13 @@
 namespace webrtc {
 namespace test {
 
-class TestBitrateObserver {
+class TestBitrateObserver : public RemoteBitrateObserver {
  public:
   TestBitrateObserver() : updated_(false), latest_bitrate_(0) {}
-  ~TestBitrateObserver() {}
+  ~TestBitrateObserver() override {}
 
-  void OnReceiveBitrateChanged(uint32_t bitrate);
+  void OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs,
+                               uint32_t bitrate) override;
 
   void Reset() { updated_ = false; }
 
@@ -57,7 +60,7 @@
   // previous frame, no frame will be generated. The frame is split into
   // packets.
   int64_t GenerateFrame(int64_t time_now_us,
-                        std::vector<PacketResult>* packets);
+                        std::vector<PacketFeedback>* packets);
 
   // The send-side time when the next frame can be generated.
   int64_t next_rtp_time() const;
@@ -73,6 +76,7 @@
   int fps_;
   int bitrate_bps_;
   int64_t next_rtp_time_;
+  uint16_t sequence_number_;
 
   RTC_DISALLOW_COPY_AND_ASSIGN(RtpStream);
 };
@@ -97,7 +101,7 @@
 
   // TODO(holmer): Break out the channel simulation part from this class to make
   // it possible to simulate different types of channels.
-  int64_t GenerateFrame(std::vector<PacketResult>* packets,
+  int64_t GenerateFrame(std::vector<PacketFeedback>* packets,
                         int64_t time_now_us);
 
  private:
@@ -124,9 +128,11 @@
   // Helpers to insert a single packet into the delay-based BWE.
   void IncomingFeedback(int64_t arrival_time_ms,
                         int64_t send_time_ms,
+                        uint16_t sequence_number,
                         size_t payload_size);
   void IncomingFeedback(int64_t arrival_time_ms,
                         int64_t send_time_ms,
+                        uint16_t sequence_number,
                         size_t payload_size,
                         const PacedPacketInfo& pacing_info);
 
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 8bd3cfb..95bbf56 100644
--- a/modules/congestion_controller/goog_cc/goog_cc_network_control.cc
+++ b/modules/congestion_controller/goog_cc/goog_cc_network_control.cc
@@ -27,6 +27,7 @@
 #include "modules/congestion_controller/goog_cc/probe_controller.h"
 #include "modules/remote_bitrate_estimator/include/bwe_defines.h"
 #include "modules/remote_bitrate_estimator/test/bwe_test_logging.h"
+#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
 
@@ -42,6 +43,25 @@
 // overshoots from the encoder.
 const float kDefaultPaceMultiplier = 2.5f;
 
+std::vector<PacketFeedback> ReceivedPacketsFeedbackAsRtp(
+    const TransportPacketsFeedback report) {
+  std::vector<PacketFeedback> packet_feedback_vector;
+  for (auto& fb : report.PacketsWithFeedback()) {
+    if (fb.receive_time.IsFinite()) {
+      PacketFeedback pf(fb.receive_time.ms(), 0);
+      pf.creation_time_ms = report.feedback_time.ms();
+      pf.payload_size = fb.sent_packet.size.bytes();
+      pf.pacing_info = fb.sent_packet.pacing_info;
+      pf.send_time_ms = fb.sent_packet.send_time.ms();
+      pf.unacknowledged_data = fb.sent_packet.prior_unacked_data.bytes();
+      packet_feedback_vector.push_back(pf);
+    }
+  }
+  std::sort(packet_feedback_vector.begin(), packet_feedback_vector.end(),
+            PacketFeedbackComparator());
+  return packet_feedback_vector;
+}
+
 int64_t GetBpsOrDefault(const absl::optional<DataRate>& rate,
                         int64_t fallback_bps) {
   if (rate && rate->IsFinite()) {
@@ -483,21 +503,24 @@
       lost_packets_since_last_loss_update_ = 0;
     }
   }
+
+  std::vector<PacketFeedback> received_feedback_vector =
+      ReceivedPacketsFeedbackAsRtp(report);
+
   absl::optional<int64_t> alr_start_time =
       alr_detector_->GetApplicationLimitedRegionStartTime();
 
   if (previously_in_alr_ && !alr_start_time.has_value()) {
     int64_t now_ms = report.feedback_time.ms();
-    acknowledged_bitrate_estimator_->SetAlrEndedTime(report.feedback_time);
+    acknowledged_bitrate_estimator_->SetAlrEndedTimeMs(now_ms);
     probe_controller_->SetAlrEndedTimeMs(now_ms);
   }
   previously_in_alr_ = alr_start_time.has_value();
   acknowledged_bitrate_estimator_->IncomingPacketFeedbackVector(
-      report.SortedByReceiveTime());
+      received_feedback_vector);
   auto acknowledged_bitrate = acknowledged_bitrate_estimator_->bitrate();
-  for (const auto& feedback : report.SortedByReceiveTime()) {
-    if (feedback.sent_packet.pacing_info.probe_cluster_id !=
-        PacedPacketInfo::kNotAProbe) {
+  for (const auto& feedback : received_feedback_vector) {
+    if (feedback.pacing_info.probe_cluster_id != PacedPacketInfo::kNotAProbe) {
       probe_bitrate_estimator_->HandleProbeAndEstimateBitrate(feedback);
     }
   }
@@ -522,8 +545,8 @@
       network_estimator_ ? network_estimator_->GetCurrentEstimate()
                          : absl::nullopt;
   result = delay_based_bwe_->IncomingPacketFeedbackVector(
-      report, acknowledged_bitrate, probe_bitrate, network_estimate,
-      alr_start_time.has_value());
+      received_feedback_vector, acknowledged_bitrate, probe_bitrate,
+      network_estimate, alr_start_time.has_value(), report.feedback_time);
 
   if (result.updated) {
     if (result.probe) {
diff --git a/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc b/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc
index 34650da..5bb3491 100644
--- a/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc
+++ b/modules/congestion_controller/goog_cc/goog_cc_network_control_unittest.cc
@@ -708,30 +708,6 @@
   EXPECT_GT(client->send_bandwidth().kbps(), 1000);
 }
 
-TEST_F(GoogCcNetworkControllerTest, NoCrashOnVeryLateFeedback) {
-  Scenario s;
-  auto ret_net = s.CreateMutableSimulationNode(NetworkSimulationConfig());
-  auto* route = s.CreateRoutes(
-      s.CreateClient("send", CallClientConfig()),
-      {s.CreateSimulationNode(NetworkSimulationConfig())},
-      s.CreateClient("return", CallClientConfig()), {ret_net->node()});
-  auto* video = s.CreateVideoStream(route->forward(), VideoStreamConfig());
-  s.RunFor(TimeDelta::seconds(5));
-  // Delay feedback by several minutes. This will cause removal of the send time
-  // history for the packets as long as kSendTimeHistoryWindow is configured for
-  // a shorter time span.
-  ret_net->PauseTransmissionUntil(s.Now() + TimeDelta::seconds(300));
-  // Stopping video stream while waiting to save test execution time.
-  video->send()->Stop();
-  s.RunFor(TimeDelta::seconds(299));
-  // Starting to cause addition of new packet to history, which cause old
-  // packets to be removed.
-  video->send()->Start();
-  // Runs until the lost packets are received. We expect that this will run
-  // without causing any runtime failures.
-  s.RunFor(TimeDelta::seconds(2));
-}
-
 TEST_F(GoogCcNetworkControllerTest, IsFairToTCP) {
   Scenario s("googcc_unit/tcp_fairness");
   NetworkSimulationConfig net_conf;
diff --git a/modules/congestion_controller/goog_cc/probe_bitrate_estimator.cc b/modules/congestion_controller/goog_cc/probe_bitrate_estimator.cc
index 2160d51..380e7d3 100644
--- a/modules/congestion_controller/goog_cc/probe_bitrate_estimator.cc
+++ b/modules/congestion_controller/goog_cc/probe_bitrate_estimator.cc
@@ -20,15 +20,14 @@
 #include "rtc_base/logging.h"
 #include "rtc_base/numerics/safe_conversions.h"
 
-namespace webrtc {
 namespace {
 // The minumum number of probes we need to receive feedback about in percent
 // in order to have a valid estimate.
-constexpr double kMinReceivedProbesRatio = .80;
+constexpr int kMinReceivedProbesPercent = 80;
 
 // The minumum number of bytes we need to receive feedback about in percent
 // in order to have a valid estimate.
-constexpr double kMinReceivedBytesRatio = .80;
+constexpr int kMinReceivedBytesPercent = 80;
 
 // The maximum |receive rate| / |send rate| ratio for a valid estimate.
 constexpr float kMaxValidRatio = 2.0f;
@@ -46,151 +45,148 @@
 // The maximum time period over which the cluster history is retained.
 // This is also the maximum time period beyond which a probing burst is not
 // expected to last.
-constexpr TimeDelta kMaxClusterHistory = TimeDelta::Seconds<1>();
+constexpr int kMaxClusterHistoryMs = 1000;
 
 // The maximum time interval between first and the last probe on a cluster
 // on the sender side as well as the receive side.
-constexpr TimeDelta kMaxProbeInterval = TimeDelta::Seconds<1>();
-
+constexpr int kMaxProbeIntervalMs = 1000;
 }  // namespace
 
+namespace webrtc {
 
 ProbeBitrateEstimator::ProbeBitrateEstimator(RtcEventLog* event_log)
     : event_log_(event_log) {}
 
 ProbeBitrateEstimator::~ProbeBitrateEstimator() = default;
 
-absl::optional<DataRate> ProbeBitrateEstimator::HandleProbeAndEstimateBitrate(
-    const PacketResult& packet_feedback) {
-  int cluster_id = packet_feedback.sent_packet.pacing_info.probe_cluster_id;
+int ProbeBitrateEstimator::HandleProbeAndEstimateBitrate(
+    const PacketFeedback& packet_feedback) {
+  int cluster_id = packet_feedback.pacing_info.probe_cluster_id;
   RTC_DCHECK_NE(cluster_id, PacedPacketInfo::kNotAProbe);
 
-  EraseOldClusters(packet_feedback.receive_time - kMaxClusterHistory);
+  EraseOldClusters(packet_feedback.arrival_time_ms - kMaxClusterHistoryMs);
 
+  int payload_size_bits =
+      rtc::dchecked_cast<int>(packet_feedback.payload_size * 8);
   AggregatedCluster* cluster = &clusters_[cluster_id];
 
-  if (packet_feedback.sent_packet.send_time < cluster->first_send) {
-    cluster->first_send = packet_feedback.sent_packet.send_time;
+  if (packet_feedback.send_time_ms < cluster->first_send_ms) {
+    cluster->first_send_ms = packet_feedback.send_time_ms;
   }
-  if (packet_feedback.sent_packet.send_time > cluster->last_send) {
-    cluster->last_send = packet_feedback.sent_packet.send_time;
-    cluster->size_last_send = packet_feedback.sent_packet.size;
+  if (packet_feedback.send_time_ms > cluster->last_send_ms) {
+    cluster->last_send_ms = packet_feedback.send_time_ms;
+    cluster->size_last_send = payload_size_bits;
   }
-  if (packet_feedback.receive_time < cluster->first_receive) {
-    cluster->first_receive = packet_feedback.receive_time;
-    cluster->size_first_receive = packet_feedback.sent_packet.size;
+  if (packet_feedback.arrival_time_ms < cluster->first_receive_ms) {
+    cluster->first_receive_ms = packet_feedback.arrival_time_ms;
+    cluster->size_first_receive = payload_size_bits;
   }
-  if (packet_feedback.receive_time > cluster->last_receive) {
-    cluster->last_receive = packet_feedback.receive_time;
+  if (packet_feedback.arrival_time_ms > cluster->last_receive_ms) {
+    cluster->last_receive_ms = packet_feedback.arrival_time_ms;
   }
-  cluster->size_total += packet_feedback.sent_packet.size;
+  cluster->size_total += payload_size_bits;
   cluster->num_probes += 1;
 
-  RTC_DCHECK_GT(
-      packet_feedback.sent_packet.pacing_info.probe_cluster_min_probes, 0);
-  RTC_DCHECK_GT(packet_feedback.sent_packet.pacing_info.probe_cluster_min_bytes,
-                0);
+  RTC_DCHECK_GT(packet_feedback.pacing_info.probe_cluster_min_probes, 0);
+  RTC_DCHECK_GT(packet_feedback.pacing_info.probe_cluster_min_bytes, 0);
 
-  int min_probes =
-      packet_feedback.sent_packet.pacing_info.probe_cluster_min_probes *
-      kMinReceivedProbesRatio;
-  DataSize min_size =
-      DataSize::bytes(
-          packet_feedback.sent_packet.pacing_info.probe_cluster_min_bytes) *
-      kMinReceivedBytesRatio;
-  if (cluster->num_probes < min_probes || cluster->size_total < min_size)
-    return absl::nullopt;
+  int min_probes = packet_feedback.pacing_info.probe_cluster_min_probes *
+                   kMinReceivedProbesPercent / 100;
+  int min_bytes = packet_feedback.pacing_info.probe_cluster_min_bytes *
+                  kMinReceivedBytesPercent / 100;
+  if (cluster->num_probes < min_probes || cluster->size_total < min_bytes * 8)
+    return -1;
 
-  TimeDelta send_interval = cluster->last_send - cluster->first_send;
-  TimeDelta receive_interval = cluster->last_receive - cluster->first_receive;
+  float send_interval_ms = cluster->last_send_ms - cluster->first_send_ms;
+  float receive_interval_ms =
+      cluster->last_receive_ms - cluster->first_receive_ms;
 
-  if (send_interval <= TimeDelta::Zero() || send_interval > kMaxProbeInterval ||
-      receive_interval <= TimeDelta::Zero() ||
-      receive_interval > kMaxProbeInterval) {
+  if (send_interval_ms <= 0 || send_interval_ms > kMaxProbeIntervalMs ||
+      receive_interval_ms <= 0 || receive_interval_ms > kMaxProbeIntervalMs) {
     RTC_LOG(LS_INFO) << "Probing unsuccessful, invalid send/receive interval"
                      << " [cluster id: " << cluster_id
-                     << "] [send interval: " << ToString(send_interval) << "]"
-                     << " [receive interval: " << ToString(receive_interval)
-                     << "]";
+                     << "] [send interval: " << send_interval_ms << " ms]"
+                     << " [receive interval: " << receive_interval_ms << " ms]";
     if (event_log_) {
       event_log_->Log(absl::make_unique<RtcEventProbeResultFailure>(
           cluster_id, ProbeFailureReason::kInvalidSendReceiveInterval));
     }
-    return absl::nullopt;
+    return -1;
   }
-  // Since the |send_interval| does not include the time it takes to actually
+  // Since the |send_interval_ms| does not include the time it takes to actually
   // send the last packet the size of the last sent packet should not be
   // included when calculating the send bitrate.
   RTC_DCHECK_GT(cluster->size_total, cluster->size_last_send);
-  DataSize send_size = cluster->size_total - cluster->size_last_send;
-  DataRate send_rate = send_size / send_interval;
+  float send_size = cluster->size_total - cluster->size_last_send;
+  float send_bps = send_size / send_interval_ms * 1000;
 
-  // Since the |receive_interval| does not include the time it takes to
+  // Since the |receive_interval_ms| does not include the time it takes to
   // actually receive the first packet the size of the first received packet
   // should not be included when calculating the receive bitrate.
   RTC_DCHECK_GT(cluster->size_total, cluster->size_first_receive);
-  DataSize receive_size = cluster->size_total - cluster->size_first_receive;
-  DataRate receive_rate = receive_size / receive_interval;
+  float receive_size = cluster->size_total - cluster->size_first_receive;
+  float receive_bps = receive_size / receive_interval_ms * 1000;
 
-  double ratio = receive_rate / send_rate;
+  float ratio = receive_bps / send_bps;
   if (ratio > kMaxValidRatio) {
     RTC_LOG(LS_INFO) << "Probing unsuccessful, receive/send ratio too high"
                      << " [cluster id: " << cluster_id
-                     << "] [send: " << ToString(send_size) << " / "
-                     << ToString(send_interval) << " = " << ToString(send_rate)
-                     << "]"
-                     << " [receive: " << ToString(receive_size) << " / "
-                     << ToString(receive_interval) << " = "
-                     << ToString(receive_rate) << " ]"
-                     << " [ratio: " << ToString(receive_rate) << " / "
-                     << ToString(send_rate) << " = " << ratio
+                     << "] [send: " << send_size << " bytes / "
+                     << send_interval_ms << " ms = " << send_bps / 1000
+                     << " kb/s]"
+                     << " [receive: " << receive_size << " bytes / "
+                     << receive_interval_ms << " ms = " << receive_bps / 1000
+                     << " kb/s]"
+                     << " [ratio: " << receive_bps / 1000 << " / "
+                     << send_bps / 1000 << " = " << ratio
                      << " > kMaxValidRatio (" << kMaxValidRatio << ")]";
     if (event_log_) {
       event_log_->Log(absl::make_unique<RtcEventProbeResultFailure>(
           cluster_id, ProbeFailureReason::kInvalidSendReceiveRatio));
     }
-    return absl::nullopt;
+    return -1;
   }
   RTC_LOG(LS_INFO) << "Probing successful"
-                   << " [cluster id: " << cluster_id
-                   << "] [send: " << ToString(send_size) << " / "
-                   << ToString(send_interval) << " = " << ToString(send_rate)
-                   << " ]"
-                   << " [receive: " << ToString(receive_size) << " / "
-                   << ToString(receive_interval) << " = "
-                   << ToString(receive_rate) << "]";
+                   << " [cluster id: " << cluster_id << "] [send: " << send_size
+                   << " bytes / " << send_interval_ms
+                   << " ms = " << send_bps / 1000 << " kb/s]"
+                   << " [receive: " << receive_size << " bytes / "
+                   << receive_interval_ms << " ms = " << receive_bps / 1000
+                   << " kb/s]";
 
-  DataRate res = std::min(send_rate, receive_rate);
+  float res = std::min(send_bps, receive_bps);
   // If we're receiving at significantly lower bitrate than we were sending at,
   // it suggests that we've found the true capacity of the link. In this case,
   // set the target bitrate slightly lower to not immediately overuse.
-  if (receive_rate < kMinRatioForUnsaturatedLink * send_rate) {
-    RTC_DCHECK_GT(send_rate, receive_rate);
-    res = kTargetUtilizationFraction * receive_rate;
+  if (receive_bps < kMinRatioForUnsaturatedLink * send_bps) {
+    RTC_DCHECK_GT(send_bps, receive_bps);
+    res = kTargetUtilizationFraction * receive_bps;
   }
   if (event_log_) {
     event_log_->Log(
-        absl::make_unique<RtcEventProbeResultSuccess>(cluster_id, res.bps()));
+        absl::make_unique<RtcEventProbeResultSuccess>(cluster_id, res));
   }
-  last_estimate_ = res;
-  estimated_data_rate_ = res;
-  return res;
+  last_estimate_ = DataRate::bps(res);
+  estimated_bitrate_bps_ = res;
+  return *estimated_bitrate_bps_;
 }
 
 absl::optional<DataRate>
 ProbeBitrateEstimator::FetchAndResetLastEstimatedBitrate() {
-  absl::optional<DataRate> estimated_data_rate = estimated_data_rate_;
-  estimated_data_rate_.reset();
-  return estimated_data_rate;
+  absl::optional<int> estimated_bitrate_bps = estimated_bitrate_bps_;
+  estimated_bitrate_bps_.reset();
+  if (estimated_bitrate_bps)
+    return DataRate::bps(*estimated_bitrate_bps);
+  return absl::nullopt;
 }
 
 absl::optional<DataRate> ProbeBitrateEstimator::last_estimate() const {
   return last_estimate_;
 }
 
-void ProbeBitrateEstimator::EraseOldClusters(Timestamp timestamp) {
+void ProbeBitrateEstimator::EraseOldClusters(int64_t timestamp_ms) {
   for (auto it = clusters_.begin(); it != clusters_.end();) {
-    if (it->second.last_receive < timestamp) {
+    if (it->second.last_receive_ms < timestamp_ms) {
       it = clusters_.erase(it);
     } else {
       ++it;
diff --git a/modules/congestion_controller/goog_cc/probe_bitrate_estimator.h b/modules/congestion_controller/goog_cc/probe_bitrate_estimator.h
index bf9cb22..ce4eb99 100644
--- a/modules/congestion_controller/goog_cc/probe_bitrate_estimator.h
+++ b/modules/congestion_controller/goog_cc/probe_bitrate_estimator.h
@@ -15,8 +15,8 @@
 #include <map>
 
 #include "absl/types/optional.h"
-#include "api/transport/network_types.h"
 #include "api/units/data_rate.h"
+#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
 
 namespace webrtc {
 class RtcEventLog;
@@ -28,8 +28,7 @@
 
   // Should be called for every probe packet we receive feedback about.
   // Returns the estimated bitrate if the probe completes a valid cluster.
-  absl::optional<DataRate> HandleProbeAndEstimateBitrate(
-      const PacketResult& packet_feedback);
+  int HandleProbeAndEstimateBitrate(const PacketFeedback& packet_feedback);
 
   absl::optional<DataRate> FetchAndResetLastEstimatedBitrate();
 
@@ -38,21 +37,21 @@
  private:
   struct AggregatedCluster {
     int num_probes = 0;
-    Timestamp first_send = Timestamp::PlusInfinity();
-    Timestamp last_send = Timestamp::MinusInfinity();
-    Timestamp first_receive = Timestamp::PlusInfinity();
-    Timestamp last_receive = Timestamp::MinusInfinity();
-    DataSize size_last_send = DataSize::Zero();
-    DataSize size_first_receive = DataSize::Zero();
-    DataSize size_total = DataSize::Zero();
+    int64_t first_send_ms = std::numeric_limits<int64_t>::max();
+    int64_t last_send_ms = 0;
+    int64_t first_receive_ms = std::numeric_limits<int64_t>::max();
+    int64_t last_receive_ms = 0;
+    int size_last_send = 0;
+    int size_first_receive = 0;
+    int size_total = 0;
   };
 
-  // Erases old cluster data that was seen before |timestamp|.
-  void EraseOldClusters(Timestamp timestamp);
+  // Erases old cluster data that was seen before |timestamp_ms|.
+  void EraseOldClusters(int64_t timestamp_ms);
 
   std::map<int, AggregatedCluster> clusters_;
   RtcEventLog* const event_log_;
-  absl::optional<DataRate> estimated_data_rate_;
+  absl::optional<int> estimated_bitrate_bps_;
   absl::optional<DataRate> last_estimate_;
 };
 
diff --git a/modules/congestion_controller/goog_cc/probe_bitrate_estimator_unittest.cc b/modules/congestion_controller/goog_cc/probe_bitrate_estimator_unittest.cc
index b886add..85c398b 100644
--- a/modules/congestion_controller/goog_cc/probe_bitrate_estimator_unittest.cc
+++ b/modules/congestion_controller/goog_cc/probe_bitrate_estimator_unittest.cc
@@ -18,6 +18,7 @@
 namespace webrtc {
 
 namespace {
+constexpr int kInvalidBitrate = -1;
 constexpr int kDefaultMinProbes = 5;
 constexpr int kDefaultMinBytes = 5000;
 constexpr float kTargetUtilizationFraction = 0.95f;
@@ -35,20 +36,15 @@
                          int64_t arrival_time_ms,
                          int min_probes = kDefaultMinProbes,
                          int min_bytes = kDefaultMinBytes) {
-    const Timestamp kReferenceTime = Timestamp::seconds(1000);
-    PacketResult feedback;
-    feedback.sent_packet.send_time =
-        kReferenceTime + TimeDelta::ms(send_time_ms);
-    feedback.sent_packet.size = DataSize::bytes(size_bytes);
-    feedback.sent_packet.pacing_info =
-        PacedPacketInfo(probe_cluster_id, min_probes, min_bytes);
-    feedback.receive_time = kReferenceTime + TimeDelta::ms(arrival_time_ms);
-    measured_data_rate_ =
-        probe_bitrate_estimator_.HandleProbeAndEstimateBitrate(feedback);
+    PacedPacketInfo pacing_info(probe_cluster_id, min_probes, min_bytes);
+    PacketFeedback packet_feedback(arrival_time_ms, send_time_ms, 0, size_bytes,
+                                   pacing_info);
+    measured_bps_ =
+        probe_bitrate_estimator_.HandleProbeAndEstimateBitrate(packet_feedback);
   }
 
  protected:
-  absl::optional<DataRate> measured_data_rate_;
+  int measured_bps_ = kInvalidBitrate;
   ProbeBitrateEstimator probe_bitrate_estimator_;
 };
 
@@ -58,7 +54,7 @@
   AddPacketFeedback(0, 1000, 20, 30);
   AddPacketFeedback(0, 1000, 30, 40);
 
-  EXPECT_NEAR(measured_data_rate_->bps(), 800000, 10);
+  EXPECT_NEAR(measured_bps_, 800000, 10);
 }
 
 TEST_F(TestProbeBitrateEstimator, OneClusterTooFewProbes) {
@@ -66,7 +62,7 @@
   AddPacketFeedback(0, 2000, 10, 20);
   AddPacketFeedback(0, 2000, 20, 30);
 
-  EXPECT_FALSE(measured_data_rate_);
+  EXPECT_EQ(kInvalidBitrate, measured_bps_);
 }
 
 TEST_F(TestProbeBitrateEstimator, OneClusterTooFewBytes) {
@@ -77,7 +73,7 @@
   AddPacketFeedback(0, 800, 30, 40, kDefaultMinProbes, kMinBytes);
   AddPacketFeedback(0, 800, 40, 50, kDefaultMinProbes, kMinBytes);
 
-  EXPECT_FALSE(measured_data_rate_);
+  EXPECT_EQ(kInvalidBitrate, measured_bps_);
 }
 
 TEST_F(TestProbeBitrateEstimator, SmallCluster) {
@@ -88,7 +84,7 @@
   AddPacketFeedback(0, 150, 30, 40, kDefaultMinProbes, kMinBytes);
   AddPacketFeedback(0, 150, 40, 50, kDefaultMinProbes, kMinBytes);
   AddPacketFeedback(0, 150, 50, 60, kDefaultMinProbes, kMinBytes);
-  EXPECT_NEAR(measured_data_rate_->bps(), 120000, 10);
+  EXPECT_NEAR(measured_bps_, 120000, 10);
 }
 
 TEST_F(TestProbeBitrateEstimator, LargeCluster) {
@@ -102,7 +98,7 @@
     ++send_time;
     ++receive_time;
   }
-  EXPECT_NEAR(measured_data_rate_->bps(), 100000000, 10);
+  EXPECT_NEAR(measured_bps_, 100000000, 10);
 }
 
 TEST_F(TestProbeBitrateEstimator, FastReceive) {
@@ -111,7 +107,7 @@
   AddPacketFeedback(0, 1000, 20, 35);
   AddPacketFeedback(0, 1000, 30, 40);
 
-  EXPECT_NEAR(measured_data_rate_->bps(), 800000, 10);
+  EXPECT_NEAR(measured_bps_, 800000, 10);
 }
 
 TEST_F(TestProbeBitrateEstimator, TooFastReceive) {
@@ -120,7 +116,7 @@
   AddPacketFeedback(0, 1000, 20, 25);
   AddPacketFeedback(0, 1000, 40, 27);
 
-  EXPECT_FALSE(measured_data_rate_);
+  EXPECT_EQ(measured_bps_, kInvalidBitrate);
 }
 
 TEST_F(TestProbeBitrateEstimator, SlowReceive) {
@@ -130,8 +126,7 @@
   AddPacketFeedback(0, 1000, 30, 85);
   // Expected send rate = 800 kbps, expected receive rate = 320 kbps.
 
-  EXPECT_NEAR(measured_data_rate_->bps(), kTargetUtilizationFraction * 320000,
-              10);
+  EXPECT_NEAR(measured_bps_, kTargetUtilizationFraction * 320000, 10);
 }
 
 TEST_F(TestProbeBitrateEstimator, BurstReceive) {
@@ -140,7 +135,7 @@
   AddPacketFeedback(0, 1000, 20, 50);
   AddPacketFeedback(0, 1000, 40, 50);
 
-  EXPECT_FALSE(measured_data_rate_);
+  EXPECT_EQ(measured_bps_, kInvalidBitrate);
 }
 
 TEST_F(TestProbeBitrateEstimator, MultipleClusters) {
@@ -149,12 +144,11 @@
   AddPacketFeedback(0, 1000, 20, 30);
   AddPacketFeedback(0, 1000, 40, 60);
   // Expected send rate = 600 kbps, expected receive rate = 480 kbps.
-  EXPECT_NEAR(measured_data_rate_->bps(), kTargetUtilizationFraction * 480000,
-              10);
+  EXPECT_NEAR(measured_bps_, kTargetUtilizationFraction * 480000, 10);
 
   AddPacketFeedback(0, 1000, 50, 60);
   // Expected send rate = 640 kbps, expected receive rate = 640 kbps.
-  EXPECT_NEAR(measured_data_rate_->bps(), 640000, 10);
+  EXPECT_NEAR(measured_bps_, 640000, 10);
 
   AddPacketFeedback(1, 1000, 60, 70);
   AddPacketFeedback(1, 1000, 65, 77);
@@ -162,8 +156,7 @@
   AddPacketFeedback(1, 1000, 75, 90);
   // Expected send rate = 1600 kbps, expected receive rate = 1200 kbps.
 
-  EXPECT_NEAR(measured_data_rate_->bps(), kTargetUtilizationFraction * 1200000,
-              10);
+  EXPECT_NEAR(measured_bps_, kTargetUtilizationFraction * 1200000, 10);
 }
 
 TEST_F(TestProbeBitrateEstimator, IgnoreOldClusters) {
@@ -177,13 +170,12 @@
   AddPacketFeedback(1, 1000, 75, 90);
   // Expected send rate = 1600 kbps, expected receive rate = 1200 kbps.
 
-  EXPECT_NEAR(measured_data_rate_->bps(), kTargetUtilizationFraction * 1200000,
-              10);
+  EXPECT_NEAR(measured_bps_, kTargetUtilizationFraction * 1200000, 10);
 
   // Coming in 6s later
   AddPacketFeedback(0, 1000, 40 + 6000, 60 + 6000);
 
-  EXPECT_FALSE(measured_data_rate_);
+  EXPECT_EQ(measured_bps_, kInvalidBitrate);
 }
 
 TEST_F(TestProbeBitrateEstimator, IgnoreSizeLastSendPacket) {
@@ -194,7 +186,7 @@
   AddPacketFeedback(0, 1500, 40, 50);
   // Expected send rate = 800 kbps, expected receive rate = 900 kbps.
 
-  EXPECT_NEAR(measured_data_rate_->bps(), 800000, 10);
+  EXPECT_NEAR(measured_bps_, 800000, 10);
 }
 
 TEST_F(TestProbeBitrateEstimator, IgnoreSizeFirstReceivePacket) {
@@ -204,8 +196,7 @@
   AddPacketFeedback(0, 1000, 30, 40);
   // Expected send rate = 933 kbps, expected receive rate = 800 kbps.
 
-  EXPECT_NEAR(measured_data_rate_->bps(), kTargetUtilizationFraction * 800000,
-              10);
+  EXPECT_NEAR(measured_bps_, kTargetUtilizationFraction * 800000, 10);
 }
 
 TEST_F(TestProbeBitrateEstimator, NoLastEstimatedBitrateBps) {
diff --git a/modules/congestion_controller/goog_cc/probe_controller.h b/modules/congestion_controller/goog_cc/probe_controller.h
index 3a8ef13..71ce001 100644
--- a/modules/congestion_controller/goog_cc/probe_controller.h
+++ b/modules/congestion_controller/goog_cc/probe_controller.h
@@ -26,6 +26,8 @@
 
 namespace webrtc {
 
+class Clock;
+
 struct ProbeControllerConfig {
   explicit ProbeControllerConfig(const WebRtcKeyValueConfig* key_value_config);
   ProbeControllerConfig(const ProbeControllerConfig&);
diff --git a/rtc_tools/event_log_visualizer/analyzer.cc b/rtc_tools/event_log_visualizer/analyzer.cc
index 11e33f29..428300d 100644
--- a/rtc_tools/event_log_visualizer/analyzer.cc
+++ b/rtc_tools/event_log_visualizer/analyzer.cc
@@ -71,6 +71,14 @@
 
 const int kNumMicrosecsPerSec = 1000000;
 
+void SortPacketFeedbackVector(std::vector<PacketFeedback>* vec) {
+  auto pred = [](const PacketFeedback& packet_feedback) {
+    return packet_feedback.arrival_time_ms == PacketFeedback::kNotReceived;
+  };
+  vec->erase(std::remove_if(vec->begin(), vec->end(), pred), vec->end());
+  std::sort(vec->begin(), vec->end(), PacketFeedbackComparator());
+}
+
 std::string SsrcToString(uint32_t ssrc) {
   rtc::StringBuilder ss;
   ss << "SSRC " << ssrc;
@@ -1308,16 +1316,16 @@
       absl::optional<uint32_t> bitrate_bps;
       if (feedback_msg) {
         observer.Update(goog_cc->OnTransportPacketsFeedback(*feedback_msg));
-        std::vector<PacketResult> feedback =
-            feedback_msg->SortedByReceiveTime();
+        std::vector<PacketFeedback> feedback =
+            transport_feedback.GetTransportFeedbackVector();
+        SortPacketFeedbackVector(&feedback);
         if (!feedback.empty()) {
 #if !(BWE_TEST_LOGGING_COMPILE_TIME_ENABLE)
           acknowledged_bitrate_estimator.IncomingPacketFeedbackVector(feedback);
 #endif  // !(BWE_TEST_LOGGING_COMPILE_TIME_ENABLE)
-          for (const PacketResult& packet : feedback)
-            acked_bitrate.Update(packet.sent_packet.size.bytes(),
-                                 packet.receive_time.ms());
-          bitrate_bps = acked_bitrate.Rate(feedback.back().receive_time.ms());
+          for (const PacketFeedback& packet : feedback)
+            acked_bitrate.Update(packet.payload_size, packet.arrival_time_ms);
+          bitrate_bps = acked_bitrate.Rate(feedback.back().arrival_time_ms);
         }
       }
 
@@ -1325,9 +1333,7 @@
       float y = bitrate_bps.value_or(0) / 1000;
       acked_time_series.points.emplace_back(x, y);
 #if !(BWE_TEST_LOGGING_COMPILE_TIME_ENABLE)
-      y = acknowledged_bitrate_estimator.bitrate()
-              .value_or(DataRate::Zero())
-              .kbps();
+      y = acknowledged_bitrate_estimator.bitrate_bps().value_or(0) / 1000;
       acked_estimate_time_series.points.emplace_back(x, y);
 #endif  // !(BWE_TEST_LOGGING_COMPILE_TIME_ENABLE)
       ++rtcp_iterator;
