diff --git a/quiche/quic/core/http/end_to_end_test.cc b/quiche/quic/core/http/end_to_end_test.cc
index f0a9d86..61e9d39 100644
--- a/quiche/quic/core/http/end_to_end_test.cc
+++ b/quiche/quic/core/http/end_to_end_test.cc
@@ -165,8 +165,8 @@
                                       connection_id_length));
         }
       }  // End of outer version loop.
-    }    // End of congestion_control_tag loop.
-  }      // End of connection_id_length loop.
+    }  // End of congestion_control_tag loop.
+  }  // End of connection_id_length loop.
 
   // Only run every event loop implementation for one fixed configuration.
   for (QuicEventLoopFactory* event_loop : GetAllSupportedEventLoops()) {
@@ -2879,15 +2879,9 @@
       client_connection->GetStats().packets_sent;
 
   if (version_.UsesHttp3()) {
-    if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-      // QPACK decoder instructions and RESET_STREAM and STOP_SENDING frames are
-      // sent in a single packet.
-      EXPECT_EQ(packets_sent_before + 1, packets_sent_now);
-    } else {
-      // Make sure 2 packets were sent, one for QPACK instructions, another for
-      // RESET_STREAM and STOP_SENDING.
-      EXPECT_EQ(packets_sent_before + 2, packets_sent_now);
-    }
+    // QPACK decoder instructions and RESET_STREAM and STOP_SENDING frames are
+    // sent in a single packet.
+    EXPECT_EQ(packets_sent_before + 1, packets_sent_now);
   }
 
   // WaitForEvents waits 50ms and returns true if there are outstanding
@@ -3062,7 +3056,6 @@
     return;
   }
   override_client_connection_id_length_ = kQuicDefaultConnectionIdLength;
-  SetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5, false);
   ASSERT_TRUE(Initialize());
   SendSynchronousFooRequestAndCheckResponse();
 
@@ -3072,6 +3065,15 @@
   QuicConnection* client_connection = GetClientConnection();
   ASSERT_TRUE(client_connection != nullptr);
 
+  {
+    QuicConnection::ScopedPacketFlusher flusher(client_connection);
+    if (client_connection->SupportsMultiplePacketNumberSpaces()) {
+      client_connection->SendAllPendingAcks();
+    } else {
+      client_connection->SendAck();
+    }
+  }
+
   // Migrate socket to a new IP address.
   QuicIpAddress host1 = TestLoopback(2);
   EXPECT_NE(host0, host1);
diff --git a/quiche/quic/core/http/quic_spdy_session.cc b/quiche/quic/core/http/quic_spdy_session.cc
index 72d7276..edfbb4a 100644
--- a/quiche/quic/core/http/quic_spdy_session.cc
+++ b/quiche/quic/core/http/quic_spdy_session.cc
@@ -867,8 +867,7 @@
 }
 
 bool QuicSpdySession::CheckStreamWriteBlocked(QuicStream* stream) const {
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5) &&
-      qpack_decoder_send_stream_ != nullptr &&
+  if (qpack_decoder_send_stream_ != nullptr &&
       stream->id() == qpack_decoder_send_stream_->id()) {
     // Decoder data is always bundled opportunistically.
     return true;
diff --git a/quiche/quic/core/http/quic_spdy_session_test.cc b/quiche/quic/core/http/quic_spdy_session_test.cc
index 8646ef3..e94a79c 100644
--- a/quiche/quic/core/http/quic_spdy_session_test.cc
+++ b/quiche/quic/core/http/quic_spdy_session_test.cc
@@ -1360,13 +1360,6 @@
                 OnStreamReset(GetNthClientInitiatedBidirectionalId(0), _));
   }
 
-  // In HTTP/3, Qpack stream will send data on stream reset and cause packet to
-  // be flushed.
-  if (VersionUsesHttp3(transport_version()) &&
-      !GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    EXPECT_CALL(*writer_, WritePacket(_, _, _, _, _, _))
-        .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0)));
-  }
   EXPECT_CALL(*connection_, SendControlFrame(_));
   QuicRstStreamFrame rst1(kInvalidControlFrameId,
                           GetNthClientInitiatedBidirectionalId(0),
@@ -1608,9 +1601,6 @@
     // the STOP_SENDING, so set up the EXPECT there.
     EXPECT_CALL(*connection_, OnStreamReset(stream->id(), _));
     EXPECT_CALL(*connection_, SendControlFrame(_));
-  } else if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    EXPECT_CALL(*writer_, WritePacket(_, _, _, _, _, _))
-        .WillOnce(Return(WriteResult(WRITE_STATUS_OK, 0)));
   }
   QuicRstStreamFrame rst_frame(kInvalidControlFrameId, stream->id(),
                                QUIC_STREAM_CANCELLED, kByteOffset);
