Index: apps/app_queue.c
===================================================================
--- apps/app_queue.c	(revision 199584)
+++ apps/app_queue.c	(arbetskopia)
@@ -947,6 +947,7 @@
 	int count;                          /*!< How many entries */
 	int maxlen;                         /*!< Max number of entries */
 	int wrapuptime;                     /*!< Wrapup Time */
+	int penaltymemberslimit;            /*!< Disregard penalty when queue has fewer than this many members */
 
 	int retry;                          /*!< Retry calling everyone after this amount of time */
 	int timeout;                        /*!< How long to wait for an answer */
@@ -1337,6 +1338,7 @@
 	q->monfmt[0] = '\0';
 	q->reportholdtime = 0;
 	q->wrapuptime = 0;
+	q->penaltymemberslimit = 0;
 	q->joinempty = 0;
 	q->leavewhenempty = 0;
 	q->memberdelay = 0;
@@ -1639,6 +1641,8 @@
 			q->retry = DEFAULT_RETRY;
 	} else if (!strcasecmp(param, "wrapuptime")) {
 		q->wrapuptime = atoi(val);
+	} else if (!strcasecmp(param, "penaltymemberslimit")) {
+		q->penaltymemberslimit = atoi(val);
 	} else if (!strcasecmp(param, "autofill")) {
 		q->autofill = ast_true(val);
 	} else if (!strcasecmp(param, "monitor-type")) {
@@ -3542,13 +3546,23 @@
  */
 static int calc_metric(struct call_queue *q, struct member *mem, int pos, struct queue_ent *qe, struct callattempt *tmp)
 {
-	if ((qe->max_penalty && (mem->penalty > qe->max_penalty)) || (qe->min_penalty && (mem->penalty < qe->min_penalty)))
-		return -1;
+	/* disregarding penalty on too few members? */
+	unsigned int usepenalty = (q->membercount <= q->penaltymemberslimit) ? 0 : 1;
 
+	if (usepenalty) {
+		if ((qe->max_penalty && (mem->penalty > qe->max_penalty)) ||
+			(qe->min_penalty && (mem->penalty < qe->min_penalty))) {
+			return -1;
+		}
+	} else {
+		ast_debug(1, "Disregarding penalty, %d members and %d in penaltymemberslimit.\n",
+			  q->membercount, q->penaltymemberslimit);
+	}
+		  
 	switch (q->strategy) {
 	case QUEUE_STRATEGY_RINGALL:
 		/* Everyone equal, except for penalty */
-		tmp->metric = mem->penalty * 1000000;
+		tmp->metric = mem->penalty * 1000000 * usepenalty;
 		break;
 	case QUEUE_STRATEGY_LINEAR:
 		if (pos < qe->linpos) {
@@ -3559,7 +3573,7 @@
 				qe->linwrapped = 1;
 			tmp->metric = pos;
 		}
-		tmp->metric += mem->penalty * 1000000;
+		tmp->metric += mem->penalty * 1000000 * usepenalty;
 		break;
 	case QUEUE_STRATEGY_RRMEMORY:
 		if (pos < q->rrpos) {
@@ -3570,25 +3584,25 @@
 				q->wrapped = 1;
 			tmp->metric = pos;
 		}
-		tmp->metric += mem->penalty * 1000000;
+		tmp->metric += mem->penalty * 1000000 * usepenalty;
 		break;
 	case QUEUE_STRATEGY_RANDOM:
 		tmp->metric = ast_random() % 1000;
-		tmp->metric += mem->penalty * 1000000;
+		tmp->metric += mem->penalty * 1000000 * usepenalty;
 		break;
 	case QUEUE_STRATEGY_WRANDOM:
 		tmp->metric = ast_random() % ((1 + mem->penalty) * 1000);
 		break;
 	case QUEUE_STRATEGY_FEWESTCALLS:
 		tmp->metric = mem->calls;
-		tmp->metric += mem->penalty * 1000000;
+		tmp->metric += mem->penalty * 1000000 * usepenalty;
 		break;
 	case QUEUE_STRATEGY_LEASTRECENT:
 		if (!mem->lastcall)
 			tmp->metric = 0;
 		else
 			tmp->metric = 1000000 - (time(NULL) - mem->lastcall);
-		tmp->metric += mem->penalty * 1000000;
+		tmp->metric += mem->penalty * 1000000 * usepenalty;
 		break;
 	default:
 		ast_log(LOG_WARNING, "Can't calculate metric for unknown strategy %d\n", q->strategy);
Index: configs/queues.conf.sample
===================================================================
--- configs/queues.conf.sample	(revision 199584)
+++ configs/queues.conf.sample	(arbetskopia)
@@ -117,6 +117,12 @@
 ;
 ;context = qoutcon
 ;
+; A limit can be set to disregard penalty settings when the queue has
+; too few members.  No penalty will be weighed in if there are only X
+; or fewer queue members. (default 0)
+;
+;penaltymemberslimit = 5
+;
 ;----------------------QUEUE TIMING OPTIONS------------------------------------
 ; A Queue has two different "timeout" values associated with it. One is the
 ; timeout parameter configured in queues.conf. This timeout specifies the
