diff --git a/http2/decoder/http2_frame_decoder.cc b/http2/decoder/http2_frame_decoder.cc
index 449d649..9509c0c 100644
--- a/http2/decoder/http2_frame_decoder.cc
+++ b/http2/decoder/http2_frame_decoder.cc
@@ -158,12 +158,7 @@
       break;
 
     case Http2FrameType::PRIORITY_UPDATE:
-      if (GetHttp2RestartFlag(http2_parse_priority_update_frame)) {
-        HTTP2_RESTART_FLAG_COUNT_N(http2_parse_priority_update_frame, 1, 2);
-        status = StartDecodingPriorityUpdatePayload(&subset);
-      } else {
-        status = StartDecodingUnknownPayload(&subset);
-      }
+      status = StartDecodingPriorityUpdatePayload(&subset);
       break;
 
     default:
@@ -237,12 +232,7 @@
       break;
 
     case Http2FrameType::PRIORITY_UPDATE:
-      if (GetHttp2RestartFlag(http2_parse_priority_update_frame)) {
-        HTTP2_RESTART_FLAG_COUNT_N(http2_parse_priority_update_frame, 2, 2);
-        status = ResumeDecodingPriorityUpdatePayload(&subset);
-      } else {
-        status = ResumeDecodingUnknownPayload(&subset);
-      }
+      status = ResumeDecodingPriorityUpdatePayload(&subset);
       break;
 
     default:
diff --git a/http2/decoder/http2_frame_decoder_test.cc b/http2/decoder/http2_frame_decoder_test.cc
index 0b0b415..b09a5d0 100644
--- a/http2/decoder/http2_frame_decoder_test.cc
+++ b/http2/decoder/http2_frame_decoder_test.cc
@@ -558,16 +558,9 @@
   };
   Http2FrameHeader header(7, Http2FrameType::PRIORITY_UPDATE, 0, 0);
 
-  if (GetHttp2RestartFlag(http2_parse_priority_update_frame)) {
-    FrameParts expected(header, "abc");
-    expected.SetOptPriorityUpdate(Http2PriorityUpdateFields{5});
-    EXPECT_TRUE(DecodePayloadAndValidateSeveralWays(kFrameData, expected));
-  } else {
-    FrameParts expected(header, absl::string_view("\x00\x00\x00\x05"
-                                                  "abc",
-                                                  7));
-    EXPECT_TRUE(DecodePayloadAndValidateSeveralWays(kFrameData, expected));
-  }
+  FrameParts expected(header, "abc");
+  expected.SetOptPriorityUpdate(Http2PriorityUpdateFields{5});
+  EXPECT_TRUE(DecodePayloadAndValidateSeveralWays(kFrameData, expected));
 }
 
 TEST_F(Http2FrameDecoderTest, UnknownPayload) {
diff --git a/http2/decoder/payload_decoders/priority_update_payload_decoder_test.cc b/http2/decoder/payload_decoders/priority_update_payload_decoder_test.cc
index 39d0afc..41b7dc8 100644
--- a/http2/decoder/payload_decoders/priority_update_payload_decoder_test.cc
+++ b/http2/decoder/payload_decoders/priority_update_payload_decoder_test.cc
@@ -61,31 +61,14 @@
   }
 };
 
-// Avoid initialization of test class when flag is false, because base class
-// method AbstractPayloadDecoderTest::SetUp() crashes if
-// IsSupportedHttp2FrameType(PRIORITY_UPDATE) returns false.
-std::vector<bool> GetTestParams() {
-  if (GetHttp2RestartFlag(http2_parse_priority_update_frame)) {
-    return {true};  // Actual Boolean value is ignored.
-  } else {
-    return {};
-  }
-}
-
 class PriorityUpdatePayloadDecoderTest
     : public AbstractPayloadDecoderTest<PriorityUpdatePayloadDecoder,
                                         PriorityUpdatePayloadDecoderPeer,
-                                        Listener>,
-      public ::testing::WithParamInterface<bool> {};
-
-INSTANTIATE_TEST_SUITE_P(MaybeRunTest,
-                         PriorityUpdatePayloadDecoderTest,
-                         ::testing::ValuesIn(GetTestParams()));
-GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(PriorityUpdatePayloadDecoderTest);
+                                        Listener> {};
 
 // Confirm we get an error if the payload is not long enough to hold
 // Http2PriorityUpdateFields.
