diff --git a/src/mod/applications/mod_valet_parking/mod_valet_parking.c b/src/mod/applications/mod_valet_parking/mod_valet_parking.c
index ba4d8605e1..f158c6c240 100644
--- a/src/mod/applications/mod_valet_parking/mod_valet_parking.c
+++ b/src/mod/applications/mod_valet_parking/mod_valet_parking.c
@@ -164,7 +164,11 @@ static valet_token_t *next_id(switch_core_session_t *session, valet_lot_t *lot,
 		switch_snprintf(buf, sizeof(buf), "%d", i);
 		token = (valet_token_t *) switch_core_hash_find(lot->hash, buf);
 		
-		if ((in && !token) || (!in && token && !token->timeout)) {
+		if ((!in && token && !token->timeout)) {
+			goto end;
+		}
+
+		if (in && !token) {
 			r = i;
 			break;
 		}
@@ -180,6 +184,8 @@ static valet_token_t *next_id(switch_core_session_t *session, valet_lot_t *lot,
 		switch_core_hash_insert(lot->hash, buf, token);
 	}
 
+ end:
+
 	switch_mutex_unlock(globals.mutex);
 
 	return token;
@@ -340,6 +346,7 @@ SWITCH_STANDARD_APP(valet_parking_function)
 		switch_input_args_t args = { 0 };
 		char dbuf[10];
 		char *dest;
+		int in = -1;
 
 		lot = valet_find_lot(lot_name);
 		switch_assert(lot);
@@ -348,7 +355,7 @@ SWITCH_STANDARD_APP(valet_parking_function)
 			const char *io = argv[2];
 			const char *min = argv[3];
 			const char *max = argv[4];
-			int min_i, max_i, in = -1;
+			int min_i, max_i;
 
 			if (argc < 5) {
 				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage: %s\n", VALET_APP_SYNTAX);
@@ -366,7 +373,6 @@ SWITCH_STANDARD_APP(valet_parking_function)
 
 			if (in < 0) {
 				switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage: %s\n", VALET_APP_SYNTAX);
-				switch_mutex_unlock(lot->mutex);
 				return;
 			}
 
@@ -375,12 +381,12 @@ SWITCH_STANDARD_APP(valet_parking_function)
 
 			if (!(token = next_id(session, lot, min_i, max_i, in))) {
 				switch_ivr_phrase_macro(session, in ? "valet_lot_full" : "valet_lot_empty", "", NULL, NULL);
-				switch_mutex_unlock(lot->mutex);
 				return;
 			}
 
 			switch_snprintf(dtmf_buf, sizeof(dtmf_buf), "%s", token->ext);
 			ext = dtmf_buf;
+
 		} else if (!strcasecmp(ext, "ask")) {
 			const char *prompt = "ivr/ivr-enter_ext_pound.wav";
 			int min = 1;
@@ -425,11 +431,15 @@ SWITCH_STANDARD_APP(valet_parking_function)
 			}
 		}
 
-		if (!token) {
+		if (!token || !in) {
 
-			
-			switch_mutex_lock(lot->mutex);
-			if ((token = (valet_token_t *) switch_core_hash_find(lot->hash, ext))) {
+			if (!token) {
+				switch_mutex_lock(lot->mutex);
+				token = (valet_token_t *) switch_core_hash_find(lot->hash, ext);
+				switch_mutex_unlock(lot->mutex);
+			}
+
+			if (token) {
 				switch_core_session_t *b_session;
 			
 				if (token->timeout) {
@@ -461,7 +471,6 @@ SWITCH_STANDARD_APP(valet_parking_function)
 						token->bridged = 1;
 
 						switch_ivr_uuid_bridge(switch_core_session_get_uuid(session), token->uuid);
-						switch_mutex_unlock(lot->mutex);
 						return;
 					}
 				}
@@ -505,7 +514,6 @@ SWITCH_STANDARD_APP(valet_parking_function)
 						switch_ivr_phrase_macro(session, "valet_announce_ext", tmp, NULL, NULL);
 					}
 					switch_ivr_session_transfer(b_session, dest, "inline", NULL);
-					switch_mutex_unlock(lot->mutex);
 					switch_core_session_rwunlock(b_session);
 					switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
 					goto end;
@@ -534,7 +542,6 @@ SWITCH_STANDARD_APP(valet_parking_function)
 		args.buf = dbuf;
 		args.buflen = sizeof(dbuf);
 
-		switch_mutex_unlock(lot->mutex);
 
 		
 		while(switch_channel_ready(channel)) {