Index: apps/app_dial.c =================================================================== --- apps/app_dial.c (revision 97698) +++ apps/app_dial.c (working copy) @@ -691,6 +691,8 @@ break; case AST_CONTROL_RINGING: ast_verb(3, "%s is ringing\n", c->name); + /* call is ringing, eventual hangup in this state is likely to be a NO ANSWER */ + winner->hangupcause = AST_CAUSE_NO_ANSWER; /* Setup early media if appropriate */ if (single && CAN_EARLY_BRIDGE(peerflags)) ast_channel_early_bridge(in, c); Index: main/channel.c =================================================================== --- main/channel.c (revision 97698) +++ main/channel.c (working copy) @@ -3028,6 +3028,7 @@ int cause = 0; struct ast_channel *chan; int res = 0; + int last_subclass = 0; if (outstate) *outstate = 0; @@ -3111,6 +3112,7 @@ default: ast_log(LOG_NOTICE, "Don't know what to do with control frame %d\n", f->subclass); } + last_subclass = f->subclass; } ast_frfree(f); } @@ -3129,6 +3131,8 @@ *outstate = AST_CONTROL_ANSWER; if (res <= 0) { + if ( AST_CONTROL_RINGING == last_subclass ) + chan->hangupcause = AST_CAUSE_NO_ANSWER; if (!chan->cdr && (chan->cdr = ast_cdr_alloc())) ast_cdr_init(chan->cdr, chan); if (chan->cdr) {