Index: _source/lang/en.js
===================================================================
--- _source/lang/en.js	(revision 4981)
+++ _source/lang/en.js	(working copy)
@@ -128,6 +128,7 @@
 		targetParent	: 'Parent Window (_parent)',
 		targetFrameName	: 'Target Frame Name',
 		targetPopupName	: 'Popup Window Name',
+		textView		: 'Text View',
 		popupFeatures	: 'Popup Window Features',
 		popupResizable	: 'Resizable',
 		popupStatusBar	: 'Status Bar',
Index: _source/plugins/link/dialogs/link.js
===================================================================
--- _source/plugins/link/dialogs/link.js	(revision 4981)
+++ _source/plugins/link/dialogs/link.js	(working copy)
@@ -88,8 +88,29 @@
 			emailMatch,
 			anchorMatch,
 			urlMatch,
-			retval = {};
-
+			retval = {},
+			selectedText = '';
+		
+		var selection = editor.getSelection();
+		// Get selection.
+		if ( selection )
+		{
+			var bookmarks = selection.createBookmarks(),
+			range = selection.getRanges()[ 0 ],
+			fragment = range.clone().cloneContents();
+			selection.selectBookmarks( bookmarks );
+			var  childList = fragment.getChildren(),
+				childCount = childList.count();
+			for ( var i = 0; i < childCount; i++ )
+			{
+				var child = childList.getItem( i );
+				selectedText += ( child.getOuterHtml?
+				child.getOuterHtml() : child.getText() );
+			}
+		}
+		// Store selected text.
+		retval.text = element ? element.getText() : selectedText ? selectedText : '';
+		
 		if ( ( anchorMatch = href.match( anchorRegex ) ) )
 		{
 			retval.type = 'anchor';
@@ -390,6 +411,21 @@
 						children :
 						[
 							{
+								id : 'textView',
+								type : 'text',
+								label : editor.lang.link.textView,
+								setup : function ( data )
+								{
+									if ( data.text )
+										this.setValue( data.text || '' );
+									
+								},
+								commit : function ( data )
+								{
+									data.text = this.getValue() || this.getDialog().getContentElement( 'info', 'url' ).getValue() || '';
+								}
+							},
+							{
 								type : 'hbox',
 								widths : [ '25%', '75%' ],
 								children :
@@ -1288,7 +1324,7 @@
 					ranges = selection.getRanges();
 				if ( ranges.length == 1 && ranges[0].collapsed )
 				{
-					var text = new CKEDITOR.dom.text( attributes._cke_saved_href, editor.document );
+					var text = new CKEDITOR.dom.text( data.text || attributes._cke_saved_href, editor.document );
 					ranges[0].insertNode( text );
 					ranges[0].selectNodeContents( text );
 					selection.selectRanges( ranges );
@@ -1346,7 +1382,10 @@
 
 				if ( this.fakeObj )
 					editor.createFakeElement( element, 'cke_anchor', 'anchor' ).replace( this.fakeObj );
-
+				
+				// Set selected text.
+				element.setHtml( data.text );
+				
 				delete this._.selectedElement;
 			}
 		},

