diff --git a/channels/chan_phone.c b/channels/chan_phone.c
index 668db2fb3f7edcfafed7e8dded240acbcc7d07ed..0e1548cc313fc2aa99e1a55a0c5d5f5258084949 100644
--- a/channels/chan_phone.c
+++ b/channels/chan_phone.c
@@ -128,8 +128,9 @@ static int restart_monitor(void);
    
 #define MODE_DIALTONE 	1
 #define MODE_IMMEDIATE	2
-#define MODE_FXO		3
+#define MODE_FXO	3
 #define MODE_FXS        4
+#define MODE_SIGMA      5
 
 static struct phone_pvt {
 	int fd;							/* Raw file descriptor for this device */
@@ -915,7 +916,7 @@ static void phone_check_exception(struct phone_pvt *i)
 	phonee.bytes = ioctl(i->fd, PHONE_EXCEPTION);
 	if (phonee.bits.dtmf_ready)  {
 		digit[0] = ioctl(i->fd, PHONE_GET_DTMF_ASCII);
-		if (i->mode == MODE_DIALTONE || i->mode == MODE_FXS) {
+		if (i->mode == MODE_DIALTONE || i->mode == MODE_FXS || i->mode == MODE_SIGMA) {
 			ioctl(i->fd, PHONE_PLAY_STOP);
 			ioctl(i->fd, PHONE_REC_STOP);
 			ioctl(i->fd, PHONE_CPT_STOP);
@@ -967,6 +968,16 @@ static void phone_check_exception(struct phone_pvt *i)
 				ioctl(i->fd, PHONE_PLAY_CODEC, ULAW);
 				ioctl(i->fd, PHONE_PLAY_START);
 				i->lastformat = -1;
+			} else if (i->mode == MODE_SIGMA) {
+				ast_mutex_lock(&usecnt_lock);
+				usecnt++;
+				ast_mutex_unlock(&usecnt_lock);
+				ast_update_use_count();
+				/* Reset the extension */
+				i->ext[0] = '\0';
+				/* Play the dialtone */
+				i->dialtone++;
+				ioctl(i->fd, PHONE_DIALTONE);
 			}
 		} else {
 			if (i->dialtone) {
@@ -1032,7 +1043,7 @@ static void *do_monitor(void *data)
 				FD_SET(i->fd, &efds);
 				if (i->fd > n)
 					n = i->fd;
-				if (i->dialtone) {
+				if (i->dialtone && i->mode != MODE_SIGMA) {
 					/* Remember we're going to have to come back and play
 					   more dialtones */
 					if (ast_tvzero(tv)) {
@@ -1050,7 +1061,7 @@ static void *do_monitor(void *data)
 		ast_mutex_unlock(&iflock);
 
 		/* Wait indefinitely for something to happen */
-		if (dotone) {
+		if (dotone && i->mode != MODE_SIGMA) {
 			/* If we're ready to recycle the time, set it to 30 ms */
 			tonepos += 240;
 			if (tonepos >= sizeof(DialTone))
@@ -1366,6 +1377,8 @@ static int load_module(void *mod)
 		} else if (!strcasecmp(v->name, "mode")) {
 			if (!strncasecmp(v->value, "di", 2)) 
 				mode = MODE_DIALTONE;
+			else if (!strncasecmp(v->value, "sig", 3))
+				mode = MODE_SIGMA;
 			else if (!strncasecmp(v->value, "im", 2))
 				mode = MODE_IMMEDIATE;
 			else if (!strncasecmp(v->value, "fxs", 3)) {
diff --git a/configs/phone.conf.sample b/configs/phone.conf.sample
index ca028f9a1b47d79b2dd6baa82c8680327eac53db..82909f2e69d6a3866bad83474954190ef435e9d3 100644
--- a/configs/phone.conf.sample
+++ b/configs/phone.conf.sample
@@ -10,11 +10,13 @@
 ; immediately provides the PBX without reading any digits or providing 
 ; any dialtone (this is the immediate mode, the default).  Also, you
 ; can set the mode to "fxo" if you have a linejack to make it operate
-; properly.
+; properly. If you are using a Sigma Designs board you may set this to
+; "sig".
 ;
 mode=immediate
 ;mode=dialtone
 ;mode=fxo
+;mode=sig
 ;
 ; You can decide which format to use by default, "g723.1" or "slinear".
 ; XXX Be careful, sometimes the card causes kernel panics when running