diff --git a/quiche/http2/adapter/oghttp2_adapter.cc b/quiche/http2/adapter/oghttp2_adapter.cc
index 0813452..9fb7e8c 100644
--- a/quiche/http2/adapter/oghttp2_adapter.cc
+++ b/quiche/http2/adapter/oghttp2_adapter.cc
@@ -143,16 +143,16 @@
     absl::Span<const Header> headers,
     std::unique_ptr<DataFrameSource> data_source, bool end_stream,
     void* user_data) {
-  return session_->SubmitRequest(headers, std::move(data_source), end_stream,
-                                 user_data);
+  QUICHE_DCHECK(data_source == nullptr);
+  return session_->SubmitRequest(headers, end_stream, user_data);
 }
 
 int OgHttp2Adapter::SubmitResponse(Http2StreamId stream_id,
                                    absl::Span<const Header> headers,
                                    std::unique_ptr<DataFrameSource> data_source,
                                    bool end_stream) {
-  return session_->SubmitResponse(stream_id, headers, std::move(data_source),
-                                  end_stream);
+  QUICHE_DCHECK(data_source == nullptr);
+  return session_->SubmitResponse(stream_id, headers, end_stream);
 }
 
 int OgHttp2Adapter::SubmitTrailer(Http2StreamId stream_id,
diff --git a/quiche/http2/adapter/oghttp2_adapter_test.cc b/quiche/http2/adapter/oghttp2_adapter_test.cc
index 1e9b619..932e083 100644
--- a/quiche/http2/adapter/oghttp2_adapter_test.cc
+++ b/quiche/http2/adapter/oghttp2_adapter_test.cc
@@ -3809,7 +3809,7 @@
 
 // This test verifies how oghttp2 behaves when a connection becomes
 // write-blocked while sending HEADERS.
-TEST(OgHttp2AdapterTest, ClientSubmitRequestWithDataProviderAndWriteBlock) {
+TEST(OgHttp2AdapterTest, ClientSubmitRequestWithWriteBlock) {
   TestVisitor visitor;
   OgHttp2Adapter::Options options;
   options.perspective = Perspective::kClient;
@@ -3829,8 +3829,6 @@
 
   const absl::string_view kBody = "This is an example request body.";
 
-  std::unique_ptr<DataFrameSource> frame_source =
-      std::make_unique<VisitorDataSource>(visitor, 1);
   visitor.AppendPayloadForStream(1, kBody);
   visitor.SetEndData(1, true);
   int stream_id =
@@ -3838,7 +3836,7 @@
                                         {":scheme", "http"},
                                         {":authority", "example.com"},
                                         {":path", "/this/is/request/one"}}),
-                             std::move(frame_source), false, nullptr);
+                             nullptr, false, nullptr);
   EXPECT_GT(stream_id, 0);
   EXPECT_TRUE(adapter->want_write());
 
diff --git a/quiche/http2/adapter/oghttp2_session.cc b/quiche/http2/adapter/oghttp2_session.cc
index fe59df7..296fa2c 100644
--- a/quiche/http2/adapter/oghttp2_session.cc
+++ b/quiche/http2/adapter/oghttp2_session.cc
@@ -658,49 +658,6 @@
   return write_scheduler_.PopNextReadyStream();
 }
 
