diff --git a/main/dial.c b/main/dial.c
index 1fd5bfe81ee5f1d08a68a8d15aa5aad0bea05202..7b6ce871ea874a4cc66cef18c0ac867b05d801de 100644
--- a/main/dial.c
+++ b/main/dial.c
@@ -48,6 +48,7 @@ struct ast_dial {
 	ast_dial_state_callback state_callback;            /*!< Status callback */
 	AST_LIST_HEAD_NOLOCK(, ast_dial_channel) channels; /*!< Channels being dialed */
 	pthread_t thread;                                  /*!< Thread (if running in async) */
+	ast_mutex_t lock;                                  /*! Lock to protect the thread information above */
 };
 
 /*! \brief Dialing channel structure. Contains per-channel dialing options, asterisk channel, and more! */
@@ -149,10 +150,12 @@ static void answer_exec_run(struct ast_dial *dial, struct ast_dial_channel *dial
 	pbx_exec(chan, ast_app, args);
 
 	/* If another thread is not taking over hang up the channel */
+	ast_mutex_lock(&dial->lock);
 	if (dial->thread != AST_PTHREADT_STOP) {
 		ast_hangup(chan);
 		dial_channel->owner = NULL;
 	}
+	ast_mutex_unlock(&dial->lock);
 
 	return;
 }
@@ -209,6 +212,9 @@ struct ast_dial *ast_dial_create(void)
 	dial->timeout = -1;
 	dial->actual_timeout = -1;
 
+	/* Can't forget about the lock */
+	ast_mutex_init(&dial->lock);
+
 	return dial;
 }
 
@@ -739,6 +745,9 @@ enum ast_dial_result ast_dial_join(struct ast_dial *dial)
 	/* Record thread */
 	thread = dial->thread;
 
+	/* Boom, commence locking */
+	ast_mutex_lock(&dial->lock);
+
 	/* Stop the thread */
 	dial->thread = AST_PTHREADT_STOP;
 
@@ -753,6 +762,9 @@ enum ast_dial_result ast_dial_join(struct ast_dial *dial)
 		pthread_kill(thread, SIGURG);
 	}
 
+	/* Yay done with it */
+	ast_mutex_unlock(&dial->lock);
+
 	/* Finally wait for the thread to exit */
 	pthread_join(thread, NULL);
 
@@ -828,6 +840,9 @@ int ast_dial_destroy(struct ast_dial *dial)
 		dial->options[i] = NULL;
 	}
 
+	/* Lock be gone! */
+	ast_mutex_destroy(&dial->lock);
+
 	/* Free structure */
 	ast_free(dial);