diff --git a/res/res_features.c b/res/res_features.c
index 8de1c1fea45b072bf7bb4a54ee75ef0c91cdedc1..44f413cd88ac852e5506ee0fb2a64da674904040 100644
--- a/res/res_features.c
+++ b/res/res_features.c
@@ -401,7 +401,7 @@ static int park_call_full(struct ast_channel *chan, struct ast_channel *peer, in
 			AST_LIST_UNLOCK(&parkinglot);
 			ast_free(pu);
 			ast_log(LOG_WARNING, "Requested parking extension already exists: %s@%s\n", parkingexten, parking_con);
-			return 0;	/* Continue execution if possible */
+			return 1;	/* Continue execution if possible */
 		}
 		ast_copy_string(pu->parkingexten, parkingexten, sizeof(pu->parkingexten));
 		x = atoi(parkingexten);
@@ -2352,10 +2352,15 @@ static int park_call_exec(struct ast_channel *chan, void *data)
 	 * of a park--it is still theoretically possible for a transfer to happen before
 	 * we get here, but it is _really_ unlikely */
 	char *orig_chan_name = ast_strdupa(chan->name);
+	char orig_exten[AST_MAX_EXTENSION];
+	int orig_priority = chan->priority;
+
 	/* Data is unused at the moment but could contain a parking
 	   lot context eventually */
 	int res = 0;
 
+	ast_copy_string(orig_exten, chan->exten, sizeof(orig_exten));
+
 	/* Setup the exten/priority to be s/1 since we don't know
 	   where this call should return */
 	strcpy(chan->exten, "s");
@@ -2367,10 +2372,18 @@ static int park_call_exec(struct ast_channel *chan, void *data)
 	if (!res)
 		res = ast_safe_sleep(chan, 1000);
 	/* Park the call */
-	if (!res)
+	if (!res) {
 		res = park_call_full(chan, NULL, 0, NULL, orig_chan_name);
+		/* Continue on in the dialplan */
+		if (res == 1) {
+			ast_copy_string(chan->exten, orig_exten, sizeof(chan->exten));
+			chan->priority = orig_priority;
+			res = 0;
+		} else if (!res)
+			res = AST_PBX_KEEPALIVE;
+	}
 
-	return !res ? AST_PBX_KEEPALIVE : res;
+	return res;
 }
 
 /*! \brief Pickup parked call */