diff --git a/quiche/quic/core/http/end_to_end_test.cc b/quiche/quic/core/http/end_to_end_test.cc
index 0e2c867..50fe6a3 100644
--- a/quiche/quic/core/http/end_to_end_test.cc
+++ b/quiche/quic/core/http/end_to_end_test.cc
@@ -26,7 +26,7 @@
 #include "quiche/quic/core/quic_connection.h"
 #include "quiche/quic/core/quic_constants.h"
 #include "quiche/quic/core/quic_data_writer.h"
-#include "quiche/quic/core/quic_epoll_connection_helper.h"
+#include "quiche/quic/core/quic_default_clock.h"
 #include "quiche/quic/core/quic_error_codes.h"
 #include "quiche/quic/core/quic_framer.h"
 #include "quiche/quic/core/quic_packet_creator.h"
@@ -35,7 +35,6 @@
 #include "quiche/quic/core/quic_session.h"
 #include "quiche/quic/core/quic_types.h"
 #include "quiche/quic/core/quic_utils.h"
-#include "quiche/quic/platform/api/quic_epoll.h"
 #include "quiche/quic/platform/api/quic_expect_bug.h"
 #include "quiche/quic/platform/api/quic_flags.h"
 #include "quiche/quic/platform/api/quic_logging.h"
