diff --git a/configs/udptl.conf.sample b/configs/udptl.conf.sample
index 05a38d54ec82bdf2ad22371d7c5e510db2f6ba45..706994c6e3a3a80e8b46513f33055f07cb458e5c 100644
--- a/configs/udptl.conf.sample
+++ b/configs/udptl.conf.sample
@@ -28,3 +28,8 @@ udptlfecentries = 3
 ; The span over which parity is calculated for FEC in a UDPTL packet
 ;
 udptlfecspan = 3
+;
+; Some VoIP providers will only accept an offer with an even-numbered
+; UDPTL port. Set this option so that Asterisk will only attempt to use
+; even-numbered ports when negotiating T.38. Default is no.
+use_even_ports = no
diff --git a/main/udptl.c b/main/udptl.c
index f1ca1842825eb9f4a3dc9105795538a1e208edc3..74a49b3cceaaf042488d59e84d97e69a110c63fd 100644
--- a/main/udptl.c
+++ b/main/udptl.c
@@ -85,6 +85,7 @@ static enum ast_t38_ec_modes udptlfectype;
 static int udptlfecentries;
 static int udptlfecspan;
 static int udptlmaxdatagram;
+static int use_even_ports;
 
 #define LOCAL_FAX_MAX_DATAGRAM      1400
 #define MAX_FEC_ENTRIES             5
@@ -889,6 +890,9 @@ struct ast_udptl *ast_udptl_new_with_bindaddr(struct sched_context *sched, struc
 #endif
 	/* Find us a place */
 	x = (udptlstart == udptlend) ? udptlstart : (ast_random() % (udptlend - udptlstart)) + udptlstart;
+	if (use_even_ports && (x & 1)) {
+		++x;
+	}
 	startplace = x;
 	for (;;) {
 		udptl->us.sin_port = htons(x);
@@ -901,7 +905,12 @@ struct ast_udptl *ast_udptl_new_with_bindaddr(struct sched_context *sched, struc
 			ast_free(udptl);
 			return NULL;
 		}
-		if (++x > udptlend)
+		if (use_even_ports) {
+			x += 2;
+		} else {
+			++x;
+		}
+		if (x > udptlend)
 			x = udptlstart;
 		if (x == startplace) {
 			ast_log(LOG_WARNING, "No UDPTL ports remaining\n");
@@ -1258,6 +1267,7 @@ static void __ast_udptl_reload(int reload)
 	udptlfecentries = 0;
 	udptlfecspan = 0;
 	udptlmaxdatagram = 0;
+	use_even_ports = 0;
 
 	if (cfg) {
 		if ((s = ast_variable_retrieve(cfg, "general", "udptlstart"))) {
@@ -1332,6 +1342,9 @@ static void __ast_udptl_reload(int reload)
 				udptlfecspan = MAX_FEC_SPAN;
 			}
 		}
+		if ((s = ast_variable_retrieve(cfg, "general", "use_even_ports"))) {
+			use_even_ports = ast_true(s);
+		}
 		ast_config_destroy(cfg);
 	}
 	if (udptlstart >= udptlend) {
@@ -1339,6 +1352,14 @@ static void __ast_udptl_reload(int reload)
 		udptlstart = 4500;
 		udptlend = 4999;
 	}
+	if (use_even_ports && (udptlstart & 1)) {
+		++udptlstart;
+		ast_log(LOG_NOTICE, "Odd numbered udptlstart specified but use_even_ports enabled. udptlstart is now %d\n", udptlstart);
+	}
+	if (use_even_ports && (udptlend & 1)) {
+		--udptlend;
+		ast_log(LOG_NOTICE, "Odd numbered udptlend specified but use_event_ports enabled. udptlend is now %d\n", udptlend);
+	}
 	ast_verb(2, "UDPTL allocating from port range %d -> %d\n", udptlstart, udptlend);
 }