diff --git a/quiche/quic/core/http/quic_spdy_stream_test.cc b/quiche/quic/core/http/quic_spdy_stream_test.cc
index 1b44549..2984396 100644
--- a/quiche/quic/core/http/quic_spdy_stream_test.cc
+++ b/quiche/quic/core/http/quic_spdy_stream_test.cc
@@ -590,15 +590,6 @@
           stream_->id(),
           QuicResetStreamError::FromInternal(QUIC_HEADERS_TOO_LARGE), 0));
 
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    auto qpack_decoder_stream =
-        QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get());
-    // Stream type and stream cancellation.
-    EXPECT_CALL(*session_,
-                WritevData(qpack_decoder_stream->id(), _, _, NO_FIN, _, _))
-        .Times(2);
-  }
-
   stream_->OnStreamFrame(frame);
   EXPECT_THAT(stream_->stream_error(), IsStreamError(QUIC_HEADERS_TOO_LARGE));
 }
@@ -2250,9 +2241,6 @@
   StrictMock<MockHttp3DebugVisitor> debug_visitor;
   session_->set_debug_visitor(&debug_visitor);
 
-  auto decoder_send_stream =
-      QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get());
-
   // Deliver dynamic table entry to decoder.
   session_->qpack_decoder()->OnInsertWithoutNameReference("foo", "bar");
 
@@ -2264,16 +2252,6 @@
   std::string headers = HeadersFrame(encoded_headers);
   EXPECT_CALL(debug_visitor,
               OnHeadersFrameReceived(stream_->id(), encoded_headers.length()));
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    // Decoder stream type.
-    EXPECT_CALL(*session_,
-                WritevData(decoder_send_stream->id(), /* write_length = */ 1,
-                           /* offset = */ 0, _, _, _));
-    // Header acknowledgement.
-    EXPECT_CALL(*session_,
-                WritevData(decoder_send_stream->id(), /* write_length = */ 1,
-                           /* offset = */ 1, _, _, _));
-  }
   EXPECT_CALL(debug_visitor, OnHeadersDecoded(stream_->id(), _));
   stream_->OnStreamFrame(QuicStreamFrame(stream_->id(), false, 0, headers));
 
@@ -2305,10 +2283,6 @@
   EXPECT_CALL(debug_visitor,
               OnHeadersFrameReceived(stream_->id(), encoded_trailers.length()));
   // Header acknowledgement.
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    EXPECT_CALL(*session_,
-                WritevData(decoder_send_stream->id(), _, _, _, _, _));
-  }
   EXPECT_CALL(debug_visitor, OnHeadersDecoded(stream_->id(), _));
   stream_->OnStreamFrame(QuicStreamFrame(stream_->id(), true, /* offset = */
                                          headers.length() + data.length(),
@@ -2346,19 +2320,6 @@
   EXPECT_FALSE(stream_->headers_decompressed());
   EXPECT_EQ(std::nullopt, stream_->header_decoding_delay());
 
-  auto decoder_send_stream =
-      QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get());
-
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    // Decoder stream type.
-    EXPECT_CALL(*session_,
-                WritevData(decoder_send_stream->id(), /* write_length = */ 1,
-                           /* offset = */ 0, _, _, _));
-    // Header acknowledgement.
-    EXPECT_CALL(*session_,
-                WritevData(decoder_send_stream->id(), /* write_length = */ 1,
-                           /* offset = */ 1, _, _, _));
-  }
   EXPECT_CALL(debug_visitor, OnHeadersDecoded(stream_->id(), _));
 
   const QuicTime::Delta delay = QuicTime::Delta::FromSeconds(1);
@@ -2395,11 +2356,6 @@
   // Decoding is blocked because dynamic table entry has not been received yet.
   EXPECT_FALSE(stream_->trailers_decompressed());
 
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    // Header acknowledgement.
-    EXPECT_CALL(*session_,
-                WritevData(decoder_send_stream->id(), _, _, _, _, _));
-  }
   EXPECT_CALL(debug_visitor, OnHeadersDecoded(stream_->id(), _));
   // Deliver second dynamic table entry to decoder.
   session_->qpack_decoder()->OnInsertWithoutNameReference("trailing", "foobar");
@@ -2432,20 +2388,8 @@
   // Decoding is blocked because dynamic table entry has not been received yet.
   EXPECT_FALSE(stream_->headers_decompressed());
 
-  auto decoder_send_stream =
-      QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get());
   if (GetQuicReloadableFlag(
           quic_stop_reading_also_stops_header_decompression)) {
-    if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-      // Stream type.
-      EXPECT_CALL(*session_,
-                  WritevData(decoder_send_stream->id(), /* write_length = */ 1,
-                             /* offset = */ 0, _, _, _));
-      // Send stream cancellation.
-      EXPECT_CALL(*session_,
-                  WritevData(decoder_send_stream->id(), /* write_length = */ 1,
-                             /* offset = */ 1, _, _, _));
-    }
     EXPECT_CALL(debug_visitor, OnHeadersDecoded(stream_->id(), _)).Times(0);
   }
   // Stop reading from now on. Any buffered compressed headers shouldn't be
