Index: /FCKeditor/trunk/editor/_source/classes/fckenterkey.js
===================================================================
--- /FCKeditor/trunk/editor/_source/classes/fckenterkey.js	(revision 424)
+++ /FCKeditor/trunk/editor/_source/classes/fckenterkey.js	(revision 425)
@@ -30,9 +30,18 @@
  *			May be "p", "div", "br". Defaults to "br".
  */
-var FCKEnterKey = function( targetWindow, enterMode, shiftEnterMode )
+var FCKEnterKey = function( targetWindow, enterMode, shiftEnterMode, tabSpaces )
 {
 	this.Window			= targetWindow ;
 	this.EnterMode		= enterMode || 'p' ;
 	this.ShiftEnterMode	= shiftEnterMode || 'br' ;
+	this.TabText = "\xa0\xa0" ;	// the default text for each tab is two non-breaking spaces
+
+	if ( tabSpaces > 0 )
+	{
+		var a = [] ;
+		for ( var i = 0 ; i < tabSpaces ; i++ )
+			a.push( "\xa0" ) ;
+		this.TabText = a.join( "" ) ;
+	}
 
 	// Setup the Keystroke Handler.
@@ -45,5 +54,6 @@
 		[ SHIFT + 13, 'ShiftEnter' ],
 		[ 8			, 'Backspace' ],
-		[ 46		, 'Delete' ]
+		[ 46		, 'Delete' ],
+		[ 9, "Tab" ]
 	] ) ;
 
@@ -77,4 +87,7 @@
 			case 'Delete' :
 				return oEnterKey.DoDelete() ;
+				break ;
+			case "Tab" :
+				return oEnterKey.DoTab() ;
 		}
 	/* @Packager.RemoveLine
@@ -285,4 +298,18 @@
 	oRange.Release() ;
 	return bCustom ;
+}
+
+/*
+ * Executes the <Tab> key behavior.
+ */
+FCKEnterKey.prototype.DoTab = function()
+{
+	var oRange = new FCKDomRange( this.Window );
+	oRange.MoveToSelection() ;
+	oRange.DeleteContents() ;
+	oRange.InsertNode( this.Window.document.createTextNode( this.TabText ) ) ;
+	oRange.Collapse( false ) ;
+	oRange.Select() ;
+	return true ;
 }
 
Index: /FCKeditor/trunk/editor/_source/internals/fck.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fck.js	(revision 424)
+++ /FCKeditor/trunk/editor/_source/internals/fck.js	(revision 425)
@@ -716,5 +716,5 @@
 	// Create the enter key handler
 	if ( !FCKConfig.DisableEnterKeyHandler )
-		FCK.EnterKeyHandler = new FCKEnterKey( FCK.EditorWindow, FCKConfig.EnterMode, FCKConfig.ShiftEnterMode ) ;
+		FCK.EnterKeyHandler = new FCKEnterKey( FCK.EditorWindow, FCKConfig.EnterMode, FCKConfig.ShiftEnterMode, FCKConfig.TabSpaces ) ;
 
 	// Listen for keystroke events.
@@ -768,4 +768,6 @@
 			return false ;
 		}
+		else if ( keystrokeValue == 'CustomTab' )
+			return false ;		// ignore it here, it's handled in fckenterkey.js
 	}
 	else
@@ -774,4 +776,30 @@
 		if ( keystrokeValue.Equals( 'Paste', 'Undo', 'Redo', 'SelectAll' ) )
 			return false ;
+		// Pressing <Tab> in source mode should produce a tab space in the text area, not
+		// changing the focus to something else.
+		if ( keystrokeValue == 'CustomTab' )
+		{
+			if ( FCKBrowserInfo.IsIE )
+			{
+				var range = document.selection.createRange() ;
+				if ( range.parentElement() != FCK.EditingArea.Textarea ) 
+					return false ;
+				range.text = "\t" ;
+				range.select() ;
+			}
+			else
+			{
+				var a = [] ;
+				var el = FCK.EditingArea.Textarea ;
+				var selStart = el.selectionStart ;
+				var selEnd = el.selectionEnd ;
+				a.push( el.value.substr(0, selStart ) ) ;
+				a.push( "\t" ) ;
+				a.push( el.value.substr( selEnd ) ) ;
+				el.value = a.join( "" ) ;
+				el.setSelectionRange( selStart + 1, selStart + 1 ) ;
+			}
+			return true ;
+		}
 	}
 
Index: /FCKeditor/trunk/editor/_source/internals/fck_ie.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fck_ie.js	(revision 424)
+++ /FCKeditor/trunk/editor/_source/internals/fck_ie.js	(revision 425)
@@ -100,11 +100,4 @@
 	FCK.ContextMenu._InnerContextMenu.AttachToElement( FCK.EditorDocument.body ) ;
 
-	// Build the "TAB" key replacement (if necessary).
-	if ( FCKConfig.TabSpaces > 0 )
-	{
-		window.FCKTabHTML = '' ;
-		for ( i = 0 ; i < FCKConfig.TabSpaces ; i++ )
-			window.FCKTabHTML += "&nbsp;" ;
-	}
 	this.EditorDocument.attachEvent("onkeydown", FCK._KeyDownListener ) ;
 
