diff --git a/addons/chan_ooh323.c b/addons/chan_ooh323.c
index a795c9f1d7bf91bb67beb7aa22e4090c7edaf893..5c2131c93d712b6df77a23de4123fcd3c2876b05 100644
--- a/addons/chan_ooh323.c
+++ b/addons/chan_ooh323.c
@@ -1044,6 +1044,7 @@ static int ooh323_hangup(struct ast_channel *ast)
 static int ooh323_answer(struct ast_channel *ast)
 {
 	struct ooh323_pvt *p = ast->tech_pvt;
+	char *callToken = (char *)NULL;
 
 	if (gH323Debug)
 		ast_verbose("--- ooh323_answer\n");
@@ -1051,8 +1052,18 @@ static int ooh323_answer(struct ast_channel *ast)
 	if (p) {
 
 		ast_mutex_lock(&p->lock);
+		callToken = (p->callToken ? strdup(p->callToken) : NULL);
 		if (ast->_state != AST_STATE_UP) {
 			ast_channel_lock(ast);
+			if (!p->alertsent) {
+	    			if (gH323Debug) {
+					ast_debug(1, "Sending forced ringback for %s, res = %d\n", 
+						callToken, ooManualRingback(callToken));
+				} else {
+	    				ooManualRingback(callToken);
+				}
+				p->alertsent = 1;
+			}
 			ast_setstate(ast, AST_STATE_UP);
       			if (option_debug)
 				ast_debug(1, "ooh323_answer(%s)\n", ast->name);
@@ -1220,6 +1231,7 @@ static int ooh323_indicate(struct ast_channel *ast, int condition, const void *d
 				}
 				p->alertsent = 1;
 			}
+			p->alertsent = 1;
 		}
 	 break;
 	case AST_CONTROL_SRCUPDATE:
diff --git a/addons/ooh323c/src/oochannels.c b/addons/ooh323c/src/oochannels.c
index 891a12d17998ffcaab0d7dd0fb8ae41f745c5413..e3ac30fbb92844ef8891f36f2c0f081019c9364c 100644
--- a/addons/ooh323c/src/oochannels.c
+++ b/addons/ooh323c/src/oochannels.c
@@ -682,10 +682,11 @@ int ooProcessCallFDSETsAndTimers
 
     if (0 != call->pH245Channel && 0 != call->pH245Channel->sock)
     {
-     if(call->pH245Channel->outQueue.count>0)
-     {                           
-      if(ooPDWrite(pfds, nfds, call->pH245Channel->sock))
-       ooSendMsg(call, OOH245MSG);
+     if(ooPDWrite(pfds, nfds, call->pH245Channel->sock)) {
+      while (call->pH245Channel->outQueue.count>0) {
+       if (ooSendMsg(call, OOH245MSG) != OO_OK)
+	break;
+      }
      }
     }
     else if(call->h245listener)
@@ -702,20 +703,23 @@ int ooProcessCallFDSETsAndTimers
     {
      if(ooPDWrite(pfds, nfds, call->pH225Channel->sock))
      {
-      if(call->pH225Channel->outQueue.count>0)
+      while (call->pH225Channel->outQueue.count>0)
       {
        OOTRACEDBGC3("Sending H225 message (%s, %s)\n", 
                         call->callType, call->callToken);
-       ooSendMsg(call, OOQ931MSG);
+       if (ooSendMsg(call, OOQ931MSG) != OO_OK)
+	break;
       }
       if(call->pH245Channel && 
          call->pH245Channel->outQueue.count>0 && 
-        OO_TESTFLAG (call->flags, OO_M_TUNNELING))
-      {
+        OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
+       while (call->pH245Channel->outQueue.count>0) {
         OOTRACEDBGC3("H245 message needs to be tunneled. "
                           "(%s, %s)\n", call->callType, 
                                call->callToken);
-        ooSendMsg(call, OOH245MSG);
+        if (ooSendMsg(call, OOH245MSG) != OO_OK)
+	 break;
+       }
       }
      }                                
     }
@@ -1330,7 +1334,7 @@ int ooSendMsg(OOH323CallData *call, int type)
    {
       OOTRACEDBGA3("Warning:Call marked for cleanup. Can not send message."
                    "(%s, %s)\n", call->callType, call->callToken);
-      return OO_OK;
+      return OO_FAILED;
    }
 
    if(type == OOQ931MSG)
diff --git a/addons/ooh323c/src/ooh245.c b/addons/ooh323c/src/ooh245.c
index 940b8d838c7be4dbf276dd13002aaf1c8c2ffaec..efb0c21f22f1a1504a0bde54db901f94fecf2d85 100644
--- a/addons/ooh323c/src/ooh245.c
+++ b/addons/ooh323c/src/ooh245.c
@@ -2126,6 +2126,8 @@ int ooHandleH245Command(OOH323CallData *call,
                ooClearAllLogicalChannels(call);
             }
             ooSendEndSessionCommand(call);
+	    if (call->callState < OO_CALL_CLEAR)
+	        call->callState = OO_CALL_CLEAR;
          }