-int32_t OgHttp2Session::SubmitRequestInternal(
-    absl::Span<const Header> headers,
-    std::unique_ptr<DataFrameSource> data_source, bool end_stream,
-    void* user_data) {
-  // TODO(birenroy): return an error for the incorrect perspective
-  const Http2StreamId stream_id = next_stream_id_;
-  next_stream_id_ += 2;
-  if (!pending_streams_.empty() || !CanCreateStream()) {
-    // TODO(diannahu): There should probably be a limit to the number of allowed
-    // pending streams.
-    pending_streams_.insert(
-        {stream_id,
-         PendingStreamState{ToHeaderBlock(headers), std::move(data_source),
-                            user_data, end_stream}});
-    StartPendingStreams();
-  } else {
-    StartRequest(stream_id, ToHeaderBlock(headers), std::move(data_source),
-                 user_data, end_stream);
-  }
-  return stream_id;
-}
-
-int OgHttp2Session::SubmitResponseInternal(
-    Http2StreamId stream_id, absl::Span<const Header> headers,
-    std::unique_ptr<DataFrameSource> data_source, bool end_stream) {
-  // TODO(birenroy): return an error for the incorrect perspective
-  auto iter = stream_map_.find(stream_id);
-  if (iter == stream_map_.end()) {
-    QUICHE_LOG(ERROR) << "Unable to find stream " << stream_id;
-    return -501;  // NGHTTP2_ERR_INVALID_ARGUMENT
-  }
-  if (data_source != nullptr) {
-    // Add data source to stream state
-    iter->second.outbound_body = std::move(data_source);
-    write_scheduler_.MarkStreamReady(stream_id, false);
-  } else if (!end_stream) {
-    iter->second.check_visitor_for_body = true;
-    write_scheduler_.MarkStreamReady(stream_id, false);
-  }
-  SendHeaders(stream_id, ToHeaderBlock(headers), end_stream);
-  return 0;
-}
-
 OgHttp2Session::SendResult OgHttp2Session::MaybeSendBufferedData() {
   int64_t result = std::numeric_limits<int64_t>::max();
   while (result > 0 && !buffered_data_.Empty()) {
@@ -1018,20 +975,39 @@
   }
 }
 
