Index: configs/features.conf.sample
===================================================================
--- configs/features.conf.sample	(revision 80129)
+++ configs/features.conf.sample	(working copy)
@@ -1,13 +1,17 @@
 ;
 ; Sample Call Features (parking, transfer, etc) configuration
 ;
+; IMPORTANT NOTE: in order to use any of these features you really need to enable them below.
+;   That's mandatory since Asterisk have no default builtins anymore (but timeout values).
+;   It's up to the PBX administrator to enable or not a given feature then.
 
 [general]
-parkext => 700			; What extension to dial to park
-parkpos => 701-720		; What extensions to park calls on. These needs to be
+;parkext => 700			; What extension to dial to park
+;parkpos => 701-720		; What extensions to park calls on. These needs to be
 				; numeric, as Asterisk starts from the start position
 				; and increments with one for the next parked call.
-context => parkedcalls		; Which context parked calls are in
+;context => parkedcalls		; Which context parked calls are in
+;parkdial => park-dial		; Which dialing context parked calls should go after timeout
 ;parkingtime => 45		; Number of seconds a call can be parked for 
 				; (default is 45 seconds)
 ;courtesytone = beep		; Sound file to play to the parked caller 
@@ -27,12 +31,11 @@
 				; using Set(CHANNEL(musicclass)=whatever) in the dialplan
 
 ;transferdigittimeout => 3	; Number of seconds to wait between digits when transferring a call
-				; (default is 3 seconds)
 ;xfersound = beep		; to indicate an attended transfer is complete
 ;xferfailsound = beeperr	; to indicate a failed transfer
-;pickupexten = *8		; Configure the pickup extension. (default is *8)
-;featuredigittimeout = 500	; Max time (ms) between digits for 
-				; feature activation  (default is 500 ms)
+;pickupexten = *8		; Configure the pickup extension
+;featuredigittimeout = 1000	; Max time (ms) between digits for 
+				; feature activation  (default is 1000 ms)
 ;atxfernoanswertimeout = 15 ; Timeout for answer on attended transfer default is 15 seconds.
 ;atxferdropcall = no        ; If someone does an attended transfer, then hangs up before the transferred
                             ; caller is connected, then by default, the system will try to call back the
@@ -43,8 +46,8 @@
                             ; By default, this is 2.
 
 [featuremap]
-;blindxfer => #1		; Blind transfer  (default is #)
-;disconnect => *0		; Disconnect  (default is *)
+;blindxfer => #1		; Blind transfer 
+;disconnect => *0		; Disconnect 
 ;automon => *1			; One Touch Record a.k.a. Touch Monitor
 ;atxfer => *2			; Attended transfer
 ;parkcall => #72                ; Park call (one step parking)
Index: res/res_features.c
===================================================================
--- res/res_features.c	(revision 80129)
+++ res/res_features.c	(working copy)
@@ -61,7 +61,7 @@
 
 #define DEFAULT_PARK_TIME 45000
 #define DEFAULT_TRANSFER_DIGIT_TIMEOUT 3000
-#define DEFAULT_FEATURE_DIGIT_TIMEOUT 500
+#define DEFAULT_FEATURE_DIGIT_TIMEOUT 1000
 #define DEFAULT_NOANSWER_TIMEOUT_ATTENDED_TRANSFER 15000
 #define DEFAULT_ATXFER_DROP_CALL 0
 #define DEFAULT_ATXFER_LOOP_DELAY 10000
@@ -137,8 +137,8 @@
 static char *descrip = "ParkedCall(exten):"
 "Used to connect to a parked call.  This application is always\n"
 "registered internally and does not need to be explicitly added\n"
-"into the dialplan, although you should include the 'parkedcalls'\n"
-"context.\n";
+"into the dialplan, although you should include your context name\n"
+"for parked calls specified in features.conf.\n";
 
 static char *parkcall = "Park";
 
@@ -148,8 +148,8 @@
 "Used to park yourself (typically in combination with a supervised\n"
 "transfer to know the parking space). This application is always\n"
 "registered internally and does not need to be explicitly added\n"