@@ -199,15 +198,15 @@
 
 class ClientDelegate : public PacketDroppingTestWriter::Delegate {
  public:
-  explicit ClientDelegate(QuicClient* client) : client_(client) {}
+  explicit ClientDelegate(QuicDefaultClient* client) : client_(client) {}
   ~ClientDelegate() override = default;
   void OnCanWrite() override {
-    QuicEpollEvent event(EPOLLOUT);
-    client_->epoll_network_helper()->OnEvent(client_->GetLatestFD(), &event);
+    client_->default_network_helper()->OnSocketEvent(
+        nullptr, client_->GetLatestFD(), kSocketEventWritable);
   }
 
  private:
-  QuicClient* client_;
+  QuicDefaultClient* client_;
 };
 
 class EndToEndTest : public QuicTestWithParam<TestParams> {
@@ -258,11 +257,12 @@
   }
 
   QuicTestClient* CreateQuicClient(QuicPacketWriterWrapper* writer) {
-    QuicTestClient* client =
-        new QuicTestClient(server_address_, server_hostname_, client_config_,
-                           client_supported_versions_,
-                           crypto_test_utils::ProofVerifierForTesting(),
-                           std::make_unique<QuicClientSessionCache>());
+    QuicTestClient* client = new QuicTestClient(
+        server_address_, server_hostname_, client_config_,
+        client_supported_versions_,
+        crypto_test_utils::ProofVerifierForTesting(),
+        std::make_unique<QuicClientSessionCache>(),
+        GetParam().event_loop->Create(QuicDefaultClock::Get()));
     client->SetUserAgentID(kTestUserAgentId);
     client->UseWriter(writer);
     if (!pre_shared_key_client_.empty()) {
@@ -449,7 +449,6 @@
       ADD_FAILURE() << "Missing MockableQuicClient";
       return false;
     }
-    static QuicEpollEvent event(EPOLLOUT);
     if (client_writer_ != nullptr) {
       QuicConnection* client_connection = GetClientConnection();
       if (client_connection == nullptr) {
@@ -2256,7 +2255,7 @@
   // Regression test for b/14677858.
   // Test that the resume write alarm is not set in QuicConnection::OnCanWrite
   // if currently connection level flow control blocked. If set, this results in
-  // an infinite loop in the EpollServer, as the alarm fires and is immediately
+  // an infinite loop in the EventLoop, as the alarm fires and is immediately
   // rescheduled.
   ASSERT_TRUE(Initialize());
   EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
@@ -3452,10 +3451,12 @@
 
   // Create a new socket before closing the old one, which will result in a new
   // ephemeral port.
-  QuicClientPeer::CreateUDPSocketAndBind(client_->client());
+  client_->client()->network_helper()->CreateUDPSocketAndBind(
+      client_->client()->server_address(), client_->client()->bind_to_address(),
+      client_->client()->local_port());
 
   // Stop listening and close the old FD.
-  QuicClientPeer::CleanUpUDPSocket(client_->client(), old_fd);
+  client_->client()->default_network_helper()->CleanUpUDPSocket(old_fd);
 
   // The packet writer needs to be updated to use the new FD.
   client_->client()->network_helper()->CreateQuicPacketWriter();
@@ -3467,19 +3468,13 @@
   // FD rather than any more complex NAT rebinding simulation.
   int new_port =
       client_->client()->network_helper()->GetLatestClientAddress().port();
-  QuicClientPeer::SetClientPort(client_->client(), new_port);
+  client_->client()->default_network_helper()->SetClientPort(new_port);
   QuicConnection* client_connection = GetClientConnection();
   ASSERT_TRUE(client_connection);
   QuicConnectionPeer::SetSelfAddress(
       client_connection,
       QuicSocketAddress(client_connection->self_address().host(), new_port));
 
-  // Register the new FD for epoll events.
-  int new_fd = client_->client()->GetLatestFD();
-  QuicEpollServer* eps = client_->epoll_server();
-  eps->RegisterFD(new_fd, client_->client()->epoll_network_helper(),
-                  EPOLLIN | EPOLLOUT | EPOLLET);
-
   // Send a second request, using the new FD.
   SendSynchronousBarRequestAndCheckResponse();
 
@@ -4707,9 +4702,6 @@
   ServerStreamThatDropsBodyFactory stream_factory;
   SetSpdyStreamFactory(&stream_factory);
   ASSERT_TRUE(Initialize());
-  // Set client's epoll server's time out to 0 to make this test be finished
-  // within a short time.
-  client_->epoll_server()->set_timeout_in_us(0);
 
   EXPECT_TRUE(client_->client()->WaitForOneRttKeysAvailable());
   SetPacketLossPercentage(1);
@@ -4760,7 +4752,6 @@
   client->UseWriter(client_writer_);
   client->Connect();
   client_.reset(client);
-  static QuicEpollEvent event(EPOLLOUT);
   QuicConnection* client_connection = GetClientConnection();
   ASSERT_TRUE(client_connection);
   client_writer_->Initialize(
diff --git a/quiche/quic/test_tools/quic_test_client.cc b/quiche/quic/test_tools/quic_test_client.cc
index 2a82038..32b61ed 100644
--- a/quiche/quic/test_tools/quic_test_client.cc
+++ b/quiche/quic/test_tools/quic_test_client.cc
@@ -14,7 +14,8 @@
 #include "quiche/quic/core/crypto/proof_verifier.h"
 #include "quiche/quic/core/http/quic_spdy_client_stream.h"
 #include "quiche/quic/core/http/spdy_utils.h"
-#include "quiche/quic/core/quic_epoll_connection_helper.h"
+#include "quiche/quic/core/io/quic_default_event_loop.h"
+#include "quiche/quic/core/quic_default_clock.h"
 #include "quiche/quic/core/quic_packet_writer_wrapper.h"
 #include "quiche/quic/core/quic_server_id.h"
 #include "quiche/quic/core/quic_utils.h"
@@ -133,17 +134,17 @@
 };
 }  // namespace
 
-class MockableQuicClientEpollNetworkHelper
-    : public QuicClientEpollNetworkHelper {
+class MockableQuicClientDefaultNetworkHelper
+    : public QuicClientDefaultNetworkHelper {
  public:
-  using QuicClientEpollNetworkHelper::QuicClientEpollNetworkHelper;
-  ~MockableQuicClientEpollNetworkHelper() override = default;
+  using QuicClientDefaultNetworkHelper::QuicClientDefaultNetworkHelper;
+  ~MockableQuicClientDefaultNetworkHelper() override = default;
 
   void ProcessPacket(const QuicSocketAddress& self_address,
                      const QuicSocketAddress& peer_address,
                      const QuicReceivedPacket& packet) override {
-    QuicClientEpollNetworkHelper::ProcessPacket(self_address, peer_address,
-                                                packet);
+    QuicClientDefaultNetworkHelper::ProcessPacket(self_address, peer_address,
+                                                  packet);
     if (track_last_incoming_packet_) {
       last_incoming_packet_ = packet.Clone();
     }
@@ -151,7 +152,7 @@
 
   QuicPacketWriter* CreateQuicPacketWriter() override {
     QuicPacketWriter* writer =
-        QuicClientEpollNetworkHelper::CreateQuicPacketWriter();
+        QuicClientDefaultNetworkHelper::CreateQuicPacketWriter();
     if (!test_writer_) {
       return writer;
     }
@@ -188,35 +189,33 @@
 MockableQuicClient::MockableQuicClient(
     QuicSocketAddress server_address, const QuicServerId& server_id,
     const ParsedQuicVersionVector& supported_versions,
-    QuicEpollServer* epoll_server)
+    QuicEventLoop* event_loop)
     : MockableQuicClient(server_address, server_id, QuicConfig(),
-                         supported_versions, epoll_server) {}
+                         supported_versions, event_loop) {}
 
 MockableQuicClient::MockableQuicClient(
     QuicSocketAddress server_address, const QuicServerId& server_id,
     const QuicConfig& config, const ParsedQuicVersionVector& supported_versions,
-    QuicEpollServer* epoll_server)
+    QuicEventLoop* event_loop)
     : MockableQuicClient(server_address, server_id, config, supported_versions,
-                         epoll_server, nullptr) {}
+                         event_loop, nullptr) {}
 
 MockableQuicClient::MockableQuicClient(
     QuicSocketAddress server_address, const QuicServerId& server_id,
     const QuicConfig& config, const ParsedQuicVersionVector& supported_versions,
-    QuicEpollServer* epoll_server,
-    std::unique_ptr<ProofVerifier> proof_verifier)
+    QuicEventLoop* event_loop, std::unique_ptr<ProofVerifier> proof_verifier)
     : MockableQuicClient(server_address, server_id, config, supported_versions,
-                         epoll_server, std::move(proof_verifier), nullptr) {}
+                         event_loop, std::move(proof_verifier), nullptr) {}
 
 MockableQuicClient::MockableQuicClient(
     QuicSocketAddress server_address, const QuicServerId& server_id,
     const QuicConfig& config, const ParsedQuicVersionVector& supported_versions,
-    QuicEpollServer* epoll_server,
-    std::unique_ptr<ProofVerifier> proof_verifier,
+    QuicEventLoop* event_loop, std::unique_ptr<ProofVerifier> proof_verifier,
     std::unique_ptr<SessionCache> session_cache)
