diff --git a/main/translate.c b/main/translate.c
index 30f16492ef369bdb2fb4347aa304b9009f3e2710..70e97f9556e663dc929996d57f40759eb982eda3 100644
--- a/main/translate.c
+++ b/main/translate.c
@@ -32,6 +32,7 @@
 #include <sys/time.h>
 #include <sys/resource.h>
 #include <math.h>
+#include <stdlib.h>
 
 #include "asterisk/lock.h"
 #include "asterisk/channel.h"
@@ -1413,6 +1414,20 @@ int ast_translator_best_choice(struct ast_format_cap *dst_cap,
 				ao2_replace(bestdst, dst);
 				besttablecost = matrix_get(x, y)->table_cost;
 				beststeps = matrix_get(x, y)->multistep;
+			} else if (matrix_get(x, y)->table_cost == besttablecost
+					&& matrix_get(x, y)->multistep == beststeps) {
+				int gap_selected = abs(ast_format_get_sample_rate(best)
+					- ast_format_get_sample_rate(bestdst));
+				int gap_current = abs(ast_format_get_sample_rate(src)
+					- ast_format_get_sample_rate(dst));
+
+				if (gap_current < gap_selected) {
+					/* better than what we have so far */
+					ao2_replace(best, src);
+					ao2_replace(bestdst, dst);
+					besttablecost = matrix_get(x, y)->table_cost;
+					beststeps = matrix_get(x, y)->multistep;
+				}
 			}
 		}
 	}