diff --git a/quiche/spdy/core/metadata_extension.cc b/quiche/spdy/core/metadata_extension.cc
index 0993b99..ec0b2c6 100644
--- a/quiche/spdy/core/metadata_extension.cc
+++ b/quiche/spdy/core/metadata_extension.cc
@@ -9,7 +9,6 @@
 #include "quiche/http2/hpack/decoder/hpack_decoder.h"
 #include "quiche/common/platform/api/quiche_bug_tracker.h"
 #include "quiche/common/platform/api/quiche_logging.h"
-#include "quiche/spdy/core/hpack/hpack_encoder.h"
 #include "quiche/spdy/core/http2_header_block_hpack_listener.h"
 
 namespace spdy {
@@ -23,33 +22,19 @@
 
 const size_t kMaxMetadataBlockSize = 1 << 20;  // 1 MB
 
-// This class uses an HpackEncoder to serialize a METADATA block as a series of
-// METADATA frames.
-class MetadataFrameSequence : public MetadataSerializer::FrameSequence {
- public:
-  MetadataFrameSequence(SpdyStreamId stream_id, spdy::SpdyHeaderBlock payload)
-      : stream_id_(stream_id), payload_(std::move(payload)) {
-    // Metadata should not use HPACK compression.
-    encoder_.DisableCompression();
-    HpackEncoder::Representations r;
-    for (const auto& kv_pair : payload_) {
-      r.push_back(kv_pair);
-    }
-    progressive_encoder_ = encoder_.EncodeRepresentations(r);
+}  // anonymous namespace
+
+MetadataFrameSequence::MetadataFrameSequence(SpdyStreamId stream_id,
+                                             spdy::Http2HeaderBlock payload)
+    : stream_id_(stream_id), payload_(std::move(payload)) {
+  // Metadata should not use HPACK compression.
+  encoder_.DisableCompression();
+  HpackEncoder::Representations r;
+  for (const auto& kv_pair : payload_) {
+    r.push_back(kv_pair);
   }
-
-  // Copies are not allowed.
-  MetadataFrameSequence(const MetadataFrameSequence& other) = delete;
-  MetadataFrameSequence& operator=(const MetadataFrameSequence& other) = delete;
-
-  std::unique_ptr<spdy::SpdyFrameIR> Next() override;
-
- private:
-  SpdyStreamId stream_id_;
-  SpdyHeaderBlock payload_;
-  HpackEncoder encoder_;
-  std::unique_ptr<HpackEncoder::ProgressiveEncoder> progressive_encoder_;
-};
+  progressive_encoder_ = encoder_.EncodeRepresentations(r);
+}
 
 std::unique_ptr<spdy::SpdyFrameIR> MetadataFrameSequence::Next() {
   if (!progressive_encoder_->HasNext()) {
@@ -65,8 +50,6 @@
       std::move(payload));
 }
 
-}  // anonymous namespace
-
 struct MetadataVisitor::MetadataPayloadState {
   MetadataPayloadState(size_t remaining, bool end)
       : bytes_remaining(remaining), end_metadata(end) {}
@@ -185,11 +168,4 @@
   }
 }
 
-std::unique_ptr<MetadataSerializer::FrameSequence>
-MetadataSerializer::FrameSequenceForPayload(SpdyStreamId stream_id,
-                                            MetadataPayload payload) {
-  return absl::make_unique<MetadataFrameSequence>(stream_id,
-                                                  std::move(payload));
-}
-
 }  // namespace spdy
diff --git a/quiche/spdy/core/metadata_extension.h b/quiche/spdy/core/metadata_extension.h
index 4eaf95c..12d817c 100644
--- a/quiche/spdy/core/metadata_extension.h
+++ b/quiche/spdy/core/metadata_extension.h
@@ -7,6 +7,7 @@
 
 #include "absl/container/flat_hash_map.h"
 #include "quiche/common/platform/api/quiche_export.h"
+#include "quiche/spdy/core/hpack/hpack_encoder.h"
 #include "quiche/spdy/core/http2_frame_decoder_adapter.h"
 #include "quiche/spdy/core/spdy_header_block.h"
 #include "quiche/spdy/core/spdy_protocol.h"
@@ -90,27 +91,23 @@
   MetadataSupportState peer_supports_metadata_;
 };
 
-// A class that serializes metadata blocks as sequences of frames.
-class QUICHE_EXPORT_PRIVATE MetadataSerializer {
+// This class uses an HpackEncoder to serialize a METADATA block as a series of
+// METADATA frames.
+class QUICHE_EXPORT_PRIVATE MetadataFrameSequence {
  public:
-  using MetadataPayload = spdy::SpdyHeaderBlock;
+  MetadataFrameSequence(SpdyStreamId stream_id, spdy::Http2HeaderBlock payload);
 
-  class QUICHE_EXPORT_PRIVATE FrameSequence {
-   public:
-    virtual ~FrameSequence() {}
+  // Copies are not allowed.
+  MetadataFrameSequence(const MetadataFrameSequence& other) = delete;
+  MetadataFrameSequence& operator=(const MetadataFrameSequence& other) = delete;
 
-    // Returns nullptr once the sequence has been exhausted.
-    virtual std::unique_ptr<spdy::SpdyFrameIR> Next() = 0;
-  };
+  std::unique_ptr<spdy::SpdyFrameIR> Next();
 
-  MetadataSerializer() {}
-
-  MetadataSerializer(const MetadataSerializer&) = delete;
-  MetadataSerializer& operator=(const MetadataSerializer&) = delete;
-
-  // Returns nullptr on failure.
-  std::unique_ptr<FrameSequence> FrameSequenceForPayload(
-      spdy::SpdyStreamId stream_id, MetadataPayload payload);
+ private:
+  SpdyStreamId stream_id_;
+  Http2HeaderBlock payload_;
+  HpackEncoder encoder_;
+  std::unique_ptr<HpackEncoder::ProgressiveEncoder> progressive_encoder_;
 };
 
 }  // namespace spdy
