Index: /FCKeditor/branches/versions/2.4.x/_whatsnew.html
===================================================================
--- /FCKeditor/branches/versions/2.4.x/_whatsnew.html	(revision 103)
+++ /FCKeditor/branches/versions/2.4.x/_whatsnew.html	(revision 104)
@@ -14,5 +14,5 @@
 <body>
 	<h3>
-		Version 2.3.3 (SVN)</h3>
+		Version 2.4</h3>
 	<p>
 		New Features and Improvements:</p>
@@ -197,4 +197,5 @@
 		<li>The extensions "html", "htm" and "asis" have been added to the list of denied extensions
 			on upload.</li>
+		<li>Empty inline elements (like span and strong) will not be generated any more.</li>
 	</ul>
 	<p>
Index: /FCKeditor/branches/versions/2.4.x/editor/_source/internals/fckregexlib.js
===================================================================
--- /FCKeditor/branches/versions/2.4.x/editor/_source/internals/fckregexlib.js	(revision 103)
+++ /FCKeditor/branches/versions/2.4.x/editor/_source/internals/fckregexlib.js	(revision 104)
@@ -14,9 +14,4 @@
 // Used by the Styles combo to identify styles that can't be applied to text.
 ObjectElements	: /^(?:IMG|TABLE|TR|TD|TH|INPUT|SELECT|TEXTAREA|HR|OBJECT|A|UL|OL|LI)$/i ,
-
-BlockElements	: /^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|TD|TH)$/i ,
-
-// Elements marked as empty "Empty" in the XHTML DTD.
-EmptyElements	: /^(?:BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT)$/i ,
 
 // List all named commands (commands that can be interpreted by the browser "execCommand" method.
@@ -85,4 +80,12 @@
 {
 	// We are not handling <ins> and <del> as block elements, for now.
-	BlockElements : { address:1,blockquote:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,noscript:1,ol:1,p:1,pre:1,script:1,table:1,ul:1 }
+	BlockElements : { address:1,blockquote:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,noscript:1,ol:1,p:1,pre:1,script:1,table:1,ul:1 },
+	
+	// Inline elements which MUST have child nodes.
+	InlineChildReqElements : { abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strong:1,sub:1,sup:1,tt:1,'var':1 },
+	
+	// Elements marked as empty "Empty" in the XHTML DTD.
+	EmptyElements : { base:1,meta:1,link:1,hr:1,br:1,param:1,img:1,area:1,input:1 },
+
+	BlockElements : { p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,address:1,pre:1,ol:1,ul:1,li:1,td:1,th:1 }
 } ;
Index: /FCKeditor/branches/versions/2.4.x/editor/_source/internals/fckxhtml.js
===================================================================
--- /FCKeditor/branches/versions/2.4.x/editor/_source/internals/fckxhtml.js	(revision 103)
+++ /FCKeditor/branches/versions/2.4.x/editor/_source/internals/fckxhtml.js	(revision 104)
@@ -123,8 +123,14 @@
 			return ;
 		}
+		
+		var sNodeName = xmlNode.nodeName ;
+		
+		// Some inline elements are required to have something inside (span, strong, etc...).
+		if ( FCKListsLib.InlineChildReqElements[ sNodeName ] )
+			xmlNode.parentNode.removeChild( xmlNode ) ;
 
 		// We can't use short representation of empty elements that are not marked
 		// as empty in th XHTML DTD.
-		if ( !FCKRegexLib.EmptyElements.test( xmlNode.nodeName ) )
+		if ( !FCKListsLib.EmptyElements[ sNodeName ] )
 			xmlNode.appendChild( this.XML.createTextNode('') ) ;
 	}
@@ -200,5 +206,5 @@
 			}
 			else
-				this._AppendChildNodes( oNode, htmlNode, FCKRegexLib.BlockElements.test( sNodeName ) ) ;
+				this._AppendChildNodes( oNode, htmlNode, Boolean( FCKListsLib.BlockElements[ sNodeName ] ) ) ;
 
 			xmlNode.appendChild( oNode ) ;
