Index: /CKEditor/trunk/_source/core/dom/range.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/range.js	(revision 3622)
+++ /CKEditor/trunk/_source/core/dom/range.js	(revision 3623)
@@ -692,7 +692,4 @@
 			var startOffset = this.startOffset;
 
-			var endContainer = this.endContainer;
-			var endOffset = this.endOffset;
-
 			if ( !ignoreStart && startContainer && startContainer.type == CKEDITOR.NODE_TEXT )
 			{
@@ -729,4 +726,7 @@
 				this.setStart( startContainer, startOffset );
 			}
+
+			var endContainer = this.endContainer;
+			var endOffset = this.endOffset;
 
 			if ( !ignoreEnd && endContainer && !this.collapsed && endContainer.type == CKEDITOR.NODE_TEXT )
Index: /CKEditor/trunk/_source/plugins/tabletools/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/tabletools/plugin.js	(revision 3622)
+++ /CKEditor/trunk/_source/plugins/tabletools/plugin.js	(revision 3623)
@@ -18,4 +18,8 @@
 	function getSelectedCells( selection )
 	{
+		// Walker will try to split text nodes, which will make the current selection
+		// invalid. So save bookmarks before doing anything.
+		var bookmarks = selection.createBookmarks();
+
 		var ranges = selection.getRanges();
 		var retval = [];
@@ -41,21 +45,34 @@
 		{
 			var range = ranges[ i ];
-			var walker = new CKEDITOR.dom.walker( range );
-			walker.guard = moveOutOfCellGuard;
-
-			while ( ( node = walker.next() ) )
-			{
-				// If may be possible for us to have a range like this:
-				// <td>^1</td><td>^2</td>
-				// The 2nd td shouldn't be included.
-				//
-				// So we have to take care to include a td we've entered only when we've
-				// walked into its children.
-
-				var parent = node.getParent();
-				if ( parent && cellNodeRegex.test( parent.getName() ) && !parent.getCustomData( 'selected_cell' ) )
-				{
-					CKEDITOR.dom.element.setMarker( database, parent, 'selected_cell', true );
-					retval.push( parent );
+
+			if ( range.collapsed )
+			{
+				// Walker does not handle collapsed ranges yet - fall back to old API.
+				var startNode = range.getCommonAncestor();
+				var nearestCell = startNode.getAscendant( 'td', true ) || startNode.getAscendant( 'th', true );
+				if ( nearestCell )
+					retval.push( nearestCell );
+			}
+			else
+			{
+				var walker = new CKEDITOR.dom.walker( range );
+				var node;
+				walker.guard = moveOutOfCellGuard;
+
+				while ( ( node = walker.next() ) )
+				{
+					// If may be possible for us to have a range like this:
+					// <td>^1</td><td>^2</td>
+					// The 2nd td shouldn't be included.
+					//
+					// So we have to take care to include a td we've entered only when we've
+					// walked into its children.
+
+					var parent = node.getParent();
+					if ( parent && cellNodeRegex.test( parent.getName() ) && !parent.getCustomData( 'selected_cell' ) )
+					{
+						CKEDITOR.dom.element.setMarker( database, parent, 'selected_cell', true );
+						retval.push( parent );
+					}
 				}
 			}
@@ -63,4 +80,7 @@
 
 		CKEDITOR.dom.element.clearAllMarkers( database );
+
+		// Restore selection position.
+		selection.selectBookmarks( bookmarks );
 
 		return retval;
