Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 4567)
+++ /CKEditor/trunk/CHANGES.html	(revision 4568)
@@ -42,4 +42,5 @@
 		<li><a href="http://dev.fckeditor.net/ticket/3881">#3881</a> : Added color dialog for 'more color' option in color buttons.</li>
 		<li><a href="http://dev.fckeditor.net/ticket/2885">#2885</a> : Added 'div' dialog and corresponding context menu options.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4341">#4341</a> : Added the 'showborder' plugin.</li>
 	</ul>
 	<p>
Index: /CKEditor/trunk/_source/core/config.js
===================================================================
--- /CKEditor/trunk/_source/core/config.js	(revision 4567)
+++ /CKEditor/trunk/_source/core/config.js	(revision 4568)
@@ -199,5 +199,5 @@
 	 * @example
 	 */
-	plugins : 'about,basicstyles,blockquote,button,clipboard,colorbutton,colordialog,contextmenu,div,elementspath,enterkey,entities,filebrowser,find,flash,font,format,forms,horizontalrule,htmldataprocessor,image,indent,justify,keystrokes,link,list,maximize,newpage,pagebreak,pastefromword,pastetext,popup,preview,print,removeformat,resize,save,scayt,smiley,showblocks,sourcearea,stylescombo,table,tabletools,specialchar,tab,templates,toolbar,undo,wysiwygarea,wsc',
+	plugins : 'about,basicstyles,blockquote,button,clipboard,colorbutton,colordialog,contextmenu,div,elementspath,enterkey,entities,filebrowser,find,flash,font,format,forms,horizontalrule,htmldataprocessor,image,indent,justify,keystrokes,link,list,maximize,newpage,pagebreak,pastefromword,pastetext,popup,preview,print,removeformat,resize,save,scayt,smiley,showblocks,showborders,sourcearea,stylescombo,table,tabletools,specialchar,tab,templates,toolbar,undo,wysiwygarea,wsc',
 
 	/**
Index: /CKEditor/trunk/_source/plugins/showborders/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/showborders/plugin.js	(revision 4568)
+++ /CKEditor/trunk/_source/plugins/showborders/plugin.js	(revision 4568)
@@ -0,0 +1,171 @@
+/*
+Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+/**
+ * @fileOverview The "show border" plugin. The command display visible outline
+ * border line around all table elements if table doesn't have a none-zero 'border' attribute specified.
+ */
+
+(function()
+{
+	var showBorderClassName = 'cke_show_border',
+		cssStyleText,
+		cssTemplate =
+		// TODO: For IE6, we don't have child selector support,
+		// where nested table cells could be incorrect.
+		( CKEDITOR.env.ie6Compat ?
+		  [
+			'.%1 table.%2,',
+			 '.%1 table.%2 td, .%1 table.%2 th,',
+			 '{',
+				'border : #d3d3d3 1px dotted',
+			 '}'
+		  ] :
+		  [
+			 '.%1 table.%2,',
+			 '.%1 table.%2 > tr > td, .%1 table.%2 > tr > th,',
+			 '.%1 table.%2 > tbody > tr > td, .%1 table.%2 > tbody > tr > th,',
+			 '.%1 table.%2 > thead > tr > td, .%1 table.%2 > thead > tr > th,',
+			 '.%1 table.%2 > tfoot > tr > td, .%1 table.%2 > tfoot > tr > th',
+			 '{',
+				'border : #d3d3d3 1px dotted',
+			 '}'
+		  ] ).join( '' );
+
+	cssStyleText = cssTemplate.replace( /%2/g, showBorderClassName ).replace( /%1/g, 'cke_show_borders ' );
+
+	var commandDefinition =
+	{
+		preserveState : true,
+		editorFocus : false,
+
+		exec : function ( editor )
+		{
+			this.toggleState();
+			this.refresh( editor );
+		},
+
+		refresh : function( editor )
+		{
+			var funcName = ( this.state == CKEDITOR.TRISTATE_ON ) ? 'addClass' : 'removeClass';
+			editor.document.getBody()[ funcName ]( 'cke_show_borders' );
+		}
+	};
+
+	CKEDITOR.plugins.add( 'showborders',
+	{
+		requires : [ 'wysiwygarea' ],
+		modes : { 'wysiwyg' : 1 },
+
+		init : function( editor )
+		{
+
+			var command = editor.addCommand( 'showborders', commandDefinition );
+			command.canUndo = false;
+
+			if ( editor.config.startupShowBorders != false )
+				command.setState( CKEDITOR.TRISTATE_ON );
+
+			editor.addCss( cssStyleText );
+			
+			// Refresh the command on setData.
+			editor.on( 'mode', function()
+				{
+					if ( command.state != CKEDITOR.TRISTATE_DISABLED )
+						command.refresh( editor );
+				}, null, null, 100 );
+
+			// Refresh the command on wysiwyg frame reloads.
+			editor.on( 'contentDom', function()
+				{
+					if ( command.state != CKEDITOR.TRISTATE_DISABLED )
+						command.refresh( editor );
+				});
+		},
+
+		afterInit : function( editor )
+		{
+			var dataProcessor = editor.dataProcessor,
+				dataFilter = dataProcessor && dataProcessor.dataFilter,
+				htmlFilter = dataProcessor && dataProcessor.htmlFilter;
+
+			if ( dataFilter )
+			{
+				dataFilter.addRules(
+					{
+						elements :
+						{
+							'table' : function( element )
+							{
+								var attributes = element.attributes,
+									cssClass = attributes[ 'class' ],
+									border = parseInt( attributes.border );
+
+								if ( !border || border <= 0 )
+									attributes[ 'class' ] = ( cssClass || '' ) + ' ' + showBorderClassName;
+							}
+						}
+					} );
+			}
+
+			if( htmlFilter )
+			{
+				htmlFilter.addRules(
+				{
+					elements :
+					{
+						'table' : function( table )
+						{
+							var attributes = table.attributes,
+								cssClass = attributes[ 'class' ];
+
+							cssClass && ( attributes[ 'class' ] =
+							              cssClass.replace( showBorderClassName, '' )
+									              .replace( /\s{2}/, ' ' )
+												  .replace( /^\s+|\s+$/, '' ) );
+						}
+					}
+				} );
+			}
+
+			// Table dialog must be aware of it.
+			CKEDITOR.on( 'dialogDefinition', function( ev )
+				{
+					if( ev.editor != editor )
+						return;
+
+					var dialogName = ev.data.name;
+
+					if ( dialogName == 'table' || dialogName == 'tableProperties' )
+					{
+						var dialogDefinition = ev.data.definition,
+							infoTab = dialogDefinition.getContents( 'info' ),
+							borderField = infoTab.get( 'txtBorder' ),
+							originalCommit = borderField.commit;
+
+						borderField.commit = CKEDITOR.tools.override( originalCommit, function( org )
+						{
+							return function( data, selectedTable )
+							{
+								org.apply( this, arguments );
+								var value = parseInt( this.getValue() );
+								selectedTable[ ( !value || value <= 0 ) ? 'addClass' : 'removeClass' ]( showBorderClassName );
+							}
+						} );
+					}
+				});
+		}
+
+	});
+} )();
+
+/**
+ * Whether to automatically enable the "show borders" command when the editor loads.
+ * @type Boolean
+ * @default true
+ * @example
+ * config.startupShowBorders = false;
+ */
+
