diff --git a/build/source_list.bzl b/build/source_list.bzl
index 2492384..933ba80 100644
--- a/build/source_list.bzl
+++ b/build/source_list.bzl
@@ -1436,7 +1436,6 @@
     "http2/adapter/nghttp2_adapter_test.cc",
     "http2/adapter/nghttp2_data_provider_test.cc",
     "http2/adapter/nghttp2_session_test.cc",
-    "http2/adapter/nghttp2_util_test.cc",
 ]
 default_platform_impl_hdrs = [
     "common/platform/default/quiche_platform_impl/quiche_bug_tracker_impl.h",
diff --git a/build/source_list.gni b/build/source_list.gni
index b9d9c23..db4f4ad 100644
--- a/build/source_list.gni
+++ b/build/source_list.gni
@@ -1440,7 +1440,6 @@
     "src/quiche/http2/adapter/nghttp2_adapter_test.cc",
     "src/quiche/http2/adapter/nghttp2_data_provider_test.cc",
     "src/quiche/http2/adapter/nghttp2_session_test.cc",
-    "src/quiche/http2/adapter/nghttp2_util_test.cc",
 ]
 default_platform_impl_hdrs = [
     "src/quiche/common/platform/default/quiche_platform_impl/quiche_bug_tracker_impl.h",
diff --git a/build/source_list.json b/build/source_list.json
index 2e77d42..2f041c7 100644
--- a/build/source_list.json
+++ b/build/source_list.json
@@ -1438,8 +1438,7 @@
     "quiche/http2/adapter/callback_visitor_test.cc",
     "quiche/http2/adapter/nghttp2_adapter_test.cc",
     "quiche/http2/adapter/nghttp2_data_provider_test.cc",
-    "quiche/http2/adapter/nghttp2_session_test.cc",
-    "quiche/http2/adapter/nghttp2_util_test.cc"
+    "quiche/http2/adapter/nghttp2_session_test.cc"
   ],
   "default_platform_impl_hdrs": [
     "quiche/common/platform/default/quiche_platform_impl/quiche_bug_tracker_impl.h",
diff --git a/quiche/http2/adapter/data_source.h b/quiche/http2/adapter/data_source.h
index ffd78a0..589e768 100644
--- a/quiche/http2/adapter/data_source.h
+++ b/quiche/http2/adapter/data_source.h
@@ -11,26 +11,10 @@
 namespace http2 {
 namespace adapter {
 
-// Represents a source of DATA frames for transmission to the peer.
+// TODO(birenroy): move the remaining constants.
 class QUICHE_EXPORT DataFrameSource {
  public:
-  virtual ~DataFrameSource() {}
-
   enum : int64_t { kBlocked = 0, kError = -1 };
-
-  // Returns the number of bytes to send in the next DATA frame, and whether
-  // this frame indicates the end of the data. Returns {kBlocked, false} if
-  // blocked, {kError, false} on error.
-  virtual std::pair<int64_t, bool> SelectPayloadLength(size_t max_length) = 0;
-
-  // This method is called with a frame header and a payload length to send. The
-  // source should send or buffer the entire frame and return true, or return
-  // false without sending or buffering anything.
-  virtual bool Send(absl::string_view frame_header, size_t payload_length) = 0;
-
-  // If true, the end of this data source indicates the end of the stream.
-  // Otherwise, this data will be followed by trailers.
-  virtual bool send_fin() const = 0;
 };
 
 // Represents a source of metadata frames for transmission to the peer.
diff --git a/quiche/http2/adapter/nghttp2_util.cc b/quiche/http2/adapter/nghttp2_util.cc
index c2b8245..f54ca9d 100644
--- a/quiche/http2/adapter/nghttp2_util.cc
+++ b/quiche/http2/adapter/nghttp2_util.cc
@@ -163,67 +163,6 @@
   return InvalidFrameError::kProtocol;
 }
 
-class Nghttp2DataFrameSource : public DataFrameSource {
- public:
-  Nghttp2DataFrameSource(nghttp2_data_provider provider,
-                         nghttp2_send_data_callback send_data, void* user_data)
-      : provider_(std::move(provider)),
-        send_data_(std::move(send_data)),
-        user_data_(user_data) {}
-
-  std::pair<int64_t, bool> SelectPayloadLength(size_t max_length) override {
-    const int32_t stream_id = 0;
-    uint32_t data_flags = 0;
-    int64_t result = provider_.read_callback(
-        nullptr /* session */, stream_id, nullptr /* buf */, max_length,
-        &data_flags, &provider_.source, nullptr /* user_data */);
-    if (result == NGHTTP2_ERR_DEFERRED) {
-      return {kBlocked, false};
-    } else if (result < 0) {
-      return {kError, false};
-    } else if ((data_flags & NGHTTP2_DATA_FLAG_NO_COPY) == 0) {
-      QUICHE_LOG(ERROR) << "Source did not use the zero-copy API!";
-      return {kError, false};
-    } else {
-      const bool eof = data_flags & NGHTTP2_DATA_FLAG_EOF;
-      if (eof && (data_flags & NGHTTP2_DATA_FLAG_NO_END_STREAM) == 0) {
-        send_fin_ = true;
-      }
-      return {result, eof};
-    }
-  }
-
-  bool Send(absl::string_view frame_header, size_t payload_length) override {
-    nghttp2_frame frame;
-    frame.hd.type = 0;
-    frame.hd.length = payload_length;
-    frame.hd.flags = 0;
-    frame.hd.stream_id = 0;
-    frame.data.padlen = 0;
-    const int result = send_data_(
-        nullptr /* session */, &frame, ToUint8Ptr(frame_header.data()),
-        payload_length, &provider_.source, user_data_);
-    QUICHE_LOG_IF(ERROR, result < 0 && result != NGHTTP2_ERR_WOULDBLOCK)
-        << "Unexpected error code from send: " << result;
-    return result == 0;
-  }
-
-  bool send_fin() const override { return send_fin_; }
-
- private:
-  nghttp2_data_provider provider_;
-  nghttp2_send_data_callback send_data_;
-  void* user_data_;
-  bool send_fin_ = false;
-};
-
-std::unique_ptr<DataFrameSource> MakeZeroCopyDataFrameSource(
-    nghttp2_data_provider provider, void* user_data,
-    nghttp2_send_data_callback send_data) {
-  return std::make_unique<Nghttp2DataFrameSource>(
-      std::move(provider), std::move(send_data), user_data);
-}
-
 absl::string_view ErrorString(uint32_t error_code) {
   return Http2ErrorCodeToString(static_cast<Http2ErrorCode>(error_code));
 }
diff --git a/quiche/http2/adapter/nghttp2_util.h b/quiche/http2/adapter/nghttp2_util.h
index 5e08e8c..5b9f468 100644
--- a/quiche/http2/adapter/nghttp2_util.h
+++ b/quiche/http2/adapter/nghttp2_util.h
@@ -61,13 +61,6 @@
 int ToNgHttp2ErrorCode(Http2VisitorInterface::InvalidFrameError error);
 Http2VisitorInterface::InvalidFrameError ToInvalidFrameError(int error);
 
-// Transforms a nghttp2_data_provider into a DataFrameSource. Assumes that
-// |provider| uses the zero-copy nghttp2_data_source_read_callback API. Unsafe
-// otherwise.
-std::unique_ptr<DataFrameSource> MakeZeroCopyDataFrameSource(
-    nghttp2_data_provider provider, void* user_data,
-    nghttp2_send_data_callback send_data);
-
 void LogBeforeSend(const nghttp2_frame& frame);
 
 }  // namespace adapter
diff --git a/quiche/http2/adapter/nghttp2_util_test.cc b/quiche/http2/adapter/nghttp2_util_test.cc
deleted file mode 100644
index 69b85f5..0000000
--- a/quiche/http2/adapter/nghttp2_util_test.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-#include "quiche/http2/adapter/nghttp2_util.h"
-
-#include <memory>
-#include <string>
-
-#include "quiche/http2/adapter/nghttp2_test_utils.h"
-#include "quiche/http2/adapter/test_utils.h"
-#include "quiche/common/platform/api/quiche_test.h"
-
-namespace http2 {
-namespace adapter {
-namespace test {
-namespace {
-
-// This send callback assumes |source|'s pointer is a TestDataSource, and
-// |user_data| is a std::string.
-int FakeSendCallback(nghttp2_session*, nghttp2_frame* /*frame*/,
-                     const uint8_t* framehd, size_t length,
-                     nghttp2_data_source* source, void* user_data) {
-  auto* dest = static_cast<std::string*>(user_data);
-  // Appends the frame header to the string.
-  absl::StrAppend(dest, ToStringView(framehd, 9));
-  auto* test_source = static_cast<TestDataSource*>(source->ptr);
-  absl::string_view payload = test_source->ReadNext(length);
-  // Appends the frame payload to the string.
-  absl::StrAppend(dest, payload);
-  return 0;
-}
-
-TEST(MakeZeroCopyDataFrameSource, EmptyPayload) {
-  std::string result;
-
-  const absl::string_view kEmptyBody = "";
-  TestDataSource body1{kEmptyBody};
-  // The TestDataSource is wrapped in the nghttp2_data_provider data type.
-  nghttp2_data_provider provider = body1.MakeDataProvider();
-
-  // This call transforms it back into a DataFrameSource, which is compatible
-  // with the Http2Adapter API.
-  std::unique_ptr<DataFrameSource> frame_source =
-      MakeZeroCopyDataFrameSource(provider, &result, FakeSendCallback);
-  auto [length, eof] = frame_source->SelectPayloadLength(100);
-  EXPECT_EQ(length, 0);
-  EXPECT_TRUE(eof);
-  frame_source->Send("ninebytes", 0);
-  EXPECT_EQ(result, "ninebytes");
-}
-
-TEST(MakeZeroCopyDataFrameSource, ShortPayload) {
-  std::string result;
-
-  const absl::string_view kShortBody =
-      "<html><head><title>Example Page!</title></head>"
-      "<body><div><span><table><tr><th><blink>Wow!!"
-      "</blink></th></tr></table></span></div></body>"
-      "</html>";
-  TestDataSource body1{kShortBody};
-  // The TestDataSource is wrapped in the nghttp2_data_provider data type.
-  nghttp2_data_provider provider = body1.MakeDataProvider();
-
-  // This call transforms it back into a DataFrameSource, which is compatible
-  // with the Http2Adapter API.
-  std::unique_ptr<DataFrameSource> frame_source =
-      MakeZeroCopyDataFrameSource(provider, &result, FakeSendCallback);
-  auto [length, eof] = frame_source->SelectPayloadLength(200);
-  EXPECT_EQ(length, kShortBody.size());
-  EXPECT_TRUE(eof);
-  frame_source->Send("ninebytes", length);
-  EXPECT_EQ(result, absl::StrCat("ninebytes", kShortBody));
-}
-
-TEST(MakeZeroCopyDataFrameSource, MultiFramePayload) {
-  std::string result;
-
-  const absl::string_view kShortBody =
-      "<html><head><title>Example Page!</title></head>"
-      "<body><div><span><table><tr><th><blink>Wow!!"
-      "</blink></th></tr></table></span></div></body>"
-      "</html>";
-  TestDataSource body1{kShortBody};
-  // The TestDataSource is wrapped in the nghttp2_data_provider data type.
-  nghttp2_data_provider provider = body1.MakeDataProvider();
-
-  // This call transforms it back into a DataFrameSource, which is compatible
-  // with the Http2Adapter API.
-  std::unique_ptr<DataFrameSource> frame_source =
-      MakeZeroCopyDataFrameSource(provider, &result, FakeSendCallback);
-  auto ret = frame_source->SelectPayloadLength(50);
-  EXPECT_EQ(ret.first, 50);
-  EXPECT_FALSE(ret.second);
-  frame_source->Send("ninebyte1", ret.first);
-
-  ret = frame_source->SelectPayloadLength(50);
-  EXPECT_EQ(ret.first, 50);
-  EXPECT_FALSE(ret.second);
-  frame_source->Send("ninebyte2", ret.first);
-
-  ret = frame_source->SelectPayloadLength(50);
-  EXPECT_EQ(ret.first, 44);
-  EXPECT_TRUE(ret.second);
-  frame_source->Send("ninebyte3", ret.first);
-
-  EXPECT_EQ(result,
-            "ninebyte1<html><head><title>Example Page!</title></head><bo"
-            "ninebyte2dy><div><span><table><tr><th><blink>Wow!!</blink><"
-            "ninebyte3/th></tr></table></span></div></body></html>");
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace adapter
-}  // namespace http2
