diff --git a/quiche/quic/moqt/moqt_framer.cc b/quiche/quic/moqt/moqt_framer.cc
index bf810f4..d2f57fc 100644
--- a/quiche/quic/moqt/moqt_framer.cc
+++ b/quiche/quic/moqt/moqt_framer.cc
@@ -160,17 +160,17 @@
 QuicheBuffer SerializeControlMessage(MoqtMessageType type, Ts... data) {
   uint64_t message_type = static_cast<uint64_t>(type);
   size_t payload_size = quiche::ComputeLengthOnWire(data...);
-  size_t buffer_size =
-      payload_size + quiche::ComputeLengthOnWire(WireVarInt62(message_type),
-                                                 WireVarInt62(payload_size));
+  size_t buffer_size = sizeof(uint16_t) + payload_size +
+                       quiche::ComputeLengthOnWire(WireVarInt62(message_type));
   if (buffer_size == 0) {
     return QuicheBuffer();
   }
 
   QuicheBuffer buffer(quiche::SimpleBufferAllocator::Get(), buffer_size);
   quiche::QuicheDataWriter writer(buffer.size(), buffer.data());
-  absl::Status status = SerializeIntoWriter(
-      writer, WireVarInt62(message_type), WireVarInt62(payload_size), data...);
+  absl::Status status =
+      SerializeIntoWriter(writer, WireVarInt62(message_type),
+                          quiche::WireUint16(payload_size), data...);
   if (!status.ok() || writer.remaining() != 0) {
     QUICHE_BUG(moqt_failed_serialization)
         << "Failed to serialize MoQT frame: " << status;
diff --git a/quiche/quic/moqt/moqt_framer_test.cc b/quiche/quic/moqt/moqt_framer_test.cc
index 21738c9..e772bc8 100644
--- a/quiche/quic/moqt/moqt_framer_test.cc
+++ b/quiche/quic/moqt/moqt_framer_test.cc
@@ -427,7 +427,7 @@
       }
       buffer = framer_.SerializeSubscribe(subscribe);
       // Go to the filter type.
-      const uint8_t* read = BufferAtOffset(buffer, 16);
+      const uint8_t* read = BufferAtOffset(buffer, 17);
       EXPECT_EQ(static_cast<MoqtFilterType>(*read), expected_filter_type);
       EXPECT_GT(buffer.size(), 0);
     }
@@ -486,7 +486,7 @@
   quiche::QuicheBuffer buffer;
   buffer = framer_.SerializeSubscribeUpdate(subscribe_update);
   EXPECT_GT(buffer.size(), 0);
-  const uint8_t* end_group = BufferAtOffset(buffer, 5);
+  const uint8_t* end_group = BufferAtOffset(buffer, 6);
   EXPECT_EQ(*end_group, 5);
 }
 
@@ -501,7 +501,7 @@
   quiche::QuicheBuffer buffer;
   buffer = framer_.SerializeSubscribeUpdate(subscribe_update);
   EXPECT_GT(buffer.size(), 0);
-  const uint8_t* end_group = BufferAtOffset(buffer, 5);
+  const uint8_t* end_group = BufferAtOffset(buffer, 6);
   EXPECT_EQ(*end_group, 5);
 }
 
