Index: /FCKeditor/trunk/_whatsnew.html
===================================================================
--- /FCKeditor/trunk/_whatsnew.html	(revision 106)
+++ /FCKeditor/trunk/_whatsnew.html	(revision 107)
@@ -14,8 +14,12 @@
 <body>
 	<h3>
-		Version 2.3.3 (SVN)</h3>
+		Version 2.4</h3>
 	<p>
 		New Features and Improvements:</p>
 	<ul>
+		<li>The project has been <strong>relicensed</strong> under the terms of the <strong>
+			GPL / LGPL / MPL</strong> licenses. This change will remove many licensing compatibility
+			issues with other open source licenses, making the editor even more "open" than
+			before.</li>
 		<li>[<a target="_blank" href="https://sourceforge.net/tracker/?func=detail&aid=1329273&group_id=75348&atid=543656">SF
 			Feature-1329273</a>] [<a target="_blank" href="https://sourceforge.net/tracker/?func=detail&aid=1456005&group_id=75348&atid=543656">SF
@@ -32,5 +36,5 @@
 			both the [Enter] and [Shift]+[Enter] keys. The new "EnterMode" and "ShiftEnterMode"
 			settings can be use to control its behavior. It also guarantees that all browsers
-			will generate the same output.</li>
+			will generate the same output. </li>
 		<li>The new and powerful <strong>Keyboard Accelerator System</strong> is being introduced.
 			You can now precisely control the commands to execute when some key combinations
@@ -193,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/trunk/editor/_source/classes/fckelementpath.js
===================================================================
--- /FCKeditor/trunk/editor/_source/classes/fckelementpath.js	(revision 106)
+++ /FCKeditor/trunk/editor/_source/classes/fckelementpath.js	(revision 107)
@@ -25,6 +25,7 @@
 
 			var sElementName = e.nodeName.toUpperCase() ;
+			
 			// TODO: Review the Regex and move it to the RegexLib.
-			if ( !eBlock && (/^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DT|DE)$/).test( sElementName ) )
+			if ( !eBlockLimit && !eBlock && (/^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DT|DE)$/).test( sElementName ) )
 				eBlock = e ;
 				
Index: /FCKeditor/trunk/editor/_source/internals/fck.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fck.js	(revision 106)
+++ /FCKeditor/trunk/editor/_source/internals/fck.js	(revision 107)
@@ -13,10 +13,12 @@
 	Status		: FCK_STATUS_NOTLOADED,
 	EditMode	: FCK_EDITMODE_WYSIWYG,
-	
+	Toolbar		: null,
+	HasFocus	: false,
+
 	GetLinkedFieldValue : function()
 	{
 		return this.LinkedField.value ;
 	},
-	
+
 	GetParentForm : function()
 	{
@@ -24,10 +26,6 @@
 	} ,
 
-//	Events	: new FCKEvents( FCK ),   how to pass a reference to self here? "this" passes the window
-
-	Toolbar	: null,
-	HasFocus : false,
-
-	// IsDirty implementation 
+	// # START : IsDirty implementation 
+	
 	StartupValue : '',
 
@@ -42,5 +40,6 @@
 			this.StartupValue = this.EditorDocument.body.innerHTML ;
 	},
-	// end of IsDirty 
+
+	// # END : IsDirty implementation 
 
 	StartEditor : function()
@@ -295,10 +294,4 @@
 				html = html.replace( FCKRegexLib.EmCloser, '<\/i>' ) ;
 			}
-	//		else if ( FCKBrowserInfo.IsIE )
-	//		{
-	//			// IE doesn't support <abbr> and it breaks it. Let's protect it.
-	//			html = html.replace( FCKRegexLib.AbbrOpener, '<FCK:abbr$1' ) ;
-	//			html = html.replace( FCKRegexLib.AbbrCloser, '<\/FCK:abbr>' ) ;
-	//		}
 
 			var sHtml = '' ;
@@ -327,13 +320,13 @@
 				sHtml += '<link href="' + FCKConfig.FullBasePath + 'css/fck_internal.css' + '" rel="stylesheet" type="text/css" _fcktemp="true" />' ;
 
-				// Attention: do not change it before testing it well (sample07)!		: @Packager.RemoveLine
-				// This is tricky... if the head ends with <meta ... content type>,		: @Packager.RemoveLine
-				// Firefox will break. But, it works if we include the temporary		: @Packager.RemoveLine
-				// links as the last elements in the HEAD.								: @Packager.RemoveLine
+				// Attention: do not change it before testing it well (sample07)!
+				// This is tricky... if the head ends with <meta ... content type>,
+				// Firefox will break. But, it works if we include the temporary
+				// links as the last elements in the HEAD.
 				sHtml = html.replace( FCKRegexLib.HeadCloser, sHtml + '$&' ) ;
 
 				// Insert the base tag (FCKConfig.BaseHref), if not exists in the source.
-				// The base must be the first tag in the HEAD, to get relative			: @Packager.RemoveLine
-				// links on styles, for example.										: @Packager.RemoveLine
+				// The base must be the first tag in the HEAD, to get relative
+				// links on styles, for example.
 				if ( FCK.TempBaseTag.length > 0 && !FCKRegexLib.HasBaseTag.test( html ) )
 					sHtml = sHtml.replace( FCKRegexLib.HeadOpener, '$&' + FCK.TempBaseTag ) ;
Index: /FCKeditor/trunk/editor/_source/internals/fckregexlib.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fckregexlib.js	(revision 106)
+++ /FCKeditor/trunk/editor/_source/internals/fckregexlib.js	(revision 107)
@@ -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/trunk/editor/_source/internals/fckxhtml.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fckxhtml.js	(revision 106)
+++ /FCKeditor/trunk/editor/_source/internals/fckxhtml.js	(revision 107)
@@ -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 ) ;
