Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 5950)
+++ /CKEditor/trunk/CHANGES.html	(revision 5951)
@@ -132,4 +132,5 @@
 		<li><a href="http://dev.ckeditor.com/ticket/5839">#5839</a> : "Insert row after" was removing the ids of the elements from the clicked row.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/6315">#6315</a> : DIV plugin TT #2885 regression.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5931">#5931</a> : Unable to change nested font-size styles.</li>
 		<li>Updated the following language files:<ul>
 			<li><a href="http://dev.ckeditor.com/ticket/6246">#6246</a> : Chinese Simplified;</li>
Index: /CKEditor/trunk/_source/plugins/styles/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/styles/plugin.js	(revision 5950)
+++ /CKEditor/trunk/_source/plugins/styles/plugin.js	(revision 5951)
@@ -484,4 +484,15 @@
 				var parent = styleRange.getCommonAncestor();
 
+				var removeList = {
+					styles : {},
+					attrs : {},
+					// Styles cannot be removed.
+					blockedStyles : {},
+					// Attrs cannot be removed.
+					blockedAttrs : {}
+				};
+
+				var attName, styleName, value;
+
 				// Loop through the parents, removing the redundant attributes
 				// from the element to be applied.
@@ -490,20 +501,24 @@
 					if ( parent.getName() == elementName )
 					{
-						for ( var attName in def.attributes )
+						for ( attName in def.attributes )
 						{
-							if ( styleNode.getAttribute( attName ) == parent.getAttribute( attName ) )
-								styleNode.removeAttribute( attName );
+							if ( removeList.blockedAttrs[ attName ] || !( value = parent.getAttribute( styleName ) ) )
+								continue;
+
+							if ( styleNode.getAttribute( attName ) == value )
+								removeList.attrs[ attName ] = 1;
+							else
+								removeList.blockedAttrs[ attName ] = 1;
 						}
 
-						for ( var styleName in def.styles )
+						for ( styleName in def.styles )
 						{
-							if ( styleNode.getStyle( styleName ) == parent.getStyle( styleName ) )
-								styleNode.removeStyle( styleName );
-						}
-
-						if ( !styleNode.hasAttributes() )
-						{
-							styleNode = null;
-							break;
+							if ( removeList.blockedStyles[ styleName ] || !( value = parent.getStyle( styleName ) ) )
+								continue;
+
+							if ( styleNode.getStyle( styleName ) == value )
+								removeList.styles[ styleName ] = 1;
+							else
+								removeList.blockedStyles[ styleName ] = 1;
 						}
 					}
@@ -511,4 +526,13 @@
 					parent = parent.getParent();
 				}
+
+				for ( attName in removeList.attrs )
+					styleNode.removeAttribute( attName );
+
+				for ( styleName in removeList.styles )
+					styleNode.removeStyle( styleName );
+
+				if ( !styleNode.hasAttributes() )
+					styleNode = null;
 
 				if ( styleNode )
@@ -536,4 +560,13 @@
 					if ( !CKEDITOR.env.ie )
 						styleNode.$.normalize();
+				}
+				// Style already inherit from parents, left just to clear up any internal overrides. (#5931)
+				else
+				{
+					styleNode = new CKEDITOR.dom.element( 'span' );
+					styleRange.extractContents().appendTo( styleNode );
+					styleRange.insertNode( styleNode );
+					removeFromInsideElement( this, styleNode );
+					styleNode.remove( true );
 				}
 
