Index: /FCKeditor/trunk/_whatsnew.html
===================================================================
--- /FCKeditor/trunk/_whatsnew.html	(revision 586)
+++ /FCKeditor/trunk/_whatsnew.html	(revision 587)
@@ -138,4 +138,6 @@
 		<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/977">#977</a>] The "shape" attribute of &lt;area&gt; had its
 			value changed to uppercase in IE.</li>
+		<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/996">#996</a>] "OnPaste"
+			event listeners will now get executed only once.</li>
 	</ul>
 	<h3>
Index: /FCKeditor/trunk/editor/_source/internals/fck.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fck.js	(revision 586)
+++ /FCKeditor/trunk/editor/_source/internals/fck.js	(revision 587)
@@ -491,4 +491,14 @@
 		return sValue ? sValue : '' ;
 	},
+	
+	Paste : function( _callListenersOnly )
+	{
+		// First call 'OnPaste' listeners.
+		if ( FCK.Status != FCK_STATUS_COMPLETE || !FCK.Events.FireEvent( 'OnPaste' ) )
+			return false ;
+		
+		// Then call the default implementation.
+		return _callListenersOnly || FCK._ExecPaste() ;
+	},
 
 	PasteFromWord : function()
@@ -814,5 +824,5 @@
 		{
 			case 'Paste' :
-				return !FCK.Events.FireEvent( 'OnPaste' ) ;
+				return !FCK.Paste() ;
 
 			case 'Cut' :
Index: /FCKeditor/trunk/editor/_source/internals/fck_gecko.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fck_gecko.js	(revision 586)
+++ /FCKeditor/trunk/editor/_source/internals/fck_gecko.js	(revision 587)
@@ -150,5 +150,5 @@
 }
 
-FCK.Paste = function()
+FCK._ExecPaste = function()
 {
 	// Save a snapshot for undo before actually paste the text
Index: /FCKeditor/trunk/editor/_source/internals/fck_ie.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fck_ie.js	(revision 586)
+++ /FCKeditor/trunk/editor/_source/internals/fck_ie.js	(revision 587)
@@ -85,5 +85,13 @@
 function Doc_OnPaste()
 {
-	return ( FCK.Status == FCK_STATUS_COMPLETE && FCK.Events.FireEvent( "OnPaste" ) ) ;
+	var body = FCK.EditorDocument.body ;
+	
+	body.detachEvent( 'onpaste', Doc_OnPaste ) ;
+
+	var ret = FCK.Paste( !FCKConfig.ForcePasteAsPlainText && !FCKConfig.AutoDetectPasteFromWord ) ;
+
+	body.attachEvent( 'onpaste', Doc_OnPaste ) ;
+	
+	return ret ;
 }
 
@@ -194,5 +202,5 @@
 }
 
-FCK.Paste = function()
+FCK._ExecPaste = function()
 {
 	// As we call ExecuteNamedCommand('Paste'), it would enter in a loop. So, let's use a semaphore.
Index: /FCKeditor/trunk/editor/fckeditor.html
===================================================================
--- /FCKeditor/trunk/editor/fckeditor.html	(revision 586)
+++ /FCKeditor/trunk/editor/fckeditor.html	(revision 587)
@@ -204,8 +204,4 @@
 // Set the editor interface direction.
 window.document.dir = FCKLang.Dir ;
-
-// Activate pasting operations.
-if ( FCKConfig.ForcePasteAsPlainText || FCKConfig.AutoDetectPasteFromWord )
-	FCK.Events.AttachEvent( 'OnPaste', FCK.Paste ) ;
 
 	</script>
