diff --git a/ssl/test/runner/runner.go b/ssl/test/runner/runner.go
index 3ab350d..f2ad64f 100644
--- a/ssl/test/runner/runner.go
+++ b/ssl/test/runner/runner.go
@@ -696,6 +696,9 @@
 	// skipSplitHandshake, if true, will skip the generation of a split
 	// handshake copy of the test.
 	skipSplitHandshake bool
+	// skipVersionNameCheck, if true, will skip the consistency check between
+	// test name and the versions.
+	skipVersionNameCheck bool
 }
 
 var testCases []testCase
@@ -1290,24 +1293,6 @@
 		}
 	}()
 
-	if !test.shouldFail && (len(test.expectedError) > 0 || len(test.expectedLocalError) > 0) {
-		panic("Error expected without shouldFail in " + test.name)
-	}
-
-	if test.expectResumeRejected && !test.resumeSession {
-		panic("expectResumeRejected without resumeSession in " + test.name)
-	}
-
-	for _, ver := range tlsVersions {
-		if !strings.Contains("-"+test.name+"-", "-"+ver.name+"-") {
-			continue
-		}
-
-		if test.config.MaxVersion == 0 && test.config.MinVersion == 0 && test.expectations.version == 0 {
-			panic(fmt.Sprintf("The name of test %q suggests that it's version specific, but min/max version in the Config is %x/%x. One of them should probably be %x", test.name, test.config.MinVersion, test.config.MaxVersion, ver.version))
-		}
-	}
-
 	listener, err := net.ListenTCP("tcp", &net.TCPAddr{IP: net.IPv6loopback})
 	if err != nil {
 		listener, err = net.ListenTCP("tcp4", &net.TCPAddr{IP: net.IP{127, 0, 0, 1}})
@@ -6142,6 +6127,9 @@
 					expectations: connectionExpectations{
 						version: expectedVersion,
 					},
+					// The version name check does not recognize the
+					// |excludeFlag| construction in |flags|.
+					skipVersionNameCheck: true,
 				})
 				testCases = append(testCases, testCase{
 					protocol: protocol,
@@ -6173,6 +6161,9 @@
 					expectations: connectionExpectations{
 						version: expectedVersion,
 					},
+					// The version name check does not recognize the
+					// |excludeFlag| construction in |flags|.
+					skipVersionNameCheck: true,
 				})
 				testCases = append(testCases, testCase{
 					protocol: protocol,
@@ -6567,6 +6558,9 @@
 					shouldFail:         shouldFail,
 					expectedError:      expectedError,
 					expectedLocalError: expectedLocalError,
+					// The version name check does not recognize the
+					// |excludeFlag| construction in |flags|.
+					skipVersionNameCheck: true,
 				})
 				testCases = append(testCases, testCase{
 					protocol: protocol,
@@ -6605,6 +6599,9 @@
 					shouldFail:         shouldFail,
 					expectedError:      expectedError,
 					expectedLocalError: expectedLocalError,
+					// The version name check does not recognize the
+					// |excludeFlag| construction in |flags|.
+					skipVersionNameCheck: true,
 				})
 				testCases = append(testCases, testCase{
 					protocol: protocol,
@@ -13079,6 +13076,7 @@
 			MaxVersion:             VersionTLS12,
 			SessionTicketsDisabled: true,
 		},
+		flags:         []string{"-max-version", strconv.Itoa(VersionTLS13)},
 		resumeSession: true,
 	})
 
@@ -17523,6 +17521,44 @@
 	return matched, nil
 }
 
+func checkTests() {
+	for _, test := range testCases {
+		if !test.shouldFail && (len(test.expectedError) > 0 || len(test.expectedLocalError) > 0) {
+			panic("Error expected without shouldFail in " + test.name)
+		}
+
+		if test.expectResumeRejected && !test.resumeSession {
+			panic("expectResumeRejected without resumeSession in " + test.name)
+		}
+
+		if !test.skipVersionNameCheck {
+			for _, ver := range tlsVersions {
+				if !strings.Contains("-"+test.name+"-", "-"+ver.name+"-") {
+					continue
+				}
+
+				found := test.config.MaxVersion == ver.version || test.config.MinVersion == ver.version || test.expectations.version == ver.version
+				if test.resumeConfig != nil {
+					found = found || test.resumeConfig.MaxVersion == ver.version || test.resumeConfig.MinVersion == ver.version
+				}
+				if test.resumeExpectations != nil {
+					found = found || test.resumeExpectations.version == ver.version
+				}
+				shimFlag := ver.shimFlag(test.protocol)
+				for _, flag := range test.flags {
+					if flag == shimFlag {
+						found = true
+						break
+					}
+				}
+				if !found {
+					panic(fmt.Sprintf("The name of test %q suggests that it's version specific, but the test does not reference %s", test.name, ver.name))
+				}
+			}
+		}
+	}
+}
+
 func main() {
 	flag.Parse()
 	*resourceDir = path.Clean(*resourceDir)
@@ -17599,7 +17635,7 @@
 	}
 	testCases = append(testCases, toAppend...)
 
-	var wg sync.WaitGroup
+	checkTests()
 
 	numWorkers := *numWorkersFlag
 	if useDebugger() {
@@ -17612,6 +17648,7 @@
 
 	go statusPrinter(doneChan, statusChan, len(testCases))
 
+	var wg sync.WaitGroup
 	for i := 0; i < numWorkers; i++ {
 		wg.Add(1)
 		go worker(statusChan, testChan, *shimPath, &wg)