@@ -2454,16 +2398,6 @@
 
   if (!GetQuicReloadableFlag(
           quic_stop_reading_also_stops_header_decompression)) {
-    if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-      // Stream type.
-      EXPECT_CALL(*session_,
-                  WritevData(decoder_send_stream->id(), /* write_length = */ 1,
-                             /* offset = */ 0, _, _, _));
-      // Header acknowledgement.
-      EXPECT_CALL(*session_,
-                  WritevData(decoder_send_stream->id(), /* write_length = */ 1,
-                             /* offset = */ 1, _, _, _));
-    }
     EXPECT_CALL(debug_visitor, OnHeadersDecoded(stream_->id(), _));
   }
   // Deliver dynamic table entry to decoder.
@@ -2555,19 +2489,6 @@
   // Decoding is blocked because dynamic table entry has not been received yet.
   EXPECT_FALSE(stream_->headers_decompressed());
 
-  auto decoder_send_stream =
-      QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get());
-
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    // Decoder stream type.
-    EXPECT_CALL(*session_,
-                WritevData(decoder_send_stream->id(), /* write_length = */ 1,
-                           /* offset = */ 0, _, _, _));
-    // Header acknowledgement.
-    EXPECT_CALL(*session_,
-                WritevData(decoder_send_stream->id(), /* write_length = */ 1,
-                           /* offset = */ 1, _, _, _));
-  }
   // Deliver dynamic table entry to decoder.
   session_->qpack_decoder()->OnInsertWithoutNameReference("foo", "bar");
   EXPECT_TRUE(stream_->headers_decompressed());
@@ -2632,18 +2553,6 @@
   // Decoding is blocked because dynamic table entry has not been received yet.
   EXPECT_FALSE(stream_->headers_decompressed());
 
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    // Decoder stream type and stream cancellation instruction.
-    auto decoder_send_stream =
-        QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get());
-    EXPECT_CALL(*session_,
-                WritevData(decoder_send_stream->id(), /* write_length = */ 1,
-                           /* offset = */ 0, _, _, _));
-    EXPECT_CALL(*session_,
-                WritevData(decoder_send_stream->id(), /* write_length = */ 1,
-                           /* offset = */ 1, _, _, _));
-  }
-
   // Reset stream by this endpoint, for example, due to stream cancellation.
   EXPECT_CALL(*session_, MaybeSendStopSendingFrame(
                              stream_->id(), QuicResetStreamError::FromInternal(
@@ -2683,18 +2592,6 @@
   // Decoding is blocked because dynamic table entry has not been received yet.
   EXPECT_FALSE(stream_->headers_decompressed());
 
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    // Decoder stream type and stream cancellation instruction.
-    auto decoder_send_stream =
-        QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get());
-    EXPECT_CALL(*session_,
-                WritevData(decoder_send_stream->id(), /* write_length = */ 1,
-                           /* offset = */ 0, _, _, _));
-    EXPECT_CALL(*session_,
-                WritevData(decoder_send_stream->id(), /* write_length = */ 1,
-                           /* offset = */ 1, _, _, _));
-  }
-
   // OnStreamReset() is called when RESET_STREAM frame is received from peer.
   // This aborts header decompression.
   stream_->OnStreamReset(QuicRstStreamFrame(
@@ -3042,18 +2939,7 @@
       CloseConnection(QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_SPDY_STREAM,
                       "Unexpected DATA frame received.",
                       ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET))
-      .WillOnce(InvokeWithoutArgs([this]() {
-        auto* qpack_decoder_stream =
-            QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get());
-        if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5) &&
-            GetQuicReloadableFlag(
-                quic_stop_reading_also_stops_header_decompression)) {
-          EXPECT_CALL(*session_,
-                      WritevData(qpack_decoder_stream->id(), _, _, _, _, _))
-              .Times(2);
-        }
-        stream_->StopReading();
-      }));
+      .WillOnce(InvokeWithoutArgs([this]() { stream_->StopReading(); }));
 
   std::string data = DataFrame(kDataFramePayload);
   stream_->OnStreamFrame(QuicStreamFrame(stream_->id(), false, 0, data));
@@ -3102,18 +2988,7 @@
       CloseConnection(QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_SPDY_STREAM,
                       "HEADERS frame received after trailing HEADERS.",
                       ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET))
-      .WillOnce(InvokeWithoutArgs([this]() {
-        auto* qpack_decoder_stream =
-            QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get());
-        if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5) &&
-            GetQuicReloadableFlag(
-                quic_stop_reading_also_stops_header_decompression)) {
-          EXPECT_CALL(*session_,
-                      WritevData(qpack_decoder_stream->id(), _, _, _, _, _))
-              .Times(2);
-        }
-        stream_->StopReading();
-      }));
+      .WillOnce(InvokeWithoutArgs([this]() { stream_->StopReading(); }));
 
   // Receive another HEADERS frame, with no header fields.
   std::string trailers2 = HeadersFrame(HttpHeaderBlock());
