diff --git a/channels/chan_local.c b/channels/chan_local.c
index 7a9bda356949661aea95e51fcf1b65129234862b..337aadc7ca323b41db156241017a28424b7c44e1 100644
--- a/channels/chan_local.c
+++ b/channels/chan_local.c
@@ -667,12 +667,12 @@ static int local_hangup(struct ast_channel *ast)
 			/* Deadlock avoidance */
 			while (p->owner && ast_channel_trylock(p->owner)) {
 				ast_mutex_unlock(&p->lock);
-				if (ast) {
-					ast_channel_unlock(ast);
+				if (p->chan) {
+					ast_channel_unlock(p->chan);
 				}
 				usleep(1);
-				if (ast) {
-					ast_channel_lock(ast);
+				if (p->chan) {
+					ast_channel_lock(p->chan);
 				}
 				ast_mutex_lock(&p->lock);
 			}
@@ -687,8 +687,17 @@ static int local_hangup(struct ast_channel *ast)
 	} else {
 		ast_module_user_remove(p->u_owner);
 		while (p->chan && ast_channel_trylock(p->chan)) {
-			DEADLOCK_AVOIDANCE(&p->lock);
+				ast_mutex_unlock(&p->lock);
+				if (p->owner) {
+					ast_channel_unlock(p->owner);
+				}
+				usleep(1);
+				if (p->owner) {
+					ast_channel_lock(p->owner);
+				}
+				ast_mutex_lock(&p->lock);
 		}
+
 		p->owner = NULL;
 		if (p->chan) {
 			ast_queue_hangup(p->chan);
diff --git a/main/channel.c b/main/channel.c
index d958559b50ac85c3a438fb14240609de7f15cb0d..ca6cdf89b63b5af2338612b2ebabc694f29d4aa9 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -2544,25 +2544,22 @@ int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen,
 	int res = 0;
 
 	ast_channel_lock(chan);
-
 	if (chan->generatordata) {
 		if (chan->generator && chan->generator->release)
 			chan->generator->release(chan, chan->generatordata);
 		chan->generatordata = NULL;
 	}
-
-	ast_prod(chan);
 	if (gen->alloc && !(chan->generatordata = gen->alloc(chan, params))) {
 		res = -1;
 	}
-	
 	if (!res) {
 		ast_settimeout(chan, 50, generator_force, chan);
 		chan->generator = gen;
 	}
-
 	ast_channel_unlock(chan);
 
+	ast_prod(chan);
+
 	return res;
 }