-"into the dialplan, although you should include the 'parkedcalls'\n"
-"context (or the context specified in features.conf).\n\n"
+"into the dialplan, although you should include the context name\n"
+"for parked calls specified in features.conf.\n\n"
 "If you set the PARKINGEXTEN variable to an extension in your\n"
 "parking context, park() will park the call on that extension, unless\n"
 "it already exists. In that case, execution will continue at next\n"
@@ -1091,17 +1091,17 @@
 	}
 }
 
-/* add atxfer and automon as undefined so you can only use em if you configure them */
+/* all features are now undefined so you can only use them if you configure them */
 #define FEATURES_COUNT ARRAY_LEN(builtin_features)
 
 AST_RWLOCK_DEFINE_STATIC(features_lock);
 
 static struct ast_call_feature builtin_features[] = 
 {
-	{ AST_FEATURE_REDIRECT, "Blind Transfer", "blindxfer", "#", "#", builtin_blindtransfer, AST_FEATURE_FLAG_NEEDSDTMF, "" },
+	{ AST_FEATURE_REDIRECT, "Blind Transfer", "blindxfer", "", "", builtin_blindtransfer, AST_FEATURE_FLAG_NEEDSDTMF, "" },
 	{ AST_FEATURE_REDIRECT, "Attended Transfer", "atxfer", "", "", builtin_atxfer, AST_FEATURE_FLAG_NEEDSDTMF, "" },
 	{ AST_FEATURE_AUTOMON, "One Touch Monitor", "automon", "", "", builtin_automonitor, AST_FEATURE_FLAG_NEEDSDTMF, "" },
-	{ AST_FEATURE_DISCONNECT, "Disconnect Call", "disconnect", "*", "*", builtin_disconnect, AST_FEATURE_FLAG_NEEDSDTMF, "" },
+	{ AST_FEATURE_DISCONNECT, "Disconnect Call", "disconnect", "", "", builtin_disconnect, AST_FEATURE_FLAG_NEEDSDTMF, "" },
 	{ AST_FEATURE_PARKCALL, "Park Call", "parkcall", "", "", builtin_parkcall, AST_FEATURE_FLAG_NEEDSDTMF, "" },
 };
 