@@ -3163,18 +3038,7 @@
       CloseConnection(QUIC_HTTP_INVALID_FRAME_SEQUENCE_ON_SPDY_STREAM,
                       "Unexpected DATA frame received.",
                       ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET))
-      .WillOnce(InvokeWithoutArgs([this]() {
-        auto* qpack_decoder_stream =
-            QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get());
-        if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5) &&
-            GetQuicReloadableFlag(
-                quic_stop_reading_also_stops_header_decompression)) {
-          EXPECT_CALL(*session_,
-                      WritevData(qpack_decoder_stream->id(), _, _, _, _, _))
-              .Times(2);
-        }
-        stream_->StopReading();
-      }));
+      .WillOnce(InvokeWithoutArgs([this]() { stream_->StopReading(); }));
 
   // Receive more data.
   std::string data2 = DataFrame("This payload should not be processed.");
@@ -3226,18 +3090,6 @@
 
   Initialize(kShouldProcessData);
 
-  auto qpack_decoder_stream =
-      QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get());
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    // Stream type.
-    EXPECT_CALL(*session_,
-                WritevData(qpack_decoder_stream->id(), /* write_length = */ 1,
-                           /* offset = */ 0, _, _, _));
-    // Stream cancellation.
-    EXPECT_CALL(*session_,
-                WritevData(qpack_decoder_stream->id(), /* write_length = */ 1,
-                           /* offset = */ 1, _, _, _));
-  }
   EXPECT_CALL(*session_, MaybeSendStopSendingFrame(
                              stream_->id(), QuicResetStreamError::FromInternal(
                                                 QUIC_STREAM_CANCELLED)));
@@ -3259,19 +3111,6 @@
 
   Initialize(kShouldProcessData);
 
-  auto qpack_decoder_stream =
-      QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get());
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    // Stream type.
-    EXPECT_CALL(*session_,
-                WritevData(qpack_decoder_stream->id(), /* write_length = */ 1,
-                           /* offset = */ 0, _, _, _));
-    // Stream cancellation.
-    EXPECT_CALL(*session_,
-                WritevData(qpack_decoder_stream->id(), /* write_length = */ 1,
-                           /* offset = */ 1, _, _, _));
-  }
-
   stream_->OnStreamReset(QuicRstStreamFrame(
       kInvalidControlFrameId, stream_->id(), QUIC_STREAM_CANCELLED, 0));
 }
@@ -3655,16 +3494,6 @@
   QuicStreamFrame frame(stream_->id(), /* fin = */ false, 0, data_frame);
   stream_->OnStreamFrame(frame);
 
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    // As a result of resetting the stream, stream type and stream cancellation
-    // are sent on the QPACK decoder stream.
-    auto qpack_decoder_stream =
-        QuicSpdySessionPeer::GetQpackDecoderSendStream(session_.get());
-    EXPECT_CALL(*session_,
-                WritevData(qpack_decoder_stream->id(), _, _, NO_FIN, _, _))
-        .Times(2);
-  }
-
   stream_->OnStreamReset(QuicRstStreamFrame(
       kInvalidControlFrameId, stream_->id(), QUIC_STREAM_NO_ERROR, 0));
 
diff --git a/quiche/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc b/quiche/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc
index cd31cd5..6e2cd4c 100644
--- a/quiche/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc
+++ b/quiche/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc
@@ -191,9 +191,7 @@
 
   EXPECT_CALL(visitor_, OnHeadersDecoded(_, true));
   qpack_decoder_.OnInsertWithoutNameReference("foo", "bar");
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    qpack_decoder_.FlushDecoderStream();
-  }
+  qpack_decoder_.FlushDecoderStream();
 }
 
 TEST_F(QpackDecodedHeadersAccumulatorTest, BlockedDecoding) {
@@ -218,9 +216,7 @@
   EXPECT_EQ(strlen("foo") + strlen("bar"),
             header_list.uncompressed_header_bytes());
   EXPECT_EQ(encoded_data.size(), header_list.compressed_header_bytes());
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    qpack_decoder_.FlushDecoderStream();
-  }
+  qpack_decoder_.FlushDecoderStream();
 }
 
 TEST_F(QpackDecodedHeadersAccumulatorTest,
@@ -247,9 +243,7 @@
   accumulator_.EndHeaderBlock();
 
   EXPECT_THAT(header_list, ElementsAre(Pair("foo", "bar"), Pair("foo", "bar")));
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    qpack_decoder_.FlushDecoderStream();
-  }
+  qpack_decoder_.FlushDecoderStream();
 }
 
 // Regression test for https://crbug.com/1024263.
