diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index 889f71ca5507ab41b74265cbbe2a846b820a7adc..1c1e9583851d5844eee9f158902acf7050c4e70c 100755
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -5615,7 +5615,13 @@ static void *pri_dchannel(void *vpri)
 					}
 					/* Get called number */
 					else if (strlen(e->ring.callednum)) {
-						strncpy(pri->pvt[chan]->exten, e->ring.callednum, sizeof(pri->pvt[chan]->exten)-1);
+#ifndef PRI_COPY_DIGITS_CALLED_NUMBER
+#error Please update the libpri package
+#endif
+						if (e->e==PRI_EVENT_RING)
+							strncpy(pri->pvt[chan]->exten, e->ring.callednum, sizeof(pri->pvt[chan]->exten)-1);
+						else
+							strncat(pri->pvt[chan]->exten, e->ring.callednum, sizeof(pri->pvt[chan]->exten)-1);
 					} 
 #if 0
 					else
@@ -5626,12 +5632,20 @@ static void *pri_dchannel(void *vpri)
 					/* queue DTMF frame if the PBX for this call was already started (we're forwarding INFORMATION further on */
 					if (pri->overlapdial && pri->pvt[chan]->call==e->ring.call && pri->pvt[chan]->owner) {
 						/* how to do that */
-						char digit = e->ring.callednum[strlen(e->ring.callednum)-1];
-						struct ast_frame f = { AST_FRAME_DTMF, digit, };
+						int digitlen = strlen(e->ring.callednum);
+						char digit;
+						int i;
 						/* make sure that we store the right number in CDR */
 						if (pri->pvt[chan]->owner->cdr)
-							strncat(pri->pvt[chan]->owner->cdr->dst,&digit,1);
-						ast_queue_frame(pri->pvt[chan]->owner, &f, 0);
+							strncat(pri->pvt[chan]->owner->cdr->dst,e->ring.callednum,digitlen);
+					
+						for (i=0; i<digitlen; i++) {	
+							digit = e->ring.callednum[i];
+							{
+								struct ast_frame f = { AST_FRAME_DTMF, digit, };
+								ast_queue_frame(pri->pvt[chan]->owner, &f, 0);
+							}
+						}
 					}
 					/* Make sure extension exists */
 					/* If extensions is empty then make sure we send later on SETUP_ACKNOWLEDGE to get digits in overlap mode */