diff --git a/channels/chan_local.c b/channels/chan_local.c
index 20e46c9aa05dbb802918974b5859e41b4b24fde0..c9740cd27a197ce672eed4d9f6deb4beac33abac 100644
--- a/channels/chan_local.c
+++ b/channels/chan_local.c
@@ -85,6 +85,8 @@ static const int BUCKET_SIZE = 1;
 
 static struct ao2_container *locals;
 
+static unsigned int name_sequence = 0;
+
 static struct ast_jb_conf g_jb_conf = {
 	.flags = 0,
 	.max_size = -1,
@@ -1195,8 +1197,8 @@ static struct local_pvt *local_alloc(const char *data, struct ast_format_cap *ca
 static struct ast_channel *local_new(struct local_pvt *p, int state, const char *linkedid, struct ast_callid *callid)
 {
 	struct ast_channel *tmp = NULL, *tmp2 = NULL;
-	int randnum = ast_random() & 0xffff;
 	struct ast_format fmt;
+	int generated_seqno = ast_atomic_fetchadd_int((int *)&name_sequence, +1);
 	const char *t;
 	int ama;
 
@@ -1214,8 +1216,8 @@ static struct ast_channel *local_new(struct local_pvt *p, int state, const char
 
 	/* Make sure that the ;2 channel gets the same linkedid as ;1. You can't pass linkedid to both
 	 * allocations since if linkedid isn't set, then each channel will generate its own linkedid. */
-	if (!(tmp = ast_channel_alloc(1, state, 0, 0, t, p->exten, p->context, linkedid, ama, "Local/%s@%s-%04x;1", p->exten, p->context, randnum)) 
-		|| !(tmp2 = ast_channel_alloc(1, AST_STATE_RING, 0, 0, t, p->exten, p->context, ast_channel_linkedid(tmp), ama, "Local/%s@%s-%04x;2", p->exten, p->context, randnum))) {
+	if (!(tmp = ast_channel_alloc(1, state, 0, 0, t, p->exten, p->context, linkedid, ama, "Local/%s@%s-%08x;1", p->exten, p->context, generated_seqno))
+		|| !(tmp2 = ast_channel_alloc(1, AST_STATE_RING, 0, 0, t, p->exten, p->context, ast_channel_linkedid(tmp), ama, "Local/%s@%s-%08x;2", p->exten, p->context, generated_seqno))) {
 		if (tmp) {
 			tmp = ast_channel_release(tmp);
 		}