-int32_t OgHttp2Session::SubmitRequest(
-    absl::Span<const Header> headers,
-    std::unique_ptr<DataFrameSource> data_source, bool end_stream,
-    void* user_data) {
-  return SubmitRequestInternal(headers, std::move(data_source), end_stream,
-                               user_data);
+int32_t OgHttp2Session::SubmitRequest(absl::Span<const Header> headers,
+                                      bool end_stream, void* user_data) {
+  // TODO(birenroy): return an error for the incorrect perspective
+  const Http2StreamId stream_id = next_stream_id_;
+  next_stream_id_ += 2;
+  if (!pending_streams_.empty() || !CanCreateStream()) {
+    // TODO(diannahu): There should probably be a limit to the number of allowed
+    // pending streams.
+    pending_streams_.insert(
+        {stream_id,
+         PendingStreamState{ToHeaderBlock(headers), user_data, end_stream}});
+    StartPendingStreams();
+  } else {
+    StartRequest(stream_id, ToHeaderBlock(headers), user_data, end_stream);
+  }
+  return stream_id;
 }
 
 int OgHttp2Session::SubmitResponse(Http2StreamId stream_id,
                                    absl::Span<const Header> headers,
-                                   std::unique_ptr<DataFrameSource> data_source,
                                    bool end_stream) {
-  return SubmitResponseInternal(stream_id, headers, std::move(data_source),
-                                end_stream);
+  // TODO(birenroy): return an error for the incorrect perspective
+  auto iter = stream_map_.find(stream_id);
+  if (iter == stream_map_.end()) {
+    QUICHE_LOG(ERROR) << "Unable to find stream " << stream_id;
+    return -501;  // NGHTTP2_ERR_INVALID_ARGUMENT
+  }
+  if (!end_stream) {
+    iter->second.check_visitor_for_body = true;
+    write_scheduler_.MarkStreamReady(stream_id, false);
+  }
+  SendHeaders(stream_id, ToHeaderBlock(headers), end_stream);
+  return 0;
 }
 
 int OgHttp2Session::SubmitTrailer(Http2StreamId stream_id,
@@ -1874,7 +1850,6 @@
 
 void OgHttp2Session::StartRequest(Http2StreamId stream_id,
                                   quiche::HttpHeaderBlock headers,
-                                  std::unique_ptr<DataFrameSource> data_source,
                                   void* user_data, bool end_stream) {
   if (received_goaway_) {
     // Do not start new streams after receiving a GOAWAY.
@@ -1883,10 +1858,7 @@
   }
 
   auto iter = CreateStream(stream_id);
-  if (data_source != nullptr) {
-    iter->second.outbound_body = std::move(data_source);
-    write_scheduler_.MarkStreamReady(stream_id, false);
-  } else if (!end_stream) {
+  if (!end_stream) {
     iter->second.check_visitor_for_body = true;
     write_scheduler_.MarkStreamReady(stream_id, false);
   }
@@ -1903,7 +1875,6 @@
   while (!pending_streams_.empty() && CanCreateStream()) {
     auto& [stream_id, pending_stream] = pending_streams_.front();
     StartRequest(stream_id, std::move(pending_stream.headers),
-                 std::move(pending_stream.data_source),
                  pending_stream.user_data, pending_stream.end_stream);
     pending_streams_.pop_front();
   }
@@ -2121,8 +2092,7 @@
 }
 
 bool OgHttp2Session::HasMoreData(const StreamState& stream_state) const {
-  return stream_state.outbound_body != nullptr ||
-         stream_state.check_visitor_for_body;
+  return stream_state.check_visitor_for_body;
 }
 
 bool OgHttp2Session::IsReadyToWriteData(const StreamState& stream_state) const {
@@ -2130,21 +2100,13 @@
 }
 
 void OgHttp2Session::AbandonData(StreamState& stream_state) {
-  stream_state.outbound_body = nullptr;
   stream_state.check_visitor_for_body = false;
 }
 
 OgHttp2Session::DataFrameHeaderInfo OgHttp2Session::GetDataFrameInfo(
     Http2StreamId stream_id, size_t flow_control_available,
     StreamState& stream_state) {
-  if (stream_state.outbound_body != nullptr) {
-    DataFrameHeaderInfo info;
-    std::tie(info.payload_length, info.end_data) =
-        stream_state.outbound_body->SelectPayloadLength(flow_control_available);
-    info.end_stream =
-        info.end_data ? stream_state.outbound_body->send_fin() : false;
-    return info;
-  } else if (stream_state.check_visitor_for_body) {
+  if (stream_state.check_visitor_for_body) {
     DataFrameHeaderInfo info =
         visitor_.OnReadyToSendDataForStream(stream_id, flow_control_available);
     info.end_data = info.end_data || info.end_stream;
@@ -2159,12 +2121,8 @@
                                    absl::string_view frame_header,
                                    size_t payload_length,
                                    StreamState& stream_state) {
-  if (stream_state.outbound_body != nullptr) {
-    return stream_state.outbound_body->Send(frame_header, payload_length);
-  } else {
-    QUICHE_DCHECK(stream_state.check_visitor_for_body);
-    return visitor_.SendDataFrame(stream_id, frame_header, payload_length);
-  }
+  QUICHE_DCHECK(stream_state.check_visitor_for_body);
+  return visitor_.SendDataFrame(stream_id, frame_header, payload_length);
 }
 
 }  // namespace adapter
diff --git a/quiche/http2/adapter/oghttp2_session.h b/quiche/http2/adapter/oghttp2_session.h
index 4a4221c..73d9e26 100644
--- a/quiche/http2/adapter/oghttp2_session.h
+++ b/quiche/http2/adapter/oghttp2_session.h
@@ -108,10 +108,8 @@
   int Send();
 
   int32_t SubmitRequest(absl::Span<const Header> headers,
-                        std::unique_ptr<DataFrameSource> data_source,
                         bool end_stream, void* user_data);
   int SubmitResponse(Http2StreamId stream_id, absl::Span<const Header> headers,
-                     std::unique_ptr<DataFrameSource> data_source,
                      bool end_stream);
   int SubmitTrailer(Http2StreamId stream_id, absl::Span<const Header> trailers);
   void SubmitMetadata(Http2StreamId stream_id,
@@ -248,7 +246,6 @@
           send_window(stream_send_window) {}
 
     WindowManager window_manager;
-    std::unique_ptr<DataFrameSource> outbound_body;
     std::unique_ptr<quiche::HttpHeaderBlock> trailers;
     void* user_data = nullptr;
     int32_t send_window;
@@ -266,7 +263,6 @@
 
   struct QUICHE_EXPORT PendingStreamState {
     quiche::HttpHeaderBlock headers;
-    std::unique_ptr<DataFrameSource> data_source;
     void* user_data = nullptr;
     bool end_stream;
   };
@@ -374,14 +370,6 @@
   // streams, returns zero.
   Http2StreamId GetNextReadyStream();
 
-  int32_t SubmitRequestInternal(absl::Span<const Header> headers,
-                                std::unique_ptr<DataFrameSource> data_source,
-                                bool end_stream, void* user_data);
-  int SubmitResponseInternal(Http2StreamId stream_id,
-                             absl::Span<const Header> headers,
-                             std::unique_ptr<DataFrameSource> data_source,
-                             bool end_stream);
-
   // Sends the buffered connection preface or serialized frame data, if any.
   SendResult MaybeSendBufferedData();
 
@@ -419,7 +407,6 @@
   // Creates a stream for `stream_id`, stores the `data_source` and `user_data`
   // in the stream state, and sends the `headers`.
   void StartRequest(Http2StreamId stream_id, quiche::HttpHeaderBlock headers,
-                    std::unique_ptr<DataFrameSource> data_source,
                     void* user_data, bool end_stream);
 
   // Sends headers for pending streams as long as the stream limit allows.
diff --git a/quiche/http2/adapter/oghttp2_session_test.cc b/quiche/http2/adapter/oghttp2_session_test.cc
index 1fa44fd..89e3001 100644
--- a/quiche/http2/adapter/oghttp2_session_test.cc
+++ b/quiche/http2/adapter/oghttp2_session_test.cc
@@ -97,7 +97,7 @@
                                        {":scheme", "http"},
                                        {":authority", "example.com"},
                                        {":path", "/this/is/request/one"}}),
-                            nullptr, false, const_cast<char*>(kSentinel1));
+                            false, const_cast<char*>(kSentinel1));
   ASSERT_EQ(stream_id, 1);
 
   // Submit another request to ensure the next stream is created.
@@ -106,7 +106,7 @@
                                        {":scheme", "http"},
                                        {":authority", "example.com"},
                                        {":path", "/this/is/request/two"}}),
