diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c
index 241bcc3..574b85f 100644
--- a/ssl/ssl_lib.c
+++ b/ssl/ssl_lib.c
@@ -246,6 +246,9 @@
 	if (s == NULL) goto err;
 	memset(s,0,sizeof(SSL));
 
+	s->min_version = ctx->min_version;
+	s->max_version = ctx->max_version;
+
 	s->options=ctx->options;
 	s->mode=ctx->mode;
 	s->max_cert_list=ctx->max_cert_list;
@@ -2878,6 +2881,26 @@
 	ctx->psk_server_callback = cb;
 	}
 
+void SSL_CTX_set_min_version(SSL_CTX *ctx, uint16_t version)
+	{
+	ctx->min_version = version;
+	}
+
+void SSL_CTX_set_max_version(SSL_CTX *ctx, uint16_t version)
+	{
+	ctx->max_version = version;
+	}
+
+void SSL_set_min_version(SSL *ssl, uint16_t version)
+	{
+	ssl->min_version = version;
+	}
+
+void SSL_set_max_version(SSL *ssl, uint16_t version)
+	{
+	ssl->max_version = version;
+	}
+
 void SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))
 	{
 	SSL_CTX_callback_ctrl(ctx, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb);
@@ -3094,47 +3117,69 @@
 
 uint16_t ssl3_get_max_server_version(const SSL *s)
 	{
+	uint16_t max_version;
+
 	if (SSL_IS_DTLS(s))
 		{
-		if (!(s->options & SSL_OP_NO_DTLSv1_2))
+		max_version = (s->max_version != 0) ? s->max_version : DTLS1_2_VERSION;
+		if (!(s->options & SSL_OP_NO_DTLSv1_2) && DTLS1_2_VERSION >= max_version)
 			return DTLS1_2_VERSION;
-		if (!(s->options & SSL_OP_NO_DTLSv1))
+		if (!(s->options & SSL_OP_NO_DTLSv1) && DTLS1_VERSION >= max_version)
 			return DTLS1_VERSION;
 		return 0;
 		}
 
-	if (!(s->options & SSL_OP_NO_TLSv1_2))
+	max_version = (s->max_version != 0) ? s->max_version : TLS1_2_VERSION;
+	if (!(s->options & SSL_OP_NO_TLSv1_2) && TLS1_2_VERSION <= max_version)
 		return TLS1_2_VERSION;
-	if (!(s->options & SSL_OP_NO_TLSv1_1))
+	if (!(s->options & SSL_OP_NO_TLSv1_1) && TLS1_1_VERSION <= max_version)
 		return TLS1_1_VERSION;
-	if (!(s->options & SSL_OP_NO_TLSv1))
+	if (!(s->options & SSL_OP_NO_TLSv1) && TLS1_VERSION <= max_version)
 		return TLS1_VERSION;
-	if (!(s->options & SSL_OP_NO_SSLv3))
+	if (!(s->options & SSL_OP_NO_SSLv3) && SSL3_VERSION <= max_version)
 		return SSL3_VERSION;
 	return 0;
 	}
 
 uint16_t ssl3_get_mutual_version(SSL *s, uint16_t client_version)
 	{
+	uint16_t version = 0;
+
 	if (SSL_IS_DTLS(s))
 		{
+		/* Clamp client_version to max_version. */
+		if (s->max_version != 0 && client_version < s->max_version)
+			client_version = s->max_version;
+
 		if (client_version <= DTLS1_2_VERSION && !(s->options & SSL_OP_NO_DTLSv1_2))
-			return DTLS1_2_VERSION;
-		if (client_version <= DTLS1_VERSION && !(s->options & SSL_OP_NO_DTLSv1))
-			return DTLS1_VERSION;
-		return 0;
+			version = DTLS1_2_VERSION;
+		else if (client_version <= DTLS1_VERSION && !(s->options & SSL_OP_NO_DTLSv1))
+			version = DTLS1_VERSION;
+
+		/* Check against min_version. */
+		if (version != 0 && s->min_version != 0 && version > s->min_version)
+			return 0;
+		return version;
 		}
 	else
 		{
+		/* Clamp client_version to max_version. */
+		if (s->max_version != 0 && client_version > s->max_version)
+			client_version = s->max_version;
+
 		if (client_version >= TLS1_2_VERSION && !(s->options & SSL_OP_NO_TLSv1_2))
-			return TLS1_2_VERSION;
-		if (client_version >= TLS1_1_VERSION && !(s->options & SSL_OP_NO_TLSv1_1))
-			return TLS1_1_VERSION;
-		if (client_version >= TLS1_VERSION && !(s->options & SSL_OP_NO_TLSv1))
-			return TLS1_VERSION;
-		if (client_version >= SSL3_VERSION && !(s->options & SSL_OP_NO_SSLv3))
-			return SSL3_VERSION;
-		return 0;
+			version =  TLS1_2_VERSION;
+		else if (client_version >= TLS1_1_VERSION && !(s->options & SSL_OP_NO_TLSv1_1))
+			version = TLS1_1_VERSION;
+		else if (client_version >= TLS1_VERSION && !(s->options & SSL_OP_NO_TLSv1))
+			version = TLS1_VERSION;
+		else if (client_version >= SSL3_VERSION && !(s->options & SSL_OP_NO_SSLv3))
+			version = SSL3_VERSION;
+
+		/* Check against min_version. */
+		if (version != 0 && s->min_version != 0 && version < s->min_version)
+			return 0;
+		return version;
 		}
 	}
 
@@ -3155,16 +3200,15 @@
 	 * set a maximum version of TLS 1.2 in a future-proof way.
 	 *
 	 * By this scheme, the maximum version is the lowest version V such that
-	 * V is enabled and V+1 is disabled or unimplemented.
-	 *
-	 * TODO(davidben): Deprecate this API in favor of more sensible
-	 * min_version/max_version settings. */
+	 * V is enabled and V+1 is disabled or unimplemented. */
 	if (SSL_IS_DTLS(s))
 		{
 		if (!(options & SSL_OP_NO_DTLSv1_2))
 			version = DTLS1_2_VERSION;
 		if (!(options & SSL_OP_NO_DTLSv1) && (options & SSL_OP_NO_DTLSv1_2))
 			version = DTLS1_VERSION;
+		if (s->max_version != 0 && version < s->max_version)
+			version = s->max_version;
 		}
 	else
 		{
@@ -3176,6 +3220,8 @@
 			version = TLS1_VERSION;
 		if (!(options & SSL_OP_NO_SSLv3) && (options & SSL_OP_NO_TLSv1))
 			version = SSL3_VERSION;
+		if (s->max_version != 0 && version > s->max_version)
+			version = s->max_version;
 		}
 
 	return version;
@@ -3185,6 +3231,10 @@
 	{
 	if (SSL_IS_DTLS(s))
 		{
+		if (s->max_version != 0 && version < s->max_version)
+			return 0;
+		if (s->min_version != 0 && version > s->min_version)
+			return 0;
 		switch (version)
 			{
 		case DTLS1_VERSION:
@@ -3197,6 +3247,10 @@
 		}
 	else
 		{
+		if (s->max_version != 0 && version > s->max_version)
+			return 0;
+		if (s->min_version != 0 && version < s->min_version)
+			return 0;
 		switch (version)
 			{
 		case SSL3_VERSION:
diff --git a/ssl/test/bssl_shim.cc b/ssl/test/bssl_shim.cc
index e04e44b..3d78c1c 100644
--- a/ssl/test/bssl_shim.cc
+++ b/ssl/test/bssl_shim.cc
@@ -430,6 +430,12 @@
     return 1;
   }
   SSL_enable_fastradio_padding(ssl, config->fastradio_padding);
+  if (config->min_version != 0) {
+    SSL_set_min_version(ssl, (uint16_t)config->min_version);
+  }
+  if (config->max_version != 0) {
+    SSL_set_max_version(ssl, (uint16_t)config->max_version);
+  }
 
   BIO *bio = BIO_new_fd(fd, 1 /* take ownership */);
   if (bio == NULL) {
diff --git a/ssl/test/runner/runner.go b/ssl/test/runner/runner.go
index 5605966..2b91f43 100644
--- a/ssl/test/runner/runner.go
+++ b/ssl/test/runner/runner.go
@@ -1639,6 +1639,8 @@
 					suffix += "-DTLS"
 				}
 
+				shimVersFlag := strconv.Itoa(int(versionToWire(shimVers.version, protocol == dtls)))
+
 				clientVers := shimVers.version
 				if clientVers > VersionTLS10 {
 					clientVers = VersionTLS10
@@ -1656,6 +1658,19 @@
 					flags:           flags,
 					expectedVersion: expectedVersion,
 				})
+				testCases = append(testCases, testCase{
+					protocol: protocol,
+					testType: clientTest,
+					name:     "VersionNegotiation-Client2-" + suffix,
+					config: Config{
+						MaxVersion: runnerVers.version,
+						Bugs: ProtocolBugs{
+							ExpectInitialRecordVersion: clientVers,
+						},
+					},
+					flags:           []string{"-max-version", shimVersFlag},
+					expectedVersion: expectedVersion,
+				})
 
 				testCases = append(testCases, testCase{
 					protocol: protocol,
@@ -1670,6 +1685,19 @@
 					flags:           flags,
 					expectedVersion: expectedVersion,
 				})
+				testCases = append(testCases, testCase{
+					protocol: protocol,
+					testType: serverTest,
+					name:     "VersionNegotiation-Server2-" + suffix,
+					config: Config{
+						MaxVersion: runnerVers.version,
+						Bugs: ProtocolBugs{
+							ExpectInitialRecordVersion: expectedVersion,
+						},
+					},
+					flags:           []string{"-max-version", shimVersFlag},
+					expectedVersion: expectedVersion,
+				})
 			}
 		}
 	}
