diff --git a/channels/chan_alsa.c b/channels/chan_alsa.c
index 67c0b66d6d24f53527593b5d7c69885fcbb4edf0..1651b7d4a8e7a2b8343e37b83dfa4927634bd955 100644
--- a/channels/chan_alsa.c
+++ b/channels/chan_alsa.c
@@ -580,6 +580,7 @@ static int alsa_hangup(struct ast_channel *c)
 	c->tech_pvt = NULL;
 	alsa.owner = NULL;
 	ast_verbose(" << Hangup on console >> \n");
+	ast_module_unref(ast_module_info->self);
 	if (hookstate) {
 		hookstate = 0;
 		if (!autoanswer) {
@@ -805,6 +806,7 @@ static struct ast_channel *alsa_new(struct chan_alsa_pvt *p, int state)
 	if (!ast_strlen_zero(language))
 		ast_string_field_set(tmp, language, language);
 	p->owner = tmp;
+	ast_module_ref(ast_module_info->self);
 	ast_jb_configure(tmp, &global_jbconf);
 	if (state != AST_STATE_DOWN) {
 		if (ast_pbx_start(tmp)) {
diff --git a/channels/chan_features.c b/channels/chan_features.c
index c4d82d736de173abd79b9e45977b0ae271e770fd..2fb720780c80f3d1822161aab851bcac2ad6d400 100644
--- a/channels/chan_features.c
+++ b/channels/chan_features.c
@@ -490,6 +490,7 @@ static struct ast_channel *features_new(struct feature_pvt *p, int state, int in
 	p->subs[index].owner = tmp;
 	if (!p->owner)
 		p->owner = tmp;
+	ast_module_ref(ast_module_info->self);
 	return tmp;
 }
 
diff --git a/channels/chan_gtalk.c b/channels/chan_gtalk.c
index 430601a4c99f8df7ac7d3624c36914aa09ff14d9..fa1d216aa1ff12d0c3465d07f68fc14484d87026 100644
--- a/channels/chan_gtalk.c
+++ b/channels/chan_gtalk.c
@@ -952,6 +952,7 @@ static struct ast_channel *gtalk_new(struct gtalk *client, struct gtalk_pvt *i,
 	if (!ast_strlen_zero(client->musicclass))
 		ast_string_field_set(tmp, musicclass, client->musicclass);
 	i->owner = tmp;
+	ast_module_ref(ast_module_info->self);
 	ast_copy_string(tmp->context, client->context, sizeof(tmp->context));
 	ast_copy_string(tmp->exten, i->exten, sizeof(tmp->exten));
 	/* Don't use ast_set_callerid() here because it will
@@ -1464,6 +1465,7 @@ static int gtalk_hangup(struct ast_channel *ast)
 	ast_mutex_unlock(&p->lock);
 
 	gtalk_free_pvt(client, p);
+	ast_module_unref(ast_module_info->self);
 
 	return 0;
 }
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 5ca384280bb6377dbe3e30001ba1840bfbc301c2..c63b155413486dc6a3838b20380a8cda94c1a4b5 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -1772,6 +1772,7 @@ static int iax2_predestroy(int callno)
 		c->tech_pvt = NULL;
 		ast_queue_hangup(c);
 		pvt->owner = NULL;
+		ast_module_unref(ast_module_info->self);
 	}
 
 	return 0;
@@ -3402,6 +3403,7 @@ static struct ast_channel *ast_iax2_new(int callno, int state, int capability)
 	for (v = i->vars ; v ; v = v->next)
 		pbx_builtin_setvar_helper(tmp, v->name, v->value);
 
+	ast_module_ref(ast_module_info->self);
 	return tmp;
 }
 
diff --git a/channels/chan_oss.c b/channels/chan_oss.c
index fb869cbf45af22bb8812094322850f74c7995a23..470c4aece0b836c9dd50df49408f83e1243dda6d 100644
--- a/channels/chan_oss.c
+++ b/channels/chan_oss.c
@@ -865,6 +865,7 @@ static int oss_hangup(struct ast_channel *c)
 	c->tech_pvt = NULL;
 	o->owner = NULL;
 	ast_verbose(" << Hangup on console >> \n");
+	ast_module_unref(ast_module_info->self);
 	if (o->hookstate) {
 		if (o->autoanswer || o->autohangup) {
 			/* Assume auto-hangup too */
@@ -1047,6 +1048,7 @@ static struct ast_channel *oss_new(struct chan_oss_pvt *o, char *ext, char *ctx,
 		c->cid.cid_dnid = ast_strdup(ext);
 
 	o->owner = c;
+	ast_module_ref(ast_module_info->self);
 	ast_jb_configure(c, &global_jbconf);
 	if (state != AST_STATE_DOWN) {
 		if (ast_pbx_start(c)) {
diff --git a/channels/chan_phone.c b/channels/chan_phone.c
index 26e6921270eeb57b5f9de00a14b0ec8f3d994a28..8312fabf0a01ce9af20ac31119213b775aab02b8 100644
--- a/channels/chan_phone.c
+++ b/channels/chan_phone.c
@@ -385,6 +385,7 @@ static int phone_hangup(struct ast_channel *ast)
 	p->dialtone = 0;
 	memset(p->ext, 0, sizeof(p->ext));
 	((struct phone_pvt *)(ast->tech_pvt))->owner = NULL;
+	ast_module_unref(ast_module_info->self);
 	if (option_verbose > 2) 
 		ast_verbose( VERBOSE_PREFIX_3 "Hungup '%s'\n", ast->name);
 	ast->tech_pvt = NULL;
@@ -907,6 +908,7 @@ static struct ast_channel *phone_new(struct phone_pvt *i, int state, char *conte
 		tmp->cid.cid_name = ast_strdup(i->cid_name);
 
 		i->owner = tmp;
+		ast_module_ref(ast_module_info->self);
 		if (state != AST_STATE_DOWN) {
 			if (state == AST_STATE_RING) {
 				ioctl(tmp->fds[0], PHONE_RINGBACK);
@@ -987,6 +989,7 @@ static void phone_check_exception(struct phone_pvt *i)
 			if (i->mode == MODE_IMMEDIATE) {
 				phone_new(i, AST_STATE_RING, i->context);
 			} else if (i->mode == MODE_DIALTONE) {
+				ast_module_ref(ast_module_info->self);
 				/* Reset the extension */
 				i->ext[0] = '\0';
 				/* Play the dialtone */
@@ -996,6 +999,7 @@ static void phone_check_exception(struct phone_pvt *i)
 				ioctl(i->fd, PHONE_PLAY_START);
 				i->lastformat = -1;
 			} else if (i->mode == MODE_SIGMA) {
+				ast_module_ref(ast_module_info->self);
 				/* Reset the extension */
 				i->ext[0] = '\0';
 				/* Play the dialtone */
@@ -1003,6 +1007,8 @@ static void phone_check_exception(struct phone_pvt *i)
 				ioctl(i->fd, PHONE_DIALTONE);
 			}
 		} else {
+			if (i->dialtone)
+				ast_module_unref(ast_module_info->self);
 			memset(i->ext, 0, sizeof(i->ext));
 			if (i->cpt)
 			{
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 6d43d36faac4390b699e18d87620a3d3f44117ad..abd473b71d09c5fbba7d112a4e7f9b5b17c70e84 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -3455,6 +3455,7 @@ static int sip_hangup(struct ast_channel *ast)
 	p->owner = NULL;
 	ast->tech_pvt = NULL;
 
+	ast_module_unref(ast_module_info->self);
 	/* Do not destroy this pvt until we have timeout or
 	   get an answer to the BYE or INVITE/CANCEL 
 	   If we get no answer during retransmit period, drop the call anyway.
@@ -3976,6 +3977,7 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
 	if (!ast_strlen_zero(i->language))
 		ast_string_field_set(tmp, language, i->language);
 	i->owner = tmp;
+	ast_module_ref(ast_module_info->self);
 	ast_copy_string(tmp->context, i->context, sizeof(tmp->context));
 	ast_copy_string(tmp->exten, i->exten, sizeof(tmp->exten));
 
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c
index 350db45fec226fefb93a5a047aa790ea9c08d3b4..c07d361a4bbe881818deec4d978a1d01461fa8f0 100644
--- a/channels/chan_skinny.c
+++ b/channels/chan_skinny.c
@@ -2753,6 +2753,7 @@ static struct ast_channel *skinny_new(struct skinny_line *l, int state)
 		if (l->amaflags)
 			tmp->amaflags = l->amaflags;
 
+		ast_module_ref(ast_module_info->self);
 		tmp->callgroup = l->callgroup;
 		tmp->pickupgroup = l->pickupgroup;
 		ast_string_field_set(tmp, call_forward, l->call_forward);
diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index 57d5d2cf5c974f60039106d337f88a4b92f03c16..8c56208322b8b0f7df8868f0eef6a9919d5b9dfb 100644
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -2906,6 +2906,7 @@ static int zt_hangup(struct ast_channel *ast)
 	p->oprmode = 0;
 	ast->tech_pvt = NULL;
 	ast_mutex_unlock(&p->lock);
+	ast_module_unref(ast_module_info->self);
 	if (option_verbose > 2) 
 		ast_verbose( VERBOSE_PREFIX_3 "Hungup '%s'\n", ast->name);
 
@@ -5652,6 +5653,7 @@ static struct ast_channel *zt_new(struct zt_pvt *i, int state, int startpbx, int
 		}
 	}
 
+	ast_module_ref(ast_module_info->self);
 	return tmp;
 }