-TEST_P(PriorityUpdatePayloadDecoderTest, Truncated) {
+TEST_F(PriorityUpdatePayloadDecoderTest, Truncated) {
   auto approve_size = [](size_t size) {
     return size != Http2PriorityUpdateFields::EncodedSize();
   };
@@ -98,9 +81,9 @@
     : public AbstractPayloadDecoderTest<PriorityUpdatePayloadDecoder,
                                         PriorityUpdatePayloadDecoderPeer,
                                         Listener>,
-      public ::testing::WithParamInterface<std::tuple<uint32_t, bool>> {
+      public ::testing::WithParamInterface<uint32_t> {
  protected:
-  PriorityUpdatePayloadLengthTests() : length_(std::get<0>(GetParam())) {
+  PriorityUpdatePayloadLengthTests() : length_(GetParam()) {
     HTTP2_VLOG(1) << "################  length_=" << length_
                   << "  ################";
   }
@@ -108,12 +91,9 @@
   const uint32_t length_;
 };
 
-INSTANTIATE_TEST_SUITE_P(
-    VariousLengths,
-    PriorityUpdatePayloadLengthTests,
-    ::testing::Combine(::testing::Values(0, 1, 2, 3, 4, 5, 6),
-                       ::testing::ValuesIn(GetTestParams())));
-GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(PriorityUpdatePayloadLengthTests);
+INSTANTIATE_TEST_SUITE_P(VariousLengths,
+                         PriorityUpdatePayloadLengthTests,
+                         ::testing::Values(0, 1, 2, 3, 4, 5, 6));
 
 TEST_P(PriorityUpdatePayloadLengthTests, ValidLength) {
   Http2PriorityUpdateFields priority_update;
diff --git a/http2/http2_constants.h b/http2/http2_constants.h
index cd05eb4..65e55db 100644
--- a/http2/http2_constants.h
+++ b/http2/http2_constants.h
@@ -48,12 +48,8 @@
 
 // Is the frame type known/supported?
 inline bool IsSupportedHttp2FrameType(uint32_t v) {
-  if (GetHttp2RestartFlag(http2_parse_priority_update_frame) &&
-      v == static_cast<uint32_t>(Http2FrameType::PRIORITY_UPDATE)) {
-    return true;
-  }
-
-  return v <= static_cast<uint32_t>(Http2FrameType::ALTSVC);
+  return v <= static_cast<uint32_t>(Http2FrameType::ALTSVC) ||
+         v == static_cast<uint32_t>(Http2FrameType::PRIORITY_UPDATE);
 }
 inline bool IsSupportedHttp2FrameType(Http2FrameType v) {
   return IsSupportedHttp2FrameType(static_cast<uint32_t>(v));
diff --git a/quic/core/quic_flags_list.h b/quic/core/quic_flags_list.h
index f37ccbc..aa5f569 100644
--- a/quic/core/quic_flags_list.h
+++ b/quic/core/quic_flags_list.h
@@ -67,7 +67,6 @@
 QUIC_FLAG(FLAGS_quic_reloadable_flag_quic_use_write_or_buffer_data_at_level, false)
 QUIC_FLAG(FLAGS_quic_reloadable_flag_send_quic_fallback_server_config_on_leto_error, false)
 QUIC_FLAG(FLAGS_quic_restart_flag_dont_fetch_quic_private_keys_from_leto, false)
-QUIC_FLAG(FLAGS_quic_restart_flag_http2_parse_priority_update_frame, true)
 QUIC_FLAG(FLAGS_quic_restart_flag_quic_dispatcher_support_multiple_cid_per_connection_v2, true)
 QUIC_FLAG(FLAGS_quic_restart_flag_quic_enable_zero_rtt_for_tls_v2, true)
 QUIC_FLAG(FLAGS_quic_restart_flag_quic_offload_pacing_to_usps2, false)
diff --git a/spdy/core/spdy_framer_test.cc b/spdy/core/spdy_framer_test.cc
index 96b9f4c..d7fb6a7 100644
--- a/spdy/core/spdy_framer_test.cc
+++ b/spdy/core/spdy_framer_test.cc
@@ -4570,12 +4570,7 @@
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
   deframer_.set_visitor(&visitor);
 
-  if (GetHttp2RestartFlag(http2_parse_priority_update_frame)) {
-    EXPECT_CALL(visitor, OnPriorityUpdate(3, "foo"));
-  } else {
-    EXPECT_CALL(visitor, OnUnknownFrame(0, _)).WillOnce(testing::Return(true));
-  }
-
+  EXPECT_CALL(visitor, OnPriorityUpdate(3, "foo"));
   deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
   EXPECT_FALSE(deframer_.HasError());
 }
@@ -4592,12 +4587,7 @@
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
   deframer_.set_visitor(&visitor);
 
-  if (GetHttp2RestartFlag(http2_parse_priority_update_frame)) {
-    EXPECT_CALL(visitor, OnPriorityUpdate(3, ""));
-  } else {
-    EXPECT_CALL(visitor, OnUnknownFrame(0, _)).WillOnce(testing::Return(true));
-  }
-
+  EXPECT_CALL(visitor, OnPriorityUpdate(3, ""));
   deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
   EXPECT_FALSE(deframer_.HasError());
 }
@@ -4613,17 +4603,10 @@
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
   deframer_.set_visitor(&visitor);
 
-  if (GetHttp2RestartFlag(http2_parse_priority_update_frame)) {
-    EXPECT_CALL(
-        visitor,
-        OnError(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME_SIZE, _));
-    deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
-    EXPECT_TRUE(deframer_.HasError());
-  } else {
-    EXPECT_CALL(visitor, OnUnknownFrame(0, _)).WillOnce(testing::Return(true));
-    deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
-    EXPECT_FALSE(deframer_.HasError());
-  }
+  EXPECT_CALL(visitor,
+              OnError(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME_SIZE, _));
+  deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
+  EXPECT_TRUE(deframer_.HasError());
 }
 
 TEST_P(SpdyFramerTest, PriorityUpdateFrameWithShortPayload) {
@@ -4639,17 +4622,10 @@
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
   deframer_.set_visitor(&visitor);
 
-  if (GetHttp2RestartFlag(http2_parse_priority_update_frame)) {
-    EXPECT_CALL(
-        visitor,
-        OnError(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME_SIZE, _));
-    deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
-    EXPECT_TRUE(deframer_.HasError());
-  } else {
-    EXPECT_CALL(visitor, OnUnknownFrame(0, _)).WillOnce(testing::Return(true));
-    deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
-    EXPECT_FALSE(deframer_.HasError());
-  }
+  EXPECT_CALL(visitor,
+              OnError(Http2DecoderAdapter::SPDY_INVALID_CONTROL_FRAME_SIZE, _));
+  deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
+  EXPECT_TRUE(deframer_.HasError());
 }
 
 TEST_P(SpdyFramerTest, PriorityUpdateFrameOnIncorrectStream) {
@@ -4664,16 +4640,9 @@
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
   deframer_.set_visitor(&visitor);
 
-  if (GetHttp2RestartFlag(http2_parse_priority_update_frame)) {
-    EXPECT_CALL(visitor,
-                OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _));
-    deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
-    EXPECT_TRUE(deframer_.HasError());
-  } else {
-    EXPECT_CALL(visitor, OnUnknownFrame(1, _)).WillOnce(testing::Return(true));
-    deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
-    EXPECT_FALSE(deframer_.HasError());
-  }
+  EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _));
+  deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
+  EXPECT_TRUE(deframer_.HasError());
 }
 
 TEST_P(SpdyFramerTest, PriorityUpdateFramePrioritizingIncorrectStream) {
@@ -4688,16 +4657,9 @@
   testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
   deframer_.set_visitor(&visitor);
 
-  if (GetHttp2RestartFlag(http2_parse_priority_update_frame)) {
-    EXPECT_CALL(visitor,
-                OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _));
-    deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
-    EXPECT_TRUE(deframer_.HasError());
-  } else {
-    EXPECT_CALL(visitor, OnUnknownFrame(0, _)).WillOnce(testing::Return(true));
-    deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
-    EXPECT_FALSE(deframer_.HasError());
-  }
+  EXPECT_CALL(visitor, OnError(Http2DecoderAdapter::SPDY_INVALID_STREAM_ID, _));
+  deframer_.ProcessInput(kFrameData, sizeof(kFrameData));
+  EXPECT_TRUE(deframer_.HasError());
 }
 
 // Tests handling of PRIORITY frames.
