diff --git a/quiche/http2/core/spdy_frame_builder.h b/quiche/http2/core/spdy_frame_builder.h
index ee879a4..5628753 100644
--- a/quiche/http2/core/spdy_frame_builder.h
+++ b/quiche/http2/core/spdy_frame_builder.h
@@ -135,6 +135,335 @@
   size_t offset_;    // Position at which the latest frame begins.
 };
 
+// Packs the exclusive dependency bit (bit 31) and the 31-bit parent stream ID
+// into a single 32-bit unsigned integer in network wire format for PRIORITY and
+// HEADERS frames.
+inline uint32_t PackStreamDependencyValues(bool exclusive,
+                                           SpdyStreamId parent_stream_id) {
+  uint32_t parent = parent_stream_id & 0x7fffffff;
+  uint32_t e_bit = exclusive ? 0x80000000 : 0;
+  return parent | e_bit;
+}
+
+inline bool SerializeDataFrame(const DataFrame& frame,
+                               SpdyFrameBuilder& builder) {
+  uint8_t flags = frame.flags;
+  if (frame.fin()) {
+    flags |= DATA_FLAG_FIN;
+  }
+  if (frame.padded()) {
+    flags |= DATA_FLAG_PADDED;
+  }
+  size_t payload_len = frame.data.size() +
+                       (frame.padded() ? (1 + frame.padding_payload_len) : 0);
+  if (!builder.BeginNewFrame(SpdyFrameType::DATA, flags, frame.stream_id,
+                             payload_len)) {
+    return false;
+  }
+  if (frame.padded()) {
+    if (!builder.WriteUInt8(frame.padding_payload_len)) {
+      return false;
+    }
+  }
+  if (!builder.WriteBytes(frame.data.data(), frame.data.size())) {
+    return false;
+  }
+  if (frame.padded() && frame.padding_payload_len > 0) {
+    std::string padding(frame.padding_payload_len, 0);
+    if (!builder.WriteBytes(padding.data(), padding.length())) {
+      return false;
+    }
+  }
+  return true;
+}
+
+inline bool SerializeHeadersFrame(const HeadersFrame& frame,
+                                  SpdyFrameBuilder& builder) {
+  uint8_t flags = frame.flags;
+  if (frame.fin()) {
+    flags |= CONTROL_FLAG_FIN;
+  }
+  if (frame.end_headers()) {
+    flags |= HEADERS_FLAG_END_HEADERS;
+  }
+  if (frame.padded()) {
+    flags |= HEADERS_FLAG_PADDED;
+  }
+  if (frame.has_priority) {
+    flags |= HEADERS_FLAG_PRIORITY;
+  }
+  size_t payload_len = frame.hpack_block.size() +
+                       (frame.padded() ? (1 + frame.padding_payload_len) : 0) +
+                       (frame.has_priority ? 5 : 0);
+  if (!builder.BeginNewFrame(SpdyFrameType::HEADERS, flags, frame.stream_id,
+                             payload_len)) {
+    return false;
+  }
+  if (frame.padded()) {
+    if (!builder.WriteUInt8(frame.padding_payload_len)) {
+      return false;
+    }
+  }
+  if (frame.has_priority) {
+    int weight = ClampHttp2Weight(frame.priority.weight);
+    if (!builder.WriteUInt32(PackStreamDependencyValues(
+            frame.priority.exclusive, frame.priority.parent_stream_id))) {
+      return false;
+    }
+    if (!builder.WriteUInt8(static_cast<uint8_t>(weight - 1))) {
+      return false;
+    }
+  }
+  if (!builder.WriteBytes(frame.hpack_block.data(), frame.hpack_block.size())) {
+    return false;
+  }
+  if (frame.padded() && frame.padding_payload_len > 0) {
+    std::string padding(frame.padding_payload_len, 0);
+    if (!builder.WriteBytes(padding.data(), padding.length())) {
+      return false;
+    }
+  }
+  return true;
+}
+
+inline bool SerializePriorityFrame(const PriorityFrame& frame,
+                                   SpdyFrameBuilder& builder) {
+  if (!builder.BeginNewFrame(SpdyFrameType::PRIORITY, 0, frame.stream_id, 5)) {
+    return false;
+  }
+  int weight = ClampHttp2Weight(frame.priority.weight);
+  if (!builder.WriteUInt32(PackStreamDependencyValues(
+          frame.priority.exclusive, frame.priority.parent_stream_id))) {
+    return false;
+  }
+  return builder.WriteUInt8(static_cast<uint8_t>(weight - 1));
+}
+
+inline bool SerializeRstStreamFrame(const RstStreamFrame& frame,
+                                    SpdyFrameBuilder& builder) {
+  if (!builder.BeginNewFrame(SpdyFrameType::RST_STREAM, 0, frame.stream_id,
+                             4)) {
+    return false;
+  }
+  return builder.WriteUInt32(static_cast<uint32_t>(frame.error_code));
+}
+
+inline bool SerializeSettingsFrame(const SettingsFrame& frame,
+                                   SpdyFrameBuilder& builder) {
+  uint8_t flags = frame.is_ack ? SETTINGS_FLAG_ACK : 0;
+  size_t payload_len =
+      frame.is_ack ? 0 : (frame.values.size() * kSettingsOneSettingSize);
+  if (!builder.BeginNewFrame(SpdyFrameType::SETTINGS, flags, 0, payload_len)) {
+    return false;
+  }
+  if (!frame.is_ack) {
+    for (const auto& param : frame.values) {
+      if (!builder.WriteUInt16(param.id) || !builder.WriteUInt32(param.value)) {
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
+inline bool SerializePushPromiseFrame(const PushPromiseFrame& frame,
+                                      SpdyFrameBuilder& builder) {
+  uint8_t flags = frame.flags;
+  if (frame.end_headers()) {
+    flags |= PUSH_PROMISE_FLAG_END_PUSH_PROMISE;
+  }
+  if (frame.padded()) {
+    flags |= PUSH_PROMISE_FLAG_PADDED;
+  }
+  size_t payload_len = 4 + frame.hpack_block.size() +
+                       (frame.padded() ? (1 + frame.padding_payload_len) : 0);
+  if (!builder.BeginNewFrame(SpdyFrameType::PUSH_PROMISE, flags,
+                             frame.stream_id, payload_len)) {
+    return false;
+  }
+  if (frame.padded()) {
+    if (!builder.WriteUInt8(frame.padding_payload_len)) {
+      return false;
+    }
+  }
+  if (!builder.WriteUInt32(frame.promised_stream_id & 0x7fffffff)) {
+    return false;
+  }
+  if (!builder.WriteBytes(frame.hpack_block.data(), frame.hpack_block.size())) {
+    return false;
+  }
+  if (frame.padded() && frame.padding_payload_len > 0) {
+    std::string padding(frame.padding_payload_len, 0);
+    if (!builder.WriteBytes(padding.data(), padding.length())) {
+      return false;
+    }
+  }
+  return true;
+}
+
+inline bool SerializePingFrame(const PingFrame& frame,
+                               SpdyFrameBuilder& builder) {
+  uint8_t flags = frame.is_ack ? PING_FLAG_ACK : 0;
+  if (!builder.BeginNewFrame(SpdyFrameType::PING, flags, 0, 8)) {
+    return false;
+  }
+  return builder.WriteUInt64(frame.opaque_data);
+}
+
+inline bool SerializeGoAwayFrame(const GoAwayFrame& frame,
+                                 SpdyFrameBuilder& builder) {
+  size_t payload_len = 8 + frame.debug_data.size();
+  if (!builder.BeginNewFrame(SpdyFrameType::GOAWAY, 0, 0, payload_len)) {
+    return false;
+  }
+  if (!builder.WriteUInt32(frame.last_good_stream_id & 0x7fffffff)) {
+    return false;
+  }
+  if (!builder.WriteUInt32(static_cast<uint32_t>(frame.error_code))) {
+    return false;
+  }
+  if (!frame.debug_data.empty()) {
+    if (!builder.WriteBytes(frame.debug_data.data(), frame.debug_data.size())) {
+      return false;
+    }
+  }
+  return true;
+}
+
+inline bool SerializeWindowUpdateFrame(const WindowUpdateFrame& frame,
+                                       SpdyFrameBuilder& builder) {
+  if (!builder.BeginNewFrame(SpdyFrameType::WINDOW_UPDATE, 0, frame.stream_id,
+                             4)) {
+    return false;
+  }
+  return builder.WriteUInt32(frame.delta & 0x7fffffff);
+}
+
+inline bool SerializeContinuationFrame(const ContinuationFrame& frame,
+                                       SpdyFrameBuilder& builder) {
+  uint8_t flags = frame.flags;
+  if (frame.end_headers()) {
+    flags |= HEADERS_FLAG_END_HEADERS;
+  }
+  if (!builder.BeginNewFrame(SpdyFrameType::CONTINUATION, flags,
+                             frame.stream_id, frame.hpack_block.size())) {
+    return false;
+  }
+  return builder.WriteBytes(frame.hpack_block.data(), frame.hpack_block.size());
+}
+
+inline bool SerializeAltSvcFrame(const AltSvcFrame& frame,
+                                 SpdyFrameBuilder& builder) {
+  size_t payload_len = 2 + frame.origin.size() + frame.value.size();
+  if (!builder.BeginNewFrame(SpdyFrameType::ALTSVC, 0, frame.stream_id,
+                             payload_len)) {
+    return false;
+  }
+  if (!builder.WriteUInt16(frame.origin.size())) {
+    return false;
+  }
+  if (!builder.WriteBytes(frame.origin.data(), frame.origin.size())) {
+    return false;
+  }
+  return builder.WriteBytes(frame.value.data(), frame.value.size());
+}
+
+inline bool SerializePriorityUpdateFrame(const PriorityUpdateFrame& frame,
+                                         SpdyFrameBuilder& builder) {
+  size_t payload_len = 4 + frame.priority_field_value.size();
+  if (!builder.BeginNewFrame(SpdyFrameType::PRIORITY_UPDATE, 0, 0,
+                             payload_len)) {
+    return false;
+  }
+  if (!builder.WriteUInt32(frame.prioritized_stream_id & 0x7fffffff)) {
+    return false;
+  }
+  return builder.WriteBytes(frame.priority_field_value.data(),
+                            frame.priority_field_value.size());
+}
+
+inline bool SerializeAcceptChFrame(const AcceptChFrame& frame,
+                                   SpdyFrameBuilder& builder) {
+  size_t payload_len = 0;
+  for (size_t i = 0; i < frame.num_entries && i < frame.entries.size(); ++i) {
+    payload_len +=
+        4 + frame.entries[i].origin.size() + frame.entries[i].value.size();
+  }
+  if (!builder.BeginNewFrame(SpdyFrameType::ACCEPT_CH, 0, 0, payload_len)) {
+    return false;
+  }
+  for (size_t i = 0; i < frame.num_entries && i < frame.entries.size(); ++i) {
+    if (!builder.WriteUInt16(frame.entries[i].origin.size()) ||
+        !builder.WriteBytes(frame.entries[i].origin.data(),
+                            frame.entries[i].origin.size()) ||
+        !builder.WriteUInt16(frame.entries[i].value.size()) ||
+        !builder.WriteBytes(frame.entries[i].value.data(),
+                            frame.entries[i].value.size())) {
+      return false;
+    }
+  }
+  return true;
+}
+
+inline bool SerializeUnknownFrame(const UnknownFrame& frame,
+                                  SpdyFrameBuilder& builder) {
+  // Handles other unknown frame types, where the payload is opaque.
+  if (!builder.BeginNewUncheckedFrame(frame.type, frame.flags, frame.stream_id,
+                                      frame.payload.size())) {
+    return false;
+  }
+  return builder.WriteBytes(frame.payload.data(), frame.payload.size());
+}
+
+// Serializes a strongly-typed HTTP/2 frame representation directly into the
+// provided `SpdyFrameBuilder`.
+//
+// This generic template writes HTTP/2 wire-format frames (RFC 9113) without
+// allocating intermediate heap objects. Returns true on success, or false if
+// the buffer cannot accommodate the frame or serialization fails.
+template <Http2FrameConcept T>
+bool SerializeFrame(const T& frame, SpdyFrameBuilder& builder) {
+  if constexpr (std::is_same_v<T, DataFrame>) {
+    return SerializeDataFrame(frame, builder);
+  } else if constexpr (std::is_same_v<T, HeadersFrame>) {
+    return SerializeHeadersFrame(frame, builder);
+  } else if constexpr (std::is_same_v<T, PriorityFrame>) {
+    return SerializePriorityFrame(frame, builder);
+  } else if constexpr (std::is_same_v<T, RstStreamFrame>) {
+    return SerializeRstStreamFrame(frame, builder);
+  } else if constexpr (std::is_same_v<T, SettingsFrame>) {
+    return SerializeSettingsFrame(frame, builder);
+  } else if constexpr (std::is_same_v<T, PushPromiseFrame>) {
+    return SerializePushPromiseFrame(frame, builder);
+  } else if constexpr (std::is_same_v<T, PingFrame>) {
+    return SerializePingFrame(frame, builder);
+  } else if constexpr (std::is_same_v<T, GoAwayFrame>) {
+    return SerializeGoAwayFrame(frame, builder);
+  } else if constexpr (std::is_same_v<T, WindowUpdateFrame>) {
+    return SerializeWindowUpdateFrame(frame, builder);
+  } else if constexpr (std::is_same_v<T, ContinuationFrame>) {
+    return SerializeContinuationFrame(frame, builder);
+  } else if constexpr (std::is_same_v<T, AltSvcFrame>) {
+    return SerializeAltSvcFrame(frame, builder);
+  } else if constexpr (std::is_same_v<T, PriorityUpdateFrame>) {
+    return SerializePriorityUpdateFrame(frame, builder);
+  } else if constexpr (std::is_same_v<T, AcceptChFrame>) {
+    return SerializeAcceptChFrame(frame, builder);
+  } else if constexpr (std::is_same_v<T, UnknownFrame>) {
+    return SerializeUnknownFrame(frame, builder);
+  }
+  return false;
+}
+
+// Serializes a unified `SpdyFrame` variant (containing any standard-layout
+// HTTP/2 frame type) into the provided `SpdyFrameBuilder` using `std::visit`.
+// Returns true on success, or false if serialization fails.
+inline bool SerializeSpdyFrame(const SpdyFrame& frame,
+                               SpdyFrameBuilder& builder) {
+  return std::visit(
+      [&builder](const auto& f) { return SerializeFrame(f, builder); }, frame);
+}
+
 }  // namespace spdy
 
 #endif  // QUICHE_HTTP2_CORE_SPDY_FRAME_BUILDER_H_
diff --git a/quiche/http2/core/spdy_framer.cc b/quiche/http2/core/spdy_framer.cc
index 9f400c4..699eb96 100644
--- a/quiche/http2/core/spdy_framer.cc
+++ b/quiche/http2/core/spdy_framer.cc
@@ -27,17 +27,6 @@
 
 namespace {
 
-// Pack parent stream ID and exclusive flag into the format used by HTTP/2
-// headers and priority frames.
-uint32_t PackStreamDependencyValues(bool exclusive,
-                                    SpdyStreamId parent_stream_id) {
-  // Make sure the highest-order bit in the parent stream id is zeroed out.
-  uint32_t parent = parent_stream_id & 0x7fffffff;
-  // Set the one-bit exclusivity flag.
-  uint32_t e_bit = exclusive ? 0x80000000 : 0;
-  return parent | e_bit;
-}
-
 // Used to indicate no flags in a HTTP2 flags field.
 const uint8_t kNoFlags = 0;
 
diff --git a/quiche/http2/core/spdy_protocol.h b/quiche/http2/core/spdy_protocol.h
index a5ec174..d074786 100644
--- a/quiche/http2/core/spdy_protocol.h
+++ b/quiche/http2/core/spdy_protocol.h
@@ -9,6 +9,8 @@
 #ifndef QUICHE_HTTP2_CORE_SPDY_PROTOCOL_H_
 #define QUICHE_HTTP2_CORE_SPDY_PROTOCOL_H_
 
+#include <array>
+#include <concepts>
 #include <cstddef>
 #include <cstdint>
 #include <cstring>
@@ -17,10 +19,12 @@
 #include <memory>
 #include <optional>
 #include <string>
+#include <type_traits>
 #include <utility>
 #include <variant>
 #include <vector>
 
+#include "absl/container/inlined_vector.h"
 #include "absl/strings/string_view.h"
 #include "quiche/http2/core/spdy_alt_svc_wire_format.h"
 #include "quiche/http2/core/spdy_bitmasks.h"
@@ -447,6 +451,367 @@
 
 typedef StreamPrecedence<SpdyStreamId> SpdyStreamPrecedence;
 
+// =============================================================================
+// Value-Semantic POD Frame Structs
+// =============================================================================
+
+// Contains the fields specific to any priority-conveying frames.
+struct QUICHE_EXPORT PriorityFields {
+  SpdyStreamId parent_stream_id = 0;
+  uint16_t weight = kHttp2DefaultStreamWeight;
+  bool exclusive = false;
+  constexpr bool operator==(const PriorityFields&) const = default;
+};
+
+// A container for a single SETTINGS field.
+struct QUICHE_EXPORT SettingParameter {
+  SpdySettingsId id = 0;
+  uint32_t value = 0;
+  constexpr bool operator==(const SettingParameter&) const = default;
+};
+
+// A container for a single ACCEPT_CH entry.
+struct QUICHE_EXPORT AcceptChEntryView {
+  absl::string_view origin;
+  absl::string_view value;
+  constexpr bool operator==(const AcceptChEntryView&) const = default;
+};
+
+struct QUICHE_EXPORT DataFrame {
+  SpdyStreamId stream_id = 0;
+  uint8_t flags = 0;
+  uint8_t padding_payload_len = 0;
+  absl::string_view data;
+
+  constexpr bool HasFin() const { return (flags & DATA_FLAG_FIN) != 0; }
+  ABSL_DEPRECATED("Use HasFin() instead.") constexpr bool fin() const {
+    return HasFin();
+  }
+  constexpr bool IsPadded() const {
+    return (flags & DATA_FLAG_PADDED) != 0 || padding_payload_len > 0;
+  }
+  ABSL_DEPRECATED("Use IsPadded() instead.") constexpr bool padded() const {
+    return IsPadded();
+  }
+  constexpr bool operator==(const DataFrame&) const = default;
+};
+static_assert(sizeof(DataFrame) == (sizeof(void*) == 8 ? 24 : 16));
+
+struct QUICHE_EXPORT HeadersFrame {
+  SpdyStreamId stream_id = 0;
+  uint8_t flags = 0;
+  uint8_t padding_payload_len = 0;
+  bool has_priority = false;
+  PriorityFields priority{};
+  absl::string_view hpack_block;
+
+  constexpr bool HasFin() const { return (flags & CONTROL_FLAG_FIN) != 0; }
+  ABSL_DEPRECATED("Use HasFin() instead.") constexpr bool fin() const {
+    return HasFin();
+  }
+  constexpr bool HasEndHeaders() const {
+    return (flags & HEADERS_FLAG_END_HEADERS) != 0;
+  }
+  ABSL_DEPRECATED("Use HasEndHeaders() instead.")
+  constexpr bool end_headers() const { return HasEndHeaders(); }
+  constexpr bool IsPadded() const {
+    return (flags & HEADERS_FLAG_PADDED) != 0 || padding_payload_len > 0;
+  }
+  ABSL_DEPRECATED("Use IsPadded() instead.") constexpr bool padded() const {
+    return IsPadded();
+  }
+  constexpr bool operator==(const HeadersFrame&) const = default;
+};
+static_assert(sizeof(HeadersFrame) == (sizeof(void*) == 8 ? 32 : 24));
+
+struct QUICHE_EXPORT PriorityFrame {
+  SpdyStreamId stream_id = 0;
+  PriorityFields priority{};
+  constexpr bool operator==(const PriorityFrame&) const = default;
+};
+static_assert(sizeof(PriorityFrame) == 12);
+
+struct QUICHE_EXPORT RstStreamFrame {
+  SpdyStreamId stream_id = 0;
+  SpdyErrorCode error_code = ERROR_CODE_NO_ERROR;
+  constexpr bool operator==(const RstStreamFrame&) const = default;
+};
+static_assert(sizeof(RstStreamFrame) == 8);
+
+struct QUICHE_EXPORT SettingsFrame {
+  static constexpr size_t kMaxInlineSettings = 5;
+  bool is_ack = false;
+  absl::InlinedVector<SettingParameter, kMaxInlineSettings> values;
+  bool operator==(const SettingsFrame&) const = default;
+};
+static_assert(sizeof(SettingsFrame) == (sizeof(void*) == 8 ? 56 : 48));
+
+struct QUICHE_EXPORT PushPromiseFrame {
+  SpdyStreamId stream_id = 0;
+  SpdyStreamId promised_stream_id = 0;
+  uint8_t flags = 0;
+  uint8_t padding_payload_len = 0;
+  absl::string_view hpack_block;
+
+  constexpr bool HasEndHeaders() const {
+    return (flags & PUSH_PROMISE_FLAG_END_PUSH_PROMISE) != 0;
+  }
+  ABSL_DEPRECATED("Use HasEndHeaders() instead.")
+  constexpr bool end_headers() const { return HasEndHeaders(); }
+  constexpr bool IsPadded() const {
+    return (flags & PUSH_PROMISE_FLAG_PADDED) != 0 || padding_payload_len > 0;
+  }
+  ABSL_DEPRECATED("Use IsPadded() instead.") constexpr bool padded() const {
+    return IsPadded();
+  }
+  constexpr bool operator==(const PushPromiseFrame&) const = default;
+};
+static_assert(sizeof(PushPromiseFrame) == (sizeof(void*) == 8 ? 32 : 20));
+
+struct QUICHE_EXPORT PingFrame {
+  uint64_t opaque_data = 0;
+  bool is_ack = false;
+  constexpr bool operator==(const PingFrame&) const = default;
+};
+static_assert(sizeof(PingFrame) == (alignof(uint64_t) == 8 ? 16 : 12));
+
+struct QUICHE_EXPORT GoAwayFrame {
+  SpdyStreamId last_good_stream_id = 0;
+  SpdyErrorCode error_code = ERROR_CODE_NO_ERROR;
+  absl::string_view debug_data;
+  constexpr bool operator==(const GoAwayFrame&) const = default;
+};
+static_assert(sizeof(GoAwayFrame) == (sizeof(void*) == 8 ? 24 : 16));
+
+struct QUICHE_EXPORT WindowUpdateFrame {
+  SpdyStreamId stream_id = 0;
+  uint32_t delta = 0;
+  constexpr bool operator==(const WindowUpdateFrame&) const = default;
+};
+static_assert(sizeof(WindowUpdateFrame) == 8);
+
+struct QUICHE_EXPORT ContinuationFrame {
+  SpdyStreamId stream_id = 0;
+  uint8_t flags = 0;
+  absl::string_view hpack_block;
+
+  constexpr bool HasEndHeaders() const {
+    return (flags & HEADERS_FLAG_END_HEADERS) != 0;
+  }
+  ABSL_DEPRECATED("Use HasEndHeaders() instead.")
+  constexpr bool end_headers() const { return HasEndHeaders(); }
+  constexpr bool operator==(const ContinuationFrame&) const = default;
+};
+static_assert(sizeof(ContinuationFrame) == (sizeof(void*) == 8 ? 24 : 16));
+
+struct QUICHE_EXPORT AltSvcFrame {
+  SpdyStreamId stream_id = 0;
+  absl::string_view origin;
+  absl::string_view value;
+  constexpr bool operator==(const AltSvcFrame&) const = default;
+};
+static_assert(sizeof(AltSvcFrame) == (sizeof(void*) == 8 ? 40 : 20));
+
+struct QUICHE_EXPORT PriorityUpdateFrame {
+  SpdyStreamId prioritized_stream_id = 0;
+  absl::string_view priority_field_value;
+  constexpr bool operator==(const PriorityUpdateFrame&) const = default;
+};
+static_assert(sizeof(PriorityUpdateFrame) == (sizeof(void*) == 8 ? 24 : 12));
+
+struct QUICHE_EXPORT AcceptChFrame {
+  static constexpr size_t kMaxInlineEntries = 1;
+  uint8_t num_entries = 0;
+  std::array<AcceptChEntryView, kMaxInlineEntries> entries{};
+  constexpr bool operator==(const AcceptChFrame&) const = default;
+};
+static_assert(sizeof(AcceptChFrame) == (sizeof(void*) == 8 ? 40 : 20));
+
+struct QUICHE_EXPORT UnknownFrame {
+  SpdyStreamId stream_id = 0;
+  uint8_t type = 0;
+  uint8_t flags = 0;
+  absl::string_view payload;
+  constexpr bool operator==(const UnknownFrame&) const = default;
+};
+static_assert(sizeof(UnknownFrame) == (sizeof(void*) == 8 ? 24 : 16));
+
+// Compile-Time Type Traits
+template <typename T>
+struct FrameTraits;
+
+#define REGISTER_FRAME_TRAITS(Type, EnumVal, HasStreamId, HasFin, HasPadding, \
+                              IsFixed, FixedSize, ConsumesFC)                 \
+  template <>                                                                 \
+  struct FrameTraits<Type> {                                                  \
+    static constexpr SpdyFrameType frame_type = EnumVal;                      \
+    static constexpr bool has_stream_id = HasStreamId;                        \
+    static constexpr bool has_fin = HasFin;                                   \
+    static constexpr bool has_padding = HasPadding;                           \
+    static constexpr bool is_fixed_size = IsFixed;                            \
+    static constexpr size_t fixed_payload_size = FixedSize;                   \
+    static constexpr bool consumes_flow_control = ConsumesFC;                 \
+  };
+
+REGISTER_FRAME_TRAITS(DataFrame, SpdyFrameType::DATA, true, true, true, false,
+                      0, true)
+REGISTER_FRAME_TRAITS(HeadersFrame, SpdyFrameType::HEADERS, true, true, true,
+                      false, 0, false)
+REGISTER_FRAME_TRAITS(PriorityFrame, SpdyFrameType::PRIORITY, true, false,
+                      false, true, 5, false)
+REGISTER_FRAME_TRAITS(RstStreamFrame, SpdyFrameType::RST_STREAM, true, false,
+                      false, true, 4, false)
+REGISTER_FRAME_TRAITS(SettingsFrame, SpdyFrameType::SETTINGS, false, false,
+                      false, false, 0, false)
+REGISTER_FRAME_TRAITS(PushPromiseFrame, SpdyFrameType::PUSH_PROMISE, true,
+                      false, true, false, 0, false)
+REGISTER_FRAME_TRAITS(PingFrame, SpdyFrameType::PING, false, false, false, true,
+                      8, false)
+REGISTER_FRAME_TRAITS(GoAwayFrame, SpdyFrameType::GOAWAY, false, false, false,
+                      false, 0, false)
+REGISTER_FRAME_TRAITS(WindowUpdateFrame, SpdyFrameType::WINDOW_UPDATE, true,
+                      false, false, true, 4, false)
+REGISTER_FRAME_TRAITS(ContinuationFrame, SpdyFrameType::CONTINUATION, true,
+                      false, false, false, 0, false)
+REGISTER_FRAME_TRAITS(AltSvcFrame, SpdyFrameType::ALTSVC, true, false, false,
+                      false, 0, false)
+REGISTER_FRAME_TRAITS(PriorityUpdateFrame, SpdyFrameType::PRIORITY_UPDATE,
+                      false, false, false, false, 0, false)
+REGISTER_FRAME_TRAITS(AcceptChFrame, SpdyFrameType::ACCEPT_CH, false, false,
+                      false, false, 0, false)
+REGISTER_FRAME_TRAITS(UnknownFrame, SpdyFrameType::DATA, true, false, false,
+                      false, 0, false)
+
+#undef REGISTER_FRAME_TRAITS
+
+template <typename T>
+inline constexpr SpdyFrameType frame_type_v = FrameTraits<T>::frame_type;
+
+template <typename T>
+inline constexpr bool is_fixed_size_v = FrameTraits<T>::is_fixed_size;
+
+template <typename T>
+inline constexpr bool has_stream_id_v = FrameTraits<T>::has_stream_id;
+
+template <typename T>
+inline constexpr bool has_fin_v = FrameTraits<T>::has_fin;
+
+template <typename T>
+inline constexpr bool has_padding_v = FrameTraits<T>::has_padding;
+
+template <typename T>
+inline constexpr bool consumes_flow_control_v =
+    FrameTraits<T>::consumes_flow_control;
+
+template <typename T>
+concept Http2FrameConcept = requires {
+  { FrameTraits<T>::frame_type } -> std::convertible_to<SpdyFrameType>;
+  { FrameTraits<T>::is_fixed_size } -> std::convertible_to<bool>;
+  { FrameTraits<T>::has_stream_id } -> std::convertible_to<bool>;
+  { FrameTraits<T>::has_fin } -> std::convertible_to<bool>;
+  { FrameTraits<T>::has_padding } -> std::convertible_to<bool>;
+  { FrameTraits<T>::consumes_flow_control } -> std::convertible_to<bool>;
+};
+
+// Generic Size Calculation
+template <Http2FrameConcept T>
+constexpr size_t FrameSize(const T& frame) {
+  if constexpr (is_fixed_size_v<T>) {
+    return kFrameHeaderSize + FrameTraits<T>::fixed_payload_size;
+  } else if constexpr (std::is_same_v<T, DataFrame>) {
+    return kDataFrameMinimumSize + frame.data.size() +
+           (frame.padded() ? (1 + frame.padding_payload_len) : 0);
+  } else if constexpr (std::is_same_v<T, HeadersFrame>) {
+    size_t size = kHeadersFrameMinimumSize + frame.hpack_block.size();
+    if (frame.padded()) {
+      size += 1 + frame.padding_payload_len;
+    }
+    if (frame.has_priority) {
+      size += 5;
+    }
+    return size;
+  } else if constexpr (std::is_same_v<T, SettingsFrame>) {
+    if (frame.is_ack) {
+      return kSettingsFrameMinimumSize;
+    }
+    return kSettingsFrameMinimumSize +
+           (frame.values.size() * kSettingsOneSettingSize);
+  } else if constexpr (std::is_same_v<T, PushPromiseFrame>) {
+    size_t size = kPushPromiseFrameMinimumSize + frame.hpack_block.size();
+    if (frame.padded()) {
+      size += 1 + frame.padding_payload_len;
+    }
+    return size;
+  } else if constexpr (std::is_same_v<T, GoAwayFrame>) {
+    return kGoawayFrameMinimumSize + frame.debug_data.size();
+  } else if constexpr (std::is_same_v<T, ContinuationFrame>) {
+    return kContinuationFrameMinimumSize + frame.hpack_block.size();
+  } else if constexpr (std::is_same_v<T, AltSvcFrame>) {
+    return kGetAltSvcFrameMinimumSize + frame.origin.size() +
+           frame.value.size();
+  } else if constexpr (std::is_same_v<T, PriorityUpdateFrame>) {
+    return kPriorityUpdateFrameMinimumSize + frame.priority_field_value.size();
+  } else if constexpr (std::is_same_v<T, AcceptChFrame>) {
+    size_t total_size = kAcceptChFrameMinimumSize;
+    for (size_t i = 0; i < frame.num_entries && i < frame.entries.size(); ++i) {
+      total_size += frame.entries[i].origin.size() +
+                    frame.entries[i].value.size() +
+                    kAcceptChFramePerEntryOverhead;
+    }
+    return total_size;
+  } else if constexpr (std::is_same_v<T, UnknownFrame>) {
+    return kFrameHeaderSize + frame.payload.size();
+  } else {
+    return kFrameHeaderSize;
+  }
+}
+
+// Forward declares SpdyFrameBuilder for SerializeFrame.
+class SpdyFrameBuilder;
+
+template <Http2FrameConcept T>
+bool SerializeFrame(const T& frame, SpdyFrameBuilder& builder);
+
+// Unified variant.
+using SpdyFrame =
+    std::variant<DataFrame, HeadersFrame, PriorityFrame, RstStreamFrame,
+                 SettingsFrame, PushPromiseFrame, PingFrame, GoAwayFrame,
+                 WindowUpdateFrame, ContinuationFrame, AltSvcFrame,
+                 PriorityUpdateFrame, AcceptChFrame, UnknownFrame>;
+
+static_assert(sizeof(SpdyFrame) <= 64,
+              "SpdyFrame must fit within a 64-byte cache line");
+
+inline SpdyStreamId GetFrameStreamId(const SpdyFrame& frame) {
+  return std::visit(
+      [](const auto& f) -> SpdyStreamId {
+        using T = std::decay_t<decltype(f)>;
+        if constexpr (has_stream_id_v<T>) {
+          return f.stream_id;
+        }
+        return 0;
+      },
+      frame);
+}
+
+inline SpdyFrameType GetFrameType(const SpdyFrame& frame) {
+  return std::visit(
+      [](const auto& f) -> SpdyFrameType {
+        using T = std::decay_t<decltype(f)>;
+        if constexpr (std::is_same_v<T, UnknownFrame>) {
+          return static_cast<SpdyFrameType>(f.type);
+        }
+        return frame_type_v<T>;
+      },
+      frame);
+}
+
+inline size_t GetFrameSize(const SpdyFrame& frame) {
+  return std::visit([](const auto& f) { return FrameSize(f); }, frame);
+}
+
+bool SerializeSpdyFrame(const SpdyFrame& frame, SpdyFrameBuilder& builder);
+
 class SpdyFrameVisitor;
 
 // Intermediate representation for HTTP2 frames.
diff --git a/quiche/http2/core/spdy_protocol_test.cc b/quiche/http2/core/spdy_protocol_test.cc
index 1adef29..82100e3 100644
--- a/quiche/http2/core/spdy_protocol_test.cc
+++ b/quiche/http2/core/spdy_protocol_test.cc
@@ -6,9 +6,12 @@
 
 #include <iostream>
 #include <string>
+#include <type_traits>
 #include <utility>
 
 #include "absl/strings/string_view.h"
+#include "quiche/http2/core/spdy_frame_builder.h"
+#include "quiche/http2/core/spdy_framer.h"
 #include "quiche/common/platform/api/quiche_expect_bug.h"
 #include "quiche/common/platform/api/quiche_test.h"
 
@@ -282,5 +285,408 @@
   EXPECT_EQ(frame.end(), frame.data() + frame.size());
 }
 
+// =============================================================================
+// Modern HTTP/2 Frame Representations Tests
+// =============================================================================
+
+TEST(ModernFrameTest, StandardLayoutAndTriviallyCopyable) {
+  static_assert(std::is_standard_layout_v<PriorityFields>);
+  static_assert(std::is_trivially_copyable_v<PriorityFields>);
+
+  static_assert(std::is_standard_layout_v<SettingParameter>);
+  static_assert(std::is_trivially_copyable_v<SettingParameter>);
+
+  static_assert(std::is_standard_layout_v<AcceptChEntryView>);
+  static_assert(std::is_trivially_copyable_v<AcceptChEntryView>);
+
+  static_assert(std::is_standard_layout_v<DataFrame>);
+  static_assert(std::is_trivially_copyable_v<DataFrame>);
+
+  static_assert(std::is_standard_layout_v<HeadersFrame>);
+  static_assert(std::is_trivially_copyable_v<HeadersFrame>);
+
+  static_assert(std::is_standard_layout_v<PriorityFrame>);
+  static_assert(std::is_trivially_copyable_v<PriorityFrame>);
+
+  static_assert(std::is_standard_layout_v<RstStreamFrame>);
+  static_assert(std::is_trivially_copyable_v<RstStreamFrame>);
+
+  static_assert(std::is_standard_layout_v<SettingsFrame>);
+
+  static_assert(std::is_standard_layout_v<PushPromiseFrame>);
+  static_assert(std::is_trivially_copyable_v<PushPromiseFrame>);
+
+  static_assert(std::is_standard_layout_v<PingFrame>);
+  static_assert(std::is_trivially_copyable_v<PingFrame>);
+
+  static_assert(std::is_standard_layout_v<GoAwayFrame>);
+  static_assert(std::is_trivially_copyable_v<GoAwayFrame>);
+
+  static_assert(std::is_standard_layout_v<WindowUpdateFrame>);
+  static_assert(std::is_trivially_copyable_v<WindowUpdateFrame>);
+
+  static_assert(std::is_standard_layout_v<ContinuationFrame>);
+  static_assert(std::is_trivially_copyable_v<ContinuationFrame>);
+
+  static_assert(std::is_standard_layout_v<AltSvcFrame>);
+  static_assert(std::is_trivially_copyable_v<AltSvcFrame>);
+
+  static_assert(std::is_standard_layout_v<PriorityUpdateFrame>);
+  static_assert(std::is_trivially_copyable_v<PriorityUpdateFrame>);
+
+  static_assert(std::is_standard_layout_v<AcceptChFrame>);
+  static_assert(std::is_trivially_copyable_v<AcceptChFrame>);
+
+  static_assert(std::is_standard_layout_v<UnknownFrame>);
+  static_assert(std::is_trivially_copyable_v<UnknownFrame>);
+
+  static_assert(sizeof(SpdyFrame) <= 64,
+                "SpdyFrame must fit in a 64-byte cache line");
+}
+
+TEST(ModernFrameTest, Http2FrameConcept) {
+  static_assert(Http2FrameConcept<DataFrame>);
+  static_assert(Http2FrameConcept<HeadersFrame>);
+  static_assert(Http2FrameConcept<PriorityFrame>);
+  static_assert(Http2FrameConcept<RstStreamFrame>);
+  static_assert(Http2FrameConcept<SettingsFrame>);
+  static_assert(Http2FrameConcept<PushPromiseFrame>);
+  static_assert(Http2FrameConcept<PingFrame>);
+  static_assert(Http2FrameConcept<GoAwayFrame>);
+  static_assert(Http2FrameConcept<WindowUpdateFrame>);
+  static_assert(Http2FrameConcept<ContinuationFrame>);
+  static_assert(Http2FrameConcept<AltSvcFrame>);
+  static_assert(Http2FrameConcept<PriorityUpdateFrame>);
+  static_assert(Http2FrameConcept<AcceptChFrame>);
+  static_assert(Http2FrameConcept<UnknownFrame>);
+
+  // Non-frame types should not satisfy the concept.
+  static_assert(!Http2FrameConcept<int>);
+  static_assert(!Http2FrameConcept<std::string>);
+  static_assert(!Http2FrameConcept<PriorityFields>);
+  static_assert(!Http2FrameConcept<SpdyDataIR>);
+}
+
+TEST(ModernFrameTest, FrameTraits) {
+  EXPECT_EQ(SpdyFrameType::DATA, frame_type_v<DataFrame>);
+  EXPECT_EQ(SpdyFrameType::HEADERS, frame_type_v<HeadersFrame>);
+  EXPECT_EQ(SpdyFrameType::PRIORITY, frame_type_v<PriorityFrame>);
+  EXPECT_EQ(SpdyFrameType::RST_STREAM, frame_type_v<RstStreamFrame>);
+  EXPECT_EQ(SpdyFrameType::SETTINGS, frame_type_v<SettingsFrame>);
+  EXPECT_EQ(SpdyFrameType::PUSH_PROMISE, frame_type_v<PushPromiseFrame>);
+  EXPECT_EQ(SpdyFrameType::PING, frame_type_v<PingFrame>);
+  EXPECT_EQ(SpdyFrameType::GOAWAY, frame_type_v<GoAwayFrame>);
+  EXPECT_EQ(SpdyFrameType::WINDOW_UPDATE, frame_type_v<WindowUpdateFrame>);
+  EXPECT_EQ(SpdyFrameType::CONTINUATION, frame_type_v<ContinuationFrame>);
+  EXPECT_EQ(SpdyFrameType::ALTSVC, frame_type_v<AltSvcFrame>);
+  EXPECT_EQ(SpdyFrameType::PRIORITY_UPDATE, frame_type_v<PriorityUpdateFrame>);
+  EXPECT_EQ(SpdyFrameType::ACCEPT_CH, frame_type_v<AcceptChFrame>);
+
+  // Fixed size checks
+  EXPECT_TRUE(is_fixed_size_v<PriorityFrame>);
+  EXPECT_TRUE(is_fixed_size_v<RstStreamFrame>);
+  EXPECT_TRUE(is_fixed_size_v<PingFrame>);
+  EXPECT_TRUE(is_fixed_size_v<WindowUpdateFrame>);
+  EXPECT_FALSE(is_fixed_size_v<DataFrame>);
+  EXPECT_FALSE(is_fixed_size_v<HeadersFrame>);
+  EXPECT_FALSE(is_fixed_size_v<SettingsFrame>);
+
+  // Stream ID presence
+  EXPECT_TRUE(has_stream_id_v<DataFrame>);
+  EXPECT_TRUE(has_stream_id_v<HeadersFrame>);
+  EXPECT_TRUE(has_stream_id_v<PriorityFrame>);
+  EXPECT_TRUE(has_stream_id_v<RstStreamFrame>);
+  EXPECT_TRUE(has_stream_id_v<PushPromiseFrame>);
+  EXPECT_TRUE(has_stream_id_v<WindowUpdateFrame>);
+  EXPECT_FALSE(has_stream_id_v<SettingsFrame>);
+  EXPECT_FALSE(has_stream_id_v<PingFrame>);
+  EXPECT_FALSE(has_stream_id_v<GoAwayFrame>);
+
+  // Fin flag presence
+  EXPECT_TRUE(has_fin_v<DataFrame>);
+  EXPECT_TRUE(has_fin_v<HeadersFrame>);
+  EXPECT_FALSE(has_fin_v<RstStreamFrame>);
+  EXPECT_FALSE(has_fin_v<SettingsFrame>);
+
+  // Padding presence
+  EXPECT_TRUE(has_padding_v<DataFrame>);
+  EXPECT_TRUE(has_padding_v<HeadersFrame>);
+  EXPECT_TRUE(has_padding_v<PushPromiseFrame>);
+  EXPECT_FALSE(has_padding_v<PingFrame>);
+
+  // Flow control consumption
+  EXPECT_TRUE(consumes_flow_control_v<DataFrame>);
+  EXPECT_FALSE(consumes_flow_control_v<HeadersFrame>);
+  EXPECT_FALSE(consumes_flow_control_v<SettingsFrame>);
+}
+
+TEST(ModernFrameTest, FrameSizeCalculation) {
+  DataFrame data{.stream_id = 1, .data = "hello"};
+  EXPECT_EQ(14u, FrameSize(data));
+  data.flags = DATA_FLAG_PADDED;
+  data.padding_payload_len = 3;
+  EXPECT_EQ(18u, FrameSize(data));
+
+  HeadersFrame headers{.stream_id = 1, .hpack_block = "0123456789"};
+  EXPECT_EQ(19u, FrameSize(headers));
+  headers.has_priority = true;
+  EXPECT_EQ(24u, FrameSize(headers));
+
+  PriorityFrame priority{.stream_id = 1};
+  EXPECT_EQ(14u, FrameSize(priority));
+
+  RstStreamFrame rst{.stream_id = 1};
+  EXPECT_EQ(13u, FrameSize(rst));
+
+  SettingsFrame settings_ack{.is_ack = true, .values = {}};
+  EXPECT_EQ(9u, FrameSize(settings_ack));
+  SettingsFrame settings_data{
+      .is_ack = false,
+      .values = {{SETTINGS_HEADER_TABLE_SIZE, 4096},
+                 {SETTINGS_MAX_CONCURRENT_STREAMS, 100}}};
+  EXPECT_EQ(21u, FrameSize(settings_data));
+
+  PushPromiseFrame push{
+      .stream_id = 1, .promised_stream_id = 2, .hpack_block = "12345678"};
+  EXPECT_EQ(21u, FrameSize(push));
+
+  PingFrame ping{};
+  EXPECT_EQ(17u, FrameSize(ping));
+
+  GoAwayFrame goaway{.debug_data = "abcd"};
+  EXPECT_EQ(21u, FrameSize(goaway));
+
+  WindowUpdateFrame win{.stream_id = 1, .delta = 100};
+  EXPECT_EQ(13u, FrameSize(win));
+
+  ContinuationFrame cont{.stream_id = 1, .hpack_block = "abcdef"};
+  EXPECT_EQ(15u, FrameSize(cont));
+
+  AltSvcFrame altsvc{.stream_id = 1, .origin = "foo", .value = "h2=\":443\""};
+  EXPECT_EQ(9u + 2u + 3u + 9u, FrameSize(altsvc));
+
+  PriorityUpdateFrame prio_up{.prioritized_stream_id = 3,
+                              .priority_field_value = "u=3,i"};
+  EXPECT_EQ(9u + 4u + 5u, FrameSize(prio_up));
+
+  AcceptChFrame accept_ch{.num_entries = 1,
+                          .entries = {{{.origin = "foo", .value = "bar"}}}};
+  EXPECT_EQ(9u + 4u + 3u + 3u, FrameSize(accept_ch));
+
+  UnknownFrame unknown{.type = 0x99, .payload = "payload"};
+  EXPECT_EQ(16u, FrameSize(unknown));
+}
+
+TEST(ModernFrameTest, SerializeDataFrame) {
+  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
+
+  DataFrame df{.stream_id = 3, .flags = DATA_FLAG_FIN, .data = "hello world"};
+  SpdyFrameBuilder builder(FrameSize(df));
+  EXPECT_TRUE(SerializeFrame(df, builder));
+  SpdySerializedFrame serialized = builder.take();
+
+  SpdyDataIR data_ir(3, "hello world");
+  data_ir.set_fin(true);
+  SpdySerializedFrame expected = framer.SerializeData(data_ir);
+
+  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
+}
+
+TEST(ModernFrameTest, SerializePriorityFrame) {
+  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
+
+  PriorityFrame pf{
+      .stream_id = 5,
+      .priority = {.parent_stream_id = 1, .weight = 32, .exclusive = true}};
+  SpdyFrameBuilder builder(FrameSize(pf));
+  EXPECT_TRUE(SerializeFrame(pf, builder));
+  SpdySerializedFrame serialized = builder.take();
+
+  SpdyPriorityIR prio_ir(5, 1, 32, true);
+  SpdySerializedFrame expected = framer.SerializePriority(prio_ir);
+
+  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
+}
+
+TEST(ModernFrameTest, SerializeRstStreamFrame) {
+  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
+
+  // 3. RST_STREAM frame
+  RstStreamFrame rf{.stream_id = 7, .error_code = ERROR_CODE_CANCEL};
+  SpdyFrameBuilder builder(FrameSize(rf));
+  EXPECT_TRUE(SerializeFrame(rf, builder));
+  SpdySerializedFrame serialized = builder.take();
+
+  SpdyRstStreamIR rst_ir(7, ERROR_CODE_CANCEL);
+  SpdySerializedFrame expected = framer.SerializeRstStream(rst_ir);
+
+  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
+}
+
+TEST(ModernFrameTest, SerializeSettingsFrame) {
+  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
+
+  // SETTINGS ack.
+  {
+    SettingsFrame sf_ack{.is_ack = true, .values = {}};
+    SpdyFrameBuilder builder(FrameSize(sf_ack));
+    EXPECT_TRUE(SerializeFrame(sf_ack, builder));
+    SpdySerializedFrame serialized = builder.take();
+
+    SpdySettingsIR settings_ack_ir;
+    settings_ack_ir.set_is_ack(true);
+    SpdySerializedFrame expected = framer.SerializeSettings(settings_ack_ir);
+
+    EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
+  }
+  // SETTINGS with values.
+  {
+    SettingsFrame sf_vals{.is_ack = false,
+                          .values = {{SETTINGS_HEADER_TABLE_SIZE, 4096},
+                                     {SETTINGS_MAX_CONCURRENT_STREAMS, 100}}};
+    SpdyFrameBuilder builder(FrameSize(sf_vals));
+    EXPECT_TRUE(SerializeFrame(sf_vals, builder));
+    SpdySerializedFrame serialized = builder.take();
+
+    SpdySettingsIR settings_ir;
+    settings_ir.AddSetting(SETTINGS_HEADER_TABLE_SIZE, 4096);
+    settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 100);
+    SpdySerializedFrame expected = framer.SerializeSettings(settings_ir);
+
+    EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
+  }
+}
+
+TEST(ModernFrameTest, SerializePingFrame) {
+  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
+
+  PingFrame ping{.opaque_data = 0x0102030405060708ULL, .is_ack = true};
+  SpdyFrameBuilder builder(FrameSize(ping));
+  EXPECT_TRUE(SerializeFrame(ping, builder));
+  SpdySerializedFrame serialized = builder.take();
+
+  SpdyPingIR ping_ir(0x0102030405060708ULL);
+  ping_ir.set_is_ack(true);
+  SpdySerializedFrame expected = framer.SerializePing(ping_ir);
+
+  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
+}
+
+TEST(ModernFrameTest, SerializeGoAwayFrame) {
+  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
+
+  GoAwayFrame goaway{.last_good_stream_id = 9,
+                     .error_code = ERROR_CODE_PROTOCOL_ERROR,
+                     .debug_data = "protocol error occurred"};
+  SpdyFrameBuilder builder(FrameSize(goaway));
+  EXPECT_TRUE(SerializeFrame(goaway, builder));
+  SpdySerializedFrame serialized = builder.take();
+
+  SpdyGoAwayIR goaway_ir(9, ERROR_CODE_PROTOCOL_ERROR,
+                         "protocol error occurred");
+  SpdySerializedFrame expected = framer.SerializeGoAway(goaway_ir);
+
+  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
+}
+
+TEST(ModernFrameTest, SerializeWindowUpdateFrame) {
+  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
+
+  WindowUpdateFrame win{.stream_id = 11, .delta = 65535};
+  SpdyFrameBuilder builder(FrameSize(win));
+  EXPECT_TRUE(SerializeFrame(win, builder));
+  SpdySerializedFrame serialized = builder.take();
+
+  SpdyWindowUpdateIR win_ir(11, 65535);
+  SpdySerializedFrame expected = framer.SerializeWindowUpdate(win_ir);
+
+  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
+}
+
+TEST(ModernFrameTest, SerializeContinuationFrame) {
+  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
+
+  ContinuationFrame cont{.stream_id = 13,
+                         .flags = HEADERS_FLAG_END_HEADERS,
+                         .hpack_block = "continuation_block"};
+  SpdyFrameBuilder builder(FrameSize(cont));
+  EXPECT_TRUE(SerializeFrame(cont, builder));
+  SpdySerializedFrame serialized = builder.take();
+
+  SpdyContinuationIR cont_ir(13);
+  cont_ir.set_end_headers(true);
+  cont_ir.take_encoding("continuation_block");
+  SpdySerializedFrame expected = framer.SerializeContinuation(cont_ir);
+
+  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
+}
+
+TEST(ModernFrameTest, SerializePriorityUpdateFrame) {
+  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
+
+  PriorityUpdateFrame prio_up{.prioritized_stream_id = 5,
+                              .priority_field_value = "u=1,i"};
+  SpdyFrameBuilder builder(FrameSize(prio_up));
+  EXPECT_TRUE(SerializeFrame(prio_up, builder));
+  SpdySerializedFrame serialized = builder.take();
+
+  SpdyPriorityUpdateIR prio_up_ir(0, 5, "u=1,i");
+  SpdySerializedFrame expected = framer.SerializePriorityUpdate(prio_up_ir);
+
+  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
+}
+
+TEST(ModernFrameTest, SerializeAcceptChFrame) {
+  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
+
+  AcceptChFrame accept_ch{
+      .num_entries = 1,
+      .entries = {{{.origin = "example.com", .value = "sec-ch-ua"}}}};
+  SpdyFrameBuilder builder(FrameSize(accept_ch));
+  EXPECT_TRUE(SerializeFrame(accept_ch, builder));
+  SpdySerializedFrame serialized = builder.take();
+
+  SpdyAcceptChIR accept_ch_ir({{"example.com", "sec-ch-ua"}});
+  SpdySerializedFrame expected = framer.SerializeAcceptCh(accept_ch_ir);
+
+  EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
+}
+
+TEST(ModernFrameTest, SerializeUnknownFrame) {
+  SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
+
+  // 11. UNKNOWN frame
+  {
+    UnknownFrame unknown{.stream_id = 1,
+                         .type = 0xfe,
+                         .flags = 0x05,
+                         .payload = "custom_payload"};
+    SpdyFrameBuilder builder(FrameSize(unknown));
+    EXPECT_TRUE(SerializeFrame(unknown, builder));
+    SpdySerializedFrame serialized = builder.take();
+
+    SpdyUnknownIR unknown_ir(1, 0xfe, 0x05, "custom_payload");
+    SpdySerializedFrame expected = framer.SerializeUnknown(unknown_ir);
+
+    EXPECT_EQ(absl::string_view(expected), absl::string_view(serialized));
+  }
+}
+
+TEST(ModernFrameTest, SpdyFrameVariant) {
+  SpdyFrame frame = DataFrame{.stream_id = 42, .data = "payload"};
+  EXPECT_EQ(42u, GetFrameStreamId(frame));
+  EXPECT_EQ(SpdyFrameType::DATA, GetFrameType(frame));
+  EXPECT_EQ(16u, GetFrameSize(frame));
+
+  frame = PingFrame{.opaque_data = 123};
+  EXPECT_EQ(0u, GetFrameStreamId(frame));
+  EXPECT_EQ(SpdyFrameType::PING, GetFrameType(frame));
+  EXPECT_EQ(17u, GetFrameSize(frame));
+
+  SpdyFrameBuilder builder(GetFrameSize(frame));
+  EXPECT_TRUE(SerializeSpdyFrame(frame, builder));
+  EXPECT_EQ(17u, builder.length());
+}
+
 }  // namespace test
 }  // namespace spdy