diff --git a/quiche/spdy/core/metadata_extension_test.cc b/quiche/spdy/core/metadata_extension_test.cc
index 26f98f4..8d9551d 100644
--- a/quiche/spdy/core/metadata_extension_test.cc
+++ b/quiche/spdy/core/metadata_extension_test.cc
@@ -17,9 +17,6 @@
 namespace {
 
 using ::absl::bind_front;
-using ::spdy::SpdyFramer;
-using ::spdy::SpdyHeaderBlock;
-using ::spdy::test::MockSpdyFramerVisitor;
 using ::testing::_;
 using ::testing::ElementsAre;
 using ::testing::IsEmpty;
@@ -48,8 +45,8 @@
     received_metadata_support_.push_back(peer_supports_metadata);
   }
 
-  MetadataSerializer::MetadataPayload PayloadForData(absl::string_view data) {
-    SpdyHeaderBlock block;
+  Http2HeaderBlock PayloadForData(absl::string_view data) {
+    Http2HeaderBlock block;
     block["example-payload"] = data;
     return block;
   }
@@ -90,9 +87,7 @@
   extension_->OnSetting(MetadataVisitor::kMetadataExtensionId, 1);
   ASSERT_TRUE(extension_->PeerSupportsMetadata());
 
-  MetadataSerializer serializer;
-  auto sequence = serializer.FrameSequenceForPayload(3, std::move(payload));
-  ASSERT_TRUE(sequence != nullptr);
+  MetadataFrameSequence sequence(3, std::move(payload));
 
   http2::Http2DecoderAdapter deframer;
   ::testing::StrictMock<MockSpdyFramerVisitor> visitor;
@@ -105,7 +100,7 @@
       .WillOnce(::testing::Return(true));
 
   SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-  auto frame = sequence->Next();
+  auto frame = sequence.Next();
   ASSERT_TRUE(frame != nullptr);
   while (frame != nullptr) {
     const size_t frame_size = framer.SerializeFrame(*frame, &test_buffer_);
@@ -114,7 +109,7 @@
     ASSERT_EQ(frame_size, test_buffer_.Size());
     EXPECT_EQ(frame_size, deframer.ProcessInput(kBuffer, frame_size));
     test_buffer_.Reset();
-    frame = sequence->Next();
+    frame = sequence.Next();
   }
   EXPECT_FALSE(deframer.HasError());
   EXPECT_THAT(received_metadata_support_, ElementsAre(true));
@@ -140,17 +135,13 @@
     extension_->OnSetting(MetadataVisitor::kMetadataExtensionId, 1);
     ASSERT_TRUE(extension_->PeerSupportsMetadata());
 
-    MetadataSerializer serializer;
-    auto sequence =
-        serializer.FrameSequenceForPayload(3, payload_block.Clone());
-    ASSERT_TRUE(sequence != nullptr);
-
+    MetadataFrameSequence sequence(3, payload_block.Clone());
     http2::Http2DecoderAdapter deframer;
     ::spdy::SpdyNoOpVisitor visitor;
     deframer.set_visitor(&visitor);
     deframer.set_extension_visitor(extension_.get());
     SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-    auto frame = sequence->Next();
+    auto frame = sequence.Next();
     ASSERT_TRUE(frame != nullptr);
     while (frame != nullptr) {
       const size_t frame_size = framer.SerializeFrame(*frame, &test_buffer_);
@@ -159,7 +150,7 @@
       ASSERT_EQ(frame_size, test_buffer_.Size());
       EXPECT_EQ(frame_size, deframer.ProcessInput(kBuffer, frame_size));
       test_buffer_.Reset();
-      frame = sequence->Next();
+      frame = sequence.Next();
     }
     EXPECT_EQ(1u, received_count_);
     auto it = received_payload_map_.find(3);
@@ -183,12 +174,8 @@
   extension_->OnSetting(MetadataVisitor::kMetadataExtensionId, 1);
   ASSERT_TRUE(extension_->PeerSupportsMetadata());
 
-  MetadataSerializer serializer;
-  auto sequence1 = serializer.FrameSequenceForPayload(3, payload1.Clone());
-  ASSERT_TRUE(sequence1 != nullptr);
-
-  auto sequence2 = serializer.FrameSequenceForPayload(5, payload2.Clone());
-  ASSERT_TRUE(sequence2 != nullptr);
+  MetadataFrameSequence sequence1(3, payload1.Clone());
+  MetadataFrameSequence sequence2(5, payload2.Clone());
 
   http2::Http2DecoderAdapter deframer;
   ::spdy::SpdyNoOpVisitor visitor;
@@ -196,9 +183,9 @@
   deframer.set_extension_visitor(extension_.get());
 
   SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION);
-  auto frame1 = sequence1->Next();
+  auto frame1 = sequence1.Next();
   ASSERT_TRUE(frame1 != nullptr);
-  auto frame2 = sequence2->Next();
+  auto frame2 = sequence2.Next();
   ASSERT_TRUE(frame2 != nullptr);
   while (frame1 != nullptr || frame2 != nullptr) {
     for (auto frame : {frame1.get(), frame2.get()}) {
@@ -211,8 +198,8 @@
         test_buffer_.Reset();
       }
     }
-    frame1 = sequence1->Next();
-    frame2 = sequence2->Next();
+    frame1 = sequence1.Next();
+    frame2 = sequence2.Next();
   }
   EXPECT_EQ(2u, received_count_);
   auto it = received_payload_map_.find(3);
