Index: /FCKeditor/trunk/editor/_source/classes/fckdomrange_gecko.js
===================================================================
--- /FCKeditor/trunk/editor/_source/classes/fckdomrange_gecko.js	(revision 854)
+++ /FCKeditor/trunk/editor/_source/classes/fckdomrange_gecko.js	(revision 855)
@@ -44,6 +44,13 @@
 	if ( oRange )
 	{
+		var startContainer = oRange.startContainer ;
+
+		// If we have a collapsed range, inside an empty element, we must add
+		// something to it, otherwise the caret will not be visible.
+		if ( oRange.collapsed && startContainer.nodeType == 1 && startContainer.childNodes.length == 0 )
+			startContainer.appendChild( oRange._Document.createTextNode('') ) ;
+
 		var oDocRange = this.Window.document.createRange() ;
-		oDocRange.setStart( oRange.startContainer, oRange.startOffset ) ;
+		oDocRange.setStart( startContainer, oRange.startOffset ) ;
 
 		try
@@ -90,5 +97,5 @@
 		FCKDomTools.RemoveNode( endNode ) ;
 	}
-	
+
 	var selection = this.Window.getSelection() ;
 	selection.removeAllRanges() ;
Index: /FCKeditor/trunk/editor/_source/classes/fckdomrange_ie.js
===================================================================
--- /FCKeditor/trunk/editor/_source/classes/fckdomrange_ie.js	(revision 854)
+++ /FCKeditor/trunk/editor/_source/classes/fckdomrange_ie.js	(revision 855)
@@ -78,8 +78,9 @@
 {
 	var bIsCollapsed = this.CheckIsCollapsed() ;
-		var bIsStartMakerAlone ;
+	var bIsStartMakerAlone ;
+	var dummySpan ;
 
 	// Create marker tags for the start and end boundaries.
-	var eStartMarker	= this.GetBookmarkNode( bookmark, true ) ;
+	var eStartMarker = this.GetBookmarkNode( bookmark, true ) ;
 	
 	if ( !eStartMarker )
@@ -110,6 +111,23 @@
 	}
 	else
+	{
 		bIsStartMakerAlone = ( !eStartMarker.previousSibling || eStartMarker.previousSibling.nodeName.toLowerCase() == 'br' ) && !eStartMarker.nextSibing ;
-
+		
+		if ( bIsStartMakerAlone )
+		{
+			// Append a temporary <span>&nbsp;</span> before the selection.
+			// This is needed to avoid IE destroying selections inside empty
+			// inline elements, like <b></b> (#253).
+			dummySpan = this.Window.document.createElement( 'span' ) ;
+			dummySpan.innerHTML = '&nbsp;' ;
+			eStartMarker.parentNode.insertBefore( dummySpan, eStartMarker ) ;
+			
+			// To expand empty blocks or line spaces after <br>, we need
+			// instead to have a &nbsp;, which will be later deleted using the
+			// selection.
+			eStartMarker.parentNode.insertBefore( this.Window.document.createTextNode( '\u00a0' ), eStartMarker ) ;
+		}
+	}
+	
 	if ( !this._Range )
 		this._Range = this.CreateRange() ;
@@ -123,23 +141,12 @@
 		if ( bIsStartMakerAlone )
 		{
-			// The following trick is needed so IE makes collapsed selections
-			// inside empty blocks visible (expands the block).
+			// Move the selection start to include the temporary &nbsp;.
+			oIERange.moveStart( 'character', -1 ) ;
+			
+			oIERange.select() ;
 
-			try
-			{
-				oIERange.pasteHTML( '&nbsp;' ) ;
-				
-				// Move the selection start to include the &nbsp;.
-				oIERange.moveStart( 'character', -1 ) ;
-			}
-			catch (e){}
-
-			// The following must be done into a separate try block. (#1034)
-			try
-			{	
-				oIERange.select() ;
-				this.Window.document.selection.clear() ;
-			}
-			catch (e){}
+			// Remove our temporary stuff.
+			this.Window.document.selection.clear() ;
+			FCKDomTools.RemoveNode( dummySpan ) ;
 		}
 		else
Index: /FCKeditor/trunk/editor/_source/classes/fckstyle.js
===================================================================
--- /FCKeditor/trunk/editor/_source/classes/fckstyle.js	(revision 854)
+++ /FCKeditor/trunk/editor/_source/classes/fckstyle.js	(revision 855)
@@ -688,33 +688,8 @@
 	{
 		var doc = range.Window.document ;
-		
+
 		if ( range.CheckIsCollapsed() )
 		{
-			// Create the element to be inserted in the DOM.
-			var collapsedElement = this.BuildElement( doc ) ;
-
-			// The following, which would be the correct and simple way for it,
-			// doesn't work:
-			//		IE: The inserted node desappears (due to the Select() call).
-			//		FF: Almost work, but the caret disappears. Start typying
-			//		    and the style is correctly applied.
-			//		Opera: It seams that the element is added to the DOM, but
-			//		    the selection is not inside of it. Also, the empty
-			//		    elements renders a small space.
-			//		Safari: The element is added to the DOM, but the selection
-			//		    is not inside of it.
-			//range.InsertNode( collapsedElement ) ;
-			//range.MoveToNodeContents( collapsedElement ) ;
-			//range.Select() ;
-
-			if ( FCKBrowserInfo.IsOpera )
-			{
-				// Opera has a special case.
-				collapsedElement.appendChild( doc.createTextNode('') ) ;
-				range.InsertNode( collapsedElement ) ;
-				range.MoveToNodeContents( collapsedElement ) ;
-				range.Select() ;
-			}
-			else if ( FCKBrowserInfo.IsSafari )
+			if ( FCKBrowserInfo.IsSafari )
 			{
 				// For now, no support for it on Safari.
@@ -722,24 +697,12 @@
 			else
 			{
-				// For FF and IE, we must have something inside
-				// collapsedElement, otherwise the element is automatically
-				// removed by the browser in the selection operation, or even
-				// remain there, but with no blinking cursor.
-				var dummySpan = collapsedElement.appendChild( doc.createElement( 'span' ) ) ;
-
-				// Our dummySpan must be filled on IE, otherwise it will be
-				// removed when selecting.
-				if ( FCKBrowserInfo.IsIE )
-					dummySpan.innerHTML = '&nbsp;' ;
-
+				// With Safari, the element is added to the DOM, but the
+				// selection is not inside of it.
+
+				// Create the element to be inserted in the DOM.
+				var collapsedElement = this.BuildElement( doc ) ;
 				range.InsertNode( collapsedElement ) ;
 				range.MoveToPosition( collapsedElement, 2 ) ;
 				range.Select() ;
-
-				// After the selection, it is safe to cleanup dummySpan's
-				// contents, so it is ignored by the browser, but still forces
-				// collapsedElement to stay in the document.
-				if ( FCKBrowserInfo.IsIE )
-					FCKDomTools.RemoveNode( dummySpan ) ;
 			}
 