-                            nullptr, true, nullptr);
+                            true, nullptr);
   EXPECT_EQ(stream_id2, 3);
 
   const std::string stream_frames =
@@ -282,7 +282,7 @@
                                        {":scheme", "http"},
                                        {":authority", "example.com"},
                                        {":path", "/this/is/request/one"}}),
-                            nullptr, false, const_cast<char*>(kSentinel1));
+                            false, const_cast<char*>(kSentinel1));
   ASSERT_EQ(stream_id, 1);
   EXPECT_TRUE(session.want_write());
   EXPECT_EQ(kSentinel1, session.GetStreamUserData(stream_id));
@@ -313,7 +313,7 @@
                                        {":scheme", "http"},
                                        {":authority", "example.com"},
                                        {":path", "/this/is/request/two"}}),
-                            nullptr, true, nullptr);
+                            true, nullptr);
   EXPECT_GT(stream_id, 0);
   EXPECT_TRUE(session.want_write());
   const char* kSentinel2 = "arbitrary pointer 2";
@@ -392,7 +392,7 @@
                                        {":scheme", "http"},
                                        {":authority", "example.com"},
                                        {":path", "/this/is/request/one"}}),
-                            nullptr, false, nullptr);
+                            false, nullptr);
   ASSERT_EQ(stream_id, 1);
   EXPECT_TRUE(session.want_write());
 
@@ -424,7 +424,7 @@
                                        {":scheme", "http"},
                                        {":authority", "example.com"},
                                        {":path", "/this/is/request/one"}}),
-                            nullptr, false, const_cast<char*>(kSentinel1));
+                            false, const_cast<char*>(kSentinel1));
   EXPECT_GT(stream_id, 0);
   EXPECT_TRUE(session.want_write());
   EXPECT_EQ(kSentinel1, session.GetStreamUserData(stream_id));
@@ -478,7 +478,7 @@
                                        {":scheme", "http"},
                                        {":authority", "example.com"},
                                        {":path", "/this/is/request/one"}}),
-                            nullptr, false, const_cast<char*>(kSentinel1));
+                            false, const_cast<char*>(kSentinel1));
   EXPECT_GT(stream_id, 0);
   EXPECT_TRUE(session.want_write());
   EXPECT_EQ(kSentinel1, session.GetStreamUserData(stream_id));