diff --git a/quiche/quic/core/qpack/qpack_decoder.cc b/quiche/quic/core/qpack/qpack_decoder.cc
index f128fc9..49c7e81 100644
--- a/quiche/quic/core/qpack/qpack_decoder.cc
+++ b/quiche/quic/core/qpack/qpack_decoder.cc
@@ -32,9 +32,6 @@
 void QpackDecoder::OnStreamReset(QuicStreamId stream_id) {
   if (header_table_.maximum_dynamic_table_capacity() > 0) {
     decoder_stream_sender_.SendStreamCancellation(stream_id);
-    if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-      decoder_stream_sender_.Flush();
-    }
   }
 }
 
@@ -68,10 +65,6 @@
         header_table_.inserted_entry_count() - known_received_count_);
     known_received_count_ = header_table_.inserted_entry_count();
   }
-
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    decoder_stream_sender_.Flush();
-  }
 }
 
 void QpackDecoder::OnInsertWithNameReference(bool is_static,
diff --git a/quiche/quic/core/qpack/qpack_decoder_stream_sender.cc b/quiche/quic/core/qpack/qpack_decoder_stream_sender.cc
index 7ebc9a5..d512788 100644
--- a/quiche/quic/core/qpack/qpack_decoder_stream_sender.cc
+++ b/quiche/quic/core/qpack/qpack_decoder_stream_sender.cc
@@ -42,17 +42,12 @@
   if (buffer_.empty() || delegate_ == nullptr) {
     return;
   }
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    QUIC_RESTART_FLAG_COUNT_N(quic_opport_bundle_qpack_decoder_data5, 3, 4);
-    // Swap buffer_ before calling WriteStreamData, which might result in a
-    // reentrant call to `Flush()`.
-    std::string copy;
-    std::swap(copy, buffer_);
-    delegate_->WriteStreamData(copy);
-    return;
-  }
-  delegate_->WriteStreamData(buffer_);
-  buffer_.clear();
+
+  // Swap buffer_ before calling WriteStreamData, which might result in a
+  // reentrant call to `Flush()`.
+  std::string copy;
+  std::swap(copy, buffer_);
+  delegate_->WriteStreamData(copy);
 }
 
 }  // namespace quic
diff --git a/quiche/quic/core/qpack/qpack_decoder_test.cc b/quiche/quic/core/qpack/qpack_decoder_test.cc
index 853ab54..b15ffc5 100644
--- a/quiche/quic/core/qpack/qpack_decoder_test.cc
+++ b/quiche/quic/core/qpack/qpack_decoder_test.cc
@@ -421,17 +421,10 @@
       .InSequence(s);
   EXPECT_CALL(handler_, OnHeaderDecoded(Eq("foo"), Eq("ZZZ"))).InSequence(s);
   EXPECT_CALL(handler_, OnHeaderDecoded(Eq(":method"), Eq("ZZ"))).InSequence(s);
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    EXPECT_CALL(decoder_stream_sender_delegate_,
-                WriteStreamData(Eq(kHeaderAcknowledgement)))
-        .InSequence(s);
-  }
   EXPECT_CALL(handler_, OnDecodingCompleted()).InSequence(s);
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    EXPECT_CALL(decoder_stream_sender_delegate_,
-                WriteStreamData(Eq(kHeaderAcknowledgement)))
-        .InSequence(s);
-  }
+  EXPECT_CALL(decoder_stream_sender_delegate_,
+              WriteStreamData(Eq(kHeaderAcknowledgement)))
+      .InSequence(s);
 
   ASSERT_TRUE(absl::HexStringToBytes(
       "0500"  // Required Insert Count 4 and Delta Base 0.
@@ -444,9 +437,7 @@
                    // with value "ZZ".
       &input));
   DecodeHeaderBlock(input);
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    FlushDecoderStream();
-  }
+  FlushDecoderStream();
 
   EXPECT_CALL(handler_, OnHeaderDecoded(Eq("foo"), Eq("bar"))).InSequence(s);
   EXPECT_CALL(handler_, OnHeaderDecoded(Eq("foo"), Eq("ZZZ"))).InSequence(s);
@@ -454,17 +445,10 @@
       .InSequence(s);
   EXPECT_CALL(handler_, OnHeaderDecoded(Eq("foo"), Eq("ZZZ"))).InSequence(s);
   EXPECT_CALL(handler_, OnHeaderDecoded(Eq(":method"), Eq("ZZ"))).InSequence(s);
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    EXPECT_CALL(decoder_stream_sender_delegate_,
-                WriteStreamData(Eq(kHeaderAcknowledgement)))
-        .InSequence(s);
-  }
   EXPECT_CALL(handler_, OnDecodingCompleted()).InSequence(s);
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    EXPECT_CALL(decoder_stream_sender_delegate_,
-                WriteStreamData(Eq(kHeaderAcknowledgement)))
-        .InSequence(s);
-  }
+  EXPECT_CALL(decoder_stream_sender_delegate_,
+              WriteStreamData(Eq(kHeaderAcknowledgement)))
+      .InSequence(s);
 
   ASSERT_TRUE(absl::HexStringToBytes(
       "0502"  // Required Insert Count 4 and Delta Base 2.
@@ -477,9 +461,7 @@
                    // with value "ZZ".
       &input));
   DecodeHeaderBlock(input);
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    FlushDecoderStream();
-  }
+  FlushDecoderStream();
 
   EXPECT_CALL(handler_, OnHeaderDecoded(Eq("foo"), Eq("bar"))).InSequence(s);
   EXPECT_CALL(handler_, OnHeaderDecoded(Eq("foo"), Eq("ZZZ"))).InSequence(s);
