Index: /FCKeditor/trunk/editor/_source/classes/fckevents.js
===================================================================
--- /FCKeditor/trunk/editor/_source/classes/fckevents.js	(revision 1065)
+++ /FCKeditor/trunk/editor/_source/classes/fckevents.js	(revision 1066)
@@ -35,5 +35,10 @@
 		this._RegisteredEvents[ eventName ] = [ functionPointer ] ;
 	else
-		aTargets.push( functionPointer ) ;
+	{
+		// Check that the event handler isn't already registered with the same listener
+		// It doesn't detect function pointers belonging to an object (at least in Gecko)
+		if ( aTargets.IndexOf( functionPointer ) == -1 )
+			aTargets.push( functionPointer ) ;
+	}
 }
 
Index: /FCKeditor/trunk/editor/_source/internals/fck.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fck.js	(revision 1065)
+++ /FCKeditor/trunk/editor/_source/internals/fck.js	(revision 1066)
@@ -105,4 +105,10 @@
 		// Tab key handling for source mode.
 		FCKTools.AddEventListener( document, "keydown", this._TabKeyHandler ) ;
+
+		// Add selection change listeners. They must be attached only once.
+		this.AttachToOnSelectionChange( _FCK_PaddingNodeListener ) ;
+		if ( FCKBrowserInfo.IsGecko )
+			this.AttachToOnSelectionChange( this._ExecCheckEmptyBlock ) ;
+
 	},
 
@@ -811,5 +817,4 @@
 
 	FCK.InitializeBehaviors() ;
-	FCK.AttachToOnSelectionChange( _FCK_PaddingNodeListener ) ;
 
 	// Listen for mousedown and mouseup events for tracking drag and drops.
Index: /FCKeditor/trunk/editor/_source/internals/fck_gecko.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fck_gecko.js	(revision 1065)
+++ /FCKeditor/trunk/editor/_source/internals/fck_gecko.js	(revision 1066)
@@ -197,26 +197,4 @@
 	}
 
-	this._FillEmptyBlock = function( emptyBlockNode )
-	{
-		if ( ! emptyBlockNode || emptyBlockNode.nodeType != 1 )
-			return ;
-		var nodeTag = emptyBlockNode.tagName.toLowerCase() ;
-		if ( nodeTag != 'p' && nodeTag != 'div' )
-			return ;
-		if ( emptyBlockNode.firstChild )
-			return ;
-		FCKTools.AppendBogusBr( emptyBlockNode ) ;
-	}
-
-	this._ExecCheckEmptyBlock = function()
-	{
-		FCK._FillEmptyBlock( FCK.EditorDocument.body.firstChild ) ;
-		var sel = FCK.EditorWindow.getSelection() ;
-		if ( !sel || sel.rangeCount < 1 )
-			return ;
-		var range = sel.getRangeAt( 0 );
-		FCK._FillEmptyBlock( range.startContainer ) ;
-	}
-
 	this.ExecOnSelectionChangeTimer = function()
 	{
@@ -286,6 +264,4 @@
 		this.EditorDocument.addEventListener( 'click', this._ExecCheckCaret, false ) ;
 	}
-	if ( FCKBrowserInfo.IsGecko )
-		this.AttachToOnSelectionChange( this._ExecCheckEmptyBlock ) ;
 
 	// Reset the context menu.
@@ -457,2 +433,24 @@
 	return aCreatedLinks ;
 }
+
+FCK._FillEmptyBlock = function( emptyBlockNode )
+{
+	if ( ! emptyBlockNode || emptyBlockNode.nodeType != 1 )
+		return ;
+	var nodeTag = emptyBlockNode.tagName.toLowerCase() ;
+	if ( nodeTag != 'p' && nodeTag != 'div' )
+		return ;
+	if ( emptyBlockNode.firstChild )
+		return ;
+	FCKTools.AppendBogusBr( emptyBlockNode ) ;
+}
+
+FCK._ExecCheckEmptyBlock = function()
+{
+	FCK._FillEmptyBlock( FCK.EditorDocument.body.firstChild ) ;
+	var sel = FCK.EditorWindow.getSelection() ;
+	if ( !sel || sel.rangeCount < 1 )
+		return ;
+	var range = sel.getRangeAt( 0 );
+	FCK._FillEmptyBlock( range.startContainer ) ;
+}