@@ -2072,7 +2072,7 @@
 					if (comebacktoorigin) { 
 						set_c_e_p(chan, parking_con_dial, peername, 1);
 					} else {
-						ast_log(LOG_WARNING, "now going to parkedcallstimeout,s,1 | ps is %d\n",pu->parkingnum);
+						ast_log(LOG_WARNING, "Now going to parkedcallstimeout,s,1 | ps is %d\n",pu->parkingnum);
 						snprintf(parkingslot, sizeof(parkingslot), "%d", pu->parkingnum);
 						pbx_builtin_setvar_helper(pu->chan, "PARKINGSLOT", parkingslot);
 						set_c_e_p(chan, "parkedcallstimeout", peername, 1);
@@ -2344,36 +2344,53 @@
 {
 	int i;
 	struct ast_call_feature *feature;
-	char format[] = "%-25s %-7s %-7s\n";
+	char format[] = "%-20s\t%-7s\n";
 
-	ast_cli(fd, format, "Builtin Feature", "Default", "Current");
-	ast_cli(fd, format, "---------------", "-------", "-------");
+	ast_cli(fd, format, "Builtin Feature", "Set");
+	ast_cli(fd, format, "---------------", "---");
+	ast_cli(fd, format, "Call pickup", ast_pickup_ext());
 
-	ast_cli(fd, format, "Pickup", "*8", ast_pickup_ext());		/* default hardcoded above, so we'll hardcode it here */
-
 	ast_rwlock_rdlock(&features_lock);
 	for (i = 0; i < FEATURES_COUNT; i++)
-		ast_cli(fd, format, builtin_features[i].fname, builtin_features[i].default_exten, builtin_features[i].exten);
+		ast_cli(fd, format, builtin_features[i].fname, builtin_features[i].exten);
 	ast_rwlock_unlock(&features_lock);
 
-	ast_cli(fd, "\n");
-	ast_cli(fd, format, "Dynamic Feature", "Default", "Current");
-	ast_cli(fd, format, "---------------", "-------", "-------");
-	if (AST_LIST_EMPTY(&feature_list))
-		ast_cli(fd, "(none)\n");
-	else {
+	if (!AST_LIST_EMPTY(&feature_list)) {
+		ast_cli(fd, "\n");
+		ast_cli(fd, format, "Dynamic Feature", "Set");
+		ast_cli(fd, format, "---------------", "---");
+
 		AST_LIST_LOCK(&feature_list);
 		AST_LIST_TRAVERSE(&feature_list, feature, feature_entry)
-			ast_cli(fd, format, feature->sname, "no def", feature->exten);	
+			ast_cli(fd, format, feature->sname, feature->exten);
 		AST_LIST_UNLOCK(&feature_list);
 	}
-	ast_cli(fd, "\nCall parking\n");
-	ast_cli(fd, "------------\n");
-	ast_cli(fd,"%-20s:	%s\n", "Parking extension", parking_ext);
-	ast_cli(fd,"%-20s:	%s\n", "Parking context", parking_con);
-	ast_cli(fd,"%-20s:	%d-%d\n", "Parked call extensions", parking_start, parking_stop);
-	ast_cli(fd,"\n");
-	
+
+	ast_cli(fd, "\n");
+	ast_cli(fd, format, "Call parking", "Set");
+	ast_cli(fd, format, "------------", "---");
+
+	ast_cli(fd, format, "Parking extension", parking_ext);
+
+	if (!parking_start > 0)
+		ast_cli(fd,"%-20s\t\n", "Extensions range");
+	else {
+		ast_cli(fd,"%-20s\t%d-%d\n", "Extensions range", parking_start, parking_stop);
+	}
+
+	ast_cli(fd, format, "Parking context", parking_con);
+	ast_cli(fd, format, "Dial context", parking_con_dial);
+	ast_cli(fd, format, "Music On Hold class", parkmohclass);
+
+	ast_cli(fd, "\n");
+	ast_cli(fd, format, "Timeout (ms)", "Set");
+	ast_cli(fd, format, "------------", "---");
+	ast_cli(fd, "%-20s	%d\n", "Attended transfer", atxfernoanswertimeout);
+	ast_cli(fd, "%-20s	%d\n", "Parking time", parkingtime);
+	ast_cli(fd, "%-20s	%d\n", "Transfer digits", transferdigittimeout);
+	ast_cli(fd, "%-20s	%d\n", "Feature digits", featuredigittimeout);
+	ast_cli(fd, "\n");
+
 	return RESULT_SUCCESS;
 }
 
@@ -2787,16 +2804,9 @@
 	} 
 
 	/* Reset to defaults */
-	strcpy(parking_con, "parkedcalls");
-	strcpy(parking_con_dial, "park-dial");
-	strcpy(parking_ext, "700");
-	strcpy(pickup_ext, "*8");
-	strcpy(parkmohclass, "default");
 	courtesytone[0] = '\0';
 	strcpy(xfersound, "beep");
 	strcpy(xferfailsound, "pbx-invalid");
-	parking_start = 701;
-	parking_stop = 750;
 	parkfindnext = 0;
 	adsipark = 0;
 	comebacktoorigin = 1;
@@ -2821,6 +2831,8 @@
 			ast_copy_string(parking_ext, var->value, sizeof(parking_ext));
 		} else if (!strcasecmp(var->name, "context")) {
 			ast_copy_string(parking_con, var->value, sizeof(parking_con));
+		} else if (!strcasecmp(var->name, "parkdial")) {
+			ast_copy_string(parking_con_dial, var->value, sizeof(parking_con_dial));
 		} else if (!strcasecmp(var->name, "parkingtime")) {
 			if ((sscanf(var->value, "%d", &parkingtime) != 1) || (parkingtime < 1)) {
 				ast_log(LOG_WARNING, "%s is not a valid parkingtime\n", var->value);
