diff --git a/libs/freetdm/mod_openzap/mod_openzap.c b/libs/freetdm/mod_openzap/mod_openzap.c
index ef755a4772..0b07afbe2c 100644
--- a/libs/freetdm/mod_openzap/mod_openzap.c
+++ b/libs/freetdm/mod_openzap/mod_openzap.c
@@ -555,16 +555,24 @@ static switch_status_t channel_receive_message_b(switch_core_session_t *session,
 	
 	switch (msg->message_id) {
 	case SWITCH_MESSAGE_INDICATE_RINGING:
-		if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
-			zap_set_state_locked(tech_pvt->zchan, ZAP_CHANNEL_STATE_PROGRESS);
+		{
+			if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
+				zap_set_state_locked(tech_pvt->zchan, ZAP_CHANNEL_STATE_PROGRESS);
+			}
 		}
+		break;
 	case SWITCH_MESSAGE_INDICATE_PROGRESS:
-		if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
-			zap_set_state_locked(tech_pvt->zchan, ZAP_CHANNEL_STATE_EARLY_MEDIA);
+		{
+			if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
+				zap_set_state_locked(tech_pvt->zchan, ZAP_CHANNEL_STATE_PROGRESS_MEDIA);
+			}
 		}
+		break;
 	case SWITCH_MESSAGE_INDICATE_ANSWER:
-		if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
-			zap_set_state_locked(tech_pvt->zchan, ZAP_CHANNEL_STATE_UP);
+		{
+			if (!switch_channel_test_flag(channel, CF_OUTBOUND)) {
+				zap_set_state_locked(tech_pvt->zchan, ZAP_CHANNEL_STATE_UP);
+			}
 		}
 		break;
 	default:
@@ -877,7 +885,7 @@ static ZIO_SIGNAL_CB_FUNCTION(on_fxo_signal)
 	switch_channel_t *channel = NULL;
 	zap_status_t status;
 
-	zap_log(ZAP_LOG_DEBUG, "got fxo sig [%s]\n", zap_signal_event2str(sigmsg->event_id));
+	zap_log(ZAP_LOG_DEBUG, "got FXO sig [%s]\n", zap_signal_event2str(sigmsg->event_id));
 
     switch(sigmsg->event_id) {
     case ZAP_SIGEVENT_UP:
@@ -909,7 +917,7 @@ static ZIO_SIGNAL_CB_FUNCTION(on_fxs_signal)
 	private_t *tech_pvt = NULL;
 	zap_status_t status = ZAP_SUCCESS;
 
-    zap_log(ZAP_LOG_DEBUG, "got fxs sig [%s]\n", zap_signal_event2str(sigmsg->event_id));
+    zap_log(ZAP_LOG_DEBUG, "got FXS sig [%s]\n", zap_signal_event2str(sigmsg->event_id));
 
     switch(sigmsg->event_id) {
     case ZAP_SIGEVENT_UP:
diff --git a/libs/freetdm/src/include/zap_types.h b/libs/freetdm/src/include/zap_types.h
index 900c29c9b5..613e1f6e98 100644
--- a/libs/freetdm/src/include/zap_types.h
+++ b/libs/freetdm/src/include/zap_types.h
@@ -263,13 +263,13 @@ typedef enum {
 	ZAP_CHANNEL_STATE_CALLWAITING,
 	ZAP_CHANNEL_STATE_TERMINATING,
 	ZAP_CHANNEL_STATE_RESTART,
-	ZAP_CHANNEL_STATE_EARLY_MEDIA,
+	ZAP_CHANNEL_STATE_PROGRESS_MEDIA,
 	ZAP_CHANNEL_STATE_PROGRESS,
 	ZAP_CHANNEL_STATE_INVALID
 } zap_channel_state_t;
 #define CHANNEL_STATE_STRINGS "DOWN", "UP", "HANGUP", "HOLD", "DIALTONE", "COLLECT", \
 		"RING", "BUSY", "ATTN", "IDLE", "GENRING", "DIALING", "GET_CALLERID", "CALLWAITING", \
-		"TERMINATING", "RESTART", "EARLY_MEDIA", "PROGRESS", "INVALID"
+		"TERMINATING", "RESTART", "PROGRESS_MEDIA", "PROGRESS", "INVALID"
 ZAP_STR2ENUM_P(zap_str2zap_channel_state, zap_channel_state2str, zap_channel_state_t)
 
 typedef enum {
diff --git a/libs/freetdm/src/zap_io.c b/libs/freetdm/src/zap_io.c
index d5b525bcdd..2ba9f8e2fc 100644
--- a/libs/freetdm/src/zap_io.c
+++ b/libs/freetdm/src/zap_io.c
@@ -516,6 +516,18 @@ zap_status_t zap_channel_set_state(zap_channel_t *zchan, zap_channel_state_t sta
 	}
 
 	switch(zchan->state) {
+	case ZAP_CHANNEL_STATE_UP:
+		{
+			switch(state) {
+			case ZAP_CHANNEL_STATE_PROGRESS:
+			case ZAP_CHANNEL_STATE_PROGRESS_MEDIA:
+				ok = 0;
+				break;
+			default:
+				break;
+			}
+		}
+		break;
 	case ZAP_CHANNEL_STATE_DOWN:
 		{
 			switch(state) {
@@ -528,6 +540,7 @@ zap_status_t zap_channel_set_state(zap_channel_t *zchan, zap_channel_state_t sta
 				break;
 			}
 		}
+		break;
 	case ZAP_CHANNEL_STATE_BUSY:
 		{
 			switch(state) {
@@ -538,6 +551,7 @@ zap_status_t zap_channel_set_state(zap_channel_t *zchan, zap_channel_state_t sta
 				break;
 			}
 		}
+		break;
 	default:
 		break;
 	}
@@ -771,8 +785,10 @@ zap_status_t zap_channel_done(zap_channel_t *zchan)
 	assert(zchan != NULL);
 
 	memset(&zchan->caller_data, 0, sizeof(zchan->caller_data));
+
 	zap_clear_flag_locked(zchan, ZAP_CHANNEL_INUSE);
 	zap_clear_flag_locked(zchan, ZAP_CHANNEL_OUTBOUND);
+
 	for (i = 0; i < 2; i++) {
 		if (zchan->fds[i] > -1) {
 			close(zchan->fds[i]);
diff --git a/libs/freetdm/src/zap_isdn.c b/libs/freetdm/src/zap_isdn.c
index ec42c2e43f..dd870087d1 100644
--- a/libs/freetdm/src/zap_isdn.c
+++ b/libs/freetdm/src/zap_isdn.c
@@ -110,7 +110,7 @@ static L3INT zap_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
 		break;
 	case Q931mes_ALERTING:
 		{
-			zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_EARLY_MEDIA);
+			zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_PROGRESS_MEDIA);
 		}
 		break;
 	case Q931mes_PROGRESS:
@@ -248,7 +248,7 @@ static __inline__ void state_advance(zap_channel_t *zchan)
 			zap_channel_close(&zchan);
 		}
 		break;
-	case ZAP_CHANNEL_STATE_EARLY_MEDIA:
+	case ZAP_CHANNEL_STATE_PROGRESS_MEDIA:
 		{
 			if (zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
 				sig.event_id = ZAP_SIGEVENT_PROGRESS_MEDIA;