diff --git a/configs/features.conf.sample b/configs/features.conf.sample
index b5d8399b079cce056f461f6227cc853129eeb940..688814d09d2b0c36a33b3c121fea542686273982 100755
--- a/configs/features.conf.sample
+++ b/configs/features.conf.sample
@@ -14,6 +14,7 @@ context => parkedcalls		; Which context parked calls are in
 ;xfersound = beep		; to indicate an attended transfer is complete
 ;xferfailsound = beeperr	; to indicate a failed transfer
 ;adsipark = yes			; if you want ADSI parking announcements
+;findslot => next		; Continue to the 'next' parking space. Defaults to 'first' available
 ;pickupexten = *8		; Configure the pickup extension.  Default is *8
 ;featuredigittimeout = 500	; Max time (ms) between digits for 
 				; feature activation.  Default is 500
diff --git a/res/res_features.c b/res/res_features.c
index 6f404ca252fd6279131e5987c80d5060d5198815..99874a8b4ebb6772371effff338fd5f192e533c2 100755
--- a/res/res_features.c
+++ b/res/res_features.c
@@ -70,6 +70,10 @@ static int parking_start = 701;
 /* Last available extension for parking */
 static int parking_stop = 750;
 
+static int parking_offset = 0;
+
+static int parkfindnext = 0;
+
 static int adsipark = 0;
 
 static int transferdigittimeout = DEFAULT_TRANSFER_DIGIT_TIMEOUT;
@@ -240,14 +244,16 @@ int ast_park_call(struct ast_channel *chan, struct ast_channel *peer, int timeou
 	/* We put the user in the parking list, then wake up the parking thread to be sure it looks
 	   after these channels too */
 	struct parkeduser *pu, *cur;
-	int x;
+	int i,x,parking_range;
 	char exten[AST_MAX_EXTENSION];
 	struct ast_context *con;
 	pu = malloc(sizeof(struct parkeduser));
 	if (pu) {
 		memset(pu,0,sizeof(struct parkeduser));
 		ast_mutex_lock(&parking_lock);
-		for (x=parking_start;x<=parking_stop;x++) {
+		parking_range=parking_stop-parking_start+1;
+		for (i=0;i<parking_range;i++) {
+			x=(i+parking_offset)%parking_range + parking_start;
 			cur = parkinglot;
 			while(cur) {
 				if (cur->parkingnum == x) 
@@ -257,7 +263,9 @@ int ast_park_call(struct ast_channel *chan, struct ast_channel *peer, int timeou
 			if (!cur)
 				break;
 		}
-		if (x <= parking_stop) {
+
+		if (i < parking_range) {
+			if (parkfindnext) parking_offset=x-parking_start+1;
 			chan->appl = "Parked Call";
 			chan->data = NULL; 
 
@@ -1569,6 +1577,8 @@ static int load_config(void)
 					parking_start = start;
 					parking_stop = end;
 				}
+			} else if (!strcasecmp(var->name, "findslot")) {
+				parkfindnext = (!strcasecmp(var->value, "next"));
 			} else if (!strcasecmp(var->name, "adsipark")) {
 				adsipark = ast_true(var->value);
 			} else if (!strcasecmp(var->name, "transferdigittimeout")) {