Index: /CKEditor/trunk/_source/plugins/styles/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/styles/plugin.js	(revision 5346)
+++ /CKEditor/trunk/_source/plugins/styles/plugin.js	(revision 5347)
@@ -1,3 +1,3 @@
-/*
+﻿/*
 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -141,37 +141,4 @@
 		},
 
-		// Removes any conflicting styles from within the specified range..
-		removeConflictsFromRange : function ( range, nodeToPreserve )
-		{
-			var style = this,
-				overrides = getOverrides( style ),
-				styleCandidates = [],
-				overrideCandidates = [];
-
-			var walker = new CKEDITOR.dom.walker( range );
-			walker.evaluator = function( node )
-			{
-				if ( node.type == CKEDITOR.NODE_ELEMENT
-						&& ( !nodeToPreserve || !node.equals( nodeToPreserve ) ) )
-				{
-					if ( node.is( style.element ) )
-						styleCandidates.push( node );
-
-					if ( node.getName() in overrides )
-						overrideCandidates.push( node );
-				}
-			};
-			walker.lastForward();
-
-			// First remove from element any style conflictions.
-			for ( var i = styleCandidates.length - 1 ; i >= 0 ; i-- )
-				removeFromElement( style,  styleCandidates[ i ] );
-
-			// Now remove any other element with different name that is
-			// defined to be overriden.
-			for ( i = overrideCandidates.length - 1 ; i >= 0 ; i-- )
-				removeOverrides( overrideCandidates[ i ], overrides[ overrideCandidates[ i ].getName() ] ) ;
-		},
-
 		applyToObject : function( element )
 		{
@@ -575,12 +542,11 @@
 					styleRange.extractContents().appendTo( styleNode );
 
+					// Here we do some cleanup, removing all duplicated
+					// elements from the style element.
+					removeFromInsideElement( this, styleNode );
+
 					// Insert it into the range position (it is collapsed after
-					// extractContents).
+					// extractContents.
 					styleRange.insertNode( styleNode );
-
-					// Remove all style conflicts within the range, including
-					// parents boundaries touched by styleNode.
-					styleRange.enlarge( CKEDITOR.ENLARGE_ELEMENT );
-					this.removeConflictsFromRange( styleRange, styleNode );
 
 					// Let's merge our new style with its neighbors, if possible.
@@ -1006,4 +972,34 @@
 
 		removeEmpty && removeNoAttribsElement( element );
+	}
+
+	// Removes a style from inside an element.
+	function removeFromInsideElement( style, element )
+	{
+		var def = style._.definition,
+			attribs = def.attributes,
+			styles = def.styles,
+			overrides = getOverrides( style );
+
+		var innerElements = element.getElementsByTag( style.element );
+
+		for ( var i = innerElements.count(); --i >= 0 ; )
+			removeFromElement( style,  innerElements.getItem( i ) );
+
+		// Now remove any other element with different name that is
+		// defined to be overriden.
+		for ( var overrideElement in overrides )
+		{
+			if ( overrideElement != style.element )
+			{
+				innerElements = element.getElementsByTag( overrideElement ) ;
+				for ( i = innerElements.count() - 1 ; i >= 0 ; i-- )
+				{
+					var innerElement = innerElements.getItem( i );
+					removeOverrides( innerElement, overrides[ overrideElement ] ) ;
+				}
+			}
+		}
+
 	}
 
