diff --git a/quiche/quic/core/quic_versions.cc b/quiche/quic/core/quic_versions.cc
index c0fd4fc..a765a33 100644
--- a/quiche/quic/core/quic_versions.cc
+++ b/quiche/quic/core/quic_versions.cc
@@ -291,6 +291,36 @@
   return versions;
 }
 
+ParsedQuicVersionVector ObsoleteSupportedVersions() {
+  return ParsedQuicVersionVector{quic::ParsedQuicVersion::Q046(),
+                                 quic::ParsedQuicVersion::Q050(),
+                                 quic::ParsedQuicVersion::Draft29()};
+}
+
+bool IsObsoleteSupportedVersion(ParsedQuicVersion version) {
+  static const ParsedQuicVersionVector obsolete_versions =
+      ObsoleteSupportedVersions();
+  for (const ParsedQuicVersion& obsolete_version : obsolete_versions) {
+    if (version == obsolete_version) {
+      return true;
+    }
+  }
+  return false;
+}
+
+ParsedQuicVersionVector CurrentSupportedVersionsForClients() {
+  ParsedQuicVersionVector versions;
+  for (const ParsedQuicVersion& version : CurrentSupportedVersionsWithTls()) {
+    QUICHE_DCHECK_EQ(version.handshake_protocol, PROTOCOL_TLS1_3);
+    if (version.transport_version >= QUIC_VERSION_IETF_RFC_V1) {
+      versions.push_back(version);
+    }
+  }
+  QUIC_BUG_IF(quic_bug_10589_8, versions.empty())
+      << "No supported client versions found.";
+  return versions;
+}
+
 ParsedQuicVersionVector CurrentSupportedHttp3Versions() {
   ParsedQuicVersionVector versions;
   for (const ParsedQuicVersion& version : CurrentSupportedVersions()) {
diff --git a/quiche/quic/core/quic_versions.h b/quiche/quic/core/quic_versions.h
index 8958e33..da66a17 100644
--- a/quiche/quic/core/quic_versions.h
+++ b/quiche/quic/core/quic_versions.h
@@ -418,6 +418,18 @@
 // flags excluded.
 QUICHE_EXPORT ParsedQuicVersionVector CurrentSupportedVersions();
 
+// Obsolete QUIC supported versions are versions that are supported in
+// QUICHE but which should not be used by by modern clients.
+QUICHE_EXPORT ParsedQuicVersionVector ObsoleteSupportedVersions();
+
+// Returns true if `version` is in `ObsoleteSupportedVersions`.
+QUICHE_EXPORT bool IsObsoleteSupportedVersion(ParsedQuicVersion version);
+
+// Returns a vector of supported QUIC versions which should be used by clients.
+// Server need to support old clients, but new client should only be using
+// QUIC versions in this list.
+QUICHE_EXPORT ParsedQuicVersionVector CurrentSupportedVersionsForClients();
+
 // Returns a vector of QUIC versions from |versions| which exclude any versions
 // which are disabled by flags.
 QUICHE_EXPORT ParsedQuicVersionVector
diff --git a/quiche/quic/core/quic_versions_test.cc b/quiche/quic/core/quic_versions_test.cc
index bf0078c..4931c14 100644
--- a/quiche/quic/core/quic_versions_test.cc
+++ b/quiche/quic/core/quic_versions_test.cc
@@ -502,6 +502,40 @@
   }
 }
 
+TEST(QuicVersionsTest, ObsoleteSupportedVersions) {
+  ParsedQuicVersionVector obsolete_versions = ObsoleteSupportedVersions();
+  EXPECT_EQ(quic::ParsedQuicVersion::Q046(), obsolete_versions[0]);
+  EXPECT_EQ(quic::ParsedQuicVersion::Q050(), obsolete_versions[1]);
+  EXPECT_EQ(quic::ParsedQuicVersion::Draft29(), obsolete_versions[2]);
+}
+
+TEST(QuicVersionsTest, IsObsoleteSupportedVersion) {
+  for (const ParsedQuicVersion& version : AllSupportedVersions()) {
+    bool is_obsolete = version.handshake_protocol != PROTOCOL_TLS1_3 ||
+                       version.transport_version < QUIC_VERSION_IETF_RFC_V1;
+    EXPECT_EQ(is_obsolete, IsObsoleteSupportedVersion(version));
+  }
+}
+
+TEST(QuicVersionsTest, CurrentSupportedVersionsForClients) {
+  ParsedQuicVersionVector supported_versions = CurrentSupportedVersions();
+  ParsedQuicVersionVector client_versions =
+      CurrentSupportedVersionsForClients();
+  for (auto& version : supported_versions) {
+    const bool is_obsolete = IsObsoleteSupportedVersion(version);
+    const bool is_supported =
+        absl::c_find(client_versions, version) != client_versions.end();
+    // Every supported version which is not obsolete should be a supported
+    // client version.
+    EXPECT_EQ(!is_obsolete, is_supported);
+  }
+  // Every client version should be a supported version, of course.
+  for (auto& version : client_versions) {
+    EXPECT_TRUE(absl::c_find(supported_versions, version) !=
+                supported_versions.end());
+  }
+}
+
 }  // namespace
 }  // namespace test
 }  // namespace quic