@@ -487,17 +469,10 @@
       .InSequence(s);
   EXPECT_CALL(handler_, OnHeaderDecoded(Eq("foo"), Eq("ZZZ"))).InSequence(s);
   EXPECT_CALL(handler_, OnHeaderDecoded(Eq(":method"), Eq("ZZ"))).InSequence(s);
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    EXPECT_CALL(decoder_stream_sender_delegate_,
-                WriteStreamData(Eq(kHeaderAcknowledgement)))
-        .InSequence(s);
-  }
   EXPECT_CALL(handler_, OnDecodingCompleted()).InSequence(s);
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    EXPECT_CALL(decoder_stream_sender_delegate_,
-                WriteStreamData(Eq(kHeaderAcknowledgement)))
-        .InSequence(s);
-  }
+  EXPECT_CALL(decoder_stream_sender_delegate_,
+              WriteStreamData(Eq(kHeaderAcknowledgement)))
+      .InSequence(s);
 
   ASSERT_TRUE(absl::HexStringToBytes(
       "0582"  // Required Insert Count 4 and Delta Base 2 with sign bit set.
@@ -510,9 +485,7 @@
                    // with value "ZZ".
       &input));
   DecodeHeaderBlock(input);
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    FlushDecoderStream();
-  }
+  FlushDecoderStream();
 }
 
 TEST_P(QpackDecoderTest, DecreasingDynamicTableCapacityEvictsEntries) {
@@ -551,9 +524,7 @@
       "80",   // Dynamic table entry with relative index 0, absolute index 0.
       &input));
   DecodeHeaderBlock(input);
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    FlushDecoderStream();
-  }
+  FlushDecoderStream();
 }
 
 TEST_P(QpackDecoderTest, EncoderStreamErrorEntryTooLarge) {
@@ -838,9 +809,7 @@
       "80",   // Emit dynamic table entry with relative index 0.
       &input));
   DecodeHeaderBlock(input);
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    FlushDecoderStream();
-  }
+  FlushDecoderStream();
 }
 
 TEST_P(QpackDecoderTest, NonZeroRequiredInsertCountButNoDynamicEntries) {
@@ -1033,9 +1002,7 @@
   // Add literal entry with name "foo" and value "bar".
   ASSERT_TRUE(absl::HexStringToBytes("6294e703626172", &input));
   DecodeEncoderStreamData(input);
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    FlushDecoderStream();
-  }
+  FlushDecoderStream();
 }
 
 TEST_P(QpackDecoderTest, BlockedDecodingUnblockedBeforeEndOfHeaderBlock) {
@@ -1080,9 +1047,7 @@
   EXPECT_CALL(decoder_stream_sender_delegate_,
               WriteStreamData(Eq(kHeaderAcknowledgement)));
   EndDecoding();
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    FlushDecoderStream();
-  }
+  FlushDecoderStream();
 }
 
 // Regression test for https://crbug.com/1024263.
@@ -1148,9 +1113,7 @@
   // Insert Count is now 6, reaching Required Insert Count of the header block.
   ASSERT_TRUE(absl::HexStringToBytes("6294e70362617a", &input));
   DecodeEncoderStreamData(input);
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    FlushDecoderStream();
-  }
+  FlushDecoderStream();
 }
 
 TEST_P(QpackDecoderTest, TooManyBlockedStreams) {
@@ -1200,9 +1163,7 @@
       "80",   // Dynamic table entry with relative index 0, absolute index 0.
       &input));
   DecodeHeaderBlock(input);
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    FlushDecoderStream();
-  }
+  FlushDecoderStream();
 }
 
 }  // namespace
diff --git a/quiche/quic/core/qpack/qpack_send_stream_test.cc b/quiche/quic/core/qpack/qpack_send_stream_test.cc
index 3315ee1..0ef0624 100644
--- a/quiche/quic/core/qpack/qpack_send_stream_test.cc
+++ b/quiche/quic/core/qpack/qpack_send_stream_test.cc
@@ -133,7 +133,6 @@
 }
 
 TEST_P(QpackSendStreamTest, GetSendWindowSizeFromSession) {
-  SetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5, true);
   EXPECT_NE(session_.GetFlowControlSendWindowSize(qpack_send_stream_->id()),
             std::numeric_limits<QuicByteCount>::max());
 }
