diff --git a/src/include/switch_ivr.h b/src/include/switch_ivr.h
index f0f75623ee..15f13bb07b 100644
--- a/src/include/switch_ivr.h
+++ b/src/include/switch_ivr.h
@@ -72,17 +72,15 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_callback(switch_core_s
   \param terminators digits to end the collection
   \param terminator actual digit that caused the collection to end (if any)
   \param timeout timeout in ms
-  \param poll_channel flag to specify if you want the function to poll the channel while running
   \return SWITCH_STATUS_SUCCESS to keep the collection moving.
 */
 SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_session_t *session,
-															  char *buf,
-															  unsigned int buflen,
-															  unsigned int maxdigits,
-															  const char *terminators,
-															  char *terminator,
-															  unsigned int timeout,
-                                                              unsigned int poll_channel);
+																char *buf,
+																unsigned int buflen,
+																unsigned int maxdigits,
+																const char *terminators,
+																char *terminator,
+																unsigned int timeout);
 	
 /*!
   \brief play a file from the disk to the session
diff --git a/src/include/switch_types.h b/src/include/switch_types.h
index 51b8bbd0ef..072812a13a 100644
--- a/src/include/switch_types.h
+++ b/src/include/switch_types.h
@@ -344,6 +344,7 @@ CF_ACCEPT_CNG	= (1 <<  5) - Channel will accept CNG frames
 CF_LOCK_THREAD	= (1 <<  6) - Prevent the channel thread from exiting while this flag is set
 CF_BRIDGED		= (1 <<  7) - Channel in a bridge
 CF_HOLD			= (1 <<  8) - Channel is on hold
+CF_SERVICE		= (1 <<  9) - Channel has a service thread
 </pre>
  */
 
@@ -356,7 +357,8 @@ typedef enum {
 	CF_ACCEPT_CNG	= (1 <<  5),
 	CF_LOCK_THREAD	= (1 <<  6),
 	CF_BRIDGED		= (1 <<  7),
-	CF_HOLD			= (1 <<  8)
+	CF_HOLD			= (1 <<  8),
+	CF_SERVICE		= (1 <<  9)
 } switch_channel_flag_t;
 
 
diff --git a/src/mod/applications/mod_ivrtest/mod_ivrtest.c b/src/mod/applications/mod_ivrtest/mod_ivrtest.c
index 9ad8971d3e..aad96294ac 100644
--- a/src/mod/applications/mod_ivrtest/mod_ivrtest.c
+++ b/src/mod/applications/mod_ivrtest/mod_ivrtest.c
@@ -183,7 +183,7 @@ static void ivrtest_function(switch_core_session_t *session, char *data)
 			}
 		}
 
-		if (switch_ivr_collect_digits_count(session, buf, sizeof(buf), 10, "#*", &term, 10000, 1) != SWITCH_STATUS_SUCCESS) {
+		if (switch_ivr_collect_digits_count(session, buf, sizeof(buf), 10, "#*", &term, 10000) != SWITCH_STATUS_SUCCESS) {
 			switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
 			break;
 		}
diff --git a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
index c0904cd7d8..be31afda52 100644
--- a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
+++ b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c
@@ -559,8 +559,6 @@ static JSBool session_get_digits(JSContext *cx, JSObject *obj, uintN argc, jsval
 	char *buf;
 	int digits;
 	int32 timeout = 5000;
-	int32 poll_chan = 1;
-	
 	
 	if (argc > 0) {
 		char term;
@@ -571,11 +569,9 @@ static JSBool session_get_digits(JSContext *cx, JSObject *obj, uintN argc, jsval
 		if (argc > 2) {
 			JS_ValueToInt32(cx, argv[2], &timeout);
 		}
-		if (argc > 3) {
-			JS_ValueToInt32(cx, argv[3], &poll_chan);
-		}
+
 		buf = switch_core_session_alloc(jss->session, digits);
-		switch_ivr_collect_digits_count(jss->session, buf, digits, digits, terminators, &term, timeout, poll_chan ? SWITCH_TRUE : SWITCH_FALSE);
+		switch_ivr_collect_digits_count(jss->session, buf, digits, digits, terminators, &term, timeout);
 		*rval = STRING_TO_JSVAL ( JS_NewStringCopyZ(cx, buf) );
 		return JS_TRUE;
 	}
diff --git a/src/switch_core.c b/src/switch_core.c
index 511245a748..d78c322eda 100644
--- a/src/switch_core.c
+++ b/src/switch_core.c
@@ -743,6 +743,7 @@ static void *switch_core_service_thread(switch_thread_t *thread, void *obj)
 	channel = switch_core_session_get_channel(session);
 	assert(channel != NULL);
 
+	switch_channel_set_flag(channel, CF_SERVICE);
 	while (data->running > 0) {
 		switch (switch_core_session_read_frame(session, &read_frame, -1, stream_id)) {
 		case SWITCH_STATUS_SUCCESS:
@@ -755,6 +756,7 @@ static void *switch_core_service_thread(switch_thread_t *thread, void *obj)
 		}
 	}
 
+	switch_channel_clear_flag(channel, CF_SERVICE);
 	data->running = 0;
 	return NULL;
 }
diff --git a/src/switch_ivr.c b/src/switch_ivr.c
index 902a441115..fa029fa88a 100644
--- a/src/switch_ivr.c
+++ b/src/switch_ivr.c
@@ -63,7 +63,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_callback(switch_core_s
 			break;
 		}
 
-		status = switch_core_session_read_frame(session, &read_frame, -1, 0);
+		if (switch_channel_test_flag(channel, CF_SERVICE)) {
+			switch_yield(1000);
+		} else {
+			status = switch_core_session_read_frame(session, &read_frame, -1, 0);
+		}
 
 		if (!SWITCH_READ_ACCEPTABLE(status)) {
 			break;
@@ -75,14 +79,12 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_callback(switch_core_s
 
 
 SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_session_t *session,
-															  char *buf,
-															  unsigned int buflen,
-															  unsigned int maxdigits,
-															  const char *terminators,
-															  char *terminator,
-															  unsigned int timeout,
-															  unsigned int poll_channel
-															  )
+																char *buf,
+																unsigned int buflen,
+																unsigned int maxdigits,
+																const char *terminators,
+																char *terminator,
+																unsigned int timeout)
 {
 	unsigned int i = 0, x =  (unsigned int) strlen(buf);
 	switch_channel_t *channel;
@@ -135,14 +137,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_sess
 				}
 			}
 		}
-		if (poll_channel) {
+
+		if (switch_channel_test_flag(channel, CF_SERVICE)) {
+			switch_yield(1000);
+		} else {
 			status = switch_core_session_read_frame(session, &read_frame, -1, 0);
-			
 			if (!SWITCH_READ_ACCEPTABLE(status)) {
 				break;
 			}
-		} else {
-			switch_yield(1000);
 		}
 	}