Index: /FCKeditor/trunk/_whatsnew.html
===================================================================
--- /FCKeditor/trunk/_whatsnew.html	(revision 3881)
+++ /FCKeditor/trunk/_whatsnew.html	(revision 3882)
@@ -59,4 +59,7 @@
 		<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/3181">#3181</a>] Node selection  
 			could raise an error in IE8.</li> 
+		<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2156">#2156</a>]  
+			After calling GetData() the style removal operations didn't work in IE. Thanks to 
+			Compendium Blogware</li> 
 		<li>Language file updates for the following languages:
 			<ul>
Index: /FCKeditor/trunk/editor/_source/internals/fckdomtools.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fckdomtools.js	(revision 3881)
+++ /FCKeditor/trunk/editor/_source/internals/fckdomtools.js	(revision 3882)
@@ -489,16 +489,44 @@
 		for ( var i = 0 ; i < attributes.length ; i++ )
 		{
-			if ( FCKBrowserInfo.IsIE && attributes[i].nodeName == 'class' )
-			{
-				// IE has a strange bug. If calling removeAttribute('className'),
-				// the attributes collection will still contain the "class"
-				// attribute, which will be marked as "specified", even if the
-				// outerHTML of the element is not displaying the class attribute.
-				// Note : I was not able to reproduce it outside the editor,
-				// but I've faced it while working on the TC of #1391.
-				if ( element.className.length > 0 )
-					return true ;
-			}
-			else if ( attributes[i].specified )
+			if ( FCKBrowserInfo.IsIE ) 
+			{
+				var attributeNodeName = attributes[i].nodeName ;
+
+				if ( attributeNodeName.StartsWith( '_fck' ) ) 
+				{
+					/**
+					 * There are places in the FCKeditor code where HTML element objects
+					 * get values stored as properties (e.g. _fckxhtmljob).  In Internet 
+					 * Explorer, these are interpreted as attempts to set attributes on
+					 * the element.  
+					 *
+					 * http://msdn.microsoft.com/en-us/library/ms533026(VS.85).aspx#Accessing_Element_Pr
+					 *
+					 * Counting these as HTML attributes cripples 
+					 * FCK.Style.RemoveFromRange() once FCK.GetData() has been called.
+					 *
+					 * The above conditional prevents these internal properties being 
+					 * counted as attributes.
+					 *
+					 * refs #2156 and #2834
+					 */
+
+					continue ;
+				}
+
+				if ( attributeNodeName == 'class' ) 
+				{
+					// IE has a strange bug. If calling removeAttribute('className'),
+					// the attributes collection will still contain the "class"
+					// attribute, which will be marked as "specified", even if the
+					// outerHTML of the element is not displaying the class attribute.
+					// Note : I was not able to reproduce it outside the editor,
+					// but I've faced it while working on the TC of #1391.
+					if ( element.className.length > 0 )
+						return true ;
+					continue ;
+				}
+			}
+			if ( attributes[i].specified )
 				return true ;
 		}
Index: /FCKeditor/trunk/editor/_source/internals/fckxhtml.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fckxhtml.js	(revision 3881)
+++ /FCKeditor/trunk/editor/_source/internals/fckxhtml.js	(revision 3882)
@@ -56,4 +56,21 @@
 	else
 		this._AppendChildNodes( this.MainNode, node, false ) ;
+
+	/**
+	 * FCKXHtml._AppendNode() marks DOM element objects it has 
+	 * processed by adding a property called _fckxhtmljob, 
+	 * setting it equal to the value of FCKXHtml.CurrentJobNum.  
+	 * On Internet Explorer, if an element object has such a 
+	 * property,  it will show up in the object's attributes 
+	 * NamedNodeMap, and the corresponding Attr object in 
+	 * that collection  will have is specified property set 
+	 * to true.  This trips up code elsewhere that checks to 
+	 * see if an element is free of attributes before proceeding 
+	 * with an edit operation (c.f. FCK.Style.RemoveFromRange())
+	 *	
+	 * refs #2156 and #2834
+	 */
+	if ( FCKBrowserInfo.IsIE )
+		FCKXHtml._RemoveXHtmlJobProperties( node ) ;
 
 	// Get the resulting XHTML as a string.
Index: /FCKeditor/trunk/editor/_source/internals/fckxhtml_ie.js
===================================================================
--- /FCKeditor/trunk/editor/_source/internals/fckxhtml_ie.js	(revision 3881)
+++ /FCKeditor/trunk/editor/_source/internals/fckxhtml_ie.js	(revision 3882)
@@ -93,4 +93,40 @@
 }
 
+/**
+ * Used to clean up HTML that has been processed FCKXHtml._AppendNode().
+ *
+ * For objects corresponding to HTML elements, Internet Explorer will 
+ * treat a property as if it were an attribute set on that element.
+ *
+ * http://msdn.microsoft.com/en-us/library/ms533026(VS.85).aspx#Accessing_Element_Pr
+ *
+ * FCKXHtml._AppendNode() sets the property _fckxhtmljob on node objects
+ * corresponding HTML elements to mark them as having been processed.
+ * Counting these properties as attributes will cripple style removal
+ * because FCK.Styles.RemoveFromSelection() will not remove an element
+ * as long as it still has attributes.
+ *
+ * refs #2156 and #2834
+ */
+
+FCKXHtml._RemoveXHtmlJobProperties = function ( node ) 
+{
+	// Select only nodes of type ELEMENT_NODE
+	if (!node || !node.nodeType || node.nodeType != 1)
+		return ;
+
+	// Clear the _fckhtmljob attribute.
+	if ( typeof node._fckxhtmljob !== 'undefined' )
+		node.removeAttribute('_fckxhtmljob') ;
+
+	// Recurse upon child nodes.
+	if ( node.hasChildNodes() ) 
+	{
+		var childNodes = node.childNodes ;
+		for ( var i = childNodes.length - 1 ; i >= 0 ; i-- ) 
+			FCKXHtml._RemoveXHtmlJobProperties( childNodes.item(i) ) ;
+	}
+}
+
 // On very rare cases, IE is loosing the "align" attribute for DIV. (right align and apply bulleted list)
 FCKXHtml.TagProcessors['div'] = function( node, htmlNode )
