diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index e21d69b4fb69f8015065ac9d1587ed8ec8dfb4d6..6468f14c18b158465b294c369c3cba0763dde93b 100755
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -2653,10 +2653,12 @@ static struct ast_frame *zt_handle_event(struct ast_channel *ast)
 		case ZT_EVENT_ALARM:
 #ifdef ZAPATA_PRI
 #ifdef PRI_DESTROYCALL
-			if (p->call && p->pri && p->pri->pri)
-				pri_destroycall(p->pri->pri, p->call);
-			else
-				ast_log(LOG_WARNING, "The PRI Call have not been destroyed\n");
+			if (p->call) {
+				if (p->pri && p->pri->pri)
+					pri_destroycall(p->pri->pri, p->call);
+				else
+					ast_log(LOG_WARNING, "The PRI Call have not been destroyed\n");
+			}
 			p->call = NULL;
 #else
 #error Please "cvs update" and recompile libpri
@@ -5120,7 +5122,11 @@ static struct zt_pvt *mkintf(int channel, int signalling, int radio)
 					/* Hang it up to be sure it's good */
 					zt_set_hook(tmp->subs[SUB_REAL].zfd, ZT_ONHOOK);
 			}
-			tmp->inalarm = 0;
+			/* the dchannel is down so put the channel in alarm */
+			if (tmp->pri && tmp->pri->up == 0) {
+				tmp->inalarm = 1;
+			else
+				tmp->inalarm = 0;
 			memset(&si, 0, sizeof(si));
 			if (ioctl(tmp->subs[SUB_REAL].zfd,ZT_SPANSTAT,&si) == -1) {
 				ast_log(LOG_ERROR, "Unable to get span status: %s\n", strerror(errno));
@@ -5522,6 +5528,7 @@ static void *pri_dchannel(void *vpri)
 	struct ast_channel *idle;
 	pthread_t p;
 	time_t t;
+	int i;
 	gettimeofday(&lastidle, NULL);
 	if (strlen(pri->idledial) && strlen(pri->idleext)) {
 		/* Need to do idle dialing, check to be sure though */
@@ -5677,12 +5684,31 @@ static void *pri_dchannel(void *vpri)
 				pri->lastreset -= RESET_INTERVAL;
 				pri->lastreset += 5;
 				pri->resetting = 0;
+				/* Take the channels from inalarm condition */
+				for (i=0; i<=pri->channels; i++)
+					if (pri->pvt[i]) {
+						pri->pvt[i]->inalarm = 0;
+					}
 				break;
 			case PRI_EVENT_DCHAN_DOWN:
 				if (option_verbose > 1) 
 					ast_verbose(VERBOSE_PREFIX_2 "D-Channel on span %d down\n", pri->span);
 				pri->up = 0;
 				pri->resetting = 0;
+				/* Hangup active channels and put them in alarm mode */
+				for (i=0; i<=pri->channels; i++) {
+					struct zt_pvt *p = pri->pvt[i];
+					if (p) {
+						if (p->call) {
+							if (p->pri && p->pri->pri)
+								pri_destroycall(p->pri->pri, p->call);
+							else
+								ast_log(LOG_WARNING, "The PRI Call have not been destroyed on channel %s\n",p->owner->name);
+						}
+						p->call = NULL;
+						p->inalarm = 1;
+					}
+				}
 				break;
 			case PRI_EVENT_RESTART:
 				chan = e->restart.channel;
@@ -6149,7 +6175,7 @@ static int start_pri(struct zt_pri *pri)
 	if (p.sigtype != ZT_SIG_HDLCFCS) {
 		close(pri->fd);
 		pri->fd = -1;
-		ast_log(LOG_ERROR, "D-channel %x is not in HDLC/FCS mode.  See /etc/tormenta.conf\n", x);
+		ast_log(LOG_ERROR, "D-channel %d is not in HDLC/FCS mode.  See /etc/tormenta.conf\n", x);
 		return -1;
 	}
 	bi.txbufpolicy = ZT_POLICY_IMMEDIATE;