diff --git a/CHANGES b/CHANGES
index e15f498d7c53b5e41e69bffe9f93fa89ea94cb4b..cb35fa4cce91bff37941034b21b454b09e505d46 100644
--- a/CHANGES
+++ b/CHANGES
@@ -127,6 +127,10 @@ Applications
  * Page has a new option 'A(x)' which will playback an announcement simultaneously
    to all paged phones (and optionally excluding the caller's one using the new
    option 'n') before the call is bridged.
+ * The 'f' option to Dial has been augmented to take an optional argument. If no
+   argument is provided, the 'f' option works as it always has. If an argument is
+   provided, then the connected party information of all outgoing channels created
+   during the Dial will be set to the argument passed to the 'f' option.
 
 Dialplan Functions
 ------------------
diff --git a/apps/app_dial.c b/apps/app_dial.c
index c24a56647220751cba4f6cf27e45f6b624a6cf7a..66e8bb8654c1988b86977d08ca556a4534368a20 100644
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -132,10 +132,13 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 					<para>Execute the <literal>h</literal> extension for peer after the call ends</para>
 				</option>
 				<option name="f">
-					<para>Force the callerid of the <emphasis>calling</emphasis> channel to be set as the
-					extension associated with the channel using a dialplan <literal>hint</literal>.
+					<argument name="x" required="false" />
+					<para>If <replaceable>x</replaceable> is not provided, force the callerid of the <emphasis>calling</emphasis> 
+					channel to be set as the extension associated with the channel using a dialplan <literal>hint</literal>.
 					For example, some PSTNs do not allow CallerID to be set to anything
-					other than the number assigned to the caller.</para>
+					other than the number assigned to the caller. If <replaceable>x</replaceable> is provided, though, then
+					this option behaves quite differently. Any outgoing channel created will have its connected party information
+					set to <replaceable>x</replaceable></para>
 				</option>
 				<option name="F" argsep="^">
 					<argument name="context" required="false" />
@@ -546,6 +549,7 @@ enum {
 	OPT_ARG_DURATION_STOP,
 	OPT_ARG_OPERMODE,
 	OPT_ARG_SCREEN_NOINTRO,
+	OPT_ARG_FORCECLID,
 	/* note: this entry _MUST_ be the last one in the enum */
 	OPT_ARG_ARRAY_SIZE,
 };
@@ -558,7 +562,7 @@ AST_APP_OPTIONS(dial_exec_options, BEGIN_OPTIONS
 	AST_APP_OPTION('d', OPT_DTMF_EXIT),
 	AST_APP_OPTION_ARG('D', OPT_SENDDTMF, OPT_ARG_SENDDTMF),
 	AST_APP_OPTION('e', OPT_PEER_H),
-	AST_APP_OPTION('f', OPT_FORCECLID),
+	AST_APP_OPTION_ARG('f', OPT_FORCECLID, OPT_ARG_FORCECLID),
 	AST_APP_OPTION_ARG('F', OPT_CALLEE_GO_ON, OPT_ARG_CALLEE_GO_ON),
 	AST_APP_OPTION('g', OPT_GO_ON),
 	AST_APP_OPTION_ARG('G', OPT_GOTO, OPT_ARG_GOTO),
@@ -1623,7 +1627,7 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
 	struct cause_args num = { chan, 0, 0, 0 };
 	int cause;
 	char numsubst[256];
-	char cidname[AST_MAX_EXTENSION] = "";
+	char *cid_num = NULL, *cid_name = NULL;
 
 	struct ast_bridge_config config = { { 0, } };
 	struct timeval calldurationlimit = { 0, };
@@ -1718,6 +1722,8 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
 			goto done;
 	}
 
+	if (ast_test_flag64(&opts, OPT_FORCECLID) && !ast_strlen_zero(opt_args[OPT_ARG_FORCECLID]))
+		ast_callerid_parse(opt_args[OPT_ARG_FORCECLID], &cid_name, &cid_num);
 	if (ast_test_flag64(&opts, OPT_RESETCDR) && chan->cdr)
 		ast_cdr_reset(chan->cdr, NULL);
 	if (ast_test_flag64(&opts, OPT_PRIVACY) && ast_strlen_zero(opt_args[OPT_ARG_PRIVACY]))
@@ -1748,7 +1754,7 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
 	}
 	ast_channel_unlock(chan);	
 	ast_copy_flags64(peerflags, &opts, OPT_DTMF_EXIT | OPT_GO_ON | OPT_ORIGINAL_CLID | OPT_CALLER_HANGUP | OPT_IGNORE_FORWARDING | OPT_IGNORE_CONNECTEDLINE |
-			 OPT_CANCEL_TIMEOUT | OPT_ANNOUNCE | OPT_CALLEE_MACRO | OPT_CALLEE_GOSUB);
+			 OPT_CANCEL_TIMEOUT | OPT_ANNOUNCE | OPT_CALLEE_MACRO | OPT_CALLEE_GOSUB | OPT_FORCECLID);
 
 	/* loop through the list of dial destinations */
 	rest = args.peers;
@@ -1894,8 +1900,18 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
 			}
 			ast_set_flag64(tmp, DIAL_NOCONNECTEDLINE);
 		}
-		
-		ast_connected_line_copy_from_caller(&tc->connected, &chan->cid);
+
+		if (ast_test_flag64(peerflags, OPT_FORCECLID) && !ast_strlen_zero(opt_args[OPT_ARG_FORCECLID])) {
+			struct ast_party_connected_line connected;
+
+			ast_party_connected_line_set_init(&connected, &tmp->chan->connected);
+			connected.id.number = cid_num;
+			connected.id.name = cid_name;
+			connected.id.number_presentation = AST_PRES_ALLOWED_USER_NUMBER_PASSED_SCREEN;
+			ast_channel_set_connected_line(tmp->chan, &connected);
+		} else {
+			ast_connected_line_copy_from_caller(&tmp->chan->connected, &chan->cid);
+		}
 
 		S_REPLACE(tc->cid.cid_rdnis, ast_strdup(chan->cid.cid_rdnis));
 		ast_party_redirecting_copy(&tc->redirecting, &chan->redirecting);
@@ -1958,6 +1974,7 @@ static int dial_exec_full(struct ast_channel *chan, const char *data, struct ast
 			ast_verb(3, "Called %s\n", numsubst);
 			ast_channel_unlock(chan);
 			if (!ast_test_flag64(peerflags, OPT_ORIGINAL_CLID)) {
+				char cidname[AST_MAX_EXTENSION];
 				ast_set_callerid(tc, tmpexten, get_cid_name(cidname, sizeof(cidname), chan), NULL);
 			}
 		}