Replace QuicString with std::string, pass 1

This replaces QuicString with std::string in all of the "QUIC proper".  I will
delete QuicString once all code using it is gone.

gfe-relnote: n/a (no functional change)
PiperOrigin-RevId: 237872023
Change-Id: I82de62c9855516b15039734d05155917e68ff4ee
diff --git a/quic/core/chlo_extractor_test.cc b/quic/core/chlo_extractor_test.cc
index 1e0b6f5..cb5fd59 100644
--- a/quic/core/chlo_extractor_test.cc
+++ b/quic/core/chlo_extractor_test.cc
@@ -35,12 +35,12 @@
 
   QuicConnectionId connection_id() const { return connection_id_; }
   QuicTransportVersion transport_version() const { return version_; }
-  const QuicString& chlo() const { return chlo_; }
+  const std::string& chlo() const { return chlo_; }
 
  private:
   QuicConnectionId connection_id_;
   QuicTransportVersion version_;
-  QuicString chlo_;
+  std::string chlo_;
 };
 
 class ChloExtractorTest : public QuicTest {
@@ -105,7 +105,7 @@
   CryptoHandshakeMessage client_hello;
   client_hello.set_tag(kCHLO);
 
-  QuicString client_hello_str(client_hello.GetSerialized().AsStringPiece());
+  std::string client_hello_str(client_hello.GetSerialized().AsStringPiece());
   // Construct a CHLO with each supported version
   for (ParsedQuicVersion version : AllSupportedVersions()) {
     SCOPED_TRACE(version);
@@ -135,7 +135,7 @@
   CryptoHandshakeMessage client_hello;
   client_hello.set_tag(kCHLO);
 
-  QuicString client_hello_str(client_hello.GetSerialized().AsStringPiece());
+  std::string client_hello_str(client_hello.GetSerialized().AsStringPiece());
   MakePacket(AllSupportedVersions()[0], client_hello_str,
              /*munge_offset*/ false, /*munge_stream_id*/ true);
   EXPECT_FALSE(ChloExtractor::Extract(*packet_, AllSupportedVersions(), {},
@@ -147,7 +147,7 @@
   CryptoHandshakeMessage client_hello;
   client_hello.set_tag(kCHLO);
 
-  QuicString client_hello_str(client_hello.GetSerialized().AsStringPiece());
+  std::string client_hello_str(client_hello.GetSerialized().AsStringPiece());
   MakePacket(AllSupportedVersions()[0], client_hello_str, /*munge_offset*/ true,
              /*munge_stream_id*/ false);
   EXPECT_FALSE(ChloExtractor::Extract(*packet_, AllSupportedVersions(), {},
diff --git a/quic/core/congestion_control/bbr_sender.cc b/quic/core/congestion_control/bbr_sender.cc
index 6a7fe2b..c119135 100644
--- a/quic/core/congestion_control/bbr_sender.cc
+++ b/quic/core/congestion_control/bbr_sender.cc
@@ -851,7 +851,7 @@
   recovery_window_ = std::max(min_congestion_window_, recovery_window_);
 }
 
-QuicString BbrSender::GetDebugState() const {
+std::string BbrSender::GetDebugState() const {
   std::ostringstream stream;
   stream << ExportDebugState();
   return stream.str();
@@ -875,7 +875,7 @@
   return DebugState(*this);
 }
 
-static QuicString ModeToString(BbrSender::Mode mode) {
+static std::string ModeToString(BbrSender::Mode mode) {
   switch (mode) {
     case BbrSender::STARTUP:
       return "STARTUP";
diff --git a/quic/core/congestion_control/bbr_sender.h b/quic/core/congestion_control/bbr_sender.h
index 37e2695..efde0e5 100644
--- a/quic/core/congestion_control/bbr_sender.h
+++ b/quic/core/congestion_control/bbr_sender.h
@@ -129,7 +129,7 @@
   QuicByteCount GetCongestionWindow() const override;
   QuicByteCount GetSlowStartThreshold() const override;
   CongestionControlType GetCongestionControlType() const override;
-  QuicString GetDebugState() const override;
+  std::string GetDebugState() const override;
   void OnApplicationLimited(QuicByteCount bytes_in_flight) override;
   // End implementation of SendAlgorithmInterface.
 
diff --git a/quic/core/congestion_control/send_algorithm_interface.h b/quic/core/congestion_control/send_algorithm_interface.h
index 5df9a93..333a085 100644
--- a/quic/core/congestion_control/send_algorithm_interface.h
+++ b/quic/core/congestion_control/send_algorithm_interface.h
@@ -124,7 +124,7 @@
 
   // Retrieves debugging information about the current state of the
   // send algorithm.
-  virtual QuicString GetDebugState() const = 0;
+  virtual std::string GetDebugState() const = 0;
 
   // Called when the connection has no outstanding data to send. Specifically,
   // this means that none of the data streams are write-blocked, there are no
diff --git a/quic/core/congestion_control/send_algorithm_test.cc b/quic/core/congestion_control/send_algorithm_test.cc
index d7bfd85..3b93696 100644
--- a/quic/core/congestion_control/send_algorithm_test.cc
+++ b/quic/core/congestion_control/send_algorithm_test.cc
@@ -132,7 +132,8 @@
   const CongestionControlType congestion_control_type;
 };
 
-QuicString TestParamToString(const testing::TestParamInfo<TestParams>& params) {
+std::string TestParamToString(
+    const testing::TestParamInfo<TestParams>& params) {
   return QuicStrCat(
       CongestionControlTypeToString(params.param.congestion_control_type), "_");
 }
@@ -268,7 +269,8 @@
   SendAlgorithmInterface* sender_;
 };
 
-INSTANTIATE_TEST_SUITE_P(SendAlgorithmTests, SendAlgorithmTest,
+INSTANTIATE_TEST_SUITE_P(SendAlgorithmTests,
+                         SendAlgorithmTest,
                          ::testing::ValuesIn(GetTestParams()),
                          TestParamToString);
 
diff --git a/quic/core/congestion_control/tcp_cubic_sender_bytes.cc b/quic/core/congestion_control/tcp_cubic_sender_bytes.cc
index 5b843eb..4eefb46 100644
--- a/quic/core/congestion_control/tcp_cubic_sender_bytes.cc
+++ b/quic/core/congestion_control/tcp_cubic_sender_bytes.cc
@@ -260,7 +260,7 @@
   HandleRetransmissionTimeout();
 }
 
-QuicString TcpCubicSenderBytes::GetDebugState() const {
+std::string TcpCubicSenderBytes::GetDebugState() const {
   return "";
 }
 
diff --git a/quic/core/congestion_control/tcp_cubic_sender_bytes.h b/quic/core/congestion_control/tcp_cubic_sender_bytes.h
index 0ecb6f4..080a92d 100644
--- a/quic/core/congestion_control/tcp_cubic_sender_bytes.h
+++ b/quic/core/congestion_control/tcp_cubic_sender_bytes.h
@@ -73,7 +73,7 @@
   bool InSlowStart() const override;
   bool InRecovery() const override;
   bool ShouldSendProbingPacket() const override;
-  QuicString GetDebugState() const override;
+  std::string GetDebugState() const override;
   void OnApplicationLimited(QuicByteCount bytes_in_flight) override;
   // End implementation of SendAlgorithmInterface.
 
diff --git a/quic/core/crypto/aead_base_decrypter.cc b/quic/core/crypto/aead_base_decrypter.cc
index 53bd0f0..474c443 100644
--- a/quic/core/crypto/aead_base_decrypter.cc
+++ b/quic/core/crypto/aead_base_decrypter.cc
@@ -125,7 +125,7 @@
     return true;
   }
 
-  QuicString key, nonce_prefix;
+  std::string key, nonce_prefix;
   size_t prefix_size = nonce_size_ - sizeof(QuicPacketNumber);
   DiversifyPreliminaryKey(
       QuicStringPiece(reinterpret_cast<const char*>(key_), key_size_),
diff --git a/quic/core/crypto/aes_128_gcm_12_decrypter_test.cc b/quic/core/crypto/aes_128_gcm_12_decrypter_test.cc
index 6513e45..d9b2e8d 100644
--- a/quic/core/crypto/aes_128_gcm_12_decrypter_test.cc
+++ b/quic/core/crypto/aes_128_gcm_12_decrypter_test.cc
@@ -232,12 +232,12 @@
       bool has_pt = test_vectors[j].pt;
 
       // Decode the test vector.
-      QuicString key = QuicTextUtils::HexDecode(test_vectors[j].key);
-      QuicString iv = QuicTextUtils::HexDecode(test_vectors[j].iv);
-      QuicString ct = QuicTextUtils::HexDecode(test_vectors[j].ct);
-      QuicString aad = QuicTextUtils::HexDecode(test_vectors[j].aad);
-      QuicString tag = QuicTextUtils::HexDecode(test_vectors[j].tag);
-      QuicString pt;
+      std::string key = QuicTextUtils::HexDecode(test_vectors[j].key);
+      std::string iv = QuicTextUtils::HexDecode(test_vectors[j].iv);
+      std::string ct = QuicTextUtils::HexDecode(test_vectors[j].ct);
+      std::string aad = QuicTextUtils::HexDecode(test_vectors[j].aad);
+      std::string tag = QuicTextUtils::HexDecode(test_vectors[j].tag);
+      std::string pt;
       if (has_pt) {
         pt = QuicTextUtils::HexDecode(test_vectors[j].pt);
       }
@@ -258,7 +258,7 @@
       ASSERT_LE(static_cast<size_t>(Aes128Gcm12Decrypter::kAuthTagSize),
                 tag.length());
       tag.resize(Aes128Gcm12Decrypter::kAuthTagSize);
-      QuicString ciphertext = ct + tag;
+      std::string ciphertext = ct + tag;
 
       Aes128Gcm12Decrypter decrypter;
       ASSERT_TRUE(decrypter.SetKey(key));
diff --git a/quic/core/crypto/aes_128_gcm_12_encrypter_test.cc b/quic/core/crypto/aes_128_gcm_12_encrypter_test.cc
index 67660cf..7aa1cf9 100644
--- a/quic/core/crypto/aes_128_gcm_12_encrypter_test.cc
+++ b/quic/core/crypto/aes_128_gcm_12_encrypter_test.cc
@@ -181,12 +181,12 @@
     const TestGroupInfo& test_info = test_group_info[i];
     for (size_t j = 0; test_vectors[j].key != nullptr; j++) {
       // Decode the test vector.
-      QuicString key = QuicTextUtils::HexDecode(test_vectors[j].key);
-      QuicString iv = QuicTextUtils::HexDecode(test_vectors[j].iv);
-      QuicString pt = QuicTextUtils::HexDecode(test_vectors[j].pt);
-      QuicString aad = QuicTextUtils::HexDecode(test_vectors[j].aad);
-      QuicString ct = QuicTextUtils::HexDecode(test_vectors[j].ct);
-      QuicString tag = QuicTextUtils::HexDecode(test_vectors[j].tag);
+      std::string key = QuicTextUtils::HexDecode(test_vectors[j].key);
+      std::string iv = QuicTextUtils::HexDecode(test_vectors[j].iv);
+      std::string pt = QuicTextUtils::HexDecode(test_vectors[j].pt);
+      std::string aad = QuicTextUtils::HexDecode(test_vectors[j].aad);
+      std::string ct = QuicTextUtils::HexDecode(test_vectors[j].ct);
+      std::string tag = QuicTextUtils::HexDecode(test_vectors[j].tag);
 
       // The test vector's lengths should look sane. Note that the lengths
       // in |test_info| are in bits.
diff --git a/quic/core/crypto/aes_128_gcm_decrypter_test.cc b/quic/core/crypto/aes_128_gcm_decrypter_test.cc
index 300e8a2..1ef986f 100644
--- a/quic/core/crypto/aes_128_gcm_decrypter_test.cc
+++ b/quic/core/crypto/aes_128_gcm_decrypter_test.cc
@@ -227,12 +227,12 @@
       bool has_pt = test_vectors[j].pt;
 
       // Decode the test vector.
-      QuicString key = QuicTextUtils::HexDecode(test_vectors[j].key);
-      QuicString iv = QuicTextUtils::HexDecode(test_vectors[j].iv);
-      QuicString ct = QuicTextUtils::HexDecode(test_vectors[j].ct);
-      QuicString aad = QuicTextUtils::HexDecode(test_vectors[j].aad);
-      QuicString tag = QuicTextUtils::HexDecode(test_vectors[j].tag);
-      QuicString pt;
+      std::string key = QuicTextUtils::HexDecode(test_vectors[j].key);
+      std::string iv = QuicTextUtils::HexDecode(test_vectors[j].iv);
+      std::string ct = QuicTextUtils::HexDecode(test_vectors[j].ct);
+      std::string aad = QuicTextUtils::HexDecode(test_vectors[j].aad);
+      std::string tag = QuicTextUtils::HexDecode(test_vectors[j].tag);
+      std::string pt;
       if (has_pt) {
         pt = QuicTextUtils::HexDecode(test_vectors[j].pt);
       }
@@ -247,7 +247,7 @@
       if (has_pt) {
         EXPECT_EQ(test_info.pt_len, pt.length() * 8);
       }
-      QuicString ciphertext = ct + tag;
+      std::string ciphertext = ct + tag;
 
       Aes128GcmDecrypter decrypter;
       ASSERT_TRUE(decrypter.SetKey(key));
diff --git a/quic/core/crypto/aes_128_gcm_encrypter_test.cc b/quic/core/crypto/aes_128_gcm_encrypter_test.cc
index 959cb9d..e2e425e 100644
--- a/quic/core/crypto/aes_128_gcm_encrypter_test.cc
+++ b/quic/core/crypto/aes_128_gcm_encrypter_test.cc
@@ -181,12 +181,12 @@
     const TestGroupInfo& test_info = test_group_info[i];
     for (size_t j = 0; test_vectors[j].key != nullptr; j++) {
       // Decode the test vector.
-      QuicString key = QuicTextUtils::HexDecode(test_vectors[j].key);
-      QuicString iv = QuicTextUtils::HexDecode(test_vectors[j].iv);
-      QuicString pt = QuicTextUtils::HexDecode(test_vectors[j].pt);
-      QuicString aad = QuicTextUtils::HexDecode(test_vectors[j].aad);
-      QuicString ct = QuicTextUtils::HexDecode(test_vectors[j].ct);
-      QuicString tag = QuicTextUtils::HexDecode(test_vectors[j].tag);
+      std::string key = QuicTextUtils::HexDecode(test_vectors[j].key);
+      std::string iv = QuicTextUtils::HexDecode(test_vectors[j].iv);
+      std::string pt = QuicTextUtils::HexDecode(test_vectors[j].pt);
+      std::string aad = QuicTextUtils::HexDecode(test_vectors[j].aad);
+      std::string ct = QuicTextUtils::HexDecode(test_vectors[j].ct);
+      std::string tag = QuicTextUtils::HexDecode(test_vectors[j].tag);
 
       // The test vector's lengths should look sane. Note that the lengths
       // in |test_info| are in bits.
@@ -218,13 +218,14 @@
 }
 
 TEST_F(Aes128GcmEncrypterTest, EncryptPacket) {
-  QuicString key = QuicTextUtils::HexDecode("d95a145250826c25a77b6a84fd4d34fc");
-  QuicString iv = QuicTextUtils::HexDecode("50c4431ebb18283448e276e2");
+  std::string key =
+      QuicTextUtils::HexDecode("d95a145250826c25a77b6a84fd4d34fc");
+  std::string iv = QuicTextUtils::HexDecode("50c4431ebb18283448e276e2");
   uint64_t packet_num = 0x13278f44;
-  QuicString aad =
+  std::string aad =
       QuicTextUtils::HexDecode("875d49f64a70c9cbe713278f44ff000005");
-  QuicString pt = QuicTextUtils::HexDecode("aa0003a250bd000000000001");
-  QuicString ct = QuicTextUtils::HexDecode(
+  std::string pt = QuicTextUtils::HexDecode("aa0003a250bd000000000001");
+  std::string ct = QuicTextUtils::HexDecode(
       "7dd4708b989ee7d38a013e3656e9b37beefd05808fe1ab41e3b4f2c0");
 
   std::vector<char> out(ct.size());
diff --git a/quic/core/crypto/aes_256_gcm_decrypter_test.cc b/quic/core/crypto/aes_256_gcm_decrypter_test.cc
index cb5f702..16e2428 100644
--- a/quic/core/crypto/aes_256_gcm_decrypter_test.cc
+++ b/quic/core/crypto/aes_256_gcm_decrypter_test.cc
@@ -231,12 +231,12 @@
       bool has_pt = test_vectors[j].pt;
 
       // Decode the test vector.
-      QuicString key = QuicTextUtils::HexDecode(test_vectors[j].key);
-      QuicString iv = QuicTextUtils::HexDecode(test_vectors[j].iv);
-      QuicString ct = QuicTextUtils::HexDecode(test_vectors[j].ct);
-      QuicString aad = QuicTextUtils::HexDecode(test_vectors[j].aad);
-      QuicString tag = QuicTextUtils::HexDecode(test_vectors[j].tag);
-      QuicString pt;
+      std::string key = QuicTextUtils::HexDecode(test_vectors[j].key);
+      std::string iv = QuicTextUtils::HexDecode(test_vectors[j].iv);
+      std::string ct = QuicTextUtils::HexDecode(test_vectors[j].ct);
+      std::string aad = QuicTextUtils::HexDecode(test_vectors[j].aad);
+      std::string tag = QuicTextUtils::HexDecode(test_vectors[j].tag);
+      std::string pt;
       if (has_pt) {
         pt = QuicTextUtils::HexDecode(test_vectors[j].pt);
       }
@@ -251,7 +251,7 @@
       if (has_pt) {
         EXPECT_EQ(test_info.pt_len, pt.length() * 8);
       }
-      QuicString ciphertext = ct + tag;
+      std::string ciphertext = ct + tag;
 
       Aes256GcmDecrypter decrypter;
       ASSERT_TRUE(decrypter.SetKey(key));
diff --git a/quic/core/crypto/aes_256_gcm_encrypter_test.cc b/quic/core/crypto/aes_256_gcm_encrypter_test.cc
index 0472986..f70edbc 100644
--- a/quic/core/crypto/aes_256_gcm_encrypter_test.cc
+++ b/quic/core/crypto/aes_256_gcm_encrypter_test.cc
@@ -188,12 +188,12 @@
     const TestGroupInfo& test_info = test_group_info[i];
     for (size_t j = 0; test_vectors[j].key != nullptr; j++) {
       // Decode the test vector.
-      QuicString key = QuicTextUtils::HexDecode(test_vectors[j].key);
-      QuicString iv = QuicTextUtils::HexDecode(test_vectors[j].iv);
-      QuicString pt = QuicTextUtils::HexDecode(test_vectors[j].pt);
-      QuicString aad = QuicTextUtils::HexDecode(test_vectors[j].aad);
-      QuicString ct = QuicTextUtils::HexDecode(test_vectors[j].ct);
-      QuicString tag = QuicTextUtils::HexDecode(test_vectors[j].tag);
+      std::string key = QuicTextUtils::HexDecode(test_vectors[j].key);
+      std::string iv = QuicTextUtils::HexDecode(test_vectors[j].iv);
+      std::string pt = QuicTextUtils::HexDecode(test_vectors[j].pt);
+      std::string aad = QuicTextUtils::HexDecode(test_vectors[j].aad);
+      std::string ct = QuicTextUtils::HexDecode(test_vectors[j].ct);
+      std::string tag = QuicTextUtils::HexDecode(test_vectors[j].tag);
 
       // The test vector's lengths should look sane. Note that the lengths
       // in |test_info| are in bits.
diff --git a/quic/core/crypto/cert_compressor.cc b/quic/core/crypto/cert_compressor.cc
index 204539b..53c6117 100644
--- a/quic/core/crypto/cert_compressor.cc
+++ b/quic/core/crypto/cert_compressor.cc
@@ -174,7 +174,7 @@
 // efficiently represent |certs| to a peer who has the common sets identified
 // by |client_common_set_hashes| and who has cached the certificates with the
 // 64-bit, FNV-1a hashes in |client_cached_cert_hashes|.
-std::vector<CertEntry> MatchCerts(const std::vector<QuicString>& certs,
+std::vector<CertEntry> MatchCerts(const std::vector<std::string>& certs,
                                   QuicStringPiece client_common_set_hashes,
                                   QuicStringPiece client_cached_cert_hashes,
                                   const CommonCertSets* common_sets) {
@@ -281,9 +281,9 @@
 // dictionary to use in order to decompress a zlib block following |entries|.
 // |certs| is one-to-one with |entries| and contains the certificates for those
 // entries that are CACHED or COMMON.
-QuicString ZlibDictForEntries(const std::vector<CertEntry>& entries,
-                              const std::vector<QuicString>& certs) {
-  QuicString zlib_dict;
+std::string ZlibDictForEntries(const std::vector<CertEntry>& entries,
+                               const std::vector<std::string>& certs) {
+  std::string zlib_dict;
 
   // The dictionary starts with the common and cached certs in reverse order.
   size_t zlib_dict_size = 0;
@@ -304,8 +304,8 @@
     }
   }
 
-  zlib_dict += QuicString(reinterpret_cast<const char*>(kCommonCertSubstrings),
-                          sizeof(kCommonCertSubstrings));
+  zlib_dict += std::string(reinterpret_cast<const char*>(kCommonCertSubstrings),
+                           sizeof(kCommonCertSubstrings));
 
   DCHECK_EQ(zlib_dict.size(), zlib_dict_size);
 
@@ -313,7 +313,7 @@
 }
 
 // HashCerts returns the FNV-1a hashes of |certs|.
-std::vector<uint64_t> HashCerts(const std::vector<QuicString>& certs) {
+std::vector<uint64_t> HashCerts(const std::vector<std::string>& certs) {
   std::vector<uint64_t> ret;
   ret.reserve(certs.size());
 
@@ -329,10 +329,10 @@
 // resolved using |cached_certs| and |common_sets| and written to |out_certs|.
 // |in_out| is updated to contain the trailing data.
 bool ParseEntries(QuicStringPiece* in_out,
-                  const std::vector<QuicString>& cached_certs,
+                  const std::vector<std::string>& cached_certs,
                   const CommonCertSets* common_sets,
                   std::vector<CertEntry>* out_entries,
-                  std::vector<QuicString>* out_certs) {
+                  std::vector<std::string>* out_certs) {
   QuicStringPiece in = *in_out;
   std::vector<uint64_t> cached_hashes;
 
@@ -355,7 +355,7 @@
 
     switch (entry.type) {
       case CertEntry::COMPRESSED:
-        out_certs->push_back(QuicString());
+        out_certs->push_back(std::string());
         break;
       case CertEntry::CACHED: {
         if (in.size() < sizeof(uint64_t)) {
@@ -397,7 +397,7 @@
         if (cert.empty()) {
           return false;
         }
-        out_certs->push_back(QuicString(cert));
+        out_certs->push_back(std::string(cert));
         break;
       }
       default:
@@ -448,8 +448,8 @@
 }  // anonymous namespace
 
 // static
-QuicString CertCompressor::CompressChain(
-    const std::vector<QuicString>& certs,
+std::string CertCompressor::CompressChain(
+    const std::vector<std::string>& certs,
     QuicStringPiece client_common_set_hashes,
     QuicStringPiece client_cached_cert_hashes,
     const CommonCertSets* common_sets) {
@@ -477,7 +477,7 @@
     }
     scoped_z.reset(&z);
 
-    QuicString zlib_dict = ZlibDictForEntries(entries, certs);
+    std::string zlib_dict = ZlibDictForEntries(entries, certs);
 
     rv = deflateSetDictionary(
         &z, reinterpret_cast<const uint8_t*>(&zlib_dict[0]), zlib_dict.size());
@@ -491,7 +491,7 @@
 
   const size_t entries_size = CertEntriesSize(entries);
 
-  QuicString result;
+  std::string result;
   result.resize(entries_size + (uncompressed_size > 0 ? 4 : 0) +
                 compressed_size);
 
@@ -552,9 +552,9 @@
 // static
 bool CertCompressor::DecompressChain(
     QuicStringPiece in,
-    const std::vector<QuicString>& cached_certs,
+    const std::vector<std::string>& cached_certs,
     const CommonCertSets* common_sets,
-    std::vector<QuicString>* out_certs) {
+    std::vector<std::string>* out_certs) {
   std::vector<CertEntry> entries;
   if (!ParseEntries(&in, cached_certs, common_sets, &entries, out_certs)) {
     return false;
@@ -595,7 +595,7 @@
 
     int rv = inflate(&z, Z_FINISH);
     if (rv == Z_NEED_DICT) {
-      QuicString zlib_dict = ZlibDictForEntries(entries, *out_certs);
+      std::string zlib_dict = ZlibDictForEntries(entries, *out_certs);
       const uint8_t* dict = reinterpret_cast<const uint8_t*>(zlib_dict.data());
       if (Z_OK != inflateSetDictionary(&z, dict, zlib_dict.size())) {
         return false;
@@ -623,7 +623,7 @@
         if (uncompressed.size() < cert_len) {
           return false;
         }
-        (*out_certs)[i] = QuicString(uncompressed.substr(0, cert_len));
+        (*out_certs)[i] = std::string(uncompressed.substr(0, cert_len));
         uncompressed.remove_prefix(cert_len);
         break;
       case CertEntry::CACHED:
diff --git a/quic/core/crypto/cert_compressor.h b/quic/core/crypto/cert_compressor.h
index 624ac71..fd73e6e 100644
--- a/quic/core/crypto/cert_compressor.h
+++ b/quic/core/crypto/cert_compressor.h
@@ -37,19 +37,19 @@
   // sets known locally and |client_common_set_hashes| contains the hashes of
   // the common sets known to the peer. |client_cached_cert_hashes| contains
   // 64-bit, FNV-1a hashes of certificates that the peer already possesses.
-  static QuicString CompressChain(const std::vector<QuicString>& certs,
-                                  QuicStringPiece client_common_set_hashes,
-                                  QuicStringPiece client_cached_cert_hashes,
-                                  const CommonCertSets* common_sets);
+  static std::string CompressChain(const std::vector<std::string>& certs,
+                                   QuicStringPiece client_common_set_hashes,
+                                   QuicStringPiece client_cached_cert_hashes,
+                                   const CommonCertSets* common_sets);
 
   // DecompressChain decompresses the result of |CompressChain|, given in |in|,
   // into a series of certificates that are written to |out_certs|.
   // |cached_certs| contains certificates that the peer may have omitted and
   // |common_sets| contains the common certificate sets known locally.
   static bool DecompressChain(QuicStringPiece in,
-                              const std::vector<QuicString>& cached_certs,
+                              const std::vector<std::string>& cached_certs,
                               const CommonCertSets* common_sets,
-                              std::vector<QuicString>* out_certs);
+                              std::vector<std::string>* out_certs);
 };
 
 }  // namespace quic
diff --git a/quic/core/crypto/cert_compressor_test.cc b/quic/core/crypto/cert_compressor_test.cc
index 87b330a..e3ac2f1 100644
--- a/quic/core/crypto/cert_compressor_test.cc
+++ b/quic/core/crypto/cert_compressor_test.cc
@@ -18,26 +18,26 @@
 class CertCompressorTest : public QuicTest {};
 
 TEST_F(CertCompressorTest, EmptyChain) {
-  std::vector<QuicString> chain;
-  const QuicString compressed = CertCompressor::CompressChain(
+  std::vector<std::string> chain;
+  const std::string compressed = CertCompressor::CompressChain(
       chain, QuicStringPiece(), QuicStringPiece(), nullptr);
   EXPECT_EQ("00", QuicTextUtils::HexEncode(compressed));
 
-  std::vector<QuicString> chain2, cached_certs;
+  std::vector<std::string> chain2, cached_certs;
   ASSERT_TRUE(CertCompressor::DecompressChain(compressed, cached_certs, nullptr,
                                               &chain2));
   EXPECT_EQ(chain.size(), chain2.size());
 }
 
 TEST_F(CertCompressorTest, Compressed) {
-  std::vector<QuicString> chain;
+  std::vector<std::string> chain;
   chain.push_back("testcert");
-  const QuicString compressed = CertCompressor::CompressChain(
+  const std::string compressed = CertCompressor::CompressChain(
       chain, QuicStringPiece(), QuicStringPiece(), nullptr);
   ASSERT_GE(compressed.size(), 2u);
   EXPECT_EQ("0100", QuicTextUtils::HexEncode(compressed.substr(0, 2)));
 
-  std::vector<QuicString> chain2, cached_certs;
+  std::vector<std::string> chain2, cached_certs;
   ASSERT_TRUE(CertCompressor::DecompressChain(compressed, cached_certs, nullptr,
                                               &chain2));
   EXPECT_EQ(chain.size(), chain2.size());
@@ -45,12 +45,12 @@
 }
 
 TEST_F(CertCompressorTest, Common) {
-  std::vector<QuicString> chain;
+  std::vector<std::string> chain;
   chain.push_back("testcert");
   static const uint64_t set_hash = 42;
   std::unique_ptr<CommonCertSets> common_sets(
       crypto_test_utils::MockCommonCertSets(chain[0], set_hash, 1));
-  const QuicString compressed = CertCompressor::CompressChain(
+  const std::string compressed = CertCompressor::CompressChain(
       chain,
       QuicStringPiece(reinterpret_cast<const char*>(&set_hash),
                       sizeof(set_hash)),
@@ -62,7 +62,7 @@
       "00" /* end of list */,
       QuicTextUtils::HexEncode(compressed));
 
-  std::vector<QuicString> chain2, cached_certs;
+  std::vector<std::string> chain2, cached_certs;
   ASSERT_TRUE(CertCompressor::DecompressChain(compressed, cached_certs,
                                               common_sets.get(), &chain2));
   EXPECT_EQ(chain.size(), chain2.size());
@@ -70,18 +70,18 @@
 }
 
 TEST_F(CertCompressorTest, Cached) {
-  std::vector<QuicString> chain;
+  std::vector<std::string> chain;
   chain.push_back("testcert");
   uint64_t hash = QuicUtils::FNV1a_64_Hash(chain[0]);
   QuicStringPiece hash_bytes(reinterpret_cast<char*>(&hash), sizeof(hash));
-  const QuicString compressed = CertCompressor::CompressChain(
+  const std::string compressed = CertCompressor::CompressChain(
       chain, QuicStringPiece(), hash_bytes, nullptr);
 
   EXPECT_EQ("02" /* cached */ + QuicTextUtils::HexEncode(hash_bytes) +
                 "00" /* end of list */,
             QuicTextUtils::HexEncode(compressed));
 
-  std::vector<QuicString> cached_certs, chain2;
+  std::vector<std::string> cached_certs, chain2;
   cached_certs.push_back(chain[0]);
   ASSERT_TRUE(CertCompressor::DecompressChain(compressed, cached_certs, nullptr,
                                               &chain2));
@@ -90,7 +90,7 @@
 }
 
 TEST_F(CertCompressorTest, BadInputs) {
-  std::vector<QuicString> cached_certs, chain;
+  std::vector<std::string> cached_certs, chain;
 
   EXPECT_FALSE(CertCompressor::DecompressChain(
       QuicTextUtils::HexEncode("04") /* bad entry type */, cached_certs,
diff --git a/quic/core/crypto/chacha20_poly1305_decrypter_test.cc b/quic/core/crypto/chacha20_poly1305_decrypter_test.cc
index 5f5ae01..d1c8d74 100644
--- a/quic/core/crypto/chacha20_poly1305_decrypter_test.cc
+++ b/quic/core/crypto/chacha20_poly1305_decrypter_test.cc
@@ -141,12 +141,12 @@
     bool has_pt = test_vectors[i].pt;
 
     // Decode the test vector.
-    QuicString key = QuicTextUtils::HexDecode(test_vectors[i].key);
-    QuicString iv = QuicTextUtils::HexDecode(test_vectors[i].iv);
-    QuicString fixed = QuicTextUtils::HexDecode(test_vectors[i].fixed);
-    QuicString aad = QuicTextUtils::HexDecode(test_vectors[i].aad);
-    QuicString ct = QuicTextUtils::HexDecode(test_vectors[i].ct);
-    QuicString pt;
+    std::string key = QuicTextUtils::HexDecode(test_vectors[i].key);
+    std::string iv = QuicTextUtils::HexDecode(test_vectors[i].iv);
+    std::string fixed = QuicTextUtils::HexDecode(test_vectors[i].fixed);
+    std::string aad = QuicTextUtils::HexDecode(test_vectors[i].aad);
+    std::string ct = QuicTextUtils::HexDecode(test_vectors[i].ct);
+    std::string pt;
     if (has_pt) {
       pt = QuicTextUtils::HexDecode(test_vectors[i].pt);
     }
diff --git a/quic/core/crypto/chacha20_poly1305_encrypter_test.cc b/quic/core/crypto/chacha20_poly1305_encrypter_test.cc
index d8c27bf..05f8274 100644
--- a/quic/core/crypto/chacha20_poly1305_encrypter_test.cc
+++ b/quic/core/crypto/chacha20_poly1305_encrypter_test.cc
@@ -90,15 +90,15 @@
   ChaCha20Poly1305Encrypter encrypter;
   ChaCha20Poly1305Decrypter decrypter;
 
-  QuicString key = QuicTextUtils::HexDecode(test_vectors[0].key);
+  std::string key = QuicTextUtils::HexDecode(test_vectors[0].key);
   ASSERT_TRUE(encrypter.SetKey(key));
   ASSERT_TRUE(decrypter.SetKey(key));
   ASSERT_TRUE(encrypter.SetNoncePrefix("abcd"));
   ASSERT_TRUE(decrypter.SetNoncePrefix("abcd"));
 
   uint64_t packet_number = UINT64_C(0x123456789ABC);
-  QuicString associated_data = "associated_data";
-  QuicString plaintext = "plaintext";
+  std::string associated_data = "associated_data";
+  std::string plaintext = "plaintext";
   char encrypted[1024];
   size_t len;
   ASSERT_TRUE(encrypter.EncryptPacket(packet_number, associated_data, plaintext,
@@ -114,12 +114,12 @@
 TEST_F(ChaCha20Poly1305EncrypterTest, Encrypt) {
   for (size_t i = 0; test_vectors[i].key != nullptr; i++) {
     // Decode the test vector.
-    QuicString key = QuicTextUtils::HexDecode(test_vectors[i].key);
-    QuicString pt = QuicTextUtils::HexDecode(test_vectors[i].pt);
-    QuicString iv = QuicTextUtils::HexDecode(test_vectors[i].iv);
-    QuicString fixed = QuicTextUtils::HexDecode(test_vectors[i].fixed);
-    QuicString aad = QuicTextUtils::HexDecode(test_vectors[i].aad);
-    QuicString ct = QuicTextUtils::HexDecode(test_vectors[i].ct);
+    std::string key = QuicTextUtils::HexDecode(test_vectors[i].key);
+    std::string pt = QuicTextUtils::HexDecode(test_vectors[i].pt);
+    std::string iv = QuicTextUtils::HexDecode(test_vectors[i].iv);
+    std::string fixed = QuicTextUtils::HexDecode(test_vectors[i].fixed);
+    std::string aad = QuicTextUtils::HexDecode(test_vectors[i].aad);
+    std::string ct = QuicTextUtils::HexDecode(test_vectors[i].ct);
 
     ChaCha20Poly1305Encrypter encrypter;
     ASSERT_TRUE(encrypter.SetKey(key));
diff --git a/quic/core/crypto/chacha20_poly1305_tls_decrypter_test.cc b/quic/core/crypto/chacha20_poly1305_tls_decrypter_test.cc
index dd74539..664abe2 100644
--- a/quic/core/crypto/chacha20_poly1305_tls_decrypter_test.cc
+++ b/quic/core/crypto/chacha20_poly1305_tls_decrypter_test.cc
@@ -136,12 +136,12 @@
     bool has_pt = test_vectors[i].pt;
 
     // Decode the test vector.
-    QuicString key = QuicTextUtils::HexDecode(test_vectors[i].key);
-    QuicString iv = QuicTextUtils::HexDecode(test_vectors[i].iv);
-    QuicString fixed = QuicTextUtils::HexDecode(test_vectors[i].fixed);
-    QuicString aad = QuicTextUtils::HexDecode(test_vectors[i].aad);
-    QuicString ct = QuicTextUtils::HexDecode(test_vectors[i].ct);
-    QuicString pt;
+    std::string key = QuicTextUtils::HexDecode(test_vectors[i].key);
+    std::string iv = QuicTextUtils::HexDecode(test_vectors[i].iv);
+    std::string fixed = QuicTextUtils::HexDecode(test_vectors[i].fixed);
+    std::string aad = QuicTextUtils::HexDecode(test_vectors[i].aad);
+    std::string ct = QuicTextUtils::HexDecode(test_vectors[i].ct);
+    std::string pt;
     if (has_pt) {
       pt = QuicTextUtils::HexDecode(test_vectors[i].pt);
     }
diff --git a/quic/core/crypto/chacha20_poly1305_tls_encrypter_test.cc b/quic/core/crypto/chacha20_poly1305_tls_encrypter_test.cc
index 905472b..6ac4810 100644
--- a/quic/core/crypto/chacha20_poly1305_tls_encrypter_test.cc
+++ b/quic/core/crypto/chacha20_poly1305_tls_encrypter_test.cc
@@ -89,15 +89,15 @@
   ChaCha20Poly1305TlsEncrypter encrypter;
   ChaCha20Poly1305TlsDecrypter decrypter;
 
-  QuicString key = QuicTextUtils::HexDecode(test_vectors[0].key);
+  std::string key = QuicTextUtils::HexDecode(test_vectors[0].key);
   ASSERT_TRUE(encrypter.SetKey(key));
   ASSERT_TRUE(decrypter.SetKey(key));
   ASSERT_TRUE(encrypter.SetIV("abcdefghijkl"));
   ASSERT_TRUE(decrypter.SetIV("abcdefghijkl"));
 
   uint64_t packet_number = UINT64_C(0x123456789ABC);
-  QuicString associated_data = "associated_data";
-  QuicString plaintext = "plaintext";
+  std::string associated_data = "associated_data";
+  std::string plaintext = "plaintext";
   char encrypted[1024];
   size_t len;
   ASSERT_TRUE(encrypter.EncryptPacket(packet_number, associated_data, plaintext,
@@ -113,12 +113,12 @@
 TEST_F(ChaCha20Poly1305TlsEncrypterTest, Encrypt) {
   for (size_t i = 0; test_vectors[i].key != nullptr; i++) {
     // Decode the test vector.
-    QuicString key = QuicTextUtils::HexDecode(test_vectors[i].key);
-    QuicString pt = QuicTextUtils::HexDecode(test_vectors[i].pt);
-    QuicString iv = QuicTextUtils::HexDecode(test_vectors[i].iv);
-    QuicString fixed = QuicTextUtils::HexDecode(test_vectors[i].fixed);
-    QuicString aad = QuicTextUtils::HexDecode(test_vectors[i].aad);
-    QuicString ct = QuicTextUtils::HexDecode(test_vectors[i].ct);
+    std::string key = QuicTextUtils::HexDecode(test_vectors[i].key);
+    std::string pt = QuicTextUtils::HexDecode(test_vectors[i].pt);
+    std::string iv = QuicTextUtils::HexDecode(test_vectors[i].iv);
+    std::string fixed = QuicTextUtils::HexDecode(test_vectors[i].fixed);
+    std::string aad = QuicTextUtils::HexDecode(test_vectors[i].aad);
+    std::string ct = QuicTextUtils::HexDecode(test_vectors[i].ct);
 
     ChaCha20Poly1305TlsEncrypter encrypter;
     ASSERT_TRUE(encrypter.SetKey(key));
diff --git a/quic/core/crypto/channel_id.h b/quic/core/crypto/channel_id.h
index a6c8de5..d94293c 100644
--- a/quic/core/crypto/channel_id.h
+++ b/quic/core/crypto/channel_id.h
@@ -24,10 +24,10 @@
   // Sign signs |signed_data| using the ChannelID private key and puts the
   // signature into |out_signature|. It returns true on success.
   virtual bool Sign(QuicStringPiece signed_data,
-                    QuicString* out_signature) const = 0;
+                    std::string* out_signature) const = 0;
 
   // SerializeKey returns the serialized ChannelID public key.
-  virtual QuicString SerializeKey() const = 0;
+  virtual std::string SerializeKey() const = 0;
 };
 
 // ChannelIDSourceCallback provides a generic mechanism for a ChannelIDSource
@@ -58,7 +58,7 @@
   // when complete. In this case, the ChannelIDSource will take ownership of
   // |callback|.
   virtual QuicAsyncStatus GetChannelIDKey(
-      const QuicString& hostname,
+      const std::string& hostname,
       std::unique_ptr<ChannelIDKey>* channel_id_key,
       ChannelIDSourceCallback* callback) = 0;
 };
diff --git a/quic/core/crypto/channel_id_test.cc b/quic/core/crypto/channel_id_test.cc
index 3e03580..d904bcb 100644
--- a/quic/core/crypto/channel_id_test.cc
+++ b/quic/core/crypto/channel_id_test.cc
@@ -286,17 +286,17 @@
   std::unique_ptr<ChannelIDSource> source(
       crypto_test_utils::ChannelIDSourceForTesting());
 
-  const QuicString signed_data = "signed data";
-  const QuicString hostname = "foo.example.com";
+  const std::string signed_data = "signed data";
+  const std::string hostname = "foo.example.com";
   std::unique_ptr<ChannelIDKey> channel_id_key;
   QuicAsyncStatus status =
       source->GetChannelIDKey(hostname, &channel_id_key, nullptr);
   ASSERT_EQ(QUIC_SUCCESS, status);
 
-  QuicString signature;
+  std::string signature;
   ASSERT_TRUE(channel_id_key->Sign(signed_data, &signature));
 
-  QuicString key = channel_id_key->SerializeKey();
+  std::string key = channel_id_key->SerializeKey();
   EXPECT_TRUE(ChannelIDVerifier::Verify(key, signed_data, signature));
 
   EXPECT_FALSE(ChannelIDVerifier::Verify("a" + key, signed_data, signature));
@@ -305,14 +305,14 @@
   std::unique_ptr<char[]> bad_key(new char[key.size()]);
   memcpy(bad_key.get(), key.data(), key.size());
   bad_key[1] ^= 0x80;
-  EXPECT_FALSE(ChannelIDVerifier::Verify(QuicString(bad_key.get(), key.size()),
+  EXPECT_FALSE(ChannelIDVerifier::Verify(std::string(bad_key.get(), key.size()),
                                          signed_data, signature));
 
   std::unique_ptr<char[]> bad_signature(new char[signature.size()]);
   memcpy(bad_signature.get(), signature.data(), signature.size());
   bad_signature[1] ^= 0x80;
   EXPECT_FALSE(ChannelIDVerifier::Verify(
-      key, signed_data, QuicString(bad_signature.get(), signature.size())));
+      key, signed_data, std::string(bad_signature.get(), signature.size())));
 
   EXPECT_FALSE(ChannelIDVerifier::Verify(key, "wrong signed data", signature));
 }
diff --git a/quic/core/crypto/crypto_framer.cc b/quic/core/crypto/crypto_framer.cc
index dfd9eab..d8a32bc 100644
--- a/quic/core/crypto/crypto_framer.cc
+++ b/quic/core/crypto/crypto_framer.cc
@@ -75,7 +75,7 @@
   return error_;
 }
 
-const QuicString& CryptoFramer::error_detail() const {
+const std::string& CryptoFramer::error_detail() const {
   return error_detail_;
 }
 
@@ -329,7 +329,7 @@
       break;
   }
   // Save any remaining data.
-  buffer_ = QuicString(reader.PeekRemainingPayload());
+  buffer_ = std::string(reader.PeekRemainingPayload());
   return QUIC_NO_ERROR;
 }
 
diff --git a/quic/core/crypto/crypto_framer.h b/quic/core/crypto/crypto_framer.h
index e83e6a6..34234e2 100644
--- a/quic/core/crypto/crypto_framer.h
+++ b/quic/core/crypto/crypto_framer.h
@@ -58,7 +58,7 @@
   }
 
   QuicErrorCode error() const override;
-  const QuicString& error_detail() const override;
+  const std::string& error_detail() const override;
 
   // Processes input data, which must be delivered in order. Returns
   // false if there was an error, and true otherwise. ProcessInput optionally
@@ -115,13 +115,13 @@
   // Last error.
   QuicErrorCode error_;
   // Remaining unparsed data.
-  QuicString buffer_;
+  std::string buffer_;
   // Current state of the parsing.
   CryptoFramerState state_;
   // The message currently being parsed.
   CryptoHandshakeMessage message_;
   // The issue which caused |error_|
-  QuicString error_detail_;
+  std::string error_detail_;
   // Number of entires in the message currently being parsed.
   uint16_t num_entries_;
   // tags_and_lengths_ contains the tags that are currently being parsed and
diff --git a/quic/core/crypto/crypto_handshake.h b/quic/core/crypto/crypto_handshake.h
index 9b148c8..1e3d668 100644
--- a/quic/core/crypto/crypto_handshake.h
+++ b/quic/core/crypto/crypto_handshake.h
@@ -104,28 +104,28 @@
 
   QuicTag key_exchange;
   QuicTag aead;
-  QuicString initial_premaster_secret;
-  QuicString forward_secure_premaster_secret;
+  std::string initial_premaster_secret;
+  std::string forward_secure_premaster_secret;
   // initial_subkey_secret is used as the PRK input to the HKDF used when
   // performing key extraction that needs to happen before forward-secure keys
   // are available.
-  QuicString initial_subkey_secret;
+  std::string initial_subkey_secret;
   // subkey_secret is used as the PRK input to the HKDF used for key extraction.
-  QuicString subkey_secret;
+  std::string subkey_secret;
   CrypterPair initial_crypters;
   CrypterPair forward_secure_crypters;
   // Normalized SNI: converted to lower case and trailing '.' removed.
-  QuicString sni;
-  QuicString client_nonce;
-  QuicString server_nonce;
+  std::string sni;
+  std::string client_nonce;
+  std::string server_nonce;
   // hkdf_input_suffix contains the HKDF input following the label: the
   // ConnectionId, client hello and server config. This is only populated in the
   // client because only the client needs to derive the forward secure keys at a
   // later time from the initial keys.
-  QuicString hkdf_input_suffix;
+  std::string hkdf_input_suffix;
   // cached_certs contains the cached certificates that a client used when
   // sending a client hello.
-  std::vector<QuicString> cached_certs;
+  std::vector<std::string> cached_certs;
   // client_key_exchange is used by clients to store the ephemeral KeyExchange
   // for the connection.
   std::unique_ptr<KeyExchange> client_key_exchange;
@@ -133,14 +133,14 @@
   // proves possession of the corresponding private key. It consists of 32
   // bytes of x coordinate, followed by 32 bytes of y coordinate. Both values
   // are big-endian and the pair is a P-256 public key.
-  QuicString channel_id;
+  std::string channel_id;
   QuicTag token_binding_key_param;
 
   // Used when generating proof signature when sending server config updates.
 
   // Used to generate cert chain when sending server config updates.
-  QuicString client_common_set_hashes;
-  QuicString client_cached_cert_hashes;
+  std::string client_common_set_hashes;
+  std::string client_cached_cert_hashes;
 
   // Default to false; set to true if the client indicates that it supports sct
   // by sending CSCT tag with an empty value in client hello.
diff --git a/quic/core/crypto/crypto_handshake_message.cc b/quic/core/crypto/crypto_handshake_message.cc
index a057254..46577b3 100644
--- a/quic/core/crypto/crypto_handshake_message.cc
+++ b/quic/core/crypto/crypto_handshake_message.cc
@@ -85,7 +85,7 @@
 
 void CryptoHandshakeMessage::SetStringPiece(QuicTag tag,
                                             QuicStringPiece value) {
-  tag_value_map_[tag] = QuicString(value);
+  tag_value_map_[tag] = std::string(value);
 }
 
 void CryptoHandshakeMessage::Erase(QuicTag tag) {
@@ -236,7 +236,7 @@
   return minimum_size_;
 }
 
-QuicString CryptoHandshakeMessage::DebugString() const {
+std::string CryptoHandshakeMessage::DebugString() const {
   return DebugStringInternal(0);
 }
 
@@ -261,11 +261,12 @@
   return ret;
 }
 
-QuicString CryptoHandshakeMessage::DebugStringInternal(size_t indent) const {
-  QuicString ret = QuicString(2 * indent, ' ') + QuicTagToString(tag_) + "<\n";
+std::string CryptoHandshakeMessage::DebugStringInternal(size_t indent) const {
+  std::string ret =
+      std::string(2 * indent, ' ') + QuicTagToString(tag_) + "<\n";
   ++indent;
   for (auto it = tag_value_map_.begin(); it != tag_value_map_.end(); ++it) {
-    ret += QuicString(2 * indent, ' ') + QuicTagToString(it->first) + ": ";
+    ret += std::string(2 * indent, ' ') + QuicTagToString(it->first) + ": ";
 
     bool done = false;
     switch (it->first) {
@@ -371,7 +372,7 @@
     ret += "\n";
   }
   --indent;
-  ret += QuicString(2 * indent, ' ') + ">";
+  ret += std::string(2 * indent, ' ') + ">";
   return ret;
 }
 
diff --git a/quic/core/crypto/crypto_handshake_message.h b/quic/core/crypto/crypto_handshake_message.h
index 1f6e8b6..8a75436 100644
--- a/quic/core/crypto/crypto_handshake_message.h
+++ b/quic/core/crypto/crypto_handshake_message.h
@@ -45,7 +45,7 @@
   template <class T>
   void SetValue(QuicTag tag, const T& v) {
     tag_value_map_[tag] =
-        QuicString(reinterpret_cast<const char*>(&v), sizeof(v));
+        std::string(reinterpret_cast<const char*>(&v), sizeof(v));
   }
 
   // SetVector sets an element with the given tag to the raw contents of an
@@ -53,10 +53,10 @@
   template <class T>
   void SetVector(QuicTag tag, const std::vector<T>& v) {
     if (v.empty()) {
-      tag_value_map_[tag] = QuicString();
+      tag_value_map_[tag] = std::string();
     } else {
-      tag_value_map_[tag] = QuicString(reinterpret_cast<const char*>(&v[0]),
-                                       v.size() * sizeof(T));
+      tag_value_map_[tag] = std::string(reinterpret_cast<const char*>(&v[0]),
+                                        v.size() * sizeof(T));
     }
   }
 
@@ -126,7 +126,7 @@
 
   // DebugString returns a multi-line, string representation of the message
   // suitable for including in debug output.
-  QuicString DebugString() const;
+  std::string DebugString() const;
 
  private:
   // GetPOD is a utility function for extracting a plain-old-data value. If
@@ -138,7 +138,7 @@
   // little-endian.
   QuicErrorCode GetPOD(QuicTag tag, void* out, size_t len) const;
 
-  QuicString DebugStringInternal(size_t indent) const;
+  std::string DebugStringInternal(size_t indent) const;
 
   QuicTag tag_;
   QuicTagValueMap tag_value_map_;
diff --git a/quic/core/crypto/crypto_message_parser.h b/quic/core/crypto/crypto_message_parser.h
index 8b9fa4a..3c70e6e 100644
--- a/quic/core/crypto/crypto_message_parser.h
+++ b/quic/core/crypto/crypto_message_parser.h
@@ -17,7 +17,7 @@
   virtual ~CryptoMessageParser() {}
 
   virtual QuicErrorCode error() const = 0;
-  virtual const QuicString& error_detail() const = 0;
+  virtual const std::string& error_detail() const = 0;
 
   // Processes input data, which must be delivered in order. The input data
   // being processed was received at encryption level |level|. Returns
diff --git a/quic/core/crypto/crypto_message_printer_bin.cc b/quic/core/crypto/crypto_message_printer_bin.cc
index f14abb0..66fa7e4 100644
--- a/quic/core/crypto/crypto_message_printer_bin.cc
+++ b/quic/core/crypto/crypto_message_printer_bin.cc
@@ -16,7 +16,6 @@
 #include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h"
 
 using quic::Perspective;
-using quic::QuicString;
 using std::cerr;
 using std::cout;
 using std::endl;
@@ -44,7 +43,7 @@
   quic::CryptoFramer framer;
   framer.set_visitor(&printer);
   framer.set_process_truncated_messages(true);
-  QuicString input = quic::QuicTextUtils::HexDecode(argv[1]);
+  std::string input = quic::QuicTextUtils::HexDecode(argv[1]);
   if (!framer.ProcessInput(input)) {
     return 1;
   }
diff --git a/quic/core/crypto/crypto_protocol.h b/quic/core/crypto/crypto_protocol.h
index e5a4048..d3304ba 100644
--- a/quic/core/crypto/crypto_protocol.h
+++ b/quic/core/crypto/crypto_protocol.h
@@ -24,7 +24,7 @@
 
 namespace quic {
 
-typedef QuicString ServerConfigID;
+typedef std::string ServerConfigID;
 
 // clang-format off
 const QuicTag kCHLO = TAG('C', 'H', 'L', 'O');   // Client hello
diff --git a/quic/core/crypto/crypto_secret_boxer.cc b/quic/core/crypto/crypto_secret_boxer.cc
index ada12ad..16e9d0c 100644
--- a/quic/core/crypto/crypto_secret_boxer.cc
+++ b/quic/core/crypto/crypto_secret_boxer.cc
@@ -43,12 +43,12 @@
 // kAEAD is the AEAD used for boxing: AES-256-GCM-SIV.
 static const EVP_AEAD* (*const kAEAD)() = EVP_aead_aes_256_gcm_siv;
 
-void CryptoSecretBoxer::SetKeys(const std::vector<QuicString>& keys) {
+void CryptoSecretBoxer::SetKeys(const std::vector<std::string>& keys) {
   DCHECK(!keys.empty());
   const EVP_AEAD* const aead = kAEAD();
   std::unique_ptr<State> new_state(new State);
 
-  for (const QuicString& key : keys) {
+  for (const std::string& key : keys) {
     DCHECK_EQ(kBoxKeySize, key.size());
     bssl::UniquePtr<EVP_AEAD_CTX> ctx(
         EVP_AEAD_CTX_new(aead, reinterpret_cast<const uint8_t*>(key.data()),
@@ -66,8 +66,8 @@
   state_ = std::move(new_state);
 }
 
-QuicString CryptoSecretBoxer::Box(QuicRandom* rand,
-                                  QuicStringPiece plaintext) const {
+std::string CryptoSecretBoxer::Box(QuicRandom* rand,
+                                   QuicStringPiece plaintext) const {
   // The box is formatted as:
   //   12 bytes of random nonce
   //   n bytes of ciphertext
@@ -75,7 +75,7 @@
   size_t out_len =
       kSIVNonceSize + plaintext.size() + EVP_AEAD_max_overhead(kAEAD());
 
-  QuicString ret;
+  std::string ret;
   ret.resize(out_len);
   uint8_t* out = reinterpret_cast<uint8_t*>(const_cast<char*>(ret.data()));
 
@@ -104,7 +104,7 @@
 }
 
 bool CryptoSecretBoxer::Unbox(QuicStringPiece in_ciphertext,
-                              QuicString* out_storage,
+                              std::string* out_storage,
                               QuicStringPiece* out) const {
   if (in_ciphertext.size() < kSIVNonceSize) {
     return false;
diff --git a/quic/core/crypto/crypto_secret_boxer.h b/quic/core/crypto/crypto_secret_boxer.h
index de470b1..13e0469 100644
--- a/quic/core/crypto/crypto_secret_boxer.h
+++ b/quic/core/crypto/crypto_secret_boxer.h
@@ -36,13 +36,13 @@
   // used by |Box|, but all supplied keys will be tried by |Unbox|, to handle
   // key skew across the fleet. This must be called before |Box| or |Unbox|.
   // Keys must be |GetKeySize()| bytes long.
-  void SetKeys(const std::vector<QuicString>& keys);
+  void SetKeys(const std::vector<std::string>& keys);
 
   // Box encrypts |plaintext| using a random nonce generated from |rand| and
   // returns the resulting ciphertext. Since an authenticator and nonce are
   // included, the result will be slightly larger than |plaintext|. The first
   // key in the vector supplied to |SetKeys| will be used.
-  QuicString Box(QuicRandom* rand, QuicStringPiece plaintext) const;
+  std::string Box(QuicRandom* rand, QuicStringPiece plaintext) const;
 
   // Unbox takes the result of a previous call to |Box| in |ciphertext| and
   // authenticates+decrypts it. If |ciphertext| cannot be decrypted with any of
@@ -50,7 +50,7 @@
   // used to store the result and |out| is set to point into |out_storage| and
   // contains the original plaintext.
   bool Unbox(QuicStringPiece ciphertext,
-             QuicString* out_storage,
+             std::string* out_storage,
              QuicStringPiece* out) const;
 
  private:
diff --git a/quic/core/crypto/crypto_secret_boxer_test.cc b/quic/core/crypto/crypto_secret_boxer_test.cc
index d060051..8739977 100644
--- a/quic/core/crypto/crypto_secret_boxer_test.cc
+++ b/quic/core/crypto/crypto_secret_boxer_test.cc
@@ -17,29 +17,30 @@
   QuicStringPiece message("hello world");
 
   CryptoSecretBoxer boxer;
-  boxer.SetKeys({QuicString(CryptoSecretBoxer::GetKeySize(), 0x11)});
+  boxer.SetKeys({std::string(CryptoSecretBoxer::GetKeySize(), 0x11)});
 
-  const QuicString box = boxer.Box(QuicRandom::GetInstance(), message);
+  const std::string box = boxer.Box(QuicRandom::GetInstance(), message);
 
-  QuicString storage;
+  std::string storage;
   QuicStringPiece result;
   EXPECT_TRUE(boxer.Unbox(box, &storage, &result));
   EXPECT_EQ(result, message);
 
-  EXPECT_FALSE(boxer.Unbox(QuicString(1, 'X') + box, &storage, &result));
-  EXPECT_FALSE(boxer.Unbox(box.substr(1, QuicString::npos), &storage, &result));
-  EXPECT_FALSE(boxer.Unbox(QuicString(), &storage, &result));
+  EXPECT_FALSE(boxer.Unbox(std::string(1, 'X') + box, &storage, &result));
+  EXPECT_FALSE(
+      boxer.Unbox(box.substr(1, std::string::npos), &storage, &result));
+  EXPECT_FALSE(boxer.Unbox(std::string(), &storage, &result));
   EXPECT_FALSE(boxer.Unbox(
-      QuicString(1, box[0] ^ 0x80) + box.substr(1, QuicString::npos), &storage,
-      &result));
+      std::string(1, box[0] ^ 0x80) + box.substr(1, std::string::npos),
+      &storage, &result));
 }
 
 // Helper function to test whether one boxer can decode the output of another.
 static bool CanDecode(const CryptoSecretBoxer& decoder,
                       const CryptoSecretBoxer& encoder) {
   QuicStringPiece message("hello world");
-  const QuicString boxed = encoder.Box(QuicRandom::GetInstance(), message);
-  QuicString storage;
+  const std::string boxed = encoder.Box(QuicRandom::GetInstance(), message);
+  std::string storage;
   QuicStringPiece result;
   bool ok = decoder.Unbox(boxed, &storage, &result);
   if (ok) {
@@ -49,8 +50,8 @@
 }
 
 TEST_F(CryptoSecretBoxerTest, MultipleKeys) {
-  QuicString key_11(CryptoSecretBoxer::GetKeySize(), 0x11);
-  QuicString key_12(CryptoSecretBoxer::GetKeySize(), 0x12);
+  std::string key_11(CryptoSecretBoxer::GetKeySize(), 0x11);
+  std::string key_12(CryptoSecretBoxer::GetKeySize(), 0x12);
 
   CryptoSecretBoxer boxer_11, boxer_12, boxer;
   boxer_11.SetKeys({key_11});
diff --git a/quic/core/crypto/crypto_server_test.cc b/quic/core/crypto/crypto_server_test.cc
index 11615c2..b6740e9 100644
--- a/quic/core/crypto/crypto_server_test.cc
+++ b/quic/core/crypto/crypto_server_test.cc
@@ -46,7 +46,7 @@
   ~DummyProofVerifierCallback() override {}
 
   void Run(bool ok,
-           const QuicString& error_details,
+           const std::string& error_details,
            std::unique_ptr<ProofVerifyDetails>* details) override {
     DCHECK(false);
   }
@@ -279,7 +279,7 @@
 
     void Run(
         QuicErrorCode error,
-        const QuicString& error_details,
+        const std::string& error_details,
         std::unique_ptr<CryptoHandshakeMessage> message,
         std::unique_ptr<DiversificationNonce> diversification_nonce,
         std::unique_ptr<ProofSource::Details> proof_source_details) override {
@@ -291,7 +291,7 @@
         ASSERT_NE(error, QUIC_NO_ERROR)
             << "Message didn't fail: " << result_->client_hello.DebugString();
 
-        EXPECT_TRUE(error_details.find(error_substr_) != QuicString::npos)
+        EXPECT_TRUE(error_details.find(error_substr_) != std::string::npos)
             << error_substr_ << " not in " << error_details;
       }
       if (message != nullptr) {
@@ -328,8 +328,8 @@
     EXPECT_TRUE(called);
   }
 
-  QuicString GenerateNonce() {
-    QuicString nonce;
+  std::string GenerateNonce() {
+    std::string nonce;
     CryptoUtils::GenerateNonce(
         clock_.WallNow(), rand_,
         QuicStringPiece(reinterpret_cast<const char*>(orbit_), sizeof(orbit_)),
@@ -384,7 +384,7 @@
            GetParam().use_stateless_rejects;
   }
 
-  QuicString XlctHexString() {
+  std::string XlctHexString() {
     uint64_t xlct = crypto_test_utils::LeafCertHashForTesting();
     return "#" + QuicTextUtils::HexEncode(reinterpret_cast<char*>(&xlct),
                                           sizeof(xlct));
@@ -397,7 +397,7 @@
   QuicSocketAddress client_address_;
   ParsedQuicVersionVector supported_versions_;
   ParsedQuicVersion client_version_;
-  QuicString client_version_string_;
+  std::string client_version_string_;
   QuicCryptoServerConfig config_;
   QuicCryptoServerConfigPeer peer_;
   QuicCompressedCertsCache compressed_certs_cache_;
@@ -411,11 +411,12 @@
 
   // These strings contain hex escaped values from the server suitable for using
   // when constructing client hello messages.
-  QuicString nonce_hex_, pub_hex_, srct_hex_, scid_hex_;
+  std::string nonce_hex_, pub_hex_, srct_hex_, scid_hex_;
   std::unique_ptr<CryptoHandshakeMessage> server_config_;
 };
 
-INSTANTIATE_TEST_SUITE_P(CryptoServerTests, CryptoServerTest,
+INSTANTIATE_TEST_SUITE_P(CryptoServerTests,
+                         CryptoServerTest,
                          ::testing::ValuesIn(GetTestParams()));
 
 TEST_P(CryptoServerTest, BadSNI) {
@@ -669,7 +670,7 @@
   }
   // Set the client's preferred version to a supported version that
   // is not the "current" version (supported_versions_.front()).
-  QuicString bad_version =
+  std::string bad_version =
       ParsedQuicVersionToString(supported_versions_.back());
 
   CryptoHandshakeMessage msg = crypto_test_utils::CreateCHLO(
@@ -683,16 +684,16 @@
 
 TEST_P(CryptoServerTest, CorruptServerConfig) {
   // This tests corrupted server config.
-  CryptoHandshakeMessage msg =
-      crypto_test_utils::CreateCHLO({{"PDMD", "X509"},
-                                     {"AEAD", "AESG"},
-                                     {"KEXS", "C255"},
-                                     {"SCID", (QuicString(1, 'X') + scid_hex_)},
-                                     {"#004b5453", srct_hex_},
-                                     {"PUBS", pub_hex_},
-                                     {"NONC", nonce_hex_},
-                                     {"VER\0", client_version_string_}},
-                                    kClientHelloMinimumSize);
+  CryptoHandshakeMessage msg = crypto_test_utils::CreateCHLO(
+      {{"PDMD", "X509"},
+       {"AEAD", "AESG"},
+       {"KEXS", "C255"},
+       {"SCID", (std::string(1, 'X') + scid_hex_)},
+       {"#004b5453", srct_hex_},
+       {"PUBS", pub_hex_},
+       {"NONC", nonce_hex_},
+       {"VER\0", client_version_string_}},
+      kClientHelloMinimumSize);
 
   ShouldSucceed(msg);
   CheckRejectTag();
@@ -708,7 +709,7 @@
        {"AEAD", "AESG"},
        {"KEXS", "C255"},
        {"SCID", scid_hex_},
-       {"#004b5453", (QuicString(1, 'X') + srct_hex_)},
+       {"#004b5453", (std::string(1, 'X') + srct_hex_)},
        {"PUBS", pub_hex_},
        {"NONC", nonce_hex_},
        {"XLCT", XlctHexString()},
@@ -729,7 +730,7 @@
        {"AEAD", "AESG"},
        {"KEXS", "C255"},
        {"SCID", scid_hex_},
-       {"#004b5453", (QuicString(1, 'X') + srct_hex_)},
+       {"#004b5453", (std::string(1, 'X') + srct_hex_)},
        {"PUBS", pub_hex_},
        {"NONC", nonce_hex_},
        {"XLCT", XlctHexString()},
@@ -749,9 +750,9 @@
        {"AEAD", "AESG"},
        {"KEXS", "C255"},
        {"SCID", scid_hex_},
-       {"#004b5453", (QuicString(1, 'X') + srct_hex_)},
+       {"#004b5453", (std::string(1, 'X') + srct_hex_)},
        {"PUBS", pub_hex_},
-       {"NONC", (QuicString(1, 'X') + nonce_hex_)},
+       {"NONC", (std::string(1, 'X') + nonce_hex_)},
        {"XLCT", XlctHexString()},
        {"VER\0", client_version_string_}},
       kClientHelloMinimumSize);
@@ -770,11 +771,11 @@
        {"AEAD", "AESG"},
        {"KEXS", "C255"},
        {"SCID", scid_hex_},
-       {"#004b5453", (QuicString(1, 'X') + srct_hex_)},
+       {"#004b5453", (std::string(1, 'X') + srct_hex_)},
        {"PUBS", pub_hex_},
-       {"NONC", (QuicString(1, 'X') + nonce_hex_)},
-       {"NONP", (QuicString(1, 'X') + nonce_hex_)},
-       {"SNO\0", (QuicString(1, 'X') + nonce_hex_)},
+       {"NONC", (std::string(1, 'X') + nonce_hex_)},
+       {"NONP", (std::string(1, 'X') + nonce_hex_)},
+       {"SNO\0", (std::string(1, 'X') + nonce_hex_)},
        {"XLCT", XlctHexString()},
        {"VER\0", client_version_string_}},
       kClientHelloMinimumSize);
@@ -847,9 +848,9 @@
 
   // Get certs from compressed certs.
   const CommonCertSets* common_cert_sets(CommonCertSets::GetInstanceQUIC());
-  std::vector<QuicString> cached_certs;
+  std::vector<std::string> cached_certs;
 
-  std::vector<QuicString> certs;
+  std::vector<std::string> certs;
   ASSERT_TRUE(CertCompressor::DecompressChain(cert, cached_certs,
                                               common_cert_sets, &certs));
 
@@ -859,16 +860,16 @@
   std::unique_ptr<ProofVerifyContext> verify_context(
       crypto_test_utils::ProofVerifyContextForTesting());
   std::unique_ptr<ProofVerifyDetails> details;
-  QuicString error_details;
+  std::string error_details;
   std::unique_ptr<ProofVerifierCallback> callback(
       new DummyProofVerifierCallback());
-  QuicString chlo_hash;
+  std::string chlo_hash;
   CryptoUtils::HashHandshakeMessage(msg, &chlo_hash, Perspective::IS_SERVER);
   EXPECT_EQ(QUIC_SUCCESS,
             proof_verifier->VerifyProof(
-                "test.example.com", 443, (QuicString(scfg_str)),
+                "test.example.com", 443, (std::string(scfg_str)),
                 client_version_.transport_version, chlo_hash, certs, "",
-                (QuicString(proof)), verify_context.get(), &error_details,
+                (std::string(proof)), verify_context.get(), &error_details,
                 &details, std::move(callback)));
 }
 
@@ -980,7 +981,7 @@
   QuicStringPiece certs_compressed;
   ASSERT_TRUE(out_.GetStringPiece(kCertificateTag, &certs_compressed));
   ASSERT_NE(0u, certs_compressed.size());
-  std::vector<QuicString> certs;
+  std::vector<std::string> certs;
   ASSERT_TRUE(CertCompressor::DecompressChain(
       certs_compressed, /*cached_certs=*/{}, /*common_sets=*/nullptr, &certs));
 
@@ -1084,7 +1085,7 @@
   QuicStringPiece scid;
   EXPECT_TRUE(scfg->GetStringPiece(kSCID, &scid));
   // Need to take a copy of |scid| has we're about to call |Erase|.
-  const QuicString scid_str(scid);
+  const std::string scid_str(scid);
 
   scfg->Erase(kSCID);
   scfg->MarkDirty();
diff --git a/quic/core/crypto/crypto_utils.cc b/quic/core/crypto/crypto_utils.cc
index 4f6a61d..ff682b3 100644
--- a/quic/core/crypto/crypto_utils.cc
+++ b/quic/core/crypto/crypto_utils.cc
@@ -37,7 +37,7 @@
 std::vector<uint8_t> CryptoUtils::HkdfExpandLabel(
     const EVP_MD* prf,
     const std::vector<uint8_t>& secret,
-    const QuicString& label,
+    const std::string& label,
     size_t out_len) {
   bssl::ScopedCBB quic_hkdf_label;
   CBB inner_label;
@@ -115,9 +115,9 @@
       << "HKDF_extract failed when creating initial crypters";
   handshake_secret.resize(handshake_secret_len);
 
-  const QuicString client_label = "client in";
-  const QuicString server_label = "server in";
-  QuicString encryption_label, decryption_label;
+  const std::string client_label = "client in";
+  const std::string server_label = "server in";
+  std::string encryption_label, decryption_label;
   if (perspective == Perspective::IS_CLIENT) {
     encryption_label = client_label;
     decryption_label = server_label;
@@ -140,7 +140,7 @@
 void CryptoUtils::GenerateNonce(QuicWallTime now,
                                 QuicRandom* random_generator,
                                 QuicStringPiece orbit,
-                                QuicString* nonce) {
+                                std::string* nonce) {
   // a 4-byte timestamp + 28 random bytes.
   nonce->reserve(kNonceSize);
   nonce->resize(kNonceSize);
@@ -169,11 +169,11 @@
                              QuicStringPiece client_nonce,
                              QuicStringPiece server_nonce,
                              QuicStringPiece pre_shared_key,
-                             const QuicString& hkdf_input,
+                             const std::string& hkdf_input,
                              Perspective perspective,
                              Diversification diversification,
                              CrypterPair* crypters,
-                             QuicString* subkey_secret) {
+                             std::string* subkey_secret) {
   // If the connection is using PSK, concatenate it with the pre-master secret.
   std::unique_ptr<char[]> psk_premaster_secret;
   if (!pre_shared_key.empty()) {
@@ -207,9 +207,9 @@
       subkey_secret == nullptr ? 0 : premaster_secret.length();
 
   QuicStringPiece nonce = client_nonce;
-  QuicString nonce_storage;
+  std::string nonce_storage;
   if (!server_nonce.empty()) {
-    nonce_storage = QuicString(client_nonce) + QuicString(server_nonce);
+    nonce_storage = std::string(client_nonce) + std::string(server_nonce);
     nonce = nonce_storage;
   }
 
@@ -259,7 +259,7 @@
         return false;
       }
 
-      QuicString key, nonce_prefix;
+      std::string key, nonce_prefix;
       QuicDecrypter::DiversifyPreliminaryKey(
           hkdf.server_write_key(), hkdf.server_write_iv(),
           *diversification.nonce(), key_bytes, nonce_prefix_bytes, &key,
@@ -277,7 +277,7 @@
   }
 
   if (subkey_secret != nullptr) {
-    *subkey_secret = QuicString(hkdf.subkey_secret());
+    *subkey_secret = std::string(hkdf.subkey_secret());
   }
 
   return true;
@@ -288,7 +288,7 @@
                                        QuicStringPiece label,
                                        QuicStringPiece context,
                                        size_t result_len,
-                                       QuicString* result) {
+                                       std::string* result) {
   for (size_t i = 0; i < label.length(); i++) {
     if (label[i] == '\0') {
       QUIC_LOG(ERROR) << "ExportKeyingMaterial label may not contain NULs";
@@ -301,14 +301,14 @@
     return false;
   }
   uint32_t context_length = static_cast<uint32_t>(context.length());
-  QuicString info = QuicString(label);
+  std::string info = std::string(label);
   info.push_back('\0');
   info.append(reinterpret_cast<char*>(&context_length), sizeof(context_length));
   info.append(context.data(), context.length());
 
   QuicHKDF hkdf(subkey_secret, QuicStringPiece() /* no salt */, info,
                 result_len, 0 /* no fixed IV */, 0 /* no subkey secret */);
-  *result = QuicString(hkdf.client_write_key());
+  *result = std::string(hkdf.client_write_key());
   return true;
 }
 
@@ -320,7 +320,7 @@
 QuicErrorCode CryptoUtils::ValidateServerHello(
     const CryptoHandshakeMessage& server_hello,
     const ParsedQuicVersionVector& negotiated_versions,
-    QuicString* error_details) {
+    std::string* error_details) {
   DCHECK(error_details != nullptr);
 
   if (server_hello.tag() != kSHLO) {
@@ -342,7 +342,7 @@
 QuicErrorCode CryptoUtils::ValidateServerHelloVersions(
     const QuicVersionLabelVector& server_versions,
     const ParsedQuicVersionVector& negotiated_versions,
-    QuicString* error_details) {
+    std::string* error_details) {
   if (!negotiated_versions.empty()) {
     bool mismatch = server_versions.size() != negotiated_versions.size();
     for (size_t i = 0; i < server_versions.size() && !mismatch; ++i) {
@@ -368,7 +368,7 @@
     const CryptoHandshakeMessage& client_hello,
     ParsedQuicVersion version,
     const ParsedQuicVersionVector& supported_versions,
-    QuicString* error_details) {
+    std::string* error_details) {
   if (client_hello.tag() != kCHLO) {
     *error_details = "Bad tag";
     return QUIC_INVALID_CRYPTO_MESSAGE_TYPE;
@@ -392,7 +392,7 @@
     QuicVersionLabel client_version,
     ParsedQuicVersion connection_version,
     const ParsedQuicVersionVector& supported_versions,
-    QuicString* error_details) {
+    std::string* error_details) {
   if (client_version != CreateQuicVersionLabel(connection_version)) {
     // Check to see if |client_version| is actually on the supported versions
     // list. If not, the server doesn't support that version and it's not a
@@ -456,7 +456,7 @@
 
 // static
 void CryptoUtils::HashHandshakeMessage(const CryptoHandshakeMessage& message,
-                                       QuicString* output,
+                                       std::string* output,
                                        Perspective perspective) {
   const QuicData& serialized = message.GetSerialized();
   uint8_t digest[SHA256_DIGEST_LENGTH];
diff --git a/quic/core/crypto/crypto_utils.h b/quic/core/crypto/crypto_utils.h
index 511bae9..f340bf4 100644
--- a/quic/core/crypto/crypto_utils.h
+++ b/quic/core/crypto/crypto_utils.h
@@ -101,7 +101,7 @@
   static void GenerateNonce(QuicWallTime now,
                             QuicRandom* random_generator,
                             QuicStringPiece orbit,
-                            QuicString* nonce);
+                            std::string* nonce);
 
   // DeriveKeys populates |crypters->encrypter|, |crypters->decrypter|, and
   // |subkey_secret| (optional -- may be null) given the contents of
@@ -127,11 +127,11 @@
                          QuicStringPiece client_nonce,
                          QuicStringPiece server_nonce,
                          QuicStringPiece pre_shared_key,
-                         const QuicString& hkdf_input,
+                         const std::string& hkdf_input,
                          Perspective perspective,
                          Diversification diversification,
                          CrypterPair* crypters,
-                         QuicString* subkey_secret);
+                         std::string* subkey_secret);
 
   // Performs key extraction to derive a new secret of |result_len| bytes
   // dependent on |subkey_secret|, |label|, and |context|. Returns false if the
@@ -141,7 +141,7 @@
                                    QuicStringPiece label,
                                    QuicStringPiece context,
                                    size_t result_len,
-                                   QuicString* result);
+                                   std::string* result);
 
   // Computes the FNV-1a hash of the provided DER-encoded cert for use in the
   // XLCT tag.
@@ -155,7 +155,7 @@
   static QuicErrorCode ValidateServerHello(
       const CryptoHandshakeMessage& server_hello,
       const ParsedQuicVersionVector& negotiated_versions,
-      QuicString* error_details);
+      std::string* error_details);
 
   // Validates that the |server_versions| received do not indicate that the
   // ServerHello is part of a downgrade attack. |negotiated_versions| must
@@ -167,7 +167,7 @@
   static QuicErrorCode ValidateServerHelloVersions(
       const QuicVersionLabelVector& server_versions,
       const ParsedQuicVersionVector& negotiated_versions,
-      QuicString* error_details);
+      std::string* error_details);
 
   // Validates that |client_hello| is actually a CHLO and that this is not part
   // of a downgrade attack.
@@ -179,7 +179,7 @@
       const CryptoHandshakeMessage& client_hello,
       ParsedQuicVersion version,
       const ParsedQuicVersionVector& supported_versions,
-      QuicString* error_details);
+      std::string* error_details);
 
   // Validates that the |client_version| received does not indicate that a
   // downgrade attack has occurred. |connection_version| is the version of the
@@ -192,7 +192,7 @@
       QuicVersionLabel client_version,
       ParsedQuicVersion connection_version,
       const ParsedQuicVersionVector& supported_versions,
-      QuicString* error_details);
+      std::string* error_details);
 
   // Returns the name of the HandshakeFailureReason as a char*
   static const char* HandshakeFailureReasonToString(
@@ -200,7 +200,7 @@
 
   // Writes a hash of the serialized |message| into |output|.
   static void HashHandshakeMessage(const CryptoHandshakeMessage& message,
-                                   QuicString* output,
+                                   std::string* output,
                                    Perspective perspective);
 
  private:
@@ -221,7 +221,7 @@
   static std::vector<uint8_t> HkdfExpandLabel(
       const EVP_MD* prf,
       const std::vector<uint8_t>& secret,
-      const QuicString& label,
+      const std::string& label,
       size_t out_len);
 };
 
diff --git a/quic/core/crypto/crypto_utils_test.cc b/quic/core/crypto/crypto_utils_test.cc
index 90a37af..c76337d 100644
--- a/quic/core/crypto/crypto_utils_test.cc
+++ b/quic/core/crypto/crypto_utils_test.cc
@@ -50,18 +50,18 @@
 
   for (size_t i = 0; i < QUIC_ARRAYSIZE(test_vector); i++) {
     // Decode the test vector.
-    QuicString subkey_secret =
+    std::string subkey_secret =
         QuicTextUtils::HexDecode(test_vector[i].subkey_secret);
-    QuicString label = QuicTextUtils::HexDecode(test_vector[i].label);
-    QuicString context = QuicTextUtils::HexDecode(test_vector[i].context);
+    std::string label = QuicTextUtils::HexDecode(test_vector[i].label);
+    std::string context = QuicTextUtils::HexDecode(test_vector[i].context);
     size_t result_len = test_vector[i].result_len;
     bool expect_ok = test_vector[i].expected != nullptr;
-    QuicString expected;
+    std::string expected;
     if (expect_ok) {
       expected = QuicTextUtils::HexDecode(test_vector[i].expected);
     }
 
-    QuicString result;
+    std::string result;
     bool ok = CryptoUtils::ExportKeyingMaterial(subkey_secret, label, context,
                                                 result_len, &result);
     EXPECT_EQ(expect_ok, ok);
diff --git a/quic/core/crypto/curve25519_key_exchange.cc b/quic/core/crypto/curve25519_key_exchange.cc
index 368b453..9c8e5ed 100644
--- a/quic/core/crypto/curve25519_key_exchange.cc
+++ b/quic/core/crypto/curve25519_key_exchange.cc
@@ -20,7 +20,8 @@
   ~Curve25519KeyExchangeFactory() override = default;
 
   std::unique_ptr<KeyExchange> Create(QuicRandom* rand) const override {
-    const QuicString private_value = Curve25519KeyExchange::NewPrivateKey(rand);
+    const std::string private_value =
+        Curve25519KeyExchange::NewPrivateKey(rand);
     return Curve25519KeyExchange::New(private_value);
   }
 
@@ -58,10 +59,10 @@
 }
 
 // static
-QuicString Curve25519KeyExchange::NewPrivateKey(QuicRandom* rand) {
+std::string Curve25519KeyExchange::NewPrivateKey(QuicRandom* rand) {
   uint8_t private_key[X25519_PRIVATE_KEY_LEN];
   rand->RandBytes(private_key, sizeof(private_key));
-  return QuicString(reinterpret_cast<char*>(private_key), sizeof(private_key));
+  return std::string(reinterpret_cast<char*>(private_key), sizeof(private_key));
 }
 
 const Curve25519KeyExchange::Factory& Curve25519KeyExchange::GetFactory()
@@ -72,7 +73,7 @@
 
 bool Curve25519KeyExchange::CalculateSharedKey(
     QuicStringPiece peer_public_value,
-    QuicString* out_result) const {
+    std::string* out_result) const {
   if (peer_public_value.size() != X25519_PUBLIC_VALUE_LEN) {
     return false;
   }
@@ -89,7 +90,7 @@
 
 void Curve25519KeyExchange::CalculateSharedKey(
     QuicStringPiece peer_public_value,
-    QuicString* shared_key,
+    std::string* shared_key,
     std::unique_ptr<Callback> callback) const {
   callback->Run(CalculateSharedKey(peer_public_value, shared_key));
 }
diff --git a/quic/core/crypto/curve25519_key_exchange.h b/quic/core/crypto/curve25519_key_exchange.h
index a715e3e..115789c 100644
--- a/quic/core/crypto/curve25519_key_exchange.h
+++ b/quic/core/crypto/curve25519_key_exchange.h
@@ -29,14 +29,14 @@
 
   // NewPrivateKey returns a private key, generated from |rand|, suitable for
   // passing to |New|.
-  static QuicString NewPrivateKey(QuicRandom* rand);
+  static std::string NewPrivateKey(QuicRandom* rand);
 
   // KeyExchange interface.
   const Factory& GetFactory() const override;
   bool CalculateSharedKey(QuicStringPiece peer_public_value,
-                          QuicString* shared_key) const override;
+                          std::string* shared_key) const override;
   void CalculateSharedKey(QuicStringPiece peer_public_value,
-                          QuicString* shared_key,
+                          std::string* shared_key,
                           std::unique_ptr<Callback> callback) const override;
   QuicStringPiece public_value() const override;
 
diff --git a/quic/core/crypto/curve25519_key_exchange_test.cc b/quic/core/crypto/curve25519_key_exchange_test.cc
index e5ed6e0..0c4f735 100644
--- a/quic/core/crypto/curve25519_key_exchange_test.cc
+++ b/quic/core/crypto/curve25519_key_exchange_test.cc
@@ -46,8 +46,8 @@
   QuicRandom* const rand = QuicRandom::GetInstance();
 
   for (int i = 0; i < 5; i++) {
-    const QuicString alice_key(Curve25519KeyExchange::NewPrivateKey(rand));
-    const QuicString bob_key(Curve25519KeyExchange::NewPrivateKey(rand));
+    const std::string alice_key(Curve25519KeyExchange::NewPrivateKey(rand));
+    const std::string bob_key(Curve25519KeyExchange::NewPrivateKey(rand));
 
     std::unique_ptr<Curve25519KeyExchange> alice(
         Curve25519KeyExchange::New(alice_key));
@@ -57,7 +57,7 @@
     const QuicStringPiece alice_public(alice->public_value());
     const QuicStringPiece bob_public(bob->public_value());
 
-    QuicString alice_shared, bob_shared;
+    std::string alice_shared, bob_shared;
     ASSERT_TRUE(alice->CalculateSharedKey(bob_public, &alice_shared));
     ASSERT_TRUE(bob->CalculateSharedKey(alice_public, &bob_shared));
     ASSERT_EQ(alice_shared, bob_shared);
@@ -70,8 +70,8 @@
   QuicRandom* const rand = QuicRandom::GetInstance();
 
   for (int i = 0; i < 5; i++) {
-    const QuicString alice_key(Curve25519KeyExchange::NewPrivateKey(rand));
-    const QuicString bob_key(Curve25519KeyExchange::NewPrivateKey(rand));
+    const std::string alice_key(Curve25519KeyExchange::NewPrivateKey(rand));
+    const std::string bob_key(Curve25519KeyExchange::NewPrivateKey(rand));
 
     std::unique_ptr<Curve25519KeyExchange> alice(
         Curve25519KeyExchange::New(alice_key));
@@ -81,7 +81,7 @@
     const QuicStringPiece alice_public(alice->public_value());
     const QuicStringPiece bob_public(bob->public_value());
 
-    QuicString alice_shared, bob_shared;
+    std::string alice_shared, bob_shared;
     TestCallbackResult alice_result;
     ASSERT_FALSE(alice_result.ok());
     alice->CalculateSharedKey(bob_public, &alice_shared,
diff --git a/quic/core/crypto/key_exchange.h b/quic/core/crypto/key_exchange.h
index 84ca626..8970b62 100644
--- a/quic/core/crypto/key_exchange.h
+++ b/quic/core/crypto/key_exchange.h
@@ -65,14 +65,14 @@
   // (which is implicitly known by a KeyExchange object) and a public value
   // from the peer.
   virtual bool CalculateSharedKey(QuicStringPiece peer_public_value,
-                                  QuicString* shared_key) const = 0;
+                                  std::string* shared_key) const = 0;
 
   // CalculateSharedKey computes the shared key between the local private key
   // (which is may not be locally known to a KeyExchange object) and a public
   // value from the peer.
   // Callers should expect that |callback| might be invoked synchronously.
   virtual void CalculateSharedKey(QuicStringPiece peer_public_value,
-                                  QuicString* shared_key,
+                                  std::string* shared_key,
                                   std::unique_ptr<Callback> callback) const = 0;
 
   // public_value returns the local public key which can be sent to a peer in
diff --git a/quic/core/crypto/p256_key_exchange.cc b/quic/core/crypto/p256_key_exchange.cc
index 2bfbd09..a53efe5 100644
--- a/quic/core/crypto/p256_key_exchange.cc
+++ b/quic/core/crypto/p256_key_exchange.cc
@@ -26,7 +26,7 @@
 
   std::unique_ptr<KeyExchange> Create(QuicRandom* /* rand */) const override {
     // TODO(agl): avoid the serialisation/deserialisation in this function.
-    const QuicString private_value = P256KeyExchange::NewPrivateKey();
+    const std::string private_value = P256KeyExchange::NewPrivateKey();
     return P256KeyExchange::New(private_value);
   }
 
@@ -72,25 +72,25 @@
 }
 
 // static
-QuicString P256KeyExchange::NewPrivateKey() {
+std::string P256KeyExchange::NewPrivateKey() {
   bssl::UniquePtr<EC_KEY> key(EC_KEY_new_by_curve_name(NID_X9_62_prime256v1));
   if (!key.get() || !EC_KEY_generate_key(key.get())) {
     QUIC_DLOG(INFO) << "Can't generate a new private key.";
-    return QuicString();
+    return std::string();
   }
 
   int key_len = i2d_ECPrivateKey(key.get(), nullptr);
   if (key_len <= 0) {
     QUIC_DLOG(INFO) << "Can't convert private key to string";
-    return QuicString();
+    return std::string();
   }
   std::unique_ptr<uint8_t[]> private_key(new uint8_t[key_len]);
   uint8_t* keyp = private_key.get();
   if (!i2d_ECPrivateKey(key.get(), &keyp)) {
     QUIC_DLOG(INFO) << "Can't convert private key to string.";
-    return QuicString();
+    return std::string();
   }
-  return QuicString(reinterpret_cast<char*>(private_key.get()), key_len);
+  return std::string(reinterpret_cast<char*>(private_key.get()), key_len);
 }
 
 const KeyExchange::Factory& P256KeyExchange::GetFactory() const {
@@ -99,7 +99,7 @@
 }
 
 bool P256KeyExchange::CalculateSharedKey(QuicStringPiece peer_public_value,
-                                         QuicString* out_result) const {
+                                         std::string* out_result) const {
   if (peer_public_value.size() != kUncompressedP256PointBytes) {
     QUIC_DLOG(INFO) << "Peer public value is invalid";
     return false;
@@ -130,7 +130,7 @@
 
 void P256KeyExchange::CalculateSharedKey(
     QuicStringPiece peer_public_value,
-    QuicString* shared_key,
+    std::string* shared_key,
     std::unique_ptr<Callback> callback) const {
   callback->Run(CalculateSharedKey(peer_public_value, shared_key));
 }
diff --git a/quic/core/crypto/p256_key_exchange.h b/quic/core/crypto/p256_key_exchange.h
index d70d9cc..04301e4 100644
--- a/quic/core/crypto/p256_key_exchange.h
+++ b/quic/core/crypto/p256_key_exchange.h
@@ -29,14 +29,14 @@
   // |NewPrivateKey| returns a private key, suitable for passing to |New|.
   // If |NewPrivateKey| can't generate a private key, it returns an empty
   // string.
-  static QuicString NewPrivateKey();
+  static std::string NewPrivateKey();
 
   // KeyExchange interface.
   const Factory& GetFactory() const override;
   bool CalculateSharedKey(QuicStringPiece peer_public_value,
-                          QuicString* shared_key) const override;
+                          std::string* shared_key) const override;
   void CalculateSharedKey(QuicStringPiece peer_public_value,
-                          QuicString* shared_key,
+                          std::string* shared_key,
                           std::unique_ptr<Callback> callback) const override;
   QuicStringPiece public_value() const override;
 
diff --git a/quic/core/crypto/p256_key_exchange_test.cc b/quic/core/crypto/p256_key_exchange_test.cc
index 5deee9d..32d6bf1 100644
--- a/quic/core/crypto/p256_key_exchange_test.cc
+++ b/quic/core/crypto/p256_key_exchange_test.cc
@@ -43,8 +43,8 @@
 // holds: that both parties end up with the same key.
 TEST_F(P256KeyExchangeTest, SharedKey) {
   for (int i = 0; i < 5; i++) {
-    QuicString alice_private(P256KeyExchange::NewPrivateKey());
-    QuicString bob_private(P256KeyExchange::NewPrivateKey());
+    std::string alice_private(P256KeyExchange::NewPrivateKey());
+    std::string bob_private(P256KeyExchange::NewPrivateKey());
 
     ASSERT_FALSE(alice_private.empty());
     ASSERT_FALSE(bob_private.empty());
@@ -59,7 +59,7 @@
     const QuicStringPiece alice_public(alice->public_value());
     const QuicStringPiece bob_public(bob->public_value());
 
-    QuicString alice_shared, bob_shared;
+    std::string alice_shared, bob_shared;
     ASSERT_TRUE(alice->CalculateSharedKey(bob_public, &alice_shared));
     ASSERT_TRUE(bob->CalculateSharedKey(alice_public, &bob_shared));
     ASSERT_EQ(alice_shared, bob_shared);
@@ -70,8 +70,8 @@
 // parties end up with the same key.
 TEST_F(P256KeyExchangeTest, AsyncSharedKey) {
   for (int i = 0; i < 5; i++) {
-    QuicString alice_private(P256KeyExchange::NewPrivateKey());
-    QuicString bob_private(P256KeyExchange::NewPrivateKey());
+    std::string alice_private(P256KeyExchange::NewPrivateKey());
+    std::string bob_private(P256KeyExchange::NewPrivateKey());
 
     ASSERT_FALSE(alice_private.empty());
     ASSERT_FALSE(bob_private.empty());
@@ -86,7 +86,7 @@
     const QuicStringPiece alice_public(alice->public_value());
     const QuicStringPiece bob_public(bob->public_value());
 
-    QuicString alice_shared, bob_shared;
+    std::string alice_shared, bob_shared;
     TestCallbackResult alice_result;
     ASSERT_FALSE(alice_result.ok());
     alice->CalculateSharedKey(bob_public, &alice_shared,
diff --git a/quic/core/crypto/proof_source.cc b/quic/core/crypto/proof_source.cc
index ce77d8b..4edb40d 100644
--- a/quic/core/crypto/proof_source.cc
+++ b/quic/core/crypto/proof_source.cc
@@ -7,7 +7,7 @@
 
 namespace quic {
 
-ProofSource::Chain::Chain(const std::vector<QuicString>& certs)
+ProofSource::Chain::Chain(const std::vector<std::string>& certs)
     : certs(certs) {}
 
 ProofSource::Chain::~Chain() {}
diff --git a/quic/core/crypto/proof_source.h b/quic/core/crypto/proof_source.h
index 3fec32b..0f293be 100644
--- a/quic/core/crypto/proof_source.h
+++ b/quic/core/crypto/proof_source.h
@@ -25,11 +25,11 @@
   // Chain is a reference-counted wrapper for a vector of stringified
   // certificates.
   struct QUIC_EXPORT_PRIVATE Chain : public QuicReferenceCounted {
-    explicit Chain(const std::vector<QuicString>& certs);
+    explicit Chain(const std::vector<std::string>& certs);
     Chain(const Chain&) = delete;
     Chain& operator=(const Chain&) = delete;
 
-    const std::vector<QuicString> certs;
+    const std::vector<std::string> certs;
 
    protected:
     ~Chain() override;
@@ -85,7 +85,7 @@
     //
     // |signature| contains the signature of the data provided to
     // ComputeTlsSignature. Its value is undefined if |ok| is false.
-    virtual void Run(bool ok, QuicString signature) = 0;
+    virtual void Run(bool ok, std::string signature) = 0;
 
    private:
     SignatureCallback(const SignatureCallback&) = delete;
@@ -113,8 +113,8 @@
   //
   // Callers should expect that |callback| might be invoked synchronously.
   virtual void GetProof(const QuicSocketAddress& server_address,
-                        const QuicString& hostname,
-                        const QuicString& server_config,
+                        const std::string& hostname,
+                        const std::string& server_config,
                         QuicTransportVersion transport_version,
                         QuicStringPiece chlo_hash,
                         std::unique_ptr<Callback> callback) = 0;
@@ -122,7 +122,7 @@
   // Returns the certificate chain for |hostname| in leaf-first order.
   virtual QuicReferenceCountedPointer<Chain> GetCertChain(
       const QuicSocketAddress& server_address,
-      const QuicString& hostname) = 0;
+      const std::string& hostname) = 0;
 
   // Computes a signature using the private key of the certificate for
   // |hostname|. The value in |in| is signed using the algorithm specified by
@@ -134,7 +134,7 @@
   // Callers should expect that |callback| might be invoked synchronously.
   virtual void ComputeTlsSignature(
       const QuicSocketAddress& server_address,
-      const QuicString& hostname,
+      const std::string& hostname,
       uint16_t signature_algorithm,
       QuicStringPiece in,
       std::unique_ptr<SignatureCallback> callback) = 0;
diff --git a/quic/core/crypto/proof_verifier.h b/quic/core/crypto/proof_verifier.h
index 3219203..9178942 100644
--- a/quic/core/crypto/proof_verifier.h
+++ b/quic/core/crypto/proof_verifier.h
@@ -48,7 +48,7 @@
   // details of the verification. |Run| may take ownership of |details| by
   // calling |release| on it.
   virtual void Run(bool ok,
-                   const QuicString& error_details,
+                   const std::string& error_details,
                    std::unique_ptr<ProofVerifyDetails>* details) = 0;
 };
 
@@ -75,16 +75,16 @@
   // The signature uses SHA-256 as the hash function and PSS padding in the
   // case of RSA.
   virtual QuicAsyncStatus VerifyProof(
-      const QuicString& hostname,
+      const std::string& hostname,
       const uint16_t port,
-      const QuicString& server_config,
+      const std::string& server_config,
       QuicTransportVersion transport_version,
       QuicStringPiece chlo_hash,
-      const std::vector<QuicString>& certs,
-      const QuicString& cert_sct,
-      const QuicString& signature,
+      const std::vector<std::string>& certs,
+      const std::string& cert_sct,
+      const std::string& signature,
       const ProofVerifyContext* context,
-      QuicString* error_details,
+      std::string* error_details,
       std::unique_ptr<ProofVerifyDetails>* details,
       std::unique_ptr<ProofVerifierCallback> callback) = 0;
 
@@ -101,10 +101,10 @@
   // will call back, on the original thread, via |callback| when complete.
   // In this case, the ProofVerifier will take ownership of |callback|.
   virtual QuicAsyncStatus VerifyCertChain(
-      const QuicString& hostname,
-      const std::vector<QuicString>& certs,
+      const std::string& hostname,
+      const std::vector<std::string>& certs,
       const ProofVerifyContext* context,
-      QuicString* error_details,
+      std::string* error_details,
       std::unique_ptr<ProofVerifyDetails>* details,
       std::unique_ptr<ProofVerifierCallback> callback) = 0;
 
diff --git a/quic/core/crypto/quic_compressed_certs_cache.cc b/quic/core/crypto/quic_compressed_certs_cache.cc
index 595ac31..e07e924 100644
--- a/quic/core/crypto/quic_compressed_certs_cache.cc
+++ b/quic/core/crypto/quic_compressed_certs_cache.cc
@@ -26,8 +26,8 @@
 
 QuicCompressedCertsCache::UncompressedCerts::UncompressedCerts(
     const QuicReferenceCountedPointer<ProofSource::Chain>& chain,
-    const QuicString* client_common_set_hashes,
-    const QuicString* client_cached_cert_hashes)
+    const std::string* client_common_set_hashes,
+    const std::string* client_cached_cert_hashes)
     : chain(chain),
       client_common_set_hashes(client_common_set_hashes),
       client_cached_cert_hashes(client_cached_cert_hashes) {}
@@ -38,7 +38,7 @@
 
 QuicCompressedCertsCache::CachedCerts::CachedCerts(
     const UncompressedCerts& uncompressed_certs,
-    const QuicString& compressed_cert)
+    const std::string& compressed_cert)
     : chain_(uncompressed_certs.chain),
       client_common_set_hashes_(*uncompressed_certs.client_common_set_hashes),
       client_cached_cert_hashes_(*uncompressed_certs.client_cached_cert_hashes),
@@ -58,7 +58,7 @@
           chain_ == uncompressed_certs.chain);
 }
 
-const QuicString* QuicCompressedCertsCache::CachedCerts::compressed_cert()
+const std::string* QuicCompressedCertsCache::CachedCerts::compressed_cert()
     const {
   return &compressed_cert_;
 }
@@ -71,10 +71,10 @@
   certs_cache_.Clear();
 }
 
-const QuicString* QuicCompressedCertsCache::GetCompressedCert(
+const std::string* QuicCompressedCertsCache::GetCompressedCert(
     const QuicReferenceCountedPointer<ProofSource::Chain>& chain,
-    const QuicString& client_common_set_hashes,
-    const QuicString& client_cached_cert_hashes) {
+    const std::string& client_common_set_hashes,
+    const std::string& client_cached_cert_hashes) {
   UncompressedCerts uncompressed_certs(chain, &client_common_set_hashes,
                                        &client_cached_cert_hashes);
 
@@ -90,9 +90,9 @@
 
 void QuicCompressedCertsCache::Insert(
     const QuicReferenceCountedPointer<ProofSource::Chain>& chain,
-    const QuicString& client_common_set_hashes,
-    const QuicString& client_cached_cert_hashes,
-    const QuicString& compressed_cert) {
+    const std::string& client_common_set_hashes,
+    const std::string& client_cached_cert_hashes,
+    const std::string& compressed_cert) {
   UncompressedCerts uncompressed_certs(chain, &client_common_set_hashes,
                                        &client_cached_cert_hashes);
 
@@ -115,9 +115,9 @@
 uint64_t QuicCompressedCertsCache::ComputeUncompressedCertsHash(
     const UncompressedCerts& uncompressed_certs) {
   uint64_t hash =
-      std::hash<QuicString>()(*uncompressed_certs.client_common_set_hashes);
+      std::hash<std::string>()(*uncompressed_certs.client_common_set_hashes);
   uint64_t h =
-      std::hash<QuicString>()(*uncompressed_certs.client_cached_cert_hashes);
+      std::hash<std::string>()(*uncompressed_certs.client_cached_cert_hashes);
   hash_combine(&hash, h);
 
   hash_combine(&hash,
diff --git a/quic/core/crypto/quic_compressed_certs_cache.h b/quic/core/crypto/quic_compressed_certs_cache.h
index 418bdb9..340542a 100644
--- a/quic/core/crypto/quic_compressed_certs_cache.h
+++ b/quic/core/crypto/quic_compressed_certs_cache.h
@@ -24,10 +24,10 @@
   // |chain, client_common_set_hashes, client_cached_cert_hashes| hits cache.
   // Otherwise, return nullptr.
   // Returned pointer might become invalid on the next call to Insert().
-  const QuicString* GetCompressedCert(
+  const std::string* GetCompressedCert(
       const QuicReferenceCountedPointer<ProofSource::Chain>& chain,
-      const QuicString& client_common_set_hashes,
-      const QuicString& client_cached_cert_hashes);
+      const std::string& client_common_set_hashes,
+      const std::string& client_cached_cert_hashes);
 
   // Inserts the specified
   // |chain, client_common_set_hashes,
@@ -35,9 +35,9 @@
   // If the insertion causes the cache to become overfull, entries will
   // be deleted in an LRU order to make room.
   void Insert(const QuicReferenceCountedPointer<ProofSource::Chain>& chain,
-              const QuicString& client_common_set_hashes,
-              const QuicString& client_cached_cert_hashes,
-              const QuicString& compressed_cert);
+              const std::string& client_common_set_hashes,
+              const std::string& client_cached_cert_hashes,
+              const std::string& compressed_cert);
 
   // Returns max number of cache entries the cache can carry.
   size_t MaxSize();
@@ -56,13 +56,13 @@
     UncompressedCerts();
     UncompressedCerts(
         const QuicReferenceCountedPointer<ProofSource::Chain>& chain,
-        const QuicString* client_common_set_hashes,
-        const QuicString* client_cached_cert_hashes);
+        const std::string* client_common_set_hashes,
+        const std::string* client_cached_cert_hashes);
     ~UncompressedCerts();
 
     const QuicReferenceCountedPointer<ProofSource::Chain> chain;
-    const QuicString* client_common_set_hashes;
-    const QuicString* client_cached_cert_hashes;
+    const std::string* client_common_set_hashes;
+    const std::string* client_cached_cert_hashes;
   };
 
   // Certs stored by QuicCompressedCertsCache where uncompressed certs data is
@@ -72,7 +72,7 @@
    public:
     CachedCerts();
     CachedCerts(const UncompressedCerts& uncompressed_certs,
-                const QuicString& compressed_cert);
+                const std::string& compressed_cert);
     CachedCerts(const CachedCerts& other);
     ~CachedCerts();
 
@@ -81,16 +81,16 @@
     bool MatchesUncompressedCerts(
         const UncompressedCerts& uncompressed_certs) const;
 
-    const QuicString* compressed_cert() const;
+    const std::string* compressed_cert() const;
 
    private:
     // Uncompressed certs data.
     QuicReferenceCountedPointer<ProofSource::Chain> chain_;
-    const QuicString client_common_set_hashes_;
-    const QuicString client_cached_cert_hashes_;
+    const std::string client_common_set_hashes_;
+    const std::string client_cached_cert_hashes_;
 
     // Cached compressed representation derived from uncompressed certs.
-    const QuicString compressed_cert_;
+    const std::string compressed_cert_;
   };
 
   // Computes a uint64_t hash for |uncompressed_certs|.
diff --git a/quic/core/crypto/quic_compressed_certs_cache_test.cc b/quic/core/crypto/quic_compressed_certs_cache_test.cc
index 432a8c0..788f1d7 100644
--- a/quic/core/crypto/quic_compressed_certs_cache_test.cc
+++ b/quic/core/crypto/quic_compressed_certs_cache_test.cc
@@ -27,31 +27,31 @@
 };
 
 TEST_F(QuicCompressedCertsCacheTest, CacheHit) {
-  std::vector<QuicString> certs = {"leaf cert", "intermediate cert",
-                                   "root cert"};
+  std::vector<std::string> certs = {"leaf cert", "intermediate cert",
+                                    "root cert"};
   QuicReferenceCountedPointer<ProofSource::Chain> chain(
       new ProofSource::Chain(certs));
-  QuicString common_certs = "common certs";
-  QuicString cached_certs = "cached certs";
-  QuicString compressed = "compressed cert";
+  std::string common_certs = "common certs";
+  std::string cached_certs = "cached certs";
+  std::string compressed = "compressed cert";
 
   certs_cache_.Insert(chain, common_certs, cached_certs, compressed);
 
-  const QuicString* cached_value =
+  const std::string* cached_value =
       certs_cache_.GetCompressedCert(chain, common_certs, cached_certs);
   ASSERT_NE(nullptr, cached_value);
   EXPECT_EQ(*cached_value, compressed);
 }
 
 TEST_F(QuicCompressedCertsCacheTest, CacheMiss) {
-  std::vector<QuicString> certs = {"leaf cert", "intermediate cert",
-                                   "root cert"};
+  std::vector<std::string> certs = {"leaf cert", "intermediate cert",
+                                    "root cert"};
   QuicReferenceCountedPointer<ProofSource::Chain> chain(
       new ProofSource::Chain(certs));
 
-  QuicString common_certs = "common certs";
-  QuicString cached_certs = "cached certs";
-  QuicString compressed = "compressed cert";
+  std::string common_certs = "common certs";
+  std::string cached_certs = "cached certs";
+  std::string compressed = "compressed cert";
 
   certs_cache_.Insert(chain, common_certs, cached_certs, compressed);
 
@@ -70,14 +70,14 @@
 TEST_F(QuicCompressedCertsCacheTest, CacheMissDueToEviction) {
   // Test cache returns a miss when a queried uncompressed certs was cached but
   // then evicted.
-  std::vector<QuicString> certs = {"leaf cert", "intermediate cert",
-                                   "root cert"};
+  std::vector<std::string> certs = {"leaf cert", "intermediate cert",
+                                    "root cert"};
   QuicReferenceCountedPointer<ProofSource::Chain> chain(
       new ProofSource::Chain(certs));
 
-  QuicString common_certs = "common certs";
-  QuicString cached_certs = "cached certs";
-  QuicString compressed = "compressed cert";
+  std::string common_certs = "common certs";
+  std::string cached_certs = "cached certs";
+  std::string compressed = "compressed cert";
   certs_cache_.Insert(chain, common_certs, cached_certs, compressed);
 
   // Insert another kQuicCompressedCertsCacheSize certs to evict the first
diff --git a/quic/core/crypto/quic_crypto_client_config.cc b/quic/core/crypto/quic_crypto_client_config.cc
index 0bf1b41..8d34173 100644
--- a/quic/core/crypto/quic_crypto_client_config.cc
+++ b/quic/core/crypto/quic_crypto_client_config.cc
@@ -138,7 +138,7 @@
 }
 
 void QuicCryptoClientConfig::CachedState::add_server_nonce(
-    const QuicString& server_nonce) {
+    const std::string& server_nonce) {
   server_nonces_.push(server_nonce);
 }
 
@@ -151,7 +151,7 @@
     QuicStringPiece server_config,
     QuicWallTime now,
     QuicWallTime expiry_time,
-    QuicString* error_details) {
+    std::string* error_details) {
   const bool matches_existing = server_config == server_config_;
 
   // Even if the new server config matches the existing one, we still wish to
@@ -188,7 +188,7 @@
   }
 
   if (!matches_existing) {
-    server_config_ = QuicString(server_config);
+    server_config_ = std::string(server_config);
     SetProofInvalid();
     scfg_ = std::move(new_scfg_storage);
   }
@@ -205,7 +205,7 @@
 }
 
 void QuicCryptoClientConfig::CachedState::SetProof(
-    const std::vector<QuicString>& certs,
+    const std::vector<std::string>& certs,
     QuicStringPiece cert_sct,
     QuicStringPiece chlo_hash,
     QuicStringPiece signature) {
@@ -228,9 +228,9 @@
   // If the proof has changed then it needs to be revalidated.
   SetProofInvalid();
   certs_ = certs;
-  cert_sct_ = QuicString(cert_sct);
-  chlo_hash_ = QuicString(chlo_hash);
-  server_config_sig_ = QuicString(signature);
+  cert_sct_ = std::string(cert_sct);
+  chlo_hash_ = std::string(chlo_hash);
+  server_config_sig_ = std::string(signature);
 }
 
 void QuicCryptoClientConfig::CachedState::Clear() {
@@ -269,8 +269,8 @@
 bool QuicCryptoClientConfig::CachedState::Initialize(
     QuicStringPiece server_config,
     QuicStringPiece source_address_token,
-    const std::vector<QuicString>& certs,
-    const QuicString& cert_sct,
+    const std::vector<std::string>& certs,
+    const std::string& cert_sct,
     QuicStringPiece chlo_hash,
     QuicStringPiece signature,
     QuicWallTime now,
@@ -282,7 +282,7 @@
     return false;
   }
 
-  QuicString error_details;
+  std::string error_details;
   ServerConfigState state =
       SetServerConfig(server_config, now, expiration_time, &error_details);
   RecordDiskCacheServerConfigState(state);
@@ -300,29 +300,29 @@
   return true;
 }
 
-const QuicString& QuicCryptoClientConfig::CachedState::server_config() const {
+const std::string& QuicCryptoClientConfig::CachedState::server_config() const {
   return server_config_;
 }
 
-const QuicString& QuicCryptoClientConfig::CachedState::source_address_token()
+const std::string& QuicCryptoClientConfig::CachedState::source_address_token()
     const {
   return source_address_token_;
 }
 
-const std::vector<QuicString>& QuicCryptoClientConfig::CachedState::certs()
+const std::vector<std::string>& QuicCryptoClientConfig::CachedState::certs()
     const {
   return certs_;
 }
 
-const QuicString& QuicCryptoClientConfig::CachedState::cert_sct() const {
+const std::string& QuicCryptoClientConfig::CachedState::cert_sct() const {
   return cert_sct_;
 }
 
-const QuicString& QuicCryptoClientConfig::CachedState::chlo_hash() const {
+const std::string& QuicCryptoClientConfig::CachedState::chlo_hash() const {
   return chlo_hash_;
 }
 
-const QuicString& QuicCryptoClientConfig::CachedState::signature() const {
+const std::string& QuicCryptoClientConfig::CachedState::signature() const {
   return server_config_sig_;
 }
 
@@ -341,12 +341,12 @@
 
 void QuicCryptoClientConfig::CachedState::set_source_address_token(
     QuicStringPiece token) {
-  source_address_token_ = QuicString(token);
+  source_address_token_ = std::string(token);
 }
 
 void QuicCryptoClientConfig::CachedState::set_cert_sct(
     QuicStringPiece cert_sct) {
-  cert_sct_ = QuicString(cert_sct);
+  cert_sct_ = std::string(cert_sct);
 }
 
 void QuicCryptoClientConfig::CachedState::SetProofVerifyDetails(
@@ -385,13 +385,13 @@
   return next_id;
 }
 
-QuicString QuicCryptoClientConfig::CachedState::GetNextServerNonce() {
+std::string QuicCryptoClientConfig::CachedState::GetNextServerNonce() {
   if (server_nonces_.empty()) {
     QUIC_BUG
         << "Attempting to consume a server nonce that was never designated.";
     return "";
   }
-  const QuicString server_nonce = server_nonces_.front();
+  const std::string server_nonce = server_nonces_.front();
   server_nonces_.pop();
   return server_nonce;
 }
@@ -494,7 +494,7 @@
 
   out->SetStringPiece(kCertificateSCTTag, "");
 
-  const std::vector<QuicString>& certs = cached->certs();
+  const std::vector<std::string>& certs = cached->certs();
   // We save |certs| in the QuicCryptoNegotiatedParameters so that, if the
   // client config is being used for multiple connections, another connection
   // doesn't update the cached certificates and cause us to be unable to
@@ -520,7 +520,7 @@
     const ChannelIDKey* channel_id_key,
     QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params,
     CryptoHandshakeMessage* out,
-    QuicString* error_details) const {
+    std::string* error_details) const {
   DCHECK(error_details != nullptr);
   QUIC_BUG_IF(!QuicUtils::IsConnectionIdValidForVersion(
       connection_id, preferred_version.transport_version))
@@ -636,7 +636,7 @@
   }
   out->SetStringPiece(kPUBS, out_params->client_key_exchange->public_value());
 
-  const std::vector<QuicString>& certs = cached->certs();
+  const std::vector<std::string>& certs = cached->certs();
   if (certs.empty()) {
     *error_details = "No certs to calculate XLCT";
     return QUIC_CRYPTO_INTERNAL_ERROR;
@@ -653,17 +653,17 @@
     CryptoHandshakeMessage cetv;
     cetv.set_tag(kCETV);
 
-    QuicString hkdf_input;
+    std::string hkdf_input;
     const QuicData& client_hello_serialized = out->GetSerialized();
     hkdf_input.append(QuicCryptoConfig::kCETVLabel,
                       strlen(QuicCryptoConfig::kCETVLabel) + 1);
-      hkdf_input.append(connection_id.data(), connection_id.length());
+    hkdf_input.append(connection_id.data(), connection_id.length());
     hkdf_input.append(client_hello_serialized.data(),
                       client_hello_serialized.length());
     hkdf_input.append(cached->server_config());
 
-    QuicString key = channel_id_key->SerializeKey();
-    QuicString signature;
+    std::string key = channel_id_key->SerializeKey();
+    std::string signature;
     if (!channel_id_key->Sign(hkdf_input, &signature)) {
       *error_details = "Channel ID signature failed";
       return QUIC_INVALID_CHANNEL_ID_SIGNATURE;
@@ -707,8 +707,8 @@
   //   out_params->hkdf_input_suffix
   //   out_params->initial_crypters
   out_params->hkdf_input_suffix.clear();
-    out_params->hkdf_input_suffix.append(connection_id.data(),
-                                         connection_id.length());
+  out_params->hkdf_input_suffix.append(connection_id.data(),
+                                       connection_id.length());
   const QuicData& client_hello_serialized = out->GetSerialized();
   out_params->hkdf_input_suffix.append(client_hello_serialized.data(),
                                        client_hello_serialized.length());
@@ -719,13 +719,13 @@
   }
   out_params->hkdf_input_suffix.append(certs[0]);
 
-  QuicString hkdf_input;
+  std::string hkdf_input;
   const size_t label_len = strlen(QuicCryptoConfig::kInitialLabel) + 1;
   hkdf_input.reserve(label_len + out_params->hkdf_input_suffix.size());
   hkdf_input.append(QuicCryptoConfig::kInitialLabel, label_len);
   hkdf_input.append(out_params->hkdf_input_suffix);
 
-  QuicString* subkey_secret = &out_params->initial_subkey_secret;
+  std::string* subkey_secret = &out_params->initial_subkey_secret;
 
   if (!CryptoUtils::DeriveKeys(out_params->initial_premaster_secret,
                                out_params->aead, out_params->client_nonce,
@@ -745,9 +745,9 @@
     QuicWallTime now,
     QuicTransportVersion version,
     QuicStringPiece chlo_hash,
-    const std::vector<QuicString>& cached_certs,
+    const std::vector<std::string>& cached_certs,
     CachedState* cached,
-    QuicString* error_details) {
+    std::string* error_details) {
   DCHECK(error_details != nullptr);
 
   QuicStringPiece scfg;
@@ -784,7 +784,7 @@
   bool has_proof = message.GetStringPiece(kPROF, &proof);
   bool has_cert = message.GetStringPiece(kCertificateTag, &cert_bytes);
   if (has_proof && has_cert) {
-    std::vector<QuicString> certs;
+    std::vector<std::string> certs;
     if (!CertCompressor::DecompressChain(cert_bytes, cached_certs,
                                          common_cert_sets, &certs)) {
       *error_details = "Certificate data invalid";
@@ -819,7 +819,7 @@
     QuicStringPiece chlo_hash,
     CachedState* cached,
     QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params,
-    QuicString* error_details) {
+    std::string* error_details) {
   DCHECK(error_details != nullptr);
 
   if ((rej.tag() != kREJ) && (rej.tag() != kSREJ)) {
@@ -836,29 +836,29 @@
 
   QuicStringPiece nonce;
   if (rej.GetStringPiece(kServerNonceTag, &nonce)) {
-    out_params->server_nonce = QuicString(nonce);
+    out_params->server_nonce = std::string(nonce);
   }
 
   if (rej.tag() == kSREJ) {
     QuicConnectionId connection_id;
 
-      QuicStringPiece connection_id_bytes;
-      if (!rej.GetStringPiece(kRCID, &connection_id_bytes)) {
-        *error_details = "Missing kRCID";
-        return QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND;
-      }
-      connection_id = QuicConnectionId(connection_id_bytes.data(),
-                                       connection_id_bytes.length());
-      if (!QuicUtils::IsConnectionIdValidForVersion(connection_id, version)) {
-        QUIC_PEER_BUG << "Received server-designated connection ID "
-                      << connection_id << " which is invalid with version "
-                      << QuicVersionToString(version);
-        *error_details = "Bad kRCID length";
-        return QUIC_CRYPTO_INTERNAL_ERROR;
-      }
+    QuicStringPiece connection_id_bytes;
+    if (!rej.GetStringPiece(kRCID, &connection_id_bytes)) {
+      *error_details = "Missing kRCID";
+      return QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND;
+    }
+    connection_id = QuicConnectionId(connection_id_bytes.data(),
+                                     connection_id_bytes.length());
+    if (!QuicUtils::IsConnectionIdValidForVersion(connection_id, version)) {
+      QUIC_PEER_BUG << "Received server-designated connection ID "
+                    << connection_id << " which is invalid with version "
+                    << QuicVersionToString(version);
+      *error_details = "Bad kRCID length";
+      return QUIC_CRYPTO_INTERNAL_ERROR;
+    }
     cached->add_server_designated_connection_id(connection_id);
     if (!nonce.empty()) {
-      cached->add_server_nonce(QuicString(nonce));
+      cached->add_server_nonce(std::string(nonce));
     }
     return QUIC_NO_ERROR;
   }
@@ -873,7 +873,7 @@
     const ParsedQuicVersionVector& negotiated_versions,
     CachedState* cached,
     QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params,
-    QuicString* error_details) {
+    std::string* error_details) {
   DCHECK(error_details != nullptr);
 
   QuicErrorCode valid = CryptoUtils::ValidateServerHello(
@@ -909,7 +909,7 @@
     return QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER;
   }
 
-  QuicString hkdf_input;
+  std::string hkdf_input;
   const size_t label_len = strlen(QuicCryptoConfig::kForwardSecureLabel) + 1;
   hkdf_input.reserve(label_len + out_params->hkdf_input_suffix.size());
   hkdf_input.append(QuicCryptoConfig::kForwardSecureLabel, label_len);
@@ -936,7 +936,7 @@
     QuicStringPiece chlo_hash,
     CachedState* cached,
     QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params,
-    QuicString* error_details) {
+    std::string* error_details) {
   DCHECK(error_details != nullptr);
 
   if (server_config_update.tag() != kSCUP) {
@@ -976,7 +976,7 @@
   cached->InitializeFrom(*canonical_cached);
 }
 
-void QuicCryptoClientConfig::AddCanonicalSuffix(const QuicString& suffix) {
+void QuicCryptoClientConfig::AddCanonicalSuffix(const std::string& suffix) {
   canonical_suffixes_.push_back(suffix);
 }
 
diff --git a/quic/core/crypto/quic_crypto_client_config.h b/quic/core/crypto/quic_crypto_client_config.h
index 32df726..4c2004d 100644
--- a/quic/core/crypto/quic_crypto_client_config.h
+++ b/quic/core/crypto/quic_crypto_client_config.h
@@ -82,13 +82,13 @@
     ServerConfigState SetServerConfig(QuicStringPiece server_config,
                                       QuicWallTime now,
                                       QuicWallTime expiry_time,
-                                      QuicString* error_details);
+                                      std::string* error_details);
 
     // InvalidateServerConfig clears the cached server config (if any).
     void InvalidateServerConfig();
 
     // SetProof stores a cert chain, cert signed timestamp and signature.
-    void SetProof(const std::vector<QuicString>& certs,
+    void SetProof(const std::vector<std::string>& certs,
                   QuicStringPiece cert_sct,
                   QuicStringPiece chlo_hash,
                   QuicStringPiece signature);
@@ -109,12 +109,12 @@
     // generation_counter_ in sync.
     void SetProofInvalid();
 
-    const QuicString& server_config() const;
-    const QuicString& source_address_token() const;
-    const std::vector<QuicString>& certs() const;
-    const QuicString& cert_sct() const;
-    const QuicString& chlo_hash() const;
-    const QuicString& signature() const;
+    const std::string& server_config() const;
+    const std::string& source_address_token() const;
+    const std::vector<std::string>& certs() const;
+    const std::string& cert_sct() const;
+    const std::string& chlo_hash() const;
+    const std::string& signature() const;
     bool proof_valid() const;
     uint64_t generation_counter() const;
     const ProofVerifyDetails* proof_verify_details() const;
@@ -138,7 +138,7 @@
     QuicConnectionId GetNextServerDesignatedConnectionId();
 
     // Adds the servernonce to the queue of server nonces.
-    void add_server_nonce(const QuicString& server_nonce);
+    void add_server_nonce(const std::string& server_nonce);
 
     // If true, the crypto config contains at least one server nonce, and the
     // client should use one of these nonces.
@@ -147,7 +147,7 @@
     // This function should only be called when has_server_nonce is true.
     // Returns the next server_nonce specified by the server and removes it
     // from the queue of nonces.
-    QuicString GetNextServerNonce();
+    std::string GetNextServerNonce();
 
     // SetProofVerifyDetails takes ownership of |details|.
     void SetProofVerifyDetails(ProofVerifyDetails* details);
@@ -162,22 +162,22 @@
     // Returns false if there is a problem parsing the server config.
     bool Initialize(QuicStringPiece server_config,
                     QuicStringPiece source_address_token,
-                    const std::vector<QuicString>& certs,
-                    const QuicString& cert_sct,
+                    const std::vector<std::string>& certs,
+                    const std::string& cert_sct,
                     QuicStringPiece chlo_hash,
                     QuicStringPiece signature,
                     QuicWallTime now,
                     QuicWallTime expiration_time);
 
    private:
-    QuicString server_config_;         // A serialized handshake message.
-    QuicString source_address_token_;  // An opaque proof of IP ownership.
-    std::vector<QuicString> certs_;    // A list of certificates in leaf-first
-                                       // order.
-    QuicString cert_sct_;              // Signed timestamp of the leaf cert.
-    QuicString chlo_hash_;             // Hash of the CHLO message.
-    QuicString server_config_sig_;     // A signature of |server_config_|.
-    bool server_config_valid_;         // True if |server_config_| is correctly
+    std::string server_config_;         // A serialized handshake message.
+    std::string source_address_token_;  // An opaque proof of IP ownership.
+    std::vector<std::string> certs_;    // A list of certificates in leaf-first
+                                        // order.
+    std::string cert_sct_;              // Signed timestamp of the leaf cert.
+    std::string chlo_hash_;             // Hash of the CHLO message.
+    std::string server_config_sig_;     // A signature of |server_config_|.
+    bool server_config_valid_;          // True if |server_config_| is correctly
                                 // signed and |certs_| has been validated.
     QuicWallTime expiration_time_;  // Time when the config is no longer valid.
     // Generation counter associated with the |server_config_|, |certs_| and
@@ -194,7 +194,7 @@
     // that no connection-id is added twice.  Also, consider keeping the server
     // nonces and connection_ids together in one queue.
     QuicQueue<QuicConnectionId> server_designated_connection_ids_;
-    QuicQueue<QuicString> server_nonces_;
+    QuicQueue<std::string> server_nonces_;
   };
 
   // Used to filter server ids for partial config deletion.
@@ -262,7 +262,7 @@
       const ChannelIDKey* channel_id_key,
       QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params,
       CryptoHandshakeMessage* out,
-      QuicString* error_details) const;
+      std::string* error_details) const;
 
   // ProcessRejection processes a REJ message from a server and updates the
   // cached information about that server. After this, |IsComplete| may return
@@ -277,7 +277,7 @@
       QuicStringPiece chlo_hash,
       CachedState* cached,
       QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params,
-      QuicString* error_details);
+      std::string* error_details);
 
   // ProcessServerHello processes the message in |server_hello|, updates the
   // cached information about that server, writes the negotiated parameters to
@@ -295,7 +295,7 @@
       const ParsedQuicVersionVector& negotiated_versions,
       CachedState* cached,
       QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params,
-      QuicString* error_details);
+      std::string* error_details);
 
   // Processes the message in |server_update|, updating the cached source
   // address token, and server config.
@@ -309,7 +309,7 @@
       QuicStringPiece chlo_hash,
       CachedState* cached,
       QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params,
-      QuicString* error_details);
+      std::string* error_details);
 
   ProofVerifier* proof_verifier() const;
 
@@ -334,22 +334,22 @@
   // is expected to be shared among servers with the domain suffix. If a server
   // matches this suffix, then the server config from another server with the
   // suffix will be used to initialize the cached state for this server.
-  void AddCanonicalSuffix(const QuicString& suffix);
+  void AddCanonicalSuffix(const std::string& suffix);
 
   // Saves the |user_agent_id| that will be passed in QUIC's CHLO message.
-  void set_user_agent_id(const QuicString& user_agent_id) {
+  void set_user_agent_id(const std::string& user_agent_id) {
     user_agent_id_ = user_agent_id;
   }
 
   // Returns the user_agent_id that will be provided in the client hello
   // handshake message.
-  const QuicString& user_agent_id() const { return user_agent_id_; }
+  const std::string& user_agent_id() const { return user_agent_id_; }
 
   // Saves the |alpn| that will be passed in QUIC's CHLO message.
-  void set_alpn(const QuicString& alpn) { alpn_ = alpn; }
+  void set_alpn(const std::string& alpn) { alpn_ = alpn; }
 
   void set_pre_shared_key(QuicStringPiece psk) {
-    pre_shared_key_ = QuicString(psk);
+    pre_shared_key_ = std::string(psk);
   }
 
   bool pad_inchoate_hello() const { return pad_inchoate_hello_; }
@@ -373,9 +373,9 @@
       QuicWallTime now,
       QuicTransportVersion version,
       QuicStringPiece chlo_hash,
-      const std::vector<QuicString>& cached_certs,
+      const std::vector<std::string>& cached_certs,
       CachedState* cached,
-      QuicString* error_details);
+      std::string* error_details);
 
   // If the suffix of the hostname in |server_id| is in |canonical_suffixes_|,
   // then populate |cached| with the canonical cached state from
@@ -396,21 +396,21 @@
 
   // Contains list of suffixes (for exmaple ".c.youtube.com",
   // ".googlevideo.com") of canonical hostnames.
-  std::vector<QuicString> canonical_suffixes_;
+  std::vector<std::string> canonical_suffixes_;
 
   std::unique_ptr<ProofVerifier> proof_verifier_;
   std::unique_ptr<ChannelIDSource> channel_id_source_;
   bssl::UniquePtr<SSL_CTX> ssl_ctx_;
 
   // The |user_agent_id_| passed in QUIC's CHLO message.
-  QuicString user_agent_id_;
+  std::string user_agent_id_;
 
   // The |alpn_| passed in QUIC's CHLO message.
-  QuicString alpn_;
+  std::string alpn_;
 
   // If non-empty, the client will operate in the pre-shared key mode by
   // incorporating |pre_shared_key_| into the key schedule.
-  QuicString pre_shared_key_;
+  std::string pre_shared_key_;
 
   // In QUIC, technically, client hello should be fully padded.
   // However, fully padding on slow network connection (e.g. 50kbps) can add
diff --git a/quic/core/crypto/quic_crypto_client_config_test.cc b/quic/core/crypto/quic_crypto_client_config_test.cc
index 5e0ca6e..097f455 100644
--- a/quic/core/crypto/quic_crypto_client_config_test.cc
+++ b/quic/core/crypto/quic_crypto_client_config_test.cc
@@ -124,7 +124,7 @@
   QuicCryptoClientConfig::CachedState state;
   EXPECT_FALSE(state.has_server_nonce());
 
-  QuicString server_nonce = "nonce_1";
+  std::string server_nonce = "nonce_1";
   state.add_server_nonce(server_nonce);
   EXPECT_TRUE(state.has_server_nonce());
   EXPECT_EQ(server_nonce, state.GetNextServerNonce());
@@ -142,8 +142,8 @@
   EXPECT_FALSE(state.has_server_nonce());
 
   // Test FIFO behavior.
-  const QuicString first_nonce = "first_nonce";
-  const QuicString second_nonce = "second_nonce";
+  const std::string first_nonce = "first_nonce";
+  const std::string second_nonce = "second_nonce";
   state.add_server_nonce(first_nonce);
   state.add_server_nonce(second_nonce);
   EXPECT_TRUE(state.has_server_nonce());
@@ -194,7 +194,7 @@
   EXPECT_EQ(CreateQuicVersionLabel(QuicVersionMax()), cver);
   QuicStringPiece proof_nonce;
   EXPECT_TRUE(msg.GetStringPiece(kNONP, &proof_nonce));
-  EXPECT_EQ(QuicString(32, 'r'), proof_nonce);
+  EXPECT_EQ(std::string(32, 'r'), proof_nonce);
   QuicStringPiece user_agent_id;
   EXPECT_TRUE(msg.GetStringPiece(kUAID, &user_agent_id));
   EXPECT_EQ("quic-tester", user_agent_id);
@@ -261,7 +261,7 @@
   CryptoHandshakeMessage scfg;
   scfg.set_tag(kSCFG);
   scfg.SetStringPiece(kSCID, "12345678");
-  QuicString details;
+  std::string details;
   QuicWallTime now = QuicWallTime::FromUNIXSeconds(1);
   QuicWallTime expiry = QuicWallTime::FromUNIXSeconds(2);
   state.SetServerConfig(scfg.GetSerialized().AsStringPiece(), now, expiry,
@@ -289,7 +289,7 @@
   uint64_t future = 1;
   scfg.SetValue(kEXPY, future);
   scfg.SetStringPiece(kSCID, "12345678");
-  QuicString details;
+  std::string details;
   state.SetServerConfig(scfg.GetSerialized().AsStringPiece(),
                         QuicWallTime::FromUNIXSeconds(1),
                         QuicWallTime::FromUNIXSeconds(0), &details);
@@ -316,7 +316,7 @@
   QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> params(
       new QuicCryptoNegotiatedParameters);
   QuicConnectionId kConnectionId = TestConnectionId(1234);
-  QuicString error_details;
+  std::string error_details;
   MockRandom rand;
   CryptoHandshakeMessage chlo;
   QuicServerId server_id("www.google.com", 443, false);
@@ -339,7 +339,7 @@
   QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> params(
       new QuicCryptoNegotiatedParameters);
   QuicConnectionId kConnectionId = TestConnectionId(1234);
-  QuicString error_details;
+  std::string error_details;
   MockRandom rand;
   CryptoHandshakeMessage chlo;
   QuicServerId server_id("www.google.com", 443, false);
@@ -374,7 +374,7 @@
   QuicCryptoClientConfig::CachedState cached;
   QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params(
       new QuicCryptoNegotiatedParameters);
-  QuicString error;
+  std::string error;
   QuicCryptoClientConfig config(crypto_test_utils::ProofVerifierForTesting(),
                                 TlsClientHandshaker::CreateSslCtx());
   EXPECT_EQ(QUIC_VERSION_NEGOTIATION_MISMATCH,
@@ -452,7 +452,7 @@
 
   // Create two states on different origins.
   struct TestCase {
-    TestCase(const QuicString& host, QuicCryptoClientConfig* config)
+    TestCase(const std::string& host, QuicCryptoClientConfig* config)
         : server_id(host, 443, false),
           state(config->LookupOrCreate(server_id)) {
       // TODO(rch): Populate other fields of |state|.
@@ -461,12 +461,12 @@
       uint64_t future = 1;
       scfg.SetValue(kEXPY, future);
       scfg.SetStringPiece(kSCID, "12345678");
-      QuicString details;
+      std::string details;
       state->SetServerConfig(scfg.GetSerialized().AsStringPiece(),
                              QuicWallTime::FromUNIXSeconds(0),
                              QuicWallTime::FromUNIXSeconds(future), &details);
 
-      std::vector<QuicString> certs(1);
+      std::vector<std::string> certs(1);
       certs[0] = "Hello Cert for " + host;
       state->SetProof(certs, "cert_sct", "chlo_hash", "signature");
       state->set_source_address_token("TOKEN");
@@ -542,7 +542,7 @@
   QuicCryptoClientConfig::CachedState cached;
   QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params(
       new QuicCryptoNegotiatedParameters);
-  QuicString error;
+  std::string error;
   QuicCryptoClientConfig config(crypto_test_utils::ProofVerifierForTesting(),
                                 TlsClientHandshaker::CreateSslCtx());
   EXPECT_EQ(QUIC_NO_ERROR,
@@ -564,7 +564,7 @@
   QuicCryptoClientConfig::CachedState cached;
   QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params(
       new QuicCryptoNegotiatedParameters);
-  QuicString error;
+  std::string error;
   QuicCryptoClientConfig config(crypto_test_utils::ProofVerifierForTesting(),
                                 TlsClientHandshaker::CreateSslCtx());
   EXPECT_EQ(QUIC_NO_ERROR,
@@ -584,7 +584,7 @@
   CryptoHandshakeMessage rej;
   crypto_test_utils::FillInDummyReject(&rej, /* stateless */ true);
   const QuicConnectionId kConnectionId = TestConnectionId(0xdeadbeef);
-  const QuicString server_nonce = "SERVER_NONCE";
+  const std::string server_nonce = "SERVER_NONCE";
   const uint64_t kConnectionId64 = TestConnectionIdToUInt64(kConnectionId);
   rej.SetValue(kRCID, kConnectionId64);
   rej.SetStringPiece(kServerNonceTag, server_nonce);
@@ -593,7 +593,7 @@
   QuicCryptoClientConfig::CachedState cached;
   QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params(
       new QuicCryptoNegotiatedParameters);
-  QuicString error;
+  std::string error;
   QuicCryptoClientConfig config(crypto_test_utils::ProofVerifierForTesting(),
                                 TlsClientHandshaker::CreateSslCtx());
   EXPECT_EQ(QUIC_NO_ERROR,
@@ -617,7 +617,7 @@
   QuicCryptoClientConfig::CachedState cached;
   QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params(
       new QuicCryptoNegotiatedParameters);
-  QuicString error;
+  std::string error;
   QuicCryptoClientConfig config(crypto_test_utils::ProofVerifierForTesting(),
                                 TlsClientHandshaker::CreateSslCtx());
   EXPECT_EQ(QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND,
@@ -643,7 +643,7 @@
   QuicCryptoClientConfig::CachedState cached;
   QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params(
       new QuicCryptoNegotiatedParameters);
-  QuicString error_details;
+  std::string error_details;
   EXPECT_EQ(QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER,
             config.ProcessServerHello(msg, EmptyQuicConnectionId(), version,
                                       supported_versions, &cached, out_params,
diff --git a/quic/core/crypto/quic_crypto_proof.h b/quic/core/crypto/quic_crypto_proof.h
index d70ad50..88255dc 100644
--- a/quic/core/crypto/quic_crypto_proof.h
+++ b/quic/core/crypto/quic_crypto_proof.h
@@ -15,9 +15,9 @@
   QuicCryptoProof();
 
   // Signature generated by ProofSource
-  QuicString signature;
+  std::string signature;
   // SCTList (RFC6962) to be sent to the client, if it supports receiving it.
-  QuicString leaf_cert_scts;
+  std::string leaf_cert_scts;
   // Should the Expect-CT header be sent on the connection where the
   // certificate is used.
   bool send_expect_ct_header;
diff --git a/quic/core/crypto/quic_crypto_server_config.cc b/quic/core/crypto/quic_crypto_server_config.cc
index 1cb0266..2b54c73 100644
--- a/quic/core/crypto/quic_crypto_server_config.cc
+++ b/quic/core/crypto/quic_crypto_server_config.cc
@@ -60,13 +60,13 @@
 
 const int kMaxTokenAddresses = 4;
 
-QuicString DeriveSourceAddressTokenKey(
+std::string DeriveSourceAddressTokenKey(
     QuicStringPiece source_address_token_secret) {
   QuicHKDF hkdf(source_address_token_secret, QuicStringPiece() /* no salt */,
                 "QUIC source address token key",
                 CryptoSecretBoxer::GetKeySize(), 0 /* no fixed IV needed */,
                 0 /* no subkey secret */);
-  return QuicString(hkdf.server_write_key());
+  return std::string(hkdf.server_write_key());
 }
 
 // Default source for creating KeyExchange objects.
@@ -75,7 +75,7 @@
   DefaultKeyExchangeSource() = default;
   ~DefaultKeyExchangeSource() override = default;
 
-  std::unique_ptr<KeyExchange> Create(QuicString /*server_config_id*/,
+  std::unique_ptr<KeyExchange> Create(std::string /*server_config_id*/,
                                       QuicTag type,
                                       QuicStringPiece private_key) override {
     if (private_key.empty()) {
@@ -237,7 +237,7 @@
   server_nonce_entropy->RandBytes(key_bytes.get(), key_size);
 
   server_nonce_boxer_.SetKeys(
-      {QuicString(reinterpret_cast<char*>(key_bytes.get()), key_size)});
+      {std::string(reinterpret_cast<char*>(key_bytes.get()), key_size)});
 }
 
 QuicCryptoServerConfig::~QuicCryptoServerConfig() {}
@@ -249,13 +249,13 @@
                                        const ConfigOptions& options) {
   CryptoHandshakeMessage msg;
 
-  const QuicString curve25519_private_key =
+  const std::string curve25519_private_key =
       Curve25519KeyExchange::NewPrivateKey(rand);
   std::unique_ptr<Curve25519KeyExchange> curve25519(
       Curve25519KeyExchange::New(curve25519_private_key));
   QuicStringPiece curve25519_public_value = curve25519->public_value();
 
-  QuicString encoded_public_values;
+  std::string encoded_public_values;
   // First three bytes encode the length of the public value.
   DCHECK_LT(curve25519_public_value.size(), (1U << 24));
   encoded_public_values.push_back(
@@ -267,7 +267,7 @@
   encoded_public_values.append(curve25519_public_value.data(),
                                curve25519_public_value.size());
 
-  QuicString p256_private_key;
+  std::string p256_private_key;
   if (options.p256) {
     p256_private_key = P256KeyExchange::NewPrivateKey();
     std::unique_ptr<P256KeyExchange> p256(
@@ -346,7 +346,7 @@
 
   std::unique_ptr<QuicServerConfigProtobuf> config(
       new QuicServerConfigProtobuf);
-  config->set_config(QuicString(serialized->AsStringPiece()));
+  config->set_config(std::string(serialized->AsStringPiece()));
   QuicServerConfigProtobuf::PrivateKey* curve25519_key = config->add_key();
   curve25519_key->set_tag(kC255);
   curve25519_key->set_private_key(curve25519_private_key);
@@ -478,12 +478,12 @@
 }
 
 void QuicCryptoServerConfig::SetSourceAddressTokenKeys(
-    const std::vector<QuicString>& keys) {
+    const std::vector<std::string>& keys) {
   source_address_token_boxer_.SetKeys(keys);
 }
 
 void QuicCryptoServerConfig::GetConfigIds(
-    std::vector<QuicString>* scids) const {
+    std::vector<std::string>* scids) const {
   QuicReaderMutexLock locked(&configs_lock_);
   for (auto it = configs_.begin(); it != configs_.end(); ++it) {
     scids->push_back(it->first);
@@ -556,7 +556,7 @@
         << "Deleting ProcessClientHelloHelper with a pending callback.";
   }
 
-  void Fail(QuicErrorCode error, const QuicString& error_details) {
+  void Fail(QuicErrorCode error, const std::string& error_details) {
     (*done_cb_)->Run(error, error_details, nullptr, nullptr, nullptr);
     DetachCallback();
   }
@@ -564,7 +564,7 @@
   void Succeed(std::unique_ptr<CryptoHandshakeMessage> message,
                std::unique_ptr<DiversificationNonce> diversification_nonce,
                std::unique_ptr<ProofSource::Details> proof_source_details) {
-    (*done_cb_)->Run(QUIC_NO_ERROR, QuicString(), std::move(message),
+    (*done_cb_)->Run(QUIC_NO_ERROR, std::string(), std::move(message),
                      std::move(diversification_nonce),
                      std::move(proof_source_details));
     DetachCallback();
@@ -721,7 +721,7 @@
   std::unique_ptr<ProofSource::Details> proof_source_details_;
   const KeyExchange::Factory& key_exchange_factory_;
   std::unique_ptr<CryptoHandshakeMessage> out_;
-  QuicString public_value_;
+  std::string public_value_;
   QuicReferenceCountedPointer<ValidateClientHelloResultCallback::Result>
       validate_chlo_result_;
   QuicConnectionId connection_id_;
@@ -764,7 +764,7 @@
       validate_chlo_result->client_hello;
   const ClientHelloInfo& info = validate_chlo_result->info;
 
-  QuicString error_details;
+  std::string error_details;
   QuicErrorCode valid = CryptoUtils::ValidateClientHello(
       client_hello, version, supported_versions, &error_details);
   if (valid != QUIC_NO_ERROR) {
@@ -818,7 +818,7 @@
     return;
   }
   DCHECK(proof_source_.get());
-  QuicString chlo_hash;
+  std::string chlo_hash;
   CryptoUtils::HashHandshakeMessage(client_hello, &chlo_hash,
                                     Perspective::IS_SERVER);
 
@@ -833,7 +833,7 @@
             total_framing_overhead, chlo_packet_size, requested_config,
             primary_config, std::move(done_cb)));
     proof_source_->GetProof(
-        server_address, QuicString(info.sni), primary_config->serialized,
+        server_address, std::string(info.sni), primary_config->serialized,
         version.transport_version, chlo_hash, std::move(cb));
     helper.DetachCallback();
     return;
@@ -1014,12 +1014,12 @@
     params->sni = QuicHostnameUtils::NormalizeHostname(info.sni);
   }
 
-  QuicString hkdf_suffix;
+  std::string hkdf_suffix;
   const QuicData& client_hello_serialized = client_hello.GetSerialized();
-    hkdf_suffix.reserve(connection_id.length() +
-                        client_hello_serialized.length() +
-                        requested_config->serialized.size());
-    hkdf_suffix.append(connection_id.data(), connection_id.length());
+  hkdf_suffix.reserve(connection_id.length() +
+                      client_hello_serialized.length() +
+                      requested_config->serialized.size());
+  hkdf_suffix.append(connection_id.data(), connection_id.length());
   hkdf_suffix.append(client_hello_serialized.data(),
                      client_hello_serialized.length());
   hkdf_suffix.append(requested_config->serialized);
@@ -1039,7 +1039,7 @@
 
     const QuicData& client_hello_copy_serialized =
         client_hello_copy.GetSerialized();
-    QuicString hkdf_input;
+    std::string hkdf_input;
     hkdf_input.append(QuicCryptoConfig::kCETVLabel,
                       strlen(QuicCryptoConfig::kCETVLabel) + 1);
     hkdf_input.append(connection_id.data(), connection_id.length());
@@ -1084,11 +1084,11 @@
         return;
       }
 
-      params->channel_id = QuicString(key);
+      params->channel_id = std::string(key);
     }
   }
 
-  QuicString hkdf_input;
+  std::string hkdf_input;
   size_t label_len = strlen(QuicCryptoConfig::kInitialLabel) + 1;
   hkdf_input.reserve(label_len + hkdf_suffix.size());
   hkdf_input.append(QuicCryptoConfig::kInitialLabel, label_len);
@@ -1108,25 +1108,25 @@
     return;
   }
 
-  QuicString forward_secure_public_value;
+  std::string forward_secure_public_value;
   std::unique_ptr<KeyExchange> forward_secure_key_exchange =
       key_exchange_factory.Create(rand);
   forward_secure_public_value =
-      QuicString(forward_secure_key_exchange->public_value());
+      std::string(forward_secure_key_exchange->public_value());
   if (!forward_secure_key_exchange->CalculateSharedKey(
           public_value, &params->forward_secure_premaster_secret)) {
     helper.Fail(QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER, "Invalid public value");
     return;
   }
 
-  QuicString forward_secure_hkdf_input;
+  std::string forward_secure_hkdf_input;
   label_len = strlen(QuicCryptoConfig::kForwardSecureLabel) + 1;
   forward_secure_hkdf_input.reserve(label_len + hkdf_suffix.size());
   forward_secure_hkdf_input.append(QuicCryptoConfig::kForwardSecureLabel,
                                    label_len);
   forward_secure_hkdf_input.append(hkdf_suffix);
 
-  QuicString shlo_nonce;
+  std::string shlo_nonce;
   shlo_nonce = NewServerNonce(rand, info.now);
   out->SetStringPiece(kServerNonceTag, shlo_nonce);
 
@@ -1162,7 +1162,7 @@
   configs_lock_.AssertReaderHeld();
 
   if (!requested_scid.empty()) {
-    auto it = configs_.find((QuicString(requested_scid)));
+    auto it = configs_.find((std::string(requested_scid)));
     if (it != configs_.end()) {
       // We'll use the config that the client requested in order to do
       // key-agreement.
@@ -1406,7 +1406,7 @@
   }
 
   QuicReferenceCountedPointer<ProofSource::Chain> chain =
-      proof_source_->GetCertChain(server_address, QuicString(info->sni));
+      proof_source_->GetCertChain(server_address, std::string(info->sni));
   if (!chain) {
     info->reject_reasons.push_back(SERVER_CONFIG_UNKNOWN_CONFIG_FAILURE);
   } else if (!ValidateExpectedLeafCertificate(client_hello, chain->certs)) {
@@ -1467,8 +1467,8 @@
     const QuicCryptoNegotiatedParameters& params,
     const CachedNetworkParameters* cached_network_params,
     std::unique_ptr<BuildServerConfigUpdateMessageResultCallback> cb) const {
-  QuicString serialized;
-  QuicString source_address_token;
+  std::string serialized;
+  std::string source_address_token;
   const CommonCertSets* common_cert_sets;
   {
     QuicReaderMutexLock locked(&configs_lock_);
@@ -1533,14 +1533,14 @@
     QuicTransportVersion version,
     QuicCompressedCertsCache* compressed_certs_cache,
     const CommonCertSets* common_cert_sets,
-    const QuicString& client_common_set_hashes,
-    const QuicString& client_cached_cert_hashes,
+    const std::string& client_common_set_hashes,
+    const std::string& client_cached_cert_hashes,
     bool sct_supported_by_client,
-    const QuicString& sni,
+    const std::string& sni,
     bool ok,
     const QuicReferenceCountedPointer<ProofSource::Chain>& chain,
-    const QuicString& signature,
-    const QuicString& leaf_cert_sct,
+    const std::string& signature,
+    const std::string& leaf_cert_sct,
     std::unique_ptr<ProofSource::Details> details,
     CryptoHandshakeMessage message,
     std::unique_ptr<BuildServerConfigUpdateMessageResultCallback> cb) const {
@@ -1549,7 +1549,7 @@
     return;
   }
 
-  const QuicString compressed =
+  const std::string compressed =
       CompressChain(compressed_certs_cache, chain, client_common_set_hashes,
                     client_cached_cert_hashes, common_cert_sets);
 
@@ -1589,17 +1589,17 @@
                   << "with server-designated connection ID "
                   << server_designated_connection_id;
     out->set_tag(kSREJ);
-      if (!QuicUtils::IsConnectionIdValidForVersion(
-              server_designated_connection_id, version)) {
-        QUIC_BUG << "Tried to send server designated connection ID "
-                 << server_designated_connection_id
-                 << " which is invalid with version "
-                 << QuicVersionToString(version);
-        return;
-      }
-      out->SetStringPiece(
-          kRCID, QuicStringPiece(server_designated_connection_id.data(),
-                                 server_designated_connection_id.length()));
+    if (!QuicUtils::IsConnectionIdValidForVersion(
+            server_designated_connection_id, version)) {
+      QUIC_BUG << "Tried to send server designated connection ID "
+               << server_designated_connection_id
+               << " which is invalid with version "
+               << QuicVersionToString(version);
+      return;
+    }
+    out->SetStringPiece(
+        kRCID, QuicStringPiece(server_designated_connection_id.data(),
+                               server_designated_connection_id.length()));
   } else {
     out->set_tag(kREJ);
   }
@@ -1625,17 +1625,17 @@
 
   QuicStringPiece client_common_set_hashes;
   if (client_hello.GetStringPiece(kCCS, &client_common_set_hashes)) {
-    params->client_common_set_hashes = QuicString(client_common_set_hashes);
+    params->client_common_set_hashes = std::string(client_common_set_hashes);
   }
 
   QuicStringPiece client_cached_cert_hashes;
   if (client_hello.GetStringPiece(kCCRT, &client_cached_cert_hashes)) {
-    params->client_cached_cert_hashes = QuicString(client_cached_cert_hashes);
+    params->client_cached_cert_hashes = std::string(client_cached_cert_hashes);
   } else {
     params->client_cached_cert_hashes.clear();
   }
 
-  const QuicString compressed =
+  const std::string compressed =
       CompressChain(compressed_certs_cache, signed_config.chain,
                     params->client_common_set_hashes,
                     params->client_cached_cert_hashes, config.common_cert_sets);
@@ -1659,7 +1659,7 @@
                 "overhead calculation may underflow");
   bool should_return_sct =
       params->sct_supported_by_client && enable_serving_sct_;
-  const QuicString& cert_sct = signed_config.proof.leaf_cert_scts;
+  const std::string& cert_sct = signed_config.proof.leaf_cert_scts;
   const size_t sct_size = should_return_sct ? cert_sct.size() : 0;
   const size_t total_size =
       signed_config.proof.signature.size() + compressed.size() + sct_size;
@@ -1674,8 +1674,7 @@
         } else {
           // Log SNI and subject name for the leaf cert if its SCT is empty.
           // This is for debugging b/28342827.
-          const std::vector<quic::QuicString>& certs =
-              signed_config.chain->certs;
+          const std::vector<std::string>& certs = signed_config.chain->certs;
           QuicStringPiece ca_subject;
           if (!certs.empty()) {
             QuicCertUtils::ExtractSubjectNameFromDERCert(certs[0], &ca_subject);
@@ -1697,20 +1696,20 @@
   }
 }
 
-QuicString QuicCryptoServerConfig::CompressChain(
+std::string QuicCryptoServerConfig::CompressChain(
     QuicCompressedCertsCache* compressed_certs_cache,
     const QuicReferenceCountedPointer<ProofSource::Chain>& chain,
-    const QuicString& client_common_set_hashes,
-    const QuicString& client_cached_cert_hashes,
+    const std::string& client_common_set_hashes,
+    const std::string& client_cached_cert_hashes,
     const CommonCertSets* common_sets) {
   // Check whether the compressed certs is available in the cache.
   DCHECK(compressed_certs_cache);
-  const QuicString* cached_value = compressed_certs_cache->GetCompressedCert(
+  const std::string* cached_value = compressed_certs_cache->GetCompressedCert(
       chain, client_common_set_hashes, client_cached_cert_hashes);
   if (cached_value) {
     return *cached_value;
   }
-  QuicString compressed =
+  std::string compressed =
       CertCompressor::CompressChain(chain->certs, client_common_set_hashes,
                                     client_cached_cert_hashes, common_sets);
   // Insert the newly compressed cert to cache.
@@ -1747,7 +1746,7 @@
     QUIC_LOG(WARNING) << "Server config message is missing SCID";
     return nullptr;
   }
-  config->id = QuicString(scid);
+  config->id = std::string(scid);
 
   if (msg->GetTaglist(kAEAD, &config->aead) != QUIC_NO_ERROR) {
     QUIC_LOG(WARNING) << "Server config message is missing AEAD";
@@ -1802,7 +1801,7 @@
 
   for (size_t i = 0; i < kexs_tags.size(); i++) {
     const QuicTag tag = kexs_tags[i];
-    QuicString private_key;
+    std::string private_key;
 
     config->kexs.push_back(tag);
 
@@ -1867,7 +1866,7 @@
   primary_config_changed_cb_ = std::move(cb);
 }
 
-QuicString QuicCryptoServerConfig::NewSourceAddressToken(
+std::string QuicCryptoServerConfig::NewSourceAddressToken(
     const Config& config,
     const SourceAddressTokens& previous_tokens,
     const QuicIpAddress& ip,
@@ -1922,7 +1921,7 @@
     const Config& config,
     QuicStringPiece token,
     SourceAddressTokens* tokens) const {
-  QuicString storage;
+  std::string storage;
   QuicStringPiece plaintext;
   if (!config.source_address_token_boxer->Unbox(token, &storage, &plaintext)) {
     return SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE;
@@ -1999,8 +1998,8 @@
 static const size_t kServerNoncePlaintextSize =
     4 /* timestamp */ + 20 /* random bytes */;
 
-QuicString QuicCryptoServerConfig::NewServerNonce(QuicRandom* rand,
-                                                  QuicWallTime now) const {
+std::string QuicCryptoServerConfig::NewServerNonce(QuicRandom* rand,
+                                                   QuicWallTime now) const {
   const uint32_t timestamp = static_cast<uint32_t>(now.ToUNIXSeconds());
 
   uint8_t server_nonce[kServerNoncePlaintextSize];
@@ -2019,7 +2018,7 @@
 
 bool QuicCryptoServerConfig::ValidateExpectedLeafCertificate(
     const CryptoHandshakeMessage& client_hello,
-    const std::vector<QuicString>& certs) const {
+    const std::vector<std::string>& certs) const {
   if (certs.empty()) {
     return false;
   }
diff --git a/quic/core/crypto/quic_crypto_server_config.h b/quic/core/crypto/quic_crypto_server_config.h
index 9f91c9a..858c95e 100644
--- a/quic/core/crypto/quic_crypto_server_config.h
+++ b/quic/core/crypto/quic_crypto_server_config.h
@@ -76,7 +76,7 @@
   PrimaryConfigChangedCallback& operator=(const PrimaryConfigChangedCallback&) =
       delete;
   virtual ~PrimaryConfigChangedCallback();
-  virtual void Run(const QuicString& scid) = 0;
+  virtual void Run(const std::string& scid) = 0;
 };
 
 // Callback used to accept the result of the |client_hello| validation step.
@@ -92,7 +92,7 @@
     CryptoHandshakeMessage client_hello;
     ClientHelloInfo info;
     QuicErrorCode error_code;
-    QuicString error_details;
+    std::string error_details;
 
     // Populated if the CHLO STK contained a CachedNetworkParameters proto.
     CachedNetworkParameters cached_network_params;
@@ -121,7 +121,7 @@
       const ProcessClientHelloResultCallback&) = delete;
   virtual ~ProcessClientHelloResultCallback();
   virtual void Run(QuicErrorCode error,
-                   const QuicString& error_details,
+                   const std::string& error_details,
                    std::unique_ptr<CryptoHandshakeMessage> message,
                    std::unique_ptr<DiversificationNonce> diversification_nonce,
                    std::unique_ptr<ProofSource::Details> details) = 0;
@@ -163,7 +163,7 @@
 
   // Create a new KeyExchange of the specified type using the specified
   // private key.
-  virtual std::unique_ptr<KeyExchange> Create(QuicString /*server_config_id*/,
+  virtual std::unique_ptr<KeyExchange> Create(std::string /*server_config_id*/,
                                               QuicTag type,
                                               QuicStringPiece private_key) = 0;
 };
@@ -192,10 +192,10 @@
     QuicTagVector token_binding_params;
     // id contains the server config id for the resulting config. If empty, a
     // random id is generated.
-    QuicString id;
+    std::string id;
     // orbit contains the kOrbitSize bytes of the orbit value for the server
     // config. If |orbit| is empty then a random orbit is generated.
-    QuicString orbit;
+    std::string orbit;
     // p256 determines whether a P-256 public key will be included in the
     // server config. Note that this breaks deterministic server-config
     // generation since P-256 key generation doesn't use the QuicRandom given
@@ -262,10 +262,10 @@
   // decrypting a source address token.  Note that these keys are used *without*
   // passing them through a KDF, in contradistinction to the
   // |source_address_token_secret| argument to the constructor.
-  void SetSourceAddressTokenKeys(const std::vector<QuicString>& keys);
+  void SetSourceAddressTokenKeys(const std::vector<std::string>& keys);
 
   // Get the server config ids for all known configs.
-  void GetConfigIds(std::vector<QuicString>* scids) const;
+  void GetConfigIds(std::vector<std::string>* scids) const;
 
   // Checks |client_hello| for gross errors and determines whether it can be
   // shown to be fresh (i.e. not a replay).  The result of the validation step
@@ -429,7 +429,7 @@
   SSL_CTX* ssl_ctx() const;
 
   void set_pre_shared_key(QuicStringPiece psk) {
-    pre_shared_key_ = QuicString(psk);
+    pre_shared_key_ = std::string(psk);
   }
 
   bool pad_rej() const { return pad_rej_; }
@@ -455,9 +455,9 @@
     // getters/setters here.
     // |serialized| contains the bytes of this server config, suitable for
     // sending on the wire.
-    QuicString serialized;
+    std::string serialized;
     // id contains the SCID of this server config.
-    QuicString id;
+    std::string id;
     // orbit contains the orbit value for this config: an opaque identifier
     // used to identify clusters of server frontends.
     unsigned char orbit[kOrbitSize];
@@ -636,11 +636,11 @@
   // sets known locally and |client_common_set_hashes| contains the hashes of
   // the common sets known to the peer. |client_cached_cert_hashes| contains
   // 64-bit, FNV-1a hashes of certificates that the peer already possesses.
-  static QuicString CompressChain(
+  static std::string CompressChain(
       QuicCompressedCertsCache* compressed_certs_cache,
       const QuicReferenceCountedPointer<ProofSource::Chain>& chain,
-      const QuicString& client_common_set_hashes,
-      const QuicString& client_cached_cert_hashes,
+      const std::string& client_common_set_hashes,
+      const std::string& client_cached_cert_hashes,
       const CommonCertSets* common_sets);
 
   // ParseConfigProtobuf parses the given config protobuf and returns a
@@ -651,7 +651,7 @@
 
   // NewSourceAddressToken returns a fresh source address token for the given
   // IP address. |cached_network_params| is optional, and can be nullptr.
-  QuicString NewSourceAddressToken(
+  std::string NewSourceAddressToken(
       const Config& config,
       const SourceAddressTokens& previous_tokens,
       const QuicIpAddress& ip,
@@ -696,7 +696,7 @@
       QuicWallTime now) const;
 
   // NewServerNonce generates and encrypts a random nonce.
-  QuicString NewServerNonce(QuicRandom* rand, QuicWallTime now) const;
+  std::string NewServerNonce(QuicRandom* rand, QuicWallTime now) const;
 
   // ValidateExpectedLeafCertificate checks the |client_hello| to see if it has
   // an XLCT tag, and if so, verifies that its value matches the hash of the
@@ -705,7 +705,7 @@
   // XLCT tag is present and valid. It returns false otherwise.
   bool ValidateExpectedLeafCertificate(
       const CryptoHandshakeMessage& client_hello,
-      const std::vector<QuicString>& certs) const;
+      const std::vector<std::string>& certs) const;
 
   // Returns true if the PDMD field from the client hello demands an X509
   // certificate.
@@ -742,10 +742,10 @@
     const QuicTransportVersion version_;
     QuicCompressedCertsCache* compressed_certs_cache_;
     const CommonCertSets* common_cert_sets_;
-    const QuicString client_common_set_hashes_;
-    const QuicString client_cached_cert_hashes_;
+    const std::string client_common_set_hashes_;
+    const std::string client_cached_cert_hashes_;
     const bool sct_supported_by_client_;
-    const QuicString sni_;
+    const std::string sni_;
     CryptoHandshakeMessage message_;
     std::unique_ptr<BuildServerConfigUpdateMessageResultCallback> cb_;
   };
@@ -757,14 +757,14 @@
       QuicTransportVersion version,
       QuicCompressedCertsCache* compressed_certs_cache,
       const CommonCertSets* common_cert_sets,
-      const QuicString& client_common_set_hashes,
-      const QuicString& client_cached_cert_hashes,
+      const std::string& client_common_set_hashes,
+      const std::string& client_cached_cert_hashes,
       bool sct_supported_by_client,
-      const QuicString& sni,
+      const std::string& sni,
       bool ok,
       const QuicReferenceCountedPointer<ProofSource::Chain>& chain,
-      const QuicString& signature,
-      const QuicString& leaf_cert_sct,
+      const std::string& signature,
+      const std::string& leaf_cert_sct,
       std::unique_ptr<ProofSource::Details> details,
       CryptoHandshakeMessage message,
       std::unique_ptr<BuildServerConfigUpdateMessageResultCallback> cb) const;
@@ -837,7 +837,7 @@
 
   // If non-empty, the server will operate in the pre-shared key mode by
   // incorporating |pre_shared_key_| into the key schedule.
-  QuicString pre_shared_key_;
+  std::string pre_shared_key_;
 
   // Whether REJ message should be padded to max packet size.
   bool pad_rej_;
@@ -866,7 +866,7 @@
   // The server config that is used for this proof (and the rest of the
   // request).
   QuicReferenceCountedPointer<QuicCryptoServerConfig::Config> config;
-  QuicString primary_scid;
+  std::string primary_scid;
 
  protected:
   ~QuicSignedServerConfig() override;
diff --git a/quic/core/crypto/quic_crypto_server_config_test.cc b/quic/core/crypto/quic_crypto_server_config_test.cc
index 101be1d..6d38bde 100644
--- a/quic/core/crypto/quic_crypto_server_config_test.cc
+++ b/quic/core/crypto/quic_crypto_server_config_test.cc
@@ -58,11 +58,11 @@
                                 TlsServerHandshaker::CreateSslCtx());
   QuicCryptoServerConfigPeer peer(&server);
 
-  std::vector<QuicString> certs = {"testcert"};
+  std::vector<std::string> certs = {"testcert"};
   QuicReferenceCountedPointer<ProofSource::Chain> chain(
       new ProofSource::Chain(certs));
 
-  QuicString compressed = QuicCryptoServerConfigPeer::CompressChain(
+  std::string compressed = QuicCryptoServerConfigPeer::CompressChain(
       &compressed_certs_cache, chain, "", "", nullptr);
 
   EXPECT_EQ(compressed_certs_cache.Size(), 1u);
@@ -80,18 +80,18 @@
   QuicCryptoServerConfigPeer peer(&server);
 
   // Compress the certs for the first time.
-  std::vector<QuicString> certs = {"testcert"};
+  std::vector<std::string> certs = {"testcert"};
   QuicReferenceCountedPointer<ProofSource::Chain> chain(
       new ProofSource::Chain(certs));
-  QuicString common_certs = "";
-  QuicString cached_certs = "";
+  std::string common_certs = "";
+  std::string cached_certs = "";
 
-  QuicString compressed = QuicCryptoServerConfigPeer::CompressChain(
+  std::string compressed = QuicCryptoServerConfigPeer::CompressChain(
       &compressed_certs_cache, chain, common_certs, cached_certs, nullptr);
   EXPECT_EQ(compressed_certs_cache.Size(), 1u);
 
   // Compress the same certs, should use cache if available.
-  QuicString compressed2 = QuicCryptoServerConfigPeer::CompressChain(
+  std::string compressed2 = QuicCryptoServerConfigPeer::CompressChain(
       &compressed_certs_cache, chain, common_certs, cached_certs, nullptr);
   EXPECT_EQ(compressed, compressed2);
   EXPECT_EQ(compressed_certs_cache.Size(), 1u);
@@ -110,13 +110,13 @@
                                 TlsServerHandshaker::CreateSslCtx());
   QuicCryptoServerConfigPeer peer(&server);
 
-  std::vector<QuicString> certs = {"testcert"};
+  std::vector<std::string> certs = {"testcert"};
   QuicReferenceCountedPointer<ProofSource::Chain> chain(
       new ProofSource::Chain(certs));
-  QuicString common_certs = "";
-  QuicString cached_certs = "";
+  std::string common_certs = "";
+  std::string cached_certs = "";
 
-  QuicString compressed = QuicCryptoServerConfigPeer::CompressChain(
+  std::string compressed = QuicCryptoServerConfigPeer::CompressChain(
       &compressed_certs_cache, chain, common_certs, cached_certs, nullptr);
   EXPECT_EQ(compressed_certs_cache.Size(), 1u);
 
@@ -124,7 +124,7 @@
   QuicReferenceCountedPointer<ProofSource::Chain> chain2(
       new ProofSource::Chain(certs));
 
-  QuicString compressed2 = QuicCryptoServerConfigPeer::CompressChain(
+  std::string compressed2 = QuicCryptoServerConfigPeer::CompressChain(
       &compressed_certs_cache, chain2, common_certs, cached_certs, nullptr);
   EXPECT_EQ(compressed_certs_cache.Size(), 2u);
 
@@ -134,8 +134,8 @@
       crypto_test_utils::MockCommonCertSets(certs[0], set_hash, 1));
   QuicStringPiece different_common_certs(
       reinterpret_cast<const char*>(&set_hash), sizeof(set_hash));
-  QuicString compressed3 = QuicCryptoServerConfigPeer::CompressChain(
-      &compressed_certs_cache, chain, QuicString(different_common_certs),
+  std::string compressed3 = QuicCryptoServerConfigPeer::CompressChain(
+      &compressed_certs_cache, chain, std::string(different_common_certs),
       cached_certs, common_sets.get());
   EXPECT_EQ(compressed_certs_cache.Size(), 3u);
 }
@@ -162,20 +162,21 @@
         rand_, &clock_, QuicCryptoServerConfig::ConfigOptions()));
   }
 
-  QuicString NewSourceAddressToken(QuicString config_id,
-                                   const QuicIpAddress& ip) {
+  std::string NewSourceAddressToken(std::string config_id,
+                                    const QuicIpAddress& ip) {
     return NewSourceAddressToken(config_id, ip, nullptr);
   }
 
-  QuicString NewSourceAddressToken(QuicString config_id,
-                                   const QuicIpAddress& ip,
-                                   const SourceAddressTokens& previous_tokens) {
+  std::string NewSourceAddressToken(
+      std::string config_id,
+      const QuicIpAddress& ip,
+      const SourceAddressTokens& previous_tokens) {
     return peer_.NewSourceAddressToken(config_id, previous_tokens, ip, rand_,
                                        clock_.WallNow(), nullptr);
   }
 
-  QuicString NewSourceAddressToken(
-      QuicString config_id,
+  std::string NewSourceAddressToken(
+      std::string config_id,
       const QuicIpAddress& ip,
       CachedNetworkParameters* cached_network_params) {
     SourceAddressTokens previous_tokens;
@@ -183,14 +184,14 @@
                                        clock_.WallNow(), cached_network_params);
   }
 
-  HandshakeFailureReason ValidateSourceAddressTokens(QuicString config_id,
+  HandshakeFailureReason ValidateSourceAddressTokens(std::string config_id,
                                                      QuicStringPiece srct,
                                                      const QuicIpAddress& ip) {
     return ValidateSourceAddressTokens(config_id, srct, ip, nullptr);
   }
 
   HandshakeFailureReason ValidateSourceAddressTokens(
-      QuicString config_id,
+      std::string config_id,
       QuicStringPiece srct,
       const QuicIpAddress& ip,
       CachedNetworkParameters* cached_network_params) {
@@ -198,8 +199,8 @@
         config_id, srct, ip, clock_.WallNow(), cached_network_params);
   }
 
-  const QuicString kPrimary = "<primary>";
-  const QuicString kOverride = "Config with custom source address token key";
+  const std::string kPrimary = "<primary>";
+  const std::string kOverride = "Config with custom source address token key";
 
   QuicIpAddress ip4_;
   QuicIpAddress ip4_dual_;
@@ -219,9 +220,9 @@
 // to a single IP address and server config.
 TEST_F(SourceAddressTokenTest, SourceAddressToken) {
   // Primary config generates configs that validate successfully.
-  const QuicString token4 = NewSourceAddressToken(kPrimary, ip4_);
-  const QuicString token4d = NewSourceAddressToken(kPrimary, ip4_dual_);
-  const QuicString token6 = NewSourceAddressToken(kPrimary, ip6_);
+  const std::string token4 = NewSourceAddressToken(kPrimary, ip4_);
+  const std::string token4d = NewSourceAddressToken(kPrimary, ip4_dual_);
+  const std::string token6 = NewSourceAddressToken(kPrimary, ip6_);
   EXPECT_EQ(HANDSHAKE_OK, ValidateSourceAddressTokens(kPrimary, token4, ip4_));
   ASSERT_EQ(HANDSHAKE_OK,
             ValidateSourceAddressTokens(kPrimary, token4, ip4_dual_));
@@ -236,7 +237,7 @@
 }
 
 TEST_F(SourceAddressTokenTest, SourceAddressTokenExpiration) {
-  const QuicString token = NewSourceAddressToken(kPrimary, ip4_);
+  const std::string token = NewSourceAddressToken(kPrimary, ip4_);
 
   // Validation fails if the token is from the future.
   clock_.AdvanceTime(QuicTime::Delta::FromSeconds(-3600 * 2));
@@ -254,7 +255,7 @@
   // that this gets written to ValidateSourceAddressToken output argument.
   CachedNetworkParameters cached_network_params_input;
   cached_network_params_input.set_bandwidth_estimate_bytes_per_second(1234);
-  const QuicString token4_with_cached_network_params =
+  const std::string token4_with_cached_network_params =
       NewSourceAddressToken(kPrimary, ip4_, &cached_network_params_input);
 
   CachedNetworkParameters cached_network_params_output;
@@ -277,7 +278,7 @@
   previous_token.set_timestamp(now.ToUNIXSeconds());
   SourceAddressTokens previous_tokens;
   (*previous_tokens.add_tokens()) = previous_token;
-  const QuicString token4or6 =
+  const std::string token4or6 =
       NewSourceAddressToken(kPrimary, ip4_, previous_tokens);
 
   EXPECT_EQ(HANDSHAKE_OK,
@@ -346,7 +347,7 @@
           QuicCryptoServerConfig::GenerateConfig(rand_, &clock_, options);
       protobuf->set_primary_time(primary_time);
       protobuf->set_priority(priority);
-      if (QuicString(server_config_id).find("INVALID") == 0) {
+      if (std::string(server_config_id).find("INVALID") == 0) {
         protobuf->clear_key();
         has_invalid = true;
       }
@@ -365,7 +366,7 @@
 };
 
 TEST_F(CryptoServerConfigsTest, NoConfigs) {
-  test_peer_.CheckConfigs(std::vector<std::pair<QuicString, bool>>());
+  test_peer_.CheckConfigs(std::vector<std::pair<std::string, bool>>());
 }
 
 TEST_F(CryptoServerConfigsTest, MakePrimaryFirst) {
diff --git a/quic/core/crypto/quic_decrypter.cc b/quic/core/crypto/quic_decrypter.cc
index d2aa28d..1ab67ba 100644
--- a/quic/core/crypto/quic_decrypter.cc
+++ b/quic/core/crypto/quic_decrypter.cc
@@ -55,14 +55,14 @@
                                             const DiversificationNonce& nonce,
                                             size_t key_size,
                                             size_t nonce_prefix_size,
-                                            QuicString* out_key,
-                                            QuicString* out_nonce_prefix) {
-  QuicHKDF hkdf((QuicString(preliminary_key)) + (QuicString(nonce_prefix)),
+                                            std::string* out_key,
+                                            std::string* out_nonce_prefix) {
+  QuicHKDF hkdf((std::string(preliminary_key)) + (std::string(nonce_prefix)),
                 QuicStringPiece(nonce.data(), nonce.size()),
                 "QUIC key diversification", 0, key_size, 0, nonce_prefix_size,
                 0);
-  *out_key = QuicString(hkdf.server_write_key());
-  *out_nonce_prefix = QuicString(hkdf.server_write_iv());
+  *out_key = std::string(hkdf.server_write_key());
+  *out_nonce_prefix = std::string(hkdf.server_write_iv());
 }
 
 }  // namespace quic
diff --git a/quic/core/crypto/quic_decrypter.h b/quic/core/crypto/quic_decrypter.h
index c7c2ccc..f55b00b 100644
--- a/quic/core/crypto/quic_decrypter.h
+++ b/quic/core/crypto/quic_decrypter.h
@@ -73,8 +73,8 @@
                                       const DiversificationNonce& nonce,
                                       size_t key_size,
                                       size_t nonce_prefix_size,
-                                      QuicString* out_key,
-                                      QuicString* out_nonce_prefix);
+                                      std::string* out_key,
+                                      std::string* out_nonce_prefix);
 };
 
 }  // namespace quic
diff --git a/quic/core/crypto/quic_hkdf_test.cc b/quic/core/crypto/quic_hkdf_test.cc
index f8c53c6..fbf2860 100644
--- a/quic/core/crypto/quic_hkdf_test.cc
+++ b/quic/core/crypto/quic_hkdf_test.cc
@@ -70,10 +70,10 @@
     const HKDFInput& test(kHKDFInputs[i]);
     SCOPED_TRACE(i);
 
-    const QuicString key = QuicTextUtils::HexDecode(test.key_hex);
-    const QuicString salt = QuicTextUtils::HexDecode(test.salt_hex);
-    const QuicString info = QuicTextUtils::HexDecode(test.info_hex);
-    const QuicString expected = QuicTextUtils::HexDecode(test.output_hex);
+    const std::string key = QuicTextUtils::HexDecode(test.key_hex);
+    const std::string salt = QuicTextUtils::HexDecode(test.salt_hex);
+    const std::string info = QuicTextUtils::HexDecode(test.info_hex);
+    const std::string expected = QuicTextUtils::HexDecode(test.output_hex);
 
     // We set the key_length to the length of the expected output and then take
     // the result from the first key, which is the client write key.
diff --git a/quic/core/crypto/transport_parameters_test.cc b/quic/core/crypto/transport_parameters_test.cc
index 8a81841..23b18e5 100644
--- a/quic/core/crypto/transport_parameters_test.cc
+++ b/quic/core/crypto/transport_parameters_test.cc
@@ -412,7 +412,7 @@
   orig_params.idle_timeout = 56;
 
   orig_params.google_quic_params = QuicMakeUnique<CryptoHandshakeMessage>();
-  const QuicString kTestString = "test string";
+  const std::string kTestString = "test string";
   orig_params.google_quic_params->SetStringPiece(42, kTestString);
   const uint32_t kTestValue = 12;
   orig_params.google_quic_params->SetValue(1337, kTestValue);
diff --git a/quic/core/frames/quic_application_close_frame.h b/quic/core/frames/quic_application_close_frame.h
index b9b84dd..6a85265 100644
--- a/quic/core/frames/quic_application_close_frame.h
+++ b/quic/core/frames/quic_application_close_frame.h
@@ -21,7 +21,7 @@
       const QuicApplicationCloseFrame& frame);
 
   QuicErrorCode error_code;
-  QuicString error_details;
+  std::string error_details;
 };
 
 }  // namespace quic
diff --git a/quic/core/frames/quic_connection_close_frame.cc b/quic/core/frames/quic_connection_close_frame.cc
index 51969c6..55d356b 100644
--- a/quic/core/frames/quic_connection_close_frame.cc
+++ b/quic/core/frames/quic_connection_close_frame.cc
@@ -10,14 +10,14 @@
     : error_code(QUIC_NO_ERROR), frame_type(0) {}
 
 QuicConnectionCloseFrame::QuicConnectionCloseFrame(QuicErrorCode error_code,
-                                                   QuicString error_details)
+                                                   std::string error_details)
     : error_code(error_code),
       error_details(std::move(error_details)),
       frame_type(0) {}
 
 QuicConnectionCloseFrame::QuicConnectionCloseFrame(
     QuicIetfTransportErrorCodes ietf_error_code,
-    QuicString error_details,
+    std::string error_details,
     uint64_t frame_type)
     : ietf_error_code(ietf_error_code),
       error_details(std::move(error_details)),
diff --git a/quic/core/frames/quic_connection_close_frame.h b/quic/core/frames/quic_connection_close_frame.h
index 2bbbe73..1b909ce 100644
--- a/quic/core/frames/quic_connection_close_frame.h
+++ b/quic/core/frames/quic_connection_close_frame.h
@@ -16,9 +16,9 @@
 
 struct QUIC_EXPORT_PRIVATE QuicConnectionCloseFrame {
   QuicConnectionCloseFrame();
-  QuicConnectionCloseFrame(QuicErrorCode error_code, QuicString error_details);
+  QuicConnectionCloseFrame(QuicErrorCode error_code, std::string error_details);
   QuicConnectionCloseFrame(QuicIetfTransportErrorCodes ietf_error_code,
-                           QuicString error_details,
+                           std::string error_details,
                            uint64_t frame_type);
 
   friend QUIC_EXPORT_PRIVATE std::ostream& operator<<(
@@ -33,7 +33,7 @@
     QuicErrorCode error_code;
     QuicIetfTransportErrorCodes ietf_error_code;
   };
-  QuicString error_details;
+  std::string error_details;
 
   // Contains the type of frame that triggered the connection close. Made a
   // uint64, as opposed to the QuicIetfFrameType, to support possible
diff --git a/quic/core/frames/quic_goaway_frame.cc b/quic/core/frames/quic_goaway_frame.cc
index ff034f0..53dca54 100644
--- a/quic/core/frames/quic_goaway_frame.cc
+++ b/quic/core/frames/quic_goaway_frame.cc
@@ -16,7 +16,7 @@
 QuicGoAwayFrame::QuicGoAwayFrame(QuicControlFrameId control_frame_id,
                                  QuicErrorCode error_code,
                                  QuicStreamId last_good_stream_id,
-                                 const QuicString& reason)
+                                 const std::string& reason)
     : control_frame_id(control_frame_id),
       error_code(error_code),
       last_good_stream_id(last_good_stream_id),
diff --git a/quic/core/frames/quic_goaway_frame.h b/quic/core/frames/quic_goaway_frame.h
index 085e915..03d6273 100644
--- a/quic/core/frames/quic_goaway_frame.h
+++ b/quic/core/frames/quic_goaway_frame.h
@@ -18,7 +18,7 @@
   QuicGoAwayFrame(QuicControlFrameId control_frame_id,
                   QuicErrorCode error_code,
                   QuicStreamId last_good_stream_id,
-                  const QuicString& reason);
+                  const std::string& reason);
 
   friend QUIC_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
                                                       const QuicGoAwayFrame& g);
@@ -28,7 +28,7 @@
   QuicControlFrameId control_frame_id;
   QuicErrorCode error_code;
   QuicStreamId last_good_stream_id;
-  QuicString reason_phrase;
+  std::string reason_phrase;
 };
 
 }  // namespace quic
diff --git a/quic/core/frames/quic_new_token_frame.cc b/quic/core/frames/quic_new_token_frame.cc
index c2f4e74..6e36866 100644
--- a/quic/core/frames/quic_new_token_frame.cc
+++ b/quic/core/frames/quic_new_token_frame.cc
@@ -12,7 +12,7 @@
     : control_frame_id(kInvalidControlFrameId) {}
 
 QuicNewTokenFrame::QuicNewTokenFrame(QuicControlFrameId control_frame_id,
-                                     QuicString token)
+                                     std::string token)
     : control_frame_id(control_frame_id), token(token) {}
 
 std::ostream& operator<<(std::ostream& os, const QuicNewTokenFrame& s) {
diff --git a/quic/core/frames/quic_new_token_frame.h b/quic/core/frames/quic_new_token_frame.h
index 6fb0ea4..5a063a3 100644
--- a/quic/core/frames/quic_new_token_frame.h
+++ b/quic/core/frames/quic_new_token_frame.h
@@ -17,7 +17,7 @@
 
 struct QUIC_EXPORT_PRIVATE QuicNewTokenFrame {
   QuicNewTokenFrame();
-  QuicNewTokenFrame(QuicControlFrameId control_frame_id, QuicString token);
+  QuicNewTokenFrame(QuicControlFrameId control_frame_id, std::string token);
 
   friend QUIC_EXPORT_PRIVATE std::ostream& operator<<(
       std::ostream& os,
@@ -27,7 +27,7 @@
   // and non-zero when sent.
   QuicControlFrameId control_frame_id;
 
-  QuicString token;
+  std::string token;
 };
 static_assert(sizeof(QuicNewTokenFrame) <= 64,
               "Keep the QuicNewTokenFrame size to a cacheline.");
diff --git a/quic/core/http/end_to_end_test.cc b/quic/core/http/end_to_end_test.cc
index c26ffa6..d439e95 100644
--- a/quic/core/http/end_to_end_test.cc
+++ b/quic/core/http/end_to_end_test.cc
@@ -622,7 +622,7 @@
   // Default is true.
   bool connect_to_server_on_initialize_;
   QuicSocketAddress server_address_;
-  QuicString server_hostname_;
+  std::string server_hostname_;
   QuicMemoryCacheBackend memory_cache_backend_;
   std::unique_ptr<ServerThread> server_thread_;
   std::unique_ptr<QuicTestClient> client_;
@@ -637,8 +637,8 @@
   size_t chlo_multiplier_;
   QuicTestServer::StreamFactory* stream_factory_;
   bool support_server_push_;
-  QuicString pre_shared_key_client_;
-  QuicString pre_shared_key_server_;
+  std::string pre_shared_key_client_;
+  std::string pre_shared_key_server_;
   QuicConnectionId* override_connection_id_;
 };
 
@@ -854,8 +854,8 @@
 
 TEST_P(EndToEndTestWithTls, RequestOverMultiplePackets) {
   // Send a large enough request to guarantee fragmentation.
-  QuicString huge_request =
-      "/some/path?query=" + QuicString(kMaxPacketSize, '.');
+  std::string huge_request =
+      "/some/path?query=" + std::string(kMaxPacketSize, '.');
   AddToCache(huge_request, 200, kBarResponseBody);
 
   ASSERT_TRUE(Initialize());
@@ -866,8 +866,8 @@
 
 TEST_P(EndToEndTestWithTls, MultiplePacketsRandomOrder) {
   // Send a large enough request to guarantee fragmentation.
-  QuicString huge_request =
-      "/some/path?query=" + QuicString(kMaxPacketSize, '.');
+  std::string huge_request =
+      "/some/path?query=" + std::string(kMaxPacketSize, '.');
   AddToCache(huge_request, 200, kBarResponseBody);
 
   ASSERT_TRUE(Initialize());
@@ -903,7 +903,7 @@
   EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed());
 
   // 1 MB body.
-  QuicString body(1024 * 1024, 'a');
+  std::string body(1024 * 1024, 'a');
   SpdyHeaderBlock headers;
   headers[":method"] = "POST";
   headers[":path"] = "/foo";
@@ -924,7 +924,7 @@
   EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed());
 
   // 100 KB body.
-  QuicString body(100 * 1024, 'a');
+  std::string body(100 * 1024, 'a');
   SpdyHeaderBlock headers;
   headers[":method"] = "POST";
   headers[":path"] = "/foo";
@@ -952,7 +952,7 @@
   SetPacketLossPercentage(30);
 
   // 10 KB body.
-  QuicString body(1024 * 10, 'a');
+  std::string body(1024 * 10, 'a');
   SpdyHeaderBlock headers;
   headers[":method"] = "POST";
   headers[":path"] = "/foo";
@@ -983,7 +983,7 @@
   SetPacketLossPercentage(30);
 
   // 10 KB body.
-  QuicString body(1024 * 10, 'a');
+  std::string body(1024 * 10, 'a');
   SpdyHeaderBlock headers;
   headers[":method"] = "POST";
   headers[":path"] = "/foo";
@@ -1011,7 +1011,7 @@
   client_writer_->set_fake_blocked_socket_percentage(10);
 
   // 10 KB body.
-  QuicString body(1024 * 10, 'a');
+  std::string body(1024 * 10, 'a');
   SpdyHeaderBlock headers;
   headers[":method"] = "POST";
   headers[":path"] = "/foo";
@@ -1031,7 +1031,7 @@
   SetReorderPercentage(30);
 
   // 1 MB body.
-  QuicString body(1024 * 1024, 'a');
+  std::string body(1024 * 1024, 'a');
   SpdyHeaderBlock headers;
   headers[":method"] = "POST";
   headers[":path"] = "/foo";
@@ -1047,7 +1047,7 @@
   // a 0-RTT handshake for the next request.
   ASSERT_TRUE(Initialize());
 
-  QuicString body(20480, 'a');
+  std::string body(20480, 'a');
   SpdyHeaderBlock headers;
   headers[":method"] = "POST";
   headers[":path"] = "/foo";
@@ -1187,7 +1187,7 @@
   // a 0-RTT handshake for the next request.
   ASSERT_TRUE(Initialize());
 
-  QuicString body(20480, 'a');
+  std::string body(20480, 'a');
   SpdyHeaderBlock headers;
   headers[":method"] = "POST";
   headers[":path"] = "/foo";
@@ -1302,7 +1302,7 @@
   EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed());
 
   // 1 MB body.
-  QuicString body(1024 * 1024, 'a');
+  std::string body(1024 * 1024, 'a');
   SpdyHeaderBlock headers;
   headers[":method"] = "POST";
   headers[":path"] = "/foo";
@@ -1363,7 +1363,7 @@
   ASSERT_TRUE(Initialize());
   EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed());
 
-  QuicString body(kMaxPacketSize, 'a');
+  std::string body(kMaxPacketSize, 'a');
   SpdyHeaderBlock headers;
   headers[":method"] = "POST";
   headers[":path"] = "/foo";
@@ -1387,15 +1387,15 @@
   ASSERT_TRUE(Initialize());
   EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed());
 
-  QuicString body(kMaxPacketSize, 'a');
+  std::string body(kMaxPacketSize, 'a');
   SpdyHeaderBlock headers;
   headers[":method"] = "POST";
   headers[":path"] = "/foo";
   headers[":scheme"] = "https";
   headers[":authority"] = server_hostname_;
-  headers["key1"] = QuicString(15 * 1024, 'a');
-  headers["key2"] = QuicString(15 * 1024, 'a');
-  headers["key3"] = QuicString(15 * 1024, 'a');
+  headers["key1"] = std::string(15 * 1024, 'a');
+  headers["key2"] = std::string(15 * 1024, 'a');
+  headers["key3"] = std::string(15 * 1024, 'a');
 
   client_->SendCustomSynchronousRequest(headers, body);
   EXPECT_EQ(QUIC_HEADERS_TOO_LARGE, client_->stream_error());
@@ -1406,7 +1406,7 @@
   ASSERT_TRUE(Initialize());
   EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed());
 
-  QuicString large_body(1024 * 1024, 'a');
+  std::string large_body(1024 * 1024, 'a');
   SpdyHeaderBlock headers;
   headers[":method"] = "POST";
   headers[":path"] = "/foo";
@@ -1765,7 +1765,7 @@
     SetPacketLossPercentage(1);
   }
   ASSERT_TRUE(Initialize());
-  QuicString large_body(10240, 'a');
+  std::string large_body(10240, 'a');
   int max_streams = 100;
 
   AddToCache("/large_response", 200, large_body);
@@ -1785,7 +1785,7 @@
 
 TEST_P(EndToEndTestWithTls, StreamCancelErrorTest) {
   ASSERT_TRUE(Initialize());
-  QuicString small_body(256, 'a');
+  std::string small_body(256, 'a');
 
   AddToCache("/small_response", 200, small_body);
 
@@ -2166,7 +2166,7 @@
  public:
   void OnCompleteResponse(QuicStreamId id,
                           const SpdyHeaderBlock& response_headers,
-                          const QuicString& response_body) override {
+                          const std::string& response_body) override {
     QUIC_DVLOG(1) << "response for stream " << id << " "
                   << response_headers.DebugString() << "\n"
                   << response_body;
@@ -2201,8 +2201,8 @@
 
   // Test the AckNotifier's ability to track multiple packets by making the
   // request body exceed the size of a single packet.
-  QuicString request_string =
-      "a request body bigger than one packet" + QuicString(kMaxPacketSize, '.');
+  std::string request_string = "a request body bigger than one packet" +
+                               std::string(kMaxPacketSize, '.');
 
   // The TestAckListener will cause a failure if not notified.
   QuicReferenceCountedPointer<TestAckListener> ack_listener(
@@ -2492,7 +2492,7 @@
       EmptyQuicConnectionId(), false, false, 1, "At least 20 characters.",
       CONNECTION_ID_PRESENT, CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER));
   // Damage the encrypted data.
-  QuicString damaged_packet(packet->data(), packet->length());
+  std::string damaged_packet(packet->data(), packet->length());
   damaged_packet[30] ^= 0x01;
   QUIC_DLOG(INFO) << "Sending bad packet.";
   client_writer_->WritePacket(
@@ -2544,7 +2544,7 @@
       QuicStreamId id,
       QuicSpdySession* session,
       QuicSimpleServerBackend* quic_simple_server_backend,
-      QuicString response_body)
+      std::string response_body)
       : QuicSimpleServerStream(id,
                                session,
                                BIDIRECTIONAL,
@@ -2566,12 +2566,12 @@
     SendHeadersAndBody(std::move(headers), response_body_);
   }
 
-  QuicString response_body_;
+  std::string response_body_;
 };
 
 class StreamWithErrorFactory : public QuicTestServer::StreamFactory {
  public:
-  explicit StreamWithErrorFactory(QuicString response_body)
+  explicit StreamWithErrorFactory(std::string response_body)
       : response_body_(std::move(response_body)) {}
 
   ~StreamWithErrorFactory() override = default;
@@ -2585,7 +2585,7 @@
   }
 
  private:
-  QuicString response_body_;
+  std::string response_body_;
 };
 
 // A test server stream that drops all received body.
@@ -2665,7 +2665,7 @@
  protected:
   void SendResponse() override {
     QuicBackendResponse response;
-    QuicString body(body_bytes_, 'a');
+    std::string body(body_bytes_, 'a');
     response.set_body(body);
     SendHeadersAndBodyAndTrailers(response.headers().Clone(), response.body(),
                                   response.trailers().Clone());
@@ -2712,7 +2712,7 @@
   // it.
   uint32_t response_body_size =
       2 * client_config_.GetInitialStreamFlowControlWindowToSend();
-  QuicString response_body(response_body_size, 'a');
+  std::string response_body(response_body_size, 'a');
 
   StreamWithErrorFactory stream_factory(response_body);
   SetSpdyStreamFactory(&stream_factory);
@@ -2738,7 +2738,7 @@
   // before the request FIN is processed but receive the request FIN before the
   // response is sent completely.
   const uint32_t kRequestBodySize = kMaxPacketSize + 10;
-  QuicString request_body(kRequestBodySize, 'a');
+  std::string request_body(kRequestBodySize, 'a');
 
   // Send the request.
   client_->SendMessage(headers, request_body);
@@ -2774,7 +2774,7 @@
   SetReorderPercentage(30);
 
   // Add a response with headers, body, and trailers.
-  const QuicString kBody = "body content";
+  const std::string kBody = "body content";
 
   SpdyHeaderBlock headers;
   headers[":status"] = "200";
@@ -2808,24 +2808,24 @@
   // If |resource_size| == 0, response body of push resources use default string
   // concatenating with resource url. Otherwise, generate a string of
   // |resource_size| as body.
-  void AddRequestAndResponseWithServerPush(QuicString host,
-                                           QuicString path,
-                                           QuicString response_body,
-                                           QuicString* push_urls,
+  void AddRequestAndResponseWithServerPush(std::string host,
+                                           std::string path,
+                                           std::string response_body,
+                                           std::string* push_urls,
                                            const size_t num_resources,
                                            const size_t resource_size) {
     bool use_large_response = resource_size != 0;
-    QuicString large_resource;
+    std::string large_resource;
     if (use_large_response) {
       // Generate a response common body larger than flow control window for
       // push response.
-      large_resource = QuicString(resource_size, 'a');
+      large_resource = std::string(resource_size, 'a');
     }
     std::list<QuicBackendResponse::ServerPushInfo> push_resources;
     for (size_t i = 0; i < num_resources; ++i) {
-      QuicString url = push_urls[i];
+      std::string url = push_urls[i];
       QuicUrl resource_url(url);
-      QuicString body =
+      std::string body =
           use_large_response
               ? large_resource
               : QuicStrCat("This is server push response body for ", url);
@@ -2857,12 +2857,12 @@
   SetReorderPercentage(30);
 
   // Add a response with headers, body, and push resources.
-  const QuicString kBody = "body content";
+  const std::string kBody = "body content";
   size_t kNumResources = 4;
-  QuicString push_urls[] = {"https://example.com/font.woff",
-                            "https://example.com/script.js",
-                            "https://fonts.example.com/font.woff",
-                            "https://example.com/logo-hires.jpg"};
+  std::string push_urls[] = {"https://example.com/font.woff",
+                             "https://example.com/script.js",
+                             "https://fonts.example.com/font.woff",
+                             "https://example.com/logo-hires.jpg"};
   AddRequestAndResponseWithServerPush("example.com", "/push_example", kBody,
                                       push_urls, kNumResources, 0);
 
@@ -2880,11 +2880,11 @@
   // hasn't finished yet.
   EXPECT_TRUE(QuicStreamSequencerPeer::IsUnderlyingBufferAllocated(sequencer));
 
-  for (const QuicString& url : push_urls) {
+  for (const std::string& url : push_urls) {
     QUIC_DVLOG(1) << "send request for pushed stream on url " << url;
-    QuicString expected_body =
+    std::string expected_body =
         QuicStrCat("This is server push response body for ", url);
-    QuicString response_body = client_->SendSynchronousRequest(url);
+    std::string response_body = client_->SendSynchronousRequest(url);
     QUIC_DVLOG(1) << "response body " << response_body;
     EXPECT_EQ(expected_body, response_body);
   }
@@ -2904,9 +2904,9 @@
   SetReorderPercentage(30);
 
   // Add a response with headers, body, and push resources.
-  const QuicString kBody = "body content";
+  const std::string kBody = "body content";
   size_t const kNumResources = 4;
-  QuicString push_urls[] = {
+  std::string push_urls[] = {
       "https://example.com/font.woff",
       "https://example.com/script.js",
       "https://fonts.example.com/font.woff",
@@ -2924,13 +2924,13 @@
   EXPECT_EQ(kBody, client_->SendSynchronousRequest(
                        "https://example.com/push_example"));
 
-  for (const QuicString& url : push_urls) {
+  for (const std::string& url : push_urls) {
     // Sending subsequent requesets will not actually send anything on the wire,
     // as the responses are already in the client's cache.
     QUIC_DVLOG(1) << "send request for pushed stream on url " << url;
-    QuicString expected_body =
+    std::string expected_body =
         QuicStrCat("This is server push response body for ", url);
-    QuicString response_body = client_->SendSynchronousRequest(url);
+    std::string response_body = client_->SendSynchronousRequest(url);
     QUIC_DVLOG(1) << "response body " << response_body;
     EXPECT_EQ(expected_body, response_body);
   }
@@ -2953,11 +2953,11 @@
   SetReorderPercentage(30);
 
   // Add a response with headers, body, and push resources.
-  const QuicString kBody = "body content";
+  const std::string kBody = "body content";
 
   // One more resource than max number of outgoing stream of this session.
   const size_t kNumResources = 1 + kNumMaxStreams;  // 11.
-  QuicString push_urls[11];
+  std::string push_urls[11];
   for (size_t i = 0; i < kNumResources; ++i) {
     push_urls[i] = QuicStrCat("https://example.com/push_resources", i);
   }
@@ -2973,7 +2973,7 @@
   EXPECT_EQ(kBody, client_->SendSynchronousRequest(
                        "https://example.com/push_example"));
 
-  for (const QuicString& url : push_urls) {
+  for (const std::string& url : push_urls) {
     // Sending subsequent requesets will not actually send anything on the wire,
     // as the responses are already in the client's cache.
     EXPECT_EQ(QuicStrCat("This is server push response body for ", url),
@@ -3011,10 +3011,10 @@
   SetReorderPercentage(30);
 
   // Add a response with headers, body, and push resources.
-  const QuicString kBody = "body content";
+  const std::string kBody = "body content";
 
   const size_t kNumResources = kNumMaxStreams + 1;
-  QuicString push_urls[11];
+  std::string push_urls[11];
   for (size_t i = 0; i < kNumResources; ++i) {
     push_urls[i] = QuicStrCat("http://example.com/push_resources", i);
   }
@@ -3085,7 +3085,7 @@
   // Request body size is 4G plus one more kSizeBytes.
   int64_t request_body_size_bytes = pow(2, 32) + kSizeBytes;
   ASSERT_LT(INT64_C(4294967296), request_body_size_bytes);
-  QuicString body(kSizeBytes, 'a');
+  std::string body(kSizeBytes, 'a');
 
   SpdyHeaderBlock headers;
   headers[":method"] = "POST";
@@ -3099,7 +3099,7 @@
 
   for (int i = 0; i < request_body_size_bytes / kSizeBytes; ++i) {
     bool fin = (i == request_body_size_bytes - 1);
-    client_->SendData(QuicString(body.data(), kSizeBytes), fin);
+    client_->SendData(std::string(body.data(), kSizeBytes), fin);
     client_->client()->WaitForEvents();
   }
   VerifyCleanConnection(true);
@@ -3200,7 +3200,7 @@
   headers[":path"] = "/foo";
   headers[":scheme"] = "https";
   headers[":authority"] = server_hostname_;
-  headers["key"] = QuicString(64 * 1024, 'a');
+  headers["key"] = std::string(64 * 1024, 'a');
 
   client_->SendMessage(headers, "");
   client_->WaitForResponse();
@@ -3236,7 +3236,7 @@
       client_->client()->client_session()->connection();
   client_connection->set_debug_visitor(&observer);
   // 100KB body.
-  QuicString body(100 * 1024, 'a');
+  std::string body(100 * 1024, 'a');
   SpdyHeaderBlock headers;
   headers[":method"] = "POST";
   headers[":path"] = "/foo";
@@ -3336,7 +3336,7 @@
   std::unique_ptr<QuicTestClient> client(CreateQuicClient(bad_writer));
 
   // 1 MB body.
-  QuicString body(1024 * 1024, 'a');
+  std::string body(1024 * 1024, 'a');
   SpdyHeaderBlock headers;
   headers[":method"] = "POST";
   headers[":path"] = "/foo";
@@ -3429,7 +3429,7 @@
 
   // INCOMPLETE_RESPONSE will cause the server to not to send the trailer
   // (and the FIN) after the response body.
-  QuicString response_body(1305, 'a');
+  std::string response_body(1305, 'a');
   SpdyHeaderBlock response_headers;
   response_headers[":status"] = QuicTextUtils::Uint64ToString(200);
   response_headers["content-length"] =
@@ -3471,7 +3471,7 @@
   stream->MaybeSetTtl(QuicTime::Delta::FromMicroseconds(1));
 
   // 1 MB body.
-  QuicString body(1024 * 1024, 'a');
+  std::string body(1024 * 1024, 'a');
   stream->WriteOrBufferBody(body, true);
   client_->WaitForResponse();
   EXPECT_EQ(QUIC_STREAM_TTL_EXPIRED, client_->stream_error());
@@ -3490,7 +3490,7 @@
   ASSERT_GT(kMaxPacketSize, client_session->GetLargestMessagePayload());
   ASSERT_LT(0, client_session->GetLargestMessagePayload());
 
-  QuicString message_string(kMaxPacketSize, 'a');
+  std::string message_string(kMaxPacketSize, 'a');
   QuicStringPiece message_buffer(message_string);
   QuicRandom* random =
       QuicConnectionPeer::GetHelper(client_connection)->GetRandomGenerator();
@@ -3662,7 +3662,7 @@
   // STOP_SENDING will cause the server to not to send the trailer
   // (and the FIN) after the response body. Instead, it sends a STOP_SENDING
   // frame for the stream.
-  QuicString response_body(1305, 'a');
+  std::string response_body(1305, 'a');
   SpdyHeaderBlock response_headers;
   response_headers[":status"] = QuicTextUtils::Uint64ToString(200);
   response_headers["content-length"] =
diff --git a/quic/core/http/http_decoder.cc b/quic/core/http/http_decoder.cc
index e697821..55879d0 100644
--- a/quic/core/http/http_decoder.cc
+++ b/quic/core/http/http_decoder.cc
@@ -355,7 +355,7 @@
   remaining_length_field_length_ -= bytes_to_read;
 }
 
-void HttpDecoder::RaiseError(QuicErrorCode error, QuicString error_detail) {
+void HttpDecoder::RaiseError(QuicErrorCode error, std::string error_detail) {
   state_ = STATE_ERROR;
   error_ = error;
   error_detail_ = std::move(error_detail);
diff --git a/quic/core/http/http_decoder.h b/quic/core/http/http_decoder.h
index 910d189..d6b1cc1 100644
--- a/quic/core/http/http_decoder.h
+++ b/quic/core/http/http_decoder.h
@@ -111,7 +111,7 @@
   bool has_payload() { return has_payload_; }
 
   QuicErrorCode error() const { return error_; }
-  const QuicString& error_detail() const { return error_detail_; }
+  const std::string& error_detail() const { return error_detail_; }
 
  private:
   // Represents the current state of the parsing state machine.
@@ -145,7 +145,7 @@
   void BufferFrameLength(QuicDataReader* reader);
 
   // Sets |error_| and |error_detail_| accordingly.
-  void RaiseError(QuicErrorCode error, QuicString error_detail);
+  void RaiseError(QuicErrorCode error, std::string error_detail);
 
   // Parses the payload of a PRIORITY frame from |reader| into |frame|.
   bool ParsePriorityFrame(QuicDataReader* reader, PriorityFrame* frame);
@@ -170,14 +170,14 @@
   // Last error.
   QuicErrorCode error_;
   // The issue which caused |error_|
-  QuicString error_detail_;
+  std::string error_detail_;
   // True if the call to ProcessInput() generates any payload. Flushed every
   // time ProcessInput() is called.
   bool has_payload_;
   // Remaining unparsed data.
-  QuicString buffer_;
+  std::string buffer_;
   // Remaining unparsed length field data.
-  QuicString length_buffer_;
+  std::string length_buffer_;
 };
 
 }  // namespace quic
diff --git a/quic/core/http/http_decoder_test.cc b/quic/core/http/http_decoder_test.cc
index c6d7d9f..cfabe70 100644
--- a/quic/core/http/http_decoder_test.cc
+++ b/quic/core/http/http_decoder_test.cc
@@ -321,12 +321,12 @@
 
 TEST_F(HttpDecoderTest, FrameHeaderPartialDelivery) {
   // A large input that will occupy more than 1 byte in the length field.
-  QuicString input(2048, 'x');
+  std::string input(2048, 'x');
   HttpEncoder encoder;
   std::unique_ptr<char[]> buffer;
   QuicByteCount header_length =
       encoder.SerializeDataFrameHeader(input.length(), &buffer);
-  QuicString header = QuicString(buffer.get(), header_length);
+  std::string header = std::string(buffer.get(), header_length);
   // Partially send only 1 byte of the header to process.
   EXPECT_EQ(1u, decoder_.ProcessInput(header.data(), 1));
   EXPECT_EQ(QUIC_NO_ERROR, decoder_.error());
diff --git a/quic/core/http/quic_client_promised_info.cc b/quic/core/http/quic_client_promised_info.cc
index abfc4b4..3cebc1e 100644
--- a/quic/core/http/quic_client_promised_info.cc
+++ b/quic/core/http/quic_client_promised_info.cc
@@ -19,7 +19,7 @@
 QuicClientPromisedInfo::QuicClientPromisedInfo(
     QuicSpdyClientSessionBase* session,
     QuicStreamId id,
-    QuicString url)
+    std::string url)
     : session_(session),
       id_(id),
       url_(std::move(url)),
diff --git a/quic/core/http/quic_client_promised_info.h b/quic/core/http/quic_client_promised_info.h
index 917c9f7..64ee09e 100644
--- a/quic/core/http/quic_client_promised_info.h
+++ b/quic/core/http/quic_client_promised_info.h
@@ -7,11 +7,11 @@
 
 #include <cstddef>
 
-#include "net/third_party/quiche/src/quic/core/quic_alarm.h"
 #include "net/third_party/quiche/src/quic/core/http/quic_client_push_promise_index.h"
-#include "net/third_party/quiche/src/quic/core/quic_packets.h"
 #include "net/third_party/quiche/src/quic/core/http/quic_spdy_client_session_base.h"
 #include "net/third_party/quiche/src/quic/core/http/quic_spdy_stream.h"
+#include "net/third_party/quiche/src/quic/core/quic_alarm.h"
+#include "net/third_party/quiche/src/quic/core/quic_packets.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_string.h"
 #include "net/third_party/quiche/src/spdy/core/spdy_framer.h"
@@ -32,7 +32,7 @@
   // Interface to QuicSpdyClientStream
   QuicClientPromisedInfo(QuicSpdyClientSessionBase* session,
                          QuicStreamId id,
-                         QuicString url);
+                         std::string url);
   QuicClientPromisedInfo(const QuicClientPromisedInfo&) = delete;
   QuicClientPromisedInfo& operator=(const QuicClientPromisedInfo&) = delete;
   virtual ~QuicClientPromisedInfo();
@@ -76,7 +76,7 @@
 
   QuicStreamId id() const { return id_; }
 
-  const QuicString url() const { return url_; }
+  const std::string url() const { return url_; }
 
   // Return true if there's a request pending matching this push promise.
   bool is_validating() const { return client_request_delegate_ != nullptr; }
@@ -98,7 +98,7 @@
 
   QuicSpdyClientSessionBase* session_;
   QuicStreamId id_;
-  QuicString url_;
+  std::string url_;
   spdy::SpdyHeaderBlock request_headers_;
   std::unique_ptr<spdy::SpdyHeaderBlock> response_headers_;
   spdy::SpdyHeaderBlock client_request_headers_;
diff --git a/quic/core/http/quic_client_promised_info_test.cc b/quic/core/http/quic_client_promised_info_test.cc
index 2a7b1b0..43346d9 100644
--- a/quic/core/http/quic_client_promised_info_test.cc
+++ b/quic/core/http/quic_client_promised_info_test.cc
@@ -49,7 +49,7 @@
       delete;
   ~MockQuicSpdyClientSession() override {}
 
-  bool IsAuthorized(const QuicString& authority) override {
+  bool IsAuthorized(const std::string& authority) override {
     return authorized_;
   }
 
@@ -125,10 +125,10 @@
   std::unique_ptr<StreamVisitor> stream_visitor_;
   std::unique_ptr<QuicSpdyClientStream> promised_stream_;
   SpdyHeaderBlock headers_;
-  QuicString body_;
+  std::string body_;
   SpdyHeaderBlock push_promise_;
   QuicStreamId promise_id_;
-  QuicString promise_url_;
+  std::string promise_url_;
   SpdyHeaderBlock client_request_;
 };
 
diff --git a/quic/core/http/quic_client_push_promise_index.cc b/quic/core/http/quic_client_push_promise_index.cc
index 2ba5951..08a4477 100644
--- a/quic/core/http/quic_client_push_promise_index.cc
+++ b/quic/core/http/quic_client_push_promise_index.cc
@@ -19,7 +19,7 @@
 QuicClientPushPromiseIndex::TryHandle::~TryHandle() {}
 
 QuicClientPromisedInfo* QuicClientPushPromiseIndex::GetPromised(
-    const QuicString& url) {
+    const std::string& url) {
   auto it = promised_by_url_.find(url);
   if (it == promised_by_url_.end()) {
     return nullptr;
@@ -31,7 +31,7 @@
     const spdy::SpdyHeaderBlock& request,
     QuicClientPushPromiseIndex::Delegate* delegate,
     TryHandle** handle) {
-  QuicString url(SpdyUtils::GetPromisedUrlFromHeaders(request));
+  std::string url(SpdyUtils::GetPromisedUrlFromHeaders(request));
   auto it = promised_by_url_.find(url);
   if (it != promised_by_url_.end()) {
     QuicClientPromisedInfo* promised = it->second;
diff --git a/quic/core/http/quic_client_push_promise_index.h b/quic/core/http/quic_client_push_promise_index.h
index 5dd29b4..2647924 100644
--- a/quic/core/http/quic_client_push_promise_index.h
+++ b/quic/core/http/quic_client_push_promise_index.h
@@ -66,7 +66,7 @@
 
   // Called by client code, used to enforce affinity between requests
   // for promised streams and the session the promise came from.
-  QuicClientPromisedInfo* GetPromised(const QuicString& url);
+  QuicClientPromisedInfo* GetPromised(const std::string& url);
 
   // Called by client code, to initiate rendezvous between a request
   // and a server push stream.  If |request|'s url is in the index,
diff --git a/quic/core/http/quic_client_push_promise_index_test.cc b/quic/core/http/quic_client_push_promise_index_test.cc
index b68b41f..a4a0ee6 100644
--- a/quic/core/http/quic_client_push_promise_index_test.cc
+++ b/quic/core/http/quic_client_push_promise_index_test.cc
@@ -73,7 +73,7 @@
   MockQuicSpdyClientSession session_;
   QuicClientPushPromiseIndex index_;
   spdy::SpdyHeaderBlock request_;
-  QuicString url_;
+  std::string url_;
   MockQuicClientPromisedInfo promised_;
   QuicClientPushPromiseIndex::TryHandle* handle_;
 };
diff --git a/quic/core/http/quic_header_list.cc b/quic/core/http/quic_header_list.cc
index cb10248..e937cf2 100644
--- a/quic/core/http/quic_header_list.cc
+++ b/quic/core/http/quic_header_list.cc
@@ -40,7 +40,7 @@
     current_header_list_size_ += name.size();
     current_header_list_size_ += value.size();
     current_header_list_size_ += spdy::kPerHeaderOverhead;
-    header_list_.emplace_back(QuicString(name), QuicString(value));
+    header_list_.emplace_back(std::string(name), std::string(value));
   }
 }
 
@@ -60,8 +60,8 @@
   compressed_header_bytes_ = 0;
 }
 
-QuicString QuicHeaderList::DebugString() const {
-  QuicString s = "{ ";
+std::string QuicHeaderList::DebugString() const {
+  std::string s = "{ ";
   for (const auto& p : *this) {
     s.append(p.first + "=" + p.second + ", ");
   }
diff --git a/quic/core/http/quic_header_list.h b/quic/core/http/quic_header_list.h
index c7b4c80..b62cba4 100644
--- a/quic/core/http/quic_header_list.h
+++ b/quic/core/http/quic_header_list.h
@@ -23,7 +23,7 @@
 class QUIC_EXPORT_PRIVATE QuicHeaderList
     : public spdy::SpdyHeadersHandlerInterface {
  public:
-  typedef QuicDeque<std::pair<QuicString, QuicString>> ListType;
+  typedef QuicDeque<std::pair<std::string, std::string>> ListType;
   typedef ListType::const_iterator const_iterator;
 
   QuicHeaderList();
@@ -56,10 +56,10 @@
 
   size_t max_header_list_size() const { return max_header_list_size_; }
 
-  QuicString DebugString() const;
+  std::string DebugString() const;
 
  private:
-  QuicDeque<std::pair<QuicString, QuicString>> header_list_;
+  QuicDeque<std::pair<std::string, std::string>> header_list_;
 
   // The limit on the size of the header list (defined by spec as name + value +
   // overhead for each header field). Headers over this limit will not be
@@ -76,8 +76,8 @@
 };
 
 inline bool operator==(const QuicHeaderList& l1, const QuicHeaderList& l2) {
-  auto pred = [](const std::pair<QuicString, QuicString>& p1,
-                 const std::pair<QuicString, QuicString>& p2) {
+  auto pred = [](const std::pair<std::string, std::string>& p1,
+                 const std::pair<std::string, std::string>& p2) {
     return p1.first == p2.first && p1.second == p2.second;
   };
   return std::equal(l1.begin(), l1.end(), l2.begin(), pred);
diff --git a/quic/core/http/quic_header_list_test.cc b/quic/core/http/quic_header_list_test.cc
index 1b2a394..c098715 100644
--- a/quic/core/http/quic_header_list_test.cc
+++ b/quic/core/http/quic_header_list_test.cc
@@ -24,8 +24,8 @@
 
 TEST_F(QuicHeaderListTest, TooLarge) {
   QuicHeaderList headers;
-  QuicString key = "key";
-  QuicString value(1 << 18, '1');
+  std::string key = "key";
+  std::string value(1 << 18, '1');
   // Send a header that exceeds max_header_list_size.
   headers.OnHeader(key, value);
   // Send a second header exceeding max_header_list_size.
@@ -42,8 +42,8 @@
 TEST_F(QuicHeaderListTest, NotTooLarge) {
   QuicHeaderList headers;
   headers.set_max_header_list_size(1 << 20);
-  QuicString key = "key";
-  QuicString value(1 << 18, '1');
+  std::string key = "key";
+  std::string value(1 << 18, '1');
   headers.OnHeader(key, value);
   size_t total_bytes = key.size() + value.size();
   headers.OnHeaderBlockEnd(total_bytes, total_bytes);
diff --git a/quic/core/http/quic_headers_stream_test.cc b/quic/core/http/quic_headers_stream_test.cc
index b6409b1..7059b72 100644
--- a/quic/core/http/quic_headers_stream_test.cc
+++ b/quic/core/http/quic_headers_stream_test.cc
@@ -344,10 +344,10 @@
   QuicHeadersStream* headers_stream_;
   SpdyHeaderBlock headers_;
   std::unique_ptr<TestHeadersHandler> headers_handler_;
-  QuicString body_;
-  QuicString saved_data_;
-  QuicString saved_header_data_;
-  QuicString saved_payloads_;
+  std::string body_;
+  std::string saved_data_;
+  std::string saved_header_data_;
+  std::string saved_payloads_;
   std::unique_ptr<SpdyFramer> framer_;
   std::unique_ptr<http2::Http2DecoderAdapter> deframer_;
   StrictMock<MockVisitor> visitor_;
@@ -360,7 +360,8 @@
 };
 
 // Run all tests with each version and perspective (client or server).
-INSTANTIATE_TEST_SUITE_P(Tests, QuicHeadersStreamTest,
+INSTANTIATE_TEST_SUITE_P(Tests,
+                         QuicHeadersStreamTest,
                          ::testing::ValuesIn(GetTestParams()));
 
 TEST_P(QuicHeadersStreamTest, StreamId) {
@@ -539,9 +540,9 @@
   // We want to create a frame that is more than the SPDY Framer's max control
   // frame size, which is 16K, but less than the HPACK decoders max decode
   // buffer size, which is 32K.
-  headers_["key0"] = QuicString(1 << 13, '.');
-  headers_["key1"] = QuicString(1 << 13, '.');
-  headers_["key2"] = QuicString(1 << 13, '.');
+  headers_["key0"] = std::string(1 << 13, '.');
+  headers_["key1"] = std::string(1 << 13, '.');
+  headers_["key2"] = std::string(1 << 13, '.');
   for (QuicStreamId stream_id = client_id_1_; stream_id < client_id_3_;
        stream_id += next_stream_id_) {
     for (bool fin : {false, true}) {
@@ -725,9 +726,9 @@
 
   // Create some headers we expect to generate entries in HPACK's
   // dynamic table, in addition to content-length.
-  headers_["key0"] = QuicString(1 << 1, '.');
-  headers_["key1"] = QuicString(1 << 2, '.');
-  headers_["key2"] = QuicString(1 << 3, '.');
+  headers_["key0"] = std::string(1 << 1, '.');
+  headers_["key1"] = std::string(1 << 2, '.');
+  headers_["key2"] = std::string(1 << 3, '.');
   for (QuicStreamId stream_id = client_id_1_; stream_id < client_id_3_;
        stream_id += next_stream_id_) {
     for (bool fin : {false, true}) {
diff --git a/quic/core/http/quic_server_session_base.cc b/quic/core/http/quic_server_session_base.cc
index f240ece..6c6acdf 100644
--- a/quic/core/http/quic_server_session_base.cc
+++ b/quic/core/http/quic_server_session_base.cc
@@ -80,7 +80,7 @@
 }
 
 void QuicServerSessionBase::OnConnectionClosed(QuicErrorCode error,
-                                               const QuicString& error_details,
+                                               const std::string& error_details,
                                                ConnectionCloseSource source) {
   QuicSession::OnConnectionClosed(error, error_details, source);
   // In the unlikely event we get a connection close while doing an asynchronous
diff --git a/quic/core/http/quic_server_session_base.h b/quic/core/http/quic_server_session_base.h
index 55a8d60..7332640 100644
--- a/quic/core/http/quic_server_session_base.h
+++ b/quic/core/http/quic_server_session_base.h
@@ -47,7 +47,7 @@
 
   // Override the base class to cancel any ongoing asychronous crypto.
   void OnConnectionClosed(QuicErrorCode error,
-                          const QuicString& error_details,
+                          const std::string& error_details,
                           ConnectionCloseSource source) override;
 
   // Sends a server config update to the client, containing new bandwidth
@@ -66,7 +66,7 @@
   // client.
   void OnConfigNegotiated() override;
 
-  void set_serving_region(const QuicString& serving_region) {
+  void set_serving_region(const std::string& serving_region) {
     serving_region_ = serving_region;
   }
 
@@ -120,7 +120,7 @@
 
   // Text describing server location. Sent to the client as part of the bandwith
   // estimate in the source-address token. Optional, can be left empty.
-  QuicString serving_region_;
+  std::string serving_region_;
 
   // Time at which we send the last SCUP to the client.
   QuicTime last_scup_time_;
diff --git a/quic/core/http/quic_server_session_base_test.cc b/quic/core/http/quic_server_session_base_test.cc
index efc2388..5678b26 100644
--- a/quic/core/http/quic_server_session_base_test.cc
+++ b/quic/core/http/quic_server_session_base_test.cc
@@ -492,7 +492,7 @@
   int32_t bandwidth_estimate_kbytes_per_second = 123;
   int32_t max_bandwidth_estimate_kbytes_per_second = 134;
   int32_t max_bandwidth_estimate_timestamp = 1122334455;
-  const QuicString serving_region = "not a real region";
+  const std::string serving_region = "not a real region";
   session_->set_serving_region(serving_region);
 
   session_->UnregisterStreamPriority(
@@ -601,7 +601,7 @@
   copt.push_back(kBWRE);
   QuicConfigPeer::SetReceivedConnectionOptions(session_->config(), copt);
 
-  const QuicString kTestServingRegion = "a serving region";
+  const std::string kTestServingRegion = "a serving region";
   session_->set_serving_region(kTestServingRegion);
 
   // Set the time to be one hour + one second from the 0 baseline.
@@ -703,7 +703,7 @@
   std::vector<ParsedQuicVersion> packet_version_list = {GetParam()};
   std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket(
       TestConnectionId(1), EmptyQuicConnectionId(), true, false, 1,
-      QuicString(chlo.GetSerialized().AsStringPiece()), CONNECTION_ID_PRESENT,
+      std::string(chlo.GetSerialized().AsStringPiece()), CONNECTION_ID_PRESENT,
       CONNECTION_ID_ABSENT, PACKET_4BYTE_PACKET_NUMBER, &packet_version_list));
 
   EXPECT_CALL(stream_helper_, CanAcceptClientHello(_, _, _, _, _))
diff --git a/quic/core/http/quic_spdy_client_session.cc b/quic/core/http/quic_spdy_client_session.cc
index 9e8170b..45eb0ae 100644
--- a/quic/core/http/quic_spdy_client_session.cc
+++ b/quic/core/http/quic_spdy_client_session.cc
@@ -175,7 +175,7 @@
       this);
 }
 
-bool QuicSpdyClientSession::IsAuthorized(const QuicString& authority) {
+bool QuicSpdyClientSession::IsAuthorized(const std::string& authority) {
   return true;
 }
 
diff --git a/quic/core/http/quic_spdy_client_session.h b/quic/core/http/quic_spdy_client_session.h
index c92753b..3bb8168 100644
--- a/quic/core/http/quic_spdy_client_session.h
+++ b/quic/core/http/quic_spdy_client_session.h
@@ -43,7 +43,7 @@
   QuicCryptoClientStreamBase* GetMutableCryptoStream() override;
   const QuicCryptoClientStreamBase* GetCryptoStream() const override;
 
-  bool IsAuthorized(const QuicString& authority) override;
+  bool IsAuthorized(const std::string& authority) override;
 
   // QuicSpdyClientSessionBase methods:
   void OnProofValid(const QuicCryptoClientConfig::CachedState& cached) override;
diff --git a/quic/core/http/quic_spdy_client_session_base.cc b/quic/core/http/quic_spdy_client_session_base.cc
index 924ab36..b0dfc01 100644
--- a/quic/core/http/quic_spdy_client_session_base.cc
+++ b/quic/core/http/quic_spdy_client_session_base.cc
@@ -118,7 +118,7 @@
     return false;
   }
 
-  const QuicString url = SpdyUtils::GetPromisedUrlFromHeaders(headers);
+  const std::string url = SpdyUtils::GetPromisedUrlFromHeaders(headers);
   QuicClientPromisedInfo* old_promised = GetPromisedByUrl(url);
   if (old_promised) {
     QUIC_DVLOG(1) << "Promise for stream " << promised_id
@@ -150,7 +150,7 @@
 }
 
 QuicClientPromisedInfo* QuicSpdyClientSessionBase::GetPromisedByUrl(
-    const QuicString& url) {
+    const std::string& url) {
   auto it = push_promise_index_->promised_by_url()->find(url);
   if (it != push_promise_index_->promised_by_url()->end()) {
     return it->second;
diff --git a/quic/core/http/quic_spdy_client_session_base.h b/quic/core/http/quic_spdy_client_session_base.h
index f27708c..a47bdd0 100644
--- a/quic/core/http/quic_spdy_client_session_base.h
+++ b/quic/core/http/quic_spdy_client_session_base.h
@@ -6,8 +6,8 @@
 #define QUICHE_QUIC_CORE_HTTP_QUIC_SPDY_CLIENT_SESSION_BASE_H_
 
 #include "base/macros.h"
-#include "net/third_party/quiche/src/quic/core/quic_crypto_client_stream.h"
 #include "net/third_party/quiche/src/quic/core/http/quic_spdy_session.h"
+#include "net/third_party/quiche/src/quic/core/quic_crypto_client_stream.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_containers.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
 #include "net/third_party/quiche/src/quic/platform/api/quic_string.h"
@@ -25,7 +25,7 @@
 // session affinity for requests corresponding to cross-origin push
 // promised streams.
 using QuicPromisedByUrlMap =
-    QuicUnorderedMap<QuicString, QuicClientPromisedInfo*>;
+    QuicUnorderedMap<std::string, QuicClientPromisedInfo*>;
 
 // The maximum time a promises stream can be reserved without being
 // claimed by a client request.
@@ -80,10 +80,10 @@
   // list in the certificate should contain a matching DNS name, or IP
   // address.  |hostname| is derived from the ":authority" header field of
   // the PUSH_PROMISE frame, port if present there will be dropped.
-  virtual bool IsAuthorized(const QuicString& hostname) = 0;
+  virtual bool IsAuthorized(const std::string& hostname) = 0;
 
   // Session retains ownership.
-  QuicClientPromisedInfo* GetPromisedByUrl(const QuicString& url);
+  QuicClientPromisedInfo* GetPromisedByUrl(const std::string& url);
   // Session retains ownership.
   QuicClientPromisedInfo* GetPromisedById(const QuicStreamId id);
 
diff --git a/quic/core/http/quic_spdy_client_session_test.cc b/quic/core/http/quic_spdy_client_session_test.cc
index 3a40043..6b80196 100644
--- a/quic/core/http/quic_spdy_client_session_test.cc
+++ b/quic/core/http/quic_spdy_client_session_test.cc
@@ -165,7 +165,7 @@
   std::unique_ptr<TestQuicSpdyClientSession> session_;
   QuicClientPushPromiseIndex push_promise_index_;
   SpdyHeaderBlock push_promise_;
-  QuicString promise_url_;
+  std::string promise_url_;
   QuicStreamId promised_stream_id_;
   QuicStreamId associated_stream_id_;
 };
@@ -636,7 +636,8 @@
         session_->HandlePromised(associated_stream_id_, id, push_promise_));
 
     // Verify that the promise is in the unclaimed streams map.
-    QuicString promise_url(SpdyUtils::GetPromisedUrlFromHeaders(push_promise_));
+    std::string promise_url(
+        SpdyUtils::GetPromisedUrlFromHeaders(push_promise_));
     EXPECT_NE(session_->GetPromisedByUrl(promise_url), nullptr);
     EXPECT_NE(session_->GetPromisedById(id), nullptr);
   }
@@ -654,7 +655,7 @@
       session_->HandlePromised(associated_stream_id_, id, push_promise_));
 
   // Verify that the promise was not created.
-  QuicString promise_url(SpdyUtils::GetPromisedUrlFromHeaders(push_promise_));
+  std::string promise_url(SpdyUtils::GetPromisedUrlFromHeaders(push_promise_));
   EXPECT_EQ(session_->GetPromisedById(id), nullptr);
   EXPECT_EQ(session_->GetPromisedByUrl(promise_url), nullptr);
 }
diff --git a/quic/core/http/quic_spdy_client_stream.h b/quic/core/http/quic_spdy_client_stream.h
index 8a66740..521914a 100644
--- a/quic/core/http/quic_spdy_client_stream.h
+++ b/quic/core/http/quic_spdy_client_stream.h
@@ -57,7 +57,7 @@
                      bool fin);
 
   // Returns the response data.
-  const QuicString& data() { return data_; }
+  const std::string& data() { return data_; }
 
   // Returns whatever headers have been received for this stream.
   const spdy::SpdyHeaderBlock& response_headers() { return response_headers_; }
@@ -83,7 +83,7 @@
   // The parsed content-length, or -1 if none is specified.
   int64_t content_length_;
   int response_code_;
-  QuicString data_;
+  std::string data_;
   size_t header_bytes_read_;
   size_t header_bytes_written_;
 
diff --git a/quic/core/http/quic_spdy_client_stream_test.cc b/quic/core/http/quic_spdy_client_stream_test.cc
index 0b2c157..3c56630 100644
--- a/quic/core/http/quic_spdy_client_stream_test.cc
+++ b/quic/core/http/quic_spdy_client_stream_test.cc
@@ -97,7 +97,7 @@
   std::unique_ptr<QuicSpdyClientStream> stream_;
   std::unique_ptr<StreamVisitor> stream_visitor_;
   SpdyHeaderBlock headers_;
-  QuicString body_;
+  std::string body_;
   HttpEncoder encoder_;
 };
 
@@ -124,10 +124,10 @@
   std::unique_ptr<char[]> buffer;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body_.length(), &buffer);
-  QuicString header = QuicString(buffer.get(), header_length);
-  QuicString data = VersionHasDataFrameHeader(connection_->transport_version())
-                        ? header + body_
-                        : body_;
+  std::string header = std::string(buffer.get(), header_length);
+  std::string data = VersionHasDataFrameHeader(connection_->transport_version())
+                         ? header + body_
+                         : body_;
   stream_->OnStreamFrame(
       QuicStreamFrame(stream_->id(), /*fin=*/false, /*offset=*/0, data));
   EXPECT_EQ("200", stream_->response_headers().find(":status")->second);
@@ -155,10 +155,10 @@
   std::unique_ptr<char[]> buffer;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body_.length(), &buffer);
-  QuicString header = QuicString(buffer.get(), header_length);
-  QuicString data = VersionHasDataFrameHeader(connection_->transport_version())
-                        ? header + body_
-                        : body_;
+  std::string header = std::string(buffer.get(), header_length);
+  std::string data = VersionHasDataFrameHeader(connection_->transport_version())
+                         ? header + body_
+                         : body_;
   stream_->OnStreamFrame(
       QuicStreamFrame(stream_->id(), /*fin=*/false, /*offset=*/0, data));
   EXPECT_EQ("200", stream_->response_headers().find(":status")->second);
@@ -168,7 +168,7 @@
 
 TEST_P(QuicSpdyClientStreamTest,
        QUIC_TEST_DISABLED_IN_CHROME(TestFramingExtraData)) {
-  QuicString large_body = "hello world!!!!!!";
+  std::string large_body = "hello world!!!!!!";
 
   auto headers = AsHeaderList(headers_);
   stream_->OnStreamHeaderList(false, headers.uncompressed_header_bytes(),
@@ -180,10 +180,10 @@
   std::unique_ptr<char[]> buffer;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(large_body.length(), &buffer);
-  QuicString header = QuicString(buffer.get(), header_length);
-  QuicString data = VersionHasDataFrameHeader(connection_->transport_version())
-                        ? header + large_body
-                        : large_body;
+  std::string header = std::string(buffer.get(), header_length);
+  std::string data = VersionHasDataFrameHeader(connection_->transport_version())
+                         ? header + large_body
+                         : large_body;
   EXPECT_CALL(*connection_, SendControlFrame(_));
   EXPECT_CALL(*connection_,
               OnStreamReset(stream_->id(), QUIC_BAD_APPLICATION_PAYLOAD));
@@ -219,10 +219,10 @@
   std::unique_ptr<char[]> buffer;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body_.length(), &buffer);
-  QuicString header = QuicString(buffer.get(), header_length);
-  QuicString data = VersionHasDataFrameHeader(connection_->transport_version())
-                        ? header + body_
-                        : body_;
+  std::string header = std::string(buffer.get(), header_length);
+  std::string data = VersionHasDataFrameHeader(connection_->transport_version())
+                         ? header + body_
+                         : body_;
   stream_->OnStreamFrame(
       QuicStreamFrame(stream_->id(), /*fin=*/false, /*offset=*/0, data));
   EXPECT_TRUE(stream_->reading_stopped());
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc
index ddae51a..415129e 100644
--- a/quic/core/http/quic_spdy_session.cc
+++ b/quic/core/http/quic_spdy_session.cc
@@ -283,7 +283,7 @@
   }
 
  private:
-  void CloseConnection(const QuicString& details, QuicErrorCode code) {
+  void CloseConnection(const std::string& details, QuicErrorCode code) {
     if (session_->IsConnected()) {
       session_->CloseConnectionWithDetails(code, details);
     }
@@ -419,8 +419,8 @@
     // byte offset necessary for flow control and open stream accounting.
     size_t final_byte_offset = 0;
     for (const auto& header : header_list) {
-      const QuicString& header_key = header.first;
-      const QuicString& header_value = header.second;
+      const std::string& header_key = header.first;
+      const std::string& header_value = header.second;
       if (header_key == kFinalOffsetHeaderKey) {
         if (!QuicTextUtils::StringToSizeT(header_value, &final_byte_offset)) {
           connection()->CloseConnection(
@@ -577,7 +577,8 @@
                                           QuicStreamId promised_stream_id,
                                           size_t frame_len,
                                           const QuicHeaderList& header_list) {
-  QuicString error = "OnPromiseHeaderList should be overridden in client code.";
+  std::string error =
+      "OnPromiseHeaderList should be overridden in client code.";
   QUIC_BUG << error;
   connection()->CloseConnection(QUIC_INTERNAL_ERROR, error,
                                 ConnectionCloseBehavior::SILENT_CLOSE);
@@ -688,7 +689,7 @@
 }
 
 void QuicSpdySession::CloseConnectionWithDetails(QuicErrorCode error,
-                                                 const QuicString& details) {
+                                                 const std::string& details) {
   connection()->CloseConnection(
       error, details, ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
 }
diff --git a/quic/core/http/quic_spdy_session.h b/quic/core/http/quic_spdy_session.h
index 93067fa..c13daeb 100644
--- a/quic/core/http/quic_spdy_session.h
+++ b/quic/core/http/quic_spdy_session.h
@@ -153,7 +153,7 @@
   virtual bool ShouldReleaseHeadersStreamSequencerBuffer();
 
   void CloseConnectionWithDetails(QuicErrorCode error,
-                                  const QuicString& details);
+                                  const std::string& details);
 
   void set_max_inbound_header_list_size(size_t max_inbound_header_list_size) {
     max_inbound_header_list_size_ = max_inbound_header_list_size;
diff --git a/quic/core/http/quic_spdy_session_test.cc b/quic/core/http/quic_spdy_session_test.cc
index 1c53472..1087493 100644
--- a/quic/core/http/quic_spdy_session_test.cc
+++ b/quic/core/http/quic_spdy_session_test.cc
@@ -64,7 +64,7 @@
     encryption_established_ = true;
     handshake_confirmed_ = true;
     CryptoHandshakeMessage msg;
-    QuicString error_details;
+    std::string error_details;
     session()->config()->SetInitialStreamFlowControlWindowToSend(
         kInitialStreamFlowControlWindowForTest);
     session()->config()->SetInitialSessionFlowControlWindowToSend(
@@ -569,7 +569,7 @@
   EXPECT_CALL(*connection_, SendControlFrame(_));
   EXPECT_CALL(*connection_, OnStreamReset(closed_stream_id, _));
   stream2->Reset(QUIC_BAD_APPLICATION_PAYLOAD);
-  QuicString msg =
+  std::string msg =
       QuicStrCat("Marking unknown stream ", closed_stream_id, " blocked.");
   EXPECT_QUIC_BUG(session_.MarkConnectionLevelWriteBlocked(closed_stream_id),
                   msg);
@@ -1086,7 +1086,7 @@
 
   // Create a stream, and send enough data to make it flow control blocked.
   TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
-  QuicString body(kMinimumFlowControlSendWindow, '.');
+  std::string body(kMinimumFlowControlSendWindow, '.');
   EXPECT_FALSE(stream2->flow_controller()->IsBlocked());
   EXPECT_FALSE(session_.IsConnectionFlowControlBlocked());
   EXPECT_FALSE(session_.IsStreamFlowControlBlocked());
@@ -1321,7 +1321,7 @@
   // adjusting the connection level flow control receive window to take into
   // account the total number of bytes sent by the peer.
   const QuicStreamOffset kByteOffset = 5678;
-  QuicString body = "hello";
+  std::string body = "hello";
   QuicStreamFrame frame(stream->id(), true, kByteOffset, QuicStringPiece(body));
   session_.OnStreamFrame(frame);
 
diff --git a/quic/core/http/quic_spdy_stream.cc b/quic/core/http/quic_spdy_stream.cc
index 9e9f1b7..cdd61c4 100644
--- a/quic/core/http/quic_spdy_stream.cc
+++ b/quic/core/http/quic_spdy_stream.cc
@@ -98,7 +98,7 @@
   }
 
  private:
-  void CloseConnectionOnWrongFrame(QuicString frame_type) {
+  void CloseConnectionOnWrongFrame(std::string frame_type) {
     stream_->session()->connection()->CloseConnection(
         QUIC_HTTP_DECODER_ERROR, frame_type + " frame received on data stream",
         ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
diff --git a/quic/core/http/quic_spdy_stream_body_buffer_test.cc b/quic/core/http/quic_spdy_stream_body_buffer_test.cc
index 7ea776f..deaf54a 100644
--- a/quic/core/http/quic_spdy_stream_body_buffer_test.cc
+++ b/quic/core/http/quic_spdy_stream_body_buffer_test.cc
@@ -25,7 +25,7 @@
   MOCK_METHOD0(OnFinRead, void());
   MOCK_METHOD0(OnDataAvailable, void());
   MOCK_METHOD2(CloseConnectionWithDetails,
-               void(QuicErrorCode error, const QuicString& details));
+               void(QuicErrorCode error, const std::string& details));
   MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error));
   MOCK_METHOD0(OnCanWrite, void());
   MOCK_METHOD1(AddBytesConsumed, void(QuicByteCount bytes));
@@ -61,7 +61,7 @@
 };
 
 TEST_F(QuicSpdyStreamBodyBufferTest, ReceiveBodies) {
-  QuicString body(1024, 'a');
+  std::string body(1024, 'a');
   EXPECT_FALSE(body_buffer_.HasBytesToRead());
   body_buffer_.OnDataHeader(Http3FrameLengths(3, 1024));
   body_buffer_.OnDataPayload(QuicStringPiece(body));
@@ -70,7 +70,7 @@
 }
 
 TEST_F(QuicSpdyStreamBodyBufferTest, PeekBody) {
-  QuicString body(1024, 'a');
+  std::string body(1024, 'a');
   body_buffer_.OnDataHeader(Http3FrameLengths(3, 1024));
   body_buffer_.OnDataPayload(QuicStringPiece(body));
   EXPECT_EQ(1024u, body_buffer_.total_body_bytes_received());
@@ -84,13 +84,13 @@
 // Buffer only receives 1 frame. Stream consumes less or equal than a frame.
 TEST_F(QuicSpdyStreamBodyBufferTest, MarkConsumedPartialSingleFrame) {
   testing::InSequence seq;
-  QuicString body(1024, 'a');
+  std::string body(1024, 'a');
   std::unique_ptr<char[]> buffer;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buffer);
-  QuicString header = QuicString(buffer.get(), header_length);
+  std::string header = std::string(buffer.get(), header_length);
   Http3FrameLengths lengths(header_length, 1024);
-  QuicString data = header + body;
+  std::string data = header + body;
   QuicStreamFrame frame(1, false, 0, data);
   sequencer_.OnStreamFrame(frame);
   body_buffer_.OnDataHeader(lengths);
@@ -104,25 +104,25 @@
 TEST_F(QuicSpdyStreamBodyBufferTest, MarkConsumedMultipleFrames) {
   testing::InSequence seq;
   // 1st frame.
-  QuicString body1(1024, 'a');
+  std::string body1(1024, 'a');
   std::unique_ptr<char[]> buffer;
   QuicByteCount header_length1 =
       encoder_.SerializeDataFrameHeader(body1.length(), &buffer);
-  QuicString header1 = QuicString(buffer.get(), header_length1);
+  std::string header1 = std::string(buffer.get(), header_length1);
   Http3FrameLengths lengths1(header_length1, 1024);
-  QuicString data1 = header1 + body1;
+  std::string data1 = header1 + body1;
   QuicStreamFrame frame1(1, false, 0, data1);
   sequencer_.OnStreamFrame(frame1);
   body_buffer_.OnDataHeader(lengths1);
   body_buffer_.OnDataPayload(QuicStringPiece(body1));
 
   // 2nd frame.
-  QuicString body2(2048, 'b');
+  std::string body2(2048, 'b');
   QuicByteCount header_length2 =
       encoder_.SerializeDataFrameHeader(body2.length(), &buffer);
-  QuicString header2 = QuicString(buffer.get(), header_length2);
+  std::string header2 = std::string(buffer.get(), header_length2);
   Http3FrameLengths lengths2(header_length2, 2048);
-  QuicString data2 = header2 + body2;
+  std::string data2 = header2 + body2;
   QuicStreamFrame frame2(1, false, data1.length(), data2);
   sequencer_.OnStreamFrame(frame2);
   body_buffer_.OnDataHeader(lengths2);
@@ -139,7 +139,7 @@
 }
 
 TEST_F(QuicSpdyStreamBodyBufferTest, MarkConsumedMoreThanBuffered) {
-  QuicString body(1024, 'a');
+  std::string body(1024, 'a');
   Http3FrameLengths lengths(3, 1024);
   body_buffer_.OnDataHeader(lengths);
   body_buffer_.OnDataPayload(body);
@@ -152,13 +152,13 @@
 // Buffer receives 1 frame. Stream read from the buffer.
 TEST_F(QuicSpdyStreamBodyBufferTest, ReadSingleBody) {
   testing::InSequence seq;
-  QuicString body(1024, 'a');
+  std::string body(1024, 'a');
   std::unique_ptr<char[]> buffer;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buffer);
-  QuicString header = QuicString(buffer.get(), header_length);
+  std::string header = std::string(buffer.get(), header_length);
   Http3FrameLengths lengths(header_length, 1024);
-  QuicString data = header + body;
+  std::string data = header + body;
   QuicStreamFrame frame(1, false, 0, data);
   sequencer_.OnStreamFrame(frame);
   body_buffer_.OnDataHeader(lengths);
@@ -179,25 +179,25 @@
 TEST_F(QuicSpdyStreamBodyBufferTest, ReadMultipleBody) {
   testing::InSequence seq;
   // 1st frame.
-  QuicString body1(1024, 'a');
+  std::string body1(1024, 'a');
   std::unique_ptr<char[]> buffer;
   QuicByteCount header_length1 =
       encoder_.SerializeDataFrameHeader(body1.length(), &buffer);
-  QuicString header1 = QuicString(buffer.get(), header_length1);
+  std::string header1 = std::string(buffer.get(), header_length1);
   Http3FrameLengths lengths1(header_length1, 1024);
-  QuicString data1 = header1 + body1;
+  std::string data1 = header1 + body1;
   QuicStreamFrame frame1(1, false, 0, data1);
   sequencer_.OnStreamFrame(frame1);
   body_buffer_.OnDataHeader(lengths1);
   body_buffer_.OnDataPayload(QuicStringPiece(body1));
 
   // 2nd frame.
-  QuicString body2(2048, 'b');
+  std::string body2(2048, 'b');
   QuicByteCount header_length2 =
       encoder_.SerializeDataFrameHeader(body2.length(), &buffer);
-  QuicString header2 = QuicString(buffer.get(), header_length2);
+  std::string header2 = std::string(buffer.get(), header_length2);
   Http3FrameLengths lengths2(header_length2, 2048);
-  QuicString data2 = header2 + body2;
+  std::string data2 = header2 + body2;
   QuicStreamFrame frame2(1, false, data1.length(), data2);
   sequencer_.OnStreamFrame(frame2);
   body_buffer_.OnDataHeader(lengths2);
diff --git a/quic/core/http/quic_spdy_stream_test.cc b/quic/core/http/quic_spdy_stream_test.cc
index 1aabe0e..d61d197 100644
--- a/quic/core/http/quic_spdy_stream_test.cc
+++ b/quic/core/http/quic_spdy_stream_test.cc
@@ -67,7 +67,7 @@
     vec.iov_base = buffer;
     vec.iov_len = QUIC_ARRAYSIZE(buffer);
     size_t bytes_read = Readv(&vec, 1);
-    data_ += QuicString(buffer, bytes_read);
+    data_ += std::string(buffer, bytes_read);
   }
 
   MOCK_METHOD1(WriteHeadersMock, void(bool fin));
@@ -81,13 +81,13 @@
     return 0;
   }
 
-  const QuicString& data() const { return data_; }
+  const std::string& data() const { return data_; }
   const spdy::SpdyHeaderBlock& saved_headers() const { return saved_headers_; }
 
  private:
   bool should_process_data_;
   spdy::SpdyHeaderBlock saved_headers_;
-  QuicString data_;
+  std::string data_;
 };
 
 class TestMockUpdateStreamSession : public MockQuicSpdySession {
@@ -192,7 +192,8 @@
   HttpEncoder encoder_;
 };
 
-INSTANTIATE_TEST_SUITE_P(Tests, QuicSpdyStreamTest,
+INSTANTIATE_TEST_SUITE_P(Tests,
+                         QuicSpdyStreamTest,
                          ::testing::ValuesIn(AllSupportedVersions()));
 
 TEST_P(QuicSpdyStreamTest, ProcessHeaderList) {
@@ -295,7 +296,7 @@
 TEST_P(QuicSpdyStreamTest, MarkHeadersConsumed) {
   Initialize(kShouldProcessData);
 
-  QuicString body = "this is the body";
+  std::string body = "this is the body";
   QuicHeaderList headers = ProcessHeaders(false, headers_);
   EXPECT_EQ(headers, stream_->header_list());
 
@@ -306,12 +307,12 @@
 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBody) {
   Initialize(kShouldProcessData);
 
-  QuicString body = "this is the body";
+  std::string body = "this is the body";
   std::unique_ptr<char[]> buffer;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buffer);
-  QuicString header = QuicString(buffer.get(), header_length);
-  QuicString data = HasFrameHeader() ? header + body : body;
+  std::string header = std::string(buffer.get(), header_length);
+  std::string data = HasFrameHeader() ? header + body : body;
 
   EXPECT_EQ("", stream_->data());
   QuicHeaderList headers = ProcessHeaders(false, headers_);
@@ -326,12 +327,12 @@
 
 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyFragments) {
   Initialize(kShouldProcessData);
-  QuicString body = "this is the body";
+  std::string body = "this is the body";
   std::unique_ptr<char[]> buffer;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buffer);
-  QuicString header = QuicString(buffer.get(), header_length);
-  QuicString data = HasFrameHeader() ? header + body : body;
+  std::string header = std::string(buffer.get(), header_length);
+  std::string data = HasFrameHeader() ? header + body : body;
 
   for (size_t fragment_size = 1; fragment_size < data.size(); ++fragment_size) {
     Initialize(kShouldProcessData);
@@ -352,12 +353,12 @@
 
 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyFragmentsSplit) {
   Initialize(kShouldProcessData);
-  QuicString body = "this is the body";
+  std::string body = "this is the body";
   std::unique_ptr<char[]> buffer;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buffer);
-  QuicString header = QuicString(buffer.get(), header_length);
-  QuicString data = HasFrameHeader() ? header + body : body;
+  std::string header = std::string(buffer.get(), header_length);
+  std::string data = HasFrameHeader() ? header + body : body;
 
   for (size_t split_point = 1; split_point < data.size() - 1; ++split_point) {
     Initialize(kShouldProcessData);
@@ -383,12 +384,12 @@
 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyReadv) {
   Initialize(!kShouldProcessData);
 
-  QuicString body = "this is the body";
+  std::string body = "this is the body";
   std::unique_ptr<char[]> buf;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buf);
-  QuicString header = QuicString(buf.get(), header_length);
-  QuicString data = HasFrameHeader() ? header + body : body;
+  std::string header = std::string(buf.get(), header_length);
+  std::string data = HasFrameHeader() ? header + body : body;
 
   ProcessHeaders(false, headers_);
   QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), false, 0,
@@ -404,17 +405,17 @@
 
   size_t bytes_read = stream_->Readv(&vec, 1);
   EXPECT_EQ(body.length(), bytes_read);
-  EXPECT_EQ(body, QuicString(buffer, bytes_read));
+  EXPECT_EQ(body, std::string(buffer, bytes_read));
 }
 
 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndLargeBodySmallReadv) {
   Initialize(kShouldProcessData);
-  QuicString body(12 * 1024, 'a');
+  std::string body(12 * 1024, 'a');
   std::unique_ptr<char[]> buf;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buf);
-  QuicString header = QuicString(buf.get(), header_length);
-  QuicString data = HasFrameHeader() ? header + body : body;
+  std::string header = std::string(buf.get(), header_length);
+  std::string data = HasFrameHeader() ? header + body : body;
   ProcessHeaders(false, headers_);
   QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), false, 0,
                         QuicStringPiece(data));
@@ -429,19 +430,19 @@
   vec[1].iov_len = QUIC_ARRAYSIZE(buffer2);
   size_t bytes_read = stream_->Readv(vec, 2);
   EXPECT_EQ(2048u * 2, bytes_read);
-  EXPECT_EQ(body.substr(0, 2048), QuicString(buffer, 2048));
-  EXPECT_EQ(body.substr(2048, 2048), QuicString(buffer2, 2048));
+  EXPECT_EQ(body.substr(0, 2048), std::string(buffer, 2048));
+  EXPECT_EQ(body.substr(2048, 2048), std::string(buffer2, 2048));
 }
 
 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyMarkConsumed) {
   Initialize(!kShouldProcessData);
 
-  QuicString body = "this is the body";
+  std::string body = "this is the body";
   std::unique_ptr<char[]> buf;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buf);
-  QuicString header = QuicString(buf.get(), header_length);
-  QuicString data = HasFrameHeader() ? header + body : body;
+  std::string header = std::string(buf.get(), header_length);
+  std::string data = HasFrameHeader() ? header + body : body;
 
   ProcessHeaders(false, headers_);
   QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), false, 0,
@@ -453,7 +454,7 @@
 
   EXPECT_EQ(1, stream_->GetReadableRegions(&vec, 1));
   EXPECT_EQ(body.length(), vec.iov_len);
-  EXPECT_EQ(body, QuicString(static_cast<char*>(vec.iov_base), vec.iov_len));
+  EXPECT_EQ(body, std::string(static_cast<char*>(vec.iov_base), vec.iov_len));
 
   stream_->MarkConsumed(body.length());
   EXPECT_EQ(data.length(), stream_->flow_controller()->bytes_consumed());
@@ -461,15 +462,15 @@
 
 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndConsumeMultipleBody) {
   Initialize(!kShouldProcessData);
-  QuicString body1 = "this is body 1";
-  QuicString body2 = "body 2";
+  std::string body1 = "this is body 1";
+  std::string body2 = "body 2";
   std::unique_ptr<char[]> buf;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body1.length(), &buf);
-  QuicString header = QuicString(buf.get(), header_length);
-  QuicString data1 = HasFrameHeader() ? header + body1 : body1;
+  std::string header = std::string(buf.get(), header_length);
+  std::string data1 = HasFrameHeader() ? header + body1 : body1;
   header_length = encoder_.SerializeDataFrameHeader(body2.length(), &buf);
-  QuicString data2 = HasFrameHeader() ? header + body2 : body2;
+  std::string data2 = HasFrameHeader() ? header + body2 : body2;
 
   ProcessHeaders(false, headers_);
   QuicStreamFrame frame1(GetNthClientInitiatedBidirectionalId(0), false, 0,
@@ -488,12 +489,12 @@
 TEST_P(QuicSpdyStreamTest, ProcessHeadersAndBodyIncrementalReadv) {
   Initialize(!kShouldProcessData);
 
-  QuicString body = "this is the body";
+  std::string body = "this is the body";
   std::unique_ptr<char[]> buf;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buf);
-  QuicString header = QuicString(buf.get(), header_length);
-  QuicString data = HasFrameHeader() ? header + body : body;
+  std::string header = std::string(buf.get(), header_length);
+  std::string data = HasFrameHeader() ? header + body : body;
 
   ProcessHeaders(false, headers_);
   QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), false, 0,
@@ -516,12 +517,12 @@
 TEST_P(QuicSpdyStreamTest, ProcessHeadersUsingReadvWithMultipleIovecs) {
   Initialize(!kShouldProcessData);
 
-  QuicString body = "this is the body";
+  std::string body = "this is the body";
   std::unique_ptr<char[]> buf;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buf);
-  QuicString header = QuicString(buf.get(), header_length);
-  QuicString data = HasFrameHeader() ? header + body : body;
+  std::string header = std::string(buf.get(), header_length);
+  std::string data = HasFrameHeader() ? header + body : body;
 
   ProcessHeaders(false, headers_);
   QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), false, 0,
@@ -560,7 +561,7 @@
 
   // Try to send more data than the flow control limit allows.
   const uint64_t kOverflow = 15;
-  QuicString body(kWindow + kOverflow, 'a');
+  std::string body(kWindow + kOverflow, 'a');
 
   const uint64_t kHeaderLength = HasFrameHeader() ? 2 : 0;
   if (HasFrameHeader()) {
@@ -602,14 +603,14 @@
                          stream_->flow_controller()));
 
   // Stream receives enough data to fill a fraction of the receive window.
-  QuicString body(kWindow / 3, 'a');
+  std::string body(kWindow / 3, 'a');
   QuicByteCount header_length = 0;
-  QuicString data;
+  std::string data;
 
   if (HasFrameHeader()) {
     std::unique_ptr<char[]> buffer;
     header_length = encoder_.SerializeDataFrameHeader(body.length(), &buffer);
-    QuicString header = QuicString(buffer.get(), header_length);
+    std::string header = std::string(buffer.get(), header_length);
     data = header + body;
   } else {
     data = body;
@@ -651,14 +652,14 @@
                          stream_->flow_controller()));
 
   // Stream receives enough data to fill a fraction of the receive window.
-  QuicString body(kWindow / 3, 'a');
+  std::string body(kWindow / 3, 'a');
   QuicByteCount header_length = 0;
-  QuicString data;
+  std::string data;
 
   if (HasFrameHeader()) {
     std::unique_ptr<char[]> buffer;
     header_length = encoder_.SerializeDataFrameHeader(body.length(), &buffer);
-    QuicString header = QuicString(buffer.get(), header_length);
+    std::string header = std::string(buffer.get(), header_length);
     data = header + body;
   } else {
     data = body;
@@ -719,24 +720,24 @@
   // Each stream gets a quarter window of data. This should not trigger a
   // WINDOW_UPDATE for either stream, nor for the connection.
   QuicByteCount header_length = 0;
-  QuicString body;
-  QuicString data;
-  QuicString data2;
-  QuicString body2(1, 'a');
+  std::string body;
+  std::string data;
+  std::string data2;
+  std::string body2(1, 'a');
 
   if (HasFrameHeader()) {
-    body = QuicString(kWindow / 4 - 2, 'a');
+    body = std::string(kWindow / 4 - 2, 'a');
     std::unique_ptr<char[]> buffer;
     header_length = encoder_.SerializeDataFrameHeader(body.length(), &buffer);
-    QuicString header = QuicString(buffer.get(), header_length);
+    std::string header = std::string(buffer.get(), header_length);
     data = header + body;
     std::unique_ptr<char[]> buffer2;
     QuicByteCount header_length2 =
         encoder_.SerializeDataFrameHeader(body2.length(), &buffer2);
-    QuicString header2 = QuicString(buffer2.get(), header_length2);
+    std::string header2 = std::string(buffer2.get(), header_length2);
     data2 = header2 + body2;
   } else {
-    body = QuicString(kWindow / 4, 'a');
+    body = std::string(kWindow / 4, 'a');
     data = body;
     data2 = body2;
   }
@@ -773,12 +774,12 @@
   ProcessHeaders(false, headers_);
 
   // Receive data to overflow the window, violating flow control.
-  QuicString body(kWindow + 1, 'a');
+  std::string body(kWindow + 1, 'a');
   std::unique_ptr<char[]> buf;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buf);
-  QuicString header = QuicString(buf.get(), header_length);
-  QuicString data = HasFrameHeader() ? header + body : body;
+  std::string header = std::string(buf.get(), header_length);
+  std::string data = HasFrameHeader() ? header + body : body;
   QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), false, 0,
                         QuicStringPiece(data));
   EXPECT_CALL(*connection_,
@@ -816,12 +817,12 @@
   ProcessHeaders(false, headers_);
 
   // Send enough data to overflow the connection level flow control window.
-  QuicString body(kConnectionWindow + 1, 'a');
+  std::string body(kConnectionWindow + 1, 'a');
   std::unique_ptr<char[]> buf;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buf);
-  QuicString header = QuicString(buf.get(), header_length);
-  QuicString data = HasFrameHeader() ? header + body : body;
+  std::string header = std::string(buf.get(), header_length);
+  std::string data = HasFrameHeader() ? header + body : body;
 
   EXPECT_LT(data.size(), kStreamWindow);
   QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), false, 0,
@@ -844,7 +845,7 @@
                     stream_->flow_controller()));
 
   // Send a frame with a FIN but no data. This should not be blocked.
-  QuicString body = "";
+  std::string body = "";
   bool fin = true;
 
   EXPECT_CALL(*connection_,
@@ -906,12 +907,12 @@
   QuicHeaderList headers = ProcessHeaders(false, headers_);
   stream_->ConsumeHeaderList();
 
-  const QuicString body = "this is the body";
+  const std::string body = "this is the body";
   std::unique_ptr<char[]> buf;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buf);
-  QuicString header = QuicString(buf.get(), header_length);
-  QuicString data = HasFrameHeader() ? header + body : body;
+  std::string header = std::string(buf.get(), header_length);
+  std::string data = HasFrameHeader() ? header + body : body;
 
   // Receive trailing headers.
   SpdyHeaderBlock trailers_block;
@@ -1041,12 +1042,12 @@
   stream_->ConsumeHeaderList();
 
   // Receive and consume body with FIN set, and no trailers.
-  QuicString body(1024, 'x');
+  std::string body(1024, 'x');
   std::unique_ptr<char[]> buf;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buf);
-  QuicString header = QuicString(buf.get(), header_length);
-  QuicString data = HasFrameHeader() ? header + body : body;
+  std::string header = std::string(buf.get(), header_length);
+  std::string data = HasFrameHeader() ? header + body : body;
 
   QuicStreamFrame frame(GetNthClientInitiatedBidirectionalId(0), /*fin=*/true,
                         0, data);
@@ -1083,7 +1084,7 @@
 
   // Write non-zero body data to force a non-zero final offset.
   EXPECT_CALL(*session_, WritevData(_, _, _, _, _)).Times(AtLeast(1));
-  QuicString body(1024, 'x');  // 1 kB
+  std::string body(1024, 'x');  // 1 kB
   QuicByteCount header_length = 0;
   if (HasFrameHeader()) {
     std::unique_ptr<char[]> buf;
@@ -1116,7 +1117,7 @@
   // Write non-zero body data.
   EXPECT_CALL(*session_, WritevData(_, _, _, _, _)).Times(AtLeast(1));
   const int kBodySize = 1 * 1024;  // 1 kB
-  stream_->WriteOrBufferBody(QuicString(kBodySize, 'x'), false);
+  stream_->WriteOrBufferBody(std::string(kBodySize, 'x'), false);
   EXPECT_EQ(0u, stream_->BufferedDataBytes());
 
   // Headers and body have been fully written, there is no queued data. Writing
@@ -1143,7 +1144,7 @@
   }
   EXPECT_CALL(*session_, WritevData(_, _, kBodySize, _, NO_FIN))
       .WillOnce(Return(QuicConsumedData(kBodySize - 1, false)));
-  stream_->WriteOrBufferBody(QuicString(kBodySize, 'x'), false);
+  stream_->WriteOrBufferBody(std::string(kBodySize, 'x'), false);
   EXPECT_EQ(1u, stream_->BufferedDataBytes());
 
   // Writing trailers will send a FIN, but not close the write side of the
@@ -1201,11 +1202,11 @@
   QuicStreamFrame frame1(
       QuicUtils::GetHeadersStreamId(connection_->transport_version()), false, 0,
       "Header1");
-  QuicString header = "";
+  std::string header = "";
   if (HasFrameHeader()) {
     std::unique_ptr<char[]> buffer;
     QuicByteCount header_length = encoder_.SerializeDataFrameHeader(5, &buffer);
-    header = QuicString(buffer.get(), header_length);
+    header = std::string(buffer.get(), header_length);
   }
   QuicStreamFrame frame2(stream_->id(), true, 0, header + "Test1");
   QuicStreamFrame frame3(
@@ -1400,8 +1401,8 @@
   QuicReferenceCountedPointer<MockAckListener> mock_ack_listener(
       new StrictMock<MockAckListener>);
   stream_->set_ack_listener(mock_ack_listener);
-  QuicString body = "Test1";
-  QuicString body2(100, 'x');
+  std::string body = "Test1";
+  std::string body2(100, 'x');
 
   EXPECT_CALL(*session_, WritevData(_, _, _, _, _)).Times(AtLeast(1));
   stream_->WriteOrBufferBody(body, false);
@@ -1410,10 +1411,10 @@
   std::unique_ptr<char[]> buffer;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buffer);
-  QuicString header = QuicString(buffer.get(), header_length);
+  std::string header = std::string(buffer.get(), header_length);
 
   header_length = encoder_.SerializeDataFrameHeader(body2.length(), &buffer);
-  QuicString header2 = QuicString(buffer.get(), header_length);
+  std::string header2 = std::string(buffer.get(), header_length);
 
   EXPECT_CALL(*mock_ack_listener, OnPacketAcked(body.length(), _));
   QuicStreamFrame frame(stream_->id(), false, 0, header + body);
@@ -1445,8 +1446,8 @@
   QuicReferenceCountedPointer<MockAckListener> mock_ack_listener(
       new StrictMock<MockAckListener>);
   stream_->set_ack_listener(mock_ack_listener);
-  QuicString body = "Test1";
-  QuicString body2(100, 'x');
+  std::string body = "Test1";
+  std::string body2(100, 'x');
   struct iovec body1_iov = {const_cast<char*>(body.data()), body.length()};
   struct iovec body2_iov = {const_cast<char*>(body2.data()), body2.length()};
   QuicMemSliceStorage storage(&body1_iov, 1,
@@ -1460,10 +1461,10 @@
   std::unique_ptr<char[]> buffer;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buffer);
-  QuicString header = QuicString(buffer.get(), header_length);
+  std::string header = std::string(buffer.get(), header_length);
 
   header_length = encoder_.SerializeDataFrameHeader(body2.length(), &buffer);
-  QuicString header2 = QuicString(buffer.get(), header_length);
+  std::string header2 = std::string(buffer.get(), header_length);
 
   EXPECT_CALL(*mock_ack_listener,
               OnPacketAcked(body.length() + body2.length(), _));
@@ -1485,8 +1486,8 @@
   QuicReferenceCountedPointer<MockAckListener> mock_ack_listener(
       new StrictMock<MockAckListener>);
   stream_->set_ack_listener(mock_ack_listener);
-  QuicString body = "Test1";
-  QuicString body2(100, 'x');
+  std::string body = "Test1";
+  std::string body2(100, 'x');
 
   EXPECT_CALL(*session_, WritevData(_, _, _, _, _)).Times(AtLeast(1));
   stream_->WriteOrBufferBody(body, false);
@@ -1495,10 +1496,10 @@
   std::unique_ptr<char[]> buffer;
   QuicByteCount header_length =
       encoder_.SerializeDataFrameHeader(body.length(), &buffer);
-  QuicString header = QuicString(buffer.get(), header_length);
+  std::string header = std::string(buffer.get(), header_length);
 
   header_length = encoder_.SerializeDataFrameHeader(body2.length(), &buffer);
-  QuicString header2 = QuicString(buffer.get(), header_length);
+  std::string header2 = std::string(buffer.get(), header_length);
 
   EXPECT_CALL(*mock_ack_listener, OnPacketRetransmitted(body.length()));
   QuicStreamFrame frame(stream_->id(), false, 0, header + body);
diff --git a/quic/core/http/spdy_utils.cc b/quic/core/http/spdy_utils.cc
index 7022ae2..c3f312b 100644
--- a/quic/core/http/spdy_utils.cc
+++ b/quic/core/http/spdy_utils.cc
@@ -61,7 +61,7 @@
                                        int64_t* content_length,
                                        SpdyHeaderBlock* headers) {
   for (const auto& p : header_list) {
-    const QuicString& name = p.first;
+    const std::string& name = p.first;
     if (name.empty()) {
       QUIC_DLOG(ERROR) << "Header name must not be empty.";
       return false;
@@ -90,7 +90,7 @@
                                         SpdyHeaderBlock* trailers) {
   bool found_final_byte_offset = false;
   for (const auto& p : header_list) {
-    const QuicString& name = p.first;
+    const std::string& name = p.first;
 
     // Pull out the final offset pseudo header which indicates the number of
     // response body bytes expected.
@@ -129,7 +129,7 @@
 }
 
 // static
-QuicString SpdyUtils::GetPromisedUrlFromHeaders(
+std::string SpdyUtils::GetPromisedUrlFromHeaders(
     const SpdyHeaderBlock& headers) {
   // RFC 7540, Section 8.1.2.3: All HTTP/2 requests MUST include exactly
   // one valid value for the ":method", ":scheme", and ":path" pseudo-header
@@ -150,12 +150,12 @@
   // So the only methods allowed in a PUSH_PROMISE are GET and HEAD.
   SpdyHeaderBlock::const_iterator it = headers.find(":method");
   if (it == headers.end() || (it->second != "GET" && it->second != "HEAD")) {
-    return QuicString();
+    return std::string();
   }
 
   it = headers.find(":scheme");
   if (it == headers.end() || it->second.empty()) {
-    return QuicString();
+    return std::string();
   }
   QuicStringPiece scheme = it->second;
 
@@ -164,7 +164,7 @@
   // (see Section 10.1).
   it = headers.find(":authority");
   if (it == headers.end() || it->second.empty()) {
-    return QuicString();
+    return std::string();
   }
   QuicStringPiece authority = it->second;
 
@@ -175,7 +175,7 @@
   // is deferred to implementations in QuicUrlUtils::GetPushPromiseUrl().
   it = headers.find(":path");
   if (it == headers.end()) {
-    return QuicString();
+    return std::string();
   }
   QuicStringPiece path = it->second;
 
@@ -183,7 +183,7 @@
 }
 
 // static
-QuicString SpdyUtils::GetPromisedHostNameFromHeaders(
+std::string SpdyUtils::GetPromisedHostNameFromHeaders(
     const SpdyHeaderBlock& headers) {
   // TODO(fayang): Consider just checking out the value of the ":authority" key
   // in headers.
@@ -192,22 +192,22 @@
 
 // static
 bool SpdyUtils::PromisedUrlIsValid(const SpdyHeaderBlock& headers) {
-  QuicString url(GetPromisedUrlFromHeaders(headers));
+  std::string url(GetPromisedUrlFromHeaders(headers));
   return !url.empty() && GURL(url).is_valid();
 }
 
 // static
-bool SpdyUtils::PopulateHeaderBlockFromUrl(const QuicString url,
+bool SpdyUtils::PopulateHeaderBlockFromUrl(const std::string url,
                                            SpdyHeaderBlock* headers) {
   (*headers)[":method"] = "GET";
   size_t pos = url.find("://");
-  if (pos == QuicString::npos) {
+  if (pos == std::string::npos) {
     return false;
   }
   (*headers)[":scheme"] = url.substr(0, pos);
   size_t start = pos + 3;
   pos = url.find("/", start);
-  if (pos == QuicString::npos) {
+  if (pos == std::string::npos) {
     (*headers)[":authority"] = url.substr(start);
     (*headers)[":path"] = "/";
     return true;
@@ -218,9 +218,9 @@
 }
 
 // static
-QuicString SpdyUtils::GetPushPromiseUrl(QuicStringPiece scheme,
-                                        QuicStringPiece authority,
-                                        QuicStringPiece path) {
+std::string SpdyUtils::GetPushPromiseUrl(QuicStringPiece scheme,
+                                         QuicStringPiece authority,
+                                         QuicStringPiece path) {
   // RFC 7540, Section 8.1.2.3: The ":path" pseudo-header field includes the
   // path and query parts of the target URI (the "path-absolute" production
   // and optionally a '?' character followed by the "query" production (see
@@ -249,7 +249,7 @@
   // 8.1.2.3 about OPTIONS requests does not apply here (i.e. ":path" cannot be
   // "*").
   if (path.empty() || path[0] != '/' || (path.size() >= 2 && path[1] == '/')) {
-    return QuicString();
+    return std::string();
   }
 
   // Validate the scheme; this is to ensure a scheme of "foo://bar" is not
@@ -262,7 +262,7 @@
   if (!url::CanonicalizeScheme(scheme.data(), scheme_component,
                                &canon_scheme_output, &canon_component) ||
       !canon_component.is_nonempty() || canon_component.begin != 0) {
-    return QuicString();
+    return std::string();
   }
   canonical_scheme.resize(canon_component.len + 1);
 
@@ -285,14 +285,14 @@
   // it is performed later in processing, only "http" and "https" schemed
   // URIs are supported for PUSH.
   if (username_component.is_valid() || password_component.is_valid()) {
-    return QuicString();
+    return std::string();
   }
 
   // Failed parsing or no host present. ParseAuthority() will ensure that
   // host_component + port_component cover the entire string, if
   // username_component and password_component are not present.
   if (!host_component.is_nonempty()) {
-    return QuicString();
+    return std::string();
   }
 
   // Validate the port (if present; it's optional).
@@ -300,7 +300,7 @@
   if (port_component.is_nonempty()) {
     parsed_port_number = url::ParsePort(authority.data(), port_component);
     if (parsed_port_number < 0 && parsed_port_number != url::PORT_UNSPECIFIED) {
-      return QuicString();
+      return std::string();
     }
   }
 
@@ -312,7 +312,7 @@
   if (!url::CanonicalizeHost(authority.data(), host_component,
                              &canon_host_output, &canon_component) ||
       !canon_component.is_nonempty() || canon_component.begin != 0) {
-    return QuicString();
+    return std::string();
   }
 
   // At this point, "authority" has been validated to either be of the form
@@ -332,7 +332,7 @@
       origin_url.has_username() || origin_url.has_password() ||
       (origin_url.has_path() && origin_url.path_piece() != "/") ||
       origin_url.has_query() || origin_url.has_ref()) {
-    return QuicString();
+    return std::string();
   }
 
   // Attempt to parse the path.
@@ -344,7 +344,7 @@
   // fragment to the query.
   GURL full_url(spec);
   if (!full_url.is_valid() || full_url.has_ref()) {
-    return QuicString();
+    return std::string();
   }
 
   return full_url.spec();
diff --git a/quic/core/http/spdy_utils.h b/quic/core/http/spdy_utils.h
index 073eeeb..f356767 100644
--- a/quic/core/http/spdy_utils.h
+++ b/quic/core/http/spdy_utils.h
@@ -41,11 +41,11 @@
   // :path headers of a PUSH_PROMISE. Returns empty string if the headers do not
   // conform to HTTP/2 spec or if the ":method" header contains a forbidden
   // method for PUSH_PROMISE.
-  static QuicString GetPromisedUrlFromHeaders(
+  static std::string GetPromisedUrlFromHeaders(
       const spdy::SpdyHeaderBlock& headers);
 
   // Returns hostname, or empty string if missing.
-  static QuicString GetPromisedHostNameFromHeaders(
+  static std::string GetPromisedHostNameFromHeaders(
       const spdy::SpdyHeaderBlock& headers);
 
   // Returns true if result of |GetPromisedUrlFromHeaders()| is non-empty
@@ -54,15 +54,15 @@
 
   // Populates the fields of |headers| to make a GET request of |url|,
   // which must be fully-qualified.
-  static bool PopulateHeaderBlockFromUrl(const QuicString url,
+  static bool PopulateHeaderBlockFromUrl(const std::string url,
                                          spdy::SpdyHeaderBlock* headers);
 
   // Returns a canonical, valid URL for a PUSH_PROMISE with the specified
   // ":scheme", ":authority", and ":path" header fields, or an empty
   // string if the resulting URL is not valid or supported.
-  static QuicString GetPushPromiseUrl(QuicStringPiece scheme,
-                                      QuicStringPiece authority,
-                                      QuicStringPiece path);
+  static std::string GetPushPromiseUrl(QuicStringPiece scheme,
+                                       QuicStringPiece authority,
+                                       QuicStringPiece path);
 };
 
 }  // namespace quic
diff --git a/quic/core/http/spdy_utils_test.cc b/quic/core/http/spdy_utils_test.cc
index 6cd2f1d..5e6fbbf 100644
--- a/quic/core/http/spdy_utils_test.cc
+++ b/quic/core/http/spdy_utils_test.cc
@@ -39,7 +39,7 @@
                            {"cookie", "part3"},
 
                            // Already-delimited headers are passed through.
-                           {"passed-through", QuicString("foo\0baz", 7)},
+                           {"passed-through", std::string("foo\0baz", 7)},
 
                            // Other headers are joined on \0.
                            {"joined", "value 1"},
@@ -374,7 +374,7 @@
 using PopulateHeaderBlockFromUrl = QuicTest;
 
 TEST_F(PopulateHeaderBlockFromUrl, NormalUsage) {
-  QuicString url = "https://www.google.com/index.html";
+  std::string url = "https://www.google.com/index.html";
   SpdyHeaderBlock headers;
   EXPECT_TRUE(SpdyUtils::PopulateHeaderBlockFromUrl(url, &headers));
   EXPECT_EQ("https", headers[":scheme"].as_string());
@@ -383,7 +383,7 @@
 }
 
 TEST_F(PopulateHeaderBlockFromUrl, UrlWithNoPath) {
-  QuicString url = "https://www.google.com";
+  std::string url = "https://www.google.com";
   SpdyHeaderBlock headers;
   EXPECT_TRUE(SpdyUtils::PopulateHeaderBlockFromUrl(url, &headers));
   EXPECT_EQ("https", headers[":scheme"].as_string());
diff --git a/quic/core/packet_number_indexed_queue_test.cc b/quic/core/packet_number_indexed_queue_test.cc
index 294d2a4..7643fe4 100644
--- a/quic/core/packet_number_indexed_queue_test.cc
+++ b/quic/core/packet_number_indexed_queue_test.cc
@@ -18,7 +18,7 @@
   PacketNumberIndexedQueueTest() {}
 
  protected:
-  PacketNumberIndexedQueue<QuicString> queue_;
+  PacketNumberIndexedQueue<std::string> queue_;
 };
 
 TEST_F(PacketNumberIndexedQueueTest, InitialState) {
diff --git a/quic/core/qpack/fuzzer/qpack_encoder_stream_sender_fuzzer.cc b/quic/core/qpack/fuzzer/qpack_encoder_stream_sender_fuzzer.cc
index 501a69f..bc4de90 100644
--- a/quic/core/qpack/fuzzer/qpack_encoder_stream_sender_fuzzer.cc
+++ b/quic/core/qpack/fuzzer/qpack_encoder_stream_sender_fuzzer.cc
@@ -35,7 +35,7 @@
         uint64_t name_index = provider.ConsumeIntegral<uint64_t>();
         uint16_t value_length =
             provider.ConsumeIntegralInRange<uint16_t>(0, kMaxStringLength);
-        QuicString value = provider.ConsumeRandomLengthString(value_length);
+        std::string value = provider.ConsumeRandomLengthString(value_length);
 
         sender.SendInsertWithNameReference(is_static, name_index, value);
         break;
@@ -43,10 +43,10 @@
       case 1: {
         uint16_t name_length =
             provider.ConsumeIntegralInRange<uint16_t>(0, kMaxStringLength);
-        QuicString name = provider.ConsumeRandomLengthString(name_length);
+        std::string name = provider.ConsumeRandomLengthString(name_length);
         uint16_t value_length =
             provider.ConsumeIntegralInRange<uint16_t>(0, kMaxStringLength);
-        QuicString value = provider.ConsumeRandomLengthString(value_length);
+        std::string value = provider.ConsumeRandomLengthString(value_length);
         sender.SendInsertWithoutNameReference(name, value);
         break;
       }
diff --git a/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc b/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc
index 7f75a0f..3c21964 100644
--- a/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc
+++ b/quic/core/qpack/fuzzer/qpack_round_trip_fuzzer.cc
@@ -32,8 +32,8 @@
       break;
     }
 
-    QuicString name;
-    QuicString value;
+    std::string name;
+    std::string value;
     switch (provider.ConsumeIntegral<uint8_t>()) {
       case 0:
         // Static table entry with no header value.
@@ -126,7 +126,7 @@
   // Encode header list.
   NoopDecoderStreamErrorDelegate decoder_stream_error_delegate;
   NoopEncoderStreamSenderDelegate encoder_stream_sender_delegate;
-  QuicString encoded_header_block = QpackEncode(
+  std::string encoded_header_block = QpackEncode(
       &decoder_stream_error_delegate, &encoder_stream_sender_delegate,
       fragment_size_generator, &header_list);
 
diff --git a/quic/core/qpack/offline/qpack_offline_decoder.cc b/quic/core/qpack/offline/qpack_offline_decoder.cc
index 2b02edd..137ee7c 100644
--- a/quic/core/qpack/offline/qpack_offline_decoder.cc
+++ b/quic/core/qpack/offline/qpack_offline_decoder.cc
@@ -107,7 +107,7 @@
     QuicStringPiece input_filename) {
   // Store data in |input_data_storage|; use a QuicStringPiece to efficiently
   // keep track of remaining portion yet to be decoded.
-  QuicString input_data_storage;
+  std::string input_data_storage;
   ReadFileContents(input_filename, &input_data_storage);
   QuicStringPiece input_data(input_data_storage);
 
@@ -166,7 +166,7 @@
     QuicStringPiece expected_headers_filename) {
   // Store data in |expected_headers_data_storage|; use a QuicStringPiece to
   // efficiently keep track of remaining portion yet to be decoded.
-  QuicString expected_headers_data_storage;
+  std::string expected_headers_data_storage;
   ReadFileContents(expected_headers_filename, &expected_headers_data_storage);
   QuicStringPiece expected_headers_data(expected_headers_data_storage);
 
diff --git a/quic/core/qpack/offline/qpack_offline_decoder_bin.cc b/quic/core/qpack/offline/qpack_offline_decoder_bin.cc
index a0319e6..a4f5373 100644
--- a/quic/core/qpack/offline/qpack_offline_decoder_bin.cc
+++ b/quic/core/qpack/offline/qpack_offline_decoder_bin.cc
@@ -15,7 +15,7 @@
   const char* usage =
       "Usage: qpack_offline_decoder input_filename expected_headers_filename "
       "....";
-  std::vector<quic::QuicString> args =
+  std::vector<std::string> args =
       quic::QuicParseCommandLineFlags(usage, argc, argv);
 
   if (args.size() < 2 || args.size() % 2 != 0) {
diff --git a/quic/core/qpack/qpack_decoded_headers_accumulator.h b/quic/core/qpack/qpack_decoded_headers_accumulator.h
index 47d4f63..889769f 100644
--- a/quic/core/qpack/qpack_decoded_headers_accumulator.h
+++ b/quic/core/qpack/qpack_decoded_headers_accumulator.h
@@ -56,7 +56,7 @@
   size_t uncompressed_header_bytes_;
   size_t compressed_header_bytes_;
   bool error_detected_;
-  QuicString error_message_;
+  std::string error_message_;
 };
 
 }  // namespace quic
diff --git a/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc b/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc
index 0c71b19..27c6fa1 100644
--- a/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc
+++ b/quic/core/qpack/qpack_decoded_headers_accumulator_test.cc
@@ -79,7 +79,7 @@
   EXPECT_CALL(decoder_stream_sender_delegate_,
               WriteDecoderStreamData(Eq(kHeaderAcknowledgement)));
 
-  QuicString encoded_data(QuicTextUtils::HexDecode("000023666f6f03626172"));
+  std::string encoded_data(QuicTextUtils::HexDecode("000023666f6f03626172"));
   EXPECT_TRUE(accumulator_.Decode(encoded_data));
   EXPECT_TRUE(accumulator_.EndHeaderBlock());
 
diff --git a/quic/core/qpack/qpack_decoder_stream_sender.cc b/quic/core/qpack/qpack_decoder_stream_sender.cc
index 141b64a..cdb3b35 100644
--- a/quic/core/qpack/qpack_decoder_stream_sender.cc
+++ b/quic/core/qpack/qpack_decoder_stream_sender.cc
@@ -23,7 +23,7 @@
 
   instruction_encoder_.Encode(InsertCountIncrementInstruction());
 
-  QuicString output;
+  std::string output;
 
   instruction_encoder_.Next(std::numeric_limits<size_t>::max(), &output);
   DCHECK(!instruction_encoder_.HasNext());
@@ -37,7 +37,7 @@
 
   instruction_encoder_.Encode(HeaderAcknowledgementInstruction());
 
-  QuicString output;
+  std::string output;
 
   instruction_encoder_.Next(std::numeric_limits<size_t>::max(), &output);
   DCHECK(!instruction_encoder_.HasNext());
@@ -50,7 +50,7 @@
 
   instruction_encoder_.Encode(StreamCancellationInstruction());
 
-  QuicString output;
+  std::string output;
 
   instruction_encoder_.Next(std::numeric_limits<size_t>::max(), &output);
   DCHECK(!instruction_encoder_.HasNext());
diff --git a/quic/core/qpack/qpack_decoder_test.cc b/quic/core/qpack/qpack_decoder_test.cc
index 7292c50..d6740c8 100644
--- a/quic/core/qpack/qpack_decoder_test.cc
+++ b/quic/core/qpack/qpack_decoder_test.cc
@@ -62,8 +62,10 @@
   const FragmentMode fragment_mode_;
 };
 
-INSTANTIATE_TEST_SUITE_P(, QpackDecoderTest, Values(FragmentMode::kSingleChunk,
-                                                  FragmentMode::kOctetByOctet));
+INSTANTIATE_TEST_SUITE_P(,
+                         QpackDecoderTest,
+                         Values(FragmentMode::kSingleChunk,
+                                FragmentMode::kOctetByOctet));
 
 TEST_P(QpackDecoderTest, NoPrefix) {
   EXPECT_CALL(handler_,
@@ -119,7 +121,7 @@
 
 TEST_P(QpackDecoderTest, MultipleLiteralEntries) {
   EXPECT_CALL(handler_, OnHeaderDecoded(Eq("foo"), Eq("bar")));
-  QuicString str(127, 'a');
+  std::string str(127, 'a');
   EXPECT_CALL(handler_, OnHeaderDecoded(Eq("foobaar"), QuicStringPiece(str)));
   EXPECT_CALL(handler_, OnDecodingCompleted());
   EXPECT_CALL(decoder_stream_sender_delegate_,
@@ -558,11 +560,11 @@
   DecodeEncoderStreamData(
       QuicTextUtils::HexDecode("6294e7"     // Name "foo".
                                "7fd903"));  // Value length 600.
-  QuicString header_value(600, 'Z');
+  std::string header_value(600, 'Z');
   DecodeEncoderStreamData(header_value);
 
   // Duplicate most recent entry 200 times.
-  DecodeEncoderStreamData(QuicString(200, '\x00'));
+  DecodeEncoderStreamData(std::string(200, '\x00'));
 
   // Now there is only one entry in the dynamic table, with absolute index 200.
 
diff --git a/quic/core/qpack/qpack_encoder_stream_receiver_test.cc b/quic/core/qpack/qpack_encoder_stream_receiver_test.cc
index 5685981..dcb2039 100644
--- a/quic/core/qpack/qpack_encoder_stream_receiver_test.cc
+++ b/quic/core/qpack/qpack_encoder_stream_receiver_test.cc
@@ -54,7 +54,7 @@
   // Value length does not fit in prefix.
   // 'Z' would be Huffman encoded to 8 bits, so no Huffman encoding is used.
   EXPECT_CALL(*delegate(),
-              OnInsertWithNameReference(false, 42, Eq(QuicString(127, 'Z'))));
+              OnInsertWithNameReference(false, 42, Eq(std::string(127, 'Z'))));
 
   Decode(QuicTextUtils::HexDecode(
       "c500"
@@ -88,8 +88,8 @@
   // Not Huffman encoded long strings; length does not fit on prefix.
   // 'Z' would be Huffman encoded to 8 bits, so no Huffman encoding is used.
   EXPECT_CALL(*delegate(),
-              OnInsertWithoutNameReference(Eq(QuicString(31, 'Z')),
-                                           Eq(QuicString(127, 'Z'))));
+              OnInsertWithoutNameReference(Eq(std::string(31, 'Z')),
+                                           Eq(std::string(127, 'Z'))));
 
   Decode(QuicTextUtils::HexDecode(
       "4000"
diff --git a/quic/core/qpack/qpack_encoder_stream_sender.cc b/quic/core/qpack/qpack_encoder_stream_sender.cc
index fb43046..6cd458a 100644
--- a/quic/core/qpack/qpack_encoder_stream_sender.cc
+++ b/quic/core/qpack/qpack_encoder_stream_sender.cc
@@ -28,7 +28,7 @@
 
   instruction_encoder_.Encode(InsertWithNameReferenceInstruction());
 
-  QuicString output;
+  std::string output;
 
   instruction_encoder_.Next(std::numeric_limits<size_t>::max(), &output);
   DCHECK(!instruction_encoder_.HasNext());
@@ -44,7 +44,7 @@
 
   instruction_encoder_.Encode(InsertWithoutNameReferenceInstruction());
 
-  QuicString output;
+  std::string output;
 
   instruction_encoder_.Next(std::numeric_limits<size_t>::max(), &output);
   DCHECK(!instruction_encoder_.HasNext());
@@ -57,7 +57,7 @@
 
   instruction_encoder_.Encode(DuplicateInstruction());
 
-  QuicString output;
+  std::string output;
 
   instruction_encoder_.Next(std::numeric_limits<size_t>::max(), &output);
   DCHECK(!instruction_encoder_.HasNext());
@@ -70,7 +70,7 @@
 
   instruction_encoder_.Encode(SetDynamicTableCapacityInstruction());
 
-  QuicString output;
+  std::string output;
 
   instruction_encoder_.Next(std::numeric_limits<size_t>::max(), &output);
   DCHECK(!instruction_encoder_.HasNext());
diff --git a/quic/core/qpack/qpack_encoder_stream_sender_test.cc b/quic/core/qpack/qpack_encoder_stream_sender_test.cc
index a850f18..a2e7376 100644
--- a/quic/core/qpack/qpack_encoder_stream_sender_test.cc
+++ b/quic/core/qpack/qpack_encoder_stream_sender_test.cc
@@ -51,7 +51,7 @@
           "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a"
           "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a"
           "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a"))));
-  stream_.SendInsertWithNameReference(false, 42, QuicString(127, 'Z'));
+  stream_.SendInsertWithNameReference(false, 42, std::string(127, 'Z'));
 }
 
 TEST_F(QpackEncoderStreamSenderTest, InsertWithoutNameReference) {
@@ -80,8 +80,8 @@
           "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a"
           "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a"
           "5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a"))));
-  stream_.SendInsertWithoutNameReference(QuicString(31, 'Z'),
-                                         QuicString(127, 'Z'));
+  stream_.SendInsertWithoutNameReference(std::string(31, 'Z'),
+                                         std::string(127, 'Z'));
 }
 
 TEST_F(QpackEncoderStreamSenderTest, Duplicate) {
diff --git a/quic/core/qpack/qpack_encoder_test.cc b/quic/core/qpack/qpack_encoder_test.cc
index 6dea968..939856d 100644
--- a/quic/core/qpack/qpack_encoder_test.cc
+++ b/quic/core/qpack/qpack_encoder_test.cc
@@ -24,7 +24,7 @@
   QpackEncoderTest() : fragment_mode_(GetParam()) {}
   ~QpackEncoderTest() override = default;
 
-  QuicString Encode(const spdy::SpdyHeaderBlock* header_list) {
+  std::string Encode(const spdy::SpdyHeaderBlock* header_list) {
     return QpackEncode(
         &decoder_stream_error_delegate_, &encoder_stream_sender_delegate_,
         FragmentModeToFragmentSizeGenerator(fragment_mode_), header_list);
@@ -44,7 +44,7 @@
 
 TEST_P(QpackEncoderTest, Empty) {
   spdy::SpdyHeaderBlock header_list;
-  QuicString output = Encode(&header_list);
+  std::string output = Encode(&header_list);
 
   EXPECT_EQ(QuicTextUtils::HexDecode("0000"), output);
 }
@@ -52,7 +52,7 @@
 TEST_P(QpackEncoderTest, EmptyName) {
   spdy::SpdyHeaderBlock header_list;
   header_list[""] = "foo";
-  QuicString output = Encode(&header_list);
+  std::string output = Encode(&header_list);
 
   EXPECT_EQ(QuicTextUtils::HexDecode("0000208294e7"), output);
 }
@@ -60,7 +60,7 @@
 TEST_P(QpackEncoderTest, EmptyValue) {
   spdy::SpdyHeaderBlock header_list;
   header_list["foo"] = "";
-  QuicString output = Encode(&header_list);
+  std::string output = Encode(&header_list);
 
   EXPECT_EQ(QuicTextUtils::HexDecode("00002a94e700"), output);
 }
@@ -68,7 +68,7 @@
 TEST_P(QpackEncoderTest, EmptyNameAndValue) {
   spdy::SpdyHeaderBlock header_list;
   header_list[""] = "";
-  QuicString output = Encode(&header_list);
+  std::string output = Encode(&header_list);
 
   EXPECT_EQ(QuicTextUtils::HexDecode("00002000"), output);
 }
@@ -76,7 +76,7 @@
 TEST_P(QpackEncoderTest, Simple) {
   spdy::SpdyHeaderBlock header_list;
   header_list["foo"] = "bar";
-  QuicString output = Encode(&header_list);
+  std::string output = Encode(&header_list);
 
   EXPECT_EQ(QuicTextUtils::HexDecode("00002a94e703626172"), output);
 }
@@ -85,8 +85,8 @@
   spdy::SpdyHeaderBlock header_list;
   header_list["foo"] = "bar";
   // 'Z' would be Huffman encoded to 8 bits, so no Huffman encoding is used.
-  header_list["ZZZZZZZ"] = QuicString(127, 'Z');
-  QuicString output = Encode(&header_list);
+  header_list["ZZZZZZZ"] = std::string(127, 'Z');
+  std::string output = Encode(&header_list);
 
   EXPECT_EQ(
       QuicTextUtils::HexDecode(
@@ -110,7 +110,7 @@
     header_list["accept-encoding"] = "gzip, deflate, br";
     header_list["location"] = "";
 
-    QuicString output = Encode(&header_list);
+    std::string output = Encode(&header_list);
     EXPECT_EQ(QuicTextUtils::HexDecode("0000d1dfcc"), output);
   }
   {
@@ -119,7 +119,7 @@
     header_list["accept-encoding"] = "compress";
     header_list["location"] = "foo";
 
-    QuicString output = Encode(&header_list);
+    std::string output = Encode(&header_list);
     EXPECT_EQ(QuicTextUtils::HexDecode("0000d45f108621e9aec2a11f5c8294e7"),
               output);
   }
@@ -128,7 +128,7 @@
     header_list[":method"] = "TRACE";
     header_list["accept-encoding"] = "";
 
-    QuicString output = Encode(&header_list);
+    std::string output = Encode(&header_list);
     EXPECT_EQ(QuicTextUtils::HexDecode("00005f000554524143455f1000"), output);
   }
 }
@@ -145,7 +145,7 @@
 
   // This indexed header field takes exactly three bytes:
   // two for the prefix, one for the indexed static entry.
-  QuicString output;
+  std::string output;
   progressive_encoder->Next(3, &output);
 
   EXPECT_EQ(QuicTextUtils::HexDecode("0000c1"), output);
diff --git a/quic/core/qpack/qpack_encoder_test_utils.cc b/quic/core/qpack/qpack_encoder_test_utils.cc
index b9a3263..dd1ccb3 100644
--- a/quic/core/qpack/qpack_encoder_test_utils.cc
+++ b/quic/core/qpack/qpack_encoder_test_utils.cc
@@ -15,7 +15,7 @@
 void NoopEncoderStreamSenderDelegate::WriteEncoderStreamData(
     QuicStringPiece data) {}
 
-QuicString QpackEncode(
+std::string QpackEncode(
     QpackEncoder::DecoderStreamErrorDelegate* decoder_stream_error_delegate,
     QpackEncoderStreamSender::Delegate* encoder_stream_sender_delegate,
     const FragmentSizeGenerator& fragment_size_generator,
@@ -25,7 +25,7 @@
   auto progressive_encoder =
       encoder.EncodeHeaderList(/* stream_id = */ 1, header_list);
 
-  QuicString output;
+  std::string output;
   while (progressive_encoder->HasNext()) {
     progressive_encoder->Next(fragment_size_generator(), &output);
   }
diff --git a/quic/core/qpack/qpack_encoder_test_utils.h b/quic/core/qpack/qpack_encoder_test_utils.h
index 03d05cb..cb27ab5 100644
--- a/quic/core/qpack/qpack_encoder_test_utils.h
+++ b/quic/core/qpack/qpack_encoder_test_utils.h
@@ -51,7 +51,7 @@
   MOCK_METHOD1(WriteEncoderStreamData, void(QuicStringPiece data));
 };
 
-QuicString QpackEncode(
+std::string QpackEncode(
     QpackEncoder::DecoderStreamErrorDelegate* decoder_stream_error_delegate,
     QpackEncoderStreamSender::Delegate* encoder_stream_sender_delegate,
     const FragmentSizeGenerator& fragment_size_generator,
diff --git a/quic/core/qpack/qpack_instruction_decoder.cc b/quic/core/qpack/qpack_instruction_decoder.cc
index dbb2076..96d1a61 100644
--- a/quic/core/qpack/qpack_instruction_decoder.cc
+++ b/quic/core/qpack/qpack_instruction_decoder.cc
@@ -228,7 +228,7 @@
     return;
   }
 
-  QuicString* const string =
+  std::string* const string =
       (field_->type == QpackInstructionFieldType::kName) ? &name_ : &value_;
   string->clear();
 
@@ -248,7 +248,7 @@
   DCHECK(field_->type == QpackInstructionFieldType::kName ||
          field_->type == QpackInstructionFieldType::kValue);
 
-  QuicString* const string =
+  std::string* const string =
       (field_->type == QpackInstructionFieldType::kName) ? &name_ : &value_;
   DCHECK_LT(string->size(), string_length_);
 
@@ -267,14 +267,14 @@
   DCHECK(field_->type == QpackInstructionFieldType::kName ||
          field_->type == QpackInstructionFieldType::kValue);
 
-  QuicString* const string =
+  std::string* const string =
       (field_->type == QpackInstructionFieldType::kName) ? &name_ : &value_;
   DCHECK_EQ(string->size(), string_length_);
 
   if (is_huffman_encoded_) {
     huffman_decoder_.Reset();
     // HpackHuffmanDecoder::Decode() cannot perform in-place decoding.
-    QuicString decoded_value;
+    std::string decoded_value;
     huffman_decoder_.Decode(*string, &decoded_value);
     if (!huffman_decoder_.InputProperlyTerminated()) {
       OnError("Error in Huffman-encoded string.");
diff --git a/quic/core/qpack/qpack_instruction_decoder.h b/quic/core/qpack/qpack_instruction_decoder.h
index 9d674c3..49fb0cc 100644
--- a/quic/core/qpack/qpack_instruction_decoder.h
+++ b/quic/core/qpack/qpack_instruction_decoder.h
@@ -61,8 +61,8 @@
   bool s_bit() const { return s_bit_; }
   uint64_t varint() const { return varint_; }
   uint64_t varint2() const { return varint2_; }
-  const QuicString& name() const { return name_; }
-  const QuicString& value() const { return value_; }
+  const std::string& name() const { return name_; }
+  const std::string& value() const { return value_; }
 
  private:
   enum class State {
@@ -114,8 +114,8 @@
   bool s_bit_;
   uint64_t varint_;
   uint64_t varint2_;
-  QuicString name_;
-  QuicString value_;
+  std::string name_;
+  std::string value_;
   // Whether the currently decoded header name or value is Huffman encoded.
   bool is_huffman_encoded_;
   // Length of string being read into |name_| or |value_|.
diff --git a/quic/core/qpack/qpack_instruction_encoder.cc b/quic/core/qpack/qpack_instruction_encoder.cc
index 72aa7fd..ff135bb 100644
--- a/quic/core/qpack/qpack_instruction_encoder.cc
+++ b/quic/core/qpack/qpack_instruction_encoder.cc
@@ -34,7 +34,7 @@
 }
 
 void QpackInstructionEncoder::Next(size_t max_encoded_bytes,
-                                   QuicString* output) {
+                                   std::string* output) {
   DCHECK(HasNext());
   DCHECK_NE(0u, max_encoded_bytes);
 
@@ -108,7 +108,7 @@
 }
 
 size_t QpackInstructionEncoder::DoVarintStart(size_t max_encoded_bytes,
-                                              QuicString* output) {
+                                              std::string* output) {
   DCHECK(field_->type == QpackInstructionFieldType::kVarint ||
          field_->type == QpackInstructionFieldType::kVarint2 ||
          field_->type == QpackInstructionFieldType::kName ||
@@ -149,7 +149,7 @@
 }
 
 size_t QpackInstructionEncoder::DoVarintResume(size_t max_encoded_bytes,
-                                               QuicString* output) {
+                                               std::string* output) {
   DCHECK(field_->type == QpackInstructionFieldType::kVarint ||
          field_->type == QpackInstructionFieldType::kVarint2 ||
          field_->type == QpackInstructionFieldType::kName ||
@@ -195,7 +195,7 @@
 }
 
 size_t QpackInstructionEncoder::DoWriteString(size_t max_encoded_bytes,
-                                              QuicString* output) {
+                                              std::string* output) {
   DCHECK(field_->type == QpackInstructionFieldType::kName ||
          field_->type == QpackInstructionFieldType::kValue);
 
diff --git a/quic/core/qpack/qpack_instruction_encoder.h b/quic/core/qpack/qpack_instruction_encoder.h
index 15d908a..c95ceec 100644
--- a/quic/core/qpack/qpack_instruction_encoder.h
+++ b/quic/core/qpack/qpack_instruction_encoder.h
@@ -45,7 +45,7 @@
   // Encodes the next up to |max_encoded_bytes| octets of the current
   // instruction, appending to |output|.  Must only be called when HasNext()
   // returns true.  |max_encoded_bytes| must be positive.
-  void Next(size_t max_encoded_bytes, QuicString* output);
+  void Next(size_t max_encoded_bytes, std::string* output);
 
  private:
   enum class State {
@@ -73,10 +73,10 @@
   void DoOpcode();
   void DoStartField();
   void DoStaticBit();
-  size_t DoVarintStart(size_t max_encoded_bytes, QuicString* output);
-  size_t DoVarintResume(size_t max_encoded_bytes, QuicString* output);
+  size_t DoVarintStart(size_t max_encoded_bytes, std::string* output);
+  size_t DoVarintResume(size_t max_encoded_bytes, std::string* output);
   void DoStartString();
-  size_t DoWriteString(size_t max_encoded_bytes, QuicString* output);
+  size_t DoWriteString(size_t max_encoded_bytes, std::string* output);
 
   // Storage for field values to be encoded.
   bool s_bit_;
@@ -89,7 +89,7 @@
 
   // Storage for the Huffman encoded string literal to be written if Huffman
   // encoding is used.
-  QuicString huffman_encoded_string_;
+  std::string huffman_encoded_string_;
 
   // If Huffman encoding is used, points to a substring of
   // |huffman_encoded_string_|.
diff --git a/quic/core/qpack/qpack_instruction_encoder_test.cc b/quic/core/qpack/qpack_instruction_encoder_test.cc
index 006476f..babbb8c 100644
--- a/quic/core/qpack/qpack_instruction_encoder_test.cc
+++ b/quic/core/qpack/qpack_instruction_encoder_test.cc
@@ -23,12 +23,12 @@
   ~QpackInstructionEncoderTest() override = default;
 
   // Encode |instruction| with fragment sizes dictated by |fragment_mode_|.
-  QuicString EncodeInstruction(const QpackInstruction* instruction) {
+  std::string EncodeInstruction(const QpackInstruction* instruction) {
     EXPECT_FALSE(encoder_.HasNext());
 
     FragmentSizeGenerator fragment_size_generator =
         FragmentModeToFragmentSizeGenerator(fragment_mode_);
-    QuicString output;
+    std::string output;
     encoder_.Encode(instruction);
     while (encoder_.HasNext()) {
       encoder_.Next(fragment_size_generator(), &output);
diff --git a/quic/core/qpack/qpack_progressive_encoder.cc b/quic/core/qpack/qpack_progressive_encoder.cc
index 41433ff..497465b 100644
--- a/quic/core/qpack/qpack_progressive_encoder.cc
+++ b/quic/core/qpack/qpack_progressive_encoder.cc
@@ -37,7 +37,7 @@
 }
 
 void QpackProgressiveEncoder::Next(size_t max_encoded_bytes,
-                                   QuicString* output) {
+                                   std::string* output) {
   DCHECK_NE(0u, max_encoded_bytes);
   DCHECK(HasNext());
 
diff --git a/quic/core/qpack/qpack_progressive_encoder.h b/quic/core/qpack/qpack_progressive_encoder.h
index 86cce55..8e204e2 100644
--- a/quic/core/qpack/qpack_progressive_encoder.h
+++ b/quic/core/qpack/qpack_progressive_encoder.h
@@ -36,7 +36,7 @@
   bool HasNext() const override;
 
   // Encodes up to |max_encoded_bytes| octets, appending to |output|.
-  void Next(size_t max_encoded_bytes, QuicString* output) override;
+  void Next(size_t max_encoded_bytes, std::string* output) override;
 
  private:
   const QuicStreamId stream_id_;
diff --git a/quic/core/qpack/qpack_round_trip_test.cc b/quic/core/qpack/qpack_round_trip_test.cc
index 700ff85..99d55fb 100644
--- a/quic/core/qpack/qpack_round_trip_test.cc
+++ b/quic/core/qpack/qpack_round_trip_test.cc
@@ -32,7 +32,7 @@
       const spdy::SpdyHeaderBlock& header_list) {
     NoopDecoderStreamErrorDelegate decoder_stream_error_delegate;
     NoopEncoderStreamSenderDelegate encoder_stream_sender_delegate;
-    QuicString encoded_header_block = QpackEncode(
+    std::string encoded_header_block = QpackEncode(
         &decoder_stream_error_delegate, &encoder_stream_sender_delegate,
         FragmentModeToFragmentSizeGenerator(encoding_fragment_mode_),
         &header_list);
@@ -90,8 +90,8 @@
   spdy::SpdyHeaderBlock header_list;
   header_list["foo"] = "bar";
   header_list[":path"] = "/";
-  header_list["foobaar"] = QuicString(127, 'Z');
-  header_list[QuicString(1000, 'b')] = QuicString(1000, 'c');
+  header_list["foobaar"] = std::string(127, 'Z');
+  header_list[std::string(1000, 'b')] = std::string(1000, 'c');
 
   spdy::SpdyHeaderBlock output = EncodeThenDecode(header_list);
   EXPECT_EQ(header_list, output);
diff --git a/quic/core/quic_bandwidth.cc b/quic/core/quic_bandwidth.cc
index cdcf003..a88e15b 100644
--- a/quic/core/quic_bandwidth.cc
+++ b/quic/core/quic_bandwidth.cc
@@ -11,7 +11,7 @@
 
 namespace quic {
 
-QuicString QuicBandwidth::ToDebugValue() const {
+std::string QuicBandwidth::ToDebugValue() const {
   if (bits_per_second_ < 80000) {
     return QuicStringPrintf("%" PRId64 " bits/s (%" PRId64 " bytes/s)",
                             bits_per_second_, bits_per_second_ / 8);
diff --git a/quic/core/quic_bandwidth.h b/quic/core/quic_bandwidth.h
index be3c158..1160d92 100644
--- a/quic/core/quic_bandwidth.h
+++ b/quic/core/quic_bandwidth.h
@@ -86,7 +86,7 @@
                                              bits_per_second_);
   }
 
-  QuicString ToDebugValue() const;
+  std::string ToDebugValue() const;
 
  private:
   explicit constexpr QuicBandwidth(int64_t bits_per_second)
diff --git a/quic/core/quic_buffered_packet_store.cc b/quic/core/quic_buffered_packet_store.cc
index 68ebac9..d5637ca 100644
--- a/quic/core/quic_buffered_packet_store.cc
+++ b/quic/core/quic_buffered_packet_store.cc
@@ -85,7 +85,7 @@
     QuicSocketAddress self_address,
     QuicSocketAddress peer_address,
     bool is_chlo,
-    const QuicString& alpn,
+    const std::string& alpn,
     const ParsedQuicVersion& version) {
   QUIC_BUG_IF(!FLAGS_quic_allow_chlo_buffering)
       << "Shouldn't buffer packets if disabled via flag.";
diff --git a/quic/core/quic_buffered_packet_store.h b/quic/core/quic_buffered_packet_store.h
index f2490ee..f30bacd 100644
--- a/quic/core/quic_buffered_packet_store.h
+++ b/quic/core/quic_buffered_packet_store.h
@@ -67,7 +67,7 @@
     std::list<BufferedPacket> buffered_packets;
     QuicTime creation_time;
     // The alpn from the CHLO, if one was found.
-    QuicString alpn;
+    std::string alpn;
     // Indicating whether this is an IETF QUIC connection.
     bool ietf_quic;
     // If buffered_packets contains the CHLO, it is the version of the CHLO.
@@ -108,7 +108,7 @@
                                     QuicSocketAddress self_address,
                                     QuicSocketAddress peer_address,
                                     bool is_chlo,
-                                    const QuicString& alpn,
+                                    const std::string& alpn,
                                     const ParsedQuicVersion& version);
 
   // Returns true if there are any packets buffered for |connection_id|.
diff --git a/quic/core/quic_buffered_packet_store_test.cc b/quic/core/quic_buffered_packet_store_test.cc
index e214ff1..bee0f13 100644
--- a/quic/core/quic_buffered_packet_store_test.cc
+++ b/quic/core/quic_buffered_packet_store_test.cc
@@ -64,7 +64,7 @@
   QuicBufferedPacketStore store_;
   QuicSocketAddress self_address_;
   QuicSocketAddress peer_address_;
-  QuicString packet_content_;
+  std::string packet_content_;
   QuicTime packet_time_;
   QuicReceivedPacket packet_;
   const ParsedQuicVersion invalid_version_;
diff --git a/quic/core/quic_config.cc b/quic/core/quic_config.cc
index e53719c..1b70463 100644
--- a/quic/core/quic_config.cc
+++ b/quic/core/quic_config.cc
@@ -29,7 +29,7 @@
                          QuicConfigPresence presence,
                          uint32_t default_value,
                          uint32_t* out,
-                         QuicString* error_details) {
+                         std::string* error_details) {
   DCHECK(error_details != nullptr);
   QuicErrorCode error = msg.GetUint32(tag, out);
   switch (error) {
@@ -97,7 +97,7 @@
 QuicErrorCode QuicNegotiableUint32::ProcessPeerHello(
     const CryptoHandshakeMessage& peer_hello,
     HelloType hello_type,
-    QuicString* error_details) {
+    std::string* error_details) {
   DCHECK(!negotiated());
   DCHECK(error_details != nullptr);
   uint32_t value;
@@ -111,7 +111,7 @@
 
 QuicErrorCode QuicNegotiableUint32::ReceiveValue(uint32_t value,
                                                  HelloType hello_type,
-                                                 QuicString* error_details) {
+                                                 std::string* error_details) {
   if (hello_type == SERVER && value > max_value_) {
     *error_details = "Invalid value received for " + QuicTagToString(tag_);
     return QUIC_INVALID_NEGOTIATED_VALUE;
@@ -167,7 +167,7 @@
 QuicErrorCode QuicFixedUint32::ProcessPeerHello(
     const CryptoHandshakeMessage& peer_hello,
     HelloType hello_type,
-    QuicString* error_details) {
+    std::string* error_details) {
   DCHECK(error_details != nullptr);
   QuicErrorCode error = peer_hello.GetUint32(tag_, &receive_value_);
   switch (error) {
@@ -232,7 +232,7 @@
 QuicErrorCode QuicFixedUint128::ProcessPeerHello(
     const CryptoHandshakeMessage& peer_hello,
     HelloType hello_type,
-    QuicString* error_details) {
+    std::string* error_details) {
   DCHECK(error_details != nullptr);
   QuicErrorCode error = peer_hello.GetUint128(tag_, &receive_value_);
   switch (error) {
@@ -302,7 +302,7 @@
 QuicErrorCode QuicFixedTagVector::ProcessPeerHello(
     const CryptoHandshakeMessage& peer_hello,
     HelloType hello_type,
-    QuicString* error_details) {
+    std::string* error_details) {
   DCHECK(error_details != nullptr);
   QuicTagVector values;
   QuicErrorCode error = peer_hello.GetTaglist(tag_, &values);
@@ -375,7 +375,7 @@
 QuicErrorCode QuicFixedSocketAddress::ProcessPeerHello(
     const CryptoHandshakeMessage& peer_hello,
     HelloType hello_type,
-    QuicString* error_details) {
+    std::string* error_details) {
   QuicStringPiece address;
   if (!peer_hello.GetStringPiece(tag_, &address)) {
     if (presence_ == PRESENCE_REQUIRED) {
@@ -690,7 +690,7 @@
 QuicErrorCode QuicConfig::ProcessPeerHello(
     const CryptoHandshakeMessage& peer_hello,
     HelloType hello_type,
-    QuicString* error_details) {
+    std::string* error_details) {
   DCHECK(error_details != nullptr);
 
   QuicErrorCode error = QUIC_NO_ERROR;
@@ -779,7 +779,7 @@
 QuicErrorCode QuicConfig::ProcessTransportParameters(
     const TransportParameters& params,
     HelloType hello_type,
-    QuicString* error_details) {
+    std::string* error_details) {
   QuicErrorCode error = idle_network_timeout_seconds_.ReceiveValue(
       params.idle_timeout, hello_type, error_details);
   if (error != QUIC_NO_ERROR) {
diff --git a/quic/core/quic_config.h b/quic/core/quic_config.h
index affc7b9..0037922 100644
--- a/quic/core/quic_config.h
+++ b/quic/core/quic_config.h
@@ -55,7 +55,7 @@
   virtual QuicErrorCode ProcessPeerHello(
       const CryptoHandshakeMessage& peer_hello,
       HelloType hello_type,
-      QuicString* error_details) = 0;
+      std::string* error_details) = 0;
 
  protected:
   const QuicTag tag_;
@@ -106,7 +106,7 @@
   // PRESENCE_OPTIONAL then |negotiated_value_| is set to |default_value_|.
   QuicErrorCode ProcessPeerHello(const CryptoHandshakeMessage& peer_hello,
                                  HelloType hello_type,
-                                 QuicString* error_details) override;
+                                 std::string* error_details) override;
 
   // Takes a value |value| parsed from a handshake message (whether a TLS
   // ClientHello/ServerHello or a CryptoHandshakeMessage) whose sender was
@@ -115,7 +115,7 @@
   // an error, details are put in |*error_details|.
   QuicErrorCode ReceiveValue(uint32_t value,
                              HelloType hello_type,
-                             QuicString* error_details);
+                             std::string* error_details);
 
  private:
   uint32_t max_value_;
@@ -147,7 +147,7 @@
   // Sets |value_| to the corresponding value from |peer_hello_| if it exists.
   QuicErrorCode ProcessPeerHello(const CryptoHandshakeMessage& peer_hello,
                                  HelloType hello_type,
-                                 QuicString* error_details) override;
+                                 std::string* error_details) override;
 
  private:
   uint32_t send_value_;
@@ -180,7 +180,7 @@
   // Sets |value_| to the corresponding value from |peer_hello_| if it exists.
   QuicErrorCode ProcessPeerHello(const CryptoHandshakeMessage& peer_hello,
                                  HelloType hello_type,
-                                 QuicString* error_details) override;
+                                 std::string* error_details) override;
 
  private:
   QuicUint128 send_value_;
@@ -216,7 +216,7 @@
   // it exists.
   QuicErrorCode ProcessPeerHello(const CryptoHandshakeMessage& peer_hello,
                                  HelloType hello_type,
-                                 QuicString* error_details) override;
+                                 std::string* error_details) override;
 
  private:
   QuicTagVector send_values_;
@@ -247,7 +247,7 @@
 
   QuicErrorCode ProcessPeerHello(const CryptoHandshakeMessage& peer_hello,
                                  HelloType hello_type,
-                                 QuicString* error_details) override;
+                                 std::string* error_details) override;
 
  private:
   QuicSocketAddress send_value_;
@@ -418,7 +418,7 @@
   // the corresponding QuicErrorCode and sets detailed error in |error_details|.
   QuicErrorCode ProcessPeerHello(const CryptoHandshakeMessage& peer_hello,
                                  HelloType hello_type,
-                                 QuicString* error_details);
+                                 std::string* error_details);
 
   // FillTransportParameters writes the values to send for ICSL, MIDS, CFCW, and
   // SFCW to |*params|, returning true if the values could be written and false
@@ -431,7 +431,7 @@
   // it returns a QuicErrorCode and puts a detailed error in |*error_details|.
   QuicErrorCode ProcessTransportParameters(const TransportParameters& params,
                                            HelloType hello_type,
-                                           QuicString* error_details);
+                                           std::string* error_details);
 
  private:
   friend class test::QuicConfigPeer;
diff --git a/quic/core/quic_config_test.cc b/quic/core/quic_config_test.cc
index 59ad0ef..8b5aad2 100644
--- a/quic/core/quic_config_test.cc
+++ b/quic/core/quic_config_test.cc
@@ -67,7 +67,7 @@
   CryptoHandshakeMessage msg;
   client_config.ToHandshakeMessage(&msg);
 
-  QuicString error_details;
+  std::string error_details;
   QuicTagVector initial_received_options;
   initial_received_options.push_back(kIW50);
   EXPECT_TRUE(
@@ -115,7 +115,7 @@
   server_config.SetStatelessResetTokenToSend(kTestResetToken);
   CryptoHandshakeMessage msg;
   server_config.ToHandshakeMessage(&msg);
-  QuicString error_details;
+  std::string error_details;
   const QuicErrorCode error =
       config_.ProcessPeerHello(msg, SERVER, &error_details);
   EXPECT_EQ(QUIC_NO_ERROR, error);
@@ -142,7 +142,7 @@
   msg.SetValue(kMIDS, 1);
 
   // No error, as rest are optional.
-  QuicString error_details;
+  std::string error_details;
   const QuicErrorCode error =
       config_.ProcessPeerHello(msg, CLIENT, &error_details);
   EXPECT_EQ(QUIC_NO_ERROR, error);
@@ -157,7 +157,7 @@
   msg.SetValue(kMIDS, 1);
 
   // No error, as rest are optional.
-  QuicString error_details;
+  std::string error_details;
   const QuicErrorCode error =
       config_.ProcessPeerHello(msg, SERVER, &error_details);
   EXPECT_EQ(QUIC_NO_ERROR, error);
@@ -167,7 +167,7 @@
 TEST_F(QuicConfigTest, MissingValueInCHLO) {
   // Server receives CHLO with missing kICSL.
   CryptoHandshakeMessage msg;
-  QuicString error_details;
+  std::string error_details;
   const QuicErrorCode error =
       config_.ProcessPeerHello(msg, CLIENT, &error_details);
   EXPECT_EQ(QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND, error);
@@ -176,7 +176,7 @@
 TEST_F(QuicConfigTest, MissingValueInSHLO) {
   // Client receives SHLO with missing kICSL.
   CryptoHandshakeMessage msg;
-  QuicString error_details;
+  std::string error_details;
   const QuicErrorCode error =
       config_.ProcessPeerHello(msg, SERVER, &error_details);
   EXPECT_EQ(QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND, error);
@@ -190,7 +190,7 @@
 
   CryptoHandshakeMessage msg;
   server_config.ToHandshakeMessage(&msg);
-  QuicString error_details;
+  std::string error_details;
   const QuicErrorCode error =
       config_.ProcessPeerHello(msg, SERVER, &error_details);
   EXPECT_EQ(QUIC_INVALID_NEGOTIATED_VALUE, error);
@@ -220,7 +220,7 @@
   CryptoHandshakeMessage msg;
   client_config.ToHandshakeMessage(&msg);
 
-  QuicString error_details;
+  std::string error_details;
   const QuicErrorCode error =
       config_.ProcessPeerHello(msg, CLIENT, &error_details);
   EXPECT_EQ(QUIC_NO_ERROR, error);
@@ -241,7 +241,7 @@
   CryptoHandshakeMessage msg;
   client_config.ToHandshakeMessage(&msg);
 
-  QuicString error_details;
+  std::string error_details;
   const QuicErrorCode error =
       config_.ProcessPeerHello(msg, CLIENT, &error_details);
   EXPECT_EQ(QUIC_NO_ERROR, error);
@@ -268,7 +268,7 @@
   CryptoHandshakeMessage msg;
   client_config.ToHandshakeMessage(&msg);
 
-  QuicString error_details;
+  std::string error_details;
   const QuicErrorCode error =
       config_.ProcessPeerHello(msg, CLIENT, &error_details);
   EXPECT_EQ(QUIC_NO_ERROR, error);
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 070191b..b39f617 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -564,7 +564,7 @@
   if (debug_visitor_ != nullptr) {
     debug_visitor_->OnPublicResetPacket(packet);
   }
-  QuicString error_details = "Received public reset.";
+  std::string error_details = "Received public reset.";
   if (perspective_ == Perspective::IS_CLIENT && !packet.endpoint_id.empty()) {
     QuicStrAppend(&error_details, " From ", packet.endpoint_id, ".");
   }
@@ -580,7 +580,7 @@
   QUIC_DLOG(INFO) << ENDPOINT << "Received packet with mismatched version "
                   << ParsedQuicVersionToString(received_version);
   if (perspective_ == Perspective::IS_CLIENT) {
-    const QuicString error_details = "Protocol version mismatch.";
+    const std::string error_details = "Protocol version mismatch.";
     QUIC_BUG << ENDPOINT << error_details;
     TearDownLocalConnectionState(QUIC_INTERNAL_ERROR, error_details,
                                  ConnectionCloseSource::FROM_SELF);
@@ -652,7 +652,7 @@
   // here.  (Check for a bug regression.)
   DCHECK_EQ(connection_id_, packet.connection_id);
   if (perspective_ == Perspective::IS_SERVER) {
-    const QuicString error_details =
+    const std::string error_details =
         "Server receieved version negotiation packet.";
     QUIC_BUG << error_details;
     QUIC_CODE_COUNT(quic_tear_down_local_connection_on_version_negotiation);
@@ -670,7 +670,7 @@
   }
 
   if (QuicContainsValue(packet.versions, version())) {
-    const QuicString error_details =
+    const std::string error_details =
         "Server already supports client's version and should have accepted the "
         "connection.";
     QUIC_DLOG(WARNING) << error_details;
@@ -748,7 +748,7 @@
 
   if (!packet_generator_.IsPendingPacketEmpty()) {
     // Incoming packets may change a queued ACK frame.
-    const QuicString error_details =
+    const std::string error_details =
         "Pending frames must be serialized before incoming packets are "
         "processed.";
     QUIC_BUG << error_details << ", received header: " << header;
@@ -780,7 +780,7 @@
     if (!header.version_flag) {
       // Packets should have the version flag till version negotiation is
       // done.
-      QuicString error_details =
+      std::string error_details =
           QuicStrCat(ENDPOINT, "Packet ", header.packet_number.ToUint64(),
                      " without version flag before version negotiated.");
       QUIC_DLOG(WARNING) << error_details;
@@ -1460,7 +1460,7 @@
     const QuicIetfStatelessResetPacket& packet) {
   // TODO(fayang): Add OnAuthenticatedIetfStatelessResetPacket to
   // debug_visitor_.
-  const QuicString error_details = "Received stateless reset.";
+  const std::string error_details = "Received stateless reset.";
   QUIC_CODE_COUNT(quic_tear_down_local_connection_on_stateless_reset);
   TearDownLocalConnectionState(QUIC_PUBLIC_RESET, error_details,
                                ConnectionCloseSource::FROM_PEER);
@@ -2491,7 +2491,7 @@
   }
   write_error_occurred_ = true;
 
-  const QuicString error_details = QuicStrCat(
+  const std::string error_details = QuicStrCat(
       "Write failed with error: ", error_code, " (", strerror(error_code), ")");
   QUIC_LOG_FIRST_N(ERROR, 2) << ENDPOINT << error_details;
   switch (error_code) {
@@ -2550,7 +2550,7 @@
 }
 
 void QuicConnection::OnUnrecoverableError(QuicErrorCode error,
-                                          const QuicString& error_details,
+                                          const std::string& error_details,
                                           ConnectionCloseSource source) {
   // The packet creator or generator encountered an unrecoverable error: tear
   // down local connection state immediately.
@@ -2842,7 +2842,7 @@
 
 void QuicConnection::CloseConnection(
     QuicErrorCode error,
-    const QuicString& error_details,
+    const std::string& error_details,
     ConnectionCloseBehavior connection_close_behavior) {
   DCHECK(!error_details.empty());
   if (!connected_) {
@@ -2873,7 +2873,7 @@
 }
 
 void QuicConnection::SendConnectionClosePacket(QuicErrorCode error,
-                                               const QuicString& details,
+                                               const std::string& details,
                                                AckBundling ack_mode) {
   QUIC_DLOG(INFO) << ENDPOINT << "Sending connection close packet.";
   if (fix_termination_packets_) {
@@ -2895,7 +2895,7 @@
 
 void QuicConnection::TearDownLocalConnectionState(
     QuicErrorCode error,
-    const QuicString& error_details,
+    const std::string& error_details,
     ConnectionCloseSource source) {
   if (!connected_) {
     QUIC_DLOG(INFO) << "Connection is already closed.";
@@ -2996,7 +2996,7 @@
                 << " idle_network_timeout: "
                 << idle_network_timeout_.ToMicroseconds();
   if (idle_duration >= idle_network_timeout_) {
-    const QuicString error_details = "No recent network activity.";
+    const std::string error_details = "No recent network activity.";
     QUIC_DVLOG(1) << ENDPOINT << error_details;
     if ((sent_packet_manager_.GetConsecutiveTlpCount() > 0 ||
          sent_packet_manager_.GetConsecutiveRtoCount() > 0 ||
@@ -3017,7 +3017,7 @@
                   << " handshake timeout: "
                   << handshake_timeout_.ToMicroseconds();
     if (connected_duration >= handshake_timeout_) {
-      const QuicString error_details = "Handshake timeout expired.";
+      const std::string error_details = "Handshake timeout expired.";
       QUIC_DVLOG(1) << ENDPOINT << error_details;
       CloseConnection(QUIC_HANDSHAKE_TIMEOUT, error_details,
                       ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index 985e44c..43aa1dd 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -126,7 +126,7 @@
   // Called when the connection is closed either locally by the framer, or
   // remotely by the peer.
   virtual void OnConnectionClosed(QuicErrorCode error,
-                                  const QuicString& error_details,
+                                  const std::string& error_details,
                                   ConnectionCloseSource source) = 0;
 
   // Called when the connection failed to write because the socket was blocked.
@@ -276,7 +276,7 @@
 
   // Called when the connection is closed.
   virtual void OnConnectionClosed(QuicErrorCode error,
-                                  const QuicString& error_details,
+                                  const std::string& error_details,
                                   ConnectionCloseSource source) {}
 
   // Called when the version negotiation is successful.
@@ -407,7 +407,7 @@
   // packet is sent to the peer.
   virtual void CloseConnection(
       QuicErrorCode error,
-      const QuicString& details,
+      const std::string& details,
       ConnectionCloseBehavior connection_close_behavior);
 
   // Returns statistics tracked for this connection.
@@ -519,7 +519,7 @@
 
   // QuicConnectionCloseDelegateInterface
   void OnUnrecoverableError(QuicErrorCode error,
-                            const QuicString& error_details,
+                            const std::string& error_details,
                             ConnectionCloseSource source) override;
 
   // QuicPacketGenerator::DelegateInterface
@@ -917,7 +917,7 @@
   // TODO(fayang): change |ack_mode| to bool |force_sending_ack| when
   // deprecating quic_deprecate_ack_bundling_mode.
   virtual void SendConnectionClosePacket(QuicErrorCode error,
-                                         const QuicString& details,
+                                         const std::string& details,
                                          AckBundling ack_mode);
 
   // Returns true if the packet should be discarded and not sent.
@@ -952,7 +952,7 @@
   // Notifies the visitor of the close and marks the connection as disconnected.
   // Does not send a connection close frame to the peer.
   void TearDownLocalConnectionState(QuicErrorCode error,
-                                    const QuicString& details,
+                                    const std::string& details,
                                     ConnectionCloseSource source);
 
   // Writes the given packet to socket, encrypted with packet's
diff --git a/quic/core/quic_connection_close_delegate_interface.h b/quic/core/quic_connection_close_delegate_interface.h
index c9faab8..321d0e5 100644
--- a/quic/core/quic_connection_close_delegate_interface.h
+++ b/quic/core/quic_connection_close_delegate_interface.h
@@ -19,7 +19,7 @@
 
   // Called when an unrecoverable error is encountered.
   virtual void OnUnrecoverableError(QuicErrorCode error,
-                                    const QuicString& error_details,
+                                    const std::string& error_details,
                                     ConnectionCloseSource source) = 0;
 };
 
diff --git a/quic/core/quic_connection_id.cc b/quic/core/quic_connection_id.cc
index 25c5b1f..07f3a67 100644
--- a/quic/core/quic_connection_id.cc
+++ b/quic/core/quic_connection_id.cc
@@ -64,9 +64,9 @@
                                  data_bytes[0] ^ data_bytes[1] ^ data_bytes[2]);
 }
 
-QuicString QuicConnectionId::ToString() const {
+std::string QuicConnectionId::ToString() const {
   if (IsEmpty()) {
-    return QuicString("0");
+    return std::string("0");
   }
   return QuicTextUtils::HexEncode(data_, length_);
 }
diff --git a/quic/core/quic_connection_id.h b/quic/core/quic_connection_id.h
index 5a78acd..5a63088 100644
--- a/quic/core/quic_connection_id.h
+++ b/quic/core/quic_connection_id.h
@@ -61,7 +61,7 @@
 
   // Generates an ASCII string that represents
   // the contents of the connection ID, or "0" if it is empty.
-  QuicString ToString() const;
+  std::string ToString() const;
 
   // operator<< allows easily logging connection IDs.
   friend QUIC_EXPORT_PRIVATE std::ostream& operator<<(
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 62056a0..f991355 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -4148,7 +4148,7 @@
 
   // Send more than MTU worth of data.  No acknowledgement was received so far,
   // so the MTU should be at its old value.
-  const QuicString data(kDefaultMaxPacketSize + 1, '.');
+  const std::string data(kDefaultMaxPacketSize + 1, '.');
   QuicByteCount size_before_mtu_change;
   EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _))
       .Times(2)
@@ -4578,7 +4578,7 @@
 
   // Create a handshake message that also enables silent close.
   CryptoHandshakeMessage msg;
-  QuicString error_details;
+  std::string error_details;
   QuicConfig client_config;
   client_config.SetInitialStreamFlowControlWindowToSend(
       kInitialStreamFlowControlWindowForTest);
@@ -4645,7 +4645,7 @@
 
   // Create a handshake message that also enables silent close.
   CryptoHandshakeMessage msg;
-  QuicString error_details;
+  std::string error_details;
   QuicConfig client_config;
   client_config.SetInitialStreamFlowControlWindowToSend(
       kInitialStreamFlowControlWindowForTest);
@@ -4701,7 +4701,7 @@
 
   // Create a handshake message that also enables silent close.
   CryptoHandshakeMessage msg;
-  QuicString error_details;
+  std::string error_details;
   QuicConfig client_config;
   client_config.SetInitialStreamFlowControlWindowToSend(
       kInitialStreamFlowControlWindowForTest);
@@ -4941,7 +4941,7 @@
 
   // Queue the first packet.
   EXPECT_CALL(*send_algorithm_, CanSend(_)).WillOnce(testing::Return(false));
-  const QuicString payload(payload_length, 'a');
+  const std::string payload(payload_length, 'a');
   EXPECT_EQ(0u, connection_.SendStreamDataWithString(3, payload, 0, NO_FIN)
                     .bytes_consumed);
   EXPECT_EQ(0u, connection_.NumQueuedPackets());
@@ -5000,7 +5000,7 @@
     // scope of this test.
     total_payload_length = total_payload_length + 2;
   }
-  const QuicString payload(total_payload_length, 'a');
+  const std::string payload(total_payload_length, 'a');
 
   EXPECT_EQ(payload.size(),
             connection_
@@ -5018,7 +5018,7 @@
     QuicPacketCreatorPeer::SetSendVersionInPacket(creator_, false);
   }
   // Set up a larger payload than will fit in one packet.
-  const QuicString payload(connection_.max_packet_length(), 'a');
+  const std::string payload(connection_.max_packet_length(), 'a');
   EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)).Times(AnyNumber());
 
   // Now send some packets with no truncation.
@@ -7286,7 +7286,7 @@
 }
 
 TEST_P(QuicConnectionTest, CloseConnectionForStatelessReject) {
-  QuicString error_details("stateless reject");
+  std::string error_details("stateless reject");
   EXPECT_CALL(visitor_, OnConnectionClosed(
                             QUIC_CRYPTO_HANDSHAKE_STATELESS_REJECT,
                             error_details, ConnectionCloseSource::FROM_PEER));
@@ -7624,7 +7624,7 @@
   if (connection_.transport_version() <= QUIC_VERSION_44) {
     return;
   }
-  QuicString message(connection_.GetLargestMessagePayload() * 2, 'a');
+  std::string message(connection_.GetLargestMessagePayload() * 2, 'a');
   QuicStringPiece message_data(message);
   QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
   {
diff --git a/quic/core/quic_control_frame_manager.cc b/quic/core/quic_control_frame_manager.cc
index 8d4ba53..5fd756f 100644
--- a/quic/core/quic_control_frame_manager.cc
+++ b/quic/core/quic_control_frame_manager.cc
@@ -47,7 +47,7 @@
 void QuicControlFrameManager::WriteOrBufferGoAway(
     QuicErrorCode error,
     QuicStreamId last_good_stream_id,
-    const QuicString& reason) {
+    const std::string& reason) {
   QUIC_DVLOG(1) << "Writing GOAWAY_FRAME";
   WriteOrBufferQuicFrame(QuicFrame(new QuicGoAwayFrame(
       ++last_control_frame_id_, error, last_good_stream_id, reason)));
diff --git a/quic/core/quic_control_frame_manager.h b/quic/core/quic_control_frame_manager.h
index 618f3f9..355179a 100644
--- a/quic/core/quic_control_frame_manager.h
+++ b/quic/core/quic_control_frame_manager.h
@@ -43,7 +43,7 @@
   // immediately.
   void WriteOrBufferGoAway(QuicErrorCode error,
                            QuicStreamId last_good_stream_id,
-                           const QuicString& reason);
+                           const std::string& reason);
 
   // Tries to send a WINDOW_UPDATE_FRAME. Buffers the frame if it cannot be sent
   // immediately.
diff --git a/quic/core/quic_crypto_client_handshaker.cc b/quic/core/quic_crypto_client_handshaker.cc
index 6647061..62b5bdb 100644
--- a/quic/core/quic_crypto_client_handshaker.cc
+++ b/quic/core/quic_crypto_client_handshaker.cc
@@ -52,7 +52,7 @@
 
 void QuicCryptoClientHandshaker::ProofVerifierCallbackImpl::Run(
     bool ok,
-    const QuicString& error_details,
+    const std::string& error_details,
     std::unique_ptr<ProofVerifyDetails>* details) {
   if (parent_ == nullptr) {
     return;
@@ -161,7 +161,7 @@
   return channel_id_source_callback_run_;
 }
 
-QuicString QuicCryptoClientHandshaker::chlo_hash() const {
+std::string QuicCryptoClientHandshaker::chlo_hash() const {
   return chlo_hash_;
 }
 
@@ -185,7 +185,7 @@
 void QuicCryptoClientHandshaker::HandleServerConfigUpdateMessage(
     const CryptoHandshakeMessage& server_config_update) {
   DCHECK(server_config_update.tag() == kSCUP);
-  QuicString error_details;
+  std::string error_details;
   QuicCryptoClientConfig::CachedState* cached =
       crypto_config_->LookupOrCreate(server_id_);
   QuicErrorCode error = crypto_config_->ProcessServerConfigUpdate(
@@ -350,7 +350,7 @@
     DCHECK(!crypto_negotiated_params_->server_nonce.empty());
   }
 
-  QuicString error_details;
+  std::string error_details;
   QuicErrorCode error = crypto_config_->FillClientHello(
       server_id_, session()->connection()->connection_id(),
       session()->supported_versions().front(), cached,
@@ -433,7 +433,7 @@
   session()->NeuterUnencryptedData();
 
   stateless_reject_received_ = in->tag() == kSREJ;
-  QuicString error_details;
+  std::string error_details;
   QuicErrorCode error = crypto_config_->ProcessRejection(
       *in, session()->connection()->clock()->WallNow(),
       session()->connection()->transport_version(), chlo_hash_, cached,
@@ -613,7 +613,7 @@
     return;
   }
 
-  QuicString error_details;
+  std::string error_details;
   QuicErrorCode error = crypto_config_->ProcessServerHello(
       *in, session()->connection()->connection_id(),
       session()->connection()->version(),
diff --git a/quic/core/quic_crypto_client_handshaker.h b/quic/core/quic_crypto_client_handshaker.h
index 5836ea2..d335628 100644
--- a/quic/core/quic_crypto_client_handshaker.h
+++ b/quic/core/quic_crypto_client_handshaker.h
@@ -40,7 +40,7 @@
   int num_scup_messages_received() const override;
   bool WasChannelIDSent() const override;
   bool WasChannelIDSourceCallbackRun() const override;
-  QuicString chlo_hash() const override;
+  std::string chlo_hash() const override;
   bool encryption_established() const override;
   bool handshake_confirmed() const override;
   const QuicCryptoNegotiatedParameters& crypto_negotiated_params()
@@ -87,7 +87,7 @@
 
     // ProofVerifierCallback interface.
     void Run(bool ok,
-             const QuicString& error_details,
+             const std::string& error_details,
              std::unique_ptr<ProofVerifyDetails>* details) override;
 
     // Cancel causes any future callbacks to be ignored. It must be called on
@@ -174,7 +174,7 @@
   QuicCryptoClientConfig* const crypto_config_;
 
   // SHA-256 hash of the most recently sent CHLO.
-  QuicString chlo_hash_;
+  std::string chlo_hash_;
 
   // Server's (hostname, port, is_https, privacy_mode) tuple.
   const QuicServerId server_id_;
@@ -213,7 +213,7 @@
   // verification. These members must not be used after
   // STATE_VERIFY_PROOF_COMPLETE.
   bool verify_ok_;
-  QuicString verify_error_details_;
+  std::string verify_error_details_;
   std::unique_ptr<ProofVerifyDetails> verify_details_;
 
   // True if the server responded to a previous CHLO with a stateless
diff --git a/quic/core/quic_crypto_client_handshaker_test.cc b/quic/core/quic_crypto_client_handshaker_test.cc
index e21faf3..329f3c3 100644
--- a/quic/core/quic_crypto_client_handshaker_test.cc
+++ b/quic/core/quic_crypto_client_handshaker_test.cc
@@ -31,26 +31,26 @@
 
   // ProofVerifier override.
   QuicAsyncStatus VerifyProof(
-      const QuicString& hostname,
+      const std::string& hostname,
       const uint16_t port,
-      const QuicString& server_config,
+      const std::string& server_config,
       QuicTransportVersion transport_version,
       QuicStringPiece chlo_hash,
-      const std::vector<QuicString>& certs,
-      const QuicString& cert_sct,
-      const QuicString& signature,
+      const std::vector<std::string>& certs,
+      const std::string& cert_sct,
+      const std::string& signature,
       const ProofVerifyContext* context,
-      QuicString* error_details,
+      std::string* error_details,
       std::unique_ptr<ProofVerifyDetails>* verify_details,
       std::unique_ptr<ProofVerifierCallback> callback) override {
     return QUIC_SUCCESS;
   }
 
   QuicAsyncStatus VerifyCertChain(
-      const QuicString& hostname,
-      const std::vector<QuicString>& certs,
+      const std::string& hostname,
+      const std::vector<std::string>& certs,
       const ProofVerifyContext* context,
-      QuicString* error_details,
+      std::string* error_details,
       std::unique_ptr<ProofVerifyDetails>* details,
       std::unique_ptr<ProofVerifierCallback> callback) override {
     return QUIC_SUCCESS;
@@ -68,8 +68,8 @@
 
   // ProofSource override.
   void GetProof(const QuicSocketAddress& server_address,
-                const QuicString& hostname,
-                const QuicString& server_config,
+                const std::string& hostname,
+                const std::string& server_config,
                 QuicTransportVersion transport_version,
                 QuicStringPiece chlo_hash,
                 std::unique_ptr<Callback> callback) override {
@@ -83,8 +83,8 @@
 
   QuicReferenceCountedPointer<Chain> GetCertChain(
       const QuicSocketAddress& server_address,
-      const QuicString& hostname) override {
-    std::vector<QuicString> certs;
+      const std::string& hostname) override {
+    std::vector<std::string> certs;
     certs.push_back("Dummy cert");
     return QuicReferenceCountedPointer<ProofSource::Chain>(
         new ProofSource::Chain(certs));
@@ -92,7 +92,7 @@
 
   void ComputeTlsSignature(
       const QuicSocketAddress& server_address,
-      const QuicString& hostname,
+      const std::string& hostname,
       uint16_t signature_algorithm,
       QuicStringPiece in,
       std::unique_ptr<SignatureCallback> callback) override {
@@ -157,7 +157,7 @@
         QuicCryptoServerConfig::GenerateConfig(helper_.GetRandomGenerator(),
                                                helper_.GetClock(), options);
     state_.Initialize(
-        config->config(), "sourcetoken", std::vector<QuicString>{"Dummy cert"},
+        config->config(), "sourcetoken", std::vector<std::string>{"Dummy cert"},
         "", "chlo_hash", "signature", helper_.GetClock()->WallNow(),
         helper_.GetClock()->WallNow().Add(QuicTime::Delta::FromSeconds(30)));
 
diff --git a/quic/core/quic_crypto_client_stream.cc b/quic/core/quic_crypto_client_stream.cc
index 66bb9e4..52edbc0 100644
--- a/quic/core/quic_crypto_client_stream.cc
+++ b/quic/core/quic_crypto_client_stream.cc
@@ -92,7 +92,7 @@
   return handshaker_->WasChannelIDSourceCallbackRun();
 }
 
-QuicString QuicCryptoClientStream::chlo_hash() const {
+std::string QuicCryptoClientStream::chlo_hash() const {
   return handshaker_->chlo_hash();
 }
 
diff --git a/quic/core/quic_crypto_client_stream.h b/quic/core/quic_crypto_client_stream.h
index da149fe..ad6518b 100644
--- a/quic/core/quic_crypto_client_stream.h
+++ b/quic/core/quic_crypto_client_stream.h
@@ -90,7 +90,7 @@
     // ChannelIDSource operated asynchronously. Intended for testing.
     virtual bool WasChannelIDSourceCallbackRun() const = 0;
 
-    virtual QuicString chlo_hash() const = 0;
+    virtual std::string chlo_hash() const = 0;
 
     // Returns true once any encrypter (initial/0RTT or final/1RTT) has been set
     // for the connection.
@@ -156,7 +156,7 @@
   // ChannelIDSource operated asynchronously. Intended for testing.
   bool WasChannelIDSourceCallbackRun() const;
 
-  QuicString chlo_hash() const;
+  std::string chlo_hash() const;
 
  protected:
   void set_handshaker(std::unique_ptr<HandshakerDelegate> handshaker) {
diff --git a/quic/core/quic_crypto_client_stream_test.cc b/quic/core/quic_crypto_client_stream_test.cc
index d9b344a..bd5162b 100644
--- a/quic/core/quic_crypto_client_stream_test.cc
+++ b/quic/core/quic_crypto_client_stream_test.cc
@@ -188,10 +188,10 @@
   QuicCryptoClientConfig::CachedState* state =
       crypto_config_.LookupOrCreate(server_id_);
 
-  std::vector<QuicString> certs = state->certs();
-  QuicString cert_sct = state->cert_sct();
-  QuicString signature = state->signature();
-  QuicString chlo_hash = state->chlo_hash();
+  std::vector<std::string> certs = state->certs();
+  std::string cert_sct = state->cert_sct();
+  std::string signature = state->signature();
+  std::string chlo_hash = state->chlo_hash();
   state->SetProof(certs, cert_sct, chlo_hash, signature + signature);
 
   EXPECT_CALL(*session_, OnProofVerifyDetailsAvailable(testing::_))
@@ -243,7 +243,7 @@
   // Make sure that the STK and SCFG are cached correctly.
   EXPECT_EQ("xstk", state->source_address_token());
 
-  const QuicString& cached_scfg = state->server_config();
+  const std::string& cached_scfg = state->server_config();
   test::CompareCharArraysWithHexError(
       "scfg", cached_scfg.data(), cached_scfg.length(),
       reinterpret_cast<char*>(scfg), QUIC_ARRAYSIZE(scfg));
diff --git a/quic/core/quic_crypto_server_handshaker.cc b/quic/core/quic_crypto_server_handshaker.cc
index 66f3e12..fb24fed 100644
--- a/quic/core/quic_crypto_server_handshaker.cc
+++ b/quic/core/quic_crypto_server_handshaker.cc
@@ -24,7 +24,7 @@
 
   void Run(
       QuicErrorCode error,
-      const QuicString& error_details,
+      const std::string& error_details,
       std::unique_ptr<CryptoHandshakeMessage> message,
       std::unique_ptr<DiversificationNonce> diversification_nonce,
       std::unique_ptr<ProofSource::Details> proof_source_details) override {
@@ -160,7 +160,7 @@
     FinishProcessingHandshakeMessageAfterProcessClientHello(
         const ValidateClientHelloResultCallback::Result& result,
         QuicErrorCode error,
-        const QuicString& error_details,
+        const std::string& error_details,
         std::unique_ptr<CryptoHandshakeMessage> reply,
         std::unique_ptr<DiversificationNonce> diversification_nonce,
         std::unique_ptr<ProofSource::Details> proof_source_details) {
@@ -207,7 +207,7 @@
   // session config.
   QuicConfig* config = session()->config();
   OverrideQuicConfigDefaults(config);
-  QuicString process_error_details;
+  std::string process_error_details;
   const QuicErrorCode process_error =
       config->ProcessPeerHello(message, CLIENT, &process_error_details);
   if (process_error != QUIC_NO_ERROR) {
@@ -354,13 +354,13 @@
 }
 
 bool QuicCryptoServerHandshaker::GetBase64SHA256ClientChannelID(
-    QuicString* output) const {
+    std::string* output) const {
   if (!encryption_established() ||
       crypto_negotiated_params_->channel_id.empty()) {
     return false;
   }
 
-  const QuicString& channel_id(crypto_negotiated_params_->channel_id);
+  const std::string& channel_id(crypto_negotiated_params_->channel_id);
   uint8_t digest[SHA256_DIGEST_LENGTH];
   SHA256(reinterpret_cast<const uint8_t*>(channel_id.data()), channel_id.size(),
          digest);
@@ -392,7 +392,7 @@
     std::unique_ptr<ProofSource::Details> proof_source_details,
     std::unique_ptr<ProcessClientHelloResultCallback> done_cb) {
   const CryptoHandshakeMessage& message = result->client_hello;
-  QuicString error_details;
+  std::string error_details;
   if (!helper_->CanAcceptClientHello(
           message, GetClientAddress(), session()->connection()->peer_address(),
           session()->connection()->self_address(), &error_details)) {
diff --git a/quic/core/quic_crypto_server_handshaker.h b/quic/core/quic_crypto_server_handshaker.h
index a1ec99f..544307c 100644
--- a/quic/core/quic_crypto_server_handshaker.h
+++ b/quic/core/quic_crypto_server_handshaker.h
@@ -39,7 +39,7 @@
 
   // From HandshakerDelegate
   void CancelOutstandingCallbacks() override;
-  bool GetBase64SHA256ClientChannelID(QuicString* output) const override;
+  bool GetBase64SHA256ClientChannelID(std::string* output) const override;
   void SendServerConfigUpdate(
       const CachedNetworkParameters* cached_network_params) override;
   uint8_t NumHandshakeMessages() const override;
@@ -139,7 +139,7 @@
   void FinishProcessingHandshakeMessageAfterProcessClientHello(
       const ValidateClientHelloResultCallback::Result& result,
       QuicErrorCode error,
-      const QuicString& error_details,
+      const std::string& error_details,
       std::unique_ptr<CryptoHandshakeMessage> reply,
       std::unique_ptr<DiversificationNonce> diversification_nonce,
       std::unique_ptr<ProofSource::Details> proof_source_details);
@@ -177,7 +177,7 @@
 
   // Hash of the last received CHLO message which can be used for generating
   // server config update messages.
-  QuicString chlo_hash_;
+  std::string chlo_hash_;
 
   // Pointer to the helper for this crypto stream. Must outlive this stream.
   QuicCryptoServerStream::Helper* helper_;
diff --git a/quic/core/quic_crypto_server_stream.cc b/quic/core/quic_crypto_server_stream.cc
index aa75c66..02e7b8f 100644
--- a/quic/core/quic_crypto_server_stream.cc
+++ b/quic/core/quic_crypto_server_stream.cc
@@ -71,7 +71,7 @@
 }
 
 bool QuicCryptoServerStream::GetBase64SHA256ClientChannelID(
-    QuicString* output) const {
+    std::string* output) const {
   return handshaker()->GetBase64SHA256ClientChannelID(output);
 }
 
diff --git a/quic/core/quic_crypto_server_stream.h b/quic/core/quic_crypto_server_stream.h
index 53d4b38..ec339e1 100644
--- a/quic/core/quic_crypto_server_stream.h
+++ b/quic/core/quic_crypto_server_stream.h
@@ -41,7 +41,7 @@
   // GetBase64SHA256ClientChannelID sets |*output| to the base64 encoded,
   // SHA-256 hash of the client's ChannelID key and returns true, if the client
   // presented a ChannelID. Otherwise it returns false.
-  virtual bool GetBase64SHA256ClientChannelID(QuicString* output) const = 0;
+  virtual bool GetBase64SHA256ClientChannelID(std::string* output) const = 0;
 
   virtual int NumServerConfigUpdateMessagesSent() const = 0;
 
@@ -92,7 +92,7 @@
     // GetBase64SHA256ClientChannelID sets |*output| to the base64 encoded,
     // SHA-256 hash of the client's ChannelID key and returns true, if the
     // client presented a ChannelID. Otherwise it returns false.
-    virtual bool GetBase64SHA256ClientChannelID(QuicString* output) const = 0;
+    virtual bool GetBase64SHA256ClientChannelID(std::string* output) const = 0;
 
     // Sends the latest server config and source-address token to the client.
     virtual void SendServerConfigUpdate(
@@ -147,7 +147,7 @@
                                       const QuicSocketAddress& client_address,
                                       const QuicSocketAddress& peer_address,
                                       const QuicSocketAddress& self_address,
-                                      QuicString* error_details) const = 0;
+                                      std::string* error_details) const = 0;
   };
 
   // |crypto_config| must outlive the stream.
@@ -165,7 +165,7 @@
 
   // From QuicCryptoServerStreamBase
   void CancelOutstandingCallbacks() override;
-  bool GetBase64SHA256ClientChannelID(QuicString* output) const override;
+  bool GetBase64SHA256ClientChannelID(std::string* output) const override;
   void SendServerConfigUpdate(
       const CachedNetworkParameters* cached_network_params) override;
   uint8_t NumHandshakeMessages() const override;
diff --git a/quic/core/quic_crypto_stream.cc b/quic/core/quic_crypto_stream.cc
index aef431d..6a941e7 100644
--- a/quic/core/quic_crypto_stream.cc
+++ b/quic/core/quic_crypto_stream.cc
@@ -107,7 +107,7 @@
 bool QuicCryptoStream::ExportKeyingMaterial(QuicStringPiece label,
                                             QuicStringPiece context,
                                             size_t result_len,
-                                            QuicString* result) const {
+                                            std::string* result) const {
   if (!handshake_confirmed()) {
     QUIC_DLOG(ERROR) << "ExportKeyingMaterial was called before forward-secure"
                      << "encryption was established.";
diff --git a/quic/core/quic_crypto_stream.h b/quic/core/quic_crypto_stream.h
index d2a729e..e60277b 100644
--- a/quic/core/quic_crypto_stream.h
+++ b/quic/core/quic_crypto_stream.h
@@ -63,7 +63,7 @@
   bool ExportKeyingMaterial(QuicStringPiece label,
                             QuicStringPiece context,
                             size_t result_len,
-                            QuicString* result) const;
+                            std::string* result) const;
 
   // Writes |data| to the QuicStream at level |level|.
   virtual void WriteCryptoData(EncryptionLevel level, QuicStringPiece data);
diff --git a/quic/core/quic_crypto_stream_test.cc b/quic/core/quic_crypto_stream_test.cc
index 26ed335..263910b 100644
--- a/quic/core/quic_crypto_stream_test.cc
+++ b/quic/core/quic_crypto_stream_test.cc
@@ -118,7 +118,7 @@
 }
 
 TEST_F(QuicCryptoStreamTest, ProcessBadData) {
-  QuicString bad(message_data_->data(), message_data_->length());
+  std::string bad(message_data_->data(), message_data_->length());
   const int kFirstTagIndex = sizeof(uint32_t) +  // message tag
                              sizeof(uint16_t) +  // number of tag-value pairs
                              sizeof(uint16_t);   // padding
@@ -148,7 +148,7 @@
   InSequence s;
   // Send [0, 1350) in ENCRYPTION_NONE.
   EXPECT_EQ(ENCRYPTION_NONE, connection_->encryption_level());
-  QuicString data(1350, 'a');
+  std::string data(1350, 'a');
   EXPECT_CALL(
       session_,
       WritevData(_,
@@ -208,7 +208,7 @@
   InSequence s;
   // Send [0, 1350) in ENCRYPTION_NONE.
   EXPECT_EQ(ENCRYPTION_NONE, connection_->encryption_level());
-  QuicString data(1350, 'a');
+  std::string data(1350, 'a');
   EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_NONE, 1350, 0))
       .WillOnce(Invoke(connection_,
                        &MockQuicConnection::QuicConnection_SendCryptoData));
@@ -258,7 +258,7 @@
   }
   // Send [0, 1350) in ENCRYPTION_NONE.
   EXPECT_EQ(ENCRYPTION_NONE, connection_->encryption_level());
-  QuicString data(1350, 'a');
+  std::string data(1350, 'a');
   EXPECT_CALL(
       session_,
       WritevData(_,
@@ -300,7 +300,7 @@
   }
   // Send [0, 1350) in ENCRYPTION_NONE.
   EXPECT_EQ(ENCRYPTION_NONE, connection_->encryption_level());
-  QuicString data(1350, 'a');
+  std::string data(1350, 'a');
   EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_NONE, 1350, 0))
       .WillOnce(Invoke(connection_,
                        &MockQuicConnection::QuicConnection_SendCryptoData));
@@ -344,7 +344,7 @@
   InSequence s;
   // Send [0, 1350) in ENCRYPTION_NONE.
   EXPECT_EQ(ENCRYPTION_NONE, connection_->encryption_level());
-  QuicString data(1350, 'a');
+  std::string data(1350, 'a');
   EXPECT_CALL(
       session_,
       WritevData(_,
@@ -417,7 +417,7 @@
   InSequence s;
   // Send [0, 1350) in ENCRYPTION_NONE.
   EXPECT_EQ(ENCRYPTION_NONE, connection_->encryption_level());
-  QuicString data(1350, 'a');
+  std::string data(1350, 'a');
   EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_NONE, 1350, 0))
       .WillOnce(Invoke(connection_,
                        &MockQuicConnection::QuicConnection_SendCryptoData));
@@ -473,7 +473,7 @@
   if (connection_->transport_version() >= QUIC_VERSION_47) {
     return;
   }
-  QuicString data(1350, 'a');
+  std::string data(1350, 'a');
   EXPECT_CALL(
       session_,
       WritevData(_,
@@ -504,7 +504,7 @@
   }
   // Send [0, 1350) in ENCRYPTION_NONE.
   EXPECT_EQ(ENCRYPTION_NONE, connection_->encryption_level());
-  QuicString data(1350, 'a');
+  std::string data(1350, 'a');
   EXPECT_CALL(*connection_, SendCryptoData(ENCRYPTION_NONE, 1350, 0))
       .WillOnce(Invoke(connection_,
                        &MockQuicConnection::QuicConnection_SendCryptoData));
diff --git a/quic/core/quic_data_reader.cc b/quic/core/quic_data_reader.cc
index e1fbffe..4200329 100644
--- a/quic/core/quic_data_reader.cc
+++ b/quic/core/quic_data_reader.cc
@@ -305,7 +305,7 @@
   return true;
 }
 
-QuicString QuicDataReader::DebugString() const {
+std::string QuicDataReader::DebugString() const {
   return QuicStrCat(" { length: ", len_, ", position: ", pos_, " }");
 }
 
diff --git a/quic/core/quic_data_reader.h b/quic/core/quic_data_reader.h
index fff0ffd..6295882 100644
--- a/quic/core/quic_data_reader.h
+++ b/quic/core/quic_data_reader.h
@@ -149,7 +149,7 @@
   // greater than (2^32)-1.
   bool ReadVarIntStreamId(QuicStreamId* result);
 
-  QuicString DebugString() const;
+  std::string DebugString() const;
 
  private:
   // Returns true if the underlying buffer has enough room to read the given
diff --git a/quic/core/quic_data_writer.cc b/quic/core/quic_data_writer.cc
index c70bbdd..98a173d 100644
--- a/quic/core/quic_data_writer.cc
+++ b/quic/core/quic_data_writer.cc
@@ -349,7 +349,7 @@
   return true;
 }
 
-QuicString QuicDataWriter::DebugString() const {
+std::string QuicDataWriter::DebugString() const {
   return QuicStrCat(" { capacity: ", capacity_, ", length: ", length_, " }");
 }
 
diff --git a/quic/core/quic_data_writer.h b/quic/core/quic_data_writer.h
index e107fcb..4e6b179 100644
--- a/quic/core/quic_data_writer.h
+++ b/quic/core/quic_data_writer.h
@@ -122,7 +122,7 @@
 
   size_t remaining() const { return capacity_ - length_; }
 
-  QuicString DebugString() const;
+  std::string DebugString() const;
 
  private:
   // Returns the location that the data should be written at, or nullptr if
diff --git a/quic/core/quic_dispatcher.cc b/quic/core/quic_dispatcher.cc
index 14da558..ce95320 100644
--- a/quic/core/quic_dispatcher.cc
+++ b/quic/core/quic_dispatcher.cc
@@ -72,7 +72,7 @@
   }
 
   void OnUnrecoverableError(QuicErrorCode error,
-                            const QuicString& error_details,
+                            const std::string& error_details,
                             ConnectionCloseSource source) override {}
 
   void SaveStatelessRejectFrameData(QuicStringPiece reject) {
@@ -135,7 +135,7 @@
   // Generates a packet containing a CONNECTION_CLOSE frame specifying
   // |error_code| and |error_details| and add the connection to time wait.
   void CloseConnection(QuicErrorCode error_code,
-                       const QuicString& error_details,
+                       const std::string& error_details,
                        bool ietf_quic) {
     QuicConnectionCloseFrame* frame = new QuicConnectionCloseFrame;
     frame->error_code = error_code;
@@ -211,14 +211,14 @@
               const CryptoHandshakeMessage& chlo) override {
     QuicStringPiece alpn_value;
     if (chlo.GetStringPiece(kALPN, &alpn_value)) {
-      alpn_ = QuicString(alpn_value);
+      alpn_ = std::string(alpn_value);
     }
   }
 
-  QuicString&& ConsumeAlpn() { return std::move(alpn_); }
+  std::string&& ConsumeAlpn() { return std::move(alpn_); }
 
  private:
-  QuicString alpn_;
+  std::string alpn_;
 };
 
 // Class which sits between the ChloExtractor and the StatelessRejector
@@ -255,7 +255,7 @@
 
   bool can_accept() const { return can_accept_; }
 
-  const QuicString& error_details() const { return error_details_; }
+  const std::string& error_details() const { return error_details_; }
 
  private:
   QuicCryptoServerStream::Helper* helper_;  // Unowned.
@@ -266,7 +266,7 @@
   QuicSocketAddress self_address_;
   StatelessRejector* rejector_;  // Unowned.
   bool can_accept_;
-  QuicString error_details_;
+  std::string error_details_;
 };
 
 }  // namespace
@@ -653,7 +653,7 @@
 
 void QuicDispatcher::OnConnectionClosed(QuicConnectionId connection_id,
                                         QuicErrorCode error,
-                                        const QuicString& error_details,
+                                        const std::string& error_details,
                                         ConnectionCloseSource source) {
   auto it = session_map_.find(connection_id);
   if (it == session_map_.end()) {
@@ -714,7 +714,7 @@
     PacketHeaderFormat format,
     ParsedQuicVersion version,
     QuicErrorCode error_code,
-    const QuicString& error_details,
+    const std::string& error_details,
     QuicTimeWaitListManager::TimeWaitAction action) {
   if (format != IETF_QUIC_LONG_HEADER_PACKET) {
     QUIC_DVLOG(1) << "Statelessly terminating " << connection_id
diff --git a/quic/core/quic_dispatcher.h b/quic/core/quic_dispatcher.h
index 85e6da6..77d4952 100644
--- a/quic/core/quic_dispatcher.h
+++ b/quic/core/quic_dispatcher.h
@@ -79,7 +79,7 @@
   // Ensure that the closed connection is cleaned up asynchronously.
   void OnConnectionClosed(QuicConnectionId connection_id,
                           QuicErrorCode error,
-                          const QuicString& error_details,
+                          const std::string& error_details,
                           ConnectionCloseSource source) override;
 
   // QuicSession::Visitor interface implementation (via inheritance of
@@ -338,7 +338,7 @@
       PacketHeaderFormat format,
       ParsedQuicVersion version,
       QuicErrorCode error_code,
-      const QuicString& error_details,
+      const std::string& error_details,
       QuicTimeWaitListManager::TimeWaitAction action);
 
   // Save/Restore per packet context. Used by async stateless rejector.
@@ -453,7 +453,7 @@
   QuicSocketAddress current_self_address_;
   const QuicReceivedPacket* current_packet_;
   // If |current_packet_| is a CHLO packet, the extracted alpn.
-  QuicString current_alpn_;
+  std::string current_alpn_;
   QuicConnectionId current_connection_id_;
 
   // Used to get the supported versions based on flag. Does not own.
diff --git a/quic/core/quic_dispatcher_test.cc b/quic/core/quic_dispatcher_test.cc
index e4a42a4..c744505 100644
--- a/quic/core/quic_dispatcher_test.cc
+++ b/quic/core/quic_dispatcher_test.cc
@@ -77,7 +77,7 @@
 
   MOCK_METHOD3(OnConnectionClosed,
                void(QuicErrorCode error,
-                    const QuicString& error_details,
+                    const std::string& error_details,
                     ConnectionCloseSource source));
   MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(QuicStreamId id));
   MOCK_METHOD1(CreateIncomingStream, QuicSpdyStream*(PendingStream pending));
@@ -138,7 +138,7 @@
                bool(QuicConnectionId connection_id, bool ietf_quic));
 
   struct TestQuicPerPacketContext : public QuicPerPacketContext {
-    QuicString custom_packet_context;
+    std::string custom_packet_context;
   };
 
   std::unique_ptr<QuicPerPacketContext> GetPerPacketContext() const override {
@@ -154,7 +154,7 @@
     custom_packet_context_ = test_context->custom_packet_context;
   }
 
-  QuicString custom_packet_context_;
+  std::string custom_packet_context_;
 
   using QuicDispatcher::current_client_address;
   using QuicDispatcher::current_peer_address;
@@ -246,7 +246,7 @@
   void ProcessPacket(QuicSocketAddress peer_address,
                      QuicConnectionId connection_id,
                      bool has_version_flag,
-                     const QuicString& data) {
+                     const std::string& data) {
     ProcessPacket(peer_address, connection_id, has_version_flag, data,
                   CONNECTION_ID_PRESENT, PACKET_4BYTE_PACKET_NUMBER);
   }
@@ -256,7 +256,7 @@
   void ProcessPacket(QuicSocketAddress peer_address,
                      QuicConnectionId connection_id,
                      bool has_version_flag,
-                     const QuicString& data,
+                     const std::string& data,
                      QuicConnectionIdIncluded connection_id_included,
                      QuicPacketNumberLength packet_number_length) {
     ProcessPacket(peer_address, connection_id, has_version_flag, data,
@@ -267,7 +267,7 @@
   void ProcessPacket(QuicSocketAddress peer_address,
                      QuicConnectionId connection_id,
                      bool has_version_flag,
-                     const QuicString& data,
+                     const std::string& data,
                      QuicConnectionIdIncluded connection_id_included,
                      QuicPacketNumberLength packet_number_length,
                      uint64_t packet_number) {
@@ -281,7 +281,7 @@
                      QuicConnectionId connection_id,
                      bool has_version_flag,
                      ParsedQuicVersion version,
-                     const QuicString& data,
+                     const std::string& data,
                      QuicConnectionIdIncluded connection_id_included,
                      QuicPacketNumberLength packet_number_length,
                      uint64_t packet_number) {
@@ -298,11 +298,11 @@
       // Add CHLO packet to the beginning to be verified first, because it is
       // also processed first by new session.
       data_connection_map_[connection_id].push_front(
-          QuicString(packet->data(), packet->length()));
+          std::string(packet->data(), packet->length()));
     } else {
       // For non-CHLO, always append to last.
       data_connection_map_[connection_id].push_back(
-          QuicString(packet->data(), packet->length()));
+          std::string(packet->data(), packet->length()));
     }
     dispatcher_->ProcessPacket(server_address_, peer_address, *received_packet);
   }
@@ -347,14 +347,14 @@
                                                time_wait_list_manager_);
   }
 
-  QuicString SerializeCHLO() {
+  std::string SerializeCHLO() {
     CryptoHandshakeMessage client_hello;
     client_hello.set_tag(kCHLO);
     client_hello.SetStringPiece(kALPN, "hq");
-    return QuicString(client_hello.GetSerialized().AsStringPiece());
+    return std::string(client_hello.GetSerialized().AsStringPiece());
   }
 
-  QuicString SerializeTlsClientHello() { return ""; }
+  std::string SerializeTlsClientHello() { return ""; }
 
   void MarkSession1Deleted() { session1_ = nullptr; }
 
@@ -368,7 +368,7 @@
   MockTimeWaitListManager* time_wait_list_manager_;
   TestQuicSpdyServerSession* session1_;
   TestQuicSpdyServerSession* session2_;
-  std::map<QuicConnectionId, std::list<QuicString>> data_connection_map_;
+  std::map<QuicConnectionId, std::list<std::string>> data_connection_map_;
   QuicBufferedPacketStore* store_;
 };
 
@@ -499,7 +499,7 @@
   ParsedQuicVersion parsed_version(PROTOCOL_QUIC_CRYPTO, version);
   // Pad the CHLO message with enough data to make the packet large enough
   // to trigger version negotiation.
-  QuicString chlo = SerializeCHLO() + QuicString(1200, 'a');
+  std::string chlo = SerializeCHLO() + std::string(1200, 'a');
   DCHECK_LE(1200u, chlo.length());
   ProcessPacket(client_address, TestConnectionId(1), true, parsed_version, chlo,
                 CONNECTION_ID_PRESENT, PACKET_4BYTE_PACKET_NUMBER, 1);
@@ -516,11 +516,11 @@
   QuicTransportVersion version =
       static_cast<QuicTransportVersion>(QuicTransportVersionMin() - 1);
   ParsedQuicVersion parsed_version(PROTOCOL_QUIC_CRYPTO, version);
-  QuicString chlo = SerializeCHLO() + QuicString(1200, 'a');
+  std::string chlo = SerializeCHLO() + std::string(1200, 'a');
   // Truncate to 1100 bytes of payload which results in a packet just
   // under 1200 bytes after framing, packet, and encryption overhead.
   DCHECK_LE(1200u, chlo.length());
-  QuicString truncated_chlo = chlo.substr(0, 1100);
+  std::string truncated_chlo = chlo.substr(0, 1100);
   DCHECK_EQ(1100u, truncated_chlo.length());
   ProcessPacket(client_address, TestConnectionId(1), true, parsed_version,
                 truncated_chlo, CONNECTION_ID_PRESENT,
@@ -542,11 +542,11 @@
   QuicTransportVersion version =
       static_cast<QuicTransportVersion>(QuicTransportVersionMin() - 1);
   ParsedQuicVersion parsed_version(PROTOCOL_QUIC_CRYPTO, version);
-  QuicString chlo = SerializeCHLO() + QuicString(1200, 'a');
+  std::string chlo = SerializeCHLO() + std::string(1200, 'a');
   // Truncate to 1100 bytes of payload which results in a packet just
   // under 1200 bytes after framing, packet, and encryption overhead.
   DCHECK_LE(1200u, chlo.length());
-  QuicString truncated_chlo = chlo.substr(0, 1100);
+  std::string truncated_chlo = chlo.substr(0, 1100);
   DCHECK_EQ(1100u, truncated_chlo.length());
   ProcessPacket(client_address, TestConnectionId(1), true, parsed_version,
                 truncated_chlo, CONNECTION_ID_PRESENT,
@@ -1167,7 +1167,7 @@
         .Times(1);
   }
   ProcessPacket(client_address, connection_id, true,
-                QuicString(client_hello.GetSerialized().AsStringPiece()));
+                std::string(client_hello.GetSerialized().AsStringPiece()));
 
   if (GetParam().enable_stateless_rejects_via_flag) {
     EXPECT_EQ(true,
@@ -1218,7 +1218,7 @@
           })))
       .RetiresOnSaturation();
   ProcessPacket(client_address, connection_id, true,
-                QuicString(client_hello.GetSerialized().AsStringPiece()));
+                std::string(client_hello.GetSerialized().AsStringPiece()));
   EXPECT_FALSE(
       time_wait_list_manager_->IsConnectionIdInTimeWait(connection_id));
 }
@@ -1624,8 +1624,8 @@
         &full_chlo_);
   }
 
-  QuicString SerializeFullCHLO() {
-    return QuicString(full_chlo_.GetSerialized().AsStringPiece());
+  std::string SerializeFullCHLO() {
+    return std::string(full_chlo_.GetSerialized().AsStringPiece());
   }
 
  protected:
@@ -2130,16 +2130,16 @@
     return static_cast<FakeProofSource*>(crypto_config_peer_.GetProofSource());
   }
 
-  QuicString SerializeFullCHLO() {
-    return QuicString(full_chlo_.GetSerialized().AsStringPiece());
+  std::string SerializeFullCHLO() {
+    return std::string(full_chlo_.GetSerialized().AsStringPiece());
   }
 
-  QuicString SerializeFullCHLOForClient2() {
-    return QuicString(full_chlo_2_.GetSerialized().AsStringPiece());
+  std::string SerializeFullCHLOForClient2() {
+    return std::string(full_chlo_2_.GetSerialized().AsStringPiece());
   }
 
-  QuicString SerializeCHLO() {
-    return QuicString(chlo_.GetSerialized().AsStringPiece());
+  std::string SerializeCHLO() {
+    return std::string(chlo_.GetSerialized().AsStringPiece());
   }
 
   // Sets up a session, and crypto stream based on the test parameters.
diff --git a/quic/core/quic_framer.cc b/quic/core/quic_framer.cc
index 2ffb762..22d0ecf 100644
--- a/quic/core/quic_framer.cc
+++ b/quic/core/quic_framer.cc
@@ -1368,7 +1368,7 @@
       IpAddressFamily::IP_UNSPEC) {
     // packet.client_address is non-empty.
     QuicSocketAddressCoder address_coder(packet.client_address);
-    QuicString serialized_address = address_coder.Encode();
+    std::string serialized_address = address_coder.Encode();
     if (serialized_address.empty()) {
       return nullptr;
     }
@@ -1994,7 +1994,7 @@
   QuicStringPiece endpoint_id;
   if (perspective_ == Perspective::IS_CLIENT &&
       reset->GetStringPiece(kEPID, &endpoint_id)) {
-    packet.endpoint_id = QuicString(endpoint_id);
+    packet.endpoint_id = std::string(endpoint_id);
     packet.endpoint_id += '\0';
   }
 
@@ -3724,7 +3724,7 @@
     set_detailed_error("Unable to read connection close error details.");
     return false;
   }
-  frame->error_details = QuicString(error_details);
+  frame->error_details = std::string(error_details);
 
   return true;
 }
@@ -3755,7 +3755,7 @@
     set_detailed_error("Unable to read goaway reason.");
     return false;
   }
-  frame->reason_phrase = QuicString(reason_phrase);
+  frame->reason_phrase = std::string(reason_phrase);
 
   return true;
 }
@@ -4511,7 +4511,7 @@
     set_detailed_error("Unable to read new token data.");
     return false;
   }
-  frame->token = QuicString(data);
+  frame->token = std::string(data);
   return true;
 }
 
@@ -5225,7 +5225,7 @@
     set_detailed_error("Unable to read connection close error details.");
     return false;
   }
-  frame->error_details = QuicString(phrase);
+  frame->error_details = std::string(phrase);
 
   return true;
 }
@@ -5250,7 +5250,7 @@
     set_detailed_error("Unable to read application close error details.");
     return false;
   }
-  frame->error_details = QuicString(phrase);
+  frame->error_details = std::string(phrase);
 
   return true;
 }
diff --git a/quic/core/quic_framer.h b/quic/core/quic_framer.h
index 168fef5..d6916f6 100644
--- a/quic/core/quic_framer.h
+++ b/quic/core/quic_framer.h
@@ -516,7 +516,7 @@
   // to ciphertext no larger than |ciphertext_size|.
   size_t GetMaxPlaintextSize(size_t ciphertext_size);
 
-  const QuicString& detailed_error() { return detailed_error_; }
+  const std::string& detailed_error() { return detailed_error_; }
 
   // The minimum packet number length required to represent |packet_number|.
   static QuicPacketNumberLength GetMinPacketNumberLength(
@@ -859,7 +859,7 @@
 
   void set_detailed_error(const char* error) { detailed_error_ = error; }
 
-  QuicString detailed_error_;
+  std::string detailed_error_;
   QuicFramerVisitorInterface* visitor_;
   QuicErrorCode error_;
   // Updated by ProcessPacketHeader when it succeeds decrypting a larger packet.
diff --git a/quic/core/quic_framer_test.cc b/quic/core/quic_framer_test.cc
index bcd9db6..527307a 100644
--- a/quic/core/quic_framer_test.cc
+++ b/quic/core/quic_framer_test.cc
@@ -92,8 +92,8 @@
                      size_t* output_length,
                      size_t max_output_length) override {
     packet_number_ = QuicPacketNumber(packet_number);
-    associated_data_ = QuicString(associated_data);
-    plaintext_ = QuicString(plaintext);
+    associated_data_ = std::string(associated_data);
+    plaintext_ = std::string(plaintext);
     memcpy(output, plaintext.data(), plaintext.length());
     *output_length = plaintext.length();
     return true;
@@ -111,8 +111,8 @@
   QuicStringPiece GetNoncePrefix() const override { return QuicStringPiece(); }
 
   QuicPacketNumber packet_number_;
-  QuicString associated_data_;
-  QuicString plaintext_;
+  std::string associated_data_;
+  std::string plaintext_;
 };
 
 class TestDecrypter : public QuicDecrypter {
@@ -135,8 +135,8 @@
                      size_t* output_length,
                      size_t max_output_length) override {
     packet_number_ = QuicPacketNumber(packet_number);
-    associated_data_ = QuicString(associated_data);
-    ciphertext_ = QuicString(ciphertext);
+    associated_data_ = std::string(associated_data);
+    ciphertext_ = std::string(ciphertext);
     memcpy(output, ciphertext.data(), ciphertext.length());
     *output_length = ciphertext.length();
     return true;
@@ -148,8 +148,8 @@
   // Use a distinct value starting with 0xFFFFFF, which is never used by TLS.
   uint32_t cipher_id() const override { return 0xFFFFFFF2; }
   QuicPacketNumber packet_number_;
-  QuicString associated_data_;
-  QuicString ciphertext_;
+  std::string associated_data_;
+  std::string ciphertext_;
 };
 
 class TestQuicVisitor : public QuicFramerVisitorInterface {
@@ -220,8 +220,8 @@
   bool OnStreamFrame(const QuicStreamFrame& frame) override {
     ++frame_count_;
     // Save a copy of the data so it is valid after the packet is processed.
-    QuicString* string_data =
-        new QuicString(frame.data_buffer, frame.data_length);
+    std::string* string_data =
+        new std::string(frame.data_buffer, frame.data_length);
     stream_data_.push_back(QuicWrapUnique(string_data));
     stream_frames_.push_back(QuicMakeUnique<QuicStreamFrame>(
         frame.stream_id, frame.fin, frame.offset, *string_data));
@@ -231,8 +231,8 @@
   bool OnCryptoFrame(const QuicCryptoFrame& frame) override {
     ++frame_count_;
     // Save a copy of the data so it is valid after the packet is processed.
-    QuicString* string_data =
-        new QuicString(frame.data_buffer, frame.data_length);
+    std::string* string_data =
+        new std::string(frame.data_buffer, frame.data_length);
     crypto_data_.push_back(QuicWrapUnique(string_data));
     crypto_frames_.push_back(QuicMakeUnique<QuicCryptoFrame>(
         ENCRYPTION_NONE, frame.offset, *string_data));
@@ -407,14 +407,14 @@
   QuicNewConnectionIdFrame new_connection_id_;
   QuicRetireConnectionIdFrame retire_connection_id_;
   QuicNewTokenFrame new_token_;
-  std::vector<std::unique_ptr<QuicString>> stream_data_;
-  std::vector<std::unique_ptr<QuicString>> crypto_data_;
+  std::vector<std::unique_ptr<std::string>> stream_data_;
+  std::vector<std::unique_ptr<std::string>> crypto_data_;
 };
 
 // Simple struct for defining a packet's content, and associated
 // parse error.
 struct PacketFragment {
-  QuicString error_if_missing;
+  std::string error_if_missing;
   std::vector<unsigned char> fragment;
 };
 
@@ -569,7 +569,7 @@
     // Check all the various prefixes of |packet| for the expected
     // parse error and error code.
     for (size_t i = 0; i < packet->length(); ++i) {
-      QuicString expected_error;
+      std::string expected_error;
       size_t len = 0;
       for (const auto& fragment : fragments) {
         len += fragment.fragment.size();
@@ -588,7 +588,7 @@
 
   void CheckProcessingFails(const QuicEncryptedPacket& packet,
                             size_t len,
-                            QuicString expected_error,
+                            std::string expected_error,
                             QuicErrorCode error_code) {
     QuicEncryptedPacket encrypted(packet.data(), len, false);
     EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
@@ -598,7 +598,7 @@
 
   void CheckProcessingFails(unsigned char* packet,
                             size_t len,
-                            QuicString expected_error,
+                            std::string expected_error,
                             QuicErrorCode error_code) {
     QuicEncryptedPacket encrypted(AsChars(packet), len, false);
     EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len;
@@ -607,8 +607,8 @@
   }
 
   // Checks if the supplied string matches data in the supplied StreamFrame.
-  void CheckStreamFrameData(QuicString str, QuicStreamFrame* frame) {
-    EXPECT_EQ(str, QuicString(frame->data_buffer, frame->data_length));
+  void CheckStreamFrameData(std::string str, QuicStreamFrame* frame) {
+    EXPECT_EQ(str, std::string(frame->data_buffer, frame->data_length));
   }
 
   void CheckCalculatePacketNumber(uint64_t expected_packet_number,
@@ -6210,7 +6210,8 @@
   ASSERT_EQ(1u, visitor_.crypto_frames_.size());
   QuicCryptoFrame* frame = visitor_.crypto_frames_[0].get();
   EXPECT_EQ(kStreamOffset, frame->offset);
-  EXPECT_EQ("hello world!", QuicString(frame->data_buffer, frame->data_length));
+  EXPECT_EQ("hello world!",
+            std::string(frame->data_buffer, frame->data_length));
 
   CheckFramingBoundaries(packet, QUIC_INVALID_FRAME_DATA);
 }
@@ -7377,7 +7378,7 @@
   } else {
     close_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
   }
-  close_frame.error_details = QuicString(2048, 'A');
+  close_frame.error_details = std::string(2048, 'A');
   QuicFrames frames = {QuicFrame(&close_frame)};
 
   // clang-format off
@@ -7662,7 +7663,7 @@
 
   QuicApplicationCloseFrame app_close_frame;
   app_close_frame.error_code = static_cast<QuicErrorCode>(0x11);
-  app_close_frame.error_details = QuicString(2048, 'A');
+  app_close_frame.error_details = std::string(2048, 'A');
 
   QuicFrames frames = {QuicFrame(&app_close_frame)};
 
@@ -7846,7 +7847,7 @@
   QuicGoAwayFrame goaway_frame;
   goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708);
   goaway_frame.last_good_stream_id = kStreamId;
-  goaway_frame.reason_phrase = QuicString(2048, 'A');
+  goaway_frame.reason_phrase = std::string(2048, 'A');
 
   QuicFrames frames = {QuicFrame(&goaway_frame)};
 
@@ -9605,7 +9606,7 @@
   return (frame.stream_id == kTestQuicStreamId ||
           frame.stream_id == QuicUtils::GetCryptoStreamId(QUIC_VERSION_99)) &&
          !frame.fin && frame.offset == 0 &&
-         QuicString(frame.data_buffer, frame.data_length) == kTestString;
+         std::string(frame.data_buffer, frame.data_length) == kTestString;
   // FIN is hard-coded false in ConstructEncryptedPacket.
   // Offset 0 is hard-coded in ConstructEncryptedPacket.
 }
@@ -11223,8 +11224,8 @@
   uint8_t expected_token_value[] = {0x00, 0x01, 0x02, 0x03,
                                     0x04, 0x05, 0x06, 0x07};
 
-  QuicNewTokenFrame frame(0, QuicString((const char*)(expected_token_value),
-                                        sizeof(expected_token_value)));
+  QuicNewTokenFrame frame(0, std::string((const char*)(expected_token_value),
+                                         sizeof(expected_token_value)));
 
   QuicFrames frames = {QuicFrame(&frame)};
 
@@ -11511,7 +11512,7 @@
             QuicFramer::GetRetransmittableControlFrameSize(
                 framer_.transport_version(), QuicFrame(&rst_stream)));
 
-  QuicString error_detail(2048, 'e');
+  std::string error_detail(2048, 'e');
   QuicConnectionCloseFrame connection_close(QUIC_NETWORK_IDLE_TIMEOUT,
                                             error_detail);
   EXPECT_EQ(QuicFramer::GetMinConnectionCloseFrameSize(
diff --git a/quic/core/quic_ietf_framer_test.cc b/quic/core/quic_ietf_framer_test.cc
index a959791..9e4f3b0 100644
--- a/quic/core/quic_ietf_framer_test.cc
+++ b/quic/core/quic_ietf_framer_test.cc
@@ -796,7 +796,7 @@
                         NETWORK_BYTE_ORDER);
 
   // empty string,
-  QuicString test_string = "Ich Bin Ein Jelly Donut?";
+  std::string test_string = "Ich Bin Ein Jelly Donut?";
   QuicConnectionCloseFrame sent_frame;
   sent_frame.error_code = static_cast<QuicErrorCode>(0);
   sent_frame.error_details = test_string;
@@ -831,7 +831,7 @@
                         NETWORK_BYTE_ORDER);
 
   // empty string,
-  QuicString test_string = "Ich Bin Ein Jelly Donut?";
+  std::string test_string = "Ich Bin Ein Jelly Donut?";
   QuicApplicationCloseFrame sent_frame;
   sent_frame.error_code = static_cast<QuicErrorCode>(0);
   sent_frame.error_details = test_string;
diff --git a/quic/core/quic_interval_set.h b/quic/core/quic_interval_set.h
index e2ca7a5..fe3165b 100644
--- a/quic/core/quic_interval_set.h
+++ b/quic/core/quic_interval_set.h
@@ -298,7 +298,7 @@
   // where the intervals are in the same order as given by traversal from
   // begin() to end(). This representation is intended for human consumption;
   // computer programs should not rely on the output being in exactly this form.
-  QuicString ToString() const;
+  std::string ToString() const;
 
   QuicIntervalSet& operator=(std::initializer_list<value_type> il) {
     assign(il.begin(), il.end());
@@ -809,7 +809,7 @@
 }
 
 template <typename T>
-QuicString QuicIntervalSet<T>::ToString() const {
+std::string QuicIntervalSet<T>::ToString() const {
   std::ostringstream os;
   os << *this;
   return os.str();
diff --git a/quic/core/quic_interval_set_test.cc b/quic/core/quic_interval_set_test.cc
index e823e4f..de45f6f 100644
--- a/quic/core/quic_interval_set_test.cc
+++ b/quic/core/quic_interval_set_test.cc
@@ -424,7 +424,7 @@
 }
 
 TEST_F(QuicIntervalSetTest, QuicIntervalSetIntersectionBothEmpty) {
-  QuicIntervalSet<QuicString> mine, theirs;
+  QuicIntervalSet<std::string> mine, theirs;
   EXPECT_FALSE(mine.Intersects(theirs));
   EXPECT_FALSE(theirs.Intersects(mine));
   mine.Intersection(theirs);
@@ -434,8 +434,8 @@
 }
 
 TEST_F(QuicIntervalSetTest, QuicIntervalSetIntersectionEmptyMine) {
-  QuicIntervalSet<QuicString> mine;
-  QuicIntervalSet<QuicString> theirs("a", "b");
+  QuicIntervalSet<std::string> mine;
+  QuicIntervalSet<std::string> theirs("a", "b");
   EXPECT_FALSE(mine.Intersects(theirs));
   EXPECT_FALSE(theirs.Intersects(mine));
   mine.Intersection(theirs);
@@ -445,8 +445,8 @@
 }
 
 TEST_F(QuicIntervalSetTest, QuicIntervalSetIntersectionEmptyTheirs) {
-  QuicIntervalSet<QuicString> mine("a", "b");
-  QuicIntervalSet<QuicString> theirs;
+  QuicIntervalSet<std::string> mine("a", "b");
+  QuicIntervalSet<std::string> theirs;
   EXPECT_FALSE(mine.Intersects(theirs));
   EXPECT_FALSE(theirs.Intersects(mine));
   mine.Intersection(theirs);
@@ -456,8 +456,8 @@
 }
 
 TEST_F(QuicIntervalSetTest, QuicIntervalSetIntersectionTheirsBeforeMine) {
-  QuicIntervalSet<QuicString> mine("y", "z");
-  QuicIntervalSet<QuicString> theirs;
+  QuicIntervalSet<std::string> mine("y", "z");
+  QuicIntervalSet<std::string> theirs;
   theirs.Add("a", "b");
   theirs.Add("c", "d");
   EXPECT_FALSE(mine.Intersects(theirs));
@@ -469,10 +469,10 @@
 }
 
 TEST_F(QuicIntervalSetTest, QuicIntervalSetIntersectionMineBeforeTheirs) {
-  QuicIntervalSet<QuicString> mine;
+  QuicIntervalSet<std::string> mine;
   mine.Add("a", "b");
   mine.Add("c", "d");
-  QuicIntervalSet<QuicString> theirs("y", "z");
+  QuicIntervalSet<std::string> theirs("y", "z");
   EXPECT_FALSE(mine.Intersects(theirs));
   EXPECT_FALSE(theirs.Intersects(mine));
   mine.Intersection(theirs);
@@ -682,7 +682,7 @@
 }
 
 TEST_F(QuicIntervalSetTest, QuicIntervalSetDifferenceEmptyMine) {
-  QuicIntervalSet<QuicString> mine, theirs;
+  QuicIntervalSet<std::string> mine, theirs;
   theirs.Add("a", "b");
 
   mine.Difference(theirs);
@@ -690,7 +690,7 @@
 }
 
 TEST_F(QuicIntervalSetTest, QuicIntervalSetDifferenceEmptyTheirs) {
-  QuicIntervalSet<QuicString> mine, theirs;
+  QuicIntervalSet<std::string> mine, theirs;
   mine.Add("a", "b");
 
   mine.Difference(theirs);
@@ -700,7 +700,7 @@
 }
 
 TEST_F(QuicIntervalSetTest, QuicIntervalSetDifferenceTheirsBeforeMine) {
-  QuicIntervalSet<QuicString> mine, theirs;
+  QuicIntervalSet<std::string> mine, theirs;
   mine.Add("y", "z");
   theirs.Add("a", "b");
 
@@ -711,7 +711,7 @@
 }
 
 TEST_F(QuicIntervalSetTest, QuicIntervalSetDifferenceMineBeforeTheirs) {
-  QuicIntervalSet<QuicString> mine, theirs;
+  QuicIntervalSet<std::string> mine, theirs;
   mine.Add("a", "b");
   theirs.Add("y", "z");
 
@@ -722,10 +722,10 @@
 }
 
 TEST_F(QuicIntervalSetTest, QuicIntervalSetDifferenceIdentical) {
-  QuicIntervalSet<QuicString> mine;
+  QuicIntervalSet<std::string> mine;
   mine.Add("a", "b");
   mine.Add("c", "d");
-  QuicIntervalSet<QuicString> theirs(mine);
+  QuicIntervalSet<std::string> theirs(mine);
 
   mine.Difference(theirs);
   EXPECT_TRUE(mine.Empty());
diff --git a/quic/core/quic_interval_test.cc b/quic/core/quic_interval_test.cc
index 143d417..50e8a50 100644
--- a/quic/core/quic_interval_test.cc
+++ b/quic/core/quic_interval_test.cc
@@ -402,7 +402,7 @@
 TEST_F(QuicIntervalTest, IntervalOfTypeWithNoOperatorMinus) {
   // QuicInterval<T> should work even if T does not support operator-().  We
   // just can't call QuicInterval<T>::Length() for such types.
-  const QuicInterval<QuicString> d1("a", "b");
+  const QuicInterval<std::string> d1("a", "b");
   const QuicInterval<std::pair<int, int>> d2({1, 2}, {4, 3});
   EXPECT_EQ("a", d1.min());
   EXPECT_EQ("b", d1.max());
diff --git a/quic/core/quic_packet_creator.cc b/quic/core/quic_packet_creator.cc
index 9d823bc..2fd5203 100644
--- a/quic/core/quic_packet_creator.cc
+++ b/quic/core/quic_packet_creator.cc
@@ -188,7 +188,7 @@
   if (FLAGS_quic_enforce_single_packet_chlo &&
       StreamFrameStartsWithChlo(frame->stream_frame) &&
       frame->stream_frame.data_length < write_length) {
-    const QuicString error_details =
+    const std::string error_details =
         "Client hello won't fit in a single packet.";
     QUIC_BUG << error_details << " Constructed stream frame length: "
              << frame->stream_frame.data_length
@@ -380,7 +380,7 @@
 
 void QuicPacketCreator::OnSerializedPacket() {
   if (packet_.encrypted_buffer == nullptr) {
-    const QuicString error_details = "Failed to SerializePacket.";
+    const std::string error_details = "Failed to SerializePacket.";
     QUIC_BUG << error_details;
     delegate_->OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET,
                                     error_details,
@@ -792,7 +792,7 @@
 }
 
 void QuicPacketCreator::SetRetryToken(QuicStringPiece retry_token) {
-  retry_token_ = QuicString(retry_token);
+  retry_token_ = std::string(retry_token);
 }
 
 QuicVariableLengthIntegerLength QuicPacketCreator::GetLengthLength() const {
@@ -849,7 +849,7 @@
       frame.stream_frame.stream_id !=
           QuicUtils::GetCryptoStreamId(framer_->transport_version()) &&
       packet_.encryption_level == ENCRYPTION_NONE) {
-    const QuicString error_details =
+    const std::string error_details =
         "Cannot send stream data without encryption.";
     QUIC_BUG << error_details;
     delegate_->OnUnrecoverableError(
diff --git a/quic/core/quic_packet_creator.h b/quic/core/quic_packet_creator.h
index f4512c3..3ff5819 100644
--- a/quic/core/quic_packet_creator.h
+++ b/quic/core/quic_packet_creator.h
@@ -390,7 +390,7 @@
   SerializedPacket packet_;
 
   // Retry token to send over the wire in v99 IETF Initial packets.
-  QuicString retry_token_;
+  std::string retry_token_;
 
   // Pending padding bytes to send. Pending padding bytes will be sent in next
   // packet(s) (after all other frames) if current constructed packet does not
diff --git a/quic/core/quic_packet_creator_test.cc b/quic/core/quic_packet_creator_test.cc
index c15955c..87b6897 100644
--- a/quic/core/quic_packet_creator_test.cc
+++ b/quic/core/quic_packet_creator_test.cc
@@ -179,7 +179,7 @@
 
   void CheckStreamFrame(const QuicFrame& frame,
                         QuicStreamId stream_id,
-                        const QuicString& data,
+                        const std::string& data,
                         QuicStreamOffset offset,
                         bool fin) {
     EXPECT_EQ(STREAM_FRAME, frame.type);
@@ -253,7 +253,7 @@
   QuicFramer client_framer_;
   StrictMock<MockFramerVisitor> framer_visitor_;
   StrictMock<MockPacketCreatorDelegate> delegate_;
-  QuicString data_;
+  std::string data_;
   struct iovec iov_;
   TestPacketCreator creator_;
   SerializedPacket serialized_packet_;
@@ -468,7 +468,7 @@
       GetStreamFrameOverhead(client_framer_.transport_version());
   size_t capacity = kDefaultMaxPacketSize - overhead;
   for (int delta = -5; delta <= 0; ++delta) {
-    QuicString data(capacity + delta, 'A');
+    std::string data(capacity + delta, 'A');
     size_t bytes_free = 0 - delta;
 
     QuicFrame frame;
@@ -532,7 +532,7 @@
 }
 
 TEST_P(QuicPacketCreatorTest, ConsumeCryptoData) {
-  QuicString data = "crypto data";
+  std::string data = "crypto data";
   QuicFrame frame;
   ASSERT_TRUE(creator_.ConsumeCryptoData(ENCRYPTION_NONE, data.length(), 0,
                                          NOT_RETRANSMISSION, &frame));
@@ -577,7 +577,7 @@
   EXPECT_EQ(0u, consumed);
   CheckStreamFrame(
       frame, QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
-      QuicString(), 0u, true);
+      std::string(), 0u, true);
   EXPECT_TRUE(creator_.HasPendingFrames());
 }
 
@@ -620,7 +620,7 @@
   size_t capacity = kDefaultMaxPacketSize - overhead;
   // Now, test various sizes around this size.
   for (int delta = -5; delta <= 5; ++delta) {
-    QuicString data(capacity + delta, 'A');
+    std::string data(capacity + delta, 'A');
     size_t bytes_free = delta > 0 ? 0 : 0 - delta;
     QuicFrame frame;
     MakeIOVector(data, &iov_);
@@ -651,7 +651,7 @@
   size_t capacity = kDefaultMaxPacketSize - overhead;
   // Now, test various sizes around this size.
   for (int delta = -5; delta <= 5; ++delta) {
-    QuicString data(capacity + delta, 'A');
+    std::string data(capacity + delta, 'A');
     size_t bytes_free = delta > 0 ? 0 : 0 - delta;
 
     QuicFrame frame;
@@ -691,7 +691,7 @@
   size_t capacity = kDefaultMaxPacketSize - overhead;
   // Now, test various sizes around this size.
   for (int delta = -5; delta <= 5; ++delta) {
-    QuicString data(capacity + delta, 'A');
+    std::string data(capacity + delta, 'A');
     size_t bytes_free = delta > 0 ? 0 : 0 - delta;
 
     QuicFrame frame;
@@ -1128,7 +1128,7 @@
       QuicPacketCreatorPeer::GetRetryTokenLengthLength(&creator_),
       QuicPacketCreatorPeer::GetLengthLength(&creator_), &payload_length));
   QuicFrame frame;
-  const QuicString too_long_payload(payload_length * 2, 'a');
+  const std::string too_long_payload(payload_length * 2, 'a');
   MakeIOVector(too_long_payload, &iov_);
   EXPECT_CALL(delegate_, OnSerializedPacket(_))
       .WillOnce(Invoke(this, &QuicPacketCreatorTest::SaveSerializedPacket));
@@ -1137,7 +1137,7 @@
       1u, iov_.iov_len, 0u, 0u, true, false, NOT_RETRANSMISSION, &frame));
   size_t consumed = frame.stream_frame.data_length;
   EXPECT_EQ(payload_length, consumed);
-  const QuicString payload(payload_length, 'a');
+  const std::string payload(payload_length, 'a');
   CheckStreamFrame(
       frame, QuicUtils::GetCryptoStreamId(client_framer_.transport_version()),
       payload, 0u, false);
@@ -1510,7 +1510,7 @@
   // Verify that there is enough room for the largest message payload.
   EXPECT_TRUE(
       creator_.HasRoomForMessageFrame(creator_.GetLargestMessagePayload()));
-  QuicString message(creator_.GetLargestMessagePayload(), 'a');
+  std::string message(creator_.GetLargestMessagePayload(), 'a');
   QuicMessageFrame* message_frame = new QuicMessageFrame(1);
   MakeSpan(&allocator_, message, &storage)
       .SaveMemSlicesAsMessageData(message_frame);
@@ -1555,7 +1555,7 @@
   if (client_framer_.transport_version() <= QUIC_VERSION_44) {
     return;
   }
-  QuicString message_data(kDefaultMaxPacketSize, 'a');
+  std::string message_data(kDefaultMaxPacketSize, 'a');
   QuicStringPiece message_buffer(message_data);
   QuicMemSliceStorage storage(nullptr, 0, nullptr, 0);
   // Test all possible size of message frames.
@@ -1635,7 +1635,7 @@
                               9, 10, 11, 12, 13, 14, 15, 16};
 
   creator_.SetRetryToken(
-      QuicString(retry_token_bytes, sizeof(retry_token_bytes)));
+      std::string(retry_token_bytes, sizeof(retry_token_bytes)));
 
   frames_.push_back(QuicFrame(QuicStreamFrame(
       QuicUtils::GetCryptoStreamId(client_framer_.transport_version()), false,
diff --git a/quic/core/quic_packet_generator_test.cc b/quic/core/quic_packet_generator_test.cc
index 7b7d6ce..3903984 100644
--- a/quic/core/quic_packet_generator_test.cc
+++ b/quic/core/quic_packet_generator_test.cc
@@ -52,7 +52,7 @@
   MOCK_METHOD0(GetPacketBuffer, char*());
   MOCK_METHOD1(OnSerializedPacket, void(SerializedPacket* packet));
   MOCK_METHOD3(OnUnrecoverableError,
-               void(QuicErrorCode, const QuicString&, ConnectionCloseSource));
+               void(QuicErrorCode, const std::string&, ConnectionCloseSource));
 
   void SetCanWriteAnything() {
     EXPECT_CALL(*this, ShouldGeneratePacket(_, _)).WillRepeatedly(Return(true));
@@ -239,7 +239,7 @@
   }
 
   QuicGoAwayFrame* CreateGoAwayFrame() {
-    return new QuicGoAwayFrame(2, QUIC_NO_ERROR, 1, QuicString());
+    return new QuicGoAwayFrame(2, QUIC_NO_ERROR, 1, std::string());
   }
 
   void CheckPacketContains(const PacketContents& contents,
@@ -478,7 +478,7 @@
 
   EXPECT_CALL(delegate_, OnSerializedPacket(_))
       .WillOnce(Invoke(this, &QuicPacketGeneratorTest::SavePacket));
-  QuicString data = "crypto data";
+  std::string data = "crypto data";
   size_t consumed_bytes =
       generator_.ConsumeCryptoData(ENCRYPTION_NONE, data, 0);
   generator_.Flush();
@@ -1350,7 +1350,7 @@
   frame->error_code = QUIC_PACKET_WRITE_ERROR;
   char buf[2000] = {};
   QuicStringPiece error_details(buf, 2000);
-  frame->error_details = QuicString(error_details);
+  frame->error_details = std::string(error_details);
   generator_.AddControlFrame(QuicFrame(frame), /*bundle_ack=*/false);
   EXPECT_TRUE(generator_.HasQueuedFrames());
   EXPECT_TRUE(generator_.HasRetransmittableFrames());
@@ -1533,7 +1533,7 @@
       MESSAGE_STATUS_SUCCESS,
       generator_.AddMessageFrame(
           2, MakeSpan(&allocator_,
-                      QuicString(generator_.GetLargestMessagePayload(), 'a'),
+                      std::string(generator_.GetLargestMessagePayload(), 'a'),
                       &storage)));
   EXPECT_TRUE(generator_.HasRetransmittableFrames());
 
@@ -1543,7 +1543,7 @@
       generator_.AddMessageFrame(
           3,
           MakeSpan(&allocator_,
-                   QuicString(generator_.GetLargestMessagePayload() + 10, 'a'),
+                   std::string(generator_.GetLargestMessagePayload() + 10, 'a'),
                    &storage)));
 }
 
diff --git a/quic/core/quic_packets.h b/quic/core/quic_packets.h
index d2aaf34..509fd08 100644
--- a/quic/core/quic_packets.h
+++ b/quic/core/quic_packets.h
@@ -140,7 +140,7 @@
   // An arbitrary string to identify an endpoint. Used by clients to
   // differentiate traffic from Google servers vs Non-google servers.
   // Will not be used if empty().
-  QuicString endpoint_id;
+  std::string endpoint_id;
 };
 
 struct QUIC_EXPORT_PRIVATE QuicVersionNegotiationPacket {
diff --git a/quic/core/quic_sent_packet_manager.cc b/quic/core/quic_sent_packet_manager.cc
index 6d6710f..bfafe43 100644
--- a/quic/core/quic_sent_packet_manager.cc
+++ b/quic/core/quic_sent_packet_manager.cc
@@ -1010,7 +1010,7 @@
   return retransmission_delay;
 }
 
-QuicString QuicSentPacketManager::GetDebugState() const {
+std::string QuicSentPacketManager::GetDebugState() const {
   return send_algorithm_->GetDebugState();
 }
 
diff --git a/quic/core/quic_sent_packet_manager.h b/quic/core/quic_sent_packet_manager.h
index aacdc34..873e88b 100644
--- a/quic/core/quic_sent_packet_manager.h
+++ b/quic/core/quic_sent_packet_manager.h
@@ -237,7 +237,7 @@
   }
 
   // Returns debugging information about the state of the congestion controller.
-  QuicString GetDebugState() const;
+  std::string GetDebugState() const;
 
   // Returns the number of bytes that are considered in-flight, i.e. not lost or
   // acknowledged.
diff --git a/quic/core/quic_server_id.cc b/quic/core/quic_server_id.cc
index ab35d6e..43b94b1 100644
--- a/quic/core/quic_server_id.cc
+++ b/quic/core/quic_server_id.cc
@@ -14,10 +14,10 @@
 
 QuicServerId::QuicServerId() : QuicServerId("", 0, false) {}
 
-QuicServerId::QuicServerId(const QuicString& host, uint16_t port)
+QuicServerId::QuicServerId(const std::string& host, uint16_t port)
     : QuicServerId(host, port, false) {}
 
-QuicServerId::QuicServerId(const QuicString& host,
+QuicServerId::QuicServerId(const std::string& host,
                            uint16_t port,
                            bool privacy_mode_enabled)
     : host_(host), port_(port), privacy_mode_enabled_(privacy_mode_enabled) {}
diff --git a/quic/core/quic_server_id.h b/quic/core/quic_server_id.h
index 62c0fda..33a0f0a 100644
--- a/quic/core/quic_server_id.h
+++ b/quic/core/quic_server_id.h
@@ -17,8 +17,8 @@
 class QUIC_EXPORT_PRIVATE QuicServerId {
  public:
   QuicServerId();
-  QuicServerId(const QuicString& host, uint16_t port);
-  QuicServerId(const QuicString& host,
+  QuicServerId(const std::string& host, uint16_t port);
+  QuicServerId(const std::string& host,
                uint16_t port,
                bool privacy_mode_enabled);
   ~QuicServerId();
@@ -27,7 +27,7 @@
   bool operator<(const QuicServerId& other) const;
   bool operator==(const QuicServerId& other) const;
 
-  const QuicString& host() const { return host_; }
+  const std::string& host() const { return host_; }
 
   uint16_t port() const { return port_; }
 
@@ -36,7 +36,7 @@
   size_t EstimateMemoryUsage() const;
 
  private:
-  QuicString host_;
+  std::string host_;
   uint16_t port_;
   bool privacy_mode_enabled_;
 };
diff --git a/quic/core/quic_server_id_test.cc b/quic/core/quic_server_id_test.cc
index e7a2abe..01e5a81 100644
--- a/quic/core/quic_server_id_test.cc
+++ b/quic/core/quic_server_id_test.cc
@@ -116,7 +116,7 @@
 }
 
 TEST_F(QuicServerIdTest, EstimateMemoryUsage) {
-  QuicString host = "this is a rather very quite long hostname";
+  std::string host = "this is a rather very quite long hostname";
   uint16_t port = 10;
   bool privacy_mode_enabled = true;
   QuicServerId server_id(host, port, privacy_mode_enabled);
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index 09e3865..151fa18 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -289,7 +289,7 @@
 }
 
 void QuicSession::OnConnectionClosed(QuicErrorCode error,
-                                     const QuicString& error_details,
+                                     const std::string& error_details,
                                      ConnectionCloseSource source) {
   DCHECK(!connection_->connected());
   if (error_ == QUIC_NO_ERROR) {
@@ -617,7 +617,7 @@
 }
 
 void QuicSession::SendGoAway(QuicErrorCode error_code,
-                             const QuicString& reason) {
+                             const std::string& reason) {
   // GOAWAY frame is not supported in v99.
   DCHECK_NE(QUIC_VERSION_99, connection_->transport_version());
   if (goaway_sent_) {
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h
index 6cd766f..68cc96e 100644
--- a/quic/core/quic_session.h
+++ b/quic/core/quic_session.h
@@ -54,7 +54,7 @@
     // Called when the connection is closed after the streams have been closed.
     virtual void OnConnectionClosed(QuicConnectionId connection_id,
                                     QuicErrorCode error,
-                                    const QuicString& error_details,
+                                    const std::string& error_details,
                                     ConnectionCloseSource source) = 0;
 
     // Called when the session has become write blocked.
@@ -106,7 +106,7 @@
   void OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) override;
   void OnBlockedFrame(const QuicBlockedFrame& frame) override;
   void OnConnectionClosed(QuicErrorCode error,
-                          const QuicString& error_details,
+                          const std::string& error_details,
                           ConnectionCloseSource source) override;
   void OnWriteBlocked() override;
   void OnSuccessfulVersionNegotiation(
@@ -203,7 +203,7 @@
                              QuicStreamOffset bytes_written);
 
   // Called when the session wants to go away and not accept any new streams.
-  virtual void SendGoAway(QuicErrorCode error_code, const QuicString& reason);
+  virtual void SendGoAway(QuicErrorCode error_code, const std::string& reason);
 
   // Sends a BLOCKED frame.
   virtual void SendBlocked(QuicStreamId id);
diff --git a/quic/core/quic_session_test.cc b/quic/core/quic_session_test.cc
index 928f690..fba914f 100644
--- a/quic/core/quic_session_test.cc
+++ b/quic/core/quic_session_test.cc
@@ -65,7 +65,7 @@
     encryption_established_ = true;
     handshake_confirmed_ = true;
     CryptoHandshakeMessage msg;
-    QuicString error_details;
+    std::string error_details;
     session()->config()->SetInitialStreamFlowControlWindowToSend(
         kInitialStreamFlowControlWindowForTest);
     session()->config()->SetInitialSessionFlowControlWindowToSend(
@@ -717,7 +717,7 @@
   EXPECT_CALL(*connection_, SendControlFrame(_));
   EXPECT_CALL(*connection_, OnStreamReset(closed_stream_id, _));
   stream2->Reset(QUIC_BAD_APPLICATION_PAYLOAD);
-  QuicString msg =
+  std::string msg =
       QuicStrCat("Marking unknown stream ", closed_stream_id, " blocked.");
   EXPECT_QUIC_BUG(session_.MarkConnectionLevelWriteBlocked(closed_stream_id),
                   msg);
@@ -1218,7 +1218,7 @@
 
   // Create a stream, and send enough data to make it flow control blocked.
   TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
-  QuicString body(kMinimumFlowControlSendWindow, '.');
+  std::string body(kMinimumFlowControlSendWindow, '.');
   EXPECT_FALSE(stream2->flow_controller()->IsBlocked());
   EXPECT_FALSE(session_.IsConnectionFlowControlBlocked());
   EXPECT_FALSE(session_.IsStreamFlowControlBlocked());
@@ -1370,7 +1370,7 @@
   // adjusting the connection level flow control receive window to take into
   // account the total number of bytes sent by the peer.
   const QuicStreamOffset kByteOffset = 5678;
-  QuicString body = "hello";
+  std::string body = "hello";
   QuicStreamFrame frame(stream->id(), true, kByteOffset, QuicStringPiece(body));
   session_.OnStreamFrame(frame);
 
@@ -1735,7 +1735,7 @@
   session_.set_writev_consumes_all_data(true);
 
   TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
-  QuicString body(100, '.');
+  std::string body(100, '.');
   stream2->WriteOrBufferData(body, false, nullptr);
   EXPECT_TRUE(stream2->IsWaitingForAcks());
   EXPECT_EQ(1u, QuicStreamPeer::SendBuffer(stream2).size());
@@ -2023,7 +2023,7 @@
 
   session_.set_writev_consumes_all_data(true);
   TestStream* stream2 = session_.CreateOutgoingBidirectionalStream();
-  QuicString body(100, '.');
+  std::string body(100, '.');
   stream2->CloseReadSide();
   stream2->WriteOrBufferData(body, true, nullptr);
   EXPECT_TRUE(stream2->IsWaitingForAcks());
@@ -2074,7 +2074,7 @@
   TestStream* stream4 = new TestStream(GetNthServerInitiatedUnidirectionalId(1),
                                        &session_, WRITE_UNIDIRECTIONAL);
   session_.ActivateStream(QuicWrapUnique(stream4));
-  QuicString body(100, '.');
+  std::string body(100, '.');
   stream4->WriteOrBufferData(body, false, nullptr);
   EXPECT_FALSE(QuicContainsKey(session_.zombie_streams(), stream4->id()));
   stream4->WriteOrBufferData(body, true, nullptr);
@@ -2103,7 +2103,7 @@
   // Discard all incoming data.
   stream4->StopReading();
 
-  QuicString data(100, '.');
+  std::string data(100, '.');
   QuicStreamFrame stream_frame(GetNthClientInitiatedUnidirectionalId(1), false,
                                0, data);
   stream4->OnStreamFrame(stream_frame);
@@ -2124,7 +2124,7 @@
               CloseConnection(
                   QUIC_TRY_TO_WRITE_DATA_ON_READ_UNIDIRECTIONAL_STREAM, _, _))
       .Times(1);
-  QuicString body(100, '.');
+  std::string body(100, '.');
   stream4->WriteOrBufferData(body, false, nullptr);
 }
 
@@ -2137,7 +2137,7 @@
               CloseConnection(
                   QUIC_TRY_TO_WRITE_DATA_ON_READ_UNIDIRECTIONAL_STREAM, _, _))
       .Times(1);
-  QuicString body(100, '.');
+  std::string body(100, '.');
   struct iovec iov = {const_cast<char*>(body.data()), body.length()};
   QuicMemSliceStorage storage(
       &iov, 1, session_.connection()->helper()->GetStreamSendBufferAllocator(),
diff --git a/quic/core/quic_socket_address_coder.cc b/quic/core/quic_socket_address_coder.cc
index bb1eaea..1cb8ff7 100644
--- a/quic/core/quic_socket_address_coder.cc
+++ b/quic/core/quic_socket_address_coder.cc
@@ -23,8 +23,8 @@
 
 QuicSocketAddressCoder::~QuicSocketAddressCoder() {}
 
-QuicString QuicSocketAddressCoder::Encode() const {
-  QuicString serialized;
+std::string QuicSocketAddressCoder::Encode() const {
+  std::string serialized;
   uint16_t address_family;
   switch (address_.host().address_family()) {
     case IpAddressFamily::IP_V4:
diff --git a/quic/core/quic_socket_address_coder.h b/quic/core/quic_socket_address_coder.h
index 6ac5d49..e02fc6e 100644
--- a/quic/core/quic_socket_address_coder.h
+++ b/quic/core/quic_socket_address_coder.h
@@ -25,7 +25,7 @@
   QuicSocketAddressCoder& operator=(const QuicSocketAddressCoder&) = delete;
   ~QuicSocketAddressCoder();
 
-  QuicString Encode() const;
+  std::string Encode() const;
 
   bool Decode(const char* data, size_t length);
 
diff --git a/quic/core/quic_socket_address_coder_test.cc b/quic/core/quic_socket_address_coder_test.cc
index eb65efa..b4a51dd 100644
--- a/quic/core/quic_socket_address_coder_test.cc
+++ b/quic/core/quic_socket_address_coder_test.cc
@@ -17,8 +17,8 @@
   QuicIpAddress ip;
   ip.FromString("4.31.198.44");
   QuicSocketAddressCoder coder(QuicSocketAddress(ip, 0x1234));
-  QuicString serialized = coder.Encode();
-  QuicString expected("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8);
+  std::string serialized = coder.Encode();
+  std::string expected("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8);
   EXPECT_EQ(expected, serialized);
 }
 
@@ -26,8 +26,8 @@
   QuicIpAddress ip;
   ip.FromString("2001:700:300:1800::f");
   QuicSocketAddressCoder coder(QuicSocketAddress(ip, 0x5678));
-  QuicString serialized = coder.Encode();
-  QuicString expected(
+  std::string serialized = coder.Encode();
+  std::string expected(
       "\x0a\x00"
       "\x20\x01\x07\x00\x03\x00\x18\x00"
       "\x00\x00\x00\x00\x00\x00\x00\x0f"
@@ -37,17 +37,17 @@
 }
 
 TEST_F(QuicSocketAddressCoderTest, DecodeIPv4) {
-  QuicString serialized("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8);
+  std::string serialized("\x02\x00\x04\x1f\xc6\x2c\x34\x12", 8);
   QuicSocketAddressCoder coder;
   ASSERT_TRUE(coder.Decode(serialized.data(), serialized.length()));
   EXPECT_EQ(IpAddressFamily::IP_V4, coder.ip().address_family());
-  QuicString expected_addr("\x04\x1f\xc6\x2c");
+  std::string expected_addr("\x04\x1f\xc6\x2c");
   EXPECT_EQ(expected_addr, coder.ip().ToPackedString());
   EXPECT_EQ(0x1234, coder.port());
 }
 
 TEST_F(QuicSocketAddressCoderTest, DecodeIPv6) {
-  QuicString serialized(
+  std::string serialized(
       "\x0a\x00"
       "\x20\x01\x07\x00\x03\x00\x18\x00"
       "\x00\x00\x00\x00\x00\x00\x00\x0f"
@@ -56,7 +56,7 @@
   QuicSocketAddressCoder coder;
   ASSERT_TRUE(coder.Decode(serialized.data(), serialized.length()));
   EXPECT_EQ(IpAddressFamily::IP_V6, coder.ip().address_family());
-  QuicString expected_addr(
+  std::string expected_addr(
       "\x20\x01\x07\x00\x03\x00\x18\x00"
       "\x00\x00\x00\x00\x00\x00\x00\x0f",
       16);
@@ -65,7 +65,7 @@
 }
 
 TEST_F(QuicSocketAddressCoderTest, DecodeBad) {
-  QuicString serialized(
+  std::string serialized(
       "\x0a\x00"
       "\x20\x01\x07\x00\x03\x00\x18\x00"
       "\x00\x00\x00\x00\x00\x00\x00\x0f"
@@ -114,7 +114,7 @@
     QuicIpAddress ip;
     ASSERT_TRUE(ip.FromString(test_case[i].ip_literal));
     QuicSocketAddressCoder encoder(QuicSocketAddress(ip, test_case[i].port));
-    QuicString serialized = encoder.Encode();
+    std::string serialized = encoder.Encode();
 
     QuicSocketAddressCoder decoder;
     ASSERT_TRUE(decoder.Decode(serialized.data(), serialized.length()));
diff --git a/quic/core/quic_stream.cc b/quic/core/quic_stream.cc
index 86207b6..91dace4 100644
--- a/quic/core/quic_stream.cc
+++ b/quic/core/quic_stream.cc
@@ -76,7 +76,7 @@
 }
 
 void PendingStream::CloseConnectionWithDetails(QuicErrorCode error,
-                                               const QuicString& details) {
+                                               const std::string& details) {
   session_->connection()->CloseConnection(
       error, details, ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
 }
@@ -402,7 +402,7 @@
 }
 
 void QuicStream::CloseConnectionWithDetails(QuicErrorCode error,
-                                            const QuicString& details) {
+                                            const std::string& details) {
   session()->connection()->CloseConnection(
       error, details, ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
 }
diff --git a/quic/core/quic_stream.h b/quic/core/quic_stream.h
index fe0a794..21d57b5 100644
--- a/quic/core/quic_stream.h
+++ b/quic/core/quic_stream.h
@@ -59,7 +59,7 @@
   void AddBytesConsumed(QuicByteCount bytes) override;
   void Reset(QuicRstStreamErrorCode error) override;
   void CloseConnectionWithDetails(QuicErrorCode error,
-                                  const QuicString& details) override;
+                                  const std::string& details) override;
   QuicStreamId id() const override;
   const QuicSocketAddress& PeerAddressOfLatestPacket() const override;
 
@@ -144,7 +144,7 @@
   // Called by the subclass or the sequencer to close the entire connection from
   // this end.
   void CloseConnectionWithDetails(QuicErrorCode error,
-                                  const QuicString& details) override;
+                                  const std::string& details) override;
 
   // Called by the stream sequencer as bytes are consumed from the buffer.
   // If the receive window has dropped below the threshold, then send a
diff --git a/quic/core/quic_stream_id_manager.h b/quic/core/quic_stream_id_manager.h
index 95951c0..11f8968 100644
--- a/quic/core/quic_stream_id_manager.h
+++ b/quic/core/quic_stream_id_manager.h
@@ -44,7 +44,7 @@
 
   // Generate a string suitable for sending to the log/etc to show current state
   // of the stream ID manager.
-  QuicString DebugString() const {
+  std::string DebugString() const {
     return QuicStrCat(
         " { max_allowed_outgoing_stream_id: ", max_allowed_outgoing_stream_id_,
         ", actual_max_allowed_incoming_stream_id_: ",
diff --git a/quic/core/quic_stream_id_manager_test.cc b/quic/core/quic_stream_id_manager_test.cc
index 51799e2..2958c89 100644
--- a/quic/core/quic_stream_id_manager_test.cc
+++ b/quic/core/quic_stream_id_manager_test.cc
@@ -329,7 +329,7 @@
   QuicStreamId stream_id =
       stream_id_manager_->actual_max_allowed_incoming_stream_id() +
       kV99StreamIdIncrement;
-  QuicString error_details =
+  std::string error_details =
       GetParam() ? "Stream id 401 above 397" : "Stream id 403 above 399";
   EXPECT_CALL(*connection_,
               CloseConnection(QUIC_INVALID_STREAM_ID, error_details, _));
@@ -603,7 +603,7 @@
   // jump is not allowed; make sure.
   first_dynamic += kV99StreamIdIncrement * 100;
   expected_max_incoming += kV99StreamIdIncrement * 100;
-  QuicString bug_detail =
+  std::string bug_detail =
       GetParam() ? "allocate 5 got 401" : "allocate 7 got 403";
   EXPECT_QUIC_BUG(
       stream_id_manager_->RegisterStaticStream(first_dynamic),
@@ -830,7 +830,7 @@
       stream_id_manager_->actual_max_allowed_incoming_stream_id() +
       kV99StreamIdIncrement * 20;
 
-  QuicString error_details =
+  std::string error_details =
       GetParam() ? "Stream id 480 above 400" : "Stream id 478 above 398";
   EXPECT_CALL(*connection_,
               CloseConnection(QUIC_INVALID_STREAM_ID, error_details, _));
diff --git a/quic/core/quic_stream_send_buffer_test.cc b/quic/core/quic_stream_send_buffer_test.cc
index a58f872..7670152 100644
--- a/quic/core/quic_stream_send_buffer_test.cc
+++ b/quic/core/quic_stream_send_buffer_test.cc
@@ -30,8 +30,8 @@
     EXPECT_EQ(0u, send_buffer_.size());
     EXPECT_EQ(0u, send_buffer_.stream_bytes_written());
     EXPECT_EQ(0u, send_buffer_.stream_bytes_outstanding());
-    QuicString data1(1536, 'a');
-    QuicString data2 = QuicString(256, 'b') + QuicString(256, 'c');
+    std::string data1(1536, 'a');
+    std::string data2 = std::string(256, 'b') + std::string(256, 'c');
     struct iovec iov[2];
     iov[0] = MakeIovec(QuicStringPiece(data1));
     iov[1] = MakeIovec(QuicStringPiece(data2));
@@ -77,11 +77,11 @@
 TEST_F(QuicStreamSendBufferTest, CopyDataToBuffer) {
   char buf[4000];
   QuicDataWriter writer(4000, buf, HOST_BYTE_ORDER);
-  QuicString copy1(1024, 'a');
-  QuicString copy2 =
-      QuicString(512, 'a') + QuicString(256, 'b') + QuicString(256, 'c');
-  QuicString copy3(1024, 'c');
-  QuicString copy4(768, 'd');
+  std::string copy1(1024, 'a');
+  std::string copy2 =
+      std::string(512, 'a') + std::string(256, 'b') + std::string(256, 'c');
+  std::string copy3(1024, 'c');
+  std::string copy4(768, 'd');
 
   ASSERT_TRUE(send_buffer_.WriteStreamData(0, 1024, &writer));
   EXPECT_EQ(copy1, QuicStringPiece(buf, 1024));
@@ -94,12 +94,12 @@
 
   // Test data piece across boundries.
   QuicDataWriter writer2(4000, buf, HOST_BYTE_ORDER);
-  QuicString copy5 =
-      QuicString(536, 'a') + QuicString(256, 'b') + QuicString(232, 'c');
+  std::string copy5 =
+      std::string(536, 'a') + std::string(256, 'b') + std::string(232, 'c');
   ASSERT_TRUE(send_buffer_.WriteStreamData(1000, 1024, &writer2));
   EXPECT_EQ(copy5, QuicStringPiece(buf, 1024));
   ASSERT_TRUE(send_buffer_.WriteStreamData(2500, 1024, &writer2));
-  QuicString copy6 = QuicString(572, 'c') + QuicString(452, 'd');
+  std::string copy6 = std::string(572, 'c') + std::string(452, 'd');
   EXPECT_EQ(copy6, QuicStringPiece(buf + 1024, 1024));
 
   // Invalid data copy.
diff --git a/quic/core/quic_stream_sequencer.cc b/quic/core/quic_stream_sequencer.cc
index 6311dcf..47c7c9f 100644
--- a/quic/core/quic_stream_sequencer.cc
+++ b/quic/core/quic_stream_sequencer.cc
@@ -60,12 +60,12 @@
                                       const char* data_buffer) {
   const size_t previous_readable_bytes = buffered_frames_.ReadableBytes();
   size_t bytes_written;
-  QuicString error_details;
+  std::string error_details;
   QuicErrorCode result = buffered_frames_.OnStreamData(
       byte_offset, QuicStringPiece(data_buffer, data_len), &bytes_written,
       &error_details);
   if (result != QUIC_NO_ERROR) {
-    QuicString details = QuicStrCat(
+    std::string details = QuicStrCat(
         "Stream ", stream_->id(), ": ", QuicErrorCodeToString(result), ": ",
         error_details,
         "\nPeer Address: ", stream_->PeerAddressOfLatestPacket().ToString());
@@ -161,7 +161,7 @@
   return buffered_frames_.PrefetchNextRegion(iov);
 }
 
-void QuicStreamSequencer::Read(QuicString* buffer) {
+void QuicStreamSequencer::Read(std::string* buffer) {
   DCHECK(!blocked_);
   buffer->resize(buffer->size() + ReadableBytes());
   iovec iov;
@@ -172,12 +172,12 @@
 
 int QuicStreamSequencer::Readv(const struct iovec* iov, size_t iov_len) {
   DCHECK(!blocked_);
-  QuicString error_details;
+  std::string error_details;
   size_t bytes_read;
   QuicErrorCode read_error =
       buffered_frames_.Readv(iov, iov_len, &bytes_read, &error_details);
   if (read_error != QUIC_NO_ERROR) {
-    QuicString details =
+    std::string details =
         QuicStrCat("Stream ", stream_->id(), ": ", error_details);
     stream_->CloseConnectionWithDetails(read_error, details);
     return static_cast<int>(bytes_read);
@@ -259,7 +259,7 @@
   return buffered_frames_.BytesConsumed();
 }
 
-const QuicString QuicStreamSequencer::DebugString() const {
+const std::string QuicStreamSequencer::DebugString() const {
   // clang-format off
   return QuicStrCat("QuicStreamSequencer:",
                 "\n  bytes buffered: ", NumBytesBuffered(),
diff --git a/quic/core/quic_stream_sequencer.h b/quic/core/quic_stream_sequencer.h
index 3feee5e..120b997 100644
--- a/quic/core/quic_stream_sequencer.h
+++ b/quic/core/quic_stream_sequencer.h
@@ -43,7 +43,7 @@
     // Called when an error has occurred which should result in the connection
     // being closed.
     virtual void CloseConnectionWithDetails(QuicErrorCode error,
-                                            const QuicString& details) = 0;
+                                            const std::string& details) = 0;
 
     // Returns the stream id of this stream.
     virtual QuicStreamId id() const = 0;
@@ -98,7 +98,7 @@
 
   // Appends all of the readable data to |buffer| and marks all of the appended
   // data as consumed.
-  void Read(QuicString* buffer);
+  void Read(std::string* buffer);
 
   // Returns true if the sequncer has bytes available for reading.
   bool HasBytesToRead() const;
@@ -153,7 +153,7 @@
   void set_stream(StreamInterface* stream) { stream_ = stream; }
 
   // Returns string describing internal state.
-  const QuicString DebugString() const;
+  const std::string DebugString() const;
 
  private:
   friend class test::QuicStreamSequencerPeer;
diff --git a/quic/core/quic_stream_sequencer_buffer.cc b/quic/core/quic_stream_sequencer_buffer.cc
index 485c9dc..75000bd 100644
--- a/quic/core/quic_stream_sequencer_buffer.cc
+++ b/quic/core/quic_stream_sequencer_buffer.cc
@@ -71,7 +71,7 @@
     QuicStreamOffset starting_offset,
     QuicStringPiece data,
     size_t* const bytes_buffered,
-    QuicString* error_details) {
+    std::string* error_details) {
   *bytes_buffered = 0;
   size_t size = data.size();
   if (size == 0) {
@@ -158,7 +158,7 @@
 bool QuicStreamSequencerBuffer::CopyStreamData(QuicStreamOffset offset,
                                                QuicStringPiece data,
                                                size_t* bytes_copy,
-                                               QuicString* error_details) {
+                                               std::string* error_details) {
   *bytes_copy = 0;
   size_t source_remaining = data.size();
   if (source_remaining == 0) {
@@ -236,7 +236,7 @@
 QuicErrorCode QuicStreamSequencerBuffer::Readv(const iovec* dest_iov,
                                                size_t dest_count,
                                                size_t* bytes_read,
-                                               QuicString* error_details) {
+                                               std::string* error_details) {
   *bytes_read = 0;
   for (size_t i = 0; i < dest_count && ReadableBytes() > 0; ++i) {
     char* dest = reinterpret_cast<char*>(dest_iov[i].iov_base);
@@ -500,12 +500,12 @@
   }
 }
 
-QuicString QuicStreamSequencerBuffer::GapsDebugString() {
+std::string QuicStreamSequencerBuffer::GapsDebugString() {
   // TODO(vasilvv): this should return the complement of |bytes_received_|.
   return bytes_received_.ToString();
 }
 
-QuicString QuicStreamSequencerBuffer::ReceivedFramesDebugString() {
+std::string QuicStreamSequencerBuffer::ReceivedFramesDebugString() {
   return bytes_received_.ToString();
 }
 
diff --git a/quic/core/quic_stream_sequencer_buffer.h b/quic/core/quic_stream_sequencer_buffer.h
index 7e547a9..683294e 100644
--- a/quic/core/quic_stream_sequencer_buffer.h
+++ b/quic/core/quic_stream_sequencer_buffer.h
@@ -27,11 +27,11 @@
 //
 // Expected Use:
 //  QuicStreamSequencerBuffer buffer(2.5 * 8 * 1024);
-//  QuicString source(1024, 'a');
+//  std::string source(1024, 'a');
 //  QuicStringPiece string_piece(source.data(), source.size());
 //  size_t written = 0;
 //  buffer.OnStreamData(800, string_piece, GetEpollClockNow(), &written);
-//  source = QuicString{800, 'b'};
+//  source = std::string{800, 'b'};
 //  QuicStringPiece string_piece1(source.data(), 800);
 //  // Try to write to [1, 801), but should fail due to overlapping,
 //  // res should be QUIC_INVALID_STREAM_DATA
@@ -109,14 +109,14 @@
   QuicErrorCode OnStreamData(QuicStreamOffset offset,
                              QuicStringPiece data,
                              size_t* bytes_buffered,
-                             QuicString* error_details);
+                             std::string* error_details);
 
   // Reads from this buffer into given iovec array, up to number of iov_len
   // iovec objects and returns the number of bytes read.
   QuicErrorCode Readv(const struct iovec* dest_iov,
                       size_t dest_count,
                       size_t* bytes_read,
-                      QuicString* error_details);
+                      std::string* error_details);
 
   // Returns the readable region of valid data in iovec format. The readable
   // region is the buffer region where there is valid data not yet read by
@@ -173,7 +173,7 @@
   bool CopyStreamData(QuicStreamOffset offset,
                       QuicStringPiece data,
                       size_t* bytes_copy,
-                      QuicString* error_details);
+                      std::string* error_details);
 
   // Dispose the given buffer block.
   // After calling this method, blocks_[index] is set to nullptr
@@ -213,10 +213,10 @@
   QuicStreamOffset NextExpectedByte() const;
 
   // Return |gaps_| as a string: [1024, 1500) [1800, 2048)... for debugging.
-  QuicString GapsDebugString();
+  std::string GapsDebugString();
 
   // Return all received frames as a string in same format as GapsDebugString();
-  QuicString ReceivedFramesDebugString();
+  std::string ReceivedFramesDebugString();
 
   // The maximum total capacity of this buffer in byte, as constructed.
   const size_t max_buffer_capacity_bytes_;
diff --git a/quic/core/quic_stream_sequencer_buffer_test.cc b/quic/core/quic_stream_sequencer_buffer_test.cc
index 7d5947c..d74bc9b 100644
--- a/quic/core/quic_stream_sequencer_buffer_test.cc
+++ b/quic/core/quic_stream_sequencer_buffer_test.cc
@@ -74,7 +74,7 @@
 
   std::unique_ptr<QuicStreamSequencerBuffer> buffer_;
   std::unique_ptr<QuicStreamSequencerBufferPeer> helper_;
-  QuicString error_details_;
+  std::string error_details_;
 };
 
 TEST_F(QuicStreamSequencerBufferTest, InitializeWithMaxRecvWindowSize) {
@@ -112,7 +112,7 @@
 
 TEST_F(QuicStreamSequencerBufferTest, OnStreamDataWithinBlock) {
   EXPECT_FALSE(helper_->IsBufferAllocated());
-  QuicString source(1024, 'a');
+  std::string source(1024, 'a');
   size_t written;
   EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(800, source, &written, &error_details_));
@@ -131,7 +131,7 @@
 
 TEST_F(QuicStreamSequencerBufferTest, Move) {
   EXPECT_FALSE(helper_->IsBufferAllocated());
-  QuicString source(1024, 'a');
+  std::string source(1024, 'a');
   size_t written;
   EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(800, source, &written, &error_details_));
@@ -168,7 +168,7 @@
 }
 
 TEST_F(QuicStreamSequencerBufferTest, OnStreamDataWithOverlap) {
-  QuicString source(1024, 'a');
+  std::string source(1024, 'a');
   // Write something into [800, 1824)
   size_t written;
   EXPECT_EQ(QUIC_NO_ERROR,
@@ -182,12 +182,12 @@
 
 TEST_F(QuicStreamSequencerBufferTest,
        OnStreamDataOverlapAndDuplicateCornerCases) {
-  QuicString source(1024, 'a');
+  std::string source(1024, 'a');
   // Write something into [800, 1824)
   size_t written;
   buffer_->OnStreamData(800, source, &written, &error_details_);
-  source = QuicString(800, 'b');
-  QuicString one_byte = "c";
+  source = std::string(800, 'b');
+  std::string one_byte = "c";
   // Write [1, 801).
   EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(1, source, &written, &error_details_));
@@ -205,12 +205,12 @@
 }
 
 TEST_F(QuicStreamSequencerBufferTest, OnStreamDataWithoutOverlap) {
-  QuicString source(1024, 'a');
+  std::string source(1024, 'a');
   // Write something into [800, 1824).
   size_t written;
   EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(800, source, &written, &error_details_));
-  source = QuicString(100, 'b');
+  source = std::string(100, 'b');
   // Write something into [kBlockSizeBytes * 2 - 20, kBlockSizeBytes * 2 + 80).
   EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(kBlockSizeBytes * 2 - 20, source, &written,
@@ -228,7 +228,7 @@
 
   // Three new out of order frames arrive.
   const size_t kBytesToWrite = 100;
-  QuicString source(kBytesToWrite, 'a');
+  std::string source(kBytesToWrite, 'a');
   size_t written;
   // Frame [2^32 + 500, 2^32 + 600).
   QuicStreamOffset offset = pow(2, 32) + 500;
@@ -252,7 +252,7 @@
 TEST_F(QuicStreamSequencerBufferTest, OnStreamDataTillEnd) {
   // Write 50 bytes to the end.
   const size_t kBytesToWrite = 50;
-  QuicString source(kBytesToWrite, 'a');
+  std::string source(kBytesToWrite, 'a');
   size_t written;
   EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(max_capacity_bytes_ - kBytesToWrite, source,
@@ -264,7 +264,7 @@
 TEST_F(QuicStreamSequencerBufferTest, OnStreamDataTillEndCorner) {
   // Write 1 byte to the end.
   const size_t kBytesToWrite = 1;
-  QuicString source(kBytesToWrite, 'a');
+  std::string source(kBytesToWrite, 'a');
   size_t written;
   EXPECT_EQ(QUIC_NO_ERROR,
             buffer_->OnStreamData(max_capacity_bytes_ - kBytesToWrite, source,
@@ -274,7 +274,7 @@
 }
 
 TEST_F(QuicStreamSequencerBufferTest, OnStreamDataBeyondCapacity) {
-  QuicString source(60, 'a');
+  std::string source(60, 'a');
   size_t written;
   EXPECT_EQ(QUIC_INTERNAL_ERROR,
             buffer_->OnStreamData(max_capacity_bytes_ - 50, source, &written,
@@ -308,12 +308,12 @@
 }
 
 TEST_F(QuicStreamSequencerBufferTest, Readv100Bytes) {
-  QuicString source(1024, 'a');
+  std::string source(1024, 'a');
   // Write something into [kBlockSizeBytes, kBlockSizeBytes + 1024).
   size_t written;
   buffer_->OnStreamData(kBlockSizeBytes, source, &written, &error_details_);
   EXPECT_FALSE(buffer_->HasBytesToRead());
-  source = QuicString(100, 'b');
+  source = std::string(100, 'b');
   // Write something into [0, 100).
   buffer_->OnStreamData(0, source, &written, &error_details_);
   EXPECT_TRUE(buffer_->HasBytesToRead());
@@ -325,14 +325,14 @@
   QUIC_LOG(ERROR) << error_details_;
   EXPECT_EQ(100u, read);
   EXPECT_EQ(100u, buffer_->BytesConsumed());
-  EXPECT_EQ(source, QuicString(dest, read));
+  EXPECT_EQ(source, std::string(dest, read));
   // The first block should be released as its data has been read out.
   EXPECT_EQ(nullptr, helper_->GetBlock(0));
   EXPECT_TRUE(helper_->CheckBufferInvariants());
 }
 
 TEST_F(QuicStreamSequencerBufferTest, ReadvAcrossBlocks) {
-  QuicString source(kBlockSizeBytes + 50, 'a');
+  std::string source(kBlockSizeBytes + 50, 'a');
   // Write 1st block to full and extand 50 bytes to next block.
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
@@ -346,7 +346,7 @@
     EXPECT_EQ(QUIC_NO_ERROR, buffer_->Readv(iovecs, 2, &read, &error_details_));
   }
   // The last read only reads the rest 50 bytes in 2nd block.
-  EXPECT_EQ(QuicString(50, 'a'), QuicString(dest, 50));
+  EXPECT_EQ(std::string(50, 'a'), std::string(dest, 50));
   EXPECT_EQ(0, dest[50]) << "Dest[50] shouln't be filled.";
   EXPECT_EQ(source.size(), buffer_->BytesConsumed());
   EXPECT_TRUE(buffer_->Empty());
@@ -354,7 +354,7 @@
 }
 
 TEST_F(QuicStreamSequencerBufferTest, ClearAfterRead) {
-  QuicString source(kBlockSizeBytes + 50, 'a');
+  std::string source(kBlockSizeBytes + 50, 'a');
   // Write 1st block to full with 'a'.
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
@@ -371,7 +371,7 @@
 
 TEST_F(QuicStreamSequencerBufferTest,
        OnStreamDataAcrossLastBlockAndFillCapacity) {
-  QuicString source(kBlockSizeBytes + 50, 'a');
+  std::string source(kBlockSizeBytes + 50, 'a');
   // Write 1st block to full with 'a'.
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
@@ -384,7 +384,7 @@
 
   // Write more than half block size of bytes in the last block with 'b', which
   // will wrap to the beginning and reaches the full capacity.
-  source = QuicString(0.5 * kBlockSizeBytes + 512, 'b');
+  source = std::string(0.5 * kBlockSizeBytes + 512, 'b');
   EXPECT_EQ(QUIC_NO_ERROR, buffer_->OnStreamData(2 * kBlockSizeBytes, source,
                                                  &written, &error_details_));
   EXPECT_EQ(source.size(), written);
@@ -393,7 +393,7 @@
 
 TEST_F(QuicStreamSequencerBufferTest,
        OnStreamDataAcrossLastBlockAndExceedCapacity) {
-  QuicString source(kBlockSizeBytes + 50, 'a');
+  std::string source(kBlockSizeBytes + 50, 'a');
   // Write 1st block to full.
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
@@ -405,7 +405,7 @@
 
   // Try to write from [max_capacity_bytes_ - 0.5 * kBlockSizeBytes,
   // max_capacity_bytes_ +  512 + 1). But last bytes exceeds current capacity.
-  source = QuicString(0.5 * kBlockSizeBytes + 512 + 1, 'b');
+  source = std::string(0.5 * kBlockSizeBytes + 512 + 1, 'b');
   EXPECT_EQ(QUIC_INTERNAL_ERROR,
             buffer_->OnStreamData(2 * kBlockSizeBytes, source, &written,
                                   &error_details_));
@@ -415,14 +415,14 @@
 TEST_F(QuicStreamSequencerBufferTest, ReadvAcrossLastBlock) {
   // Write to full capacity and read out 512 bytes at beginning and continue
   // appending 256 bytes.
-  QuicString source(max_capacity_bytes_, 'a');
+  std::string source(max_capacity_bytes_, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   char dest[512]{0};
   const iovec iov{dest, 512};
   size_t read;
   EXPECT_EQ(QUIC_NO_ERROR, buffer_->Readv(&iov, 1, &read, &error_details_));
-  source = QuicString(256, 'b');
+  source = std::string(256, 'b');
   buffer_->OnStreamData(max_capacity_bytes_, source, &written, &error_details_);
   EXPECT_TRUE(helper_->CheckBufferInvariants());
 
@@ -456,7 +456,7 @@
 
 TEST_F(QuicStreamSequencerBufferTest, ReleaseWholeBuffer) {
   // Tests that buffer is not deallocated unless ReleaseWholeBuffer() is called.
-  QuicString source(100, 'b');
+  std::string source(100, 'b');
   // Write something into [0, 100).
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
@@ -475,7 +475,7 @@
 
 TEST_F(QuicStreamSequencerBufferTest, GetReadableRegionsBlockedByGap) {
   // Write into [1, 1024).
-  QuicString source(1023, 'a');
+  std::string source(1023, 'a');
   size_t written;
   buffer_->OnStreamData(1, source, &written, &error_details_);
   // Try to get readable regions, but none is there.
@@ -487,7 +487,7 @@
 TEST_F(QuicStreamSequencerBufferTest, GetReadableRegionsTillEndOfBlock) {
   // Write first block to full with [0, 256) 'a' and the rest 'b' then read out
   // [0, 256)
-  QuicString source(kBlockSizeBytes, 'a');
+  std::string source(kBlockSizeBytes, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   char dest[256];
@@ -496,14 +496,14 @@
   iovec iovs[2];
   int iov_count = buffer_->GetReadableRegions(iovs, 2);
   EXPECT_EQ(1, iov_count);
-  EXPECT_EQ(QuicString(kBlockSizeBytes - 256, 'a'),
-            QuicString(reinterpret_cast<const char*>(iovs[0].iov_base),
-                       iovs[0].iov_len));
+  EXPECT_EQ(std::string(kBlockSizeBytes - 256, 'a'),
+            std::string(reinterpret_cast<const char*>(iovs[0].iov_base),
+                        iovs[0].iov_len));
 }
 
 TEST_F(QuicStreamSequencerBufferTest, GetReadableRegionsWithinOneBlock) {
   // Write into [0, 1024) and then read out [0, 256)
-  QuicString source(1024, 'a');
+  std::string source(1024, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   char dest[256];
@@ -512,15 +512,15 @@
   iovec iovs[2];
   int iov_count = buffer_->GetReadableRegions(iovs, 2);
   EXPECT_EQ(1, iov_count);
-  EXPECT_EQ(QuicString(1024 - 256, 'a'),
-            QuicString(reinterpret_cast<const char*>(iovs[0].iov_base),
-                       iovs[0].iov_len));
+  EXPECT_EQ(std::string(1024 - 256, 'a'),
+            std::string(reinterpret_cast<const char*>(iovs[0].iov_base),
+                        iovs[0].iov_len));
 }
 
 TEST_F(QuicStreamSequencerBufferTest,
        GetReadableRegionsAcrossBlockWithLongIOV) {
   // Write into [0, 2 * kBlockSizeBytes + 1024) and then read out [0, 1024)
-  QuicString source(2 * kBlockSizeBytes + 1024, 'a');
+  std::string source(2 * kBlockSizeBytes + 1024, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   char dest[1024];
@@ -538,13 +538,13 @@
        GetReadableRegionsWithMultipleIOVsAcrossEnd) {
   // Write into [0, 2 * kBlockSizeBytes + 1024) and then read out [0, 1024)
   // and then append 1024 + 512 bytes.
-  QuicString source(2.5 * kBlockSizeBytes - 1024, 'a');
+  std::string source(2.5 * kBlockSizeBytes - 1024, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   char dest[1024];
   helper_->Read(dest, 1024);
   // Write across the end.
-  source = QuicString(1024 + 512, 'b');
+  source = std::string(1024 + 512, 'b');
   buffer_->OnStreamData(2.5 * kBlockSizeBytes - 1024, source, &written,
                         &error_details_);
   // Use short iovec's.
@@ -558,9 +558,9 @@
   EXPECT_EQ(4, buffer_->GetReadableRegions(iovs1, 5));
   EXPECT_EQ(0.5 * kBlockSizeBytes, iovs1[2].iov_len);
   EXPECT_EQ(512u, iovs1[3].iov_len);
-  EXPECT_EQ(QuicString(512, 'b'),
-            QuicString(reinterpret_cast<const char*>(iovs1[3].iov_base),
-                       iovs1[3].iov_len));
+  EXPECT_EQ(std::string(512, 'b'),
+            std::string(reinterpret_cast<const char*>(iovs1[3].iov_base),
+                        iovs1[3].iov_len));
 }
 
 TEST_F(QuicStreamSequencerBufferTest, GetReadableRegionEmpty) {
@@ -572,7 +572,7 @@
 
 TEST_F(QuicStreamSequencerBufferTest, GetReadableRegionBeforeGap) {
   // Write into [1, 1024).
-  QuicString source(1023, 'a');
+  std::string source(1023, 'a');
   size_t written;
   buffer_->OnStreamData(1, source, &written, &error_details_);
   // GetReadableRegion should return false because range  [0,1) hasn't been
@@ -583,7 +583,7 @@
 
 TEST_F(QuicStreamSequencerBufferTest, GetReadableRegionTillEndOfBlock) {
   // Write into [0, kBlockSizeBytes + 1) and then read out [0, 256)
-  QuicString source(kBlockSizeBytes + 1, 'a');
+  std::string source(kBlockSizeBytes + 1, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   char dest[256];
@@ -592,13 +592,13 @@
   iovec iov;
   EXPECT_TRUE(buffer_->GetReadableRegion(&iov));
   EXPECT_EQ(
-      QuicString(kBlockSizeBytes - 256, 'a'),
-      QuicString(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len));
+      std::string(kBlockSizeBytes - 256, 'a'),
+      std::string(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len));
 }
 
 TEST_F(QuicStreamSequencerBufferTest, GetReadableRegionTillGap) {
   // Write into [0, kBlockSizeBytes - 1) and then read out [0, 256)
-  QuicString source(kBlockSizeBytes - 1, 'a');
+  std::string source(kBlockSizeBytes - 1, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   char dest[256];
@@ -607,8 +607,8 @@
   iovec iov;
   EXPECT_TRUE(buffer_->GetReadableRegion(&iov));
   EXPECT_EQ(
-      QuicString(kBlockSizeBytes - 1 - 256, 'a'),
-      QuicString(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len));
+      std::string(kBlockSizeBytes - 1 - 256, 'a'),
+      std::string(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len));
 }
 
 TEST_F(QuicStreamSequencerBufferTest, PrefetchEmptyBuffer) {
@@ -617,89 +617,89 @@
 }
 
 TEST_F(QuicStreamSequencerBufferTest, PrefetchInitialBuffer) {
-  QuicString source(kBlockSizeBytes, 'a');
+  std::string source(kBlockSizeBytes, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   iovec iov;
   EXPECT_TRUE(buffer_->PrefetchNextRegion(&iov));
-  EXPECT_EQ(source, QuicString(reinterpret_cast<const char*>(iov.iov_base),
-                               iov.iov_len));
+  EXPECT_EQ(source, std::string(reinterpret_cast<const char*>(iov.iov_base),
+                                iov.iov_len));
 }
 
 TEST_F(QuicStreamSequencerBufferTest, PrefetchBufferWithOffset) {
-  QuicString source(1024, 'a');
+  std::string source(1024, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   iovec iov;
   EXPECT_TRUE(buffer_->PrefetchNextRegion(&iov));
-  EXPECT_EQ(source, QuicString(reinterpret_cast<const char*>(iov.iov_base),
-                               iov.iov_len));
+  EXPECT_EQ(source, std::string(reinterpret_cast<const char*>(iov.iov_base),
+                                iov.iov_len));
   // The second frame goes into the same bucket.
-  QuicString source2(800, 'a');
+  std::string source2(800, 'a');
   buffer_->OnStreamData(1024, source2, &written, &error_details_);
   EXPECT_TRUE(buffer_->PrefetchNextRegion(&iov));
-  EXPECT_EQ(source2, QuicString(reinterpret_cast<const char*>(iov.iov_base),
-                                iov.iov_len));
+  EXPECT_EQ(source2, std::string(reinterpret_cast<const char*>(iov.iov_base),
+                                 iov.iov_len));
 }
 
 TEST_F(QuicStreamSequencerBufferTest, PrefetchBufferWithMultipleBucket) {
   const size_t data_size = 1024;
-  QuicString source(data_size, 'a');
+  std::string source(data_size, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   iovec iov;
   EXPECT_TRUE(buffer_->PrefetchNextRegion(&iov));
-  EXPECT_EQ(source, QuicString(reinterpret_cast<const char*>(iov.iov_base),
-                               iov.iov_len));
-  QuicString source2(kBlockSizeBytes, 'b');
+  EXPECT_EQ(source, std::string(reinterpret_cast<const char*>(iov.iov_base),
+                                iov.iov_len));
+  std::string source2(kBlockSizeBytes, 'b');
   buffer_->OnStreamData(data_size, source2, &written, &error_details_);
   EXPECT_TRUE(buffer_->PrefetchNextRegion(&iov));
   EXPECT_EQ(
-      QuicString(kBlockSizeBytes - data_size, 'b'),
-      QuicString(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len));
+      std::string(kBlockSizeBytes - data_size, 'b'),
+      std::string(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len));
   EXPECT_TRUE(buffer_->PrefetchNextRegion(&iov));
   EXPECT_EQ(
-      QuicString(data_size, 'b'),
-      QuicString(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len));
+      std::string(data_size, 'b'),
+      std::string(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len));
 }
 
 TEST_F(QuicStreamSequencerBufferTest, PrefetchBufferAfterBlockRetired) {
-  QuicString source(kBlockSizeBytes, 'a');
+  std::string source(kBlockSizeBytes, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   iovec iov;
   EXPECT_TRUE(buffer_->PrefetchNextRegion(&iov));
-  EXPECT_EQ(source, QuicString(reinterpret_cast<const char*>(iov.iov_base),
-                               iov.iov_len));
+  EXPECT_EQ(source, std::string(reinterpret_cast<const char*>(iov.iov_base),
+                                iov.iov_len));
   // Read the whole block so it's retired.
   char dest[kBlockSizeBytes];
   helper_->Read(dest, kBlockSizeBytes);
 
-  QuicString source2(300, 'b');
+  std::string source2(300, 'b');
   buffer_->OnStreamData(kBlockSizeBytes, source2, &written, &error_details_);
 
   EXPECT_TRUE(buffer_->PrefetchNextRegion(&iov));
-  EXPECT_EQ(source2, QuicString(reinterpret_cast<const char*>(iov.iov_base),
-                                iov.iov_len));
+  EXPECT_EQ(source2, std::string(reinterpret_cast<const char*>(iov.iov_base),
+                                 iov.iov_len));
 }
 
 TEST_F(QuicStreamSequencerBufferTest, PrefetchContinously) {
-  QuicString source(kBlockSizeBytes, 'a');
+  std::string source(kBlockSizeBytes, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   iovec iov;
   EXPECT_TRUE(buffer_->PrefetchNextRegion(&iov));
-  EXPECT_EQ(source, QuicString(reinterpret_cast<const char*>(iov.iov_base),
-                               iov.iov_len));
-  QuicString source2(kBlockSizeBytes, 'b');
+  EXPECT_EQ(source, std::string(reinterpret_cast<const char*>(iov.iov_base),
+                                iov.iov_len));
+  std::string source2(kBlockSizeBytes, 'b');
   buffer_->OnStreamData(kBlockSizeBytes, source2, &written, &error_details_);
   EXPECT_TRUE(buffer_->PrefetchNextRegion(&iov));
-  EXPECT_EQ(source2, QuicString(reinterpret_cast<const char*>(iov.iov_base),
-                                iov.iov_len));
+  EXPECT_EQ(source2, std::string(reinterpret_cast<const char*>(iov.iov_base),
+                                 iov.iov_len));
 }
 
 TEST_F(QuicStreamSequencerBufferTest, ConsumeMoreThanPrefetch) {
-  QuicString source(100, 'a');
+  std::string source(100, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   char dest[30];
@@ -707,32 +707,32 @@
   iovec iov;
   EXPECT_TRUE(buffer_->PrefetchNextRegion(&iov));
   EXPECT_EQ(
-      QuicString(70, 'a'),
-      QuicString(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len));
-  QuicString source2(100, 'b');
+      std::string(70, 'a'),
+      std::string(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len));
+  std::string source2(100, 'b');
   buffer_->OnStreamData(100, source2, &written, &error_details_);
   buffer_->MarkConsumed(100);
   EXPECT_TRUE(buffer_->PrefetchNextRegion(&iov));
   EXPECT_EQ(
-      QuicString(70, 'b'),
-      QuicString(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len));
+      std::string(70, 'b'),
+      std::string(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len));
 }
 
 TEST_F(QuicStreamSequencerBufferTest, PrefetchMoreThanBufferHas) {
-  QuicString source(100, 'a');
+  std::string source(100, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   iovec iov;
   EXPECT_TRUE(buffer_->PrefetchNextRegion(&iov));
   EXPECT_EQ(
-      QuicString(100, 'a'),
-      QuicString(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len));
+      std::string(100, 'a'),
+      std::string(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len));
   EXPECT_FALSE(buffer_->PrefetchNextRegion(&iov));
 }
 
 TEST_F(QuicStreamSequencerBufferTest, MarkConsumedInOneBlock) {
   // Write into [0, 1024) and then read out [0, 256)
-  QuicString source(1024, 'a');
+  std::string source(1024, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   char dest[256];
@@ -748,7 +748,7 @@
 
 TEST_F(QuicStreamSequencerBufferTest, MarkConsumedNotEnoughBytes) {
   // Write into [0, 1024) and then read out [0, 256)
-  QuicString source(1024, 'a');
+  std::string source(1024, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   char dest[256];
@@ -768,7 +768,7 @@
 
 TEST_F(QuicStreamSequencerBufferTest, MarkConsumedAcrossBlock) {
   // Write into [0, 2 * kBlockSizeBytes + 1024) and then read out [0, 1024)
-  QuicString source(2 * kBlockSizeBytes + 1024, 'a');
+  std::string source(2 * kBlockSizeBytes + 1024, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   char dest[1024];
@@ -783,12 +783,12 @@
 TEST_F(QuicStreamSequencerBufferTest, MarkConsumedAcrossEnd) {
   // Write into [0, 2.5 * kBlockSizeBytes - 1024) and then read out [0, 1024)
   // and then append 1024 + 512 bytes.
-  QuicString source(2.5 * kBlockSizeBytes - 1024, 'a');
+  std::string source(2.5 * kBlockSizeBytes - 1024, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   char dest[1024];
   helper_->Read(dest, 1024);
-  source = QuicString(1024 + 512, 'b');
+  source = std::string(1024 + 512, 'b');
   buffer_->OnStreamData(2.5 * kBlockSizeBytes - 1024, source, &written,
                         &error_details_);
   EXPECT_EQ(1024u, buffer_->BytesConsumed());
@@ -809,14 +809,14 @@
 
 TEST_F(QuicStreamSequencerBufferTest, FlushBufferedFrames) {
   // Write into [0, 2.5 * kBlockSizeBytes - 1024) and then read out [0, 1024).
-  QuicString source(max_capacity_bytes_ - 1024, 'a');
+  std::string source(max_capacity_bytes_ - 1024, 'a');
   size_t written;
   buffer_->OnStreamData(0, source, &written, &error_details_);
   char dest[1024];
   helper_->Read(dest, 1024);
   EXPECT_EQ(1024u, buffer_->BytesConsumed());
   // Write [1024, 512) to the physical beginning.
-  source = QuicString(512, 'b');
+  source = std::string(512, 'b');
   buffer_->OnStreamData(max_capacity_bytes_, source, &written, &error_details_);
   EXPECT_EQ(512u, written);
   EXPECT_EQ(max_capacity_bytes_ - 1024 + 512, buffer_->FlushBufferedFrames());
diff --git a/quic/core/quic_stream_sequencer_test.cc b/quic/core/quic_stream_sequencer_test.cc
index 989b0f6..a99bd28 100644
--- a/quic/core/quic_stream_sequencer_test.cc
+++ b/quic/core/quic_stream_sequencer_test.cc
@@ -33,7 +33,7 @@
   MOCK_METHOD0(OnFinRead, void());
   MOCK_METHOD0(OnDataAvailable, void());
   MOCK_METHOD2(CloseConnectionWithDetails,
-               void(QuicErrorCode error, const QuicString& details));
+               void(QuicErrorCode error, const std::string& details));
   MOCK_METHOD1(Reset, void(QuicRstStreamErrorCode error));
   MOCK_METHOD0(OnCanWrite, void());
   MOCK_METHOD1(AddBytesConsumed, void(QuicByteCount bytes));
@@ -70,28 +70,28 @@
       : stream_(), sequencer_(new QuicStreamSequencer(&stream_)) {}
 
   // Verify that the data in first region match with the expected[0].
-  bool VerifyReadableRegion(const std::vector<QuicString>& expected) {
+  bool VerifyReadableRegion(const std::vector<std::string>& expected) {
     return VerifyReadableRegion(*sequencer_, expected);
   }
 
   // Verify that the data in each of currently readable regions match with each
   // item given in |expected|.
-  bool VerifyReadableRegions(const std::vector<QuicString>& expected) {
+  bool VerifyReadableRegions(const std::vector<std::string>& expected) {
     return VerifyReadableRegions(*sequencer_, expected);
   }
 
   bool VerifyIovecs(iovec* iovecs,
                     size_t num_iovecs,
-                    const std::vector<QuicString>& expected) {
+                    const std::vector<std::string>& expected) {
     return VerifyIovecs(*sequencer_, iovecs, num_iovecs, expected);
   }
 
   bool VerifyReadableRegion(const QuicStreamSequencer& sequencer,
-                            const std::vector<QuicString>& expected) {
+                            const std::vector<std::string>& expected) {
     iovec iovecs[1];
     if (sequencer.GetReadableRegions(iovecs, 1)) {
       return (VerifyIovecs(sequencer, iovecs, 1,
-                           std::vector<QuicString>{expected[0]}));
+                           std::vector<std::string>{expected[0]}));
     }
     return false;
   }
@@ -99,7 +99,7 @@
   // Verify that the data in each of currently readable regions match with each
   // item given in |expected|.
   bool VerifyReadableRegions(const QuicStreamSequencer& sequencer,
-                             const std::vector<QuicString>& expected) {
+                             const std::vector<std::string>& expected) {
     iovec iovecs[5];
     size_t num_iovecs =
         sequencer.GetReadableRegions(iovecs, QUIC_ARRAYSIZE(iovecs));
@@ -110,7 +110,7 @@
   bool VerifyIovecs(const QuicStreamSequencer& sequencer,
                     iovec* iovecs,
                     size_t num_iovecs,
-                    const std::vector<QuicString>& expected) {
+                    const std::vector<std::string>& expected) {
     int start_position = 0;
     for (size_t i = 0; i < num_iovecs; ++i) {
       if (!VerifyIovec(iovecs[i],
@@ -388,7 +388,7 @@
 
 class QuicSequencerRandomTest : public QuicStreamSequencerTest {
  public:
-  typedef std::pair<int, QuicString> Frame;
+  typedef std::pair<int, std::string> Frame;
   typedef std::vector<Frame> FrameList;
 
   void CreateFrames() {
@@ -398,7 +398,7 @@
       int size = std::min(OneToN(6), remaining_payload);
       int index = payload_size - remaining_payload;
       list_.push_back(
-          std::make_pair(index, QuicString(kPayload + index, size)));
+          std::make_pair(index, std::string(kPayload + index, size)));
       remaining_payload -= size;
     }
   }
@@ -424,9 +424,9 @@
     output_.append(output, bytes_read);
   }
 
-  QuicString output_;
+  std::string output_;
   // Data which peek at using GetReadableRegion if we back up.
-  QuicString peeked_;
+  std::string peeked_;
   SimpleRandom random_;
   FrameList list_;
 };
@@ -507,8 +507,8 @@
       ASSERT_EQ(output_.size(), peeked_.size());
     }
   }
-  EXPECT_EQ(QuicString(kPayload), output_);
-  EXPECT_EQ(QuicString(kPayload), peeked_);
+  EXPECT_EQ(std::string(kPayload), output_);
+  EXPECT_EQ(std::string(kPayload), peeked_);
   EXPECT_EQ(QUIC_ARRAYSIZE(kPayload) - 1, total_bytes_consumed);
 }
 
@@ -525,14 +525,14 @@
   EXPECT_EQ(9u, sequencer_->NumBytesBuffered());
 
   // Peek into the data.
-  std::vector<QuicString> expected = {"abcdefghi"};
+  std::vector<std::string> expected = {"abcdefghi"};
   ASSERT_TRUE(VerifyReadableRegions(expected));
 
   // Consume 1 byte.
   EXPECT_CALL(stream_, AddBytesConsumed(1));
   sequencer_->MarkConsumed(1);
   // Verify data.
-  std::vector<QuicString> expected2 = {"bcdefghi"};
+  std::vector<std::string> expected2 = {"bcdefghi"};
   ASSERT_TRUE(VerifyReadableRegions(expected2));
   EXPECT_EQ(8u, sequencer_->NumBytesBuffered());
 
@@ -540,7 +540,7 @@
   EXPECT_CALL(stream_, AddBytesConsumed(2));
   sequencer_->MarkConsumed(2);
   // Verify data.
-  std::vector<QuicString> expected3 = {"defghi"};
+  std::vector<std::string> expected3 = {"defghi"};
   ASSERT_TRUE(VerifyReadableRegions(expected3));
   EXPECT_EQ(6u, sequencer_->NumBytesBuffered());
 
@@ -548,7 +548,7 @@
   EXPECT_CALL(stream_, AddBytesConsumed(5));
   sequencer_->MarkConsumed(5);
   // Verify data.
-  std::vector<QuicString> expected4{"i"};
+  std::vector<std::string> expected4{"i"};
   ASSERT_TRUE(VerifyReadableRegions(expected4));
   EXPECT_EQ(1u, sequencer_->NumBytesBuffered());
 }
@@ -561,7 +561,7 @@
 
   // Peek into the data.  Only the first chunk should be readable because of the
   // missing data.
-  std::vector<QuicString> expected{"abc"};
+  std::vector<std::string> expected{"abc"};
   ASSERT_TRUE(VerifyReadableRegions(expected));
 
   // Now, attempt to mark consumed more data than was readable and expect the
@@ -581,7 +581,7 @@
   // Missing packet: 6, ghi.
   OnFrame(9, "jkl");
 
-  std::vector<QuicString> expected = {"abcdef"};
+  std::vector<std::string> expected = {"abcdef"};
   ASSERT_TRUE(VerifyReadableRegions(expected));
 
   EXPECT_CALL(stream_, AddBytesConsumed(6));
@@ -600,7 +600,7 @@
   EXPECT_EQ(9u, sequencer_->NumBytesBuffered());
 
   // Peek into the data.
-  std::vector<QuicString> expected = {"abcdefghi"};
+  std::vector<std::string> expected = {"abcdefghi"};
   ASSERT_TRUE(VerifyReadableRegions(expected));
 
   QuicStreamSequencer sequencer2(std::move(*sequencer_));
@@ -624,7 +624,7 @@
 
 TEST_F(QuicStreamSequencerTest, DataAvailableOnOverlappingFrames) {
   QuicStreamId id = 1;
-  const QuicString data(1000, '.');
+  const std::string data(1000, '.');
 
   // Received [0, 1000).
   QuicStreamFrame frame1(id, false, 0, data);
@@ -693,7 +693,7 @@
 TEST_F(QuicStreamSequencerTest, ReadSingleFrame) {
   EXPECT_CALL(stream_, OnDataAvailable());
   OnFrame(0u, "abc");
-  QuicString actual;
+  std::string actual;
   EXPECT_CALL(stream_, AddBytesConsumed(3));
   sequencer_->Read(&actual);
   EXPECT_EQ("abc", actual);
@@ -706,7 +706,7 @@
   OnFrame(3u, "def");
   OnFrame(6u, "ghi");
   OnFrame(10u, "xyz");  // Byte 9 is missing.
-  QuicString actual;
+  std::string actual;
   EXPECT_CALL(stream_, AddBytesConsumed(9));
   sequencer_->Read(&actual);
   EXPECT_EQ("abcdefghi", actual);
@@ -717,7 +717,7 @@
   EXPECT_CALL(stream_, OnDataAvailable());
   OnFrame(0u, "def");
   OnFrame(3u, "ghi");
-  QuicString actual = "abc";
+  std::string actual = "abc";
   EXPECT_CALL(stream_, AddBytesConsumed(6));
   sequencer_->Read(&actual);
   EXPECT_EQ("abcdefghi", actual);
diff --git a/quic/core/quic_stream_test.cc b/quic/core/quic_stream_test.cc
index d019f71..34f9597 100644
--- a/quic/core/quic_stream_test.cc
+++ b/quic/core/quic_stream_test.cc
@@ -66,7 +66,7 @@
   using QuicStream::WritevData;
 
  private:
-  QuicString data_;
+  std::string data_;
 };
 
 class QuicStreamTestBase : public QuicTestWithParam<ParsedQuicVersion> {
@@ -160,7 +160,8 @@
 // Index value of 1 has the test run with supported-version[1], which is some
 // version OTHER than 99.
 INSTANTIATE_TEST_SUITE_P(
-    QuicStreamTests, QuicStreamTest,
+    QuicStreamTests,
+    QuicStreamTest,
     ::testing::ValuesIn(ParsedVersionOfIndex(AllSupportedVersions(), 1)));
 
 // Make a parameterized version of the QuicStreamTest for those tests
@@ -389,7 +390,7 @@
 
 TEST_P(QuicStreamTest, WriteOrBufferDataReachStreamLimit) {
   Initialize();
-  QuicString data("aaaaa");
+  std::string data("aaaaa");
   QuicStreamPeer::SetStreamBytesWritten(kMaxStreamLength - data.length(),
                                         stream_);
   EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
@@ -574,7 +575,7 @@
       .Times(AtLeast(1))
       .WillRepeatedly(Invoke(this, &QuicStreamTest::ClearControlFrame));
 
-  QuicString data(1000, 'x');
+  std::string data(1000, 'x');
   for (QuicStreamOffset offset = 0;
        offset < 2 * kInitialStreamFlowControlWindowForTest;
        offset += data.length()) {
@@ -968,7 +969,7 @@
   set_initial_flow_control_window_bytes(500000);
 
   Initialize();
-  QuicString data(1024, 'a');
+  std::string data(1024, 'a');
   EXPECT_TRUE(stream_->CanWriteNewData());
 
   // Testing WriteOrBufferData.
@@ -1073,7 +1074,7 @@
 
 TEST_P(QuicStreamTest, WritevDataReachStreamLimit) {
   Initialize();
-  QuicString data("aaaaa");
+  std::string data("aaaaa");
   QuicStreamPeer::SetStreamBytesWritten(kMaxStreamLength - data.length(),
                                         stream_);
   EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
@@ -1339,7 +1340,7 @@
       .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
   EXPECT_CALL(*connection_, SendControlFrame(_))
       .WillOnce(Invoke(this, &QuicStreamTest::ClearControlFrame));
-  QuicString data(1024, '.');
+  std::string data(1024, '.');
   stream_->WriteOrBufferData(data, false, nullptr);
   EXPECT_FALSE(HasWriteBlockedStreams());
 
@@ -1360,7 +1361,7 @@
   set_initial_flow_control_window_bytes(kSmallWindow);
   Initialize();
 
-  QuicString data(kSmallWindow, '.');
+  std::string data(kSmallWindow, '.');
   EXPECT_CALL(*session_, WritevData(_, _, _, _, _))
       .WillRepeatedly(Invoke(MockQuicSession::ConsumeData));
   EXPECT_CALL(*connection_, SendControlFrame(_))
@@ -1419,7 +1420,7 @@
 
   EXPECT_CALL(*session_, WritevData(_, stream_->id(), 200, 0, FIN))
       .WillOnce(Invoke(MockQuicSession::ConsumeData));
-  QuicString body(200, 'a');
+  std::string body(200, 'a');
   stream_->WriteOrBufferData(body, true, nullptr);
 
   // Set TTL to be 1 s.
@@ -1443,7 +1444,7 @@
 
   EXPECT_CALL(*session_, WritevData(_, stream_->id(), 200, 0, FIN))
       .WillOnce(Invoke(MockQuicSession::ConsumeData));
-  QuicString body(200, 'a');
+  std::string body(200, 'a');
   stream_->WriteOrBufferData(body, true, nullptr);
 
   // Set TTL to be 1 s.
diff --git a/quic/core/quic_tag.cc b/quic/core/quic_tag.cc
index 7c9c329..eebe744 100644
--- a/quic/core/quic_tag.cc
+++ b/quic/core/quic_tag.cc
@@ -34,7 +34,7 @@
   return false;
 }
 
-QuicString QuicTagToString(QuicTag tag) {
+std::string QuicTagToString(QuicTag tag) {
   char chars[sizeof tag];
   bool ascii = true;
   const QuicTag orig_tag = tag;
@@ -53,7 +53,7 @@
   }
 
   if (ascii) {
-    return QuicString(chars, sizeof(chars));
+    return std::string(chars, sizeof(chars));
   }
 
   return QuicTextUtils::Uint64ToString(orig_tag);
diff --git a/quic/core/quic_tag.h b/quic/core/quic_tag.h
index 1808d9d..03763a7 100644
--- a/quic/core/quic_tag.h
+++ b/quic/core/quic_tag.h
@@ -22,7 +22,7 @@
 // just a mnemonic for the value 0x504d5845 (little-endian version of the ASCII
 // string E X M P).
 typedef uint32_t QuicTag;
-typedef std::map<QuicTag, QuicString> QuicTagValueMap;
+typedef std::map<QuicTag, std::string> QuicTagValueMap;
 typedef std::vector<QuicTag> QuicTagVector;
 
 // MakeQuicTag returns a value given the four bytes. For example:
@@ -46,7 +46,7 @@
 // A utility function that converts a tag to a string. It will try to maintain
 // the human friendly name if possible (i.e. kABCD -> "ABCD"), or will just
 // treat it as a number if not.
-QUIC_EXPORT_PRIVATE QuicString QuicTagToString(QuicTag tag);
+QUIC_EXPORT_PRIVATE std::string QuicTagToString(QuicTag tag);
 
 }  // namespace quic
 
diff --git a/quic/core/quic_time.cc b/quic/core/quic_time.cc
index 92a3eec..e3df0b9 100644
--- a/quic/core/quic_time.cc
+++ b/quic/core/quic_time.cc
@@ -13,7 +13,7 @@
 
 namespace quic {
 
-QuicString QuicTime::Delta::ToDebugValue() const {
+std::string QuicTime::Delta::ToDebugValue() const {
   const int64_t one_ms = 1000;
   const int64_t one_s = 1000 * one_ms;
 
diff --git a/quic/core/quic_time.h b/quic/core/quic_time.h
index 6bd3f68..9624b6f 100644
--- a/quic/core/quic_time.h
+++ b/quic/core/quic_time.h
@@ -75,7 +75,7 @@
       return time_offset_ == kQuicInfiniteTimeUs;
     }
 
-    QuicString ToDebugValue() const;
+    std::string ToDebugValue() const;
 
    private:
     friend inline bool operator==(QuicTime::Delta lhs, QuicTime::Delta rhs);
diff --git a/quic/core/quic_time_wait_list_manager.h b/quic/core/quic_time_wait_list_manager.h
index 74630ad..db1d1f7 100644
--- a/quic/core/quic_time_wait_list_manager.h
+++ b/quic/core/quic_time_wait_list_manager.h
@@ -144,7 +144,7 @@
       bool ietf_quic,
       std::unique_ptr<QuicPerPacketContext> packet_context);
 
-  virtual void GetEndpointId(QuicString* endpoint_id) {}
+  virtual void GetEndpointId(std::string* endpoint_id) {}
 
   // Returns a stateless reset token which will be included in the public reset
   // packet.
diff --git a/quic/core/quic_trace_visitor.cc b/quic/core/quic_trace_visitor.cc
index ba2ed7f..3785d53 100644
--- a/quic/core/quic_trace_visitor.cc
+++ b/quic/core/quic_trace_visitor.cc
@@ -26,8 +26,8 @@
 QuicTraceVisitor::QuicTraceVisitor(const QuicConnection* connection)
     : connection_(connection),
       start_time_(connection_->clock()->ApproximateNow()) {
-  QuicString binary_connection_id(connection->connection_id().data(),
-                                  connection->connection_id().length());
+  std::string binary_connection_id(connection->connection_id().data(),
+                                   connection->connection_id().length());
   // We assume that the connection ID in gQUIC is equivalent to the
   // server-chosen client-selected ID.
   switch (connection->perspective()) {
@@ -263,7 +263,7 @@
 void QuicTraceVisitor::OnSuccessfulVersionNegotiation(
     const ParsedQuicVersion& version) {
   uint32_t tag = QuicEndian::HostToNet32(CreateQuicVersionLabel(version));
-  QuicString binary_tag(reinterpret_cast<const char*>(&tag), sizeof(tag));
+  std::string binary_tag(reinterpret_cast<const char*>(&tag), sizeof(tag));
   trace_.set_protocol_version(binary_tag);
 }
 
diff --git a/quic/core/quic_trace_visitor_test.cc b/quic/core/quic_trace_visitor_test.cc
index 008026d..ee179bb 100644
--- a/quic/core/quic_trace_visitor_test.cc
+++ b/quic/core/quic_trace_visitor_test.cc
@@ -76,12 +76,12 @@
 
 TEST_F(QuicTraceVisitorTest, ConnectionId) {
   char expected_cid[] = {0, 0, 0, 0, 0, 0, 0, 42};
-  EXPECT_EQ(QuicString(expected_cid, sizeof(expected_cid)),
+  EXPECT_EQ(std::string(expected_cid, sizeof(expected_cid)),
             trace_.destination_connection_id());
 }
 
 TEST_F(QuicTraceVisitorTest, Version) {
-  QuicString version = trace_.protocol_version();
+  std::string version = trace_.protocol_version();
   ASSERT_EQ(4u, version.size());
   EXPECT_EQ('Q', version[0]);
 }
diff --git a/quic/core/quic_utils.cc b/quic/core/quic_utils.cc
index d83db1c..10854bf 100644
--- a/quic/core/quic_utils.cc
+++ b/quic/core/quic_utils.cc
@@ -165,7 +165,7 @@
   return "INVALID_TRANSMISSION_TYPE";
 }
 
-QuicString QuicUtils::AddressChangeTypeToString(AddressChangeType type) {
+std::string QuicUtils::AddressChangeTypeToString(AddressChangeType type) {
   switch (type) {
     RETURN_STRING_LITERAL(NO_CHANGE);
     RETURN_STRING_LITERAL(PORT_CHANGE);
diff --git a/quic/core/quic_utils.h b/quic/core/quic_utils.h
index 28ea15b..3ef4788 100644
--- a/quic/core/quic_utils.h
+++ b/quic/core/quic_utils.h
@@ -57,7 +57,7 @@
   static const char* TransmissionTypeToString(TransmissionType type);
 
   // Returns AddressChangeType as a string.
-  static QuicString AddressChangeTypeToString(AddressChangeType type);
+  static std::string AddressChangeTypeToString(AddressChangeType type);
 
   // Returns SentPacketState as a char*.
   static const char* SentPacketStateToString(SentPacketState state);
diff --git a/quic/core/quic_utils_test.cc b/quic/core/quic_utils_test.cc
index de4c76b..f88a34a 100644
--- a/quic/core/quic_utils_test.cc
+++ b/quic/core/quic_utils_test.cc
@@ -18,11 +18,11 @@
 class QuicUtilsTest : public QuicTest {};
 
 TEST_F(QuicUtilsTest, DetermineAddressChangeType) {
-  const QuicString kIPv4String1 = "1.2.3.4";
-  const QuicString kIPv4String2 = "1.2.3.5";
-  const QuicString kIPv4String3 = "1.1.3.5";
-  const QuicString kIPv6String1 = "2001:700:300:1800::f";
-  const QuicString kIPv6String2 = "2001:700:300:1800:1:1:1:f";
+  const std::string kIPv4String1 = "1.2.3.4";
+  const std::string kIPv4String2 = "1.2.3.5";
+  const std::string kIPv4String3 = "1.1.3.5";
+  const std::string kIPv6String1 = "2001:700:300:1800::f";
+  const std::string kIPv6String2 = "2001:700:300:1800:1:1:1:f";
   QuicSocketAddress old_address;
   QuicSocketAddress new_address;
   QuicIpAddress address;
@@ -168,11 +168,11 @@
   MockRandom random(33);
   QuicConnectionId connection_id = QuicUtils::CreateRandomConnectionId(&random);
   EXPECT_EQ(connection_id.length(), sizeof(uint64_t));
-    char connection_id_bytes[sizeof(uint64_t)];
-    random.RandBytes(connection_id_bytes, QUIC_ARRAYSIZE(connection_id_bytes));
-    EXPECT_EQ(connection_id,
-              QuicConnectionId(static_cast<char*>(connection_id_bytes),
-                               QUIC_ARRAYSIZE(connection_id_bytes)));
+  char connection_id_bytes[sizeof(uint64_t)];
+  random.RandBytes(connection_id_bytes, QUIC_ARRAYSIZE(connection_id_bytes));
+  EXPECT_EQ(connection_id,
+            QuicConnectionId(static_cast<char*>(connection_id_bytes),
+                             QUIC_ARRAYSIZE(connection_id_bytes)));
   EXPECT_NE(connection_id, EmptyQuicConnectionId());
   EXPECT_NE(connection_id, TestConnectionId());
   EXPECT_NE(connection_id, TestConnectionId(1));
diff --git a/quic/core/quic_versions.cc b/quic/core/quic_versions.cc
index efc823d..7ea441a 100644
--- a/quic/core/quic_versions.cc
+++ b/quic/core/quic_versions.cc
@@ -243,15 +243,15 @@
       ParsedQuicVersion(PROTOCOL_QUIC_CRYPTO, transport_version));
 }
 
-QuicString QuicVersionLabelToString(QuicVersionLabel version_label) {
+std::string QuicVersionLabelToString(QuicVersionLabel version_label) {
   return QuicTagToString(QuicEndian::HostToNet32(version_label));
 }
 
-QuicString QuicVersionLabelVectorToString(
+std::string QuicVersionLabelVectorToString(
     const QuicVersionLabelVector& version_labels,
-    const QuicString& separator,
+    const std::string& separator,
     size_t skip_after_nth_version) {
-  QuicString result;
+  std::string result;
   for (size_t i = 0; i < version_labels.size(); ++i) {
     if (i != 0) {
       result.append(separator);
@@ -280,7 +280,7 @@
   case x:                        \
     return #x
 
-QuicString QuicVersionToString(QuicTransportVersion transport_version) {
+std::string QuicVersionToString(QuicTransportVersion transport_version) {
   switch (transport_version) {
     RETURN_STRING_LITERAL(QUIC_VERSION_39);
     RETURN_STRING_LITERAL(QUIC_VERSION_43);
@@ -293,13 +293,13 @@
   }
 }
 
-QuicString ParsedQuicVersionToString(ParsedQuicVersion version) {
+std::string ParsedQuicVersionToString(ParsedQuicVersion version) {
   return QuicVersionLabelToString(CreateQuicVersionLabel(version));
 }
 
-QuicString QuicTransportVersionVectorToString(
+std::string QuicTransportVersionVectorToString(
     const QuicTransportVersionVector& versions) {
-  QuicString result = "";
+  std::string result = "";
   for (size_t i = 0; i < versions.size(); ++i) {
     if (i != 0) {
       result.append(",");
@@ -309,11 +309,11 @@
   return result;
 }
 
-QuicString ParsedQuicVersionVectorToString(
+std::string ParsedQuicVersionVectorToString(
     const ParsedQuicVersionVector& versions,
-    const QuicString& separator,
+    const std::string& separator,
     size_t skip_after_nth_version) {
-  QuicString result;
+  std::string result;
   for (size_t i = 0; i < versions.size(); ++i) {
     if (i != 0) {
       result.append(separator);
diff --git a/quic/core/quic_versions.h b/quic/core/quic_versions.h
index c0fa34a..2825c9f 100644
--- a/quic/core/quic_versions.h
+++ b/quic/core/quic_versions.h
@@ -244,20 +244,20 @@
 QuicVersionToQuicVersionLabel(QuicTransportVersion transport_version);
 
 // Helper function which translates from a QuicVersionLabel to a string.
-QUIC_EXPORT_PRIVATE QuicString
-QuicVersionLabelToString(QuicVersionLabel version_label);
+QUIC_EXPORT_PRIVATE std::string QuicVersionLabelToString(
+    QuicVersionLabel version_label);
 
 // Returns |separator|-separated list of string representations of
 // QuicVersionLabel values in the supplied |version_labels| vector. The values
 // after the (0-based) |skip_after_nth_version|'th are skipped.
-QUIC_EXPORT_PRIVATE QuicString
-QuicVersionLabelVectorToString(const QuicVersionLabelVector& version_labels,
-                               const QuicString& separator,
-                               size_t skip_after_nth_version);
+QUIC_EXPORT_PRIVATE std::string QuicVersionLabelVectorToString(
+    const QuicVersionLabelVector& version_labels,
+    const std::string& separator,
+    size_t skip_after_nth_version);
 
 // Returns comma separated list of string representations of QuicVersionLabel
 // values in the supplied |version_labels| vector.
-QUIC_EXPORT_PRIVATE inline QuicString QuicVersionLabelVectorToString(
+QUIC_EXPORT_PRIVATE inline std::string QuicVersionLabelVectorToString(
     const QuicVersionLabelVector& version_labels) {
   return QuicVersionLabelVectorToString(version_labels, ",",
                                         std::numeric_limits<size_t>::max());
@@ -275,35 +275,35 @@
 
 // Helper function which translates from a QuicTransportVersion to a string.
 // Returns strings corresponding to enum names (e.g. QUIC_VERSION_6).
-QUIC_EXPORT_PRIVATE QuicString
-QuicVersionToString(QuicTransportVersion transport_version);
+QUIC_EXPORT_PRIVATE std::string QuicVersionToString(
+    QuicTransportVersion transport_version);
 
 // Helper function which translates from a ParsedQuicVersion to a string.
 // Returns strings corresponding to the on-the-wire tag.
-QUIC_EXPORT_PRIVATE QuicString
-ParsedQuicVersionToString(ParsedQuicVersion version);
+QUIC_EXPORT_PRIVATE std::string ParsedQuicVersionToString(
+    ParsedQuicVersion version);
 
 // Returns comma separated list of string representations of
 // QuicTransportVersion enum values in the supplied |versions| vector.
-QUIC_EXPORT_PRIVATE QuicString
-QuicTransportVersionVectorToString(const QuicTransportVersionVector& versions);
+QUIC_EXPORT_PRIVATE std::string QuicTransportVersionVectorToString(
+    const QuicTransportVersionVector& versions);
 
 // Returns comma separated list of string representations of ParsedQuicVersion
 // values in the supplied |versions| vector.
-QUIC_EXPORT_PRIVATE QuicString
-ParsedQuicVersionVectorToString(const ParsedQuicVersionVector& versions);
+QUIC_EXPORT_PRIVATE std::string ParsedQuicVersionVectorToString(
+    const ParsedQuicVersionVector& versions);
 
 // Returns |separator|-separated list of string representations of
 // ParsedQuicVersion values in the supplied |versions| vector. The values after
 // the (0-based) |skip_after_nth_version|'th are skipped.
-QUIC_EXPORT_PRIVATE QuicString
-ParsedQuicVersionVectorToString(const ParsedQuicVersionVector& versions,
-                                const QuicString& separator,
-                                size_t skip_after_nth_version);
+QUIC_EXPORT_PRIVATE std::string ParsedQuicVersionVectorToString(
+    const ParsedQuicVersionVector& versions,
+    const std::string& separator,
+    size_t skip_after_nth_version);
 
 // Returns comma separated list of string representations of ParsedQuicVersion
 // values in the supplied |versions| vector.
-QUIC_EXPORT_PRIVATE inline QuicString ParsedQuicVersionVectorToString(
+QUIC_EXPORT_PRIVATE inline std::string ParsedQuicVersionVectorToString(
     const ParsedQuicVersionVector& versions) {
   return ParsedQuicVersionVectorToString(versions, ",",
                                          std::numeric_limits<size_t>::max());
diff --git a/quic/core/stateless_rejector.cc b/quic/core/stateless_rejector.cc
index 3cf30df..24750d7 100644
--- a/quic/core/stateless_rejector.cc
+++ b/quic/core/stateless_rejector.cc
@@ -104,7 +104,7 @@
       : rejector_(std::move(rejector)), done_cb_(std::move(done_cb)) {}
 
   void Run(QuicErrorCode error,
-           const QuicString& error_details,
+           const std::string& error_details,
            std::unique_ptr<CryptoHandshakeMessage> message,
            std::unique_ptr<DiversificationNonce> diversification_nonce,
            std::unique_ptr<ProofSource::Details> /* proof_source_details */)
@@ -140,7 +140,7 @@
 
 void StatelessRejector::ProcessClientHelloDone(
     QuicErrorCode error,
-    const QuicString& error_details,
+    const std::string& error_details,
     std::unique_ptr<CryptoHandshakeMessage> message,
     std::unique_ptr<StatelessRejector> rejector,
     std::unique_ptr<StatelessRejector::ProcessDoneCallback> done_cb) {
diff --git a/quic/core/stateless_rejector.h b/quic/core/stateless_rejector.h
index d9ff94d..ae0d379 100644
--- a/quic/core/stateless_rejector.h
+++ b/quic/core/stateless_rejector.h
@@ -66,7 +66,7 @@
   QuicErrorCode error() const { return error_; }
 
   // Returns the error details when state() returns FAILED.
-  QuicString error_details() const { return error_details_; }
+  std::string error_details() const { return error_details_; }
 
   // Returns the connection ID.
   QuicConnectionId connection_id() const { return connection_id_; }
@@ -91,14 +91,14 @@
 
   void ProcessClientHelloDone(
       QuicErrorCode error,
-      const QuicString& error_details,
+      const std::string& error_details,
       std::unique_ptr<CryptoHandshakeMessage> message,
       std::unique_ptr<StatelessRejector> rejector,
       std::unique_ptr<StatelessRejector::ProcessDoneCallback> done_cb);
 
   State state_;
   QuicErrorCode error_;
-  QuicString error_details_;
+  std::string error_details_;
   ParsedQuicVersion version_;
   ParsedQuicVersionVector versions_;
   QuicConnectionId connection_id_;
diff --git a/quic/core/stateless_rejector_test.cc b/quic/core/stateless_rejector_test.cc
index 19eef64..cf5cdd0 100644
--- a/quic/core/stateless_rejector_test.cc
+++ b/quic/core/stateless_rejector_test.cc
@@ -56,7 +56,8 @@
   FlagsMode flags;
 };
 
-QuicString TestParamToString(const testing::TestParamInfo<TestParams>& params) {
+std::string TestParamToString(
+    const testing::TestParamInfo<TestParams>& params) {
   return QuicStrCat("v", ParsedQuicVersionToString(params.param.version), "_",
                     FlagsModeToString(params.param.flags));
 }
@@ -122,7 +123,7 @@
         "#" + QuicTextUtils::HexEncode(public_value, sizeof(public_value));
 
     // Generate a client nonce.
-    QuicString nonce;
+    std::string nonce;
     CryptoUtils::GenerateNonce(
         clock_.WallNow(), QuicRandom::GetInstance(),
         QuicStringPiece(
@@ -135,7 +136,7 @@
     SourceAddressTokens previous_tokens;
     QuicIpAddress ip = QuicIpAddress::Loopback4();
     MockRandom rand;
-    QuicString stk = config_peer_.NewSourceAddressToken(
+    std::string stk = config_peer_.NewSourceAddressToken(
         config_peer_.GetPrimaryConfig()->id, previous_tokens, ip, &rand,
         clock_.WallNow(), nullptr);
     stk_hex_ = "#" + QuicTextUtils::HexEncode(stk);
@@ -162,14 +163,15 @@
   std::unique_ptr<StatelessRejector> rejector_;
 
   // Values used in CHLO messages
-  QuicString scid_hex_;
-  QuicString nonc_hex_;
-  QuicString pubs_hex_;
-  QuicString ver_hex_;
-  QuicString stk_hex_;
+  std::string scid_hex_;
+  std::string nonc_hex_;
+  std::string pubs_hex_;
+  std::string ver_hex_;
+  std::string stk_hex_;
 };
 
-INSTANTIATE_TEST_SUITE_P(Flags, StatelessRejectorTest,
+INSTANTIATE_TEST_SUITE_P(Flags,
+                         StatelessRejectorTest,
                          ::testing::ValuesIn(GetTestParams()),
                          TestParamToString);
 
@@ -252,7 +254,7 @@
 
 TEST_P(StatelessRejectorTest, AcceptChlo) {
   const uint64_t xlct = crypto_test_utils::LeafCertHashForTesting();
-  const QuicString xlct_hex =
+  const std::string xlct_hex =
       "#" + QuicTextUtils::HexEncode(reinterpret_cast<const char*>(&xlct),
                                      sizeof(xlct));
   // clang-format off
diff --git a/quic/core/tls_client_handshaker.cc b/quic/core/tls_client_handshaker.cc
index f232dc3..6a76e08 100644
--- a/quic/core/tls_client_handshaker.cc
+++ b/quic/core/tls_client_handshaker.cc
@@ -20,7 +20,7 @@
 
 void TlsClientHandshaker::ProofVerifierCallbackImpl::Run(
     bool ok,
-    const QuicString& error_details,
+    const std::string& error_details,
     std::unique_ptr<ProofVerifyDetails>* details) {
   if (parent_ == nullptr) {
     return;
@@ -44,7 +44,7 @@
     ProofVerifier* proof_verifier,
     SSL_CTX* ssl_ctx,
     std::unique_ptr<ProofVerifyContext> verify_context,
-    const QuicString& user_agent_id)
+    const std::string& user_agent_id)
     : TlsHandshaker(stream, session, ssl_ctx),
       server_id_(server_id),
       proof_verifier_(proof_verifier),
@@ -116,7 +116,7 @@
 }
 
 bool TlsClientHandshaker::ProcessTransportParameters(
-    QuicString* error_details) {
+    std::string* error_details) {
   TransportParameters params;
   const uint8_t* param_bytes;
   size_t param_bytes_len;
@@ -166,7 +166,7 @@
   return false;
 }
 
-QuicString TlsClientHandshaker::chlo_hash() const {
+std::string TlsClientHandshaker::chlo_hash() const {
   return "";
 }
 
@@ -229,7 +229,7 @@
 }
 
 void TlsClientHandshaker::CloseConnection(QuicErrorCode error,
-                                          const QuicString& reason_phrase) {
+                                          const std::string& reason_phrase) {
   state_ = STATE_CONNECTION_CLOSED;
   stream()->CloseConnectionWithDetails(error, reason_phrase);
 }
@@ -238,7 +238,7 @@
   QUIC_LOG(INFO) << "Client: handshake finished";
   state_ = STATE_HANDSHAKE_COMPLETE;
 
-  QuicString error_details;
+  std::string error_details;
   if (!ProcessTransportParameters(&error_details)) {
     CloseConnection(QUIC_HANDSHAKE_FAILED, error_details);
     return;
@@ -276,11 +276,11 @@
     return ssl_verify_invalid;
   }
   // TODO(nharper): Pass the CRYPTO_BUFFERs into the QUIC stack to avoid copies.
-  std::vector<QuicString> certs;
+  std::vector<std::string> certs;
   for (CRYPTO_BUFFER* cert : cert_chain) {
     certs.push_back(
-        QuicString(reinterpret_cast<const char*>(CRYPTO_BUFFER_data(cert)),
-                   CRYPTO_BUFFER_len(cert)));
+        std::string(reinterpret_cast<const char*>(CRYPTO_BUFFER_data(cert)),
+                    CRYPTO_BUFFER_len(cert)));
   }
 
   ProofVerifierCallbackImpl* proof_verify_callback =
diff --git a/quic/core/tls_client_handshaker.h b/quic/core/tls_client_handshaker.h
index 3e216f0..106c9c8 100644
--- a/quic/core/tls_client_handshaker.h
+++ b/quic/core/tls_client_handshaker.h
@@ -27,7 +27,7 @@
                       ProofVerifier* proof_verifier,
                       SSL_CTX* ssl_ctx,
                       std::unique_ptr<ProofVerifyContext> verify_context,
-                      const QuicString& user_agent_id);
+                      const std::string& user_agent_id);
   TlsClientHandshaker(const TlsClientHandshaker&) = delete;
   TlsClientHandshaker& operator=(const TlsClientHandshaker&) = delete;
 
@@ -43,7 +43,7 @@
   int num_scup_messages_received() const override;
   bool WasChannelIDSent() const override;
   bool WasChannelIDSourceCallbackRun() const override;
-  QuicString chlo_hash() const override;
+  std::string chlo_hash() const override;
 
   // From QuicCryptoClientStream::HandshakerDelegate and TlsHandshaker
   bool encryption_established() const override;
@@ -62,7 +62,7 @@
 
     // ProofVerifierCallback interface.
     void Run(bool ok,
-             const QuicString& error_details,
+             const std::string& error_details,
              std::unique_ptr<ProofVerifyDetails>* details) override;
 
     // If called, Cancel causes the pending callback to be a no-op.
@@ -81,12 +81,12 @@
   } state_ = STATE_IDLE;
 
   bool SetTransportParameters();
-  bool ProcessTransportParameters(QuicString* error_details);
+  bool ProcessTransportParameters(std::string* error_details);
   void FinishHandshake();
 
   void AdvanceHandshake() override;
   void CloseConnection(QuicErrorCode error,
-                       const QuicString& reason_phrase) override;
+                       const std::string& reason_phrase) override;
 
   // Certificate verification functions:
 
@@ -107,14 +107,14 @@
   ProofVerifier* proof_verifier_;
   std::unique_ptr<ProofVerifyContext> verify_context_;
 
-  QuicString user_agent_id_;
+  std::string user_agent_id_;
 
   // ProofVerifierCallback used for async certificate verification. This object
   // is owned by |proof_verifier_|.
   ProofVerifierCallbackImpl* proof_verify_callback_ = nullptr;
   std::unique_ptr<ProofVerifyDetails> verify_details_;
   enum ssl_verify_result_t verify_result_ = ssl_verify_retry;
-  QuicString cert_verify_error_details_;
+  std::string cert_verify_error_details_;
 
   bool encryption_established_ = false;
   bool handshake_confirmed_ = false;
diff --git a/quic/core/tls_handshaker.h b/quic/core/tls_handshaker.h
index ceba9a9..9658923 100644
--- a/quic/core/tls_handshaker.h
+++ b/quic/core/tls_handshaker.h
@@ -38,7 +38,7 @@
   bool ProcessInput(QuicStringPiece input, EncryptionLevel level) override;
   size_t InputBytesRemaining() const override { return 0; }
   QuicErrorCode error() const override { return parser_error_; }
-  const QuicString& error_detail() const override {
+  const std::string& error_detail() const override {
     return parser_error_detail_;
   }
 
@@ -53,7 +53,7 @@
   virtual void AdvanceHandshake() = 0;
 
   virtual void CloseConnection(QuicErrorCode error,
-                               const QuicString& reason_phrase) = 0;
+                               const std::string& reason_phrase) = 0;
 
   // Creates an SSL_CTX and configures it with the options that are appropriate
   // for both client and server. The caller is responsible for ownership of the
@@ -135,7 +135,7 @@
   QuicSession* session_;
 
   QuicErrorCode parser_error_ = QUIC_NO_ERROR;
-  QuicString parser_error_detail_;
+  std::string parser_error_detail_;
 
   bssl::UniquePtr<SSL> ssl_;
 };
diff --git a/quic/core/tls_handshaker_test.cc b/quic/core/tls_handshaker_test.cc
index 2d678dd..ae9e3fc 100644
--- a/quic/core/tls_handshaker_test.cc
+++ b/quic/core/tls_handshaker_test.cc
@@ -26,16 +26,16 @@
       : verifier_(crypto_test_utils::ProofVerifierForTesting()) {}
 
   QuicAsyncStatus VerifyProof(
-      const QuicString& hostname,
+      const std::string& hostname,
       const uint16_t port,
-      const QuicString& server_config,
+      const std::string& server_config,
       QuicTransportVersion quic_version,
       QuicStringPiece chlo_hash,
-      const std::vector<QuicString>& certs,
-      const QuicString& cert_sct,
-      const QuicString& signature,
+      const std::vector<std::string>& certs,
+      const std::string& cert_sct,
+      const std::string& signature,
       const ProofVerifyContext* context,
-      QuicString* error_details,
+      std::string* error_details,
       std::unique_ptr<ProofVerifyDetails>* details,
       std::unique_ptr<ProofVerifierCallback> callback) override {
     return verifier_->VerifyProof(
@@ -44,10 +44,10 @@
   }
 
   QuicAsyncStatus VerifyCertChain(
-      const QuicString& hostname,
-      const std::vector<QuicString>& certs,
+      const std::string& hostname,
+      const std::vector<std::string>& certs,
       const ProofVerifyContext* context,
-      QuicString* error_details,
+      std::string* error_details,
       std::unique_ptr<ProofVerifyDetails>* details,
       std::unique_ptr<ProofVerifierCallback> callback) override {
     if (!active_) {
@@ -81,7 +81,7 @@
   class FailingProofVerifierCallback : public ProofVerifierCallback {
    public:
     void Run(bool ok,
-             const QuicString& error_details,
+             const std::string& error_details,
              std::unique_ptr<ProofVerifyDetails>* details) override {
       FAIL();
     }
@@ -89,10 +89,10 @@
 
   class VerifyChainPendingOp {
    public:
-    VerifyChainPendingOp(const QuicString& hostname,
-                         const std::vector<QuicString>& certs,
+    VerifyChainPendingOp(const std::string& hostname,
+                         const std::vector<std::string>& certs,
                          const ProofVerifyContext* context,
-                         QuicString* error_details,
+                         std::string* error_details,
                          std::unique_ptr<ProofVerifyDetails>* details,
                          std::unique_ptr<ProofVerifierCallback> callback,
                          ProofVerifier* delegate)
@@ -117,10 +117,10 @@
     }
 
    private:
-    QuicString hostname_;
-    std::vector<QuicString> certs_;
+    std::string hostname_;
+    std::vector<std::string> certs_;
     const ProofVerifyContext* context_;
-    QuicString* error_details_;
+    std::string* error_details_;
     std::unique_ptr<ProofVerifyDetails>* details_;
     std::unique_ptr<ProofVerifierCallback> callback_;
     ProofVerifier* delegate_;
@@ -158,10 +158,10 @@
   }
 
   void WriteCryptoData(EncryptionLevel level, QuicStringPiece data) override {
-    pending_writes_.push_back(std::make_pair(QuicString(data), level));
+    pending_writes_.push_back(std::make_pair(std::string(data), level));
   }
 
-  const std::vector<std::pair<QuicString, EncryptionLevel>>& pending_writes() {
+  const std::vector<std::pair<std::string, EncryptionLevel>>& pending_writes() {
     return pending_writes_;
   }
 
@@ -191,7 +191,7 @@
   }
 
  private:
-  std::vector<std::pair<QuicString, EncryptionLevel>> pending_writes_;
+  std::vector<std::pair<std::string, EncryptionLevel>> pending_writes_;
 };
 
 class TestQuicCryptoClientStream : public TestQuicCryptoStream {
diff --git a/quic/core/tls_server_handshaker.cc b/quic/core/tls_server_handshaker.cc
index 02cc441..b8f9573 100644
--- a/quic/core/tls_server_handshaker.cc
+++ b/quic/core/tls_server_handshaker.cc
@@ -21,7 +21,7 @@
     : handshaker_(handshaker) {}
 
 void TlsServerHandshaker::SignatureCallback::Run(bool ok,
-                                                 QuicString signature) {
+                                                 std::string signature) {
   if (handshaker_ == nullptr) {
     return;
   }
@@ -91,7 +91,7 @@
 }
 
 bool TlsServerHandshaker::GetBase64SHA256ClientChannelID(
-    QuicString* output) const {
+    std::string* output) const {
   // Channel ID is not supported when TLS is used in QUIC.
   return false;
 }
@@ -189,13 +189,13 @@
 }
 
 void TlsServerHandshaker::CloseConnection(QuicErrorCode error,
-                                          const QuicString& reason_phrase) {
+                                          const std::string& reason_phrase) {
   state_ = STATE_CONNECTION_CLOSED;
   stream()->CloseConnectionWithDetails(error, reason_phrase);
 }
 
 bool TlsServerHandshaker::ProcessTransportParameters(
-    QuicString* error_details) {
+    std::string* error_details) {
   TransportParameters client_params;
   const uint8_t* client_params_bytes;
   size_t params_bytes_len;
@@ -352,7 +352,7 @@
     CRYPTO_BUFFER_free(certs[i]);
   }
 
-  QuicString error_details;
+  std::string error_details;
   if (!ProcessTransportParameters(&error_details)) {
     CloseConnection(QUIC_HANDSHAKE_FAILED, error_details);
     *out_alert = SSL_AD_INTERNAL_ERROR;
diff --git a/quic/core/tls_server_handshaker.h b/quic/core/tls_server_handshaker.h
index c3efc82..4b38a74 100644
--- a/quic/core/tls_server_handshaker.h
+++ b/quic/core/tls_server_handshaker.h
@@ -37,7 +37,7 @@
 
   // From QuicCryptoServerStream::HandshakerDelegate
   void CancelOutstandingCallbacks() override;
-  bool GetBase64SHA256ClientChannelID(QuicString* output) const override;
+  bool GetBase64SHA256ClientChannelID(std::string* output) const override;
   void SendServerConfigUpdate(
       const CachedNetworkParameters* cached_network_params) override;
   uint8_t NumHandshakeMessages() const override;
@@ -64,7 +64,7 @@
   class SignatureCallback : public ProofSource::SignatureCallback {
    public:
     explicit SignatureCallback(TlsServerHandshaker* handshaker);
-    void Run(bool ok, QuicString signature) override;
+    void Run(bool ok, std::string signature) override;
 
     // If called, Cancel causes the pending callback to be a no-op.
     void Cancel();
@@ -90,15 +90,15 @@
   // for the TLS stack to read.
   void AdvanceHandshake() override;
   void CloseConnection(QuicErrorCode error,
-                       const QuicString& reason_phrase) override;
+                       const std::string& reason_phrase) override;
 
   // Called when the TLS handshake is complete.
   void FinishHandshake();
 
-  void CloseConnection(const QuicString& reason_phrase);
+  void CloseConnection(const std::string& reason_phrase);
 
   bool SetTransportParameters();
-  bool ProcessTransportParameters(QuicString* error_details);
+  bool ProcessTransportParameters(std::string* error_details);
 
   // Calls the instance method PrivateKeySign after looking up the
   // TlsServerHandshaker from |ssl|.
@@ -154,8 +154,8 @@
   ProofSource* proof_source_;
   SignatureCallback* signature_callback_ = nullptr;
 
-  QuicString hostname_;
-  QuicString cert_verify_sig_;
+  std::string hostname_;
+  std::string cert_verify_sig_;
 
   bool encryption_established_ = false;
   bool handshake_confirmed_ = false;
diff --git a/quic/core/uber_quic_stream_id_manager_test.cc b/quic/core/uber_quic_stream_id_manager_test.cc
index 353e35d..929d0a1 100644
--- a/quic/core/uber_quic_stream_id_manager_test.cc
+++ b/quic/core/uber_quic_stream_id_manager_test.cc
@@ -67,7 +67,8 @@
   QuicFrame frame_;
 };
 
-INSTANTIATE_TEST_SUITE_P(Tests, UberQuicStreamIdManagerTest,
+INSTANTIATE_TEST_SUITE_P(Tests,
+                         UberQuicStreamIdManagerTest,
                          ::testing::ValuesIn({Perspective::IS_CLIENT,
                                               Perspective::IS_SERVER}));
 
@@ -218,9 +219,9 @@
   EXPECT_TRUE(manager_->MaybeIncreaseLargestPeerStreamId(
       manager_->actual_max_allowed_incoming_unidirectional_stream_id()));
 
-  QuicString error_details = GetParam() == Perspective::IS_SERVER
-                                 ? "Stream id 404 above 400"
-                                 : "Stream id 401 above 397";
+  std::string error_details = GetParam() == Perspective::IS_SERVER
+                                  ? "Stream id 404 above 400"
+                                  : "Stream id 401 above 397";
   EXPECT_CALL(*connection_,
               CloseConnection(QUIC_INVALID_STREAM_ID, error_details, _));
   EXPECT_FALSE(manager_->MaybeIncreaseLargestPeerStreamId(