diff --git a/ssl/test/test_config.cc b/ssl/test/test_config.cc
index 59874ef..a678a69 100644
--- a/ssl/test/test_config.cc
+++ b/ssl/test/test_config.cc
@@ -15,6 +15,7 @@
 #include "test_config.h"
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 
 #include <memory>
@@ -23,20 +24,26 @@
 
 namespace {
 
-typedef bool TestConfig::*BoolMember;
-typedef std::string TestConfig::*StringMember;
-
-struct BoolFlag {
+template <typename T>
+struct Flag {
   const char *flag;
-  BoolMember member;
+  T TestConfig::*member;
 };
 
-struct StringFlag {
-  const char *flag;
-  StringMember member;
-};
+// FindField looks for the flag in |flags| that matches |flag|. If one is found,
+// it returns a pointer to the corresponding field in |config|. Otherwise, it
+// returns NULL.
+template<typename T, size_t N>
+T *FindField(TestConfig *config, const Flag<T> (&flags)[N], const char *flag) {
+  for (size_t i = 0; i < N; i++) {
+    if (strcmp(flag, flags[i].flag) == 0) {
+      return &(config->*(flags[i].member));
+    }
+  }
+  return NULL;
+}
 
-const BoolFlag kBoolFlags[] = {
+const Flag<bool> kBoolFlags[] = {
   { "-server", &TestConfig::is_server },
   { "-dtls", &TestConfig::is_dtls },
   { "-resume", &TestConfig::resume },
@@ -68,9 +75,7 @@
   { "-fastradio-padding", &TestConfig::fastradio_padding },
 };
 
-const size_t kNumBoolFlags = sizeof(kBoolFlags) / sizeof(kBoolFlags[0]);
-
-const StringFlag kStringFlags[] = {
+const Flag<std::string> kStringFlags[] = {
   { "-key-file", &TestConfig::key_file },
   { "-cert-file", &TestConfig::cert_file },
   { "-expect-server-name", &TestConfig::expected_server_name },
@@ -88,9 +93,7 @@
   { "-srtp-profiles", &TestConfig::srtp_profiles },
 };
 
-const size_t kNumStringFlags = sizeof(kStringFlags) / sizeof(kStringFlags[0]);
-
-const StringFlag kBase64Flags[] = {
+const Flag<std::string> kBase64Flags[] = {
   { "-expect-certificate-types", &TestConfig::expected_certificate_types },
   { "-expect-channel-id", &TestConfig::expected_channel_id },
   { "-expect-ocsp-response", &TestConfig::expected_ocsp_response },
@@ -98,7 +101,10 @@
     &TestConfig::expected_signed_cert_timestamps },
 };
 
-const size_t kNumBase64Flags = sizeof(kBase64Flags) / sizeof(kBase64Flags[0]);
+const Flag<int> kIntFlags[] = {
+  { "-min-version", &TestConfig::min_version },
+  { "-max-version", &TestConfig::max_version },
+};
 
 }  // namespace
 
@@ -126,43 +132,32 @@
       allow_unsafe_legacy_renegotiation(false),
       enable_ocsp_stapling(false),
       enable_signed_cert_timestamps(false),
-      fastradio_padding(false) {
+      fastradio_padding(false),
+      min_version(0),
+      max_version(0) {
 }
 
 bool ParseConfig(int argc, char **argv, TestConfig *out_config) {
   for (int i = 0; i < argc; i++) {
-    size_t j;
-    for (j = 0; j < kNumBoolFlags; j++) {
-      if (strcmp(argv[i], kBoolFlags[j].flag) == 0) {
-        break;
-      }
-    }
-    if (j < kNumBoolFlags) {
-      out_config->*(kBoolFlags[j].member) = true;
+    bool *bool_field = FindField(out_config, kBoolFlags, argv[i]);
+    if (bool_field != NULL) {
+      *bool_field = true;
       continue;
     }
 
-    for (j = 0; j < kNumStringFlags; j++) {
-      if (strcmp(argv[i], kStringFlags[j].flag) == 0) {
-        break;
-      }
-    }
-    if (j < kNumStringFlags) {
+    std::string *string_field = FindField(out_config, kStringFlags, argv[i]);
+    if (string_field != NULL) {
       i++;
       if (i >= argc) {
         fprintf(stderr, "Missing parameter\n");
         return false;
       }
-      out_config->*(kStringFlags[j].member) = argv[i];
+      string_field->assign(argv[i]);
       continue;
     }
 
-    for (j = 0; j < kNumBase64Flags; j++) {
-      if (strcmp(argv[i], kBase64Flags[j].flag) == 0) {
-        break;
-      }
-    }
-    if (j < kNumBase64Flags) {
+    std::string *base64_field = FindField(out_config, kBase64Flags, argv[i]);
+    if (base64_field != NULL) {
       i++;
       if (i >= argc) {
         fprintf(stderr, "Missing parameter\n");
@@ -178,8 +173,18 @@
                             strlen(argv[i]))) {
         fprintf(stderr, "Invalid base64: %s\n", argv[i]);
       }
-      out_config->*(kBase64Flags[j].member) = std::string(
-          reinterpret_cast<const char *>(decoded.get()), len);
+      base64_field->assign(reinterpret_cast<const char *>(decoded.get()), len);
+      continue;
+    }
+
+    int *int_field = FindField(out_config, kIntFlags, argv[i]);
+    if (int_field) {
+      i++;
+      if (i >= argc) {
+        fprintf(stderr, "Missing parameter\n");
+        return false;
+      }
+      *int_field = atoi(argv[i]);
       continue;
     }
 
diff --git a/ssl/test/test_config.h b/ssl/test/test_config.h
index f778c28..c7fd136 100644
--- a/ssl/test/test_config.h
+++ b/ssl/test/test_config.h
@@ -64,6 +64,8 @@
   bool enable_signed_cert_timestamps;
   std::string expected_signed_cert_timestamps;
   bool fastradio_padding;
+  int min_version;
+  int max_version;
 };
 
 bool ParseConfig(int argc, char **argv, TestConfig *out_config);
