Index: /FCKeditor/trunk/editor/_source/commandclasses/fcktablecommand.js
===================================================================
--- /FCKeditor/trunk/editor/_source/commandclasses/fcktablecommand.js	(revision 692)
+++ /FCKeditor/trunk/editor/_source/commandclasses/fcktablecommand.js	(revision 693)
@@ -97,5 +97,4 @@
 			case 'TableHorizontalSplitCell' :
 			case 'TableVerticalSplitCell' :
-			case 'TableMergeDown' :
 				if ( FCKTableHandler.GetSelectedCells().length == 1 )
 					return FCK_TRISTATE_OFF ;
@@ -110,4 +109,6 @@
 			case 'TableMergeRight' :
 				return FCKTableHandler.GetMergeRightTarget() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
+			case 'TableMergeDown' :
+				return FCKTableHandler.GetMergeDownTarget() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
 			default :
 				return FCK_TRISTATE_OFF ;
Index: /FCKeditor/trunk/editor/_source/internals/fcktablehandler.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fcktablehandler.js	(revision 692)
+++ /FCKeditor/trunk/editor/_source/internals/fcktablehandler.js	(revision 693)
@@ -380,41 +380,30 @@
 	this._ReplaceCellsByMarker( tableMap, '_Replace', refCell ) ;
 	this._InstallTableMap( tableMap, refCell.parentNode.parentNode ) ;
+
+	FCKSelection.SelectNode( refCell ) ;
+	FCKSelection.Collapse( false ) ;
 }
 
 FCKTableHandler.MergeDown = function()
 {
-	var cells = FCKTableHandler.GetSelectedCells() ;
-	if ( cells.length != 1 )
+	var target = this.GetMergeDownTarget() ;
+	if ( target == null )
 		return ;
-
-	var currentCell = cells[0] ;
-	var currentRowSpan = currentCell.rowSpan ;
-	if ( isNaN( currentRowSpan ) )
-		currentRowSpan = 1 ;
-	var nextRow = currentCell.parentNode.parentNode.rows[currentCell.parentNode.rowIndex + currentRowSpan] ;
-	if ( nextRow )
-	{
-		var tableMap = this._CreateTableMap( currentCell.parentNode.parentNode ) ;
-		var cellIndex = FCKTableHandler._GetCellIndexSpan( tableMap, currentCell.parentNode.rowIndex, currentCell ) ;
-		var equivalentCell = tableMap[currentCell.parentNode.rowIndex + currentRowSpan][cellIndex] ;
-
-		if ( ! equivalentCell )
-			return ;
-
-		var equivalentRowSpan = equivalentCell.rowSpan ;
-		if ( isNaN( equivalentRowSpan ) )
-			equivalentRowSpan = 1 ;
-
-		var cellContents = FCK.EditorDocument.createDocumentFragment() ;
-		while ( equivalentCell.childNodes.length > 0 )
-			cellContents.appendChild( equivalentCell.removeChild( equivalentCell.firstChild ) ) ;
-		if ( cellContents.childNodes.length > 0 )
-			cellContents.insertBefore( FCK.EditorDocument.createElement( 'br' ), cellContents.firstChild ) ;
-		if ( isNaN( currentCell.rowSpan ) )
-			currentCell.rowSpan = 1 ;
-		currentCell.rowSpan += equivalentRowSpan ;
-		currentCell.appendChild( cellContents ) ;
-		equivalentCell.parentNode.removeChild( equivalentCell ) ;
-	}
+	var refCell = target.refCell ;
+	var tableMap = target.tableMap ;
+	var nextCell = target.nextCell ;
+
+	var cellContents = refCell.ownerDocument.createDocumentFragment() ;
+	while ( nextCell.childNodes.length > 0 )
+		cellContents.appendChild( nextCell.removeChild( nextCell.firstChild ) ) ;
+	if ( cellContents.firstChild )
+		cellContents.insertBefore( nextCell.ownerDocument.createElement( 'br' ), cellContents.firstChild ) ;
+	refCell.appendChild( cellContents ) ;
+	this._MarkCells( [nextCell], '_Replace' ) ;
+	this._ReplaceCellsByMarker( tableMap, '_Replace', refCell ) ;
+	this._InstallTableMap( tableMap, refCell.parentNode.parentNode ) ;
+
+	FCKSelection.SelectNode( refCell ) ;
+	FCKSelection.Collapse( false ) ;
 }
 
@@ -767,2 +756,33 @@
 	return { refCell : refCell, nextCell : nextCell, tableMap : tableMap } ;
 }
+
+FCKTableHandler.GetMergeDownTarget = 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 newRowIdx = rowIdx + ( isNaN( refCell.rowSpan ) ? 1 : refCell.rowSpan ) ;
+	if ( ! tableMap[newRowIdx] )
+		return null ;
+
+	var nextCell = tableMap[newRowIdx][colIdx] ;
+
+	if ( ! nextCell )
+		return null ;
+
+	// The two cells must have the same horizontal geometry, otherwise merging does not makes sense.
+	this._MarkCells( [refCell, nextCell], '_SizeTest' ) ;
+	var refGeometry = this._GetMarkerGeometry( tableMap, rowIdx, colIdx, '_SizeTest' ) ;
+	var nextGeometry = this._GetMarkerGeometry( tableMap, newRowIdx, colIdx, '_SizeTest' ) ;
+	this._UnmarkCells( [refCell, nextCell], '_SizeTest' ) ;
+
+	if ( refGeometry.width != nextGeometry.width || refGeometry.x != nextGeometry.x )
+		return null ;
+
+	return { refCell : refCell, nextCell : nextCell, tableMap : tableMap } ;
+}
