diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 38274de7d657dd17b6c15e19bd6bc08a9ec60e89..4769bf549ac50b8cd214d43503c191b9550410d6 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -866,7 +866,7 @@ static const unsigned int CALLNO_POOL_BUCKETS = 2699;
  *
  * \note Contents protected by the iaxsl[] locks
  */
-static AST_LIST_HEAD_NOLOCK(, iax_frame) frame_queue[IAX_MAX_CALLS + 1];
+static AST_LIST_HEAD_NOLOCK(, iax_frame) frame_queue[IAX_MAX_CALLS];
 
 static struct ast_taskprocessor *transmit_processor;
 
@@ -1068,7 +1068,7 @@ static void signal_condition(ast_mutex_t *lock, ast_cond_t *cond)
  * based on the local call number.  The local call number is used as the
  * index into the array where the associated pvt structure is stored.
  */
-static struct chan_iax2_pvt *iaxs[IAX_MAX_CALLS + 1];
+static struct chan_iax2_pvt *iaxs[IAX_MAX_CALLS];
 
 static struct ast_callid *iax_pvt_callid_get(int callno)
 {
@@ -1125,7 +1125,7 @@ static struct ao2_container *iax_transfercallno_pvts;
 
 /* Flag to use with trunk calls, keeping these calls high up.  It halves our effective use
    but keeps the division between trunked and non-trunked better. */
-#define TRUNK_CALL_START	IAX_MAX_CALLS / 2
+#define TRUNK_CALL_START	(IAX_MAX_CALLS / 2)
 
 /* Debug routines... */
 static struct sockaddr_in debugaddr;
@@ -2144,7 +2144,7 @@ static int make_trunk(unsigned short callno, int locked)
 		ast_log(LOG_WARNING, "Can't make trunk once a call has started!\n");
 		return -1;
 	}
-	if (callno & TRUNK_CALL_START) {
+	if (callno >= TRUNK_CALL_START) {
 		ast_log(LOG_WARNING, "Call %d is already a trunk\n", callno);
 		return -1;
 	}
@@ -2782,7 +2782,7 @@ static int create_callno_pools(void)
 	}
 
 	/* start at 2, 0 and 1 are reserved */
-	for (i = 2; i <= IAX_MAX_CALLS; i++) {
+	for (i = 2; i < IAX_MAX_CALLS; i++) {
 		struct callno_entry *callno_entry;
 
 		if (!(callno_entry = ao2_alloc(sizeof(*callno_entry), NULL))) {
diff --git a/channels/iax2.h b/channels/iax2.h
index 87e7bf3985f8866cb7350dc14fa212c3c0e01220..6615016b5aee950a5ea85f97ceac584bd7db703c 100644
--- a/channels/iax2.h
+++ b/channels/iax2.h
@@ -26,9 +26,13 @@
 /* Max version of IAX protocol we support */
 #define IAX_PROTO_VERSION 2
 
-/* NOTE: IT IS CRITICAL THAT IAX_MAX_CALLS BE A POWER OF 2. */
+/* NOTE: It is recommended that IAX_MAX_CALLS be a power of 2, but it is not
+ * required.  The maximum number of calls supported by the protocol is 32768.
+ *
+ * For LOW_MEMORY, we use 2049 for compatibility with earlier code because
+ * callno 2048 leaked out when the intended callno range was 2 - 2047. */
 #if defined(LOW_MEMORY)
-#define IAX_MAX_CALLS 2048
+#define IAX_MAX_CALLS 2049
 #else
 #define IAX_MAX_CALLS 32768
 #endif