I have the necessity to hangup a channel inside a media bug callback in a my custom module. Currently, what I do is: static switch_bool_t my_media_callback(switch_media_bug_t *bug, void *user_data, switch_abc_type_t type) { struct my_custom_helper * my_helper = (struct my_custom_helper *) user_data; switch (type) { case SWITCH_ABC_TYPE_READ_REPLACE: case SWITCH_ABC_TYPE_WRITE_REPLACE: { switch_frame_t *frame; if (sth->read) { frame = switch_core_media_bug_get_read_replace_frame(bug); } else { frame = switch_core_media_bug_get_write_replace_frame(bug); } /* .... media analysis .... */ if (to_hangup) { switch_channel_t *channel = switch_core_session_get_channel(my_helper->session); if (channel) { switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); } } } return SWITCH_TRUE; } The dropped channel is a b-leg, previously bridged with an a-leg (incoming call). Probably in my code there is an error because the code works fine and the channel is correctly dropped but inside Freeswitch remain some "zombies" calls. If I issue a fs_cli "show channels" I see that there are some calls dropped by my module showed in "ACTIVE" state. What is wrong with my channel hangup? Thanks in advance Stephen