diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index dd7d9b49dac18564e7cfd491f8e1726c0c20ca30..2b6a664acbcee9a8daeb97dea943a535616a2198 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -4232,6 +4232,17 @@ static void dahdi_handle_dtmfup(struct ast_channel *ast, int index, struct ast_f
 	}
 }
 			
+static void handle_alarms(struct dahdi_pvt *p, int alarms)
+{
+	const char *alarm_str = alarm2str(alarms);
+
+	ast_log(LOG_WARNING, "Detected alarm on channel %d: %s\n", p->channel, alarm_str);
+	manager_event(EVENT_FLAG_SYSTEM, "Alarm",
+		      "Alarm: %s\r\n"
+		      "Channel: %d\r\n",
+		      alarm_str, p->channel);
+}
+
 static struct ast_frame *dahdi_handle_event(struct ast_channel *ast)
 {
 	int res, x;
@@ -4381,11 +4392,7 @@ static struct ast_frame *dahdi_handle_event(struct ast_channel *ast)
 #endif
 			p->inalarm = 1;
 			res = get_alarms(p);
-			ast_log(LOG_WARNING, "Detected alarm on channel %d: %s\n", p->channel, alarm2str(res));
-			manager_event(EVENT_FLAG_SYSTEM, "Alarm",
-								"Alarm: %s\r\n"
-								"Channel: %d\r\n",
-								alarm2str(res), p->channel);
+			handle_alarms(p, res);
 #ifdef HAVE_PRI
 			if (!p->pri || !p->pri->pri || pri_get_timer(p->pri->pri, PRI_TIMER_T309) < 0) {
 				/* fall through intentionally */
@@ -7344,11 +7351,7 @@ static void *mwi_thread(void *data)
 			case DAHDI_EVENT_ALARM:
 				mtd->pvt->inalarm = 1;
 				res = get_alarms(mtd->pvt);
-				ast_log(LOG_WARNING, "Detected alarm on channel %d: %s\n", mtd->pvt->channel, alarm2str(res));
-				manager_event(EVENT_FLAG_SYSTEM, "Alarm",
-					"Alarm: %s\r\n"
-					"Channel: %d\r\n",
-					alarm2str(res), mtd->pvt->channel);
+				handle_alarms(mtd->pvt, res);
 				break; /* What to do on channel alarm ???? -- fall thru intentionally?? */
 			default:
 				ast_log(LOG_NOTICE, "Got event %d (%s)...  Passing along to ss_thread\n", res, event2str(res));
@@ -7724,11 +7727,7 @@ static int handle_init_event(struct dahdi_pvt *i, int event)
 	case DAHDI_EVENT_ALARM:
 		i->inalarm = 1;
 		res = get_alarms(i);
-		ast_log(LOG_WARNING, "Detected alarm on channel %d: %s\n", i->channel, alarm2str(res));
-		manager_event(EVENT_FLAG_SYSTEM, "Alarm",
-			"Alarm: %s\r\n"
-			"Channel: %d\r\n",
-			alarm2str(res), i->channel);
+		handle_alarms(i, res);
 		/* fall thru intentionally */
 	case DAHDI_EVENT_ONHOOK:
 		if (i->radio)
@@ -8714,16 +8713,11 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
 			/* the dchannel is down so put the channel in alarm */
 			if (tmp->pri && !pri_is_up(tmp->pri))
 				tmp->inalarm = 1;
-			else
-				tmp->inalarm = 0;
 #endif				
-			memset(&si, 0, sizeof(si));
-			if (ioctl(tmp->subs[SUB_REAL].zfd,DAHDI_SPANSTAT,&si) == -1) {
-				ast_log(LOG_ERROR, "Unable to get span status: %s\n", strerror(errno));
-				destroy_dahdi_pvt(&tmp);
-				return NULL;
+			if ((res = get_alarms(tmp)) != DAHDI_ALARM_NONE) {
+				tmp->inalarm = 1;
+				handle_alarms(tmp, res);
 			}
-			if (si.alarms) tmp->inalarm = 1;
 		}
 
 		tmp->polarityonanswerdelay = conf->chan.polarityonanswerdelay;