-    : QuicClient(
-          server_address, server_id, supported_versions, config, epoll_server,
-          std::make_unique<MockableQuicClientEpollNetworkHelper>(epoll_server,
-                                                                 this),
+    : QuicDefaultClient(
+          server_address, server_id, supported_versions, config, event_loop,
+          std::make_unique<MockableQuicClientDefaultNetworkHelper>(event_loop,
+                                                                   this),
           std::make_unique<RecordingProofVerifier>(std::move(proof_verifier)),
           std::move(session_cache)),
       override_server_connection_id_(EmptyQuicConnectionId()),
@@ -230,16 +229,16 @@
   }
 }
 
-MockableQuicClientEpollNetworkHelper*
+MockableQuicClientDefaultNetworkHelper*
 MockableQuicClient::mockable_network_helper() {
-  return static_cast<MockableQuicClientEpollNetworkHelper*>(
-      epoll_network_helper());
+  return static_cast<MockableQuicClientDefaultNetworkHelper*>(
+      default_network_helper());
 }
 
-const MockableQuicClientEpollNetworkHelper*
+const MockableQuicClientDefaultNetworkHelper*
 MockableQuicClient::mockable_network_helper() const {
-  return static_cast<const MockableQuicClientEpollNetworkHelper*>(
-      epoll_network_helper());
+  return static_cast<const MockableQuicClientDefaultNetworkHelper*>(
+      default_network_helper());
 }
 
 QuicConnectionId MockableQuicClient::GenerateNewConnectionId() {
@@ -250,7 +249,7 @@
     return QuicUtils::CreateRandomConnectionId(
         override_server_connection_id_length_);
   }