diff --git a/quiche/quic/moqt/moqt_parser.cc b/quiche/quic/moqt/moqt_parser.cc
index 66d52ba..5dd2508 100644
--- a/quiche/quic/moqt/moqt_parser.cc
+++ b/quiche/quic/moqt/moqt_parser.cc
@@ -179,7 +179,6 @@
   auto on_return = absl::MakeCleanup([&] { processing_ = false; });
   while (!no_more_data_) {
     bool fin_read = false;
-
     // Read the message type.
     if (!message_type_.has_value()) {
       message_type_ = ReadVarInt62FromStream(stream_, fin_read);
@@ -195,15 +194,23 @@
 
     // Read the message length.
     if (!message_size_.has_value()) {
-      message_size_ = ReadVarInt62FromStream(stream_, fin_read);
-      if (fin_read) {
+      if (stream_.ReadableBytes() < 2) {
+        return;
+      }
+      std::array<char, 2> size_bytes;
+      quiche::ReadStream::ReadResult result =
+          stream_.Read(absl::MakeSpan(size_bytes));
+      if (result.bytes_read != 2) {
+        ParseError(MoqtError::kInternalError,
+                   "Stream returned incorrect ReadableBytes");
+        return;
+      }
+      if (result.fin) {
         ParseError("FIN on control stream");
         return;
       }
-      if (!message_size_.has_value()) {
-        return;
-      }
-
+      message_size_ = static_cast<uint16_t>(size_bytes[0]) << 8 |
+                      static_cast<uint16_t>(size_bytes[1]);
       if (*message_size_ > kMaxMessageHeaderSize) {
         ParseError(MoqtError::kInternalError,
                    absl::StrCat("Cannot parse control messages more than ",
diff --git a/quiche/quic/moqt/moqt_parser.h b/quiche/quic/moqt/moqt_parser.h
index 2259f9d..1cb2fe3 100644
--- a/quiche/quic/moqt/moqt_parser.h
+++ b/quiche/quic/moqt/moqt_parser.h
@@ -159,7 +159,7 @@
   bool parsing_error_ = false;
 
   std::optional<uint64_t> message_type_;
-  std::optional<uint64_t> message_size_;
+  std::optional<uint16_t> message_size_;
 
   uint64_t max_auth_token_cache_size_ = 0;
   uint64_t auth_token_cache_size_ = 0;
diff --git a/quiche/quic/moqt/moqt_parser_test.cc b/quiche/quic/moqt/moqt_parser_test.cc
index eb54620..7e4ba28 100644
--- a/quiche/quic/moqt/moqt_parser_test.cc
+++ b/quiche/quic/moqt/moqt_parser_test.cc
@@ -562,11 +562,11 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char setup[] = {
-      0x20, 0x0d, 0x02, 0x01, 0x02,  // versions
-      0x03,                          // 3 params
-      0x01, 0x03, 0x66, 0x6f, 0x6f,  // path = "foo"
-      0x02, 0x32,                    // max_request_id = 50
-      0x02, 0x32,                    // max_request_id = 50
+      0x20, 0x00, 0x0d, 0x02, 0x01, 0x02,  // versions
+      0x03,                                // 3 params
+      0x01, 0x03, 0x66, 0x6f, 0x6f,        // path = "foo"
+      0x02, 0x32,                          // max_request_id = 50
+      0x02, 0x32,                          // max_request_id = 50
   };
   stream.Receive(absl::string_view(setup, sizeof(setup)), false);
   parser.ReadAndDispatchMessages();
@@ -580,7 +580,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char setup[] = {
-      0x21, 0x07,
+      0x21, 0x00, 0x07,
       0x01,                          // version = 1
       0x01,                          // 1 param
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // path = "foo"
@@ -597,10 +597,10 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char setup[] = {
-      0x20, 0x0e, 0x02, 0x01, 0x02,  // versions = 1, 2
-      0x02,                          // 2 params
-      0x01, 0x03, 0x66, 0x6f, 0x6f,  // path = "foo"
-      0x01, 0x03, 0x66, 0x6f, 0x6f,  // path = "foo"
+      0x20, 0x00, 0x0e, 0x02, 0x01, 0x02,  // versions = 1, 2
+      0x02,                                // 2 params
+      0x01, 0x03, 0x66, 0x6f, 0x6f,        // path = "foo"
+      0x01, 0x03, 0x66, 0x6f, 0x6f,        // path = "foo"
   };
   stream.Receive(absl::string_view(setup, sizeof(setup)), false);
   parser.ReadAndDispatchMessages();
@@ -614,9 +614,9 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kWebTrans, &stream, visitor_);
   char setup[] = {
-      0x20, 0x09, 0x02, 0x01, 0x02,  // versions = 1, 2
-      0x01,                          // 1 param
-      0x01, 0x03, 0x66, 0x6f, 0x6f,  // path = "foo"
+      0x20, 0x00, 0x09, 0x02, 0x01, 0x02,  // versions = 1, 2
+      0x01,                                // 1 param
+      0x01, 0x03, 0x66, 0x6f, 0x6f,        // path = "foo"
   };
   stream.Receive(absl::string_view(setup, sizeof(setup)), false);
   parser.ReadAndDispatchMessages();
@@ -630,8 +630,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char setup[] = {
-      0x20, 0x04, 0x02, 0x01, 0x02,  // versions = 1, 2
-      0x00,                          // no param
+      0x20, 0x00, 0x04, 0x02, 0x01, 0x02,  // versions = 1, 2
+      0x00,                                // no param
   };
   stream.Receive(absl::string_view(setup, sizeof(setup)), false);
   parser.ReadAndDispatchMessages();
@@ -645,11 +645,11 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char setup[] = {
-      0x20, 0x0d, 0x02, 0x01, 0x02,  // versions = 1, 2
-      0x03,                          // 4 params
-      0x01, 0x03, 0x66, 0x6f, 0x6f,  // path = "foo"
-      0x02, 0x32,                    // max_subscribe_id = 50
-      0x02, 0x32,                    // max_subscribe_id = 50
+      0x20, 0x00, 0x0d, 0x02, 0x01, 0x02,  // versions = 1, 2
+      0x03,                                // 4 params
+      0x01, 0x03, 0x66, 0x6f, 0x6f,        // path = "foo"
+      0x02, 0x32,                          // max_subscribe_id = 50
+      0x02, 0x32,                          // max_subscribe_id = 50
   };
   stream.Receive(absl::string_view(setup, sizeof(setup)), false);
   parser.ReadAndDispatchMessages();
@@ -663,8 +663,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kWebTrans, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x1a, 0x01, 0x02, 0x01,
-      0x03, 0x66, 0x6f, 0x6f,        // track_namespace = "foo"
+      0x03, 0x00, 0x1a, 0x01, 0x02,
+      0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
       0x02,                          // filter_type = kLatestObject
@@ -681,8 +681,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x16, 0x01, 0x02, 0x01,
-      0x03, 0x66, 0x6f, 0x6f,        // track_namespace = "foo"
+      0x03, 0x00, 0x16, 0x01, 0x02,
+      0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
       0x02,                          // filter_type = kLatestObject
@@ -701,8 +701,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x16, 0x01, 0x02, 0x01,
-      0x03, 0x66, 0x6f, 0x6f,        // track_namespace = "foo"
+      0x03, 0x00, 0x16, 0x01, 0x02,
+      0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
       0x02,                          // filter_type = kLatestObject
@@ -721,8 +721,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x14, 0x01, 0x02, 0x01,
-      0x03, 0x66, 0x6f, 0x6f,        // track_namespace = "foo"
+      0x03, 0x00, 0x14, 0x01, 0x02,
+      0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
       0x02,                          // filter_type = kLatestObject
@@ -740,7 +740,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x18, 0x01, 0x02, 0x01, 0x03, 0x66, 0x6f,
+      0x03, 0x00, 0x18, 0x01, 0x02, 0x01, 0x03, 0x66, 0x6f,
       0x6f,                          // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
@@ -759,8 +759,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x14, 0x01, 0x02, 0x01,
-      0x03, 0x66, 0x6f, 0x6f,        // track_namespace = "foo"
+      0x03, 0x00, 0x14, 0x01, 0x02,
+      0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
       0x02,                          // filter_type = kLatestObject
@@ -779,8 +779,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x14, 0x01, 0x02, 0x01,
-      0x03, 0x66, 0x6f, 0x6f,        // track_namespace = "foo"
+      0x03, 0x00, 0x14, 0x01, 0x02,
+      0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
       0x02,                          // filter_type = kLatestObject
@@ -799,8 +799,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x16, 0x01, 0x02, 0x01, 0x03,
-      0x66, 0x6f, 0x6f,                   // track_namespace = "foo"
+      0x03, 0x00, 0x16, 0x01, 0x02, 0x01,
+      0x03, 0x66, 0x6f, 0x6f,             // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,       // track_name = "abcd"
       0x20, 0x02,                         // priority = 0x20 descending
       0x02,                               // filter_type = kLatestObject
@@ -818,11 +818,11 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kWebTrans, &stream, visitor_);
   char subscribe_ok[] = {
-      0x04, 0x11, 0x01, 0x03,  // subscribe_id = 1, expires = 3
-      0x02, 0x01,              // group_order = 2, content exists
-      0x0c, 0x14,              // largest_group_id = 12, largest_object_id = 20,
-      0x02,                    // 2 parameters
-      0x02, 0x67, 0x10,        // delivery_timeout = 10000
+      0x04, 0x00, 0x11, 0x01, 0x03,  // subscribe_id = 1, expires = 3
+      0x02, 0x01,                    // group_order = 2, content exists
+      0x0c, 0x14,        // largest_group_id = 12, largest_object_id = 20,
+      0x02,              // 2 parameters
+      0x02, 0x67, 0x10,  // delivery_timeout = 10000
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization_token = "bar"
   };
   stream.Receive(absl::string_view(subscribe_ok, sizeof(subscribe_ok)), false);
@@ -837,7 +837,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kWebTrans, &stream, visitor_);
   char subscribe_update[] = {
-      0x02, 0x0d, 0x02, 0x03, 0x01, 0x05,        // start and end sequences
+      0x02, 0x00, 0x0d, 0x02, 0x03, 0x01, 0x05,  // start and end sequences
       0xaa,                                      // priority = 0xaa
       0x01,                                      // 1 parameter
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization_token = "bar"
@@ -855,7 +855,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kWebTrans, &stream, visitor_);
   char announce[] = {
-      0x06, 0x14, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+      0x06, 0x00, 0x14, 0x01, 0x03, 0x66, 0x6f,
+      0x6f,                                      // track_namespace = "foo"
       0x02,                                      // 2 params
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization = "bar"
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization = "bar"
@@ -869,7 +870,8 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kWebTrans, &stream, visitor_);
   char announce[] = {
-      0x06, 0x10, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+      0x06, 0x00, 0x10, 0x01, 0x03, 0x66, 0x6f,
+      0x6f,                                      // track_namespace = "foo"
       0x02,                                      // 2 params
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization_info = "bar"
       0x02, 0x67, 0x10,                          // delivery_timeout = 10000
@@ -943,7 +945,7 @@
   char big_message[2 * kMaxMessageHeaderSize];
   quic::QuicDataWriter writer(sizeof(big_message), big_message);
   writer.WriteVarInt62(static_cast<uint64_t>(MoqtMessageType::kServerSetup));
-  writer.WriteVarInt62(8 + kMaxMessageHeaderSize);
+  writer.WriteUInt16(8 + kMaxMessageHeaderSize);
   writer.WriteVarInt62(0x1);                    // version
   writer.WriteVarInt62(0x1);                    // num_params
   writer.WriteVarInt62(0xbeef);                 // unknown param
@@ -961,10 +963,10 @@
 TEST_F(MoqtMessageSpecificTest, UnknownMessageType) {
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
-  char message[6];
+  char message[7];
   quic::QuicDataWriter writer(sizeof(message), message);
   writer.WriteVarInt62(0xbeef);  // unknown message type
-  writer.WriteVarInt62(0x1);     // length
+  writer.WriteUInt16(0x1);       // length
   writer.WriteVarInt62(0x1);     // payload
   stream.Receive(absl::string_view(message, writer.length()), false);
   parser.ReadAndDispatchMessages();
@@ -976,7 +978,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x15, 0x01, 0x02,        // id and alias
+      0x03, 0x00, 0x15, 0x01, 0x02,  // id and alias
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20, group order descending
@@ -998,7 +1000,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x15, 0x01, 0x02,        // id and alias
+      0x03, 0x00, 0x15, 0x01, 0x02,  // id and alias
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x08,                    // priority = 0x20 ???
@@ -1016,7 +1018,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x17, 0x01, 0x02,        // id and alias
+      0x03, 0x00, 0x17, 0x01, 0x02,  // id and alias
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
@@ -1041,7 +1043,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x18, 0x01, 0x02,        // id and alias
+      0x03, 0x00, 0x18, 0x01, 0x02,  // id and alias
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
@@ -1067,7 +1069,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x18, 0x01, 0x02,        // id and alias
+      0x03, 0x00, 0x18, 0x01, 0x02,  // id and alias
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
@@ -1088,7 +1090,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe[] = {
-      0x03, 0x13, 0x01, 0x02,        // id and alias
+      0x03, 0x00, 0x13, 0x01, 0x02,  // id and alias
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20, 0x02,                    // priority = 0x20 descending
@@ -1107,9 +1109,9 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe_update[] = {
-      0x02, 0x06, 0x02, 0x03, 0x01, 0x04,  // start and end sequences
-      0x20,                                // priority
-      0x00,                                // No parameters
+      0x02, 0x00, 0x06, 0x02, 0x03, 0x01, 0x04,  // start and end sequences
+      0x20,                                      // priority
+      0x00,                                      // No parameters
   };
   stream.Receive(absl::string_view(subscribe_update, sizeof(subscribe_update)),
                  false);
@@ -1121,10 +1123,10 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char subscribe_update[] = {
-      0x02, 0x08, 0x02, 0x03, 0x01, 0x03,  // start and end sequences
-      0x20,                                // priority
-      0x01,                                // 1 parameter
-      0x02, 0x20,                          // delivery_timeout = 32 ms
+      0x02, 0x00, 0x08, 0x02, 0x03, 0x01, 0x03,  // start and end sequences
+      0x20,                                      // priority
+      0x01,                                      // 1 parameter
+      0x02, 0x20,                                // delivery_timeout = 32 ms
   };
   stream.Receive(absl::string_view(subscribe_update, sizeof(subscribe_update)),
                  false);
@@ -1137,9 +1139,9 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char object_ack[] = {
-      0x71, 0x84, 0x05,  // type
-      0x01, 0x10, 0x20,  // subscribe ID, group, object
-      0x40, 0x81,        // -0x40 time delta
+      0x71, 0x84, 0x00, 0x05,  // type
+      0x01, 0x10, 0x20,        // subscribe ID, group, object
+      0x40, 0x81,              // -0x40 time delta
   };
   stream.Receive(absl::string_view(object_ack, sizeof(object_ack)), false);
   parser.ReadAndDispatchMessages();
@@ -1319,15 +1321,15 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char announce_ok[] = {
-      0x07, 0x03,       // type, length
-      0x01, 0x01, 'a',  // 1 namespace element
+      0x07, 0x00, 0x03,  // type, length
+      0x01, 0x01, 'a',   // 1 namespace element
   };
   stream.Receive(absl::string_view(announce_ok, sizeof(announce_ok)), false);
   parser.ReadAndDispatchMessages();
   EXPECT_EQ(visitor_.messages_received_, 1);
   EXPECT_EQ(visitor_.parsing_error_, std::nullopt);
-  announce_ok[1] -= 2;  // Remove one element.
-  announce_ok[2] = 0x00;
+  announce_ok[2] -= 2;  // Remove one element.
+  announce_ok[3] = 0x00;
   stream.Receive(absl::string_view(announce_ok, sizeof(announce_ok) - 2),
                  false);
   parser.ReadAndDispatchMessages();
@@ -1339,7 +1341,7 @@
   webtransport::test::InMemoryStream stream(/*stream_id=*/0);
   MoqtControlParser parser(kRawQuic, &stream, visitor_);
   char announce_ok[70] = {
-      0x07, 0x40, 0x41,  // type, length = 65
+      0x07, 0x00, 0x41,  // type, length = 65
       0x20,              // 32 namespace elements. This is the maximum.
   };
   for (size_t i = 4; i < sizeof(announce_ok); i = i + 2) {
diff --git a/quiche/quic/moqt/test_tools/moqt_test_message.h b/quiche/quic/moqt/test_tools/moqt_test_message.h
index 898bfd1..b0709ef 100644
--- a/quiche/quic/moqt/test_tools/moqt_test_message.h
+++ b/quiche/quic/moqt/test_tools/moqt_test_message.h
@@ -75,12 +75,12 @@
   void DecreasePayloadLengthByOne() {
     size_t length_offset =
         0x1 << ((static_cast<uint8_t>(wire_image_[0]) & 0xc0) >> 6);
-    wire_image_[length_offset]--;
+    wire_image_[length_offset + 1]--;
   }
   void IncreasePayloadLengthByOne() {
     size_t length_offset =
         0x1 << ((static_cast<uint8_t>(wire_image_[0]) & 0xc0) >> 6);
-    wire_image_[length_offset]++;
+    wire_image_[length_offset + 1]++;
     set_wire_image_size(wire_image_size_ + 1);
   }
 
@@ -92,12 +92,10 @@
 
   // Expands all the varints in the message, alternating between making them 2,
   // 4, and 8 bytes long. Updates length fields accordingly.
-  // Each character in |varints| corresponds to a byte in the original message.
+  // Each character in |varints| corresponds to a byte in the original message
+  // payload.
   // If there is a 'v', it is a varint that should be expanded. If '-', skip
   // to the next byte.
-  // Always expand the message length field (if a control message) to 2 bytes,
-  // so it's a known length that is large enough to be safe. The second byte
-  // of |varints| does not matter.
   void ExpandVarintsImpl(absl::string_view varints,
                          bool is_control_message = true) {
     int next_varint_len = 2;
@@ -105,39 +103,29 @@
     quic::QuicDataReader reader(
         absl::string_view(wire_image_, wire_image_size_));
     quic::QuicDataWriter writer(sizeof(new_wire_image), new_wire_image);
-    size_t i = 0;
     size_t length_field = 0;
     if (is_control_message) {
-      // the length will be a 16-bit varint.
-      bool nonvarint_type = false;
-      while (varints[i] == '-') {
-        ++i;
-        nonvarint_type = true;
-        uint8_t byte;
-        reader.ReadUInt8(&byte);
-        writer.WriteUInt8(byte);
-      }
-      uint64_t value;
-      if (!nonvarint_type) {
-        ++i;
-        reader.ReadVarInt62(&value);
+      uint8_t type_length = static_cast<uint8_t>(reader.PeekVarInt62Length());
+      uint64_t type;
+      reader.ReadVarInt62(&type);
+      if (type_length == 1) {
+        // Expand the message type.
+        type_length = next_varint_len;
         writer.WriteVarInt62WithForcedLength(
-            value, static_cast<quiche::QuicheVariableLengthIntegerLength>(
-                       next_varint_len));
-        next_varint_len *= 2;
-        if (next_varint_len == 16) {
-          next_varint_len = 2;
-        }
+            type, static_cast<quiche::QuicheVariableLengthIntegerLength>(
+                      type_length));
+        next_varint_len = 4;
+      } else {
+        writer.WriteVarInt62(type);
       }
-      reader.ReadVarInt62(&value);
-      ++i;
       length_field = writer.length();
-      // Write in current length as a 2B placeholder.
-      writer.WriteVarInt62WithForcedLength(
-          value, static_cast<quiche::QuicheVariableLengthIntegerLength>(2));
+      uint16_t size;
+      reader.ReadUInt16(&size);
+      writer.WriteUInt16(size);
     }
+    size_t i = 0;
     while (!reader.IsDoneReading()) {
-      if (i >= varints.length() || varints[i++] == '-') {
+      if (i >= (varints.length()) || varints[i++] == '-') {
         uint8_t byte;
         reader.ReadUInt8(&byte);
         writer.WriteUInt8(byte);
@@ -155,9 +143,10 @@
     }
     memcpy(wire_image_, new_wire_image, writer.length());
     wire_image_size_ = writer.length();
-    if (is_control_message) {
-      wire_image_[length_field + 1] =
-          static_cast<uint8_t>(writer.length() - length_field - 2);
+    if (is_control_message) {  // First byte will be empty.
+      quic::QuicDataWriter length_writer(writer.length(),
+                                         &wire_image_[length_field]);
+      length_writer.WriteUInt16(writer.length() - length_field - 2);
     }
   }
 
@@ -378,8 +367,8 @@
     if (webtrans) {
       // Should not send PATH.
       client_setup_.parameters.path = "";
-      raw_packet_[1] = 0x06;  // adjust payload length (-5)
-      raw_packet_[5] = 0x01;  // only one parameter
+      raw_packet_[2] = 0x06;  // adjust payload length (-5)
+      raw_packet_[6] = 0x01;  // only one parameter
       SetWireImage(raw_packet_, sizeof(raw_packet_) - 5);
     } else {
       SetWireImage(raw_packet_, sizeof(raw_packet_));
@@ -409,9 +398,9 @@
 
   void ExpandVarints() override {
     if (!client_setup_.parameters.path.empty()) {
-      ExpandVarintsImpl("vvvvvvvvvv---");
+      ExpandVarintsImpl("vvvvvvvv---");
     } else {
-      ExpandVarintsImpl("vvvvvvvv");
+      ExpandVarintsImpl("vvvvvv");
     }
   }
 
@@ -420,8 +409,8 @@
   }
 
  private:
-  uint8_t raw_packet_[13] = {
-      0x20, 0x0b,                    // type
+  uint8_t raw_packet_[14] = {
+      0x20, 0x00, 0x0b,              // type
       0x02, 0x01, 0x02,              // versions
       0x02,                          // 2 parameters
       0x02, 0x32,                    // max_request_id = 50
@@ -450,17 +439,17 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvvvv"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vvvv"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(server_setup_);
   }
 
  private:
-  uint8_t raw_packet_[6] = {
-      0x21, 0x04,  // type
-      0x01, 0x01,  // version, one parameter
-      0x02, 0x32,  // max_request_id = 50
+  uint8_t raw_packet_[7] = {
+      0x21, 0x00, 0x04,  // type
+      0x01, 0x01,        // version, one parameter
+      0x02, 0x32,        // max_subscribe_id = 50
   };
   MoqtServerSetup server_setup_ = {
       /*selected_version=*/static_cast<MoqtVersion>(1),
@@ -512,7 +501,7 @@
   }
 
   void ExpandVarints() override {
-    ExpandVarintsImpl("vvvvvv---v------vvvvv--vv-----");
+    ExpandVarintsImpl("vvvv---v------vvvvv--vv-----");
   }
 
   MessageStructuredData structured_data() const override {
@@ -520,8 +509,8 @@
   }
 
  private:
-  uint8_t raw_packet_[30] = {
-      0x03, 0x1c, 0x01, 0x02,        // id and alias
+  uint8_t raw_packet_[31] = {
+      0x03, 0x00, 0x1c, 0x01, 0x02,  // id and alias
       0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
       0x20,                          // subscriber priority = 0x20
@@ -579,30 +568,30 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv--vvvv--v--"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv--vvvv--v--"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(subscribe_ok_);
   }
 
   void SetInvalidContentExists() {
-    raw_packet_[5] = 0x02;
+    raw_packet_[6] = 0x02;
     SetWireImage(raw_packet_, sizeof(raw_packet_));
   }
 
   void SetInvalidDeliveryOrder() {
-    raw_packet_[4] = 0x10;
+    raw_packet_[5] = 0x10;
     SetWireImage(raw_packet_, sizeof(raw_packet_));
   }
 
  private:
-  uint8_t raw_packet_[15] = {
-      0x04, 0x0d, 0x01, 0x03,  // subscribe_id = 1, expires = 3
-      0x02, 0x01,              // group_order = 2, content exists
-      0x0c, 0x14,              // largest_group_id = 12, largest_object_id = 20,
-      0x02,                    // 2 parameters
-      0x02, 0x67, 0x10,        // delivery_timeout = 10000
-      0x04, 0x67, 0x10,        // max_cache_duration = 10000
+  uint8_t raw_packet_[16] = {
+      0x04, 0x00, 0x0d, 0x01, 0x03,  // subscribe_id = 1, expires = 3
+      0x02, 0x01,                    // group_order = 2, content exists
+      0x0c, 0x14,        // largest_group_id = 12, largest_object_id = 20,
+      0x02,              // 2 parameters
+      0x02, 0x67, 0x10,  // delivery_timeout = 10000
+      0x04, 0x67, 0x10,  // max_cache_duration = 10000
   };
 
   MoqtSubscribeOk subscribe_ok_ = {
@@ -642,15 +631,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvvv---v"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vvv---v"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(subscribe_error_);
   }
 
  private:
-  uint8_t raw_packet_[9] = {
-      0x05, 0x07,
+  uint8_t raw_packet_[10] = {
+      0x05, 0x00, 0x07,
       0x02,                    // subscribe_id = 2
       0x05,                    // error_code = 5
       0x03, 0x62, 0x61, 0x72,  // reason_phrase = "bar"
@@ -680,15 +669,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvv"); }
+  void ExpandVarints() override { ExpandVarintsImpl("v"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(unsubscribe_);
   }
 
  private:
-  uint8_t raw_packet_[3] = {
-      0x0a, 0x01, 0x03,  // subscribe_id = 3
+  uint8_t raw_packet_[4] = {
+      0x0a, 0x00, 0x01, 0x03,  // subscribe_id = 3
   };
 
   MoqtUnsubscribe unsubscribe_ = {
@@ -724,17 +713,17 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvvvv--"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vvvv--"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(subscribe_done_);
   }
 
  private:
-  uint8_t raw_packet_[8] = {
-      0x0b, 0x06, 0x02, 0x02,  // subscribe_id = 2, error_code = 2,
-      0x05,                    // stream_count = 5
-      0x02, 0x68, 0x69,        // reason_phrase = "hi"
+  uint8_t raw_packet_[9] = {
+      0x0b, 0x00, 0x06, 0x02, 0x02,  // subscribe_id = 2, error_code = 2,
+      0x05,                          // stream_count = 5
+      0x02, 0x68, 0x69,              // reason_phrase = "hi"
   };
 
   MoqtSubscribeDone subscribe_done_ = {
@@ -776,18 +765,18 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvvvv-vv--"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vvvv-vv--"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(subscribe_update_);
   }
 
  private:
-  uint8_t raw_packet_[11] = {
-      0x02, 0x09, 0x02, 0x03, 0x01, 0x05,  // start and end sequences
-      0xaa,                                // subscriber_priority
-      0x01,                                // 1 parameter
-      0x02, 0x67, 0x10,                    // delivery_timeout = 10000
+  uint8_t raw_packet_[12] = {
+      0x02, 0x00, 0x09, 0x02, 0x03, 0x01, 0x05,  // start and end sequences
+      0xaa,                                      // subscriber_priority
+      0x01,                                      // 1 parameter
+      0x02, 0x67, 0x10,                          // delivery_timeout = 10000
   };
 
   MoqtSubscribeUpdate subscribe_update_ = {
@@ -819,15 +808,16 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---vvv-----"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---vvv-----"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(announce_);
   }
 
  private:
-  uint8_t raw_packet_[15] = {
-      0x06, 0x0d, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+  uint8_t raw_packet_[16] = {
+      0x06, 0x00, 0x0d, 0x01, 0x03, 0x66, 0x6f,
+      0x6f,                                      // track_namespace = "foo"
       0x01,                                      // 1 parameter
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization_tag = "bar"
   };
@@ -853,15 +843,16 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(announce_ok_);
   }
 
  private:
-  uint8_t raw_packet_[7] = {
-      0x07, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+  uint8_t raw_packet_[8] = {
+      0x07, 0x00, 0x05, 0x01,
+      0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
   };
 
   MoqtAnnounceOk announce_ok_ = {
@@ -892,17 +883,18 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---vv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---vv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(announce_error_);
   }
 
  private:
-  uint8_t raw_packet_[12] = {
-      0x08, 0x0a, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
-      0x03,                                      // error_code = 3
-      0x03, 0x62, 0x61, 0x72,                    // reason_phrase = "bar"
+  uint8_t raw_packet_[13] = {
+      0x08, 0x00, 0x0a, 0x01,
+      0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+      0x03,                    // error_code = 3
+      0x03, 0x62, 0x61, 0x72,  // reason_phrase = "bar"
   };
 
   MoqtAnnounceError announce_error_ = {
@@ -935,17 +927,18 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---vv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---vv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(announce_cancel_);
   }
 
  private:
-  uint8_t raw_packet_[12] = {
-      0x0c, 0x0a, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
-      0x03,                                      // error_code = 3
-      0x03, 0x62, 0x61, 0x72,                    // reason_phrase = "bar"
+  uint8_t raw_packet_[13] = {
+      0x0c, 0x00, 0x0a, 0x01,
+      0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+      0x03,                    // error_code = 3
+      0x03, 0x62, 0x61, 0x72,  // reason_phrase = "bar"
   };
 
   MoqtAnnounceCancel announce_cancel_ = {
@@ -974,15 +967,16 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---v----vvv-----"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---v----vvv-----"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(track_status_request_);
   }
 
  private:
-  uint8_t raw_packet_[20] = {
-      0x0d, 0x12, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+  uint8_t raw_packet_[21] = {
+      0x0d, 0x00, 0x12, 0x01, 0x03, 0x66, 0x6f,
+      0x6f,                                      // track_namespace = "foo"
       0x04, 0x61, 0x62, 0x63, 0x64,              // track_name = "abcd"
       0x01,                                      // 1 parameter
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization_tag = "bar"
@@ -1009,15 +1003,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(unannounce_);
   }
 
  private:
-  uint8_t raw_packet_[7] = {
-      0x09, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace
+  uint8_t raw_packet_[8] = {
+      0x09, 0x00, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace
   };
 
   MoqtUnannounce unannounce_ = {
@@ -1056,20 +1050,21 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---v----vvvvv--v--"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---v----vvvvv--v--"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(track_status_);
   }
 
  private:
-  uint8_t raw_packet_[22] = {
-      0x0e, 0x14, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
-      0x04, 0x61, 0x62, 0x63, 0x64,              // track_name = "abcd"
-      0x00, 0x0c, 0x14,  // status, last_group, last_object
-      0x02,              // 2 parameters
-      0x02, 0x67, 0x10,  // Delivery Timeout = 10000
-      0x04, 0x67, 0x10,  // Max Cache Duration = 10000
+  uint8_t raw_packet_[23] = {
+      0x0e, 0x00, 0x14, 0x01, 0x03,
+      0x66, 0x6f, 0x6f,              // track_namespace = "foo"
+      0x04, 0x61, 0x62, 0x63, 0x64,  // track_name = "abcd"
+      0x00, 0x0c, 0x14,              // status, last_group, last_object
+      0x02,                          // 2 parameters
+      0x02, 0x67, 0x10,              // Delivery Timeout = 10000
+      0x04, 0x67, 0x10,              // Max Cache Duration = 10000
   };
 
   MoqtTrackStatus track_status_ = {
@@ -1097,15 +1092,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("v---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(goaway_);
   }
 
  private:
-  uint8_t raw_packet_[6] = {
-      0x10, 0x04, 0x03, 0x66, 0x6f, 0x6f,
+  uint8_t raw_packet_[7] = {
+      0x10, 0x00, 0x04, 0x03, 0x66, 0x6f, 0x6f,
   };
 
   MoqtGoAway goaway_ = {
@@ -1132,16 +1127,16 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---vvv-----"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---vvv-----"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(subscribe_namespace_);
   }
 
  private:
-  uint8_t raw_packet_[15] = {
-      0x11, 0x0d, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // namespace = "foo"
-      0x01,                                      // 1 parameter
+  uint8_t raw_packet_[16] = {
+      0x11, 0x00, 0x0d, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // namespace = "foo"
+      0x01,                                            // 1 parameter
       0x01, 0x05, 0x03, 0x00, 0x62, 0x61, 0x72,  // authorization_tag = "bar"
   };
 
@@ -1166,15 +1161,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(subscribe_namespace_ok_);
   }
 
  private:
-  uint8_t raw_packet_[7] = {
-      0x12, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // namespace = "foo"
+  uint8_t raw_packet_[8] = {
+      0x12, 0x00, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // namespace = "foo"
   };
 
   MoqtSubscribeAnnouncesOk subscribe_namespace_ok_ = {
@@ -1205,17 +1200,18 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---vv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---vv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(subscribe_namespace_error_);
   }
 
  private:
-  uint8_t raw_packet_[12] = {
-      0x13, 0x0a, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
-      0x01,                                      // error_code = 1
-      0x03, 0x62, 0x61, 0x72,                    // reason_phrase = "bar"
+  uint8_t raw_packet_[13] = {
+      0x13, 0x00, 0x0a, 0x01,
+      0x03, 0x66, 0x6f, 0x6f,  // track_namespace = "foo"
+      0x01,                    // error_code = 1
+      0x03, 0x62, 0x61, 0x72,  // reason_phrase = "bar"
   };
 
   MoqtSubscribeAnnouncesError subscribe_namespace_error_ = {
@@ -1240,15 +1236,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(unsubscribe_namespace_);
   }
 
  private:
-  uint8_t raw_packet_[7] = {
-      0x14, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace
+  uint8_t raw_packet_[8] = {
+      0x14, 0x00, 0x05, 0x01, 0x03, 0x66, 0x6f, 0x6f,  // track_namespace
   };
 
   MoqtUnsubscribeAnnounces unsubscribe_namespace_ = {
@@ -1271,15 +1267,16 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvv"); }
+  void ExpandVarints() override { ExpandVarintsImpl("v"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(max_request_id_);
   }
 
  private:
-  uint8_t raw_packet_[3] = {
+  uint8_t raw_packet_[4] = {
       0x15,
+      0x00,
       0x01,
       0x0b,
   };
@@ -1349,7 +1346,7 @@
   }
 
   void ExpandVarints() override {
-    ExpandVarintsImpl("vvv--vvv---v---vvvvvv-----");
+    ExpandVarintsImpl("v--vvv---v---vvvvvv-----");
   }
 
   MessageStructuredData structured_data() const override {
@@ -1362,19 +1359,19 @@
     QUICHE_CHECK(!object.has_value() || *object < 64);
     fetch_.end_group = group;
     fetch_.end_object = object;
-    raw_packet_[17] = group;
-    raw_packet_[18] = object.has_value() ? (*object + 1) : 0;
+    raw_packet_[18] = group;
+    raw_packet_[19] = object.has_value() ? (*object + 1) : 0;
     SetWireImage(raw_packet_, sizeof(raw_packet_));
   }
 
   void SetGroupOrder(uint8_t group_order) {
-    raw_packet_[4] = static_cast<uint8_t>(group_order);
+    raw_packet_[5] = static_cast<uint8_t>(group_order);
     SetWireImage(raw_packet_, sizeof(raw_packet_));
   }
 
  private:
-  uint8_t raw_packet_[27] = {
-      0x16, 0x19,
+  uint8_t raw_packet_[28] = {
+      0x16, 0x00, 0x19,
       0x01,                          // fetch_id = 1
       0x02,                          // priority = kHigh
       0x01,                          // group_order = kAscending
@@ -1461,7 +1458,7 @@
   }
 
   void ExpandVarints() override {
-    ExpandVarintsImpl("vvv--vvv---v---vvvvvv-----");
+    ExpandVarintsImpl("v--vvv---v---vvvvvv-----");
   }
 
   MessageStructuredData structured_data() const override {
@@ -1469,13 +1466,13 @@
   }
 
   void SetGroupOrder(uint8_t group_order) {
-    raw_packet_[4] = static_cast<uint8_t>(group_order);
+    raw_packet_[5] = static_cast<uint8_t>(group_order);
     SetWireImage(raw_packet_, sizeof(raw_packet_));
   }
 
  private:
-  uint8_t raw_packet_[16] = {
-      0x16, 0x0e,
+  uint8_t raw_packet_[17] = {
+      0x16, 0x00, 0x0e,
       0x01,        // fetch_id = 1
       0x02,        // priority = kHigh
       0x01,        // group_order = kAscending
@@ -1512,15 +1509,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvv"); }
+  void ExpandVarints() override { ExpandVarintsImpl("v"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(fetch_cancel_);
   }
 
  private:
-  uint8_t raw_packet_[3] = {
-      0x17, 0x01,
+  uint8_t raw_packet_[4] = {
+      0x17, 0x00, 0x01,
       0x01,  // subscribe_id = 1
   };
 
@@ -1555,15 +1552,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvv-vvvvv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("v-vvvvv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(fetch_ok_);
   }
 
  private:
-  uint8_t raw_packet_[10] = {
-      0x18, 0x08,
+  uint8_t raw_packet_[11] = {
+      0x18, 0x00, 0x08,
       0x01,                    // subscribe_id = 1
       0x01,                    // group_order = kAscending
       0x05, 0x04,              // largest_object = 5, 4
@@ -1601,15 +1598,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvvv---"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vvv---"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(fetch_error_);
   }
 
  private:
-  uint8_t raw_packet_[8] = {
-      0x19, 0x06,
+  uint8_t raw_packet_[9] = {
+      0x19, 0x00, 0x06,
       0x01,                    // subscribe_id = 1
       0x01,                    // error_code = kUnauthorized
       0x03, 0x62, 0x61, 0x72,  // reason_phrase = "bar"
@@ -1636,15 +1633,15 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvv"); }
+  void ExpandVarints() override { ExpandVarintsImpl("v"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(requests_blocked_);
   }
 
  private:
-  uint8_t raw_packet_[3] = {
-      0x1a, 0x01,
+  uint8_t raw_packet_[4] = {
+      0x1a, 0x00, 0x01,
       0x0b,  // max_request_id = 11
   };
 
@@ -1680,17 +1677,17 @@
     return true;
   }
 
-  void ExpandVarints() override { ExpandVarintsImpl("vvvvvv"); }
+  void ExpandVarints() override { ExpandVarintsImpl("vvvv"); }
 
   MessageStructuredData structured_data() const override {
     return TestMessageBase::MessageStructuredData(object_ack_);
   }
 
  private:
-  uint8_t raw_packet_[7] = {
-      0x71, 0x84, 0x04,  // type
-      0x01, 0x10, 0x20,  // subscribe ID, group, object
-      0x20,              // 0x10 time delta
+  uint8_t raw_packet_[8] = {
+      0x71, 0x84, 0x00, 0x04,  // type
+      0x01, 0x10, 0x20,        // subscribe ID, group, object
+      0x20,                    // 0x10 time delta
   };
 
   MoqtObjectAck object_ack_ = {
