--- apps/app_queue.c	2010-08-11 10:03:58.000000000 +0200
+++ apps/app_queue.c	2010-08-11 10:10:40.000000000 +0200
@@ -181,6 +181,7 @@
 "      'W' -- allow the calling user to write the conversation to disk via Monitor\n"
 "             by pressing the automon sequence defined in the featuremap section in\n"
 "             features.conf\n"
+"      'R' -- Ring instead of playing MOH when a member channel is actually ringing.\n"
 "  In addition to transferring the call, a call may be parked and then picked\n"
 "up by another user, by transferring to the parking lot extension. See features.conf.\n"
 "  The optional URL will be sent to the called party if the channel supports\n"
@@ -347,6 +348,7 @@
 	char announce[80];                  /*!< Announcement to play for member when call is answered */
 	char context[AST_MAX_CONTEXT];      /*!< Context when user exits queue */
 	char digits[AST_MAX_EXTENSION];     /*!< Digits entered while in queue */
+	int ring_when_ringing;              /*!< Should we only use ring indication when a channel is ringing? */
 	int valid_digits;		    /*!< Digits entered correspond to valid extension. Exited */
 	int pos;                            /*!< Where we are in the queue */
 	int prio;                           /*!< Our priority */
@@ -2243,6 +2245,12 @@
 {
 	if (option_verbose > 2)
 		ast_verbose( VERBOSE_PREFIX_3 "Nobody picked up in %d ms\n", rnatime);
+	/* Stop ringing, and resume MOH if specified */
+        if (qe->ring_when_ringing) {
+                ast_indicate(qe->chan, -1);
+                ast_moh_start(qe->chan, qe->moh, NULL);
+        }
+
 	ast_queue_log(qe->parent->name, qe->chan->uniqueid, membername, "RINGNOANSWER", "%d", rnatime);
 	if (qe->parent->autopause && pause) {
 		if (!set_member_paused(qe->parent->name, interface, 1)) {
@@ -2448,6 +2456,12 @@
 						case AST_CONTROL_RINGING:
 							if (option_verbose > 2)
 								ast_verbose( VERBOSE_PREFIX_3 "%s is ringing\n", o->chan->name);
+							/* Start ring indication when the channel is ringing, if specified */
+                                                       if (qe->ring_when_ringing) {
+                                                               ast_moh_stop(qe->chan);
+                                                               ast_indicate(qe->chan, AST_CONTROL_RINGING);
+                                                       }
+
 							break;
 						case AST_CONTROL_OFFHOOK:
 							/* Ignore going off hook */
@@ -4154,6 +4168,12 @@
 	if (args.options && (strchr(args.options, 'r')))
 		ringing = 1;
 
+        if (ringing != 1 && args.options && (strchr(args.options, 'R'))) {
+               qe.ring_when_ringing = 1;
+        } else {
+               qe.ring_when_ringing = 0;
+        }
+
 	if (option_debug)
 		ast_log(LOG_DEBUG, "queue: %s, options: %s, url: %s, announce: %s, expires: %ld, priority: %d\n",
 			args.queuename, args.options, args.url, args.announceoverride, (long)qe.expire, prio);
