diff --git a/quiche/http2/adapter/oghttp2_session.cc b/quiche/http2/adapter/oghttp2_session.cc
index f0800f7..d3d4f79 100644
--- a/quiche/http2/adapter/oghttp2_session.cc
+++ b/quiche/http2/adapter/oghttp2_session.cc
@@ -357,7 +357,6 @@
           options.should_window_update_fn,
           /*update_window_on_notify=*/false) {
   decoder_.set_visitor(&receive_logger_);
-  decoder_.set_extension_visitor(this);
   if (options_.max_header_list_bytes) {
     // Limit buffering of encoded HPACK data to 2x the decoded limit.
     decoder_.GetHpackDecoder()->set_max_decode_buffer_size_bytes(
@@ -1491,12 +1490,52 @@
   return true;
 }
 
-void OgHttp2Session::OnUnknownFrameStart(spdy::SpdyStreamId /*stream_id*/,
-                                         size_t /*length*/, uint8_t /*type*/,
-                                         uint8_t /*flags*/) {}
+void OgHttp2Session::OnUnknownFrameStart(spdy::SpdyStreamId stream_id,
+                                         size_t length, uint8_t type,
+                                         uint8_t flags) {
+  process_metadata_ = false;
+  if (streams_reset_.contains(stream_id)) {
+    return;
+  }
+  if (type == kMetadataFrameType) {
+    QUICHE_DCHECK_EQ(metadata_length_, 0u);
+    visitor_.OnBeginMetadataForStream(stream_id, length);
+    metadata_length_ = length;
+    process_metadata_ = true;
+    end_metadata_ = flags & kMetadataEndFlag;
 
-void OgHttp2Session::OnUnknownFramePayload(spdy::SpdyStreamId /*stream_id*/,
-                                           absl::string_view /*payload*/) {}
+    // Empty metadata payloads will not trigger OnUnknownFramePayload(), so
+    // handle that possibility here.
+    MaybeHandleMetadataEndForStream(stream_id);
+  } else {
+    QUICHE_DLOG(INFO) << "Received unexpected frame type "
+                      << static_cast<int>(type);
+  }
+}
+
+void OgHttp2Session::OnUnknownFramePayload(spdy::SpdyStreamId stream_id,
+                                           absl::string_view payload) {
+  if (!process_metadata_) {
+    return;
+  }
+  if (streams_reset_.contains(stream_id)) {
+    return;
+  }
+  if (metadata_length_ > 0) {
+    QUICHE_DCHECK_LE(payload.size(), metadata_length_);
+    const bool payload_success =
+        visitor_.OnMetadataForStream(stream_id, payload);
+    if (payload_success) {
+      metadata_length_ -= payload.size();
+      MaybeHandleMetadataEndForStream(stream_id);
+    } else {
+      fatal_visitor_callback_failure_ = true;
+      decoder_.StopProcessing();
+    }
+  } else {
+    QUICHE_DLOG(INFO) << "Unexpected metadata payload for stream " << stream_id;
+  }
+}
 
 void OgHttp2Session::OnHeaderStatus(
     Http2StreamId stream_id, Http2VisitorInterface::OnHeaderResult result) {
@@ -1542,51 +1581,6 @@
   }
 }
 
-bool OgHttp2Session::OnFrameHeader(spdy::SpdyStreamId stream_id, size_t length,
-                                   uint8_t type, uint8_t flags) {
-  if (streams_reset_.contains(stream_id)) {
-    return false;
-  }
-  if (type == kMetadataFrameType) {
-    QUICHE_DCHECK_EQ(metadata_length_, 0u);
-    visitor_.OnBeginMetadataForStream(stream_id, length);
-    metadata_stream_id_ = stream_id;
-    metadata_length_ = length;
-    end_metadata_ = flags & kMetadataEndFlag;
-
-    // Empty metadata payloads will not trigger OnFramePayload(), so handle
-    // that possibility here.
-    MaybeHandleMetadataEndForStream(metadata_stream_id_);
-
-    return true;
-  } else {
-    QUICHE_DLOG(INFO) << "Unexpected frame type " << static_cast<int>(type)
-                      << " received by the extension visitor.";
-    return false;
-  }
-}
-
-void OgHttp2Session::OnFramePayload(const char* data, size_t len) {
-  if (streams_reset_.contains(metadata_stream_id_)) {
-    return;
-  }
-  if (metadata_length_ > 0) {
-    QUICHE_DCHECK_LE(len, metadata_length_);
-    const bool payload_success = visitor_.OnMetadataForStream(
-        metadata_stream_id_, absl::string_view(data, len));
-    if (payload_success) {
-      metadata_length_ -= len;
-      MaybeHandleMetadataEndForStream(metadata_stream_id_);
-    } else {
-      fatal_visitor_callback_failure_ = true;
-      decoder_.StopProcessing();
-    }
-  } else {
-    QUICHE_DLOG(INFO) << "Unexpected metadata payload for stream "
-                      << metadata_stream_id_;
-  }
-}
-
 void OgHttp2Session::MaybeSetupPreface(bool sending_outbound_settings) {
   if (!queued_preface_) {
     queued_preface_ = true;
@@ -1894,7 +1888,7 @@
       fatal_visitor_callback_failure_ = true;
       decoder_.StopProcessing();
     }
-    metadata_stream_id_ = 0;
+    process_metadata_ = false;
     end_metadata_ = false;
   }
 }
diff --git a/quiche/http2/adapter/oghttp2_session.h b/quiche/http2/adapter/oghttp2_session.h
index 5f28217..1d896a3 100644
--- a/quiche/http2/adapter/oghttp2_session.h
+++ b/quiche/http2/adapter/oghttp2_session.h
@@ -36,8 +36,7 @@
 // This class manages state associated with a single multiplexed HTTP/2 session.
 class QUICHE_EXPORT_PRIVATE OgHttp2Session
     : public Http2Session,
-      public spdy::SpdyFramerVisitorInterface,
-      public spdy::ExtensionVisitorInterface {
+      public spdy::SpdyFramerVisitorInterface {
  public:
   struct QUICHE_EXPORT_PRIVATE Options {
     // Returns whether to send a WINDOW_UPDATE based on the window limit, window
@@ -213,13 +212,6 @@
   void OnHeaderStatus(Http2StreamId stream_id,
                       Http2VisitorInterface::OnHeaderResult result);
 
-  // Returns true if a recognized extension frame is received.
-  bool OnFrameHeader(spdy::SpdyStreamId stream_id, size_t length, uint8_t type,
-                     uint8_t flags) override;
-
-  // Handles the payload for a recognized extension frame.
-  void OnFramePayload(const char* data, size_t len) override;
-
  private:
   struct QUICHE_EXPORT_PRIVATE StreamState {
     StreamState(int32_t stream_receive_window, int32_t stream_send_window,
@@ -507,7 +499,6 @@
   // which this endpoint created a stream in the stream map.
   Http2StreamId highest_received_stream_id_ = 0;
   Http2StreamId highest_processed_stream_id_ = 0;
-  Http2StreamId metadata_stream_id_ = 0;
   Http2StreamId received_goaway_stream_id_ = 0;
   size_t metadata_length_ = 0;
   int32_t connection_send_window_ = kInitialFlowControlWindowSize;
@@ -537,6 +528,7 @@
   bool queued_preface_ = false;
   bool peer_supports_metadata_ = false;
   bool end_metadata_ = false;
+  bool process_metadata_ = false;
   bool sent_non_ack_settings_ = false;
 
   // Recursion guard for ProcessBytes().
