Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 7235)
+++ /CKEditor/trunk/CHANGES.html	(revision 7236)
@@ -45,4 +45,5 @@
 		<li><a href="http://dev.ckeditor.com/ticket/6161">#6161</a> : New <code><a href="http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.config.html#.autoGrow_onStartup">autoGrow_onStartup</a></code> configuration option.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/8052">#8052</a> : <code>autogrow</code> is now available as an editor <a href="http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.editor.html#execCommand">command</a>.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/3457">#3457</a> : Edit contents of &lt;textarea&gt; elements. </li>
 	</ul>
 	<p>
Index: /CKEditor/trunk/_source/core/htmlparser/fragment.js
===================================================================
--- /CKEditor/trunk/_source/core/htmlparser/fragment.js	(revision 7235)
+++ /CKEditor/trunk/_source/core/htmlparser/fragment.js	(revision 7236)
@@ -75,4 +75,6 @@
 			pendingBRs = [],
 			currentNode = fragment,
+		    // Indicate we're inside a <textarea> element, spaces should be touched differently.
+			inTextarea = false,
 		    // Indicate we're inside a <pre> element, spaces should be touched differently.
 			inPre = false;
@@ -176,5 +178,5 @@
 			// Rtrim empty spaces on block end boundary. (#3585)
 			if ( element._.isBlockLike
-				 && element.name != 'pre' )
+				 && element.name != 'pre' && element.name != 'textarea' )
 			{
 
@@ -227,4 +229,6 @@
 				return;
 			}
+			else if ( tagName == 'textarea' )
+				inTextarea = true;
 
 			if ( tagName == 'br' )
@@ -360,4 +364,7 @@
 					inPre = false;
 
+				if ( currentNode.name == 'textarea' )
+					inTextarea = false;
+
 				if ( candidate._.isBlockLike )
 					sendPendingBRs();
@@ -379,6 +386,6 @@
 		parser.onText = function( text )
 		{
-			// Trim empty spaces at beginning of text contents except <pre>.
-			if ( ( !currentNode._.hasInlineStarted || pendingBRs.length ) && !inPre )
+			// Trim empty spaces at beginning of text contents except <pre> and <textarea>.
+			if ( ( !currentNode._.hasInlineStarted || pendingBRs.length ) && !inPre && !inTextarea )
 			{
 				text = CKEDITOR.tools.ltrim( text );
@@ -400,5 +407,5 @@
 			// Shrinking consequential spaces into one single for all elements
 			// text contents.
-			if ( !inPre )
+			if ( !inPre && !inTextarea )
 				text = text.replace( /[\t\r\n ]{2,}|[\t\r\n]/g, ' ' );
 
Index: /CKEditor/trunk/_source/plugins/forms/dialogs/textarea.js
===================================================================
--- /CKEditor/trunk/_source/plugins/forms/dialogs/textarea.js	(revision 7235)
+++ /CKEditor/trunk/_source/plugins/forms/dialogs/textarea.js	(revision 7236)
@@ -8,5 +8,5 @@
 		title : editor.lang.textarea.title,
 		minWidth : 350,
-		minHeight : 150,
+		minHeight : 220,
 		onShow : function()
 		{
@@ -67,45 +67,66 @@
 					},
 					{
-						id : 'cols',
-						type : 'text',
-						label : editor.lang.textarea.cols,
+						type : 'hbox',
+						widths:['50%','50%'],
+						children:[
+							{
+								id : 'cols',
+								type : 'text',
+								label : editor.lang.textarea.cols,
+								'default' : '',
+								accessKey : 'C',
+								style : 'width:50px',
+								validate : CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed ),
+								setup : function( element )
+								{
+									var value = element.hasAttribute( 'cols' ) && element.getAttribute( 'cols' );
+									this.setValue( value || '' );
+								},
+								commit : function( element )
+								{
+									if ( this.getValue() )
+										element.setAttribute( 'cols', this.getValue() );
+									else
+										element.removeAttribute( 'cols' );
+								}
+							},
+							{
+								id : 'rows',
+								type : 'text',
+								label : editor.lang.textarea.rows,
+								'default' : '',
+								accessKey : 'R',
+								style : 'width:50px',
+								validate : CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed ),
+								setup : function( element )
+								{
+									var value = element.hasAttribute( 'rows' ) && element.getAttribute( 'rows' );
+									this.setValue( value || '' );
+								},
+								commit : function( element )
+								{
+									if ( this.getValue() )
+										element.setAttribute( 'rows', this.getValue() );
+									else
+										element.removeAttribute( 'rows' );
+								}
+							}
+						]
+					},
+					{
+						id : 'value',
+						type : 'textarea',
+						label : editor.lang.textfield.value,
 						'default' : '',
-						accessKey : 'C',
-						style : 'width:50px',
-						validate : CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed ),
 						setup : function( element )
 						{
-							var value = element.hasAttribute( 'cols' ) && element.getAttribute( 'cols' );
-							this.setValue( value || '' );
+							this.setValue( element.$.defaultValue );
 						},
 						commit : function( element )
 						{
-							if ( this.getValue() )
-								element.setAttribute( 'cols', this.getValue() );
-							else
-								element.removeAttribute( 'cols' );
-						}
-					},
-					{
-						id : 'rows',
-						type : 'text',
-						label : editor.lang.textarea.rows,
-						'default' : '',
-						accessKey : 'R',
-						style : 'width:50px',
-						validate : CKEDITOR.dialog.validate.integer( editor.lang.common.validateNumberFailed ),
-						setup : function( element )
-						{
-							var value = element.hasAttribute( 'rows' ) && element.getAttribute( 'rows' );
-							this.setValue( value || '' );
-						},
-						commit : function( element )
-						{
-							if ( this.getValue() )
-								element.setAttribute( 'rows', this.getValue() );
-							else
-								element.removeAttribute( 'rows' );
+							element.$.value = element.$.defaultValue = this.getValue() ;
 						}
 					}
+
 				]
 			}
