diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index 1890bbb3d7da3cb7f66f9fa96d64d9d2ecd339d4..9bfddae2f7c1339dbb4f916d07a3123a085fc1c9 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -10999,7 +10999,7 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
 				analog_p->polarityonanswerdelay = conf->chan.polarityonanswerdelay;
 				analog_p->answeronpolarityswitch = conf->chan.answeronpolarityswitch;
 				analog_p->hanguponpolarityswitch = conf->chan.hanguponpolarityswitch;
-				analog_p->permcallwaiting = 1;
+				analog_p->permcallwaiting = conf->chan.callwaiting; /* permcallwaiting possibly modified in analog_config_complete */
 				analog_p->callreturn = conf->chan.callreturn;
 				analog_p->cancallforward = conf->chan.cancallforward;
 				analog_p->canpark = conf->chan.canpark;
@@ -11016,7 +11016,7 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
 				analog_p->cid_signalling = conf->chan.cid_signalling;
 				analog_p->stripmsd = conf->chan.stripmsd;
 				analog_p->cid_start = ANALOG_CID_START_RING;
-				tmp->callwaitingcallerid = analog_p->callwaitingcallerid = 1;
+				analog_p->callwaitingcallerid = conf->chan.callwaitingcallerid;
 				analog_p->usedistinctiveringdetection = conf->chan.usedistinctiveringdetection;
 				analog_p->ringt = conf->chan.ringt;
 				analog_p->ringt_base = ringt_base;
@@ -11322,12 +11322,6 @@ static struct ast_channel *dahdi_request(const char *type, int format, const str
 					break;
 				}
 			}
-			if (p->owner) {
-				if (alloc_sub(p, SUB_CALLWAIT)) {
-					p = NULL;
-					break;
-				}
-			}
 			p->outgoing = 1;
 			if (analog_lib_handles(p->sig, p->radio, p->oprmode)) {
 				tmp = analog_request(p->sig_pvt, &callwait, requestor);
diff --git a/channels/sig_analog.c b/channels/sig_analog.c
index 3488c7f558643d8e64af7ff1bfb0ee25b4e398c6..49b9c6bd598f3e5e12fb0ba98feda87242ca7e61 100644
--- a/channels/sig_analog.c
+++ b/channels/sig_analog.c
@@ -289,9 +289,13 @@ static void analog_swap_subs(struct analog_pvt *p, enum analog_sub a, enum analo
 
 static int analog_alloc_sub(struct analog_pvt *p, enum analog_sub x)
 {
-	p->subs[x].allocd = 1;
-	if (p->calls->allocate_sub)
-		return p->calls->allocate_sub(p->chan_pvt, x);
+	if (p->calls->allocate_sub) {
+		int res;
+		res = p->calls->allocate_sub(p->chan_pvt, x);
+		if (!res)
+			p->subs[x].allocd = 1;
+		return res;
+	}
 
 	return 0;
 }