diff --git a/quiche/quic/core/quic_connection.cc b/quiche/quic/core/quic_connection.cc
index cbb2c69..c81536b 100644
--- a/quiche/quic/core/quic_connection.cc
+++ b/quiche/quic/core/quic_connection.cc
@@ -3066,35 +3066,21 @@
 
 void QuicConnection::MaybeBundleOpportunistically(
     TransmissionType transmission_type) {
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    QUIC_RESTART_FLAG_COUNT_N(quic_opport_bundle_qpack_decoder_data5, 1, 4);
+  const bool should_bundle_ack_frequency =
+      !ack_frequency_sent_ && sent_packet_manager_.CanSendAckFrequency() &&
+      transmission_type == NOT_RETRANSMISSION &&
+      packet_creator_.NextSendingPacketNumber() >=
+          FirstSendingPacketNumber() + kMinReceivedBeforeAckDecimation;
 
-    const bool should_bundle_ack_frequency =
-        !ack_frequency_sent_ && sent_packet_manager_.CanSendAckFrequency() &&
-        transmission_type == NOT_RETRANSMISSION &&
-        packet_creator_.NextSendingPacketNumber() >=
-            FirstSendingPacketNumber() + kMinReceivedBeforeAckDecimation;
+  if (should_bundle_ack_frequency) {
+    QUIC_RELOADABLE_FLAG_COUNT_N(quic_can_send_ack_frequency, 3, 3);
+    ack_frequency_sent_ = true;
+    auto frame = sent_packet_manager_.GetUpdatedAckFrequencyFrame();
+    visitor_->SendAckFrequency(frame);
+  }
 
-    if (should_bundle_ack_frequency) {
-      QUIC_RELOADABLE_FLAG_COUNT_N(quic_can_send_ack_frequency, 3, 3);
-      ack_frequency_sent_ = true;
-      auto frame = sent_packet_manager_.GetUpdatedAckFrequencyFrame();
-      visitor_->SendAckFrequency(frame);
-    }
-
-    if (transmission_type == NOT_RETRANSMISSION) {
-      visitor_->MaybeBundleOpportunistically();
-    }
-  } else {
-    if (!ack_frequency_sent_ && sent_packet_manager_.CanSendAckFrequency()) {
-      if (packet_creator_.NextSendingPacketNumber() >=
-          FirstSendingPacketNumber() + kMinReceivedBeforeAckDecimation) {
-        QUIC_RELOADABLE_FLAG_COUNT_N(quic_can_send_ack_frequency, 3, 3);
-        ack_frequency_sent_ = true;
-        auto frame = sent_packet_manager_.GetUpdatedAckFrequencyFrame();
-        visitor_->SendAckFrequency(frame);
-      }
-    }
+  if (transmission_type == NOT_RETRANSMISSION) {
+    visitor_->MaybeBundleOpportunistically();
   }
 
   if (packet_creator_.has_ack() || !CanWrite(NO_RETRANSMITTABLE_DATA)) {
@@ -5745,10 +5731,7 @@
       uber_received_packet_manager_.GetEarliestAckTimeout();
   QUIC_BUG_IF(quic_bug_12714_32, !earliest_ack_timeout.IsInitialized());
   MaybeBundleCryptoDataWithAcks();
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    QUIC_RESTART_FLAG_COUNT_N(quic_opport_bundle_qpack_decoder_data5, 2, 4);
-    visitor_->MaybeBundleOpportunistically();
-  }
+  visitor_->MaybeBundleOpportunistically();
   earliest_ack_timeout = uber_received_packet_manager_.GetEarliestAckTimeout();
   if (!earliest_ack_timeout.IsInitialized()) {
     return;
diff --git a/quiche/quic/core/quic_connection_test.cc b/quiche/quic/core/quic_connection_test.cc
index 28bb07c..e040c76 100644
--- a/quiche/quic/core/quic_connection_test.cc
+++ b/quiche/quic/core/quic_connection_test.cc
@@ -704,10 +704,8 @@
     EXPECT_CALL(visitor_, OnCongestionWindowChange(_)).Times(AnyNumber());
     EXPECT_CALL(visitor_, OnPacketReceived(_, _, _)).Times(AnyNumber());
     EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)).Times(AnyNumber());
-    if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-      EXPECT_CALL(visitor_, MaybeBundleOpportunistically()).Times(AnyNumber());
-      EXPECT_CALL(visitor_, GetFlowControlSendWindowSize(_)).Times(AnyNumber());
-    }
+    EXPECT_CALL(visitor_, MaybeBundleOpportunistically()).Times(AnyNumber());
+    EXPECT_CALL(visitor_, GetFlowControlSendWindowSize(_)).Times(AnyNumber());
     EXPECT_CALL(visitor_, OnOneRttPacketAcknowledged())
         .Times(testing::AtMost(1));
     EXPECT_CALL(*loss_algorithm_, GetLossTimeout())
