Index: /FCKeditor/trunk/editor/_source/commandclasses/fcktablecommand.js
===================================================================
--- /FCKeditor/trunk/editor/_source/commandclasses/fcktablecommand.js	(revision 691)
+++ /FCKeditor/trunk/editor/_source/commandclasses/fcktablecommand.js	(revision 692)
@@ -32,5 +32,5 @@
 	FCKUndo.SaveUndoStep() ;
 
-	if ( FCKBrowserInfo.IsIE )
+	if ( ! FCKBrowserInfo.IsGecko )
 	{
 		switch ( this.Name )
@@ -97,5 +97,4 @@
 			case 'TableHorizontalSplitCell' :
 			case 'TableVerticalSplitCell' :
-			case 'TableMergeRight' :
 			case 'TableMergeDown' :
 				if ( FCKTableHandler.GetSelectedCells().length == 1 )
@@ -103,5 +102,4 @@
 				else
 					return FCK_TRISTATE_DISABLED ;
-				break ;
 			case 'TableMergeCells' :
 				if ( FCKTableHandler.CheckIsSelectionRectangular() 
@@ -110,4 +108,6 @@
 				else
 					return FCK_TRISTATE_DISABLED ;
+			case 'TableMergeRight' :
+				return FCKTableHandler.GetMergeRightTarget() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
 			default :
 				return FCK_TRISTATE_OFF ;
Index: /FCKeditor/trunk/editor/_source/internals/fck_contextmenu.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fck_contextmenu.js	(revision 691)
+++ /FCKeditor/trunk/editor/_source/internals/fck_contextmenu.js	(revision 692)
@@ -74,5 +74,8 @@
 					oItem.AddItem( 'TableInsertCellAfter'	, FCKLang.InsertCellAfter, 58 ) ;
 					oItem.AddItem( 'TableDeleteCells'	, FCKLang.DeleteCells, 59 ) ;
-					if ( FCKBrowserInfo.IsIE )
+					if ( FCKBrowserInfo.IsGecko )
+						oItem.AddItem( 'TableMergeCells'	, FCKLang.MergeCells, 60,
+							FCKCommands.GetCommand( 'TableMergeCells' ).GetState() == FCK_TRISTATE_DISABLED ) ;
+					else
 					{
 						oItem.AddItem( 'TableMergeRight'	, FCKLang.MergeRight, 60, 
@@ -81,7 +84,4 @@
 							FCKCommands.GetCommand( 'TableMergeDown' ).GetState() == FCK_TRISTATE_DISABLED ) ;
 					}
-					else
-						oItem.AddItem( 'TableMergeCells'	, FCKLang.MergeCells, 60,
-							FCKCommands.GetCommand( 'TableMergeCells' ).GetState() == FCK_TRISTATE_DISABLED ) ;
 					oItem.AddItem( 'TableHorizontalSplitCell'	, FCKLang.HorizontalSplitCell, 61,
 						FCKCommands.GetCommand( 'TableHorizontalSplitCell' ).GetState() == FCK_TRISTATE_DISABLED ) ;
Index: /FCKeditor/trunk/editor/_source/internals/fcktablehandler.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fcktablehandler.js	(revision 691)
+++ /FCKeditor/trunk/editor/_source/internals/fcktablehandler.js	(revision 692)
@@ -255,4 +255,16 @@
 }
 
+FCKTableHandler._ReplaceCellsByMarker = function( tableMap, marker, substitute )
+{
+	for ( var i = 0 ; i < tableMap.length ; i++ )
+	{
+		for ( var j = 0 ; j < tableMap[i].length ; j++ )
+		{
+			if ( tableMap[i][j][marker] )
+				tableMap[i][j] = substitute ;
+		}
+	}
+}
+
 FCKTableHandler._GetMarkerGeometry = function( tableMap, rowIdx, colIdx, markerName )
 {
@@ -352,21 +364,10 @@
 FCKTableHandler.MergeRight = function()
 {
-	if ( ! FCKBrowserInfo.IsIE )
-	{
-		alert( 'This method should be called in IE only.' ) ;
+	var target = this.GetMergeRightTarget() ;
+	if ( target == null )
 		return ;
-	}
-	var cells = FCKTableHandler.GetSelectedCells() ;
-	if ( cells.length != 1 )
-		return ;
-	
-	var currentCell = cells[0] ;
-	var nextCell = currentCell.parentNode.cells[currentCell.cellIndex + 1] ;
-	var nextColSpan = nextCell.colSpan ;
-	if ( isNaN( nextColSpan ) )
-		nextColSpan = 1 ;
-
-	if ( ! nextCell )
-		return ;
+	var refCell = target.refCell ;
+	var tableMap = target.tableMap ;
+	var nextCell = target.nextCell ; 
 
 	var cellContents = FCK.EditorDocument.createDocumentFragment() ;
@@ -375,18 +376,12 @@
 
 	nextCell.parentNode.removeChild( nextCell ) ;
-	if ( isNaN( currentCell.colSpan ) )
-		currentCell.colSpan = 1 ;
-	currentCell.colSpan += nextColSpan ;
-
-	currentCell.appendChild( cellContents ) ;
+	refCell.appendChild( cellContents ) ;
+	this._MarkCells( [nextCell], '_Replace' ) ;
+	this._ReplaceCellsByMarker( tableMap, '_Replace', refCell ) ;
+	this._InstallTableMap( tableMap, refCell.parentNode.parentNode ) ;
 }
 
 FCKTableHandler.MergeDown = function()
 {
-	if ( ! FCKBrowserInfo.IsIE )
-	{
-		alert( 'This method should be called in IE only.' ) ;
-		return ;
-	}
 	var cells = FCKTableHandler.GetSelectedCells() ;
 	if ( cells.length != 1 )
@@ -686,5 +681,5 @@
 		{
 			var cell = tableMap[i][j] ;
-			if ( FCKBrowser.IsIE )
+			if ( FCKBrowserInfo.IsIE )
 			{
 				cell.removeAttribute( '_colScanned' ) ;
@@ -744,2 +739,30 @@
 		return FCK_TRISTATE_DISABLED ;
 }
+
+FCKTableHandler.GetMergeRightTarget = function()
+{
+	var cells = this.GetSelectedCells() ;
+	if ( cells.length != 1 )
+		return null ;
+
+	var refCell = cells[0] ;
+	var tableMap = this._CreateTableMap( refCell.parentNode.parentNode ) ;
+	var rowIdx = refCell.parentNode.rowIndex ;
+	var colIdx = this._GetCellIndexSpan( tableMap, rowIdx, refCell ) ;
+	var nextColIdx = colIdx + ( isNaN( refCell.colSpan ) ? 1 : refCell.colSpan ) ;
+	var nextCell = tableMap[rowIdx][nextColIdx] ;
+
+	if ( ! nextCell )
+		return null ;
+
+	// The two cells must have the same vertical geometry, otherwise merging does not make sense.
+	this._MarkCells( [refCell, nextCell], '_SizeTest' ) ;
+	var refGeometry = this._GetMarkerGeometry( tableMap, rowIdx, colIdx, '_SizeTest' ) ;
+	var nextGeometry = this._GetMarkerGeometry( tableMap, rowIdx, nextColIdx, '_SizeTest' ) ;
+	this._UnmarkCells( [refCell, nextCell], '_SizeTest' ) ;
+
+	if ( refGeometry.height != nextGeometry.height || refGeometry.y != nextGeometry.y )
+		return null ;
+
+	return { refCell : refCell, nextCell : nextCell, tableMap : tableMap } ;
+}