@@ -533,7 +533,7 @@
                                        {":scheme", "http"},
                                        {":authority", "example.com"},
                                        {":path", "/this/is/request/one"}}),
-                            nullptr, false, const_cast<char*>(kSentinel1));
+                            false, const_cast<char*>(kSentinel1));
   EXPECT_GT(stream_id, 0);
   EXPECT_TRUE(session.want_write());
   EXPECT_EQ(kSentinel1, session.GetStreamUserData(stream_id));
@@ -804,7 +804,7 @@
       1,
       ToHeaders({{":status", "404"},
                  {"x-comment", "I have no idea what you're talking about."}}),
-      nullptr, false);
+      false);
   EXPECT_EQ(submit_result, 0);
   EXPECT_TRUE(session.want_write());
 
@@ -893,7 +893,7 @@
   visitor.SetEndData(1, false);
   int submit_result = session.SubmitResponse(
       1, ToHeaders({{":status", "200"}, {"x-comment", "Sure, sounds good."}}),
-      nullptr, false);
+      false);
   EXPECT_EQ(submit_result, 0);
   EXPECT_TRUE(session.want_write());
 
@@ -984,7 +984,7 @@
   visitor.SetEndData(1, false);
   int submit_result = session.SubmitResponse(
       1, ToHeaders({{":status", "200"}, {"x-comment", "Sure, sounds good."}}),
-      nullptr, false);
+      false);
   EXPECT_EQ(submit_result, 0);
   EXPECT_TRUE(session.want_write());
   // There has not been a call to Send() yet, so neither headers nor body have
diff --git a/quiche/http2/adapter/test_utils.cc b/quiche/http2/adapter/test_utils.cc
index 1787ddf..9b96fde 100644
--- a/quiche/http2/adapter/test_utils.cc
+++ b/quiche/http2/adapter/test_utils.cc
@@ -124,25 +124,6 @@
   outbound_metadata_map_.insert({stream_id, EncodeHeaders(payload)});
 }
 
-VisitorDataSource::VisitorDataSource(Http2VisitorInterface& visitor,
-                                     Http2StreamId stream_id)
-    : visitor_(visitor), stream_id_(stream_id) {}
-
-bool VisitorDataSource::send_fin() const { return has_fin_; }
-
-std::pair<int64_t, bool> VisitorDataSource::SelectPayloadLength(
-    size_t max_length) {
-  auto [payload_length, end_data, end_stream] =
-      visitor_.OnReadyToSendDataForStream(stream_id_, max_length);
-  has_fin_ = end_stream;
-  return {payload_length, end_data};
-}
-
-bool VisitorDataSource::Send(absl::string_view frame_header,
-                             size_t payload_length) {
-  return visitor_.SendDataFrame(stream_id_, frame_header, payload_length);
-}
-
 TestMetadataSource::TestMetadataSource(const quiche::HttpHeaderBlock& entries)
     : encoded_entries_(EncodeHeaders(entries)) {
   remaining_ = encoded_entries_;
diff --git a/quiche/http2/adapter/test_utils.h b/quiche/http2/adapter/test_utils.h
index 05e1c53..3a54a37 100644
--- a/quiche/http2/adapter/test_utils.h
+++ b/quiche/http2/adapter/test_utils.h
@@ -104,22 +104,6 @@
   bool has_write_error_ = false;
 };
 
-// A DataFrameSource that invokes visitor methods.
-class QUICHE_NO_EXPORT VisitorDataSource : public DataFrameSource {
- public:
-  VisitorDataSource(Http2VisitorInterface& visitor, Http2StreamId stream_id);
-
-  std::pair<int64_t, bool> SelectPayloadLength(size_t max_length) override;
-  bool Send(absl::string_view frame_header, size_t payload_length) override;
-  bool send_fin() const override;
-
- private:
-  Http2VisitorInterface& visitor_;
-  const Http2StreamId stream_id_;
-  // Whether the stream should end with the final frame of data.
-  bool has_fin_ = false;
-};
-
 class QUICHE_NO_EXPORT TestMetadataSource : public MetadataSource {
  public:
   explicit TestMetadataSource(const quiche::HttpHeaderBlock& entries);
