Index: /FCKeditor/trunk/editor/_source/classes/fckenterkey.js
===================================================================
--- /FCKeditor/trunk/editor/_source/classes/fckenterkey.js	(revision 393)
+++ /FCKeditor/trunk/editor/_source/classes/fckenterkey.js	(revision 394)
@@ -257,4 +257,10 @@
 FCKEnterKey.prototype.DoDelete = function()
 {
+	// Save an undo snapshot before doing anything
+	// This is to conform with the behavior seen in MS Word
+	if (FCKUndo.TypesCount == 0)
+		FCKUndo.TypesCount = 1;
+	FCKUndo.SaveUndoStep();
+
 	// The <Delete> has the same effect as the <Backspace>, so we have the same
 	// results if we just move to the next block and apply the same <Backspace> logic.
Index: /FCKeditor/trunk/editor/_source/commandclasses/fck_othercommands.js
===================================================================
--- /FCKeditor/trunk/editor/_source/commandclasses/fck_othercommands.js	(revision 393)
+++ /FCKeditor/trunk/editor/_source/commandclasses/fck_othercommands.js	(revision 394)
@@ -232,4 +232,5 @@
 {
 	FCKUndo.Undo() ;
+	return false;
 }
 
@@ -248,4 +249,5 @@
 {
 	FCKUndo.Redo() ;
+	return false;
 }
 
@@ -392,2 +394,24 @@
 	}
 } ;
+
+//## Cut by keyboard
+var FCKCutByKeyboardCommand = function(commandName)
+{
+	this.Name = "CutByKeyboard";
+}
+
+FCKCutByKeyboardCommand.prototype.Execute = function()
+{
+	// Grab a snapshot for the undo system before changing the document
+	if (FCKUndo.TypesCount == 0)
+		FCKUndo.TypesCount = 1;
+	FCKUndo.SaveUndoStep();
+
+	// Tell the browser to go ahead and do what it would normally do with the hotkey
+	// For this particular hotkey, "false" means continue, instead of "true"
+	return false;
+}
+FCKCutByKeyboardCommand.prototype.GetState = function()
+{
+	return FCK.GetNamedCommandState( this.Name );
+}
Index: /FCKeditor/trunk/editor/_source/internals/fck_gecko.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fck_gecko.js	(revision 393)
+++ /FCKeditor/trunk/editor/_source/internals/fck_gecko.js	(revision 394)
@@ -48,5 +48,6 @@
 	if ( FCK.EditorWindow )
 	{
-		if ( !( evt.keyCode >= 16 && evt.keyCode <= 18 ) )
+		if ( !( evt.keyCode >= 16 && evt.keyCode <= 46 ) // do not capture function key presses, like arrow keys or shift/alt/ctrl
+			&& !(evt.ctrlKey || evt.metaKey) ) // do not capture Ctrl hotkeys, as they have their snapshot capture logic
 			FCK._KeyDownUndo();
 	}
@@ -127,5 +128,5 @@
 	Print	: true,
 	Paste	: true,
-	Cut		: true,
+	Cut	: true,
 	Copy	: true
 } ;
@@ -158,4 +159,11 @@
 FCK.Paste = function()
 {
+	// Set the TypesCount to non-zero so that undo will always be available after a paste
+	if (FCKUndo.TypesCount == 0)
+		FCKUndo.TypesCount = 1;
+
+	// Save a snapshot for undo before actually paste the text
+	FCKUndo.SaveUndoStep();
+
 	if ( FCKConfig.ForcePasteAsPlainText )
 	{
@@ -165,5 +173,4 @@
 
 	/* For now, the AutoDetectPasteFromWord feature is IE only. */
-
 	return true ;
 }
Index: /FCKeditor/trunk/editor/_source/internals/fckcommands.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fckcommands.js	(revision 393)
+++ /FCKeditor/trunk/editor/_source/internals/fckcommands.js	(revision 394)
@@ -75,4 +75,5 @@
 		case 'BGColor'		: oCommand = new FCKTextColorCommand('BackColor') ; break ;
 
+		case 'CutByKeyboard'	: oCommand = new FCKCutByKeyboardCommand() ; break;
 		case 'Paste'		: oCommand = new FCKPasteCommand() ; break ;
 		case 'PasteText'	: oCommand = new FCKPastePlainTextCommand() ; break ;
Index: /FCKeditor/trunk/editor/_source/internals/fckundo_gecko.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fckundo_gecko.js	(revision 393)
+++ /FCKeditor/trunk/editor/_source/internals/fckundo_gecko.js	(revision 394)
@@ -26,5 +26,6 @@
 FCKUndo.SavedData = new Array() ;
 FCKUndo.CurrentIndex = -1 ;
-FCKUndo.TypesCount = FCKUndo.MaxTypes = 25 ;
+FCKUndo.TypesCount = 0 ;
+FCKUndo.MaxTypes = 25 ;
 FCKUndo.Typing = false;
 
@@ -62,10 +63,10 @@
 FCKUndo.CheckUndoState = function()
 {
-	return ( FCKUndo.Typing || FCKUndo.CurrentIndex > 0 ) ;
+	return ( FCKUndo.TypesCount > 0 || FCKUndo.CurrentIndex > 0 ) ;
 }
 
 FCKUndo.CheckRedoState = function()
 {
-	return ( !FCKUndo.Typing && FCKUndo.CurrentIndex < ( FCKUndo.SavedData.length - 1 ) ) ;
+	return ( FCKUndo.CurrentIndex < ( FCKUndo.SavedData.length - 1 ) ) ;
 }
 
Index: /FCKeditor/trunk/fckconfig.js
===================================================================
--- /FCKeditor/trunk/fckconfig.js	(revision 393)
+++ /FCKeditor/trunk/fckconfig.js	(revision 394)
@@ -124,4 +124,6 @@
 	[ CTRL + 86 /*V*/, 'Paste' ],
 	[ SHIFT + 45 /*INS*/, 'Paste' ],
+	[ CTRL + 88 /*X*/, 'CutByKeyboard' ],
+	[ SHIFT + 46 /*DEL*/, 'CutByKeyboard' ],
 	[ CTRL + 90 /*Z*/, 'Undo' ],
 	[ CTRL + 89 /*Y*/, 'Redo' ],
