diff --git a/src/channels/chan_voicemngr.c b/src/channels/chan_voicemngr.c
index 60fb25d8ccf7dd33315e8c5afb223f352ec17a2b..30724ef278d294fcd14f0271e429aaaea551909a 100644
--- a/src/channels/chan_voicemngr.c
+++ b/src/channels/chan_voicemngr.c
@@ -838,7 +838,6 @@ static int chan_voicemngr_indicate(struct ast_channel *ast, int condition, const
 	case AST_CONTROL_UNHOLD:
 		pvt_lock(sub->parent, "indicate");
 		chan_voicemngr_stop_dialtone(sub->parent);
-		pvt_unlock(sub->parent);
 		// Play a beep when unholding.
 		play_bridge_channel = ast_channel_get_bridge_channel(ast);
 		ast_bridge_channel_queue_playfile(play_bridge_channel, NULL, "beep", NULL);
@@ -852,6 +851,7 @@ static int chan_voicemngr_indicate(struct ast_channel *ast, int condition, const
 		astFrame.frametype = AST_FRAME_CONTROL;
 		astFrame.subclass.integer = AST_CONTROL_SRCUPDATE;
 		ast_bridge_queue_everyone_else(myBridge, NULL, &astFrame);
+		pvt_unlock(sub->parent);
 		break;
 
 	case AST_CONTROL_UPDATE_RTP_PEER:
@@ -5388,16 +5388,15 @@ static int chan_voicemngr_create_conference(struct chan_voicemngr_pvt *p)
 
 	// Move second call into first bridge and wait for it to finish.
 	chanToKick[0] = second->owner;
-        if(onholdBridge && secondBridge)
-		res = ast_bridge_merge(onholdBridge, secondBridge, 0, chanToKick, 1);
 	pvt_lock(second->parent, "moving call to first bridge");
+	if(onholdBridge && secondBridge)
+		res = ast_bridge_merge(onholdBridge, secondBridge, 0, chanToKick, 1);
 	while(ast_bridge_find_by_id(second->conference_id)) sched_yield();
-	pvt_unlock(second->parent);
         // SIP calls need unhold sent to the bridge as well.
 	astFrame.frametype = AST_FRAME_CONTROL;
 	astFrame.subclass.integer = AST_CONTROL_UNHOLD;
 	ast_bridge_queue_everyone_else(onholdBridge, NULL, &astFrame);
-
+	pvt_unlock(second->parent);
         ast_log(LOG_NOTICE,"Conference started \n");
 	return res;
 }