-  return QuicClient::GenerateNewConnectionId();
+  return QuicDefaultClient::GenerateNewConnectionId();
 }
 
 void MockableQuicClient::UseConnectionId(
@@ -272,7 +271,7 @@
     return QuicUtils::CreateRandomConnectionId(
         override_client_connection_id_length_);
   }
-  return QuicClient::GetClientConnectionId();
+  return QuicDefaultClient::GetClientConnectionId();
 }
 
 void MockableQuicClient::UseClientConnectionId(
@@ -314,10 +313,11 @@
 QuicTestClient::QuicTestClient(
     QuicSocketAddress server_address, const std::string& server_hostname,
     const QuicConfig& config, const ParsedQuicVersionVector& supported_versions)
-    : client_(new MockableQuicClient(
+    : event_loop_(GetDefaultEventLoop()->Create(QuicDefaultClock::Get())),
+      client_(new MockableQuicClient(
           server_address,
           QuicServerId(server_hostname, server_address.port(), false), config,
-          supported_versions, &epoll_server_)) {
+          supported_versions, event_loop_.get())) {
   Initialize();
 }
 
@@ -325,10 +325,11 @@
     QuicSocketAddress server_address, const std::string& server_hostname,
     const QuicConfig& config, const ParsedQuicVersionVector& supported_versions,
     std::unique_ptr<ProofVerifier> proof_verifier)
-    : client_(new MockableQuicClient(
+    : event_loop_(GetDefaultEventLoop()->Create(QuicDefaultClock::Get())),
+      client_(new MockableQuicClient(
           server_address,
           QuicServerId(server_hostname, server_address.port(), false), config,
-          supported_versions, &epoll_server_, std::move(proof_verifier))) {
+          supported_versions, event_loop_.get(), std::move(proof_verifier))) {
   Initialize();
 }
 
@@ -337,10 +338,26 @@
     const QuicConfig& config, const ParsedQuicVersionVector& supported_versions,
     std::unique_ptr<ProofVerifier> proof_verifier,
     std::unique_ptr<SessionCache> session_cache)
-    : client_(new MockableQuicClient(
+    : event_loop_(GetDefaultEventLoop()->Create(QuicDefaultClock::Get())),
+      client_(new MockableQuicClient(
           server_address,
           QuicServerId(server_hostname, server_address.port(), false), config,
-          supported_versions, &epoll_server_, std::move(proof_verifier),
+          supported_versions, event_loop_.get(), std::move(proof_verifier),
+          std::move(session_cache))) {
+  Initialize();
+}
+
+QuicTestClient::QuicTestClient(
+    QuicSocketAddress server_address, const std::string& server_hostname,
+    const QuicConfig& config, const ParsedQuicVersionVector& supported_versions,
+    std::unique_ptr<ProofVerifier> proof_verifier,
+    std::unique_ptr<SessionCache> session_cache,
+    std::unique_ptr<QuicEventLoop> event_loop)
+    : event_loop_(std::move(event_loop)),
+      client_(new MockableQuicClient(
+          server_address,
+          QuicServerId(server_hostname, server_address.port(), false), config,
+          supported_versions, event_loop_.get(), std::move(proof_verifier),
           std::move(session_cache))) {
   Initialize();
 }
@@ -636,24 +653,15 @@
 }
 
 bool QuicTestClient::WaitUntil(int timeout_ms, std::function<bool()> trigger) {
-  int64_t timeout_us = timeout_ms * kNumMicrosPerMilli;
-  int64_t old_timeout_us = epoll_server()->timeout_in_us_for_test();
-  if (timeout_us > 0) {
-    epoll_server()->set_timeout_in_us(timeout_us);
-  }
-  const QuicClock* clock =
-      QuicConnectionPeer::GetHelper(client()->session()->connection())
-          ->GetClock();
-  QuicTime end_waiting_time =
-      clock->Now() + QuicTime::Delta::FromMicroseconds(timeout_us);
+  QuicTime::Delta timeout = QuicTime::Delta::FromMilliseconds(timeout_ms);
+  const QuicClock* clock = client()->session()->connection()->clock();
+  QuicTime end_waiting_time = clock->Now() + timeout;
   while (connected() && !(trigger && trigger()) &&
-         (timeout_us < 0 || clock->Now() < end_waiting_time)) {
-    client_->WaitForEvents();
+         (timeout_ms < 0 || clock->Now() < end_waiting_time)) {
+    event_loop_->RunEventLoopOnce(timeout);
+    client_->WaitForEventsPostprocessing();
   }
   ReadNextResponse();
-  if (timeout_us > 0) {
-    epoll_server()->set_timeout_in_us(old_timeout_us);
-  }
   if (trigger && !trigger()) {
     QUIC_VLOG(1) << "Client WaitUntil returning with trigger returning false.";
     return false;
@@ -837,7 +845,7 @@
     bool fin, QuicTestClient* test_client,
     quiche::QuicheReferenceCountedPointer<QuicAckListenerInterface>
         ack_listener)
-    : QuicClient::QuicDataToResend(std::move(headers), body, fin),
+    : QuicDefaultClient::QuicDataToResend(std::move(headers), body, fin),
       test_client_(test_client),
       ack_listener_(std::move(ack_listener)) {}
 
diff --git a/quiche/quic/test_tools/quic_test_client.h b/quiche/quic/test_tools/quic_test_client.h
index 36cc46d..a1f7b13 100644
--- a/quiche/quic/test_tools/quic_test_client.h
+++ b/quiche/quic/test_tools/quic_test_client.h
@@ -10,13 +10,13 @@
 #include <string>
 
 #include "absl/strings/string_view.h"
+#include "quiche/quic/core/io/quic_event_loop.h"
 #include "quiche/quic/core/proto/cached_network_parameters_proto.h"
 #include "quiche/quic/core/quic_framer.h"
 #include "quiche/quic/core/quic_packet_creator.h"
 #include "quiche/quic/core/quic_packets.h"
-#include "quiche/quic/platform/api/quic_epoll.h"
 #include "quiche/quic/platform/api/quic_test.h"
-#include "quiche/quic/tools/quic_client.h"
+#include "quiche/quic/tools/quic_default_client.h"
 #include "quiche/common/quiche_linked_hash_map.h"
 #include "quiche/spdy/core/http2_header_block.h"
 
@@ -27,31 +27,31 @@
 
 namespace test {
 
-class MockableQuicClientEpollNetworkHelper;
+class MockableQuicClientDefaultNetworkHelper;
 
 // A quic client which allows mocking out reads and writes.
-class MockableQuicClient : public QuicClient {
+class MockableQuicClient : public QuicDefaultClient {
  public:
   MockableQuicClient(QuicSocketAddress server_address,
                      const QuicServerId& server_id,
                      const ParsedQuicVersionVector& supported_versions,
-                     QuicEpollServer* epoll_server);
+                     QuicEventLoop* event_loop);
 
   MockableQuicClient(QuicSocketAddress server_address,
                      const QuicServerId& server_id, const QuicConfig& config,
                      const ParsedQuicVersionVector& supported_versions,
-                     QuicEpollServer* epoll_server);
+                     QuicEventLoop* event_loop);
 
   MockableQuicClient(QuicSocketAddress server_address,
                      const QuicServerId& server_id, const QuicConfig& config,
                      const ParsedQuicVersionVector& supported_versions,
-                     QuicEpollServer* epoll_server,
+                     QuicEventLoop* event_loop,
                      std::unique_ptr<ProofVerifier> proof_verifier);
 
   MockableQuicClient(QuicSocketAddress server_address,
                      const QuicServerId& server_id, const QuicConfig& config,
                      const ParsedQuicVersionVector& supported_versions,
-                     QuicEpollServer* epoll_server,
+                     QuicEventLoop* event_loop,
                      std::unique_ptr<ProofVerifier> proof_verifier,
                      std::unique_ptr<SessionCache> session_cache);
   MockableQuicClient(const MockableQuicClient&) = delete;
@@ -73,9 +73,9 @@
   // If true, copy each packet from ProcessPacket into |last_incoming_packet|
   void set_track_last_incoming_packet(bool track);
 
-  // Casts the network helper to a MockableQuicClientEpollNetworkHelper.
-  MockableQuicClientEpollNetworkHelper* mockable_network_helper();
-  const MockableQuicClientEpollNetworkHelper* mockable_network_helper() const;
+  // Casts the network helper to a MockableQuicClientDefaultNetworkHelper.
+  MockableQuicClientDefaultNetworkHelper* mockable_network_helper();
+  const MockableQuicClientDefaultNetworkHelper* mockable_network_helper() const;
 
  private:
   // Server connection ID to use, if server_connection_id_overridden_
@@ -108,6 +108,12 @@
                  const ParsedQuicVersionVector& supported_versions,
                  std::unique_ptr<ProofVerifier> proof_verifier,
                  std::unique_ptr<SessionCache> session_cache);
+  QuicTestClient(QuicSocketAddress server_address,
+                 const std::string& server_hostname, const QuicConfig& config,
+                 const ParsedQuicVersionVector& supported_versions,
+                 std::unique_ptr<ProofVerifier> proof_verifier,
+                 std::unique_ptr<SessionCache> session_cache,
+                 std::unique_ptr<QuicEventLoop> event_loop);
 
   ~QuicTestClient() override;
 
@@ -284,7 +290,7 @@
 
   void WaitForWriteToFlush();
 
-  QuicEpollServer* epoll_server() { return &epoll_server_; }
+  QuicEventLoop* event_loop() { return event_loop_.get(); }
 
   size_t num_requests() const { return num_requests_; }
 
@@ -331,7 +337,7 @@
   QuicTestClient& operator=(const QuicTestClient&&) = delete;
 
  private:
-  class TestClientDataToResend : public QuicClient::QuicDataToResend {
+  class TestClientDataToResend : public QuicDefaultClient::QuicDataToResend {
    public:
     TestClientDataToResend(
         std::unique_ptr<spdy::Http2HeaderBlock> headers, absl::string_view body,
@@ -387,7 +393,7 @@
   // tracking its state.
   void SetLatestCreatedStream(QuicSpdyClientStream* stream);
 
-  QuicEpollServer epoll_server_;
+  std::unique_ptr<QuicEventLoop> event_loop_;
   std::unique_ptr<MockableQuicClient> client_;  // The actual client
   QuicSpdyClientStream* latest_created_stream_;
   std::map<QuicStreamId, QuicSpdyClientStream*> open_streams_;
diff --git a/quiche/quic/tools/quic_client_base.cc b/quiche/quic/tools/quic_client_base.cc
index 4a300c2..3a7dfd6 100644
--- a/quiche/quic/tools/quic_client_base.cc
+++ b/quiche/quic/tools/quic_client_base.cc
@@ -240,6 +240,10 @@
 
   network_helper_->RunEventLoop();
 
+  return WaitForEventsPostprocessing();
+}
+
+bool QuicClientBase::WaitForEventsPostprocessing() {
   QUICHE_DCHECK(session() != nullptr);
   ParsedQuicVersion version = UnsupportedQuicVersion();
   if (!connected() && CanReconnectWithDifferentVersion(&version)) {
diff --git a/quiche/quic/tools/quic_client_base.h b/quiche/quic/tools/quic_client_base.h
index 4f0c880..f241a5e 100644
--- a/quiche/quic/tools/quic_client_base.h
+++ b/quiche/quic/tools/quic_client_base.h
@@ -116,6 +116,10 @@
   // Returns true if there are any outstanding requests.
   bool WaitForEvents();
 
+  // Performs the part of WaitForEvents() that is done after the actual event
+  // loop call.
+  bool WaitForEventsPostprocessing();
+
   // Migrate to a new socket (new_host) during an active connection.
   bool MigrateSocket(const QuicIpAddress& new_host);
 