diff --git a/quiche/quic/core/quic_packet_creator.cc b/quiche/quic/core/quic_packet_creator.cc
index aecfc73..ca35a07 100644
--- a/quiche/quic/core/quic_packet_creator.cc
+++ b/quiche/quic/core/quic_packet_creator.cc
@@ -1314,11 +1314,6 @@
 }
 
 void QuicPacketCreator::MaybeBundleOpportunistically() {
-  if (!GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    delegate_->MaybeBundleOpportunistically(next_transmission_type_);
-    return;
-  }
-
   // delegate_->MaybeBundleOpportunistically() may change
   // next_transmission_type_ for the bundled data.
   const TransmissionType next_transmission_type = next_transmission_type_;
@@ -1337,14 +1332,6 @@
   bool has_handshake = QuicUtils::IsCryptoStreamId(transport_version(), id);
   const TransmissionType next_transmission_type = next_transmission_type_;
   MaybeBundleOpportunistically();
-  // TODO(wub): Remove this QUIC_BUG when deprecating
-  // quic_opport_bundle_qpack_decoder_data5.
-  QUIC_BUG_IF(quic_packet_creator_change_transmission_type,
-              next_transmission_type != next_transmission_type_)
-      << ENDPOINT
-      << "Transmission type changed by bundled data. old transmission type:"
-      << next_transmission_type
-      << ", new transmission type:" << next_transmission_type_;
   // If the data being consumed is subject to flow control, check the flow
   // control send window to see if |write_length| exceeds the send window after
   // bundling opportunistic data, if so, reduce |write_length| to the send
@@ -1354,11 +1341,9 @@
   // - And it's not handshake data. This is always true for ConsumeData because
   //   the function is not called for handshake data.
   const size_t original_write_length = write_length;
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5) &&
-      next_transmission_type_ == NOT_RETRANSMISSION) {
+  if (next_transmission_type_ == NOT_RETRANSMISSION) {
     if (QuicByteCount send_window = delegate_->GetFlowControlSendWindowSize(id);
         write_length > send_window) {
-      QUIC_RESTART_FLAG_COUNT_N(quic_opport_bundle_qpack_decoder_data5, 4, 4);
       QUIC_DLOG(INFO) << ENDPOINT
                       << "After bundled data, reducing (old) write_length:"
                       << write_length << "to (new) send_window:" << send_window;
diff --git a/quiche/quic/core/quic_packet_creator_test.cc b/quiche/quic/core/quic_packet_creator_test.cc
index b527b09..2d06c6c 100644
--- a/quiche/quic/core/quic_packet_creator_test.cc
+++ b/quiche/quic/core/quic_packet_creator_test.cc
@@ -2932,22 +2932,13 @@
   QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
       framer_.transport_version(), Perspective::IS_CLIENT);
 
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    EXPECT_CALL(delegate_, GetFlowControlSendWindowSize(stream_id))
-        .WillOnce(Return(data.length() - 1));
-  } else {
-    EXPECT_CALL(delegate_, GetFlowControlSendWindowSize(_)).Times(0);
-  }
+  EXPECT_CALL(delegate_, GetFlowControlSendWindowSize(stream_id))
+      .WillOnce(Return(data.length() - 1));
 
   QuicConsumedData consumed = creator_.ConsumeData(stream_id, data, 0u, FIN);
 
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    EXPECT_EQ(consumed.bytes_consumed, data.length() - 1);
-    EXPECT_FALSE(consumed.fin_consumed);
-  } else {
-    EXPECT_EQ(consumed.bytes_consumed, data.length());
-    EXPECT_TRUE(consumed.fin_consumed);
-  }
+  EXPECT_EQ(consumed.bytes_consumed, data.length() - 1);
+  EXPECT_FALSE(consumed.fin_consumed);
 }
 
 // Tests the case that after bundling data, send window is exactly as big as
@@ -2962,12 +2953,8 @@
   QuicStreamId stream_id = QuicUtils::GetFirstBidirectionalStreamId(
       framer_.transport_version(), Perspective::IS_CLIENT);
 
-  if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5)) {
-    EXPECT_CALL(delegate_, GetFlowControlSendWindowSize(stream_id))
-        .WillOnce(Return(data.length()));
-  } else {
-    EXPECT_CALL(delegate_, GetFlowControlSendWindowSize(_)).Times(0);
-  }
+  EXPECT_CALL(delegate_, GetFlowControlSendWindowSize(stream_id))
+      .WillOnce(Return(data.length()));
 
   QuicConsumedData consumed = creator_.ConsumeData(stream_id, data, 0u, FIN);
 
diff --git a/quiche/quic/core/quic_session.cc b/quiche/quic/core/quic_session.cc
index a8b113b..2ee8651 100644
--- a/quiche/quic/core/quic_session.cc
+++ b/quiche/quic/core/quic_session.cc
@@ -2508,7 +2508,6 @@
 }
 
 QuicByteCount QuicSession::GetFlowControlSendWindowSize(QuicStreamId id) {
-  QUICHE_DCHECK(GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data5));
   auto it = stream_map_.find(id);
   if (it == stream_map_.end()) {
     // No flow control for invalid or inactive stream ids. Returning uint64max
